1#include <tommath.h> 2#ifdef BN_MP_MOD_2D_C 3/* LibTomMath, multiple-precision integer library -- Tom St Denis 4 * 5 * LibTomMath is a library that provides multiple-precision 6 * integer arithmetic as well as number theoretic functionality. 7 * 8 * The library was designed directly after the MPI library by 9 * Michael Fromberger but has been written from scratch with 10 * additional optimizations in place. 11 * 12 * The library is free for all purposes without any express 13 * guarantee it works. 14 * 15 * Tom St Denis, tomstdenis@gmail.com, http://math.libtomcrypt.com 16 */ 17 18/* calc a value mod 2**b */ 19int 20mp_mod_2d (mp_int * a, int b, mp_int * c) 21{ 22 int x, res; 23 24 /* if b is <= 0 then zero the int */ 25 if (b <= 0) { 26 mp_zero (c); 27 return MP_OKAY; 28 } 29 30 /* if the modulus is larger than the value than return */ 31 if (b >= (int) (a->used * DIGIT_BIT)) { 32 res = mp_copy (a, c); 33 return res; 34 } 35 36 /* copy */ 37 if ((res = mp_copy (a, c)) != MP_OKAY) { 38 return res; 39 } 40 41 /* zero digits above the last digit of the modulus */ 42 for (x = (b / DIGIT_BIT) + ((b % DIGIT_BIT) == 0 ? 0 : 1); x < c->used; x++) { 43 c->dp[x] = 0; 44 } 45 /* clear the digit that is not completely outside/inside the modulus */ 46 c->dp[b / DIGIT_BIT] &= 47 (mp_digit) ((((mp_digit) 1) << (((mp_digit) b) % DIGIT_BIT)) - ((mp_digit) 1)); 48 mp_clamp (c); 49 return MP_OKAY; 50} 51#endif 52 53/* $Source: /cvs/libtom/libtommath/bn_mp_mod_2d.c,v $ */ 54/* $Revision: 1.3 $ */ 55/* $Date: 2006/03/31 14:18:44 $ */ 56