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