//! Hazardous Materials: low-level APIs which can be insecure if misused. //! //! The traits in this module are not generally recommended, and should only be //! used in special cases where they are specifically needed. //! //! Using them incorrectly can introduce security vulnerabilities. Please //! carefully read the documentation before attempting to use them. use crate::Error; #[cfg(feature = "rand_core")] use crate::rand_core::CryptoRngCore; /// Sign the provided message prehash, returning a digital signature. pub trait PrehashSigner { /// Attempt to sign the given message digest, returning a digital signature /// on success, or an error if something went wrong. /// /// The `prehash` parameter should be the output of a secure cryptographic /// hash function. /// /// This API takes a `prehash` byte slice as there can potentially be many /// compatible lengths for the message digest for a given concrete signature /// algorithm. /// /// Allowed lengths are algorithm-dependent and up to a particular /// implementation to decide. fn sign_prehash(&self, prehash: &[u8]) -> Result; } /// Sign the provided message prehash using the provided external randomness source, returning a digital signature. #[cfg(feature = "rand_core")] pub trait RandomizedPrehashSigner { /// Attempt to sign the given message digest, returning a digital signature /// on success, or an error if something went wrong. /// /// The `prehash` parameter should be the output of a secure cryptographic /// hash function. /// /// This API takes a `prehash` byte slice as there can potentially be many /// compatible lengths for the message digest for a given concrete signature /// algorithm. /// /// Allowed lengths are algorithm-dependent and up to a particular /// implementation to decide. fn sign_prehash_with_rng( &self, rng: &mut impl CryptoRngCore, prehash: &[u8], ) -> Result; } /// Verify the provided message prehash using `Self` (e.g. a public key) pub trait PrehashVerifier { /// Use `Self` to verify that the provided signature for a given message /// `prehash` is authentic. /// /// The `prehash` parameter should be the output of a secure cryptographic /// hash function. /// /// Returns `Error` if it is inauthentic or some other error occurred, or /// otherwise returns `Ok(())`. /// /// # ⚠️ Security Warning /// /// If `prehash` is something other than the output of a cryptographically /// secure hash function, an attacker can potentially forge signatures by /// solving a system of linear equations. fn verify_prehash(&self, prehash: &[u8], signature: &S) -> Result<(), Error>; }