70
70
//! let public_key = PublicKey::from_secret_key(&secp, &secret_key);
71
71
//! // This is unsafe unless the supplied byte slice is the output of a cryptographic hash function.
72
72
//! // 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");
74
74
//!
75
75
//! let sig = secp.sign_ecdsa(&message, &secret_key);
76
76
//! assert!(secp.verify_ecdsa(&message, &sig, &public_key).is_ok());
93
93
//! 0x3a, 0x17, 0x10, 0xc9, 0x62, 0x67, 0x90, 0x63,
94
94
//! ]).expect("public keys must be 33 or 65 bytes, serialized according to SEC 2");
95
95
//!
96
- //! let message = Message::from_slice (&[
96
+ //! let message = Message::from_digest_slice (&[
97
97
//! 0xaa, 0xdf, 0x7d, 0xe7, 0x82, 0x03, 0x4f, 0xbe,
98
98
//! 0x3d, 0x3d, 0xb2, 0xcb, 0x13, 0xc0, 0xcd, 0x91,
99
99
//! 0xbf, 0x41, 0xcb, 0x08, 0xfa, 0xc7, 0xbd, 0x61,
@@ -225,11 +225,41 @@ impl Message {
225
225
/// the result of signing isn't a
226
226
/// [secure signature](https://twitter.com/pwuille/status/1063582706288586752).
227
227
#[ 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 ( ) {
230
260
constants:: MESSAGE_SIZE => {
231
261
let mut ret = [ 0u8 ; constants:: MESSAGE_SIZE ] ;
232
- ret[ ..] . copy_from_slice ( data ) ;
262
+ ret[ ..] . copy_from_slice ( digest ) ;
233
263
Ok ( Message ( ret) )
234
264
}
235
265
_ => Err ( Error :: InvalidMessage ) ,
@@ -540,7 +570,7 @@ mod tests {
540
570
Secp256k1 { ctx : ctx_vrfy, phantom : PhantomData } ;
541
571
542
572
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 ( ) ;
544
574
// Try signing
545
575
assert_eq ! ( sign. sign_ecdsa( & msg, & sk) , full. sign_ecdsa( & msg, & sk) ) ;
546
576
let sig = full. sign_ecdsa ( & msg, & sk) ;
@@ -572,7 +602,7 @@ mod tests {
572
602
let mut vrfy = unsafe { Secp256k1 :: from_raw_verification_only ( ctx_vrfy. ctx ) } ;
573
603
574
604
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 ( ) ;
576
606
// Try signing
577
607
assert_eq ! ( sign. sign_ecdsa( & msg, & sk) , full. sign_ecdsa( & msg, & sk) ) ;
578
608
let sig = full. sign_ecdsa ( & msg, & sk) ;
@@ -618,7 +648,7 @@ mod tests {
618
648
// println!("{:?}", buf_ful[5]); // Can't even read the data thanks to the borrow checker.
619
649
620
650
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 ( ) ;
622
652
// Try signing
623
653
assert_eq ! ( sign. sign_ecdsa( & msg, & sk) , full. sign_ecdsa( & msg, & sk) ) ;
624
654
let sig = full. sign_ecdsa ( & msg, & sk) ;
@@ -636,7 +666,7 @@ mod tests {
636
666
let full = Secp256k1 :: new ( ) ;
637
667
638
668
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 ( ) ;
640
670
641
671
// Try key generation
642
672
let ( sk, pk) = full. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
@@ -665,7 +695,7 @@ mod tests {
665
695
666
696
for _ in 0 ..100 {
667
697
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 ( ) ;
669
699
670
700
let ( sk, _) = s. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
671
701
let sig1 = s. sign_ecdsa ( & msg, & sk) ;
@@ -756,7 +786,7 @@ mod tests {
756
786
let noncedata = [ 42u8 ; 32 ] ;
757
787
for _ in 0 ..100 {
758
788
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 ( ) ;
760
790
761
791
let ( sk, pk) = s. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
762
792
let sig = s. sign_ecdsa ( & msg, & sk) ;
@@ -803,7 +833,7 @@ mod tests {
803
833
wild_msgs[ 1 ] [ 0 ] -= 1 ;
804
834
805
835
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 ( ) ) {
807
837
let sig = s. sign_ecdsa ( & msg, & key) ;
808
838
let low_r_sig = s. sign_ecdsa_low_r ( & msg, & key) ;
809
839
let grind_r_sig = s. sign_ecdsa_grind_r ( & msg, & key, 1 ) ;
@@ -822,14 +852,14 @@ mod tests {
822
852
s. randomize ( & mut rand:: thread_rng ( ) ) ;
823
853
824
854
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 ( ) ;
826
856
827
857
let ( sk, pk) = s. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
828
858
829
859
let sig = s. sign_ecdsa ( & msg, & sk) ;
830
860
831
861
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 ( ) ;
833
863
assert_eq ! ( s. verify_ecdsa( & msg, & sig, & pk) , Err ( Error :: IncorrectSignature ) ) ;
834
864
}
835
865
@@ -845,15 +875,15 @@ mod tests {
845
875
) ;
846
876
847
877
assert_eq ! (
848
- Message :: from_slice ( & [ 0 ; constants:: MESSAGE_SIZE - 1 ] ) ,
878
+ Message :: from_digest_slice ( & [ 0 ; constants:: MESSAGE_SIZE - 1 ] ) ,
849
879
Err ( Error :: InvalidMessage )
850
880
) ;
851
881
assert_eq ! (
852
- Message :: from_slice ( & [ 0 ; constants:: MESSAGE_SIZE + 1 ] ) ,
882
+ Message :: from_digest_slice ( & [ 0 ; constants:: MESSAGE_SIZE + 1 ] ) ,
853
883
Err ( Error :: InvalidMessage )
854
884
) ;
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( ) ) ;
857
887
}
858
888
859
889
#[ test]
@@ -892,7 +922,7 @@ mod tests {
892
922
fn test_noncedata ( ) {
893
923
let secp = Secp256k1 :: new ( ) ;
894
924
let msg = hex ! ( "887d04bb1cf1b1554f1b268dfe62d13064ca67ae45348d50d1392ce2d13418ac" ) ;
895
- let msg = Message :: from_slice ( & msg) . unwrap ( ) ;
925
+ let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
896
926
let noncedata = [ 42u8 ; 32 ] ;
897
927
let sk =
898
928
SecretKey :: from_str ( "57f0148f94d13095cfda539d0da0d1541304b678d8b36e243980aab4e1b7cead" )
@@ -919,7 +949,7 @@ mod tests {
919
949
let secp = Secp256k1 :: new ( ) ;
920
950
let mut sig = ecdsa:: Signature :: from_der ( & sig[ ..] ) . unwrap ( ) ;
921
951
let pk = PublicKey :: from_slice ( & pk[ ..] ) . unwrap ( ) ;
922
- let msg = Message :: from_slice ( & msg[ ..] ) . unwrap ( ) ;
952
+ let msg = Message :: from_digest_slice ( & msg[ ..] ) . unwrap ( ) ;
923
953
924
954
// without normalization we expect this will fail
925
955
assert_eq ! ( secp. verify_ecdsa( & msg, & sig, & pk) , Err ( Error :: IncorrectSignature ) ) ;
@@ -934,7 +964,7 @@ mod tests {
934
964
fn test_low_r ( ) {
935
965
let secp = Secp256k1 :: new ( ) ;
936
966
let msg = hex ! ( "887d04bb1cf1b1554f1b268dfe62d13064ca67ae45348d50d1392ce2d13418ac" ) ;
937
- let msg = Message :: from_slice ( & msg) . unwrap ( ) ;
967
+ let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
938
968
let sk =
939
969
SecretKey :: from_str ( "57f0148f94d13095cfda539d0da0d1541304b678d8b36e243980aab4e1b7cead" )
940
970
. unwrap ( ) ;
@@ -952,7 +982,7 @@ mod tests {
952
982
fn test_grind_r ( ) {
953
983
let secp = Secp256k1 :: new ( ) ;
954
984
let msg = hex ! ( "ef2d5b9a7c61865a95941d0f04285420560df7e9d76890ac1b8867b12ce43167" ) ;
955
- let msg = Message :: from_slice ( & msg) . unwrap ( ) ;
985
+ let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
956
986
let sk =
957
987
SecretKey :: from_str ( "848355d75fe1c354cf05539bb29b2015f1863065bcb6766b44d399ab95c3fa0b" )
958
988
. unwrap ( ) ;
@@ -972,7 +1002,7 @@ mod tests {
972
1002
973
1003
let s = Secp256k1 :: new ( ) ;
974
1004
975
- let msg = Message :: from_slice ( & [ 1 ; 32 ] ) . unwrap ( ) ;
1005
+ let msg = Message :: from_digest_slice ( & [ 1 ; 32 ] ) . unwrap ( ) ;
976
1006
let sk = SecretKey :: from_slice ( & [ 2 ; 32 ] ) . unwrap ( ) ;
977
1007
let sig = s. sign_ecdsa ( & msg, & sk) ;
978
1008
static SIG_BYTES : [ u8 ; 71 ] = [
@@ -1002,7 +1032,7 @@ mod tests {
1002
1032
let sk_data = hex ! ( "e6dd32f8761625f105c39a39f19370b3521d845a12456d60ce44debd0a362641" ) ;
1003
1033
let sk = SecretKey :: from_slice ( & sk_data) . unwrap ( ) ;
1004
1034
let msg_data = hex ! ( "a4965ca63b7d8562736ceec36dfa5a11bf426eb65be8ea3f7a49ae363032da0d" ) ;
1005
- let msg = Message :: from_slice ( & msg_data) . unwrap ( ) ;
1035
+ let msg = Message :: from_digest_slice ( & msg_data) . unwrap ( ) ;
1006
1036
1007
1037
// Check usage as explicit parameter
1008
1038
let pk = PublicKey :: from_secret_key ( SECP256K1 , & sk) ;
@@ -1054,7 +1084,7 @@ mod benches {
1054
1084
pub fn bench_sign_ecdsa ( bh : & mut Bencher ) {
1055
1085
let s = Secp256k1 :: new ( ) ;
1056
1086
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 ( ) ;
1058
1088
let ( sk, _) = s. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
1059
1089
1060
1090
bh. iter ( || {
@@ -1067,7 +1097,7 @@ mod benches {
1067
1097
pub fn bench_verify_ecdsa ( bh : & mut Bencher ) {
1068
1098
let s = Secp256k1 :: new ( ) ;
1069
1099
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 ( ) ;
1071
1101
let ( sk, pk) = s. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
1072
1102
let sig = s. sign_ecdsa ( & msg, & sk) ;
1073
1103
0 commit comments