Skip to main content

aes/backends/
soft.rs

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);