github.com/status-im/status-go@v1.1.0/waku/waku_test.go (about) 1 // Copyright 2019 The Waku Library Authors. 2 // 3 // The Waku library is free software: you can redistribute it and/or modify 4 // it under the terms of the GNU Lesser General Public License as published by 5 // the Free Software Foundation, either version 3 of the License, or 6 // (at your option) any later version. 7 // 8 // The Waku library is distributed in the hope that it will be useful, 9 // but WITHOUT ANY WARRANTY; without even the implied warranty off 10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 // GNU Lesser General Public License for more details. 12 // 13 // You should have received a copy of the GNU Lesser General Public License 14 // along with the Waku library. If not, see <http://www.gnu.org/licenses/>. 15 // 16 // This software uses the go-ethereum library, which is licensed 17 // under the GNU Lesser General Public Library, version 3 or any later. 18 19 package waku 20 21 import ( 22 "bytes" 23 "crypto/ecdsa" 24 "crypto/sha256" 25 mrand "math/rand" 26 "testing" 27 "time" 28 29 "golang.org/x/crypto/pbkdf2" 30 31 "github.com/stretchr/testify/require" 32 33 "github.com/ethereum/go-ethereum/crypto" 34 "github.com/ethereum/go-ethereum/p2p" 35 "github.com/ethereum/go-ethereum/p2p/enode" 36 37 "github.com/status-im/status-go/eth-node/types" 38 "github.com/status-im/status-go/waku/common" 39 v0 "github.com/status-im/status-go/waku/v0" 40 v1 "github.com/status-im/status-go/waku/v1" 41 ) 42 43 var seed int64 44 45 // InitSingleTest should be called in the beginning of every 46 // test, which uses RNG, in order to make the tests 47 // reproducibility independent of their sequence. 48 func InitSingleTest() { 49 seed = time.Now().Unix() 50 mrand.Seed(seed) 51 } 52 53 func TestBasic(t *testing.T) { 54 w := New(nil, nil) 55 p := w.Protocols() 56 waku0 := p[0] 57 waku1 := p[1] 58 if waku0.Name != v0.Name { 59 t.Fatalf("failed Peer Name: %v.", waku0.Name) 60 } 61 if uint64(waku0.Version) != v0.Version { 62 t.Fatalf("failed Peer Version: %v.", waku0.Version) 63 } 64 if waku0.Length != v0.NumberOfMessageCodes { 65 t.Fatalf("failed Peer Length: %v.", waku0.Length) 66 } 67 if waku0.Run == nil { 68 t.Fatalf("failed waku.Run.") 69 } 70 if waku1.Name != v1.Name { 71 t.Fatalf("failed Peer Name: %v.", waku1.Name) 72 } 73 if uint64(waku1.Version) != v1.Version { 74 t.Fatalf("failed Peer Version: %v.", waku1.Version) 75 } 76 if waku1.Length != v1.NumberOfMessageCodes { 77 t.Fatalf("failed Peer Length: %v.", waku1.Length) 78 } 79 if waku1.Run == nil { 80 t.Fatalf("failed waku.Run.") 81 } 82 83 if w.GetFilter("non-existent") != nil { 84 t.Fatalf("failed GetFilter.") 85 } 86 87 peerID := make([]byte, 64) 88 mrand.Read(peerID) // nolint: gosec 89 peer, _ := w.getPeer(peerID) 90 if peer != nil { 91 t.Fatal("found peer for random key.") 92 } 93 if err := w.AllowP2PMessagesFromPeer(peerID); err == nil { 94 t.Fatalf("failed MarkPeerTrusted.") 95 } 96 exist := w.HasSymKey("non-existing") 97 if exist { 98 t.Fatalf("failed HasSymKey.") 99 } 100 key, err := w.GetSymKey("non-existing") 101 if err == nil { 102 t.Fatalf("failed GetSymKey(non-existing): false positive.") 103 } 104 if key != nil { 105 t.Fatalf("failed GetSymKey: false positive.") 106 } 107 mail := w.Envelopes() 108 if len(mail) != 0 { 109 t.Fatalf("failed w.Envelopes().") 110 } 111 112 derived := pbkdf2.Key(peerID, nil, 65356, common.AESKeyLength, sha256.New) 113 if !common.ValidateDataIntegrity(derived, common.AESKeyLength) { 114 t.Fatalf("failed validateSymmetricKey with param = %v.", derived) 115 } 116 if common.ContainsOnlyZeros(derived) { 117 t.Fatalf("failed containsOnlyZeros with param = %v.", derived) 118 } 119 120 buf := []byte{0xFF, 0xE5, 0x80, 0x2, 0} 121 le := common.BytesToUintLittleEndian(buf) 122 be := common.BytesToUintBigEndian(buf) 123 if le != uint64(0x280e5ff) { 124 t.Fatalf("failed bytesToIntLittleEndian: %d.", le) 125 } 126 if be != uint64(0xffe5800200) { 127 t.Fatalf("failed BytesToIntBigEndian: %d.", be) 128 } 129 130 id, err := w.NewKeyPair() 131 if err != nil { 132 t.Fatalf("failed to generate new key pair: %s.", err) 133 } 134 pk, err := w.GetPrivateKey(id) 135 if err != nil { 136 t.Fatalf("failed to retrieve new key pair: %s.", err) 137 } 138 if !validatePrivateKey(pk) { 139 t.Fatalf("failed validatePrivateKey: %v.", pk) 140 } 141 if !common.ValidatePublicKey(&pk.PublicKey) { 142 t.Fatalf("failed ValidatePublicKey: %v.", pk) 143 } 144 } 145 146 func TestAsymmetricKeyImport(t *testing.T) { 147 var ( 148 w = New(nil, nil) 149 privateKeys []*ecdsa.PrivateKey 150 ) 151 152 for i := 0; i < 50; i++ { 153 id, err := w.NewKeyPair() 154 if err != nil { 155 t.Fatalf("could not generate key: %v", err) 156 } 157 158 pk, err := w.GetPrivateKey(id) 159 if err != nil { 160 t.Fatalf("could not export private key: %v", err) 161 } 162 163 privateKeys = append(privateKeys, pk) 164 165 if !w.DeleteKeyPair(id) { 166 t.Fatalf("could not delete private key") 167 } 168 } 169 170 for _, pk := range privateKeys { 171 if _, err := w.AddKeyPair(pk); err != nil { 172 t.Fatalf("could not import private key: %v", err) 173 } 174 } 175 } 176 177 func TestWakuIdentityManagement(t *testing.T) { 178 w := New(nil, nil) 179 id1, err := w.NewKeyPair() 180 if err != nil { 181 t.Fatalf("failed to generate new key pair: %s.", err) 182 } 183 id2, err := w.NewKeyPair() 184 if err != nil { 185 t.Fatalf("failed to generate new key pair: %s.", err) 186 } 187 pk1, err := w.GetPrivateKey(id1) 188 if err != nil { 189 t.Fatalf("failed to retrieve the key pair: %s.", err) 190 } 191 pk2, err := w.GetPrivateKey(id2) 192 if err != nil { 193 t.Fatalf("failed to retrieve the key pair: %s.", err) 194 } 195 196 if !w.HasKeyPair(id1) { 197 t.Fatalf("failed HasIdentity(pk1).") 198 } 199 if !w.HasKeyPair(id2) { 200 t.Fatalf("failed HasIdentity(pk2).") 201 } 202 if pk1 == nil { 203 t.Fatalf("failed GetIdentity(pk1).") 204 } 205 if pk2 == nil { 206 t.Fatalf("failed GetIdentity(pk2).") 207 } 208 209 if !validatePrivateKey(pk1) { 210 t.Fatalf("pk1 is invalid.") 211 } 212 if !validatePrivateKey(pk2) { 213 t.Fatalf("pk2 is invalid.") 214 } 215 216 // Delete one identity 217 done := w.DeleteKeyPair(id1) 218 if !done { 219 t.Fatalf("failed to delete id1.") 220 } 221 pk1, err = w.GetPrivateKey(id1) 222 if err == nil { 223 t.Fatalf("retrieve the key pair: false positive.") 224 } 225 pk2, err = w.GetPrivateKey(id2) 226 if err != nil { 227 t.Fatalf("failed to retrieve the key pair: %s.", err) 228 } 229 if w.HasKeyPair(id1) { 230 t.Fatalf("failed DeleteIdentity(pub1): still exist.") 231 } 232 if !w.HasKeyPair(id2) { 233 t.Fatalf("failed DeleteIdentity(pub1): pub2 does not exist.") 234 } 235 if pk1 != nil { 236 t.Fatalf("failed DeleteIdentity(pub1): first key still exist.") 237 } 238 if pk2 == nil { 239 t.Fatalf("failed DeleteIdentity(pub1): second key does not exist.") 240 } 241 242 // Delete again non-existing identity 243 done = w.DeleteKeyPair(id1) 244 if done { 245 t.Fatalf("delete id1: false positive.") 246 } 247 pk1, err = w.GetPrivateKey(id1) 248 if err == nil { 249 t.Fatalf("retrieve the key pair: false positive.") 250 } 251 pk2, err = w.GetPrivateKey(id2) 252 if err != nil { 253 t.Fatalf("failed to retrieve the key pair: %s.", err) 254 } 255 if w.HasKeyPair(id1) { 256 t.Fatalf("failed delete non-existing identity: exist.") 257 } 258 if !w.HasKeyPair(id2) { 259 t.Fatalf("failed delete non-existing identity: pub2 does not exist.") 260 } 261 if pk1 != nil { 262 t.Fatalf("failed delete non-existing identity: first key exist.") 263 } 264 if pk2 == nil { 265 t.Fatalf("failed delete non-existing identity: second key does not exist.") 266 } 267 268 // Delete second identity 269 done = w.DeleteKeyPair(id2) 270 if !done { 271 t.Fatalf("failed to delete id2.") 272 } 273 pk1, err = w.GetPrivateKey(id1) 274 if err == nil { 275 t.Fatalf("retrieve the key pair: false positive.") 276 } 277 pk2, err = w.GetPrivateKey(id2) 278 if err == nil { 279 t.Fatalf("retrieve the key pair: false positive.") 280 } 281 if w.HasKeyPair(id1) { 282 t.Fatalf("failed delete second identity: first identity exist.") 283 } 284 if w.HasKeyPair(id2) { 285 t.Fatalf("failed delete second identity: still exist.") 286 } 287 if pk1 != nil { 288 t.Fatalf("failed delete second identity: first key exist.") 289 } 290 if pk2 != nil { 291 t.Fatalf("failed delete second identity: second key exist.") 292 } 293 } 294 295 func TestSymKeyManagement(t *testing.T) { 296 InitSingleTest() 297 298 var err error 299 var k1, k2 []byte 300 w := New(nil, nil) 301 id2 := "arbitrary-string-2" 302 303 id1, err := w.GenerateSymKey() 304 if err != nil { 305 t.Fatalf("failed GenerateSymKey with seed %d: %s.", seed, err) 306 } 307 308 k1, err = w.GetSymKey(id1) 309 if err != nil { 310 t.Fatalf("failed GetSymKey(id1).") 311 } 312 k2, err = w.GetSymKey(id2) 313 if err == nil { 314 t.Fatalf("failed GetSymKey(id2): false positive.") 315 } 316 if !w.HasSymKey(id1) { 317 t.Fatalf("failed HasSymKey(id1).") 318 } 319 if w.HasSymKey(id2) { 320 t.Fatalf("failed HasSymKey(id2): false positive.") 321 } 322 if k1 == nil { 323 t.Fatalf("first key does not exist.") 324 } 325 if k2 != nil { 326 t.Fatalf("second key still exist.") 327 } 328 329 // add existing id, nothing should change 330 randomKey := make([]byte, common.AESKeyLength) 331 mrand.Read(randomKey) // nolint: gosec 332 id1, err = w.AddSymKeyDirect(randomKey) 333 if err != nil { 334 t.Fatalf("failed AddSymKey with seed %d: %s.", seed, err) 335 } 336 337 k1, err = w.GetSymKey(id1) 338 if err != nil { 339 t.Fatalf("failed w.GetSymKey(id1).") 340 } 341 k2, err = w.GetSymKey(id2) 342 if err == nil { 343 t.Fatalf("failed w.GetSymKey(id2): false positive.") 344 } 345 if !w.HasSymKey(id1) { 346 t.Fatalf("failed w.HasSymKey(id1).") 347 } 348 if w.HasSymKey(id2) { 349 t.Fatalf("failed w.HasSymKey(id2): false positive.") 350 } 351 if k1 == nil { 352 t.Fatalf("first key does not exist.") 353 } 354 if !bytes.Equal(k1, randomKey) { 355 t.Fatalf("k1 != randomKey.") 356 } 357 if k2 != nil { 358 t.Fatalf("second key already exist.") 359 } 360 361 id2, err = w.AddSymKeyDirect(randomKey) 362 if err != nil { 363 t.Fatalf("failed AddSymKey(id2) with seed %d: %s.", seed, err) 364 } 365 k1, err = w.GetSymKey(id1) 366 if err != nil { 367 t.Fatalf("failed w.GetSymKey(id1).") 368 } 369 k2, err = w.GetSymKey(id2) 370 if err != nil { 371 t.Fatalf("failed w.GetSymKey(id2).") 372 } 373 if !w.HasSymKey(id1) { 374 t.Fatalf("HasSymKey(id1) failed.") 375 } 376 if !w.HasSymKey(id2) { 377 t.Fatalf("HasSymKey(id2) failed.") 378 } 379 if k1 == nil { 380 t.Fatalf("k1 does not exist.") 381 } 382 if k2 == nil { 383 t.Fatalf("k2 does not exist.") 384 } 385 if !bytes.Equal(k1, k2) { 386 t.Fatalf("k1 != k2.") 387 } 388 if !bytes.Equal(k1, randomKey) { 389 t.Fatalf("k1 != randomKey.") 390 } 391 if len(k1) != common.AESKeyLength { 392 t.Fatalf("wrong length of k1.") 393 } 394 if len(k2) != common.AESKeyLength { 395 t.Fatalf("wrong length of k2.") 396 } 397 398 w.DeleteSymKey(id1) 399 k1, err = w.GetSymKey(id1) 400 if err == nil { 401 t.Fatalf("failed w.GetSymKey(id1): false positive.") 402 } 403 if k1 != nil { 404 t.Fatalf("failed GetSymKey(id1): false positive.") 405 } 406 k2, err = w.GetSymKey(id2) 407 if err != nil { 408 t.Fatalf("failed w.GetSymKey(id2).") 409 } 410 if w.HasSymKey(id1) { 411 t.Fatalf("failed to delete first key: still exist.") 412 } 413 if !w.HasSymKey(id2) { 414 t.Fatalf("failed to delete first key: second key does not exist.") 415 } 416 if k2 == nil { 417 t.Fatalf("failed to delete first key: second key is nil.") 418 } 419 420 w.DeleteSymKey(id1) 421 w.DeleteSymKey(id2) 422 k1, err = w.GetSymKey(id1) 423 if err == nil { 424 t.Fatalf("failed w.GetSymKey(id1): false positive.") 425 } 426 k2, err = w.GetSymKey(id2) 427 if err == nil { 428 t.Fatalf("failed w.GetSymKey(id2): false positive.") 429 } 430 if k1 != nil || k2 != nil { 431 t.Fatalf("k1 or k2 is not nil") 432 } 433 if w.HasSymKey(id1) { 434 t.Fatalf("failed to delete second key: first key exist.") 435 } 436 if w.HasSymKey(id2) { 437 t.Fatalf("failed to delete second key: still exist.") 438 } 439 440 randomKey = make([]byte, common.AESKeyLength+1) 441 mrand.Read(randomKey) // nolint: gosec 442 _, err = w.AddSymKeyDirect(randomKey) 443 if err == nil { 444 t.Fatalf("added the key with wrong size, seed %d.", seed) 445 } 446 447 const password = "arbitrary data here" 448 id1, err = w.AddSymKeyFromPassword(password) 449 if err != nil { 450 t.Fatalf("failed AddSymKeyFromPassword(id1) with seed %d: %s.", seed, err) 451 } 452 id2, err = w.AddSymKeyFromPassword(password) 453 if err != nil { 454 t.Fatalf("failed AddSymKeyFromPassword(id2) with seed %d: %s.", seed, err) 455 } 456 k1, err = w.GetSymKey(id1) 457 if err != nil { 458 t.Fatalf("failed w.GetSymKey(id1).") 459 } 460 k2, err = w.GetSymKey(id2) 461 if err != nil { 462 t.Fatalf("failed w.GetSymKey(id2).") 463 } 464 if !w.HasSymKey(id1) { 465 t.Fatalf("HasSymKey(id1) failed.") 466 } 467 if !w.HasSymKey(id2) { 468 t.Fatalf("HasSymKey(id2) failed.") 469 } 470 if !common.ValidateDataIntegrity(k2, common.AESKeyLength) { 471 t.Fatalf("key validation failed.") 472 } 473 if !bytes.Equal(k1, k2) { 474 t.Fatalf("k1 != k2.") 475 } 476 } 477 478 func TestExpiry(t *testing.T) { 479 InitSingleTest() 480 481 w := New(nil, nil) 482 if err := w.SetMinimumPoW(0.0000001, false); err != nil { 483 t.Fatal("failed to set min pow") 484 } 485 486 defer func() { handleError(t, w.SetMinimumPoW(common.DefaultMinimumPoW, false)) }() 487 if err := w.Start(); err != nil { 488 t.Fatal("failed to start waku") 489 } 490 defer func() { handleError(t, w.Stop()) }() 491 492 params, err := generateMessageParams() 493 if err != nil { 494 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 495 } 496 params.TTL = 1 497 498 messagesCount := 5 499 500 // Send a few messages one after another. Due to low PoW and expiration buckets 501 // with one second resolution, it covers a case when there are multiple items 502 // in a single expiration bucket. 503 for i := 0; i < messagesCount; i++ { 504 msg, err := common.NewSentMessage(params) 505 if err != nil { 506 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 507 } 508 env, err := msg.Wrap(params, time.Now()) 509 if err != nil { 510 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 511 } 512 513 err = w.Send(env) 514 if err != nil { 515 t.Fatalf("failed to send envelope with seed %d: %s.", seed, err) 516 } 517 } 518 519 // wait till received or timeout 520 var received, expired bool 521 for j := 0; j < 20; j++ { 522 time.Sleep(100 * time.Millisecond) 523 if len(w.Envelopes()) == messagesCount { 524 received = true 525 break 526 } 527 } 528 529 if !received { 530 t.Fatalf("did not receive the sent envelope, seed: %d.", seed) 531 } 532 533 // wait till expired or timeout 534 for j := 0; j < 20; j++ { 535 time.Sleep(100 * time.Millisecond) 536 if len(w.Envelopes()) == 0 { 537 expired = true 538 break 539 } 540 } 541 542 if !expired { 543 t.Fatalf("expire failed, seed: %d.", seed) 544 } 545 } 546 547 func TestCustomization(t *testing.T) { 548 InitSingleTest() 549 550 w := New(nil, nil) 551 defer func() { handleError(t, w.SetMinimumPoW(common.DefaultMinimumPoW, false)) }() 552 defer func() { handleError(t, w.SetMaxMessageSize(common.DefaultMaxMessageSize)) }() 553 if err := w.Start(); err != nil { 554 t.Fatal("failed to start node") 555 } 556 defer func() { handleError(t, w.Stop()) }() 557 558 const smallPoW = 0.00001 559 560 f, err := generateFilter(t, true) 561 if err != nil { 562 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 563 } 564 params, err := generateMessageParams() 565 if err != nil { 566 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 567 } 568 569 params.KeySym = f.KeySym 570 params.Topic = common.BytesToTopic(f.Topics[2]) 571 params.PoW = smallPoW 572 params.TTL = 3600 * 24 // one day 573 msg, err := common.NewSentMessage(params) 574 if err != nil { 575 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 576 } 577 env, err := msg.Wrap(params, time.Now()) 578 if err != nil { 579 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 580 } 581 582 err = w.Send(env) 583 if err == nil { 584 t.Fatalf("successfully sent envelope with PoW %.06f, false positive (seed %d).", env.PoW(), seed) 585 } 586 587 _ = w.SetMinimumPoW(smallPoW/2, true) 588 err = w.Send(env) 589 if err != nil { 590 t.Fatalf("failed to send envelope with seed %d: %s.", seed, err) 591 } 592 593 params.TTL++ 594 msg, err = common.NewSentMessage(params) 595 if err != nil { 596 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 597 } 598 env, err = msg.Wrap(params, time.Now()) 599 if err != nil { 600 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 601 } 602 _ = w.SetMaxMessageSize(uint32(env.Size() - 1)) 603 err = w.Send(env) 604 if err == nil { 605 t.Fatalf("successfully sent oversized envelope (seed %d): false positive.", seed) 606 } 607 608 _ = w.SetMaxMessageSize(common.DefaultMaxMessageSize) 609 err = w.Send(env) 610 if err != nil { 611 t.Fatalf("failed to send second envelope with seed %d: %s.", seed, err) 612 } 613 614 // wait till received or timeout 615 var received bool 616 for j := 0; j < 20; j++ { 617 time.Sleep(100 * time.Millisecond) 618 if len(w.Envelopes()) > 1 { 619 received = true 620 break 621 } 622 } 623 624 if !received { 625 t.Fatalf("did not receive the sent envelope, seed: %d.", seed) 626 } 627 628 // check w.messages() 629 _, err = w.Subscribe(f) 630 if err != nil { 631 t.Fatalf("failed subscribe with seed %d: %s.", seed, err) 632 } 633 time.Sleep(5 * time.Millisecond) 634 mail := f.Retrieve() 635 if len(mail) > 0 { 636 t.Fatalf("received premature mail") 637 } 638 } 639 640 func TestSymmetricSendCycle(t *testing.T) { 641 InitSingleTest() 642 643 w := New(nil, nil) 644 defer func() { handleError(t, w.SetMinimumPoW(common.DefaultMinimumPoW, false)) }() 645 defer func() { handleError(t, w.SetMaxMessageSize(common.DefaultMaxMessageSize)) }() 646 if err := w.Start(); err != nil { 647 t.Fatal("failed to start node") 648 } 649 defer func() { handleError(t, w.Stop()) }() 650 651 filter1, err := generateFilter(t, true) 652 if err != nil { 653 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 654 } 655 filter1.PoW = common.DefaultMinimumPoW 656 657 // Copy the first filter since some of its fields 658 // are randomly generated. 659 filter2 := &common.Filter{ 660 KeySym: filter1.KeySym, 661 Topics: filter1.Topics, 662 PoW: filter1.PoW, 663 AllowP2P: filter1.AllowP2P, 664 Messages: common.NewMemoryMessageStore(), 665 } 666 667 params, err := generateMessageParams() 668 if err != nil { 669 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 670 } 671 672 filter1.Src = ¶ms.Src.PublicKey 673 filter2.Src = ¶ms.Src.PublicKey 674 675 params.KeySym = filter1.KeySym 676 params.Topic = common.BytesToTopic(filter1.Topics[2]) 677 params.PoW = filter1.PoW 678 params.WorkTime = 10 679 params.TTL = 50 680 msg, err := common.NewSentMessage(params) 681 if err != nil { 682 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 683 } 684 env, err := msg.Wrap(params, time.Now()) 685 if err != nil { 686 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 687 } 688 689 _, err = w.Subscribe(filter1) 690 if err != nil { 691 t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err) 692 } 693 694 _, err = w.Subscribe(filter2) 695 if err != nil { 696 t.Fatalf("failed subscribe 2 with seed %d: %s.", seed, err) 697 } 698 699 err = w.Send(env) 700 if err != nil { 701 t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err) 702 } 703 704 // wait till received or timeout 705 var received bool 706 for j := 0; j < 200; j++ { 707 time.Sleep(10 * time.Millisecond) 708 if len(w.Envelopes()) > 0 { 709 received = true 710 break 711 } 712 } 713 714 if !received { 715 t.Fatalf("did not receive the sent envelope, seed: %d.", seed) 716 } 717 718 // check w.messages() 719 time.Sleep(5 * time.Millisecond) 720 mail1 := filter1.Retrieve() 721 mail2 := filter2.Retrieve() 722 if len(mail2) == 0 { 723 t.Fatalf("did not receive any email for filter 2") 724 } 725 if len(mail1) == 0 { 726 t.Fatalf("did not receive any email for filter 1") 727 } 728 729 } 730 731 func TestSymmetricSendCycleWithTopicInterest(t *testing.T) { 732 InitSingleTest() 733 734 w := New(nil, nil) 735 defer func() { handleError(t, w.SetMinimumPoW(common.DefaultMinimumPoW, false)) }() 736 defer func() { handleError(t, w.SetMaxMessageSize(common.DefaultMaxMessageSize)) }() 737 if err := w.Start(); err != nil { 738 t.Fatal("could not start node") 739 } 740 defer func() { handleError(t, w.Stop()) }() 741 742 filter1, err := generateFilter(t, true) 743 if err != nil { 744 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 745 } 746 filter1.PoW = common.DefaultMinimumPoW 747 748 // Copy the first filter since some of its fields 749 // are randomly generated. 750 filter2 := &common.Filter{ 751 KeySym: filter1.KeySym, 752 Topics: filter1.Topics, 753 PoW: filter1.PoW, 754 AllowP2P: filter1.AllowP2P, 755 Messages: common.NewMemoryMessageStore(), 756 } 757 758 params, err := generateMessageParams() 759 if err != nil { 760 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 761 } 762 763 filter1.Src = ¶ms.Src.PublicKey 764 filter2.Src = ¶ms.Src.PublicKey 765 766 params.KeySym = filter1.KeySym 767 params.Topic = common.BytesToTopic(filter1.Topics[2]) 768 params.PoW = filter1.PoW 769 params.WorkTime = 10 770 params.TTL = 50 771 msg, err := common.NewSentMessage(params) 772 if err != nil { 773 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 774 } 775 env, err := msg.Wrap(params, time.Now()) 776 if err != nil { 777 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 778 } 779 780 _, err = w.Subscribe(filter1) 781 if err != nil { 782 t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err) 783 } 784 785 _, err = w.Subscribe(filter2) 786 if err != nil { 787 t.Fatalf("failed subscribe 2 with seed %d: %s.", seed, err) 788 } 789 790 err = w.Send(env) 791 if err != nil { 792 t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err) 793 } 794 795 // wait till received or timeout 796 var received bool 797 for j := 0; j < 200; j++ { 798 time.Sleep(10 * time.Millisecond) 799 if len(w.Envelopes()) > 0 { 800 received = true 801 break 802 } 803 } 804 805 if !received { 806 t.Fatalf("did not receive the sent envelope, seed: %d.", seed) 807 } 808 809 // check w.messages() 810 time.Sleep(5 * time.Millisecond) 811 mail1 := filter1.Retrieve() 812 mail2 := filter2.Retrieve() 813 if len(mail2) == 0 { 814 t.Fatalf("did not receive any email for filter 2") 815 } 816 if len(mail1) == 0 { 817 t.Fatalf("did not receive any email for filter 1") 818 } 819 820 } 821 822 func TestSymmetricSendWithoutAKey(t *testing.T) { 823 InitSingleTest() 824 825 w := New(nil, nil) 826 if err := w.Start(); err != nil { 827 t.Errorf("failed to start waku: '%s'", err) 828 } 829 830 defer func() { handleError(t, w.SetMinimumPoW(common.DefaultMinimumPoW, false)) }() 831 defer func() { handleError(t, w.SetMaxMessageSize(common.DefaultMaxMessageSize)) }() 832 defer func() { handleError(t, w.Stop()) }() 833 834 filter, err := generateFilter(t, true) 835 if err != nil { 836 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 837 } 838 filter.PoW = common.DefaultMinimumPoW 839 840 params, err := generateMessageParams() 841 if err != nil { 842 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 843 } 844 845 filter.Src = nil 846 847 params.KeySym = filter.KeySym 848 params.Topic = common.BytesToTopic(filter.Topics[2]) 849 params.PoW = filter.PoW 850 params.WorkTime = 10 851 params.TTL = 50 852 msg, err := common.NewSentMessage(params) 853 if err != nil { 854 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 855 } 856 env, err := msg.Wrap(params, time.Now()) 857 if err != nil { 858 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 859 } 860 861 _, err = w.Subscribe(filter) 862 if err != nil { 863 t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err) 864 } 865 866 err = w.Send(env) 867 if err != nil { 868 t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err) 869 } 870 871 // wait till received or timeout 872 var received bool 873 for j := 0; j < 200; j++ { 874 time.Sleep(10 * time.Millisecond) 875 if len(w.Envelopes()) > 0 { 876 received = true 877 break 878 } 879 } 880 881 if !received { 882 t.Fatalf("did not receive the sent envelope, seed: %d.", seed) 883 } 884 885 // check w.messages() 886 time.Sleep(5 * time.Millisecond) 887 mail := filter.Retrieve() 888 if len(mail) == 0 { 889 t.Fatalf("did not receive message in spite of not setting a public key") 890 } 891 } 892 893 func TestSymmetricSendKeyMismatch(t *testing.T) { 894 InitSingleTest() 895 896 w := New(nil, nil) 897 if err := w.Start(); err != nil { 898 t.Errorf("failed to start waku: '%s'", err) 899 } 900 defer func() { handleError(t, w.SetMinimumPoW(common.DefaultMinimumPoW, false)) }() 901 defer func() { handleError(t, w.SetMaxMessageSize(common.DefaultMaxMessageSize)) }() 902 defer func() { handleError(t, w.Stop()) }() 903 904 filter, err := generateFilter(t, true) 905 if err != nil { 906 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 907 } 908 filter.PoW = common.DefaultMinimumPoW 909 910 params, err := generateMessageParams() 911 if err != nil { 912 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 913 } 914 915 params.KeySym = filter.KeySym 916 params.Topic = common.BytesToTopic(filter.Topics[2]) 917 params.PoW = filter.PoW 918 params.WorkTime = 10 919 params.TTL = 50 920 msg, err := common.NewSentMessage(params) 921 if err != nil { 922 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 923 } 924 env, err := msg.Wrap(params, time.Now()) 925 if err != nil { 926 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 927 } 928 929 _, err = w.Subscribe(filter) 930 if err != nil { 931 t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err) 932 } 933 934 err = w.Send(env) 935 if err != nil { 936 t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err) 937 } 938 939 // wait till received or timeout 940 var received bool 941 for j := 0; j < 200; j++ { 942 time.Sleep(10 * time.Millisecond) 943 if len(w.Envelopes()) > 0 { 944 received = true 945 break 946 } 947 } 948 949 if !received { 950 t.Fatalf("did not receive the sent envelope, seed: %d.", seed) 951 } 952 953 // check w.messages() 954 time.Sleep(5 * time.Millisecond) 955 mail := filter.Retrieve() 956 if len(mail) > 0 { 957 t.Fatalf("received a message when keys weren't matching") 958 } 959 } 960 961 func TestFullNode(t *testing.T) { 962 963 config := &Config{FullNode: true} 964 w := New(config, nil) 965 966 require.True(t, w.FullNode(), "full node should be true") 967 require.True(t, common.IsFullNode(w.BloomFilter()), "bloom filter should be full") 968 require.True(t, common.IsFullNode(w.BloomFilterTolerance()), "bloom filter tolerance should be full") 969 require.Nil(t, w.TopicInterest(), "topic interest should be nil") 970 971 // Set a topic 972 require.NoError(t, w.SetTopicInterest([]common.TopicType{common.BytesToTopic([]byte("a"))})) 973 974 // Make sure everything is the same 975 require.True(t, w.FullNode(), "full node should be true") 976 require.True(t, common.IsFullNode(w.BloomFilter()), "bloom filter should be full") 977 require.True(t, common.IsFullNode(w.BloomFilterTolerance()), "bloom filter tolerance should be full") 978 require.Nil(t, w.TopicInterest(), "topic interest should be nil") 979 980 // unset full node 981 w.SetFullNode(false) 982 require.False(t, w.FullNode(), "full node should be false") 983 require.NotNil(t, w.TopicInterest(), "topic interest should not be nil") 984 } 985 986 func TestBloom(t *testing.T) { 987 topic := common.TopicType{0, 0, 255, 6} 988 b := topic.ToBloom() 989 x := make([]byte, common.BloomFilterSize) 990 x[0] = byte(1) 991 x[32] = byte(1) 992 x[common.BloomFilterSize-1] = byte(128) 993 if !common.BloomFilterMatch(x, b) || !common.BloomFilterMatch(b, x) { 994 t.Fatalf("bloom filter does not match the mask") 995 } 996 997 _, err := mrand.Read(b) // nolint: gosec 998 if err != nil { 999 t.Fatalf("math rand error") 1000 } 1001 _, err = mrand.Read(x) // nolint: gosec 1002 if err != nil { 1003 t.Fatalf("math rand error") 1004 } 1005 if !common.BloomFilterMatch(b, b) { 1006 t.Fatalf("bloom filter does not match self") 1007 } 1008 x = addBloom(x, b) 1009 if !common.BloomFilterMatch(x, b) { 1010 t.Fatalf("bloom filter does not match combined bloom") 1011 } 1012 if !common.IsFullNode(nil) { 1013 t.Fatalf("common.IsFullNode did not recognize nil as full node") 1014 } 1015 x[17] = 254 1016 if common.IsFullNode(x) { 1017 t.Fatalf("common.IsFullNode false positive") 1018 } 1019 for i := 0; i < common.BloomFilterSize; i++ { 1020 b[i] = byte(255) 1021 } 1022 if !common.IsFullNode(b) { 1023 t.Fatalf("common.IsFullNode false negative") 1024 } 1025 if common.BloomFilterMatch(x, b) { 1026 t.Fatalf("bloomFilterMatch false positive") 1027 } 1028 if !common.BloomFilterMatch(b, x) { 1029 t.Fatalf("bloomFilterMatch false negative") 1030 } 1031 1032 w := New(nil, nil) 1033 f := w.BloomFilter() 1034 if f != nil { 1035 t.Fatalf("wrong bloom on creation") 1036 } 1037 err = w.SetBloomFilter(x) 1038 if err != nil { 1039 t.Fatalf("failed to set bloom filter: %s", err) 1040 } 1041 f = w.BloomFilter() 1042 if !common.BloomFilterMatch(f, x) || !common.BloomFilterMatch(x, f) { 1043 t.Fatalf("retireved wrong bloom filter") 1044 } 1045 } 1046 1047 func TestTopicInterest(t *testing.T) { 1048 w := New(nil, nil) 1049 topicInterest := w.TopicInterest() 1050 if topicInterest != nil { 1051 t.Fatalf("wrong topic on creation") 1052 } 1053 1054 filter1, err := generateFilter(t, true) 1055 if err != nil { 1056 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 1057 } 1058 1059 _, err = w.Subscribe(filter1) 1060 if err != nil { 1061 t.Fatalf("failed subscribe with seed %d: %s.", seed, err) 1062 } 1063 1064 topicInterest = w.TopicInterest() 1065 if len(topicInterest) != len(filter1.Topics) { 1066 t.Fatalf("wrong number of topics created") 1067 } 1068 1069 filter2, err := generateFilter(t, true) 1070 if err != nil { 1071 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 1072 } 1073 1074 _, err = w.Subscribe(filter2) 1075 if err != nil { 1076 t.Fatalf("failed subscribe with seed %d: %s.", seed, err) 1077 } 1078 1079 topicInterest = w.TopicInterest() 1080 if len(topicInterest) != len(filter1.Topics)+len(filter2.Topics) { 1081 t.Fatalf("wrong number of topics created") 1082 } 1083 1084 } 1085 1086 func TestOnNewEnvelopesSoftBlacklist(t *testing.T) { 1087 w1 := New(nil, nil) 1088 1089 envelope := &common.Envelope{} 1090 stats := &common.StatsTracker{} 1091 p2pPeer := p2p.NewPeer(enode.ID{0x4}, "test", []p2p.Cap{}) 1092 peer := v1.NewPeer(w1, p2pPeer, nil, nil, stats) 1093 1094 // Pre-condition, we need to make sure this envelope returns an EnvelopeError 1095 envelopeError, err := w1.OnNewEnvelopes([]*common.Envelope{envelope}, peer) 1096 require.NoError(t, err) 1097 // Make sure this envelope returns an error 1098 require.NotNil(t, envelopeError) 1099 1100 // build black listed waku 1101 cfg := &Config{ 1102 SoftBlacklistedPeerIDs: []string{types.EncodeHex(peer.ID())}, 1103 } 1104 w2 := New(cfg, nil) 1105 1106 envelopeError, err = w2.OnNewEnvelopes([]*common.Envelope{envelope}, peer) 1107 require.NoError(t, err) 1108 // Since it's blacklisted, it will just drop envelopes, keep the connection open 1109 require.Nil(t, envelopeError) 1110 } 1111 1112 func handleError(t *testing.T, err error) { 1113 if err != nil { 1114 t.Logf("deferred function error: '%s'", err) 1115 } 1116 } 1117 1118 func generateFilter(t *testing.T, symmetric bool) (*common.Filter, error) { 1119 var f common.Filter 1120 f.Messages = common.NewMemoryMessageStore() 1121 1122 const topicNum = 8 1123 f.Topics = make([][]byte, topicNum) 1124 for i := 0; i < topicNum; i++ { 1125 f.Topics[i] = make([]byte, 4) 1126 mrand.Read(f.Topics[i]) // nolint: gosec 1127 f.Topics[i][0] = 0x01 1128 } 1129 1130 key, err := crypto.GenerateKey() 1131 if err != nil { 1132 t.Fatalf("generateFilter 1 failed with seed %d.", seed) 1133 return nil, err 1134 } 1135 f.Src = &key.PublicKey 1136 1137 if symmetric { 1138 f.KeySym = make([]byte, common.AESKeyLength) 1139 mrand.Read(f.KeySym) // nolint: gosec 1140 f.SymKeyHash = crypto.Keccak256Hash(f.KeySym) 1141 } else { 1142 f.KeyAsym, err = crypto.GenerateKey() 1143 if err != nil { 1144 t.Fatalf("generateFilter 2 failed with seed %d.", seed) 1145 return nil, err 1146 } 1147 } 1148 1149 // AcceptP2P & PoW are not set 1150 return &f, nil 1151 }