datex_core/global/protocol_structures/
encrypted_header.rs

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