whisper_test.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  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 whisperv5
  17. import (
  18. "bytes"
  19. "testing"
  20. "time"
  21. "github.com/ethereum/go-ethereum/common"
  22. "github.com/ethereum/go-ethereum/crypto"
  23. )
  24. func TestWhisperBasic(t *testing.T) {
  25. w := New()
  26. p := w.Protocols()
  27. shh := p[0]
  28. if shh.Name != ProtocolName {
  29. t.Fatalf("failed Protocol Name: %v.", shh.Name)
  30. }
  31. if uint64(shh.Version) != ProtocolVersion {
  32. t.Fatalf("failed Protocol Version: %v.", shh.Version)
  33. }
  34. if shh.Length != NumberOfMessageCodes {
  35. t.Fatalf("failed Protocol Length: %v.", shh.Length)
  36. }
  37. if shh.Run == nil {
  38. t.Fatalf("failed shh.Run.")
  39. }
  40. if uint64(w.Version()) != ProtocolVersion {
  41. t.Fatalf("failed whisper Version: %v.", shh.Version)
  42. }
  43. if w.GetFilter("non-existent") != nil {
  44. t.Fatalf("failed GetFilter.")
  45. }
  46. peerID := make([]byte, 64)
  47. randomize(peerID)
  48. peer, _ := w.getPeer(peerID)
  49. if peer != nil {
  50. t.Fatal("found peer for random key.")
  51. }
  52. if err := w.MarkPeerTrusted(peerID); err == nil {
  53. t.Fatalf("failed MarkPeerTrusted.")
  54. }
  55. exist := w.HasSymKey("non-existing")
  56. if exist {
  57. t.Fatalf("failed HasSymKey.")
  58. }
  59. key := w.GetSymKey("non-existing")
  60. if key != nil {
  61. t.Fatalf("failed GetSymKey.")
  62. }
  63. mail := w.Envelopes()
  64. if len(mail) != 0 {
  65. t.Fatalf("failed w.Envelopes().")
  66. }
  67. m := w.Messages("non-existent")
  68. if len(m) != 0 {
  69. t.Fatalf("failed w.Messages.")
  70. }
  71. var derived []byte
  72. ver := uint64(0xDEADBEEF)
  73. if _, err := deriveKeyMaterial(peerID, ver); err != unknownVersionError(ver) {
  74. t.Fatalf("failed deriveKeyMaterial with param = %v: %s.", peerID, err)
  75. }
  76. derived, err := deriveKeyMaterial(peerID, 0)
  77. if err != nil {
  78. t.Fatalf("failed second deriveKeyMaterial with param = %v: %s.", peerID, err)
  79. }
  80. if !validateSymmetricKey(derived) {
  81. t.Fatalf("failed validateSymmetricKey with param = %v.", derived)
  82. }
  83. if containsOnlyZeros(derived) {
  84. t.Fatalf("failed containsOnlyZeros with param = %v.", derived)
  85. }
  86. buf := []byte{0xFF, 0xE5, 0x80, 0x2, 0}
  87. le := bytesToIntLittleEndian(buf)
  88. be := BytesToIntBigEndian(buf)
  89. if le != uint64(0x280e5ff) {
  90. t.Fatalf("failed bytesToIntLittleEndian: %d.", le)
  91. }
  92. if be != uint64(0xffe5800200) {
  93. t.Fatalf("failed BytesToIntBigEndian: %d.", be)
  94. }
  95. pk := w.NewIdentity()
  96. if !validatePrivateKey(pk) {
  97. t.Fatalf("failed validatePrivateKey: %v.", pk)
  98. }
  99. if !ValidatePublicKey(&pk.PublicKey) {
  100. t.Fatalf("failed ValidatePublicKey: %v.", pk)
  101. }
  102. }
  103. func TestWhisperIdentityManagement(t *testing.T) {
  104. w := New()
  105. id1 := w.NewIdentity()
  106. id2 := w.NewIdentity()
  107. pub1 := common.ToHex(crypto.FromECDSAPub(&id1.PublicKey))
  108. pub2 := common.ToHex(crypto.FromECDSAPub(&id2.PublicKey))
  109. pk1 := w.GetIdentity(pub1)
  110. pk2 := w.GetIdentity(pub2)
  111. if !w.HasIdentity(pub1) {
  112. t.Fatalf("failed HasIdentity(pub1).")
  113. }
  114. if !w.HasIdentity(pub2) {
  115. t.Fatalf("failed HasIdentity(pub2).")
  116. }
  117. if pk1 != id1 {
  118. t.Fatalf("failed GetIdentity(pub1).")
  119. }
  120. if pk2 != id2 {
  121. t.Fatalf("failed GetIdentity(pub2).")
  122. }
  123. // Delete one identity
  124. w.DeleteIdentity(pub1)
  125. pk1 = w.GetIdentity(pub1)
  126. pk2 = w.GetIdentity(pub2)
  127. if w.HasIdentity(pub1) {
  128. t.Fatalf("failed DeleteIdentity(pub1): still exist.")
  129. }
  130. if !w.HasIdentity(pub2) {
  131. t.Fatalf("failed DeleteIdentity(pub1): pub2 does not exist.")
  132. }
  133. if pk1 != nil {
  134. t.Fatalf("failed DeleteIdentity(pub1): first key still exist.")
  135. }
  136. if pk2 != id2 {
  137. t.Fatalf("failed DeleteIdentity(pub1): second key does not exist.")
  138. }
  139. // Delete again non-existing identity
  140. w.DeleteIdentity(pub1)
  141. pk1 = w.GetIdentity(pub1)
  142. pk2 = w.GetIdentity(pub2)
  143. if w.HasIdentity(pub1) {
  144. t.Fatalf("failed delete non-existing identity: exist.")
  145. }
  146. if !w.HasIdentity(pub2) {
  147. t.Fatalf("failed delete non-existing identity: pub2 does not exist.")
  148. }
  149. if pk1 != nil {
  150. t.Fatalf("failed delete non-existing identity: first key exist.")
  151. }
  152. if pk2 != id2 {
  153. t.Fatalf("failed delete non-existing identity: second key does not exist.")
  154. }
  155. // Delete second identity
  156. w.DeleteIdentity(pub2)
  157. pk1 = w.GetIdentity(pub1)
  158. pk2 = w.GetIdentity(pub2)
  159. if w.HasIdentity(pub1) {
  160. t.Fatalf("failed delete second identity: first identity exist.")
  161. }
  162. if w.HasIdentity(pub2) {
  163. t.Fatalf("failed delete second identity: still exist.")
  164. }
  165. if pk1 != nil {
  166. t.Fatalf("failed delete second identity: first key exist.")
  167. }
  168. if pk2 != nil {
  169. t.Fatalf("failed delete second identity: second key exist.")
  170. }
  171. }
  172. func TestWhisperSymKeyManagement(t *testing.T) {
  173. InitSingleTest()
  174. var k1, k2 []byte
  175. w := New()
  176. id1 := string("arbitrary-string-1")
  177. id2 := string("arbitrary-string-2")
  178. err := w.GenerateSymKey(id1)
  179. if err != nil {
  180. t.Fatalf("failed GenerateSymKey with seed %d: %s.", seed, err)
  181. }
  182. k1 = w.GetSymKey(id1)
  183. k2 = w.GetSymKey(id2)
  184. if !w.HasSymKey(id1) {
  185. t.Fatalf("failed HasSymKey(id1).")
  186. }
  187. if w.HasSymKey(id2) {
  188. t.Fatalf("failed HasSymKey(id2).")
  189. }
  190. if k1 == nil {
  191. t.Fatalf("first key does not exist.")
  192. }
  193. if k2 != nil {
  194. t.Fatalf("second key still exist.")
  195. }
  196. // add existing id, nothing should change
  197. randomKey := make([]byte, 16)
  198. randomize(randomKey)
  199. err = w.AddSymKey(id1, randomKey)
  200. if err == nil {
  201. t.Fatalf("failed AddSymKey with seed %d.", seed)
  202. }
  203. k1 = w.GetSymKey(id1)
  204. k2 = w.GetSymKey(id2)
  205. if !w.HasSymKey(id1) {
  206. t.Fatalf("failed w.HasSymKey(id1).")
  207. }
  208. if w.HasSymKey(id2) {
  209. t.Fatalf("failed w.HasSymKey(id2).")
  210. }
  211. if k1 == nil {
  212. t.Fatalf("first key does not exist.")
  213. }
  214. if bytes.Equal(k1, randomKey) {
  215. t.Fatalf("k1 == randomKey.")
  216. }
  217. if k2 != nil {
  218. t.Fatalf("second key already exist.")
  219. }
  220. err = w.AddSymKey(id2, randomKey) // add non-existing (yet)
  221. if err != nil {
  222. t.Fatalf("failed AddSymKey(id2) with seed %d: %s.", seed, err)
  223. }
  224. k1 = w.GetSymKey(id1)
  225. k2 = w.GetSymKey(id2)
  226. if !w.HasSymKey(id1) {
  227. t.Fatalf("HasSymKey(id1) failed.")
  228. }
  229. if !w.HasSymKey(id2) {
  230. t.Fatalf("HasSymKey(id2) failed.")
  231. }
  232. if k1 == nil {
  233. t.Fatalf("k1 does not exist.")
  234. }
  235. if k2 == nil {
  236. t.Fatalf("k2 does not exist.")
  237. }
  238. if bytes.Equal(k1, k2) {
  239. t.Fatalf("k1 == k2.")
  240. }
  241. if bytes.Equal(k1, randomKey) {
  242. t.Fatalf("k1 == randomKey.")
  243. }
  244. if len(k1) != aesKeyLength {
  245. t.Fatalf("wrong length of k1.")
  246. }
  247. if len(k2) != aesKeyLength {
  248. t.Fatalf("wrong length of k2.")
  249. }
  250. w.DeleteSymKey(id1)
  251. k1 = w.GetSymKey(id1)
  252. k2 = w.GetSymKey(id2)
  253. if w.HasSymKey(id1) {
  254. t.Fatalf("failed to delete first key: still exist.")
  255. }
  256. if !w.HasSymKey(id2) {
  257. t.Fatalf("failed to delete first key: second key does not exist.")
  258. }
  259. if k1 != nil {
  260. t.Fatalf("failed to delete first key.")
  261. }
  262. if k2 == nil {
  263. t.Fatalf("failed to delete first key: second key is nil.")
  264. }
  265. w.DeleteSymKey(id1)
  266. w.DeleteSymKey(id2)
  267. k1 = w.GetSymKey(id1)
  268. k2 = w.GetSymKey(id2)
  269. if w.HasSymKey(id1) {
  270. t.Fatalf("failed to delete second key: first key exist.")
  271. }
  272. if w.HasSymKey(id2) {
  273. t.Fatalf("failed to delete second key: still exist.")
  274. }
  275. if k1 != nil {
  276. t.Fatalf("failed to delete second key: first key is not nil.")
  277. }
  278. if k2 != nil {
  279. t.Fatalf("failed to delete second key: second key is not nil.")
  280. }
  281. }
  282. func TestExpiry(t *testing.T) {
  283. InitSingleTest()
  284. w := New()
  285. w.test = true
  286. w.Start(nil)
  287. defer w.Stop()
  288. params, err := generateMessageParams()
  289. if err != nil {
  290. t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
  291. }
  292. params.TTL = 1
  293. msg := NewSentMessage(params)
  294. env, err := msg.Wrap(params)
  295. if err != nil {
  296. t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
  297. }
  298. err = w.Send(env)
  299. if err != nil {
  300. t.Fatalf("failed to send envelope with seed %d: %s.", seed, err)
  301. }
  302. // wait till received or timeout
  303. var received, expired bool
  304. for j := 0; j < 20; j++ {
  305. time.Sleep(100 * time.Millisecond)
  306. if len(w.Envelopes()) > 0 {
  307. received = true
  308. break
  309. }
  310. }
  311. if !received {
  312. t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
  313. }
  314. // wait till expired or timeout
  315. for j := 0; j < 20; j++ {
  316. time.Sleep(100 * time.Millisecond)
  317. if len(w.Envelopes()) == 0 {
  318. expired = true
  319. break
  320. }
  321. }
  322. if !expired {
  323. t.Fatalf("expire failed, seed: %d.", seed)
  324. }
  325. }