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