- Preliminary fix for Case 4 APDU sending on Win32
git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@649 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
parent
657bfa74e0
commit
ed19095c71
|
@ -42,11 +42,13 @@
|
||||||
|
|
||||||
struct pcsc_global_private_data {
|
struct pcsc_global_private_data {
|
||||||
SCARDCONTEXT pcsc_ctx;
|
SCARDCONTEXT pcsc_ctx;
|
||||||
|
int apdu_fix; /* flag to indicate whether to 'fix' some T=0 APDUs */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pcsc_private_data {
|
struct pcsc_private_data {
|
||||||
SCARDCONTEXT pcsc_ctx;
|
SCARDCONTEXT pcsc_ctx;
|
||||||
char *reader_name;
|
char *reader_name;
|
||||||
|
struct pcsc_global_private_data *gpriv;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pcsc_slot_data {
|
struct pcsc_slot_data {
|
||||||
|
@ -113,6 +115,22 @@ static int pcsc_transmit(struct sc_reader *reader, struct sc_slot_info *slot,
|
||||||
sRecvPci.dwProtocol = opensc_proto_to_pcsc(slot->active_protocol);
|
sRecvPci.dwProtocol = opensc_proto_to_pcsc(slot->active_protocol);
|
||||||
sRecvPci.cbPciLength = 0;
|
sRecvPci.cbPciLength = 0;
|
||||||
|
|
||||||
|
if (reader->gpriv->apdu_fix && sendsize >= 6) {
|
||||||
|
/* Check if the APDU in question is of Case 4 */
|
||||||
|
const u8 *p = sendbuf;
|
||||||
|
int lc;
|
||||||
|
|
||||||
|
p += 4;
|
||||||
|
lc = *p;
|
||||||
|
if (lc == 0)
|
||||||
|
lc = 256;
|
||||||
|
if (sendsize == lc + 6) {
|
||||||
|
/* Le is present, cut it out */
|
||||||
|
debug(reader->ctx, "Cutting out Le byte from Case 4 APDU\n");
|
||||||
|
sendsize--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dwSendLength = sendsize;
|
dwSendLength = sendsize;
|
||||||
dwRecvLength = *recvsize;
|
dwRecvLength = *recvsize;
|
||||||
if (dwRecvLength > 255)
|
if (dwRecvLength > 255)
|
||||||
|
@ -292,6 +310,8 @@ static int pcsc_init(struct sc_context *ctx, void **reader_data)
|
||||||
SCARDCONTEXT pcsc_ctx;
|
SCARDCONTEXT pcsc_ctx;
|
||||||
int r;
|
int r;
|
||||||
struct pcsc_global_private_data *gpriv;
|
struct pcsc_global_private_data *gpriv;
|
||||||
|
scconf_block **blocks = NULL, *conf_block = NULL;
|
||||||
|
int apdu_fix;
|
||||||
|
|
||||||
rv = SCardEstablishContext(SCARD_SCOPE_GLOBAL, "localhost", NULL,
|
rv = SCardEstablishContext(SCARD_SCOPE_GLOBAL, "localhost", NULL,
|
||||||
&pcsc_ctx);
|
&pcsc_ctx);
|
||||||
|
@ -309,6 +329,7 @@ static int pcsc_init(struct sc_context *ctx, void **reader_data)
|
||||||
return SC_ERROR_OUT_OF_MEMORY;
|
return SC_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
gpriv->pcsc_ctx = pcsc_ctx;
|
gpriv->pcsc_ctx = pcsc_ctx;
|
||||||
|
gpriv->apdu_fix = 0;
|
||||||
*reader_data = gpriv;
|
*reader_data = gpriv;
|
||||||
|
|
||||||
reader_buf = (char *) malloc(sizeof(char) * reader_buf_size);
|
reader_buf = (char *) malloc(sizeof(char) * reader_buf_size);
|
||||||
|
@ -332,6 +353,7 @@ static int pcsc_init(struct sc_context *ctx, void **reader_data)
|
||||||
reader->driver = &pcsc_drv;
|
reader->driver = &pcsc_drv;
|
||||||
reader->slot_count = 1;
|
reader->slot_count = 1;
|
||||||
reader->name = strdup(p);
|
reader->name = strdup(p);
|
||||||
|
priv->gpriv = gpriv;
|
||||||
priv->pcsc_ctx = pcsc_ctx;
|
priv->pcsc_ctx = pcsc_ctx;
|
||||||
priv->reader_name = strdup(p);
|
priv->reader_name = strdup(p);
|
||||||
r = _sc_add_reader(ctx, reader);
|
r = _sc_add_reader(ctx, reader);
|
||||||
|
@ -353,6 +375,20 @@ static int pcsc_init(struct sc_context *ctx, void **reader_data)
|
||||||
} while (p < (reader_buf + reader_buf_size - 1));
|
} while (p < (reader_buf + reader_buf_size - 1));
|
||||||
free(reader_buf);
|
free(reader_buf);
|
||||||
|
|
||||||
|
for (i = 0; ctx->conf_blocks[i] != NULL; i++) {
|
||||||
|
blocks = scconf_find_blocks(ctx->conf, ctx->conf_blocks[i],
|
||||||
|
"reader_driver", "pcsc");
|
||||||
|
conf_block = blocks[0];
|
||||||
|
free(blocks);
|
||||||
|
if (conf_block != NULL)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (conf_block == NULL)
|
||||||
|
return 0;
|
||||||
|
apdu_fix = scconf_get_bool(conf_block, "apdu_fix", 0);
|
||||||
|
if (apdu_fix)
|
||||||
|
gpriv->apdu_fix = apdu_fix;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue