12
12
#include "group.h"
13
13
#include "ecmult_gen.h"
14
14
#include "hash_impl.h"
15
- #ifdef USE_ECMULT_STATIC_PRECOMPUTATION
16
15
#include "ecmult_static_context.h"
17
- #endif
18
16
19
- #ifndef USE_ECMULT_STATIC_PRECOMPUTATION
20
- static const size_t SECP256K1_ECMULT_GEN_CONTEXT_PREALLOCATED_SIZE = ROUND_TO_ALIGN (sizeof (* ((secp256k1_ecmult_gen_context * ) NULL )-> prec ));
21
- #else
22
- static const size_t SECP256K1_ECMULT_GEN_CONTEXT_PREALLOCATED_SIZE = 0 ;
23
- #endif
17
+ static const size_t SECP256K1_ECMULT_GEN_CONTEXT_PREALLOCATED_SIZE = 0 ;
24
18
25
19
static void secp256k1_ecmult_gen_context_init (secp256k1_ecmult_gen_context * ctx ) {
26
20
ctx -> prec = NULL ;
27
21
}
28
22
29
23
static void secp256k1_ecmult_gen_context_build (secp256k1_ecmult_gen_context * ctx , void * * prealloc ) {
30
- #ifndef USE_ECMULT_STATIC_PRECOMPUTATION
31
- secp256k1_ge prec [ECMULT_GEN_PREC_N * ECMULT_GEN_PREC_G ];
32
- secp256k1_gej gj ;
33
- secp256k1_gej nums_gej ;
34
- int i , j ;
35
- size_t const prealloc_size = SECP256K1_ECMULT_GEN_CONTEXT_PREALLOCATED_SIZE ;
36
- void * const base = * prealloc ;
37
- #endif
38
-
39
24
if (ctx -> prec != NULL ) {
40
25
return ;
41
26
}
42
- #ifndef USE_ECMULT_STATIC_PRECOMPUTATION
43
- ctx -> prec = (secp256k1_ge_storage (* )[ECMULT_GEN_PREC_N ][ECMULT_GEN_PREC_G ])manual_alloc (prealloc , prealloc_size , base , prealloc_size );
44
-
45
- /* get the generator */
46
- secp256k1_gej_set_ge (& gj , & secp256k1_ge_const_g );
47
-
48
- /* Construct a group element with no known corresponding scalar (nothing up my sleeve). */
49
- {
50
- static const unsigned char nums_b32 [33 ] = "The scalar for this x is unknown" ;
51
- secp256k1_fe nums_x ;
52
- secp256k1_ge nums_ge ;
53
- int r ;
54
- r = secp256k1_fe_set_b32 (& nums_x , nums_b32 );
55
- (void )r ;
56
- VERIFY_CHECK (r );
57
- r = secp256k1_ge_set_xo_var (& nums_ge , & nums_x , 0 );
58
- (void )r ;
59
- VERIFY_CHECK (r );
60
- secp256k1_gej_set_ge (& nums_gej , & nums_ge );
61
- /* Add G to make the bits in x uniformly distributed. */
62
- secp256k1_gej_add_ge_var (& nums_gej , & nums_gej , & secp256k1_ge_const_g , NULL );
63
- }
64
-
65
- /* compute prec. */
66
- {
67
- secp256k1_gej precj [ECMULT_GEN_PREC_N * ECMULT_GEN_PREC_G ]; /* Jacobian versions of prec. */
68
- secp256k1_gej gbase ;
69
- secp256k1_gej numsbase ;
70
- gbase = gj ; /* PREC_G^j * G */
71
- numsbase = nums_gej ; /* 2^j * nums. */
72
- for (j = 0 ; j < ECMULT_GEN_PREC_N ; j ++ ) {
73
- /* Set precj[j*PREC_G .. j*PREC_G+(PREC_G-1)] to (numsbase, numsbase + gbase, ..., numsbase + (PREC_G-1)*gbase). */
74
- precj [j * ECMULT_GEN_PREC_G ] = numsbase ;
75
- for (i = 1 ; i < ECMULT_GEN_PREC_G ; i ++ ) {
76
- secp256k1_gej_add_var (& precj [j * ECMULT_GEN_PREC_G + i ], & precj [j * ECMULT_GEN_PREC_G + i - 1 ], & gbase , NULL );
77
- }
78
- /* Multiply gbase by PREC_G. */
79
- for (i = 0 ; i < ECMULT_GEN_PREC_B ; i ++ ) {
80
- secp256k1_gej_double_var (& gbase , & gbase , NULL );
81
- }
82
- /* Multiply numbase by 2. */
83
- secp256k1_gej_double_var (& numsbase , & numsbase , NULL );
84
- if (j == ECMULT_GEN_PREC_N - 2 ) {
85
- /* In the last iteration, numsbase is (1 - 2^j) * nums instead. */
86
- secp256k1_gej_neg (& numsbase , & numsbase );
87
- secp256k1_gej_add_var (& numsbase , & numsbase , & nums_gej , NULL );
88
- }
89
- }
90
- secp256k1_ge_set_all_gej_var (prec , precj , ECMULT_GEN_PREC_N * ECMULT_GEN_PREC_G );
91
- }
92
- for (j = 0 ; j < ECMULT_GEN_PREC_N ; j ++ ) {
93
- for (i = 0 ; i < ECMULT_GEN_PREC_G ; i ++ ) {
94
- secp256k1_ge_to_storage (& (* ctx -> prec )[j ][i ], & prec [j * ECMULT_GEN_PREC_G + i ]);
95
- }
96
- }
97
- #else
98
27
(void )prealloc ;
99
28
ctx -> prec = (secp256k1_ge_storage (* )[ECMULT_GEN_PREC_N ][ECMULT_GEN_PREC_G ])secp256k1_ecmult_static_context ;
100
- #endif
101
29
secp256k1_ecmult_gen_blind (ctx , NULL );
102
30
}
103
31
@@ -106,14 +34,7 @@ static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_cont
106
34
}
107
35
108
36
static void secp256k1_ecmult_gen_context_finalize_memcpy (secp256k1_ecmult_gen_context * dst , const secp256k1_ecmult_gen_context * src ) {
109
- #ifndef USE_ECMULT_STATIC_PRECOMPUTATION
110
- if (src -> prec != NULL ) {
111
- /* We cast to void* first to suppress a -Wcast-align warning. */
112
- dst -> prec = (secp256k1_ge_storage (* )[ECMULT_GEN_PREC_N ][ECMULT_GEN_PREC_G ])(void * )((unsigned char * )dst + ((unsigned char * )src -> prec - (unsigned char * )src ));
113
- }
114
- #else
115
37
(void )dst , (void )src ;
116
- #endif
117
38
}
118
39
119
40
static void secp256k1_ecmult_gen_context_clear (secp256k1_ecmult_gen_context * ctx ) {
0 commit comments