otplus_core/header/
kdf.rs1use 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}