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#[derive(Debug, PartialEq, Clone, Default, Specifier)]
8pub enum DeviceType {
9    #[default]
10    Unknown = 0,
11    Mobile = 1,
12    Desktop = 2,
13    Bot = 3,
14
15    #[allow(unused)]
16    Unused0 = 4,
17    #[allow(unused)]
18    Unused1 = 5,
19    #[allow(unused)]
20    Unused2 = 6,
21    #[allow(unused)]
22    Unused3 = 7,
23    #[allow(unused)]
24    Unused4 = 8,
25    #[allow(unused)]
26    Unused5 = 9,
27    #[allow(unused)]
28    Unused6 = 10,
29    #[allow(unused)]
30    Unused7 = 11,
31    #[allow(unused)]
32    Unused8 = 12,
33    #[allow(unused)]
34    Unused9 = 13,
35    #[allow(unused)]
36    Unused10 = 14,
37    #[allow(unused)]
38    Unused11 = 15,
39}
40
41// 4 bit + 4 bit = 8 bit
42#[bitfield]
43#[derive(BinWrite, BinRead, Clone, Default, Copy, Debug, PartialEq)]
44#[bw(map = |&x| Self::into_bytes(x))]
45#[br(map = Self::from_bytes)]
46pub struct Flags {
47    pub device_type: DeviceType,
48    pub has_on_behalf_of: bool,
49    unused_0: bool,
50    unused_1: bool,
51    unused_2: bool,
52}
53
54// min: 1 byte
55// max: 1 byte + 21 bytes = 22 bytes
56#[derive(Debug, Clone, Default, BinWrite, BinRead, PartialEq)]
57#[brw(little)]
58pub struct EncryptedHeader {
59    pub flags: Flags,
60
61    #[brw(if (flags.has_on_behalf_of()))]
62    pub on_behalf_of: Option<Endpoint>,
63}
64impl Serializable for EncryptedHeader {}