whisper_test.go 21 KB

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