1 #include "tommath_private.h"
3 /* LibTomMath, multiple-precision integer library -- Tom St Denis */
4 /* SPDX-License-Identifier: Unlicense */
7 mp_err
mp_invmod(const mp_int
*a
, const mp_int
*b
, mp_int
*c
)
9 /* for all n in N and n > 0, n = 0 mod 1 */
10 if (!mp_isneg(a
) && mp_cmp_d(b
, 1uL) == MP_EQ
) {
15 /* b cannot be negative and has to be >1 */
16 if (mp_isneg(b
) || (mp_cmp_d(b
, 1uL) != MP_GT
)) {
20 /* if the modulus is odd we can use a faster routine instead */
21 if (MP_HAS(S_MP_INVMOD_ODD
) && mp_isodd(b
)) {
22 return s_mp_invmod_odd(a
, b
, c
);
25 return MP_HAS(S_MP_INVMOD
)
26 ? s_mp_invmod(a
, b
, c
)