diff --git a/signature-crate/src/digest/digestable.rs b/signature-crate/src/digest/digestable.rs new file mode 100644 index 00000000..0eff397e --- /dev/null +++ b/signature-crate/src/digest/digestable.rs @@ -0,0 +1,40 @@ +use crate::{ + digest::{self, Digest}, + error::Error, + signature::Signature, + signer::Signer, + verifier::Verifier, +}; + +/// Marker trait for `Signature` types computable as `S(H(m))` where: +/// +/// - `S`: signature algorithm +/// - `H`: hash (a.k.a. digest) function +/// - `m`: message +/// +/// For signature types that implement this trait, a blanket impl of +/// `Signer` will be provided for all types that `impl digest::Signer`. +pub trait Digestable: Signature { + /// Preferred `Digest` algorithm to use when computing this signature type. + type Digest: Digest; +} + +impl Signer for T +where + S: Digestable + Signature, + T: digest::Signer, +{ + fn sign(&self, msg: &[u8]) -> Result { + self.sign_digest(S::Digest::digest(msg)) + } +} + +impl Verifier for T +where + S: Digestable + Signature, + T: digest::Verifier, +{ + fn verify(&self, msg: &[u8], signature: &S) -> Result<(), Error> { + self.verify_digest(S::Digest::digest(msg), signature) + } +} diff --git a/signature-crate/src/digest/mod.rs b/signature-crate/src/digest/mod.rs index 406623be..3973d610 100644 --- a/signature-crate/src/digest/mod.rs +++ b/signature-crate/src/digest/mod.rs @@ -1,6 +1,7 @@ //! Support for using hash functions that impl the `Digest` trait in order //! to hash the input message in order to compute a signature. +mod digestable; mod signer; mod verifier; @@ -8,4 +9,4 @@ mod verifier; /// trait this module depends on. pub use ::digest::Digest; -pub use self::{signer::Signer, verifier::Verifier}; +pub use self::{digestable::Digestable, signer::Signer, verifier::Verifier}; diff --git a/signature-crate/src/digest/signer.rs b/signature-crate/src/digest/signer.rs index 008493f9..65043b0a 100644 --- a/signature-crate/src/digest/signer.rs +++ b/signature-crate/src/digest/signer.rs @@ -4,7 +4,9 @@ //! For use signature algorithms that support an Initialize-Update-Finalize //! (IUF) API, such as ECDSA or Ed25519ph. -use crate::{digest::Digest, error::Error, Signature}; +use super::Digest; +use crate::{error::Error, signature::Signature}; +use digest::generic_array::GenericArray; /// Sign the given prehashed message `Digest` using `Self`. pub trait Signer @@ -13,5 +15,5 @@ where S: Signature, { /// Sign the given prehashed message `Digest`, returning a signature. - fn sign(&self, digest: D) -> Result; + fn sign_digest(&self, digest: GenericArray) -> Result; } diff --git a/signature-crate/src/digest/verifier.rs b/signature-crate/src/digest/verifier.rs index 865b422b..72d5f017 100644 --- a/signature-crate/src/digest/verifier.rs +++ b/signature-crate/src/digest/verifier.rs @@ -4,7 +4,9 @@ //! For use signature algorithms that support an Initialize-Update-Finalize //! (IUF) API, such as ECDSA or Ed25519ph. -use crate::{digest::Digest, error::Error, Signature}; +use super::Digest; +use crate::{error::Error, signature::Signature}; +use digest::generic_array::GenericArray; /// Verify the provided signature for the given prehashed message `Digest` /// is authentic. @@ -14,5 +16,9 @@ where S: Signature, { /// Verify the signature against the given `Digest` - fn verify(&self, digest: D, signature: &S) -> Result<(), Error>; + fn verify_digest( + &self, + digest: GenericArray, + signature: &S, + ) -> Result<(), Error>; } diff --git a/signature-crate/src/lib.rs b/signature-crate/src/lib.rs index 03c3e8e6..688258fd 100644 --- a/signature-crate/src/lib.rs +++ b/signature-crate/src/lib.rs @@ -19,11 +19,14 @@ extern crate std; #[cfg(feature = "digest")] -mod digest; +pub mod digest; mod error; mod prelude; mod signature; -pub mod signer; -pub mod verifier; +mod signer; +mod verifier; pub use crate::{error::Error, signature::Signature, signer::Signer, verifier::Verifier}; + +#[cfg(feature = "digest")] +pub use crate::digest::Digestable;