From 9f148360a2bf04672b43ef7cec48e21d44b06ae1 Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Thu, 27 Aug 2020 14:32:04 +0900 Subject: [PATCH] scd: Add heuristics to identify cardtype. * scd/app-common.h (cardtype_t): Add CARDTYPE_GNUK and CARDTYPE_ZEITCONTROL. * scd/app.c (strcardtype): Handle CARDTYPE_GNUK and CARDTYPE_ZEITCONTROL. (app_new_register): Detect Gnuk and Zeit Control implementation by examining its ATR string. Signed-off-by: NIIBE Yutaka --- scd/app-common.h | 4 +++- scd/app.c | 22 ++++++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/scd/app-common.h b/scd/app-common.h index ee0ba0e2e..cab82fbb6 100644 --- a/scd/app-common.h +++ b/scd/app-common.h @@ -53,7 +53,9 @@ typedef enum { CARDTYPE_GENERIC = 0, - CARDTYPE_YUBIKEY + CARDTYPE_GNUK, + CARDTYPE_YUBIKEY, + CARDTYPE_ZEITCONTROL } cardtype_t; diff --git a/scd/app.c b/scd/app.c index f1edfe05c..6a583d4c2 100644 --- a/scd/app.c +++ b/scd/app.c @@ -83,8 +83,10 @@ strcardtype (cardtype_t t) { switch (t) { - case CARDTYPE_GENERIC: return "generic"; - case CARDTYPE_YUBIKEY: return "yubikey"; + case CARDTYPE_GENERIC: return "generic"; + case CARDTYPE_GNUK: return "gnuk"; + case CARDTYPE_YUBIKEY: return "yubikey"; + case CARDTYPE_ZEITCONTROL: return "zeitcontrol"; } return "?"; } @@ -540,6 +542,22 @@ app_new_register (int slot, ctrl_t ctrl, const char *name, xfree (buf); } } + else + { + unsigned char *atr; + size_t atrlen; + + /* This is heuristics to identify different implementations. */ + atr = apdu_get_atr (app_get_slot (app), &atrlen); + if (atr) + { + if (atrlen == 21 && atr[2] == 0x11) + card->cardtype = CARDTYPE_GNUK; + else if (atrlen == 21 && atr[7] == 0x75) + card->cardtype = CARDTYPE_ZEITCONTROL; + xfree (atr); + } + } if (!err) err = iso7816_select_file (slot, 0x2F02, 0);