diff --git a/wolfcrypt/src/sp_int.c b/wolfcrypt/src/sp_int.c index 0b82ab546..d74180319 100644 --- a/wolfcrypt/src/sp_int.c +++ b/wolfcrypt/src/sp_int.c @@ -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); } } diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 7ce68117d..649d1f1af 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -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);