diff --git a/signature-crate/src/lib.rs b/signature-crate/src/lib.rs index 14d15ddf..2354231b 100644 --- a/signature-crate/src/lib.rs +++ b/signature-crate/src/lib.rs @@ -27,4 +27,4 @@ pub mod sign; mod signature; pub mod verify; -pub use crate::{error::Error, sign::Sign, signature::Signature, verify::Verify}; +pub use crate::{error::Error, sign::*, signature::*, verify::*}; diff --git a/signature-crate/src/sign/digest.rs b/signature-crate/src/sign/digest.rs index e4f21c2b..005ec5ea 100644 --- a/signature-crate/src/sign/digest.rs +++ b/signature-crate/src/sign/digest.rs @@ -4,7 +4,8 @@ //! For use signature algorithms that support an Initialize-Update-Finalize //! (IUF) API, such as ECDSA or Ed25519ph. -use crate::{error::Error, Signature}; +use super::Sign; +use crate::{Error, Signature}; use digest::Digest; /// Sign the given prehashed message `Digest` using `Self`. @@ -14,5 +15,22 @@ where S: Signature, { /// Sign the given prehashed message `Digest`, returning a signature. - fn sign(&self, digest: D) -> Result; + fn sign_digest(&self, digest: D) -> Result; +} + +/// Marker trait for digest verifiers who wish to use a blanket impl of the +/// `Sign` trait which works with any type that implements `SignDigest` +pub trait UseDigestToSign { + /// Digest type to use when computing a signature + type Digest: Digest; +} + +impl Sign for T +where + S: Signature, + T: UseDigestToSign + SignDigest<::Digest, S>, +{ + fn sign(&self, msg: &[u8]) -> Result { + self.sign_digest(::Digest::new().chain(msg)) + } } diff --git a/signature-crate/src/sign/mod.rs b/signature-crate/src/sign/mod.rs index 1acc7c84..2ec1d44a 100644 --- a/signature-crate/src/sign/mod.rs +++ b/signature-crate/src/sign/mod.rs @@ -1,7 +1,7 @@ //! Traits for generating digital signatures #[cfg(feature = "digest")] -pub(crate) mod digest; +mod digest; #[cfg(feature = "digest")] pub use self::digest::SignDigest; diff --git a/signature-crate/src/verify/digest.rs b/signature-crate/src/verify/digest.rs index c577e700..a940a77f 100644 --- a/signature-crate/src/verify/digest.rs +++ b/signature-crate/src/verify/digest.rs @@ -4,7 +4,8 @@ //! For use signature algorithms that support an Initialize-Update-Finalize //! (IUF) API, such as ECDSA or Ed25519ph. -use crate::{error::Error, Signature}; +use super::Verify; +use crate::{Error, Signature}; use digest::Digest; /// Verify the provided signature for the given prehashed message `Digest` @@ -15,5 +16,25 @@ where S: Signature, { /// Verify the signature against the given `Digest` - fn verify(&self, digest: D, signature: &S) -> Result<(), Error>; + fn verify_digest(&self, digest: D, signature: &S) -> Result<(), Error>; +} + +/// Marker trait for digest verifiers who wish to use a blanket impl of the +/// `Verify` trait which works with any type that implements `VerifyDigest` +pub trait UseDigestToVerify { + /// Digest type to use when verifying a signature + type Digest: Digest; +} + +impl Verify for T +where + S: Signature, + T: UseDigestToVerify + VerifyDigest<::Digest, S>, +{ + fn verify(&self, msg: &[u8], signature: &S) -> Result<(), Error> { + self.verify_digest( + ::Digest::new().chain(msg), + signature, + ) + } } diff --git a/signature-crate/src/verify/mod.rs b/signature-crate/src/verify/mod.rs index d8c4b0e2..a6902cd5 100644 --- a/signature-crate/src/verify/mod.rs +++ b/signature-crate/src/verify/mod.rs @@ -1,7 +1,7 @@ //! Trait for verifying digital signatures #[cfg(feature = "digest")] -pub(crate) mod digest; +mod digest; #[cfg(feature = "digest")] pub use self::digest::VerifyDigest;