agent,scd: Scan and load all public keys for availability.
authorNIIBE Yutaka <gniibe@fsij.org>
Thu, 16 May 2019 01:09:41 +0000 (10:09 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Thu, 16 May 2019 01:09:41 +0000 (10:09 +0900)
* 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>
agent/divert-scd.c
scd/app-openpgp.c

index a6ffba7..cfa2347 100644 (file)
@@ -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);
index c1c9035..95df438 100644 (file)
@@ -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)