1use common::{
5 Block, BlockSizeUser,
6 array::{Array, ArraySize},
7};
8use inout::InOut;
9
10mod ctx;
11mod zero;
12
13pub use zero::ZeroTweak;
14
15pub type Tweak<C> = Array<u8, <C as TweakSizeUser>::TweakSize>;
17
18pub trait TweakSizeUser {
20 type TweakSize: ArraySize;
22}
23
24pub trait TweakBlockCipherEncrypt: BlockSizeUser + TweakSizeUser + Sized {
26 fn encrypt_with_backend(
28 &self,
29 f: impl TweakBlockCipherEncClosure<BlockSize = Self::BlockSize, TweakSize = Self::TweakSize>,
30 );
31
32 #[inline]
34 fn encrypt_block_inout(&self, tweak: &Tweak<Self>, block: InOut<'_, '_, Block<Self>>) {
35 self.encrypt_with_backend(ctx::BlockCtx { tweak, block });
36 }
37
38 #[inline]
40 fn encrypt_block(&self, tweak: &Tweak<Self>, block: &mut Block<Self>) {
41 self.encrypt_block_inout(tweak, block.into());
42 }
43
44 #[inline]
46 fn encrypt_block_b2b(
47 &self,
48 tweak: &Tweak<Self>,
49 in_block: &Block<Self>,
50 out_block: &mut Block<Self>,
51 ) {
52 self.encrypt_block_inout(tweak, (in_block, out_block).into());
53 }
54}
55
56pub trait TweakBlockCipherDecrypt: BlockSizeUser + TweakSizeUser + Sized {
58 fn decrypt_with_backend(
60 &self,
61 f: impl TweakBlockCipherDecClosure<BlockSize = Self::BlockSize, TweakSize = Self::TweakSize>,
62 );
63
64 #[inline]
66 fn decrypt_block_inout(&self, tweak: &Tweak<Self>, block: InOut<'_, '_, Block<Self>>) {
67 self.decrypt_with_backend(ctx::BlockCtx { tweak, block });
68 }
69
70 #[inline]
72 fn decrypt_block(&self, tweak: &Tweak<Self>, block: &mut Block<Self>) {
73 self.decrypt_block_inout(tweak, block.into());
74 }
75
76 #[inline]
78 fn decrypt_block_b2b(
79 &self,
80 tweak: &Tweak<Self>,
81 in_block: &Block<Self>,
82 out_block: &mut Block<Self>,
83 ) {
84 self.decrypt_block_inout(tweak, (in_block, out_block).into());
85 }
86}
87
88pub trait TweakBlockCipherEncClosure: BlockSizeUser + TweakSizeUser {
92 fn call<B>(self, backend: &B)
94 where
95 B: TweakBlockCipherEncBackend<BlockSize = Self::BlockSize, TweakSize = Self::TweakSize>;
96}
97
98pub trait TweakBlockCipherDecClosure: BlockSizeUser + TweakSizeUser {
102 fn call<B>(self, backend: &B)
104 where
105 B: TweakBlockCipherDecBackend<BlockSize = Self::BlockSize, TweakSize = Self::TweakSize>;
106}
107
108pub trait TweakBlockCipherEncBackend: BlockSizeUser + TweakSizeUser {
110 fn encrypt_block_inout(&self, tweak: &Tweak<Self>, block: InOut<'_, '_, Block<Self>>);
112
113 #[inline]
115 fn encrypt_block(&self, tweak: &Tweak<Self>, block: &mut Block<Self>) {
116 self.encrypt_block_inout(tweak, block.into());
117 }
118
119 #[inline]
121 fn encrypt_block_b2b(
122 &self,
123 tweak: &Tweak<Self>,
124 in_block: &Block<Self>,
125 out_block: &mut Block<Self>,
126 ) {
127 self.encrypt_block_inout(tweak, (in_block, out_block).into());
128 }
129}
130
131pub trait TweakBlockCipherDecBackend: BlockSizeUser + TweakSizeUser {
133 fn decrypt_block_inout(&self, tweak: &Tweak<Self>, block: InOut<'_, '_, Block<Self>>);
135
136 #[inline]
138 fn decrypt_block(&self, tweak: &Tweak<Self>, block: &mut Block<Self>) {
139 self.decrypt_block_inout(tweak, block.into());
140 }
141
142 #[inline]
144 fn decrypt_block_b2b(
145 &self,
146 tweak: &Tweak<Self>,
147 in_block: &Block<Self>,
148 out_block: &mut Block<Self>,
149 ) {
150 self.decrypt_block_inout(tweak, (in_block, out_block).into());
151 }
152}