pub use pac::aes::ctrla::{
Aesmodeselect, Cfbsselect, Cipherselect, Keysizeselect, Lodselect, Startmodeselect,
Xorkeyselect,
};
mod rustcrypto;
pub use cipher::{
BlockCipher, BlockClosure, BlockDecrypt, BlockEncrypt, BlockSizeUser,
consts::{U1, U8, U16, U24, U32},
generic_array::*,
};
pub use rustcrypto::{Aes128, Aes192, Aes256};
use crate::pac;
use pac::aes::*;
use bitfield::BitRange;
type AesApbClk = crate::clock::v2::apb::ApbClk<crate::clock::v2::types::Aes>;
use aes::Block;
type Dataptr = u8;
type Indata = u32;
type InitVec = [u32; 4];
type Hashkey = [u32; 4];
type Ghash = [u32; 4];
type Ciplen = u32;
type Seed = u32;
bitfield::bitfield! {
pub struct Ctype(u8);
impl Debug;
u8;
get_ctype1, set_ctype1: 0;
get_ctype2, set_ctype2: 1;
get_ctype3, set_ctype3: 2;
get_ctype4, set_ctype4: 3;
}
bitfield::bitfield! {
pub struct CtrlaConf(u32);
impl Debug;
impl Default;
u8;
get_swrst, set_swrst: 0;
get_enable, set_enable: 1;
get_aesmode, set_aesmode: 4, 2;
get_cfbs, set_cfbs: 7, 5;
get_keysize, set_keysize: 9, 8;
get_cipher, set_cipher: 10;
get_startmode, set_startmode: 11;
get_lod, set_lod: 12;
get_keygen, set_keygen: 13;
get_xorkey, set_xorkey: 14;
get_ctype, set_ctype: 19, 16;
}
pub struct AesRustCrypto {
aes: Aes,
}
impl AesRustCrypto {
#[inline]
pub fn new(aes: Aes) -> Self {
Self { aes }
}
#[inline]
pub fn free(self) -> Aes {
self.aes
}
#[inline]
pub fn into_128bit(self, key: &GenericArray<u8, U16>) -> rustcrypto::Aes128 {
rustcrypto::Aes128::new(self.aes, key)
}
#[inline]
pub fn into_192bit(self, key: &GenericArray<u8, U24>) -> rustcrypto::Aes192 {
rustcrypto::Aes192::new(self.aes, key)
}
#[inline]
pub fn into_256bit(self, key: &GenericArray<u8, U32>) -> rustcrypto::Aes256 {
rustcrypto::Aes256::new(self.aes, key)
}
}
pub struct Aes {
aes: pac::Aes,
_clk: AesApbClk,
}
impl Aes {
#[inline]
pub fn new(aes: pac::Aes, clk: AesApbClk) -> Self {
Self { aes, _clk: clk }
}
#[inline]
pub fn activate_rustcrypto_backend(self) -> AesRustCrypto {
AesRustCrypto::new(self)
}
#[inline]
fn aes(&self) -> &RegisterBlock {
&self.aes
}
#[inline]
fn ctrla(&self) -> &Ctrla {
self.aes().ctrla()
}
#[inline]
fn ctrlb(&self) -> &Ctrlb {
self.aes().ctrlb()
}
#[inline]
fn intenclr(&self) -> &Intenclr {
self.aes().intenclr()
}
#[inline]
fn intenset(&self) -> &Intenset {
self.aes().intenset()
}
#[inline]
fn intflag(&self) -> &Intflag {
self.aes().intflag()
}
#[inline]
fn databufptr(&self) -> &Databufptr {
self.aes().databufptr()
}
#[inline]
fn dbgctrl(&self) -> &Dbgctrl {
self.aes().dbgctrl()
}
#[inline]
fn indata(&self) -> &pac::aes::Indata {
self.aes().indata()
}
#[inline]
fn ciplen(&self) -> &pac::aes::Ciplen {
self.aes().ciplen()
}
#[inline]
fn randseed(&self) -> &Randseed {
self.aes().randseed()
}
#[inline]
pub fn enable(&mut self) {
self.ctrla().modify(|_, w| w.enable().set_bit());
}
#[inline]
pub fn disable(&mut self) {
self.ctrla().modify(|_, w| w.enable().clear_bit());
}
#[inline]
pub fn swrst(&self) {
self.ctrla().modify(|_, w| w.swrst().set_bit());
}
#[inline]
pub fn free(self) -> (pac::Aes, AesApbClk) {
(self.aes, self._clk)
}
#[inline]
pub fn set_aesmode(self, mode: Aesmodeselect) {
self.ctrla().modify(|_, w| w.aesmode().variant(mode));
}
#[inline]
pub fn set_cfbs(self, blocksize: Cfbsselect) {
self.ctrla().modify(|_, w| w.cfbs().variant(blocksize));
}
#[inline]
pub fn set_keysize(self, keysize: Keysizeselect) {
self.ctrla().modify(|_, w| w.keysize().variant(keysize));
}
#[inline]
pub fn set_cipher(self, mode: Cipherselect) {
self.ctrla().modify(|_, w| w.cipher().variant(mode));
}
#[inline]
pub fn set_startmode(self, mode: Startmodeselect) {
self.ctrla().modify(|_, w| w.startmode().variant(mode));
}
#[inline]
pub fn set_lod(self, mode: Lodselect) {
self.ctrla().modify(|_, w| w.lod().variant(mode));
}
#[inline]
pub fn set_keygen(self, keygen_start: bool) {
self.ctrla().modify(|_, w| w.keygen().bit(keygen_start));
}
#[inline]
pub fn set_xorkey(self, mode: Xorkeyselect) {
self.ctrla().modify(|_, w| w.xorkey().variant(mode));
}
#[inline]
pub fn set_ctype(self, countermeasures: Ctype) {
self.ctrla()
.modify(|_, w| unsafe { w.ctype().bits(countermeasures.bit_range(3, 0)) });
}
#[inline]
pub fn start(&self) {
self.ctrlb().modify(|_, w| w.start().set_bit());
}
#[inline]
pub fn newmsg(&self) {
self.ctrlb().modify(|_, w| w.newmsg().set_bit());
}
#[inline]
pub fn eom(&self) {
self.ctrlb().modify(|_, w| w.eom().set_bit());
}
#[inline]
pub fn gfmul(&self) {
self.ctrlb().modify(|_, w| w.gfmul().set_bit());
}
#[inline]
pub fn disable_enccmp(&self) {
self.intenclr().modify(|_, w| w.enccmp().set_bit());
}
#[inline]
pub fn disable_gfmcmp(&self) {
self.intenclr().modify(|_, w| w.gfmcmp().set_bit());
}
#[inline]
pub fn enable_enccmp(&self) {
self.intenset().modify(|_, w| w.enccmp().set_bit());
}
#[inline]
pub fn enable_gfmcmp(&self) {
self.intenset().modify(|_, w| w.gfmcmp().set_bit());
}
#[inline]
pub fn clear_enccmp(&self) {
self.intflag().modify(|_, w| w.enccmp().set_bit());
}
#[inline]
pub fn clear_gfmcmp(&self) {
self.intflag().modify(|_, w| w.gfmcmp().set_bit());
}
#[inline]
pub fn read_enccmp(&self) -> bool {
self.intflag().read().enccmp().bit_is_set()
}
#[inline]
pub fn read_gfmcmp(&self) -> bool {
self.intflag().read().gfmcmp().bit_is_set()
}
#[inline]
pub fn set_databufptr(&self, dataptr: Dataptr) {
self.databufptr()
.modify(|_, w| unsafe { w.indataptr().bits(dataptr) })
}
#[inline]
pub fn set_debug(&self, run_during_debug: bool) {
self.dbgctrl()
.modify(|_, w| w.dbgrun().bit(run_during_debug))
}
#[inline]
pub fn set_keyword<const N: usize>(&self, keyword: &[u8; N]) {
for (index, _) in keyword.iter().step_by(4).enumerate() {
let data = u32::from_ne_bytes([
keyword[index],
keyword[index + 1],
keyword[index + 2],
keyword[index + 3],
]);
self.aes().keyword(index).write(|w| unsafe { w.bits(data) });
}
}
#[inline]
pub fn set_data(&self, data: Indata) {
self.indata().write(|w| unsafe { w.bits(data) });
}
pub fn get_data(&self) -> Indata {
self.indata().read().bits()
}
#[inline]
pub fn set_initialization_vector(&self, iv: InitVec) {
for (index, data) in iv.iter().enumerate() {
self.aes()
.intvectv(index)
.write(|w| unsafe { w.bits(*data) });
}
}
#[inline]
pub fn set_hashkey(&self, hashkey: Hashkey) {
for (index, data) in hashkey.iter().enumerate() {
self.aes()
.hashkey(index)
.write(|w| unsafe { w.bits(*data) });
}
}
pub fn get_hashkey(&self) -> Hashkey {
let mut output = [0; 4];
for (index, data) in output.iter_mut().enumerate() {
*data = self.aes().hashkey(index).read().bits();
}
output
}
#[inline]
pub fn set_ghash(&self, ghash: Ghash) {
for (index, data) in ghash.iter().enumerate() {
self.aes().ghash(index).write(|w| unsafe { w.bits(*data) });
}
}
#[inline]
pub fn get_ghash(&self) -> Ghash {
let mut output = [0; 4];
for (index, data) in output.iter_mut().enumerate() {
*data = self.aes().ghash(index).read().bits();
}
output
}
#[inline]
pub fn set_ciplen(&self, ciplen: Ciplen) {
self.ciplen().write(|w| unsafe { w.bits(ciplen) });
}
#[inline]
pub fn get_ciplen(&self) -> Ciplen {
self.ciplen().read().bits()
}
#[inline]
pub fn set_randseed(&self, seed: Seed) {
self.randseed().write(|w| unsafe { w.bits(seed) });
}
}