Skip to main content

mls_spec/drafts/
leaf_operation_intents.rs

1use crate::{
2    SensitiveBytes,
3    defs::{LeafIndex, WireFormat},
4    group::{GroupId, GroupIdRef, LeafNodeRef},
5};
6
7pub const WIRE_FORMAT_MLS_LEAF_OPERATION_INTENT: u16 = 0xFE01;
8static_assertions::const_assert!(
9    *WireFormat::RESERVED_PRIVATE_USE_RANGE.start() <= WIRE_FORMAT_MLS_LEAF_OPERATION_INTENT
10        && WIRE_FORMAT_MLS_LEAF_OPERATION_INTENT <= *WireFormat::RESERVED_PRIVATE_USE_RANGE.end()
11);
12
13#[derive(
14    Debug,
15    Clone,
16    Copy,
17    PartialEq,
18    Eq,
19    tls_codec::TlsSize,
20    tls_codec::TlsSerialize,
21    tls_codec::TlsDeserialize,
22)]
23#[cfg_attr(
24    feature = "serde",
25    derive(serde_repr::Serialize_repr, serde_repr::Deserialize_repr)
26)]
27#[repr(u8)]
28pub enum RemovalMode {
29    Reserved = 0x00,
30    SenderRemovalOnly = 0x01,
31    RemoveAssociatedMember = 0x02,
32}
33
34#[derive(Debug, Clone, Copy, PartialEq, Eq, tls_codec::TlsSize, tls_codec::TlsSerialize)]
35#[cfg_attr(feature = "serde", derive(serde::Serialize))]
36pub struct LeafOperationIntentTBS<'a> {
37    #[tls_codec(with = "crate::tlspl::bytes")]
38    pub group_id: GroupIdRef<'a>,
39    pub sender_index: &'a LeafIndex,
40    pub sender_leaf_ref: &'a LeafNodeRef,
41    pub removal_mode: &'a RemovalMode,
42}
43
44#[derive(
45    Debug,
46    Clone,
47    PartialEq,
48    Eq,
49    tls_codec::TlsSize,
50    tls_codec::TlsSerialize,
51    tls_codec::TlsDeserialize,
52)]
53#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
54pub struct LeafOperationIntent {
55    #[tls_codec(with = "crate::tlspl::bytes")]
56    pub group_id: GroupId,
57    pub sender_index: LeafIndex,
58    pub sender_leaf_ref: LeafNodeRef,
59    pub removal_mode: RemovalMode,
60    pub signature: SensitiveBytes,
61}
62
63impl LeafOperationIntent {
64    pub fn to_tbs(&self) -> LeafOperationIntentTBS<'_> {
65        LeafOperationIntentTBS {
66            group_id: &self.group_id,
67            sender_index: &self.sender_index,
68            sender_leaf_ref: &self.sender_leaf_ref,
69            removal_mode: &self.removal_mode,
70        }
71    }
72}
73
74#[derive(
75    Debug,
76    Clone,
77    PartialEq,
78    Eq,
79    tls_codec::TlsSize,
80    tls_codec::TlsSerialize,
81    tls_codec::TlsDeserialize,
82)]
83#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
84pub struct LeafOperationProposal {
85    pub intent: LeafOperationIntent,
86}