diff --git a/src/libopensc/card-cardos.c b/src/libopensc/card-cardos.c index eb8c19d8..ad09e0e9 100644 --- a/src/libopensc/card-cardos.c +++ b/src/libopensc/card-cardos.c @@ -93,12 +93,15 @@ static int cardos_match_card(sc_card_t *card) if (card->atr[11] <= 0x04) { sc_debug(card->ctx, "found cardos m4.01"); card->type = SC_CARD_TYPE_CARDOS_M4_01; - } else if (card->atr[11] >= 0x08) { - sc_debug(card->ctx, "found cardos v4.3b or higher"); + } else if (card->atr[11] == 0x08) { + sc_debug(card->ctx, "found cardos v4.3b"); card->type = SC_CARD_TYPE_CARDOS_M4_3; - } else if (card->atr[11] >= 0x09) { - sc_debug(card->ctx, "found cardos v4.2b or higher"); + } else if (card->atr[11] == 0x09) { + sc_debug(card->ctx, "found cardos v4.2b"); card->type = SC_CARD_TYPE_CARDOS_M4_2B; + } else if (card->atr[11] >= 0x0B) { + sc_debug(card->ctx, "found cardos v4.2c or higher"); + card->type = SC_CARD_TYPE_CARDOS_M4_2C; } else { sc_debug(card->ctx, "found cardos m4.2"); } @@ -167,7 +170,8 @@ static int cardos_init(sc_card_t *card) card->caps |= SC_CARD_CAP_RSA_2048; card->caps |= SC_CARD_CAP_APDU_EXT; } else if (card->type == SC_CARD_TYPE_CARDOS_M4_3 - || card->type == SC_CARD_TYPE_CARDOS_M4_2B) { + || card->type == SC_CARD_TYPE_CARDOS_M4_2B + || card->type == SC_CARD_TYPE_CARDOS_M4_2C) { card->caps |= SC_CARD_CAP_RSA_2048; card->caps |= SC_CARD_CAP_APDU_EXT; } @@ -645,7 +649,8 @@ static int cardos_create_file(sc_card_t *card, sc_file_t *file) return iso_ops->create_file(card, file); } else if (card->type == SC_CARD_TYPE_CARDOS_M4_2 || card->type == SC_CARD_TYPE_CARDOS_M4_3 || - card->type == SC_CARD_TYPE_CARDOS_M4_2B) { + card->type == SC_CARD_TYPE_CARDOS_M4_2B || + card->type == SC_CARD_TYPE_CARDOS_M4_2C) { u8 sbuf[SC_MAX_APDU_BUFFER_SIZE]; size_t len = sizeof(sbuf); sc_apdu_t apdu; diff --git a/src/libopensc/cards.h b/src/libopensc/cards.h index 6dddcb3d..6ee65a83 100644 --- a/src/libopensc/cards.h +++ b/src/libopensc/cards.h @@ -42,7 +42,8 @@ enum { SC_CARD_TYPE_CARDOS_M4_01, SC_CARD_TYPE_CARDOS_M4_2, SC_CARD_TYPE_CARDOS_M4_3, - SC_CARD_TYPE_CARDOS_M4_2B, /* 4.2b is the latest after 4.3b */ + SC_CARD_TYPE_CARDOS_M4_2B, /* 4.2b is after 4.3b */ + SC_CARD_TYPE_CARDOS_M4_2C, /* flex/cyberflex drivers */ SC_CARD_TYPE_FLEX_BASE = 2000, diff --git a/src/pkcs15init/pkcs15-cardos.c b/src/pkcs15init/pkcs15-cardos.c index 76146fac..ae57abca 100644 --- a/src/pkcs15init/pkcs15-cardos.c +++ b/src/pkcs15init/pkcs15-cardos.c @@ -622,7 +622,8 @@ static int cardos_put_key(sc_profile_t *profile, sc_card_t *card, pin_id = 0; if (key_info->modulus_length > 1024 && (card->type == SC_CARD_TYPE_CARDOS_M4_2 || - card->type == SC_CARD_TYPE_CARDOS_M4_3 ||card->type == SC_CARD_TYPE_CARDOS_M4_2B)) { + card->type == SC_CARD_TYPE_CARDOS_M4_3 ||card->type == SC_CARD_TYPE_CARDOS_M4_2B || + card->type == SC_CARD_TYPE_CARDOS_M4_2C )) { r = cardos_store_key_component(card, algorithm, key_id, pin_id, 0, key->p.data, key->p.len, 0, 0); if (r != SC_SUCCESS) diff --git a/src/tools/cardos-info.c b/src/tools/cardos-info.c index fd3898da..7fd3196b 100644 --- a/src/tools/cardos-info.c +++ b/src/tools/cardos-info.c @@ -136,7 +136,6 @@ static int cardos_info(void) hex_dump_asc(stdout, apdu.resp, apdu.resplen, -1); return 1; } - printf("OS Version: %d.%d", apdu.resp[0], apdu.resp[1]); if (apdu.resp[0] == 0xc8 && apdu.resp[1] == 0x02) { printf(" (that's CardOS M4.0)\n"); @@ -152,6 +151,8 @@ static int cardos_info(void) printf(" (that's CardOS M4.3b)\n"); } else if (apdu.resp[0] == 0xc8 && apdu.resp[1] == 0x09) { printf(" (that's CardOS M4.2b)\n"); + } else if (apdu.resp[0] == 0xc8 && apdu.resp[1] == 0x0B) { + printf(" (that's CardOS M4.2c)\n"); } else { printf(" (unknown Version)\n"); }