use crate::algorithm::encryption::Encryption;
use crate::data::Data;
#[derive(Debug)]
pub struct Packet {
data: Data,
value: Vec<u8>,
}
impl Packet {
pub fn unpacking(&mut self) -> Data {
if self.value.is_empty() {
return Data::new();
}
let padding_length = self.value[4];
let vec = self.value[5..(self.value.len() - padding_length as usize)].to_vec();
let data = Data::from(vec);
self.data = data.clone();
data
}
#[allow(dead_code)]
pub fn refresh(&mut self) {
self.value.clear();
self.data = Data::new()
}
pub fn build(&mut self, encryption: Option<&dyn Encryption>, is_encrypt: bool) {
let data_len = self.data.len() as u32;
let bsize = match is_encrypt {
true => encryption.unwrap().bsize() as i32,
false => 8,
};
let padding_len = {
let mut pad = (-((data_len
+ if is_encrypt && encryption.unwrap().is_cp() {
1
} else {
5
}) as i32))
& (bsize - 1) as i32;
if pad < bsize {
pad += bsize;
}
pad as u32
};
let mut buf = vec![];
buf.push(padding_len as u8);
buf.extend(self.data.as_slice());
buf.extend(vec![0; padding_len as usize]);
let packet_len = buf.len() as u32;
let mut packet_len_u8s = packet_len.to_be_bytes().to_vec();
packet_len_u8s.extend(buf);
self.value = packet_len_u8s;
}
#[allow(dead_code)]
pub fn as_slice(&self) -> &[u8] {
self.value.as_slice()
}
pub fn to_vec(&self) -> Vec<u8> {
self.value.to_vec()
}
}
impl From<Vec<u8>> for Packet {
fn from(v: Vec<u8>) -> Self {
Packet {
data: Data::from(v.as_slice()),
value: v,
}
}
}
impl From<&[u8]> for Packet {
fn from(v: &[u8]) -> Self {
Packet {
data: Data::from(v),
value: v.to_vec(),
}
}
}
impl From<Data> for Packet {
fn from(d: Data) -> Self {
let vec = d.as_slice().to_vec();
Packet {
data: d,
value: vec,
}
}
}