card: Let the APDU command prints a description of the status word.

* tools/card-call-scd.c (scd_apdu_strerror): New.
* tools/gpg-card.c (cmd_apdu): Print a description.
--

Pretty convenient to explore smartcards.
This commit is contained in:
Werner Koch 2020-11-27 11:28:16 +01:00
parent 0e34683a6c
commit ad469609b1
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
3 changed files with 43 additions and 1 deletions

View File

@ -1709,3 +1709,33 @@ agent_get_s2k_count (void)
return count;
}
/* Return a malloced string describing the statusword SW. On error
* NULL is returned. */
char *
scd_apdu_strerror (unsigned int sw)
{
gpg_error_t err;
char line[ASSUAN_LINELENGTH];
membuf_t data;
char *buf;
err = start_agent (0);
if (err)
return NULL;
init_membuf (&data, 64);
snprintf (line, sizeof line, "SCD GETINFO apdu_strerror 0x%x", sw);
err = assuan_transact (agent_ctx, line, put_membuf_cb, &data,
NULL, NULL, NULL, NULL);
if (err)
{
xfree (get_membuf (&data, NULL));
return NULL;
}
put_membuf (&data, "", 1);
buf = get_membuf (&data, NULL);
return buf;
}

View File

@ -3501,7 +3501,16 @@ cmd_apdu (card_info_t info, char *argstr)
if (err)
goto leave;
if (!with_atr)
log_info ("Statusword: 0x%04x\n", sw);
{
if (opt.interactive || opt.verbose)
{
char *p = scd_apdu_strerror (sw);
log_info ("Statusword: 0x%04x (%s)\n", sw, p? p: "?");
xfree (p);
}
else
log_info ("Statusword: 0x%04x\n", sw);
}
for (i=0; i < resultlen; )
{
size_t save_i = i;

View File

@ -242,6 +242,9 @@ gpg_error_t scd_checkpin (const char *serialno);
unsigned long agent_get_s2k_count (void);
char *scd_apdu_strerror (unsigned int sw);
/*-- card-yubikey.c --*/
gpg_error_t yubikey_commands (card_info_t info,
estream_t fp, int argc, const char *argv[]);