miniupnpd 1.9 (20160113)
[tomato.git] / release / src / router / nettle / testsuite / ecc-redc-test.c
blob9987792fc1e473d9085d261b2e0f49562c2e2832
1 #include "testutils.h"
3 static void
4 ref_redc (mp_limb_t *rp, const mp_limb_t *ap, const mp_limb_t *mp, mp_size_t mn)
6 mpz_t t;
7 mpz_t m, a;
8 mp_size_t an;
10 mpz_init (t);
11 mpz_setbit (t, mn * GMP_NUMB_BITS);
13 mpz_roinit_n (m, mp, mn);
15 an = 2*mn;
16 while (an > 0 && ap[an-1] == 0)
17 an--;
19 mpz_roinit_n (a, ap, an);
21 mpz_invert (t, t, m);
22 mpz_mul (t, t, a);
23 mpz_mod (t, t, m);
25 mpz_limbs_copy (rp, t, mn);
27 mpz_clear (t);
30 #define MAX_ECC_SIZE (1 + 521 / GMP_NUMB_BITS)
31 #define MAX_SIZE (2*MAX_ECC_SIZE)
32 #define COUNT 50000
34 void
35 test_main (void)
37 gmp_randstate_t state;
38 mp_limb_t a[MAX_SIZE];
39 mp_limb_t m[MAX_SIZE];
40 mp_limb_t ref[MAX_SIZE];
41 unsigned i;
42 mpz_t r;
44 gmp_randinit_default (state);
46 mpz_init (r);
48 for (i = 0; ecc_curves[i]; i++)
50 const struct ecc_curve *ecc = ecc_curves[i];
51 unsigned j;
52 if (!ecc->redc)
53 continue;
55 for (j = 0; j < COUNT; j++)
57 if (j & 1)
58 mpz_rrandomb (r, state, 2*ecc->size * GMP_NUMB_BITS);
59 else
60 mpz_urandomb (r, state, 2*ecc->size * GMP_NUMB_BITS);
62 mpz_limbs_copy (a, r, 2*ecc->size);
64 ref_redc (ref, a, ecc->p, ecc->size);
66 mpn_copyi (m, a, 2*ecc->size);
67 ecc->redc (ecc, m);
68 if (mpn_cmp (m, ecc->p, ecc->size) >= 0)
69 mpn_sub_n (m, m, ecc->p, ecc->size);
71 if (mpn_cmp (m, ref, ecc->size))
73 fprintf (stderr, "ecc->redc failed: bit_size = %u\n",
74 ecc->bit_size);
75 gmp_fprintf (stderr, "a = %Nx\n", a, 2*ecc->size);
76 gmp_fprintf (stderr, "m = %Nx (bad)\n", m, ecc->size);
77 gmp_fprintf (stderr, "ref = %Nx\n", ref, ecc->size);
78 abort ();
81 mpn_copyi (m, a, 2*ecc->size);
82 ecc_generic_redc (ecc, m);
83 if (mpn_cmp (m, ecc->p, ecc->size) >= 0)
84 mpn_sub_n (m, m, ecc->p, ecc->size);
86 if (mpn_cmp (m, ref, ecc->size))
88 fprintf (stderr, "ecc_generic_redc failed: bit_size = %u\n",
89 ecc->bit_size);
90 gmp_fprintf (stderr, "a = %Nx\n", a, 2*ecc->size);
91 gmp_fprintf (stderr, "m = %Nx (bad)\n", m, ecc->size);
92 gmp_fprintf (stderr, "ref = %Nx\n", ref, ecc->size);
93 abort ();
98 mpz_clear (r);
99 gmp_randclear (state);