Skip to main content

otplus_core/header/
kdf.rs

1use serde::{Serialize, Deserialize, Serializer, Deserializer};
2use chacha20poly1305::{aead::{AeadCore, OsRng}, ChaCha20Poly1305};
3use serde::ser::SerializeStruct;
4use crate::helpers::Helpers;
5
6#[derive(Debug)]
7pub struct Kdf {
8  pub algorithm: String,
9  pub salt: Vec<u8>,
10  pub key_length: u32,
11}
12
13impl Default for Kdf {
14  fn default() -> Self {
15    let mut os_rng = OsRng::default();
16    let salt = ChaCha20Poly1305::generate_nonce(&mut os_rng);
17    
18    Self { algorithm: "argon2".to_string(), salt: salt.as_slice().to_vec(), key_length: 32 }
19  }
20}
21
22impl Serialize for Kdf {
23  fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
24  where
25    S: Serializer,
26  {
27    let mut state = serializer.serialize_struct("Kdf", 3)?;
28    state.serialize_field("algorithm", &self.algorithm)?;
29
30    let salt_base64 = Helpers::base64_encode(&self.salt);
31    state.serialize_field("salt", &salt_base64)?;
32    state.serialize_field("key_length", &self.key_length)?;
33    state.end()
34  }
35}
36
37impl<'de> Deserialize<'de> for Kdf {
38  fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
39  where
40    D: Deserializer<'de>,
41  {
42    #[derive(Deserialize)]
43    struct KdfHelper {
44      algorithm: String,
45      salt: String,
46      key_length: u32,
47    }
48
49    let kdf_helper = KdfHelper::deserialize(deserializer)?;
50
51    let salt = Helpers::base64_decode(&kdf_helper.salt).unwrap_or_default();
52
53    Ok(Self { algorithm: kdf_helper.algorithm, salt: salt, key_length: kdf_helper.key_length })
54  }
55}