whisper_test.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886
  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. msg, err := NewSentMessage(params)
  436. if err != nil {
  437. t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
  438. }
  439. env, err := msg.Wrap(params)
  440. if err != nil {
  441. t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
  442. }
  443. err = w.Send(env)
  444. if err != nil {
  445. t.Fatalf("failed to send envelope with seed %d: %s.", seed, err)
  446. }
  447. // wait till received or timeout
  448. var received, expired bool
  449. for j := 0; j < 20; j++ {
  450. time.Sleep(100 * time.Millisecond)
  451. if len(w.Envelopes()) > 0 {
  452. received = true
  453. break
  454. }
  455. }
  456. if !received {
  457. t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
  458. }
  459. // wait till expired or timeout
  460. for j := 0; j < 20; j++ {
  461. time.Sleep(100 * time.Millisecond)
  462. if len(w.Envelopes()) == 0 {
  463. expired = true
  464. break
  465. }
  466. }
  467. if !expired {
  468. t.Fatalf("expire failed, seed: %d.", seed)
  469. }
  470. }
  471. func TestCustomization(t *testing.T) {
  472. InitSingleTest()
  473. w := New(&DefaultConfig)
  474. defer w.SetMinimumPowTest(DefaultMinimumPoW)
  475. defer w.SetMaxMessageSize(DefaultMaxMessageSize)
  476. w.Start(nil)
  477. defer w.Stop()
  478. const smallPoW = 0.00001
  479. f, err := generateFilter(t, true)
  480. if err != nil {
  481. t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
  482. }
  483. params, err := generateMessageParams()
  484. if err != nil {
  485. t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
  486. }
  487. params.KeySym = f.KeySym
  488. params.Topic = BytesToTopic(f.Topics[2])
  489. params.PoW = smallPoW
  490. params.TTL = 3600 * 24 // one day
  491. msg, err := NewSentMessage(params)
  492. if err != nil {
  493. t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
  494. }
  495. env, err := msg.Wrap(params)
  496. if err != nil {
  497. t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
  498. }
  499. err = w.Send(env)
  500. if err == nil {
  501. t.Fatalf("successfully sent envelope with PoW %.06f, false positive (seed %d).", env.PoW(), seed)
  502. }
  503. w.SetMinimumPowTest(smallPoW / 2)
  504. err = w.Send(env)
  505. if err != nil {
  506. t.Fatalf("failed to send envelope with seed %d: %s.", seed, err)
  507. }
  508. params.TTL++
  509. msg, err = NewSentMessage(params)
  510. if err != nil {
  511. t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
  512. }
  513. env, err = msg.Wrap(params)
  514. if err != nil {
  515. t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
  516. }
  517. w.SetMaxMessageSize(uint32(env.size() - 1))
  518. err = w.Send(env)
  519. if err == nil {
  520. t.Fatalf("successfully sent oversized envelope (seed %d): false positive.", seed)
  521. }
  522. w.SetMaxMessageSize(DefaultMaxMessageSize)
  523. err = w.Send(env)
  524. if err != nil {
  525. t.Fatalf("failed to send second envelope with seed %d: %s.", seed, err)
  526. }
  527. // wait till received or timeout
  528. var received bool
  529. for j := 0; j < 20; j++ {
  530. time.Sleep(100 * time.Millisecond)
  531. if len(w.Envelopes()) > 1 {
  532. received = true
  533. break
  534. }
  535. }
  536. if !received {
  537. t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
  538. }
  539. // check w.messages()
  540. _, err = w.Subscribe(f)
  541. if err != nil {
  542. t.Fatalf("failed subscribe with seed %d: %s.", seed, err)
  543. }
  544. time.Sleep(5 * time.Millisecond)
  545. mail := f.Retrieve()
  546. if len(mail) > 0 {
  547. t.Fatalf("received premature mail")
  548. }
  549. }
  550. func TestSymmetricSendCycle(t *testing.T) {
  551. InitSingleTest()
  552. w := New(&DefaultConfig)
  553. defer w.SetMinimumPowTest(DefaultMinimumPoW)
  554. defer w.SetMaxMessageSize(DefaultMaxMessageSize)
  555. w.Start(nil)
  556. defer w.Stop()
  557. filter1, err := generateFilter(t, true)
  558. if err != nil {
  559. t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
  560. }
  561. filter1.PoW = DefaultMinimumPoW
  562. // Copy the first filter since some of its fields
  563. // are randomly gnerated.
  564. filter2 := &Filter{
  565. KeySym: filter1.KeySym,
  566. Topics: filter1.Topics,
  567. PoW: filter1.PoW,
  568. AllowP2P: filter1.AllowP2P,
  569. Messages: make(map[common.Hash]*ReceivedMessage),
  570. }
  571. params, err := generateMessageParams()
  572. if err != nil {
  573. t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
  574. }
  575. filter1.Src = &params.Src.PublicKey
  576. filter2.Src = &params.Src.PublicKey
  577. params.KeySym = filter1.KeySym
  578. params.Topic = BytesToTopic(filter1.Topics[2])
  579. params.PoW = filter1.PoW
  580. params.WorkTime = 10
  581. params.TTL = 50
  582. msg, err := NewSentMessage(params)
  583. if err != nil {
  584. t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
  585. }
  586. env, err := msg.Wrap(params)
  587. if err != nil {
  588. t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
  589. }
  590. _, err = w.Subscribe(filter1)
  591. if err != nil {
  592. t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err)
  593. }
  594. _, err = w.Subscribe(filter2)
  595. if err != nil {
  596. t.Fatalf("failed subscribe 2 with seed %d: %s.", seed, err)
  597. }
  598. err = w.Send(env)
  599. if err != nil {
  600. t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err)
  601. }
  602. // wait till received or timeout
  603. var received bool
  604. for j := 0; j < 200; j++ {
  605. time.Sleep(10 * time.Millisecond)
  606. if len(w.Envelopes()) > 0 {
  607. received = true
  608. break
  609. }
  610. }
  611. if !received {
  612. t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
  613. }
  614. // check w.messages()
  615. time.Sleep(5 * time.Millisecond)
  616. mail1 := filter1.Retrieve()
  617. mail2 := filter2.Retrieve()
  618. if len(mail2) == 0 {
  619. t.Fatalf("did not receive any email for filter 2")
  620. }
  621. if len(mail1) == 0 {
  622. t.Fatalf("did not receive any email for filter 1")
  623. }
  624. }
  625. func TestSymmetricSendWithoutAKey(t *testing.T) {
  626. InitSingleTest()
  627. w := New(&DefaultConfig)
  628. defer w.SetMinimumPowTest(DefaultMinimumPoW)
  629. defer w.SetMaxMessageSize(DefaultMaxMessageSize)
  630. w.Start(nil)
  631. defer w.Stop()
  632. filter, err := generateFilter(t, true)
  633. if err != nil {
  634. t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
  635. }
  636. filter.PoW = DefaultMinimumPoW
  637. params, err := generateMessageParams()
  638. if err != nil {
  639. t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
  640. }
  641. filter.Src = nil
  642. params.KeySym = filter.KeySym
  643. params.Topic = BytesToTopic(filter.Topics[2])
  644. params.PoW = filter.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. _, err = w.Subscribe(filter)
  656. if err != nil {
  657. t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err)
  658. }
  659. err = w.Send(env)
  660. if err != nil {
  661. t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err)
  662. }
  663. // wait till received or timeout
  664. var received bool
  665. for j := 0; j < 200; j++ {
  666. time.Sleep(10 * time.Millisecond)
  667. if len(w.Envelopes()) > 0 {
  668. received = true
  669. break
  670. }
  671. }
  672. if !received {
  673. t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
  674. }
  675. // check w.messages()
  676. time.Sleep(5 * time.Millisecond)
  677. mail := filter.Retrieve()
  678. if len(mail) == 0 {
  679. t.Fatalf("did not receive message in spite of not setting a public key")
  680. }
  681. }
  682. func TestSymmetricSendKeyMismatch(t *testing.T) {
  683. InitSingleTest()
  684. w := New(&DefaultConfig)
  685. defer w.SetMinimumPowTest(DefaultMinimumPoW)
  686. defer w.SetMaxMessageSize(DefaultMaxMessageSize)
  687. w.Start(nil)
  688. defer w.Stop()
  689. filter, err := generateFilter(t, true)
  690. if err != nil {
  691. t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
  692. }
  693. filter.PoW = DefaultMinimumPoW
  694. params, err := generateMessageParams()
  695. if err != nil {
  696. t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
  697. }
  698. params.KeySym = filter.KeySym
  699. params.Topic = BytesToTopic(filter.Topics[2])
  700. params.PoW = filter.PoW
  701. params.WorkTime = 10
  702. params.TTL = 50
  703. msg, err := NewSentMessage(params)
  704. if err != nil {
  705. t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
  706. }
  707. env, err := msg.Wrap(params)
  708. if err != nil {
  709. t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
  710. }
  711. _, err = w.Subscribe(filter)
  712. if err != nil {
  713. t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err)
  714. }
  715. err = w.Send(env)
  716. if err != nil {
  717. t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err)
  718. }
  719. // wait till received or timeout
  720. var received bool
  721. for j := 0; j < 200; j++ {
  722. time.Sleep(10 * time.Millisecond)
  723. if len(w.Envelopes()) > 0 {
  724. received = true
  725. break
  726. }
  727. }
  728. if !received {
  729. t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
  730. }
  731. // check w.messages()
  732. time.Sleep(5 * time.Millisecond)
  733. mail := filter.Retrieve()
  734. if len(mail) > 0 {
  735. t.Fatalf("received a message when keys weren't matching")
  736. }
  737. }
  738. func TestBloom(t *testing.T) {
  739. topic := TopicType{0, 0, 255, 6}
  740. b := TopicToBloom(topic)
  741. x := make([]byte, BloomFilterSize)
  742. x[0] = byte(1)
  743. x[32] = byte(1)
  744. x[BloomFilterSize-1] = byte(128)
  745. if !BloomFilterMatch(x, b) || !BloomFilterMatch(b, x) {
  746. t.Fatalf("bloom filter does not match the mask")
  747. }
  748. _, err := mrand.Read(b)
  749. if err != nil {
  750. t.Fatalf("math rand error")
  751. }
  752. _, err = mrand.Read(x)
  753. if err != nil {
  754. t.Fatalf("math rand error")
  755. }
  756. if !BloomFilterMatch(b, b) {
  757. t.Fatalf("bloom filter does not match self")
  758. }
  759. x = addBloom(x, b)
  760. if !BloomFilterMatch(x, b) {
  761. t.Fatalf("bloom filter does not match combined bloom")
  762. }
  763. if !isFullNode(nil) {
  764. t.Fatalf("isFullNode did not recognize nil as full node")
  765. }
  766. x[17] = 254
  767. if isFullNode(x) {
  768. t.Fatalf("isFullNode false positive")
  769. }
  770. for i := 0; i < BloomFilterSize; i++ {
  771. b[i] = byte(255)
  772. }
  773. if !isFullNode(b) {
  774. t.Fatalf("isFullNode false negative")
  775. }
  776. if BloomFilterMatch(x, b) {
  777. t.Fatalf("bloomFilterMatch false positive")
  778. }
  779. if !BloomFilterMatch(b, x) {
  780. t.Fatalf("bloomFilterMatch false negative")
  781. }
  782. w := New(&DefaultConfig)
  783. f := w.BloomFilter()
  784. if f != nil {
  785. t.Fatalf("wrong bloom on creation")
  786. }
  787. err = w.SetBloomFilter(x)
  788. if err != nil {
  789. t.Fatalf("failed to set bloom filter: %s", err)
  790. }
  791. f = w.BloomFilter()
  792. if !BloomFilterMatch(f, x) || !BloomFilterMatch(x, f) {
  793. t.Fatalf("retireved wrong bloom filter")
  794. }
  795. }