sm: Show the usage flags when generating a key from a card.
authorWerner Koch <wk@gnupg.org>
Mon, 1 Apr 2019 17:58:33 +0000 (19:58 +0200)
committerWerner Koch <wk@gnupg.org>
Mon, 1 Apr 2019 17:58:33 +0000 (19:58 +0200)
* g10/call-agent.c (scd_keypairinfo_status_cb): Also store the usage
flags.
* sm/call-agent.c (scd_keypairinfo_status_cb): Ditto.
* sm/certreqgen-ui.c (gpgsm_gencertreq_tty): Print the usage flags.

Signed-off-by: Werner Koch <wk@gnupg.org>
g10/call-agent.c
sm/call-agent.c
sm/certreqgen-ui.c

index b02d6c6..83ca921 100644 (file)
@@ -798,7 +798,22 @@ scd_keypairinfo_status_cb (void *opaque, const char *line)
             p++;
           while (*p && !spacep (p))
             p++;
-          *p = 0;
+          if (*p)
+            {
+              *p++ = 0;
+              while (spacep (p))
+                p++;
+              while (*p && !spacep (p))
+                {
+                  switch (*p++)
+                    {
+                    case 'c': sl->flags |= GCRY_PK_USAGE_CERT; break;
+                    case 's': sl->flags |= GCRY_PK_USAGE_SIGN; break;
+                    case 'e': sl->flags |= GCRY_PK_USAGE_ENCR; break;
+                    case 'a': sl->flags |= GCRY_PK_USAGE_AUTH; break;
+                    }
+                }
+            }
         }
     }
 
@@ -808,7 +823,8 @@ 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.  */
+ * a space and the keyref.  The flags of the string carry the usage
+ * bits. */
 gpg_error_t
 agent_scd_keypairinfo (ctrl_t ctrl, strlist_t *r_list)
 {
index 4f2b83f..4c3eecb 100644 (file)
@@ -785,9 +785,9 @@ scd_keypairinfo_status_cb (void *opaque, const char *line)
     {
       sl = append_to_strlist (listaddr, line);
       p = sl->d;
-      /* Make sure that we only have two tokes so that future
-         extensions of the format won't change the format expected by
-         the caller.  */
+      /* Make sure that we only have two tokens so that future
+       * extensions of the format won't change the format expected by
+       * the caller.  */
       while (*p && !spacep (p))
         p++;
       if (*p)
@@ -796,7 +796,22 @@ scd_keypairinfo_status_cb (void *opaque, const char *line)
             p++;
           while (*p && !spacep (p))
             p++;
-          *p = 0;
+          if (*p)
+            {
+              *p++ = 0;
+              while (spacep (p))
+                p++;
+              while (*p && !spacep (p))
+                {
+                  switch (*p++)
+                    {
+                    case 'c': sl->flags |= GCRY_PK_USAGE_CERT; break;
+                    case 's': sl->flags |= GCRY_PK_USAGE_SIGN; break;
+                    case 'e': sl->flags |= GCRY_PK_USAGE_ENCR; break;
+                    case 'a': sl->flags |= GCRY_PK_USAGE_AUTH; break;
+                    }
+                }
+            }
         }
     }
 
@@ -806,7 +821,7 @@ scd_keypairinfo_status_cb (void *opaque, const char *line)
 
 /* Call the agent to read the keypairinfo lines of the current card.
    The list is returned as a string made up of the keygrip, a space
-   and the keyid.  */
+   and the keyid.  The flags of the string carry the usage bits.  */
 int
 gpgsm_agent_scd_keypairinfo (ctrl_t ctrl, strlist_t *r_list)
 {
index 70e5739..6f822bd 100644 (file)
@@ -249,6 +249,7 @@ gpgsm_gencertreq_tty (ctrl_t ctrl, estream_t output_stream)
               gcry_sexp_t s_pkey;
               char *algostr = NULL;
               const char *keyref;
+              int any = 0;
 
               keyref = strchr (sl->d, ' ');
               if (keyref)
@@ -262,7 +263,28 @@ gpgsm_gencertreq_tty (ctrl_t ctrl, estream_t output_stream)
                     }
                   xfree (pkey);
                 }
-              tty_printf ("   (%d) %s %s\n", count, sl->d, algostr);
+              tty_printf ("   (%d) %s %s", count, sl->d, algostr);
+              if ((sl->flags & GCRY_PK_USAGE_CERT))
+                {
+                  tty_printf ("%scert", any?",":" (");
+                  any = 1;
+                }
+              if ((sl->flags & GCRY_PK_USAGE_SIGN))
+                {
+                  tty_printf ("%ssign", any?",":" (");
+                  any = 1;
+                }
+              if ((sl->flags & GCRY_PK_USAGE_AUTH))
+                {
+                  tty_printf ("%sauth", any?",":" (");
+                  any = 1;
+                }
+              if ((sl->flags & GCRY_PK_USAGE_ENCR))
+                {
+                  tty_printf ("%sencr", any?",":" (");
+                  any = 1;
+                }
+              tty_printf ("%s\n", any?")":"");
               xfree (algostr);
             }
           xfree (answer);