@@ -29,7 +29,7 @@ static void precompute_ecmult_print_table(FILE *fp, const char *name, int window
29
29
int j ;
30
30
int i ;
31
31
32
- fprintf (fp , "static const secp256k1_ge_storage %s[ECMULT_TABLE_SIZE(WINDOW_G)] = {\n" , name );
32
+ fprintf (fp , "const secp256k1_ge_storage %s[ECMULT_TABLE_SIZE(WINDOW_G)] = {\n" , name );
33
33
34
34
fprintf (fp , " S(%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32
35
35
",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ")\n" ,
@@ -61,53 +61,76 @@ static void precompute_ecmult_print_two_tables(FILE *fp, int window_g, const sec
61
61
free (table_128 );
62
62
}
63
63
64
- static int precompute_ecmult (void ) {
64
+ static int precompute_ecmult (int h_file ) {
65
+ static const char outfile_c [] = "src/precomputed_ecmult.c" ;
66
+ static const char outfile_h [] = "src/precomputed_ecmult.h" ;
67
+ const char * outfile = h_file ? outfile_h : outfile_c ;
65
68
const secp256k1_ge g = SECP256K1_G ;
66
69
const int window_g_13 = 4 ;
67
70
const int window_g_199 = 8 ;
68
- FILE * fp ;
71
+ FILE * fp ;
69
72
70
- fp = fopen ("src/precomputed_ecmult.h" , "w" );
73
+ fp = fopen (outfile , "w" );
71
74
if (fp == NULL ) {
72
- fprintf (stderr , "Could not open src/precomputed_ecmult.h for writing!\n" );
75
+ fprintf (stderr , "Could not open %s for writing!\n" , outfile );
73
76
return -1 ;
74
77
}
75
78
79
+ if (h_file ) {
80
+ fprintf (fp , "/* This file was automatically generated by precompute. */\n" );
81
+ fprintf (fp , "#ifndef SECP256K1_PRECOMPUTED_ECMULT_H\n" );
82
+ fprintf (fp , "#define SECP256K1_PRECOMPUTED_ECMULT_H\n" );
83
+ fprintf (fp , "#include \"group.h\"\n" );
84
+ fprintf (fp , "#include \"ecmult.h\"\n" );
85
+ fprintf (fp , "#if ECMULT_TABLE_SIZE(ECMULT_WINDOW_SIZE) > %ld\n" , ECMULT_TABLE_SIZE (ECMULT_WINDOW_SIZE ));
86
+ fprintf (fp , " #error configuration mismatch, invalid ECMULT_WINDOW_SIZE. Try deleting precomputed_ecmult.h before the build.\n" );
87
+ fprintf (fp , "#endif\n" );
88
+ fprintf (fp , "#if defined(EXHAUSTIVE_TEST_ORDER)\n" );
89
+ fprintf (fp , "#if EXHAUSTIVE_TEST_ORDER == 13\n" );
90
+ fprintf (fp , "#define WINDOW_G %d\n" , window_g_13 );
91
+ fprintf (fp , "#elif EXHAUSTIVE_TEST_ORDER == 199\n" );
92
+ fprintf (fp , "#define WINDOW_G %d\n" , window_g_199 );
93
+ fprintf (fp , "#else\n" );
94
+ fprintf (fp , " #error No known generator for the specified exhaustive test group order.\n" );
95
+ fprintf (fp , "#endif\n" );
96
+ fprintf (fp , "static secp256k1_ge_storage secp256k1_pre_g[ECMULT_TABLE_SIZE(WINDOW_G)];\n" );
97
+ fprintf (fp , "static secp256k1_ge_storage secp256k1_pre_g_128[ECMULT_TABLE_SIZE(WINDOW_G)];\n" );
98
+ fprintf (fp , "#else /* !defined(EXHAUSTIVE_TEST_ORDER) */\n" );
99
+ fprintf (fp , "#define WINDOW_G ECMULT_WINDOW_SIZE\n" );
100
+ fprintf (fp , "extern const secp256k1_ge_storage secp256k1_pre_g[ECMULT_TABLE_SIZE(WINDOW_G)];\n" );
101
+ fprintf (fp , "extern const secp256k1_ge_storage secp256k1_pre_g_128[ECMULT_TABLE_SIZE(WINDOW_G)];\n" );
102
+ fprintf (fp , "#endif /* EXHAUSTIVE_TEST_ORDER */\n" );
103
+ fprintf (fp , "#undef S\n" );
104
+ fprintf (fp , "#endif /* SECP256K1_PRECOMPUTED_ECMULT_H */\n" );
105
+ fclose (fp );
106
+ return 0 ;
107
+ }
108
+
76
109
fprintf (fp , "/* This file was automatically generated by precompute. */\n" );
77
110
fprintf (fp , "/* This file contains an array secp256k1_pre_g with odd multiples of the base point G and\n" );
78
111
fprintf (fp , " * an array secp256k1_pre_g_128 with odd multiples of 2^128*G for accelerating the computation of a*P + b*G.\n" );
79
112
fprintf (fp , " */\n" );
80
- fprintf (fp , "#ifndef SECP256K1_PRECOMPUTED_ECMULT_H\n" );
81
- fprintf (fp , "#define SECP256K1_PRECOMPUTED_ECMULT_H\n" );
113
+ fprintf (fp , "#if defined HAVE_CONFIG_H\n" );
114
+ fprintf (fp , "#include \"libsecp256k1-config.h\"\n" );
115
+ fprintf (fp , "#endif\n" );
116
+ fprintf (fp , "#include \"../include/secp256k1.h\"\n" );
82
117
fprintf (fp , "#include \"group.h\"\n" );
118
+ fprintf (fp , "#include \"precomputed_ecmult.h\"\n" );
83
119
fprintf (fp , "#ifdef S\n" );
84
120
fprintf (fp , " #error macro identifier S already in use.\n" );
85
121
fprintf (fp , "#endif\n" );
86
122
fprintf (fp , "#define S(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) "
87
123
"SECP256K1_GE_STORAGE_CONST(0x##a##u,0x##b##u,0x##c##u,0x##d##u,0x##e##u,0x##f##u,0x##g##u,"
88
124
"0x##h##u,0x##i##u,0x##j##u,0x##k##u,0x##l##u,0x##m##u,0x##n##u,0x##o##u,0x##p##u)\n" );
89
- fprintf (fp , "#if ECMULT_TABLE_SIZE(ECMULT_WINDOW_SIZE) > %ld\n" , ECMULT_TABLE_SIZE (ECMULT_WINDOW_SIZE ));
90
- fprintf (fp , " #error configuration mismatch, invalid ECMULT_WINDOW_SIZE. Try deleting precomputed_ecmult.h before the build.\n" );
91
- fprintf (fp , "#endif\n" );
92
125
fprintf (fp , "#if defined(EXHAUSTIVE_TEST_ORDER)\n" );
93
- fprintf (fp , "#if EXHAUSTIVE_TEST_ORDER == 13\n" );
94
- fprintf (fp , "#define WINDOW_G %d\n" , window_g_13 );
95
- fprintf (fp , "#elif EXHAUSTIVE_TEST_ORDER == 199\n" );
96
- fprintf (fp , "#define WINDOW_G %d\n" , window_g_199 );
97
- fprintf (fp , "#else\n" );
98
- fprintf (fp , " #error No known generator for the specified exhaustive test group order.\n" );
99
- fprintf (fp , "#endif\n" );
100
- fprintf (fp , "static secp256k1_ge_storage secp256k1_pre_g[ECMULT_TABLE_SIZE(WINDOW_G)];\n" );
101
- fprintf (fp , "static secp256k1_ge_storage secp256k1_pre_g_128[ECMULT_TABLE_SIZE(WINDOW_G)];\n" );
102
- fprintf (fp , "#else /* !defined(EXHAUSTIVE_TEST_ORDER) */\n" );
103
- fprintf (fp , "#define WINDOW_G ECMULT_WINDOW_SIZE\n" );
126
+ fprintf (fp , "#error Cannot compile precomputed_ecmult.c in exhaustive test mode\n" );
127
+ fprintf (fp , "#endif /* EXHAUSTIVE_TEST_ORDER */\n" );
104
128
105
129
precompute_ecmult_print_two_tables (fp , ECMULT_WINDOW_SIZE , & g );
106
130
107
- fprintf (fp , "#endif /* EXHAUSTIVE_TEST_ORDER */\n" );
108
131
fprintf (fp , "#undef S\n" );
109
- fprintf (fp , "#endif /* SECP256K1_PRECOMPUTED_ECMULT_H */\n" );
110
132
fclose (fp );
133
+
111
134
return 0 ;
112
135
}
113
136
@@ -202,14 +225,16 @@ static int precompute_ecmult_gen(int h_file) {
202
225
}
203
226
204
227
int main (int argc , char * * argv ) {
205
- if (argc == 2 && !strcmp (argv [1 ], "ecmult" )) {
206
- return precompute_ecmult ();
228
+ if (argc == 2 && !strcmp (argv [1 ], "ecmult_c" )) {
229
+ return precompute_ecmult (0 );
230
+ } else if (argc == 2 && !strcmp (argv [1 ], "ecmult_h" )) {
231
+ return precompute_ecmult (1 );
207
232
} else if (argc == 2 && !strcmp (argv [1 ], "ecmult_gen_c" )) {
208
233
return precompute_ecmult_gen (0 );
209
234
} else if (argc == 2 && !strcmp (argv [1 ], "ecmult_gen_h" )) {
210
235
return precompute_ecmult_gen (1 );
211
236
} else {
212
- fprintf (stderr , "Usage: ./precompute [ecmult |ecmult_gen_c|ecmult_gen_h]\n" );
237
+ fprintf (stderr , "Usage: ./precompute [ecmult_c|ecmult_h |ecmult_gen_c|ecmult_gen_h]\n" );
213
238
return 1 ;
214
239
}
215
240
}
0 commit comments