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