use crate::{
types::{Decrypted, Verified},
Error,
};
pub trait CryptoProvider {
fn encrypt(&self, data: &[u8]) -> Result<Vec<u8>, Error>;
fn decrypt(&self, data: &[u8]) -> Result<Vec<u8>, Error>;
}
pub trait SecretProvider {
fn hash_secret(&self, data: &[u8]) -> Result<Vec<u8>, Error>;
}
pub trait DigestProvider {
fn digest(&self, data: &[u8]) -> Result<Vec<u8>, Error>;
}
pub trait SignProvider {
fn sign(&self, data: &[u8]) -> Result<Vec<u8>, Error>;
fn verify_signature(&self, data: &[u8]) -> Result<Vec<u8>, Error>;
}
pub trait MacProvider {
fn tag(&self, data: &[u8]) -> Result<Vec<u8>, Error>;
fn verify_mac(&self, data: &[u8]) -> Result<Vec<u8>, Error>;
}
pub trait Lockable<P> {
type Output;
fn lock(self, provider: &P) -> Result<Self::Output, Error>;
}
impl<P, T> Lockable<P> for Vec<T>
where
T: Lockable<P>,
{
type Output = Vec<T::Output>;
#[inline]
fn lock(self, provider: &P) -> Result<Self::Output, Error> {
self.into_iter().map(|m| m.lock(provider)).collect()
}
}
pub trait Unlockable<P> {
type Output;
fn unlock(self, provider: &P) -> Result<Self::Output, Error>;
}
impl<P, T> Unlockable<P> for Vec<T>
where
T: Unlockable<P>,
{
type Output = Vec<T::Output>;
#[inline]
fn unlock(self, provider: &P) -> Result<Self::Output, Error> {
self.into_iter().map(|m| m.unlock(provider)).collect()
}
}
pub trait ToBytes {
fn to_bytes(&self) -> Result<Vec<u8>, Error>;
}
impl ToBytes for String {
fn to_bytes(&self) -> Result<Vec<u8>, Error> {
Ok(self.as_bytes().to_vec())
}
}
impl ToBytes for Vec<u8> {
fn to_bytes(&self) -> Result<Vec<u8>, Error> {
Ok(self.to_owned())
}
}
impl<T> ToBytes for Decrypted<T>
where
T: ToBytes,
{
fn to_bytes(&self) -> Result<Vec<u8>, Error> {
(**self).to_bytes()
}
}
impl<T> ToBytes for Verified<T>
where
T: ToBytes,
{
fn to_bytes(&self) -> Result<Vec<u8>, Error> {
(**self).to_bytes()
}
}
pub trait FromBytes: Sized {
fn from_bytes(bytes: &[u8]) -> Result<Self, Error>;
}
impl FromBytes for String {
fn from_bytes(bytes: &[u8]) -> Result<Self, Error> {
Ok(String::from_utf8(bytes.to_vec())?)
}
}
impl FromBytes for Vec<u8> {
fn from_bytes(bytes: &[u8]) -> Result<Self, Error> {
Ok(bytes.to_owned())
}
}