1
0
Fork 0
mirror of git://git.gnupg.org/gnupg.git synced 2025-07-02 22:46:30 +02:00

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 ec6a677923 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>
This commit is contained in:
Werner Koch 2019-04-03 17:45:35 +02:00
parent 679b8f1c04
commit 2c9b68f28d
No known key found for this signature in database
GPG key ID: E3FDFF218E45B72B
4 changed files with 26 additions and 25 deletions

View file

@ -450,38 +450,31 @@ enum_secret_keys (ctrl_t ctrl, void **context, PKT_public_key *sk)
/* KEY-FPR not supported by the card - get
* the key using the keygrip. */
char *keyref;
strlist_t kplist, sl;
strlist_t kplist;
const char *s;
int i;
err = agent_scd_getattr_one ("$ENCRKEYID", &keyref);
if (!err)
{
err = agent_scd_keypairinfo (ctrl, &kplist);
err = agent_scd_keypairinfo (ctrl, keyref,
&kplist);
if (!err)
{
for (sl = kplist; sl; sl = sl->next)
if ((s = strchr (sl->d, ' '))
&& !strcmp (s+1, keyref))
break;
if (sl)
{
c->fpr2[0] = '&';
for (i=1, s=sl->d;
(*s && *s != ' '
&& i < sizeof c->fpr2 - 3);
s++, i++)
c->fpr2[i] = *s;
c->fpr2[i] = 0;
name = c->fpr2;
}
else /* Restore error. */
err = gpg_error (GPG_ERR_INV_NAME);
c->fpr2[0] = '&';
for (i=1, s=kplist->d;
(*s && *s != ' '
&& i < sizeof c->fpr2 - 3);
s++, i++)
c->fpr2[i] = *s;
c->fpr2[i] = 0;
name = c->fpr2;
free_strlist (kplist);
}
xfree (keyref);
}
xfree (keyref);
}
if (err)
log_error ("error retrieving key from card: %s\n",
gpg_strerror (err));