@@ -27,7 +27,7 @@ static void precompute_ecmult_print_table(FILE *fp, const char *name, int window
27
27
int j ;
28
28
int i ;
29
29
30
- fprintf (fp , "static const secp256k1_ge_storage %s[ECMULT_TABLE_SIZE(WINDOW_G)] = {\n" , name );
30
+ fprintf (fp , "const secp256k1_ge_storage %s[ECMULT_TABLE_SIZE(WINDOW_G)] = {\n" , name );
31
31
32
32
fprintf (fp , " S(%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32
33
33
",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ")\n" ,
@@ -63,10 +63,16 @@ static int precompute_ecmult(void) {
63
63
const secp256k1_ge g = SECP256K1_G ;
64
64
const int window_g_13 = 4 ;
65
65
const int window_g_199 = 8 ;
66
- FILE * fp ;
66
+ FILE * fp , * fp_h ;
67
67
68
- fp = fopen ("src/precomputed_ecmult.h " ,"w" );
68
+ fp = fopen ("src/precomputed_ecmult.c " ,"w" );
69
69
if (fp == NULL ) {
70
+ fprintf (stderr , "Could not open src/precomputed_ecmult.c for writing!\n" );
71
+ return -1 ;
72
+ }
73
+ fp_h = fopen ("src/precomputed_ecmult.h" ,"w" );
74
+ if (fp_h == NULL ) {
75
+ fclose (fp );
70
76
fprintf (stderr , "Could not open src/precomputed_ecmult.h for writing!\n" );
71
77
return -1 ;
72
78
}
@@ -75,37 +81,54 @@ static int precompute_ecmult(void) {
75
81
fprintf (fp , "/* This file contains an array secp256k1_pre_g with odd multiples of the base point G and\n" );
76
82
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" );
77
83
fprintf (fp , " */\n" );
78
- fprintf (fp , "#ifndef SECP256K1_PRECOMPUTED_ECMULT_H\n" );
79
- fprintf (fp , "#define SECP256K1_PRECOMPUTED_ECMULT_H\n" );
84
+ fprintf (fp , "#if defined HAVE_CONFIG_H\n" );
85
+ fprintf (fp , "#include \"libsecp256k1-config.h\"\n" );
86
+ fprintf (fp , "#endif\n" );
87
+ fprintf (fp , "#include \"../include/secp256k1.h\"\n" );
80
88
fprintf (fp , "#include \"group.h\"\n" );
89
+ fprintf (fp , "#include \"precomputed_ecmult.h\"\n" );
81
90
fprintf (fp , "#ifdef S\n" );
82
91
fprintf (fp , " #error macro identifier S already in use.\n" );
83
92
fprintf (fp , "#endif\n" );
84
93
fprintf (fp , "#define S(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) "
85
94
"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,"
86
95
"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" );
87
- fprintf (fp , "#if ECMULT_TABLE_SIZE(ECMULT_WINDOW_SIZE) > %ld\n" , ECMULT_TABLE_SIZE (ECMULT_WINDOW_SIZE ));
88
- fprintf (fp , " #error configuration mismatch, invalid ECMULT_WINDOW_SIZE. Try deleting precomputed_ecmult.h before the build.\n" );
89
- fprintf (fp , "#endif\n" );
90
96
fprintf (fp , "#if defined(EXHAUSTIVE_TEST_ORDER)\n" );
91
- fprintf (fp , "#if EXHAUSTIVE_TEST_ORDER == 13\n" );
92
- fprintf (fp , "#define WINDOW_G %d\n" , window_g_13 );
93
- fprintf (fp , "#elif EXHAUSTIVE_TEST_ORDER == 199\n" );
94
- fprintf (fp , "#define WINDOW_G %d\n" , window_g_199 );
95
- fprintf (fp , "#else\n" );
96
- fprintf (fp , " #error No known generator for the specified exhaustive test group order.\n" );
97
- fprintf (fp , "#endif\n" );
98
- fprintf (fp , "static secp256k1_ge_storage secp256k1_pre_g[ECMULT_TABLE_SIZE(WINDOW_G)];\n" );
99
- fprintf (fp , "static secp256k1_ge_storage secp256k1_pre_g_128[ECMULT_TABLE_SIZE(WINDOW_G)];\n" );
100
- fprintf (fp , "#else /* !defined(EXHAUSTIVE_TEST_ORDER) */\n" );
101
- fprintf (fp , "#define WINDOW_G ECMULT_WINDOW_SIZE\n" );
97
+ fprintf (fp , "#error Cannot compile precomputed_ecmult.c in exhaustive test mode\n" );
98
+ fprintf (fp , "#endif /* EXHAUSTIVE_TEST_ORDER */\n" );
102
99
103
100
precompute_ecmult_print_two_tables (fp , ECMULT_WINDOW_SIZE , & g );
104
101
105
- fprintf (fp , "#endif /* EXHAUSTIVE_TEST_ORDER */\n" );
106
102
fprintf (fp , "#undef S\n" );
107
- fprintf (fp , "#endif /* SECP256K1_PRECOMPUTED_ECMULT_H */\n" );
108
103
fclose (fp );
104
+
105
+ fprintf (fp_h , "/* This file was automatically generated by precompute. */\n" );
106
+ fprintf (fp_h , "#ifndef SECP256K1_PRECOMPUTED_ECMULT_H\n" );
107
+ fprintf (fp_h , "#define SECP256K1_PRECOMPUTED_ECMULT_H\n" );
108
+ fprintf (fp_h , "#include \"group.h\"\n" );
109
+ fprintf (fp_h , "#include \"ecmult.h\"\n" );
110
+ fprintf (fp_h , "#if ECMULT_TABLE_SIZE(ECMULT_WINDOW_SIZE) > %ld\n" , ECMULT_TABLE_SIZE (ECMULT_WINDOW_SIZE ));
111
+ fprintf (fp_h , " #error configuration mismatch, invalid ECMULT_WINDOW_SIZE. Try deleting precomputed_ecmult.h before the build.\n" );
112
+ fprintf (fp_h , "#endif\n" );
113
+ fprintf (fp_h , "#if defined(EXHAUSTIVE_TEST_ORDER)\n" );
114
+ fprintf (fp_h , "#if EXHAUSTIVE_TEST_ORDER == 13\n" );
115
+ fprintf (fp_h , "#define WINDOW_G %d\n" , window_g_13 );
116
+ fprintf (fp_h , "#elif EXHAUSTIVE_TEST_ORDER == 199\n" );
117
+ fprintf (fp_h , "#define WINDOW_G %d\n" , window_g_199 );
118
+ fprintf (fp_h , "#else\n" );
119
+ fprintf (fp_h , " #error No known generator for the specified exhaustive test group order.\n" );
120
+ fprintf (fp_h , "#endif\n" );
121
+ fprintf (fp_h , "static secp256k1_ge_storage secp256k1_pre_g[ECMULT_TABLE_SIZE(WINDOW_G)];\n" );
122
+ fprintf (fp_h , "static secp256k1_ge_storage secp256k1_pre_g_128[ECMULT_TABLE_SIZE(WINDOW_G)];\n" );
123
+ fprintf (fp_h , "#else /* !defined(EXHAUSTIVE_TEST_ORDER) */\n" );
124
+ fprintf (fp_h , "#define WINDOW_G ECMULT_WINDOW_SIZE\n" );
125
+ fprintf (fp_h , "extern const secp256k1_ge_storage secp256k1_pre_g[ECMULT_TABLE_SIZE(WINDOW_G)];\n" );
126
+ fprintf (fp_h , "extern const secp256k1_ge_storage secp256k1_pre_g_128[ECMULT_TABLE_SIZE(WINDOW_G)];\n" );
127
+ fprintf (fp_h , "#endif /* EXHAUSTIVE_TEST_ORDER */\n" );
128
+ fprintf (fp_h , "#undef S\n" );
129
+ fprintf (fp_h , "#endif /* SECP256K1_PRECOMPUTED_ECMULT_H */\n" );
130
+ fclose (fp_h );
131
+
109
132
return 0 ;
110
133
}
111
134
0 commit comments