#![forbid(unsafe_code)]
#![warn(missing_docs)]
#![warn(rustdoc::bare_urls)]
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
#![doc = include_str!("../README.md")]
use nrc_mls_storage::NostrMlsStorageProvider;
use openmls::prelude::*;
use openmls_rust_crypto::RustCrypto;
mod constant;
pub mod error;
pub mod extension;
pub mod groups;
pub mod key_packages;
pub mod messages;
pub mod prelude;
#[cfg(test)]
pub mod test_util;
mod util;
pub mod welcomes;
use self::constant::{DEFAULT_CIPHERSUITE, REQUIRED_EXTENSIONS};
pub use self::error::Error;
#[derive(Debug)]
pub struct NostrMls<Storage>
where
Storage: NostrMlsStorageProvider,
{
pub ciphersuite: Ciphersuite,
pub extensions: Vec<ExtensionType>,
pub provider: NostrMlsProvider<Storage>,
}
#[derive(Debug)]
pub struct NostrMlsProvider<Storage>
where
Storage: NostrMlsStorageProvider,
{
crypto: RustCrypto,
storage: Storage,
}
impl<Storage> OpenMlsProvider for NostrMlsProvider<Storage>
where
Storage: NostrMlsStorageProvider,
{
type CryptoProvider = RustCrypto;
type RandProvider = RustCrypto;
type StorageProvider = Storage::OpenMlsStorageProvider;
fn storage(&self) -> &Self::StorageProvider {
self.storage.openmls_storage()
}
fn crypto(&self) -> &Self::CryptoProvider {
&self.crypto
}
fn rand(&self) -> &Self::RandProvider {
&self.crypto
}
}
impl<Storage> NostrMls<Storage>
where
Storage: NostrMlsStorageProvider,
{
pub fn new(storage: Storage) -> Self {
Self {
ciphersuite: DEFAULT_CIPHERSUITE,
extensions: REQUIRED_EXTENSIONS.to_vec(),
provider: NostrMlsProvider {
crypto: RustCrypto::default(),
storage,
},
}
}
#[inline]
pub(crate) fn capabilities(&self) -> Capabilities {
Capabilities::new(
None,
Some(&[self.ciphersuite]),
Some(&self.extensions),
None,
None,
)
}
#[inline]
pub(crate) fn required_capabilities_extension(&self) -> Extension {
Extension::RequiredCapabilities(RequiredCapabilitiesExtension::new(
&self.extensions,
&[],
&[],
))
}
pub(crate) fn ciphersuite_value(&self) -> u16 {
self.ciphersuite.into()
}
pub(crate) fn extensions_value(&self) -> String {
self.extensions
.iter()
.map(|e| format!("{:?}", e))
.collect::<Vec<String>>()
.join(",")
}
pub(crate) fn storage(&self) -> &Storage {
&self.provider.storage
}
}
#[cfg(test)]
pub mod tests {
use nostr_mls_memory_storage::NostrMlsMemoryStorage;
use super::*;
pub fn create_test_nostr_mls() -> NostrMls<NostrMlsMemoryStorage> {
NostrMls::new(NostrMlsMemoryStorage::default())
}
}