mls_spec/drafts/
hpq_mls_combiner.rs

1use crate::{
2    defs::{CiphersuiteId, Epoch},
3    group::GroupId,
4};
5
6use super::mls_extensions::safe_application::{Component, ComponentId};
7
8pub const COMPONENT_ID: ComponentId = 0xFCBE_0000; // TODO: Waiting for IANA registration
9static_assertions::const_assert!(
10    *super::mls_extensions::COMPONENT_RESERVED_PRIVATE_RANGE.start() <= COMPONENT_ID
11        && COMPONENT_ID <= *super::mls_extensions::COMPONENT_RESERVED_PRIVATE_RANGE.end()
12);
13
14#[derive(
15    Debug,
16    Clone,
17    Copy,
18    PartialEq,
19    Eq,
20    Default,
21    tls_codec::TlsSize,
22    tls_codec::TlsDeserialize,
23    tls_codec::TlsSerialize,
24)]
25#[cfg_attr(
26    feature = "serde",
27    derive(serde_repr::Serialize_repr, serde_repr::Deserialize_repr)
28)]
29#[repr(u8)]
30pub enum HpqMode {
31    #[default]
32    ConfidentialityOnly = 0,
33    ConfidentialityAndAuthenticity = 1,
34}
35
36#[derive(
37    Debug,
38    Clone,
39    PartialEq,
40    Eq,
41    Default,
42    tls_codec::TlsSize,
43    tls_codec::TlsDeserialize,
44    tls_codec::TlsSerialize,
45)]
46#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
47pub struct HpqMlsInfo {
48    #[tls_codec(with = "crate::tlspl::bytes")]
49    pub traditional_session_group_id: GroupId,
50    #[tls_codec(with = "crate::tlspl::bytes")]
51    pub post_quantum_session_group_id: GroupId,
52    pub mode: HpqMode,
53    pub traditional_cipher_suite: CiphersuiteId,
54    pub post_quantum_cipher_suite: CiphersuiteId,
55    pub traditional_epoch: Epoch,
56    pub post_quantum_epoch: Epoch,
57}
58
59impl Component for HpqMlsInfo {
60    fn component_id() -> ComponentId {
61        COMPONENT_ID
62    }
63}