1 #include "tommath_private.h"
2 #ifdef MP_REDUCE_2K_L_C
3 /* LibTomMath, multiple-precision integer library -- Tom St Denis */
4 /* SPDX-License-Identifier: Unlicense */
6 /* reduces a modulo n where n is of the form 2**p - d
7 This differs from reduce_2k since "d" can be larger
10 mp_err
mp_reduce_2k_l(mp_int
*a
, const mp_int
*n
, const mp_int
*d
)
16 if ((err
= mp_init(&q
)) != MP_OKAY
) {
23 /* q = a/2**p, a = a mod 2**p */
24 if ((err
= mp_div_2d(a
, p
, &q
, a
)) != MP_OKAY
) {
29 if ((err
= mp_mul(&q
, d
, &q
)) != MP_OKAY
) {
34 if ((err
= s_mp_add(a
, &q
, a
)) != MP_OKAY
) {
38 if (mp_cmp_mag(a
, n
) == MP_LT
) {
41 if ((err
= s_mp_sub(a
, n
, a
)) != MP_OKAY
) {