Skip to main content

sentc_crypto_std_keys/core/hmac/
mod.rs

1use alloc::vec::Vec;
2
3use sentc_crypto_core::cryptomat::{CryptoAlg, SearchableKey, SearchableKeyComposer, SearchableKeyGen, SymKey};
4use sentc_crypto_core::Error;
5
6use crate::core::hmac::hmac_sha256::HmacSha256Key;
7
8pub(crate) mod hmac_sha256;
9
10macro_rules! deref_macro {
11    ($self:expr, $method:ident $(, $args:expr)*) => {
12        match $self {
13           	Self::HmacSha256(inner) => inner.$method($($args),*),
14        }
15    };
16}
17
18pub enum HmacKey
19{
20	HmacSha256(HmacSha256Key),
21}
22
23impl HmacKey
24{
25	pub fn hmac_sha256_from_bytes_owned(bytes: Vec<u8>) -> Result<Self, Error>
26	{
27		Ok(HmacKey::HmacSha256(bytes.try_into()?))
28	}
29}
30
31impl CryptoAlg for HmacKey
32{
33	fn get_alg_str(&self) -> &'static str
34	{
35		deref_macro!(self, get_alg_str)
36	}
37}
38
39impl AsRef<[u8]> for HmacKey
40{
41	fn as_ref(&self) -> &[u8]
42	{
43		deref_macro!(self, as_ref)
44	}
45}
46
47impl SearchableKey for HmacKey
48{
49	fn encrypt_key_with_master_key<M: SymKey>(&self, master_key: &M) -> Result<Vec<u8>, Error>
50	{
51		deref_macro!(self, encrypt_key_with_master_key, master_key)
52	}
53
54	fn encrypt_searchable(&self, data: &[u8]) -> Result<Vec<u8>, Error>
55	{
56		deref_macro!(self, encrypt_searchable, data)
57	}
58
59	fn verify_encrypted_searchable(&self, data: &[u8], check: &[u8]) -> Result<bool, Error>
60	{
61		deref_macro!(self, verify_encrypted_searchable, data, check)
62	}
63}
64
65impl SearchableKeyGen for HmacKey
66{
67	type SearchableKey = Self;
68
69	fn generate() -> Result<Self::SearchableKey, Error>
70	{
71		#[cfg(feature = "hmac_sha256")]
72		Ok(HmacSha256Key::generate()?.into())
73	}
74}
75
76impl SearchableKeyComposer for HmacKey
77{
78	type Key = Self;
79
80	fn decrypt_by_master_key<M: SymKey>(master_key: &M, encrypted_key: &[u8], alg_str: &str) -> Result<Self::Key, Error>
81	{
82		let key = master_key.decrypt(encrypted_key)?;
83
84		match alg_str {
85			hmac_sha256::HMAC_SHA256_OUTPUT => Ok(HmacKey::HmacSha256(key.try_into()?)),
86			_ => Err(Error::AlgNotFound),
87		}
88	}
89}