4
ref_modinv (mp_limb_t *rp, const mp_limb_t *ap, const mp_limb_t *mp, mp_size_t mn)
6
mp_limb_t tp[4*(mn+1)];
8
mp_limb_t *vp = tp + mn+1;
9
mp_limb_t *gp = tp + 2*(mn+1);
10
mp_limb_t *sp = tp + 3*(mn+1);
13
mpn_copyi (up, ap, mn);
14
mpn_copyi (vp, mp, mn);
15
gn = mpn_gcdext (gp, sp, &sn, up, mn, vp, mn);
16
if (gn != 1 || gp[0] != 1)
20
mpn_sub (sp, mp, mn, sp, -sn);
23
mpn_zero (sp + sn, mn - sn);
25
mpn_copyi (rp, sp, mn);
29
#define MAX_ECC_SIZE (1 + 521 / GMP_NUMB_BITS)
35
gmp_randstate_t state;
36
mp_limb_t a[MAX_ECC_SIZE];
37
mp_limb_t ai[MAX_ECC_SIZE];
38
mp_limb_t ref[MAX_ECC_SIZE];
39
mp_limb_t scratch[ECC_MODINV_ITCH (MAX_ECC_SIZE)];
43
gmp_randinit_default (state);
46
for (i = 0; ecc_curves[i]; i++)
48
const struct ecc_curve *ecc = ecc_curves[i];
50
for (j = 0; j < COUNT; j++)
53
mpz_rrandomb (r, state, ecc->size * GMP_NUMB_BITS);
55
mpz_urandomb (r, state, ecc->size * GMP_NUMB_BITS);
57
mpz_limbs_copy (a, r, ecc->size);
59
if (!ref_modinv (ref, a, ecc->p, ecc->size))
62
fprintf (stderr, "Test %u (bit size %u) not invertible.\n",
66
ecc_modp_inv (ecc, ai, a, scratch);
67
if (mpn_cmp (ref, ai, ecc->size))
69
fprintf (stderr, "ecc_modp_inv failed (test %u, bit size %u):\n",
71
gmp_fprintf (stderr, "a = %Zx\n"
81
mpz_limbs_copy (a, r, ecc->size);
83
if (!ref_modinv (ref, a, ecc->q, ecc->size))
85
fprintf (stderr, "Test %u (bit size %u) not invertible.\n",
89
ecc_modq_inv (ecc, ai, a, scratch);
90
if (mpn_cmp (ref, ai, ecc->size))
92
fprintf (stderr, "ecc_modq_inv failed (test %u, bit size %u):\n",
94
gmp_fprintf (stderr, "a = %Zx\n"
105
gmp_randclear (state);