use crate::error::Error;
#[cfg(feature = "digest")]
use crate::digest::Update;
#[cfg(feature = "rand_core")]
use crate::rand_core::{CryptoRng, TryCryptoRng};
pub trait Signer<S> {
fn sign(&self, msg: &[u8]) -> S {
self.try_sign(msg).expect("signature operation failed")
}
fn try_sign(&self, msg: &[u8]) -> Result<S, Error>;
}
pub trait MultipartSigner<S> {
fn multipart_sign(&self, msg: &[&[u8]]) -> S {
self.try_multipart_sign(msg)
.expect("signature operation failed")
}
fn try_multipart_sign(&self, msg: &[&[u8]]) -> Result<S, Error>;
}
pub trait SignerMut<S> {
fn sign(&mut self, msg: &[u8]) -> S {
self.try_sign(msg).expect("signature operation failed")
}
fn try_sign(&mut self, msg: &[u8]) -> Result<S, Error>;
}
#[cfg(feature = "digest")]
pub trait DigestSigner<D: Update, S> {
fn sign_digest<F: Fn(&mut D)>(&self, f: F) -> S {
self.try_sign_digest(|digest| {
f(digest);
Ok(())
})
.expect("signature operation failed")
}
fn try_sign_digest<F: Fn(&mut D) -> Result<(), Error>>(&self, f: F) -> Result<S, Error>;
}
#[cfg(feature = "rand_core")]
pub trait RandomizedSigner<S> {
fn sign_with_rng<R: CryptoRng + ?Sized>(&self, rng: &mut R, msg: &[u8]) -> S {
self.try_sign_with_rng(rng, msg)
.expect("signature operation failed")
}
fn try_sign_with_rng<R: TryCryptoRng + ?Sized>(
&self,
rng: &mut R,
msg: &[u8],
) -> Result<S, Error>;
}
#[cfg(feature = "rand_core")]
pub trait RandomizedMultipartSigner<S> {
fn multipart_sign_with_rng<R: CryptoRng + ?Sized>(&self, rng: &mut R, msg: &[&[u8]]) -> S {
self.try_multipart_sign_with_rng(rng, msg)
.expect("signature operation failed")
}
fn try_multipart_sign_with_rng<R: TryCryptoRng + ?Sized>(
&self,
rng: &mut R,
msg: &[&[u8]],
) -> Result<S, Error>;
}
#[cfg(all(feature = "digest", feature = "rand_core"))]
pub trait RandomizedDigestSigner<D: Update, S> {
fn sign_digest_with_rng<R: CryptoRng + ?Sized, F: Fn(&mut D)>(&self, rng: &mut R, f: F) -> S {
self.try_sign_digest_with_rng(rng, |digest| {
f(digest);
Ok(())
})
.expect("signature operation failed")
}
fn try_sign_digest_with_rng<R: TryCryptoRng + ?Sized, F: Fn(&mut D) -> Result<(), Error>>(
&self,
rng: &mut R,
f: F,
) -> Result<S, Error>;
}
#[cfg(feature = "rand_core")]
pub trait RandomizedSignerMut<S> {
fn sign_with_rng<R: CryptoRng + ?Sized>(&mut self, rng: &mut R, msg: &[u8]) -> S {
self.try_sign_with_rng(rng, msg)
.expect("signature operation failed")
}
fn try_sign_with_rng<R: TryCryptoRng + ?Sized>(
&mut self,
rng: &mut R,
msg: &[u8],
) -> Result<S, Error>;
}
#[cfg(feature = "rand_core")]
pub trait RandomizedMultipartSignerMut<S> {
fn multipart_sign_with_rng<R: CryptoRng + ?Sized>(&mut self, rng: &mut R, msg: &[&[u8]]) -> S {
self.try_multipart_sign_with_rng(rng, msg)
.expect("signature operation failed")
}
fn try_multipart_sign_with_rng<R: TryCryptoRng + ?Sized>(
&mut self,
rng: &mut R,
msg: &[&[u8]],
) -> Result<S, Error>;
}
#[cfg(feature = "rand_core")]
impl<S, T: RandomizedSigner<S>> RandomizedSignerMut<S> for T {
fn try_sign_with_rng<R: TryCryptoRng + ?Sized>(
&mut self,
rng: &mut R,
msg: &[u8],
) -> Result<S, Error> {
T::try_sign_with_rng(self, rng, msg)
}
}
pub trait AsyncSigner<S> {
async fn sign_async(&self, msg: &[u8]) -> Result<S, Error>;
}
impl<S, T> AsyncSigner<S> for T
where
T: Signer<S>,
{
async fn sign_async(&self, msg: &[u8]) -> Result<S, Error> {
self.try_sign(msg)
}
}
#[cfg(feature = "digest")]
pub trait AsyncDigestSigner<D, S>
where
D: Update,
{
async fn sign_digest_async<F: AsyncFn(&mut D) -> Result<(), Error>>(
&self,
f: F,
) -> Result<S, Error>;
}
#[cfg(feature = "rand_core")]
pub trait AsyncRandomizedSigner<S> {
async fn sign_with_rng_async<R: CryptoRng + ?Sized>(&self, rng: &mut R, msg: &[u8]) -> S {
self.try_sign_with_rng_async(rng, msg)
.await
.expect("signature operation failed")
}
async fn try_sign_with_rng_async<R: TryCryptoRng + ?Sized>(
&self,
rng: &mut R,
msg: &[u8],
) -> Result<S, Error>;
}
#[cfg(feature = "rand_core")]
impl<S, T> AsyncRandomizedSigner<S> for T
where
T: RandomizedSigner<S>,
{
async fn try_sign_with_rng_async<R: TryCryptoRng + ?Sized>(
&self,
rng: &mut R,
msg: &[u8],
) -> Result<S, Error> {
self.try_sign_with_rng(rng, msg)
}
}