11
11
#include "group_impl.h"
12
12
#include "field_impl.h"
13
13
#include "ecmult_gen.h"
14
+ #include "util.h"
14
15
15
- static void secp256k1_ecmult_gen_create_prec_table (secp256k1_ge_storage * table , const secp256k1_ge * gen ) {
16
- secp256k1_ge prec [ECMULT_GEN_PREC_N * ECMULT_GEN_PREC_G ];
16
+ static void secp256k1_ecmult_gen_create_prec_table (secp256k1_ge_storage * table , const secp256k1_ge * gen , int bits ) {
17
+ int g = ECMULT_GEN_PREC_G (bits );
18
+ int n = ECMULT_GEN_PREC_N (bits );
19
+
20
+ secp256k1_ge * prec = checked_malloc (& default_error_callback , n * g * sizeof (* prec ));
17
21
secp256k1_gej gj ;
18
22
secp256k1_gej nums_gej ;
19
23
int i , j ;
@@ -35,41 +39,43 @@ static void secp256k1_ecmult_gen_create_prec_table(secp256k1_ge_storage* table,
35
39
VERIFY_CHECK (r );
36
40
secp256k1_gej_set_ge (& nums_gej , & nums_ge );
37
41
/* Add G to make the bits in x uniformly distributed. */
38
- secp256k1_gej_add_ge_var (& nums_gej , & nums_gej , & secp256k1_ge_const_g , NULL );
42
+ secp256k1_gej_add_ge_var (& nums_gej , & nums_gej , gen , NULL );
39
43
}
40
44
41
45
/* compute prec. */
42
46
{
43
- secp256k1_gej precj [ECMULT_GEN_PREC_N * ECMULT_GEN_PREC_G ]; /* Jacobian versions of prec. */
44
47
secp256k1_gej gbase ;
45
48
secp256k1_gej numsbase ;
49
+ secp256k1_gej * precj = checked_malloc (& default_error_callback , n * g * sizeof (* precj )); /* Jacobian versions of prec. */
46
50
gbase = gj ; /* PREC_G^j * G */
47
51
numsbase = nums_gej ; /* 2^j * nums. */
48
- for (j = 0 ; j < ECMULT_GEN_PREC_N ; j ++ ) {
52
+ for (j = 0 ; j < n ; j ++ ) {
49
53
/* Set precj[j*PREC_G .. j*PREC_G+(PREC_G-1)] to (numsbase, numsbase + gbase, ..., numsbase + (PREC_G-1)*gbase). */
50
- precj [j * ECMULT_GEN_PREC_G ] = numsbase ;
51
- for (i = 1 ; i < ECMULT_GEN_PREC_G ; i ++ ) {
52
- secp256k1_gej_add_var (& precj [j * ECMULT_GEN_PREC_G + i ], & precj [j * ECMULT_GEN_PREC_G + i - 1 ], & gbase , NULL );
54
+ precj [j * g ] = numsbase ;
55
+ for (i = 1 ; i < g ; i ++ ) {
56
+ secp256k1_gej_add_var (& precj [j * g + i ], & precj [j * g + i - 1 ], & gbase , NULL );
53
57
}
54
58
/* Multiply gbase by PREC_G. */
55
- for (i = 0 ; i < ECMULT_GEN_PREC_B ; i ++ ) {
59
+ for (i = 0 ; i < bits ; i ++ ) {
56
60
secp256k1_gej_double_var (& gbase , & gbase , NULL );
57
61
}
58
62
/* Multiply numbase by 2. */
59
63
secp256k1_gej_double_var (& numsbase , & numsbase , NULL );
60
- if (j == ECMULT_GEN_PREC_N - 2 ) {
64
+ if (j == n - 2 ) {
61
65
/* In the last iteration, numsbase is (1 - 2^j) * nums instead. */
62
66
secp256k1_gej_neg (& numsbase , & numsbase );
63
67
secp256k1_gej_add_var (& numsbase , & numsbase , & nums_gej , NULL );
64
68
}
65
69
}
66
- secp256k1_ge_set_all_gej_var (prec , precj , ECMULT_GEN_PREC_N * ECMULT_GEN_PREC_G );
70
+ secp256k1_ge_set_all_gej_var (prec , precj , n * g );
71
+ free (precj );
67
72
}
68
- for (j = 0 ; j < ECMULT_GEN_PREC_N ; j ++ ) {
69
- for (i = 0 ; i < ECMULT_GEN_PREC_G ; i ++ ) {
70
- secp256k1_ge_to_storage (& table [j * ECMULT_GEN_PREC_G + i ], & prec [j * ECMULT_GEN_PREC_G + i ]);
73
+ for (j = 0 ; j < n ; j ++ ) {
74
+ for (i = 0 ; i < g ; i ++ ) {
75
+ secp256k1_ge_to_storage (& table [j * g + i ], & prec [j * g + i ]);
71
76
}
72
77
}
78
+ free (prec );
73
79
}
74
80
75
81
#endif /* SECP256K1_ECMULT_GEN_PREC_IMPL_H */
0 commit comments