SP int: fix error checks when modulus even

This commit is contained in:
Sean Parkinson
2022-11-30 12:11:59 +10:00
parent 24cc8e7145
commit faf848a915
2 changed files with 23 additions and 12 deletions

View File

@@ -11651,21 +11651,22 @@ int sp_invmod(sp_int* a, sp_int* m, sp_int* r)
sp_mod(m, a, v); sp_mod(m, a, v);
/* v == 0 when a divides m evenly - no inverse. */ /* v == 0 when a divides m evenly - no inverse. */
if (sp_iszero(v)) { if (sp_iszero(v)) {
/* Force u to be the no inverse answer. */ err = MP_VAL;
sp_set(u, 0);
} }
evenMod = 1; evenMod = 1;
} }
/* Calculate inverse. */ if (err == MP_OKAY) {
#if !defined(WOLFSSL_SP_SMALL) && (!defined(NO_RSA) || !defined(NO_DH)) /* Calculate inverse. */
if (sp_count_bits(mm) >= 1024) { #if !defined(WOLFSSL_SP_SMALL) && (!defined(NO_RSA) || !defined(NO_DH))
err = _sp_invmod_div(ma, mm, u, v, b, c, c); if (sp_count_bits(mm) >= 1024) {
} err = _sp_invmod_div(ma, mm, u, v, b, c, c);
else }
#endif else
{ #endif
err = _sp_invmod(ma, mm, u, v, b, c); {
err = _sp_invmod(ma, mm, u, v, b, c);
}
} }
/* Fixup for even modulus. */ /* 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); sp_sub(m, c, r);
} }
} }
else { else if (err == MP_OKAY) {
err = sp_copy(c, r); err = sp_copy(c, r);
} }
} }

View File

@@ -43206,6 +43206,16 @@ static int mp_test_invmod(mp_int* a, mp_int* m, mp_int* r)
ret = mp_invmod(a, m, r); ret = mp_invmod(a, m, r);
if (ret != MP_VAL) if (ret != MP_VAL)
return -13172; 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(a, 1);
mp_set(m, 4); mp_set(m, 4);
ret = mp_invmod(a, m, r); ret = mp_invmod(a, m, r);