From a7912a24260420adf99730b4529c2c3049aace5a Mon Sep 17 00:00:00 2001 From: aj Date: Wed, 8 Aug 2007 20:06:53 +0000 Subject: [PATCH] add information about cardos 4.2b - latest cardos update. git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@3237 c6295689-39f2-0310-b995-f0e70906c6a9 --- src/libopensc/card-cardos.c | 9 +++++++-- src/libopensc/cards.h | 1 + src/pkcs15init/pkcs15-cardos.c | 2 +- src/tools/cardos-info.c | 11 +++++++++++ 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/libopensc/card-cardos.c b/src/libopensc/card-cardos.c index e5296837..6e7ca10d 100644 --- a/src/libopensc/card-cardos.c +++ b/src/libopensc/card-cardos.c @@ -96,6 +96,9 @@ static int cardos_match_card(sc_card_t *card) } else if (card->atr[11] >= 0x08) { sc_debug(card->ctx, "found cardos v4.3b or higher"); card->type = SC_CARD_TYPE_CARDOS_M4_3; + } else if (card->atr[11] >= 0x09) { + sc_debug(card->ctx, "found cardos v4.2b or higher"); + card->type = SC_CARD_TYPE_CARDOS_M4_2B; } else { sc_debug(card->ctx, "found cardos m4.2"); } @@ -163,7 +166,8 @@ static int cardos_init(sc_card_t *card) if (r == 1) card->caps |= SC_CARD_CAP_RSA_2048; card->caps |= SC_CARD_CAP_APDU_EXT; - } else if (card->type == SC_CARD_TYPE_CARDOS_M4_3) { + } else if (card->type == SC_CARD_TYPE_CARDOS_M4_3 + || card->type == SC_CARD_TYPE_CARDOS_M4_2B) { card->caps |= SC_CARD_CAP_RSA_2048; card->caps |= SC_CARD_CAP_APDU_EXT; } @@ -640,7 +644,8 @@ static int cardos_create_file(sc_card_t *card, sc_file_t *file) return r; 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_3 || + card->type == SC_CARD_TYPE_CARDOS_M4_2B) { 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 af11eb03..6dddcb3d 100644 --- a/src/libopensc/cards.h +++ b/src/libopensc/cards.h @@ -42,6 +42,7 @@ 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 */ /* flex/cyberflex drivers */ SC_CARD_TYPE_FLEX_BASE = 2000, diff --git a/src/pkcs15init/pkcs15-cardos.c b/src/pkcs15init/pkcs15-cardos.c index 6957e09e..76146fac 100644 --- a/src/pkcs15init/pkcs15-cardos.c +++ b/src/pkcs15init/pkcs15-cardos.c @@ -622,7 +622,7 @@ 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_3 ||card->type == SC_CARD_TYPE_CARDOS_M4_2B)) { 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 5bbcf062..fd3898da 100644 --- a/src/tools/cardos-info.c +++ b/src/tools/cardos-info.c @@ -63,6 +63,15 @@ static int cardos_info(void) u8 rbuf[SC_MAX_APDU_BUFFER_SIZE]; int r; + if (verbose) { + printf("Card ATR:\n"); + hex_dump_asc(stdout, card->atr, card->atr_len, -1); + } else { + char tmp[SC_MAX_ATR_SIZE*3]; + sc_bin_to_hex(card->atr, card->atr_len, tmp, sizeof(tmp) - 1, ':'); + fprintf(stdout,"%s\n",tmp); + } + memset(&apdu, 0, sizeof(apdu)); apdu.cla = 0x00; apdu.ins = 0xca; @@ -141,6 +150,8 @@ static int cardos_info(void) printf(" (that's CardOS M4.3)\n"); } else if (apdu.resp[0] == 0xc8 && apdu.resp[1] == 0x08) { 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 { printf(" (unknown Version)\n"); }