ed25519: update signature to v3.0.0-rc.4 (#828)

This commit is contained in:
daxpedda 2025-09-15 02:11:51 +02:00 committed by GitHub
parent adb6a12b4a
commit c3a82a8a38
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 52 additions and 21 deletions

View file

@ -32,7 +32,7 @@ curve25519-dalek = { version = "=5.0.0-pre.1", default-features = false, feature
"digest", "digest",
] } ] }
ed25519 = { version = "3.0.0-rc.0", default-features = false } 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 } sha2 = { version = "0.11.0-rc.2", default-features = false }
subtle = { version = "2.3.0", default-features = false } subtle = { version = "2.3.0", default-features = false }

View file

@ -31,16 +31,22 @@ use crate::{InternalError, SignatureError};
/// # let signing_key = SigningKey::generate(&mut csprng); /// # let signing_key = SigningKey::generate(&mut csprng);
/// # let verifying_key = signing_key.verifying_key(); /// # let verifying_key = signing_key.verifying_key();
/// let context_str = b"Local Channel 3"; /// 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 /// // Signer
/// let signing_context = signing_key.with_context(context_str).unwrap(); /// 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 /// // Verifier
/// let verifying_context = verifying_key.with_context(context_str).unwrap(); /// let verifying_context = verifying_key.with_context(context_str).unwrap();
/// let verified: bool = verifying_context /// let verified: bool = verifying_context
/// .verify_digest(prehashed_message, &signature) /// .verify_digest(
/// |digest: &mut Sha512| {
/// digest.update(message);
/// Ok(())
/// },
/// &signature
/// )
/// .is_ok(); /// .is_ok();
/// ///
/// # assert!(verified); /// # assert!(verified);
@ -96,16 +102,23 @@ mod test {
let verifying_key: VerifyingKey = signing_key.verifying_key(); let verifying_key: VerifyingKey = signing_key.verifying_key();
let context_str = b"Local Channel 3"; 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 // Signer
let signing_context = signing_key.with_context(context_str).unwrap(); 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 // Verifier
let verifying_context = verifying_key.with_context(context_str).unwrap(); let verifying_context = verifying_key.with_context(context_str).unwrap();
let verified: bool = verifying_context let verified: bool = verifying_context
.verify_digest(prehashed_message, &signature) .verify_digest(
|digest: &mut Sha512| {
digest.update(message);
Ok(())
},
&signature,
)
.is_ok(); .is_ok();
assert!(verified); assert!(verified);

View file

@ -34,6 +34,8 @@ use ed25519::signature::{KeypairRef, MultipartSigner, MultipartVerifier, Signer,
#[cfg(feature = "digest")] #[cfg(feature = "digest")]
use crate::context::Context; use crate::context::Context;
#[cfg(feature = "digest")] #[cfg(feature = "digest")]
use curve25519_dalek::digest::Update;
#[cfg(feature = "digest")]
use signature::DigestSigner; use signature::DigestSigner;
#[cfg(feature = "zeroize")] #[cfg(feature = "zeroize")]
@ -589,10 +591,15 @@ impl MultipartSigner<Signature> for SigningKey {
#[cfg(feature = "digest")] #[cfg(feature = "digest")]
impl<D> DigestSigner<D, Signature> for SigningKey impl<D> DigestSigner<D, Signature> for SigningKey
where where
D: Digest<OutputSize = U64>, D: Digest<OutputSize = U64> + Update,
{ {
fn try_sign_digest(&self, msg_digest: D) -> Result<Signature, SignatureError> { fn try_sign_digest<F: Fn(&mut D) -> Result<(), SignatureError>>(
self.sign_prehashed(msg_digest, None) &self,
f: F,
) -> Result<Signature, SignatureError> {
let mut digest = D::new();
f(&mut digest)?;
self.sign_prehashed(digest, None)
} }
} }
@ -607,10 +614,15 @@ where
#[cfg(feature = "digest")] #[cfg(feature = "digest")]
impl<D> DigestSigner<D, Signature> for Context<'_, '_, SigningKey> impl<D> DigestSigner<D, Signature> for Context<'_, '_, SigningKey>
where where
D: Digest<OutputSize = U64>, D: Digest<OutputSize = U64> + Update,
{ {
fn try_sign_digest(&self, msg_digest: D) -> Result<Signature, SignatureError> { fn try_sign_digest<F: Fn(&mut D) -> Result<(), SignatureError>>(
self.key().sign_prehashed(msg_digest, Some(self.value())) &self,
f: F,
) -> Result<Signature, SignatureError> {
let mut digest = D::new();
f(&mut digest)?;
self.key().sign_prehashed(digest, Some(self.value()))
} }
} }

View file

@ -32,6 +32,8 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[cfg(feature = "digest")] #[cfg(feature = "digest")]
use crate::context::Context; use crate::context::Context;
#[cfg(feature = "digest")] #[cfg(feature = "digest")]
use curve25519_dalek::digest::Update;
#[cfg(feature = "digest")]
use signature::DigestVerifier; use signature::DigestVerifier;
use crate::{ use crate::{
@ -579,14 +581,16 @@ impl MultipartVerifier<ed25519::Signature> for VerifyingKey {
#[cfg(feature = "digest")] #[cfg(feature = "digest")]
impl<MsgDigest> DigestVerifier<MsgDigest, ed25519::Signature> for VerifyingKey impl<MsgDigest> DigestVerifier<MsgDigest, ed25519::Signature> for VerifyingKey
where where
MsgDigest: Digest<OutputSize = U64>, MsgDigest: Digest<OutputSize = U64> + Update,
{ {
fn verify_digest( fn verify_digest<F: Fn(&mut MsgDigest) -> Result<(), SignatureError>>(
&self, &self,
msg_digest: MsgDigest, f: F,
signature: &ed25519::Signature, signature: &ed25519::Signature,
) -> Result<(), SignatureError> { ) -> 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")] #[cfg(feature = "digest")]
impl<MsgDigest> DigestVerifier<MsgDigest, ed25519::Signature> for Context<'_, '_, VerifyingKey> impl<MsgDigest> DigestVerifier<MsgDigest, ed25519::Signature> for Context<'_, '_, VerifyingKey>
where where
MsgDigest: Digest<OutputSize = U64>, MsgDigest: Digest<OutputSize = U64> + Update,
{ {
fn verify_digest( fn verify_digest<F: Fn(&mut MsgDigest) -> Result<(), SignatureError>>(
&self, &self,
msg_digest: MsgDigest, f: F,
signature: &ed25519::Signature, signature: &ed25519::Signature,
) -> Result<(), SignatureError> { ) -> Result<(), SignatureError> {
let mut digest = MsgDigest::new();
f(&mut digest)?;
self.key() self.key()
.verify_prehashed(msg_digest, Some(self.value()), signature) .verify_prehashed(digest, Some(self.value()), signature)
} }
} }