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