1use common::{Block, BlockSizeUser, array::ArraySize};
2use inout::InOut;
3
4use super::{
5 Tweak, TweakBlockCipherDecBackend, TweakBlockCipherDecClosure, TweakBlockCipherEncBackend,
6 TweakBlockCipherEncClosure, TweakSizeUser,
7};
8
9pub(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}