@@ -214,18 +214,24 @@ impl SecretKey {
214214 self . 0
215215 }
216216
217+ /// Negates the secret key.
217218 #[ inline]
218- /// Negates one secret key.
219- pub fn negate_assign (
220- & mut self
221- ) {
219+ #[ deprecated( since = "0.23.0" , note = "Use negate instead" ) ]
220+ pub fn negate_assign ( & mut self ) {
221+ * self = self . negate ( )
222+ }
223+
224+ /// Negates the secret key.
225+ #[ inline]
226+ pub fn negate ( mut self ) -> SecretKey {
222227 unsafe {
223228 let res = ffi:: secp256k1_ec_seckey_negate (
224229 ffi:: secp256k1_context_no_precomp,
225230 self . as_mut_c_ptr ( )
226231 ) ;
227232 debug_assert_eq ! ( res, 1 ) ;
228233 }
234+ self
229235 }
230236
231237 /// Adds one secret key to another, modulo the curve order.
@@ -498,16 +504,21 @@ impl PublicKey {
498504 debug_assert_eq ! ( ret_len, ret. len( ) ) ;
499505 }
500506
501- #[ inline]
502507 /// Negates the public key in place.
503- pub fn negate_assign < C : Verification > (
504- & mut self ,
505- secp : & Secp256k1 < C >
506- ) {
508+ #[ inline]
509+ #[ deprecated( since = "0.23.0" , note = "Use negate instead" ) ]
510+ pub fn negate_assign < C : Verification > ( & mut self , secp : & Secp256k1 < C > ) {
511+ * self = self . negate ( secp)
512+ }
513+
514+ /// Negates the public key.
515+ #[ inline]
516+ pub fn negate < C : Verification > ( mut self , secp : & Secp256k1 < C > ) -> PublicKey {
507517 unsafe {
508518 let res = ffi:: secp256k1_ec_pubkey_negate ( secp. ctx , & mut self . 0 ) ;
509519 debug_assert_eq ! ( res, 1 ) ;
510520 }
521+ self
511522 }
512523
513524 /// Adds `other * G` to `self` in place.
@@ -1884,21 +1895,21 @@ mod test {
18841895 fn test_negation ( ) {
18851896 let s = Secp256k1 :: new ( ) ;
18861897
1887- let ( mut sk, mut pk) = s. generate_keypair ( & mut thread_rng ( ) ) ;
1888-
1889- let original_sk = sk ;
1890- let original_pk = pk ;
1891-
1892- assert_eq ! ( PublicKey :: from_secret_key ( & s , & sk ) , pk ) ;
1893- sk . negate_assign ( ) ;
1894- pk . negate_assign ( & s ) ;
1895- assert_ne ! ( original_sk , sk ) ;
1896- assert_ne ! ( original_pk , pk ) ;
1897- sk . negate_assign ( ) ;
1898- pk . negate_assign ( & s) ;
1899- assert_eq ! ( original_sk , sk ) ;
1900- assert_eq ! ( original_pk , pk ) ;
1901- assert_eq ! ( PublicKey :: from_secret_key( & s, & sk ) , pk) ;
1898+ let ( sk, pk) = s. generate_keypair ( & mut thread_rng ( ) ) ;
1899+
1900+ assert_eq ! ( PublicKey :: from_secret_key ( & s , & sk ) , pk ) ; // Sanity check.
1901+
1902+ let neg = sk . negate ( ) ;
1903+ assert_ne ! ( sk , neg ) ;
1904+ let back_sk = neg . negate ( ) ;
1905+ assert_eq ! ( sk , back_sk ) ;
1906+
1907+ let neg = pk . negate ( & s ) ;
1908+ assert_ne ! ( pk , neg ) ;
1909+ let back_pk = neg . negate ( & s) ;
1910+ assert_eq ! ( pk , back_pk ) ;
1911+
1912+ assert_eq ! ( PublicKey :: from_secret_key( & s, & back_sk ) , pk) ;
19021913 }
19031914
19041915 #[ test]
0 commit comments