]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Revert last commit.
authorSimon Josefsson <simon@josefsson.org>
Wed, 10 Dec 2008 14:24:42 +0000 (15:24 +0100)
committerSimon Josefsson <simon@josefsson.org>
Wed, 10 Dec 2008 14:24:42 +0000 (15:24 +0100)
lib/x509/verify.c

index 6fc635a4d30e24fed3c66b3480cc3e037689ab6d..02964bafc8f9ebb83c535687350cf8c24a3fcd23 100644 (file)
@@ -226,7 +226,6 @@ _gnutls_verify_certificate2 (gnutls_x509_crt_t cert,
   gnutls_datum_t cert_signature = { NULL, 0 };
   gnutls_x509_crt_t issuer;
   int ret, issuer_version, result;
-  int sigalg;
 
   if (output)
     *output = 0;
@@ -252,11 +251,6 @@ _gnutls_verify_certificate2 (gnutls_x509_crt_t cert,
       return 0;
     }
 
-  /* If self-issued, it is one of our trusted certs.  Don't bother
-     testing an explicitly trusted cert further. */
-  if (is_issuer (cert, cert))
-    return 1;
-
   issuer_version = gnutls_x509_crt_get_version (issuer);
   if (issuer_version < 0)
     {
@@ -309,15 +303,24 @@ _gnutls_verify_certificate2 (gnutls_x509_crt_t cert,
       ret = 0;
     }
 
-  sigalg = gnutls_x509_crt_get_signature_algorithm (cert);
-
-  if (((sigalg == GNUTLS_SIGN_RSA_MD2) &&
-       !(flags & GNUTLS_VERIFY_ALLOW_SIGN_RSA_MD2)) ||
-      ((sigalg == GNUTLS_SIGN_RSA_MD5) &&
-       !(flags & GNUTLS_VERIFY_ALLOW_SIGN_RSA_MD5)))
+  /* If the certificate is not self signed check if the algorithms
+   * used are secure. If the certificate is self signed it doesn't
+   * really matter.
+   */
+  if (is_issuer (cert, cert) == 0)
     {
-      if (output)
-       *output |= GNUTLS_CERT_INSECURE_ALGORITHM | GNUTLS_CERT_INVALID;
+      int sigalg;
+
+      sigalg = gnutls_x509_crt_get_signature_algorithm (cert);
+
+      if (((sigalg == GNUTLS_SIGN_RSA_MD2) &&
+          !(flags & GNUTLS_VERIFY_ALLOW_SIGN_RSA_MD2)) ||
+         ((sigalg == GNUTLS_SIGN_RSA_MD5) &&
+          !(flags & GNUTLS_VERIFY_ALLOW_SIGN_RSA_MD5)))
+       {
+         if (output)
+           *output |= GNUTLS_CERT_INSECURE_ALGORITHM | GNUTLS_CERT_INVALID;
+       }
     }
 
   result = ret;
@@ -371,6 +374,24 @@ _gnutls_x509_verify_certificate (const gnutls_x509_crt_t * certificate_list,
   int i = 0, ret;
   unsigned int status = 0, output;
 
+  if (clist_size > 1)
+    {
+      /* Check if the last certificate in the path is self signed.
+       * In that case ignore it (a certificate is trusted only if it
+       * leads to a trusted party by us, not the server's).
+       *
+       * This in addition prevents from verifying self signed certificates
+       * against themselves. This although not bad caused verification
+       * failures on some root self signed certificates that use the MD2
+       * algorithm.
+       */
+      if (gnutls_x509_crt_check_issuer (certificate_list[clist_size - 1],
+                                   certificate_list[clist_size - 1]) > 0)
+       {
+         clist_size--;
+       }
+    }
+
   /* Verify the last certificate in the certificate path
    * against the trusted CA certificate list.
    *