1#![deny(unsafe_code)]
2use crate::Block;
3use cipher::{
4 BlockCipherDecBackend, BlockCipherEncBackend, BlockSizeUser, ParBlocks, ParBlocksSizeUser,
5 consts::U16, inout::InOut,
6};
7
8#[path = "fixslice/mod.rs"]
9pub(crate) mod fixslice;
10
11#[cfg(feature = "hazmat")]
12pub(crate) use fixslice::hazmat;
13
14use fixslice::{BatchBlocks, NativeBatchSize, NativeWord};
15
16macro_rules! impl_backend {
17 (
18 name = $name:tt,
19 key_size = $key_size:literal,
20 module = $module:ident,
21 doc = $doc:expr,
22 ) => {
23 #[doc=$doc]
24 #[doc = "block cipher"]
25 #[derive(Clone, Copy)]
26 pub(crate) struct $name {
27 keys: fixslice::$module::RoundKeys<NativeWord>,
28 }
29
30 impl $name {
31 #[inline]
32 pub(crate) fn new(key: &[u8; $key_size]) -> Self {
33 let keys = fixslice::$module::key_schedule(key);
34 Self { keys }
35 }
36 }
37
38 impl BlockSizeUser for $name {
39 type BlockSize = U16;
40 }
41
42 impl ParBlocksSizeUser for $name {
43 type ParBlocksSize = NativeBatchSize;
44 }
45
46 impl BlockCipherEncBackend for $name {
47 #[inline(always)]
48 fn encrypt_block(&self, mut block: InOut<'_, '_, Block>) {
49 let mut blocks = BatchBlocks::<NativeWord>::default();
50 blocks[0] = block.clone_in().into();
51 let res = fixslice::$module::encrypt(&self.keys, &blocks);
52 *block.get_out() = res[0].into();
53 }
54
55 #[inline(always)]
56 fn encrypt_par_blocks(&self, mut blocks: InOut<'_, '_, ParBlocks<Self>>) {
57 let res = fixslice::$module::encrypt(&self.keys, blocks.get_in());
58 *blocks.get_out() = res;
59 }
60 }
61
62 impl BlockCipherDecBackend for $name {
63 #[inline(always)]
64 fn decrypt_block(&self, mut block: InOut<'_, '_, Block>) {
65 let mut blocks = BatchBlocks::<NativeWord>::default();
66 blocks[0] = block.clone_in();
67 let res = fixslice::$module::decrypt(&self.keys, &blocks);
68 *block.get_out() = res[0];
69 }
70
71 #[inline(always)]
72 fn decrypt_par_blocks(&self, mut blocks: InOut<'_, '_, ParBlocks<Self>>) {
73 let res = fixslice::$module::decrypt(&self.keys, blocks.get_in());
74 *blocks.get_out() = res;
75 }
76 }
77 };
78}
79
80impl_backend!(
81 name = Aes128,
82 key_size = 16,
83 module = aes128,
84 doc = "AES-128",
85);
86impl_backend!(
87 name = Aes192,
88 key_size = 24,
89 module = aes192,
90 doc = "AES-192",
91);
92impl_backend!(
93 name = Aes256,
94 key_size = 32,
95 module = aes256,
96 doc = "AES-256",
97);