xref: /netbsd-src/crypto/external/bsd/openssl/dist/test/bn_internal_test.c (revision b0d1725196a7921d003d2c66a14f186abda4176b)
1*b0d17251Schristos /*
2*b0d17251Schristos  * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
3*b0d17251Schristos  *
4*b0d17251Schristos  * Licensed under the Apache License 2.0 (the "License").  You may not use
5*b0d17251Schristos  * this file except in compliance with the License.  You can obtain a copy
6*b0d17251Schristos  * in the file LICENSE in the source distribution or at
7*b0d17251Schristos  * https://www.openssl.org/source/license.html
8*b0d17251Schristos  */
9*b0d17251Schristos #include <assert.h>
10*b0d17251Schristos #include <errno.h>
11*b0d17251Schristos #include <stdio.h>
12*b0d17251Schristos #include <string.h>
13*b0d17251Schristos #include <ctype.h>
14*b0d17251Schristos 
15*b0d17251Schristos #include <openssl/bn.h>
16*b0d17251Schristos #include <openssl/crypto.h>
17*b0d17251Schristos #include <openssl/err.h>
18*b0d17251Schristos #include <openssl/rand.h>
19*b0d17251Schristos #include "internal/nelem.h"
20*b0d17251Schristos #include "internal/numbers.h"
21*b0d17251Schristos #include "testutil.h"
22*b0d17251Schristos #include "bn_prime.h"
23*b0d17251Schristos #include "crypto/bn.h"
24*b0d17251Schristos 
25*b0d17251Schristos static BN_CTX *ctx;
26*b0d17251Schristos 
test_is_prime_enhanced(void)27*b0d17251Schristos static int test_is_prime_enhanced(void)
28*b0d17251Schristos {
29*b0d17251Schristos     int ret;
30*b0d17251Schristos     int status = 0;
31*b0d17251Schristos     BIGNUM *bn = NULL;
32*b0d17251Schristos 
33*b0d17251Schristos     ret = TEST_ptr(bn = BN_new())
34*b0d17251Schristos           /* test passing a prime returns the correct status */
35*b0d17251Schristos           && TEST_true(BN_set_word(bn, 11))
36*b0d17251Schristos           /* return extra parameters related to composite */
37*b0d17251Schristos           && TEST_true(ossl_bn_miller_rabin_is_prime(bn, 10, ctx, NULL, 1,
38*b0d17251Schristos                                                      &status))
39*b0d17251Schristos           && TEST_int_eq(status, BN_PRIMETEST_PROBABLY_PRIME);
40*b0d17251Schristos     BN_free(bn);
41*b0d17251Schristos     return ret;
42*b0d17251Schristos }
43*b0d17251Schristos 
44*b0d17251Schristos static int composites[] = {
45*b0d17251Schristos     9, 21, 77, 81, 265
46*b0d17251Schristos };
47*b0d17251Schristos 
test_is_composite_enhanced(int id)48*b0d17251Schristos static int test_is_composite_enhanced(int id)
49*b0d17251Schristos {
50*b0d17251Schristos     int ret;
51*b0d17251Schristos     int status = 0;
52*b0d17251Schristos     BIGNUM *bn = NULL;
53*b0d17251Schristos 
54*b0d17251Schristos     ret = TEST_ptr(bn = BN_new())
55*b0d17251Schristos           /* negative tests for different composite numbers */
56*b0d17251Schristos           && TEST_true(BN_set_word(bn, composites[id]))
57*b0d17251Schristos           && TEST_true(ossl_bn_miller_rabin_is_prime(bn, 10, ctx, NULL, 1,
58*b0d17251Schristos                                                      &status))
59*b0d17251Schristos           && TEST_int_ne(status, BN_PRIMETEST_PROBABLY_PRIME);
60*b0d17251Schristos 
61*b0d17251Schristos     BN_free(bn);
62*b0d17251Schristos     return ret;
63*b0d17251Schristos }
64*b0d17251Schristos 
65*b0d17251Schristos /* Test that multiplying all the small primes from 3 to 751 equals a constant.
66*b0d17251Schristos  * This test is mainly used to test that both 32 and 64 bit are correct.
67*b0d17251Schristos  */
test_bn_small_factors(void)68*b0d17251Schristos static int test_bn_small_factors(void)
69*b0d17251Schristos {
70*b0d17251Schristos     int ret = 0, i;
71*b0d17251Schristos     BIGNUM *b = NULL;
72*b0d17251Schristos 
73*b0d17251Schristos     if (!(TEST_ptr(b = BN_new()) && TEST_true(BN_set_word(b, 3))))
74*b0d17251Schristos         goto err;
75*b0d17251Schristos 
76*b0d17251Schristos     for (i = 1; i < NUMPRIMES; i++) {
77*b0d17251Schristos         prime_t p = primes[i];
78*b0d17251Schristos         if (p > 3 && p <= 751 && !BN_mul_word(b, p))
79*b0d17251Schristos             goto err;
80*b0d17251Schristos         if (p > 751)
81*b0d17251Schristos             break;
82*b0d17251Schristos     }
83*b0d17251Schristos     ret = TEST_BN_eq(ossl_bn_get0_small_factors(), b);
84*b0d17251Schristos err:
85*b0d17251Schristos     BN_free(b);
86*b0d17251Schristos     return ret;
87*b0d17251Schristos }
88*b0d17251Schristos 
setup_tests(void)89*b0d17251Schristos int setup_tests(void)
90*b0d17251Schristos {
91*b0d17251Schristos     if (!TEST_ptr(ctx = BN_CTX_new()))
92*b0d17251Schristos         return 0;
93*b0d17251Schristos 
94*b0d17251Schristos     ADD_TEST(test_is_prime_enhanced);
95*b0d17251Schristos     ADD_ALL_TESTS(test_is_composite_enhanced, (int)OSSL_NELEM(composites));
96*b0d17251Schristos     ADD_TEST(test_bn_small_factors);
97*b0d17251Schristos 
98*b0d17251Schristos     return 1;
99*b0d17251Schristos }
100*b0d17251Schristos 
cleanup_tests(void)101*b0d17251Schristos void cleanup_tests(void)
102*b0d17251Schristos {
103*b0d17251Schristos     BN_CTX_free(ctx);
104*b0d17251Schristos }
105*b0d17251Schristos 
106