1use common::{Block, BlockSizeUser, array::ArraySize, typenum::Unsigned};
2use inout::{InOut, InOutBuf};
3
4use super::{
5 BlockCipherDecBackend, BlockCipherDecClosure, BlockCipherEncBackend, BlockCipherEncClosure,
6 BlockModeDecBackend, BlockModeDecClosure, BlockModeEncBackend, BlockModeEncClosure,
7};
8
9pub(super) struct BlockCtx<'inp, 'out, BS: ArraySize> {
11 pub block: InOut<'inp, 'out, Block<Self>>,
12}
13
14impl<BS: ArraySize> BlockSizeUser for BlockCtx<'_, '_, BS> {
15 type BlockSize = BS;
16}
17
18impl<BS: ArraySize> BlockCipherEncClosure for BlockCtx<'_, '_, BS> {
19 #[inline(always)]
20 fn call<B: BlockCipherEncBackend<BlockSize = BS>>(self, backend: &B) {
21 backend.encrypt_block(self.block);
22 }
23}
24
25impl<BS: ArraySize> BlockCipherDecClosure for BlockCtx<'_, '_, BS> {
26 #[inline(always)]
27 fn call<B: BlockCipherDecBackend<BlockSize = BS>>(self, backend: &B) {
28 backend.decrypt_block(self.block);
29 }
30}
31
32impl<BS: ArraySize> BlockModeEncClosure for BlockCtx<'_, '_, BS> {
33 #[inline(always)]
34 fn call<B: BlockModeEncBackend<BlockSize = BS>>(self, backend: &mut B) {
35 backend.encrypt_block(self.block);
36 }
37}
38
39impl<BS: ArraySize> BlockModeDecClosure for BlockCtx<'_, '_, BS> {
40 #[inline(always)]
41 fn call<B: BlockModeDecBackend<BlockSize = BS>>(self, backend: &mut B) {
42 backend.decrypt_block(self.block);
43 }
44}
45pub(super) struct BlocksCtx<'inp, 'out, BS: ArraySize> {
47 pub blocks: InOutBuf<'inp, 'out, Block<Self>>,
48}
49
50impl<BS: ArraySize> BlockSizeUser for BlocksCtx<'_, '_, BS> {
51 type BlockSize = BS;
52}
53
54impl<BS: ArraySize> BlockCipherEncClosure for BlocksCtx<'_, '_, BS> {
55 #[inline(always)]
56 fn call<B: BlockCipherEncBackend<BlockSize = BS>>(self, backend: &B) {
57 if B::ParBlocksSize::USIZE > 1 {
58 let (chunks, tail) = self.blocks.into_chunks();
59 for chunk in chunks {
60 backend.encrypt_par_blocks(chunk);
61 }
62 backend.encrypt_tail_blocks(tail);
63 } else {
64 for block in self.blocks {
65 backend.encrypt_block(block);
66 }
67 }
68 }
69}
70
71impl<BS: ArraySize> BlockCipherDecClosure for BlocksCtx<'_, '_, BS> {
72 #[inline(always)]
73 fn call<B: BlockCipherDecBackend<BlockSize = BS>>(self, backend: &B) {
74 if B::ParBlocksSize::USIZE > 1 {
75 let (chunks, tail) = self.blocks.into_chunks();
76 for chunk in chunks {
77 backend.decrypt_par_blocks(chunk);
78 }
79 backend.decrypt_tail_blocks(tail);
80 } else {
81 for block in self.blocks {
82 backend.decrypt_block(block);
83 }
84 }
85 }
86}
87
88impl<BS: ArraySize> BlockModeEncClosure for BlocksCtx<'_, '_, BS> {
89 #[inline(always)]
90 fn call<B: BlockModeEncBackend<BlockSize = BS>>(self, backend: &mut B) {
91 if B::ParBlocksSize::USIZE > 1 {
92 let (chunks, tail) = self.blocks.into_chunks();
93 for chunk in chunks {
94 backend.encrypt_par_blocks(chunk);
95 }
96 backend.encrypt_tail_blocks(tail);
97 } else {
98 for block in self.blocks {
99 backend.encrypt_block(block);
100 }
101 }
102 }
103}
104
105impl<BS: ArraySize> BlockModeDecClosure for BlocksCtx<'_, '_, BS> {
106 #[inline(always)]
107 fn call<B: BlockModeDecBackend<BlockSize = BS>>(self, backend: &mut B) {
108 if B::ParBlocksSize::USIZE > 1 {
109 let (chunks, tail) = self.blocks.into_chunks();
110 for chunk in chunks {
111 backend.decrypt_par_blocks(chunk);
112 }
113 backend.decrypt_tail_blocks(tail);
114 } else {
115 for block in self.blocks {
116 backend.decrypt_block(block);
117 }
118 }
119 }
120}