1use crate::aes::{ALIGN_SIZE, Aes, Aes128, Aes192, Aes256, AesFlavour, Endianness, Mode};
2
3impl Aes<'_> {
4 pub(super) fn init(&mut self) {
5 self.write_endianness(
6 Endianness::BigEndian,
7 Endianness::BigEndian,
8 Endianness::BigEndian,
9 Endianness::BigEndian,
10 Endianness::BigEndian,
11 Endianness::BigEndian,
12 );
13 }
14
15 pub(super) fn write_key(&mut self, key: &[u8]) {
16 let key_len = self.regs().key_iter().count();
17 debug_assert!(key.len() <= key_len * ALIGN_SIZE);
18 debug_assert_eq!(key.len() % ALIGN_SIZE, 0);
19 self.alignment_helper
20 .volatile_write_regset(self.regs().key(0).as_ptr(), key, key_len);
21 }
22
23 pub(super) fn write_block(&mut self, block: &[u8]) {
24 let text_len = self.regs().text_iter().count();
25 debug_assert_eq!(block.len(), text_len * ALIGN_SIZE);
26 self.alignment_helper
27 .volatile_write_regset(self.regs().text(0).as_ptr(), block, text_len);
28 }
29
30 pub(super) fn write_mode(&self, mode: Mode) {
31 self.regs().mode().write(|w| unsafe { w.bits(mode as _) });
32 }
33
34 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.regs().endian().write(|w| unsafe { w.bits(to_write) });
52 }
53
54 pub(super) fn write_start(&self) {
55 self.regs().start().write(|w| w.start().set_bit());
56 }
57
58 pub(super) fn read_idle(&mut self) -> bool {
59 self.regs().idle().read().idle().bit_is_set()
60 }
61
62 pub(super) fn read_block(&self, block: &mut [u8]) {
63 let text_len = self.regs().text_iter().count();
64 debug_assert_eq!(block.len(), text_len * ALIGN_SIZE);
65 self.alignment_helper
66 .volatile_read_regset(self.regs().text(0).as_ptr(), block, text_len);
67 }
68}
69
70impl AesFlavour for Aes128 {
71 type KeyType<'b> = &'b [u8; 16];
72}
73
74impl AesFlavour for Aes192 {
75 type KeyType<'b> = &'b [u8; 24];
76}
77
78impl AesFlavour for Aes256 {
79 type KeyType<'b> = &'b [u8; 32];
80}