Skip to main content

offline_protocol_mls/
provider.rs

1//! Custom OpenMLS provider implementation.
2//!
3//! This module provides [`MlsProvider`], which combines the OpenMLS Rust crypto
4//! backend with our custom storage adapter.
5
6use crate::storage_adapter::MlsStorageAdapter;
7use openmls_rust_crypto::OpenMlsRustCrypto;
8use openmls_traits::OpenMlsProvider;
9use std::sync::Arc;
10
11/// Custom OpenMLS provider that uses our MlsStorageAdapter for persistence.
12#[derive(Clone)]
13pub struct MlsProvider {
14    inner: Arc<OpenMlsRustCrypto>,
15    storage: MlsStorageAdapter,
16}
17
18impl MlsProvider {
19    /// Creates a new MLS provider with the given storage adapter.
20    pub fn new(storage: MlsStorageAdapter) -> Self {
21        Self {
22            inner: Arc::new(OpenMlsRustCrypto::default()),
23            storage,
24        }
25    }
26}
27
28impl OpenMlsProvider for MlsProvider {
29    type CryptoProvider = <OpenMlsRustCrypto as OpenMlsProvider>::CryptoProvider;
30    type RandProvider = <OpenMlsRustCrypto as OpenMlsProvider>::RandProvider;
31    type StorageProvider = MlsStorageAdapter;
32
33    fn crypto(&self) -> &Self::CryptoProvider {
34        self.inner.crypto()
35    }
36
37    fn rand(&self) -> &Self::RandProvider {
38        self.inner.rand()
39    }
40
41    fn storage(&self) -> &Self::StorageProvider {
42        &self.storage
43    }
44}