forked from wolfSSL/wolfssl
SP int: fix error checks when modulus even
This commit is contained in:
@ -11651,21 +11651,22 @@ int sp_invmod(sp_int* a, sp_int* m, sp_int* r)
|
||||
sp_mod(m, a, v);
|
||||
/* v == 0 when a divides m evenly - no inverse. */
|
||||
if (sp_iszero(v)) {
|
||||
/* Force u to be the no inverse answer. */
|
||||
sp_set(u, 0);
|
||||
err = MP_VAL;
|
||||
}
|
||||
evenMod = 1;
|
||||
}
|
||||
|
||||
/* Calculate inverse. */
|
||||
#if !defined(WOLFSSL_SP_SMALL) && (!defined(NO_RSA) || !defined(NO_DH))
|
||||
if (sp_count_bits(mm) >= 1024) {
|
||||
err = _sp_invmod_div(ma, mm, u, v, b, c, c);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
err = _sp_invmod(ma, mm, u, v, b, c);
|
||||
if (err == MP_OKAY) {
|
||||
/* Calculate inverse. */
|
||||
#if !defined(WOLFSSL_SP_SMALL) && (!defined(NO_RSA) || !defined(NO_DH))
|
||||
if (sp_count_bits(mm) >= 1024) {
|
||||
err = _sp_invmod_div(ma, mm, u, v, b, c, c);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
err = _sp_invmod(ma, mm, u, v, b, c);
|
||||
}
|
||||
}
|
||||
|
||||
/* Fixup for even modulus. */
|
||||
@ -11683,7 +11684,7 @@ int sp_invmod(sp_int* a, sp_int* m, sp_int* r)
|
||||
sp_sub(m, c, r);
|
||||
}
|
||||
}
|
||||
else {
|
||||
else if (err == MP_OKAY) {
|
||||
err = sp_copy(c, r);
|
||||
}
|
||||
}
|
||||
|
@ -43206,6 +43206,16 @@ static int mp_test_invmod(mp_int* a, mp_int* m, mp_int* r)
|
||||
ret = mp_invmod(a, m, r);
|
||||
if (ret != MP_VAL)
|
||||
return -13172;
|
||||
mp_set(a, 3);
|
||||
mp_set(m, 6);
|
||||
ret = mp_invmod(a, m, r);
|
||||
if (ret != MP_VAL)
|
||||
return -13181;
|
||||
mp_set(a, 5*9);
|
||||
mp_set(m, 6*9);
|
||||
ret = mp_invmod(a, m, r);
|
||||
if (ret != MP_VAL)
|
||||
return -13182;
|
||||
mp_set(a, 1);
|
||||
mp_set(m, 4);
|
||||
ret = mp_invmod(a, m, r);
|
||||
|
Reference in New Issue
Block a user