1#![doc = include_str!("../../README.md")]
7#![cfg_attr(not(test), deny(missing_docs))]
8#![allow(clippy::single_component_path_imports)]
9
10use async_lock::Mutex;
11#[cfg(test)]
12pub use core_crypto_macros::{dispotent, durable, idempotent};
13use std::sync::Arc;
14
15pub use self::error::*;
16
17#[cfg(test)]
18#[macro_use]
19pub mod test_utils;
20mod error;
23
24pub mod mls;
26
27pub mod e2e_identity;
29
30#[cfg(feature = "proteus")]
32pub mod proteus;
33
34mod ephemeral;
35mod group_store;
36mod obfuscate;
37pub mod transaction_context;
38
39mod build_metadata;
40use crate::prelude::MlsCommitBundle;
41pub use build_metadata::{BUILD_METADATA, BuildMetadata};
42
43pub use core_crypto_keystore::DatabaseKey;
44
45pub mod prelude {
47 pub use openmls::{
48 group::{MlsGroup, MlsGroupConfig},
49 prelude::{
50 Ciphersuite as CiphersuiteName, Credential, GroupEpoch, KeyPackage, KeyPackageIn, KeyPackageRef,
51 MlsMessageIn, Node, group_info::VerifiableGroupInfo,
52 },
53 };
54
55 pub use mls_crypto_provider::{EntropySeed, MlsCryptoProvider, RawEntropySeed};
56
57 pub use crate::{
58 CoreCrypto, MlsTransport,
59 e2e_identity::{
60 E2eiEnrollment,
61 device_status::DeviceStatus,
62 identity::{WireIdentity, X509Identity},
63 types::{E2eiAcmeChallenge, E2eiAcmeDirectory, E2eiNewAcmeAuthz, E2eiNewAcmeOrder},
64 },
65 ephemeral::HistorySecret,
66 error::{CryptoboxMigrationError, Error, KeystoreError, LeafError, MlsError, ProteusError, RecursiveError},
67 mls::{
68 ciphersuite::MlsCiphersuite,
69 config::MlsClientConfiguration,
70 conversation::{
71 ConversationId, MlsConversation,
72 commit::MlsCommitBundle,
73 config::{MlsConversationConfiguration, MlsCustomConfiguration, MlsWirePolicy},
74 conversation_guard::decrypt::{MlsBufferedConversationDecryptMessage, MlsConversationDecryptMessage},
75 group_info::{GroupInfoPayload, MlsGroupInfoBundle, MlsGroupInfoEncryptionType, MlsRatchetTreeType},
76 proposal::MlsProposalBundle,
77 welcome::WelcomeBundle,
78 },
79 credential::{typ::MlsCredentialType, x509::CertificateBundle},
80 proposal::{MlsProposal, MlsProposalRef},
81 session::Session,
82 session::id::ClientId,
83 session::identifier::ClientIdentifier,
84 session::key_package::INITIAL_KEYING_MATERIAL_COUNT,
85 session::*,
86 },
87 obfuscate::Obfuscated,
88 transaction_context::e2e_identity::{E2eiDumpedPkiEnv, conversation_state::E2eiConversationState},
89 };
90}
91
92pub enum MlsTransportResponse {
94 Success,
96 Retry,
98 Abort {
100 reason: String,
102 },
103}
104
105#[cfg_attr(target_family = "wasm", async_trait::async_trait(?Send))]
108#[cfg_attr(not(target_family = "wasm"), async_trait::async_trait)]
109pub trait MlsTransport: std::fmt::Debug + Send + Sync {
110 async fn send_commit_bundle(&self, commit_bundle: MlsCommitBundle) -> Result<MlsTransportResponse>;
112 async fn send_message(&self, mls_message: Vec<u8>) -> Result<MlsTransportResponse>;
114}
115
116#[derive(Debug, Clone)]
122pub struct CoreCrypto {
123 mls: mls::session::Session,
124 #[cfg(feature = "proteus")]
125 proteus: Arc<Mutex<Option<proteus::ProteusCentral>>>,
126 #[cfg(not(feature = "proteus"))]
127 #[allow(dead_code)]
128 proteus: (),
129}
130
131impl From<mls::session::Session> for CoreCrypto {
132 fn from(mls: mls::session::Session) -> Self {
133 Self {
134 mls,
135 proteus: Default::default(),
136 }
137 }
138}
139
140impl std::ops::Deref for CoreCrypto {
141 type Target = mls::session::Session;
142
143 fn deref(&self) -> &Self::Target {
144 &self.mls
145 }
146}
147
148impl std::ops::DerefMut for CoreCrypto {
149 fn deref_mut(&mut self) -> &mut Self::Target {
150 &mut self.mls
151 }
152}
153
154impl CoreCrypto {
155 #[inline]
157 pub fn take(self) -> mls::session::Session {
158 self.mls
159 }
160}