bn_mp_montgomery_calc_normalization.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #include <tommath.h>
  2. #ifdef BN_MP_MONTGOMERY_CALC_NORMALIZATION_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. * shifts with subtractions when the result is greater than b.
  19. *
  20. * The method is slightly modified to shift B unconditionally upto just under
  21. * the leading bit of b. This saves alot of multiple precision shifting.
  22. */
  23. int mp_montgomery_calc_normalization (mp_int * a, mp_int * b)
  24. {
  25. int x, bits, res;
  26. /* how many bits of last digit does b use */
  27. bits = mp_count_bits (b) % DIGIT_BIT;
  28. if (b->used > 1) {
  29. if ((res = mp_2expt (a, (b->used - 1) * DIGIT_BIT + bits - 1)) != MP_OKAY) {
  30. return res;
  31. }
  32. } else {
  33. mp_set(a, 1);
  34. bits = 1;
  35. }
  36. /* now compute C = A * B mod b */
  37. for (x = bits - 1; x < (int)DIGIT_BIT; x++) {
  38. if ((res = mp_mul_2 (a, a)) != MP_OKAY) {
  39. return res;
  40. }
  41. if (mp_cmp_mag (a, b) != MP_LT) {
  42. if ((res = s_mp_sub (a, b, a)) != MP_OKAY) {
  43. return res;
  44. }
  45. }
  46. }
  47. return MP_OKAY;
  48. }
  49. #endif
  50. /* $Source: /cvs/libtom/libtommath/bn_mp_montgomery_calc_normalization.c,v $ */
  51. /* $Revision: 1.3 $ */
  52. /* $Date: 2006/03/31 14:18:44 $ */