@@ -137,23 +137,47 @@ void random_scalar_order(secp256k1_scalar *num) {
137
137
} while (1 );
138
138
}
139
139
140
- void run_context_tests (void ) {
140
+ void run_context_tests (int use_prealloc ) {
141
141
secp256k1_pubkey pubkey ;
142
142
secp256k1_pubkey zero_pubkey ;
143
143
secp256k1_ecdsa_signature sig ;
144
144
unsigned char ctmp [32 ];
145
145
int32_t ecount ;
146
146
int32_t ecount2 ;
147
- secp256k1_context * none = secp256k1_context_create (SECP256K1_CONTEXT_NONE );
148
- secp256k1_context * sign = secp256k1_context_create (SECP256K1_CONTEXT_SIGN );
149
- secp256k1_context * vrfy = secp256k1_context_create (SECP256K1_CONTEXT_VERIFY );
150
- secp256k1_context * both = secp256k1_context_create (SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY );
147
+ secp256k1_context * none ;
148
+ secp256k1_context * sign ;
149
+ secp256k1_context * vrfy ;
150
+ secp256k1_context * both ;
151
+ void * none_prealloc = NULL ;
152
+ void * sign_prealloc = NULL ;
153
+ void * vrfy_prealloc = NULL ;
154
+ void * both_prealloc = NULL ;
151
155
152
156
secp256k1_gej pubj ;
153
157
secp256k1_ge pub ;
154
158
secp256k1_scalar msg , key , nonce ;
155
159
secp256k1_scalar sigr , sigs ;
156
160
161
+ if (use_prealloc ) {
162
+ none_prealloc = malloc (secp256k1_context_preallocated_size (SECP256K1_CONTEXT_NONE ));
163
+ sign_prealloc = malloc (secp256k1_context_preallocated_size (SECP256K1_CONTEXT_SIGN ));
164
+ vrfy_prealloc = malloc (secp256k1_context_preallocated_size (SECP256K1_CONTEXT_VERIFY ));
165
+ both_prealloc = malloc (secp256k1_context_preallocated_size (SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY ));
166
+ CHECK (none_prealloc != NULL );
167
+ CHECK (sign_prealloc != NULL );
168
+ CHECK (vrfy_prealloc != NULL );
169
+ CHECK (both_prealloc != NULL );
170
+ none = secp256k1_context_preallocated_create (none_prealloc , SECP256K1_CONTEXT_NONE );
171
+ sign = secp256k1_context_preallocated_create (sign_prealloc , SECP256K1_CONTEXT_SIGN );
172
+ vrfy = secp256k1_context_preallocated_create (vrfy_prealloc , SECP256K1_CONTEXT_VERIFY );
173
+ both = secp256k1_context_preallocated_create (both_prealloc , SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY );
174
+ } else {
175
+ none = secp256k1_context_create (SECP256K1_CONTEXT_NONE );
176
+ sign = secp256k1_context_create (SECP256K1_CONTEXT_SIGN );
177
+ vrfy = secp256k1_context_create (SECP256K1_CONTEXT_VERIFY );
178
+ both = secp256k1_context_create (SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY );
179
+ }
180
+
157
181
memset (& zero_pubkey , 0 , sizeof (zero_pubkey ));
158
182
159
183
ecount = 0 ;
@@ -163,14 +187,57 @@ void run_context_tests(void) {
163
187
secp256k1_context_set_error_callback (sign , counting_illegal_callback_fn , NULL );
164
188
CHECK (vrfy -> error_callback .fn != sign -> error_callback .fn );
165
189
190
+ /* check if sizes for cloning are consistent */
191
+ CHECK (secp256k1_context_preallocated_clone_size (none ) == secp256k1_context_preallocated_size (SECP256K1_CONTEXT_NONE ));
192
+ CHECK (secp256k1_context_preallocated_clone_size (sign ) == secp256k1_context_preallocated_size (SECP256K1_CONTEXT_SIGN ));
193
+ CHECK (secp256k1_context_preallocated_clone_size (vrfy ) == secp256k1_context_preallocated_size (SECP256K1_CONTEXT_VERIFY ));
194
+ CHECK (secp256k1_context_preallocated_clone_size (both ) == secp256k1_context_preallocated_size (SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY ));
195
+
166
196
/*** clone and destroy all of them to make sure cloning was complete ***/
167
197
{
168
198
secp256k1_context * ctx_tmp ;
169
199
170
- ctx_tmp = none ; none = secp256k1_context_clone (none ); secp256k1_context_destroy (ctx_tmp );
171
- ctx_tmp = sign ; sign = secp256k1_context_clone (sign ); secp256k1_context_destroy (ctx_tmp );
172
- ctx_tmp = vrfy ; vrfy = secp256k1_context_clone (vrfy ); secp256k1_context_destroy (ctx_tmp );
173
- ctx_tmp = both ; both = secp256k1_context_clone (both ); secp256k1_context_destroy (ctx_tmp );
200
+ if (use_prealloc ) {
201
+ /* clone into a non-preallocated context and then again into a new preallocated one. */
202
+ ctx_tmp = none ; none = secp256k1_context_clone (none ); secp256k1_context_preallocated_destroy (ctx_tmp );
203
+ free (none_prealloc ); none_prealloc = malloc (secp256k1_context_preallocated_size (SECP256K1_CONTEXT_NONE )); CHECK (none_prealloc != NULL );
204
+ ctx_tmp = none ; none = secp256k1_context_preallocated_clone (none , none_prealloc ); secp256k1_context_destroy (ctx_tmp );
205
+
206
+ ctx_tmp = sign ; sign = secp256k1_context_clone (sign ); secp256k1_context_preallocated_destroy (ctx_tmp );
207
+ free (sign_prealloc ); sign_prealloc = malloc (secp256k1_context_preallocated_size (SECP256K1_CONTEXT_SIGN )); CHECK (sign_prealloc != NULL );
208
+ ctx_tmp = sign ; sign = secp256k1_context_preallocated_clone (sign , sign_prealloc ); secp256k1_context_destroy (ctx_tmp );
209
+
210
+ ctx_tmp = vrfy ; vrfy = secp256k1_context_clone (vrfy ); secp256k1_context_preallocated_destroy (ctx_tmp );
211
+ free (vrfy_prealloc ); vrfy_prealloc = malloc (secp256k1_context_preallocated_size (SECP256K1_CONTEXT_VERIFY )); CHECK (vrfy_prealloc != NULL );
212
+ ctx_tmp = vrfy ; vrfy = secp256k1_context_preallocated_clone (vrfy , vrfy_prealloc ); secp256k1_context_destroy (ctx_tmp );
213
+
214
+ ctx_tmp = both ; both = secp256k1_context_clone (both ); secp256k1_context_preallocated_destroy (ctx_tmp );
215
+ free (both_prealloc ); both_prealloc = malloc (secp256k1_context_preallocated_size (SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY )); CHECK (both_prealloc != NULL );
216
+ ctx_tmp = both ; both = secp256k1_context_preallocated_clone (both , both_prealloc ); secp256k1_context_destroy (ctx_tmp );
217
+ } else {
218
+ /* clone into a preallocated context and then again into a new non-preallocated one. */
219
+ void * prealloc_tmp ;
220
+
221
+ prealloc_tmp = malloc (secp256k1_context_preallocated_size (SECP256K1_CONTEXT_NONE )); CHECK (prealloc_tmp != NULL );
222
+ ctx_tmp = none ; none = secp256k1_context_preallocated_clone (none , prealloc_tmp ); secp256k1_context_destroy (ctx_tmp );
223
+ ctx_tmp = none ; none = secp256k1_context_clone (none ); secp256k1_context_preallocated_destroy (ctx_tmp );
224
+ free (prealloc_tmp );
225
+
226
+ prealloc_tmp = malloc (secp256k1_context_preallocated_size (SECP256K1_CONTEXT_SIGN )); CHECK (prealloc_tmp != NULL );
227
+ ctx_tmp = sign ; sign = secp256k1_context_preallocated_clone (sign , prealloc_tmp ); secp256k1_context_destroy (ctx_tmp );
228
+ ctx_tmp = sign ; sign = secp256k1_context_clone (sign ); secp256k1_context_preallocated_destroy (ctx_tmp );
229
+ free (prealloc_tmp );
230
+
231
+ prealloc_tmp = malloc (secp256k1_context_preallocated_size (SECP256K1_CONTEXT_VERIFY )); CHECK (prealloc_tmp != NULL );
232
+ ctx_tmp = vrfy ; vrfy = secp256k1_context_preallocated_clone (vrfy , prealloc_tmp ); secp256k1_context_destroy (ctx_tmp );
233
+ ctx_tmp = vrfy ; vrfy = secp256k1_context_clone (vrfy ); secp256k1_context_preallocated_destroy (ctx_tmp );
234
+ free (prealloc_tmp );
235
+
236
+ prealloc_tmp = malloc (secp256k1_context_preallocated_size (SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY )); CHECK (prealloc_tmp != NULL );
237
+ ctx_tmp = both ; both = secp256k1_context_preallocated_clone (both , prealloc_tmp ); secp256k1_context_destroy (ctx_tmp );
238
+ ctx_tmp = both ; both = secp256k1_context_clone (both ); secp256k1_context_preallocated_destroy (ctx_tmp );
239
+ free (prealloc_tmp );
240
+ }
174
241
}
175
242
176
243
/* Verify that the error callback makes it across the clone. */
@@ -243,12 +310,25 @@ void run_context_tests(void) {
243
310
CHECK (secp256k1_ecdsa_sig_verify (& both -> ecmult_ctx , & sigr , & sigs , & pub , & msg ));
244
311
245
312
/* cleanup */
246
- secp256k1_context_destroy (none );
247
- secp256k1_context_destroy (sign );
248
- secp256k1_context_destroy (vrfy );
249
- secp256k1_context_destroy (both );
313
+ if (use_prealloc ) {
314
+ secp256k1_context_preallocated_destroy (none );
315
+ secp256k1_context_preallocated_destroy (sign );
316
+ secp256k1_context_preallocated_destroy (vrfy );
317
+ secp256k1_context_preallocated_destroy (both );
318
+ free (none_prealloc );
319
+ free (sign_prealloc );
320
+ free (vrfy_prealloc );
321
+ free (both_prealloc );
322
+ } else {
323
+ secp256k1_context_destroy (none );
324
+ secp256k1_context_destroy (sign );
325
+ secp256k1_context_destroy (vrfy );
326
+ secp256k1_context_destroy (both );
327
+ }
250
328
/* Defined as no-op. */
251
329
secp256k1_context_destroy (NULL );
330
+ secp256k1_context_preallocated_destroy (NULL );
331
+
252
332
}
253
333
254
334
void run_scratch_tests (void ) {
@@ -5058,7 +5138,8 @@ int main(int argc, char **argv) {
5058
5138
printf ("random seed = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n" , seed16 [0 ], seed16 [1 ], seed16 [2 ], seed16 [3 ], seed16 [4 ], seed16 [5 ], seed16 [6 ], seed16 [7 ], seed16 [8 ], seed16 [9 ], seed16 [10 ], seed16 [11 ], seed16 [12 ], seed16 [13 ], seed16 [14 ], seed16 [15 ]);
5059
5139
5060
5140
/* initialize */
5061
- run_context_tests ();
5141
+ run_context_tests (0 );
5142
+ run_context_tests (1 );
5062
5143
run_scratch_tests ();
5063
5144
ctx = secp256k1_context_create (SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY );
5064
5145
if (secp256k1_rand_bits (1 )) {
0 commit comments