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",
] }
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 }

View file

@ -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);

View file

@ -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<Signature> for SigningKey {
#[cfg(feature = "digest")]
impl<D> DigestSigner<D, Signature> for SigningKey
where
D: Digest<OutputSize = U64>,
D: Digest<OutputSize = U64> + Update,
{
fn try_sign_digest(&self, msg_digest: D) -> Result<Signature, SignatureError> {
self.sign_prehashed(msg_digest, None)
fn try_sign_digest<F: Fn(&mut D) -> Result<(), SignatureError>>(
&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")]
impl<D> DigestSigner<D, Signature> for Context<'_, '_, SigningKey>
where
D: Digest<OutputSize = U64>,
D: Digest<OutputSize = U64> + Update,
{
fn try_sign_digest(&self, msg_digest: D) -> Result<Signature, SignatureError> {
self.key().sign_prehashed(msg_digest, Some(self.value()))
fn try_sign_digest<F: Fn(&mut D) -> Result<(), SignatureError>>(
&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")]
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<ed25519::Signature> for VerifyingKey {
#[cfg(feature = "digest")]
impl<MsgDigest> DigestVerifier<MsgDigest, ed25519::Signature> for VerifyingKey
where
MsgDigest: Digest<OutputSize = U64>,
MsgDigest: Digest<OutputSize = U64> + Update,
{
fn verify_digest(
fn verify_digest<F: Fn(&mut MsgDigest) -> 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<MsgDigest> DigestVerifier<MsgDigest, ed25519::Signature> for Context<'_, '_, VerifyingKey>
where
MsgDigest: Digest<OutputSize = U64>,
MsgDigest: Digest<OutputSize = U64> + Update,
{
fn verify_digest(
fn verify_digest<F: Fn(&mut MsgDigest) -> 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)
}
}