github.com/myafeier/go-ethereum@v1.6.8-0.20170719123245-3e0dbe0eaa72/whisper/whisperv5/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 whisperv5 18 19 import ( 20 "bytes" 21 "crypto/ecdsa" 22 mrand "math/rand" 23 "testing" 24 "time" 25 ) 26 27 func TestWhisperBasic(t *testing.T) { 28 w := New(&DefaultConfig) 29 p := w.Protocols() 30 shh := p[0] 31 if shh.Name != ProtocolName { 32 t.Fatalf("failed Protocol Name: %v.", shh.Name) 33 } 34 if uint64(shh.Version) != ProtocolVersion { 35 t.Fatalf("failed Protocol Version: %v.", shh.Version) 36 } 37 if shh.Length != NumberOfMessageCodes { 38 t.Fatalf("failed Protocol Length: %v.", shh.Length) 39 } 40 if shh.Run == nil { 41 t.Fatalf("failed shh.Run.") 42 } 43 if uint64(w.Version()) != ProtocolVersion { 44 t.Fatalf("failed whisper Version: %v.", shh.Version) 45 } 46 if w.GetFilter("non-existent") != nil { 47 t.Fatalf("failed GetFilter.") 48 } 49 50 peerID := make([]byte, 64) 51 mrand.Read(peerID) 52 peer, _ := w.getPeer(peerID) 53 if peer != nil { 54 t.Fatal("found peer for random key.") 55 } 56 if err := w.AllowP2PMessagesFromPeer(peerID); err == nil { 57 t.Fatalf("failed MarkPeerTrusted.") 58 } 59 exist := w.HasSymKey("non-existing") 60 if exist { 61 t.Fatalf("failed HasSymKey.") 62 } 63 key, err := w.GetSymKey("non-existing") 64 if err == nil { 65 t.Fatalf("failed GetSymKey(non-existing): false positive.") 66 } 67 if key != nil { 68 t.Fatalf("failed GetSymKey: false positive.") 69 } 70 mail := w.Envelopes() 71 if len(mail) != 0 { 72 t.Fatalf("failed w.Envelopes().") 73 } 74 m := w.Messages("non-existent") 75 if len(m) != 0 { 76 t.Fatalf("failed w.Messages.") 77 } 78 79 var derived []byte 80 ver := uint64(0xDEADBEEF) 81 if _, err := deriveKeyMaterial(peerID, ver); err != unknownVersionError(ver) { 82 t.Fatalf("failed deriveKeyMaterial with param = %v: %s.", peerID, err) 83 } 84 derived, err = deriveKeyMaterial(peerID, 0) 85 if err != nil { 86 t.Fatalf("failed second deriveKeyMaterial with param = %v: %s.", peerID, err) 87 } 88 if !validateSymmetricKey(derived) { 89 t.Fatalf("failed validateSymmetricKey with param = %v.", derived) 90 } 91 if containsOnlyZeros(derived) { 92 t.Fatalf("failed containsOnlyZeros with param = %v.", derived) 93 } 94 95 buf := []byte{0xFF, 0xE5, 0x80, 0x2, 0} 96 le := bytesToUintLittleEndian(buf) 97 be := BytesToUintBigEndian(buf) 98 if le != uint64(0x280e5ff) { 99 t.Fatalf("failed bytesToIntLittleEndian: %d.", le) 100 } 101 if be != uint64(0xffe5800200) { 102 t.Fatalf("failed BytesToIntBigEndian: %d.", be) 103 } 104 105 id, err := w.NewKeyPair() 106 if err != nil { 107 t.Fatalf("failed to generate new key pair: %s.", err) 108 } 109 pk, err := w.GetPrivateKey(id) 110 if err != nil { 111 t.Fatalf("failed to retrieve new key pair: %s.", err) 112 } 113 if !validatePrivateKey(pk) { 114 t.Fatalf("failed validatePrivateKey: %v.", pk) 115 } 116 if !ValidatePublicKey(&pk.PublicKey) { 117 t.Fatalf("failed ValidatePublicKey: %v.", pk) 118 } 119 } 120 121 func TestWhisperAsymmetricKeyImport(t *testing.T) { 122 var ( 123 w = New(&DefaultConfig) 124 privateKeys []*ecdsa.PrivateKey 125 ) 126 127 for i := 0; i < 50; i++ { 128 id, err := w.NewKeyPair() 129 if err != nil { 130 t.Fatalf("could not generate key: %v", err) 131 } 132 133 pk, err := w.GetPrivateKey(id) 134 if err != nil { 135 t.Fatalf("could not export private key: %v", err) 136 } 137 138 privateKeys = append(privateKeys, pk) 139 140 if !w.DeleteKeyPair(id) { 141 t.Fatalf("could not delete private key") 142 } 143 } 144 145 for _, pk := range privateKeys { 146 if _, err := w.AddKeyPair(pk); err != nil { 147 t.Fatalf("could not import private key: %v", err) 148 } 149 } 150 } 151 152 func TestWhisperIdentityManagement(t *testing.T) { 153 w := New(&DefaultConfig) 154 id1, err := w.NewKeyPair() 155 if err != nil { 156 t.Fatalf("failed to generate new key pair: %s.", err) 157 } 158 id2, err := w.NewKeyPair() 159 if err != nil { 160 t.Fatalf("failed to generate new key pair: %s.", err) 161 } 162 pk1, err := w.GetPrivateKey(id1) 163 if err != nil { 164 t.Fatalf("failed to retrieve the key pair: %s.", err) 165 } 166 pk2, err := w.GetPrivateKey(id2) 167 if err != nil { 168 t.Fatalf("failed to retrieve the key pair: %s.", err) 169 } 170 171 if !w.HasKeyPair(id1) { 172 t.Fatalf("failed HasIdentity(pk1).") 173 } 174 if !w.HasKeyPair(id2) { 175 t.Fatalf("failed HasIdentity(pk2).") 176 } 177 if pk1 == nil { 178 t.Fatalf("failed GetIdentity(pk1).") 179 } 180 if pk2 == nil { 181 t.Fatalf("failed GetIdentity(pk2).") 182 } 183 184 if !validatePrivateKey(pk1) { 185 t.Fatalf("pk1 is invalid.") 186 } 187 if !validatePrivateKey(pk2) { 188 t.Fatalf("pk2 is invalid.") 189 } 190 191 // Delete one identity 192 done := w.DeleteKeyPair(id1) 193 if !done { 194 t.Fatalf("failed to delete id1.") 195 } 196 pk1, err = w.GetPrivateKey(id1) 197 if err == nil { 198 t.Fatalf("retrieve the key pair: false positive.") 199 } 200 pk2, err = w.GetPrivateKey(id2) 201 if err != nil { 202 t.Fatalf("failed to retrieve the key pair: %s.", err) 203 } 204 if w.HasKeyPair(id1) { 205 t.Fatalf("failed DeleteIdentity(pub1): still exist.") 206 } 207 if !w.HasKeyPair(id2) { 208 t.Fatalf("failed DeleteIdentity(pub1): pub2 does not exist.") 209 } 210 if pk1 != nil { 211 t.Fatalf("failed DeleteIdentity(pub1): first key still exist.") 212 } 213 if pk2 == nil { 214 t.Fatalf("failed DeleteIdentity(pub1): second key does not exist.") 215 } 216 217 // Delete again non-existing identity 218 done = w.DeleteKeyPair(id1) 219 if done { 220 t.Fatalf("delete id1: false positive.") 221 } 222 pk1, err = w.GetPrivateKey(id1) 223 if err == nil { 224 t.Fatalf("retrieve the key pair: false positive.") 225 } 226 pk2, err = w.GetPrivateKey(id2) 227 if err != nil { 228 t.Fatalf("failed to retrieve the key pair: %s.", err) 229 } 230 if w.HasKeyPair(id1) { 231 t.Fatalf("failed delete non-existing identity: exist.") 232 } 233 if !w.HasKeyPair(id2) { 234 t.Fatalf("failed delete non-existing identity: pub2 does not exist.") 235 } 236 if pk1 != nil { 237 t.Fatalf("failed delete non-existing identity: first key exist.") 238 } 239 if pk2 == nil { 240 t.Fatalf("failed delete non-existing identity: second key does not exist.") 241 } 242 243 // Delete second identity 244 done = w.DeleteKeyPair(id2) 245 if !done { 246 t.Fatalf("failed to delete id2.") 247 } 248 pk1, err = w.GetPrivateKey(id1) 249 if err == nil { 250 t.Fatalf("retrieve the key pair: false positive.") 251 } 252 pk2, err = w.GetPrivateKey(id2) 253 if err == nil { 254 t.Fatalf("retrieve the key pair: false positive.") 255 } 256 if w.HasKeyPair(id1) { 257 t.Fatalf("failed delete second identity: first identity exist.") 258 } 259 if w.HasKeyPair(id2) { 260 t.Fatalf("failed delete second identity: still exist.") 261 } 262 if pk1 != nil { 263 t.Fatalf("failed delete second identity: first key exist.") 264 } 265 if pk2 != nil { 266 t.Fatalf("failed delete second identity: second key exist.") 267 } 268 } 269 270 func TestWhisperSymKeyManagement(t *testing.T) { 271 InitSingleTest() 272 273 var err error 274 var k1, k2 []byte 275 w := New(&DefaultConfig) 276 id1 := string("arbitrary-string-1") 277 id2 := string("arbitrary-string-2") 278 279 id1, err = w.GenerateSymKey() 280 if err != nil { 281 t.Fatalf("failed GenerateSymKey with seed %d: %s.", seed, err) 282 } 283 284 k1, err = w.GetSymKey(id1) 285 if err != nil { 286 t.Fatalf("failed GetSymKey(id1).") 287 } 288 k2, err = w.GetSymKey(id2) 289 if err == nil { 290 t.Fatalf("failed GetSymKey(id2): false positive.") 291 } 292 if !w.HasSymKey(id1) { 293 t.Fatalf("failed HasSymKey(id1).") 294 } 295 if w.HasSymKey(id2) { 296 t.Fatalf("failed HasSymKey(id2): false positive.") 297 } 298 if k1 == nil { 299 t.Fatalf("first key does not exist.") 300 } 301 if k2 != nil { 302 t.Fatalf("second key still exist.") 303 } 304 305 // add existing id, nothing should change 306 randomKey := make([]byte, aesKeyLength) 307 mrand.Read(randomKey) 308 id1, err = w.AddSymKeyDirect(randomKey) 309 if err != nil { 310 t.Fatalf("failed AddSymKey with seed %d: %s.", seed, err) 311 } 312 313 k1, err = w.GetSymKey(id1) 314 if err != nil { 315 t.Fatalf("failed w.GetSymKey(id1).") 316 } 317 k2, err = w.GetSymKey(id2) 318 if err == nil { 319 t.Fatalf("failed w.GetSymKey(id2): false positive.") 320 } 321 if !w.HasSymKey(id1) { 322 t.Fatalf("failed w.HasSymKey(id1).") 323 } 324 if w.HasSymKey(id2) { 325 t.Fatalf("failed w.HasSymKey(id2): false positive.") 326 } 327 if k1 == nil { 328 t.Fatalf("first key does not exist.") 329 } 330 if !bytes.Equal(k1, randomKey) { 331 t.Fatalf("k1 != randomKey.") 332 } 333 if k2 != nil { 334 t.Fatalf("second key already exist.") 335 } 336 337 id2, err = w.AddSymKeyDirect(randomKey) 338 if err != nil { 339 t.Fatalf("failed AddSymKey(id2) with seed %d: %s.", seed, err) 340 } 341 k1, err = w.GetSymKey(id1) 342 if err != nil { 343 t.Fatalf("failed w.GetSymKey(id1).") 344 } 345 k2, err = w.GetSymKey(id2) 346 if err != nil { 347 t.Fatalf("failed w.GetSymKey(id2).") 348 } 349 if !w.HasSymKey(id1) { 350 t.Fatalf("HasSymKey(id1) failed.") 351 } 352 if !w.HasSymKey(id2) { 353 t.Fatalf("HasSymKey(id2) failed.") 354 } 355 if k1 == nil { 356 t.Fatalf("k1 does not exist.") 357 } 358 if k2 == nil { 359 t.Fatalf("k2 does not exist.") 360 } 361 if !bytes.Equal(k1, k2) { 362 t.Fatalf("k1 != k2.") 363 } 364 if !bytes.Equal(k1, randomKey) { 365 t.Fatalf("k1 != randomKey.") 366 } 367 if len(k1) != aesKeyLength { 368 t.Fatalf("wrong length of k1.") 369 } 370 if len(k2) != aesKeyLength { 371 t.Fatalf("wrong length of k2.") 372 } 373 374 w.DeleteSymKey(id1) 375 k1, err = w.GetSymKey(id1) 376 if err == nil { 377 t.Fatalf("failed w.GetSymKey(id1): false positive.") 378 } 379 if k1 != nil { 380 t.Fatalf("failed GetSymKey(id1): false positive.") 381 } 382 k2, err = w.GetSymKey(id2) 383 if err != nil { 384 t.Fatalf("failed w.GetSymKey(id2).") 385 } 386 if w.HasSymKey(id1) { 387 t.Fatalf("failed to delete first key: still exist.") 388 } 389 if !w.HasSymKey(id2) { 390 t.Fatalf("failed to delete first key: second key does not exist.") 391 } 392 if k1 != nil { 393 t.Fatalf("failed to delete first key.") 394 } 395 if k2 == nil { 396 t.Fatalf("failed to delete first key: second key is nil.") 397 } 398 399 w.DeleteSymKey(id1) 400 w.DeleteSymKey(id2) 401 k1, err = w.GetSymKey(id1) 402 if err == nil { 403 t.Fatalf("failed w.GetSymKey(id1): false positive.") 404 } 405 k2, err = w.GetSymKey(id2) 406 if err == nil { 407 t.Fatalf("failed w.GetSymKey(id2): false positive.") 408 } 409 if k1 != nil || k2 != nil { 410 t.Fatalf("k1 or k2 is not nil") 411 } 412 if w.HasSymKey(id1) { 413 t.Fatalf("failed to delete second key: first key exist.") 414 } 415 if w.HasSymKey(id2) { 416 t.Fatalf("failed to delete second key: still exist.") 417 } 418 if k1 != nil { 419 t.Fatalf("failed to delete second key: first key is not nil.") 420 } 421 if k2 != nil { 422 t.Fatalf("failed to delete second key: second key is not nil.") 423 } 424 425 randomKey = make([]byte, aesKeyLength+1) 426 mrand.Read(randomKey) 427 id1, err = w.AddSymKeyDirect(randomKey) 428 if err == nil { 429 t.Fatalf("added the key with wrong size, seed %d.", seed) 430 } 431 432 const password = "arbitrary data here" 433 id1, err = w.AddSymKeyFromPassword(password) 434 if err != nil { 435 t.Fatalf("failed AddSymKeyFromPassword(id1) with seed %d: %s.", seed, err) 436 } 437 id2, err = w.AddSymKeyFromPassword(password) 438 if err != nil { 439 t.Fatalf("failed AddSymKeyFromPassword(id2) with seed %d: %s.", seed, err) 440 } 441 k1, err = w.GetSymKey(id1) 442 if err != nil { 443 t.Fatalf("failed w.GetSymKey(id1).") 444 } 445 k2, err = w.GetSymKey(id2) 446 if err != nil { 447 t.Fatalf("failed w.GetSymKey(id2).") 448 } 449 if !w.HasSymKey(id1) { 450 t.Fatalf("HasSymKey(id1) failed.") 451 } 452 if !w.HasSymKey(id2) { 453 t.Fatalf("HasSymKey(id2) failed.") 454 } 455 if k1 == nil { 456 t.Fatalf("k1 does not exist.") 457 } 458 if k2 == nil { 459 t.Fatalf("k2 does not exist.") 460 } 461 if !bytes.Equal(k1, k2) { 462 t.Fatalf("k1 != k2.") 463 } 464 if len(k1) != aesKeyLength { 465 t.Fatalf("wrong length of k1.") 466 } 467 if len(k2) != aesKeyLength { 468 t.Fatalf("wrong length of k2.") 469 } 470 if !validateSymmetricKey(k2) { 471 t.Fatalf("key validation failed.") 472 } 473 } 474 475 func TestExpiry(t *testing.T) { 476 InitSingleTest() 477 478 w := New(&DefaultConfig) 479 w.SetMinimumPoW(0.0000001) 480 defer w.SetMinimumPoW(DefaultMinimumPoW) 481 w.Start(nil) 482 defer w.Stop() 483 484 params, err := generateMessageParams() 485 if err != nil { 486 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 487 } 488 489 params.TTL = 1 490 msg, err := NewSentMessage(params) 491 if err != nil { 492 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 493 } 494 env, err := msg.Wrap(params) 495 if err != nil { 496 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 497 } 498 499 err = w.Send(env) 500 if err != nil { 501 t.Fatalf("failed to send envelope with seed %d: %s.", seed, err) 502 } 503 504 // wait till received or timeout 505 var received, expired bool 506 for j := 0; j < 20; j++ { 507 time.Sleep(100 * time.Millisecond) 508 if len(w.Envelopes()) > 0 { 509 received = true 510 break 511 } 512 } 513 514 if !received { 515 t.Fatalf("did not receive the sent envelope, seed: %d.", seed) 516 } 517 518 // wait till expired or timeout 519 for j := 0; j < 20; j++ { 520 time.Sleep(100 * time.Millisecond) 521 if len(w.Envelopes()) == 0 { 522 expired = true 523 break 524 } 525 } 526 527 if !expired { 528 t.Fatalf("expire failed, seed: %d.", seed) 529 } 530 } 531 532 func TestCustomization(t *testing.T) { 533 InitSingleTest() 534 535 w := New(&DefaultConfig) 536 defer w.SetMinimumPoW(DefaultMinimumPoW) 537 defer w.SetMaxMessageSize(DefaultMaxMessageSize) 538 w.Start(nil) 539 defer w.Stop() 540 541 const smallPoW = 0.00001 542 543 f, err := generateFilter(t, true) 544 params, err := generateMessageParams() 545 if err != nil { 546 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 547 } 548 549 params.KeySym = f.KeySym 550 params.Topic = BytesToTopic(f.Topics[2]) 551 params.PoW = smallPoW 552 params.TTL = 3600 * 24 // one day 553 msg, err := NewSentMessage(params) 554 if err != nil { 555 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 556 } 557 env, err := msg.Wrap(params) 558 if err != nil { 559 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 560 } 561 562 err = w.Send(env) 563 if err == nil { 564 t.Fatalf("successfully sent envelope with PoW %.06f, false positive (seed %d).", env.PoW(), seed) 565 } 566 567 w.SetMinimumPoW(smallPoW / 2) 568 err = w.Send(env) 569 if err != nil { 570 t.Fatalf("failed to send envelope with seed %d: %s.", seed, err) 571 } 572 573 params.TTL++ 574 msg, err = NewSentMessage(params) 575 if err != nil { 576 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 577 } 578 env, err = msg.Wrap(params) 579 if err != nil { 580 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 581 } 582 w.SetMaxMessageSize(uint32(env.size() - 1)) 583 err = w.Send(env) 584 if err == nil { 585 t.Fatalf("successfully sent oversized envelope (seed %d): false positive.", seed) 586 } 587 588 w.SetMaxMessageSize(DefaultMaxMessageSize) 589 err = w.Send(env) 590 if err != nil { 591 t.Fatalf("failed to send second envelope with seed %d: %s.", seed, err) 592 } 593 594 // wait till received or timeout 595 var received bool 596 for j := 0; j < 20; j++ { 597 time.Sleep(100 * time.Millisecond) 598 if len(w.Envelopes()) > 1 { 599 received = true 600 break 601 } 602 } 603 604 if !received { 605 t.Fatalf("did not receive the sent envelope, seed: %d.", seed) 606 } 607 608 // check w.messages() 609 id, err := w.Subscribe(f) 610 time.Sleep(5 * time.Millisecond) 611 mail := f.Retrieve() 612 if len(mail) > 0 { 613 t.Fatalf("received premature mail") 614 } 615 616 mail = w.Messages(id) 617 if len(mail) != 2 { 618 t.Fatalf("failed to get whisper messages") 619 } 620 }