@@ -64,48 +64,83 @@ static const secp256k1_ge secp256k1_ge_const_g = SECP256K1_G;
6464static const secp256k1_fe secp256k1_fe_const_b = SECP256K1_FE_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 );
6565#endif
6666
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+
6780static void secp256k1_ge_set_gej_zinv (secp256k1_ge * r , const secp256k1_gej * a , const secp256k1_fe * zi ) {
6881 secp256k1_fe zi2 ;
6982 secp256k1_fe zi3 ;
7083 VERIFY_CHECK (!a -> infinity );
84+ VERIFY_GEJ (a );
85+
7186 secp256k1_fe_sqr (& zi2 , zi );
7287 secp256k1_fe_mul (& zi3 , & zi2 , zi );
7388 secp256k1_fe_mul (& r -> x , & a -> x , & zi2 );
7489 secp256k1_fe_mul (& r -> y , & a -> y , & zi3 );
7590 r -> infinity = a -> infinity ;
91+
92+ VERIFY_GE (r );
7693}
7794
7895static void secp256k1_ge_set_xy (secp256k1_ge * r , const secp256k1_fe * x , const secp256k1_fe * y ) {
7996 r -> infinity = 0 ;
8097 r -> x = * x ;
8198 r -> y = * y ;
99+
100+ VERIFY_GE (r );
82101}
83102
84103static int secp256k1_ge_is_infinity (const secp256k1_ge * a ) {
104+ VERIFY_GE (a );
85105 return a -> infinity ;
86106}
87107
88108static void secp256k1_ge_neg (secp256k1_ge * r , const secp256k1_ge * a ) {
109+ VERIFY_GE (a );
110+
89111 * r = * a ;
90112 secp256k1_fe_normalize_weak (& r -> y );
91113 secp256k1_fe_negate (& r -> y , & r -> y , 1 );
114+
115+ VERIFY_GE (r );
92116}
93117
94118static void secp256k1_ge_set_gej (secp256k1_ge * r , secp256k1_gej * a ) {
95119 secp256k1_fe z2 , z3 ;
96- r -> infinity = a -> infinity ;
120+
121+ VERIFY_GEJ (a );
122+
97123 secp256k1_fe_inv (& a -> z , & a -> z );
98124 secp256k1_fe_sqr (& z2 , & a -> z );
99125 secp256k1_fe_mul (& z3 , & a -> z , & z2 );
100126 secp256k1_fe_mul (& a -> x , & a -> x , & z2 );
101127 secp256k1_fe_mul (& a -> y , & a -> y , & z3 );
102128 secp256k1_fe_set_int (& a -> z , 1 );
129+
130+ VERIFY_GEJ (a );
131+
132+ r -> infinity = a -> infinity ;
103133 r -> x = a -> x ;
104134 r -> y = a -> y ;
135+
136+ VERIFY_GE (r );
105137}
106138
107139static void secp256k1_ge_set_gej_var (secp256k1_ge * r , secp256k1_gej * a ) {
108140 secp256k1_fe z2 , z3 ;
141+
142+ VERIFY_GEJ (a );
143+
109144 if (a -> infinity ) {
110145 secp256k1_ge_set_infinity (r );
111146 return ;
@@ -116,6 +151,9 @@ static void secp256k1_ge_set_gej_var(secp256k1_ge *r, secp256k1_gej *a) {
116151 secp256k1_fe_mul (& a -> x , & a -> x , & z2 );
117152 secp256k1_fe_mul (& a -> y , & a -> y , & z3 );
118153 secp256k1_fe_set_int (& a -> z , 1 );
154+
155+ VERIFY_GEJ (a );
156+
119157 secp256k1_ge_set_xy (r , & a -> x , & a -> y );
120158}
121159
@@ -125,6 +163,8 @@ static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a
125163 size_t last_i = SIZE_MAX ;
126164
127165 for (i = 0 ; i < len ; i ++ ) {
166+ VERIFY_GEJ (& a [i ]);
167+
128168 if (a [i ].infinity ) {
129169 secp256k1_ge_set_infinity (& r [i ]);
130170 } else {
@@ -168,6 +208,8 @@ static void secp256k1_ge_table_set_globalz(size_t len, secp256k1_ge *a, const se
168208 if (len > 0 ) {
169209 /* Ensure all y values are in weak normal form for fast negation of points */
170210 secp256k1_fe_normalize_weak (& a [i ].y );
211+ VERIFY_GE (& a [i ]);
212+
171213 zs = zr [i ];
172214
173215 /* 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) {
190232 secp256k1_fe_clear (& r -> x );
191233 secp256k1_fe_clear (& r -> y );
192234 secp256k1_fe_clear (& r -> z );
235+
236+ VERIFY_GEJ (r );
193237}
194238
195239static void secp256k1_ge_set_infinity (secp256k1_ge * r ) {
196240 r -> infinity = 1 ;
197241 secp256k1_fe_clear (& r -> x );
198242 secp256k1_fe_clear (& r -> y );
243+
244+ VERIFY_GE (r );
199245}
200246
201247static void secp256k1_gej_clear (secp256k1_gej * r ) {
202248 r -> infinity = 0 ;
203249 secp256k1_fe_clear (& r -> x );
204250 secp256k1_fe_clear (& r -> y );
205251 secp256k1_fe_clear (& r -> z );
252+
253+ VERIFY_GEJ (r );
206254}
207255
208256static void secp256k1_ge_clear (secp256k1_ge * r ) {
209257 r -> infinity = 0 ;
210258 secp256k1_fe_clear (& r -> x );
211259 secp256k1_fe_clear (& r -> y );
260+
261+ VERIFY_GE (r );
212262}
213263
214264static 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
225275 if (secp256k1_fe_is_odd (& r -> y ) != odd ) {
226276 secp256k1_fe_negate (& r -> y , & r -> y , 1 );
227277 }
228- return 1 ;
229278
279+ VERIFY_GE (r );
280+ return 1 ;
230281}
231282
232283static 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 );
237292}
238293
239294static int secp256k1_gej_eq_x_var (const secp256k1_fe * x , const secp256k1_gej * a ) {
240295 secp256k1_fe r , r2 ;
296+
297+ VERIFY_GEJ (a );
241298 VERIFY_CHECK (!a -> infinity );
299+
242300 secp256k1_fe_sqr (& r , & a -> z ); secp256k1_fe_mul (& r , & r , x );
243301 r2 = a -> x ; secp256k1_fe_normalize_weak (& r2 );
244302 return secp256k1_fe_equal_var (& r , & r2 );
245303}
246304
247305static void secp256k1_gej_neg (secp256k1_gej * r , const secp256k1_gej * a ) {
306+ VERIFY_GEJ (a );
307+
248308 r -> infinity = a -> infinity ;
249309 r -> x = a -> x ;
250310 r -> y = a -> y ;
251311 r -> z = a -> z ;
252312 secp256k1_fe_normalize_weak (& r -> y );
253313 secp256k1_fe_negate (& r -> y , & r -> y , 1 );
314+
315+ VERIFY_GEJ (r );
254316}
255317
256318static int secp256k1_gej_is_infinity (const secp256k1_gej * a ) {
319+ VERIFY_GEJ (a );
257320 return a -> infinity ;
258321}
259322
260323static int secp256k1_ge_is_valid_var (const secp256k1_ge * a ) {
261324 secp256k1_fe y2 , x3 ;
325+
326+ VERIFY_GE (a );
327+
262328 if (a -> infinity ) {
263329 return 0 ;
264330 }
@@ -274,6 +340,8 @@ static SECP256K1_INLINE void secp256k1_gej_double(secp256k1_gej *r, const secp25
274340 /* Operations: 3 mul, 4 sqr, 8 add/half/mul_int/negate */
275341 secp256k1_fe l , s , t ;
276342
343+ VERIFY_GEJ (a );
344+
277345 r -> infinity = a -> infinity ;
278346
279347 /* Formula used:
@@ -300,6 +368,8 @@ static SECP256K1_INLINE void secp256k1_gej_double(secp256k1_gej *r, const secp25
300368 secp256k1_fe_mul (& r -> y , & t , & l ); /* Y3 = L*(X3 + T) (1) */
301369 secp256k1_fe_add (& r -> y , & s ); /* Y3 = L*(X3 + T) + S^2 (2) */
302370 secp256k1_fe_negate (& r -> y , & r -> y , 2 ); /* Y3 = -(L*(X3 + T) + S^2) (3) */
371+
372+ VERIFY_GEJ (r );
303373}
304374
305375static 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
313383 * the infinity flag even though the point doubles to infinity, and the result
314384 * point will be gibberish (z = 0 but infinity = 0).
315385 */
386+ VERIFY_GEJ (a );
387+
316388 if (a -> infinity ) {
317389 secp256k1_gej_set_infinity (r );
318390 if (rzr != NULL ) {
@@ -333,6 +405,9 @@ static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, cons
333405 /* 12 mul, 4 sqr, 11 add/negate/normalizes_to_zero (ignoring special cases) */
334406 secp256k1_fe z22 , z12 , u1 , u2 , s1 , s2 , h , i , h2 , h3 , t ;
335407
408+ VERIFY_GEJ (a );
409+ VERIFY_GEJ (b );
410+
336411 if (a -> infinity ) {
337412 VERIFY_CHECK (rzr == NULL );
338413 * r = * b ;
@@ -387,11 +462,17 @@ static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, cons
387462 secp256k1_fe_mul (& r -> y , & t , & i );
388463 secp256k1_fe_mul (& h3 , & h3 , & s1 );
389464 secp256k1_fe_add (& r -> y , & h3 );
465+
466+ VERIFY_GEJ (r );
390467}
391468
392469static void secp256k1_gej_add_ge_var (secp256k1_gej * r , const secp256k1_gej * a , const secp256k1_ge * b , secp256k1_fe * rzr ) {
393470 /* 8 mul, 3 sqr, 13 add/negate/normalize_weak/normalizes_to_zero (ignoring special cases) */
394471 secp256k1_fe z12 , u1 , u2 , s1 , s2 , h , i , h2 , h3 , t ;
472+
473+ VERIFY_GEJ (a );
474+ VERIFY_GE (b );
475+
395476 if (a -> infinity ) {
396477 VERIFY_CHECK (rzr == NULL );
397478 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
444525 secp256k1_fe_mul (& r -> y , & t , & i );
445526 secp256k1_fe_mul (& h3 , & h3 , & s1 );
446527 secp256k1_fe_add (& r -> y , & h3 );
528+
529+ VERIFY_GEJ (r );
447530}
448531
449532static void secp256k1_gej_add_zinv_var (secp256k1_gej * r , const secp256k1_gej * a , const secp256k1_ge * b , const secp256k1_fe * bzinv ) {
450533 /* 9 mul, 3 sqr, 13 add/negate/normalize_weak/normalizes_to_zero (ignoring special cases) */
451534 secp256k1_fe az , z12 , u1 , u2 , s1 , s2 , h , i , h2 , h3 , t ;
452535
536+ VERIFY_GEJ (a );
537+ VERIFY_GE (b );
538+
453539 if (a -> infinity ) {
454540 secp256k1_fe bzinv2 , bzinv3 ;
455541 r -> infinity = b -> infinity ;
@@ -458,6 +544,7 @@ static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a,
458544 secp256k1_fe_mul (& r -> x , & b -> x , & bzinv2 );
459545 secp256k1_fe_mul (& r -> y , & b -> y , & bzinv3 );
460546 secp256k1_fe_set_int (& r -> z , 1 );
547+ VERIFY_GEJ (r );
461548 return ;
462549 }
463550 if (b -> infinity ) {
@@ -508,14 +595,18 @@ static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a,
508595 secp256k1_fe_mul (& r -> y , & t , & i );
509596 secp256k1_fe_mul (& h3 , & h3 , & s1 );
510597 secp256k1_fe_add (& r -> y , & h3 );
511- }
512598
599+ VERIFY_GEJ (r );
600+ }
513601
514602static void secp256k1_gej_add_ge (secp256k1_gej * r , const secp256k1_gej * a , const secp256k1_ge * b ) {
515603 /* Operations: 7 mul, 5 sqr, 24 add/cmov/half/mul_int/negate/normalize_weak/normalizes_to_zero */
516604 secp256k1_fe zz , u1 , u2 , s1 , s2 , t , tt , m , n , q , rr ;
517605 secp256k1_fe m_alt , rr_alt ;
518606 int infinity , degenerate ;
607+
608+ VERIFY_GEJ (a );
609+ VERIFY_GE (b );
519610 VERIFY_CHECK (!b -> infinity );
520611 VERIFY_CHECK (a -> infinity == 0 || a -> infinity == 1 );
521612
@@ -626,21 +717,27 @@ static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const
626717 secp256k1_fe_cmov (& r -> y , & b -> y , a -> infinity );
627718 secp256k1_fe_cmov (& r -> z , & secp256k1_fe_one , a -> infinity );
628719 r -> infinity = infinity ;
720+
721+ VERIFY_GEJ (r );
629722}
630723
631724static void secp256k1_gej_rescale (secp256k1_gej * r , const secp256k1_fe * s ) {
632725 /* Operations: 4 mul, 1 sqr */
633726 secp256k1_fe zz ;
727+ VERIFY_GEJ (r );
634728 VERIFY_CHECK (!secp256k1_fe_is_zero (s ));
635729 secp256k1_fe_sqr (& zz , s );
636730 secp256k1_fe_mul (& r -> x , & r -> x , & zz ); /* r->x *= s^2 */
637731 secp256k1_fe_mul (& r -> y , & r -> y , & zz );
638732 secp256k1_fe_mul (& r -> y , & r -> y , s ); /* r->y *= s^3 */
639733 secp256k1_fe_mul (& r -> z , & r -> z , s ); /* r->z *= s */
734+
735+ VERIFY_GEJ (r );
640736}
641737
642738static void secp256k1_ge_to_storage (secp256k1_ge_storage * r , const secp256k1_ge * a ) {
643739 secp256k1_fe x , y ;
740+ VERIFY_GE (a );
644741 VERIFY_CHECK (!a -> infinity );
645742 x = a -> x ;
646743 secp256k1_fe_normalize (& x );
@@ -654,14 +751,21 @@ static void secp256k1_ge_from_storage(secp256k1_ge *r, const secp256k1_ge_storag
654751 secp256k1_fe_from_storage (& r -> x , & a -> x );
655752 secp256k1_fe_from_storage (& r -> y , & a -> y );
656753 r -> infinity = 0 ;
754+
755+ VERIFY_GE (r );
657756}
658757
659758static SECP256K1_INLINE void secp256k1_gej_cmov (secp256k1_gej * r , const secp256k1_gej * a , int flag ) {
759+ VERIFY_GEJ (r );
760+ VERIFY_GEJ (a );
761+
660762 secp256k1_fe_cmov (& r -> x , & a -> x , flag );
661763 secp256k1_fe_cmov (& r -> y , & a -> y , flag );
662764 secp256k1_fe_cmov (& r -> z , & a -> z , flag );
663765
664766 r -> infinity ^= (r -> infinity ^ a -> infinity ) & flag ;
767+
768+ VERIFY_GEJ (r );
665769}
666770
667771static 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,
672776static void secp256k1_ge_mul_lambda (secp256k1_ge * r , const secp256k1_ge * a ) {
673777 * r = * a ;
674778 secp256k1_fe_mul (& r -> x , & r -> x , & secp256k1_const_beta );
779+
780+ VERIFY_GE (r );
675781}
676782
677783static int secp256k1_ge_is_in_correct_subgroup (const secp256k1_ge * ge ) {
678784#ifdef EXHAUSTIVE_TEST_ORDER
679785 secp256k1_gej out ;
680786 int i ;
681787
788+ VERIFY_GE (ge );
789+
682790 /* A very simple EC multiplication ladder that avoids a dependency on ecmult. */
683791 secp256k1_gej_set_infinity (& out );
684792 for (i = 0 ; i < 32 ; ++ i ) {
@@ -689,6 +797,7 @@ static int secp256k1_ge_is_in_correct_subgroup(const secp256k1_ge* ge) {
689797 }
690798 return secp256k1_gej_is_infinity (& out );
691799#else
800+ VERIFY_GE (ge );
692801 (void )ge ;
693802 /* The real secp256k1 group has cofactor 1, so the subgroup is the entire curve. */
694803 return 1 ;
0 commit comments