* tdbio.h, tdbio.c (tdbio_read_record, tdbio_write_record): Store trust
[gnupg.git] / scd / command.c
index 8f005a3..aa410a6 100644 (file)
@@ -151,7 +151,17 @@ cmd_serialno (ASSUAN_CONTEXT ctx, char *line)
      S KEYPAIRINFO <hexstring_with_keygrip> <hexstring_with_id>
 
    If there is no certificate yet stored on the card a single "X" is
-   returned as the keygrip.
+   returned as the keygrip.  In addition to the keypair info, information
+   about all certificates stored on the card is also returned:
+
+     S CERTINFO <certtype> <hexstring_with_id>
+
+   Where CERTINFO is a number indicating the type of certificate:
+      0   := Unknown
+      100 := Regular X.509 cert
+      101 := Trusted X.509 cert
+      102 := Useful X.509 cert
+
 
 */
 static int
@@ -209,6 +219,34 @@ cmd_learn (ASSUAN_CONTEXT ctx, char *line)
     free (serial_and_stamp);
   }
 
+  /* Return information about the certificates. */
+  for (idx=0; !rc; idx++)
+    {
+      char *certid;
+      int certtype;
+
+      rc = card_enum_certs (ctrl->card_ctx, idx, &certid, &certtype);
+      if (!rc)
+        {
+          char *buf;
+
+          buf = xtrymalloc (40 + 1 + strlen (certid) + 1);
+          if (!buf)
+            rc = GNUPG_Out_Of_Core;
+          else
+            {
+              sprintf (buf, "%d %s", certtype, certid);
+              assuan_write_status (ctx, "CERTINFO", buf);
+              xfree (buf);
+            }
+        }
+      xfree (certid);
+    }
+  if (rc == -1)
+    rc = 0;
+
+
+  /* Return information about the keys. */
   for (idx=0; !rc; idx++)
     {
       unsigned char keygrip[20];
@@ -430,15 +468,23 @@ cmd_pksign (ASSUAN_CONTEXT ctx, char *line)
   int rc;
   void *outdata;
   size_t outdatalen;
+  char *keyidstr;
 
   if ((rc = open_card (ctrl)))
     return rc;
 
+  /* We have to use a copy of the key ID because the function may use
+     the pin_cb which in turn uses the assuan line buffer and thus
+     overwriting the original line with the keyid */
+  keyidstr = strdup (line);
+  if (!keyidstr)
+    return ASSUAN_Out_Of_Core;
   rc = card_sign (ctrl->card_ctx,
-                  line, GCRY_MD_SHA1,
+                  keyidstr, GCRY_MD_SHA1,
                   pin_cb, ctx,
                   ctrl->in_data.value, ctrl->in_data.valuelen,
                   &outdata, &outdatalen);
+  free (keyidstr);
   if (rc)
     {
       log_error ("card_sign failed: %s\n", gnupg_strerror (rc));
@@ -464,15 +510,20 @@ cmd_pkdecrypt (ASSUAN_CONTEXT ctx, char *line)
   int rc;
   void *outdata;
   size_t outdatalen;
+  char *keyidstr;
 
   if ((rc = open_card (ctrl)))
     return rc;
 
+  keyidstr = strdup (line);
+  if (!keyidstr)
+    return ASSUAN_Out_Of_Core;
   rc = card_decipher (ctrl->card_ctx,
-                      line
+                      keyidstr
                       pin_cb, ctx,
                       ctrl->in_data.value, ctrl->in_data.valuelen,
                       &outdata, &outdatalen);
+  free (keyidstr);
   if (rc)
     {
       log_error ("card_create_signature failed: %s\n", gnupg_strerror (rc));