aboutsummaryrefslogtreecommitdiffstats
path: root/agent/command-ssh.c
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2020-01-09 02:55:42 +0000
committerNIIBE Yutaka <[email protected]>2020-01-09 02:55:42 +0000
commit57b8ed61ab93dd5aa73159f6db8adeb83d54b85f (patch)
treea933ef00801d656fe3730f97bfb1053fe062ed76 /agent/command-ssh.c
parentscd: First changes to implement a PIN cache. (diff)
downloadgnupg-57b8ed61ab93dd5aa73159f6db8adeb83d54b85f.tar.gz
gnupg-57b8ed61ab93dd5aa73159f6db8adeb83d54b85f.zip
agent: SSH: SCD KEYINFO to list available keys.
* agent/agent.h (agent_card_cardlist): Remove. (agent_card_keyinfo): Add CAP argument. * agent/call-scd.c (card_cardlist_cb): Remove. (agent_card_cardlist): Remove. (agent_card_keyinfo): Support CAP constraint. * agent/command-ssh.c (card_key_list): Remove. (ssh_handler_request_identities): Use SCD KEYINFO command. * agent/command.c (cmd_keyinfo): Follow the API change. * agent/divert-scd.c (ask_for_card): Likewise. Signed-off-by: NIIBE Yutaka <[email protected]>
Diffstat (limited to 'agent/command-ssh.c')
-rw-r--r--agent/command-ssh.c57
1 files changed, 21 insertions, 36 deletions
diff --git a/agent/command-ssh.c b/agent/command-ssh.c
index 0849a06fc..0e3a50947 100644
--- a/agent/command-ssh.c
+++ b/agent/command-ssh.c
@@ -2374,34 +2374,6 @@ ssh_key_grip (gcry_sexp_t key, unsigned char *buffer)
}
-static gpg_error_t
-card_key_list (ctrl_t ctrl, char **r_serialno, strlist_t *result)
-{
- gpg_error_t err;
-
- *r_serialno = NULL;
- *result = NULL;
-
- err = agent_card_serialno (ctrl, r_serialno, NULL);
- if (err)
- {
- if (gpg_err_code (err) != GPG_ERR_ENODEV && opt.verbose)
- log_info (_("error getting serial number of card: %s\n"),
- gpg_strerror (err));
-
- /* Nothing available. */
- return 0;
- }
-
- err = agent_card_cardlist (ctrl, result);
- if (err)
- {
- xfree (*r_serialno);
- *r_serialno = NULL;
- }
- return err;
-}
-
/* Check whether a smartcard is available and whether it has a usable
key. Store a copy of that key at R_PK and return 0. If no key is
available store NULL at R_PK and return an error code. If CARDSN
@@ -2582,9 +2554,18 @@ ssh_handler_request_identities (ctrl_t ctrl,
if (!opt.disable_scdaemon)
{
char *serialno;
- strlist_t card_list, sl;
+ struct card_key_info_s *keyinfo_list;
+ struct card_key_info_s *keyinfo;
+
+ /* Scan device(s), and get list of KEYGRIP. */
+ err = agent_card_serialno (ctrl, &serialno, NULL);
+ if (!err)
+ {
+ xfree (serialno);
+ err = agent_card_keyinfo (ctrl, NULL, GCRY_PK_USAGE_AUTH,
+ &keyinfo_list);
+ }
- err = card_key_list (ctrl, &serialno, &card_list);
if (err)
{
if (opt.verbose)
@@ -2593,12 +2574,18 @@ ssh_handler_request_identities (ctrl_t ctrl,
goto scd_out;
}
- for (sl = card_list; sl; sl = sl->next)
+ for (keyinfo = keyinfo_list; keyinfo; keyinfo = keyinfo->next)
{
char *serialno0;
char *cardsn;
- err = agent_card_serialno (ctrl, &serialno0, sl->d);
+ /*
+ * FIXME: Do access by KEYGRIP directly, not by $AUTHKEYID.
+ * In scdaemon, implement SCD READKEY <KEYGRIP> and
+ * SCD GETATTR <KEYGRIP>.
+ * Then, no switch of foreground card occurrs.
+ */
+ err = agent_card_serialno (ctrl, &serialno0, keyinfo->serialno);
if (err)
{
if (opt.verbose)
@@ -2619,16 +2606,14 @@ ssh_handler_request_identities (ctrl_t ctrl,
xfree (cardsn);
if (err)
{
- xfree (serialno);
- free_strlist (card_list);
+ agent_card_free_keyinfo (keyinfo_list);
goto out;
}
key_counter++;
}
- xfree (serialno);
- free_strlist (card_list);
+ agent_card_free_keyinfo (keyinfo_list);
}
scd_out: