From 072c64aaedc210841bee0861ff8e058bd876ad05 Mon Sep 17 00:00:00 2001 From: Georgi Kirichkov Date: Thu, 6 May 2021 17:53:06 +0300 Subject: [PATCH] Adds Gemalto IDPrime v4 --- src/libopensc/card-idprime.c | 14 +++++++++++--- src/libopensc/cards.h | 1 + src/libopensc/pkcs15-idprime.c | 3 ++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/libopensc/card-idprime.c b/src/libopensc/card-idprime.c index ba9bb8bc..0769cf52 100644 --- a/src/libopensc/card-idprime.c +++ b/src/libopensc/card-idprime.c @@ -206,9 +206,13 @@ static int idprime_process_index(sc_card_t *card, idprime_private_data_t *priv, if (card->type == SC_CARD_TYPE_IDPRIME_V2) { /* The key reference starts from 0x11 and increments by the key id (ASCII) */ new_object.key_reference = 0x11 + key_id; - } else { /* V3 */ - /* The key reference starts from 0xF7 and increments by the key id (ASCII) */ - new_object.key_reference = 0xF7 + key_id; + } else { + if (card->type == SC_CARD_TYPE_IDPRIME_V3) { /* V3 */ + /* The key reference starts from 0xF7 and increments by the key id (ASCII) */ + new_object.key_reference = 0xF7 + key_id; + } else { /* V4 */ + new_object.key_reference = 0x56 + key_id; + } } } sc_debug(card->ctx, SC_LOG_DEBUG_VERBOSE, "Found certificate with fd=%d, key_ref=%d", @@ -261,6 +265,10 @@ static int idprime_init(sc_card_t *card) card->type = SC_CARD_TYPE_IDPRIME_V3; sc_log(card->ctx, "Detected IDPrime applet version 3"); break; + case 0x04: + card->type = SC_CARD_TYPE_IDPRIME_V4; + sc_log(card->ctx, "Detected IDPrime applet version 4"); + break; default: sc_log(card->ctx, "Unknown OS version received: %d", rbuf[11]); break; diff --git a/src/libopensc/cards.h b/src/libopensc/cards.h index 3956c971..f7792815 100644 --- a/src/libopensc/cards.h +++ b/src/libopensc/cards.h @@ -269,6 +269,7 @@ enum { SC_CARD_TYPE_IDPRIME_V1, SC_CARD_TYPE_IDPRIME_V2, SC_CARD_TYPE_IDPRIME_V3, + SC_CARD_TYPE_IDPRIME_V4, SC_CARD_TYPE_IDPRIME_GENERIC, /* eDO cards */ diff --git a/src/libopensc/pkcs15-idprime.c b/src/libopensc/pkcs15-idprime.c index 31343622..acbae3fd 100644 --- a/src/libopensc/pkcs15-idprime.c +++ b/src/libopensc/pkcs15-idprime.c @@ -98,7 +98,8 @@ static int sc_pkcs15emu_idprime_init(sc_pkcs15_card_t *p15card) pin_info.attrs.pin.max_length = 16; pin_info.tries_left = -1; - if (card->type == SC_CARD_TYPE_IDPRIME_V3) { + if (card->type == SC_CARD_TYPE_IDPRIME_V3 || + card->type == SC_CARD_TYPE_IDPRIME_V4) { pin_info.attrs.pin.flags |= SC_PKCS15_PIN_FLAG_NEEDS_PADDING; pin_info.attrs.pin.stored_length = 16; pin_info.attrs.pin.pad_char = 0x00;