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