@@ -39,11 +39,10 @@ use crate::{
3939///
4040/// ```
4141/// # #[cfg(feature = "alloc")] {
42- /// use secp256k1::{SecretKey, Secp256k1, PublicKey};
42+ /// use secp256k1::{SecretKey, PublicKey};
4343///
44- /// let secp = Secp256k1::new();
4544/// let secret_key = SecretKey::from_byte_array([0xcd; 32]).expect("32 bytes, within curve order");
46- /// let public_key = PublicKey::from_secret_key(&secp, & secret_key);
45+ /// let public_key = PublicKey::from_secret_key(&secret_key);
4746/// # }
4847/// ```
4948/// [`bincode`]: https://docs.rs/bincode
@@ -108,20 +107,24 @@ impl PublicKey {
108107 ///
109108 /// ```
110109 /// # #[cfg(all(feature = "rand", feature = "std"))] {
111- /// use secp256k1::{rand, Secp256k1, SecretKey, PublicKey};
110+ /// use secp256k1::{rand, SecretKey, PublicKey};
112111 ///
113- /// let secp = Secp256k1::new();
114112 /// let secret_key = SecretKey::new(&mut rand::rng());
115- /// let public_key = PublicKey::from_secret_key(&secp, & secret_key);
113+ /// let public_key = PublicKey::from_secret_key(&secret_key);
116114 /// # }
117115 /// ```
118116 #[ inline]
119- pub fn from_secret_key < C : Signing > ( secp : & Secp256k1 < C > , sk : & SecretKey ) -> PublicKey {
117+ pub fn from_secret_key ( sk : & SecretKey ) -> PublicKey {
120118 unsafe {
121119 let mut pk = ffi:: PublicKey :: new ( ) ;
122120 // We can assume the return value because it's not possible to construct
123121 // an invalid `SecretKey` without transmute trickery or something.
124- let res = ffi:: secp256k1_ec_pubkey_create ( secp. ctx . as_ptr ( ) , & mut pk, sk. as_c_ptr ( ) ) ;
122+ let res = crate :: with_global_context (
123+ |secp : & Secp256k1 < crate :: AllPreallocated > | {
124+ ffi:: secp256k1_ec_pubkey_create ( secp. ctx . as_ptr ( ) , & mut pk, sk. as_c_ptr ( ) )
125+ } ,
126+ Some ( & sk. to_secret_bytes ( ) ) ,
127+ ) ;
125128 debug_assert_eq ! ( res, 1 ) ;
126129 PublicKey ( pk)
127130 }
@@ -130,12 +133,11 @@ impl PublicKey {
130133 #[ inline]
131134 pub fn from_ellswift ( ellswift : ElligatorSwift ) -> PublicKey { ElligatorSwift :: decode ( ellswift) }
132135
133- /// Creates a new public key from a [`SecretKey`] and the global [`SECP256K1`] context .
136+ /// Creates a new public key from a [`SecretKey`].
134137 #[ inline]
135138 #[ cfg( feature = "global-context" ) ]
136- pub fn from_secret_key_global ( sk : & SecretKey ) -> PublicKey {
137- PublicKey :: from_secret_key ( SECP256K1 , sk)
138- }
139+ #[ deprecated( since = "TBD" , note = "use from_secret_key instead" ) ]
140+ pub fn from_secret_key_global ( sk : & SecretKey ) -> PublicKey { PublicKey :: from_secret_key ( sk) }
139141
140142 /// Creates a public key directly from a slice.
141143 #[ inline]
@@ -1296,9 +1298,9 @@ impl<C: Verification> Secp256k1<C> {
12961298 /// # use secp256k1::{Secp256k1, SecretKey, Keypair, PublicKey, pubkey_sort};
12971299 /// # let secp = Secp256k1::new();
12981300 /// # let sk1 = SecretKey::new(&mut rng());
1299- /// # let pub_key1 = PublicKey::from_secret_key(&secp, & sk1);
1301+ /// # let pub_key1 = PublicKey::from_secret_key(&sk1);
13001302 /// # let sk2 = SecretKey::new(&mut rng());
1301- /// # let pub_key2 = PublicKey::from_secret_key(&secp, & sk2);
1303+ /// # let pub_key2 = PublicKey::from_secret_key(&sk2);
13021304 /// #
13031305 /// # let pubkeys = [pub_key1, pub_key2];
13041306 /// # let mut pubkeys_ref: Vec<&PublicKey> = pubkeys.iter().collect();
@@ -1542,14 +1544,12 @@ mod test {
15421544 0x63 , 0x63 , 0x63 , 0x63 , 0x63 , 0x63 , 0x63 , 0x63 ,
15431545 ] ;
15441546
1545- #[ cfg( not( secp256k1_fuzz) ) ]
1546- let s = Secp256k1 :: signing_only ( ) ;
15471547 let sk = SecretKey :: from_secret_bytes ( SK_BYTES ) . expect ( "sk" ) ;
15481548
15491549 // In fuzzing mode secret->public key derivation is different, so
15501550 // hard-code the expected result.
15511551 #[ cfg( not( secp256k1_fuzz) ) ]
1552- let pk = PublicKey :: from_secret_key ( & s , & sk) ;
1552+ let pk = PublicKey :: from_secret_key ( & sk) ;
15531553 #[ cfg( secp256k1_fuzz) ]
15541554 let pk = PublicKey :: from_slice ( & [
15551555 0x02 , 0x18 , 0x84 , 0x57 , 0x81 , 0xf6 , 0x31 , 0xc4 , 0x8f , 0x1c , 0x97 , 0x09 , 0xe2 , 0x30 ,
@@ -1661,10 +1661,8 @@ mod test {
16611661 #[ test]
16621662 #[ cfg( feature = "std" ) ]
16631663 fn tweak_add_arbitrary_data ( ) {
1664- let s = Secp256k1 :: new ( ) ;
1665-
16661664 let ( sk, pk) = crate :: test_random_keypair ( ) ;
1667- assert_eq ! ( PublicKey :: from_secret_key( & s , & sk) , pk) ; // Sanity check.
1665+ assert_eq ! ( PublicKey :: from_secret_key( & sk) , pk) ; // Sanity check.
16681666
16691667 // TODO: This would be better tested with a _lot_ of different tweaks.
16701668 let tweak = Scalar :: test_random ( ) ;
@@ -1674,7 +1672,7 @@ mod test {
16741672 let tweaked_pk = pk. add_exp_tweak ( & tweak) . unwrap ( ) ;
16751673 assert_ne ! ( pk, tweaked_pk) ;
16761674
1677- assert_eq ! ( PublicKey :: from_secret_key( & s , & tweaked_sk) , tweaked_pk) ;
1675+ assert_eq ! ( PublicKey :: from_secret_key( & tweaked_sk) , tweaked_pk) ;
16781676 }
16791677
16801678 #[ test]
@@ -1695,7 +1693,7 @@ mod test {
16951693 let s = Secp256k1 :: new ( ) ;
16961694
16971695 let ( sk, pk) = crate :: test_random_keypair ( ) ;
1698- assert_eq ! ( PublicKey :: from_secret_key( & s , & sk) , pk) ; // Sanity check.
1696+ assert_eq ! ( PublicKey :: from_secret_key( & sk) , pk) ; // Sanity check.
16991697
17001698 for _ in 0 ..10 {
17011699 let tweak = Scalar :: test_random ( ) ;
@@ -1704,7 +1702,7 @@ mod test {
17041702 assert_ne ! ( sk, tweaked_sk) ; // Make sure we did something.
17051703 let tweaked_pk = pk. mul_tweak ( & s, & tweak) . unwrap ( ) ;
17061704 assert_ne ! ( pk, tweaked_pk) ;
1707- assert_eq ! ( PublicKey :: from_secret_key( & s , & tweaked_sk) , tweaked_pk) ;
1705+ assert_eq ! ( PublicKey :: from_secret_key( & tweaked_sk) , tweaked_pk) ;
17081706 }
17091707 }
17101708
@@ -1719,11 +1717,9 @@ mod test {
17191717 #[ test]
17201718 #[ cfg( feature = "std" ) ]
17211719 fn test_negation ( ) {
1722- let s = Secp256k1 :: new ( ) ;
1723-
17241720 let ( sk, pk) = crate :: test_random_keypair ( ) ;
17251721
1726- assert_eq ! ( PublicKey :: from_secret_key( & s , & sk) , pk) ; // Sanity check.
1722+ assert_eq ! ( PublicKey :: from_secret_key( & sk) , pk) ; // Sanity check.
17271723
17281724 let neg = sk. negate ( ) ;
17291725 assert_ne ! ( sk, neg) ;
@@ -1735,7 +1731,7 @@ mod test {
17351731 let back_pk = neg. negate ( ) ;
17361732 assert_eq ! ( pk, back_pk) ;
17371733
1738- assert_eq ! ( PublicKey :: from_secret_key( & s , & back_sk) , pk) ;
1734+ assert_eq ! ( PublicKey :: from_secret_key( & back_sk) , pk) ;
17391735 }
17401736
17411737 #[ test]
@@ -1823,8 +1819,6 @@ mod test {
18231819 #[ test]
18241820 #[ cfg( feature = "std" ) ]
18251821 fn create_pubkey_combine ( ) {
1826- let s = Secp256k1 :: new ( ) ;
1827-
18281822 let ( sk1, pk1) = crate :: test_random_keypair ( ) ;
18291823 let ( sk2, pk2) = crate :: test_random_keypair ( ) ;
18301824
@@ -1835,7 +1829,7 @@ mod test {
18351829 assert_eq ! ( sum1, sum2) ;
18361830
18371831 let tweaked = sk1. add_tweak ( & Scalar :: from ( sk2) ) . unwrap ( ) ;
1838- let sksum = PublicKey :: from_secret_key ( & s , & tweaked) ;
1832+ let sksum = PublicKey :: from_secret_key ( & tweaked) ;
18391833 assert_eq ! ( Ok ( sksum) , sum1) ;
18401834 }
18411835
@@ -1889,14 +1883,12 @@ mod test {
18891883 ] ;
18901884 static PK_STR : & str = "0218845781f631c48f1c9709e23092067d06837f30aa0cd0544ac887fe91ddd166" ;
18911885
1892- #[ cfg( not( secp256k1_fuzz) ) ]
1893- let s = Secp256k1 :: new ( ) ;
18941886 let sk = SecretKey :: from_secret_bytes ( SK_BYTES ) . unwrap ( ) ;
18951887
18961888 // In fuzzing mode secret->public key derivation is different, so
18971889 // hard-code the expected result.
18981890 #[ cfg( not( secp256k1_fuzz) ) ]
1899- let pk = PublicKey :: from_secret_key ( & s , & sk) ;
1891+ let pk = PublicKey :: from_secret_key ( & sk) ;
19001892 #[ cfg( secp256k1_fuzz) ]
19011893 let pk = PublicKey :: from_slice ( & PK_BYTES ) . expect ( "pk" ) ;
19021894
@@ -2052,10 +2044,8 @@ mod test {
20522044 #[ test]
20532045 #[ cfg( all( not( secp256k1_fuzz) , feature = "alloc" ) ) ]
20542046 fn convert_secret_key_to_public_key ( ) {
2055- let secp = Secp256k1 :: new ( ) ;
2056-
20572047 let ( sk, want, _kp, _xonly) = keys ( ) ;
2058- let got = sk. public_key ( & secp ) ;
2048+ let got = sk. public_key ( ) ;
20592049
20602050 assert_eq ! ( got, want)
20612051 }
0 commit comments