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}