Skip to main content

cipher/tweak/
zero.rs

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/// Wrapper around tweakable block cipher which implements
16/// the [common block cipher traits][crate::block] using zero tweak.
17#[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
44/// Wrapper around non-tweakble block cipher closures which implements the tweakable
45/// block cipher closure traits using zero tweak.
46struct 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
85/// Wrapper around tweakable block cipher backend which implements non-tweakable
86/// block cipher backend traits using zero tweak.
87struct 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}