@@ -213,18 +213,24 @@ impl SecretKey {
213
213
self . 0
214
214
}
215
215
216
+ /// Negates the secret key.
216
217
#[ inline]
217
- /// Negates one secret key.
218
- pub fn negate_assign (
219
- & mut self
220
- ) {
218
+ #[ deprecated( since = "0.23.0" , note = "Use negate instead" ) ]
219
+ pub fn negate_assign ( & mut self ) {
220
+ * self = self . negate ( )
221
+ }
222
+
223
+ /// Negates the secret key.
224
+ #[ inline]
225
+ pub fn negate ( mut self ) -> SecretKey {
221
226
unsafe {
222
227
let res = ffi:: secp256k1_ec_seckey_negate (
223
228
ffi:: secp256k1_context_no_precomp,
224
229
self . as_mut_c_ptr ( )
225
230
) ;
226
231
debug_assert_eq ! ( res, 1 ) ;
227
232
}
233
+ self
228
234
}
229
235
230
236
/// Adds one secret key to another, modulo the curve order.
@@ -505,16 +511,21 @@ impl PublicKey {
505
511
debug_assert_eq ! ( ret_len, ret. len( ) ) ;
506
512
}
507
513
508
- #[ inline]
509
514
/// Negates the public key in place.
510
- pub fn negate_assign < C : Verification > (
511
- & mut self ,
512
- secp : & Secp256k1 < C >
513
- ) {
515
+ #[ inline]
516
+ #[ deprecated( since = "0.23.0" , note = "Use negate instead" ) ]
517
+ pub fn negate_assign < C : Verification > ( & mut self , secp : & Secp256k1 < C > ) {
518
+ * self = self . negate ( secp)
519
+ }
520
+
521
+ /// Negates the public key.
522
+ #[ inline]
523
+ pub fn negate < C : Verification > ( mut self , secp : & Secp256k1 < C > ) -> PublicKey {
514
524
unsafe {
515
525
let res = ffi:: secp256k1_ec_pubkey_negate ( secp. ctx , & mut self . 0 ) ;
516
526
debug_assert_eq ! ( res, 1 ) ;
517
527
}
528
+ self
518
529
}
519
530
520
531
/// Adds the `other` public key to `self` in place.
@@ -1912,21 +1923,21 @@ mod test {
1912
1923
fn test_negation ( ) {
1913
1924
let s = Secp256k1 :: new ( ) ;
1914
1925
1915
- let ( mut sk, mut pk) = s. generate_keypair ( & mut thread_rng ( ) ) ;
1916
-
1917
- let original_sk = sk ;
1918
- let original_pk = pk ;
1919
-
1920
- assert_eq ! ( PublicKey :: from_secret_key ( & s , & sk ) , pk ) ;
1921
- sk . negate_assign ( ) ;
1922
- pk . negate_assign ( & s ) ;
1923
- assert_ne ! ( original_sk , sk ) ;
1924
- assert_ne ! ( original_pk , pk ) ;
1925
- sk . negate_assign ( ) ;
1926
- pk . negate_assign ( & s) ;
1927
- assert_eq ! ( original_sk , sk ) ;
1928
- assert_eq ! ( original_pk , pk ) ;
1929
- assert_eq ! ( PublicKey :: from_secret_key( & s, & sk ) , pk) ;
1926
+ let ( sk, pk) = s. generate_keypair ( & mut thread_rng ( ) ) ;
1927
+
1928
+ assert_eq ! ( PublicKey :: from_secret_key ( & s , & sk ) , pk ) ; // Sanity check.
1929
+
1930
+ let neg = sk . negate ( ) ;
1931
+ assert_ne ! ( sk , neg ) ;
1932
+ let back_sk = neg . negate ( ) ;
1933
+ assert_eq ! ( sk , back_sk ) ;
1934
+
1935
+ let neg = pk . negate ( & s ) ;
1936
+ assert_ne ! ( pk , neg ) ;
1937
+ let back_pk = neg . negate ( & s) ;
1938
+ assert_eq ! ( pk , back_pk ) ;
1939
+
1940
+ assert_eq ! ( PublicKey :: from_secret_key( & s, & back_sk ) , pk) ;
1930
1941
}
1931
1942
1932
1943
#[ test]
0 commit comments