2006-09-24 Marcus Brinkmann <marcus@g10code.de>
[gnupg.git] / scd / app-nks.c
index e69b598..1213083 100644 (file)
@@ -15,7 +15,8 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
  */
 
 #include <config.h>
@@ -27,7 +28,7 @@
 #include <time.h>
 
 #include "scdaemon.h"
-
+#include "i18n.h"
 #include "iso7816.h"
 #include "app-common.h"
 #include "tlv.h"
@@ -117,8 +118,8 @@ keygripstr_from_pk_file (int slot, int fid, char *r_gripstr)
 
 
 
-static int
-do_learn_status (APP app, CTRL ctrl)
+static gpg_error_t
+do_learn_status (app_t app, ctrl_t ctrl)
 {
   gpg_error_t err;
   char ct_buf[100], id_buf[100];
@@ -175,7 +176,7 @@ do_learn_status (APP app, CTRL ctrl)
    the CERTINFO status lines) and return it in the freshly allocated
    buffer put into CERT and the length of the certificate put into
    CERTLEN. */
-static int
+static gpg_error_t
 do_readcert (app_t app, const char *certid,
              unsigned char **cert, size_t *certlen)
 {
@@ -299,13 +300,13 @@ do_readcert (app_t app, const char *certid,
 
 
 /* Verify the PIN if required.  */
-static int
+static gpg_error_t
 verify_pin (app_t app,
-            int (pincb)(void*, const char *, char **),
+            gpg_error_t (*pincb)(void*, const char *, char **),
             void *pincb_arg)
 {
   /* Note that force_chv1 is never set but we do it here anyway so
-     that other applications may euse this function.  For example it
+     that other applications may reuse this function.  For example it
      makes sense to set force_chv1 for German signature law cards.
      NKS is very similar to the DINSIG draft standard. */
   if (!app->did_chv1 || app->force_chv1 ) 
@@ -320,7 +321,7 @@ verify_pin (app_t app,
           return rc;
         }
 
-      /* The follwoing limits are due to TCOS but also defined in the
+      /* The following limits are due to TCOS but also defined in the
          NKS specs. */
       if (strlen (pinvalue) < 6)
         {
@@ -340,7 +341,10 @@ verify_pin (app_t app,
       rc = iso7816_verify (app->slot, 0, pinvalue, strlen (pinvalue));
       if (rc)
         {
-          log_error ("verify PIN failed\n");
+          if ( gpg_error (rc) == GPG_ERR_USE_CONDITIONS )
+            log_error (_("the NullPIN has not yet been changed\n"));
+          else
+            log_error ("verify PIN failed\n");
           xfree (pinvalue);
           return rc;
         }
@@ -357,12 +361,12 @@ verify_pin (app_t app,
    If a PIN is required the PINCB will be used to ask for the PIN;
    that callback should return the PIN in an allocated buffer and
    store that in the 3rd argument.  */
-static in
+static gpg_error_
 do_sign (app_t app, const char *keyidstr, int hashalgo,
-         int (pincb)(void*, const char *, char **),
-           void *pincb_arg,
-           const void *indata, size_t indatalen,
-           unsigned char **outdata, size_t *outdatalen )
+         gpg_error_t (*pincb)(void*, const char *, char **),
+         void *pincb_arg,
+         const void *indata, size_t indatalen,
+         unsigned char **outdata, size_t *outdatalen )
 {
   static unsigned char sha1_prefix[15] = /* Object ID is 1.3.14.3.2.26 */
     { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03,
@@ -435,16 +439,16 @@ do_sign (app_t app, const char *keyidstr, int hashalgo,
 /* Decrypt the data in INDATA and return the allocated result in OUTDATA.
    If a PIN is required the PINCB will be used to ask for the PIN; it
    should return the PIN in an allocated buffer and put it into PIN.  */
-static in
+static gpg_error_
 do_decipher (app_t app, const char *keyidstr,
-             int (pincb)(void*, const char *, char **),
+             gpg_error_t (*pincb)(void*, const char *, char **),
              void *pincb_arg,
              const void *indata, size_t indatalen,
              unsigned char **outdata, size_t *outdatalen )
 {
   static const unsigned char mse_parm[] = {
     0x80, 1, 0x10, /* Select algorithm RSA. */
-    0x84, 1, 0x81  /* Select locak secret key 1 for descryption. */
+    0x84, 1, 0x81  /* Select local secret key 1 for decryption. */
   };
   int rc, i;
   int fid;
@@ -485,14 +489,14 @@ do_decipher (app_t app, const char *keyidstr,
 
 
 /* Select the NKS 2.0 application on the card in SLOT.  */
-int
-app_select_nks (APP app)
+gpg_error_t
+app_select_nks (app_t app)
 {
   static char const aid[] = { 0xD2, 0x76, 0x00, 0x00, 0x03, 0x01, 0x02 };
   int slot = app->slot;
   int rc;
   
-  rc = iso7816_select_application (slot, aid, sizeof aid);
+  rc = iso7816_select_application (slot, aid, sizeof aid, 0);
   if (!rc)
     {
       app->apptype = "NKS";