diff --git a/src/libopensc/card-default.c b/src/libopensc/card-default.c index a3bc9159..c9ed9646 100644 --- a/src/libopensc/card-default.c +++ b/src/libopensc/card-default.c @@ -52,11 +52,13 @@ static int autodetect_class(struct sc_card *card) if (card->ctx->debug >= 2) debug(card->ctx, "trying with 0x%02X\n", classes[i]); apdu.cla = classes[i]; - apdu.cse = SC_APDU_CASE_1; + apdu.cse = SC_APDU_CASE_2_SHORT; apdu.ins = 0xC0; apdu.p1 = apdu.p2 = 0; apdu.datalen = 0; - apdu.lc = apdu.le = 0; + apdu.lc = 0; + apdu.le = 256; + apdu.resplen = sizeof(rbuf); r = sc_transmit_apdu(card, &apdu); SC_TEST_RET(card->ctx, r, "APDU transmit failed"); if (apdu.sw1 == 0x6E) diff --git a/src/libopensc/card-flex.c b/src/libopensc/card-flex.c index 100c5b28..f65df3df 100644 --- a/src/libopensc/card-flex.c +++ b/src/libopensc/card-flex.c @@ -24,9 +24,21 @@ #include static const char *flex_atrs[] = { - "3B:95:94:40:FF:63:01:01:02:01", /* Cryptoflex 16k */ - "3B:85:40:20:68:01:01:05:01", /* Cryptoflex 8k */ + "3B:95:94:40:FF:63:01:01:02:01", /* Cryptoflex 16k */ + "3B:85:40:20:68:01:01:05:01", /* Cryptoflex 8k */ "3B:19:14:55:90:01:02:02:00:05:04:B0", + "3B:02:14:50", /* Multiflex 3K */ + "3B:19:14:55:90:01:02:01:00:05:04:B0", /* Multiflex 4K */ + "3B:32:15:00:06:80", /* Multiflex 8K */ + "3B:32:15:00:06:95", /* Multiflex 8K + full DES option */ + "3B:19:14:59:01:01:0F:01:00:05:08:B0", /* Multiflex 8K */ + "3B:19:14:55:90:01:01:01:00:05:08:B0", /* Multiflex 8K */ + "3B:E2:00:00:40:20:49:06", /* Cryptoflex */ + "3B:E2:00:00:40:20:49:05", /* Cryptoflex + full DES option */ + "3B:E2:00:00:40:20:49:07", /* Cryptoflex + Key Generation */ + "3B:85:40:20:68:01:01:03:05", /* Cryptoflex + Key Generation */ + "3B:16:94:81:10:06:01:81:3F", /* Cyberflex Access Crypto */ + "3B:16:94:81:10:06:01:81:2F", /* Cyberflex Access Aug. Crypto */ NULL }; diff --git a/src/libopensc/card-gpk.c b/src/libopensc/card-gpk.c index a37d4270..9dfbe760 100644 --- a/src/libopensc/card-gpk.c +++ b/src/libopensc/card-gpk.c @@ -103,6 +103,8 @@ static struct atrinfo { { "\x3B\x27\x00\x80\x65\xA2\x05\x01\x01\x37", 10, GPK4000_sp }, { "\x3B\x27\x00\x80\x65\xA2\x0C\x01\x01\x37", 10, GPK4000_su256 }, { "\x3B\xA7\x00\x40\x14\x80\x65\xA2\x14\x01\x01\x37", 12, GPK4000_sdo }, + { "\x3B\xA7\x00\x40\x18\x80\x65\xA2\x08\x01\x01\x52", 12, GPK8000_8K }, + { "\x3B\xA7\x00\x40\x18\x80\x65\xA2\x09\x01\x01\x52", 12, GPK8000_16K }, { "", 0, -1 } }; diff --git a/src/libopensc/card-tcos.c b/src/libopensc/card-tcos.c index ef6bd48a..9c042c68 100644 --- a/src/libopensc/card-tcos.c +++ b/src/libopensc/card-tcos.c @@ -23,7 +23,9 @@ #include static const char *tcos_atrs[] = { - "3B:BA:96:00:81:31:86:5D:00:64:05:60:02:03:31:80:90:00:66", + "3B:BA:13:00:81:31:86:5D:00:64:05:0A:02:01:31:80:90:00:8B", /* SLE44 */ + "3B:BA:14:00:81:31:86:5D:00:64:05:14:02:02:31:80:90:00:91", /* SLE66S */ + "3B:BA:96:00:81:31:86:5D:00:64:05:60:02:03:31:80:90:00:66", /* SLE66P */ NULL }; diff --git a/src/libopensc/card.c b/src/libopensc/card.c index 02ad0553..dcb32303 100644 --- a/src/libopensc/card.c +++ b/src/libopensc/card.c @@ -37,8 +37,8 @@ static int sc_check_apdu(struct sc_context *ctx, const struct sc_apdu *apdu) error(ctx, "Value of Le too big (maximum 256 bytes)\n"); SC_FUNC_RETURN(ctx, 4, SC_ERROR_INVALID_ARGUMENTS); } - if (apdu->lc > 256) { - error(ctx, "Value of Lc too big (maximum 256 bytes)\n"); + if (apdu->lc > 255) { + error(ctx, "Value of Lc too big (maximum 255 bytes)\n"); SC_FUNC_RETURN(ctx, 4, SC_ERROR_INVALID_ARGUMENTS); } switch (apdu->cse) {