7 #if defined HAVE_CONFIG_H
8 #include "libsecp256k1-config.h"
17 #ifdef ENABLE_OPENSSL_TESTS
18 #include "openssl/bn.h"
19 #include "openssl/ec.h"
20 #include "openssl/ecdsa.h"
21 #include "openssl/obj_mac.h"
24 static int count = 64;
28 unsigned char b32[32];
29 secp256k1_rand256_test(b32);
30 if (secp256k1_fe_set_b32(fe, b32)) {
37 secp256k1_fe_normalize(fe);
38 int n = secp256k1_rand32() % 4;
39 for (
int i = 0; i < n; i++) {
40 secp256k1_fe_negate(fe, fe, 1 + 2*i);
41 secp256k1_fe_negate(fe, fe, 2 + 2*i);
49 if (secp256k1_ge_set_xo(ge, &fe, secp256k1_rand32() & 1))
57 if (!secp256k1_fe_is_zero(&gej->
z)) {
63 secp256k1_fe_mul(&gej->
x, &ge->
x, &z2);
64 secp256k1_fe_mul(&gej->
y, &ge->
y, &z3);
70 unsigned char b32[32];
71 secp256k1_rand256_test(b32);
73 secp256k1_scalar_set_b32(num, b32, &overflow);
74 if (overflow || secp256k1_scalar_is_zero(num))
82 unsigned char b32[32];
83 secp256k1_rand256(b32);
85 secp256k1_scalar_set_b32(num, b32, &overflow);
86 if (overflow || secp256k1_scalar_is_zero(num))
96 if (secp256k1_rand32() & 1)
97 secp256k1_num_negate(num);
103 secp256k1_scalar_get_num(num, &sc);
109 secp256k1_scalar_get_num(num, &sc);
117 secp256k1_num_copy(&n2, &n1);
118 secp256k1_num_sub(&n1, &n2, &n1);
119 CHECK(secp256k1_num_is_zero(&n1));
120 secp256k1_num_copy(&n1, &n2);
121 secp256k1_num_negate(&n1);
122 CHECK(!secp256k1_num_is_zero(&n1));
123 secp256k1_num_add(&n1, &n2, &n1);
124 CHECK(secp256k1_num_is_zero(&n1));
125 secp256k1_num_copy(&n1, &n2);
126 secp256k1_num_negate(&n1);
127 CHECK(secp256k1_num_is_neg(&n1) != secp256k1_num_is_neg(&n2));
128 secp256k1_num_negate(&n1);
129 CHECK(secp256k1_num_eq(&n1, &n2));
133 int r = secp256k1_rand32();
145 secp256k1_num_add(&n1p2, &n1, &n2);
146 secp256k1_num_add(&n2p1, &n2, &n1);
147 secp256k1_num_sub(&n1m2, &n1, &n2);
148 secp256k1_num_sub(&n2m1, &n2, &n1);
149 CHECK(secp256k1_num_eq(&n1p2, &n2p1));
150 CHECK(!secp256k1_num_eq(&n1p2, &n1m2));
151 secp256k1_num_negate(&n2m1);
152 CHECK(secp256k1_num_eq(&n2m1, &n1m2));
153 CHECK(!secp256k1_num_eq(&n2m1, &n1));
154 secp256k1_num_add(&n2m1, &n2m1, &n2);
155 CHECK(secp256k1_num_eq(&n2m1, &n1));
156 CHECK(!secp256k1_num_eq(&n2p1, &n1));
157 secp256k1_num_sub(&n2p1, &n2p1, &n2);
158 CHECK(secp256k1_num_eq(&n2p1, &n1));
162 for (
int i=0; i<100*count; i++) {
185 secp256k1_scalar_get_b32(c, &s2);
189 secp256k1_scalar_get_num(&snum, &s);
190 secp256k1_scalar_get_num(&s1num, &s1);
191 secp256k1_scalar_get_num(&s2num, &s2);
194 secp256k1_scalar_order_get_num(&order);
196 secp256k1_num_shift(&half_order, 1);
202 secp256k1_scalar_set_int(&n, 0);
203 for (
int i = 0; i < 256; i += 4) {
205 secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits(&s, 256 - 4 - i, 4));
206 for (
int j = 0; j < 4; j++) {
207 secp256k1_scalar_add(&n, &n, &n);
209 secp256k1_scalar_add(&n, &n, &t);
211 CHECK(secp256k1_scalar_eq(&n, &s));
217 secp256k1_scalar_set_int(&n, 0);
220 int now = (secp256k1_rand32() % 15) + 1;
225 secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits_var(&s, 256 - now - i, now));
226 for (
int j = 0; j < now; j++) {
227 secp256k1_scalar_add(&n, &n, &n);
229 secp256k1_scalar_add(&n, &n, &t);
232 CHECK(secp256k1_scalar_eq(&n, &s));
239 secp256k1_num_add(&rnum, &snum, &s2num);
240 secp256k1_num_mod(&rnum, &order);
242 secp256k1_scalar_add(&
r, &s, &s2);
244 secp256k1_scalar_get_num(&r2num, &
r);
245 CHECK(secp256k1_num_eq(&rnum, &r2num));
251 secp256k1_num_mul(&rnum, &snum, &s2num);
252 secp256k1_num_mod(&rnum, &order);
254 secp256k1_scalar_mul(&
r, &s, &s2);
256 secp256k1_scalar_get_num(&r2num, &
r);
257 CHECK(secp256k1_num_eq(&rnum, &r2num));
259 CHECK(secp256k1_scalar_is_zero(&
r) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_zero(&s2)));
261 CHECK(secp256k1_num_eq(&rnum, &snum) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_one(&s2)));
262 CHECK(secp256k1_num_eq(&rnum, &s2num) == (secp256k1_scalar_is_zero(&s2) || secp256k1_scalar_is_one(&s)));
267 CHECK(secp256k1_num_is_zero(&snum) == secp256k1_scalar_is_zero(&s));
269 CHECK(secp256k1_scalar_is_high(&s) == (secp256k1_num_cmp(&snum, &half_order) > 0));
271 secp256k1_scalar_negate(&neg, &s);
273 secp256k1_num_sub(&negnum, &order, &snum);
274 secp256k1_num_mod(&negnum, &order);
276 CHECK(secp256k1_scalar_is_high(&neg) == (secp256k1_num_cmp(&negnum, &half_order) > 0));
278 CHECK((secp256k1_scalar_is_high(&s) == secp256k1_scalar_is_high(&neg)) == secp256k1_scalar_is_zero(&s));
280 secp256k1_scalar_get_num(&negnum2, &neg);
282 CHECK(secp256k1_num_eq(&negnum, &negnum2));
283 secp256k1_scalar_add(&neg, &neg, &s);
285 CHECK(secp256k1_scalar_is_zero(&neg));
286 secp256k1_scalar_negate(&neg, &neg);
288 CHECK(secp256k1_scalar_is_zero(&neg));
294 unsigned int shift = 256 + (secp256k1_rand32() % 257);
295 secp256k1_scalar_mul_shift_var(&
r, &s1, &s2, shift);
297 secp256k1_num_mul(&rnum, &s1num, &s2num);
298 secp256k1_num_shift(&rnum, shift - 1);
300 unsigned char cone[1] = {0x01};
301 secp256k1_num_set_bin(&one, cone, 1);
302 secp256k1_num_add(&rnum, &rnum, &one);
303 secp256k1_num_shift(&rnum, 1);
305 secp256k1_scalar_get_num(&rnum2, &
r);
306 CHECK(secp256k1_num_eq(&rnum, &rnum2));
312 if (!secp256k1_scalar_is_zero(&s)) {
314 secp256k1_scalar_inverse(&inv, &s);
317 secp256k1_num_mod_inverse(&invnum, &snum, &order);
319 secp256k1_scalar_get_num(&invnum2, &inv);
320 CHECK(secp256k1_num_eq(&invnum, &invnum2));
322 secp256k1_scalar_mul(&inv, &inv, &s);
324 CHECK(secp256k1_scalar_is_one(&inv));
325 secp256k1_scalar_inverse(&inv, &inv);
327 CHECK(secp256k1_scalar_is_one(&inv));
334 secp256k1_scalar_add(&r1, &s1, &s2);
335 secp256k1_scalar_add(&r2, &s2, &s1);
336 CHECK(secp256k1_scalar_eq(&r1, &r2));
341 int bit = secp256k1_rand32() % 256;
343 secp256k1_scalar_set_int(&
b, 1);
344 CHECK(secp256k1_scalar_is_one(&
b));
345 for (
int i = 0; i < bit; i++) {
346 secp256k1_scalar_add(&
b, &
b, &
b);
349 if (!secp256k1_scalar_add(&r1, &r1, &
b)) {
351 secp256k1_scalar_add_bit(&r2, bit);
352 CHECK(secp256k1_scalar_eq(&r1, &r2));
359 secp256k1_scalar_mul(&r1, &s1, &s2);
360 secp256k1_scalar_mul(&r2, &s2, &s1);
361 CHECK(secp256k1_scalar_eq(&r1, &r2));
367 secp256k1_scalar_add(&r1, &s1, &s2);
368 secp256k1_scalar_add(&r1, &r1, &s);
369 secp256k1_scalar_add(&r2, &s2, &s);
370 secp256k1_scalar_add(&r2, &s1, &r2);
371 CHECK(secp256k1_scalar_eq(&r1, &r2));
377 secp256k1_scalar_mul(&r1, &s1, &s2);
378 secp256k1_scalar_mul(&r1, &r1, &s);
379 secp256k1_scalar_mul(&r2, &s2, &s);
380 secp256k1_scalar_mul(&r2, &s1, &r2);
381 CHECK(secp256k1_scalar_eq(&r1, &r2));
387 secp256k1_scalar_add(&r1, &s1, &s2);
388 secp256k1_scalar_mul(&r1, &r1, &s);
389 secp256k1_scalar_mul(&r2, &s1, &s);
390 secp256k1_scalar_mul(&t, &s2, &s);
391 secp256k1_scalar_add(&r2, &r2, &t);
392 CHECK(secp256k1_scalar_eq(&r1, &r2));
398 secp256k1_scalar_sqr(&r1, &s1);
399 secp256k1_scalar_mul(&r2, &s1, &s1);
400 CHECK(secp256k1_scalar_eq(&r1, &r2));
406 for (
int i = 0; i < 128 * count; i++) {
413 secp256k1_scalar_set_int(&s, 1);
414 secp256k1_scalar_negate(&o, &s);
415 secp256k1_scalar_add(&o, &o, &s);
416 CHECK(secp256k1_scalar_is_zero(&o));
423 secp256k1_scalar_order_get_num(&order);
424 unsigned char bin[32];
425 secp256k1_num_get_bin(bin, 32, &order);
428 secp256k1_scalar_set_b32(&zero, bin, &overflow);
429 CHECK(overflow == 1);
430 CHECK(secp256k1_scalar_is_zero(&zero));
438 unsigned char bin[32];
440 secp256k1_rand256(bin);
441 if (secp256k1_fe_set_b32(x, bin)) {
449 while (--tries >= 0) {
451 secp256k1_fe_normalize(nz);
452 if (!secp256k1_fe_is_zero(nz))
462 if (secp256k1_fe_sqrt(&
r, ns)) {
463 secp256k1_fe_negate(ns, ns, 1);
470 return secp256k1_fe_equal(&an, &bn);
481 for (
int i=0; i<10*count; i++) {
483 secp256k1_fe_inv(&xi, &x);
485 secp256k1_fe_inv(&xii, &xi);
492 for (
int i=0; i<10*count; i++) {
494 secp256k1_fe_inv_var(&xi, &x);
496 secp256k1_fe_inv_var(&xii, &xi);
504 secp256k1_fe_inv_all(0, xi, x);
505 for (
int i=0; i<count; i++) {
506 size_t len = (secp256k1_rand32() & 15) + 1;
507 for (
size_t j=0; j<len; j++)
509 secp256k1_fe_inv_all(len, xi, x);
510 for (
size_t j=0; j<len; j++)
512 secp256k1_fe_inv_all(len, xii, xi);
513 for (
size_t j=0; j<len; j++)
521 secp256k1_fe_inv_all_var(0, xi, x);
522 for (
int i=0; i<count; i++) {
523 size_t len = (secp256k1_rand32() & 15) + 1;
524 for (
size_t j=0; j<len; j++)
526 secp256k1_fe_inv_all_var(len, xi, x);
527 for (
size_t j=0; j<len; j++)
529 secp256k1_fe_inv_all_var(len, xii, xi);
530 for (
size_t j=0; j<len; j++)
539 secp256k1_fe_set_int(&x, 1);
540 secp256k1_fe_negate(&x, &x, 1);
542 for (
int i=1; i<=512; ++i) {
543 secp256k1_fe_mul_int(&x, 2);
544 secp256k1_fe_normalize(&x);
545 secp256k1_fe_sqr(&s, &x);
552 int v = secp256k1_fe_sqrt(&r1, a);
553 CHECK((v == 0) == (k == NULL));
557 secp256k1_fe_negate(&r2, &r1, 1);
558 secp256k1_fe_add(&r1, k); secp256k1_fe_add(&r2, k);
559 secp256k1_fe_normalize(&r1); secp256k1_fe_normalize(&r2);
560 CHECK(secp256k1_fe_is_zero(&r1) || secp256k1_fe_is_zero(&r2));
568 secp256k1_fe_set_int(&x, 0);
569 secp256k1_fe_sqr(&s, &x);
573 for (
int i=1; i<=100; i++) {
574 secp256k1_fe_set_int(&x, i);
575 secp256k1_fe_sqr(&s, &x);
577 secp256k1_fe_negate(&t, &s, 1);
582 for (
int i=0; i<10; i++) {
584 for (
int j=0; j<count; j++) {
586 secp256k1_fe_sqr(&s, &x);
588 secp256k1_fe_negate(&t, &s, 1);
590 secp256k1_fe_mul(&t, &s, &ns);
607 secp256k1_ge_set_gej_var(&bb, &bj);
614 secp256k1_ge_set_gej_var(&aa, &aj);
615 secp256k1_ge_set_gej_var(&bb, &bj);
627 secp256k1_ge_get_hex(ca,&rlen,&a);
628 CHECK(rlen > 4 && rlen <= (
int)
sizeof(ca));
630 secp256k1_ge_get_hex(cb,&rlen,&
b);
632 secp256k1_fe_normalize(&a.
y);
633 secp256k1_fe_negate(&n.
y, &a.
y, 1);
634 secp256k1_ge_set_infinity(&i);
645 secp256k1_gej_set_infinity(&ij);
679 CHECK(secp256k1_gej_is_infinity(&an));
680 CHECK(secp256k1_gej_is_infinity(&anj));
681 CHECK(secp256k1_gej_is_infinity(&anc));
699 for (
int i = 0; i < 2000*count; i++) {
708 secp256k1_fe_t ax;
VERIFY_CHECK(secp256k1_fe_set_hex(&ax,
"8b30bbe9ae2a990696b22f670709dff3727fd8bc04d3362c6c7bf458e2846004", 64));
709 secp256k1_fe_t ay;
VERIFY_CHECK(secp256k1_fe_set_hex(&ay,
"a357ae915c4a65281309edf20504740f0eb3343990216b4f81063cb65f2f7e0f", 64));
712 static const unsigned char xni[32] = {
713 0x84, 0xcc, 0x54, 0x52, 0xf7, 0xfd, 0xe1, 0xed,
714 0xb4, 0xd3, 0x8a, 0x8c, 0xe9, 0xb1, 0xb8, 0x4c,
715 0xce, 0xf3, 0x1f, 0x14, 0x6e, 0x56, 0x9b, 0xe9,
716 0x70, 0x5d, 0x35, 0x7a, 0x42, 0x98, 0x54, 0x07
719 secp256k1_scalar_set_b32(&xn, xni, NULL);
720 static const unsigned char gni[32] = {
721 0xa1, 0xe5, 0x8d, 0x22, 0x55, 0x3d, 0xcd, 0x42,
722 0xb2, 0x39, 0x80, 0x62, 0x5d, 0x4c, 0x57, 0xa9,
723 0x6e, 0x93, 0x23, 0xd4, 0x2b, 0x31, 0x52, 0xe5,
724 0xca, 0x2c, 0x39, 0x90, 0xed, 0xc7, 0xc9, 0xde
727 secp256k1_scalar_set_b32(&gn, gni, NULL);
729 static const unsigned char xfi[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x13,0x37};
731 secp256k1_scalar_set_b32(&xf, xfi, NULL);
732 static const unsigned char gfi[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x71,0x13};
734 secp256k1_scalar_set_b32(&gf, gfi, NULL);
737 secp256k1_scalar_set_int(&ae, 1);
739 secp256k1_scalar_set_int(&ge, 0);
742 for (
int i=0; i<200*count; i++) {
744 secp256k1_ecmult(&x, &x, &xn, &gn);
747 secp256k1_scalar_mul(&ae, &ae, &xn);
748 secp256k1_scalar_mul(&ge, &ge, &xn);
749 secp256k1_scalar_add(&ge, &ge, &gn);
751 secp256k1_scalar_mul(&xn, &xn, &xf);
752 secp256k1_scalar_mul(&gn, &gn, &gf);
756 char res[132];
int resl = 132;
757 secp256k1_gej_get_hex(res, &resl, &x);
758 CHECK(strcmp(res,
"(D6E96687F9B10D092A6F35439D86CEBEA4535D0D409F53586440BD74B933E830,B95CBCA2C77DA786539BE8FD53354D2D3B4F566AE658045407ED6015EE1B2A88)") == 0);
763 char res[132];
int resl = 132;
764 char res2[132];
int resl2 = 132;
765 secp256k1_gej_get_hex(res, &resl, &x);
766 secp256k1_gej_get_hex(res2, &resl2, &x2);
767 CHECK(strcmp(res, res2) == 0);
768 CHECK(strlen(res) == 131);
776 secp256k1_scalar_negate(&nx, &x);
778 secp256k1_ecmult(&res1, point, &x, &x);
779 secp256k1_ecmult(&res2, point, &nx, &nx);
780 secp256k1_gej_add_var(&res1, &res1, &res2);
781 CHECK(secp256k1_gej_is_infinity(&res1));
782 CHECK(secp256k1_gej_is_valid(&res1) == 0);
784 secp256k1_ge_set_gej(&res3, &res1);
785 CHECK(secp256k1_ge_is_infinity(&res3));
786 CHECK(secp256k1_ge_is_valid(&res3) == 0);
791 for (
int i=0; i<500; i++) {
793 if (secp256k1_ge_set_xo(&p, &x, 1)) {
794 CHECK(secp256k1_ge_is_valid(&p));
796 secp256k1_gej_set_ge(&j, &p);
797 CHECK(secp256k1_gej_is_valid(&j));
800 secp256k1_fe_sqr(&x, &x);
802 char c[65];
int cl=65;
803 secp256k1_fe_get_hex(c, &cl, &x);
804 CHECK(strcmp(c,
"7603CB59B0EF6C63FE6084792A0C378CDB3233A80F8A9A09A877DEAD31B38C45") == 0);
809 secp256k1_scalar_set_int(&x, 0);
810 secp256k1_scalar_set_int(&two, 2);
812 int bits = secp256k1_ecmult_wnaf(wnaf, number, w);
815 for (
int i=bits-1; i>=0; i--) {
816 secp256k1_scalar_mul(&x, &x, &two);
819 CHECK(zeroes == -1 || zeroes >= w-1);
822 CHECK(v <= (1 << (w-1)) - 1);
823 CHECK(v >= -(1 << (w-1)) - 1);
829 secp256k1_scalar_set_int(&t, v);
831 secp256k1_scalar_set_int(&t, -v);
832 secp256k1_scalar_negate(&t, &t);
834 secp256k1_scalar_add(&x, &x, &t);
836 CHECK(secp256k1_scalar_eq(&x, number));
841 for (
int i=0; i<count; i++) {
844 secp256k1_scalar_negate(&n, &n);
853 }
while(!secp256k1_ecdsa_sig_sign(sig,
key, msg, &nonce, recid));
865 getrec = secp256k1_rand32()&1;
867 if (getrec)
CHECK(recid >= 0 && recid < 4);
868 CHECK(secp256k1_ecdsa_sig_verify(&sig, &pub, &msg));
870 secp256k1_scalar_set_int(&one, 1);
871 secp256k1_scalar_add(&msg, &msg, &one);
872 CHECK(!secp256k1_ecdsa_sig_verify(&sig, &pub, &msg));
876 for (
int i=0; i<10*count; i++) {
882 unsigned char privkey[32];
883 unsigned char message[32];
890 secp256k1_scalar_get_b32(privkey, &
key);
891 secp256k1_scalar_get_b32(message, &msg);
896 unsigned char pubkey[65];
int pubkeylen = 65;
901 unsigned char seckey[300];
int seckeylen = 300;
903 unsigned char privkey2[32];
905 CHECK(memcmp(privkey, privkey2, 32) == 0);
908 if (secp256k1_rand32() % 3 == 0) {
909 unsigned char rnd[32];
910 secp256k1_rand256_test(rnd);
914 if (ret1 == 0)
return;
915 unsigned char pubkey2[65];
int pubkeylen2 = 65;
917 CHECK(memcmp(pubkey, pubkey2, pubkeylen) == 0);
921 if (secp256k1_rand32() % 3 == 0) {
922 unsigned char rnd[32];
923 secp256k1_rand256_test(rnd);
927 if (ret1 == 0)
return;
928 unsigned char pubkey2[65];
int pubkeylen2 = 65;
930 CHECK(memcmp(pubkey, pubkey2, pubkeylen) == 0);
934 unsigned char signature[72];
int signaturelen = 72;
936 unsigned char rnd[32];
937 secp256k1_rand256_test(rnd);
945 signature[signaturelen - 1 - secp256k1_rand32() % 20] += 1 + (secp256k1_rand32() % 255);
949 unsigned char csignature[64];
int recid = 0;
951 unsigned char rnd[32];
952 secp256k1_rand256_test(rnd);
958 unsigned char recpubkey[65];
int recpubkeylen = 0;
960 CHECK(recpubkeylen == pubkeylen);
961 CHECK(memcmp(pubkey, recpubkey, pubkeylen) == 0);
963 csignature[secp256k1_rand32() % 64] += 1 + (secp256k1_rand32() % 255);
965 memcmp(pubkey, recpubkey, pubkeylen) != 0);
966 CHECK(recpubkeylen == pubkeylen);
971 for (
int i=0; i<64*count; i++) {
978 const unsigned char msg32[32] = {
979 'T',
'h',
'i',
's',
' ',
'i',
's',
' ',
980 'a',
' ',
'v',
'e',
'r',
'y',
' ',
's',
981 'e',
'c',
'r',
'e',
't',
' ',
'm',
'e',
982 's',
's',
'a',
'g',
'e',
'.',
'.',
'.'
984 const unsigned char sig64[64] = {
987 0x67, 0xCB, 0x28, 0x5F, 0x9C, 0xD1, 0x94, 0xE8,
988 0x40, 0xD6, 0x29, 0x39, 0x7A, 0xF5, 0x56, 0x96,
989 0x62, 0xFD, 0xE4, 0x46, 0x49, 0x99, 0x59, 0x63,
990 0x17, 0x9A, 0x7D, 0xD1, 0x7B, 0xD2, 0x35, 0x32,
991 0x4B, 0x1B, 0x7D, 0xF3, 0x4C, 0xE1, 0xF6, 0x8E,
992 0x69, 0x4F, 0xF6, 0xF1, 0x1A, 0xC7, 0x51, 0xDD,
993 0x7D, 0xD7, 0x3E, 0x38, 0x7E, 0xE4, 0xFC, 0x86,
994 0x6E, 0x1B, 0xE8, 0xEC, 0xC7, 0xDD, 0x95, 0x57
996 unsigned char pubkey[65];
1004 const unsigned char sigb64[64] = {
1005 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1006 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1007 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1008 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
1009 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1010 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1011 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1012 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
1014 unsigned char pubkeyb[33];
1015 int pubkeyblen = 33;
1016 for (
int recid = 0; recid < 4; recid++) {
1018 unsigned char sigbder[8] = {0x30, 0x06, 0x02, 0x01, 0x04, 0x02, 0x01, 0x04};
1020 unsigned char sigbderlong[40] = {
1021 0x30, 0x26, 0x02, 0x21, 0x00, 0xFF, 0xFF, 0xFF,
1022 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1023 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC,
1024 0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E,
1025 0x8C, 0xD0, 0x36, 0x41, 0x45, 0x02, 0x01, 0x04
1029 for (
int recid2 = 0; recid2 < 4; recid2++) {
1030 unsigned char pubkey2b[33];
1031 int pubkey2blen = 33;
1044 secp256k1_scalar_set_int(&sig.
s, 1);
1045 secp256k1_scalar_negate(&sig.
s, &sig.
s);
1046 secp256k1_scalar_inverse(&sig.
s, &sig.
s);
1047 secp256k1_scalar_set_int(&sig.
r, 1);
1049 secp256k1_ecmult_gen(&keyj, &sig.
r);
1051 secp256k1_ge_set_gej(&
key, &keyj);
1053 CHECK(secp256k1_ecdsa_sig_verify(&sig, &
key, &msg) == 0);
1059 unsigned char sigcder[8] = {0x30, 0x06, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01};
1060 unsigned char sigc64[64] = {
1061 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1062 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1063 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1064 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1065 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1066 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1067 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1068 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1070 unsigned char pubkeyc[65];
1071 int pubkeyclen = 65;
1091 #ifdef ENABLE_OPENSSL_TESTS
1093 unsigned char privkey[300];
1095 int compr = secp256k1_rand32() & 1;
1096 const unsigned char* pbegin = privkey;
1097 EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1);
1098 CHECK(secp256k1_eckey_privkey_serialize(privkey, &privkeylen,
key, compr));
1099 CHECK(d2i_ECPrivateKey(&ec_key, &pbegin, privkeylen));
1100 CHECK(EC_KEY_check_key(ec_key));
1104 void test_ecdsa_openssl(
void) {
1106 unsigned char message[32];
1107 secp256k1_rand256_test(message);
1108 secp256k1_scalar_set_b32(&msg, message, NULL);
1111 secp256k1_ecmult_gen(&qj, &
key);
1113 secp256k1_ge_set_gej(&q, &qj);
1114 EC_KEY *ec_key = get_openssl_key(&
key);
1116 unsigned char signature[80];
1117 unsigned int sigsize = 80;
1118 CHECK(ECDSA_sign(0, message,
sizeof(message), signature, &sigsize, ec_key));
1120 CHECK(secp256k1_ecdsa_sig_parse(&sig, signature, sigsize));
1121 CHECK(secp256k1_ecdsa_sig_verify(&sig, &q, &msg));
1123 secp256k1_scalar_set_int(&one, 1);
1125 secp256k1_scalar_add(&msg2, &msg, &one);
1126 CHECK(!secp256k1_ecdsa_sig_verify(&sig, &q, &msg2));
1129 int secp_sigsize = 80;
1130 CHECK(secp256k1_ecdsa_sig_serialize(signature, &secp_sigsize, &sig));
1131 CHECK(ECDSA_verify(0, message,
sizeof(message), signature, secp_sigsize, ec_key) == 1);
1133 EC_KEY_free(ec_key);
1136 void run_ecdsa_openssl(
void) {
1137 for (
int i=0; i<10*count; i++) {
1138 test_ecdsa_openssl();
1146 count = strtol(argv[1], NULL, 0);
1152 seed = strtoull(argv[2], NULL, 0);
1154 FILE *frand =
fopen(
"/dev/urandom",
"r");
1155 if (!frand || !fread(&seed,
sizeof(seed), 1, frand)) {
1156 seed = time(NULL) * 1337;
1160 secp256k1_rand_seed(seed);
1162 printf(
"test count = %i\n", count);
1163 printf(
"random seed = %llu\n", (
unsigned long long)seed);
1172 secp256k1_fe_start();
1173 secp256k1_ge_start();
1174 secp256k1_scalar_start();
1175 secp256k1_ecdsa_start();
1177 #ifndef USE_NUM_NONE
1205 #ifdef ENABLE_OPENSSL_TESTS
1206 run_ecdsa_openssl();
1209 printf(
"random run = %llu\n", (
unsigned long long)secp256k1_rand32() + ((
unsigned long long)secp256k1_rand32() << 32));
1218 secp256k1_fe_stop();
1219 secp256k1_ge_stop();
1220 secp256k1_scalar_stop();
1221 secp256k1_ecdsa_stop();