@@ -64,48 +64,83 @@ static const secp256k1_ge secp256k1_ge_const_g = SECP256K1_G;
64
64
static const secp256k1_fe secp256k1_fe_const_b = SECP256K1_FE_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 );
65
65
#endif
66
66
67
+ #ifdef VERIFY
68
+ static void secp256k1_ge_verify (const secp256k1_ge * a ) {
69
+ (void )a ;
70
+ }
71
+
72
+ static void secp256k1_gej_verify (const secp256k1_gej * a ) {
73
+ (void )a ;
74
+ }
75
+ #endif
76
+
77
+ #define VERIFY_GE (ge ) VERIFY_SETUP(secp256k1_ge_verify(ge))
78
+ #define VERIFY_GEJ (gej ) VERIFY_SETUP(secp256k1_gej_verify(gej))
79
+
67
80
static void secp256k1_ge_set_gej_zinv (secp256k1_ge * r , const secp256k1_gej * a , const secp256k1_fe * zi ) {
68
81
secp256k1_fe zi2 ;
69
82
secp256k1_fe zi3 ;
70
83
VERIFY_CHECK (!a -> infinity );
84
+ VERIFY_GEJ (a );
85
+
71
86
secp256k1_fe_sqr (& zi2 , zi );
72
87
secp256k1_fe_mul (& zi3 , & zi2 , zi );
73
88
secp256k1_fe_mul (& r -> x , & a -> x , & zi2 );
74
89
secp256k1_fe_mul (& r -> y , & a -> y , & zi3 );
75
90
r -> infinity = a -> infinity ;
91
+
92
+ VERIFY_GE (r );
76
93
}
77
94
78
95
static void secp256k1_ge_set_xy (secp256k1_ge * r , const secp256k1_fe * x , const secp256k1_fe * y ) {
79
96
r -> infinity = 0 ;
80
97
r -> x = * x ;
81
98
r -> y = * y ;
99
+
100
+ VERIFY_GE (r );
82
101
}
83
102
84
103
static int secp256k1_ge_is_infinity (const secp256k1_ge * a ) {
104
+ VERIFY_GE (a );
85
105
return a -> infinity ;
86
106
}
87
107
88
108
static void secp256k1_ge_neg (secp256k1_ge * r , const secp256k1_ge * a ) {
109
+ VERIFY_GE (a );
110
+
89
111
* r = * a ;
90
112
secp256k1_fe_normalize_weak (& r -> y );
91
113
secp256k1_fe_negate (& r -> y , & r -> y , 1 );
114
+
115
+ VERIFY_GE (r );
92
116
}
93
117
94
118
static void secp256k1_ge_set_gej (secp256k1_ge * r , secp256k1_gej * a ) {
95
119
secp256k1_fe z2 , z3 ;
96
- r -> infinity = a -> infinity ;
120
+
121
+ VERIFY_GEJ (a );
122
+
97
123
secp256k1_fe_inv (& a -> z , & a -> z );
98
124
secp256k1_fe_sqr (& z2 , & a -> z );
99
125
secp256k1_fe_mul (& z3 , & a -> z , & z2 );
100
126
secp256k1_fe_mul (& a -> x , & a -> x , & z2 );
101
127
secp256k1_fe_mul (& a -> y , & a -> y , & z3 );
102
128
secp256k1_fe_set_int (& a -> z , 1 );
129
+
130
+ VERIFY_GEJ (a );
131
+
132
+ r -> infinity = a -> infinity ;
103
133
r -> x = a -> x ;
104
134
r -> y = a -> y ;
135
+
136
+ VERIFY_GE (r );
105
137
}
106
138
107
139
static void secp256k1_ge_set_gej_var (secp256k1_ge * r , secp256k1_gej * a ) {
108
140
secp256k1_fe z2 , z3 ;
141
+
142
+ VERIFY_GEJ (a );
143
+
109
144
if (a -> infinity ) {
110
145
secp256k1_ge_set_infinity (r );
111
146
return ;
@@ -116,6 +151,9 @@ static void secp256k1_ge_set_gej_var(secp256k1_ge *r, secp256k1_gej *a) {
116
151
secp256k1_fe_mul (& a -> x , & a -> x , & z2 );
117
152
secp256k1_fe_mul (& a -> y , & a -> y , & z3 );
118
153
secp256k1_fe_set_int (& a -> z , 1 );
154
+
155
+ VERIFY_GEJ (a );
156
+
119
157
secp256k1_ge_set_xy (r , & a -> x , & a -> y );
120
158
}
121
159
@@ -125,6 +163,8 @@ static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a
125
163
size_t last_i = SIZE_MAX ;
126
164
127
165
for (i = 0 ; i < len ; i ++ ) {
166
+ VERIFY_GEJ (& a [i ]);
167
+
128
168
if (a [i ].infinity ) {
129
169
secp256k1_ge_set_infinity (& r [i ]);
130
170
} else {
@@ -168,6 +208,8 @@ static void secp256k1_ge_table_set_globalz(size_t len, secp256k1_ge *a, const se
168
208
if (len > 0 ) {
169
209
/* Ensure all y values are in weak normal form for fast negation of points */
170
210
secp256k1_fe_normalize_weak (& a [i ].y );
211
+ VERIFY_GE (& a [i ]);
212
+
171
213
zs = zr [i ];
172
214
173
215
/* Work our way backwards, using the z-ratios to scale the x/y values. */
@@ -190,25 +232,33 @@ static void secp256k1_gej_set_infinity(secp256k1_gej *r) {
190
232
secp256k1_fe_clear (& r -> x );
191
233
secp256k1_fe_clear (& r -> y );
192
234
secp256k1_fe_clear (& r -> z );
235
+
236
+ VERIFY_GEJ (r );
193
237
}
194
238
195
239
static void secp256k1_ge_set_infinity (secp256k1_ge * r ) {
196
240
r -> infinity = 1 ;
197
241
secp256k1_fe_clear (& r -> x );
198
242
secp256k1_fe_clear (& r -> y );
243
+
244
+ VERIFY_GE (r );
199
245
}
200
246
201
247
static void secp256k1_gej_clear (secp256k1_gej * r ) {
202
248
r -> infinity = 0 ;
203
249
secp256k1_fe_clear (& r -> x );
204
250
secp256k1_fe_clear (& r -> y );
205
251
secp256k1_fe_clear (& r -> z );
252
+
253
+ VERIFY_GEJ (r );
206
254
}
207
255
208
256
static void secp256k1_ge_clear (secp256k1_ge * r ) {
209
257
r -> infinity = 0 ;
210
258
secp256k1_fe_clear (& r -> x );
211
259
secp256k1_fe_clear (& r -> y );
260
+
261
+ VERIFY_GE (r );
212
262
}
213
263
214
264
static int secp256k1_ge_set_xo_var (secp256k1_ge * r , const secp256k1_fe * x , int odd ) {
@@ -225,40 +275,56 @@ static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int o
225
275
if (secp256k1_fe_is_odd (& r -> y ) != odd ) {
226
276
secp256k1_fe_negate (& r -> y , & r -> y , 1 );
227
277
}
228
- return 1 ;
229
278
279
+ VERIFY_GE (r );
280
+ return 1 ;
230
281
}
231
282
232
283
static void secp256k1_gej_set_ge (secp256k1_gej * r , const secp256k1_ge * a ) {
233
- r -> infinity = a -> infinity ;
234
- r -> x = a -> x ;
235
- r -> y = a -> y ;
236
- secp256k1_fe_set_int (& r -> z , 1 );
284
+ VERIFY_GE (a );
285
+
286
+ r -> infinity = a -> infinity ;
287
+ r -> x = a -> x ;
288
+ r -> y = a -> y ;
289
+ secp256k1_fe_set_int (& r -> z , 1 );
290
+
291
+ VERIFY_GEJ (r );
237
292
}
238
293
239
294
static int secp256k1_gej_eq_x_var (const secp256k1_fe * x , const secp256k1_gej * a ) {
240
295
secp256k1_fe r , r2 ;
296
+
297
+ VERIFY_GEJ (a );
241
298
VERIFY_CHECK (!a -> infinity );
299
+
242
300
secp256k1_fe_sqr (& r , & a -> z ); secp256k1_fe_mul (& r , & r , x );
243
301
r2 = a -> x ; secp256k1_fe_normalize_weak (& r2 );
244
302
return secp256k1_fe_equal_var (& r , & r2 );
245
303
}
246
304
247
305
static void secp256k1_gej_neg (secp256k1_gej * r , const secp256k1_gej * a ) {
306
+ VERIFY_GEJ (a );
307
+
248
308
r -> infinity = a -> infinity ;
249
309
r -> x = a -> x ;
250
310
r -> y = a -> y ;
251
311
r -> z = a -> z ;
252
312
secp256k1_fe_normalize_weak (& r -> y );
253
313
secp256k1_fe_negate (& r -> y , & r -> y , 1 );
314
+
315
+ VERIFY_GEJ (r );
254
316
}
255
317
256
318
static int secp256k1_gej_is_infinity (const secp256k1_gej * a ) {
319
+ VERIFY_GEJ (a );
257
320
return a -> infinity ;
258
321
}
259
322
260
323
static int secp256k1_ge_is_valid_var (const secp256k1_ge * a ) {
261
324
secp256k1_fe y2 , x3 ;
325
+
326
+ VERIFY_GE (a );
327
+
262
328
if (a -> infinity ) {
263
329
return 0 ;
264
330
}
@@ -274,6 +340,8 @@ static SECP256K1_INLINE void secp256k1_gej_double(secp256k1_gej *r, const secp25
274
340
/* Operations: 3 mul, 4 sqr, 8 add/half/mul_int/negate */
275
341
secp256k1_fe l , s , t ;
276
342
343
+ VERIFY_GEJ (a );
344
+
277
345
r -> infinity = a -> infinity ;
278
346
279
347
/* Formula used:
@@ -300,6 +368,8 @@ static SECP256K1_INLINE void secp256k1_gej_double(secp256k1_gej *r, const secp25
300
368
secp256k1_fe_mul (& r -> y , & t , & l ); /* Y3 = L*(X3 + T) (1) */
301
369
secp256k1_fe_add (& r -> y , & s ); /* Y3 = L*(X3 + T) + S^2 (2) */
302
370
secp256k1_fe_negate (& r -> y , & r -> y , 2 ); /* Y3 = -(L*(X3 + T) + S^2) (3) */
371
+
372
+ VERIFY_GEJ (r );
303
373
}
304
374
305
375
static void secp256k1_gej_double_var (secp256k1_gej * r , const secp256k1_gej * a , secp256k1_fe * rzr ) {
@@ -313,6 +383,8 @@ static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, s
313
383
* the infinity flag even though the point doubles to infinity, and the result
314
384
* point will be gibberish (z = 0 but infinity = 0).
315
385
*/
386
+ VERIFY_GEJ (a );
387
+
316
388
if (a -> infinity ) {
317
389
secp256k1_gej_set_infinity (r );
318
390
if (rzr != NULL ) {
@@ -333,6 +405,9 @@ static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, cons
333
405
/* 12 mul, 4 sqr, 11 add/negate/normalizes_to_zero (ignoring special cases) */
334
406
secp256k1_fe z22 , z12 , u1 , u2 , s1 , s2 , h , i , h2 , h3 , t ;
335
407
408
+ VERIFY_GEJ (a );
409
+ VERIFY_GEJ (b );
410
+
336
411
if (a -> infinity ) {
337
412
VERIFY_CHECK (rzr == NULL );
338
413
* r = * b ;
@@ -387,11 +462,17 @@ static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, cons
387
462
secp256k1_fe_mul (& r -> y , & t , & i );
388
463
secp256k1_fe_mul (& h3 , & h3 , & s1 );
389
464
secp256k1_fe_add (& r -> y , & h3 );
465
+
466
+ VERIFY_GEJ (r );
390
467
}
391
468
392
469
static void secp256k1_gej_add_ge_var (secp256k1_gej * r , const secp256k1_gej * a , const secp256k1_ge * b , secp256k1_fe * rzr ) {
393
470
/* 8 mul, 3 sqr, 13 add/negate/normalize_weak/normalizes_to_zero (ignoring special cases) */
394
471
secp256k1_fe z12 , u1 , u2 , s1 , s2 , h , i , h2 , h3 , t ;
472
+
473
+ VERIFY_GEJ (a );
474
+ VERIFY_GE (b );
475
+
395
476
if (a -> infinity ) {
396
477
VERIFY_CHECK (rzr == NULL );
397
478
secp256k1_gej_set_ge (r , b );
@@ -444,12 +525,17 @@ static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, c
444
525
secp256k1_fe_mul (& r -> y , & t , & i );
445
526
secp256k1_fe_mul (& h3 , & h3 , & s1 );
446
527
secp256k1_fe_add (& r -> y , & h3 );
528
+
529
+ VERIFY_GEJ (r );
447
530
}
448
531
449
532
static void secp256k1_gej_add_zinv_var (secp256k1_gej * r , const secp256k1_gej * a , const secp256k1_ge * b , const secp256k1_fe * bzinv ) {
450
533
/* 9 mul, 3 sqr, 13 add/negate/normalize_weak/normalizes_to_zero (ignoring special cases) */
451
534
secp256k1_fe az , z12 , u1 , u2 , s1 , s2 , h , i , h2 , h3 , t ;
452
535
536
+ VERIFY_GEJ (a );
537
+ VERIFY_GE (b );
538
+
453
539
if (a -> infinity ) {
454
540
secp256k1_fe bzinv2 , bzinv3 ;
455
541
r -> infinity = b -> infinity ;
@@ -458,6 +544,7 @@ static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a,
458
544
secp256k1_fe_mul (& r -> x , & b -> x , & bzinv2 );
459
545
secp256k1_fe_mul (& r -> y , & b -> y , & bzinv3 );
460
546
secp256k1_fe_set_int (& r -> z , 1 );
547
+ VERIFY_GEJ (r );
461
548
return ;
462
549
}
463
550
if (b -> infinity ) {
@@ -508,14 +595,18 @@ static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a,
508
595
secp256k1_fe_mul (& r -> y , & t , & i );
509
596
secp256k1_fe_mul (& h3 , & h3 , & s1 );
510
597
secp256k1_fe_add (& r -> y , & h3 );
511
- }
512
598
599
+ VERIFY_GEJ (r );
600
+ }
513
601
514
602
static void secp256k1_gej_add_ge (secp256k1_gej * r , const secp256k1_gej * a , const secp256k1_ge * b ) {
515
603
/* Operations: 7 mul, 5 sqr, 24 add/cmov/half/mul_int/negate/normalize_weak/normalizes_to_zero */
516
604
secp256k1_fe zz , u1 , u2 , s1 , s2 , t , tt , m , n , q , rr ;
517
605
secp256k1_fe m_alt , rr_alt ;
518
606
int infinity , degenerate ;
607
+
608
+ VERIFY_GEJ (a );
609
+ VERIFY_GE (b );
519
610
VERIFY_CHECK (!b -> infinity );
520
611
VERIFY_CHECK (a -> infinity == 0 || a -> infinity == 1 );
521
612
@@ -626,21 +717,27 @@ static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const
626
717
secp256k1_fe_cmov (& r -> y , & b -> y , a -> infinity );
627
718
secp256k1_fe_cmov (& r -> z , & secp256k1_fe_one , a -> infinity );
628
719
r -> infinity = infinity ;
720
+
721
+ VERIFY_GEJ (r );
629
722
}
630
723
631
724
static void secp256k1_gej_rescale (secp256k1_gej * r , const secp256k1_fe * s ) {
632
725
/* Operations: 4 mul, 1 sqr */
633
726
secp256k1_fe zz ;
727
+ VERIFY_GEJ (r );
634
728
VERIFY_CHECK (!secp256k1_fe_is_zero (s ));
635
729
secp256k1_fe_sqr (& zz , s );
636
730
secp256k1_fe_mul (& r -> x , & r -> x , & zz ); /* r->x *= s^2 */
637
731
secp256k1_fe_mul (& r -> y , & r -> y , & zz );
638
732
secp256k1_fe_mul (& r -> y , & r -> y , s ); /* r->y *= s^3 */
639
733
secp256k1_fe_mul (& r -> z , & r -> z , s ); /* r->z *= s */
734
+
735
+ VERIFY_GEJ (r );
640
736
}
641
737
642
738
static void secp256k1_ge_to_storage (secp256k1_ge_storage * r , const secp256k1_ge * a ) {
643
739
secp256k1_fe x , y ;
740
+ VERIFY_GE (a );
644
741
VERIFY_CHECK (!a -> infinity );
645
742
x = a -> x ;
646
743
secp256k1_fe_normalize (& x );
@@ -654,14 +751,21 @@ static void secp256k1_ge_from_storage(secp256k1_ge *r, const secp256k1_ge_storag
654
751
secp256k1_fe_from_storage (& r -> x , & a -> x );
655
752
secp256k1_fe_from_storage (& r -> y , & a -> y );
656
753
r -> infinity = 0 ;
754
+
755
+ VERIFY_GE (r );
657
756
}
658
757
659
758
static SECP256K1_INLINE void secp256k1_gej_cmov (secp256k1_gej * r , const secp256k1_gej * a , int flag ) {
759
+ VERIFY_GEJ (r );
760
+ VERIFY_GEJ (a );
761
+
660
762
secp256k1_fe_cmov (& r -> x , & a -> x , flag );
661
763
secp256k1_fe_cmov (& r -> y , & a -> y , flag );
662
764
secp256k1_fe_cmov (& r -> z , & a -> z , flag );
663
765
664
766
r -> infinity ^= (r -> infinity ^ a -> infinity ) & flag ;
767
+
768
+ VERIFY_GEJ (r );
665
769
}
666
770
667
771
static SECP256K1_INLINE void secp256k1_ge_storage_cmov (secp256k1_ge_storage * r , const secp256k1_ge_storage * a , int flag ) {
@@ -672,13 +776,17 @@ static SECP256K1_INLINE void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r,
672
776
static void secp256k1_ge_mul_lambda (secp256k1_ge * r , const secp256k1_ge * a ) {
673
777
* r = * a ;
674
778
secp256k1_fe_mul (& r -> x , & r -> x , & secp256k1_const_beta );
779
+
780
+ VERIFY_GE (r );
675
781
}
676
782
677
783
static int secp256k1_ge_is_in_correct_subgroup (const secp256k1_ge * ge ) {
678
784
#ifdef EXHAUSTIVE_TEST_ORDER
679
785
secp256k1_gej out ;
680
786
int i ;
681
787
788
+ VERIFY_GE (ge );
789
+
682
790
/* A very simple EC multiplication ladder that avoids a dependency on ecmult. */
683
791
secp256k1_gej_set_infinity (& out );
684
792
for (i = 0 ; i < 32 ; ++ i ) {
@@ -689,6 +797,7 @@ static int secp256k1_ge_is_in_correct_subgroup(const secp256k1_ge* ge) {
689
797
}
690
798
return secp256k1_gej_is_infinity (& out );
691
799
#else
800
+ VERIFY_GE (ge );
692
801
(void )ge ;
693
802
/* The real secp256k1 group has cofactor 1, so the subgroup is the entire curve. */
694
803
return 1 ;
0 commit comments