use crate::aes::Keysizeselect;
use crate::pac;
use aes::Block;
use cipher::inout::InOut;
pub(super) fn encrypt<'a, const N: usize>(
aes: &pac::Aes,
key: &[u8; N],
mut blocks: InOut<'a, 'a, Block>,
) {
aes.ctrla().write(|w| w.swrst().set_bit());
while aes.ctrla().read().swrst().bit_is_set() {}
let keysize = match N {
16 => Keysizeselect::_128bit,
24 => Keysizeselect::_192bit,
32 => Keysizeselect::_256bit,
_ => panic!("Invalid AES keysize!"),
};
aes.ctrla().write(|w| {
w.cipher()
.enc()
.keysize()
.variant(keysize)
.enable()
.set_bit()
});
for (index, _) in key.iter().enumerate().step_by(4) {
let data = u32::from_le_bytes([key[index], key[index + 1], key[index + 2], key[index + 3]]);
aes.keyword(index / 4).write(|w| unsafe { w.bits(data) });
}
let in_block = blocks.get_in();
for (index, _) in in_block.iter().enumerate().step_by(4) {
let data = u32::from_le_bytes([
in_block[index],
in_block[index + 1],
in_block[index + 2],
in_block[index + 3],
]);
aes.indata().write(|w| unsafe { w.bits(data) });
}
aes.ctrlb().write(|w| w.start().set_bit());
while aes.intflag().read().enccmp().bit_is_clear() {}
let out_block = blocks.get_out();
for index in (0..out_block.len()).step_by(4) {
let buf = aes.indata().read().bits();
for (bytepos, byte) in u32::to_ne_bytes(buf).iter().enumerate() {
out_block[index + bytepos] = *byte;
}
}
}