Finish porting dsa_test.cc to GTest. Along the way, this fixes some size_t truncations. Bug: 516 Change-Id: Iff0cf6ced0b7deb4c48c268e051a4da433088056 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/55453 Commit-Queue: David Benjamin <davidben@google.com> Reviewed-by: Bob Beck <bbe@google.com>
diff --git a/crypto/dsa/dsa_test.cc b/crypto/dsa/dsa_test.cc index cee783d..dc1956e 100644 --- a/crypto/dsa/dsa_test.cc +++ b/crypto/dsa/dsa_test.cc
@@ -69,8 +69,9 @@ #include <openssl/bn.h> #include <openssl/crypto.h> #include <openssl/err.h> +#include <openssl/span.h> -#include "../internal.h" +#include "../test/test_util.h" // The following values are taken from the updated Appendix 5 to FIPS PUB 186 @@ -169,153 +170,79 @@ }; static bssl::UniquePtr<DSA> GetFIPSDSA(void) { - bssl::UniquePtr<DSA> dsa(DSA_new()); + bssl::UniquePtr<DSA> dsa(DSA_new()); if (!dsa) { return nullptr; } - dsa->p = BN_bin2bn(fips_p, sizeof(fips_p), nullptr); - dsa->q = BN_bin2bn(fips_q, sizeof(fips_q), nullptr); - dsa->g = BN_bin2bn(fips_g, sizeof(fips_g), nullptr); - dsa->pub_key = BN_bin2bn(fips_y, sizeof(fips_y), nullptr); - dsa->priv_key = BN_bin2bn(fips_x, sizeof(fips_x), nullptr); - if (dsa->p == nullptr || dsa->q == nullptr || dsa->g == nullptr || - dsa->pub_key == nullptr || dsa->priv_key == nullptr) { + bssl::UniquePtr<BIGNUM> p(BN_bin2bn(fips_p, sizeof(fips_p), nullptr)); + bssl::UniquePtr<BIGNUM> q(BN_bin2bn(fips_q, sizeof(fips_q), nullptr)); + bssl::UniquePtr<BIGNUM> g(BN_bin2bn(fips_g, sizeof(fips_g), nullptr)); + if (!p || !q || !g || !DSA_set0_pqg(dsa.get(), p.get(), q.get(), g.get())) { return nullptr; } + // |DSA_set0_pqg| takes ownership. + p.release(); + q.release(); + g.release(); + bssl::UniquePtr<BIGNUM> pub_key(BN_bin2bn(fips_y, sizeof(fips_y), nullptr)); + bssl::UniquePtr<BIGNUM> priv_key(BN_bin2bn(fips_x, sizeof(fips_x), nullptr)); + if (!pub_key || !priv_key || + !DSA_set0_key(dsa.get(), pub_key.get(), priv_key.get())) { + return nullptr; + } + // |DSA_set0_key| takes ownership. + pub_key.release(); + priv_key.release(); return dsa; } -struct GenerateContext { - FILE *out = nullptr; - int ok = 0; - int num = 0; -}; - -static int GenerateCallback(int p, int n, BN_GENCB *arg) { - GenerateContext *ctx = reinterpret_cast<GenerateContext *>(arg->arg); - char c = '*'; - switch (p) { - case 0: - c = '.'; - ctx->num++; - break; - case 1: - c = '+'; - break; - case 2: - c = '*'; - ctx->ok++; - break; - case 3: - c = '\n'; - } - fputc(c, ctx->out); - fflush(ctx->out); - if (!ctx->ok && p == 0 && ctx->num > 1) { - fprintf(stderr, "error in dsatest\n"); - return 0; - } - return 1; -} - -static int TestGenerate(FILE *out) { - BN_GENCB cb; - int counter, i, j; - uint8_t buf[256]; - unsigned long h; - uint8_t sig[256]; - unsigned int siglen; - - fprintf(out, "test generation of DSA parameters\n"); - - GenerateContext ctx; - ctx.out = out; - BN_GENCB_set(&cb, GenerateCallback, &ctx); +TEST(DSATest, Generate) { bssl::UniquePtr<DSA> dsa(DSA_new()); - if (!dsa || - !DSA_generate_parameters_ex(dsa.get(), 512, seed, 20, &counter, &h, - &cb)) { - return false; - } + ASSERT_TRUE(dsa); + int counter; + unsigned long h; + ASSERT_TRUE(DSA_generate_parameters_ex(dsa.get(), 512, seed, 20, &counter, &h, + nullptr)); + EXPECT_EQ(counter, 105); + EXPECT_EQ(h, 2u); - fprintf(out, "seed\n"); - for (i = 0; i < 20; i += 4) { - fprintf(out, "%02X%02X%02X%02X ", seed[i], seed[i + 1], seed[i + 2], - seed[i + 3]); - } - fprintf(out, "\ncounter=%d h=%lu\n", counter, h); + auto expect_bn_bytes = [](const char *msg, const BIGNUM *bn, + bssl::Span<const uint8_t> bytes) { + std::vector<uint8_t> buf(BN_num_bytes(bn)); + BN_bn2bin(bn, buf.data()); + EXPECT_EQ(Bytes(buf), Bytes(bytes)) << msg; + }; + expect_bn_bytes("q value is wrong", DSA_get0_q(dsa.get()), fips_q); + expect_bn_bytes("p value is wrong", DSA_get0_p(dsa.get()), fips_p); + expect_bn_bytes("g value is wrong", DSA_get0_g(dsa.get()), fips_g); - if (counter != 105) { - fprintf(stderr, "counter should be 105\n"); - return false; - } - if (h != 2) { - fprintf(stderr, "h should be 2\n"); - return false; - } + ASSERT_TRUE(DSA_generate_key(dsa.get())); - i = BN_bn2bin(dsa->q, buf); - j = sizeof(fips_q); - if (i != j || OPENSSL_memcmp(buf, fips_q, i) != 0) { - fprintf(stderr, "q value is wrong\n"); - return false; - } + std::vector<uint8_t> sig(DSA_size(dsa.get())); + unsigned sig_len; + ASSERT_TRUE(DSA_sign(0, fips_digest, sizeof(fips_digest), sig.data(), + &sig_len, dsa.get())); - i = BN_bn2bin(dsa->p, buf); - j = sizeof(fips_p); - if (i != j || OPENSSL_memcmp(buf, fips_p, i) != 0) { - fprintf(stderr, "p value is wrong\n"); - return false; - } - - i = BN_bn2bin(dsa->g, buf); - j = sizeof(fips_g); - if (i != j || OPENSSL_memcmp(buf, fips_g, i) != 0) { - fprintf(stderr, "g value is wrong\n"); - return false; - } - - if (!DSA_generate_key(dsa.get()) || - !DSA_sign(0, fips_digest, sizeof(fips_digest), sig, &siglen, dsa.get())) { - return false; - } - if (DSA_verify(0, fips_digest, sizeof(fips_digest), sig, siglen, dsa.get()) != - 1) { - fprintf(stderr, "verification failure\n"); - return false; - } - - return true; + EXPECT_EQ(1, DSA_verify(0, fips_digest, sizeof(fips_digest), sig.data(), + sig_len, dsa.get())); } -static bool TestVerify(const uint8_t *sig, size_t sig_len, int expect) { +TEST(DSATest, Verify) { bssl::UniquePtr<DSA> dsa = GetFIPSDSA(); - if (!dsa) { - return false; - } + ASSERT_TRUE(dsa); - int ret = - DSA_verify(0, fips_digest, sizeof(fips_digest), sig, sig_len, dsa.get()); - if (ret != expect) { - fprintf(stderr, "DSA_verify returned %d, want %d\n", ret, expect); - return false; - } - - // Clear any errors from a test with expected failure. - ERR_clear_error(); - return true; -} - -// TODO(davidben): Convert this file to GTest properly. -TEST(DSATest, AllTests) { - if (!TestGenerate(stdout) || - !TestVerify(fips_sig, sizeof(fips_sig), 1) || - !TestVerify(fips_sig_negative, sizeof(fips_sig_negative), -1) || - !TestVerify(fips_sig_extra, sizeof(fips_sig_extra), -1) || - !TestVerify(fips_sig_bad_length, sizeof(fips_sig_bad_length), -1) || - !TestVerify(fips_sig_bad_r, sizeof(fips_sig_bad_r), 0)) { - ADD_FAILURE() << "Tests failed"; - } + EXPECT_EQ(1, DSA_verify(0, fips_digest, sizeof(fips_digest), fips_sig, + sizeof(fips_sig), dsa.get())); + EXPECT_EQ(-1, + DSA_verify(0, fips_digest, sizeof(fips_digest), fips_sig_negative, + sizeof(fips_sig_negative), dsa.get())); + EXPECT_EQ(-1, DSA_verify(0, fips_digest, sizeof(fips_digest), fips_sig_extra, + sizeof(fips_sig_extra), dsa.get())); + EXPECT_EQ(-1, + DSA_verify(0, fips_digest, sizeof(fips_digest), fips_sig_bad_length, + sizeof(fips_sig_bad_length), dsa.get())); + EXPECT_EQ(0, DSA_verify(0, fips_digest, sizeof(fips_digest), fips_sig_bad_r, + sizeof(fips_sig_bad_r), dsa.get())); } TEST(DSATest, InvalidGroup) {