ate_crypto/crypto/
encrypted_private_key.rs

1use crate::utils::vec_deserialize;
2use crate::utils::vec_serialize;
3use serde::{Deserialize, Serialize};
4#[allow(unused_imports)]
5use tracing::{debug, error, info, instrument, span, trace, warn, Level};
6
7use super::*;
8
9#[derive(Serialize, Deserialize, Debug, Clone, Hash, Eq, PartialEq)]
10pub struct EncryptedPrivateKey {
11    pk: PublicSignKey,
12    ek_hash: AteHash,
13    sk_iv: InitializationVector,
14    #[serde(serialize_with = "vec_serialize", deserialize_with = "vec_deserialize")]
15    sk_encrypted: Vec<u8>,
16}
17
18impl EncryptedPrivateKey {
19    #[allow(dead_code)]
20    pub fn generate(encrypt_key: &EncryptKey) -> EncryptedPrivateKey {
21        let pair = PrivateSignKey::generate(encrypt_key.size());
22        EncryptedPrivateKey::from_pair(&pair, encrypt_key)
23    }
24
25    #[allow(dead_code)]
26    pub fn from_pair(pair: &PrivateSignKey, encrypt_key: &EncryptKey) -> EncryptedPrivateKey {
27        let sk = pair.sk();
28        let sk = encrypt_key.encrypt(&sk[..]);
29
30        EncryptedPrivateKey {
31            pk: pair.as_public_key().clone(),
32            ek_hash: encrypt_key.hash(),
33            sk_iv: sk.iv,
34            sk_encrypted: sk.data,
35        }
36    }
37
38    #[allow(dead_code)]
39    pub fn as_private_key(&self, key: &EncryptKey) -> PrivateSignKey {
40        let data = key.decrypt(&self.sk_iv, &self.sk_encrypted[..]);
41        match &self.pk {
42            PublicSignKey::Falcon512 { pk } => PrivateSignKey::Falcon512 {
43                pk: PublicSignKey::Falcon512 { pk: pk.clone() },
44                sk: data,
45            },
46            PublicSignKey::Falcon1024 { pk } => PrivateSignKey::Falcon1024 {
47                pk: PublicSignKey::Falcon1024 { pk: pk.clone() },
48                sk: data,
49            },
50        }
51    }
52
53    #[allow(dead_code)]
54    pub fn as_public_key<'a>(&'a self) -> &'a PublicSignKey {
55        &self.pk
56    }
57
58    #[allow(dead_code)]
59    pub fn pk_hash(&self) -> AteHash {
60        self.pk.hash()
61    }
62
63    #[allow(dead_code)]
64    pub(crate) fn double_hash(&self) -> DoubleHash {
65        DoubleHash::from_hashes(&self.pk_hash(), &self.ek_hash)
66    }
67}