xxxdh/storage/
mod.rs

1//! Key storage.
2pub mod inmem;
3
4use cryptimitives::key::KeyPair;
5use cryptraits::{
6    key::{PublicKey, SecretKey},
7    signature::Signature,
8};
9
10use crate::errors::StorageResult;
11
12/// Identity keys storage.
13pub trait IdentityKeyStorage<SK>
14where
15    SK: SecretKey,
16{
17    /// Get an identity `IdentityKeyPair`.
18    fn get_identity_key_pair(&self) -> &KeyPair<SK>;
19
20    /// Save a known identity.
21    fn save_identity(&mut self, identity: &SK::PK) -> StorageResult<()>;
22
23    /// Check if an identity is known.
24    fn is_known_identity(&self, identity: &SK::PK) -> StorageResult<bool>;
25}
26
27///  Prekeys storage.
28pub trait PreKeyStorage<SK>
29where
30    SK: SecretKey,
31{
32    /// Get a prekey `PreKeyPair`.
33    fn get_prekey_pair(&self) -> &KeyPair<SK>;
34
35    /// Save a known identity.
36    fn save_prekey(&mut self, key: &SK::PK) -> StorageResult<()>;
37
38    /// Check if a prekey is known.
39    fn is_known_prekey(&self, key: &SK::PK) -> StorageResult<bool>;
40}
41
42///  Prekeys signature storage.
43pub trait SignatureStorage<PK, SIG>
44where
45    PK: PublicKey,
46    SIG: Signature,
47{
48    /// Get a signature for a key.
49    fn get_signature(&self, key: &PK) -> StorageResult<Option<&SIG>>;
50
51    /// Save a signature.
52    fn save_signature(&mut self, key: PK, signature: SIG) -> StorageResult<()>;
53}
54
55///  One-time keys storage.
56pub trait OnetimeKeyStorage<SK>
57where
58    SK: SecretKey,
59{
60    /// Get a `OnetimeKeyPair`.
61    fn get_onetime_keypair(&self, key: &SK::PK) -> StorageResult<Option<&KeyPair<SK>>>;
62
63    /// Save a `OnetimeKeyPair`.
64    fn save_onetime_keypair(&mut self, keypair: KeyPair<SK>) -> StorageResult<()>;
65
66    /// Forget a `OnetimeKeyPair`.
67    fn forget_onetime_keypair(&mut self, key: &SK::PK) -> StorageResult<()>;
68
69    /// Check if there are keys available.
70    fn is_onetime_keys_empty(&self) -> StorageResult<bool>;
71
72    /// Provide a single onetime key. Returns `None` if storage is empty.
73    fn provide_ontime_key(&self) -> StorageResult<Option<&SK::PK>>;
74}
75
76pub trait ProtocolStorage<SK, PK, S>:
77    IdentityKeyStorage<SK> + PreKeyStorage<SK> + SignatureStorage<PK, S> + OnetimeKeyStorage<SK>
78where
79    SK: SecretKey,
80    PK: PublicKey,
81    S: Signature,
82{
83    fn new(identity_keypair: KeyPair<SK>, prekey_keypair: KeyPair<SK>) -> Self;
84}