71
71
//! let secret_key = SecretKey::from_slice(&[0xcd; 32]).expect("32 bytes, within curve order");
72
72
//! let public_key = PublicKey::from_secret_key(&secp, &secret_key);
73
73
//! // This is unsafe unless the supplied byte slice is the output of a cryptographic hash function.
74
- //! let message = Message::from_digest_slice(& [0xab; 32]).expect("32 bytes" );
74
+ //! let message = Message::from_digest( [0xab; 32]);
75
75
//!
76
76
//! let sig = secp.sign_ecdsa(&message, &secret_key);
77
77
//! assert!(secp.verify_ecdsa(&message, &sig, &public_key).is_ok());
94
94
//! 0x3a, 0x17, 0x10, 0xc9, 0x62, 0x67, 0x90, 0x63,
95
95
//! ]).expect("public keys must be 33 or 65 bytes, serialized according to SEC 2");
96
96
//!
97
- //! let message = Message::from_digest_slice(& [
97
+ //! let message = Message::from_digest( [
98
98
//! 0xaa, 0xdf, 0x7d, 0xe7, 0x82, 0x03, 0x4f, 0xbe,
99
99
//! 0x3d, 0x3d, 0xb2, 0xcb, 0x13, 0xc0, 0xcd, 0x91,
100
100
//! 0xbf, 0x41, 0xcb, 0x08, 0xfa, 0xc7, 0xbd, 0x61,
101
101
//! 0xd5, 0x44, 0x53, 0xcf, 0x6e, 0x82, 0xb4, 0x50,
102
- //! ]).expect("messages must be 32 bytes and are expected to be hashes") ;
102
+ //! ]);
103
103
//!
104
104
//! let sig = ecdsa::Signature::from_compact(&[
105
105
//! 0xdc, 0x4d, 0xc2, 0x64, 0xa9, 0xfe, 0xf1, 0x7a,
@@ -218,8 +218,9 @@ impl Message {
218
218
/// the result of signing isn't a
219
219
/// [secure signature](https://twitter.com/pwuille/status/1063582706288586752).
220
220
#[ inline]
221
- #[ deprecated( since = "0.28.0" , note = "use from_digest_slice instead" ) ]
221
+ #[ deprecated( since = "0.28.0" , note = "use from_digest instead" ) ]
222
222
pub fn from_slice ( digest : & [ u8 ] ) -> Result < Message , Error > {
223
+ #[ allow( deprecated) ]
223
224
Message :: from_digest_slice ( digest)
224
225
}
225
226
@@ -238,21 +239,19 @@ impl Message {
238
239
/// message that's going to be signed. Otherwise the result of signing isn't a [secure
239
240
/// signature].
240
241
///
242
+ /// This method is deprecated. It's best to use [`Message::from_digest`] directly with an
243
+ /// array. If your hash engine doesn't return an array for some reason use `.try_into()` on its
244
+ /// output.
245
+ ///
241
246
/// # Errors
242
247
///
243
248
/// If `digest` is not exactly 32 bytes long.
244
249
///
245
250
/// [secure signature]: https://twitter.com/pwuille/status/1063582706288586752
246
251
#[ inline]
252
+ #[ deprecated( since = "TBD" , note = "use from_digest instead" ) ]
247
253
pub fn from_digest_slice ( digest : & [ u8 ] ) -> Result < Message , Error > {
248
- match digest. len ( ) {
249
- constants:: MESSAGE_SIZE => {
250
- let mut ret = [ 0u8 ; constants:: MESSAGE_SIZE ] ;
251
- ret[ ..] . copy_from_slice ( digest) ;
252
- Ok ( Message ( ret) )
253
- }
254
- _ => Err ( Error :: InvalidMessage ) ,
255
- }
254
+ Ok ( Message :: from_digest ( digest. try_into ( ) . map_err ( |_| Error :: InvalidMessage ) ?) )
256
255
}
257
256
}
258
257
@@ -508,19 +507,12 @@ pub(crate) fn random_32_bytes<R: rand::Rng + ?Sized>(rng: &mut R) -> [u8; 32] {
508
507
mod tests {
509
508
use std:: str:: FromStr ;
510
509
510
+ use hex_lit:: hex;
511
511
#[ cfg( target_arch = "wasm32" ) ]
512
512
use wasm_bindgen_test:: wasm_bindgen_test as test;
513
513
514
514
use super :: * ;
515
515
516
- macro_rules! hex {
517
- ( $hex: expr) => { {
518
- let mut result = vec![ 0 ; $hex. len( ) / 2 ] ;
519
- from_hex( $hex, & mut result) . expect( "valid hex string" ) ;
520
- result
521
- } } ;
522
- }
523
-
524
516
#[ test]
525
517
#[ cfg( all( feature = "rand" , feature = "std" ) ) ]
526
518
// In rustc 1.72 this Clippy lint was pulled out of clippy and into rustc, and
@@ -543,7 +535,7 @@ mod tests {
543
535
let mut vrfy = unsafe { Secp256k1 :: from_raw_verification_only ( ctx_vrfy. ctx ) } ;
544
536
545
537
let ( sk, pk) = full. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
546
- let msg = Message :: from_digest_slice ( & [ 2u8 ; 32 ] ) . unwrap ( ) ;
538
+ let msg = Message :: from_digest ( [ 2u8 ; 32 ] ) ;
547
539
// Try signing
548
540
assert_eq ! ( sign. sign_ecdsa( & msg, & sk) , full. sign_ecdsa( & msg, & sk) ) ;
549
541
let sig = full. sign_ecdsa ( & msg, & sk) ;
@@ -610,7 +602,7 @@ mod tests {
610
602
// println!("{:?}", buf_ful[5]); // Can't even read the data thanks to the borrow checker.
611
603
612
604
let ( sk, pk) = full. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
613
- let msg = Message :: from_digest_slice ( & [ 2u8 ; 32 ] ) . unwrap ( ) ;
605
+ let msg = Message :: from_digest ( [ 2u8 ; 32 ] ) ;
614
606
// Try signing
615
607
assert_eq ! ( sign. sign_ecdsa( & msg, & sk) , full. sign_ecdsa( & msg, & sk) ) ;
616
608
let sig = full. sign_ecdsa ( & msg, & sk) ;
@@ -628,7 +620,7 @@ mod tests {
628
620
let full = Secp256k1 :: new ( ) ;
629
621
630
622
let msg = crate :: random_32_bytes ( & mut rand:: thread_rng ( ) ) ;
631
- let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
623
+ let msg = Message :: from_digest ( msg) ;
632
624
633
625
// Try key generation
634
626
let ( sk, pk) = full. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
@@ -657,7 +649,7 @@ mod tests {
657
649
658
650
for _ in 0 ..100 {
659
651
let msg = crate :: random_32_bytes ( & mut rand:: thread_rng ( ) ) ;
660
- let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
652
+ let msg = Message :: from_digest ( msg) ;
661
653
662
654
let ( sk, _) = s. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
663
655
let sig1 = s. sign_ecdsa ( & msg, & sk) ;
@@ -678,17 +670,17 @@ mod tests {
678
670
679
671
#[ test]
680
672
fn signature_display ( ) {
681
- let hex_str = "3046022100839c1fbc5304de944f697c9f4b1d01d1faeba32d751c0f7acb21ac8a0f436a72022100e89bd46bb3a5a62adc679f659b7ce876d83ee297c7a5587b2011c4fcc72eab45" ;
682
- let byte_str = hex ! ( hex_str ) ;
673
+ const HEX_STR : & str = "3046022100839c1fbc5304de944f697c9f4b1d01d1faeba32d751c0f7acb21ac8a0f436a72022100e89bd46bb3a5a62adc679f659b7ce876d83ee297c7a5587b2011c4fcc72eab45" ;
674
+ let byte_str = hex ! ( HEX_STR ) ;
683
675
684
676
assert_eq ! (
685
677
ecdsa:: Signature :: from_der( & byte_str) . expect( "byte str decode" ) ,
686
- ecdsa:: Signature :: from_str( hex_str ) . expect( "byte str decode" )
678
+ ecdsa:: Signature :: from_str( HEX_STR ) . expect( "byte str decode" )
687
679
) ;
688
680
689
- let sig = ecdsa:: Signature :: from_str ( hex_str ) . expect ( "byte str decode" ) ;
690
- assert_eq ! ( & sig. to_string( ) , hex_str ) ;
691
- assert_eq ! ( & format!( "{:?}" , sig) , hex_str ) ;
681
+ let sig = ecdsa:: Signature :: from_str ( HEX_STR ) . expect ( "byte str decode" ) ;
682
+ assert_eq ! ( & sig. to_string( ) , HEX_STR ) ;
683
+ assert_eq ! ( & format!( "{:?}" , sig) , HEX_STR ) ;
692
684
693
685
assert ! ( ecdsa:: Signature :: from_str(
694
686
"3046022100839c1fbc5304de944f697c9f4b1d01d1faeba32d751c0f7acb21ac8a0f436a\
@@ -748,7 +740,7 @@ mod tests {
748
740
let noncedata = [ 42u8 ; 32 ] ;
749
741
for _ in 0 ..100 {
750
742
let msg = crate :: random_32_bytes ( & mut rand:: thread_rng ( ) ) ;
751
- let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
743
+ let msg = Message :: from_digest ( msg) ;
752
744
753
745
let ( sk, pk) = s. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
754
746
let sig = s. sign_ecdsa ( & msg, & sk) ;
@@ -795,7 +787,7 @@ mod tests {
795
787
wild_msgs[ 1 ] [ 0 ] -= 1 ;
796
788
797
789
for key in wild_keys. iter ( ) . map ( |k| SecretKey :: from_slice ( & k[ ..] ) . unwrap ( ) ) {
798
- for msg in wild_msgs. iter ( ) . map ( |m| Message :: from_digest_slice ( & m [ .. ] ) . unwrap ( ) ) {
790
+ for msg in wild_msgs. into_iter ( ) . map ( Message :: from_digest ) {
799
791
let sig = s. sign_ecdsa ( & msg, & key) ;
800
792
let low_r_sig = s. sign_ecdsa_low_r ( & msg, & key) ;
801
793
let grind_r_sig = s. sign_ecdsa_grind_r ( & msg, & key, 1 ) ;
@@ -814,18 +806,19 @@ mod tests {
814
806
s. randomize ( & mut rand:: thread_rng ( ) ) ;
815
807
816
808
let msg = crate :: random_32_bytes ( & mut rand:: thread_rng ( ) ) ;
817
- let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
809
+ let msg = Message :: from_digest ( msg) ;
818
810
819
811
let ( sk, pk) = s. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
820
812
821
813
let sig = s. sign_ecdsa ( & msg, & sk) ;
822
814
823
815
let msg = crate :: random_32_bytes ( & mut rand:: thread_rng ( ) ) ;
824
- let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
816
+ let msg = Message :: from_digest ( msg) ;
825
817
assert_eq ! ( s. verify_ecdsa( & msg, & sig, & pk) , Err ( Error :: IncorrectSignature ) ) ;
826
818
}
827
819
828
820
#[ test]
821
+ #[ allow( deprecated) ]
829
822
fn test_bad_slice ( ) {
830
823
assert_eq ! (
831
824
ecdsa:: Signature :: from_der( & [ 0 ; constants:: MAX_SIGNATURE_SIZE + 1 ] ) ,
@@ -884,7 +877,7 @@ mod tests {
884
877
fn test_noncedata ( ) {
885
878
let secp = Secp256k1 :: new ( ) ;
886
879
let msg = hex ! ( "887d04bb1cf1b1554f1b268dfe62d13064ca67ae45348d50d1392ce2d13418ac" ) ;
887
- let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
880
+ let msg = Message :: from_digest ( msg) ;
888
881
let noncedata = [ 42u8 ; 32 ] ;
889
882
let sk =
890
883
SecretKey :: from_str ( "57f0148f94d13095cfda539d0da0d1541304b678d8b36e243980aab4e1b7cead" )
@@ -911,7 +904,7 @@ mod tests {
911
904
let secp = Secp256k1 :: new ( ) ;
912
905
let mut sig = ecdsa:: Signature :: from_der ( & sig[ ..] ) . unwrap ( ) ;
913
906
let pk = PublicKey :: from_slice ( & pk[ ..] ) . unwrap ( ) ;
914
- let msg = Message :: from_digest_slice ( & msg[ .. ] ) . unwrap ( ) ;
907
+ let msg = Message :: from_digest ( msg) ;
915
908
916
909
// without normalization we expect this will fail
917
910
assert_eq ! ( secp. verify_ecdsa( & msg, & sig, & pk) , Err ( Error :: IncorrectSignature ) ) ;
@@ -926,7 +919,7 @@ mod tests {
926
919
fn test_low_r ( ) {
927
920
let secp = Secp256k1 :: new ( ) ;
928
921
let msg = hex ! ( "887d04bb1cf1b1554f1b268dfe62d13064ca67ae45348d50d1392ce2d13418ac" ) ;
929
- let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
922
+ let msg = Message :: from_digest ( msg) ;
930
923
let sk =
931
924
SecretKey :: from_str ( "57f0148f94d13095cfda539d0da0d1541304b678d8b36e243980aab4e1b7cead" )
932
925
. unwrap ( ) ;
@@ -944,7 +937,7 @@ mod tests {
944
937
fn test_grind_r ( ) {
945
938
let secp = Secp256k1 :: new ( ) ;
946
939
let msg = hex ! ( "ef2d5b9a7c61865a95941d0f04285420560df7e9d76890ac1b8867b12ce43167" ) ;
947
- let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
940
+ let msg = Message :: from_digest ( msg) ;
948
941
let sk =
949
942
SecretKey :: from_str ( "848355d75fe1c354cf05539bb29b2015f1863065bcb6766b44d399ab95c3fa0b" )
950
943
. unwrap ( ) ;
@@ -964,7 +957,7 @@ mod tests {
964
957
965
958
let s = Secp256k1 :: new ( ) ;
966
959
967
- let msg = Message :: from_digest_slice ( & [ 1 ; 32 ] ) . unwrap ( ) ;
960
+ let msg = Message :: from_digest ( [ 1 ; 32 ] ) ;
968
961
let sk = SecretKey :: from_slice ( & [ 2 ; 32 ] ) . unwrap ( ) ;
969
962
let sig = s. sign_ecdsa ( & msg, & sk) ;
970
963
static SIG_BYTES : [ u8 ; 71 ] = [
@@ -994,7 +987,7 @@ mod tests {
994
987
let sk_data = hex ! ( "e6dd32f8761625f105c39a39f19370b3521d845a12456d60ce44debd0a362641" ) ;
995
988
let sk = SecretKey :: from_slice ( & sk_data) . unwrap ( ) ;
996
989
let msg_data = hex ! ( "a4965ca63b7d8562736ceec36dfa5a11bf426eb65be8ea3f7a49ae363032da0d" ) ;
997
- let msg = Message :: from_digest_slice ( & msg_data) . unwrap ( ) ;
990
+ let msg = Message :: from_digest ( msg_data) ;
998
991
999
992
// Check usage as explicit parameter
1000
993
let pk = PublicKey :: from_secret_key ( SECP256K1 , & sk) ;
@@ -1028,7 +1021,7 @@ mod benches {
1028
1021
pub fn bench_sign_ecdsa ( bh : & mut Bencher ) {
1029
1022
let s = Secp256k1 :: new ( ) ;
1030
1023
let msg = crate :: random_32_bytes ( & mut rand:: thread_rng ( ) ) ;
1031
- let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
1024
+ let msg = Message :: from_digest ( msg) ;
1032
1025
let ( sk, _) = s. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
1033
1026
1034
1027
bh. iter ( || {
@@ -1041,7 +1034,7 @@ mod benches {
1041
1034
pub fn bench_verify_ecdsa ( bh : & mut Bencher ) {
1042
1035
let s = Secp256k1 :: new ( ) ;
1043
1036
let msg = crate :: random_32_bytes ( & mut rand:: thread_rng ( ) ) ;
1044
- let msg = Message :: from_digest_slice ( & msg) . unwrap ( ) ;
1037
+ let msg = Message :: from_digest ( msg) ;
1045
1038
let ( sk, pk) = s. generate_keypair ( & mut rand:: thread_rng ( ) ) ;
1046
1039
let sig = s. sign_ecdsa ( & msg, & sk) ;
1047
1040
0 commit comments