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