Skip to content

Commit 939bf9e

Browse files
committed
Deprecate Message::from_digest_slice
All sensible hash engines return arrays, not slices or other things, therefore `Message::from_digest_slice` is most likely entirely unneeded since the array version does a better job and in those rare cases where it is, the users can just call `.try_into()` themselves. This commit deprecates `from_digest_slice` and changes all tests to use `from_digest` except the test that tests `from_digest_slice`. It also simplifies its code to use `try_into` rather than convert manually and inefficiently.
1 parent 13c5366 commit 939bf9e

File tree

1 file changed

+28
-28
lines changed

1 file changed

+28
-28
lines changed

src/lib.rs

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
//! let secret_key = SecretKey::from_slice(&[0xcd; 32]).expect("32 bytes, within curve order");
7272
//! let public_key = PublicKey::from_secret_key(&secp, &secret_key);
7373
//! // 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]);
7575
//!
7676
//! let sig = secp.sign_ecdsa(&message, &secret_key);
7777
//! assert!(secp.verify_ecdsa(&message, &sig, &public_key).is_ok());
@@ -94,12 +94,12 @@
9494
//! 0x3a, 0x17, 0x10, 0xc9, 0x62, 0x67, 0x90, 0x63,
9595
//! ]).expect("public keys must be 33 or 65 bytes, serialized according to SEC 2");
9696
//!
97-
//! let message = Message::from_digest_slice(&[
97+
//! let message = Message::from_digest([
9898
//! 0xaa, 0xdf, 0x7d, 0xe7, 0x82, 0x03, 0x4f, 0xbe,
9999
//! 0x3d, 0x3d, 0xb2, 0xcb, 0x13, 0xc0, 0xcd, 0x91,
100100
//! 0xbf, 0x41, 0xcb, 0x08, 0xfa, 0xc7, 0xbd, 0x61,
101101
//! 0xd5, 0x44, 0x53, 0xcf, 0x6e, 0x82, 0xb4, 0x50,
102-
//! ]).expect("messages must be 32 bytes and are expected to be hashes");
102+
//! ]);
103103
//!
104104
//! let sig = ecdsa::Signature::from_compact(&[
105105
//! 0xdc, 0x4d, 0xc2, 0x64, 0xa9, 0xfe, 0xf1, 0x7a,
@@ -218,8 +218,9 @@ impl Message {
218218
/// the result of signing isn't a
219219
/// [secure signature](https://twitter.com/pwuille/status/1063582706288586752).
220220
#[inline]
221-
#[deprecated(since = "0.28.0", note = "use from_digest_slice instead")]
221+
#[deprecated(since = "0.28.0", note = "use from_digest instead")]
222222
pub fn from_slice(digest: &[u8]) -> Result<Message, Error> {
223+
#[allow(deprecated)]
223224
Message::from_digest_slice(digest)
224225
}
225226

@@ -238,21 +239,19 @@ impl Message {
238239
/// message that's going to be signed. Otherwise the result of signing isn't a [secure
239240
/// signature].
240241
///
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+
///
241246
/// # Errors
242247
///
243248
/// If `digest` is not exactly 32 bytes long.
244249
///
245250
/// [secure signature]: https://twitter.com/pwuille/status/1063582706288586752
246251
#[inline]
252+
#[deprecated(since = "TBD", note = "use from_digest instead")]
247253
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)?))
256255
}
257256
}
258257

