diff options
author | Kevin B Kenny <kennykb@acm.org> | 2005-01-19 22:41:26 (GMT) |
---|---|---|
committer | Kevin B Kenny <kennykb@acm.org> | 2005-01-19 22:41:26 (GMT) |
commit | 8df47fab3cdd02f03283e22c2b2226f0fe7a2ab4 (patch) | |
tree | 1f0868ef44c9f17d83d10dc94343df7b8cfe1842 /libtommath/bn_mp_mod_2d.c | |
parent | c6a259aeeca4814a97cf6694814c63e74e4e18fa (diff) | |
download | tcl-8df47fab3cdd02f03283e22c2b2226f0fe7a2ab4.zip tcl-8df47fab3cdd02f03283e22c2b2226f0fe7a2ab4.tar.gz tcl-8df47fab3cdd02f03283e22c2b2226f0fe7a2ab4.tar.bz2 |
Import of libtommath 0.33
Diffstat (limited to 'libtommath/bn_mp_mod_2d.c')
-rw-r--r-- | libtommath/bn_mp_mod_2d.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/libtommath/bn_mp_mod_2d.c b/libtommath/bn_mp_mod_2d.c new file mode 100644 index 0000000..589e4ba --- /dev/null +++ b/libtommath/bn_mp_mod_2d.c @@ -0,0 +1,51 @@ +#include <tommath.h> +#ifdef BN_MP_MOD_2D_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org + */ + +/* calc a value mod 2**b */ +int +mp_mod_2d (mp_int * a, int b, mp_int * c) +{ + int x, res; + + /* if b is <= 0 then zero the int */ + if (b <= 0) { + mp_zero (c); + return MP_OKAY; + } + + /* if the modulus is larger than the value than return */ + if (b >= (int) (a->used * DIGIT_BIT)) { + res = mp_copy (a, c); + return res; + } + + /* copy */ + if ((res = mp_copy (a, c)) != MP_OKAY) { + return res; + } + + /* zero digits above the last digit of the modulus */ + for (x = (b / DIGIT_BIT) + ((b % DIGIT_BIT) == 0 ? 0 : 1); x < c->used; x++) { + c->dp[x] = 0; + } + /* clear the digit that is not completely outside/inside the modulus */ + c->dp[b / DIGIT_BIT] &= + (mp_digit) ((((mp_digit) 1) << (((mp_digit) b) % DIGIT_BIT)) - ((mp_digit) 1)); + mp_clamp (c); + return MP_OKAY; +} +#endif |