2323use core:: { cmp, fmt, hash} ;
2424
2525use asn1_der:: typed:: { DerDecodable , Sequence } ;
26- use libsecp256k1:: { Message , Signature } ;
27- use sha2:: { Digest as ShaDigestTrait , Sha256 } ;
26+ use k256:: {
27+ ecdsa:: Signature ,
28+ sha2:: { Digest as ShaDigestTrait , Sha256 } ,
29+ ProjectivePoint ,
30+ } ;
2831use zeroize:: Zeroize ;
2932
3033use super :: error:: DecodingError ;
@@ -65,7 +68,7 @@ impl fmt::Debug for Keypair {
6568/// Promote a Secp256k1 secret key into a keypair.
6669impl From < SecretKey > for Keypair {
6770 fn from ( secret : SecretKey ) -> Keypair {
68- let public = PublicKey ( libsecp256k1 :: PublicKey :: from_secret_key ( & secret. 0 ) ) ;
71+ let public = PublicKey ( * secret. 0 . verifying_key ( ) ) ;
6972 Keypair { secret, public }
7073 }
7174}
@@ -79,7 +82,7 @@ impl From<Keypair> for SecretKey {
7982
8083/// A Secp256k1 secret key.
8184#[ derive( Clone ) ]
82- pub struct SecretKey ( libsecp256k1 :: SecretKey ) ;
85+ pub struct SecretKey ( k256 :: ecdsa :: SigningKey ) ;
8386
8487impl fmt:: Debug for SecretKey {
8588 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
@@ -91,7 +94,7 @@ impl SecretKey {
9194 /// Generate a new random Secp256k1 secret key.
9295 #[ cfg( feature = "rand" ) ]
9396 pub fn generate ( ) -> SecretKey {
94- SecretKey ( libsecp256k1 :: SecretKey :: random ( & mut rand:: thread_rng ( ) ) )
97+ SecretKey ( k256 :: ecdsa :: SigningKey :: random ( & mut rand:: thread_rng ( ) ) )
9598 }
9699
97100 /// Create a secret key from a byte slice, zeroing the slice on success.
@@ -101,7 +104,7 @@ impl SecretKey {
101104 /// Note that the expected binary format is the same as `libsecp256k1`'s.
102105 pub fn try_from_bytes ( mut sk : impl AsMut < [ u8 ] > ) -> Result < SecretKey , DecodingError > {
103106 let sk_bytes = sk. as_mut ( ) ;
104- let secret = libsecp256k1 :: SecretKey :: parse_slice ( & * sk_bytes)
107+ let secret = k256 :: ecdsa :: SigningKey :: from_slice ( sk_bytes)
105108 . map_err ( |e| DecodingError :: failed_to_parse ( "parse secp256k1 secret key" , e) ) ?;
106109 sk_bytes. zeroize ( ) ;
107110 Ok ( SecretKey ( secret) )
@@ -131,30 +134,23 @@ impl SecretKey {
131134 ///
132135 /// [RFC3278]: https://tools.ietf.org/html/rfc3278#section-8.2
133136 pub fn sign ( & self , msg : & [ u8 ] ) -> Vec < u8 > {
134- let generic_array = Sha256 :: digest ( msg ) ;
137+ use k256 :: ecdsa :: signature :: Signer ;
135138
136- // FIXME: Once `generic-array` hits 1.0, we should be able to just use `Into` here.
137- let mut array = [ 0u8 ; 32 ] ;
138- array. copy_from_slice ( generic_array. as_slice ( ) ) ;
139-
140- let message = Message :: parse ( & array) ;
141-
142- libsecp256k1:: sign ( & message, & self . 0 )
143- . 0
144- . serialize_der ( )
145- . as_ref ( )
146- . into ( )
139+ Signer :: < k256:: ecdsa:: Signature > :: sign ( & self . 0 , msg)
140+ . to_der ( )
141+ . to_bytes ( )
142+ . into_vec ( )
147143 }
148144
149145 /// Returns the raw bytes of the secret key.
150146 pub fn to_bytes ( & self ) -> [ u8 ; 32 ] {
151- self . 0 . serialize ( )
147+ self . 0 . to_bytes ( ) . into ( )
152148 }
153149}
154150
155151/// A Secp256k1 public key.
156152#[ derive( Eq , Clone ) ]
157- pub struct PublicKey ( libsecp256k1 :: PublicKey ) ;
153+ pub struct PublicKey ( k256 :: ecdsa :: VerifyingKey ) ;
158154
159155impl fmt:: Debug for PublicKey {
160156 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
@@ -193,31 +189,46 @@ impl cmp::Ord for PublicKey {
193189impl PublicKey {
194190 /// Verify the Secp256k1 signature on a message using the public key.
195191 pub fn verify ( & self , msg : & [ u8 ] , sig : & [ u8 ] ) -> bool {
196- self . verify_hash ( Sha256 :: digest ( msg) . as_ref ( ) , sig)
192+ let digest = Sha256 :: new_with_prefix ( msg) ;
193+ self . verify_hash ( digest. finalize ( ) . as_slice ( ) , sig)
197194 }
198195
199- /// Verify the Secp256k1 DER-encoded signature on a raw 256-bit message using the public key.
196+ /// Verify the Secp256k1 DER-encoded signature on a raw 256-bit message using the public key.
197+ /// Will return false if the hash is not 32 bytes long, or the signature cannot be parsed.
200198 pub fn verify_hash ( & self , msg : & [ u8 ] , sig : & [ u8 ] ) -> bool {
201- Message :: parse_slice ( msg)
202- . and_then ( |m| Signature :: parse_der ( sig) . map ( |s| libsecp256k1:: verify ( & m, & s, & self . 0 ) ) )
203- . unwrap_or ( false )
199+ Signature :: from_der ( sig) . is_ok_and ( |s| {
200+ k256:: ecdsa:: hazmat:: verify_prehashed (
201+ & ProjectivePoint :: from ( self . 0 . as_affine ( ) ) ,
202+ msg. into ( ) ,
203+ & s,
204+ )
205+ . is_ok ( )
206+ } )
204207 }
205208
206209 /// Convert the public key to a byte buffer in compressed form, i.e. with one coordinate
207210 /// represented by a single bit.
208211 pub fn to_bytes ( & self ) -> [ u8 ; 33 ] {
209- self . 0 . serialize_compressed ( )
212+ let encoded_point = self . 0 . to_encoded_point ( true ) ;
213+ debug_assert ! ( encoded_point. as_bytes( ) . len( ) == 33 ) ;
214+ let mut array: [ u8 ; 33 ] = [ 0u8 ; 33 ] ;
215+ array. copy_from_slice ( encoded_point. as_bytes ( ) ) ;
216+ array
210217 }
211218
212219 /// Convert the public key to a byte buffer in uncompressed form.
213220 pub fn to_bytes_uncompressed ( & self ) -> [ u8 ; 65 ] {
214- self . 0 . serialize ( )
221+ let encoded_point = self . 0 . to_encoded_point ( false ) ;
222+ debug_assert ! ( encoded_point. as_bytes( ) . len( ) == 65 ) ;
223+ let mut array: [ u8 ; 65 ] = [ 0u8 ; 65 ] ;
224+ array. copy_from_slice ( encoded_point. as_bytes ( ) ) ;
225+ array
215226 }
216227
217228 /// Decode a public key from a byte slice in the format produced
218229 /// by `encode`.
219230 pub fn try_from_bytes ( k : & [ u8 ] ) -> Result < PublicKey , DecodingError > {
220- libsecp256k1 :: PublicKey :: parse_slice ( k , Some ( libsecp256k1 :: PublicKeyFormat :: Compressed ) )
231+ k256 :: ecdsa :: VerifyingKey :: from_sec1_bytes ( k )
221232 . map_err ( |e| DecodingError :: failed_to_parse ( "secp256k1 public key" , e) )
222233 . map ( PublicKey )
223234 }
@@ -232,9 +243,9 @@ mod tests {
232243 fn secp256k1_secret_from_bytes ( ) {
233244 let sk1 = SecretKey :: generate ( ) ;
234245 let mut sk_bytes = [ 0 ; 32 ] ;
235- sk_bytes. copy_from_slice ( & sk1. 0 . serialize ( ) [ ..] ) ;
246+ sk_bytes. copy_from_slice ( & sk1. to_bytes ( ) [ ..] ) ;
236247 let sk2 = SecretKey :: try_from_bytes ( & mut sk_bytes) . unwrap ( ) ;
237- assert_eq ! ( sk1. 0 . serialize ( ) , sk2. 0 . serialize ( ) ) ;
248+ assert_eq ! ( sk1. to_bytes ( ) , sk2. to_bytes ( ) ) ;
238249 assert_eq ! ( sk_bytes, [ 0 ; 32 ] ) ;
239250 }
240251}
0 commit comments