1use crate::{
2 defs::{CiphersuiteId, Epoch},
3 group::{GroupId, group_info::GroupInfo, welcome::Welcome},
4 key_package::KeyPackage,
5 messages::{PrivateMessage, PublicMessage},
6};
7
8use super::mls_extensions::safe_application::{Component, ComponentId};
9
10pub const COMPONENT_ID: ComponentId = 0x0006;
11
12#[derive(
13 Debug,
14 Clone,
15 Copy,
16 PartialEq,
17 Eq,
18 Default,
19 tls_codec::TlsSize,
20 tls_codec::TlsDeserialize,
21 tls_codec::TlsSerialize,
22)]
23#[cfg_attr(
24 feature = "serde",
25 derive(serde_repr::Serialize_repr, serde_repr::Deserialize_repr)
26)]
27#[repr(u8)] pub enum APQMode {
29 #[default]
30 ConfidentialityOnly = 0x00,
31 ConfidentialityAndAuthenticity = 0x01,
32}
33
34#[derive(
35 Debug,
36 Clone,
37 PartialEq,
38 Eq,
39 Default,
40 tls_codec::TlsSize,
41 tls_codec::TlsDeserialize,
42 tls_codec::TlsSerialize,
43)]
44#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
45pub struct APQInfo {
46 #[tls_codec(with = "crate::tlspl::bytes")]
47 pub traditional_session_group_id: GroupId,
48 #[tls_codec(with = "crate::tlspl::bytes")]
49 pub post_quantum_session_group_id: GroupId,
50 pub mode: APQMode,
51 pub traditional_cipher_suite: CiphersuiteId,
52 pub post_quantum_cipher_suite: CiphersuiteId,
53 pub traditional_epoch: Epoch,
54 pub post_quantum_epoch: Epoch,
55}
56
57impl Component for APQInfo {
58 fn component_id() -> ComponentId {
59 COMPONENT_ID
60 }
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))]
73#[repr(u8)]
74pub enum APQInfoUpdateData {
75 #[tls_codec(discriminant = 0x00)]
76 FullUpdate { new_apq_info: APQInfo },
77 #[tls_codec(discriminant = 0x01)]
78 NewTraditionalEpoch { epoch: Epoch },
79 #[tls_codec(discriminant = 0x02)]
80 NewPostQuantumEpoch { epoch: Epoch },
81}
82
83#[derive(
84 Debug,
85 Clone,
86 PartialEq,
87 Eq,
88 tls_codec::TlsSize,
89 tls_codec::TlsDeserialize,
90 tls_codec::TlsSerialize,
91)]
92#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
93pub struct APQKeyPackage {
94 pub traditional_key_package: KeyPackage,
95 pub post_quantum_key_package: KeyPackage,
96}
97
98#[derive(
99 Debug,
100 Clone,
101 PartialEq,
102 Eq,
103 tls_codec::TlsSize,
104 tls_codec::TlsDeserialize,
105 tls_codec::TlsSerialize,
106)]
107#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
108pub struct APQPublicMessage {
109 pub traditional_message: PublicMessage,
110 pub post_quantum_message: PublicMessage,
111}
112
113#[derive(
114 Debug,
115 Clone,
116 PartialEq,
117 Eq,
118 tls_codec::TlsSize,
119 tls_codec::TlsDeserialize,
120 tls_codec::TlsSerialize,
121)]
122#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
123pub struct APQPrivateMessage {
124 pub traditional_message: PrivateMessage,
125 pub post_quantum_message: PrivateMessage,
126}
127
128#[derive(
129 Debug,
130 Clone,
131 PartialEq,
132 Eq,
133 tls_codec::TlsSize,
134 tls_codec::TlsDeserialize,
135 tls_codec::TlsSerialize,
136)]
137#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
138pub struct APQWelcome {
139 pub traditional_welcome: Welcome,
140 pub post_quantum_welcome: Welcome,
141}
142
143#[derive(
144 Debug,
145 Clone,
146 PartialEq,
147 Eq,
148 tls_codec::TlsSize,
149 tls_codec::TlsDeserialize,
150 tls_codec::TlsSerialize,
151)]
152#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
153pub struct APQGroupInfo {
154 pub traditional_group_info: GroupInfo,
155 pub post_quantum_group_info: GroupInfo,
156}
157
158#[cfg(feature = "draft-mahy-mls-ratchet-tree-options")]
159#[derive(
160 Debug,
161 Clone,
162 PartialEq,
163 Eq,
164 tls_codec::TlsSize,
165 tls_codec::TlsDeserialize,
166 tls_codec::TlsSerialize,
167)]
168#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
169pub struct APQPartialGroupInfo {
170 pub traditional_group_info: crate::drafts::ratchet_tree_options::PartialGroupInfo,
171 pub post_quantum_group_info: crate::drafts::ratchet_tree_options::PartialGroupInfo,
172}