@@ -20,8 +20,7 @@ use crate::ThirtyTwoByteHash;
2020#[ cfg( feature = "global-context" ) ]
2121use crate :: SECP256K1 ;
2222use crate :: {
23- constants, ecdsa, from_hex, schnorr, AllPreallocated , Message , Scalar , Secp256k1 , Signing ,
24- Verification ,
23+ constants, ecdsa, from_hex, schnorr, Message , Scalar , Secp256k1 , Signing , Verification ,
2524} ;
2625
2726/// Secret key - a 256-bit key used to create ECDSA and Taproot signatures.
@@ -610,11 +609,12 @@ impl PublicKey {
610609 /// Negates the public key.
611610 #[ inline]
612611 #[ must_use = "you forgot to use the negated public key" ]
613- pub fn negate < C : Verification > ( mut self , secp : & Secp256k1 < C > ) -> PublicKey {
614- unsafe {
615- let res = ffi:: secp256k1_ec_pubkey_negate ( secp. ctx . as_ptr ( ) , & mut self . 0 ) ;
616- debug_assert_eq ! ( res, 1 ) ;
617- }
612+ pub fn negate ( mut self ) -> PublicKey {
613+ let res = crate :: with_raw_global_context (
614+ |ctx| unsafe { ffi:: secp256k1_ec_pubkey_negate ( ctx. as_ptr ( ) , & mut self . 0 ) } ,
615+ None ,
616+ ) ;
617+ debug_assert_eq ! ( res, 1 ) ;
618618 self
619619 }
620620
@@ -624,19 +624,17 @@ impl PublicKey {
624624 ///
625625 /// Returns an error if the resulting key would be invalid.
626626 #[ inline]
627- pub fn add_exp_tweak < C : Verification > (
628- mut self ,
629- secp : & Secp256k1 < C > ,
630- tweak : & Scalar ,
631- ) -> Result < PublicKey , Error > {
632- unsafe {
633- if ffi:: secp256k1_ec_pubkey_tweak_add ( secp. ctx . as_ptr ( ) , & mut self . 0 , tweak. as_c_ptr ( ) )
634- == 1
635- {
636- Ok ( self )
637- } else {
638- Err ( Error :: InvalidTweak )
639- }
627+ pub fn add_exp_tweak ( mut self , tweak : & Scalar ) -> Result < PublicKey , Error > {
628+ if crate :: with_raw_global_context (
629+ |ctx| unsafe {
630+ ffi:: secp256k1_ec_pubkey_tweak_add ( ctx. as_ptr ( ) , & mut self . 0 , tweak. as_c_ptr ( ) )
631+ } ,
632+ None ,
633+ ) == 1
634+ {
635+ Ok ( self )
636+ } else {
637+ Err ( Error :: InvalidTweak )
640638 }
641639 }
642640
@@ -880,12 +878,9 @@ impl Keypair {
880878 /// or if the encoded number is an invalid scalar.
881879 #[ deprecated( since = "TBD" , note = "Use `from_seckey_byte_array` instead." ) ]
882880 #[ inline]
883- pub fn from_seckey_slice < C : Signing > (
884- secp : & Secp256k1 < C > ,
885- data : & [ u8 ] ,
886- ) -> Result < Keypair , Error > {
881+ pub fn from_seckey_slice ( data : & [ u8 ] ) -> Result < Keypair , Error > {
887882 match <[ u8 ; constants:: SECRET_KEY_SIZE ] >:: try_from ( data) {
888- Ok ( data) => Self :: from_seckey_byte_array ( secp , data) ,
883+ Ok ( data) => Self :: from_seckey_byte_array ( data) ,
889884 Err ( _) => Err ( Error :: InvalidSecretKey ) ,
890885 }
891886 }
@@ -896,13 +891,16 @@ impl Keypair {
896891 ///
897892 /// [`Error::InvalidSecretKey`] if the encoded number is an invalid scalar.
898893 #[ inline]
899- pub fn from_seckey_byte_array < C : Signing > (
900- secp : & Secp256k1 < C > ,
894+ pub fn from_seckey_byte_array (
901895 data : [ u8 ; constants:: SECRET_KEY_SIZE ] ,
902896 ) -> Result < Keypair , Error > {
903897 unsafe {
904898 let mut kp = ffi:: Keypair :: new ( ) ;
905- if ffi:: secp256k1_keypair_create ( secp. ctx . as_ptr ( ) , & mut kp, data. as_c_ptr ( ) ) == 1 {
899+ if crate :: with_raw_global_context (
900+ |ctx| ffi:: secp256k1_keypair_create ( ctx. as_ptr ( ) , & mut kp, data. as_c_ptr ( ) ) ,
901+ Some ( & data) ,
902+ ) == 1
903+ {
906904 Ok ( Keypair ( kp) )
907905 } else {
908906 Err ( Error :: InvalidSecretKey )
@@ -917,13 +915,8 @@ impl Keypair {
917915 /// [`Error::InvalidSecretKey`] if the string does not consist of exactly 64 hex characters,
918916 /// or if the encoded number is an invalid scalar.
919917 #[ inline]
920- pub fn from_seckey_str < C : Signing > ( secp : & Secp256k1 < C > , s : & str ) -> Result < Keypair , Error > {
921- let mut res = [ 0u8 ; constants:: SECRET_KEY_SIZE ] ;
922- match from_hex ( s, & mut res) {
923- Ok ( constants:: SECRET_KEY_SIZE ) => Keypair :: from_seckey_byte_array ( secp, res) ,
924- _ => Err ( Error :: InvalidSecretKey ) ,
925- }
926- }
918+ #[ deprecated( note = "use FromStr or parse instead" ) ]
919+ pub fn from_seckey_str ( s : & str ) -> Result < Self , Error > { s. parse ( ) }
927920
928921 /// Creates a [`Keypair`] directly from a secret key string and the global [`SECP256K1`] context.
929922 ///
@@ -932,10 +925,8 @@ impl Keypair {
932925 /// [`Error::InvalidSecretKey`] if the string does not consist of exactly 64 hex characters,
933926 /// or if the encoded number is an invalid scalar.
934927 #[ inline]
935- #[ cfg( feature = "global-context" ) ]
936- pub fn from_seckey_str_global ( s : & str ) -> Result < Keypair , Error > {
937- Keypair :: from_seckey_str ( SECP256K1 , s)
938- }
928+ #[ deprecated( note = "use FromStr or parse instead" ) ]
929+ pub fn from_seckey_str_global ( s : & str ) -> Result < Keypair , Error > { s. parse ( ) }
939930
940931 /// Generates a new random key pair.
941932 /// # Examples
@@ -1107,10 +1098,11 @@ impl str::FromStr for Keypair {
11071098 type Err = Error ;
11081099
11091100 fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
1110- crate :: with_global_context (
1111- |secp : & Secp256k1 < AllPreallocated > | Self :: from_seckey_str ( & secp, s) ,
1112- None ,
1113- )
1101+ let mut res = [ 0u8 ; constants:: SECRET_KEY_SIZE ] ;
1102+ match from_hex ( s, & mut res) {
1103+ Ok ( constants:: SECRET_KEY_SIZE ) => Keypair :: from_seckey_byte_array ( res) ,
1104+ _ => Err ( Error :: InvalidSecretKey ) ,
1105+ }
11141106 }
11151107}
11161108
@@ -1141,12 +1133,10 @@ impl<'de> serde::Deserialize<'de> for Keypair {
11411133 "a hex string representing 32 byte Keypair" ,
11421134 ) )
11431135 } else {
1144- let visitor = super :: serde_util:: Tuple32Visitor :: new ( "raw 32 bytes Keypair" , |data| {
1145- crate :: with_global_context (
1146- |secp : & Secp256k1 < AllPreallocated > | Self :: from_seckey_byte_array ( & secp, data) ,
1147- None ,
1148- )
1149- } ) ;
1136+ let visitor = super :: serde_util:: Tuple32Visitor :: new (
1137+ "raw 32 bytes Keypair" ,
1138+ Keypair :: from_seckey_byte_array,
1139+ ) ;
11501140 d. deserialize_tuple ( constants:: SECRET_KEY_SIZE , visitor)
11511141 }
11521142 }
@@ -1725,10 +1715,9 @@ mod test {
17251715 }
17261716
17271717 #[ test]
1728- #[ cfg( all ( feature = "std" , not( secp256k1_fuzz) ) ) ]
1718+ #[ cfg( not( secp256k1_fuzz) ) ]
17291719 fn erased_keypair_is_valid ( ) {
1730- let s = Secp256k1 :: new ( ) ;
1731- let kp = Keypair :: from_seckey_byte_array ( & s, [ 1u8 ; constants:: SECRET_KEY_SIZE ] )
1720+ let kp = Keypair :: from_seckey_byte_array ( [ 1u8 ; constants:: SECRET_KEY_SIZE ] )
17321721 . expect ( "valid secret key" ) ;
17331722 let mut kp2 = kp;
17341723 kp2. non_secure_erase ( ) ;
@@ -2005,24 +1994,21 @@ mod test {
20051994
20061995 let tweaked_sk = sk. add_tweak ( & tweak) . unwrap ( ) ;
20071996 assert_ne ! ( sk, tweaked_sk) ; // Make sure we did something.
2008- let tweaked_pk = pk. add_exp_tweak ( & s , & tweak) . unwrap ( ) ;
1997+ let tweaked_pk = pk. add_exp_tweak ( & tweak) . unwrap ( ) ;
20091998 assert_ne ! ( pk, tweaked_pk) ;
20101999
20112000 assert_eq ! ( PublicKey :: from_secret_key( & s, & tweaked_sk) , tweaked_pk) ;
20122001 }
20132002
20142003 #[ test]
2015- #[ cfg( feature = "std" ) ]
20162004 fn tweak_add_zero ( ) {
2017- let s = Secp256k1 :: new ( ) ;
2018-
20192005 let ( sk, pk) = crate :: test_random_keypair ( ) ;
20202006
20212007 let tweak = Scalar :: ZERO ;
20222008
20232009 let tweaked_sk = sk. add_tweak ( & tweak) . unwrap ( ) ;
20242010 assert_eq ! ( sk, tweaked_sk) ; // Tweak by zero does nothing.
2025- let tweaked_pk = pk. add_exp_tweak ( & s , & tweak) . unwrap ( ) ;
2011+ let tweaked_pk = pk. add_exp_tweak ( & tweak) . unwrap ( ) ;
20262012 assert_eq ! ( pk, tweaked_pk) ;
20272013 }
20282014
@@ -2067,9 +2053,9 @@ mod test {
20672053 let back_sk = neg. negate ( ) ;
20682054 assert_eq ! ( sk, back_sk) ;
20692055
2070- let neg = pk. negate ( & s ) ;
2056+ let neg = pk. negate ( ) ;
20712057 assert_ne ! ( pk, neg) ;
2072- let back_pk = neg. negate ( & s ) ;
2058+ let back_pk = neg. negate ( ) ;
20732059 assert_eq ! ( pk, back_pk) ;
20742060
20752061 assert_eq ! ( PublicKey :: from_secret_key( & s, & back_sk) , pk) ;
@@ -2327,7 +2313,7 @@ mod test {
23272313 ] ;
23282314 static SK_STR : & str = "01010101010101010001020304050607ffff0000ffff00006363636363636363" ;
23292315
2330- let sk = Keypair :: from_seckey_byte_array ( SECP256K1 , SK_BYTES ) . unwrap ( ) ;
2316+ let sk = Keypair :: from_seckey_byte_array ( SK_BYTES ) . unwrap ( ) ;
23312317 #[ rustfmt:: skip]
23322318 assert_tokens ( & sk. compact ( ) , & [
23332319 Token :: Tuple { len : 32 } ,
@@ -2507,7 +2493,7 @@ mod test {
25072493
25082494 static PK_STR : & str = "18845781f631c48f1c9709e23092067d06837f30aa0cd0544ac887fe91ddd166" ;
25092495
2510- let kp = Keypair :: from_seckey_byte_array ( crate :: SECP256K1 , SK_BYTES ) . unwrap ( ) ;
2496+ let kp = Keypair :: from_seckey_byte_array ( SK_BYTES ) . unwrap ( ) ;
25112497 let ( pk, _parity) = XOnlyPublicKey :: from_keypair ( & kp) ;
25122498
25132499 #[ rustfmt:: skip]
@@ -2535,11 +2521,10 @@ mod test {
25352521 }
25362522
25372523 #[ test]
2538- #[ cfg( all ( any ( feature = "alloc" , feature = "global-context" ) , feature = " serde") ) ]
2524+ #[ cfg( feature = "serde" ) ]
25392525 fn test_keypair_deserialize_serde ( ) {
2540- let ctx = crate :: Secp256k1 :: new ( ) ;
25412526 let sec_key_str = "4242424242424242424242424242424242424242424242424242424242424242" ;
2542- let keypair = Keypair :: from_seckey_str ( & ctx , sec_key_str) . unwrap ( ) ;
2527+ let keypair = Keypair :: from_str ( sec_key_str) . unwrap ( ) ;
25432528
25442529 serde_test:: assert_tokens ( & keypair. readable ( ) , & [ Token :: String ( sec_key_str) ] ) ;
25452530
0 commit comments