datex_core/global/protocol_structures/
encrypted_header.rs

1use super::serializable::Serializable;
2use crate::values::core_values::endpoint::Endpoint;
3use binrw::{BinRead, BinWrite};
4use core::prelude::rust_2024::*;
5use modular_bitfield::{Specifier, bitfield};
6
7// 4 bit
8#[cfg_attr(feature = "debug", derive(serde::Serialize, serde::Deserialize))]
9#[derive(Debug, PartialEq, Clone, Default, Specifier)]
10pub enum UserAgent {
11    #[default]
12    Unknown = 0,
13    Human = 1,
14    Bot = 2,
15    Service = 3,
16
17    #[allow(unused)]
18    Unused0 = 4,
19    #[allow(unused)]
20    Unused1 = 5,
21    #[allow(unused)]
22    Unused2 = 6,
23    #[allow(unused)]
24    Unused3 = 7,
25    #[allow(unused)]
26    Unused4 = 8,
27    #[allow(unused)]
28    Unused5 = 9,
29    #[allow(unused)]
30    Unused6 = 10,
31    #[allow(unused)]
32    Unused7 = 11,
33    #[allow(unused)]
34    Unused8 = 12,
35    #[allow(unused)]
36    Unused9 = 13,
37    #[allow(unused)]
38    Unused10 = 14,
39    #[allow(unused)]
40    Unused11 = 15,
41}
42
43// 4 bit + 4 bit = 8 bit
44#[bitfield]
45#[derive(BinWrite, BinRead, Clone, Default, Copy, Debug, PartialEq)]
46#[bw(map = |&x| Self::into_bytes(x))]
47#[br(map = Self::from_bytes)]
48
49pub struct Flags {
50    pub user_agent: UserAgent,
51    pub has_on_behalf_of: bool,
52
53    #[allow(unused)]
54    unused_0: bool,
55    #[allow(unused)]
56    unused_1: bool,
57    #[allow(unused)]
58    unused_2: bool,
59}
60
61#[cfg(feature = "debug")]
62mod flags_serde {
63    use super::*;
64    use crate::global::protocol_structures::encrypted_header::Flags;
65    use serde::{Deserialize, Deserializer, Serialize, Serializer};
66
67    #[derive(Serialize, Deserialize)]
68    struct FlagsHelper {
69        user_agent: UserAgent,
70        has_on_behalf_of: bool,
71    }
72
73    impl Serialize for Flags {
74        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
75        where
76            S: Serializer,
77        {
78            let helper = FlagsHelper {
79                user_agent: self.user_agent(),
80                has_on_behalf_of: self.has_on_behalf_of(),
81            };
82            helper.serialize(serializer)
83        }
84    }
85
86    impl<'de> Deserialize<'de> for Flags {
87        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
88        where
89            D: Deserializer<'de>,
90        {
91            let helper = FlagsHelper::deserialize(deserializer)?;
92            Ok(Flags::new()
93                .with_user_agent(helper.user_agent)
94                .with_has_on_behalf_of(helper.has_on_behalf_of))
95        }
96    }
97}
98
99// min: 1 byte
100// max: 1 byte + 21 bytes = 22 bytes
101#[cfg_attr(feature = "debug", derive(serde::Serialize, serde::Deserialize))]
102#[derive(Debug, Clone, Default, BinWrite, BinRead, PartialEq)]
103#[brw(little)]
104pub struct EncryptedHeader {
105    pub flags: Flags,
106
107    #[brw(if (flags.has_on_behalf_of()))]
108    pub on_behalf_of: Option<Endpoint>,
109}
110impl Serializable for EncryptedHeader {}