@@ -536,7 +535,7 @@ mod tests {
536535
let mut vrfy = unsafe { Secp256k1::from_raw_verification_only(ctx_vrfy.ctx) };
537536

538537
let (sk, pk) = full.generate_keypair(&mut rand::thread_rng());
539-
let msg = Message::from_digest_slice(&[2u8; 32]).unwrap();
538+
let msg = Message::from_digest([2u8; 32]);
540539
// Try signing
541540
assert_eq!(sign.sign_ecdsa(&msg, &sk), full.sign_ecdsa(&msg, &sk));
542541
let sig = full.sign_ecdsa(&msg, &sk);
@@ -603,7 +602,7 @@ mod tests {
603602
// println!("{:?}", buf_ful[5]); // Can't even read the data thanks to the borrow checker.
604603

605604
let (sk, pk) = full.generate_keypair(&mut rand::thread_rng());
606-
let msg = Message::from_digest_slice(&[2u8; 32]).unwrap();
605+
let msg = Message::from_digest([2u8; 32]);
607606
// Try signing
608607
assert_eq!(sign.sign_ecdsa(&msg, &sk), full.sign_ecdsa(&msg, &sk));
609608
let sig = full.sign_ecdsa(&msg, &sk);
@@ -621,7 +620,7 @@ mod tests {
621620
let full = Secp256k1::new();
622621

623622
let msg = crate::random_32_bytes(&mut rand::thread_rng());
624-
let msg = Message::from_digest_slice(&msg).unwrap();
623+
let msg = Message::from_digest(msg);
625624

626625
// Try key generation
627626
let (sk, pk) = full.generate_keypair(&mut rand::thread_rng());
@@ -650,7 +649,7 @@ mod tests {
650649

651650
for _ in 0..100 {
652651
let msg = crate::random_32_bytes(&mut rand::thread_rng());
653-
let msg = Message::from_digest_slice(&msg).unwrap();
652+
let msg = Message::from_digest(msg);
654653

655654
let (sk, _) = s.generate_keypair(&mut rand::thread_rng());
656655
let sig1 = s.sign_ecdsa(&msg, &sk);
@@ -741,7 +740,7 @@ mod tests {
741740
let noncedata = [42u8; 32];
742741
for _ in 0..100 {
743742
let msg = crate::random_32_bytes(&mut rand::thread_rng());
744-
let msg = Message::from_digest_slice(&msg).unwrap();
743+
let msg = Message::from_digest(msg);
745744

746745
let (sk, pk) = s.generate_keypair(&mut rand::thread_rng());
747746
let sig = s.sign_ecdsa(&msg, &sk);
@@ -788,7 +787,7 @@ mod tests {
788787
wild_msgs[1][0] -= 1;
789788

790789
for key in wild_keys.iter().map(|k| SecretKey::from_slice(&k[..]).unwrap()) {
791-
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) {
792791
let sig = s.sign_ecdsa(&msg, &key);
793792
let low_r_sig = s.sign_ecdsa_low_r(&msg, &key);
794793
let grind_r_sig = s.sign_ecdsa_grind_r(&msg, &key, 1);
@@ -807,18 +806,19 @@ mod tests {
807806
s.randomize(&mut rand::thread_rng());
808807

809808
let msg = crate::random_32_bytes(&mut rand::thread_rng());
810-
let msg = Message::from_digest_slice(&msg).unwrap();
809+
let msg = Message::from_digest(msg);
811810

812811
let (sk, pk) = s.generate_keypair(&mut rand::thread_rng());
813812

814813
let sig = s.sign_ecdsa(&msg, &sk);
815814

816815
let msg = crate::random_32_bytes(&mut rand::thread_rng());
817-
let msg = Message::from_digest_slice(&msg).unwrap();
816+
let msg = Message::from_digest(msg);
818817
assert_eq!(s.verify_ecdsa(&msg, &sig, &pk), Err(Error::IncorrectSignature));
819818
}
820819

821820
#[test]
821+
#[allow(deprecated)]
822822
fn test_bad_slice() {
823823
assert_eq!(
824824
ecdsa::Signature::from_der(&[0; constants::MAX_SIGNATURE_SIZE + 1]),
@@ -877,7 +877,7 @@ mod tests {
877877
fn test_noncedata() {
878878
let secp = Secp256k1::new();
879879
let msg = hex!("887d04bb1cf1b1554f1b268dfe62d13064ca67ae45348d50d1392ce2d13418ac");
880-
let msg = Message::from_digest_slice(&msg).unwrap();
880+
let msg = Message::from_digest(msg);
881881
let noncedata = [42u8; 32];
882882
let sk =
883883
SecretKey::from_str("57f0148f94d13095cfda539d0da0d1541304b678d8b36e243980aab4e1b7cead")
@@ -904,7 +904,7 @@ mod tests {
904904
let secp = Secp256k1::new();
905905
let mut sig = ecdsa::Signature::from_der(&sig[..]).unwrap();
906906
let pk = PublicKey::from_slice(&pk[..]).unwrap();
907-
let msg = Message::from_digest_slice(&msg[..]).unwrap();
907+
let msg = Message::from_digest(msg);
908908

909909
// without normalization we expect this will fail
910910
assert_eq!(secp.verify_ecdsa(&msg, &sig, &pk), Err(Error::IncorrectSignature));
@@ -919,7 +919,7 @@ mod tests {
919919
fn test_low_r() {
920920
let secp = Secp256k1::new();
921921
let msg = hex!("887d04bb1cf1b1554f1b268dfe62d13064ca67ae45348d50d1392ce2d13418ac");
922-
let msg = Message::from_digest_slice(&msg).unwrap();
922+
let msg = Message::from_digest(msg);
923923
let sk =
924924
SecretKey::from_str("57f0148f94d13095cfda539d0da0d1541304b678d8b36e243980aab4e1b7cead")
925925
.unwrap();
@@ -937,7 +937,7 @@ mod tests {
937937
fn test_grind_r() {
938938
let secp = Secp256k1::new();
939939
let msg = hex!("ef2d5b9a7c61865a95941d0f04285420560df7e9d76890ac1b8867b12ce43167");
940-
let msg = Message::from_digest_slice(&msg).unwrap();
940+
let msg = Message::from_digest(msg);
941941
let sk =
942942
SecretKey::from_str("848355d75fe1c354cf05539bb29b2015f1863065bcb6766b44d399ab95c3fa0b")
943943
.unwrap();
@@ -957,7 +957,7 @@ mod tests {
957957

958958
let s = Secp256k1::new();
959959

960-
let msg = Message::from_digest_slice(&[1; 32]).unwrap();
960+
let msg = Message::from_digest([1; 32]);
961961
let sk = SecretKey::from_slice(&[2; 32]).unwrap();
962962
let sig = s.sign_ecdsa(&msg, &sk);
963963
static SIG_BYTES: [u8; 71] = [
@@ -987,7 +987,7 @@ mod tests {
987987
let sk_data = hex!("e6dd32f8761625f105c39a39f19370b3521d845a12456d60ce44debd0a362641");
988988
let sk = SecretKey::from_slice(&sk_data).unwrap();
989989
let msg_data = hex!("a4965ca63b7d8562736ceec36dfa5a11bf426eb65be8ea3f7a49ae363032da0d");
990-
let msg = Message::from_digest_slice(&msg_data).unwrap();
990+
let msg = Message::from_digest(msg_data);
991991

992992
// Check usage as explicit parameter
993993
let pk = PublicKey::from_secret_key(SECP256K1, &sk);
@@ -1021,7 +1021,7 @@ mod benches {
10211021
pub fn bench_sign_ecdsa(bh: &mut Bencher) {
10221022
let s = Secp256k1::new();
10231023
let msg = crate::random_32_bytes(&mut rand::thread_rng());
1024-
let msg = Message::from_digest_slice(&msg).unwrap();
1024+
let msg = Message::from_digest(msg);
10251025
let (sk, _) = s.generate_keypair(&mut rand::thread_rng());
10261026

10271027
bh.iter(|| {
@@ -1034,7 +1034,7 @@ mod benches {
10341034
pub fn bench_verify_ecdsa(bh: &mut Bencher) {
10351035
let s = Secp256k1::new();
10361036
let msg = crate::random_32_bytes(&mut rand::thread_rng());
1037-
let msg = Message::from_digest_slice(&msg).unwrap();
1037+
let msg = Message::from_digest(msg);
10381038
let (sk, pk) = s.generate_keypair(&mut rand::thread_rng());
10391039
let sig = s.sign_ecdsa(&msg, &sk);
10401040

0 commit comments

Comments
 (0)