whisper_test.go 8.8 KB

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