summaryrefslogtreecommitdiffstats
path: root/agent/divert-scd.c
diff options
context:
space:
mode:
authorNIIBE Yutaka <gniibe@fsij.org>2019-09-05 10:18:39 +0200
committerNIIBE Yutaka <gniibe@fsij.org>2019-09-05 10:18:39 +0200
commit9f39e0167d0642bcfb9bcabcbc7f8160b39a20ee (patch)
tree0298a5340efbe73a0eebe51be77b5a0ce0be5900 /agent/divert-scd.c
parentscd: New sub-command cmd_has_option for GETINFO. (diff)
downloadgnupg2-9f39e0167d0642bcfb9bcabcbc7f8160b39a20ee.tar.xz
gnupg2-9f39e0167d0642bcfb9bcabcbc7f8160b39a20ee.zip
agent: Fix ask_for_card to allow a key on multiple cards.
* agent/divert-scd.c (ask_for_card): Don't use SERIALNO to select card, but use KEYGRIP. GnuPG-bug-id: 4695 Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
Diffstat (limited to '')
-rw-r--r--agent/divert-scd.c119
1 files changed, 36 insertions, 83 deletions
diff --git a/agent/divert-scd.c b/agent/divert-scd.c
index cfa2347c7..ee97a7e7e 100644
--- a/agent/divert-scd.c
+++ b/agent/divert-scd.c
@@ -36,128 +36,81 @@ static gpg_error_t
ask_for_card (ctrl_t ctrl, const unsigned char *shadow_info,
const unsigned char *grip, char **r_kid)
{
- int i;
char *serialno;
- int no_card = 0;
char *desc;
- char *want_sn, *want_kid, *want_sn_disp;
+ char *want_sn;
int len;
- struct card_key_info_s *keyinfo;
gpg_error_t err;
char hexgrip[41];
*r_kid = NULL;
+ bin2hex (grip, 20, hexgrip);
- /* Scan device(s), and check if key for GRIP is available. */
- err = agent_card_serialno (ctrl, &serialno, NULL);
- if (!err)
- {
- xfree (serialno);
- bin2hex (grip, 20, hexgrip);
- err = agent_card_keyinfo (ctrl, hexgrip, &keyinfo);
- if (!err)
- {
- /* Key for GRIP found, use it directly. */
- agent_card_free_keyinfo (keyinfo);
- if ((*r_kid = xtrystrdup (hexgrip)))
- return 0;
- else
- return gpg_error_from_syserror ();
- }
- }
-
- err = parse_shadow_info (shadow_info, &want_sn, &want_kid, NULL);
+ err = parse_shadow_info (shadow_info, &want_sn, NULL, NULL);
if (err)
return err;
- want_sn_disp = xtrystrdup (want_sn);
- if (!want_sn_disp)
- {
- err = gpg_error_from_syserror ();
- xfree (want_sn);
- xfree (want_kid);
- return err;
- }
- len = strlen (want_sn_disp);
- if (len == 32 && !strncmp (want_sn_disp, "D27600012401", 12))
+ len = strlen (want_sn);
+ if (len == 32 && !strncmp (want_sn, "D27600012401", 12))
{
/* This is an OpenPGP card - reformat */
- memmove (want_sn_disp, want_sn_disp+16, 4);
- want_sn_disp[4] = ' ';
- memmove (want_sn_disp+5, want_sn_disp+20, 8);
- want_sn_disp[13] = 0;
+ memmove (want_sn, want_sn+16, 4);
+ want_sn[4] = ' ';
+ memmove (want_sn+5, want_sn+20, 8);
+ want_sn[13] = 0;
}
- else if (len == 20 && want_sn_disp[19] == '0')
+ else if (len == 20 && want_sn[19] == '0')
{
/* We assume that a 20 byte serial number is a standard one
* which has the property to have a zero in the last nibble (Due
* to BCD representation). We don't display this '0' because it
* may confuse the user. */
- want_sn_disp[19] = 0;
+ want_sn[19] = 0;
}
for (;;)
{
- err = agent_card_serialno (ctrl, &serialno, want_sn);
+ /* Scan device(s), and check if key for GRIP is available. */
+ err = agent_card_serialno (ctrl, &serialno, NULL);
if (!err)
{
- log_debug ("detected card with S/N %s\n", serialno);
- i = strcmp (serialno, want_sn);
+ struct card_key_info_s *keyinfo;
+
xfree (serialno);
- serialno = NULL;
- if (!i)
+ err = agent_card_keyinfo (ctrl, hexgrip, &keyinfo);
+ if (!err)
{
- xfree (want_sn_disp);
+ /* Key for GRIP found, use it directly. */
+ agent_card_free_keyinfo (keyinfo);
xfree (want_sn);
- *r_kid = want_kid;
- return 0; /* yes, we have the correct card */
+ if ((*r_kid = xtrystrdup (hexgrip)))
+ return 0;
+ else
+ return gpg_error_from_syserror ();
}
}
- else if (gpg_err_code (err) == GPG_ERR_ENODEV)
- {
- log_debug ("no device present\n");
- err = 0;
- no_card = 1;
- }
- else if (gpg_err_code (err) == GPG_ERR_CARD_NOT_PRESENT)
+
+ if (asprintf (&desc,
+ "%s:%%0A%%0A"
+ " %s",
+ L_("Please insert the card with serial number"),
+ want_sn) < 0)
{
- log_debug ("no card present\n");
- err = 0;
- no_card = 2;
+ err = out_of_core ();
}
else
{
- log_error ("error accessing card: %s\n", gpg_strerror (err));
- }
-
- if (!err)
- {
- if (asprintf (&desc,
- "%s:%%0A%%0A"
- " %s",
- no_card
- ? L_("Please insert the card with serial number")
- : L_("Please remove the current card and "
- "insert the one with serial number"),
- want_sn_disp) < 0)
- {
- err = out_of_core ();
- }
- else
- {
- err = agent_get_confirmation (ctrl, desc, NULL, NULL, 0);
- if (ctrl->pinentry_mode == PINENTRY_MODE_LOOPBACK &&
- gpg_err_code (err) == GPG_ERR_NO_PIN_ENTRY)
- err = gpg_error (GPG_ERR_CARD_NOT_PRESENT);
+ err = agent_get_confirmation (ctrl, desc, NULL, NULL, 0);
+ if (ctrl->pinentry_mode == PINENTRY_MODE_LOOPBACK &&
+ gpg_err_code (err) == GPG_ERR_NO_PIN_ENTRY)
+ err = gpg_error (GPG_ERR_CARD_NOT_PRESENT);
- xfree (desc);
- }
+ xfree (desc);
}
+
if (err)
{
- xfree (want_sn_disp);
xfree (want_sn);
- xfree (want_kid);
return err;
}
}