aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--scd/app-common.h4
-rw-r--r--scd/app.c22
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);