1use std::fmt::Display;
6
7use serde::{Deserialize, Serialize};
8use tls_codec::*;
9
10use crate::extensions::*;
11use openmls_traits::random::OpenMlsRand;
12
13#[cfg(test)]
14use crate::ciphersuite::*;
15#[cfg(test)]
16use crate::utils::*;
17
18pub(crate) mod errors;
20pub(crate) mod mls_group;
21pub(crate) mod public_group;
22
23pub use errors::*;
25pub use group_context::GroupContext;
26pub use mls_group::builder::*;
27pub use mls_group::commit_builder::*;
28pub use mls_group::config::*;
29pub use mls_group::membership::*;
30pub use mls_group::proposal_store::*;
31pub use mls_group::staged_commit::StagedCommit;
32pub use mls_group::{Member, *};
33pub use public_group::*;
34
35#[cfg(feature = "fork-resolution")]
37mod fork_resolution;
38mod group_context;
39
40#[cfg(any(feature = "test-utils", test))]
42pub(crate) mod tests_and_kats;
43
44#[derive(
46 Clone,
47 Debug,
48 PartialEq,
49 Eq,
50 PartialOrd,
51 Ord,
52 Hash,
53 Deserialize,
54 Serialize,
55 TlsDeserialize,
56 TlsDeserializeBytes,
57 TlsSerialize,
58 TlsSize,
59)]
60pub struct GroupId {
61 value: VLBytes,
62}
63
64impl GroupId {
65 pub fn random(rng: &impl OpenMlsRand) -> Self {
69 Self {
70 value: rng.random_vec(16).expect("Not enough randomness.").into(),
71 }
72 }
73
74 pub fn from_slice(bytes: &[u8]) -> Self {
78 GroupId {
79 value: bytes.into(),
80 }
81 }
82
83 pub fn as_slice(&self) -> &[u8] {
85 self.value.as_slice()
86 }
87
88 pub fn to_vec(&self) -> Vec<u8> {
90 self.value.clone().into()
91 }
92}
93
94#[derive(
97 Clone,
98 Copy,
99 Debug,
100 PartialEq,
101 Eq,
102 PartialOrd,
103 Ord,
104 Hash,
105 Deserialize,
106 Serialize,
107 TlsDeserialize,
108 TlsDeserializeBytes,
109 TlsSerialize,
110 TlsSize,
111)]
112pub struct GroupEpoch(u64);
113
114impl GroupEpoch {
115 pub(crate) fn increment(&mut self) {
117 self.0 += 1;
118 }
119
120 pub fn as_u64(&self) -> u64 {
122 self.0
123 }
124}
125
126impl From<u64> for GroupEpoch {
127 fn from(val: u64) -> Self {
128 Self(val)
129 }
130}
131
132impl Display for GroupEpoch {
133 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
134 f.write_fmt(format_args!("{}", self.0))
135 }
136}