Skip to main content

de_mls/mls_crypto/
error.rs

1//! Error types for MLS operations.
2
3use openmls::{
4    error::LibraryError,
5    group::{NewGroupError, ProposeRemoveMemberError, WelcomeError},
6    prelude::{
7        CommitToPendingProposalsError, CreateMessageError, KeyPackageNewError, MergeCommitError,
8        MergePendingCommitError, ProcessMessageError, ProposeAddMemberError,
9    },
10};
11use openmls_rust_crypto::MemoryStorageError;
12use openmls_traits::types::CryptoError;
13
14/// Result type alias for MLS operations.
15pub type Result<T> = std::result::Result<T, MlsError>;
16
17/// Storage operation errors.
18#[derive(Debug, thiserror::Error)]
19pub enum StorageError {
20    #[error("Storage I/O error: {0}")]
21    Io(String),
22
23    #[error("Storage serialization error: {0}")]
24    Serialization(String),
25
26    #[error("Storage lock error: {0}")]
27    Lock(String),
28
29    #[error("Storage backend error: {0}")]
30    Backend(String),
31}
32
33/// Identity-specific errors.
34#[derive(Debug, thiserror::Error)]
35pub enum IdentityError {
36    #[error("Identity not initialized")]
37    IdentityNotFound,
38
39    #[error("Identity already initialized")]
40    AlreadyInitialized,
41
42    #[error(transparent)]
43    UnableToCreateKeyPackage(#[from] KeyPackageNewError),
44
45    #[error("Invalid hash reference: {0}")]
46    InvalidHashRef(#[from] LibraryError),
47
48    #[error("Unable to create new signer: {0}")]
49    UnableToCreateSigner(#[from] CryptoError),
50
51    #[error("Unable to save signature key: {0}")]
52    UnableToSaveSignatureKey(#[from] MemoryStorageError),
53
54    #[error("Invalid JSON: {0}")]
55    InvalidJson(#[from] serde_json::Error),
56
57    #[error("Invalid wallet address: {0}")]
58    InvalidWalletAddress(String),
59}
60
61/// MLS service operation errors.
62#[derive(Debug, thiserror::Error)]
63pub enum MlsServiceError {
64    #[error("Failed to deserialize MLS message: {0}")]
65    MlsMessageInDeserialize(#[from] openmls::prelude::Error),
66
67    #[error("Failed to convert to protocol message: {0}")]
68    ProtocolMessage(#[from] openmls::framing::errors::ProtocolMessageError),
69
70    #[error("Failed to process MLS message: {0}")]
71    ProcessMessage(#[from] ProcessMessageError<MemoryStorageError>),
72
73    #[error("Failed to create MLS message: {0}")]
74    CreateMessage(#[from] CreateMessageError),
75
76    #[error("Failed to merge staged commit: {0}")]
77    MergeCommit(#[from] MergeCommitError<MemoryStorageError>),
78
79    #[error("Failed to merge pending commit: {0}")]
80    MergePendingCommit(#[from] MergePendingCommitError<MemoryStorageError>),
81
82    #[error("Failed to commit to pending proposals: {0}")]
83    CommitToPendingProposals(#[from] CommitToPendingProposalsError<MemoryStorageError>),
84
85    #[error("Failed to add member proposal: {0}")]
86    ProposeAddMember(#[from] ProposeAddMemberError<MemoryStorageError>),
87
88    #[error("Failed to remove member proposal: {0}")]
89    ProposeRemoveMember(#[from] ProposeRemoveMemberError<MemoryStorageError>),
90
91    #[error("Failed to create MLS group: {0}")]
92    NewGroup(#[from] NewGroupError<MemoryStorageError>),
93
94    #[error("Failed to join MLS group: {0}")]
95    Welcome(#[from] WelcomeError<MemoryStorageError>),
96
97    #[error("Failed to store pending proposal: {0}")]
98    StorePendingProposal(#[from] MemoryStorageError),
99
100    #[error("Failed to serialize MLS message: {0}")]
101    MlsMessage(#[from] openmls::framing::errors::MlsMessageError),
102
103    #[error("Invalid key package bytes: {0}")]
104    InvalidKeyPackage(#[from] serde_json::Error),
105
106    #[error("Unexpected MLS message type")]
107    UnexpectedMessageType,
108
109    #[error("Group not found: {0}")]
110    GroupNotFound(String),
111
112    #[error("Group still active")]
113    GroupStillActive,
114
115    #[error("Welcome message not for this user")]
116    WelcomeNotForUs,
117}
118
119/// Unified MLS error type.
120#[derive(Debug, thiserror::Error)]
121pub enum MlsError {
122    #[error(transparent)]
123    Identity(#[from] IdentityError),
124
125    #[error(transparent)]
126    Service(#[from] MlsServiceError),
127
128    #[error(transparent)]
129    Storage(#[from] StorageError),
130}
131
132// Convenience From impls for MlsError
133impl From<KeyPackageNewError> for MlsError {
134    fn from(e: KeyPackageNewError) -> Self {
135        MlsError::Identity(IdentityError::UnableToCreateKeyPackage(e))
136    }
137}
138
139impl From<CryptoError> for MlsError {
140    fn from(e: CryptoError) -> Self {
141        MlsError::Identity(IdentityError::UnableToCreateSigner(e))
142    }
143}
144
145impl From<MemoryStorageError> for MlsError {
146    fn from(e: MemoryStorageError) -> Self {
147        MlsError::Service(MlsServiceError::StorePendingProposal(e))
148    }
149}
150
151impl From<NewGroupError<MemoryStorageError>> for MlsError {
152    fn from(e: NewGroupError<MemoryStorageError>) -> Self {
153        MlsError::Service(MlsServiceError::NewGroup(e))
154    }
155}
156
157impl From<WelcomeError<MemoryStorageError>> for MlsError {
158    fn from(e: WelcomeError<MemoryStorageError>) -> Self {
159        MlsError::Service(MlsServiceError::Welcome(e))
160    }
161}
162
163impl From<ProcessMessageError<MemoryStorageError>> for MlsError {
164    fn from(e: ProcessMessageError<MemoryStorageError>) -> Self {
165        MlsError::Service(MlsServiceError::ProcessMessage(e))
166    }
167}
168
169impl From<CreateMessageError> for MlsError {
170    fn from(e: CreateMessageError) -> Self {
171        MlsError::Service(MlsServiceError::CreateMessage(e))
172    }
173}
174
175impl From<MergeCommitError<MemoryStorageError>> for MlsError {
176    fn from(e: MergeCommitError<MemoryStorageError>) -> Self {
177        MlsError::Service(MlsServiceError::MergeCommit(e))
178    }
179}
180
181impl From<ProposeAddMemberError<MemoryStorageError>> for MlsError {
182    fn from(e: ProposeAddMemberError<MemoryStorageError>) -> Self {
183        MlsError::Service(MlsServiceError::ProposeAddMember(e))
184    }
185}
186
187impl From<ProposeRemoveMemberError<MemoryStorageError>> for MlsError {
188    fn from(e: ProposeRemoveMemberError<MemoryStorageError>) -> Self {
189        MlsError::Service(MlsServiceError::ProposeRemoveMember(e))
190    }
191}
192
193impl From<CommitToPendingProposalsError<MemoryStorageError>> for MlsError {
194    fn from(e: CommitToPendingProposalsError<MemoryStorageError>) -> Self {
195        MlsError::Service(MlsServiceError::CommitToPendingProposals(e))
196    }
197}
198
199impl From<MergePendingCommitError<MemoryStorageError>> for MlsError {
200    fn from(e: MergePendingCommitError<MemoryStorageError>) -> Self {
201        MlsError::Service(MlsServiceError::MergePendingCommit(e))
202    }
203}
204
205impl From<openmls::prelude::Error> for MlsError {
206    fn from(e: openmls::prelude::Error) -> Self {
207        MlsError::Service(MlsServiceError::MlsMessageInDeserialize(e))
208    }
209}
210
211impl From<openmls::framing::errors::ProtocolMessageError> for MlsError {
212    fn from(e: openmls::framing::errors::ProtocolMessageError) -> Self {
213        MlsError::Service(MlsServiceError::ProtocolMessage(e))
214    }
215}
216
217impl From<openmls::framing::errors::MlsMessageError> for MlsError {
218    fn from(e: openmls::framing::errors::MlsMessageError) -> Self {
219        MlsError::Service(MlsServiceError::MlsMessage(e))
220    }
221}
222
223impl From<openmls::error::LibraryError> for MlsError {
224    fn from(e: openmls::error::LibraryError) -> Self {
225        MlsError::Identity(IdentityError::InvalidHashRef(e))
226    }
227}