Skip to content

Commit 586276f

Browse files
matrixheadjessebraham
authored andcommitted
aes accelerator implementation
1 parent 5f933aa commit 586276f

File tree

20 files changed

+913
-2
lines changed

20 files changed

+913
-2
lines changed

esp-hal-common/build.rs

+5
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ fn main() {
4242
// - 'uart2'
4343
// - 'usb_otg'
4444
// - 'usb_serial_jtag'
45+
// - 'aes'
4546
//
4647
// New symbols can be added as needed, but please be sure to update both this
4748
// comment and the required vectors below.
@@ -60,6 +61,7 @@ fn main() {
6061
"timg0",
6162
"timg1",
6263
"uart2",
64+
"aes",
6365
]
6466
} else if esp32c2 {
6567
vec![
@@ -83,6 +85,7 @@ fn main() {
8385
"timg0",
8486
"timg1",
8587
"usb_serial_jtag",
88+
"aes",
8689
]
8790
} else if esp32s2 {
8891
vec![
@@ -99,6 +102,7 @@ fn main() {
99102
"timg0",
100103
"timg1",
101104
"usb_otg",
105+
"aes",
102106
]
103107
} else if esp32s3 {
104108
vec![
@@ -117,6 +121,7 @@ fn main() {
117121
"uart2",
118122
"usb_otg",
119123
"usb_serial_jtag",
124+
"aes",
120125
]
121126
} else {
122127
unreachable!(); // We've already confirmed exactly one chip was selected

esp-hal-common/src/aes/esp32.rs

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
use crate::{
2+
aes::{Aes, Aes128, Aes192, Aes256, AesFlavour, Endianness, ALIGN_SIZE},
3+
system::{Peripheral as PeripheralEnable, PeripheralClockControl},
4+
};
5+
6+
impl<'d> Aes<'d> {
7+
pub(super) fn init(&mut self, peripheral_clock_control: &mut PeripheralClockControl) {
8+
peripheral_clock_control.enable(PeripheralEnable::Aes);
9+
self.write_endianness(
10+
Endianness::BigEndian,
11+
Endianness::BigEndian,
12+
Endianness::BigEndian,
13+
Endianness::BigEndian,
14+
Endianness::BigEndian,
15+
Endianness::BigEndian,
16+
);
17+
}
18+
19+
pub(super) fn write_key(&mut self, key: &[u8]) {
20+
debug_assert!(key.len() <= self.aes.key_.len() * ALIGN_SIZE);
21+
debug_assert_eq!(key.len() % ALIGN_SIZE, 0);
22+
Self::write_to_regset(key, self.aes.key_.len(), &mut self.aes.key_[0]);
23+
}
24+
25+
pub(super) fn write_block(&mut self, block: &[u8]) {
26+
debug_assert_eq!(block.len(), self.aes.text_.len() * ALIGN_SIZE);
27+
Self::write_to_regset(block, self.aes.text_.len(), &mut self.aes.text_[0]);
28+
}
29+
30+
pub(super) fn write_mode(&mut self, mode: u32) {
31+
Self::write_to_register(&mut self.aes.mode, mode);
32+
}
33+
34+
/// Configures how the state matrix would be laid out
35+
pub fn write_endianness(
36+
&mut self,
37+
input_text_word_endianess: Endianness,
38+
input_text_byte_endianess: Endianness,
39+
output_text_word_endianess: Endianness,
40+
output_text_byte_endianess: Endianness,
41+
key_word_endianess: Endianness,
42+
key_byte_endianess: Endianness,
43+
) {
44+
let mut to_write = 0_u32;
45+
to_write |= key_byte_endianess as u32;
46+
to_write |= (key_word_endianess as u32) << 1;
47+
to_write |= (input_text_byte_endianess as u32) << 2;
48+
to_write |= (input_text_word_endianess as u32) << 3;
49+
to_write |= (output_text_byte_endianess as u32) << 4;
50+
to_write |= (output_text_word_endianess as u32) << 5;
51+
Self::write_to_register(&mut self.aes.endian, to_write);
52+
}
53+
54+
pub(super) fn write_start(&mut self) {
55+
self.aes.start.write(|w| w.start().set_bit())
56+
}
57+
58+
pub(super) fn read_idle(&mut self) -> bool {
59+
self.aes.idle.read().idle().bit_is_set()
60+
}
61+
62+
pub(super) fn read_block(&self, block: &mut [u8]) {
63+
debug_assert_eq!(block.len(), self.aes.text_.len() * ALIGN_SIZE);
64+
Self::read_from_regset(block, self.aes.text_.len(), &self.aes.text_[0]);
65+
}
66+
}
67+
68+
impl AesFlavour for Aes128 {
69+
type KeyType<'b> = &'b [u8; 16];
70+
const ENCRYPT_MODE: u32 = 0;
71+
const DECRYPT_MODE: u32 = 4;
72+
}
73+
74+
impl AesFlavour for Aes192 {
75+
type KeyType<'b> = &'b [u8; 24];
76+
const ENCRYPT_MODE: u32 = 1;
77+
const DECRYPT_MODE: u32 = 5;
78+
}
79+
80+
impl AesFlavour for Aes256 {
81+
type KeyType<'b> = &'b [u8; 32];
82+
const ENCRYPT_MODE: u32 = 2;
83+
const DECRYPT_MODE: u32 = 6;
84+
}

esp-hal-common/src/aes/esp32c3.rs

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
use crate::{
2+
aes::{Aes, Aes128, Aes256, AesFlavour, ALIGN_SIZE},
3+
system::{Peripheral as PeripheralEnable, PeripheralClockControl},
4+
};
5+
6+
impl<'d> Aes<'d> {
7+
pub(super) fn init(&mut self, peripheral_clock_control: &mut PeripheralClockControl) {
8+
peripheral_clock_control.enable(PeripheralEnable::Aes);
9+
self.write_dma(false);
10+
}
11+
12+
fn write_dma(&mut self, enable_dma: bool) {
13+
match enable_dma {
14+
true => self.aes.dma_enable.write(|w| w.dma_enable().set_bit()),
15+
false => self.aes.dma_enable.write(|w| w.dma_enable().clear_bit()),
16+
}
17+
}
18+
19+
pub(super) fn write_key(&mut self, key: &[u8]) {
20+
debug_assert!(key.len() <= 8 * ALIGN_SIZE);
21+
debug_assert_eq!(key.len() % ALIGN_SIZE, 0);
22+
Self::write_to_regset(key, 8, &mut self.aes.key_0);
23+
}
24+
25+
pub(super) fn write_block(&mut self, block: &[u8]) {
26+
debug_assert_eq!(block.len(), 4 * ALIGN_SIZE);
27+
Self::write_to_regset(block, 4, &mut self.aes.text_in_0);
28+
}
29+
30+
pub(super) fn write_mode(&mut self, mode: u32) {
31+
Self::write_to_register(&mut self.aes.mode, mode);
32+
}
33+
34+
pub(super) fn write_start(&mut self) {
35+
self.aes.trigger.write(|w| w.trigger().set_bit())
36+
}
37+
38+
pub(super) fn read_idle(&mut self) -> bool {
39+
self.aes.state.read().state().bits() == 0
40+
}
41+
42+
pub(super) fn read_block(&self, block: &mut [u8]) {
43+
debug_assert_eq!(block.len(), 4 * ALIGN_SIZE);
44+
Self::read_from_regset(block, 4, &self.aes.text_out_0);
45+
}
46+
}
47+
48+
impl AesFlavour for Aes128 {
49+
type KeyType<'b> = &'b [u8; 16];
50+
const ENCRYPT_MODE: u32 = 0;
51+
const DECRYPT_MODE: u32 = 4;
52+
}
53+
54+
impl AesFlavour for Aes256 {
55+
type KeyType<'b> = &'b [u8; 32];
56+
const ENCRYPT_MODE: u32 = 2;
57+
const DECRYPT_MODE: u32 = 6;
58+
}

esp-hal-common/src/aes/esp32s2.rs

+92
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
use crate::{
2+
aes::{Aes, Aes128, Aes192, Aes256, AesFlavour, Endianness, ALIGN_SIZE},
3+
system::{Peripheral as PeripheralEnable, PeripheralClockControl},
4+
};
5+
6+
impl<'d> Aes<'d> {
7+
pub(super) fn init(&mut self, peripheral_clock_control: &mut PeripheralClockControl) {
8+
peripheral_clock_control.enable(PeripheralEnable::Aes);
9+
self.write_dma(false);
10+
self.write_endianness(
11+
Endianness::BigEndian,
12+
Endianness::BigEndian,
13+
Endianness::BigEndian,
14+
Endianness::BigEndian,
15+
Endianness::BigEndian,
16+
Endianness::BigEndian,
17+
);
18+
}
19+
20+
fn write_dma(&mut self, enable_dma: bool) {
21+
match enable_dma {
22+
true => self.aes.dma_enable.write(|w| w.dma_enable().set_bit()),
23+
false => self.aes.dma_enable.write(|w| w.dma_enable().clear_bit()),
24+
}
25+
}
26+
27+
pub(super) fn write_key(&mut self, key: &[u8]) {
28+
debug_assert!(key.len() <= self.aes.key_.len() * ALIGN_SIZE);
29+
debug_assert_eq!(key.len() % ALIGN_SIZE, 0);
30+
Self::write_to_regset(key, self.aes.key_.len(), &mut self.aes.key_[0]);
31+
}
32+
33+
pub(super) fn write_block(&mut self, block: &[u8]) {
34+
debug_assert_eq!(block.len(), self.aes.text_in_.len() * ALIGN_SIZE);
35+
Self::write_to_regset(block, self.aes.text_in_.len(), &mut self.aes.text_in_[0]);
36+
}
37+
38+
pub(super) fn write_mode(&mut self, mode: u32) {
39+
Self::write_to_register(&mut self.aes.mode, mode);
40+
}
41+
42+
/// Configures how the state matrix would be laid out.
43+
pub fn write_endianness(
44+
&mut self,
45+
input_text_word_endianess: Endianness,
46+
input_text_byte_endianess: Endianness,
47+
output_text_word_endianess: Endianness,
48+
output_text_byte_endianess: Endianness,
49+
key_word_endianess: Endianness,
50+
key_byte_endianess: Endianness,
51+
) {
52+
let mut to_write = 0_u32;
53+
to_write |= key_byte_endianess as u32;
54+
to_write |= (key_word_endianess as u32) << 1;
55+
to_write |= (input_text_byte_endianess as u32) << 2;
56+
to_write |= (input_text_word_endianess as u32) << 3;
57+
to_write |= (output_text_byte_endianess as u32) << 4;
58+
to_write |= (output_text_word_endianess as u32) << 5;
59+
Self::write_to_register(&mut self.aes.endian, to_write);
60+
}
61+
62+
pub(super) fn write_start(&mut self) {
63+
self.aes.trigger.write(|w| w.trigger().set_bit())
64+
}
65+
66+
pub(super) fn read_idle(&mut self) -> bool {
67+
self.aes.state.read().state().bits() == 0
68+
}
69+
70+
pub(super) fn read_block(&self, block: &mut [u8]) {
71+
debug_assert_eq!(block.len(), self.aes.text_out_.len() * ALIGN_SIZE);
72+
Self::read_from_regset(block, self.aes.text_out_.len(), &self.aes.text_out_[0]);
73+
}
74+
}
75+
76+
impl AesFlavour for Aes128 {
77+
type KeyType<'b> = &'b [u8; 16];
78+
const ENCRYPT_MODE: u32 = 0;
79+
const DECRYPT_MODE: u32 = 4;
80+
}
81+
82+
impl AesFlavour for Aes192 {
83+
type KeyType<'b> = &'b [u8; 24];
84+
const ENCRYPT_MODE: u32 = 1;
85+
const DECRYPT_MODE: u32 = 5;
86+
}
87+
88+
impl AesFlavour for Aes256 {
89+
type KeyType<'b> = &'b [u8; 32];
90+
const ENCRYPT_MODE: u32 = 2;
91+
const DECRYPT_MODE: u32 = 6;
92+
}

esp-hal-common/src/aes/esp32s3.rs

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
use crate::{
2+
aes::{Aes, Aes128, Aes256, AesFlavour, ALIGN_SIZE},
3+
system::{Peripheral as PeripheralEnable, PeripheralClockControl},
4+
};
5+
6+
impl<'d> Aes<'d> {
7+
pub(super) fn init(&mut self, peripheral_clock_control: &mut PeripheralClockControl) {
8+
peripheral_clock_control.enable(PeripheralEnable::Aes);
9+
self.write_dma(false);
10+
}
11+
12+
fn write_dma(&mut self, enable_dma: bool) {
13+
match enable_dma {
14+
true => self.aes.dma_enable.write(|w| w.dma_enable().set_bit()),
15+
false => self.aes.dma_enable.write(|w| w.dma_enable().clear_bit()),
16+
}
17+
}
18+
19+
pub(super) fn write_key(&mut self, key: &[u8]) {
20+
debug_assert!(key.len() <= self.aes.key_.len() * ALIGN_SIZE);
21+
debug_assert_eq!(key.len() % ALIGN_SIZE, 0);
22+
Self::write_to_regset(key, self.aes.key_.len(), &mut self.aes.key_[0]);
23+
}
24+
25+
pub(super) fn write_block(&mut self, block: &[u8]) {
26+
debug_assert_eq!(block.len(), self.aes.text_in_.len() * ALIGN_SIZE);
27+
Self::write_to_regset(block, self.aes.text_in_.len(), &mut self.aes.text_in_[0]);
28+
}
29+
30+
pub(super) fn write_mode(&mut self, mode: u32) {
31+
Self::write_to_register(&mut self.aes.mode, mode);
32+
}
33+
34+
pub(super) fn write_start(&mut self) {
35+
self.aes.trigger.write(|w| w.trigger().set_bit())
36+
}
37+
38+
pub(super) fn read_idle(&mut self) -> bool {
39+
self.aes.state.read().state().bits() == 0
40+
}
41+
42+
pub(super) fn read_block(&self, block: &mut [u8]) {
43+
debug_assert_eq!(block.len(), self.aes.text_out_.len() * ALIGN_SIZE);
44+
Self::read_from_regset(block, self.aes.text_out_.len(), &self.aes.text_out_[0]);
45+
}
46+
}
47+
48+
impl AesFlavour for Aes128 {
49+
type KeyType<'b> = &'b [u8; 16];
50+
const ENCRYPT_MODE: u32 = 0;
51+
const DECRYPT_MODE: u32 = 4;
52+
}
53+
54+
impl AesFlavour for Aes256 {
55+
type KeyType<'b> = &'b [u8; 32];
56+
const ENCRYPT_MODE: u32 = 2;
57+
const DECRYPT_MODE: u32 = 6;
58+
}

0 commit comments

Comments
 (0)