@@ -309,12 +309,107 @@ void test_xonly_pubkey_tweak_recursive(void) {
309
309
}
310
310
#undef N_PUBKEYS
311
311
312
+ void test_keypair (void ) {
313
+ unsigned char sk [32 ];
314
+ unsigned char zeros96 [96 ] = { 0 };
315
+ unsigned char overflows [32 ];
316
+ secp256k1_keypair keypair ;
317
+ secp256k1_pubkey pk , pk_tmp ;
318
+ secp256k1_xonly_pubkey xonly_pk , xonly_pk_tmp ;
319
+ int pk_parity , pk_parity_tmp ;
320
+ int ecount ;
321
+ secp256k1_context * none = api_test_context (SECP256K1_CONTEXT_NONE , & ecount );
322
+ secp256k1_context * sign = api_test_context (SECP256K1_CONTEXT_SIGN , & ecount );
323
+ secp256k1_context * verify = api_test_context (SECP256K1_CONTEXT_VERIFY , & ecount );
324
+
325
+ CHECK (sizeof (zeros96 ) == sizeof (keypair ));
326
+ memset (overflows , 0xFF , sizeof (overflows ));
327
+
328
+ /* Test keypair_create */
329
+ ecount = 0 ;
330
+ secp256k1_rand256 (sk );
331
+ CHECK (secp256k1_keypair_create (none , & keypair , sk ) == 0 );
332
+ CHECK (memcmp (zeros96 , & keypair , sizeof (keypair )) == 0 );
333
+ CHECK (ecount == 1 );
334
+ CHECK (secp256k1_keypair_create (verify , & keypair , sk ) == 0 );
335
+ CHECK (memcmp (zeros96 , & keypair , sizeof (keypair )) == 0 );
336
+ CHECK (ecount == 2 );
337
+ CHECK (secp256k1_keypair_create (sign , & keypair , sk ) == 1 );
338
+ CHECK (secp256k1_keypair_create (sign , NULL , sk ) == 0 );
339
+ CHECK (ecount == 3 );
340
+ CHECK (secp256k1_keypair_create (sign , & keypair , NULL ) == 0 );
341
+ CHECK (memcmp (zeros96 , & keypair , sizeof (keypair )) == 0 );
342
+ CHECK (ecount == 4 );
343
+
344
+ /* Invalid secret key */
345
+ CHECK (secp256k1_keypair_create (sign , & keypair , zeros96 ) == 0 );
346
+ CHECK (memcmp (zeros96 , & keypair , sizeof (keypair )) == 0 );
347
+ CHECK (secp256k1_keypair_create (sign , & keypair , overflows ) == 0 );
348
+ CHECK (memcmp (zeros96 , & keypair , sizeof (keypair )) == 0 );
349
+
350
+ /* Test keypair_pub */
351
+ ecount = 0 ;
352
+ secp256k1_rand256 (sk );
353
+ CHECK (secp256k1_keypair_create (ctx , & keypair , sk ) == 1 );
354
+ CHECK (secp256k1_keypair_pub (none , & pk , & keypair ) == 1 );
355
+ CHECK (secp256k1_keypair_pub (none , NULL , & keypair ) == 0 );
356
+ CHECK (ecount == 1 );
357
+ CHECK (secp256k1_keypair_pub (none , & pk , NULL ) == 0 );
358
+ CHECK (ecount == 2 );
359
+ CHECK (memcmp (zeros96 , & pk , sizeof (pk )) == 0 );
360
+
361
+ /* Using an invalid keypair is fine for keypair_pub */
362
+ memset (& keypair , 0 , sizeof (keypair ));
363
+ CHECK (secp256k1_keypair_pub (none , & pk , & keypair ) == 1 );
364
+ CHECK (memcmp (zeros96 , & pk , sizeof (pk )) == 0 );
365
+
366
+ /* keypair holds the same pubkey as pubkey_create */
367
+ CHECK (secp256k1_ec_pubkey_create (sign , & pk , sk ) == 1 );
368
+ CHECK (secp256k1_keypair_create (sign , & keypair , sk ) == 1 );
369
+ CHECK (secp256k1_keypair_pub (none , & pk_tmp , & keypair ) == 1 );
370
+ CHECK (memcmp (& pk , & pk_tmp , sizeof (pk )) == 0 );
371
+
372
+ /** Test keypair_xonly_pub **/
373
+ ecount = 0 ;
374
+ secp256k1_rand256 (sk );
375
+ CHECK (secp256k1_keypair_create (ctx , & keypair , sk ) == 1 );
376
+ CHECK (secp256k1_keypair_xonly_pub (none , & xonly_pk , & pk_parity , & keypair ) == 1 );
377
+ CHECK (secp256k1_keypair_xonly_pub (none , NULL , & pk_parity , & keypair ) == 0 );
378
+ CHECK (ecount == 1 );
379
+ CHECK (secp256k1_keypair_xonly_pub (none , & xonly_pk , NULL , & keypair ) == 1 );
380
+ CHECK (secp256k1_keypair_xonly_pub (none , & xonly_pk , & pk_parity , NULL ) == 0 );
381
+ CHECK (ecount == 2 );
382
+ CHECK (memcmp (zeros96 , & xonly_pk , sizeof (xonly_pk )) == 0 );
383
+ /* Using an invalid keypair will set the xonly_pk to 0 (first reset
384
+ * xonly_pk). */
385
+ CHECK (secp256k1_keypair_xonly_pub (none , & xonly_pk , & pk_parity , & keypair ) == 1 );
386
+ memset (& keypair , 0 , sizeof (keypair ));
387
+ CHECK (secp256k1_keypair_xonly_pub (none , & xonly_pk , & pk_parity , & keypair ) == 0 );
388
+ CHECK (memcmp (zeros96 , & xonly_pk , sizeof (xonly_pk )) == 0 );
389
+ CHECK (ecount == 3 );
390
+
391
+ /** keypair holds the same xonly pubkey as pubkey_create **/
392
+ CHECK (secp256k1_ec_pubkey_create (sign , & pk , sk ) == 1 );
393
+ CHECK (secp256k1_xonly_pubkey_from_pubkey (none , & xonly_pk , & pk_parity , & pk ) == 1 );
394
+ CHECK (secp256k1_keypair_create (sign , & keypair , sk ) == 1 );
395
+ CHECK (secp256k1_keypair_xonly_pub (none , & xonly_pk_tmp , & pk_parity_tmp , & keypair ) == 1 );
396
+ CHECK (memcmp (& xonly_pk , & xonly_pk_tmp , sizeof (pk )) == 0 );
397
+ CHECK (pk_parity == pk_parity_tmp );
398
+
399
+ secp256k1_context_destroy (none );
400
+ secp256k1_context_destroy (sign );
401
+ secp256k1_context_destroy (verify );
402
+ }
403
+
312
404
void run_extrakeys_tests (void ) {
313
405
/* xonly key test cases */
314
406
test_xonly_pubkey ();
315
407
test_xonly_pubkey_tweak ();
316
408
test_xonly_pubkey_tweak_check ();
317
409
test_xonly_pubkey_tweak_recursive ();
410
+
411
+ /* keypair tests */
412
+ test_keypair ();
318
413
}
319
414
320
415
#endif
0 commit comments