1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
pub use cipher::{BlockCipher, NewBlockCipher};
use cipher::{
consts::{U16, U24, U32, U8},
generic_array::GenericArray,
};
use crate::{
fixslice::{self, FixsliceKeys128, FixsliceKeys192, FixsliceKeys256, FIXSLICE_BLOCKS},
Block, ParBlocks,
};
macro_rules! define_aes_impl {
(
$name:ident,
$key_size:ty,
$fixslice_keys:ty,
$fixslice_key_schedule:path,
$fixslice_decrypt:path,
$fixslice_encrypt:path,
$doc:expr
) => {
#[doc=$doc]
#[derive(Clone)]
pub struct $name {
keys: $fixslice_keys,
}
impl NewBlockCipher for $name {
type KeySize = $key_size;
#[inline]
fn new(key: &GenericArray<u8, $key_size>) -> Self {
Self { keys: $fixslice_key_schedule(key) }
}
}
impl BlockCipher for $name {
type BlockSize = U16;
type ParBlocks = U8;
#[inline]
fn encrypt_block(&self, block: &mut Block) {
let mut blocks = [Block::default(); FIXSLICE_BLOCKS];
blocks[0].copy_from_slice(block);
$fixslice_encrypt(&self.keys, &mut blocks);
block.copy_from_slice(&blocks[0]);
}
#[inline]
fn decrypt_block(&self, block: &mut Block) {
let mut blocks = [Block::default(); FIXSLICE_BLOCKS];
blocks[0].copy_from_slice(block);
$fixslice_decrypt(&self.keys, &mut blocks);
block.copy_from_slice(&blocks[0]);
}
#[inline]
fn encrypt_blocks(&self, blocks: &mut ParBlocks) {
for chunk in blocks.chunks_mut(FIXSLICE_BLOCKS) {
$fixslice_encrypt(&self.keys, chunk);
}
}
#[inline]
fn decrypt_blocks(&self, blocks: &mut ParBlocks) {
for chunk in blocks.chunks_mut(FIXSLICE_BLOCKS) {
$fixslice_decrypt(&self.keys, chunk);
}
}
}
opaque_debug::implement!($name);
}
}
define_aes_impl!(
Aes128,
U16,
FixsliceKeys128,
fixslice::aes128_key_schedule,
fixslice::aes128_decrypt,
fixslice::aes128_encrypt,
"AES-128 block cipher instance"
);
define_aes_impl!(
Aes192,
U24,
FixsliceKeys192,
fixslice::aes192_key_schedule,
fixslice::aes192_decrypt,
fixslice::aes192_encrypt,
"AES-192 block cipher instance"
);
define_aes_impl!(
Aes256,
U32,
FixsliceKeys256,
fixslice::aes256_key_schedule,
fixslice::aes256_decrypt,
fixslice::aes256_encrypt,
"AES-256 block cipher instance"
);