sentc_crypto_std_keys/core/hmac/
mod.rs1use 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}