Skip to main content

lpc55_hal/peripherals/
hashcrypt.rs

1use crate::traits::digest::generic_array::GenericArray;
2
3use crate::{
4    drivers::{aes, Aes, AesKey, Sha1, Sha256},
5    peripherals::syscon,
6    raw,
7    typestates::init_state,
8};
9
10crate::wrap_stateful_peripheral!(Hashcrypt, HASHCRYPT);
11
12impl<State> core::ops::Deref for Hashcrypt<State> {
13    type Target = raw::hashcrypt::RegisterBlock;
14    fn deref(&self) -> &Self::Target {
15        &self.raw
16    }
17}
18
19impl<State> Hashcrypt<State> {
20    pub fn enabled(mut self, syscon: &mut syscon::Syscon) -> Hashcrypt<init_state::Enabled> {
21        syscon.enable_clock(&mut self.raw);
22        syscon.reset(&mut self.raw);
23
24        Hashcrypt {
25            raw: self.raw,
26            _state: init_state::Enabled(()),
27        }
28    }
29
30    pub fn disabled(mut self, syscon: &mut syscon::Syscon) -> Hashcrypt<init_state::Disabled> {
31        syscon.disable_clock(&mut self.raw);
32
33        Hashcrypt {
34            raw: self.raw,
35            _state: init_state::Disabled,
36        }
37    }
38}
39
40impl Hashcrypt<init_state::Enabled> {
41    /// SHA-1, as in RustCrypto  `digest` trait
42    pub fn sha1(&mut self) -> Sha1<'_> {
43        Sha1::from(self)
44    }
45
46    /// SHA-256, as in RustCrypto  `digest` trait
47    pub fn sha256(&mut self) -> Sha256<'_> {
48        Sha256::from(self)
49    }
50
51    /// AES-128 "ECB", as in RustCrypto `block-cipher` trait
52    pub fn aes128<'a>(&'a mut self, key: &[u8; 16]) -> aes::Aes128<'a> {
53        let key = AesKey::User(GenericArray::clone_from_slice(key));
54        Aes::new(self, key, aes::Mode::Encrypt)
55    }
56
57    /// AES-192 "ECB", as in RustCrypto `block-cipher` trait
58    pub fn aes192<'a>(&'a mut self, key: &[u8; 24]) -> aes::Aes192<'a> {
59        let key = AesKey::User(GenericArray::clone_from_slice(key));
60        Aes::new(self, key, aes::Mode::Encrypt)
61    }
62
63    /// AES-256 "ECB", as in RustCrypto `block-cipher` trait
64    pub fn aes256<'a>(&'a mut self, key: &[u8; 32]) -> aes::Aes256<'a> {
65        let key = AesKey::User(GenericArray::clone_from_slice(key));
66        Aes::new(self, key, aes::Mode::Encrypt)
67    }
68
69    /// AES "ECB" with PUF key, for use as in RustCrypto `block-cipher` trait
70    ///
71    /// DOES NOT PROPERLY CHECK IF PUF AES KEY IS SETUP YET!
72    /// TODO: have user pass in some token signaling PUF AES key is setup
73    pub fn puf_aes(&mut self) -> aes::Aes256<'_> {
74        Aes::new(self, AesKey::Puf, aes::Mode::Encrypt)
75    }
76}