@@ -110,6 +110,7 @@ void musig_api_tests(secp256k1_scratch_space *scratch) {
110
110
const unsigned char * invalid_pubnonce_ptr [1 ];
111
111
unsigned char inf_pubnonce [2 ][66 ];
112
112
const unsigned char * inf_pubnonce_ptr [2 ];
113
+ unsigned char combined_pnonce [66 ];
113
114
unsigned char msg [32 ];
114
115
secp256k1_xonly_pubkey combined_pk ;
115
116
secp256k1_musig_pre_session pre_session ;
@@ -274,6 +275,19 @@ void musig_api_tests(secp256k1_scratch_space *scratch) {
274
275
CHECK (secp256k1_musig_session_init (sign , & secnonce [1 ], pubnonce [1 ], session_id [1 ], sk [1 ], NULL , NULL , NULL ) == 1 );
275
276
276
277
/** Receive nonces **/
278
+ ecount = 0 ;
279
+ CHECK (secp256k1_musig_nonces_combine (none , combined_pnonce , pubnonce_ptr , 2 ) == 1 );
280
+ CHECK (secp256k1_musig_nonces_combine (none , NULL , pubnonce_ptr , 2 ) == 0 );
281
+ CHECK (ecount == 1 );
282
+ CHECK (secp256k1_musig_nonces_combine (none , combined_pnonce , NULL , 2 ) == 0 );
283
+ CHECK (ecount == 2 );
284
+ CHECK (secp256k1_musig_nonces_combine (none , combined_pnonce , pubnonce_ptr , 0 ) == 0 );
285
+ CHECK (ecount == 3 );
286
+ CHECK (secp256k1_musig_nonces_combine (none , combined_pnonce , invalid_pubnonce_ptr , 1 ) == 0 );
287
+ CHECK (ecount == 3 );
288
+ CHECK (secp256k1_musig_nonces_combine (none , combined_pnonce , inf_pubnonce_ptr , 2 ) == 0 );
289
+ CHECK (ecount == 3 );
290
+
277
291
ecount = 0 ;
278
292
CHECK (secp256k1_musig_process_nonces (none , & session_cache , & sig_template , & nonce_parity , pubnonce_ptr , 2 , msg , & combined_pk , & pre_session , & adaptor ) == 0 );
279
293
CHECK (ecount == 1 );
@@ -626,6 +640,49 @@ void scriptless_atomic_swap(secp256k1_scratch_space *scratch) {
626
640
CHECK (secp256k1_schnorrsig_verify (ctx , final_sig_a , msg32_a , & combined_pk_a ) == 1 );
627
641
}
628
642
643
+ void musig_combiner_test (secp256k1_scratch_space * scratch ) {
644
+ unsigned char sk [2 ][32 ];
645
+ secp256k1_keypair keypair [2 ];
646
+ unsigned char pubnonce [2 ][66 ];
647
+ const unsigned char * pubnonce_ptr [2 ];
648
+ unsigned char combined_pnonce [66 ];
649
+ const unsigned char * combined_pnonce_ptr [1 ];
650
+ unsigned char msg [32 ];
651
+ secp256k1_xonly_pubkey combined_pk ;
652
+ secp256k1_musig_pre_session pre_session ;
653
+ unsigned char session_id [2 ][32 ];
654
+ secp256k1_musig_secnonce secnonce [2 ];
655
+ secp256k1_xonly_pubkey pk [2 ];
656
+ const secp256k1_xonly_pubkey * pk_ptr [2 ];
657
+ int nonce_parity , nonce_parity2 ;
658
+ secp256k1_musig_template sig_template , sig_template2 ;
659
+ secp256k1_musig_session_cache session_cache , session_cache2 ;
660
+ int i ;
661
+
662
+ secp256k1_testrand256 (msg );
663
+ for (i = 0 ; i < 2 ; i ++ ) {
664
+ secp256k1_testrand256 (session_id [i ]);
665
+ secp256k1_testrand256 (sk [i ]);
666
+ pk_ptr [i ] = & pk [i ];
667
+ pubnonce_ptr [i ] = pubnonce [i ];
668
+ CHECK (create_keypair_and_pk (& keypair [i ], & pk [i ], sk [i ]));
669
+ }
670
+ combined_pnonce_ptr [0 ] = combined_pnonce ;
671
+
672
+ CHECK (secp256k1_musig_pubkey_combine (ctx , scratch , & combined_pk , & pre_session , pk_ptr , 2 ) == 1 );
673
+
674
+ CHECK (secp256k1_musig_session_init (ctx , & secnonce [0 ], pubnonce [0 ], session_id [0 ], sk [0 ], NULL , NULL , NULL ) == 1 );
675
+ CHECK (secp256k1_musig_session_init (ctx , & secnonce [1 ], pubnonce [1 ], session_id [1 ], sk [1 ], NULL , NULL , NULL ) == 1 );
676
+
677
+ CHECK (secp256k1_musig_process_nonces (ctx , & session_cache , & sig_template , & nonce_parity , pubnonce_ptr , 2 , msg , & combined_pk , & pre_session , NULL ) == 1 );
678
+ /* Check that process_nonces on the result of nonces_combine gives the same result */
679
+ CHECK (secp256k1_musig_nonces_combine (ctx , combined_pnonce , pubnonce_ptr , 2 ) == 1 );
680
+ CHECK (secp256k1_musig_process_nonces (ctx , & session_cache2 , & sig_template2 , & nonce_parity2 , combined_pnonce_ptr , 1 , msg , & combined_pk , & pre_session , NULL ) == 1 );
681
+ CHECK (memcmp (& session_cache , & session_cache2 , sizeof (session_cache )) == 0 );
682
+ CHECK (memcmp (& sig_template , & sig_template2 , sizeof (sig_template )) == 0 );
683
+ CHECK (nonce_parity == nonce_parity2 );
684
+ }
685
+
629
686
/* Checks that hash initialized by secp256k1_musig_sha256_init_tagged has the
630
687
* expected state. */
631
688
void sha256_tag_test (void ) {
@@ -903,6 +960,7 @@ void run_musig_tests(void) {
903
960
/* Run multiple times to ensure that pk and nonce have different y
904
961
* parities */
905
962
scriptless_atomic_swap (scratch );
963
+ musig_combiner_test (scratch );
906
964
musig_tweak_test (scratch );
907
965
}
908
966
musig_test_vectors ();
0 commit comments