4 ref_redc (mp_limb_t *rp, const mp_limb_t *ap, const mp_limb_t *mp, mp_size_t mn)
11 mpz_setbit (t, mn * GMP_NUMB_BITS);
13 mpz_roinit_n (m, mp, mn);
16 while (an > 0 && ap[an-1] == 0)
19 mpz_roinit_n (a, ap, an);
25 mpz_limbs_copy (rp, t, mn);
30 #define MAX_ECC_SIZE (1 + 521 / GMP_NUMB_BITS)
31 #define MAX_SIZE (2*MAX_ECC_SIZE)
37 gmp_randstate_t rands;
38 mp_limb_t a[MAX_SIZE];
39 mp_limb_t m[MAX_SIZE];
40 mp_limb_t ref[MAX_SIZE];
44 gmp_randinit_default (rands);
48 for (i = 0; ecc_curves[i]; i++)
50 const struct ecc_curve *ecc = ecc_curves[i];
53 for (j = 0; j < COUNT; j++)
56 mpz_rrandomb (r, rands, 2*ecc->p.size * GMP_NUMB_BITS);
58 mpz_urandomb (r, rands, 2*ecc->p.size * GMP_NUMB_BITS);
60 mpz_limbs_copy (a, r, 2*ecc->p.size);
62 ref_redc (ref, a, ecc->p.m, ecc->p.size);
64 if (ecc->p.reduce != ecc->p.mod)
66 mpn_copyi (m, a, 2*ecc->p.size);
67 ecc->p.reduce (&ecc->p, m);
68 if (mpn_cmp (m, ecc->p.m, ecc->p.size) >= 0)
69 mpn_sub_n (m, m, ecc->p.m, ecc->p.size);
71 if (mpn_cmp (m, ref, ecc->p.size))
73 fprintf (stderr, "ecc->p.reduce failed: bit_size = %u\n",
75 fprintf (stderr, "a = ");
76 mpn_out_str (stderr, 16, a, 2*ecc->p.size);
77 fprintf (stderr, "\nm = ");
78 mpn_out_str (stderr, 16, m, ecc->p.size);
79 fprintf (stderr, " (bad)\nref = ");
80 mpn_out_str (stderr, 16, ref, ecc->p.size);
81 fprintf (stderr, "\n");
85 if (ecc->p.redc_size != 0)
87 mpn_copyi (m, a, 2*ecc->p.size);
89 ecc_pm1_redc (&ecc->p, m);
91 ecc_pp1_redc (&ecc->p, m);
93 if (mpn_cmp (m, ecc->p.m, ecc->p.size) >= 0)
94 mpn_sub_n (m, m, ecc->p.m, ecc->p.size);
96 if (mpn_cmp (m, ref, ecc->p.size))
98 fprintf (stderr, "ecc_p%c1_redc failed: bit_size = %u\n",
99 (ecc->p.m[0] == 1) ? 'm' : 'p', ecc->p.bit_size);
100 fprintf (stderr, "a = ");
101 mpn_out_str (stderr, 16, a, 2*ecc->p.size);
102 fprintf (stderr, "\nm = ");
103 mpn_out_str (stderr, 16, m, ecc->p.size);
104 fprintf (stderr, " (bad)\nref = ");
105 mpn_out_str (stderr, 16, ref, ecc->p.size);
106 fprintf (stderr, "\n");
114 gmp_randclear (rands);