]> Git Repo - secp256k1.git/blob - src/tests.c
Merge pull request #16
[secp256k1.git] / src / tests.c
1 // Copyright (c) 2013 Pieter Wuille
2 // Distributed under the MIT/X11 software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5 #if defined HAVE_CONFIG_H
6 #include "libsecp256k1-config.h"
7 #endif
8
9 #include <stdio.h>
10 #include <stdlib.h>
11
12 #include "num_impl.h"
13 #include "field_impl.h"
14 #include "group_impl.h"
15 #include "ecmult_impl.h"
16 #include "ecdsa_impl.h"
17 #include "util_impl.h"
18
19 #ifdef ENABLE_OPENSSL_TESTS
20 #include "openssl/bn.h"
21 #include "openssl/ec.h"
22 #include "openssl/ecdsa.h"
23 #include "openssl/obj_mac.h"
24 #endif
25
26 #define TEST_FAILURE(msg) do { \
27     fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, msg); \
28     abort(); \
29 } while(0)
30
31 #define CHECK(cond) do { if (!(cond)) { TEST_FAILURE("test condition failed: " #cond); } } while(0)
32
33 static int count = 100;
34
35 /***** NUM TESTS *****/
36
37 void random_num_negate(secp256k1_num_t *num) {
38     if (secp256k1_rand32() & 1)
39         secp256k1_num_negate(num);
40 }
41
42 void random_num_order_test(secp256k1_num_t *num) {
43     do {
44         unsigned char b32[32];
45         secp256k1_rand256_test(b32);
46         secp256k1_num_set_bin(num, b32, 32);
47         if (secp256k1_num_is_zero(num))
48             continue;
49         if (secp256k1_num_cmp(num, &secp256k1_ge_consts->order) >= 0)
50             continue;
51         break;
52     } while(1);
53 }
54
55 void random_num_order(secp256k1_num_t *num) {
56     do {
57         unsigned char b32[32];
58         secp256k1_rand256(b32);
59         secp256k1_num_set_bin(num, b32, 32);
60         if (secp256k1_num_is_zero(num))
61             continue;
62         if (secp256k1_num_cmp(num, &secp256k1_ge_consts->order) >= 0)
63             continue;
64         break;
65     } while(1);
66 }
67
68 void test_num_copy_inc_cmp() {
69     secp256k1_num_t n1,n2;
70     secp256k1_num_init(&n1);
71     secp256k1_num_init(&n2);
72     random_num_order(&n1);
73     secp256k1_num_copy(&n2, &n1);
74     CHECK(secp256k1_num_cmp(&n1, &n2) == 0);
75     CHECK(secp256k1_num_cmp(&n2, &n1) == 0);
76     secp256k1_num_inc(&n2);
77     CHECK(secp256k1_num_cmp(&n1, &n2) != 0);
78     CHECK(secp256k1_num_cmp(&n2, &n1) != 0);
79     secp256k1_num_free(&n1);
80     secp256k1_num_free(&n2);
81 }
82
83
84 void test_num_get_set_hex() {
85     secp256k1_num_t n1,n2;
86     secp256k1_num_init(&n1);
87     secp256k1_num_init(&n2);
88     random_num_order_test(&n1);
89     char c[64];
90     secp256k1_num_get_hex(c, 64, &n1);
91     secp256k1_num_set_hex(&n2, c, 64);
92     CHECK(secp256k1_num_cmp(&n1, &n2) == 0);
93     for (int i=0; i<64; i++) {
94         // check whether the lower 4 bits correspond to the last hex character
95         int low1 = secp256k1_num_shift(&n1, 4);
96         int lowh = c[63];
97         int low2 = (lowh>>6)*9+(lowh-'0')&15;
98         CHECK(low1 == low2);
99         // shift bits off the hex representation, and compare
100         memmove(c+1, c, 63);
101         c[0] = '0';
102         secp256k1_num_set_hex(&n2, c, 64);
103         CHECK(secp256k1_num_cmp(&n1, &n2) == 0);
104     }
105     secp256k1_num_free(&n2);
106     secp256k1_num_free(&n1);
107 }
108
109 void test_num_get_set_bin() {
110     secp256k1_num_t n1,n2;
111     secp256k1_num_init(&n1);
112     secp256k1_num_init(&n2);
113     random_num_order_test(&n1);
114     unsigned char c[32];
115     secp256k1_num_get_bin(c, 32, &n1);
116     secp256k1_num_set_bin(&n2, c, 32);
117     CHECK(secp256k1_num_cmp(&n1, &n2) == 0);
118     for (int i=0; i<32; i++) {
119         // check whether the lower 8 bits correspond to the last byte
120         int low1 = secp256k1_num_shift(&n1, 8);
121         int low2 = c[31];
122         CHECK(low1 == low2);
123         // shift bits off the byte representation, and compare
124         memmove(c+1, c, 31);
125         c[0] = 0;
126         secp256k1_num_set_bin(&n2, c, 32);
127         CHECK(secp256k1_num_cmp(&n1, &n2) == 0);
128     }
129     secp256k1_num_free(&n2);
130     secp256k1_num_free(&n1);
131 }
132
133 void run_num_int() {
134     secp256k1_num_t n1;
135     secp256k1_num_init(&n1);
136     for (int i=-255; i<256; i++) {
137         unsigned char c1[3] = {};
138         c1[2] = abs(i);
139         unsigned char c2[3] = {0x11,0x22,0x33};
140         secp256k1_num_set_int(&n1, i);
141         secp256k1_num_get_bin(c2, 3, &n1);
142         CHECK(memcmp(c1, c2, 3) == 0);
143     }
144     secp256k1_num_free(&n1);
145 }
146
147 void test_num_negate() {
148     secp256k1_num_t n1;
149     secp256k1_num_t n2;
150     secp256k1_num_init(&n1);
151     secp256k1_num_init(&n2);
152     random_num_order_test(&n1); // n1 = R
153     random_num_negate(&n1);
154     secp256k1_num_copy(&n2, &n1); // n2 = R
155     secp256k1_num_sub(&n1, &n2, &n1); // n1 = n2-n1 = 0
156     CHECK(secp256k1_num_is_zero(&n1));
157     secp256k1_num_copy(&n1, &n2); // n1 = R
158     secp256k1_num_negate(&n1); // n1 = -R
159     CHECK(!secp256k1_num_is_zero(&n1));
160     secp256k1_num_add(&n1, &n2, &n1); // n1 = n2+n1 = 0
161     CHECK(secp256k1_num_is_zero(&n1));
162     secp256k1_num_copy(&n1, &n2); // n1 = R
163     secp256k1_num_negate(&n1); // n1 = -R
164     CHECK(secp256k1_num_is_neg(&n1) != secp256k1_num_is_neg(&n2));
165     secp256k1_num_negate(&n1); // n1 = R
166     CHECK(secp256k1_num_cmp(&n1, &n2) == 0);
167     CHECK(secp256k1_num_is_neg(&n1) == secp256k1_num_is_neg(&n2));
168     secp256k1_num_free(&n2);
169     secp256k1_num_free(&n1);
170 }
171
172 void test_num_add_sub() {
173     secp256k1_num_t n1;
174     secp256k1_num_t n2;
175     secp256k1_num_init(&n1);
176     secp256k1_num_init(&n2);
177     random_num_order_test(&n1); // n1 = R1
178     random_num_negate(&n1);
179     random_num_order_test(&n2); // n2 = R2
180     random_num_negate(&n2);
181     secp256k1_num_t n1p2, n2p1, n1m2, n2m1;
182     secp256k1_num_init(&n1p2);
183     secp256k1_num_init(&n2p1);
184     secp256k1_num_init(&n1m2);
185     secp256k1_num_init(&n2m1);
186     secp256k1_num_add(&n1p2, &n1, &n2); // n1p2 = R1 + R2
187     secp256k1_num_add(&n2p1, &n2, &n1); // n2p1 = R2 + R1
188     secp256k1_num_sub(&n1m2, &n1, &n2); // n1m2 = R1 - R2
189     secp256k1_num_sub(&n2m1, &n2, &n1); // n2m1 = R2 - R1
190     CHECK(secp256k1_num_cmp(&n1p2, &n2p1) == 0);
191     CHECK(secp256k1_num_cmp(&n1p2, &n1m2) != 0);
192     secp256k1_num_negate(&n2m1); // n2m1 = -R2 + R1
193     CHECK(secp256k1_num_cmp(&n2m1, &n1m2) == 0);
194     CHECK(secp256k1_num_cmp(&n2m1, &n1) != 0);
195     secp256k1_num_add(&n2m1, &n2m1, &n2); // n2m1 = -R2 + R1 + R2 = R1
196     CHECK(secp256k1_num_cmp(&n2m1, &n1) == 0);
197     CHECK(secp256k1_num_cmp(&n2p1, &n1) != 0);
198     secp256k1_num_sub(&n2p1, &n2p1, &n2); // n2p1 = R2 + R1 - R2 = R1
199     CHECK(secp256k1_num_cmp(&n2p1, &n1) == 0);
200     secp256k1_num_free(&n2m1);
201     secp256k1_num_free(&n1m2);
202     secp256k1_num_free(&n2p1);
203     secp256k1_num_free(&n1p2);
204     secp256k1_num_free(&n2);
205     secp256k1_num_free(&n1);
206 }
207
208 void run_num_smalltests() {
209     for (int i=0; i<100*count; i++) {
210         test_num_copy_inc_cmp();
211         test_num_get_set_hex();
212         test_num_get_set_bin();
213         test_num_negate();
214         test_num_add_sub();
215     }
216     run_num_int();
217 }
218
219 /***** FIELD TESTS *****/
220
221 void random_fe(secp256k1_fe_t *x) {
222     unsigned char bin[32];
223     secp256k1_rand256(bin);
224     secp256k1_fe_set_b32(x, bin);
225 }
226
227 void random_fe_non_zero(secp256k1_fe_t *nz) {
228     int tries = 10;
229     while (--tries >= 0) {
230         random_fe(nz);
231         secp256k1_fe_normalize(nz);
232         if (!secp256k1_fe_is_zero(nz))
233             break;
234     }
235     // Infinitesimal probability of spurious failure here
236     CHECK(tries >= 0);
237 }
238
239 void random_fe_non_square(secp256k1_fe_t *ns) {
240     random_fe_non_zero(ns);
241     secp256k1_fe_t r;
242     if (secp256k1_fe_sqrt(&r, ns)) {
243         secp256k1_fe_negate(ns, ns, 1);
244     }
245 }
246
247 int check_fe_equal(const secp256k1_fe_t *a, const secp256k1_fe_t *b) {
248     secp256k1_fe_t an = *a; secp256k1_fe_normalize(&an);
249     secp256k1_fe_t bn = *b; secp256k1_fe_normalize(&bn);
250     return secp256k1_fe_equal(&an, &bn);
251 }
252
253 int check_fe_inverse(const secp256k1_fe_t *a, const secp256k1_fe_t *ai) {
254     secp256k1_fe_t x; secp256k1_fe_mul(&x, a, ai);
255     secp256k1_fe_t one; secp256k1_fe_set_int(&one, 1);
256     return check_fe_equal(&x, &one);
257 }
258
259 void run_field_inv() {
260     secp256k1_fe_t x, xi, xii;
261     for (int i=0; i<10*count; i++) {
262         random_fe_non_zero(&x);
263         secp256k1_fe_inv(&xi, &x);
264         CHECK(check_fe_inverse(&x, &xi));
265         secp256k1_fe_inv(&xii, &xi);
266         CHECK(check_fe_equal(&x, &xii));
267     }
268 }
269
270 void run_field_inv_var() {
271     secp256k1_fe_t x, xi, xii;
272     for (int i=0; i<10*count; i++) {
273         random_fe_non_zero(&x);
274         secp256k1_fe_inv_var(&xi, &x);
275         CHECK(check_fe_inverse(&x, &xi));
276         secp256k1_fe_inv_var(&xii, &xi);
277         CHECK(check_fe_equal(&x, &xii));
278     }
279 }
280
281 void run_field_inv_all() {
282     secp256k1_fe_t x[16], xi[16], xii[16];
283     // Check it's safe to call for 0 elements
284     secp256k1_fe_inv_all(0, xi, x);
285     for (int i=0; i<count; i++) {
286         size_t len = (secp256k1_rand32() & 15) + 1;
287         for (int j=0; j<len; j++)
288             random_fe_non_zero(&x[j]);
289         secp256k1_fe_inv_all(len, xi, x);
290         for (int j=0; j<len; j++)
291             CHECK(check_fe_inverse(&x[j], &xi[j]));
292         secp256k1_fe_inv_all(len, xii, xi);
293         for (int j=0; j<len; j++)
294             CHECK(check_fe_equal(&x[j], &xii[j]));
295     }
296 }
297
298 void run_field_inv_all_var() {
299     secp256k1_fe_t x[16], xi[16], xii[16];
300     // Check it's safe to call for 0 elements
301     secp256k1_fe_inv_all_var(0, xi, x);
302     for (int i=0; i<count; i++) {
303         size_t len = (secp256k1_rand32() & 15) + 1;
304         for (int j=0; j<len; j++)
305             random_fe_non_zero(&x[j]);
306         secp256k1_fe_inv_all_var(len, xi, x);
307         for (int j=0; j<len; j++)
308             CHECK(check_fe_inverse(&x[j], &xi[j]));
309         secp256k1_fe_inv_all_var(len, xii, xi);
310         for (int j=0; j<len; j++)
311             CHECK(check_fe_equal(&x[j], &xii[j]));
312     }
313 }
314
315 void test_sqrt(const secp256k1_fe_t *a, const secp256k1_fe_t *k) {
316     secp256k1_fe_t r1, r2;
317     int v = secp256k1_fe_sqrt(&r1, a);
318     CHECK((v == 0) == (k == NULL));
319
320     if (k != NULL) {
321         // Check that the returned root is +/- the given known answer
322         secp256k1_fe_negate(&r2, &r1, 1);
323         secp256k1_fe_add(&r1, k); secp256k1_fe_add(&r2, k);
324         secp256k1_fe_normalize(&r1); secp256k1_fe_normalize(&r2);
325         CHECK(secp256k1_fe_is_zero(&r1) || secp256k1_fe_is_zero(&r2));
326     }
327 }
328
329 void run_sqrt() {
330     secp256k1_fe_t ns, x, s, t;
331
332     // Check sqrt(0) is 0
333     secp256k1_fe_set_int(&x, 0);
334     secp256k1_fe_sqr(&s, &x);
335     test_sqrt(&s, &x);
336
337     // Check sqrt of small squares (and their negatives)
338     for (int i=1; i<=100; i++) {
339         secp256k1_fe_set_int(&x, i);
340         secp256k1_fe_sqr(&s, &x);
341         test_sqrt(&s, &x);
342         secp256k1_fe_negate(&t, &s, 1);
343         test_sqrt(&t, NULL);
344     }
345
346     // Consistency checks for large random values
347     for (int i=0; i<10; i++) {
348         random_fe_non_square(&ns);
349         for (int j=0; j<count; j++) {
350             random_fe(&x);
351             secp256k1_fe_sqr(&s, &x);
352             test_sqrt(&s, &x);
353             secp256k1_fe_negate(&t, &s, 1);
354             test_sqrt(&t, NULL);
355             secp256k1_fe_mul(&t, &s, &ns);
356             test_sqrt(&t, NULL);
357         }
358     }
359 }
360
361 /***** ECMULT TESTS *****/
362
363 void run_ecmult_chain() {
364     // random starting point A (on the curve)
365     secp256k1_fe_t ax; secp256k1_fe_set_hex(&ax, "8b30bbe9ae2a990696b22f670709dff3727fd8bc04d3362c6c7bf458e2846004", 64);
366     secp256k1_fe_t ay; secp256k1_fe_set_hex(&ay, "a357ae915c4a65281309edf20504740f0eb3343990216b4f81063cb65f2f7e0f", 64);
367     secp256k1_gej_t a; secp256k1_gej_set_xy(&a, &ax, &ay);
368     // two random initial factors xn and gn
369     secp256k1_num_t xn;
370     secp256k1_num_init(&xn);
371     secp256k1_num_set_hex(&xn, "84cc5452f7fde1edb4d38a8ce9b1b84ccef31f146e569be9705d357a42985407", 64);
372     secp256k1_num_t gn;
373     secp256k1_num_init(&gn);
374     secp256k1_num_set_hex(&gn, "a1e58d22553dcd42b23980625d4c57a96e9323d42b3152e5ca2c3990edc7c9de", 64);
375     // two small multipliers to be applied to xn and gn in every iteration:
376     secp256k1_num_t xf;
377     secp256k1_num_init(&xf);
378     secp256k1_num_set_hex(&xf, "1337", 4);
379     secp256k1_num_t gf;
380     secp256k1_num_init(&gf);
381     secp256k1_num_set_hex(&gf, "7113", 4);
382     // accumulators with the resulting coefficients to A and G
383     secp256k1_num_t ae;
384     secp256k1_num_init(&ae);
385     secp256k1_num_set_int(&ae, 1);
386     secp256k1_num_t ge;
387     secp256k1_num_init(&ge);
388     secp256k1_num_set_int(&ge, 0);
389     // the point being computed
390     secp256k1_gej_t x = a;
391     const secp256k1_num_t *order = &secp256k1_ge_consts->order;
392     for (int i=0; i<200*count; i++) {
393         // in each iteration, compute X = xn*X + gn*G;
394         secp256k1_ecmult(&x, &x, &xn, &gn);
395         // also compute ae and ge: the actual accumulated factors for A and G
396         // if X was (ae*A+ge*G), xn*X + gn*G results in (xn*ae*A + (xn*ge+gn)*G)
397         secp256k1_num_mod_mul(&ae, &ae, &xn, order);
398         secp256k1_num_mod_mul(&ge, &ge, &xn, order);
399         secp256k1_num_add(&ge, &ge, &gn);
400         secp256k1_num_mod(&ge, order);
401         // modify xn and gn
402         secp256k1_num_mod_mul(&xn, &xn, &xf, order);
403         secp256k1_num_mod_mul(&gn, &gn, &gf, order);
404
405         // verify
406         if (i == 19999) {
407             char res[132]; int resl = 132;
408             secp256k1_gej_get_hex(res, &resl, &x);
409             CHECK(strcmp(res, "(D6E96687F9B10D092A6F35439D86CEBEA4535D0D409F53586440BD74B933E830,B95CBCA2C77DA786539BE8FD53354D2D3B4F566AE658045407ED6015EE1B2A88)") == 0);
410         }
411     }
412     // redo the computation, but directly with the resulting ae and ge coefficients:
413     secp256k1_gej_t x2; secp256k1_ecmult(&x2, &a, &ae, &ge);
414     char res[132]; int resl = 132;
415     char res2[132]; int resl2 = 132;
416     secp256k1_gej_get_hex(res, &resl, &x);
417     secp256k1_gej_get_hex(res2, &resl2, &x2);
418     CHECK(strcmp(res, res2) == 0);
419     CHECK(strlen(res) == 131);
420     secp256k1_num_free(&xn);
421     secp256k1_num_free(&gn);
422     secp256k1_num_free(&xf);
423     secp256k1_num_free(&gf);
424     secp256k1_num_free(&ae);
425     secp256k1_num_free(&ge);
426 }
427
428 void test_point_times_order(const secp256k1_gej_t *point) {
429     // multiplying a point by the order results in O
430     const secp256k1_num_t *order = &secp256k1_ge_consts->order;
431     secp256k1_num_t zero;
432     secp256k1_num_init(&zero);
433     secp256k1_num_set_int(&zero, 0);
434     secp256k1_gej_t res;
435     secp256k1_ecmult(&res, point, order, order); // calc res = order * point + order * G;
436     CHECK(secp256k1_gej_is_infinity(&res));
437     secp256k1_num_free(&zero);
438 }
439
440 void run_point_times_order() {
441     secp256k1_fe_t x; secp256k1_fe_set_hex(&x, "02", 2);
442     for (int i=0; i<500; i++) {
443         secp256k1_ge_t p;
444         if (secp256k1_ge_set_xo(&p, &x, 1)) {
445             CHECK(secp256k1_ge_is_valid(&p));
446             secp256k1_gej_t j;
447             secp256k1_gej_set_ge(&j, &p);
448             CHECK(secp256k1_gej_is_valid(&j));
449             test_point_times_order(&j);
450         }
451         secp256k1_fe_sqr(&x, &x);
452     }
453     char c[65]; int cl=65;
454     secp256k1_fe_get_hex(c, &cl, &x);
455     CHECK(strcmp(c, "7603CB59B0EF6C63FE6084792A0C378CDB3233A80F8A9A09A877DEAD31B38C45") == 0);
456 }
457
458 void test_wnaf(const secp256k1_num_t *number, int w) {
459     secp256k1_num_t x, two, t;
460     secp256k1_num_init(&x);
461     secp256k1_num_init(&two);
462     secp256k1_num_init(&t);
463     secp256k1_num_set_int(&x, 0);
464     secp256k1_num_set_int(&two, 2);
465     int wnaf[257];
466     int bits = secp256k1_ecmult_wnaf(wnaf, number, w);
467     int zeroes = -1;
468     for (int i=bits-1; i>=0; i--) {
469         secp256k1_num_mul(&x, &x, &two);
470         int v = wnaf[i];
471         if (v) {
472             CHECK(zeroes == -1 || zeroes >= w-1); // check that distance between non-zero elements is at least w-1
473             zeroes=0;
474             CHECK((v & 1) == 1); // check non-zero elements are odd
475             CHECK(v <= (1 << (w-1)) - 1); // check range below
476             CHECK(v >= -(1 << (w-1)) - 1); // check range above
477         } else {
478             CHECK(zeroes != -1); // check that no unnecessary zero padding exists
479             zeroes++;
480         }
481         secp256k1_num_set_int(&t, v);
482         secp256k1_num_add(&x, &x, &t);
483     }
484     CHECK(secp256k1_num_cmp(&x, number) == 0); // check that wnaf represents number
485     secp256k1_num_free(&x);
486     secp256k1_num_free(&two);
487     secp256k1_num_free(&t);
488 }
489
490 void run_wnaf() {
491     secp256k1_num_t n;
492     secp256k1_num_init(&n);
493     for (int i=0; i<count; i++) {
494         random_num_order(&n);
495         if (i % 1)
496             secp256k1_num_negate(&n);
497         test_wnaf(&n, 4+(i%10));
498     }
499     secp256k1_num_free(&n);
500 }
501
502 void random_sign(secp256k1_ecdsa_sig_t *sig, const secp256k1_num_t *key, const secp256k1_num_t *msg, int *recid) {
503     secp256k1_num_t nonce;
504     secp256k1_num_init(&nonce);
505     do {
506         random_num_order_test(&nonce);
507     } while(!secp256k1_ecdsa_sig_sign(sig, key, msg, &nonce, recid));
508     secp256k1_num_free(&nonce);
509 }
510
511 void test_ecdsa_sign_verify() {
512     const secp256k1_ge_consts_t *c = secp256k1_ge_consts;
513     secp256k1_num_t msg, key;
514     secp256k1_num_init(&msg);
515     random_num_order_test(&msg);
516     secp256k1_num_init(&key);
517     random_num_order_test(&key);
518     secp256k1_gej_t pubj; secp256k1_ecmult_gen(&pubj, &key);
519     secp256k1_ge_t pub; secp256k1_ge_set_gej(&pub, &pubj);
520     secp256k1_ecdsa_sig_t sig;
521     secp256k1_ecdsa_sig_init(&sig);
522     random_sign(&sig, &key, &msg, NULL);
523     CHECK(secp256k1_ecdsa_sig_verify(&sig, &pub, &msg));
524     secp256k1_num_inc(&msg);
525     CHECK(!secp256k1_ecdsa_sig_verify(&sig, &pub, &msg));
526     secp256k1_ecdsa_sig_free(&sig);
527     secp256k1_num_free(&msg);
528     secp256k1_num_free(&key);
529 }
530
531 void run_ecdsa_sign_verify() {
532     for (int i=0; i<10*count; i++) {
533         test_ecdsa_sign_verify();
534     }
535 }
536
537 #ifdef ENABLE_OPENSSL_TESTS
538 EC_KEY *get_openssl_key(const secp256k1_num_t *key) {
539     unsigned char privkey[300];
540     int privkeylen;
541     int compr = secp256k1_rand32() & 1;
542     const unsigned char* pbegin = privkey;
543     EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1);
544     CHECK(secp256k1_ecdsa_privkey_serialize(privkey, &privkeylen, key, compr));
545     CHECK(d2i_ECPrivateKey(&ec_key, &pbegin, privkeylen));
546     CHECK(EC_KEY_check_key(ec_key));
547     return ec_key;
548 }
549
550 void test_ecdsa_openssl() {
551     const secp256k1_ge_consts_t *c = secp256k1_ge_consts;
552     secp256k1_num_t key, msg;
553     secp256k1_num_init(&msg);
554     unsigned char message[32];
555     secp256k1_rand256_test(message);
556     secp256k1_num_set_bin(&msg, message, 32);
557     secp256k1_num_init(&key);
558     random_num_order_test(&key);
559     secp256k1_gej_t qj;
560     secp256k1_ecmult_gen(&qj, &key);
561     secp256k1_ge_t q;
562     secp256k1_ge_set_gej(&q, &qj);
563     EC_KEY *ec_key = get_openssl_key(&key);
564     CHECK(ec_key);
565     unsigned char signature[80];
566     int sigsize = 80;
567     CHECK(ECDSA_sign(0, message, sizeof(message), signature, &sigsize, ec_key));
568     secp256k1_ecdsa_sig_t sig;
569     secp256k1_ecdsa_sig_init(&sig);
570     CHECK(secp256k1_ecdsa_sig_parse(&sig, signature, sigsize));
571     CHECK(secp256k1_ecdsa_sig_verify(&sig, &q, &msg));
572     secp256k1_num_inc(&sig.r);
573     CHECK(!secp256k1_ecdsa_sig_verify(&sig, &q, &msg));
574
575     random_sign(&sig, &key, &msg, NULL);
576     sigsize = 80;
577     CHECK(secp256k1_ecdsa_sig_serialize(signature, &sigsize, &sig));
578     CHECK(ECDSA_verify(0, message, sizeof(message), signature, sigsize, ec_key) == 1);
579
580     secp256k1_ecdsa_sig_free(&sig);
581     EC_KEY_free(ec_key);
582     secp256k1_num_free(&key);
583     secp256k1_num_free(&msg);
584 }
585
586 void run_ecdsa_openssl() {
587     for (int i=0; i<10*count; i++) {
588         test_ecdsa_openssl();
589     }
590 }
591 #endif
592
593 int main(int argc, char **argv) {
594     if (argc > 1)
595         count = strtol(argv[1], NULL, 0)*47;
596
597     printf("test count = %i\n", count);
598
599     // initialize
600     secp256k1_fe_start();
601     secp256k1_ge_start();
602     secp256k1_ecmult_start();
603
604     // num tests
605     run_num_smalltests();
606
607     // field tests
608     run_field_inv();
609     run_field_inv_var();
610     run_field_inv_all();
611     run_field_inv_all_var();
612     run_sqrt();
613
614     // ecmult tests
615     run_wnaf();
616     run_point_times_order();
617     run_ecmult_chain();
618
619     // ecdsa tests
620     run_ecdsa_sign_verify();
621 #ifdef ENABLE_OPENSSL_TESTS
622     run_ecdsa_openssl();
623 #endif
624
625     // shutdown
626     secp256k1_ecmult_stop();
627     secp256k1_ge_stop();
628     secp256k1_fe_stop();
629     return 0;
630 }
This page took 0.061788 seconds and 4 git commands to generate.