github.com/aigarnetwork/aigar@v0.0.0-20191115204914-d59a6eb70f8e/whisper/whisperv6/whisper_test.go (about) 1 // Copyright 2018 The go-ethereum Authors 2 // Copyright 2019 The go-aigar Authors 3 // This file is part of the go-aigar library. 4 // 5 // The go-aigar library is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU Lesser General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // The go-aigar library is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU Lesser General Public License for more details. 14 // 15 // You should have received a copy of the GNU Lesser General Public License 16 // along with the go-aigar library. If not, see <http://www.gnu.org/licenses/>. 17 18 package whisperv6 19 20 import ( 21 "bytes" 22 "crypto/ecdsa" 23 "crypto/sha256" 24 mrand "math/rand" 25 "testing" 26 "time" 27 28 "github.com/AigarNetwork/aigar/common" 29 "golang.org/x/crypto/pbkdf2" 30 ) 31 32 func TestWhisperBasic(t *testing.T) { 33 w := New(&DefaultConfig) 34 p := w.Protocols() 35 shh := p[0] 36 if shh.Name != ProtocolName { 37 t.Fatalf("failed Protocol Name: %v.", shh.Name) 38 } 39 if uint64(shh.Version) != ProtocolVersion { 40 t.Fatalf("failed Protocol Version: %v.", shh.Version) 41 } 42 if shh.Length != NumberOfMessageCodes { 43 t.Fatalf("failed Protocol Length: %v.", shh.Length) 44 } 45 if shh.Run == nil { 46 t.Fatalf("failed shh.Run.") 47 } 48 if uint64(w.Version()) != ProtocolVersion { 49 t.Fatalf("failed whisper Version: %v.", shh.Version) 50 } 51 if w.GetFilter("non-existent") != nil { 52 t.Fatalf("failed GetFilter.") 53 } 54 55 peerID := make([]byte, 64) 56 mrand.Read(peerID) 57 peer, _ := w.getPeer(peerID) 58 if peer != nil { 59 t.Fatal("found peer for random key.") 60 } 61 if err := w.AllowP2PMessagesFromPeer(peerID); err == nil { 62 t.Fatalf("failed MarkPeerTrusted.") 63 } 64 exist := w.HasSymKey("non-existing") 65 if exist { 66 t.Fatalf("failed HasSymKey.") 67 } 68 key, err := w.GetSymKey("non-existing") 69 if err == nil { 70 t.Fatalf("failed GetSymKey(non-existing): false positive.") 71 } 72 if key != nil { 73 t.Fatalf("failed GetSymKey: false positive.") 74 } 75 mail := w.Envelopes() 76 if len(mail) != 0 { 77 t.Fatalf("failed w.Envelopes().") 78 } 79 80 derived := pbkdf2.Key(peerID, nil, 65356, aesKeyLength, sha256.New) 81 if !validateDataIntegrity(derived, aesKeyLength) { 82 t.Fatalf("failed validateSymmetricKey with param = %v.", derived) 83 } 84 if containsOnlyZeros(derived) { 85 t.Fatalf("failed containsOnlyZeros with param = %v.", derived) 86 } 87 88 buf := []byte{0xFF, 0xE5, 0x80, 0x2, 0} 89 le := bytesToUintLittleEndian(buf) 90 be := BytesToUintBigEndian(buf) 91 if le != uint64(0x280e5ff) { 92 t.Fatalf("failed bytesToIntLittleEndian: %d.", le) 93 } 94 if be != uint64(0xffe5800200) { 95 t.Fatalf("failed BytesToIntBigEndian: %d.", be) 96 } 97 98 id, err := w.NewKeyPair() 99 if err != nil { 100 t.Fatalf("failed to generate new key pair: %s.", err) 101 } 102 pk, err := w.GetPrivateKey(id) 103 if err != nil { 104 t.Fatalf("failed to retrieve new key pair: %s.", err) 105 } 106 if !validatePrivateKey(pk) { 107 t.Fatalf("failed validatePrivateKey: %v.", pk) 108 } 109 if !ValidatePublicKey(&pk.PublicKey) { 110 t.Fatalf("failed ValidatePublicKey: %v.", pk) 111 } 112 } 113 114 func TestWhisperAsymmetricKeyImport(t *testing.T) { 115 var ( 116 w = New(&DefaultConfig) 117 privateKeys []*ecdsa.PrivateKey 118 ) 119 120 for i := 0; i < 50; i++ { 121 id, err := w.NewKeyPair() 122 if err != nil { 123 t.Fatalf("could not generate key: %v", err) 124 } 125 126 pk, err := w.GetPrivateKey(id) 127 if err != nil { 128 t.Fatalf("could not export private key: %v", err) 129 } 130 131 privateKeys = append(privateKeys, pk) 132 133 if !w.DeleteKeyPair(id) { 134 t.Fatalf("could not delete private key") 135 } 136 } 137 138 for _, pk := range privateKeys { 139 if _, err := w.AddKeyPair(pk); err != nil { 140 t.Fatalf("could not import private key: %v", err) 141 } 142 } 143 } 144 145 func TestWhisperIdentityManagement(t *testing.T) { 146 w := New(&DefaultConfig) 147 id1, err := w.NewKeyPair() 148 if err != nil { 149 t.Fatalf("failed to generate new key pair: %s.", err) 150 } 151 id2, err := w.NewKeyPair() 152 if err != nil { 153 t.Fatalf("failed to generate new key pair: %s.", err) 154 } 155 pk1, err := w.GetPrivateKey(id1) 156 if err != nil { 157 t.Fatalf("failed to retrieve the key pair: %s.", err) 158 } 159 pk2, err := w.GetPrivateKey(id2) 160 if err != nil { 161 t.Fatalf("failed to retrieve the key pair: %s.", err) 162 } 163 164 if !w.HasKeyPair(id1) { 165 t.Fatalf("failed HasIdentity(pk1).") 166 } 167 if !w.HasKeyPair(id2) { 168 t.Fatalf("failed HasIdentity(pk2).") 169 } 170 if pk1 == nil { 171 t.Fatalf("failed GetIdentity(pk1).") 172 } 173 if pk2 == nil { 174 t.Fatalf("failed GetIdentity(pk2).") 175 } 176 177 if !validatePrivateKey(pk1) { 178 t.Fatalf("pk1 is invalid.") 179 } 180 if !validatePrivateKey(pk2) { 181 t.Fatalf("pk2 is invalid.") 182 } 183 184 // Delete one identity 185 done := w.DeleteKeyPair(id1) 186 if !done { 187 t.Fatalf("failed to delete id1.") 188 } 189 pk1, err = w.GetPrivateKey(id1) 190 if err == nil { 191 t.Fatalf("retrieve the key pair: false positive.") 192 } 193 pk2, err = w.GetPrivateKey(id2) 194 if err != nil { 195 t.Fatalf("failed to retrieve the key pair: %s.", err) 196 } 197 if w.HasKeyPair(id1) { 198 t.Fatalf("failed DeleteIdentity(pub1): still exist.") 199 } 200 if !w.HasKeyPair(id2) { 201 t.Fatalf("failed DeleteIdentity(pub1): pub2 does not exist.") 202 } 203 if pk1 != nil { 204 t.Fatalf("failed DeleteIdentity(pub1): first key still exist.") 205 } 206 if pk2 == nil { 207 t.Fatalf("failed DeleteIdentity(pub1): second key does not exist.") 208 } 209 210 // Delete again non-existing identity 211 done = w.DeleteKeyPair(id1) 212 if done { 213 t.Fatalf("delete id1: false positive.") 214 } 215 pk1, err = w.GetPrivateKey(id1) 216 if err == nil { 217 t.Fatalf("retrieve the key pair: false positive.") 218 } 219 pk2, err = w.GetPrivateKey(id2) 220 if err != nil { 221 t.Fatalf("failed to retrieve the key pair: %s.", err) 222 } 223 if w.HasKeyPair(id1) { 224 t.Fatalf("failed delete non-existing identity: exist.") 225 } 226 if !w.HasKeyPair(id2) { 227 t.Fatalf("failed delete non-existing identity: pub2 does not exist.") 228 } 229 if pk1 != nil { 230 t.Fatalf("failed delete non-existing identity: first key exist.") 231 } 232 if pk2 == nil { 233 t.Fatalf("failed delete non-existing identity: second key does not exist.") 234 } 235 236 // Delete second identity 237 done = w.DeleteKeyPair(id2) 238 if !done { 239 t.Fatalf("failed to delete id2.") 240 } 241 pk1, err = w.GetPrivateKey(id1) 242 if err == nil { 243 t.Fatalf("retrieve the key pair: false positive.") 244 } 245 pk2, err = w.GetPrivateKey(id2) 246 if err == nil { 247 t.Fatalf("retrieve the key pair: false positive.") 248 } 249 if w.HasKeyPair(id1) { 250 t.Fatalf("failed delete second identity: first identity exist.") 251 } 252 if w.HasKeyPair(id2) { 253 t.Fatalf("failed delete second identity: still exist.") 254 } 255 if pk1 != nil { 256 t.Fatalf("failed delete second identity: first key exist.") 257 } 258 if pk2 != nil { 259 t.Fatalf("failed delete second identity: second key exist.") 260 } 261 } 262 263 func TestWhisperSymKeyManagement(t *testing.T) { 264 InitSingleTest() 265 266 var err error 267 var k1, k2 []byte 268 w := New(&DefaultConfig) 269 id1 := string("arbitrary-string-1") 270 id2 := string("arbitrary-string-2") 271 272 id1, err = w.GenerateSymKey() 273 if err != nil { 274 t.Fatalf("failed GenerateSymKey with seed %d: %s.", seed, err) 275 } 276 277 k1, err = w.GetSymKey(id1) 278 if err != nil { 279 t.Fatalf("failed GetSymKey(id1).") 280 } 281 k2, err = w.GetSymKey(id2) 282 if err == nil { 283 t.Fatalf("failed GetSymKey(id2): false positive.") 284 } 285 if !w.HasSymKey(id1) { 286 t.Fatalf("failed HasSymKey(id1).") 287 } 288 if w.HasSymKey(id2) { 289 t.Fatalf("failed HasSymKey(id2): false positive.") 290 } 291 if k1 == nil { 292 t.Fatalf("first key does not exist.") 293 } 294 if k2 != nil { 295 t.Fatalf("second key still exist.") 296 } 297 298 // add existing id, nothing should change 299 randomKey := make([]byte, aesKeyLength) 300 mrand.Read(randomKey) 301 id1, err = w.AddSymKeyDirect(randomKey) 302 if err != nil { 303 t.Fatalf("failed AddSymKey with seed %d: %s.", seed, err) 304 } 305 306 k1, err = w.GetSymKey(id1) 307 if err != nil { 308 t.Fatalf("failed w.GetSymKey(id1).") 309 } 310 k2, err = w.GetSymKey(id2) 311 if err == nil { 312 t.Fatalf("failed w.GetSymKey(id2): false positive.") 313 } 314 if !w.HasSymKey(id1) { 315 t.Fatalf("failed w.HasSymKey(id1).") 316 } 317 if w.HasSymKey(id2) { 318 t.Fatalf("failed w.HasSymKey(id2): false positive.") 319 } 320 if k1 == nil { 321 t.Fatalf("first key does not exist.") 322 } 323 if !bytes.Equal(k1, randomKey) { 324 t.Fatalf("k1 != randomKey.") 325 } 326 if k2 != nil { 327 t.Fatalf("second key already exist.") 328 } 329 330 id2, err = w.AddSymKeyDirect(randomKey) 331 if err != nil { 332 t.Fatalf("failed AddSymKey(id2) with seed %d: %s.", seed, err) 333 } 334 k1, err = w.GetSymKey(id1) 335 if err != nil { 336 t.Fatalf("failed w.GetSymKey(id1).") 337 } 338 k2, err = w.GetSymKey(id2) 339 if err != nil { 340 t.Fatalf("failed w.GetSymKey(id2).") 341 } 342 if !w.HasSymKey(id1) { 343 t.Fatalf("HasSymKey(id1) failed.") 344 } 345 if !w.HasSymKey(id2) { 346 t.Fatalf("HasSymKey(id2) failed.") 347 } 348 if k1 == nil { 349 t.Fatalf("k1 does not exist.") 350 } 351 if k2 == nil { 352 t.Fatalf("k2 does not exist.") 353 } 354 if !bytes.Equal(k1, k2) { 355 t.Fatalf("k1 != k2.") 356 } 357 if !bytes.Equal(k1, randomKey) { 358 t.Fatalf("k1 != randomKey.") 359 } 360 if len(k1) != aesKeyLength { 361 t.Fatalf("wrong length of k1.") 362 } 363 if len(k2) != aesKeyLength { 364 t.Fatalf("wrong length of k2.") 365 } 366 367 w.DeleteSymKey(id1) 368 k1, err = w.GetSymKey(id1) 369 if err == nil { 370 t.Fatalf("failed w.GetSymKey(id1): false positive.") 371 } 372 if k1 != nil { 373 t.Fatalf("failed GetSymKey(id1): false positive.") 374 } 375 k2, err = w.GetSymKey(id2) 376 if err != nil { 377 t.Fatalf("failed w.GetSymKey(id2).") 378 } 379 if w.HasSymKey(id1) { 380 t.Fatalf("failed to delete first key: still exist.") 381 } 382 if !w.HasSymKey(id2) { 383 t.Fatalf("failed to delete first key: second key does not exist.") 384 } 385 if k1 != nil { 386 t.Fatalf("failed to delete first key.") 387 } 388 if k2 == nil { 389 t.Fatalf("failed to delete first key: second key is nil.") 390 } 391 392 w.DeleteSymKey(id1) 393 w.DeleteSymKey(id2) 394 k1, err = w.GetSymKey(id1) 395 if err == nil { 396 t.Fatalf("failed w.GetSymKey(id1): false positive.") 397 } 398 k2, err = w.GetSymKey(id2) 399 if err == nil { 400 t.Fatalf("failed w.GetSymKey(id2): false positive.") 401 } 402 if k1 != nil || k2 != nil { 403 t.Fatalf("k1 or k2 is not nil") 404 } 405 if w.HasSymKey(id1) { 406 t.Fatalf("failed to delete second key: first key exist.") 407 } 408 if w.HasSymKey(id2) { 409 t.Fatalf("failed to delete second key: still exist.") 410 } 411 if k1 != nil { 412 t.Fatalf("failed to delete second key: first key is not nil.") 413 } 414 if k2 != nil { 415 t.Fatalf("failed to delete second key: second key is not nil.") 416 } 417 418 randomKey = make([]byte, aesKeyLength+1) 419 mrand.Read(randomKey) 420 _, err = w.AddSymKeyDirect(randomKey) 421 if err == nil { 422 t.Fatalf("added the key with wrong size, seed %d.", seed) 423 } 424 425 const password = "arbitrary data here" 426 id1, err = w.AddSymKeyFromPassword(password) 427 if err != nil { 428 t.Fatalf("failed AddSymKeyFromPassword(id1) with seed %d: %s.", seed, err) 429 } 430 id2, err = w.AddSymKeyFromPassword(password) 431 if err != nil { 432 t.Fatalf("failed AddSymKeyFromPassword(id2) with seed %d: %s.", seed, err) 433 } 434 k1, err = w.GetSymKey(id1) 435 if err != nil { 436 t.Fatalf("failed w.GetSymKey(id1).") 437 } 438 k2, err = w.GetSymKey(id2) 439 if err != nil { 440 t.Fatalf("failed w.GetSymKey(id2).") 441 } 442 if !w.HasSymKey(id1) { 443 t.Fatalf("HasSymKey(id1) failed.") 444 } 445 if !w.HasSymKey(id2) { 446 t.Fatalf("HasSymKey(id2) failed.") 447 } 448 if !validateDataIntegrity(k2, aesKeyLength) { 449 t.Fatalf("key validation failed.") 450 } 451 if !bytes.Equal(k1, k2) { 452 t.Fatalf("k1 != k2.") 453 } 454 } 455 456 func TestExpiry(t *testing.T) { 457 InitSingleTest() 458 459 w := New(&DefaultConfig) 460 w.SetMinimumPowTest(0.0000001) 461 defer w.SetMinimumPowTest(DefaultMinimumPoW) 462 w.Start(nil) 463 defer w.Stop() 464 465 params, err := generateMessageParams() 466 if err != nil { 467 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 468 } 469 params.TTL = 1 470 471 messagesCount := 5 472 473 // Send a few messages one after another. Due to low PoW and expiration buckets 474 // with one second resolution, it covers a case when there are multiple items 475 // in a single expiration bucket. 476 for i := 0; i < messagesCount; i++ { 477 msg, err := NewSentMessage(params) 478 if err != nil { 479 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 480 } 481 env, err := msg.Wrap(params) 482 if err != nil { 483 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 484 } 485 486 err = w.Send(env) 487 if err != nil { 488 t.Fatalf("failed to send envelope with seed %d: %s.", seed, err) 489 } 490 } 491 492 // wait till received or timeout 493 var received, expired bool 494 for j := 0; j < 20; j++ { 495 time.Sleep(100 * time.Millisecond) 496 if len(w.Envelopes()) == messagesCount { 497 received = true 498 break 499 } 500 } 501 502 if !received { 503 t.Fatalf("did not receive the sent envelope, seed: %d.", seed) 504 } 505 506 // wait till expired or timeout 507 for j := 0; j < 20; j++ { 508 time.Sleep(100 * time.Millisecond) 509 if len(w.Envelopes()) == 0 { 510 expired = true 511 break 512 } 513 } 514 515 if !expired { 516 t.Fatalf("expire failed, seed: %d.", seed) 517 } 518 } 519 520 func TestCustomization(t *testing.T) { 521 InitSingleTest() 522 523 w := New(&DefaultConfig) 524 defer w.SetMinimumPowTest(DefaultMinimumPoW) 525 defer w.SetMaxMessageSize(DefaultMaxMessageSize) 526 w.Start(nil) 527 defer w.Stop() 528 529 const smallPoW = 0.00001 530 531 f, err := generateFilter(t, true) 532 if err != nil { 533 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 534 } 535 params, err := generateMessageParams() 536 if err != nil { 537 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 538 } 539 540 params.KeySym = f.KeySym 541 params.Topic = BytesToTopic(f.Topics[2]) 542 params.PoW = smallPoW 543 params.TTL = 3600 * 24 // one day 544 msg, err := NewSentMessage(params) 545 if err != nil { 546 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 547 } 548 env, err := msg.Wrap(params) 549 if err != nil { 550 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 551 } 552 553 err = w.Send(env) 554 if err == nil { 555 t.Fatalf("successfully sent envelope with PoW %.06f, false positive (seed %d).", env.PoW(), seed) 556 } 557 558 w.SetMinimumPowTest(smallPoW / 2) 559 err = w.Send(env) 560 if err != nil { 561 t.Fatalf("failed to send envelope with seed %d: %s.", seed, err) 562 } 563 564 params.TTL++ 565 msg, err = NewSentMessage(params) 566 if err != nil { 567 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 568 } 569 env, err = msg.Wrap(params) 570 if err != nil { 571 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 572 } 573 w.SetMaxMessageSize(uint32(env.size() - 1)) 574 err = w.Send(env) 575 if err == nil { 576 t.Fatalf("successfully sent oversized envelope (seed %d): false positive.", seed) 577 } 578 579 w.SetMaxMessageSize(DefaultMaxMessageSize) 580 err = w.Send(env) 581 if err != nil { 582 t.Fatalf("failed to send second envelope with seed %d: %s.", seed, err) 583 } 584 585 // wait till received or timeout 586 var received bool 587 for j := 0; j < 20; j++ { 588 time.Sleep(100 * time.Millisecond) 589 if len(w.Envelopes()) > 1 { 590 received = true 591 break 592 } 593 } 594 595 if !received { 596 t.Fatalf("did not receive the sent envelope, seed: %d.", seed) 597 } 598 599 // check w.messages() 600 _, err = w.Subscribe(f) 601 if err != nil { 602 t.Fatalf("failed subscribe with seed %d: %s.", seed, err) 603 } 604 time.Sleep(5 * time.Millisecond) 605 mail := f.Retrieve() 606 if len(mail) > 0 { 607 t.Fatalf("received premature mail") 608 } 609 } 610 611 func TestSymmetricSendCycle(t *testing.T) { 612 InitSingleTest() 613 614 w := New(&DefaultConfig) 615 defer w.SetMinimumPowTest(DefaultMinimumPoW) 616 defer w.SetMaxMessageSize(DefaultMaxMessageSize) 617 w.Start(nil) 618 defer w.Stop() 619 620 filter1, err := generateFilter(t, true) 621 if err != nil { 622 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 623 } 624 filter1.PoW = DefaultMinimumPoW 625 626 // Copy the first filter since some of its fields 627 // are randomly gnerated. 628 filter2 := &Filter{ 629 KeySym: filter1.KeySym, 630 Topics: filter1.Topics, 631 PoW: filter1.PoW, 632 AllowP2P: filter1.AllowP2P, 633 Messages: make(map[common.Hash]*ReceivedMessage), 634 } 635 636 params, err := generateMessageParams() 637 if err != nil { 638 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 639 } 640 641 filter1.Src = ¶ms.Src.PublicKey 642 filter2.Src = ¶ms.Src.PublicKey 643 644 params.KeySym = filter1.KeySym 645 params.Topic = BytesToTopic(filter1.Topics[2]) 646 params.PoW = filter1.PoW 647 params.WorkTime = 10 648 params.TTL = 50 649 msg, err := NewSentMessage(params) 650 if err != nil { 651 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 652 } 653 env, err := msg.Wrap(params) 654 if err != nil { 655 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 656 } 657 658 _, err = w.Subscribe(filter1) 659 if err != nil { 660 t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err) 661 } 662 663 _, err = w.Subscribe(filter2) 664 if err != nil { 665 t.Fatalf("failed subscribe 2 with seed %d: %s.", seed, err) 666 } 667 668 err = w.Send(env) 669 if err != nil { 670 t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err) 671 } 672 673 // wait till received or timeout 674 var received bool 675 for j := 0; j < 200; j++ { 676 time.Sleep(10 * time.Millisecond) 677 if len(w.Envelopes()) > 0 { 678 received = true 679 break 680 } 681 } 682 683 if !received { 684 t.Fatalf("did not receive the sent envelope, seed: %d.", seed) 685 } 686 687 // check w.messages() 688 time.Sleep(5 * time.Millisecond) 689 mail1 := filter1.Retrieve() 690 mail2 := filter2.Retrieve() 691 if len(mail2) == 0 { 692 t.Fatalf("did not receive any email for filter 2") 693 } 694 if len(mail1) == 0 { 695 t.Fatalf("did not receive any email for filter 1") 696 } 697 698 } 699 700 func TestSymmetricSendWithoutAKey(t *testing.T) { 701 InitSingleTest() 702 703 w := New(&DefaultConfig) 704 defer w.SetMinimumPowTest(DefaultMinimumPoW) 705 defer w.SetMaxMessageSize(DefaultMaxMessageSize) 706 w.Start(nil) 707 defer w.Stop() 708 709 filter, err := generateFilter(t, true) 710 if err != nil { 711 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 712 } 713 filter.PoW = DefaultMinimumPoW 714 715 params, err := generateMessageParams() 716 if err != nil { 717 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 718 } 719 720 filter.Src = nil 721 722 params.KeySym = filter.KeySym 723 params.Topic = BytesToTopic(filter.Topics[2]) 724 params.PoW = filter.PoW 725 params.WorkTime = 10 726 params.TTL = 50 727 msg, err := NewSentMessage(params) 728 if err != nil { 729 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 730 } 731 env, err := msg.Wrap(params) 732 if err != nil { 733 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 734 } 735 736 _, err = w.Subscribe(filter) 737 if err != nil { 738 t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err) 739 } 740 741 err = w.Send(env) 742 if err != nil { 743 t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err) 744 } 745 746 // wait till received or timeout 747 var received bool 748 for j := 0; j < 200; j++ { 749 time.Sleep(10 * time.Millisecond) 750 if len(w.Envelopes()) > 0 { 751 received = true 752 break 753 } 754 } 755 756 if !received { 757 t.Fatalf("did not receive the sent envelope, seed: %d.", seed) 758 } 759 760 // check w.messages() 761 time.Sleep(5 * time.Millisecond) 762 mail := filter.Retrieve() 763 if len(mail) == 0 { 764 t.Fatalf("did not receive message in spite of not setting a public key") 765 } 766 } 767 768 func TestSymmetricSendKeyMismatch(t *testing.T) { 769 InitSingleTest() 770 771 w := New(&DefaultConfig) 772 defer w.SetMinimumPowTest(DefaultMinimumPoW) 773 defer w.SetMaxMessageSize(DefaultMaxMessageSize) 774 w.Start(nil) 775 defer w.Stop() 776 777 filter, err := generateFilter(t, true) 778 if err != nil { 779 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 780 } 781 filter.PoW = DefaultMinimumPoW 782 783 params, err := generateMessageParams() 784 if err != nil { 785 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 786 } 787 788 params.KeySym = filter.KeySym 789 params.Topic = BytesToTopic(filter.Topics[2]) 790 params.PoW = filter.PoW 791 params.WorkTime = 10 792 params.TTL = 50 793 msg, err := NewSentMessage(params) 794 if err != nil { 795 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 796 } 797 env, err := msg.Wrap(params) 798 if err != nil { 799 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 800 } 801 802 _, err = w.Subscribe(filter) 803 if err != nil { 804 t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err) 805 } 806 807 err = w.Send(env) 808 if err != nil { 809 t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err) 810 } 811 812 // wait till received or timeout 813 var received bool 814 for j := 0; j < 200; j++ { 815 time.Sleep(10 * time.Millisecond) 816 if len(w.Envelopes()) > 0 { 817 received = true 818 break 819 } 820 } 821 822 if !received { 823 t.Fatalf("did not receive the sent envelope, seed: %d.", seed) 824 } 825 826 // check w.messages() 827 time.Sleep(5 * time.Millisecond) 828 mail := filter.Retrieve() 829 if len(mail) > 0 { 830 t.Fatalf("received a message when keys weren't matching") 831 } 832 } 833 834 func TestBloom(t *testing.T) { 835 topic := TopicType{0, 0, 255, 6} 836 b := TopicToBloom(topic) 837 x := make([]byte, BloomFilterSize) 838 x[0] = byte(1) 839 x[32] = byte(1) 840 x[BloomFilterSize-1] = byte(128) 841 if !BloomFilterMatch(x, b) || !BloomFilterMatch(b, x) { 842 t.Fatalf("bloom filter does not match the mask") 843 } 844 845 _, err := mrand.Read(b) 846 if err != nil { 847 t.Fatalf("math rand error") 848 } 849 _, err = mrand.Read(x) 850 if err != nil { 851 t.Fatalf("math rand error") 852 } 853 if !BloomFilterMatch(b, b) { 854 t.Fatalf("bloom filter does not match self") 855 } 856 x = addBloom(x, b) 857 if !BloomFilterMatch(x, b) { 858 t.Fatalf("bloom filter does not match combined bloom") 859 } 860 if !isFullNode(nil) { 861 t.Fatalf("isFullNode did not recognize nil as full node") 862 } 863 x[17] = 254 864 if isFullNode(x) { 865 t.Fatalf("isFullNode false positive") 866 } 867 for i := 0; i < BloomFilterSize; i++ { 868 b[i] = byte(255) 869 } 870 if !isFullNode(b) { 871 t.Fatalf("isFullNode false negative") 872 } 873 if BloomFilterMatch(x, b) { 874 t.Fatalf("bloomFilterMatch false positive") 875 } 876 if !BloomFilterMatch(b, x) { 877 t.Fatalf("bloomFilterMatch false negative") 878 } 879 880 w := New(&DefaultConfig) 881 f := w.BloomFilter() 882 if f != nil { 883 t.Fatalf("wrong bloom on creation") 884 } 885 err = w.SetBloomFilter(x) 886 if err != nil { 887 t.Fatalf("failed to set bloom filter: %s", err) 888 } 889 f = w.BloomFilter() 890 if !BloomFilterMatch(f, x) || !BloomFilterMatch(x, f) { 891 t.Fatalf("retireved wrong bloom filter") 892 } 893 }