Skip to main content

openmls/schedule/
errors.rs

1//! Key schedule errors.
2
3use openmls_traits::types::CryptoError;
4use thiserror::Error;
5
6use crate::{
7    error::LibraryError,
8    schedule::psk::{PskType, ResumptionPskUsage},
9};
10
11/// PSK secret error
12#[derive(Error, Debug, PartialEq, Clone)]
13pub enum PskError {
14    /// See [`LibraryError`] for more details.
15    #[error(transparent)]
16    LibraryError(#[from] LibraryError),
17    /// More than 2^16 PSKs were provided.
18    #[error("More than 2^16 PSKs were provided.")]
19    TooManyKeys,
20    /// The PSK could not be found in the store.
21    #[error("The PSK could not be found in the store.")]
22    KeyNotFound,
23    /// Failed to write PSK into storage.
24    #[error("Failed to write PSK storage.")]
25    Storage,
26    /// Type mismatch.
27    #[error("Type mismatch. Expected {allowed:?}, got {got:?}.")]
28    TypeMismatch {
29        /// Allowed PSK types.
30        allowed: Vec<PskType>,
31        /// Got PSK type.
32        got: PskType,
33    },
34    /// Usage mismatch.
35    #[error("Usage mismatch. Expected either of `{allowed:?}`, got `{got:?}`.")]
36    UsageMismatch {
37        /// Allowed PSK types.
38        allowed: Vec<ResumptionPskUsage>,
39        /// Got PSK type.
40        got: ResumptionPskUsage,
41    },
42    /// Usage conflict.
43    #[error("Usage conflict. First found `{first:?}`, now additionally found `{second:?}`.")]
44    UsageConflict {
45        /// First found PSK type.
46        first: ResumptionPskUsage,
47        /// Second found PSK type.
48        second: ResumptionPskUsage,
49    },
50    /// Usage duplicate.
51    #[error("Usage duplicate. Found two resumption PSKs with usage `{usage:?}`.")]
52    UsageDuplicate {
53        /// Resumption usage found in duplicate.
54        usage: ResumptionPskUsage,
55    },
56    /// Nonce length mismatch.
57    #[error("Nonce length mismatch. Expected either of `{expected:?}`, got `{got:?}`.")]
58    NonceLengthMismatch {
59        /// Expected nonce length.
60        expected: usize,
61        /// Got nonce length.
62        got: usize,
63    },
64}
65
66// === Crate ===
67
68/// Key schedule state error
69#[derive(Error, Debug, PartialEq, Clone)]
70pub(crate) enum ErrorState {
71    /// Expected to be in initial state.
72    #[error("Expected to be in initial state.")]
73    Init,
74    /// Expected to be in epoch state.
75    #[error("Expected to be in epoch state.")]
76    Context,
77}
78
79/// Key schedule error
80#[derive(Error, Debug, PartialEq, Clone)]
81pub(crate) enum KeyScheduleError {
82    /// See [`LibraryError`] for more details.
83    #[error(transparent)]
84    LibraryError(#[from] LibraryError),
85    /// See [`ErrorState`] for more details.
86    #[error(transparent)]
87    InvalidState(#[from] ErrorState),
88    /// See [`CryptoError`] for more details.
89    #[error(transparent)]
90    CryptoError(#[from] CryptoError),
91}
92
93#[cfg(any(feature = "test-utils", test))]
94/// KeySchedule test vector error
95#[derive(Error, Debug, PartialEq, Eq, Clone)]
96pub enum KsTestVectorError {
97    /// The computed joiner secret doesn't match the one in the test vector.
98    #[error("The computed joiner secret doesn't match the one in the test vector.")]
99    JoinerSecretMismatch,
100    /// The computed welcome secret doesn't match the one in the test vector.
101    #[error("The computed welcome secret doesn't match the one in the test vector.")]
102    WelcomeSecretMismatch,
103    /// The computed init secret doesn't match the one in the test vector.
104    #[error("The computed init secret doesn't match the one in the test vector.")]
105    InitSecretMismatch,
106    /// The group context doesn't match the one in the test vector.
107    #[error("The group context doesn't match the one in the test vector.")]
108    GroupContextMismatch,
109    /// The computed sender data secret doesn't match the one in the test vector.
110    #[error("The computed sender data secret doesn't match the one in the test vector.")]
111    SenderDataSecretMismatch,
112    /// The computed encryption secret doesn't match the one in the test vector.
113    #[error("The computed encryption secret doesn't match the one in the test vector.")]
114    EncryptionSecretMismatch,
115    /// The computed exporter secret doesn't match the one in the test vector.
116    #[error("The computed exporter secret doesn't match the one in the test vector.")]
117    ExporterSecretMismatch,
118    /// The computed epoch authenticator doesn't match the one in the test vector.
119    #[error("The computed epoch authenticator doesn't match the one in the test vector.")]
120    EpochAuthenticatorMismatch,
121    /// The computed external secret doesn't match the one in the test vector.
122    #[error("The computed external secret doesn't match the one in the test vector.")]
123    ExternalSecretMismatch,
124    /// The computed confirmation key doesn't match the one in the test vector.
125    #[error("The computed confirmation key doesn't match the one in the test vector.")]
126    ConfirmationKeyMismatch,
127    /// The computed membership key doesn't match the one in the test vector.
128    #[error("The computed membership key doesn't match the one in the test vector.")]
129    MembershipKeyMismatch,
130    /// The computed resumption psk doesn't match the one in the test vector.
131    #[error("The computed resumption psk doesn't match the one in the test vector.")]
132    ResumptionPskMismatch,
133    /// The computed external public key doesn't match the one in the test vector.
134    #[error("The computed external public key doesn't match the one in the test vector.")]
135    ExternalPubMismatch,
136    /// The computed exporter secret doesn't match the on ein the test vector.
137    #[error("The computed exporter secret doesn't match the on ein the test vector.")]
138    ExporterMismatch,
139}