1 // Copyright 2018 The ChromiumOS Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 use std::fmt;
6 use std::io;
7 use std::io::ErrorKind;
8 use std::io::Read;
9 use std::io::Write;
10 use std::mem;
11 use std::ops::Deref;
12 use std::ops::DerefMut;
13 use std::string::String;
14 use std::vec::Vec;
15 
16 /// A type that can be encoded on the wire using the 9P protocol.
17 pub trait WireFormat: std::marker::Sized {
18     /// Returns the number of bytes necessary to fully encode `self`.
byte_size(&self) -> u3219     fn byte_size(&self) -> u32;
20 
21     /// Encodes `self` into `writer`.
encode<W: Write>(&self, writer: &mut W) -> io::Result<()>22     fn encode<W: Write>(&self, writer: &mut W) -> io::Result<()>;
23 
24     /// Decodes `Self` from `reader`.
decode<R: Read>(reader: &mut R) -> io::Result<Self>25     fn decode<R: Read>(reader: &mut R) -> io::Result<Self>;
26 }
27 
28 // This doesn't really _need_ to be a macro but unfortunately there is no trait bound to
29 // express "can be casted to another type", which means we can't write `T as u8` in a trait
30 // based implementation.  So instead we have this macro, which is implemented for all the
31 // stable unsigned types with the added benefit of not being implemented for the signed
32 // types which are not allowed by the protocol.
33 macro_rules! uint_wire_format_impl {
34     ($Ty:ty) => {
35         impl WireFormat for $Ty {
36             fn byte_size(&self) -> u32 {
37                 mem::size_of::<$Ty>() as u32
38             }
39 
40             fn encode<W: Write>(&self, writer: &mut W) -> io::Result<()> {
41                 let mut buf = [0u8; mem::size_of::<$Ty>()];
42 
43                 // Encode the bytes into the buffer in little endian order.
44                 for idx in 0..mem::size_of::<$Ty>() {
45                     buf[idx] = (self >> (8 * idx)) as u8;
46                 }
47 
48                 writer.write_all(&buf)
49             }
50 
51             fn decode<R: Read>(reader: &mut R) -> io::Result<Self> {
52                 let mut buf = [0u8; mem::size_of::<$Ty>()];
53                 reader.read_exact(&mut buf)?;
54 
55                 // Read bytes from the buffer in little endian order.
56                 let mut result = 0;
57                 for idx in 0..mem::size_of::<$Ty>() {
58                     result |= (buf[idx] as $Ty) << (8 * idx);
59                 }
60 
61                 Ok(result)
62             }
63         }
64     };
65 }
66 uint_wire_format_impl!(u8);
67 uint_wire_format_impl!(u16);
68 uint_wire_format_impl!(u32);
69 uint_wire_format_impl!(u64);
70 
71 // The 9P protocol requires that strings are UTF-8 encoded.  The wire format is a u16
72 // count |N|, encoded in little endian, followed by |N| bytes of UTF-8 data.
73 impl WireFormat for String {
byte_size(&self) -> u3274     fn byte_size(&self) -> u32 {
75         (mem::size_of::<u16>() + self.len()) as u32
76     }
77 
encode<W: Write>(&self, writer: &mut W) -> io::Result<()>78     fn encode<W: Write>(&self, writer: &mut W) -> io::Result<()> {
79         if self.len() > std::u16::MAX as usize {
80             return Err(io::Error::new(
81                 ErrorKind::InvalidInput,
82                 "string is too long",
83             ));
84         }
85 
86         (self.len() as u16).encode(writer)?;
87         writer.write_all(self.as_bytes())
88     }
89 
decode<R: Read>(reader: &mut R) -> io::Result<Self>90     fn decode<R: Read>(reader: &mut R) -> io::Result<Self> {
91         let len: u16 = WireFormat::decode(reader)?;
92         let mut result = String::with_capacity(len as usize);
93         reader.take(len as u64).read_to_string(&mut result)?;
94         Ok(result)
95     }
96 }
97 
98 // The wire format for repeated types is similar to that of strings: a little endian
99 // encoded u16 |N|, followed by |N| instances of the given type.
100 impl<T: WireFormat> WireFormat for Vec<T> {
byte_size(&self) -> u32101     fn byte_size(&self) -> u32 {
102         mem::size_of::<u16>() as u32 + self.iter().map(|elem| elem.byte_size()).sum::<u32>()
103     }
104 
encode<W: Write>(&self, writer: &mut W) -> io::Result<()>105     fn encode<W: Write>(&self, writer: &mut W) -> io::Result<()> {
106         if self.len() > std::u16::MAX as usize {
107             return Err(io::Error::new(
108                 ErrorKind::InvalidInput,
109                 "too many elements in vector",
110             ));
111         }
112 
113         (self.len() as u16).encode(writer)?;
114         for elem in self {
115             elem.encode(writer)?;
116         }
117 
118         Ok(())
119     }
120 
decode<R: Read>(reader: &mut R) -> io::Result<Self>121     fn decode<R: Read>(reader: &mut R) -> io::Result<Self> {
122         let len: u16 = WireFormat::decode(reader)?;
123         let mut result = Vec::with_capacity(len as usize);
124 
125         for _ in 0..len {
126             result.push(WireFormat::decode(reader)?);
127         }
128 
129         Ok(result)
130     }
131 }
132 
133 /// A type that encodes an arbitrary number of bytes of data.  Typically used for Rread
134 /// Twrite messages.  This differs from a `Vec<u8>` in that it encodes the number of bytes
135 /// using a `u32` instead of a `u16`.
136 #[derive(PartialEq, Eq)]
137 pub struct Data(pub Vec<u8>);
138 
139 // The maximum length of a data buffer that we support.  In practice the server's max message
140 // size should prevent us from reading too much data so this check is mainly to ensure a
141 // malicious client cannot trick us into allocating massive amounts of memory.
142 const MAX_DATA_LENGTH: u32 = 32 * 1024 * 1024;
143 
144 impl fmt::Debug for Data {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result145     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
146         // There may be a lot of data and we don't want to spew it all out in a trace.  Instead
147         // just print out the number of bytes in the buffer.
148         write!(f, "Data({} bytes)", self.len())
149     }
150 }
151 
152 // Implement Deref and DerefMut so that we don't have to use self.0 everywhere.
153 impl Deref for Data {
154     type Target = Vec<u8>;
deref(&self) -> &Self::Target155     fn deref(&self) -> &Self::Target {
156         &self.0
157     }
158 }
159 impl DerefMut for Data {
deref_mut(&mut self) -> &mut Self::Target160     fn deref_mut(&mut self) -> &mut Self::Target {
161         &mut self.0
162     }
163 }
164 
165 // Same as Vec<u8> except that it encodes the length as a u32 instead of a u16.
166 impl WireFormat for Data {
byte_size(&self) -> u32167     fn byte_size(&self) -> u32 {
168         mem::size_of::<u32>() as u32 + self.iter().map(|elem| elem.byte_size()).sum::<u32>()
169     }
170 
encode<W: Write>(&self, writer: &mut W) -> io::Result<()>171     fn encode<W: Write>(&self, writer: &mut W) -> io::Result<()> {
172         if self.len() > std::u32::MAX as usize {
173             return Err(io::Error::new(ErrorKind::InvalidInput, "data is too large"));
174         }
175         (self.len() as u32).encode(writer)?;
176         writer.write_all(self)
177     }
178 
decode<R: Read>(reader: &mut R) -> io::Result<Self>179     fn decode<R: Read>(reader: &mut R) -> io::Result<Self> {
180         let len: u32 = WireFormat::decode(reader)?;
181         if len > MAX_DATA_LENGTH {
182             return Err(io::Error::new(
183                 ErrorKind::InvalidData,
184                 format!("data length ({} bytes) is too large", len),
185             ));
186         }
187 
188         let mut buf = Vec::with_capacity(len as usize);
189         reader.take(len as u64).read_to_end(&mut buf)?;
190 
191         if buf.len() == len as usize {
192             Ok(Data(buf))
193         } else {
194             Err(io::Error::new(
195                 ErrorKind::UnexpectedEof,
196                 format!(
197                     "unexpected end of data: want: {} bytes, got: {} bytes",
198                     len,
199                     buf.len()
200                 ),
201             ))
202         }
203     }
204 }
205 
206 #[cfg(test)]
207 mod test {
208     use std::io::Cursor;
209     use std::mem;
210     use std::string::String;
211 
212     use super::*;
213 
214     #[test]
integer_byte_size()215     fn integer_byte_size() {
216         assert_eq!(1, 0u8.byte_size());
217         assert_eq!(2, 0u16.byte_size());
218         assert_eq!(4, 0u32.byte_size());
219         assert_eq!(8, 0u64.byte_size());
220     }
221 
222     #[test]
integer_decode()223     fn integer_decode() {
224         let buf: [u8; 8] = [0xef, 0xbe, 0xad, 0xde, 0x0d, 0xf0, 0xad, 0x8b];
225 
226         assert_eq!(0xef_u8, WireFormat::decode(&mut Cursor::new(&buf)).unwrap());
227         assert_eq!(0xbeef_u16, u16::decode(&mut Cursor::new(&buf)).unwrap());
228         assert_eq!(0xdeadbeef_u32, u32::decode(&mut Cursor::new(&buf)).unwrap());
229         assert_eq!(
230             0x8bad_f00d_dead_beef_u64,
231             u64::decode(&mut Cursor::new(&buf)).unwrap()
232         );
233     }
234 
235     #[test]
integer_encode()236     fn integer_encode() {
237         let value: u64 = 0x8bad_f00d_dead_beef;
238         let expected: [u8; 8] = [0xef, 0xbe, 0xad, 0xde, 0x0d, 0xf0, 0xad, 0x8b];
239 
240         let mut buf = vec![0; 8];
241 
242         (value as u8).encode(&mut Cursor::new(&mut *buf)).unwrap();
243         assert_eq!(expected[0..1], buf[0..1]);
244 
245         (value as u16).encode(&mut Cursor::new(&mut *buf)).unwrap();
246         assert_eq!(expected[0..2], buf[0..2]);
247 
248         (value as u32).encode(&mut Cursor::new(&mut *buf)).unwrap();
249         assert_eq!(expected[0..4], buf[0..4]);
250 
251         value.encode(&mut Cursor::new(&mut *buf)).unwrap();
252         assert_eq!(expected[0..8], buf[0..8]);
253     }
254 
255     #[test]
string_byte_size()256     fn string_byte_size() {
257         let values = [
258             String::from("Google Video"),
259             String::from("网页 图片 资讯更多 »"),
260             String::from("Παγκόσμιος Ιστός"),
261             String::from("Поиск страниц на русском"),
262             String::from("전체서비스"),
263         ];
264 
265         let exp = values
266             .iter()
267             .map(|v| (mem::size_of::<u16>() + v.len()) as u32);
268 
269         for (value, expected) in values.iter().zip(exp) {
270             assert_eq!(expected, value.byte_size());
271         }
272     }
273 
274     #[test]
zero_length_string()275     fn zero_length_string() {
276         let s = String::from("");
277         assert_eq!(s.byte_size(), mem::size_of::<u16>() as u32);
278 
279         let mut buf = [0xffu8; 4];
280 
281         s.encode(&mut Cursor::new(&mut buf[..]))
282             .expect("failed to encode empty string");
283         assert_eq!(&[0, 0, 0xff, 0xff], &buf);
284 
285         assert_eq!(
286             s,
287             <String as WireFormat>::decode(&mut Cursor::new(&[0, 0, 0x61, 0x61][..]))
288                 .expect("failed to decode empty string")
289         );
290     }
291 
292     #[test]
string_encode()293     fn string_encode() {
294         let values = [
295             String::from("Google Video"),
296             String::from("网页 图片 资讯更多 »"),
297             String::from("Παγκόσμιος Ιστός"),
298             String::from("Поиск страниц на русском"),
299             String::from("전체서비스"),
300         ];
301 
302         let expected = values.iter().map(|v| {
303             let len = v.as_bytes().len();
304             let mut buf = Vec::with_capacity(len + mem::size_of::<u16>());
305 
306             buf.push(len as u8);
307             buf.push((len >> 8) as u8);
308 
309             buf.extend_from_slice(v.as_bytes());
310 
311             buf
312         });
313 
314         for (val, exp) in values.iter().zip(expected) {
315             let mut buf = vec![0; exp.len()];
316 
317             WireFormat::encode(val, &mut Cursor::new(&mut *buf)).unwrap();
318             assert_eq!(exp, buf);
319         }
320     }
321 
322     #[test]
string_decode()323     fn string_decode() {
324         assert_eq!(
325             String::from("Google Video"),
326             <String as WireFormat>::decode(&mut Cursor::new(
327                 &[
328                     0x0c, 0x00, 0x47, 0x6F, 0x6F, 0x67, 0x6C, 0x65, 0x20, 0x56, 0x69, 0x64, 0x65,
329                     0x6F,
330                 ][..]
331             ))
332             .unwrap()
333         );
334         assert_eq!(
335             String::from("网页 图片 资讯更多 »"),
336             <String as WireFormat>::decode(&mut Cursor::new(
337                 &[
338                     0x1d, 0x00, 0xE7, 0xBD, 0x91, 0xE9, 0xA1, 0xB5, 0x20, 0xE5, 0x9B, 0xBE, 0xE7,
339                     0x89, 0x87, 0x20, 0xE8, 0xB5, 0x84, 0xE8, 0xAE, 0xAF, 0xE6, 0x9B, 0xB4, 0xE5,
340                     0xA4, 0x9A, 0x20, 0xC2, 0xBB,
341                 ][..]
342             ))
343             .unwrap()
344         );
345         assert_eq!(
346             String::from("Παγκόσμιος Ιστός"),
347             <String as WireFormat>::decode(&mut Cursor::new(
348                 &[
349                     0x1f, 0x00, 0xCE, 0xA0, 0xCE, 0xB1, 0xCE, 0xB3, 0xCE, 0xBA, 0xCF, 0x8C, 0xCF,
350                     0x83, 0xCE, 0xBC, 0xCE, 0xB9, 0xCE, 0xBF, 0xCF, 0x82, 0x20, 0xCE, 0x99, 0xCF,
351                     0x83, 0xCF, 0x84, 0xCF, 0x8C, 0xCF, 0x82,
352                 ][..]
353             ))
354             .unwrap()
355         );
356         assert_eq!(
357             String::from("Поиск страниц на русском"),
358             <String as WireFormat>::decode(&mut Cursor::new(
359                 &[
360                     0x2d, 0x00, 0xD0, 0x9F, 0xD0, 0xBE, 0xD0, 0xB8, 0xD1, 0x81, 0xD0, 0xBA, 0x20,
361                     0xD1, 0x81, 0xD1, 0x82, 0xD1, 0x80, 0xD0, 0xB0, 0xD0, 0xBD, 0xD0, 0xB8, 0xD1,
362                     0x86, 0x20, 0xD0, 0xBD, 0xD0, 0xB0, 0x20, 0xD1, 0x80, 0xD1, 0x83, 0xD1, 0x81,
363                     0xD1, 0x81, 0xD0, 0xBA, 0xD0, 0xBE, 0xD0, 0xBC,
364                 ][..]
365             ))
366             .unwrap()
367         );
368         assert_eq!(
369             String::from("전체서비스"),
370             <String as WireFormat>::decode(&mut Cursor::new(
371                 &[
372                     0x0f, 0x00, 0xEC, 0xA0, 0x84, 0xEC, 0xB2, 0xB4, 0xEC, 0x84, 0x9C, 0xEB, 0xB9,
373                     0x84, 0xEC, 0x8A, 0xA4,
374                 ][..]
375             ))
376             .unwrap()
377         );
378     }
379 
380     #[test]
invalid_string_decode()381     fn invalid_string_decode() {
382         let _ = <String as WireFormat>::decode(&mut Cursor::new(&[
383             0x06, 0x00, 0xed, 0xa0, 0x80, 0xed, 0xbf, 0xbf,
384         ]))
385         .expect_err("surrogate code point");
386 
387         let _ = <String as WireFormat>::decode(&mut Cursor::new(&[
388             0x05, 0x00, 0xf8, 0x80, 0x80, 0x80, 0xbf,
389         ]))
390         .expect_err("overlong sequence");
391 
392         let _ =
393             <String as WireFormat>::decode(&mut Cursor::new(&[0x04, 0x00, 0xf4, 0x90, 0x80, 0x80]))
394                 .expect_err("out of range");
395 
396         let _ =
397             <String as WireFormat>::decode(&mut Cursor::new(&[0x04, 0x00, 0x63, 0x61, 0x66, 0xe9]))
398                 .expect_err("ISO-8859-1");
399 
400         let _ =
401             <String as WireFormat>::decode(&mut Cursor::new(&[0x04, 0x00, 0xb0, 0xa1, 0xb0, 0xa2]))
402                 .expect_err("EUC-KR");
403     }
404 
405     #[test]
vector_encode()406     fn vector_encode() {
407         let values: Vec<u32> = vec![291, 18_916, 2_497, 22, 797_162, 2_119_732, 3_213_929_716];
408         let mut expected: Vec<u8> =
409             Vec::with_capacity(values.len() * mem::size_of::<u32>() + mem::size_of::<u16>());
410         expected.push(values.len() as u8);
411         expected.push((values.len() >> 8) as u8);
412 
413         const MASK: u32 = 0xff;
414         for val in &values {
415             expected.push((val & MASK) as u8);
416             expected.push(((val >> 8) & MASK) as u8);
417             expected.push(((val >> 16) & MASK) as u8);
418             expected.push(((val >> 24) & MASK) as u8);
419         }
420 
421         let mut actual: Vec<u8> = vec![0; expected.len()];
422 
423         WireFormat::encode(&values, &mut Cursor::new(&mut *actual))
424             .expect("failed to encode vector");
425         assert_eq!(expected, actual);
426     }
427 
428     #[test]
vector_decode()429     fn vector_decode() {
430         let expected: Vec<u32> = vec![
431             2_498,
432             24,
433             897,
434             4_097_789_579,
435             8_498_119,
436             684_279,
437             961_189_198,
438             7,
439         ];
440         let mut input: Vec<u8> =
441             Vec::with_capacity(expected.len() * mem::size_of::<u32>() + mem::size_of::<u16>());
442         input.push(expected.len() as u8);
443         input.push((expected.len() >> 8) as u8);
444 
445         const MASK: u32 = 0xff;
446         for val in &expected {
447             input.push((val & MASK) as u8);
448             input.push(((val >> 8) & MASK) as u8);
449             input.push(((val >> 16) & MASK) as u8);
450             input.push(((val >> 24) & MASK) as u8);
451         }
452 
453         assert_eq!(
454             expected,
455             <Vec<u32> as WireFormat>::decode(&mut Cursor::new(&*input))
456                 .expect("failed to decode vector")
457         );
458     }
459 
460     #[test]
data_encode()461     fn data_encode() {
462         let values = Data(vec![169, 155, 79, 67, 182, 199, 25, 73, 129, 200]);
463         let mut expected: Vec<u8> =
464             Vec::with_capacity(values.len() * mem::size_of::<u8>() + mem::size_of::<u32>());
465         expected.push(values.len() as u8);
466         expected.push((values.len() >> 8) as u8);
467         expected.push((values.len() >> 16) as u8);
468         expected.push((values.len() >> 24) as u8);
469         expected.extend_from_slice(&values);
470 
471         let mut actual: Vec<u8> = vec![0; expected.len()];
472 
473         WireFormat::encode(&values, &mut Cursor::new(&mut *actual))
474             .expect("failed to encode datar");
475         assert_eq!(expected, actual);
476     }
477 
478     #[test]
data_decode()479     fn data_decode() {
480         let expected = Data(vec![219, 15, 8, 155, 194, 129, 79, 91, 46, 53, 173]);
481         let mut input: Vec<u8> =
482             Vec::with_capacity(expected.len() * mem::size_of::<u8>() + mem::size_of::<u32>());
483         input.push(expected.len() as u8);
484         input.push((expected.len() >> 8) as u8);
485         input.push((expected.len() >> 16) as u8);
486         input.push((expected.len() >> 24) as u8);
487         input.extend_from_slice(&expected);
488 
489         assert_eq!(
490             expected,
491             <Data as WireFormat>::decode(&mut Cursor::new(&mut *input))
492                 .expect("failed to decode data")
493         );
494     }
495 
496     #[test]
error_cases()497     fn error_cases() {
498         // string is too long.
499         let mut long_str = String::with_capacity(std::u16::MAX as usize);
500         while long_str.len() < std::u16::MAX as usize {
501             long_str.push_str("long");
502         }
503         long_str.push('!');
504 
505         let count = long_str.len() + mem::size_of::<u16>();
506         let mut buf = vec![0; count];
507 
508         long_str
509             .encode(&mut Cursor::new(&mut *buf))
510             .expect_err("long string");
511 
512         // vector is too long.
513         let mut long_vec: Vec<u32> = Vec::with_capacity(std::u16::MAX as usize);
514         while long_vec.len() < std::u16::MAX as usize {
515             long_vec.push(0x8bad_f00d);
516         }
517         long_vec.push(0x00ba_b10c);
518 
519         let count = long_vec.len() * mem::size_of::<u32>();
520         let mut buf = vec![0; count];
521 
522         WireFormat::encode(&long_vec, &mut Cursor::new(&mut *buf)).expect_err("long vector");
523     }
524 
525     #[derive(Debug, PartialEq, P9WireFormat)]
526     struct Item {
527         a: u64,
528         b: String,
529         c: Vec<u16>,
530         buf: Data,
531     }
532 
533     #[test]
struct_encode()534     fn struct_encode() {
535         let item = Item {
536             a: 0xdead_10cc_00ba_b10c,
537             b: String::from("冻住,不许走!"),
538             c: vec![359, 492, 8891],
539             buf: Data(vec![254, 129, 0, 62, 49, 172]),
540         };
541 
542         let mut expected: Vec<u8> = vec![0x0c, 0xb1, 0xba, 0x00, 0xcc, 0x10, 0xad, 0xde];
543         let strlen = item.b.len() as u16;
544         expected.push(strlen as u8);
545         expected.push((strlen >> 8) as u8);
546         expected.extend_from_slice(item.b.as_bytes());
547 
548         let veclen = item.c.len() as u16;
549         expected.push(veclen as u8);
550         expected.push((veclen >> 8) as u8);
551         for val in &item.c {
552             expected.push(*val as u8);
553             expected.push((val >> 8) as u8);
554         }
555 
556         let buflen = item.buf.len() as u32;
557         expected.push(buflen as u8);
558         expected.push((buflen >> 8) as u8);
559         expected.push((buflen >> 16) as u8);
560         expected.push((buflen >> 24) as u8);
561         expected.extend_from_slice(&item.buf);
562 
563         let mut actual = vec![0; expected.len()];
564 
565         WireFormat::encode(&item, &mut Cursor::new(&mut *actual)).expect("failed to encode item");
566 
567         assert_eq!(expected, actual);
568     }
569 
570     #[test]
struct_decode()571     fn struct_decode() {
572         let expected = Item {
573             a: 0xface_b00c_0404_4b1d,
574             b: String::from("Огонь по готовности!"),
575             c: vec![20067, 32449, 549, 4972, 77, 1987],
576             buf: Data(vec![126, 236, 79, 59, 6, 159]),
577         };
578 
579         let mut input: Vec<u8> = vec![0x1d, 0x4b, 0x04, 0x04, 0x0c, 0xb0, 0xce, 0xfa];
580         let strlen = expected.b.len() as u16;
581         input.push(strlen as u8);
582         input.push((strlen >> 8) as u8);
583         input.extend_from_slice(expected.b.as_bytes());
584 
585         let veclen = expected.c.len() as u16;
586         input.push(veclen as u8);
587         input.push((veclen >> 8) as u8);
588         for val in &expected.c {
589             input.push(*val as u8);
590             input.push((val >> 8) as u8);
591         }
592 
593         let buflen = expected.buf.len() as u32;
594         input.push(buflen as u8);
595         input.push((buflen >> 8) as u8);
596         input.push((buflen >> 16) as u8);
597         input.push((buflen >> 24) as u8);
598         input.extend_from_slice(&expected.buf);
599 
600         let actual: Item =
601             WireFormat::decode(&mut Cursor::new(input)).expect("failed to decode item");
602 
603         assert_eq!(expected, actual);
604     }
605 
606     #[derive(Debug, PartialEq, P9WireFormat)]
607     struct Nested {
608         item: Item,
609         val: Vec<u64>,
610     }
611 
612     #[allow(clippy::vec_init_then_push)]
build_encoded_buffer(value: &Nested) -> Vec<u8>613     fn build_encoded_buffer(value: &Nested) -> Vec<u8> {
614         let mut result: Vec<u8> = Vec::new();
615 
616         // encode a
617         result.push(value.item.a as u8);
618         result.push((value.item.a >> 8) as u8);
619         result.push((value.item.a >> 16) as u8);
620         result.push((value.item.a >> 24) as u8);
621         result.push((value.item.a >> 32) as u8);
622         result.push((value.item.a >> 40) as u8);
623         result.push((value.item.a >> 48) as u8);
624         result.push((value.item.a >> 56) as u8);
625 
626         // encode b
627         result.push(value.item.b.len() as u8);
628         result.push((value.item.b.len() >> 8) as u8);
629         result.extend_from_slice(value.item.b.as_bytes());
630 
631         // encode c
632         result.push(value.item.c.len() as u8);
633         result.push((value.item.c.len() >> 8) as u8);
634         for val in &value.item.c {
635             result.push((val & 0xffu16) as u8);
636             result.push(((val >> 8) & 0xffu16) as u8);
637         }
638 
639         // encode buf
640         result.push(value.item.buf.len() as u8);
641         result.push((value.item.buf.len() >> 8) as u8);
642         result.push((value.item.buf.len() >> 16) as u8);
643         result.push((value.item.buf.len() >> 24) as u8);
644         result.extend_from_slice(&value.item.buf);
645 
646         // encode val
647         result.push(value.val.len() as u8);
648         result.push((value.val.len() >> 8) as u8);
649         for val in &value.val {
650             result.push(*val as u8);
651             result.push((val >> 8) as u8);
652             result.push((val >> 16) as u8);
653             result.push((val >> 24) as u8);
654             result.push((val >> 32) as u8);
655             result.push((val >> 40) as u8);
656             result.push((val >> 48) as u8);
657             result.push((val >> 56) as u8);
658         }
659 
660         result
661     }
662 
663     #[test]
nested_encode()664     fn nested_encode() {
665         let value = Nested {
666             item: Item {
667                 a: 0xcafe_d00d_8bad_f00d,
668                 b: String::from("龍が我が敵を喰らう!"),
669                 c: vec![2679, 55_919, 44, 38_819, 792],
670                 buf: Data(vec![129, 55, 200, 93, 7, 68]),
671             },
672             val: vec![1954978, 59, 4519, 15679],
673         };
674 
675         let expected = build_encoded_buffer(&value);
676 
677         let mut actual = vec![0; expected.len()];
678 
679         WireFormat::encode(&value, &mut Cursor::new(&mut *actual)).expect("failed to encode value");
680         assert_eq!(expected, actual);
681     }
682 
683     #[test]
nested_decode()684     fn nested_decode() {
685         let expected = Nested {
686             item: Item {
687                 a: 0x0ff1ce,
688                 b: String::from("龍神の剣を喰らえ!"),
689                 c: vec![21687, 159, 55, 9217, 192],
690                 buf: Data(vec![189, 22, 7, 59, 235]),
691             },
692             val: vec![15679, 8619196, 319746, 123957, 77, 0, 492],
693         };
694 
695         let input = build_encoded_buffer(&expected);
696 
697         assert_eq!(
698             expected,
699             <Nested as WireFormat>::decode(&mut Cursor::new(&*input))
700                 .expect("failed to decode value")
701         );
702     }
703 }
704