diff --git a/wolfcrypt/src/integer.c b/wolfcrypt/src/integer.c index fe40dce89..3c86e665a 100644 --- a/wolfcrypt/src/integer.c +++ b/wolfcrypt/src/integer.c @@ -4717,10 +4717,15 @@ int mp_prime_is_prime (mp_int * a, int t, int *result) return MP_VAL; } + if (mp_isone(a)) { + *result = MP_NO; + return MP_OKAY; + } + /* is the input equal to one of the primes in the table? */ for (ix = 0; ix < PRIME_SIZE; ix++) { if (mp_cmp_d(a, ltm_prime_tab[ix]) == MP_EQ) { - *result = 1; + *result = MP_YES; return MP_OKAY; } } @@ -4780,6 +4785,11 @@ int mp_prime_is_prime_ex (mp_int * a, int t, int *result, WC_RNG *rng) return MP_VAL; } + if (mp_isone(a)) { + *result = MP_NO; + return MP_OKAY; + } + /* is the input equal to one of the primes in the table? */ for (ix = 0; ix < PRIME_SIZE; ix++) { if (mp_cmp_d(a, ltm_prime_tab[ix]) == MP_EQ) { diff --git a/wolfcrypt/src/sp_int.c b/wolfcrypt/src/sp_int.c index 9e9b99530..422614e3d 100644 --- a/wolfcrypt/src/sp_int.c +++ b/wolfcrypt/src/sp_int.c @@ -1703,6 +1703,11 @@ int sp_prime_is_prime(sp_int *a, int t, int* result) err = MP_VAL; } + if (sp_isone(a)) { + *result = MP_NO; + return MP_OKAY; + } + if (err == MP_OKAY && a->used == 1) { /* check against primes table */ for (i = 0; i < SP_PRIME_SIZE; i++) { @@ -1783,6 +1788,11 @@ int sp_prime_is_prime_ex(sp_int* a, int t, int* result, WC_RNG* rng) if (a == NULL || result == NULL || rng == NULL) err = MP_VAL; + if (sp_isone(a)) { + *result = MP_NO; + return MP_OKAY; + } + if (err == MP_OKAY && a->used == 1) { /* check against primes table */ for (i = 0; i < SP_PRIME_SIZE; i++) { diff --git a/wolfcrypt/src/tfm.c b/wolfcrypt/src/tfm.c index e2643b0f4..1f875d0cd 100644 --- a/wolfcrypt/src/tfm.c +++ b/wolfcrypt/src/tfm.c @@ -4096,6 +4096,11 @@ int fp_isprime_ex(fp_int *a, int t, int* result) return FP_VAL; } + if (fp_isone(a)) { + *result = FP_NO; + return FP_OKAY; + } + /* check against primes table */ for (r = 0; r < FP_PRIME_SIZE; r++) { if (fp_cmp_d(a, primes[r]) == FP_EQ) { @@ -4146,6 +4151,11 @@ int mp_prime_is_prime_ex(mp_int* a, int t, int* result, WC_RNG* rng) if (a == NULL || result == NULL || rng == NULL) return FP_VAL; + if (fp_isone(a)) { + *result = FP_NO; + return FP_OKAY; + } + if (ret == FP_YES) { fp_digit d; int r; diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 54b9fe35c..0ebce4278 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -1080,7 +1080,7 @@ initDefaultName(); test_pass("mp test passed!\n"); #endif -#if defined(WOLFSSL_PUBLIC_MP) && !defined(WOLFSSL_SP_MATH) +#if defined(WOLFSSL_PUBLIC_MP) if ( (ret = prime_test()) != 0) return err_sys("prime test failed!\n", ret); else @@ -24568,7 +24568,7 @@ done: #endif -#if defined(WOLFSSL_PUBLIC_MP) && !defined(WOLFSSL_SP_MATH) +#if defined(WOLFSSL_PUBLIC_MP) typedef struct pairs_t { const unsigned char* coeff; @@ -24623,16 +24623,24 @@ static const unsigned char controlPrime[] = { 0xe6, 0xd1, 0x1b, 0x5d, 0x5e, 0x96, 0xfa, 0x53 }; +static const unsigned char testOne[] = { 1 }; + static int GenerateNextP(mp_int* p1, mp_int* p2, int k) { int ret; + mp_int ki; - ret = mp_sub_d(p1, 1, p2); + ret = mp_init(&ki); if (ret == 0) - ret = mp_mul_d(p2, k, p2); + ret = mp_set(&ki, k); + if (ret == 0) + ret = mp_sub_d(p1, 1, p2); + if (ret == 0) + ret = mp_mul(p2, &ki, p2); if (ret == 0) ret = mp_add_d(p2, 1, p2); + mp_clear(&ki); return ret; } @@ -24738,6 +24746,23 @@ int prime_test(void) if (!isPrime) return -9661; + ret = mp_read_unsigned_bin(&n, testOne, sizeof(testOne)); + if (ret != 0) + return -9662; + + /* This test result should indicate the value as not prime. */ + ret = mp_prime_is_prime_ex(&n, 8, &isPrime, &rng); + if (ret != 0) + return -9663; + if (isPrime) + return -9664; + + ret = mp_prime_is_prime(&n, 8, &isPrime); + if (ret != 0) + return -9665; + if (isPrime) + return -9666; + mp_clear(&p3); mp_clear(&p2); mp_clear(&p1);