github.com/btcsuite/btcd@v0.24.0/wire/common_test.go (about) 1 // Copyright (c) 2013-2016 The btcsuite developers 2 // Use of this source code is governed by an ISC 3 // license that can be found in the LICENSE file. 4 5 package wire 6 7 import ( 8 "bytes" 9 "fmt" 10 "io" 11 "reflect" 12 "strings" 13 "testing" 14 15 "github.com/btcsuite/btcd/chaincfg/chainhash" 16 "github.com/davecgh/go-spew/spew" 17 ) 18 19 // mainNetGenesisHash is the hash of the first block in the block chain for the 20 // main network (genesis block). 21 var mainNetGenesisHash = chainhash.Hash([chainhash.HashSize]byte{ // Make go vet happy. 22 0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72, 23 0xc1, 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f, 24 0x93, 0x1e, 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c, 25 0x68, 0xd6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 26 }) 27 28 // mainNetGenesisMerkleRoot is the hash of the first transaction in the genesis 29 // block for the main network. 30 var mainNetGenesisMerkleRoot = chainhash.Hash([chainhash.HashSize]byte{ // Make go vet happy. 31 0x3b, 0xa3, 0xed, 0xfd, 0x7a, 0x7b, 0x12, 0xb2, 32 0x7a, 0xc7, 0x2c, 0x3e, 0x67, 0x76, 0x8f, 0x61, 33 0x7f, 0xc8, 0x1b, 0xc3, 0x88, 0x8a, 0x51, 0x32, 34 0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a, 35 }) 36 37 // fakeRandReader implements the io.Reader interface and is used to force 38 // errors in the RandomUint64 function. 39 type fakeRandReader struct { 40 n int 41 err error 42 } 43 44 // Read returns the fake reader error and the lesser of the fake reader value 45 // and the length of p. 46 func (r *fakeRandReader) Read(p []byte) (int, error) { 47 n := r.n 48 if n > len(p) { 49 n = len(p) 50 } 51 return n, r.err 52 } 53 54 // TestElementWire tests wire encode and decode for various element types. This 55 // is mainly to test the "fast" paths in readElement and writeElement which use 56 // type assertions to avoid reflection when possible. 57 func TestElementWire(t *testing.T) { 58 type writeElementReflect int32 59 60 tests := []struct { 61 in interface{} // Value to encode 62 buf []byte // Wire encoding 63 }{ 64 {int32(1), []byte{0x01, 0x00, 0x00, 0x00}}, 65 {uint32(256), []byte{0x00, 0x01, 0x00, 0x00}}, 66 { 67 int64(65536), 68 []byte{0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}, 69 }, 70 { 71 uint64(4294967296), 72 []byte{0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00}, 73 }, 74 { 75 true, 76 []byte{0x01}, 77 }, 78 { 79 false, 80 []byte{0x00}, 81 }, 82 { 83 [4]byte{0x01, 0x02, 0x03, 0x04}, 84 []byte{0x01, 0x02, 0x03, 0x04}, 85 }, 86 { 87 [CommandSize]byte{ 88 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 89 0x09, 0x0a, 0x0b, 0x0c, 90 }, 91 []byte{ 92 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 93 0x09, 0x0a, 0x0b, 0x0c, 94 }, 95 }, 96 { 97 [16]byte{ 98 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 99 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 100 }, 101 []byte{ 102 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 103 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 104 }, 105 }, 106 { 107 (*chainhash.Hash)(&[chainhash.HashSize]byte{ // Make go vet happy. 108 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 109 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 110 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 111 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 112 }), 113 []byte{ 114 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 115 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 116 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 117 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 118 }, 119 }, 120 { 121 SFNodeNetwork, 122 []byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 123 }, 124 { 125 InvTypeTx, 126 []byte{0x01, 0x00, 0x00, 0x00}, 127 }, 128 { 129 MainNet, 130 []byte{0xf9, 0xbe, 0xb4, 0xd9}, 131 }, 132 // Type not supported by the "fast" path and requires reflection. 133 { 134 writeElementReflect(1), 135 []byte{0x01, 0x00, 0x00, 0x00}, 136 }, 137 } 138 139 t.Logf("Running %d tests", len(tests)) 140 for i, test := range tests { 141 // Write to wire format. 142 var buf bytes.Buffer 143 err := writeElement(&buf, test.in) 144 if err != nil { 145 t.Errorf("writeElement #%d error %v", i, err) 146 continue 147 } 148 if !bytes.Equal(buf.Bytes(), test.buf) { 149 t.Errorf("writeElement #%d\n got: %s want: %s", i, 150 spew.Sdump(buf.Bytes()), spew.Sdump(test.buf)) 151 continue 152 } 153 154 // Read from wire format. 155 rbuf := bytes.NewReader(test.buf) 156 val := test.in 157 if reflect.ValueOf(test.in).Kind() != reflect.Ptr { 158 val = reflect.New(reflect.TypeOf(test.in)).Interface() 159 } 160 err = readElement(rbuf, val) 161 if err != nil { 162 t.Errorf("readElement #%d error %v", i, err) 163 continue 164 } 165 ival := val 166 if reflect.ValueOf(test.in).Kind() != reflect.Ptr { 167 ival = reflect.Indirect(reflect.ValueOf(val)).Interface() 168 } 169 if !reflect.DeepEqual(ival, test.in) { 170 t.Errorf("readElement #%d\n got: %s want: %s", i, 171 spew.Sdump(ival), spew.Sdump(test.in)) 172 continue 173 } 174 } 175 } 176 177 // TestElementWireErrors performs negative tests against wire encode and decode 178 // of various element types to confirm error paths work correctly. 179 func TestElementWireErrors(t *testing.T) { 180 tests := []struct { 181 in interface{} // Value to encode 182 max int // Max size of fixed buffer to induce errors 183 writeErr error // Expected write error 184 readErr error // Expected read error 185 }{ 186 {int32(1), 0, io.ErrShortWrite, io.EOF}, 187 {uint32(256), 0, io.ErrShortWrite, io.EOF}, 188 {int64(65536), 0, io.ErrShortWrite, io.EOF}, 189 {true, 0, io.ErrShortWrite, io.EOF}, 190 {[4]byte{0x01, 0x02, 0x03, 0x04}, 0, io.ErrShortWrite, io.EOF}, 191 { 192 [CommandSize]byte{ 193 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 194 0x09, 0x0a, 0x0b, 0x0c, 195 }, 196 0, io.ErrShortWrite, io.EOF, 197 }, 198 { 199 [16]byte{ 200 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 201 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 202 }, 203 0, io.ErrShortWrite, io.EOF, 204 }, 205 { 206 (*chainhash.Hash)(&[chainhash.HashSize]byte{ // Make go vet happy. 207 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 208 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 209 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 210 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 211 }), 212 0, io.ErrShortWrite, io.EOF, 213 }, 214 {SFNodeNetwork, 0, io.ErrShortWrite, io.EOF}, 215 {InvTypeTx, 0, io.ErrShortWrite, io.EOF}, 216 {MainNet, 0, io.ErrShortWrite, io.EOF}, 217 } 218 219 t.Logf("Running %d tests", len(tests)) 220 for i, test := range tests { 221 // Encode to wire format. 222 w := newFixedWriter(test.max) 223 err := writeElement(w, test.in) 224 if err != test.writeErr { 225 t.Errorf("writeElement #%d wrong error got: %v, want: %v", 226 i, err, test.writeErr) 227 continue 228 } 229 230 // Decode from wire format. 231 r := newFixedReader(test.max, nil) 232 val := test.in 233 if reflect.ValueOf(test.in).Kind() != reflect.Ptr { 234 val = reflect.New(reflect.TypeOf(test.in)).Interface() 235 } 236 err = readElement(r, val) 237 if err != test.readErr { 238 t.Errorf("readElement #%d wrong error got: %v, want: %v", 239 i, err, test.readErr) 240 continue 241 } 242 } 243 } 244 245 // TestVarIntWire tests wire encode and decode for variable length integers. 246 func TestVarIntWire(t *testing.T) { 247 pver := ProtocolVersion 248 249 tests := []struct { 250 in uint64 // Value to encode 251 out uint64 // Expected decoded value 252 buf []byte // Wire encoding 253 pver uint32 // Protocol version for wire encoding 254 }{ 255 // Latest protocol version. 256 // Single byte 257 {0, 0, []byte{0x00}, pver}, 258 // Max single byte 259 {0xfc, 0xfc, []byte{0xfc}, pver}, 260 // Min 2-byte 261 {0xfd, 0xfd, []byte{0xfd, 0x0fd, 0x00}, pver}, 262 // Max 2-byte 263 {0xffff, 0xffff, []byte{0xfd, 0xff, 0xff}, pver}, 264 // Min 4-byte 265 {0x10000, 0x10000, []byte{0xfe, 0x00, 0x00, 0x01, 0x00}, pver}, 266 // Max 4-byte 267 {0xffffffff, 0xffffffff, []byte{0xfe, 0xff, 0xff, 0xff, 0xff}, pver}, 268 // Min 8-byte 269 { 270 0x100000000, 0x100000000, 271 []byte{0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00}, 272 pver, 273 }, 274 // Max 8-byte 275 { 276 0xffffffffffffffff, 0xffffffffffffffff, 277 []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 278 pver, 279 }, 280 } 281 282 t.Logf("Running %d tests", len(tests)) 283 for i, test := range tests { 284 // Encode to wire format. 285 var buf bytes.Buffer 286 err := WriteVarInt(&buf, test.pver, test.in) 287 if err != nil { 288 t.Errorf("WriteVarInt #%d error %v", i, err) 289 continue 290 } 291 if !bytes.Equal(buf.Bytes(), test.buf) { 292 t.Errorf("WriteVarInt #%d\n got: %s want: %s", i, 293 spew.Sdump(buf.Bytes()), spew.Sdump(test.buf)) 294 continue 295 } 296 297 // Decode from wire format. 298 rbuf := bytes.NewReader(test.buf) 299 val, err := ReadVarInt(rbuf, test.pver) 300 if err != nil { 301 t.Errorf("ReadVarInt #%d error %v", i, err) 302 continue 303 } 304 if val != test.out { 305 t.Errorf("ReadVarInt #%d\n got: %d want: %d", i, 306 val, test.out) 307 continue 308 } 309 } 310 } 311 312 // TestVarIntWireErrors performs negative tests against wire encode and decode 313 // of variable length integers to confirm error paths work correctly. 314 func TestVarIntWireErrors(t *testing.T) { 315 pver := ProtocolVersion 316 317 tests := []struct { 318 in uint64 // Value to encode 319 buf []byte // Wire encoding 320 pver uint32 // Protocol version for wire encoding 321 max int // Max size of fixed buffer to induce errors 322 writeErr error // Expected write error 323 readErr error // Expected read error 324 }{ 325 // Force errors on discriminant. 326 {0, []byte{0x00}, pver, 0, io.ErrShortWrite, io.EOF}, 327 // Force errors on 2-byte read/write. 328 {0xfd, []byte{0xfd}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF}, 329 // Force errors on 4-byte read/write. 330 {0x10000, []byte{0xfe}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF}, 331 // Force errors on 8-byte read/write. 332 {0x100000000, []byte{0xff}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF}, 333 } 334 335 t.Logf("Running %d tests", len(tests)) 336 for i, test := range tests { 337 // Encode to wire format. 338 w := newFixedWriter(test.max) 339 err := WriteVarInt(w, test.pver, test.in) 340 if err != test.writeErr { 341 t.Errorf("WriteVarInt #%d wrong error got: %v, want: %v", 342 i, err, test.writeErr) 343 continue 344 } 345 346 // Decode from wire format. 347 r := newFixedReader(test.max, test.buf) 348 _, err = ReadVarInt(r, test.pver) 349 if err != test.readErr { 350 t.Errorf("ReadVarInt #%d wrong error got: %v, want: %v", 351 i, err, test.readErr) 352 continue 353 } 354 } 355 } 356 357 // TestVarIntNonCanonical ensures variable length integers that are not encoded 358 // canonically return the expected error. 359 func TestVarIntNonCanonical(t *testing.T) { 360 pver := ProtocolVersion 361 362 tests := []struct { 363 name string // Test name for easier identification 364 in []byte // Value to decode 365 pver uint32 // Protocol version for wire encoding 366 }{ 367 { 368 "0 encoded with 3 bytes", []byte{0xfd, 0x00, 0x00}, 369 pver, 370 }, 371 { 372 "max single-byte value encoded with 3 bytes", 373 []byte{0xfd, 0xfc, 0x00}, pver, 374 }, 375 { 376 "0 encoded with 5 bytes", 377 []byte{0xfe, 0x00, 0x00, 0x00, 0x00}, pver, 378 }, 379 { 380 "max three-byte value encoded with 5 bytes", 381 []byte{0xfe, 0xff, 0xff, 0x00, 0x00}, pver, 382 }, 383 { 384 "0 encoded with 9 bytes", 385 []byte{0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 386 pver, 387 }, 388 { 389 "max five-byte value encoded with 9 bytes", 390 []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00}, 391 pver, 392 }, 393 } 394 395 t.Logf("Running %d tests", len(tests)) 396 for i, test := range tests { 397 // Decode from wire format. 398 rbuf := bytes.NewReader(test.in) 399 val, err := ReadVarInt(rbuf, test.pver) 400 if _, ok := err.(*MessageError); !ok { 401 t.Errorf("ReadVarInt #%d (%s) unexpected error %v", i, 402 test.name, err) 403 continue 404 } 405 if val != 0 { 406 t.Errorf("ReadVarInt #%d (%s)\n got: %d want: 0", i, 407 test.name, val) 408 continue 409 } 410 } 411 } 412 413 // TestVarIntWire tests the serialize size for variable length integers. 414 func TestVarIntSerializeSize(t *testing.T) { 415 tests := []struct { 416 val uint64 // Value to get the serialized size for 417 size int // Expected serialized size 418 }{ 419 // Single byte 420 {0, 1}, 421 // Max single byte 422 {0xfc, 1}, 423 // Min 2-byte 424 {0xfd, 3}, 425 // Max 2-byte 426 {0xffff, 3}, 427 // Min 4-byte 428 {0x10000, 5}, 429 // Max 4-byte 430 {0xffffffff, 5}, 431 // Min 8-byte 432 {0x100000000, 9}, 433 // Max 8-byte 434 {0xffffffffffffffff, 9}, 435 } 436 437 t.Logf("Running %d tests", len(tests)) 438 for i, test := range tests { 439 serializedSize := VarIntSerializeSize(test.val) 440 if serializedSize != test.size { 441 t.Errorf("VarIntSerializeSize #%d got: %d, want: %d", i, 442 serializedSize, test.size) 443 continue 444 } 445 } 446 } 447 448 // TestVarStringWire tests wire encode and decode for variable length strings. 449 func TestVarStringWire(t *testing.T) { 450 pver := ProtocolVersion 451 452 // str256 is a string that takes a 2-byte varint to encode. 453 str256 := strings.Repeat("test", 64) 454 455 tests := []struct { 456 in string // String to encode 457 out string // String to decoded value 458 buf []byte // Wire encoding 459 pver uint32 // Protocol version for wire encoding 460 }{ 461 // Latest protocol version. 462 // Empty string 463 {"", "", []byte{0x00}, pver}, 464 // Single byte varint + string 465 {"Test", "Test", append([]byte{0x04}, []byte("Test")...), pver}, 466 // 2-byte varint + string 467 {str256, str256, append([]byte{0xfd, 0x00, 0x01}, []byte(str256)...), pver}, 468 } 469 470 t.Logf("Running %d tests", len(tests)) 471 for i, test := range tests { 472 // Encode to wire format. 473 var buf bytes.Buffer 474 err := WriteVarString(&buf, test.pver, test.in) 475 if err != nil { 476 t.Errorf("WriteVarString #%d error %v", i, err) 477 continue 478 } 479 if !bytes.Equal(buf.Bytes(), test.buf) { 480 t.Errorf("WriteVarString #%d\n got: %s want: %s", i, 481 spew.Sdump(buf.Bytes()), spew.Sdump(test.buf)) 482 continue 483 } 484 485 // Decode from wire format. 486 rbuf := bytes.NewReader(test.buf) 487 val, err := ReadVarString(rbuf, test.pver) 488 if err != nil { 489 t.Errorf("ReadVarString #%d error %v", i, err) 490 continue 491 } 492 if val != test.out { 493 t.Errorf("ReadVarString #%d\n got: %s want: %s", i, 494 val, test.out) 495 continue 496 } 497 } 498 } 499 500 // TestVarStringWireErrors performs negative tests against wire encode and 501 // decode of variable length strings to confirm error paths work correctly. 502 func TestVarStringWireErrors(t *testing.T) { 503 pver := ProtocolVersion 504 505 // str256 is a string that takes a 2-byte varint to encode. 506 str256 := strings.Repeat("test", 64) 507 508 tests := []struct { 509 in string // Value to encode 510 buf []byte // Wire encoding 511 pver uint32 // Protocol version for wire encoding 512 max int // Max size of fixed buffer to induce errors 513 writeErr error // Expected write error 514 readErr error // Expected read error 515 }{ 516 // Latest protocol version with intentional read/write errors. 517 // Force errors on empty string. 518 {"", []byte{0x00}, pver, 0, io.ErrShortWrite, io.EOF}, 519 // Force error on single byte varint + string. 520 {"Test", []byte{0x04}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF}, 521 // Force errors on 2-byte varint + string. 522 {str256, []byte{0xfd}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF}, 523 } 524 525 t.Logf("Running %d tests", len(tests)) 526 for i, test := range tests { 527 // Encode to wire format. 528 w := newFixedWriter(test.max) 529 err := WriteVarString(w, test.pver, test.in) 530 if err != test.writeErr { 531 t.Errorf("WriteVarString #%d wrong error got: %v, want: %v", 532 i, err, test.writeErr) 533 continue 534 } 535 536 // Decode from wire format. 537 r := newFixedReader(test.max, test.buf) 538 _, err = ReadVarString(r, test.pver) 539 if err != test.readErr { 540 t.Errorf("ReadVarString #%d wrong error got: %v, want: %v", 541 i, err, test.readErr) 542 continue 543 } 544 } 545 } 546 547 // TestVarStringOverflowErrors performs tests to ensure deserializing variable 548 // length strings intentionally crafted to use large values for the string 549 // length are handled properly. This could otherwise potentially be used as an 550 // attack vector. 551 func TestVarStringOverflowErrors(t *testing.T) { 552 pver := ProtocolVersion 553 554 tests := []struct { 555 buf []byte // Wire encoding 556 pver uint32 // Protocol version for wire encoding 557 err error // Expected error 558 }{ 559 {[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 560 pver, &MessageError{}}, 561 {[]byte{0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, 562 pver, &MessageError{}}, 563 } 564 565 t.Logf("Running %d tests", len(tests)) 566 for i, test := range tests { 567 // Decode from wire format. 568 rbuf := bytes.NewReader(test.buf) 569 _, err := ReadVarString(rbuf, test.pver) 570 if reflect.TypeOf(err) != reflect.TypeOf(test.err) { 571 t.Errorf("ReadVarString #%d wrong error got: %v, "+ 572 "want: %v", i, err, reflect.TypeOf(test.err)) 573 continue 574 } 575 } 576 577 } 578 579 // TestVarBytesWire tests wire encode and decode for variable length byte array. 580 func TestVarBytesWire(t *testing.T) { 581 pver := ProtocolVersion 582 583 // bytes256 is a byte array that takes a 2-byte varint to encode. 584 bytes256 := bytes.Repeat([]byte{0x01}, 256) 585 586 tests := []struct { 587 in []byte // Byte Array to write 588 buf []byte // Wire encoding 589 pver uint32 // Protocol version for wire encoding 590 }{ 591 // Latest protocol version. 592 // Empty byte array 593 {[]byte{}, []byte{0x00}, pver}, 594 // Single byte varint + byte array 595 {[]byte{0x01}, []byte{0x01, 0x01}, pver}, 596 // 2-byte varint + byte array 597 {bytes256, append([]byte{0xfd, 0x00, 0x01}, bytes256...), pver}, 598 } 599 600 t.Logf("Running %d tests", len(tests)) 601 for i, test := range tests { 602 // Encode to wire format. 603 var buf bytes.Buffer 604 err := WriteVarBytes(&buf, test.pver, test.in) 605 if err != nil { 606 t.Errorf("WriteVarBytes #%d error %v", i, err) 607 continue 608 } 609 if !bytes.Equal(buf.Bytes(), test.buf) { 610 t.Errorf("WriteVarBytes #%d\n got: %s want: %s", i, 611 spew.Sdump(buf.Bytes()), spew.Sdump(test.buf)) 612 continue 613 } 614 615 // Decode from wire format. 616 rbuf := bytes.NewReader(test.buf) 617 val, err := ReadVarBytes(rbuf, test.pver, MaxMessagePayload, 618 "test payload") 619 if err != nil { 620 t.Errorf("ReadVarBytes #%d error %v", i, err) 621 continue 622 } 623 if !bytes.Equal(buf.Bytes(), test.buf) { 624 t.Errorf("ReadVarBytes #%d\n got: %s want: %s", i, 625 val, test.buf) 626 continue 627 } 628 } 629 } 630 631 // TestVarBytesWireErrors performs negative tests against wire encode and 632 // decode of variable length byte arrays to confirm error paths work correctly. 633 func TestVarBytesWireErrors(t *testing.T) { 634 pver := ProtocolVersion 635 636 // bytes256 is a byte array that takes a 2-byte varint to encode. 637 bytes256 := bytes.Repeat([]byte{0x01}, 256) 638 639 tests := []struct { 640 in []byte // Byte Array to write 641 buf []byte // Wire encoding 642 pver uint32 // Protocol version for wire encoding 643 max int // Max size of fixed buffer to induce errors 644 writeErr error // Expected write error 645 readErr error // Expected read error 646 }{ 647 // Latest protocol version with intentional read/write errors. 648 // Force errors on empty byte array. 649 {[]byte{}, []byte{0x00}, pver, 0, io.ErrShortWrite, io.EOF}, 650 // Force error on single byte varint + byte array. 651 {[]byte{0x01, 0x02, 0x03}, []byte{0x04}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF}, 652 // Force errors on 2-byte varint + byte array. 653 {bytes256, []byte{0xfd}, pver, 2, io.ErrShortWrite, io.ErrUnexpectedEOF}, 654 } 655 656 t.Logf("Running %d tests", len(tests)) 657 for i, test := range tests { 658 // Encode to wire format. 659 w := newFixedWriter(test.max) 660 err := WriteVarBytes(w, test.pver, test.in) 661 if err != test.writeErr { 662 t.Errorf("WriteVarBytes #%d wrong error got: %v, want: %v", 663 i, err, test.writeErr) 664 continue 665 } 666 667 // Decode from wire format. 668 r := newFixedReader(test.max, test.buf) 669 _, err = ReadVarBytes(r, test.pver, MaxMessagePayload, 670 "test payload") 671 if err != test.readErr { 672 t.Errorf("ReadVarBytes #%d wrong error got: %v, want: %v", 673 i, err, test.readErr) 674 continue 675 } 676 } 677 } 678 679 // TestVarBytesOverflowErrors performs tests to ensure deserializing variable 680 // length byte arrays intentionally crafted to use large values for the array 681 // length are handled properly. This could otherwise potentially be used as an 682 // attack vector. 683 func TestVarBytesOverflowErrors(t *testing.T) { 684 pver := ProtocolVersion 685 686 tests := []struct { 687 buf []byte // Wire encoding 688 pver uint32 // Protocol version for wire encoding 689 err error // Expected error 690 }{ 691 {[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 692 pver, &MessageError{}}, 693 {[]byte{0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, 694 pver, &MessageError{}}, 695 } 696 697 t.Logf("Running %d tests", len(tests)) 698 for i, test := range tests { 699 // Decode from wire format. 700 rbuf := bytes.NewReader(test.buf) 701 _, err := ReadVarBytes(rbuf, test.pver, MaxMessagePayload, 702 "test payload") 703 if reflect.TypeOf(err) != reflect.TypeOf(test.err) { 704 t.Errorf("ReadVarBytes #%d wrong error got: %v, "+ 705 "want: %v", i, err, reflect.TypeOf(test.err)) 706 continue 707 } 708 } 709 710 } 711 712 // TestRandomUint64 exercises the randomness of the random number generator on 713 // the system by ensuring the probability of the generated numbers. If the RNG 714 // is evenly distributed as a proper cryptographic RNG should be, there really 715 // should only be 1 number < 2^56 in 2^8 tries for a 64-bit number. However, 716 // use a higher number of 5 to really ensure the test doesn't fail unless the 717 // RNG is just horrendous. 718 func TestRandomUint64(t *testing.T) { 719 tries := 1 << 8 // 2^8 720 watermark := uint64(1 << 56) // 2^56 721 maxHits := 5 722 badRNG := "The random number generator on this system is clearly " + 723 "terrible since we got %d values less than %d in %d runs " + 724 "when only %d was expected" 725 726 numHits := 0 727 for i := 0; i < tries; i++ { 728 nonce, err := RandomUint64() 729 if err != nil { 730 t.Errorf("RandomUint64 iteration %d failed - err %v", 731 i, err) 732 return 733 } 734 if nonce < watermark { 735 numHits++ 736 } 737 if numHits > maxHits { 738 str := fmt.Sprintf(badRNG, numHits, watermark, tries, maxHits) 739 t.Errorf("Random Uint64 iteration %d failed - %v %v", i, 740 str, numHits) 741 return 742 } 743 } 744 } 745 746 // TestRandomUint64Errors uses a fake reader to force error paths to be executed 747 // and checks the results accordingly. 748 func TestRandomUint64Errors(t *testing.T) { 749 // Test short reads. 750 fr := &fakeRandReader{n: 2, err: io.EOF} 751 nonce, err := randomUint64(fr) 752 if err != io.ErrUnexpectedEOF { 753 t.Errorf("Error not expected value of %v [%v]", 754 io.ErrUnexpectedEOF, err) 755 } 756 if nonce != 0 { 757 t.Errorf("Nonce is not 0 [%v]", nonce) 758 } 759 }