core_crypto_keystore/
database_key.rs1use std::{fmt, ops::Deref};
2
3use sha2::{Digest as _, Sha256};
4use zeroize::{Zeroize, ZeroizeOnDrop};
5
6use crate::CryptoKeystoreError;
7
8#[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}