bc_components/symmetric/
derivation_params.rs1use super::{Argon2id, KeyDerivationMethod, Scrypt, HKDF, PBKDF2};
2use dcbor::prelude::*;
3
4#[derive(Debug, Clone, PartialEq, Eq)]
11pub enum DerivationParams {
12 HKDF(HKDF),
13 PBKDF2(PBKDF2),
14 Scrypt(Scrypt),
15 Argon2id(Argon2id),
16}
17
18impl std::fmt::Display for DerivationParams {
19 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
20 match self {
21 DerivationParams::HKDF(params) => write!(f, "{}", params),
22 DerivationParams::PBKDF2(params) => write!(f, "{}", params),
23 DerivationParams::Scrypt(params) => write!(f, "{}", params),
24 DerivationParams::Argon2id(params) => write!(f, "{}", params),
25 }
26 }
27}
28
29impl From<DerivationParams> for CBOR {
30 fn from(value: DerivationParams) -> Self {
31 match value {
32 DerivationParams::HKDF(params) => params.into(),
33 DerivationParams::PBKDF2(params) => params.into(),
34 DerivationParams::Scrypt(params) => params.into(),
35 DerivationParams::Argon2id(params) => params.into(),
36 }
37 }
38}
39
40impl TryFrom<CBOR> for DerivationParams {
41 type Error = dcbor::Error;
42
43 fn try_from(cbor: CBOR) -> dcbor::Result<Self> {
44 let a = cbor.clone().try_into_array()?;
45 let mut iter = a.into_iter();
46 let index: usize = iter
47 .next()
48 .ok_or_else(|| dcbor::Error::msg("Missing index"))?
49 .try_into()?;
50 match KeyDerivationMethod::from_index(index) {
51 Some(KeyDerivationMethod::HKDF) => Ok(DerivationParams::HKDF(HKDF::try_from(cbor)?)),
52 Some(KeyDerivationMethod::PBKDF2) =>
53 Ok(DerivationParams::PBKDF2(PBKDF2::try_from(cbor)?)),
54 Some(KeyDerivationMethod::Scrypt) =>
55 Ok(DerivationParams::Scrypt(Scrypt::try_from(cbor)?)),
56 Some(KeyDerivationMethod::Argon2id) =>
57 Ok(DerivationParams::Argon2id(Argon2id::try_from(cbor)?)),
58 None => Err(dcbor::Error::msg("Invalid KeyDerivationMethod")),
59 }
60 }
61}