From a4bad4452e7d6acdb75c129fa28c5291f4606b79 Mon Sep 17 00:00:00 2001 From: "ludovic.rousseau" Date: Fri, 1 Feb 2008 14:31:02 +0000 Subject: [PATCH] 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 --- src/libopensc/card-atrust-acos.c | 26 +++++++++++++++++++++++--- src/libopensc/pkcs15-atrust-acos.c | 2 +- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/libopensc/card-atrust-acos.c b/src/libopensc/card-atrust-acos.c index 6ee0554e..1a9c30b5 100644 --- a/src/libopensc/card-atrust-acos.c +++ b/src/libopensc/card-atrust-acos.c @@ -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; diff --git a/src/libopensc/pkcs15-atrust-acos.c b/src/libopensc/pkcs15-atrust-acos.c index f7af7fab..c9a54306 100644 --- a/src/libopensc/pkcs15-atrust-acos.c +++ b/src/libopensc/pkcs15-atrust-acos.c @@ -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);