Add support for the Austrian A-Trust ACOS card

Thanks to Franz Brandl for the patch
http://www.opensc-project.org/pipermail/opensc-devel/2008-February/010675.html


git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@3318 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
ludovic.rousseau 2008-02-01 14:31:02 +00:00
parent 91288d4955
commit a4bad4452e
2 changed files with 24 additions and 4 deletions

View File

@ -28,9 +28,23 @@
/*****************************************************************************/
#define ACOS_EMV_A03 "A-TRUST ACOS"
#define ACOS_EMV_A05 "A-TRUST ACOS A05"
static const char *atrust_acos_atrs[] = {
"3B:BF:11:00:81:31:fe:45:45:50:41",
"3B:BF:11:00:81:31:fe:45:4d:43:41",
"3B:BF:13:00:81:31:fe:45:45:50:41",
"3B:BF:13:00:81:31:fe:45:4d:43:41",
NULL
};
// sequence and number has to match atr table !
static const char *atrust_acos_names[] = {
ACOS_EMV_A03,
ACOS_EMV_A03,
ACOS_EMV_A05,
ACOS_EMV_A05,
NULL
};
@ -72,7 +86,10 @@ static int atrust_acos_match_card(struct sc_card *card)
continue;
if (memcmp(card->atr, defatr, len) != 0)
continue;
match = 1;
card->name = atrust_acos_names[i];
break;
}
return match;
@ -89,7 +106,6 @@ static int atrust_acos_init(struct sc_card *card)
if (ex_data == NULL)
return SC_ERROR_OUT_OF_MEMORY;
card->name = "A-TRUST ACOS";
card->cla = 0x00;
card->drv_data = (void *)ex_data;
@ -102,7 +118,10 @@ static int atrust_acos_init(struct sc_card *card)
| SC_ALGORITHM_RSA_HASH_RIPEMD160
| SC_ALGORITHM_RSA_HASH_MD5_SHA1;
_sc_card_add_rsa_alg(card,1536, flags, 0x10001);
if (!strcmp(card->name, ACOS_EMV_A05))
flags |= SC_ALGORITHM_RSA_HASH_SHA256;
_sc_card_add_rsa_alg(card, 1536, flags, 0x10001);
/* we need read_binary&friends with max 128 bytes per read */
if (card->max_send_size > 128)
@ -507,7 +526,6 @@ static int atrust_acos_select_file(struct sc_card *card,
SC_FUNC_RETURN(card->ctx, 2, SC_ERROR_INVALID_ARGUMENTS);
}
/** atrust_acos_set_security_env
* sets the security enviroment
* \param card pointer to the sc_card object
@ -725,6 +743,8 @@ static int atrust_acos_compute_signature(struct sc_card *card,
apdu.le = 256;
r = sc_transmit_apdu(card, &apdu);
SC_TEST_RET(card->ctx, r, "APDU transmit failed");
if (apdu.sw1 != 0x90 || apdu.sw2 != 0x00)
SC_FUNC_RETURN(card->ctx, 4, sc_check_sw(card, apdu.sw1, apdu.sw2));
{
size_t len = apdu.resplen > outlen ? outlen : apdu.resplen;

View File

@ -91,7 +91,7 @@ static int acos_detect_card(sc_pkcs15_card_t *p15card)
sc_card_t *card = p15card->card;
/* check if we have the correct card OS */
if (strcmp(card->name, "A-TRUST ACOS"))
if (strncmp(card->name, "A-TRUST ACOS", strlen("A-TRUST ACOS")))
return SC_ERROR_WRONG_CARD;
/* read EF_CIN_CSN file */
sc_format_path("DF71D001", &path);