New. Taken from gnupg 1.9.
[gnupg.git] / scd / card-dinsig.c
index 3e461fd..391a51d 100644 (file)
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
  */
 
+/* The German signature law and its bylaw (SigG and SigV) is currently
+   used with an interface specification described in DIN V 66291-1.
+   The AID to be used is: 'D27600006601'.
+
+   The file IDs for certificates utilize the generic format: 
+        Cxyz
+    C being the hex digit 'C' (12).
+    x being the service indicator:
+         '0' := SigG conform digital signature.
+         '1' := entity authentication.
+         '2' := key encipherment.
+         '3' := data encipherment.
+         '4' := key agreement.
+         other values are reserved for future use.
+    y being the security environment number using '0' for cards
+      not supporting a SE number.
+    z being the certificate type:
+         '0'        := C.CH (base certificate of ard holder) or C.ICC.
+         '1' .. '7' := C.CH (business or professional certificate
+                       of card holder.
+         '8' .. 'D' := C.CA (certificate of a CA issue by the Root-CA).
+         'E'        := C.RCA (self certified certificate of the Root-CA).
+         'F'        := reserved.
+   
+   The file IDs used by default are:
+   '1F00'  EF.SSD (security service descriptor). [o,o]
+   '2F02'  EF.GDO (global data objects) [m,m]
+   'A000'  EF.PROT (signature log).  Cyclic file with 20 records of 53 byte.
+           Read and update after user authentication. [o,o]
+   'B000'  EF.PK.RCA.DS (public keys of Root-CA).  Size is 512b or size 
+           of keys. [m (unless a 'C00E' is present),m]
+   'B001'  EF.PK.CA.DS (public keys of CAs).  Size is 512b or size
+           of keys. [o,o]
+   'C00n'  EF.C.CH.DS (digital signature certificate of card holder)
+           with n := 0 .. 7.  Size is 2k or size of cert.  Read and
+           update allowed after user authentication. [m,m]
+   'C00m'  EF.C.CA.DS (digital signature certificate of CA)
+           with m := 8 .. E.  Size is 1k or size of cert.  Read always 
+           allowed, update after uder authentication. [o,o]
+   'C100'  EF.C.ICC.AUT (AUT certificate of ICC) [o,m]
+   'C108'  EF.C.CA.AUT (AUT certificate of CA) [o,m]
+   'D000'  EF.DM (display message) [-,m]
+   
+   The letters in brackets indicate optional or mandatory files: The
+   first for card terminals under full control and the second for
+   "business" card terminals.
+
+   FIXME: Needs a lot more explanation.
+
+*/
+
+
 #include <config.h>
 #include <errno.h>
 #include <stdio.h>
@@ -25,7 +77,8 @@
 #include <string.h>
 #include <time.h>
 
-#include <opensc-pkcs15.h>
+#ifdef HAVE_OPENSC
+#include <opensc/pkcs15.h>
 #include <ksba.h>
 
 #include "scdaemon.h"
@@ -38,8 +91,7 @@ static int dinsig_read_cert (CARD card, const char *certidstr,
 
 /* See card.c for interface description.  Frankly we don't do any real
    enumeration but just check whether the well know files are
-   available.
- */
+   available.  */
 static int
 dinsig_enum_keypairs (CARD card, int idx,
                       unsigned char *keygrip, char **keyid)
@@ -64,8 +116,9 @@ dinsig_enum_keypairs (CARD card, int idx,
   cert = ksba_cert_new ();
   if (!cert)
     {
+      gpg_error_t tmperr = out_of_core ();
       xfree (buf);
-      return GNUPG_Out_Of_Core;
+      return tmperr;
     }
 
   krc = ksba_cert_init_from_mem (cert, buf, buflen); 
@@ -75,13 +128,13 @@ dinsig_enum_keypairs (CARD card, int idx,
       log_error ("failed to parse the certificate at idx %d: %s\n",
                  idx, ksba_strerror (krc));
       ksba_cert_release (cert);
-      return GNUPG_Card_Error;
+      return gpg_error (GPG_ERR_CARD);
     }
   if (card_help_get_keygrip (cert, keygrip))
     {
       log_error ("failed to calculate the keygrip at index %d\n", idx);
       ksba_cert_release (cert);
-      return GNUPG_Card_Error;
+      return gpg_error (GPG_ERR_CARD);
     }      
   ksba_cert_release (cert);
 
@@ -90,7 +143,7 @@ dinsig_enum_keypairs (CARD card, int idx,
     {
       *keyid = xtrymalloc (17);
       if (!*keyid)
-        return GNUPG_Out_Of_Core;
+        return out_of_core ();
       if (!idx)
         strcpy (*keyid, "DINSIG-DF01.C000");
       else
@@ -118,7 +171,7 @@ dinsig_read_cert (CARD card, const char *certidstr,
   else if (!strcmp (certidstr, "DINSIG-DF01.C200"))
     sc_format_path ("3F00DF01C200", &path);
   else
-    return GNUPG_Invalid_Id;
+    return gpg_error (GPG_ERR_INV_ID);
 
   rc = sc_select_file (card->scard, &path, &file);
   if (rc) 
@@ -131,19 +184,20 @@ dinsig_read_cert (CARD card, const char *certidstr,
     {
       log_error ("wrong type or structure of certificate EF\n");
       sc_file_free (file);
-      return GNUPG_Card_Error;
+      return gpg_error (GPG_ERR_CARD);
     }
   if (file->size < 20) /* check against a somewhat arbitrary length */
     { 
       log_error ("certificate EF too short\n");
       sc_file_free (file);
-      return GNUPG_Card_Error;
+      return gpg_error (GPG_ERR_CARD);
     }
   buf = xtrymalloc (file->size);
   if (!buf)
     {
+      gpg_error_t tmperr = out_of_core ();
       sc_file_free (file);
-      return GNUPG_Out_Of_Core;
+      return tmperr;
     }
       
   rc = sc_read_binary (card->scard, 0, buf, file->size, 0);
@@ -152,7 +206,7 @@ dinsig_read_cert (CARD card, const char *certidstr,
       log_error ("short read on certificate EF\n");
       sc_file_free (file);
       xfree (buf);
-      return GNUPG_Card_Error;
+      return gpg_error (GPG_ERR_CARD);
     }
   sc_file_free (file);
   if (rc < 0) 
@@ -203,3 +257,4 @@ card_dinsig_bind (CARD card)
   card->fnc.read_cert     = dinsig_read_cert;
 
 }
+#endif /*HAVE_OPENSC*/