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:
parent
bb7bdc208f
commit
27257f2278
|
@ -93,12 +93,15 @@ static int cardos_match_card(sc_card_t *card)
|
||||||
if (card->atr[11] <= 0x04) {
|
if (card->atr[11] <= 0x04) {
|
||||||
sc_debug(card->ctx, "found cardos m4.01");
|
sc_debug(card->ctx, "found cardos m4.01");
|
||||||
card->type = SC_CARD_TYPE_CARDOS_M4_01;
|
card->type = SC_CARD_TYPE_CARDOS_M4_01;
|
||||||
} else if (card->atr[11] >= 0x08) {
|
} else if (card->atr[11] == 0x08) {
|
||||||
sc_debug(card->ctx, "found cardos v4.3b or higher");
|
sc_debug(card->ctx, "found cardos v4.3b");
|
||||||
card->type = SC_CARD_TYPE_CARDOS_M4_3;
|
card->type = SC_CARD_TYPE_CARDOS_M4_3;
|
||||||
} else if (card->atr[11] >= 0x09) {
|
} else if (card->atr[11] == 0x09) {
|
||||||
sc_debug(card->ctx, "found cardos v4.2b or higher");
|
sc_debug(card->ctx, "found cardos v4.2b");
|
||||||
card->type = SC_CARD_TYPE_CARDOS_M4_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 {
|
} else {
|
||||||
sc_debug(card->ctx, "found cardos m4.2");
|
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_RSA_2048;
|
||||||
card->caps |= SC_CARD_CAP_APDU_EXT;
|
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->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_RSA_2048;
|
||||||
card->caps |= SC_CARD_CAP_APDU_EXT;
|
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);
|
return iso_ops->create_file(card, file);
|
||||||
} else if (card->type == SC_CARD_TYPE_CARDOS_M4_2 ||
|
} 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) {
|
card->type == SC_CARD_TYPE_CARDOS_M4_2B ||
|
||||||
|
card->type == SC_CARD_TYPE_CARDOS_M4_2C) {
|
||||||
u8 sbuf[SC_MAX_APDU_BUFFER_SIZE];
|
u8 sbuf[SC_MAX_APDU_BUFFER_SIZE];
|
||||||
size_t len = sizeof(sbuf);
|
size_t len = sizeof(sbuf);
|
||||||
sc_apdu_t apdu;
|
sc_apdu_t apdu;
|
||||||
|
|
|
@ -42,7 +42,8 @@ enum {
|
||||||
SC_CARD_TYPE_CARDOS_M4_01,
|
SC_CARD_TYPE_CARDOS_M4_01,
|
||||||
SC_CARD_TYPE_CARDOS_M4_2,
|
SC_CARD_TYPE_CARDOS_M4_2,
|
||||||
SC_CARD_TYPE_CARDOS_M4_3,
|
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 */
|
/* flex/cyberflex drivers */
|
||||||
SC_CARD_TYPE_FLEX_BASE = 2000,
|
SC_CARD_TYPE_FLEX_BASE = 2000,
|
||||||
|
|
|
@ -622,7 +622,8 @@ static int cardos_put_key(sc_profile_t *profile, sc_card_t *card,
|
||||||
pin_id = 0;
|
pin_id = 0;
|
||||||
|
|
||||||
if (key_info->modulus_length > 1024 && (card->type == SC_CARD_TYPE_CARDOS_M4_2 ||
|
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,
|
r = cardos_store_key_component(card, algorithm, key_id, pin_id, 0,
|
||||||
key->p.data, key->p.len, 0, 0);
|
key->p.data, key->p.len, 0, 0);
|
||||||
if (r != SC_SUCCESS)
|
if (r != SC_SUCCESS)
|
||||||
|
|
|
@ -136,7 +136,6 @@ static int cardos_info(void)
|
||||||
hex_dump_asc(stdout, apdu.resp, apdu.resplen, -1);
|
hex_dump_asc(stdout, apdu.resp, apdu.resplen, -1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("OS Version: %d.%d", apdu.resp[0], apdu.resp[1]);
|
printf("OS Version: %d.%d", apdu.resp[0], apdu.resp[1]);
|
||||||
if (apdu.resp[0] == 0xc8 && apdu.resp[1] == 0x02) {
|
if (apdu.resp[0] == 0xc8 && apdu.resp[1] == 0x02) {
|
||||||
printf(" (that's CardOS M4.0)\n");
|
printf(" (that's CardOS M4.0)\n");
|
||||||
|
@ -152,6 +151,8 @@ static int cardos_info(void)
|
||||||
printf(" (that's CardOS M4.3b)\n");
|
printf(" (that's CardOS M4.3b)\n");
|
||||||
} else if (apdu.resp[0] == 0xc8 && apdu.resp[1] == 0x09) {
|
} else if (apdu.resp[0] == 0xc8 && apdu.resp[1] == 0x09) {
|
||||||
printf(" (that's CardOS M4.2b)\n");
|
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 {
|
} else {
|
||||||
printf(" (unknown Version)\n");
|
printf(" (unknown Version)\n");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue