Module Name:    src
Committed By:   agc
Date:           Mon Oct 22 08:35:14 UTC 2012

Modified Files:
        src/crypto/external/bsd/netpgp/dist/src/libverify 
[agc-netpgp-standalone]:
            libverify.c

Log Message:
fix DSA signature verification so it DTRT


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.4 -r1.1.2.5 \
    src/crypto/external/bsd/netpgp/dist/src/libverify/libverify.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/crypto/external/bsd/netpgp/dist/src/libverify/libverify.c
diff -u src/crypto/external/bsd/netpgp/dist/src/libverify/libverify.c:1.1.2.4 src/crypto/external/bsd/netpgp/dist/src/libverify/libverify.c:1.1.2.5
--- src/crypto/external/bsd/netpgp/dist/src/libverify/libverify.c:1.1.2.4	Sat Oct 20 12:18:31 2012
+++ src/crypto/external/bsd/netpgp/dist/src/libverify/libverify.c	Mon Oct 22 08:35:13 2012
@@ -1465,7 +1465,7 @@ verify_dsa_verify(uint8_t *calculated, u
 	BIGNUM		 *t1;
 	int		  ret;
 
-	if (sig[DSA_P].bn == NULL || sig[DSA_Q].bn == NULL || sig[DSA_G].bn == NULL) {
+	if (pubkey[DSA_P].bn == NULL || pubkey[DSA_Q].bn == NULL || pubkey[DSA_G].bn == NULL) {
 		return 0;
 	}
 	M = W = t1 = NULL;
@@ -1479,11 +1479,10 @@ verify_dsa_verify(uint8_t *calculated, u
 		printf("dsa: bad # of Q bits\n");
 		return 0;
 	}
-	if (pubkey->bn[DSA_Q].bits > DSA_MAX_MODULUS_BITS) {
+	if (pubkey->bn[DSA_P].bits > DSA_MAX_MODULUS_BITS) {
 		printf("dsa: p too large\n");
 		return 0;
 	}
-	/* no love for SHA512? */
 	if (calclen > SHA256_DIGEST_LENGTH) {
 		printf("dsa: digest too long\n");
 		return 0;
@@ -1492,8 +1491,8 @@ verify_dsa_verify(uint8_t *calculated, u
 	if ((M = BN_new()) == NULL || (W = BN_new()) == NULL || (t1 = BN_new()) == NULL ||
 	    BN_is_zero(sig[DSA_R].bn) || BN_is_negative(sig[DSA_R].bn) || BN_cmp(sig[DSA_R].bn, pubkey->bn[DSA_Q].bn) >= 0 ||
 	    BN_is_zero(sig[DSA_S].bn) || BN_is_negative(sig[DSA_S].bn) || BN_cmp(sig[DSA_S].bn, pubkey->bn[DSA_Q].bn) >= 0 ||
-	    BN_mod_inverse(W, sig[DSA_S].bn, pubkey->bn[DSA_Q].bn, NULL) != MP_OKAY) {
-		goto err;
+	    BN_mod_inverse(W, sig[DSA_S].bn, pubkey->bn[DSA_Q].bn, NULL) == NULL) {
+		goto done;
 	}
 	if (calclen > qbits / 8) {
 		calclen = qbits / 8;
@@ -1501,12 +1500,14 @@ verify_dsa_verify(uint8_t *calculated, u
 	if (BN_bin2bn(calculated, (int)calclen, M) == NULL ||
 	    !BN_mod_mul(M, M, W, pubkey->bn[DSA_Q].bn, NULL) ||
 	    !BN_mod_mul(W, sig[DSA_R].bn, W, pubkey->bn[DSA_Q].bn, NULL) ||
-	    !BN_mod_exp(pubkey->bn[DSA_P].bn, t1, pubkey->bn[DSA_G].bn, M, NULL) ||
-	    !BN_div(NULL, M, t1, pubkey->bn[DSA_Q].bn, NULL)) {
-		goto err;
+	    !BN_mod_exp(t1, pubkey->bn[DSA_G].bn, M, pubkey->bn[DSA_P].bn, NULL) ||
+	    !BN_mod_exp(W, pubkey->bn[DSA_Y].bn, W, pubkey->bn[DSA_P].bn, NULL) ||
+	    !BN_mod_mul(t1, t1, W, pubkey->bn[DSA_P].bn, NULL) ||
+	    !BN_div(NULL, t1, t1, pubkey->bn[DSA_Q].bn, NULL)) {
+		goto done;
 	}
-	ret = (BN_cmp(M, sig[DSA_R].bn) == 0);
-err:
+	ret = (BN_cmp(t1, sig[DSA_R].bn) == 0);
+done:
 	if (M) {
 		BN_free(M);
 	}

Reply via email to