diff --git a/wolfcrypt/src/integer.c b/wolfcrypt/src/integer.c index 3c86e665a..bd8aadb21 100644 --- a/wolfcrypt/src/integer.c +++ b/wolfcrypt/src/integer.c @@ -966,8 +966,8 @@ int wolfcrypt_mp_invmod(mp_int * a, mp_int * b, mp_int * c) int mp_invmod (mp_int * a, mp_int * b, mp_int * c) #endif { - /* b cannot be negative */ - if (b->sign == MP_NEG || mp_iszero(b) == MP_YES) { + /* b cannot be negative or zero, and can not divide by 0 (1/a mod b) */ + if (b->sign == MP_NEG || mp_iszero(b) == MP_YES || mp_iszero(a) == MP_YES) { return MP_VAL; } diff --git a/wolfcrypt/src/tfm.c b/wolfcrypt/src/tfm.c index 1f875d0cd..39323819c 100644 --- a/wolfcrypt/src/tfm.c +++ b/wolfcrypt/src/tfm.c @@ -1023,6 +1023,11 @@ int fp_invmod(fp_int *a, fp_int *b, fp_int *c) #endif int neg; + /* [modified] sanity check on "a" */ + if (fp_iszero(a) == FP_YES) { + return FP_VAL; /* can not divide by 0 here */ + } + /* 2. [modified] b must be odd */ if (fp_iseven (b) == FP_YES) { return fp_invmod_slow(a,b,c);