summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNIIBE Yutaka <gniibe@fsij.org>2019-05-16 03:09:41 +0200
committerNIIBE Yutaka <gniibe@fsij.org>2019-05-16 03:09:41 +0200
commitdc35b25195e564affdea7969a7c4ea4e200ab45f (patch)
treee4fe0ea00ad5bd5f7025a5de366236371d20c4fe
parentagent: Support scdaemon operation using KEYGRIP. (diff)
downloadgnupg2-dc35b25195e564affdea7969a7c4ea4e200ab45f.tar.xz
gnupg2-dc35b25195e564affdea7969a7c4ea4e200ab45f.zip
agent,scd: Scan and load all public keys for availability.
* agent/divert-scd.c (ask_for_card): Scan by SERIALNO command. * scd/app-openpgp.c (do_with_keygrip): Make sure to load pubkey. Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
-rw-r--r--agent/divert-scd.c21
-rw-r--r--scd/app-openpgp.c4
2 files changed, 18 insertions, 7 deletions
diff --git a/agent/divert-scd.c b/agent/divert-scd.c
index a6ffba75f..cfa2347c7 100644
--- a/agent/divert-scd.c
+++ b/agent/divert-scd.c
@@ -48,15 +48,22 @@ ask_for_card (ctrl_t ctrl, const unsigned char *shadow_info,
*r_kid = NULL;
- bin2hex (grip, 20, hexgrip);
- err = agent_card_keyinfo (ctrl, hexgrip, &keyinfo);
+ /* Scan device(s), and check if key for GRIP is available. */
+ err = agent_card_serialno (ctrl, &serialno, NULL);
if (!err)
{
- agent_card_free_keyinfo (keyinfo);
- if ((*r_kid = xtrystrdup (hexgrip)))
- return 0;
- else
- return gpg_error_from_syserror ();
+ xfree (serialno);
+ bin2hex (grip, 20, hexgrip);
+ err = agent_card_keyinfo (ctrl, hexgrip, &keyinfo);
+ if (!err)
+ {
+ /* Key for GRIP found, use it directly. */
+ agent_card_free_keyinfo (keyinfo);
+ if ((*r_kid = xtrystrdup (hexgrip)))
+ return 0;
+ else
+ return gpg_error_from_syserror ();
+ }
}
err = parse_shadow_info (shadow_info, &want_sn, &want_kid, NULL);
diff --git a/scd/app-openpgp.c b/scd/app-openpgp.c
index c1c90350b..95df43828 100644
--- a/scd/app-openpgp.c
+++ b/scd/app-openpgp.c
@@ -4950,6 +4950,10 @@ do_with_keygrip (app_t app, ctrl_t ctrl, int action, const char *keygrip_str)
{
int i;
+ /* Make sure we have load the public keys. */
+ for (i = 0; i < 3; i++)
+ get_public_key (app, i);
+
if (action == KEYGRIP_ACTION_LOOKUP)
{
if (keygrip_str == NULL)