]> granicus.if.org Git - openssl/commitdiff
Don't check self-signed signature in X509_verify_cert(), the check just
authorDr. Stephen Henson <steve@openssl.org>
Mon, 15 Jun 2009 14:52:38 +0000 (14:52 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Mon, 15 Jun 2009 14:52:38 +0000 (14:52 +0000)
wastes processing time and doesn't add any security.

CHANGES
crypto/x509/x509_vfy.c

diff --git a/CHANGES b/CHANGES
index 3f9160a585d9c7621b2ed6f21cc96f708949f654..6be0a73f7e5b98b6afdaa38ae2608ef2a7043ed7 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,11 @@
 
  Changes between 0.9.8k and 0.9.8l  [xx XXX xxxx]
 
+  *) Don't check self signed certificate signatures in X509_verify_cert():
+     it just wastes time without adding any security. As a useful side effect
+     self signed root CAs with non-FIPS digests are now usable in FIPS mode.
+     [Steve Henson]
+
   *) In dtls1_process_out_of_seq_message() the check if the current message
      is already buffered was missing. For every new message was memory
      allocated, allowing an attacker to perform an denial of service attack
index 336c40ddd7e7d6a76a9759038667f04741b41392..9e398c2d19801eadb4e38fc4acce8ffc01d73846 100644 (file)
@@ -986,7 +986,11 @@ static int internal_verify(X509_STORE_CTX *ctx)
        while (n >= 0)
                {
                ctx->error_depth=n;
-               if (!xs->valid)
+
+               /* Skip signature check for self signed certificates. It
+                * doesn't add any security and just wastes time.
+                */
+               if (!xs->valid && xs != xi)
                        {
                        if ((pkey=X509_get_pubkey(xi)) == NULL)
                                {
@@ -996,13 +1000,6 @@ static int internal_verify(X509_STORE_CTX *ctx)
                                if (!ok) goto end;
                                }
                        else if (X509_verify(xs,pkey) <= 0)
-                               /* XXX  For the final trusted self-signed cert,
-                                * this is a waste of time.  That check should
-                                * optional so that e.g. 'openssl x509' can be
-                                * used to detect invalid self-signatures, but
-                                * we don't verify again and again in SSL
-                                * handshakes and the like once the cert has
-                                * been declared trusted. */
                                {
                                ctx->error=X509_V_ERR_CERT_SIGNATURE_FAILURE;
                                ctx->current_cert=xs;