@@ -307,15 +307,21 @@ impl PublicKey {
307307 ///
308308 /// Returns an error if the resulting key would be invalid.
309309 #[ inline]
310- pub fn mul_tweak < C : Verification > (
311- mut self ,
312- secp : & Secp256k1 < C > ,
313- other : & Scalar ,
314- ) -> Result < PublicKey , Error > {
310+ pub fn mul_tweak ( mut self , other : & Scalar ) -> Result < PublicKey , Error > {
311+ // We have no seed here but we want rerandomiziation to happen for `rand` users.
312+ let seed = [ 0_u8 ; 32 ] ;
315313 unsafe {
316- if ffi:: secp256k1_ec_pubkey_tweak_mul ( secp. ctx . as_ptr ( ) , & mut self . 0 , other. as_c_ptr ( ) )
317- == 1
318- {
314+ let res = crate :: with_global_context (
315+ |secp : & Secp256k1 < crate :: AllPreallocated > | {
316+ ffi:: secp256k1_ec_pubkey_tweak_mul (
317+ secp. ctx . as_ptr ( ) ,
318+ & mut self . 0 ,
319+ other. as_c_ptr ( ) ,
320+ )
321+ } ,
322+ Some ( & seed) ,
323+ ) ;
324+ if res == 1 {
319325 Ok ( self )
320326 } else {
321327 Err ( Error :: InvalidTweak )
@@ -649,21 +655,24 @@ impl Keypair {
649655 /// let tweak = Scalar::random();
650656 ///
651657 /// let mut keypair = Keypair::new(&secp, &mut rand::rng());
652- /// let tweaked = keypair.add_xonly_tweak(&secp, & tweak).expect("Improbable to fail with a randomly generated tweak");
658+ /// let tweaked = keypair.add_xonly_tweak(&tweak).expect("Improbable to fail with a randomly generated tweak");
653659 /// # }
654660 /// ```
655661 // TODO: Add checked implementation
656662 #[ inline]
657- pub fn add_xonly_tweak < C : Verification > (
658- mut self ,
659- secp : & Secp256k1 < C > ,
660- tweak : & Scalar ,
661- ) -> Result < Keypair , Error > {
663+ pub fn add_xonly_tweak ( mut self , tweak : & Scalar ) -> Result < Keypair , Error > {
664+ // We have no seed here but we want rerandomiziation to happen for `rand` users.
665+ let seed = [ 0_u8 ; 32 ] ;
662666 unsafe {
663- let err = ffi:: secp256k1_keypair_xonly_tweak_add (
664- secp. ctx . as_ptr ( ) ,
665- & mut self . 0 ,
666- tweak. as_c_ptr ( ) ,
667+ let err = crate :: with_global_context (
668+ |secp : & Secp256k1 < crate :: AllPreallocated > | {
669+ ffi:: secp256k1_keypair_xonly_tweak_add (
670+ secp. ctx . as_ptr ( ) ,
671+ & mut self . 0 ,
672+ tweak. as_c_ptr ( ) ,
673+ )
674+ } ,
675+ Some ( & seed) ,
667676 ) ;
668677 if err != 1 {
669678 return Err ( Error :: InvalidTweak ) ;
@@ -981,32 +990,40 @@ impl XOnlyPublicKey {
981990 ///
982991 /// let mut keypair = Keypair::new(&secp, &mut rand::rng());
983992 /// let (xonly, _parity) = keypair.x_only_public_key();
984- /// let tweaked = xonly.add_tweak(&secp, & tweak).expect("Improbable to fail with a randomly generated tweak");
993+ /// let tweaked = xonly.add_tweak(&tweak).expect("Improbable to fail with a randomly generated tweak");
985994 /// # }
986995 /// ```
987- pub fn add_tweak < V : Verification > (
988- mut self ,
989- secp : & Secp256k1 < V > ,
990- tweak : & Scalar ,
991- ) -> Result < ( XOnlyPublicKey , Parity ) , Error > {
996+ pub fn add_tweak ( mut self , tweak : & Scalar ) -> Result < ( XOnlyPublicKey , Parity ) , Error > {
992997 let mut pk_parity = 0 ;
998+ // We have no seed here but we want rerandomiziation to happen for `rand` users.
999+ let seed = [ 0_u8 ; 32 ] ;
9931000 unsafe {
9941001 let mut pubkey = ffi:: PublicKey :: new ( ) ;
995- let mut err = ffi:: secp256k1_xonly_pubkey_tweak_add (
996- secp. ctx . as_ptr ( ) ,
997- & mut pubkey,
998- self . as_c_ptr ( ) ,
999- tweak. as_c_ptr ( ) ,
1002+ let mut err = crate :: with_global_context (
1003+ |secp : & Secp256k1 < crate :: AllPreallocated > | {
1004+ ffi:: secp256k1_xonly_pubkey_tweak_add (
1005+ secp. ctx . as_ptr ( ) ,
1006+ & mut pubkey,
1007+ self . as_c_ptr ( ) ,
1008+ tweak. as_c_ptr ( ) ,
1009+ )
1010+ } ,
1011+ Some ( & seed) ,
10001012 ) ;
10011013 if err != 1 {
10021014 return Err ( Error :: InvalidTweak ) ;
10031015 }
10041016
1005- err = ffi:: secp256k1_xonly_pubkey_from_pubkey (
1006- secp. ctx . as_ptr ( ) ,
1007- & mut self . 0 ,
1008- & mut pk_parity,
1009- & pubkey,
1017+ err = crate :: with_global_context (
1018+ |secp : & Secp256k1 < crate :: AllPreallocated > | {
1019+ ffi:: secp256k1_xonly_pubkey_from_pubkey (
1020+ secp. ctx . as_ptr ( ) ,
1021+ & mut self . 0 ,
1022+ & mut pk_parity,
1023+ & pubkey,
1024+ )
1025+ } ,
1026+ Some ( & seed) ,
10101027 ) ;
10111028 if err == 0 {
10121029 return Err ( Error :: InvalidPublicKey ) ;
@@ -1042,25 +1059,31 @@ impl XOnlyPublicKey {
10421059 /// let mut keypair = Keypair::new(&secp, &mut rand::rng());
10431060 /// let (mut public_key, _) = keypair.x_only_public_key();
10441061 /// let original = public_key;
1045- /// let (tweaked, parity) = public_key.add_tweak(&secp, & tweak).expect("Improbable to fail with a randomly generated tweak");
1046- /// assert!(original.tweak_add_check(&secp, & tweaked, parity, tweak));
1062+ /// let (tweaked, parity) = public_key.add_tweak(&tweak).expect("Improbable to fail with a randomly generated tweak");
1063+ /// assert!(original.tweak_add_check(&tweaked, parity, tweak));
10471064 /// # }
10481065 /// ```
1049- pub fn tweak_add_check < V : Verification > (
1066+ pub fn tweak_add_check (
10501067 & self ,
1051- secp : & Secp256k1 < V > ,
10521068 tweaked_key : & Self ,
10531069 tweaked_parity : Parity ,
10541070 tweak : Scalar ,
10551071 ) -> bool {
10561072 let tweaked_ser = tweaked_key. serialize ( ) ;
1073+ // We have no seed here but we want rerandomiziation to happen for `rand` users.
1074+ let seed = [ 0_u8 ; 32 ] ;
10571075 unsafe {
1058- let err = ffi:: secp256k1_xonly_pubkey_tweak_add_check (
1059- secp. ctx . as_ptr ( ) ,
1060- tweaked_ser. as_c_ptr ( ) ,
1061- tweaked_parity. to_i32 ( ) ,
1062- & self . 0 ,
1063- tweak. as_c_ptr ( ) ,
1076+ let err = crate :: with_global_context (
1077+ |secp : & Secp256k1 < crate :: AllPreallocated > | {
1078+ ffi:: secp256k1_xonly_pubkey_tweak_add_check (
1079+ secp. ctx . as_ptr ( ) ,
1080+ tweaked_ser. as_c_ptr ( ) ,
1081+ tweaked_parity. to_i32 ( ) ,
1082+ & self . 0 ,
1083+ tweak. as_c_ptr ( ) ,
1084+ )
1085+ } ,
1086+ Some ( & seed) ,
10641087 ) ;
10651088
10661089 err == 1
@@ -1690,8 +1713,6 @@ mod test {
16901713 #[ test]
16911714 #[ cfg( feature = "std" ) ]
16921715 fn tweak_mul_arbitrary_data ( ) {
1693- let s = Secp256k1 :: new ( ) ;
1694-
16951716 let ( sk, pk) = crate :: test_random_keypair ( ) ;
16961717 assert_eq ! ( PublicKey :: from_secret_key( & sk) , pk) ; // Sanity check.
16971718
@@ -1700,7 +1721,7 @@ mod test {
17001721
17011722 let tweaked_sk = sk. mul_tweak ( & tweak) . unwrap ( ) ;
17021723 assert_ne ! ( sk, tweaked_sk) ; // Make sure we did something.
1703- let tweaked_pk = pk. mul_tweak ( & s , & tweak) . unwrap ( ) ;
1724+ let tweaked_pk = pk. mul_tweak ( & tweak) . unwrap ( ) ;
17041725 assert_ne ! ( pk, tweaked_pk) ;
17051726 assert_eq ! ( PublicKey :: from_secret_key( & tweaked_sk) , tweaked_pk) ;
17061727 }
@@ -1925,24 +1946,22 @@ mod test {
19251946 #[ test]
19261947 #[ cfg( feature = "std" ) ]
19271948 fn test_tweak_add_then_tweak_add_check ( ) {
1928- let s = Secp256k1 :: new ( ) ;
1929-
19301949 for _ in 0 ..10 {
19311950 let tweak = Scalar :: test_random ( ) ;
19321951
19331952 let kp = Keypair :: test_random ( ) ;
19341953 let ( xonly, _) = XOnlyPublicKey :: from_keypair ( & kp) ;
19351954
1936- let tweaked_kp = kp. add_xonly_tweak ( & s , & tweak) . expect ( "keypair tweak add failed" ) ;
1955+ let tweaked_kp = kp. add_xonly_tweak ( & tweak) . expect ( "keypair tweak add failed" ) ;
19371956 let ( tweaked_xonly, parity) =
1938- xonly. add_tweak ( & s , & tweak) . expect ( "xonly pubkey tweak failed" ) ;
1957+ xonly. add_tweak ( & tweak) . expect ( "xonly pubkey tweak failed" ) ;
19391958
19401959 let ( want_tweaked_xonly, tweaked_kp_parity) = XOnlyPublicKey :: from_keypair ( & tweaked_kp) ;
19411960
19421961 assert_eq ! ( tweaked_xonly, want_tweaked_xonly) ;
19431962 assert_eq ! ( parity, tweaked_kp_parity) ;
19441963
1945- assert ! ( xonly. tweak_add_check( & s , & tweaked_xonly, parity, tweak) ) ;
1964+ assert ! ( xonly. tweak_add_check( & tweaked_xonly, parity, tweak) ) ;
19461965 }
19471966 }
19481967
0 commit comments