/* The method is slightly modified to shift B unconditionally up to just under the leading bit of b. This saves a lot of multiple precision shifting.  */
int mp_montgomery_calc_normalization(mp_int *a, mp_int *b)
/* The method is slightly modified to shift B unconditionally up to just under the leading bit of b. This saves a lot of multiple precision shifting.  */
int mp_montgomery_calc_normalization(mp_int *a, mp_int *b)
{
  int     x, bits, res;
  bits = mp_count_bits (b) % DIGIT_BIT;
  if (b->used > 1) {
     if ((res = mp_2expt (a, (b->used - 1) * DIGIT_BIT + bits - 1))
         != MP_OKAY) {
        return res;
     }
  } else {
     mp_set(a, 1);
     bits = 1;
  }
  for (x = bits - 1; x < (int)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;
}