use common::{
Block, BlockSizeUser,
array::{Array, ArraySize},
};
use inout::InOut;
mod ctx;
mod zero;
pub use zero::ZeroTweak;
pub type Tweak<C> = Array<u8, <C as TweakSizeUser>::TweakSize>;
pub trait TweakSizeUser {
type TweakSize: ArraySize;
}
pub trait TweakBlockCipherEncrypt: BlockSizeUser + TweakSizeUser + Sized {
fn encrypt_with_backend(
&self,
f: impl TweakBlockCipherEncClosure<BlockSize = Self::BlockSize, TweakSize = Self::TweakSize>,
);
#[inline]
fn encrypt_block_inout(&self, tweak: &Tweak<Self>, block: InOut<'_, '_, Block<Self>>) {
self.encrypt_with_backend(ctx::BlockCtx { tweak, block });
}
#[inline]
fn encrypt_block(&self, tweak: &Tweak<Self>, block: &mut Block<Self>) {
self.encrypt_block_inout(tweak, block.into());
}
#[inline]
fn encrypt_block_b2b(
&self,
tweak: &Tweak<Self>,
in_block: &Block<Self>,
out_block: &mut Block<Self>,
) {
self.encrypt_block_inout(tweak, (in_block, out_block).into());
}
}
pub trait TweakBlockCipherDecrypt: BlockSizeUser + TweakSizeUser + Sized {
fn decrypt_with_backend(
&self,
f: impl TweakBlockCipherDecClosure<BlockSize = Self::BlockSize, TweakSize = Self::TweakSize>,
);
#[inline]
fn decrypt_block_inout(&self, tweak: &Tweak<Self>, block: InOut<'_, '_, Block<Self>>) {
self.decrypt_with_backend(ctx::BlockCtx { tweak, block });
}
#[inline]
fn decrypt_block(&self, tweak: &Tweak<Self>, block: &mut Block<Self>) {
self.decrypt_block_inout(tweak, block.into());
}
#[inline]
fn decrypt_block_b2b(
&self,
tweak: &Tweak<Self>,
in_block: &Block<Self>,
out_block: &mut Block<Self>,
) {
self.decrypt_block_inout(tweak, (in_block, out_block).into());
}
}
pub trait TweakBlockCipherEncClosure: BlockSizeUser + TweakSizeUser {
fn call<B>(self, backend: &B)
where
B: TweakBlockCipherEncBackend<BlockSize = Self::BlockSize, TweakSize = Self::TweakSize>;
}
pub trait TweakBlockCipherDecClosure: BlockSizeUser + TweakSizeUser {
fn call<B>(self, backend: &B)
where
B: TweakBlockCipherDecBackend<BlockSize = Self::BlockSize, TweakSize = Self::TweakSize>;
}
pub trait TweakBlockCipherEncBackend: BlockSizeUser + TweakSizeUser {
fn encrypt_block_inout(&self, tweak: &Tweak<Self>, block: InOut<'_, '_, Block<Self>>);
#[inline]
fn encrypt_block(&self, tweak: &Tweak<Self>, block: &mut Block<Self>) {
self.encrypt_block_inout(tweak, block.into());
}
#[inline]
fn encrypt_block_b2b(
&self,
tweak: &Tweak<Self>,
in_block: &Block<Self>,
out_block: &mut Block<Self>,
) {
self.encrypt_block_inout(tweak, (in_block, out_block).into());
}
}
pub trait TweakBlockCipherDecBackend: BlockSizeUser + TweakSizeUser {
fn decrypt_block_inout(&self, tweak: &Tweak<Self>, block: InOut<'_, '_, Block<Self>>);
#[inline]
fn decrypt_block(&self, tweak: &Tweak<Self>, block: &mut Block<Self>) {
self.decrypt_block_inout(tweak, block.into());
}
#[inline]
fn decrypt_block_b2b(
&self,
tweak: &Tweak<Self>,
in_block: &Block<Self>,
out_block: &mut Block<Self>,
) {
self.decrypt_block_inout(tweak, (in_block, out_block).into());
}
}