diff options
author | NIIBE Yutaka <[email protected]> | 2020-08-27 05:32:04 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2020-08-27 05:32:04 +0000 |
commit | 9f148360a2bf04672b43ef7cec48e21d44b06ae1 (patch) | |
tree | a2d772e11b1ac3f815a563fca80b999e9d7b424c | |
parent | scd: Add condition for VERIFY with 0x82. (diff) | |
download | gnupg-9f148360a2bf04672b43ef7cec48e21d44b06ae1.tar.gz gnupg-9f148360a2bf04672b43ef7cec48e21d44b06ae1.zip |
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 <[email protected]>
-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); |