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);