core_crypto/mls/conversation/
group_info.rs1use openmls::prelude::{MlsMessageOut, group_info::GroupInfo};
2use serde::{Deserialize, Serialize};
3
4use super::{Error, Result};
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) -> Result<Self> {
20 use tls_codec::Serialize as _;
21
22 let payload = MlsMessageOut::from(gi);
23 let payload = payload
24 .tls_serialize_detached()
25 .map_err(Error::tls_serialize("unencrypted mls message"))?;
26 Ok(Self {
27 encryption_type: MlsGroupInfoEncryptionType::Plaintext,
28 ratchet_tree_type: MlsRatchetTreeType::Full,
29 payload: GroupInfoPayload::Plaintext(payload),
30 })
31 }
32}
33
34#[cfg(test)]
35impl MlsGroupInfoBundle {
36 #![allow(missing_docs)]
38
39 pub fn get_group_info(self) -> openmls::prelude::group_info::VerifiableGroupInfo {
40 match self.get_payload().extract() {
41 openmls::prelude::MlsMessageInBody::GroupInfo(vgi) => vgi,
42 _ => panic!("This payload should contain a GroupInfo"),
43 }
44 }
45
46 pub fn get_payload(mut self) -> openmls::prelude::MlsMessageIn {
47 use tls_codec::Deserialize as _;
48 match &mut self.payload {
49 GroupInfoPayload::Plaintext(gi) => {
50 openmls::prelude::MlsMessageIn::tls_deserialize(&mut gi.as_slice()).unwrap()
51 }
52 }
53 }
54}
55
56#[derive(Debug, Clone, Copy, Eq, PartialEq, Serialize, Deserialize)]
69#[repr(u8)]
70pub enum MlsGroupInfoEncryptionType {
71 Plaintext = 1,
73 JweEncrypted = 2,
75}
76
77#[derive(Debug, Clone, Copy, Eq, PartialEq, Serialize, Deserialize)]
90#[repr(u8)]
91pub enum MlsRatchetTreeType {
92 Full = 1,
94 Delta = 2,
97 ByRef = 3,
99}
100
101#[derive(Debug, Clone, Serialize, Deserialize)]
103pub enum GroupInfoPayload {
104 Plaintext(Vec<u8>),
106 }
109
110impl GroupInfoPayload {
111 pub fn bytes(self) -> Vec<u8> {
113 match self {
114 GroupInfoPayload::Plaintext(gi) => gi,
115 }
116 }
117}