From 914ee7247562dc8f1e4b8503b3b574a5d2749bde Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Tue, 16 Aug 2022 13:23:50 +0200 Subject: [PATCH] gpg: Fix "generate" command in --card-edit. * g10/card-util.c (get_info_for_key_operation): Get the APPTYPE before testing for it. * g10/card-util.c (current_card_status): Always try to update the shadow keys. * g10/call-agent.c (agent_scd_getattr): Handle $AUTHKEYID. -- The first part fixed a regression introduced today. GnuPG-bug-id: 5100 The second part is usually not required because our ssh-agent code anyway looks for the OpenPGP.3 key. However, this helps to put the Display S/N into the shadow key so that we get a better prompt to insert the card. --- g10/call-agent.c | 3 +++ g10/card-util.c | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/g10/call-agent.c b/g10/call-agent.c index d416a72f8..7e60542ef 100644 --- a/g10/call-agent.c +++ b/g10/call-agent.c @@ -1104,6 +1104,9 @@ agent_scd_getattr (const char *name, struct agent_card_info_s *info) if (info->fpr2valid) assuan_transact (agent_ctx, "READKEY --card --no-data -- $ENCRKEYID", NULL, NULL, NULL, NULL, NULL, NULL); + if (info->fpr3valid) + assuan_transact (agent_ctx, "READKEY --card --no-data -- $AUTHKEYID", + NULL, NULL, NULL, NULL, NULL, NULL); } return rc; diff --git a/g10/card-util.c b/g10/card-util.c index f54e5e1c4..25c284e85 100644 --- a/g10/card-util.c +++ b/g10/card-util.c @@ -378,6 +378,7 @@ current_card_status (ctrl_t ctrl, estream_t fp, else tty_fprintf (fp, "Application ID ...: %s\n", info.serialno? info.serialno : "[none]"); + if (!info.serialno || strncmp (info.serialno, "D27600012401", 12) || strlen (info.serialno) != 32 ) { @@ -427,6 +428,7 @@ current_card_status (ctrl_t ctrl, estream_t fp, xfree (pk); return; } + openpgp: if (!serialno) ; @@ -440,6 +442,8 @@ current_card_status (ctrl_t ctrl, estream_t fp, else tty_fprintf (fp, "Application type .: %s\n", "OpenPGP"); + /* Try to update/create the shadow key here for OpenPGP cards. */ + agent_update_shadow_keys (); if (opt.with_colons) { @@ -1241,7 +1245,9 @@ get_info_for_key_operation (struct agent_card_info_s *info) memset (info, 0, sizeof *info); rc = agent_scd_getattr ("SERIALNO", info); - if (rc || !info->apptype || strcmp (info->apptype, "openpgp")) + if (!rc) + rc = agent_scd_getattr ("APPTYPE", info); + if (rc || !info->apptype || ascii_strcasecmp (info->apptype, "openpgp")) { log_error (_("key operation not possible: %s\n"), rc ? gpg_strerror (rc) : _("not an OpenPGP card"));