Skip to content

Commit 7f7a2ed

Browse files
committed
ecmult_gen_impl: eliminate scratch memory used when generating context
1 parent 314a61d commit 7f7a2ed

File tree

5 files changed

+31
-16
lines changed

5 files changed

+31
-16
lines changed

src/bench_ecmult.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ int main(int argc, char **argv) {
172172
secp256k1_scalar_add(&data.seckeys[i], &data.seckeys[i - 1], &data.seckeys[i - 1]);
173173
}
174174
}
175-
secp256k1_ge_set_all_gej_var(data.pubkeys, pubkeys_gej, POINTS, &data.ctx->error_callback);
175+
secp256k1_ge_set_all_gej_var(data.pubkeys, pubkeys_gej, POINTS);
176176
free(pubkeys_gej);
177177

178178
for (i = 1; i <= 8; ++i) {

src/ecmult_gen_impl.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context *ctx
7777
secp256k1_gej_add_var(&numsbase, &numsbase, &nums_gej, NULL);
7878
}
7979
}
80-
secp256k1_ge_set_all_gej_var(prec, precj, 1024, cb);
80+
secp256k1_ge_set_all_gej_var(prec, precj, 1024);
8181
}
8282
for (j = 0; j < 64; j++) {
8383
for (i = 0; i < 16; i++) {

src/group.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ static void secp256k1_ge_neg(secp256k1_ge *r, const secp256k1_ge *a);
6565
static void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a);
6666

6767
/** Set a batch of group elements equal to the inputs given in jacobian coordinates */
68-
static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len, const secp256k1_callback *cb);
68+
static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len);
6969

7070
/** Set a batch of group elements equal to the inputs given in jacobian
7171
* coordinates (with known z-ratios). zr must contain the known z-ratios such

src/group_impl.h

+27-12
Original file line numberDiff line numberDiff line change
@@ -126,30 +126,45 @@ static void secp256k1_ge_set_gej_var(secp256k1_ge *r, secp256k1_gej *a) {
126126
r->y = a->y;
127127
}
128128

129-
static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len, const secp256k1_callback *cb) {
130-
secp256k1_fe *az;
131-
secp256k1_fe *azi;
129+
static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len) {
130+
secp256k1_fe u;
132131
size_t i;
133-
size_t count = 0;
134-
az = (secp256k1_fe *)checked_malloc(cb, sizeof(secp256k1_fe) * len);
132+
size_t last_i = SIZE_MAX;
133+
135134
for (i = 0; i < len; i++) {
136135
if (!a[i].infinity) {
137-
az[count++] = a[i].z;
136+
/* Use destination's x coordinates as scratch space */
137+
if (last_i == SIZE_MAX) {
138+
r[i].x = a[i].z;
139+
} else {
140+
secp256k1_fe_mul(&r[i].x, &r[last_i].x, &a[i].z);
141+
}
142+
last_i = i;
138143
}
139144
}
145+
if (last_i == SIZE_MAX) {
146+
return;
147+
}
148+
secp256k1_fe_inv_var(&u, &r[last_i].x);
140149

141-
azi = (secp256k1_fe *)checked_malloc(cb, sizeof(secp256k1_fe) * count);
142-
secp256k1_fe_inv_all_var(azi, az, count);
143-
free(az);
150+
i = last_i;
151+
while (i > 0) {
152+
i--;
153+
if (!a[i].infinity) {
154+
secp256k1_fe_mul(&r[last_i].x, &r[i].x, &u);
155+
secp256k1_fe_mul(&u, &u, &a[last_i].z);
156+
last_i = i;
157+
}
158+
}
159+
VERIFY_CHECK(!a[last_i].infinity);
160+
r[last_i].x = u;
144161

145-
count = 0;
146162
for (i = 0; i < len; i++) {
147163
r[i].infinity = a[i].infinity;
148164
if (!a[i].infinity) {
149-
secp256k1_ge_set_gej_zinv(&r[i], &a[i], &azi[count++]);
165+
secp256k1_ge_set_gej_zinv(&r[i], &a[i], &r[i].x);
150166
}
151167
}
152-
free(azi);
153168
}
154169

155170
static void secp256k1_ge_set_table_gej_var(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zr, size_t len) {

src/tests.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -2104,7 +2104,7 @@ void test_ge(void) {
21042104
}
21052105
}
21062106
secp256k1_ge_set_table_gej_var(ge_set_table, gej, zr, 4 * runs + 1);
2107-
secp256k1_ge_set_all_gej_var(ge_set_all, gej, 4 * runs + 1, &ctx->error_callback);
2107+
secp256k1_ge_set_all_gej_var(ge_set_all, gej, 4 * runs + 1);
21082108
for (i = 0; i < 4 * runs + 1; i++) {
21092109
secp256k1_fe s;
21102110
random_fe_non_zero(&s);

0 commit comments

Comments
 (0)