core_crypto/mls/conversation/
group_info.rs1use openmls::prelude::{group_info::GroupInfo, MlsMessageOut};
2use serde::{Deserialize, Serialize};
3
4use crate::{CryptoResult, MlsError};
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct MlsGroupInfoBundle {
9 pub encryption_type: MlsGroupInfoEncryptionType,
11 pub ratchet_tree_type: MlsRatchetTreeType,
13 pub payload: GroupInfoPayload,
15}
16
17impl MlsGroupInfoBundle {
18 pub(crate) fn try_new_full_plaintext(gi: GroupInfo) -> CryptoResult<Self> {
20 use tls_codec::Serialize as _;
21
22 let payload = MlsMessageOut::from(gi);
23 let payload = payload.tls_serialize_detached().map_err(MlsError::from)?;
24 Ok(Self {
25 encryption_type: MlsGroupInfoEncryptionType::Plaintext,
26 ratchet_tree_type: MlsRatchetTreeType::Full,
27 payload: GroupInfoPayload::Plaintext(payload),
28 })
29 }
30}
31
32#[cfg(test)]
33impl MlsGroupInfoBundle {
34 pub fn get_group_info(self) -> openmls::prelude::group_info::VerifiableGroupInfo {
35 match self.get_payload().extract() {
36 openmls::prelude::MlsMessageInBody::GroupInfo(vgi) => vgi,
37 _ => panic!("This payload should contain a GroupInfo"),
38 }
39 }
40
41 pub fn get_payload(mut self) -> openmls::prelude::MlsMessageIn {
42 use tls_codec::Deserialize as _;
43 match &mut self.payload {
44 GroupInfoPayload::Plaintext(gi) => {
45 openmls::prelude::MlsMessageIn::tls_deserialize(&mut gi.as_slice()).unwrap()
46 }
47 }
48 }
49}
50
51#[derive(Debug, Clone, Copy, Eq, PartialEq, Serialize, Deserialize)]
64#[repr(u8)]
65pub enum MlsGroupInfoEncryptionType {
66 Plaintext = 1,
68 JweEncrypted = 2,
70}
71
72#[derive(Debug, Clone, Copy, Eq, PartialEq, Serialize, Deserialize)]
85#[repr(u8)]
86pub enum MlsRatchetTreeType {
87 Full = 1,
89 Delta = 2,
92 ByRef = 3,
94}
95
96#[derive(Debug, Clone, Serialize, Deserialize)]
98pub enum GroupInfoPayload {
99 Plaintext(Vec<u8>),
101 }
104
105impl GroupInfoPayload {
106 pub fn bytes(self) -> Vec<u8> {
108 match self {
109 GroupInfoPayload::Plaintext(gi) => gi,
110 }
111 }
112}