mls_spec/drafts/
mls_light.rs

1use crate::{
2    SensitiveBytes, defs::LeafIndex, group::welcome::Welcome, messages::MlsMessage, tree::TreeNode,
3};
4
5///
6/// ```notrust,ignore
7/// struct {
8///     opaque hash_value;
9/// } CopathHash;
10/// ```
11///
12#[derive(
13    Debug,
14    Clone,
15    PartialEq,
16    Eq,
17    Default,
18    tls_codec::TlsSize,
19    tls_codec::TlsDeserialize,
20    tls_codec::TlsSerialize,
21)]
22#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23pub struct CopathHash {
24    pub hash_value: SensitiveBytes,
25}
26
27///
28/// ```notrust,ignore
29/// struct {
30///   uint32 leaf_index;
31///   uint32 n_leaves;
32///   optional<Node> direct_path_nodes<V>;
33///   CopathHash copath_hashes<V>;
34/// } MembershipProof;
35/// ```
36///
37#[derive(
38    Debug,
39    Clone,
40    PartialEq,
41    Eq,
42    Default,
43    tls_codec::TlsSize,
44    tls_codec::TlsDeserialize,
45    tls_codec::TlsSerialize,
46)]
47#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
48pub struct MembershipProof {
49    pub leaf_index: LeafIndex,
50    pub n_leaves: u32,
51    pub direct_path_nodes: Vec<Option<TreeNode>>,
52    pub copath_hashes: Vec<CopathHash>,
53}
54
55///
56/// ```notrust,ignore
57/// struct {
58///     T message;
59///     MembershipProof sender_membership_proof;
60/// } SenderAuthenticatedMessage;
61/// ```
62///
63#[derive(
64    Debug,
65    Clone,
66    PartialEq,
67    Eq,
68    tls_codec::TlsSize,
69    tls_codec::TlsDeserialize,
70    tls_codec::TlsSerialize,
71)]
72#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
73pub struct SenderAuthenticatedMessage<T: tls_codec::Serialize + tls_codec::Deserialize> {
74    pub message: T,
75    pub sender_membership_proof: MembershipProof,
76}
77
78///
79/// ```notrust,ignore
80/// struct {
81///     SenderAuthenticated<Welcome> welcome;
82///     MembershipProof joiner_membership_proof;
83/// } AnnotatedWelcome;
84/// ```
85///
86#[derive(
87    Debug,
88    Clone,
89    PartialEq,
90    Eq,
91    tls_codec::TlsSize,
92    tls_codec::TlsDeserialize,
93    tls_codec::TlsSerialize,
94)]
95#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
96pub struct AnnotatedWelcome {
97    pub welcome: SenderAuthenticatedMessage<Welcome>,
98    pub joiner_membership_proof: MembershipProof,
99}
100
101///
102/// ```notrust,ignore
103/// struct {
104///     MLSMessage commit;
105///     optional<MembershipProof> sender_membership_proof;
106///
107///     opaque tree_hash_after<V>;
108///     optional<uint32> resolution_index;
109///
110///     MembershipProof sender_membership_proof_after;
111///     MembershipProof receiver_membership_proof_after;
112/// } AnnotatedCommit;
113/// ```
114///
115#[derive(
116    Debug,
117    Clone,
118    PartialEq,
119    Eq,
120    tls_codec::TlsSize,
121    tls_codec::TlsDeserialize,
122    tls_codec::TlsSerialize,
123)]
124#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
125pub struct AnnotatedCommit {
126    pub commit: MlsMessage,
127    pub sender_membership_proof: Option<MembershipProof>,
128    pub tree_hash_after: SensitiveBytes,
129    pub resolution_index: Option<u32>,
130    pub sender_membership_proof_after: MembershipProof,
131    pub receiver_membership_proof_after: MembershipProof,
132}