support for Siemens CardOS V4.2C

git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@3306 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
jps 2007-12-19 09:58:29 +00:00
parent bb7bdc208f
commit 27257f2278
4 changed files with 17 additions and 9 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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)

View File

@ -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");
}