Skip to content

Commit fc1bf9f

Browse files
committed
Split ecmult table computation and printing
1 parent 31feab0 commit fc1bf9f

File tree

1 file changed

+45
-25
lines changed

1 file changed

+45
-25
lines changed

src/precompute_ecmult.c

+45-25
Original file line numberDiff line numberDiff line change
@@ -20,39 +20,58 @@
2020
#include "group_impl.h"
2121
#include "ecmult.h"
2222

23-
void print_table(FILE *fp, const char *name, int window_g, const secp256k1_gej *gen, int with_conditionals) {
24-
static secp256k1_gej gj;
25-
static secp256k1_ge ge, dgen;
26-
static secp256k1_ge_storage ges;
23+
/* Construct table of all odd multiples of gen in range 1..(2**(window_g-1)-1). */
24+
static void secp256k1_ecmult_compute_table(secp256k1_ge_storage* table, int window_g, const secp256k1_gej* gen) {
25+
secp256k1_gej gj;
26+
secp256k1_ge ge, dgen;
2727
int j;
28-
int i;
2928

3029
gj = *gen;
3130
secp256k1_ge_set_gej_var(&ge, &gj);
32-
secp256k1_ge_to_storage(&ges, &ge);
31+
secp256k1_ge_to_storage(&table[0], &ge);
32+
33+
secp256k1_gej_double_var(&gj, gen, NULL);
34+
secp256k1_ge_set_gej_var(&dgen, &gj);
35+
36+
for (j = 1; j < ECMULT_TABLE_SIZE(window_g); ++j) {
37+
secp256k1_gej_set_ge(&gj, &ge);
38+
secp256k1_gej_add_ge_var(&gj, &gj, &dgen, NULL);
39+
secp256k1_ge_set_gej_var(&ge, &gj);
40+
secp256k1_ge_to_storage(&table[j], &ge);
41+
}
42+
}
43+
44+
/* Like secp256k1_ecmult_compute_table, but one for both gen and gen*2^128. */
45+
static void secp256k1_ecmult_compute_two_tables(secp256k1_ge_storage* table, secp256k1_ge_storage* table_128, int window_g, const secp256k1_ge* gen) {
46+
secp256k1_gej gj;
47+
int i;
48+
49+
secp256k1_gej_set_ge(&gj, gen);
50+
secp256k1_ecmult_compute_table(table, window_g, &gj);
51+
for (i = 0; i < 128; ++i) {
52+
secp256k1_gej_double_var(&gj, &gj, NULL);
53+
}
54+
secp256k1_ecmult_compute_table(table_128, window_g, &gj);
55+
}
56+
57+
static void print_table(FILE *fp, const char *name, int window_g, const secp256k1_ge_storage* table, int with_conditionals) {
58+
int j;
59+
int i;
3360

3461
fprintf(fp, "static const secp256k1_ge_storage %s[ECMULT_TABLE_SIZE(WINDOW_G)] = {\n", name);
3562
fprintf(fp, " S(%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32
3663
",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32")\n",
37-
SECP256K1_GE_STORAGE_CONST_GET(ges));
38-
39-
secp256k1_gej_double_var(&gj, gen, NULL);
40-
secp256k1_ge_set_gej_var(&dgen, &gj);
64+
SECP256K1_GE_STORAGE_CONST_GET(table[0]));
4165

4266
j = 1;
4367
for(i = 3; i <= window_g; ++i) {
4468
if (with_conditionals) {
4569
fprintf(fp, "#if ECMULT_TABLE_SIZE(WINDOW_G) > %ld\n", ECMULT_TABLE_SIZE(i-1));
4670
}
4771
for(;j < ECMULT_TABLE_SIZE(i); ++j) {
48-
secp256k1_gej_set_ge(&gj, &ge);
49-
secp256k1_gej_add_ge_var(&gj, &gj, &dgen, NULL);
50-
secp256k1_ge_set_gej_var(&ge, &gj);
51-
secp256k1_ge_to_storage(&ges, &ge);
52-
5372
fprintf(fp, ",S(%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32
5473
",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32")\n",
55-
SECP256K1_GE_STORAGE_CONST_GET(ges));
74+
SECP256K1_GE_STORAGE_CONST_GET(table[j]));
5675
}
5776
if (with_conditionals) {
5877
fprintf(fp, "#endif\n");
@@ -61,16 +80,17 @@ void print_table(FILE *fp, const char *name, int window_g, const secp256k1_gej *
6180
fprintf(fp, "};\n");
6281
}
6382

64-
void print_two_tables(FILE *fp, int window_g, const secp256k1_ge *g, int with_conditionals) {
65-
secp256k1_gej gj;
66-
int i;
83+
static void print_two_tables(FILE *fp, int window_g, const secp256k1_ge *g, int with_conditionals) {
84+
secp256k1_ge_storage* table = malloc(ECMULT_TABLE_SIZE(window_g) * sizeof(secp256k1_ge_storage));
85+
secp256k1_ge_storage* table_128 = malloc(ECMULT_TABLE_SIZE(window_g) * sizeof(secp256k1_ge_storage));
6786

68-
secp256k1_gej_set_ge(&gj, g);
69-
print_table(fp, "secp256k1_pre_g", window_g, &gj, with_conditionals);
70-
for (i = 0; i < 128; ++i) {
71-
secp256k1_gej_double_var(&gj, &gj, NULL);
72-
}
73-
print_table(fp, "secp256k1_pre_g_128", window_g, &gj, with_conditionals);
87+
secp256k1_ecmult_compute_two_tables(table, table_128, window_g, g);
88+
89+
print_table(fp, "secp256k1_pre_g", window_g, table, with_conditionals);
90+
print_table(fp, "secp256k1_pre_g_128", window_g, table_128, with_conditionals);
91+
92+
free(table);
93+
free(table_128);
7494
}
7595

7696
int main(void) {

0 commit comments

Comments
 (0)