whisper_test.go 22 KB

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