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 #[tls_codec(with = "crate::tlspl::bytes")]
92 tree_signature: Vec<u8>,
93 },
94 #[tls_codec(discriminant = "RatchetTreeRepresentation::OutOfBand")]
95 OutOfBand {
96 #[tls_codec(with = "crate::tlspl::bytes")]
97 tree_signature: Vec<u8>,
98 },
99 #[tls_codec(discriminant = "RatchetTreeRepresentation::DistributionService")]
100 DistributionService,
101}
102
103#[derive(
104 Debug,
105 Clone,
106 Copy,
107 PartialEq,
108 Eq,
109 tls_codec::TlsSerialize,
110 tls_codec::TlsDeserialize,
111 tls_codec::TlsSize,
112)]
113#[repr(u8)]
114#[cfg_attr(
115 feature = "serde",
116 derive(serde_repr::Serialize_repr, serde_repr::Deserialize_repr)
117)]
118pub enum RatchetTreePresence {
119 NoRatchetTree = 0x00,
120 Present = 0x01,
121 Removed = 0x02,
122 Added = 0x03,
123}
124
125#[derive(
126 Debug,
127 Clone,
128 PartialEq,
129 Eq,
130 tls_codec::TlsSerialize,
131 tls_codec::TlsDeserialize,
132 tls_codec::TlsSize,
133)]
134#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
135pub struct PartialGroupInfo {
136 pub ratchet_tree_presence: RatchetTreePresence,
137 pub group_info_extensions: Vec<Extension>,
138 #[tls_codec(with = "crate::tlspl::bytes")]
139 pub signature: Vec<u8>,
140}