#[cfg(feature = "alloc")]
use alloc::{vec, vec::Vec};
use crate::traits::VerificationError;
pub trait TrySigner {
type Signature;
type Error;
#[must_use = "signature creation failure must be checked"]
fn try_sign(&self, message: &[u8]) -> Result<Self::Signature, Self::Error>;
}
pub trait Verifier<Sig: ?Sized> {
#[must_use = "signature verification must be checked; a dropped Result silently accepts a forged signature"]
fn verify(&self, message: &[u8], signature: &Sig) -> Result<(), VerificationError>;
}
pub trait TrySignerInto {
type Error;
#[must_use]
fn signature_len(&self) -> usize;
#[must_use = "signature creation failure must be checked"]
fn try_sign_into(&self, message: &[u8], out: &mut [u8]) -> Result<(), Self::Error>;
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
#[inline]
fn try_sign_to_vec(&self, message: &[u8]) -> Result<Vec<u8>, Self::Error> {
let mut out = vec![0u8; self.signature_len()];
match self.try_sign_into(message, &mut out) {
Ok(()) => Ok(out),
Err(err) => {
super::ct::zeroize(&mut out);
Err(err)
}
}
}
}