diff options
author | NIIBE Yutaka <[email protected]> | 2017-02-17 10:39:28 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2017-02-17 10:46:01 +0000 |
commit | 3f4f64b6ac0d7160fd9e1301f95820894b219c3f (patch) | |
tree | 68666aefebd3add0cda56297234bd3e875fd620c /agent/call-scd.c | |
parent | gpgscm: Guard use of tagged expressions. (diff) | |
download | gnupg-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 'agent/call-scd.c')
-rw-r--r-- | agent/call-scd.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/agent/call-scd.c b/agent/call-scd.c index 15a2ba529..71e0f581c 100644 --- a/agent/call-scd.c +++ b/agent/call-scd.c @@ -39,6 +39,7 @@ #include "agent.h" #include <assuan.h> +#include "strlist.h" #ifdef _POSIX_OPEN_MAX #define MAX_OPEN_FDS _POSIX_OPEN_MAX @@ -1189,9 +1190,74 @@ agent_card_getattr (ctrl_t ctrl, const char *name, char **result) return unlock_scd (ctrl, err); } + +struct card_cardlist_parm_s { + int error; + strlist_t list; +}; +/* Callback function for agent_card_cardlist. */ +static gpg_error_t +card_cardlist_cb (void *opaque, const char *line) +{ + struct card_cardlist_parm_s *parm = opaque; + const char *keyword = line; + int keywordlen; + for (keywordlen=0; *line && !spacep (line); line++, keywordlen++) + ; + while (spacep (line)) + line++; + if (keywordlen == 8 && !memcmp (keyword, "SERIALNO", keywordlen)) + { + const char *s; + int n; + + for (n=0,s=line; hexdigitp (s); s++, n++) + ; + + if (!n || (n&1) || *s) + parm->error = gpg_error (GPG_ERR_ASS_PARAMETER); + else + add_to_strlist (&parm->list, line); + } + + return 0; +} + +/* Call the scdaemon to retrieve list of available cards. On success + the allocated strlist is stored at RESULT. On error an error code is + returned and NULL stored at RESULT. */ +gpg_error_t +agent_card_cardlist (ctrl_t ctrl, strlist_t *result) +{ + int err; + struct card_cardlist_parm_s parm; + char line[ASSUAN_LINELENGTH]; + + *result = NULL; + + memset (&parm, 0, sizeof parm); + strcpy (line, "GETINFO card_list"); + + err = start_scd (ctrl); + if (err) + return err; + + err = assuan_transact (ctrl->scd_local->ctx, line, + NULL, NULL, NULL, NULL, + card_cardlist_cb, &parm); + if (!err && parm.error) + err = parm.error; + + if (!err) + *result = parm.list; + else + free_strlist (parm.list); + + return unlock_scd (ctrl, err); +} static gpg_error_t pass_status_thru (void *opaque, const char *line) |