SP int: handle even modulus with exponentiation

Fix testing of mp_int to only call when implementation included.
This commit is contained in:
Sean Parkinson
2021-10-19 17:18:10 +10:00
parent 7f5a3a4e74
commit d880403207
2 changed files with 36 additions and 19 deletions

View File

@@ -8742,13 +8742,18 @@ int sp_exptmod_ex(sp_int* b, sp_int* e, int digits, sp_int* m, sp_int* r)
}
}
#if defined(WOLFSSL_SP_MATH_ALL) || defined(WOLFSSL_HAVE_SP_DH)
#if defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY) && \
!defined(WOLFSSL_RSA_PUBLIC_ONLY)
if ((!done) && (err == MP_OKAY) && (b->used == 1) && (b->dp[0] == 2)) {
#if defined(WOLFSSL_RSA_VERIFY_ONLY) || defined(WOLFSSL_RSA_PUBLIC_ONLY)
if ((!done) && (err == MP_OKAY))
err = sp_exptmod_nct(b, e, m, r);
}
#else
#if defined(WOLFSSL_SP_MATH_ALL)
if ((!done) && (err == MP_OKAY) && (b->used == 1) && (b->dp[0] == 2) &&
mp_isodd(m)) {
/* Use the generic base 2 implementation. */
err = _sp_exptmod_base_2(e, digits, m, r);
}
else if ((!done) && (err == MP_OKAY) && (m->used > 1)) {
else if ((!done) && (err == MP_OKAY) && ((m->used > 1) && mp_isodd(m))) {
#ifndef WC_NO_HARDEN
err = _sp_exptmod_mont_ex(b, e, digits * SP_WORD_SIZE, m, r);
#else
@@ -8756,21 +8761,17 @@ int sp_exptmod_ex(sp_int* b, sp_int* e, int digits, sp_int* m, sp_int* r)
#endif
}
else
#elif defined(WOLFSSL_RSA_VERIFY_ONLY) || defined(WOLFSSL_RSA_PUBLIC_ONLY)
err = sp_exptmod_nct(b, e, m, r);
#endif
#if (defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY) && \
!defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
#endif /* WOLFSSL_SP_MATH_ALL */
if ((!done) && (err == MP_OKAY)) {
/* Otherwise use the generic implementation. */
err = _sp_exptmod_ex(b, e, digits * SP_WORD_SIZE, m, r);
}
#endif
#endif /* WOLFSSL_RSA_VERIFY_ONLY || WOLFSSL_RSA_PUBLIC_ONLY */
#else
if ((!done) && (err == MP_OKAY)) {
err = MP_VAL;
}
#endif
#endif /* WOLFSSL_SP_MATH_ALL || WOLFSSL_HAVE_SP_DH */
(void)mBits;
(void)bBits;
@@ -9202,6 +9203,11 @@ int sp_exptmod_nct(sp_int* b, sp_int* e, sp_int* m, sp_int* r)
else if (m->used * 2 >= r->size) {
err = MP_VAL;
}
#if !defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)
else if (mp_iseven(m)) {
err = _sp_exptmod_ex(b, e, e->used, m, r);
}
#endif
else {
err = _sp_exptmod_nct(b, e, m, r);
}

View File

@@ -34041,8 +34041,10 @@ static int mp_test_div_3(mp_int* a, mp_int* r, WC_RNG* rng)
}
#endif /* WOLFSSL_SP_MATH || !USE_FAST_MATH */
#if defined(WOLFSSL_SP_MATH_ALL) || (!defined WOLFSSL_SP_MATH && \
(defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY)))
#if (defined(WOLFSSL_SP_MATH_ALL) && !defined(NO_RSA) && \
!defined(WOLFSSL_RSA_VERIFY_ONLY)) || \
(!defined WOLFSSL_SP_MATH && !defined(WOLFSSL_SP_MATH_ALL) && \
(defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY)))
static int mp_test_radix_10(mp_int* a, mp_int* r, WC_RNG* rng)
{
int ret;
@@ -34061,10 +34063,12 @@ static int mp_test_radix_10(mp_int* a, mp_int* r, WC_RNG* rng)
return -12640;
if (mp_radix_size(a, MP_RADIX_DEC, &size) != MP_OKAY)
return -12641;
mp_toradix(a, str, MP_RADIX_DEC);
if (mp_toradix(a, str, MP_RADIX_DEC) != MP_OKAY)
return -12660;
if ((int)XSTRLEN(str) != size - 1)
return -12642;
mp_read_radix(r, str, MP_RADIX_DEC);
if (mp_read_radix(r, str, MP_RADIX_DEC) != MP_OKAY)
return -12661;
if (mp_cmp(a, r) != MP_EQ)
return -12643;
}
@@ -34493,7 +34497,8 @@ static int mp_test_param(mp_int* a, mp_int* b, mp_int* r, WC_RNG* rng)
if (ret != MP_VAL)
return -12759;
#ifdef WOLFSSL_SP_MATH_ALL
#if defined(WOLFSSL_SP_MATH_ALL) && !defined(NO_RSA) && \
!defined(WOLFSSL_RSA_VERIFY_ONLY)
ret = mp_to_unsigned_bin_at_pos(0, NULL, NULL);
if (ret != MP_VAL)
return -12760;
@@ -35926,7 +35931,7 @@ static int mp_test_mod_2d(mp_int* a, mp_int* r, mp_int* t, WC_RNG* rng)
}
}
#if !defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_INT_NEGATIVE)
#if !defined(WOLFSSL_SP_MATH) && defined(WOLFSSL_SP_INT_NEGATIVE)
/* Test negative value being moded. */
for (j = 0; j < 20; j++) {
ret = randNum(a, 2, rng, NULL);
@@ -36285,11 +36290,15 @@ static int mp_test_mont(mp_int* a, mp_int* m, mp_int* n, mp_int* r, WC_RNG* rng)
mp_digit mp;
static int exp[] = { 7, 8, 16, 27, 32, 64,
127, 128, 255, 256,
#if defined(SP_WORD_SIZE) && SP_WORD_SIZE > 8
383, 384, 2033, 2048
#endif
};
static mp_digit sub[] = { 0x01, 0x05, 0x0f, 0x27, 0x05, 0x3b,
0x01, 0x9f, 0x13, 0xbd,
#if defined(SP_WORD_SIZE) && SP_WORD_SIZE > 8
0x1f, 0x13d, 0x45, 0x615
#endif
};
int bits[] = { 256, 384, 2048, 3072 };
int i;
@@ -36546,8 +36555,10 @@ WOLFSSL_TEST_SUBROUTINE int mp_test(void)
if ((ret = mp_test_div_3(&a, &r1, &rng)) != 0)
return ret;
#endif
#if defined(WOLFSSL_SP_MATH_ALL) || (!defined WOLFSSL_SP_MATH && \
(defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY)))
#if (defined(WOLFSSL_SP_MATH_ALL) && !defined(NO_RSA) && \
!defined(WOLFSSL_RSA_VERIFY_ONLY)) || \
(!defined WOLFSSL_SP_MATH && !defined(WOLFSSL_SP_MATH_ALL) && \
(defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY)))
if ((ret = mp_test_radix_10(&a, &r1, &rng)) != 0)
return ret;
#endif