use matrix_pickle::Decode;
use serde::{Deserialize, Serialize};
use sha2::{Digest, Sha256};
use crate::{Curve25519PublicKey, utilities::base64_encode};
#[derive(Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Decode)]
pub struct SessionKeys {
pub identity_key: Curve25519PublicKey,
pub base_key: Curve25519PublicKey,
pub one_time_key: Curve25519PublicKey,
}
impl SessionKeys {
pub fn session_id(&self) -> String {
let sha = Sha256::new();
let digest = sha
.chain_update(self.identity_key.as_bytes())
.chain_update(self.base_key.as_bytes())
.chain_update(self.one_time_key.as_bytes())
.finalize();
base64_encode(digest)
}
}
impl std::fmt::Debug for SessionKeys {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("SessionKeys")
.field("identity_key", &self.identity_key.to_base64())
.field("base_key", &self.base_key.to_base64())
.field("one_time_key", &self.one_time_key.to_base64())
.finish()
}
}
#[cfg(test)]
mod test {
use insta::assert_debug_snapshot;
use super::SessionKeys;
use crate::Curve25519PublicKey;
#[test]
fn snapshot_session_keys_debug() {
let key = Curve25519PublicKey::from_bytes([0; 32]);
let session_keys = SessionKeys { identity_key: key, base_key: key, one_time_key: key };
assert_debug_snapshot!(session_keys);
}
}