From c3a82a8a38a58aee500a20bde1664012fcfa83ba Mon Sep 17 00:00:00 2001 From: daxpedda Date: Mon, 15 Sep 2025 02:11:51 +0200 Subject: [PATCH] ed25519: update `signature` to v3.0.0-rc.4 (#828) --- ed25519-dalek/Cargo.toml | 2 +- ed25519-dalek/src/context.rs | 25 +++++++++++++++++++------ ed25519-dalek/src/signing.rs | 24 ++++++++++++++++++------ ed25519-dalek/src/verifying.rs | 22 ++++++++++++++-------- 4 files changed, 52 insertions(+), 21 deletions(-) diff --git a/ed25519-dalek/Cargo.toml b/ed25519-dalek/Cargo.toml index fe09ce3..01fabfd 100644 --- a/ed25519-dalek/Cargo.toml +++ b/ed25519-dalek/Cargo.toml @@ -32,7 +32,7 @@ curve25519-dalek = { version = "=5.0.0-pre.1", default-features = false, feature "digest", ] } ed25519 = { version = "3.0.0-rc.0", default-features = false } -signature = { version = "3.0.0-rc.3", optional = true, default-features = false } +signature = { version = "3.0.0-rc.4", optional = true, default-features = false } sha2 = { version = "0.11.0-rc.2", default-features = false } subtle = { version = "2.3.0", default-features = false } diff --git a/ed25519-dalek/src/context.rs b/ed25519-dalek/src/context.rs index 8ef18dc..0d42567 100644 --- a/ed25519-dalek/src/context.rs +++ b/ed25519-dalek/src/context.rs @@ -31,16 +31,22 @@ use crate::{InternalError, SignatureError}; /// # let signing_key = SigningKey::generate(&mut csprng); /// # let verifying_key = signing_key.verifying_key(); /// let context_str = b"Local Channel 3"; -/// let prehashed_message = Sha512::default().chain_update(b"Stay tuned for more news at 7"); +/// let message = b"Stay tuned for more news at 7"; /// /// // Signer /// let signing_context = signing_key.with_context(context_str).unwrap(); -/// let signature = signing_context.sign_digest(prehashed_message.clone()); +/// let signature = signing_context.sign_digest(|digest: &mut Sha512| digest.update(message)); /// /// // Verifier /// let verifying_context = verifying_key.with_context(context_str).unwrap(); /// let verified: bool = verifying_context -/// .verify_digest(prehashed_message, &signature) +/// .verify_digest( +/// |digest: &mut Sha512| { +/// digest.update(message); +/// Ok(()) +/// }, +/// &signature +/// ) /// .is_ok(); /// /// # assert!(verified); @@ -96,16 +102,23 @@ mod test { let verifying_key: VerifyingKey = signing_key.verifying_key(); let context_str = b"Local Channel 3"; - let prehashed_message = Sha512::default().chain_update(b"Stay tuned for more news at 7"); + let message = b"Stay tuned for more news at 7"; // Signer let signing_context = signing_key.with_context(context_str).unwrap(); - let signature: Signature = signing_context.sign_digest(prehashed_message.clone()); + let signature: Signature = + signing_context.sign_digest(|digest: &mut Sha512| digest.update(message)); // Verifier let verifying_context = verifying_key.with_context(context_str).unwrap(); let verified: bool = verifying_context - .verify_digest(prehashed_message, &signature) + .verify_digest( + |digest: &mut Sha512| { + digest.update(message); + Ok(()) + }, + &signature, + ) .is_ok(); assert!(verified); diff --git a/ed25519-dalek/src/signing.rs b/ed25519-dalek/src/signing.rs index de68dac..a451b11 100644 --- a/ed25519-dalek/src/signing.rs +++ b/ed25519-dalek/src/signing.rs @@ -34,6 +34,8 @@ use ed25519::signature::{KeypairRef, MultipartSigner, MultipartVerifier, Signer, #[cfg(feature = "digest")] use crate::context::Context; #[cfg(feature = "digest")] +use curve25519_dalek::digest::Update; +#[cfg(feature = "digest")] use signature::DigestSigner; #[cfg(feature = "zeroize")] @@ -589,10 +591,15 @@ impl MultipartSigner for SigningKey { #[cfg(feature = "digest")] impl DigestSigner for SigningKey where - D: Digest, + D: Digest + Update, { - fn try_sign_digest(&self, msg_digest: D) -> Result { - self.sign_prehashed(msg_digest, None) + fn try_sign_digest Result<(), SignatureError>>( + &self, + f: F, + ) -> Result { + let mut digest = D::new(); + f(&mut digest)?; + self.sign_prehashed(digest, None) } } @@ -607,10 +614,15 @@ where #[cfg(feature = "digest")] impl DigestSigner for Context<'_, '_, SigningKey> where - D: Digest, + D: Digest + Update, { - fn try_sign_digest(&self, msg_digest: D) -> Result { - self.key().sign_prehashed(msg_digest, Some(self.value())) + fn try_sign_digest Result<(), SignatureError>>( + &self, + f: F, + ) -> Result { + let mut digest = D::new(); + f(&mut digest)?; + self.key().sign_prehashed(digest, Some(self.value())) } } diff --git a/ed25519-dalek/src/verifying.rs b/ed25519-dalek/src/verifying.rs index fd2a6e9..2dc2eba 100644 --- a/ed25519-dalek/src/verifying.rs +++ b/ed25519-dalek/src/verifying.rs @@ -32,6 +32,8 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer}; #[cfg(feature = "digest")] use crate::context::Context; #[cfg(feature = "digest")] +use curve25519_dalek::digest::Update; +#[cfg(feature = "digest")] use signature::DigestVerifier; use crate::{ @@ -579,14 +581,16 @@ impl MultipartVerifier for VerifyingKey { #[cfg(feature = "digest")] impl DigestVerifier for VerifyingKey where - MsgDigest: Digest, + MsgDigest: Digest + Update, { - fn verify_digest( + fn verify_digest Result<(), SignatureError>>( &self, - msg_digest: MsgDigest, + f: F, signature: &ed25519::Signature, ) -> Result<(), SignatureError> { - self.verify_prehashed(msg_digest, None, signature) + let mut digest = MsgDigest::new(); + f(&mut digest)?; + self.verify_prehashed(digest, None, signature) } } @@ -595,15 +599,17 @@ where #[cfg(feature = "digest")] impl DigestVerifier for Context<'_, '_, VerifyingKey> where - MsgDigest: Digest, + MsgDigest: Digest + Update, { - fn verify_digest( + fn verify_digest Result<(), SignatureError>>( &self, - msg_digest: MsgDigest, + f: F, signature: &ed25519::Signature, ) -> Result<(), SignatureError> { + let mut digest = MsgDigest::new(); + f(&mut digest)?; self.key() - .verify_prehashed(msg_digest, Some(self.value()), signature) + .verify_prehashed(digest, Some(self.value()), signature) } }