netstack/packets/
raw.rs

1use super::{Header, HEADER_SIZE, IncomingPacket};
2use crate::security::Secret;
3
4use sha2::Sha256;
5use hmac::{Hmac, Mac};
6type HmacSha256 = Hmac<Sha256>;
7
8pub struct RawPacket {
9    buffer: [u8; 1500],
10    length: usize,
11}
12
13impl RawPacket {
14    pub fn new(buffer: [u8; 1500], length: usize) -> Self {
15        Self {
16            buffer,
17            length,
18        }
19    }
20
21    pub fn get_header<'a>(&'a self) -> &'a Header {
22        use std::mem::transmute;
23
24        let ptr = &self.buffer as *const _;
25        let reference = unsafe { transmute(ptr) };
26        reference
27    }
28
29    pub fn get_header_mut<'a>(&'a mut self) -> &'a mut Header {
30        use std::mem::transmute;
31
32        let ptr = &mut self.buffer as *mut _;
33        let reference = unsafe { transmute(ptr) };
34        reference
35    }
36
37    pub fn get_buffer(&self) -> &[u8] {
38        &self.buffer[0..self.length]
39    }
40
41    pub fn get_buffer_mut(&mut self) -> &mut [u8] {
42        &mut self.buffer[0..self.length]
43    }
44
45    pub fn get_body(&self) -> &[u8] {
46        &self.buffer[HEADER_SIZE..self.length]
47    }
48
49    pub fn get_body_mut(&mut self) -> &mut [u8] {
50        &mut self.buffer[HEADER_SIZE..self.length]
51    }
52
53    pub fn verify(self, secret: &Secret) -> Option<IncomingPacket> {
54        if self.length < HEADER_SIZE {
55            return None;
56        }
57
58        let mut mac = HmacSha256::new_varkey(secret.get_bytes()).expect("HmacSha256 can take a key of any size");
59        let body_length = self.get_header().body_length as usize;
60
61        mac.input(&self.buffer[32..HEADER_SIZE + body_length]);
62        let is_valid = mac.verify(&self.buffer[0..32]).is_ok();
63
64        if is_valid {
65            Some(IncomingPacket::from_raw_packet(self))
66        } else {
67            None
68        }
69    }
70}