1 #include "tommath_private.h" 2 #ifdef BN_MP_MOD_2D_C 3 /* LibTomMath, multiple-precision integer library -- Tom St Denis */ 4 /* SPDX-License-Identifier: Unlicense */ 5 6 /* calc a value mod 2**b */ mp_mod_2d(const mp_int * a,int b,mp_int * c)7mp_err mp_mod_2d(const mp_int *a, int b, mp_int *c) 8 { 9 int x; 10 mp_err err; 11 12 /* if b is <= 0 then zero the int */ 13 if (b <= 0) { 14 mp_zero(c); 15 return MP_OKAY; 16 } 17 18 /* if the modulus is larger than the value than return */ 19 if (b >= (a->used * MP_DIGIT_BIT)) { 20 return mp_copy(a, c); 21 } 22 23 /* copy */ 24 if ((err = mp_copy(a, c)) != MP_OKAY) { 25 return err; 26 } 27 28 /* zero digits above the last digit of the modulus */ 29 x = (b / MP_DIGIT_BIT) + (((b % MP_DIGIT_BIT) == 0) ? 0 : 1); 30 MP_ZERO_DIGITS(c->dp + x, c->used - x); 31 32 /* clear the digit that is not completely outside/inside the modulus */ 33 c->dp[b / MP_DIGIT_BIT] &= 34 ((mp_digit)1 << (mp_digit)(b % MP_DIGIT_BIT)) - (mp_digit)1; 35 mp_clamp(c); 36 return MP_OKAY; 37 } 38 #endif 39