71 lines
2.8 KiB
Rust
71 lines
2.8 KiB
Rust
//! 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<S> {
|
|
/// 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<S, Error>;
|
|
}
|
|
|
|
/// Sign the provided message prehash using the provided external randomness source, returning a digital signature.
|
|
#[cfg(feature = "rand_core")]
|
|
pub trait RandomizedPrehashSigner<S> {
|
|
/// 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<S, Error>;
|
|
}
|
|
|
|
/// Verify the provided message prehash using `Self` (e.g. a public key)
|
|
pub trait PrehashVerifier<S> {
|
|
/// 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>;
|
|
}
|