Skip to content

Commit 6c52ae8

Browse files
Merge bitcoin#937: Have ge_set_gej_var, gej_double_var and ge_set_all_gej_var initialize all fields of their outputs.
14c9739 tests: Improve secp256k1_ge_set_all_gej_var for some infinity inputs (Tim Ruffing) 4a19668 tests: Test secp256k1_ge_set_all_gej_var for all infinity inputs (Tim Ruffing) 45b6468 Have secp256k1_ge_set_all_gej_var initialize all fields. Previous behaviour would not initialize r->y values in the case where infinity is passed in. Furthermore, the previous behaviour wouldn't initialize anything in the case where all inputs were infinity. (Russell O'Connor) 31c0f6d Have secp256k1_gej_double_var initialize all fields. Previous behaviour would not initialize r->x and r->y values in the case where infinity is passed in. (Russell O'Connor) dd6c3de Have secp256k1_ge_set_gej_var initialize all fields. Previous behaviour would not initialize r->x and r->y values in the case where infinity is passed in. (Russell O'Connor) Pull request description: Previous behaviour would not initialize `r->x` and `r->y` values in the case where infinity is passed in. ACKs for top commit: gmaxwell: ACK 14c9739 sipa: utACK 14c9739 real-or-random: ACK 14c9739 Tree-SHA512: 2e779b767f02e348af4bbc62aa9871c3d1d29e61a6c643c879c49f2de27556a3588850acd2f7c7483790677597d01064025e14befdbf29e783f57996fe4430f9
2 parents 185a6af + 14c9739 commit 6c52ae8

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

src/group_impl.h

+6-6
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ static void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a) {
100100

101101
static void secp256k1_ge_set_gej_var(secp256k1_ge *r, secp256k1_gej *a) {
102102
secp256k1_fe z2, z3;
103-
r->infinity = a->infinity;
104103
if (a->infinity) {
104+
secp256k1_ge_set_infinity(r);
105105
return;
106106
}
107107
secp256k1_fe_inv_var(&a->z, &a->z);
@@ -110,8 +110,7 @@ static void secp256k1_ge_set_gej_var(secp256k1_ge *r, secp256k1_gej *a) {
110110
secp256k1_fe_mul(&a->x, &a->x, &z2);
111111
secp256k1_fe_mul(&a->y, &a->y, &z3);
112112
secp256k1_fe_set_int(&a->z, 1);
113-
r->x = a->x;
114-
r->y = a->y;
113+
secp256k1_ge_set_xy(r, &a->x, &a->y);
115114
}
116115

117116
static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len) {
@@ -120,7 +119,9 @@ static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a
120119
size_t last_i = SIZE_MAX;
121120

122121
for (i = 0; i < len; i++) {
123-
if (!a[i].infinity) {
122+
if (a[i].infinity) {
123+
secp256k1_ge_set_infinity(&r[i]);
124+
} else {
124125
/* Use destination's x coordinates as scratch space */
125126
if (last_i == SIZE_MAX) {
126127
r[i].x = a[i].z;
@@ -148,7 +149,6 @@ static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a
148149
r[last_i].x = u;
149150

150151
for (i = 0; i < len; i++) {
151-
r[i].infinity = a[i].infinity;
152152
if (!a[i].infinity) {
153153
secp256k1_ge_set_gej_zinv(&r[i], &a[i], &r[i].x);
154154
}
@@ -311,7 +311,7 @@ static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, s
311311
* point will be gibberish (z = 0 but infinity = 0).
312312
*/
313313
if (a->infinity) {
314-
r->infinity = 1;
314+
secp256k1_gej_set_infinity(r);
315315
if (rzr != NULL) {
316316
secp256k1_fe_set_int(rzr, 1);
317317
}

src/tests.c

+16-2
Original file line numberDiff line numberDiff line change
@@ -3101,20 +3101,34 @@ void test_ge(void) {
31013101

31023102
/* Test batch gej -> ge conversion with many infinities. */
31033103
for (i = 0; i < 4 * runs + 1; i++) {
3104+
int odd;
31043105
random_group_element_test(&ge[i]);
3106+
odd = secp256k1_fe_is_odd(&ge[i].x);
3107+
CHECK(odd == 0 || odd == 1);
31053108
/* randomly set half the points to infinity */
3106-
if(secp256k1_fe_is_odd(&ge[i].x)) {
3109+
if (odd == i % 2) {
31073110
secp256k1_ge_set_infinity(&ge[i]);
31083111
}
31093112
secp256k1_gej_set_ge(&gej[i], &ge[i]);
31103113
}
3111-
/* batch invert */
3114+
/* batch convert */
31123115
secp256k1_ge_set_all_gej_var(ge, gej, 4 * runs + 1);
31133116
/* check result */
31143117
for (i = 0; i < 4 * runs + 1; i++) {
31153118
ge_equals_gej(&ge[i], &gej[i]);
31163119
}
31173120

3121+
/* Test batch gej -> ge conversion with all infinities. */
3122+
for (i = 0; i < 4 * runs + 1; i++) {
3123+
secp256k1_gej_set_infinity(&gej[i]);
3124+
}
3125+
/* batch convert */
3126+
secp256k1_ge_set_all_gej_var(ge, gej, 4 * runs + 1);
3127+
/* check result */
3128+
for (i = 0; i < 4 * runs + 1; i++) {
3129+
CHECK(secp256k1_ge_is_infinity(&ge[i]));
3130+
}
3131+
31183132
free(ge);
31193133
free(gej);
31203134
}

0 commit comments

Comments
 (0)