diff options
author | Werner Koch <[email protected]> | 2019-01-29 12:28:10 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2019-01-29 12:46:52 +0000 |
commit | 79bed504e51034d960fcb858fb643901cad85913 (patch) | |
tree | 681c06acc035906240fee574d7d590797817d9e7 /tools/card-call-scd.c | |
parent | card: Print keyinfo for PIV cards. (diff) | |
download | gnupg-79bed504e51034d960fcb858fb643901cad85913.tar.gz gnupg-79bed504e51034d960fcb858fb643901cad85913.zip |
card: Support factory reset for Yubikey PIV application.
* scd/app-common.h (struct app_ctx_s): Add field cardtype.
* scd/app.c (app_new_register): Set cardtype for yubikey.
(app_getattr): Add CARDTYPE.
(app_write_learn_status): Emit new attribute.
* scd/app-piv.c (do_getattr): Add CHV-USAGE.
(do_learn_status): Emit it.
* tools/card-tool.h (struct card_info_s): Add field cardtype.
* tools/card-call-scd.c (learn_status_cb): Parse "CARDTYPE".
* tools/gpg-card-tool.c (list_piv): Print PIN usage policy.
(list_card): Print card type.
(cmd_factoryreset): Implement for Yubikey with PIV.
Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'tools/card-call-scd.c')
-rw-r--r-- | tools/card-call-scd.c | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/tools/card-call-scd.c b/tools/card-call-scd.c index 2551b19f6..9a742a728 100644 --- a/tools/card-call-scd.c +++ b/tools/card-call-scd.c @@ -137,6 +137,7 @@ release_card_info (card_info_t info) return; xfree (info->reader); info->reader = NULL; + xfree (info->cardtype); info->cardtype = NULL; xfree (info->serialno); info->serialno = NULL; xfree (info->dispserialno); info->dispserialno = NULL; xfree (info->apptypestr); info->apptypestr = NULL; @@ -157,7 +158,7 @@ release_card_info (card_info_t info) xfree (info->kinfo); info->kinfo = kinfo; } - + info->chvusage[0] = info->chvusage[1] = 0; } @@ -724,6 +725,11 @@ learn_status_cb (void *opaque, const char *line) parm->is_v2 = (strlen (parm->serialno) >= 16 && xtoi_2 (parm->serialno+12) >= 2 ); } + else if (!memcmp (keyword, "CARDTYPE", keywordlen)) + { + xfree (parm->cardtype); + parm->cardtype = unescape_status_string (line); + } else if (!memcmp (keyword, "DISP-SEX", keywordlen)) { parm->disp_sex = *line == '1'? 1 : *line == '2' ? 2: 0; @@ -779,17 +785,26 @@ learn_status_cb (void *opaque, const char *line) break; case 9: - if (!memcmp (keyword, "DISP-NAME", keywordlen)) - { - xfree (parm->disp_name); - parm->disp_name = unescape_status_string (line); - } - else if (!memcmp (keyword, "DISP-LANG", keywordlen)) - { - xfree (parm->disp_lang); - parm->disp_lang = unescape_status_string (line); - } - break; + if (!memcmp (keyword, "DISP-NAME", keywordlen)) + { + xfree (parm->disp_name); + parm->disp_name = unescape_status_string (line); + } + else if (!memcmp (keyword, "DISP-LANG", keywordlen)) + { + xfree (parm->disp_lang); + parm->disp_lang = unescape_status_string (line); + } + else if (!memcmp (keyword, "CHV-USAGE", keywordlen)) + { + unsigned int byte1, byte2; + + byte1 = byte2 = 0; + sscanf (line, "%x %x", &byte1, &byte2); + parm->chvusage[0] = byte1; + parm->chvusage[1] = byte2; + } + break; case 10: if (!memcmp (keyword, "PUBKEY-URL", keywordlen)) @@ -839,7 +854,7 @@ learn_status_cb (void *opaque, const char *line) } else if (parm->apptype == APP_TYPE_PIV) { - for (i=0; *p && DIM (parm->chvinfo); i++) + for (i=0; *p && i < DIM (parm->chvinfo); i++) { parm->chvinfo[i] = atoi (p); while (*p && !spacep (p)) |