bc_components/symmetric/
derivation_params.rs

1use super::{Argon2id, KeyDerivationMethod, Scrypt, HKDF, PBKDF2};
2use dcbor::prelude::*;
3
4/// Enum representing the derivation parameters.
5///
6/// CDDL:
7/// ```cddl
8/// DerivationParams = HKDF / PBKDF2 / Scrypt
9/// ```
10#[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}