aboutsummaryrefslogtreecommitdiffstats
path: root/agent/command-ssh.c
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2017-02-17 10:39:28 +0000
committerNIIBE Yutaka <[email protected]>2017-02-17 10:46:01 +0000
commit3f4f64b6ac0d7160fd9e1301f95820894b219c3f (patch)
tree68666aefebd3add0cda56297234bd3e875fd620c /agent/command-ssh.c
parentgpgscm: Guard use of tagged expressions. (diff)
downloadgnupg-3f4f64b6ac0d7160fd9e1301f95820894b219c3f.tar.gz
gnupg-3f4f64b6ac0d7160fd9e1301f95820894b219c3f.zip
agent: Send back all public keys for available cards.
* agent/call-scd.c (card_cardlist_cb, agent_card_cardlist): New. * agent/command-ssh.c (card_key_list): New. (ssh_handler_request_identities): Call card_key_list and loop for the list to send public keys for all available cards. Signed-off-by: NIIBE Yutaka <[email protected]>
Diffstat (limited to '')
-rw-r--r--agent/command-ssh.c76
1 files changed, 68 insertions, 8 deletions
diff --git a/agent/command-ssh.c b/agent/command-ssh.c
index 1d4453c84..2c74618d6 100644
--- a/agent/command-ssh.c
+++ b/agent/command-ssh.c
@@ -2382,6 +2382,29 @@ 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;
+
+ err = agent_card_serialno (ctrl, r_serialno, NULL);
+ if (err)
+ {
+ if (opt.verbose)
+ log_info (_("error getting serial number of card: %s\n"),
+ gpg_strerror (err));
+ return err;
+ }
+
+ 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
@@ -2561,17 +2584,54 @@ ssh_handler_request_identities (ctrl_t ctrl,
reader - this should be allowed even without being listed in
sshcontrol. */
- if (!opt.disable_scdaemon
- && !card_key_available (ctrl, &key_public, &cardsn))
+ if (!opt.disable_scdaemon)
{
- err = ssh_send_key_public (key_blobs, key_public, cardsn);
- gcry_sexp_release (key_public);
- key_public = NULL;
- xfree (cardsn);
+ char *serialno;
+ strlist_t card_list, sl;
+
+ err = card_key_list (ctrl, &serialno, &card_list);
if (err)
- goto out;
+ {
+ if (opt.verbose)
+ log_info (_("error getting list of cards: %s\n"),
+ gpg_strerror (err));
+ goto out;
+ }
- key_counter++;
+ for (sl = card_list; sl; sl = sl->next)
+ {
+ char *serialno0;
+ err = agent_card_serialno (ctrl, &serialno0, sl->d);
+ if (err)
+ {
+ if (opt.verbose)
+ log_info (_("error getting serial number of card: %s\n"),
+ gpg_strerror (err));
+ xfree (serialno);
+ free_strlist (card_list);
+ goto out;
+ }
+
+ xfree (serialno0);
+ if (card_key_available (ctrl, &key_public, &cardsn))
+ continue;
+
+ err = ssh_send_key_public (key_blobs, key_public, cardsn);
+ gcry_sexp_release (key_public);
+ key_public = NULL;
+ xfree (cardsn);
+ if (err)
+ {
+ xfree (serialno);
+ free_strlist (card_list);
+ goto out;
+ }
+
+ key_counter++;
+ }
+
+ xfree (serialno);
+ free_strlist (card_list);
}
/* Then look at all the registered and non-disabled keys. */