Skip to content

Commit 09dbba5

Browse files
committed
Decorate group methods with verify macros
1 parent 485f608 commit 09dbba5

File tree

1 file changed

+116
-7
lines changed

1 file changed

+116
-7
lines changed

src/group_impl.h

Lines changed: 116 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,48 +64,83 @@ static const secp256k1_ge secp256k1_ge_const_g = SECP256K1_G;
6464
static 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+
6780
static 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

7895
static 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

84103
static int secp256k1_ge_is_infinity(const secp256k1_ge *a) {
104+
VERIFY_GE(a);
85105
return a->infinity;
86106
}
87107

88108
static 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

94118
static 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

107139
static 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

195239
static 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

201247
static 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

208256
static 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

214264
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
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

232283
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);
237292
}
238293

239294
static 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

247305
static 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

256318
static int secp256k1_gej_is_infinity(const secp256k1_gej *a) {
319+
VERIFY_GEJ(a);
257320
return a->infinity;
258321
}
259322

260323
static 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

305375
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
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

392469
static 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

449532
static 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

514602
static 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

631724
static 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

642738
static 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

659758
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+
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

667771
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,
672776
static 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

677783
static 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

Comments
 (0)