use secrecy::ExposeSecret as _;
#[derive(Debug)]
pub struct Key(secrecy::SecretBox<[u8; 32]>);
impl Key {
pub fn expose_secret(&self) -> &[u8; 32] {
self.0.expose_secret()
}
}
impl Clone for Key {
fn clone(&self) -> Self {
Self(Box::new(*self.expose_secret()).into())
}
}
impl From<Box<[u8; 32]>> for Key {
fn from(k: Box<[u8; 32]>) -> Self {
Key(k.into())
}
}
#[tracing::instrument(level = "debug")]
pub fn generate_key() -> Key {
use rand::{RngCore, rng};
let mut k = [0u8; 32];
rng().fill_bytes(&mut k);
Box::new(k).into()
}