github.com/decred/dcrlnd@v0.7.6/channeldb/migration/lnwire21/lnwire_test.go (about) 1 package lnwire 2 3 import ( 4 "bytes" 5 "encoding/binary" 6 "encoding/hex" 7 "image/color" 8 "math" 9 "math/rand" 10 "net" 11 "reflect" 12 "testing" 13 "testing/quick" 14 "time" 15 16 "github.com/davecgh/go-spew/spew" 17 18 "github.com/decred/dcrd/chaincfg/chainhash" 19 "github.com/decred/dcrd/dcrec/secp256k1/v4" 20 "github.com/decred/dcrd/dcrec/secp256k1/v4/ecdsa" 21 "github.com/decred/dcrd/dcrutil/v4" 22 "github.com/decred/dcrd/wire" 23 "github.com/decred/dcrlnd/tor" 24 ) 25 26 func modNScalar(b []byte) *secp256k1.ModNScalar { 27 var m secp256k1.ModNScalar 28 m.SetByteSlice(b) 29 return &m 30 } 31 32 var ( 33 shaHash1Bytes, _ = hex.DecodeString("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855") 34 shaHash1, _ = chainhash.NewHash(shaHash1Bytes) 35 outpoint1 = wire.NewOutPoint(shaHash1, 0, wire.TxTreeRegular) 36 rBytes, _ = hex.DecodeString("63724406601629180062774974542967536251589935445068131219452686511677818569431") 37 sBytes, _ = hex.DecodeString("18801056069249825825291287104931333862866033135609736119018462340006816851118") 38 testSig = ecdsa.NewSignature(modNScalar(rBytes), modNScalar(sBytes)) 39 ) 40 41 const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 42 43 func randAlias(r *rand.Rand) NodeAlias { 44 var a NodeAlias 45 for i := range a { 46 a[i] = letterBytes[r.Intn(len(letterBytes))] 47 } 48 49 return a 50 } 51 52 func randPubKey() (*secp256k1.PublicKey, error) { 53 priv, err := secp256k1.GeneratePrivateKey() 54 if err != nil { 55 return nil, err 56 } 57 58 return priv.PubKey(), nil 59 } 60 61 func randRawKey() ([33]byte, error) { 62 var n [33]byte 63 64 priv, err := secp256k1.GeneratePrivateKey() 65 if err != nil { 66 return n, err 67 } 68 69 copy(n[:], priv.PubKey().SerializeCompressed()) 70 71 return n, nil 72 } 73 74 func randDeliveryAddress(r *rand.Rand) (DeliveryAddress, error) { 75 // Generate size minimum one. Empty scripts should be tested specifically. 76 size := r.Intn(deliveryAddressMaxSize) + 1 77 da := DeliveryAddress(make([]byte, size)) 78 79 _, err := r.Read(da) 80 return da, err 81 } 82 83 func randRawFeatureVector(r *rand.Rand) *RawFeatureVector { 84 featureVec := NewRawFeatureVector() 85 for i := 0; i < 10000; i++ { 86 if r.Int31n(2) == 0 { 87 featureVec.Set(FeatureBit(i)) 88 } 89 } 90 return featureVec 91 } 92 93 func randTCP4Addr(r *rand.Rand) (*net.TCPAddr, error) { 94 var ip [4]byte 95 if _, err := r.Read(ip[:]); err != nil { 96 return nil, err 97 } 98 99 var port [2]byte 100 if _, err := r.Read(port[:]); err != nil { 101 return nil, err 102 } 103 104 addrIP := net.IP(ip[:]) 105 addrPort := int(binary.BigEndian.Uint16(port[:])) 106 107 return &net.TCPAddr{IP: addrIP, Port: addrPort}, nil 108 } 109 110 func randTCP6Addr(r *rand.Rand) (*net.TCPAddr, error) { 111 var ip [16]byte 112 if _, err := r.Read(ip[:]); err != nil { 113 return nil, err 114 } 115 116 var port [2]byte 117 if _, err := r.Read(port[:]); err != nil { 118 return nil, err 119 } 120 121 addrIP := net.IP(ip[:]) 122 addrPort := int(binary.BigEndian.Uint16(port[:])) 123 124 return &net.TCPAddr{IP: addrIP, Port: addrPort}, nil 125 } 126 127 func randV2OnionAddr(r *rand.Rand) (*tor.OnionAddr, error) { 128 var serviceID [tor.V2DecodedLen]byte 129 if _, err := r.Read(serviceID[:]); err != nil { 130 return nil, err 131 } 132 133 var port [2]byte 134 if _, err := r.Read(port[:]); err != nil { 135 return nil, err 136 } 137 138 onionService := tor.Base32Encoding.EncodeToString(serviceID[:]) 139 onionService += tor.OnionSuffix 140 addrPort := int(binary.BigEndian.Uint16(port[:])) 141 142 return &tor.OnionAddr{OnionService: onionService, Port: addrPort}, nil 143 } 144 145 func randV3OnionAddr(r *rand.Rand) (*tor.OnionAddr, error) { 146 var serviceID [tor.V3DecodedLen]byte 147 if _, err := r.Read(serviceID[:]); err != nil { 148 return nil, err 149 } 150 151 var port [2]byte 152 if _, err := r.Read(port[:]); err != nil { 153 return nil, err 154 } 155 156 onionService := tor.Base32Encoding.EncodeToString(serviceID[:]) 157 onionService += tor.OnionSuffix 158 addrPort := int(binary.BigEndian.Uint16(port[:])) 159 160 return &tor.OnionAddr{OnionService: onionService, Port: addrPort}, nil 161 } 162 163 func randAddrs(r *rand.Rand) ([]net.Addr, error) { 164 tcp4Addr, err := randTCP4Addr(r) 165 if err != nil { 166 return nil, err 167 } 168 169 tcp6Addr, err := randTCP6Addr(r) 170 if err != nil { 171 return nil, err 172 } 173 174 v2OnionAddr, err := randV2OnionAddr(r) 175 if err != nil { 176 return nil, err 177 } 178 179 v3OnionAddr, err := randV3OnionAddr(r) 180 if err != nil { 181 return nil, err 182 } 183 184 return []net.Addr{tcp4Addr, tcp6Addr, v2OnionAddr, v3OnionAddr}, nil 185 } 186 187 // TestChanUpdateChanFlags ensures that converting the ChanUpdateChanFlags and 188 // ChanUpdateMsgFlags bitfields to a string behaves as expected. 189 func TestChanUpdateChanFlags(t *testing.T) { 190 t.Parallel() 191 192 testCases := []struct { 193 flags uint8 194 expected string 195 }{ 196 { 197 flags: 0, 198 expected: "00000000", 199 }, 200 { 201 flags: 1, 202 expected: "00000001", 203 }, 204 { 205 flags: 3, 206 expected: "00000011", 207 }, 208 { 209 flags: 255, 210 expected: "11111111", 211 }, 212 } 213 214 for _, test := range testCases { 215 chanFlag := ChanUpdateChanFlags(test.flags) 216 toStr := chanFlag.String() 217 if toStr != test.expected { 218 t.Fatalf("expected %v, got %v", 219 test.expected, toStr) 220 } 221 222 msgFlag := ChanUpdateMsgFlags(test.flags) 223 toStr = msgFlag.String() 224 if toStr != test.expected { 225 t.Fatalf("expected %v, got %v", 226 test.expected, toStr) 227 } 228 } 229 } 230 231 func TestMaxOutPointIndex(t *testing.T) { 232 t.Parallel() 233 234 op := wire.OutPoint{ 235 Index: math.MaxUint32, 236 } 237 238 var b bytes.Buffer 239 if err := WriteElement(&b, op); err == nil { 240 t.Fatalf("write of outPoint should fail, index exceeds 16-bits") 241 } 242 } 243 244 func TestEmptyMessageUnknownType(t *testing.T) { 245 t.Parallel() 246 247 fakeType := MessageType(math.MaxUint16) 248 if _, err := makeEmptyMessage(fakeType); err == nil { 249 t.Fatalf("should not be able to make an empty message of an " + 250 "unknown type") 251 } 252 } 253 254 // TestLightningWireProtocol uses the testing/quick package to create a series 255 // of fuzz tests to attempt to break a primary scenario which is implemented as 256 // property based testing scenario. 257 // 258 // Debug help: when the message payload can reach a size larger than the return 259 // value of MaxPayloadLength, the test can panic without a helpful message. 260 func TestLightningWireProtocol(t *testing.T) { 261 t.Parallel() 262 263 // mainScenario is the primary test that will programmatically be 264 // executed for all registered wire messages. The quick-checker within 265 // testing/quick will attempt to find an input to this function, s.t 266 // the function returns false, if so then we've found an input that 267 // violates our model of the system. 268 mainScenario := func(msg Message) bool { 269 // Give a new message, we'll serialize the message into a new 270 // bytes buffer. 271 var b bytes.Buffer 272 if _, err := WriteMessage(&b, msg, 0); err != nil { 273 t.Fatalf("unable to write msg: %v", err) 274 return false 275 } 276 277 // Next, we'll ensure that the serialized payload (subtracting 278 // the 2 bytes for the message type) is _below_ the specified 279 // max payload size for this message. 280 payloadLen := uint32(b.Len()) - 2 281 if payloadLen > msg.MaxPayloadLength(0) { 282 t.Fatalf("msg payload constraint violated: %v > %v", 283 payloadLen, msg.MaxPayloadLength(0)) 284 return false 285 } 286 287 // Finally, we'll deserialize the message from the written 288 // buffer, and finally assert that the messages are equal. 289 newMsg, err := ReadMessage(&b, 0) 290 if err != nil { 291 t.Fatalf("unable to read msg: %v", err) 292 return false 293 } 294 if !reflect.DeepEqual(msg, newMsg) { 295 t.Fatalf("messages don't match after re-encoding: %v "+ 296 "vs %v", spew.Sdump(msg), spew.Sdump(newMsg)) 297 return false 298 } 299 300 return true 301 } 302 303 // customTypeGen is a map of functions that are able to randomly 304 // generate a given type. These functions are needed for types which 305 // are too complex for the testing/quick package to automatically 306 // generate. 307 customTypeGen := map[MessageType]func([]reflect.Value, *rand.Rand){ 308 MsgInit: func(v []reflect.Value, r *rand.Rand) { 309 req := NewInitMessage( 310 randRawFeatureVector(r), 311 randRawFeatureVector(r), 312 ) 313 314 v[0] = reflect.ValueOf(*req) 315 }, 316 MsgOpenChannel: func(v []reflect.Value, r *rand.Rand) { 317 req := OpenChannel{ 318 FundingAmount: dcrutil.Amount(r.Int63()), 319 PushAmount: MilliAtom(r.Int63()), 320 DustLimit: dcrutil.Amount(r.Int63()), 321 MaxValueInFlight: MilliAtom(r.Int63()), 322 ChannelReserve: dcrutil.Amount(r.Int63()), 323 HtlcMinimum: MilliAtom(r.Int31()), 324 FeePerKiloByte: uint32(r.Int63()), 325 CsvDelay: uint16(r.Int31()), 326 MaxAcceptedHTLCs: uint16(r.Int31()), 327 ChannelFlags: FundingFlag(uint8(r.Int31())), 328 } 329 330 if _, err := r.Read(req.ChainHash[:]); err != nil { 331 t.Fatalf("unable to generate chain hash: %v", err) 332 return 333 } 334 335 if _, err := r.Read(req.PendingChannelID[:]); err != nil { 336 t.Fatalf("unable to generate pending chan id: %v", err) 337 return 338 } 339 340 var err error 341 req.FundingKey, err = randPubKey() 342 if err != nil { 343 t.Fatalf("unable to generate key: %v", err) 344 return 345 } 346 req.RevocationPoint, err = randPubKey() 347 if err != nil { 348 t.Fatalf("unable to generate key: %v", err) 349 return 350 } 351 req.PaymentPoint, err = randPubKey() 352 if err != nil { 353 t.Fatalf("unable to generate key: %v", err) 354 return 355 } 356 req.DelayedPaymentPoint, err = randPubKey() 357 if err != nil { 358 t.Fatalf("unable to generate key: %v", err) 359 return 360 } 361 req.HtlcPoint, err = randPubKey() 362 if err != nil { 363 t.Fatalf("unable to generate key: %v", err) 364 return 365 } 366 req.FirstCommitmentPoint, err = randPubKey() 367 if err != nil { 368 t.Fatalf("unable to generate key: %v", err) 369 return 370 } 371 372 // 1/2 chance empty upfront shutdown script. 373 if r.Intn(2) == 0 { 374 req.UpfrontShutdownScript, err = randDeliveryAddress(r) 375 if err != nil { 376 t.Fatalf("unable to generate delivery address: %v", err) 377 return 378 } 379 } else { 380 req.UpfrontShutdownScript = []byte{} 381 } 382 383 v[0] = reflect.ValueOf(req) 384 }, 385 MsgAcceptChannel: func(v []reflect.Value, r *rand.Rand) { 386 req := AcceptChannel{ 387 DustLimit: dcrutil.Amount(r.Int63()), 388 MaxValueInFlight: MilliAtom(r.Int63()), 389 ChannelReserve: dcrutil.Amount(r.Int63()), 390 MinAcceptDepth: uint32(r.Int31()), 391 HtlcMinimum: MilliAtom(r.Int31()), 392 CsvDelay: uint16(r.Int31()), 393 MaxAcceptedHTLCs: uint16(r.Int31()), 394 } 395 396 if _, err := r.Read(req.PendingChannelID[:]); err != nil { 397 t.Fatalf("unable to generate pending chan id: %v", err) 398 return 399 } 400 401 var err error 402 req.FundingKey, err = randPubKey() 403 if err != nil { 404 t.Fatalf("unable to generate key: %v", err) 405 return 406 } 407 req.RevocationPoint, err = randPubKey() 408 if err != nil { 409 t.Fatalf("unable to generate key: %v", err) 410 return 411 } 412 req.PaymentPoint, err = randPubKey() 413 if err != nil { 414 t.Fatalf("unable to generate key: %v", err) 415 return 416 } 417 req.DelayedPaymentPoint, err = randPubKey() 418 if err != nil { 419 t.Fatalf("unable to generate key: %v", err) 420 return 421 } 422 req.HtlcPoint, err = randPubKey() 423 if err != nil { 424 t.Fatalf("unable to generate key: %v", err) 425 return 426 } 427 req.FirstCommitmentPoint, err = randPubKey() 428 if err != nil { 429 t.Fatalf("unable to generate key: %v", err) 430 return 431 } 432 433 // 1/2 chance empty upfront shutdown script. 434 if r.Intn(2) == 0 { 435 req.UpfrontShutdownScript, err = randDeliveryAddress(r) 436 if err != nil { 437 t.Fatalf("unable to generate delivery address: %v", err) 438 return 439 } 440 } else { 441 req.UpfrontShutdownScript = []byte{} 442 } 443 444 v[0] = reflect.ValueOf(req) 445 }, 446 MsgFundingCreated: func(v []reflect.Value, r *rand.Rand) { 447 req := FundingCreated{} 448 449 if _, err := r.Read(req.PendingChannelID[:]); err != nil { 450 t.Fatalf("unable to generate pending chan id: %v", err) 451 return 452 } 453 454 if _, err := r.Read(req.FundingPoint.Hash[:]); err != nil { 455 t.Fatalf("unable to generate hash: %v", err) 456 return 457 } 458 req.FundingPoint.Index = uint32(r.Int31()) % math.MaxUint16 459 460 var err error 461 req.CommitSig, err = NewSigFromSignature(testSig) 462 if err != nil { 463 t.Fatalf("unable to parse sig: %v", err) 464 return 465 } 466 467 v[0] = reflect.ValueOf(req) 468 }, 469 MsgFundingSigned: func(v []reflect.Value, r *rand.Rand) { 470 var c [32]byte 471 _, err := r.Read(c[:]) 472 if err != nil { 473 t.Fatalf("unable to generate chan id: %v", err) 474 return 475 } 476 477 req := FundingSigned{ 478 ChanID: ChannelID(c), 479 } 480 req.CommitSig, err = NewSigFromSignature(testSig) 481 if err != nil { 482 t.Fatalf("unable to parse sig: %v", err) 483 return 484 } 485 486 v[0] = reflect.ValueOf(req) 487 }, 488 MsgFundingLocked: func(v []reflect.Value, r *rand.Rand) { 489 490 var c [32]byte 491 if _, err := r.Read(c[:]); err != nil { 492 t.Fatalf("unable to generate chan id: %v", err) 493 return 494 } 495 496 pubKey, err := randPubKey() 497 if err != nil { 498 t.Fatalf("unable to generate key: %v", err) 499 return 500 } 501 502 req := NewFundingLocked(ChannelID(c), pubKey) 503 504 v[0] = reflect.ValueOf(*req) 505 }, 506 MsgClosingSigned: func(v []reflect.Value, r *rand.Rand) { 507 req := ClosingSigned{ 508 FeeAtoms: dcrutil.Amount(r.Int63()), 509 } 510 var err error 511 req.Signature, err = NewSigFromSignature(testSig) 512 if err != nil { 513 t.Fatalf("unable to parse sig: %v", err) 514 return 515 } 516 517 if _, err := r.Read(req.ChannelID[:]); err != nil { 518 t.Fatalf("unable to generate chan id: %v", err) 519 return 520 } 521 522 v[0] = reflect.ValueOf(req) 523 }, 524 MsgCommitSig: func(v []reflect.Value, r *rand.Rand) { 525 req := NewCommitSig() 526 if _, err := r.Read(req.ChanID[:]); err != nil { 527 t.Fatalf("unable to generate chan id: %v", err) 528 return 529 } 530 531 var err error 532 req.CommitSig, err = NewSigFromSignature(testSig) 533 if err != nil { 534 t.Fatalf("unable to parse sig: %v", err) 535 return 536 } 537 538 // Only create the slice if there will be any signatures 539 // in it to prevent false positive test failures due to 540 // an empty slice versus a nil slice. 541 numSigs := uint16(r.Int31n(1020)) 542 if numSigs > 0 { 543 req.HtlcSigs = make([]Sig, numSigs) 544 } 545 for i := 0; i < int(numSigs); i++ { 546 req.HtlcSigs[i], err = NewSigFromSignature(testSig) 547 if err != nil { 548 t.Fatalf("unable to parse sig: %v", err) 549 return 550 } 551 } 552 553 v[0] = reflect.ValueOf(*req) 554 }, 555 MsgRevokeAndAck: func(v []reflect.Value, r *rand.Rand) { 556 req := NewRevokeAndAck() 557 if _, err := r.Read(req.ChanID[:]); err != nil { 558 t.Fatalf("unable to generate chan id: %v", err) 559 return 560 } 561 if _, err := r.Read(req.Revocation[:]); err != nil { 562 t.Fatalf("unable to generate bytes: %v", err) 563 return 564 } 565 var err error 566 req.NextRevocationKey, err = randPubKey() 567 if err != nil { 568 t.Fatalf("unable to generate key: %v", err) 569 return 570 } 571 572 v[0] = reflect.ValueOf(*req) 573 }, 574 MsgChannelAnnouncement: func(v []reflect.Value, r *rand.Rand) { 575 var err error 576 req := ChannelAnnouncement{ 577 ShortChannelID: NewShortChanIDFromInt(uint64(r.Int63())), 578 Features: randRawFeatureVector(r), 579 } 580 req.NodeSig1, err = NewSigFromSignature(testSig) 581 if err != nil { 582 t.Fatalf("unable to parse sig: %v", err) 583 return 584 } 585 req.NodeSig2, err = NewSigFromSignature(testSig) 586 if err != nil { 587 t.Fatalf("unable to parse sig: %v", err) 588 return 589 } 590 req.DecredSig1, err = NewSigFromSignature(testSig) 591 if err != nil { 592 t.Fatalf("unable to parse sig: %v", err) 593 return 594 } 595 req.DecredSig2, err = NewSigFromSignature(testSig) 596 if err != nil { 597 t.Fatalf("unable to parse sig: %v", err) 598 return 599 } 600 601 req.NodeID1, err = randRawKey() 602 if err != nil { 603 t.Fatalf("unable to generate key: %v", err) 604 return 605 } 606 req.NodeID2, err = randRawKey() 607 if err != nil { 608 t.Fatalf("unable to generate key: %v", err) 609 return 610 } 611 req.DecredKey1, err = randRawKey() 612 if err != nil { 613 t.Fatalf("unable to generate key: %v", err) 614 return 615 } 616 req.DecredKey2, err = randRawKey() 617 if err != nil { 618 t.Fatalf("unable to generate key: %v", err) 619 return 620 } 621 if _, err := r.Read(req.ChainHash[:]); err != nil { 622 t.Fatalf("unable to generate chain hash: %v", err) 623 return 624 } 625 626 numExtraBytes := r.Int31n(1000) 627 if numExtraBytes > 0 { 628 req.ExtraOpaqueData = make([]byte, numExtraBytes) 629 _, err := r.Read(req.ExtraOpaqueData) 630 if err != nil { 631 t.Fatalf("unable to generate opaque "+ 632 "bytes: %v", err) 633 return 634 } 635 } 636 637 v[0] = reflect.ValueOf(req) 638 }, 639 MsgNodeAnnouncement: func(v []reflect.Value, r *rand.Rand) { 640 var err error 641 req := NodeAnnouncement{ 642 Features: randRawFeatureVector(r), 643 Timestamp: uint32(r.Int31()), 644 Alias: randAlias(r), 645 RGBColor: color.RGBA{ 646 R: uint8(r.Int31()), 647 G: uint8(r.Int31()), 648 B: uint8(r.Int31()), 649 }, 650 } 651 req.Signature, err = NewSigFromSignature(testSig) 652 if err != nil { 653 t.Fatalf("unable to parse sig: %v", err) 654 return 655 } 656 657 req.NodeID, err = randRawKey() 658 if err != nil { 659 t.Fatalf("unable to generate key: %v", err) 660 return 661 } 662 663 req.Addresses, err = randAddrs(r) 664 if err != nil { 665 t.Fatalf("unable to generate addresses: %v", err) 666 } 667 668 numExtraBytes := r.Int31n(1000) 669 if numExtraBytes > 0 { 670 req.ExtraOpaqueData = make([]byte, numExtraBytes) 671 _, err := r.Read(req.ExtraOpaqueData) 672 if err != nil { 673 t.Fatalf("unable to generate opaque "+ 674 "bytes: %v", err) 675 return 676 } 677 } 678 679 v[0] = reflect.ValueOf(req) 680 }, 681 MsgChannelUpdate: func(v []reflect.Value, r *rand.Rand) { 682 var err error 683 684 msgFlags := ChanUpdateMsgFlags(r.Int31()) 685 maxHtlc := MilliAtom(r.Int63()) 686 687 // We make the max_htlc field zero if it is not flagged 688 // as being part of the ChannelUpdate, to pass 689 // serialization tests, as it will be ignored if the bit 690 // is not set. 691 if msgFlags&ChanUpdateOptionMaxHtlc == 0 { 692 maxHtlc = 0 693 } 694 695 req := ChannelUpdate{ 696 ShortChannelID: NewShortChanIDFromInt(uint64(r.Int63())), 697 Timestamp: uint32(r.Int31()), 698 MessageFlags: msgFlags, 699 ChannelFlags: ChanUpdateChanFlags(r.Int31()), 700 TimeLockDelta: uint16(r.Int31()), 701 HtlcMinimumMAtoms: MilliAtom(r.Int63()), 702 HtlcMaximumMAtoms: maxHtlc, 703 BaseFee: uint32(r.Int31()), 704 FeeRate: uint32(r.Int31()), 705 } 706 req.Signature, err = NewSigFromSignature(testSig) 707 if err != nil { 708 t.Fatalf("unable to parse sig: %v", err) 709 return 710 } 711 712 if _, err := r.Read(req.ChainHash[:]); err != nil { 713 t.Fatalf("unable to generate chain hash: %v", err) 714 return 715 } 716 717 numExtraBytes := r.Int31n(1000) 718 if numExtraBytes > 0 { 719 req.ExtraOpaqueData = make([]byte, numExtraBytes) 720 _, err := r.Read(req.ExtraOpaqueData) 721 if err != nil { 722 t.Fatalf("unable to generate opaque "+ 723 "bytes: %v", err) 724 return 725 } 726 } 727 728 v[0] = reflect.ValueOf(req) 729 }, 730 MsgAnnounceSignatures: func(v []reflect.Value, r *rand.Rand) { 731 var err error 732 req := AnnounceSignatures{ 733 ShortChannelID: NewShortChanIDFromInt(uint64(r.Int63())), 734 } 735 736 req.NodeSignature, err = NewSigFromSignature(testSig) 737 if err != nil { 738 t.Fatalf("unable to parse sig: %v", err) 739 return 740 } 741 742 req.DecredSignature, err = NewSigFromSignature(testSig) 743 if err != nil { 744 t.Fatalf("unable to parse sig: %v", err) 745 return 746 } 747 748 if _, err := r.Read(req.ChannelID[:]); err != nil { 749 t.Fatalf("unable to generate chan id: %v", err) 750 return 751 } 752 753 numExtraBytes := r.Int31n(1000) 754 if numExtraBytes > 0 { 755 req.ExtraOpaqueData = make([]byte, numExtraBytes) 756 _, err := r.Read(req.ExtraOpaqueData) 757 if err != nil { 758 t.Fatalf("unable to generate opaque "+ 759 "bytes: %v", err) 760 return 761 } 762 } 763 764 v[0] = reflect.ValueOf(req) 765 }, 766 MsgChannelReestablish: func(v []reflect.Value, r *rand.Rand) { 767 req := ChannelReestablish{ 768 NextLocalCommitHeight: uint64(r.Int63()), 769 RemoteCommitTailHeight: uint64(r.Int63()), 770 } 771 772 // With a 50/50 probability, we'll include the 773 // additional fields so we can test our ability to 774 // properly parse, and write out the optional fields. 775 if r.Int()%2 == 0 { 776 _, err := r.Read(req.LastRemoteCommitSecret[:]) 777 if err != nil { 778 t.Fatalf("unable to read commit secret: %v", err) 779 return 780 } 781 782 req.LocalUnrevokedCommitPoint, err = randPubKey() 783 if err != nil { 784 t.Fatalf("unable to generate key: %v", err) 785 return 786 } 787 } 788 789 v[0] = reflect.ValueOf(req) 790 }, 791 MsgQueryShortChanIDs: func(v []reflect.Value, r *rand.Rand) { 792 req := QueryShortChanIDs{} 793 794 // With a 50/50 change, we'll either use zlib encoding, 795 // or regular encoding. 796 if r.Int31()%2 == 0 { 797 req.EncodingType = EncodingSortedZlib 798 } else { 799 req.EncodingType = EncodingSortedPlain 800 } 801 802 if _, err := rand.Read(req.ChainHash[:]); err != nil { 803 t.Fatalf("unable to read chain hash: %v", err) 804 return 805 } 806 807 numChanIDs := rand.Int31n(5000) 808 for i := int32(0); i < numChanIDs; i++ { 809 req.ShortChanIDs = append(req.ShortChanIDs, 810 NewShortChanIDFromInt(uint64(r.Int63()))) 811 } 812 813 v[0] = reflect.ValueOf(req) 814 }, 815 MsgReplyChannelRange: func(v []reflect.Value, r *rand.Rand) { 816 req := ReplyChannelRange{ 817 QueryChannelRange: QueryChannelRange{ 818 FirstBlockHeight: uint32(r.Int31()), 819 NumBlocks: uint32(r.Int31()), 820 }, 821 } 822 823 if _, err := rand.Read(req.ChainHash[:]); err != nil { 824 t.Fatalf("unable to read chain hash: %v", err) 825 return 826 } 827 828 req.Complete = uint8(r.Int31n(2)) 829 830 // With a 50/50 change, we'll either use zlib encoding, 831 // or regular encoding. 832 if r.Int31()%2 == 0 { 833 req.EncodingType = EncodingSortedZlib 834 } else { 835 req.EncodingType = EncodingSortedPlain 836 } 837 838 numChanIDs := rand.Int31n(5000) 839 for i := int32(0); i < numChanIDs; i++ { 840 req.ShortChanIDs = append(req.ShortChanIDs, 841 NewShortChanIDFromInt(uint64(r.Int63()))) 842 } 843 844 v[0] = reflect.ValueOf(req) 845 }, 846 } 847 848 // With the above types defined, we'll now generate a slice of 849 // scenarios to feed into quick.Check. The function scans in input 850 // space of the target function under test, so we'll need to create a 851 // series of wrapper functions to force it to iterate over the target 852 // types, but re-use the mainScenario defined above. 853 tests := []struct { 854 msgType MessageType 855 scenario interface{} 856 }{ 857 { 858 msgType: MsgInit, 859 scenario: func(m Init) bool { 860 return mainScenario(&m) 861 }, 862 }, 863 { 864 msgType: MsgError, 865 scenario: func(m Error) bool { 866 return mainScenario(&m) 867 }, 868 }, 869 { 870 msgType: MsgPing, 871 scenario: func(m Ping) bool { 872 return mainScenario(&m) 873 }, 874 }, 875 { 876 msgType: MsgPong, 877 scenario: func(m Pong) bool { 878 return mainScenario(&m) 879 }, 880 }, 881 { 882 msgType: MsgOpenChannel, 883 scenario: func(m OpenChannel) bool { 884 return mainScenario(&m) 885 }, 886 }, 887 { 888 msgType: MsgAcceptChannel, 889 scenario: func(m AcceptChannel) bool { 890 return mainScenario(&m) 891 }, 892 }, 893 { 894 msgType: MsgFundingCreated, 895 scenario: func(m FundingCreated) bool { 896 return mainScenario(&m) 897 }, 898 }, 899 { 900 msgType: MsgFundingSigned, 901 scenario: func(m FundingSigned) bool { 902 return mainScenario(&m) 903 }, 904 }, 905 { 906 msgType: MsgFundingLocked, 907 scenario: func(m FundingLocked) bool { 908 return mainScenario(&m) 909 }, 910 }, 911 { 912 msgType: MsgShutdown, 913 scenario: func(m Shutdown) bool { 914 return mainScenario(&m) 915 }, 916 }, 917 { 918 msgType: MsgClosingSigned, 919 scenario: func(m ClosingSigned) bool { 920 return mainScenario(&m) 921 }, 922 }, 923 { 924 msgType: MsgUpdateAddHTLC, 925 scenario: func(m UpdateAddHTLC) bool { 926 return mainScenario(&m) 927 }, 928 }, 929 { 930 msgType: MsgUpdateFulfillHTLC, 931 scenario: func(m UpdateFulfillHTLC) bool { 932 return mainScenario(&m) 933 }, 934 }, 935 { 936 msgType: MsgUpdateFailHTLC, 937 scenario: func(m UpdateFailHTLC) bool { 938 return mainScenario(&m) 939 }, 940 }, 941 { 942 msgType: MsgCommitSig, 943 scenario: func(m CommitSig) bool { 944 return mainScenario(&m) 945 }, 946 }, 947 { 948 msgType: MsgRevokeAndAck, 949 scenario: func(m RevokeAndAck) bool { 950 return mainScenario(&m) 951 }, 952 }, 953 { 954 msgType: MsgUpdateFee, 955 scenario: func(m UpdateFee) bool { 956 return mainScenario(&m) 957 }, 958 }, 959 { 960 961 msgType: MsgUpdateFailMalformedHTLC, 962 scenario: func(m UpdateFailMalformedHTLC) bool { 963 return mainScenario(&m) 964 }, 965 }, 966 { 967 msgType: MsgChannelReestablish, 968 scenario: func(m ChannelReestablish) bool { 969 return mainScenario(&m) 970 }, 971 }, 972 { 973 msgType: MsgChannelAnnouncement, 974 scenario: func(m ChannelAnnouncement) bool { 975 return mainScenario(&m) 976 }, 977 }, 978 { 979 msgType: MsgNodeAnnouncement, 980 scenario: func(m NodeAnnouncement) bool { 981 return mainScenario(&m) 982 }, 983 }, 984 { 985 msgType: MsgChannelUpdate, 986 scenario: func(m ChannelUpdate) bool { 987 return mainScenario(&m) 988 }, 989 }, 990 { 991 msgType: MsgAnnounceSignatures, 992 scenario: func(m AnnounceSignatures) bool { 993 return mainScenario(&m) 994 }, 995 }, 996 { 997 msgType: MsgGossipTimestampRange, 998 scenario: func(m GossipTimestampRange) bool { 999 return mainScenario(&m) 1000 }, 1001 }, 1002 { 1003 msgType: MsgQueryShortChanIDs, 1004 scenario: func(m QueryShortChanIDs) bool { 1005 return mainScenario(&m) 1006 }, 1007 }, 1008 { 1009 msgType: MsgReplyShortChanIDsEnd, 1010 scenario: func(m ReplyShortChanIDsEnd) bool { 1011 return mainScenario(&m) 1012 }, 1013 }, 1014 { 1015 msgType: MsgQueryChannelRange, 1016 scenario: func(m QueryChannelRange) bool { 1017 return mainScenario(&m) 1018 }, 1019 }, 1020 { 1021 msgType: MsgReplyChannelRange, 1022 scenario: func(m ReplyChannelRange) bool { 1023 return mainScenario(&m) 1024 }, 1025 }, 1026 } 1027 for _, test := range tests { 1028 var config *quick.Config 1029 1030 // If the type defined is within the custom type gen map above, 1031 // then we'll modify the default config to use this Value 1032 // function that knows how to generate the proper types. 1033 if valueGen, ok := customTypeGen[test.msgType]; ok { 1034 config = &quick.Config{ 1035 Values: valueGen, 1036 } 1037 } 1038 1039 t.Logf("Running fuzz tests for msgType=%v", test.msgType) 1040 if err := quick.Check(test.scenario, config); err != nil { 1041 t.Fatalf("fuzz checks for msg=%v failed: %v", 1042 test.msgType, err) 1043 } 1044 } 1045 1046 } 1047 1048 func init() { 1049 rand.Seed(time.Now().Unix()) 1050 }