54 lines
1.6 KiB
C
54 lines
1.6 KiB
C
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis
|
||
|
*
|
||
|
* LibTomMath is library that provides for multiple-precision
|
||
|
* integer arithmetic as well as number theoretic functionality.
|
||
|
*
|
||
|
* The library is 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://libtommath.iahu.ca
|
||
|
*/
|
||
|
#include <tommath.h>
|
||
|
|
||
|
/* calculates a = B^n mod b for Montgomery reduction
|
||
|
* Where B is the base [e.g. 2^DIGIT_BIT].
|
||
|
* B^n mod b is computed by first computing
|
||
|
* A = B^(n-1) which doesn't require a reduction but a simple OR.
|
||
|
* then C = A * B = B^n is computed by performing upto DIGIT_BIT
|
||
|
* shifts with subtractions when the result is greater than b.
|
||
|
*
|
||
|
* The method is slightly modified to shift B unconditionally upto just under
|
||
|
* the leading bit of b. This saves alot of multiple precision shifting.
|
||
|
*/
|
||
|
int
|
||
|
mp_montgomery_calc_normalization (mp_int * a, mp_int * b)
|
||
|
{
|
||
|
int x, bits, res;
|
||
|
|
||
|
/* how many bits of last digit does b use */
|
||
|
bits = mp_count_bits (b) % DIGIT_BIT;
|
||
|
|
||
|
/* compute A = B^(n-1) * 2^(bits-1) */
|
||
|
if ((res = mp_2expt (a, (b->used - 1) * DIGIT_BIT + bits - 1)) != MP_OKAY) {
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
/* now compute C = A * B mod b */
|
||
|
for (x = bits - 1; x < DIGIT_BIT; x++) {
|
||
|
if ((res = mp_mul_2 (a, a)) != MP_OKAY) {
|
||
|
return res;
|
||
|
}
|
||
|
if (mp_cmp_mag (a, b) != MP_LT) {
|
||
|
if ((res = s_mp_sub (a, b, a)) != MP_OKAY) {
|
||
|
return res;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return MP_OKAY;
|
||
|
}
|