1use crate::{
2 abstractions::MAC_SIZE,
3 codec::{header::RequestHeader, ptp_packet::PtpPacket},
4};
5
6use super::RequestBody;
7
8pub struct RequestPacket {
16 pub header: RequestHeader,
17 pub body: RequestBody,
18 pub mac: Option<[u8; MAC_SIZE]>,
19}
20
21impl PtpPacket<RequestHeader, RequestBody> for RequestPacket {
22 fn get_header(&self) -> &RequestHeader {
23 &self.header
24 }
25
26 fn get_body(&self) -> &RequestBody {
27 &self.body
28 }
29
30 fn new(header: RequestHeader, body: RequestBody, mac: Option<[u8; MAC_SIZE]>) -> Self {
31 Self { header, body, mac }
36 }
37
38 fn get_mac(&self) -> Option<&[u8; MAC_SIZE]> {
39 self.mac.as_ref()
40 }
41}
42
43#[cfg(test)]
44mod parse_test {
45 use crate::{
46 abstractions::{SerializationError, SerializationInfo},
47 codec::common::SlotRange,
48 };
49
50 use super::*;
51
52 #[test]
53 fn cant_deserialize_nothing() {
54 let bytes = &[];
55 let packet = RequestPacket::from_bytes(bytes, SerializationInfo::PacketType(0));
56 assert_eq!(SerializationError::TooFewBytes(17), packet.err().unwrap()); }
58
59 #[test]
60 fn cant_deserialize_connect_without_key() {
61 let bytes = &[
62 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0x01,
63 ];
64 let packet = RequestPacket::from_bytes(bytes, SerializationInfo::PacketType(0));
65 assert_eq!(SerializationError::TooFewBytes(16), packet.err().unwrap()); }
67
68 #[test]
69 fn can_deserialize_plain_packet() {
70 let data = &[
71 0x01, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 5, 0, 10,
72 ];
73 let packet = RequestPacket::from_bytes(data, SerializationInfo::None).unwrap();
74 if let RequestBody::CREATE(SlotRange { from, to }) = packet.body {
75 assert_eq!(Some(5), from);
76 assert_eq!(Some(10), to);
77 } else {
78 panic!("Not a create");
79 }
80 }
81}
82
83#[cfg(test)]
84mod serialization_test {
85 use std::collections::HashMap;
86
87 use crate::{
88 abstractions::{Serializable, SerializationInfo},
89 codec::{
90 common::SlotRange,
91 objects::BucketId,
92 ptp_packet::{PtpBody, PtpHeader},
93 },
94 };
95
96 use super::*;
97
98 #[test]
99 fn can_serialize_plain_packet() {
100 let body = RequestBody::CREATE(SlotRange {
101 from: Some(5),
102 to: Some(10),
103 });
104 let id = BucketId::from_bytes(
105 &[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
106 None,
107 )
108 .unwrap();
109
110 let header = RequestHeader::new(body.packet_type(), Some(id));
111 let packet = RequestPacket::new(header, body, None);
112
113 assert_eq!(
114 vec!(21, 0x01, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 5, 0, 10),
115 packet.get_bytes(SerializationInfo::None, true).unwrap()
116 );
117 }
118
119 #[test]
120 fn can_serialize_simple_packet_with_authentication() {
121 let key = &[1u8; 32];
122 let body = RequestBody::CREATE(SlotRange {
123 from: Some(5),
124 to: Some(10),
125 });
126 let id = BucketId::from_bytes(
127 &[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
128 None,
129 )
130 .unwrap();
131
132 let mut header = RequestHeader::new(body.packet_type(), Some(id));
133 header.set_mac(true);
134 let packet = RequestPacket::new(header, body, None);
135
136 let bytes = packet
137 .get_bytes(
138 SerializationInfo::UseAuthentication(key.clone(), None),
139 false,
140 )
141 .unwrap();
142 assert_eq!(
143 vec![
144 17, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 5, 0, 10, 34, 167,
145 182, 64, 46, 228, 223, 54, 255, 240, 62, 82, 191, 236, 68, 50
146 ],
147 bytes
148 );
149
150 let packet = RequestPacket::from_bytes(
151 &bytes,
152 SerializationInfo::UseAuthentication(key.clone(), None),
153 )
154 .unwrap();
155 assert_eq!(
156 bytes,
157 packet
158 .get_bytes(
159 SerializationInfo::UseAuthentication(key.clone(), None),
160 false
161 )
162 .unwrap()
163 );
164 }
165
166 #[test]
167 fn can_serialize_complex_packet_with_authentication() {
168 let key = &[1u8; 32];
169 let body = RequestBody::PUT {
170 slots: HashMap::from([
171 (5, vec![1, 2, 3, 4, 5, 6, 7, 8]),
172 (19412, vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),
173 ]),
174 };
175 let id = BucketId::from_bytes(
176 &[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
177 None,
178 )
179 .unwrap();
180
181 let mut header = RequestHeader::new(body.packet_type(), Some(id));
182 header.set_mac(true);
183 let packet = RequestPacket::new(header, body, None);
184
185 let bytes = packet
186 .get_bytes(
187 SerializationInfo::UseAuthentication(key.clone(), None),
188 false,
189 )
190 .unwrap();
191 assert_eq!(
192 vec![
193 18, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 5, 8, 1, 2, 3, 4, 5,
194 6, 7, 8, 75, 212, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 74, 151, 106, 78, 124, 179,
195 92, 165, 78, 72, 27, 181, 100, 37, 243, 29
196 ],
197 bytes
198 );
199
200 let packet = RequestPacket::from_bytes(
201 &bytes,
202 SerializationInfo::UseAuthentication(key.clone(), None),
203 )
204 .unwrap();
205 assert_eq!(
206 bytes,
207 packet
208 .get_bytes(
209 SerializationInfo::UseAuthentication(key.clone(), None),
210 false
211 )
212 .unwrap()
213 );
214 }
215}