/
key_store.rs
53 lines (46 loc) · 1.69 KB
/
key_store.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//! # OpenMLS Key Store Trait
/// Sealed list of struct openmls manages (create/read/delete) through [OpenMlsKeyStore]
pub enum MlsEntityId {
SignatureKeyPair,
HpkePrivateKey,
KeyPackage,
PskBundle,
EncryptionKeyPair,
GroupState,
}
/// To implement by any struct owned by openmls aiming to be persisted in [OpenMlsKeyStore]
pub trait MlsEntity: serde::Serialize + serde::de::DeserializeOwned {
/// Identifier used to downcast the actual entity within an [OpenMlsKeyStore] method.
/// In case for example you need to select a SQL table depending on the entity type
const ID: MlsEntityId;
}
/// Blanket impl for when you have to lookup a list of entities from the keystore
impl<T> MlsEntity for Vec<T>
where
T: MlsEntity + std::fmt::Debug,
{
const ID: MlsEntityId = T::ID;
}
/// The Key Store trait
pub trait OpenMlsKeyStore: Send + Sync {
/// The error type returned by the [`OpenMlsKeyStore`].
type Error: std::error::Error + std::fmt::Debug + PartialEq;
/// Store a value `v` that implements the [`MlsEntity`] trait for
/// serialization for ID `k`.
///
/// Returns an error if storing fails.
fn store<V: MlsEntity>(&self, k: &[u8], v: &V) -> Result<(), Self::Error>
where
Self: Sized;
/// Read and return a value stored for ID `k` that implements the
/// [`MlsEntity`] trait for deserialization.
///
/// Returns [`None`] if no value is stored for `k` or reading fails.
fn read<V: MlsEntity>(&self, k: &[u8]) -> Option<V>
where
Self: Sized;
/// Delete a value stored for ID `k`.
///
/// Returns an error if storing fails.
fn delete<V: MlsEntity>(&self, k: &[u8]) -> Result<(), Self::Error>;
}