use std::borrow::Cow;
use crate::{
Result,
crypto::{
mem::Protected,
symmetric::{BlockCipherMode, Context},
SymmetricAlgorithm,
},
};
pub trait Symmetric {
fn supports_algo(algo: SymmetricAlgorithm) -> bool;
fn encryptor(algo: SymmetricAlgorithm, mode: BlockCipherMode,
key: &Protected, iv: Option<&[u8]>)
-> Result<Box<dyn Context>>
{
const ZERO: [u8; 16] = [0; 16];
let block_size = algo.block_size()?;
let iv = iv.map(Cow::from).unwrap_or_else(|| {
if block_size <= ZERO.len() {
Cow::Borrowed(&ZERO[..block_size])
} else {
Cow::Owned(vec![0; block_size])
}
});
Self::encryptor_impl(algo, mode, key, iv)
}
fn encryptor_impl(algo: SymmetricAlgorithm, mode: BlockCipherMode,
key: &Protected, iv: Cow<'_, [u8]>)
-> Result<Box<dyn Context>>;
fn decryptor(algo: SymmetricAlgorithm, mode: BlockCipherMode,
key: &Protected, iv: Option<&[u8]>)
-> Result<Box<dyn Context>>
{
const ZERO: [u8; 16] = [0; 16];
let block_size = algo.block_size()?;
let iv = iv.map(Cow::from).unwrap_or_else(|| {
if block_size <= ZERO.len() {
Cow::Borrowed(&ZERO[..block_size])
} else {
Cow::Owned(vec![0; block_size])
}
});
Self::decryptor_impl(algo, mode, key, iv)
}
fn decryptor_impl(algo: SymmetricAlgorithm, mode: BlockCipherMode,
key: &Protected, iv: Cow<'_, [u8]>)
-> Result<Box<dyn Context>>;
}