Skip to main content

cipher/tweak/
ctx.rs

1use common::{Block, BlockSizeUser, array::ArraySize};
2use inout::InOut;
3
4use super::{
5    Tweak, TweakBlockCipherDecBackend, TweakBlockCipherDecClosure, TweakBlockCipherEncBackend,
6    TweakBlockCipherEncClosure, TweakSizeUser,
7};
8
9/// Closure used in methods which operate over separate blocks.
10pub(super) struct BlockCtx<'a, TS: ArraySize, BS: ArraySize> {
11    pub tweak: &'a Tweak<Self>,
12    pub block: InOut<'a, 'a, Block<Self>>,
13}
14
15impl<TS: ArraySize, BS: ArraySize> BlockSizeUser for BlockCtx<'_, TS, BS> {
16    type BlockSize = BS;
17}
18
19impl<TS: ArraySize, BS: ArraySize> TweakSizeUser for BlockCtx<'_, TS, BS> {
20    type TweakSize = TS;
21}
22
23impl<TS: ArraySize, BS: ArraySize> TweakBlockCipherEncClosure for BlockCtx<'_, TS, BS> {
24    #[inline]
25    fn call<B>(self, backend: &B)
26    where
27        B: TweakBlockCipherEncBackend<BlockSize = BS, TweakSize = TS>,
28    {
29        backend.encrypt_block_inout(self.tweak, self.block);
30    }
31}
32
33impl<TS: ArraySize, BS: ArraySize> TweakBlockCipherDecClosure for BlockCtx<'_, TS, BS> {
34    #[inline]
35    fn call<B>(self, backend: &B)
36    where
37        B: TweakBlockCipherDecBackend<BlockSize = BS, TweakSize = TS>,
38    {
39        backend.decrypt_block_inout(self.tweak, self.block);
40    }
41}