20
20
#include "group_impl.h"
21
21
#include "ecmult.h"
22
22
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 ;
27
27
int j ;
28
- int i ;
29
28
30
29
gj = * gen ;
31
30
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 ;
33
60
34
61
fprintf (fp , "static const secp256k1_ge_storage %s[ECMULT_TABLE_SIZE(WINDOW_G)] = {\n" , name );
35
62
fprintf (fp , " S(%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32
36
63
",%" 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 ]));
41
65
42
66
j = 1 ;
43
67
for (i = 3 ; i <= window_g ; ++ i ) {
44
68
if (with_conditionals ) {
45
69
fprintf (fp , "#if ECMULT_TABLE_SIZE(WINDOW_G) > %ld\n" , ECMULT_TABLE_SIZE (i - 1 ));
46
70
}
47
71
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
-
53
72
fprintf (fp , ",S(%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32
54
73
",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ",%" PRIx32 ")\n" ,
55
- SECP256K1_GE_STORAGE_CONST_GET (ges ));
74
+ SECP256K1_GE_STORAGE_CONST_GET (table [ j ] ));
56
75
}
57
76
if (with_conditionals ) {
58
77
fprintf (fp , "#endif\n" );
@@ -61,16 +80,17 @@ void print_table(FILE *fp, const char *name, int window_g, const secp256k1_gej *
61
80
fprintf (fp , "};\n" );
62
81
}
63
82
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 )) ;
67
86
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 );
74
94
}
75
95
76
96
int main (void ) {
0 commit comments