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