1use core::marker::PhantomData;
2
3use common::{Block, ParBlocksSizeUser, array::ArraySize};
4
5use super::{
6 TweakBlockCipherDecBackend, TweakBlockCipherDecClosure, TweakBlockCipherDecrypt,
7 TweakBlockCipherEncBackend, TweakBlockCipherEncrypt, TweakSizeUser,
8};
9use crate::{
10 BlockCipherDecBackend, BlockCipherDecClosure, BlockCipherDecrypt, BlockCipherEncBackend,
11 BlockCipherEncClosure, BlockCipherEncrypt, BlockSizeUser, consts::U1,
12 tweak::TweakBlockCipherEncClosure,
13};
14
15#[derive(Debug, Clone)]
18pub struct ZeroTweak<C: TweakSizeUser + BlockSizeUser>(pub C);
19
20impl<C: TweakSizeUser + BlockSizeUser> BlockSizeUser for ZeroTweak<C> {
21 type BlockSize = C::BlockSize;
22}
23
24impl<C: TweakBlockCipherEncrypt> BlockCipherEncrypt for ZeroTweak<C> {
25 #[inline]
26 fn encrypt_with_backend(&self, f: impl BlockCipherEncClosure<BlockSize = Self::BlockSize>) {
27 self.0.encrypt_with_backend(ClosureWrapper {
28 f,
29 _pd: PhantomData,
30 });
31 }
32}
33
34impl<C: TweakBlockCipherDecrypt> BlockCipherDecrypt for ZeroTweak<C> {
35 #[inline]
36 fn decrypt_with_backend(&self, f: impl BlockCipherDecClosure<BlockSize = Self::BlockSize>) {
37 self.0.decrypt_with_backend(ClosureWrapper {
38 f,
39 _pd: PhantomData,
40 });
41 }
42}
43
44struct ClosureWrapper<TS: ArraySize, BS: ArraySize, F> {
47 f: F,
48 _pd: PhantomData<(TS, BS)>,
49}
50
51impl<TS: ArraySize, BS: ArraySize, F> BlockSizeUser for ClosureWrapper<TS, BS, F> {
52 type BlockSize = BS;
53}
54
55impl<TS: ArraySize, BS: ArraySize, F> TweakSizeUser for ClosureWrapper<TS, BS, F> {
56 type TweakSize = TS;
57}
58
59impl<TS: ArraySize, BS: ArraySize, F> TweakBlockCipherEncClosure for ClosureWrapper<TS, BS, F>
60where
61 F: BlockCipherEncClosure<BlockSize = BS>,
62{
63 #[inline]
64 fn call<B: TweakBlockCipherEncBackend<BlockSize = BS, TweakSize = TS>>(self, backend: &B) {
65 self.f.call(&BackendWrapper {
66 backend,
67 _pd: PhantomData,
68 });
69 }
70}
71
72impl<TS: ArraySize, BS: ArraySize, F> TweakBlockCipherDecClosure for ClosureWrapper<TS, BS, F>
73where
74 F: BlockCipherDecClosure<BlockSize = BS>,
75{
76 #[inline]
77 fn call<B: TweakBlockCipherDecBackend<BlockSize = BS, TweakSize = TS>>(self, backend: &B) {
78 self.f.call(&BackendWrapper {
79 backend,
80 _pd: PhantomData,
81 });
82 }
83}
84
85struct BackendWrapper<'a, BS: ArraySize, B> {
88 backend: &'a B,
89 _pd: PhantomData<BS>,
90}
91
92impl<BS: ArraySize, B> BlockSizeUser for BackendWrapper<'_, BS, B> {
93 type BlockSize = BS;
94}
95
96impl<BS: ArraySize, B> ParBlocksSizeUser for BackendWrapper<'_, BS, B> {
97 type ParBlocksSize = U1;
98}
99
100impl<BS: ArraySize, B> BlockCipherEncBackend for BackendWrapper<'_, BS, B>
101where
102 B: TweakBlockCipherEncBackend<BlockSize = BS>,
103{
104 #[inline]
105 fn encrypt_block(&self, block: inout::InOut<'_, '_, Block<Self>>) {
106 self.backend.encrypt_block_inout(&Default::default(), block);
107 }
108}
109
110impl<BS: ArraySize, B> BlockCipherDecBackend for BackendWrapper<'_, BS, B>
111where
112 B: TweakBlockCipherDecBackend<BlockSize = BS>,
113{
114 #[inline]
115 fn decrypt_block(&self, block: inout::InOut<'_, '_, Block<Self>>) {
116 self.backend.decrypt_block_inout(&Default::default(), block);
117 }
118}