* gpgv.c (agent_scd_getattr): Stub.
authorDavid Shaw <dshaw@jabberwocky.com>
Wed, 15 Sep 2004 18:41:36 +0000 (18:41 +0000)
committerDavid Shaw <dshaw@jabberwocky.com>
Wed, 15 Sep 2004 18:41:36 +0000 (18:41 +0000)
* misc.c (get_signature_count): New.  Get the signature count from a
smartcard. (pct_expando): Call it here so the %c expando becomes the
number of signatures issued.  This allows for notations or the like with
an automatic signature count.

* ccid-driver.c (usb_get_string_simple): Replacement function to work with
older libusb.

g10/ChangeLog
g10/ccid-driver.c
g10/gpgv.c
g10/misc.c

index 00ac0f1..decbd97 100644 (file)
@@ -1,3 +1,16 @@
+2004-09-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgv.c (agent_scd_getattr): Stub.
+
+       * misc.c (get_signature_count): New.  Get the signature count from
+       a smartcard.
+       (pct_expando): Call it here so the %c expando becomes the number
+       of signatures issued.  This allows for notations or the like with
+       an automatic signature count.
+
+       * ccid-driver.c (usb_get_string_simple): Replacement function to
+       work with older libusb.
+
 2004-09-15  Werner Koch  <wk@g10code.com>
 
        * g10.c [HAVE_LIBUSB]: New option --debug-ccid-driver.
index 7fc241c..7277ac2 100644 (file)
@@ -214,7 +214,63 @@ static int bulk_out (ccid_driver_t handle, unsigned char *msg, size_t msglen);
 static int bulk_in (ccid_driver_t handle, unsigned char *buffer, size_t length,
                     size_t *nread, int expected_type, int seqno);
 
+#ifndef HAVE_USB_GET_STRING_SIMPLE
 
+/* This function adapted from the libusb 0.1.8 sources.  It's here so
+   that systems with an older libusb can still use smartcards. */
+
+static int usb_get_string_simple(usb_dev_handle *dev, int indx, char *buf,
+                                size_t buflen)
+{
+  char tbuf[256];
+  int ret, langid, si, di;
+
+  /*
+   * Asking for the zero'th index is special - it returns a string
+   * descriptor that contains all the language IDs supported by the
+   * device. Typically there aren't many - often only one. The
+   * language IDs are 16 bit numbers, and they start at the third byte
+   * in the descriptor. See USB 2.0 specification, section 9.6.7, for
+   * more information on this. */
+
+  ret=usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR,
+                     (USB_DT_STRING << 8), 0, tbuf, sizeof(tbuf), 1000);
+
+  if (ret < 0)
+    return ret;
+
+  if (ret < 4)
+    return -EIO;
+
+  langid = tbuf[2] | (tbuf[3] << 8);
+
+  ret=usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR,
+                     (USB_DT_STRING << 8)+indx,langid,tbuf,sizeof(tbuf),1000);
+  if (ret < 0)
+    return ret;
+
+  if (tbuf[1] != USB_DT_STRING)
+    return -EIO;
+
+  if (tbuf[0] > ret)
+    return -EFBIG;
+
+  for (di = 0, si = 2; si < tbuf[0]; si += 2) {
+    if (di >= (buflen - 1))
+      break;
+
+    if (tbuf[si + 1])  /* high byte */
+      buf[di++] = '?';
+    else
+      buf[di++] = tbuf[si];
+  }
+
+  buf[di] = 0;
+
+  return di;
+}
+
+#endif /* !HAVE_USB_GET_STRING_SIMPLE */
 
 /* Convert a little endian stored 4 byte value into an unsigned
    integer. */
index 9de44a1..e0a9aed 100644 (file)
@@ -45,6 +45,7 @@
 #include "i18n.h"
 #include "status.h"
 #include "g10defs.h"
+#include "cardglue.h"
 
 
 enum cmd_and_opt_values { aNull = 0,
@@ -339,6 +340,8 @@ void show_photos(const struct user_attribute *attrs,int count,PKT_public_key *pk
 int parse_image_header(const struct user_attribute *attr,byte *type,u32 *len) {return 0;}
 char *image_type_to_string(byte type,int string) {return NULL;}
 
+int agent_scd_getattr (const char *name, struct agent_card_info_s *info) {return 0;}
+
 /* Stubs to void linking to ../cipher/cipher.c */
 int string_to_cipher_algo( const char *string ) { return 0; }
 const char *cipher_algo_to_string( int algo ) { return "?";}
index c2dfe35..c47459b 100644 (file)
@@ -39,6 +39,7 @@
 #include "photoid.h"
 #include "options.h"
 #include "i18n.h"
+#include "cardglue.h"
 
 #if defined(__linux__) && defined(__alpha__) && __GLIBC__ < 2
 static int
@@ -287,6 +288,22 @@ idea_cipher_warn(int show)
 }
 #endif
 
+static unsigned long get_signature_count(PKT_secret_key *sk)
+{
+#ifdef ENABLE_CARD_SUPPORT
+  if(sk && sk->is_protected && sk->protect.s2k.mode==1002)
+    {
+      struct agent_card_info_s info;
+      if(agent_scd_getattr("SIG-COUNTER",&info)==0)
+       return info.sig_counter;
+    }  
+#endif
+
+  /* How to do this without a card? */
+
+  return 0;
+}
+
 /* Expand %-strings.  Returns a string which must be m_freed.  Returns
    NULL if the string cannot be expanded (too large). */
 char *
@@ -366,6 +383,15 @@ pct_expando(const char *string,struct expando_args *args)
                }
              break;
 
+           case 'c': /* signature count from card, if any. */
+             if(idx+10<maxlen)
+               {
+                 sprintf(&ret[idx],"%lu",get_signature_count(args->sk));
+                 idx+=strlen(&ret[idx]);
+                 done=1;
+               }             
+             break;
+
            case 'p': /* primary pk fingerprint of a sk */
            case 'f': /* pk fingerprint */
            case 'g': /* sk fingerprint */