Skip to main content

mls_spec/drafts/
ratchet_tree_options.rs

1use crate::{group::extensions::Extension, tree::RatchetTree};
2
3#[derive(
4    Debug,
5    Clone,
6    PartialEq,
7    Eq,
8    Hash,
9    tls_codec::TlsSerialize,
10    tls_codec::TlsDeserialize,
11    tls_codec::TlsSize,
12)]
13#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14pub struct Domain {
15    #[tls_codec(with = "crate::tlspl::string")]
16    pub domain: String,
17}
18
19#[derive(
20    Debug,
21    Clone,
22    PartialEq,
23    Eq,
24    Hash,
25    tls_codec::TlsSerialize,
26    tls_codec::TlsDeserialize,
27    tls_codec::TlsSize,
28)]
29#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
30pub struct DomainList {
31    pub domains: Vec<Domain>,
32}
33
34#[derive(
35    Debug,
36    Clone,
37    PartialEq,
38    Eq,
39    Hash,
40    tls_codec::TlsSerialize,
41    tls_codec::TlsDeserialize,
42    tls_codec::TlsSize,
43)]
44#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
45#[repr(transparent)]
46pub struct RatchetTreeSourceDomainsExtension(pub DomainList);
47
48pub const EXTENSION_RATCHET_TREE_SOURCE_DOMAINS: u16 = 0xF4C0;
49
50#[derive(
51    Debug,
52    Clone,
53    Copy,
54    PartialEq,
55    Eq,
56    tls_codec::TlsSerialize,
57    tls_codec::TlsDeserialize,
58    tls_codec::TlsSize,
59)]
60#[repr(u8)]
61#[cfg_attr(
62    feature = "serde",
63    derive(serde_repr::Serialize_repr, serde_repr::Deserialize_repr)
64)]
65pub enum RatchetTreeRepresentation {
66    Reserved = 0x00,
67    Full = 0x01,
68    HttpsUri = 0x02,
69    OutOfBand = 0x03,
70    DistributionService = 0x04,
71}
72
73#[derive(
74    Debug,
75    Clone,
76    PartialEq,
77    Eq,
78    tls_codec::TlsSerialize,
79    tls_codec::TlsDeserialize,
80    tls_codec::TlsSize,
81)]
82#[repr(u8)]
83#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
84pub enum RatchetTreeOption {
85    #[tls_codec(discriminant = "RatchetTreeRepresentation::Full")]
86    Full { ratchet_tree: RatchetTree },
87    #[tls_codec(discriminant = "RatchetTreeRepresentation::HttpsUri")]
88    HttpsUri {
89        #[tls_codec(with = "crate::tlspl::string")]
90        ratchet_tree_url: String,
91    },
92    #[tls_codec(discriminant = "RatchetTreeRepresentation::OutOfBand")]
93    OutOfBand,
94    #[tls_codec(discriminant = "RatchetTreeRepresentation::DistributionService")]
95    DistributionService,
96}
97
98#[derive(
99    Debug,
100    Clone,
101    Copy,
102    PartialEq,
103    Eq,
104    tls_codec::TlsSerialize,
105    tls_codec::TlsDeserialize,
106    tls_codec::TlsSize,
107)]
108#[repr(u8)]
109#[cfg_attr(
110    feature = "serde",
111    derive(serde_repr::Serialize_repr, serde_repr::Deserialize_repr)
112)]
113pub enum RatchetTreePresence {
114    NoRatchetTree = 0x00,
115    Present = 0x01,
116    Removed = 0x02,
117    Added = 0x03,
118}
119
120#[derive(
121    Debug,
122    Clone,
123    PartialEq,
124    Eq,
125    tls_codec::TlsSerialize,
126    tls_codec::TlsDeserialize,
127    tls_codec::TlsSize,
128)]
129#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
130pub struct PartialGroupInfo {
131    pub ratchet_tree_presence: RatchetTreePresence,
132    pub group_info_extensions: Vec<Extension>,
133    #[tls_codec(with = "crate::tlspl::bytes")]
134    pub signature: Vec<u8>,
135}