Test prime constants exposed in public BN API
authortb <tb@openbsd.org>
Thu, 1 Dec 2022 14:32:06 +0000 (14:32 +0000)
committertb <tb@openbsd.org>
Thu, 1 Dec 2022 14:32:06 +0000 (14:32 +0000)
Run the prime constants exposed in BN_get0_nist_prime_*() and
BN_get_rfc3526_prime_*() through Ballie-PSW.

regress/lib/libcrypto/bn/general/bn_primes.c

index cf13db6..e637932 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bn_primes.c,v 1.3 2022/12/01 13:49:12 tb Exp $ */
+/*     $OpenBSD: bn_primes.c,v 1.4 2022/12/01 14:32:06 tb Exp $ */
 /*
  * Copyright (c) 2022 Theo Buehler <tb@openbsd.org>
  *
@@ -76,6 +76,101 @@ test_bn_is_prime_fasttest(int do_trial_division)
        return failed;
 }
 
+#define BN_PRIME_FN_INIT(a) { .fn = a, .name = #a }
+
+static const struct test_dynamic_api {
+       BIGNUM *(*fn)(BIGNUM *);
+       const char *name;
+} dynamic_api_data[] = {
+       BN_PRIME_FN_INIT(BN_get_rfc2409_prime_1024),
+       BN_PRIME_FN_INIT(BN_get_rfc2409_prime_768),
+       BN_PRIME_FN_INIT(BN_get_rfc3526_prime_1536),
+       BN_PRIME_FN_INIT(BN_get_rfc3526_prime_2048),
+       BN_PRIME_FN_INIT(BN_get_rfc3526_prime_3072),
+       BN_PRIME_FN_INIT(BN_get_rfc3526_prime_4096),
+       BN_PRIME_FN_INIT(BN_get_rfc3526_prime_6144),
+       BN_PRIME_FN_INIT(BN_get_rfc3526_prime_8192),
+};
+
+#define N_DYNAMIC_TESTS (sizeof(dynamic_api_data) / sizeof(dynamic_api_data[0]))
+
+static const struct test_const_api {
+       const BIGNUM *(*fn)(void);
+       const char *name;
+} const_api_data[] = {
+       BN_PRIME_FN_INIT(BN_get0_nist_prime_192),
+       BN_PRIME_FN_INIT(BN_get0_nist_prime_224),
+       BN_PRIME_FN_INIT(BN_get0_nist_prime_256),
+       BN_PRIME_FN_INIT(BN_get0_nist_prime_384),
+       BN_PRIME_FN_INIT(BN_get0_nist_prime_521),
+};
+
+#define N_CONST_TESTS (sizeof(const_api_data) / sizeof(const_api_data[0]))
+
+static int
+test_prime_dynamic_api(const struct test_dynamic_api *tc)
+{
+       BIGNUM *prime;
+       int ret;
+       int failed = 1;
+
+       if ((prime = tc->fn(NULL)) == NULL) {
+               fprintf(stderr, "%s failed\n", tc->name);
+               goto err;
+       }
+
+       if ((ret = BN_is_prime_fasttest_ex(prime, 1, NULL, 1, NULL)) != 1) {
+               fprintf(stderr, "%s: %s want 1, got %d\n", tc->name,
+                   "BN_is_prime_fasttest_ex", ret);
+               goto err;
+       }
+
+       failed = 0;
+
+ err:
+       BN_free(prime);
+       return failed;
+}
+
+static int
+test_prime_const_api(const struct test_const_api *tc)
+{
+       const BIGNUM *prime;
+       int ret;
+       int failed = 1;
+
+       if ((prime = tc->fn()) == NULL) {
+               fprintf(stderr, "%s failed\n", tc->name);
+               goto err;
+       }
+
+       if ((ret = BN_is_prime_fasttest_ex(prime, 1, NULL, 1, NULL)) != 1) {
+               fprintf(stderr, "%s: %s: want 1, got %d\n", tc->name,
+                   "BN_is_prime_fasttest_ex", ret);
+               goto err;
+       }
+
+       failed = 0;
+
+ err:
+       return failed;
+}
+
+static int
+test_prime_constants(void)
+{
+       size_t i;
+       int failed = 0;
+
+       for (i = 0; i < N_DYNAMIC_TESTS; i++)
+               failed |= test_prime_dynamic_api(&dynamic_api_data[i]);
+
+       for (i = 0; i < N_CONST_TESTS; i++)
+               failed |= test_prime_const_api(&const_api_data[i]);
+
+       return failed;
+}
+
 int
 main(void)
 {
@@ -83,6 +178,7 @@ main(void)
 
        failed |= test_bn_is_prime_fasttest(0);
        failed |= test_bn_is_prime_fasttest(1);
+       failed |= test_prime_constants();
 
        return failed;
 }