void
ecc_256_redc (const struct ecc_modulo *p, mp_limb_t *rp);
#else /* !HAVE_NATIVE_ecc_256_redc */
-# if ECC_REDC_SIZE > 0
+# if ECC_REDC_SIZE > 0
# define ecc_256_redc ecc_pp1_redc
# elif ECC_REDC_SIZE == 0
# define ecc_256_redc NULL
/*
n-1 n-2 n-3 n-4
- +---+---+---+---+
- | u1| u0| u low |
- +---+---+---+---+
- - | q1(2^96-1)|
- +-------+---+
- |q2(2^.)|
- +-------+
+ +---+---+---+---+
+ | u1| u0| u low |
+ +---+---+---+---+
+ - | q1(2^96-1)|
+ +-------+---+
+ |q2(2^.)|
+ +-------+
We multiply by two low limbs of p, 2^96 - 1, so we could use
shifts rather than mul.
mp_limb_t q2, q1, q0, t, c1, c0;
u0 = rp[n-2];
-
+
/* <q2, q1, q0> = v * u2 + <u2,u1>, same method as above.
+---+---+
q2 = q1 < t;
/* Compute candidate remainder, <u1, u0> - <q2, q1> * (2^128 - 2^96 + 2^64 - 1)
- <u1, u0> + 2^64 q2 + (2^96 - 2^64 + 1) q1 (mod 2^128)
+ <u1, u0> + 2^64 q2 + (2^96 - 2^64 + 1) q1 (mod 2^128)
+---+---+
| u1| u0|
+-+-+-+
| q1|
--+-+-+-+---+
- | u2| u1|
+ | u2| u1|
+---+---+
- */
+ */
u2 = u1 + q2 - q1;
u1 = u0 + q1;
u2 += (u1 < q1);
t = mpn_submul_1 (rp + n - 4, q->m, 2, q1);
c0 += t;
c1 = c0 < t;
-
+
/* Construct underflow condition. */
c1 += (u1 < c0);
t = - (mp_limb_t) (u2 < c1);
rp[2] = u1;
rp[3] = u2;
}
-
+
#else
#error Unsupported parameters
#endif
{
{
256,
- ECC_LIMB_SIZE,
+ ECC_LIMB_SIZE,
ECC_BMODP_SIZE,
ECC_REDC_SIZE,
ECC_MOD_INV_ITCH (ECC_LIMB_SIZE),
ecc_Bmodp,
ecc_Bmodp_shifted,
ecc_redc_ppm1,
-
ecc_pp1h,
+
ecc_256_modp,
USE_REDC ? ecc_256_redc : ecc_256_modp,
ecc_mod_inv,
},
{
256,
- ECC_LIMB_SIZE,
+ ECC_LIMB_SIZE,
ECC_BMODQ_SIZE,
0,
ECC_MOD_INV_ITCH (ECC_LIMB_SIZE),