forked from wolfSSL/wolfssl
SP int: handle even modulus with exponentiation
Fix testing of mp_int to only call when implementation included.
This commit is contained in:
@@ -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_HAVE_SP_DH)
|
||||||
#if defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY) && \
|
#if defined(WOLFSSL_RSA_VERIFY_ONLY) || defined(WOLFSSL_RSA_PUBLIC_ONLY)
|
||||||
!defined(WOLFSSL_RSA_PUBLIC_ONLY)
|
if ((!done) && (err == MP_OKAY))
|
||||||
if ((!done) && (err == MP_OKAY) && (b->used == 1) && (b->dp[0] == 2)) {
|
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. */
|
/* Use the generic base 2 implementation. */
|
||||||
err = _sp_exptmod_base_2(e, digits, m, r);
|
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
|
#ifndef WC_NO_HARDEN
|
||||||
err = _sp_exptmod_mont_ex(b, e, digits * SP_WORD_SIZE, m, r);
|
err = _sp_exptmod_mont_ex(b, e, digits * SP_WORD_SIZE, m, r);
|
||||||
#else
|
#else
|
||||||
@@ -8756,21 +8761,17 @@ int sp_exptmod_ex(sp_int* b, sp_int* e, int digits, sp_int* m, sp_int* r)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#elif defined(WOLFSSL_RSA_VERIFY_ONLY) || defined(WOLFSSL_RSA_PUBLIC_ONLY)
|
#endif /* WOLFSSL_SP_MATH_ALL */
|
||||||
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)
|
|
||||||
if ((!done) && (err == MP_OKAY)) {
|
if ((!done) && (err == MP_OKAY)) {
|
||||||
/* Otherwise use the generic implementation. */
|
/* Otherwise use the generic implementation. */
|
||||||
err = _sp_exptmod_ex(b, e, digits * SP_WORD_SIZE, m, r);
|
err = _sp_exptmod_ex(b, e, digits * SP_WORD_SIZE, m, r);
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* WOLFSSL_RSA_VERIFY_ONLY || WOLFSSL_RSA_PUBLIC_ONLY */
|
||||||
#else
|
#else
|
||||||
if ((!done) && (err == MP_OKAY)) {
|
if ((!done) && (err == MP_OKAY)) {
|
||||||
err = MP_VAL;
|
err = MP_VAL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* WOLFSSL_SP_MATH_ALL || WOLFSSL_HAVE_SP_DH */
|
||||||
|
|
||||||
(void)mBits;
|
(void)mBits;
|
||||||
(void)bBits;
|
(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) {
|
else if (m->used * 2 >= r->size) {
|
||||||
err = MP_VAL;
|
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 {
|
else {
|
||||||
err = _sp_exptmod_nct(b, e, m, r);
|
err = _sp_exptmod_nct(b, e, m, r);
|
||||||
}
|
}
|
||||||
|
@@ -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 */
|
#endif /* WOLFSSL_SP_MATH || !USE_FAST_MATH */
|
||||||
|
|
||||||
#if defined(WOLFSSL_SP_MATH_ALL) || (!defined WOLFSSL_SP_MATH && \
|
#if (defined(WOLFSSL_SP_MATH_ALL) && !defined(NO_RSA) && \
|
||||||
(defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY)))
|
!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)
|
static int mp_test_radix_10(mp_int* a, mp_int* r, WC_RNG* rng)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
@@ -34061,10 +34063,12 @@ static int mp_test_radix_10(mp_int* a, mp_int* r, WC_RNG* rng)
|
|||||||
return -12640;
|
return -12640;
|
||||||
if (mp_radix_size(a, MP_RADIX_DEC, &size) != MP_OKAY)
|
if (mp_radix_size(a, MP_RADIX_DEC, &size) != MP_OKAY)
|
||||||
return -12641;
|
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)
|
if ((int)XSTRLEN(str) != size - 1)
|
||||||
return -12642;
|
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)
|
if (mp_cmp(a, r) != MP_EQ)
|
||||||
return -12643;
|
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)
|
if (ret != MP_VAL)
|
||||||
return -12759;
|
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);
|
ret = mp_to_unsigned_bin_at_pos(0, NULL, NULL);
|
||||||
if (ret != MP_VAL)
|
if (ret != MP_VAL)
|
||||||
return -12760;
|
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. */
|
/* Test negative value being moded. */
|
||||||
for (j = 0; j < 20; j++) {
|
for (j = 0; j < 20; j++) {
|
||||||
ret = randNum(a, 2, rng, NULL);
|
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;
|
mp_digit mp;
|
||||||
static int exp[] = { 7, 8, 16, 27, 32, 64,
|
static int exp[] = { 7, 8, 16, 27, 32, 64,
|
||||||
127, 128, 255, 256,
|
127, 128, 255, 256,
|
||||||
|
#if defined(SP_WORD_SIZE) && SP_WORD_SIZE > 8
|
||||||
383, 384, 2033, 2048
|
383, 384, 2033, 2048
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
static mp_digit sub[] = { 0x01, 0x05, 0x0f, 0x27, 0x05, 0x3b,
|
static mp_digit sub[] = { 0x01, 0x05, 0x0f, 0x27, 0x05, 0x3b,
|
||||||
0x01, 0x9f, 0x13, 0xbd,
|
0x01, 0x9f, 0x13, 0xbd,
|
||||||
|
#if defined(SP_WORD_SIZE) && SP_WORD_SIZE > 8
|
||||||
0x1f, 0x13d, 0x45, 0x615
|
0x1f, 0x13d, 0x45, 0x615
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
int bits[] = { 256, 384, 2048, 3072 };
|
int bits[] = { 256, 384, 2048, 3072 };
|
||||||
int i;
|
int i;
|
||||||
@@ -36546,8 +36555,10 @@ WOLFSSL_TEST_SUBROUTINE int mp_test(void)
|
|||||||
if ((ret = mp_test_div_3(&a, &r1, &rng)) != 0)
|
if ((ret = mp_test_div_3(&a, &r1, &rng)) != 0)
|
||||||
return ret;
|
return ret;
|
||||||
#endif
|
#endif
|
||||||
#if defined(WOLFSSL_SP_MATH_ALL) || (!defined WOLFSSL_SP_MATH && \
|
#if (defined(WOLFSSL_SP_MATH_ALL) && !defined(NO_RSA) && \
|
||||||
(defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY)))
|
!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)
|
if ((ret = mp_test_radix_10(&a, &r1, &rng)) != 0)
|
||||||
return ret;
|
return ret;
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user