* sig-check.c (do_check): Move the signing algo and hash checks from
authorDavid Shaw <dshaw@jabberwocky.com>
Sat, 13 Dec 2003 03:53:27 +0000 (03:53 +0000)
committerDavid Shaw <dshaw@jabberwocky.com>
Sat, 13 Dec 2003 03:53:27 +0000 (03:53 +0000)
here... (signature_check2): ... to here. (check_key_signature2): ... and
here.  This is a minor optimization to avoid fetching a key (which can be
expensive, especially if it is not self-signed, and there are many key
signatures on it which need to be checked for ultimate trust) if the
signature would have failed anyway because of algorithm or hash problems.

g10/ChangeLog
g10/sig-check.c

index 07cc6f5..6285f73 100644 (file)
@@ -1,3 +1,15 @@
+2003-12-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * sig-check.c (do_check): Move the signing algo and hash checks
+       from here...
+       (signature_check2): ... to here.
+       (check_key_signature2): ... and here.  This is a minor
+       optimization to avoid fetching a key (which can be expensive,
+       especially if it is not self-signed, and there are many key
+       signatures on it which need to be checked for ultimate trust) if
+       the signature would have failed anyway because of algorithm or
+       hash problems.
+
 2003-12-10  David Shaw  <dshaw@jabberwocky.com>
 
        * packet.h, build-packet.c (hash_public_key): Remove function ...
index 403d07d..a128710 100644 (file)
@@ -1,6 +1,6 @@
 /* sig-check.c -  Check a signature
- * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
- *               Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002,
+ *               2003 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -61,15 +61,20 @@ signature_check2( PKT_signature *sig, MD_HANDLE digest, u32 *r_expiredate,
     PKT_public_key *pk = m_alloc_clear( sizeof *pk );
     int rc=0;
 
-    /* Sanity check that the md has a context for the hash that the
-       sig is expecting.  This can happen if a onepass sig header does
-       not match the actual sig, and also if the clearsign "Hash:"
-       header is missing or does not match the actual sig. */
+    if( (rc=check_digest_algo(sig->digest_algo)) )
+      ; /* we don't have this digest */
+    else if((rc=check_pubkey_algo(sig->pubkey_algo)))
+      ; /* we don't have this pubkey algo */
+    else if(!md_algo_present(digest,sig->digest_algo))
+      {
+       /* Sanity check that the md has a context for the hash that the
+          sig is expecting.  This can happen if a onepass sig header does
+          not match the actual sig, and also if the clearsign "Hash:"
+          header is missing or does not match the actual sig. */
 
-    if(!md_algo_present(digest,sig->digest_algo)) {
         log_info(_("WARNING: signature digest conflict in message\n"));
        rc=G10ERR_GENERAL;
-    }
+      }
     else if( get_pubkey( pk, sig->keyid ) )
        rc = G10ERR_NO_PUBKEY;
     else if(!pk->is_valid && !pk->is_primary)
@@ -274,10 +279,6 @@ do_check( PKT_public_key *pk, PKT_signature *sig, MD_HANDLE digest,
 
     if( (rc=do_check_messages(pk,sig,r_expired,r_revoked)) )
         return rc;
-    if( (rc=check_digest_algo(sig->digest_algo)) )
-       return rc;
-    if( (rc=check_pubkey_algo(sig->pubkey_algo)) )
-       return rc;
 
     /* make sure the digest algo is enabled (in case of a detached signature)*/
     md_enable( digest, sig->digest_algo );
@@ -518,6 +519,8 @@ check_key_signature2( KBNODE root, KBNODE node, PKT_public_key *check_pk,
         }
     }
 
+    if( (rc=check_pubkey_algo(sig->pubkey_algo)) )
+       return rc;
     if( (rc=check_digest_algo(algo)) )
        return rc;