Skip to main content

mls_spec/drafts/
apq_mls_combiner.rs

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)] // TLSPL `bool` is a u8, here we use an enum to make it a bit nicer to use
28pub 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}