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