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); }