pub mod inmem;
use cryptimitives::key::KeyPair;
use cryptraits::{
key::{PublicKey, SecretKey},
signature::Signature,
};
use crate::errors::StorageResult;
pub trait IdentityKeyStorage<SK>
where
SK: SecretKey,
{
fn get_identity_key_pair(&self) -> &KeyPair<SK>;
fn save_identity(&mut self, identity: &SK::PK) -> StorageResult<()>;
fn is_known_identity(&self, identity: &SK::PK) -> StorageResult<bool>;
}
pub trait PreKeyStorage<SK>
where
SK: SecretKey,
{
fn get_prekey_pair(&self) -> &KeyPair<SK>;
fn save_prekey(&mut self, key: &SK::PK) -> StorageResult<()>;
fn is_known_prekey(&self, key: &SK::PK) -> StorageResult<bool>;
}
pub trait SignatureStorage<PK, SIG>
where
PK: PublicKey,
SIG: Signature,
{
fn get_signature(&self, key: &PK) -> StorageResult<Option<&SIG>>;
fn save_signature(&mut self, key: PK, signature: SIG) -> StorageResult<()>;
}
pub trait OnetimeKeyStorage<SK>
where
SK: SecretKey,
{
fn get_onetime_keypair(&self, key: &SK::PK) -> StorageResult<Option<&KeyPair<SK>>>;
fn save_onetime_keypair(&mut self, keypair: KeyPair<SK>) -> StorageResult<()>;
fn forget_onetime_keypair(&mut self, key: &SK::PK) -> StorageResult<()>;
fn is_onetime_keys_empty(&self) -> StorageResult<bool>;
fn provide_ontime_key(&self) -> StorageResult<Option<&SK::PK>>;
}
pub trait ProtocolStorage<SK, PK, S>:
IdentityKeyStorage<SK> + PreKeyStorage<SK> + SignatureStorage<PK, S> + OnetimeKeyStorage<SK>
where
SK: SecretKey,
PK: PublicKey,
S: Signature,
{
fn new(identity_keypair: KeyPair<SK>, prekey_keypair: KeyPair<SK>) -> Self;
}