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