mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-08-03 20:54:41 +02:00
Merge pull request #4158 from dgarske/nxp_ltc_rsa2
Fixes for NXP LTC with RSA and Blinding
This commit is contained in:
@@ -405,6 +405,7 @@ int mp_invmod(mp_int *a, mp_int *b, mp_int *c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* d = a * b (mod 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 mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d)
|
||||||
{
|
{
|
||||||
int res = MP_OKAY;
|
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);
|
szB = mp_unsigned_bin_size(b);
|
||||||
szC = mp_unsigned_bin_size(c);
|
szC = mp_unsigned_bin_size(c);
|
||||||
|
|
||||||
if ((szA <= LTC_MAX_INT_BYTES) && (szB <= LTC_MAX_INT_BYTES) &&
|
/* LTC hardware seems to have issue with ModMul with 511 bytes or more,
|
||||||
(szC <= LTC_MAX_INT_BYTES))
|
so use software math */
|
||||||
|
if ((szA + szB < LTC_MAX_INT_BYTES-1) && (szC <= LTC_MAX_INT_BYTES))
|
||||||
{
|
{
|
||||||
uint8_t *ptrA, *ptrB, *ptrC, *ptrD;
|
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);
|
ptrC = (uint8_t*)XMALLOC(LTC_MAX_INT_BYTES, NULL, DYNAMIC_TYPE_BIGINT);
|
||||||
ptrD = (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) {
|
if (ptrA && ptrB && ptrC && ptrD) {
|
||||||
uint16_t sizeA, sizeB, sizeC, sizeD = 0;
|
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 */
|
/* Multiply A * B = D */
|
||||||
res = ltc_get_lsb_bin_from_mp_int(ptrA, a, &sizeA);
|
res = ltc_get_lsb_bin_from_mp_int(ptrA, a, &sizeA);
|
||||||
if (res == MP_OKAY)
|
if (res == MP_OKAY)
|
||||||
|
@@ -2434,7 +2434,7 @@ static int wc_RsaFunctionSync(const byte* in, word32 inLen, byte* out,
|
|||||||
/* unblind */
|
/* unblind */
|
||||||
if (ret == 0 && mp_mulmod(tmp, rndi, &key->n, tmp) != MP_OKAY)
|
if (ret == 0 && mp_mulmod(tmp, rndi, &key->n, tmp) != MP_OKAY)
|
||||||
ret = MP_MULMOD_E;
|
ret = MP_MULMOD_E;
|
||||||
#endif /* WC_RSA_BLINDING */
|
#endif /* WC_RSA_BLINDING */
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@@ -46,6 +46,7 @@ int ksdk_port_init(void);
|
|||||||
int wolfcrypt_mp_mod(mp_int *a, mp_int *b, mp_int *c);
|
int wolfcrypt_mp_mod(mp_int *a, mp_int *b, mp_int *c);
|
||||||
int wolfcrypt_mp_invmod(mp_int *a, mp_int *b, mp_int *c);
|
int wolfcrypt_mp_invmod(mp_int *a, mp_int *b, mp_int *c);
|
||||||
int wolfcrypt_mp_exptmod(mp_int *G, mp_int *X, mp_int *P, mp_int *Y);
|
int wolfcrypt_mp_exptmod(mp_int *G, mp_int *X, mp_int *P, mp_int *Y);
|
||||||
|
int wolfcrypt_mp_prime_is_prime_ex(mp_int* a, int t, int* result, WC_RNG* rng);
|
||||||
|
|
||||||
/* Exported mp_mulmod function */
|
/* Exported mp_mulmod function */
|
||||||
int mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
|
int mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
|
||||||
|
Reference in New Issue
Block a user