use async_trait::async_trait;
use uuid::Uuid;
use crate::error::Result;
use crate::sender_keys::SenderKeyRecord;
use crate::state::{
KyberPreKeyId, KyberPreKeyRecord, PreKeyId, PreKeyRecord, SessionRecord, SignedPreKeyId,
SignedPreKeyRecord,
};
use crate::{IdentityKey, IdentityKeyPair, ProtocolAddress, PublicKey};
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum Direction {
Sending,
Receiving,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, derive_more::TryFrom)]
#[repr(C)]
#[try_from(repr)]
pub enum IdentityChange {
NewOrUnchanged,
ReplacedExisting,
}
#[async_trait(?Send)]
pub trait IdentityKeyStore {
async fn get_identity_key_pair(&self) -> Result<IdentityKeyPair>;
async fn get_local_registration_id(&self) -> Result<u32>;
async fn save_identity(
&mut self,
address: &ProtocolAddress,
identity: &IdentityKey,
) -> Result<IdentityChange>;
async fn is_trusted_identity(
&self,
address: &ProtocolAddress,
identity: &IdentityKey,
direction: Direction,
) -> Result<bool>;
async fn get_identity(&self, address: &ProtocolAddress) -> Result<Option<IdentityKey>>;
}
#[async_trait(?Send)]
pub trait PreKeyStore {
async fn get_pre_key(&self, prekey_id: PreKeyId) -> Result<PreKeyRecord>;
async fn save_pre_key(&mut self, prekey_id: PreKeyId, record: &PreKeyRecord) -> Result<()>;
async fn remove_pre_key(&mut self, prekey_id: PreKeyId) -> Result<()>;
}
#[async_trait(?Send)]
pub trait SignedPreKeyStore {
async fn get_signed_pre_key(
&self,
signed_prekey_id: SignedPreKeyId,
) -> Result<SignedPreKeyRecord>;
async fn save_signed_pre_key(
&mut self,
signed_prekey_id: SignedPreKeyId,
record: &SignedPreKeyRecord,
) -> Result<()>;
}
#[async_trait(?Send)]
pub trait KyberPreKeyStore {
async fn get_kyber_pre_key(&self, kyber_prekey_id: KyberPreKeyId) -> Result<KyberPreKeyRecord>;
async fn save_kyber_pre_key(
&mut self,
kyber_prekey_id: KyberPreKeyId,
record: &KyberPreKeyRecord,
) -> Result<()>;
async fn mark_kyber_pre_key_used(
&mut self,
kyber_prekey_id: KyberPreKeyId,
ec_prekey_id: SignedPreKeyId,
base_key: &PublicKey,
) -> Result<()>;
}
#[async_trait(?Send)]
pub trait SessionStore {
async fn load_session(&self, address: &ProtocolAddress) -> Result<Option<SessionRecord>>;
async fn store_session(
&mut self,
address: &ProtocolAddress,
record: &SessionRecord,
) -> Result<()>;
}
#[async_trait(?Send)]
pub trait SenderKeyStore {
async fn store_sender_key(
&mut self,
sender: &ProtocolAddress,
distribution_id: Uuid,
record: &SenderKeyRecord,
) -> Result<()>;
async fn load_sender_key(
&mut self,
sender: &ProtocolAddress,
distribution_id: Uuid,
) -> Result<Option<SenderKeyRecord>>;
}
pub trait ProtocolStore:
SessionStore + PreKeyStore + SignedPreKeyStore + KyberPreKeyStore + IdentityKeyStore
{
}
impl IdentityChange {
pub fn from_changed(changed: bool) -> Self {
if changed {
Self::ReplacedExisting
} else {
Self::NewOrUnchanged
}
}
}