diff options
-rw-r--r-- | scd/app-common.h | 4 | ||||
-rw-r--r-- | 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; @@ -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); |