diff options
author | Werner Koch <wk@gnupg.org> | 2019-04-03 17:45:35 +0200 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2019-04-03 17:45:35 +0200 |
commit | 2c9b68f28de1ce9a6a18d091caba01ddd4707774 (patch) | |
tree | afc99495166052529ebc54c0d6ce87d758a4fb0d /g10/call-agent.c | |
parent | scd: New options --info and --info-only for READKEY. (diff) | |
download | gnupg2-2c9b68f28de1ce9a6a18d091caba01ddd4707774.tar.xz gnupg2-2c9b68f28de1ce9a6a18d091caba01ddd4707774.zip |
gpg: Improve the code to decrypt using PIV cards.
* g10/call-agent.c (agent_scd_keypairinfo): Add arg 'keyref'.
* g10/keygen.c (ask_algo): Adjust.
* g10/skclist.c (enum_secret_keys): Request the keyref directly.
--
This improves commit ec6a6779236a89d4784a6bb7de0def9cc0f9e8a4 to avoid
looping over all keypairinfos. This way scdaemon does not need to
compute all the keypairinfos for all keys of a card. This patch is
possible due the enhanced READKEY command in scdaemon.
Signed-off-by: Werner Koch <wk@gnupg.org>
Diffstat (limited to 'g10/call-agent.c')
-rw-r--r-- | g10/call-agent.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/g10/call-agent.c b/g10/call-agent.c index f603d491a..f6c7d3951 100644 --- a/g10/call-agent.c +++ b/g10/call-agent.c @@ -824,13 +824,15 @@ scd_keypairinfo_status_cb (void *opaque, const char *line) /* Read the keypairinfo lines of the current card directly from * scdaemon. The list is returned as a string made up of the keygrip, * a space and the keyref. The flags of the string carry the usage - * bits. */ + * bits. If KEYREF is not NULL, only a single string is returned + * which matches the given keyref. */ gpg_error_t -agent_scd_keypairinfo (ctrl_t ctrl, strlist_t *r_list) +agent_scd_keypairinfo (ctrl_t ctrl, const char *keyref, strlist_t *r_list) { gpg_error_t err; strlist_t list = NULL; struct default_inq_parm_s inq_parm; + char line[ASSUAN_LINELENGTH]; *r_list = NULL; err= start_agent (ctrl, 1); @@ -839,7 +841,12 @@ agent_scd_keypairinfo (ctrl_t ctrl, strlist_t *r_list) memset (&inq_parm, 0, sizeof inq_parm); inq_parm.ctx = agent_ctx; - err = assuan_transact (agent_ctx, "SCD LEARN --keypairinfo", + if (keyref) + snprintf (line, DIM(line), "SCD READKEY --info-only %s", keyref); + else + snprintf (line, DIM(line), "SCD LEARN --keypairinfo"); + + err = assuan_transact (agent_ctx, line, NULL, NULL, default_inq_cb, &inq_parm, scd_keypairinfo_status_cb, &list); |