@@ -576,6 +576,8 @@ impl<H: Digest<OutputSize = U32> + Clone, NG> MuSig<H, Schnorr<H, NG>> {
576
576
577
577
#[ cfg( test) ]
578
578
mod test {
579
+ use crate :: adaptor:: Adaptor ;
580
+
579
581
use super :: * ;
580
582
use secp256kfun:: {
581
583
nonce:: Deterministic ,
@@ -586,10 +588,10 @@ mod test {
586
588
proptest ! {
587
589
#[ test]
588
590
fn test_end_to_end( sk1 in any:: <Scalar >( ) ,
589
- sk2 in any:: <Scalar >( ) ,
590
- sk3 in any:: <Scalar >( ) ,
591
- tweak1 in option:: of( any:: <Scalar <Public , Zero >>( ) ) ,
592
- tweak2 in option:: of( any:: <Scalar <Public , Zero >>( ) ) ,
591
+ sk2 in any:: <Scalar >( ) ,
592
+ sk3 in any:: <Scalar >( ) ,
593
+ tweak1 in option:: of( any:: <Scalar <Public , Zero >>( ) ) ,
594
+ tweak2 in option:: of( any:: <Scalar <Public , Zero >>( ) ) ,
593
595
) {
594
596
let schnorr = Schnorr :: <Sha256 , _>:: new( Deterministic :: <Sha256 >:: default ( ) ) ;
595
597
let musig = MuSig :: new( schnorr) ;
@@ -603,7 +605,7 @@ mod test {
603
605
. schnorr
604
606
. new_keypair( sk3) ;
605
607
606
- let mut keylist = musig. new_keylist( vec![
608
+ let mut keylist1 = musig. new_keylist( vec![
607
609
keypair1. public_key( ) ,
608
610
keypair2. public_key( ) ,
609
611
keypair3. public_key( ) ,
@@ -621,76 +623,168 @@ mod test {
621
623
622
624
for tweak in [ tweak1, tweak2] {
623
625
if let Some ( tweak) = tweak {
624
- keylist = keylist . tweak( tweak) . unwrap( ) ;
626
+ keylist1 = keylist1 . tweak( tweak) . unwrap( ) ;
625
627
keylist2 = keylist2. tweak( tweak) . unwrap( ) ;
626
628
keylist3 = keylist3. tweak( tweak) . unwrap( ) ;
627
629
}
628
630
}
629
631
630
- assert_eq!( keylist . agg_public_key( ) , keylist2. agg_public_key( ) ) ;
631
- assert_eq!( keylist . agg_public_key( ) , keylist3. agg_public_key( ) ) ;
632
+ assert_eq!( keylist1 . agg_public_key( ) , keylist2. agg_public_key( ) ) ;
633
+ assert_eq!( keylist1 . agg_public_key( ) , keylist3. agg_public_key( ) ) ;
632
634
633
- let p1_nonce = musig. gen_nonces( & keypair1. sk, & keylist , b"test" ) ;
634
- let p2_nonce = musig. gen_nonces( & keypair2. sk, & keylist , b"test" ) ;
635
- let p3_nonce = musig. gen_nonces( & keypair3. sk, & keylist , b"test" ) ;
635
+ let p1_nonce = musig. gen_nonces( & keypair1. sk, & keylist1 , b"test" ) ;
636
+ let p2_nonce = musig. gen_nonces( & keypair2. sk, & keylist1 , b"test" ) ;
637
+ let p3_nonce = musig. gen_nonces( & keypair3. sk, & keylist1 , b"test" ) ;
636
638
let nonces = vec![ p1_nonce. public, p2_nonce. public, p3_nonce. public] ;
637
639
638
640
let message =
639
641
Message :: <Public >:: plain( "test" , b"Chancellor on brink of second bailout for banks" ) ;
640
642
641
643
let p1_session = musig
642
644
. start_sign_session(
643
- & keylist ,
645
+ & keylist1 ,
644
646
nonces. clone( ) ,
645
647
message,
646
648
)
647
649
. unwrap( ) ;
648
650
let p2_session = musig
649
651
. start_sign_session(
650
- & keylist ,
652
+ & keylist2 ,
651
653
nonces. clone( ) ,
652
654
message,
653
655
)
654
656
. unwrap( ) ;
655
657
let p3_session = musig
656
658
. start_sign_session(
657
- & keylist ,
659
+ & keylist3 ,
658
660
nonces. clone( ) ,
659
661
message,
660
662
)
661
663
. unwrap( ) ;
662
664
663
- let p1_sig = musig. sign( & keylist , 0 , & keypair1. sk, p1_nonce, & p1_session) ;
665
+ let p1_sig = musig. sign( & keylist1 , 0 , & keypair1. sk, p1_nonce, & p1_session) ;
664
666
665
- assert!( musig. verify_partial_signature( & keylist , & p1_session, 0 , p1_sig) ) ;
667
+ assert!( musig. verify_partial_signature( & keylist1 , & p1_session, 0 , p1_sig) ) ;
666
668
dbg!( & p1_session, & p2_session) ;
667
669
dbg!( & p1_sig) ;
668
670
assert_eq!( p1_session, p2_session) ;
669
671
670
- assert!( musig. verify_partial_signature( & keylist , & p2_session, 0 , p1_sig) ) ;
671
- assert!( musig. verify_partial_signature( & keylist , & p3_session, 0 , p1_sig) ) ;
672
+ assert!( musig. verify_partial_signature( & keylist1 , & p2_session, 0 , p1_sig) ) ;
673
+ assert!( musig. verify_partial_signature( & keylist1 , & p3_session, 0 , p1_sig) ) ;
672
674
673
- let p2_sig = musig. sign( & keylist , 1 , & keypair2. sk, p2_nonce, & p2_session) ;
674
- assert!( musig. verify_partial_signature( & keylist , & p1_session, 1 , p2_sig) ) ;
675
- let p3_sig = musig. sign( & keylist , 2 , & keypair3. sk, p3_nonce, & p3_session) ;
676
- assert!( musig. verify_partial_signature( & keylist , & p1_session, 2 , p3_sig) ) ;
675
+ let p2_sig = musig. sign( & keylist1 , 1 , & keypair2. sk, p2_nonce, & p2_session) ;
676
+ assert!( musig. verify_partial_signature( & keylist1 , & p1_session, 1 , p2_sig) ) ;
677
+ let p3_sig = musig. sign( & keylist1 , 2 , & keypair3. sk, p3_nonce, & p3_session) ;
678
+ assert!( musig. verify_partial_signature( & keylist1 , & p1_session, 2 , p3_sig) ) ;
677
679
678
680
let partial_sigs = [ p1_sig, p2_sig, p3_sig] ;
679
- let sig_p1 = musig. combine_partial_signatures( & keylist , & p1_session, partial_sigs) ;
680
- let sig_p2 = musig. combine_partial_signatures( & keylist , & p2_session, partial_sigs) ;
681
- let sig_p3 = musig. combine_partial_signatures( & keylist , & p3_session, partial_sigs) ;
681
+ let sig_p1 = musig. combine_partial_signatures( & keylist1 , & p1_session, partial_sigs) ;
682
+ let sig_p2 = musig. combine_partial_signatures( & keylist1 , & p2_session, partial_sigs) ;
683
+ let sig_p3 = musig. combine_partial_signatures( & keylist1 , & p3_session, partial_sigs) ;
682
684
assert_eq!( sig_p1, sig_p2) ;
683
685
assert_eq!( sig_p1, sig_p3) ;
684
686
685
687
assert!( musig
686
688
. schnorr
687
- . verify( & keylist . agg_verification_key( ) , message, & sig_p1) ) ;
689
+ . verify( & keylist1 . agg_verification_key( ) , message, & sig_p1) ) ;
688
690
assert!( musig
689
691
. schnorr
690
- . verify( & keylist . agg_verification_key( ) , message, & sig_p2) ) ;
692
+ . verify( & keylist1 . agg_verification_key( ) , message, & sig_p2) ) ;
691
693
assert!( musig
692
694
. schnorr
693
- . verify( & keylist. agg_verification_key( ) , message, & sig_p3) ) ;
695
+ . verify( & keylist1. agg_verification_key( ) , message, & sig_p3) ) ;
696
+ }
697
+
698
+ #[ test]
699
+ fn test_musig_adaptor(
700
+ sk1 in any:: <Scalar >( ) ,
701
+ sk2 in any:: <Scalar >( ) ,
702
+ sk3 in any:: <Scalar >( ) ,
703
+ y in any:: <Scalar >( )
704
+ ) {
705
+ let schnorr = Schnorr :: <Sha256 , _>:: new( Deterministic :: <Sha256 >:: default ( ) ) ;
706
+ let musig = MuSig :: new( schnorr) ;
707
+ let keypair1 = musig
708
+ . schnorr
709
+ . new_keypair( sk1) ;
710
+ let keypair2 = musig
711
+ . schnorr
712
+ . new_keypair( sk2) ;
713
+ let keypair3 = musig
714
+ . schnorr
715
+ . new_keypair( sk3) ;
716
+ let encryption_key = musig. schnorr. encryption_key_for( & y) ;
717
+
718
+ let keylist = musig. new_keylist( vec![
719
+ keypair1. public_key( ) ,
720
+ keypair2. public_key( ) ,
721
+ keypair3. public_key( ) ,
722
+ ] ) ;
723
+ let keylist2 = musig. new_keylist( vec![
724
+ keypair1. public_key( ) ,
725
+ keypair2. public_key( ) ,
726
+ keypair3. public_key( ) ,
727
+ ] ) ;
728
+ let keylist3 = musig. new_keylist( vec![
729
+ keypair1. public_key( ) ,
730
+ keypair2. public_key( ) ,
731
+ keypair3. public_key( ) ,
732
+ ] ) ;
733
+ assert_eq!( keylist. agg_public_key( ) , keylist2. agg_public_key( ) ) ;
734
+
735
+ let p1_nonce = musig. gen_nonces( & keypair1. sk, & keylist, b"test" ) ;
736
+ let p2_nonce = musig. gen_nonces( & keypair2. sk, & keylist2, b"test" ) ;
737
+ let p3_nonce = musig. gen_nonces( & keypair3. sk, & keylist3, b"test" ) ;
738
+ let nonces = vec![ p1_nonce. public, p2_nonce. public, p3_nonce. public] ;
739
+ let message =
740
+ Message :: <Public >:: plain( "test" , b"Chancellor on brink of second bailout for banks" ) ;
741
+
742
+ let mut p1_session = musig
743
+ . start_encrypted_sign_session(
744
+ & keylist,
745
+ nonces. clone( ) ,
746
+ message,
747
+ & encryption_key
748
+ )
749
+ . unwrap( ) ;
750
+ let mut p2_session = musig
751
+ . start_encrypted_sign_session(
752
+ & keylist2,
753
+ nonces. clone( ) ,
754
+ message,
755
+ & encryption_key
756
+ )
757
+ . unwrap( ) ;
758
+ let mut p3_session = musig
759
+ . start_encrypted_sign_session(
760
+ & keylist3,
761
+ nonces,
762
+ message,
763
+ & encryption_key
764
+ )
765
+ . unwrap( ) ;
766
+ let p1_sig = musig. sign( & keylist, 0 , & keypair1. sk, p1_nonce, & mut p1_session) ;
767
+ let p2_sig = musig. sign( & keylist, 1 , & keypair2. sk, p2_nonce, & mut p2_session) ;
768
+ let p3_sig = musig. sign( & keylist, 2 , & keypair3. sk, p3_nonce, & mut p3_session) ;
769
+
770
+ assert!( musig. verify_partial_signature( & keylist2, & p2_session, 0 , p1_sig) ) ;
771
+ assert!( musig. verify_partial_signature( & keylist, & p1_session, 0 , p1_sig) ) ;
772
+
773
+ let partial_sigs = vec![ p1_sig, p2_sig, p3_sig] ;
774
+ let combined_sig_p1 = musig. combine_partial_encrypted_signatures( & keylist, & p1_session, partial_sigs. clone( ) ) ;
775
+ let combined_sig_p2 = musig. combine_partial_encrypted_signatures( & keylist2, & p2_session, partial_sigs. clone( ) ) ;
776
+ let combined_sig_p3 = musig. combine_partial_encrypted_signatures( & keylist3, & p3_session, partial_sigs) ;
777
+ assert_eq!( combined_sig_p1, combined_sig_p2) ;
778
+ assert_eq!( combined_sig_p1, combined_sig_p3) ;
779
+ assert!( musig
780
+ . schnorr
781
+ . verify_encrypted_signature( & keylist. agg_verification_key( ) , & encryption_key, message, & combined_sig_p1) ) ;
782
+ assert!( musig
783
+ . schnorr
784
+ . verify_encrypted_signature( & keylist2. agg_verification_key( ) , & encryption_key, message, & combined_sig_p2) ) ;
785
+ assert!( musig
786
+ . schnorr
787
+ . verify_encrypted_signature( & keylist2. agg_verification_key( ) , & encryption_key, message, & combined_sig_p3) ) ;
694
788
}
695
789
}
696
790
0 commit comments