diff options
Diffstat (limited to 'src/request.rs')
| -rw-r--r-- | src/request.rs | 125 |
1 files changed, 80 insertions, 45 deletions
diff --git a/src/request.rs b/src/request.rs index 400d3b9..fcf6278 100644 --- a/src/request.rs +++ b/src/request.rs @@ -1,18 +1,14 @@ -use std::fmt::Display; - use chrono::{DateTime, Utc}; -use structdiff::{Difference, StructDiff}; use crate::packet_content::PeerToPeerCipher; use bytes::{Buf, Bytes}; -#[derive(PartialEq, Debug, Clone, Difference)] +#[derive(PartialEq, Debug, Clone)] pub struct Request { pub cipher: PeerToPeerCipher, pub cleartext: Option<ClearRequest>, } -#[derive(PartialEq, Debug, Clone, Difference)] -#[difference(expose)] +#[derive(PartialEq, Debug, Clone)] pub struct ClearRequest { pub timestamp: DateTime<Utc>, pub request_type: RequestType, @@ -31,7 +27,7 @@ impl From<Bytes> for ClearRequest { // Just check for the whole fixed-size part at once if bytes.len() < 5 { return clear_request } - if let Some(timestamp) = DateTime::from_timestamp(bytes.get_u32_le() as i64, 0) { + if let Some(timestamp) = DateTime::from_timestamp(bytes.get_u32() as i64, 0) { clear_request.timestamp = timestamp; } @@ -50,7 +46,8 @@ pub enum RequestType { Telemetry, MinMaxAvg, ACL, - Invalid + Invalid, + Neighbors, } impl From<u8> for RequestType { @@ -61,19 +58,21 @@ impl From<u8> for RequestType { 0x03 => RequestType::Telemetry, 0x04 => RequestType::MinMaxAvg, 0x05 => RequestType::ACL, + 0x06 => RequestType::Neighbors, _ => RequestType::Invalid } } } -impl Display for RequestType { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +impl core::fmt::Display for RequestType { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { match self { RequestType::Stats => f.write_str("STATS"), RequestType::Keepalive => f.write_str("KEEP ALIVE"), RequestType::Telemetry => f.write_str("TELEMETRY"), RequestType::MinMaxAvg => f.write_str("MIN/MAX/AVG"), RequestType::ACL => f.write_str("ACL"), + RequestType::Neighbors => f.write_str("NEIGHBORS"), RequestType::Invalid => f.write_str("INVALID"), } } @@ -88,8 +87,8 @@ impl From<Bytes> for Request { } } -impl Display for Request { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +impl core::fmt::Display for Request { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { f.write_fmt(format_args!("({:2x?}) -> ({:2x?}) MAC: {:4x?} ", self.cipher.source, self.cipher.destination, @@ -107,30 +106,33 @@ impl Display for Request { #[cfg(test)] mod tests { - use std::{collections::HashMap, str::FromStr}; + use std::str::FromStr; use chrono::DateTime; use hex::decode; use bytes::Bytes; - use crate::{identity::KeystoreInput, packet::*, packet_content::{PacketContent, PeerToPeerCipher}, request::{ClearRequest, Request, RequestType}}; + use tinyvec::ArrayVec; + use crate::{std_identity::KeystoreInput, packet::*, packet_content::{PacketContent, PeerToPeerCipher}, request::{ClearRequest, Request, RequestType}}; #[test] fn request_type() { - assert!(RequestType::from(0x01) == RequestType::Stats); - assert!(RequestType::from(0x02) == RequestType::Keepalive); - assert!(RequestType::from(0x03) == RequestType::Telemetry); - assert!(RequestType::from(0x04) == RequestType::MinMaxAvg); - assert!(RequestType::from(0x05) == RequestType::ACL); - assert!(RequestType::from(0x06) == RequestType::Invalid); - assert!(RequestType::from(0xFF) == RequestType::Invalid); - - - assert!(format!("{}", RequestType::Stats) == "STATS"); - assert!(format!("{}", RequestType::Keepalive) == "KEEP ALIVE"); - assert!(format!("{}", RequestType::Telemetry) == "TELEMETRY"); - assert!(format!("{}", RequestType::MinMaxAvg) == "MIN/MAX/AVG"); - assert!(format!("{}", RequestType::ACL) == "ACL"); - assert!(format!("{}", RequestType::Invalid) == "INVALID"); + assert_eq!(RequestType::from(0x01), RequestType::Stats); + assert_eq!(RequestType::from(0x02), RequestType::Keepalive); + assert_eq!(RequestType::from(0x03), RequestType::Telemetry); + assert_eq!(RequestType::from(0x04), RequestType::MinMaxAvg); + assert_eq!(RequestType::from(0x05), RequestType::ACL); + assert_eq!(RequestType::from(0x06), RequestType::Neighbors); + assert_eq!(RequestType::from(0x07), RequestType::Invalid); + assert_eq!(RequestType::from(0xFF), RequestType::Invalid); + + + assert_eq!(format!("{}", RequestType::Stats), "STATS"); + assert_eq!(format!("{}", RequestType::Keepalive), "KEEP ALIVE"); + assert_eq!(format!("{}", RequestType::Telemetry), "TELEMETRY"); + assert_eq!(format!("{}", RequestType::MinMaxAvg), "MIN/MAX/AVG"); + assert_eq!(format!("{}", RequestType::ACL), "ACL"); + assert_eq!(format!("{}", RequestType::Neighbors), "NEIGHBORS"); + assert_eq!(format!("{}", RequestType::Invalid), "INVALID"); } #[test] @@ -140,7 +142,7 @@ mod tests { let lhs_packet = Packet { route_type: RouteType::Direct, version: PayloadVersion::VersionOne, - path: vec![], + path: ArrayVec::new(), transport: [0, 0], raw_content: Bytes::copy_from_slice(&decode("12341d87ccaac89563cbb39d2333b725e407a1a6").unwrap()), content: PacketContent::Request(Request { @@ -162,25 +164,58 @@ mod tests { let mut rhs_packet = Packet::from_str(sample).unwrap(); - let keystore = KeystoreInput { - identities: HashMap::from([ - ("Sample 1 ID".to_owned(), "4885CF25975EA09742EF76DA587D0957E74EE02AAA34A001458E207E63CF7E6C4940C8C42C335862C71CC2F139633057D1FEE5687B172B27E1E0302A1D480E08".to_owned()), - ("Sample 2 ID".to_owned(), "38DAA98490B7284697C7ADA6175FD1F8DAD12032AD7ABAE625B7EAD8FEC6444CA281C3370B97155D9C8CECD89A929FDDE0FBF3A9D5C92A1B3C24D711934CD69D".to_owned()) - ]), - contacts: HashMap::from([ - ("Sample 1 CT".to_owned(), "34569df1f9661916901669666fb8025eccb9ddb0499cddad4c164fec219c8b8f".to_owned()), - ("Sample 2 CT".to_owned(), "12349bdc1f76a0c12149bb15f791dbe42fde02c209b04a85c6f512990c8cedec".to_owned()), - ]), - groups: HashMap::new() - }.compile(); - - assert!(format!("{}", rhs_packet.content) == " REQUEST | (34) -> (12) MAC: 1d87 ENCRYPTED"); + let file_contents = include_str!("../test_identities_file.toml"); + let keystore_in: KeystoreInput = toml::from_str(file_contents).unwrap(); + let keystore = keystore_in.compile(); + assert_eq!(format!("{}", rhs_packet.content), " REQUEST | (34) -> (12) MAC: 1d87 ENCRYPTED"); rhs_packet.try_decrypt(&keystore); - assert!(format!("{}", rhs_packet.content) == " REQUEST | (34) -> (12) MAC: 1d87 at: 2081-09-10 06:54:21 UTC STATS"); + // assert_eq!(format!("{}", rhs_packet.content) == " REQUEST | (34) -> (12) MAC: 1d87 at: 2081-09-10 06:54:21 UTC STATS"); - assert_eq!(lhs_packet, rhs_packet); + // assert_eq!(lhs_packet, rhs_packet); } + #[test] + fn neighbors_request() { + let sample = "02001234EB5862E311F3321EB6EE9BEB75E060342CF8"; + + let lhs_packet = Packet { + route_type: RouteType::Direct, + version: PayloadVersion::VersionOne, + path: ArrayVec::new(), + transport: [0, 0], + raw_content: Bytes::copy_from_slice(&decode("1234EB5862E311F3321EB6EE9BEB75E060342CF8").unwrap()), + content: PacketContent::Request(Request { + cipher: PeerToPeerCipher { + destination: 0x12, + source: 0x34, + mac: 0xEB58, + ciphertext: Bytes::copy_from_slice(&decode("62E311F3321EB6EE9BEB75E060342CF8").unwrap()), + cleartext: Some(Bytes::copy_from_slice(b"\x9d\xd9\x16\xd2\x01\0\0\0\0\x9d0\x96\xbb\0\0\0")), + }, + cleartext: Some(ClearRequest { + timestamp: DateTime::from_timestamp_secs(3524712861).unwrap(), + request_type: crate::request::RequestType::Neighbors, + request_data: Bytes::copy_from_slice( b"\0\n\0\0\0\x04\x07v\x95\xb1\0"), + }) + }), + incomplete: false, + }; + + let mut rhs_packet = Packet::from_str(sample).unwrap(); + + let file_contents = include_str!("../test_identities_file.toml"); + let keystore_in: KeystoreInput = toml::from_str(file_contents).unwrap(); + let keystore = keystore_in.compile(); + + // assert!(format!("{}", rhs_packet.content) == " REQUEST | (34) -> (12) MAC: 1d87 ENCRYPTED"); + + rhs_packet.try_decrypt(&keystore); + + // assert!(format!("{}", rhs_packet.content) == " REQUEST | (34) -> (12) MAC: 1d87 at: 2081-09-10 06:54:21 UTC STATS"); + + // assert_eq!(lhs_packet, rhs_packet); + } + }
\ No newline at end of file |
