Version 0.10
[gnuk/gnuk.git] / src / ac.c
index 66ba242..a1643d2 100644 (file)
--- a/src/ac.c
+++ b/src/ac.c
@@ -28,7 +28,7 @@
 #include "polarssl/config.h"
 #include "polarssl/sha1.h"
 
-static uint8_t auth_status = AC_NONE_AUTHORIZED;
+uint8_t volatile auth_status = AC_NONE_AUTHORIZED;
 
 int
 ac_check_status (uint8_t ac_flag)
@@ -44,16 +44,16 @@ ac_check_status (uint8_t ac_flag)
 void
 ac_reset_pso_cds (void)
 {
+  gpg_do_clear_prvkey (GPG_KEY_FOR_SIGNING);
   auth_status &= ~AC_PSO_CDS_AUTHORIZED;
 }
 
-uint8_t pw1_keystring[KEYSTRING_SIZE_PW1];
-
 void
-ac_reset_pso_other (void)
+ac_reset_other (void)
 {
-  memset (pw1_keystring, 0, KEYSTRING_SIZE_PW1);
-  auth_status &= ~AC_PSO_OTHER_AUTHORIZED;
+  gpg_do_clear_prvkey (GPG_KEY_FOR_DECRYPTION);
+  gpg_do_clear_prvkey (GPG_KEY_FOR_AUTHENTICATION);
+  auth_status &= ~AC_OTHER_AUTHORIZED;
 }
 
 /*
@@ -86,34 +86,38 @@ verify_pso_cds (const uint8_t *pw, int pw_len)
 }
 
 int
-verify_pso_other (const uint8_t *pw, int pw_len)
+verify_other (const uint8_t *pw, int pw_len)
 {
   const uint8_t *ks_pw1;
+  uint8_t pw1_keystring[KEYSTRING_SIZE_PW1];
 
-  DEBUG_INFO ("verify_pso_other\r\n");
+  DEBUG_INFO ("verify_other\r\n");
 
   if (gpg_passwd_locked (PW_ERR_PW1))
     return 0;
 
-  /*
-   * We check only the length of password string here.
-   * Real check is defered to decrypt/authenticate routines.
-   */
   ks_pw1 = gpg_do_read_simple (NR_DO_KEYSTRING_PW1);
   if ((ks_pw1 == NULL && pw_len == strlen (OPENPGP_CARD_INITIAL_PW1))
       || (ks_pw1 != NULL && pw_len == ks_pw1[0]))
     {                          /* No problem */
-      /*
-       * We don't call gpg_reset_pw_err_counters here, because
-       * password may be wrong.
-       */
       pw1_keystring[0] = pw_len;
       sha1 (pw, pw_len, pw1_keystring+1);
-      auth_status |= AC_PSO_OTHER_AUTHORIZED;
+      if (gpg_do_load_prvkey (GPG_KEY_FOR_DECRYPTION, BY_USER,
+                             pw1_keystring + 1) < 0)
+       goto error;
+
+      if (gpg_do_load_prvkey (GPG_KEY_FOR_AUTHENTICATION, BY_USER,
+                             pw1_keystring + 1) < 0)
+       goto error;
+
+      /* Reset counter as it's success now */
+      gpg_reset_pw_err_counter (PW_ERR_PW1);
+      auth_status |= AC_OTHER_AUTHORIZED;
       return 1;
     }
   else
     {
+    error:
       gpg_increment_pw_err_counter (PW_ERR_PW1);
       return 0;
     }
@@ -194,7 +198,8 @@ verify_admin_0 (const uint8_t *pw, int buf_len, int pw_len_known)
   else
     /* For empty PW3, pass phrase should be OPENPGP_CARD_INITIAL_PW3 */
     {
-      if ((pw_len_known >=0 && pw_len_known != strlen (OPENPGP_CARD_INITIAL_PW3))
+      if ((pw_len_known >=0
+          && pw_len_known != strlen (OPENPGP_CARD_INITIAL_PW3))
          || buf_len < (int)strlen (OPENPGP_CARD_INITIAL_PW3)
          || strncmp ((const char *)pw, OPENPGP_CARD_INITIAL_PW3,
                      strlen (OPENPGP_CARD_INITIAL_PW3)) != 0)
@@ -239,3 +244,19 @@ verify_admin (const uint8_t *pw, int pw_len)
   auth_status |= AC_ADMIN_AUTHORIZED;
   return 1;
 }
+
+void
+ac_reset_admin (void)
+{
+  memset (keystring_md_pw3, 0, KEYSTRING_MD_SIZE);
+  auth_status &= ~AC_ADMIN_AUTHORIZED;
+}
+
+void
+ac_fini (void)
+{
+  auth_status = AC_NONE_AUTHORIZED;
+  gpg_do_clear_prvkey (GPG_KEY_FOR_SIGNING);
+  gpg_do_clear_prvkey (GPG_KEY_FOR_DECRYPTION);
+  gpg_do_clear_prvkey (GPG_KEY_FOR_AUTHENTICATION);
+}