Skip to content

Commit a47cd97

Browse files
committed
Add group.h ge/gej equality functions
1 parent 10e6d29 commit a47cd97

File tree

3 files changed

+38
-20
lines changed

3 files changed

+38
-20
lines changed

src/group.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a
102102
*/
103103
static void secp256k1_ge_table_set_globalz(size_t len, secp256k1_ge *a, const secp256k1_fe *zr);
104104

105+
/** Check two group elements (affine) for equality in variable time. */
106+
static int secp256k1_ge_eq_var(const secp256k1_ge *a, const secp256k1_ge *b);
107+
105108
/** Set a group element (affine) equal to the point at infinity. */
106109
static void secp256k1_ge_set_infinity(secp256k1_ge *r);
107110

@@ -114,6 +117,9 @@ static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a);
114117
/** Check two group elements (jacobian) for equality in variable time. */
115118
static int secp256k1_gej_eq_var(const secp256k1_gej *a, const secp256k1_gej *b);
116119

120+
/** Check two group elements (jacobian and affine) for equality in variable time. */
121+
static int secp256k1_gej_eq_ge_var(const secp256k1_gej *a, const secp256k1_ge *b);
122+
117123
/** Compare the X coordinate of a group element (jacobian).
118124
* The magnitude of the group element's X coordinate must not exceed 31. */
119125
static int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a);

src/group_impl.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,35 @@ static int secp256k1_gej_eq_var(const secp256k1_gej *a, const secp256k1_gej *b)
354354
return secp256k1_gej_is_infinity(&tmp);
355355
}
356356

357+
static int secp256k1_gej_eq_ge_var(const secp256k1_gej *a, const secp256k1_ge *b) {
358+
secp256k1_gej tmp;
359+
SECP256K1_GEJ_VERIFY(a);
360+
SECP256K1_GE_VERIFY(b);
361+
362+
secp256k1_gej_neg(&tmp, a);
363+
secp256k1_gej_add_ge_var(&tmp, &tmp, b, NULL);
364+
return secp256k1_gej_is_infinity(&tmp);
365+
}
366+
367+
static int secp256k1_ge_eq_var(const secp256k1_ge *a, const secp256k1_ge *b) {
368+
secp256k1_fe tmp;
369+
SECP256K1_GE_VERIFY(a);
370+
SECP256K1_GE_VERIFY(b);
371+
372+
if (a->infinity != b->infinity) return 0;
373+
if (a->infinity) return 1;
374+
375+
tmp = a->x;
376+
secp256k1_fe_normalize_weak(&tmp);
377+
if (!secp256k1_fe_equal(&tmp, &b->x)) return 0;
378+
379+
tmp = a->y;
380+
secp256k1_fe_normalize_weak(&tmp);
381+
if (!secp256k1_fe_equal(&tmp, &b->y)) return 0;
382+
383+
return 1;
384+
}
385+
357386
static int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a) {
358387
secp256k1_fe r;
359388
SECP256K1_FE_VERIFY(x);

src/testutil.h

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#define SECP256K1_TESTUTIL_H
88

99
#include "field.h"
10+
#include "group.h"
1011
#include "testrand.h"
1112
#include "util.h"
1213

@@ -27,29 +28,11 @@ static void random_fe_non_zero(secp256k1_fe *nz) {
2728
}
2829

2930
static void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b) {
30-
CHECK(a->infinity == b->infinity);
31-
if (a->infinity) {
32-
return;
33-
}
34-
CHECK(secp256k1_fe_equal(&a->x, &b->x));
35-
CHECK(secp256k1_fe_equal(&a->y, &b->y));
31+
CHECK(secp256k1_ge_eq_var(a, b));
3632
}
3733

3834
static void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b) {
39-
secp256k1_fe z2s;
40-
secp256k1_fe u1, u2, s1, s2;
41-
CHECK(a->infinity == b->infinity);
42-
if (a->infinity) {
43-
return;
44-
}
45-
/* Check a.x * b.z^2 == b.x && a.y * b.z^3 == b.y, to avoid inverses. */
46-
secp256k1_fe_sqr(&z2s, &b->z);
47-
secp256k1_fe_mul(&u1, &a->x, &z2s);
48-
u2 = b->x;
49-
secp256k1_fe_mul(&s1, &a->y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->z);
50-
s2 = b->y;
51-
CHECK(secp256k1_fe_equal(&u1, &u2));
52-
CHECK(secp256k1_fe_equal(&s1, &s2));
35+
CHECK(secp256k1_gej_eq_ge_var(b, a));
5336
}
5437

5538
#endif /* SECP256K1_TESTUTIL_H */

0 commit comments

Comments
 (0)