7070//! let public_key = PublicKey::from_secret_key(&secp, &secret_key);
7171//! // This is unsafe unless the supplied byte slice is the output of a cryptographic hash function.
7272//! // See the above example for how to use this library together with `bitcoin-hashes-std`.
73- //! let message = Message::from_slice (&[0xab; 32]).expect("32 bytes");
73+ //! let message = Message::from_digest_slice (&[0xab; 32]).expect("32 bytes");
7474//!
7575//! let sig = secp.sign_ecdsa(&message, &secret_key);
7676//! assert!(secp.verify_ecdsa(&message, &sig, &public_key).is_ok());
9393//! 0x3a, 0x17, 0x10, 0xc9, 0x62, 0x67, 0x90, 0x63,
9494//! ]).expect("public keys must be 33 or 65 bytes, serialized according to SEC 2");
9595//!
96- //! let message = Message::from_slice (&[
96+ //! let message = Message::from_digest_slice (&[
9797//! 0xaa, 0xdf, 0x7d, 0xe7, 0x82, 0x03, 0x4f, 0xbe,
9898//! 0x3d, 0x3d, 0xb2, 0xcb, 0x13, 0xc0, 0xcd, 0x91,
9999//! 0xbf, 0x41, 0xcb, 0x08, 0xfa, 0xc7, 0xbd, 0x61,
@@ -225,11 +225,41 @@ impl Message {
225225 /// the result of signing isn't a
226226 /// [secure signature](https://twitter.com/pwuille/status/1063582706288586752).
227227 #[ inline]
228- pub fn from_slice ( data : & [ u8 ] ) -> Result < Message , Error > {
229- match data. len ( ) {
228+ #[ deprecated( since = "0.28.0" , note = "use from_digest_slice instead" ) ]
229+ pub fn from_slice ( digest : & [ u8 ] ) -> Result < Message , Error > {
230+ Message :: from_digest_slice ( digest)
231+ }
232+
233+ /// Creates a [`Message`] from a `digest`.
234+ ///
235+ /// **If you just want to sign an arbitrary message use `Message::from_hashed_data` instead.**
236+ ///
237+ /// The `digest` array has to be a cryptographically secure hash of the actual message that's
238+ /// going to be signed. Otherwise the result of signing isn't a [secure signature].
239+ ///
240+ /// [secure signature]: https://twitter.com/pwuille/status/1063582706288586752
241+ #[ inline]
242+ pub fn from_digest ( digest : [ u8 ; 32 ] ) -> Message { Message ( digest) }
243+
244+ /// Creates a [`Message`] from a 32 byte slice `digest`.
245+ ///
246+ /// **If you just want to sign an arbitrary message use `Message::from_hashed_data` instead.**
247+ ///
248+ /// The slice has to be 32 bytes long and be a cryptographically secure hash of the actual
249+ /// message that's going to be signed. Otherwise the result of signing isn't a [secure
250+ /// signature].
251+ ///
252+ /// # Errors
253+ ///
254+ /// If `digest` is not exactly 32 bytes long.
255+ ///
256+ /// [secure signature]: https://twitter.com/pwuille/status/1063582706288586752
257+ #[ inline]
258+ pub fn from_digest_slice ( digest : & [ u8 ] ) -> Result < Message , Error > {
259+ match digest. len ( ) {
230260 constants:: MESSAGE_SIZE => {
231261 let mut ret = [ 0u8 ; constants:: MESSAGE_SIZE ] ;
232- ret[ ..] . copy_from_slice ( data ) ;
262+ ret[ ..] . copy_from_slice ( digest ) ;
233263 Ok ( Message ( ret) )
234264 }
235265 _ => Err ( Error :: InvalidMessage ) ,
@@ -540,7 +570,7 @@ mod tests {
540570 Secp256k1 { ctx : ctx_vrfy, phantom : PhantomData } ;
541571
542572 let ( sk, pk) = full. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
543- let msg = Message :: from_slice ( & [ 2u8 ; 32 ] ) . unwrap ( ) ;
573+ let msg = Message :: from_digest_slice ( & [ 2u8 ; 32 ] ) . unwrap ( ) ;
544574 // Try signing
545575 assert_eq ! ( sign. sign_ecdsa( & msg, & sk) , full. sign_ecdsa( & msg, & sk) ) ;
546576 let sig = full. sign_ecdsa ( & msg, & sk) ;
@@ -572,7 +602,7 @@ mod tests {
572602 let mut vrfy = unsafe { Secp256k1 :: from_raw_verification_only ( ctx_vrfy. ctx ) } ;
573603
574604 let ( sk, pk) = full. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
575- let msg = Message :: from_slice ( & [ 2u8 ; 32 ] ) . unwrap ( ) ;
605+ let msg = Message :: from_digest_slice ( & [ 2u8 ; 32 ] ) . unwrap ( ) ;
576606 // Try signing
577607 assert_eq ! ( sign. sign_ecdsa( & msg, & sk) , full. sign_ecdsa( & msg, & sk) ) ;
578608 let sig = full. sign_ecdsa ( & msg, & sk) ;
@@ -618,7 +648,7 @@ mod tests {
618648 // println!("{:?}", buf_ful[5]); // Can't even read the data thanks to the borrow checker.
619649
620650 let ( sk, pk) = full. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
621- let msg = Message :: from_slice ( & [ 2u8 ; 32 ] ) . unwrap ( ) ;
651+ let msg = Message :: from_digest_slice ( & [ 2u8 ; 32 ] ) . unwrap ( ) ;
622652 // Try signing
623653 assert_eq ! ( sign. sign_ecdsa( & msg, & sk) , full. sign_ecdsa( & msg, & sk) ) ;
624654 let sig = full. sign_ecdsa ( & msg, & sk) ;
@@ -636,7 +666,7 @@ mod tests {
636666 let full = Secp256k1 :: new ( ) ;
637667
638668 let msg = crate :: random_32_bytes ( & mut rand:: thread_rng ( ) ) ;
639- let msg = Message :: from_slice ( & msg) . unwrap ( ) ;
669+ let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
640670
641671 // Try key generation
642672 let ( sk, pk) = full. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
@@ -665,7 +695,7 @@ mod tests {
665695
666696 for _ in 0 ..100 {
667697 let msg = crate :: random_32_bytes ( & mut rand:: thread_rng ( ) ) ;
668- let msg = Message :: from_slice ( & msg) . unwrap ( ) ;
698+ let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
669699
670700 let ( sk, _) = s. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
671701 let sig1 = s. sign_ecdsa ( & msg, & sk) ;
@@ -756,7 +786,7 @@ mod tests {
756786 let noncedata = [ 42u8 ; 32 ] ;
757787 for _ in 0 ..100 {
758788 let msg = crate :: random_32_bytes ( & mut rand:: thread_rng ( ) ) ;
759- let msg = Message :: from_slice ( & msg) . unwrap ( ) ;
789+ let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
760790
761791 let ( sk, pk) = s. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
762792 let sig = s. sign_ecdsa ( & msg, & sk) ;
@@ -803,7 +833,7 @@ mod tests {
803833 wild_msgs[ 1 ] [ 0 ] -= 1 ;
804834
805835 for key in wild_keys. iter ( ) . map ( |k| SecretKey :: from_slice ( & k[ ..] ) . unwrap ( ) ) {
806- for msg in wild_msgs. iter ( ) . map ( |m| Message :: from_slice ( & m[ ..] ) . unwrap ( ) ) {
836+ for msg in wild_msgs. iter ( ) . map ( |m| Message :: from_digest_slice ( & m[ ..] ) . unwrap ( ) ) {
807837 let sig = s. sign_ecdsa ( & msg, & key) ;
808838 let low_r_sig = s. sign_ecdsa_low_r ( & msg, & key) ;
809839 let grind_r_sig = s. sign_ecdsa_grind_r ( & msg, & key, 1 ) ;
@@ -822,14 +852,14 @@ mod tests {
822852 s. randomize ( & mut rand:: thread_rng ( ) ) ;
823853
824854 let msg = crate :: random_32_bytes ( & mut rand:: thread_rng ( ) ) ;
825- let msg = Message :: from_slice ( & msg) . unwrap ( ) ;
855+ let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
826856
827857 let ( sk, pk) = s. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
828858
829859 let sig = s. sign_ecdsa ( & msg, & sk) ;
830860
831861 let msg = crate :: random_32_bytes ( & mut rand:: thread_rng ( ) ) ;
832- let msg = Message :: from_slice ( & msg) . unwrap ( ) ;
862+ let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
833863 assert_eq ! ( s. verify_ecdsa( & msg, & sig, & pk) , Err ( Error :: IncorrectSignature ) ) ;
834864 }
835865
@@ -845,15 +875,15 @@ mod tests {
845875 ) ;
846876
847877 assert_eq ! (
848- Message :: from_slice ( & [ 0 ; constants:: MESSAGE_SIZE - 1 ] ) ,
878+ Message :: from_digest_slice ( & [ 0 ; constants:: MESSAGE_SIZE - 1 ] ) ,
849879 Err ( Error :: InvalidMessage )
850880 ) ;
851881 assert_eq ! (
852- Message :: from_slice ( & [ 0 ; constants:: MESSAGE_SIZE + 1 ] ) ,
882+ Message :: from_digest_slice ( & [ 0 ; constants:: MESSAGE_SIZE + 1 ] ) ,
853883 Err ( Error :: InvalidMessage )
854884 ) ;
855- assert ! ( Message :: from_slice ( & [ 0 ; constants:: MESSAGE_SIZE ] ) . is_ok( ) ) ;
856- assert ! ( Message :: from_slice ( & [ 1 ; constants:: MESSAGE_SIZE ] ) . is_ok( ) ) ;
885+ assert ! ( Message :: from_digest_slice ( & [ 0 ; constants:: MESSAGE_SIZE ] ) . is_ok( ) ) ;
886+ assert ! ( Message :: from_digest_slice ( & [ 1 ; constants:: MESSAGE_SIZE ] ) . is_ok( ) ) ;
857887 }
858888
859889 #[ test]
@@ -892,7 +922,7 @@ mod tests {
892922 fn test_noncedata ( ) {
893923 let secp = Secp256k1 :: new ( ) ;
894924 let msg = hex ! ( "887d04bb1cf1b1554f1b268dfe62d13064ca67ae45348d50d1392ce2d13418ac" ) ;
895- let msg = Message :: from_slice ( & msg) . unwrap ( ) ;
925+ let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
896926 let noncedata = [ 42u8 ; 32 ] ;
897927 let sk =
898928 SecretKey :: from_str ( "57f0148f94d13095cfda539d0da0d1541304b678d8b36e243980aab4e1b7cead" )
@@ -919,7 +949,7 @@ mod tests {
919949 let secp = Secp256k1 :: new ( ) ;
920950 let mut sig = ecdsa:: Signature :: from_der ( & sig[ ..] ) . unwrap ( ) ;
921951 let pk = PublicKey :: from_slice ( & pk[ ..] ) . unwrap ( ) ;
922- let msg = Message :: from_slice ( & msg[ ..] ) . unwrap ( ) ;
952+ let msg = Message :: from_digest_slice ( & msg[ ..] ) . unwrap ( ) ;
923953
924954 // without normalization we expect this will fail
925955 assert_eq ! ( secp. verify_ecdsa( & msg, & sig, & pk) , Err ( Error :: IncorrectSignature ) ) ;
@@ -934,7 +964,7 @@ mod tests {
934964 fn test_low_r ( ) {
935965 let secp = Secp256k1 :: new ( ) ;
936966 let msg = hex ! ( "887d04bb1cf1b1554f1b268dfe62d13064ca67ae45348d50d1392ce2d13418ac" ) ;
937- let msg = Message :: from_slice ( & msg) . unwrap ( ) ;
967+ let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
938968 let sk =
939969 SecretKey :: from_str ( "57f0148f94d13095cfda539d0da0d1541304b678d8b36e243980aab4e1b7cead" )
940970 . unwrap ( ) ;
@@ -952,7 +982,7 @@ mod tests {
952982 fn test_grind_r ( ) {
953983 let secp = Secp256k1 :: new ( ) ;
954984 let msg = hex ! ( "ef2d5b9a7c61865a95941d0f04285420560df7e9d76890ac1b8867b12ce43167" ) ;
955- let msg = Message :: from_slice ( & msg) . unwrap ( ) ;
985+ let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
956986 let sk =
957987 SecretKey :: from_str ( "848355d75fe1c354cf05539bb29b2015f1863065bcb6766b44d399ab95c3fa0b" )
958988 . unwrap ( ) ;
@@ -972,7 +1002,7 @@ mod tests {
9721002
9731003 let s = Secp256k1 :: new ( ) ;
9741004
975- let msg = Message :: from_slice ( & [ 1 ; 32 ] ) . unwrap ( ) ;
1005+ let msg = Message :: from_digest_slice ( & [ 1 ; 32 ] ) . unwrap ( ) ;
9761006 let sk = SecretKey :: from_slice ( & [ 2 ; 32 ] ) . unwrap ( ) ;
9771007 let sig = s. sign_ecdsa ( & msg, & sk) ;
9781008 static SIG_BYTES : [ u8 ; 71 ] = [
@@ -1002,7 +1032,7 @@ mod tests {
10021032 let sk_data = hex ! ( "e6dd32f8761625f105c39a39f19370b3521d845a12456d60ce44debd0a362641" ) ;
10031033 let sk = SecretKey :: from_slice ( & sk_data) . unwrap ( ) ;
10041034 let msg_data = hex ! ( "a4965ca63b7d8562736ceec36dfa5a11bf426eb65be8ea3f7a49ae363032da0d" ) ;
1005- let msg = Message :: from_slice ( & msg_data) . unwrap ( ) ;
1035+ let msg = Message :: from_digest_slice ( & msg_data) . unwrap ( ) ;
10061036
10071037 // Check usage as explicit parameter
10081038 let pk = PublicKey :: from_secret_key ( SECP256K1 , & sk) ;
@@ -1054,7 +1084,7 @@ mod benches {
10541084 pub fn bench_sign_ecdsa ( bh : & mut Bencher ) {
10551085 let s = Secp256k1 :: new ( ) ;
10561086 let msg = crate :: random_32_bytes ( & mut rand:: thread_rng ( ) ) ;
1057- let msg = Message :: from_slice ( & msg) . unwrap ( ) ;
1087+ let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
10581088 let ( sk, _) = s. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
10591089
10601090 bh. iter ( || {
@@ -1067,7 +1097,7 @@ mod benches {
10671097 pub fn bench_verify_ecdsa ( bh : & mut Bencher ) {
10681098 let s = Secp256k1 :: new ( ) ;
10691099 let msg = crate :: random_32_bytes ( & mut rand:: thread_rng ( ) ) ;
1070- let msg = Message :: from_slice ( & msg) . unwrap ( ) ;
1100+ let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
10711101 let ( sk, pk) = s. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
10721102 let sig = s. sign_ecdsa ( & msg, & sk) ;
10731103
0 commit comments