use blake3::Hasher;
use zeroize::ZeroizeOnDrop;
#[derive(Clone, ZeroizeOnDrop)]
pub struct SessionKeys {
pub auth_key: [u8; 32],
pub encryption_key: [u8; 32],
pub signing_key: [u8; 32],
}
impl SessionKeys {
pub(crate) fn derive(shared_secret: &[u8], address: &str, timestamp: u64) -> Self {
let mut hasher = Hasher::new();
hasher.update(b"revery-v0"); hasher.update(shared_secret);
hasher.update(address.as_bytes());
hasher.update(×tamp.to_le_bytes());
let mut auth_hasher = hasher.clone();
auth_hasher.update(b"authentication");
let auth_key: [u8; 32] = auth_hasher.finalize().into();
let mut enc_hasher = hasher.clone();
enc_hasher.update(b"encryption");
let encryption_key: [u8; 32] = enc_hasher.finalize().into();
let mut signing_hasher = hasher.clone();
signing_hasher.update(b"signing");
let signing_key: [u8; 32] = signing_hasher.finalize().into();
SessionKeys {
auth_key,
encryption_key,
signing_key,
}
}
}