Skip to main content

datex_core/global/protocol_structures/
encrypted_header.rs

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