mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-03 22:56:33 +02:00
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 <wk@gnupg.org>
This commit is contained in:
parent
9325c92284
commit
79bed504e5
6 changed files with 190 additions and 85 deletions
|
@ -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))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue