github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/whisper/whisperv6/message_test.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 12:09:51</date> 10 //</624342690879770624> 11 12 // 13 // 14 // 15 // 16 // 17 // 18 // 19 // 20 // 21 // 22 // 23 // 24 // 25 // 26 // 27 28 package whisperv6 29 30 import ( 31 "bytes" 32 "crypto/aes" 33 "crypto/cipher" 34 mrand "math/rand" 35 "testing" 36 37 "github.com/ethereum/go-ethereum/common/hexutil" 38 "github.com/ethereum/go-ethereum/crypto" 39 "github.com/ethereum/go-ethereum/rlp" 40 ) 41 42 func generateMessageParams() (*MessageParams, error) { 43 // 44 45 buf := make([]byte, 4) 46 mrand.Read(buf) 47 sz := mrand.Intn(400) 48 49 var p MessageParams 50 p.PoW = 0.01 51 p.WorkTime = 1 52 p.TTL = uint32(mrand.Intn(1024)) 53 p.Payload = make([]byte, sz) 54 p.KeySym = make([]byte, aesKeyLength) 55 mrand.Read(p.Payload) 56 mrand.Read(p.KeySym) 57 p.Topic = BytesToTopic(buf) 58 59 var err error 60 p.Src, err = crypto.GenerateKey() 61 if err != nil { 62 return nil, err 63 } 64 65 return &p, nil 66 } 67 68 func singleMessageTest(t *testing.T, symmetric bool) { 69 params, err := generateMessageParams() 70 if err != nil { 71 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 72 } 73 74 key, err := crypto.GenerateKey() 75 if err != nil { 76 t.Fatalf("failed GenerateKey with seed %d: %s.", seed, err) 77 } 78 79 if !symmetric { 80 params.KeySym = nil 81 params.Dst = &key.PublicKey 82 } 83 84 text := make([]byte, 0, 512) 85 text = append(text, params.Payload...) 86 87 msg, err := NewSentMessage(params) 88 if err != nil { 89 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 90 } 91 env, err := msg.Wrap(params) 92 if err != nil { 93 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 94 } 95 96 var decrypted *ReceivedMessage 97 if symmetric { 98 decrypted, err = env.OpenSymmetric(params.KeySym) 99 } else { 100 decrypted, err = env.OpenAsymmetric(key) 101 } 102 103 if err != nil { 104 t.Fatalf("failed to encrypt with seed %d: %s.", seed, err) 105 } 106 107 if !decrypted.ValidateAndParse() { 108 t.Fatalf("failed to validate with seed %d, symmetric = %v.", seed, symmetric) 109 } 110 111 if !bytes.Equal(text, decrypted.Payload) { 112 t.Fatalf("failed with seed %d: compare payload.", seed) 113 } 114 if !isMessageSigned(decrypted.Raw[0]) { 115 t.Fatalf("failed with seed %d: unsigned.", seed) 116 } 117 if len(decrypted.Signature) != signatureLength { 118 t.Fatalf("failed with seed %d: signature len %d.", seed, len(decrypted.Signature)) 119 } 120 if !IsPubKeyEqual(decrypted.Src, ¶ms.Src.PublicKey) { 121 t.Fatalf("failed with seed %d: signature mismatch.", seed) 122 } 123 } 124 125 func TestMessageEncryption(t *testing.T) { 126 InitSingleTest() 127 128 var symmetric bool 129 for i := 0; i < 256; i++ { 130 singleMessageTest(t, symmetric) 131 symmetric = !symmetric 132 } 133 } 134 135 func TestMessageWrap(t *testing.T) { 136 seed = int64(1777444222) 137 mrand.Seed(seed) 138 target := 128.0 139 140 params, err := generateMessageParams() 141 if err != nil { 142 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 143 } 144 145 msg, err := NewSentMessage(params) 146 if err != nil { 147 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 148 } 149 params.TTL = 1 150 params.WorkTime = 12 151 params.PoW = target 152 env, err := msg.Wrap(params) 153 if err != nil { 154 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 155 } 156 157 pow := env.PoW() 158 if pow < target { 159 t.Fatalf("failed Wrap with seed %d: pow < target (%f vs. %f).", seed, pow, target) 160 } 161 162 // 163 msg2, err := NewSentMessage(params) 164 if err != nil { 165 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 166 } 167 params.TTL = 1000000 168 params.WorkTime = 1 169 params.PoW = 10000000.0 170 _, err = msg2.Wrap(params) 171 if err == nil { 172 t.Fatalf("unexpectedly reached the PoW target with seed %d.", seed) 173 } 174 } 175 176 func TestMessageSeal(t *testing.T) { 177 // 178 seed = int64(1976726903) 179 mrand.Seed(seed) 180 181 params, err := generateMessageParams() 182 if err != nil { 183 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 184 } 185 186 msg, err := NewSentMessage(params) 187 if err != nil { 188 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 189 } 190 params.TTL = 1 191 192 env := NewEnvelope(params.TTL, params.Topic, msg) 193 if err != nil { 194 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 195 } 196 197 env.Expiry = uint32(seed) // 198 target := 32.0 199 params.WorkTime = 4 200 params.PoW = target 201 env.Seal(params) 202 203 env.calculatePoW(0) 204 pow := env.PoW() 205 if pow < target { 206 t.Fatalf("failed Wrap with seed %d: pow < target (%f vs. %f).", seed, pow, target) 207 } 208 209 params.WorkTime = 1 210 params.PoW = 1000000000.0 211 env.Seal(params) 212 env.calculatePoW(0) 213 pow = env.PoW() 214 if pow < 2*target { 215 t.Fatalf("failed Wrap with seed %d: pow too small %f.", seed, pow) 216 } 217 } 218 219 func TestEnvelopeOpen(t *testing.T) { 220 InitSingleTest() 221 222 var symmetric bool 223 for i := 0; i < 32; i++ { 224 singleEnvelopeOpenTest(t, symmetric) 225 symmetric = !symmetric 226 } 227 } 228 229 func singleEnvelopeOpenTest(t *testing.T, symmetric bool) { 230 params, err := generateMessageParams() 231 if err != nil { 232 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 233 } 234 235 key, err := crypto.GenerateKey() 236 if err != nil { 237 t.Fatalf("failed GenerateKey with seed %d: %s.", seed, err) 238 } 239 240 if !symmetric { 241 params.KeySym = nil 242 params.Dst = &key.PublicKey 243 } 244 245 text := make([]byte, 0, 512) 246 text = append(text, params.Payload...) 247 248 msg, err := NewSentMessage(params) 249 if err != nil { 250 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 251 } 252 env, err := msg.Wrap(params) 253 if err != nil { 254 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 255 } 256 257 var f Filter 258 if symmetric { 259 f = Filter{KeySym: params.KeySym} 260 } else { 261 f = Filter{KeyAsym: key} 262 } 263 decrypted := env.Open(&f) 264 if decrypted == nil { 265 t.Fatalf("failed to open with seed %d.", seed) 266 } 267 268 if !bytes.Equal(text, decrypted.Payload) { 269 t.Fatalf("failed with seed %d: compare payload.", seed) 270 } 271 if !isMessageSigned(decrypted.Raw[0]) { 272 t.Fatalf("failed with seed %d: unsigned.", seed) 273 } 274 if len(decrypted.Signature) != signatureLength { 275 t.Fatalf("failed with seed %d: signature len %d.", seed, len(decrypted.Signature)) 276 } 277 if !IsPubKeyEqual(decrypted.Src, ¶ms.Src.PublicKey) { 278 t.Fatalf("failed with seed %d: signature mismatch.", seed) 279 } 280 if decrypted.isAsymmetricEncryption() == symmetric { 281 t.Fatalf("failed with seed %d: asymmetric %v vs. %v.", seed, decrypted.isAsymmetricEncryption(), symmetric) 282 } 283 if decrypted.isSymmetricEncryption() != symmetric { 284 t.Fatalf("failed with seed %d: symmetric %v vs. %v.", seed, decrypted.isSymmetricEncryption(), symmetric) 285 } 286 if !symmetric { 287 if decrypted.Dst == nil { 288 t.Fatalf("failed with seed %d: dst is nil.", seed) 289 } 290 if !IsPubKeyEqual(decrypted.Dst, &key.PublicKey) { 291 t.Fatalf("failed with seed %d: Dst.", seed) 292 } 293 } 294 } 295 296 func TestEncryptWithZeroKey(t *testing.T) { 297 InitSingleTest() 298 299 params, err := generateMessageParams() 300 if err != nil { 301 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 302 } 303 msg, err := NewSentMessage(params) 304 if err != nil { 305 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 306 } 307 params.KeySym = make([]byte, aesKeyLength) 308 _, err = msg.Wrap(params) 309 if err == nil { 310 t.Fatalf("wrapped with zero key, seed: %d.", seed) 311 } 312 313 params, err = generateMessageParams() 314 if err != nil { 315 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 316 } 317 msg, err = NewSentMessage(params) 318 if err != nil { 319 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 320 } 321 params.KeySym = make([]byte, 0) 322 _, err = msg.Wrap(params) 323 if err == nil { 324 t.Fatalf("wrapped with empty key, seed: %d.", seed) 325 } 326 327 params, err = generateMessageParams() 328 if err != nil { 329 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 330 } 331 msg, err = NewSentMessage(params) 332 if err != nil { 333 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 334 } 335 params.KeySym = nil 336 _, err = msg.Wrap(params) 337 if err == nil { 338 t.Fatalf("wrapped with nil key, seed: %d.", seed) 339 } 340 } 341 342 func TestRlpEncode(t *testing.T) { 343 InitSingleTest() 344 345 params, err := generateMessageParams() 346 if err != nil { 347 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 348 } 349 msg, err := NewSentMessage(params) 350 if err != nil { 351 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 352 } 353 env, err := msg.Wrap(params) 354 if err != nil { 355 t.Fatalf("wrapped with zero key, seed: %d.", seed) 356 } 357 358 raw, err := rlp.EncodeToBytes(env) 359 if err != nil { 360 t.Fatalf("RLP encode failed: %s.", err) 361 } 362 363 var decoded Envelope 364 rlp.DecodeBytes(raw, &decoded) 365 if err != nil { 366 t.Fatalf("RLP decode failed: %s.", err) 367 } 368 369 he := env.Hash() 370 hd := decoded.Hash() 371 372 if he != hd { 373 t.Fatalf("Hashes are not equal: %x vs. %x", he, hd) 374 } 375 } 376 377 func singlePaddingTest(t *testing.T, padSize int) { 378 params, err := generateMessageParams() 379 if err != nil { 380 t.Fatalf("failed generateMessageParams with seed %d and sz=%d: %s.", seed, padSize, err) 381 } 382 params.Padding = make([]byte, padSize) 383 params.PoW = 0.0000000001 384 pad := make([]byte, padSize) 385 _, err = mrand.Read(pad) 386 if err != nil { 387 t.Fatalf("padding is not generated (seed %d): %s", seed, err) 388 } 389 n := copy(params.Padding, pad) 390 if n != padSize { 391 t.Fatalf("padding is not copied (seed %d): %s", seed, err) 392 } 393 msg, err := NewSentMessage(params) 394 if err != nil { 395 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 396 } 397 env, err := msg.Wrap(params) 398 if err != nil { 399 t.Fatalf("failed to wrap, seed: %d and sz=%d.", seed, padSize) 400 } 401 f := Filter{KeySym: params.KeySym} 402 decrypted := env.Open(&f) 403 if decrypted == nil { 404 t.Fatalf("failed to open, seed and sz=%d: %d.", seed, padSize) 405 } 406 if !bytes.Equal(pad, decrypted.Padding) { 407 t.Fatalf("padding is not retireved as expected with seed %d and sz=%d:\n[%x]\n[%x].", seed, padSize, pad, decrypted.Padding) 408 } 409 } 410 411 func TestPadding(t *testing.T) { 412 InitSingleTest() 413 414 for i := 1; i < 260; i++ { 415 singlePaddingTest(t, i) 416 } 417 418 lim := 256 * 256 419 for i := lim - 5; i < lim+2; i++ { 420 singlePaddingTest(t, i) 421 } 422 423 for i := 0; i < 256; i++ { 424 n := mrand.Intn(256*254) + 256 425 singlePaddingTest(t, n) 426 } 427 428 for i := 0; i < 256; i++ { 429 n := mrand.Intn(256*1024) + 256*256 430 singlePaddingTest(t, n) 431 } 432 } 433 434 func TestPaddingAppendedToSymMessagesWithSignature(t *testing.T) { 435 params := &MessageParams{ 436 Payload: make([]byte, 246), 437 KeySym: make([]byte, aesKeyLength), 438 } 439 440 pSrc, err := crypto.GenerateKey() 441 442 if err != nil { 443 t.Fatalf("Error creating the signature key %v", err) 444 return 445 } 446 params.Src = pSrc 447 448 // 449 // 450 // 451 msg := sentMessage{} 452 const payloadSizeFieldMinSize = 1 453 msg.Raw = make([]byte, flagsLength+payloadSizeFieldMinSize+len(params.Payload)) 454 455 err = msg.appendPadding(params) 456 457 if err != nil { 458 t.Fatalf("Error appending padding to message %v", err) 459 return 460 } 461 462 if len(msg.Raw) != 512-signatureLength { 463 t.Errorf("Invalid size %d != 512", len(msg.Raw)) 464 } 465 } 466 467 func TestAesNonce(t *testing.T) { 468 key := hexutil.MustDecode("0x03ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd31") 469 block, err := aes.NewCipher(key) 470 if err != nil { 471 t.Fatalf("NewCipher failed: %s", err) 472 } 473 aesgcm, err := cipher.NewGCM(block) 474 if err != nil { 475 t.Fatalf("NewGCM failed: %s", err) 476 } 477 // 478 // 479 if aesgcm.NonceSize() != aesNonceLength { 480 t.Fatalf("Nonce size is wrong. This is a critical error. Apparently AES nonce size have changed in the new version of AES GCM package. Whisper will not be working until this problem is resolved.") 481 } 482 } 483