Fix for int neg being defined mid code. Fix limit check for mp_mulmod using hardware vs software. Resolves issue when using WC_RSA_BLINDING.

This commit is contained in:
David Garske
2021-06-23 14:45:43 -07:00
parent 2d1b113f51
commit 73c90369c6

View File

@ -405,6 +405,7 @@ int mp_invmod(mp_int *a, mp_int *b, mp_int *c)
}
/* d = a * b (mod c) */
/* with blinding enabled ptr a can equal ptr d */
int mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d)
{
int res = MP_OKAY;
@ -422,8 +423,9 @@ int mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d)
szB = mp_unsigned_bin_size(b);
szC = mp_unsigned_bin_size(c);
if ((szA <= LTC_MAX_INT_BYTES) && (szB <= LTC_MAX_INT_BYTES) &&
(szC <= LTC_MAX_INT_BYTES))
/* LTC hardware seems to have issue with ModMul with 511 bytes or more,
so use software math */
if ((szA + szB < LTC_MAX_INT_BYTES-1) && (szC <= LTC_MAX_INT_BYTES))
{
uint8_t *ptrA, *ptrB, *ptrC, *ptrD;
@ -432,15 +434,15 @@ int mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d)
ptrC = (uint8_t*)XMALLOC(LTC_MAX_INT_BYTES, NULL, DYNAMIC_TYPE_BIGINT);
ptrD = (uint8_t*)XMALLOC(LTC_MAX_INT_BYTES, NULL, DYNAMIC_TYPE_BIGINT);
/* unsigned multiply */
#if (!defined(WOLFSSL_SP_MATH) && !defined(WOLFSSL_SP_MATH_ALL)) || \
defined(WOLFSSL_SP_INT_NEGATIVE)
int neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG;
#endif
if (ptrA && ptrB && ptrC && ptrD) {
uint16_t sizeA, sizeB, sizeC, sizeD = 0;
/* unsigned multiply */
#if (!defined(WOLFSSL_SP_MATH) && !defined(WOLFSSL_SP_MATH_ALL)) || \
defined(WOLFSSL_SP_INT_NEGATIVE)
int neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG;
#endif
/* Multiply A * B = D */
res = ltc_get_lsb_bin_from_mp_int(ptrA, a, &sizeA);
if (res == MP_OKAY)