core_crypto_keystore/
database_key.rs

1use std::{fmt, ops::Deref};
2
3use sha2::{Digest as _, Sha256};
4use zeroize::{Zeroize, ZeroizeOnDrop};
5
6use crate::CryptoKeystoreError;
7
8/// The key used to encrypt the database.
9#[derive(Clone, Zeroize, ZeroizeOnDrop, derive_more::From, PartialEq, Eq)]
10pub struct DatabaseKey([u8; Self::LEN]);
11
12impl DatabaseKey {
13    pub const LEN: usize = 32;
14
15    pub fn generate() -> DatabaseKey {
16        DatabaseKey(rand::random::<[u8; Self::LEN]>())
17    }
18}
19
20impl fmt::Debug for DatabaseKey {
21    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
22        f.write_str("DatabaseKey(hash=")?;
23        for x in Sha256::digest(self).as_slice().iter().take(10) {
24            fmt::LowerHex::fmt(x, f)?
25        }
26        f.write_str("...)")
27    }
28}
29
30impl AsRef<[u8]> for DatabaseKey {
31    fn as_ref(&self) -> &[u8] {
32        &self.0
33    }
34}
35
36impl Deref for DatabaseKey {
37    type Target = [u8];
38
39    fn deref(&self) -> &Self::Target {
40        &self.0
41    }
42}
43
44impl TryFrom<&[u8]> for DatabaseKey {
45    type Error = CryptoKeystoreError;
46
47    fn try_from(buf: &[u8]) -> Result<Self, Self::Error> {
48        if buf.len() != Self::LEN {
49            Err(CryptoKeystoreError::InvalidDbKeySize {
50                expected: Self::LEN,
51                actual: buf.len(),
52            })
53        } else {
54            Ok(Self(buf.try_into().unwrap()))
55        }
56    }
57}