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