feat: implement serialize method on TPM2.net packet
This commit is contained in:
parent
b754e02390
commit
dd0ce35bef
|
@ -1,12 +1,15 @@
|
||||||
pub const PACKET_START_BYTE: u8 = 0x9C;
|
pub const PACKET_START_BYTE: u8 = 0x9C;
|
||||||
|
|
||||||
pub const PAYLOAD_SIZE_MAX: usize = 1490;
|
pub const PAYLOAD_SIZE_MAX: usize = 1465;
|
||||||
|
|
||||||
|
const OVERHEAD: usize = 7;
|
||||||
|
|
||||||
pub use crate::common::{PacketType, PACKET_END_BYTE};
|
pub use crate::common::{PacketType, PACKET_END_BYTE};
|
||||||
|
|
||||||
#[derive(PartialEq)]
|
#[derive(PartialEq)]
|
||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
pub enum Tpm2NetError {
|
pub enum Tpm2NetError {
|
||||||
|
BufferTooSmall,
|
||||||
IndexOutOfBounds,
|
IndexOutOfBounds,
|
||||||
PayloadTooLarge,
|
PayloadTooLarge,
|
||||||
}
|
}
|
||||||
|
@ -63,9 +66,33 @@ impl<'a> Packet<'a> {
|
||||||
self.packet_type
|
self.packet_type
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn size(&self) -> usize {
|
pub fn payload_size(&self) -> usize {
|
||||||
self.payload.len()
|
self.payload.len()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn total_size(&self) -> usize {
|
||||||
|
self.payload.len() + OVERHEAD
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn serialize(&self, buf: &mut [u8]) -> Result<(), Tpm2NetError> {
|
||||||
|
if buf.len() < self.total_size() {
|
||||||
|
return Err(Tpm2NetError::BufferTooSmall);
|
||||||
|
}
|
||||||
|
|
||||||
|
buf[0] = PACKET_START_BYTE;
|
||||||
|
buf[1] = self.packet_type as u8;
|
||||||
|
buf[2] = ((self.payload.len() + 2) >> 8) as u8; // frame size includes packet number + packet count
|
||||||
|
buf[3] = ((self.payload.len() + 2) & 255) as u8;
|
||||||
|
buf[4] = self.index;
|
||||||
|
buf[5] = self.total;
|
||||||
|
buf[self.payload.len() + 6] = PACKET_END_BYTE;
|
||||||
|
|
||||||
|
for (i, b) in self.payload.iter().enumerate() {
|
||||||
|
buf[i + 6] = *b;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -75,7 +102,7 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn empty_packet() {
|
fn empty_packet() {
|
||||||
let packet = Packet::new(PacketType::Command);
|
let packet = Packet::new(PacketType::Command);
|
||||||
assert_eq!(packet.size(), 0);
|
assert_eq!(packet.payload_size(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -116,4 +143,45 @@ mod tests {
|
||||||
assert!(result.is_err());
|
assert!(result.is_err());
|
||||||
assert!(result.err().unwrap() == Tpm2NetError::IndexOutOfBounds);
|
assert!(result.err().unwrap() == Tpm2NetError::IndexOutOfBounds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn serialize() {
|
||||||
|
let payload: [u8; 4] = [0xca, 0xfe, 0xba, 0xbe];
|
||||||
|
let packet = Packet::with_payload_and_index(PacketType::Data, &payload, 23, 42)
|
||||||
|
.ok()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let mut buf = [0u8; 11];
|
||||||
|
let result = packet.serialize(&mut buf);
|
||||||
|
assert!(result.is_ok());
|
||||||
|
assert_eq!(
|
||||||
|
buf,
|
||||||
|
[
|
||||||
|
PACKET_START_BYTE,
|
||||||
|
PacketType::Data as u8,
|
||||||
|
0,
|
||||||
|
payload.len() as u8 + 2,
|
||||||
|
23,
|
||||||
|
42,
|
||||||
|
payload[0],
|
||||||
|
payload[1],
|
||||||
|
payload[2],
|
||||||
|
payload[3],
|
||||||
|
PACKET_END_BYTE
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn buffer_too_small() {
|
||||||
|
let payload: [u8; 4] = [0xca, 0xfe, 0xba, 0xbe];
|
||||||
|
let packet = Packet::with_payload(PacketType::Data, &payload)
|
||||||
|
.ok()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let mut buf = [0u8; 10];
|
||||||
|
let result = packet.serialize(&mut buf);
|
||||||
|
assert!(result.is_err());
|
||||||
|
assert!(result.err().unwrap() == Tpm2NetError::BufferTooSmall);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue