github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/whisper/whisperv5/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 //</624342689130745856> 11 12 // 13 // 14 // 15 // 16 // 17 // 18 // 19 // 20 // 21 // 22 // 23 // 24 // 25 // 26 // 27 28 package whisperv5 29 30 import ( 31 "bytes" 32 mrand "math/rand" 33 "testing" 34 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.Validate() { 105 t.Fatalf("failed to validate with seed %d.", seed) 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 aesnonce := make([]byte, 12) 189 mrand.Read(aesnonce) 190 191 env := NewEnvelope(params.TTL, params.Topic, aesnonce, msg) 192 if err != nil { 193 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 194 } 195 196 env.Expiry = uint32(seed) // 197 target := 32.0 198 params.WorkTime = 4 199 params.PoW = target 200 env.Seal(params) 201 202 env.calculatePoW(0) 203 pow := env.PoW() 204 if pow < target { 205 t.Fatalf("failed Wrap with seed %d: pow < target (%f vs. %f).", seed, pow, target) 206 } 207 208 params.WorkTime = 1 209 params.PoW = 1000000000.0 210 env.Seal(params) 211 env.calculatePoW(0) 212 pow = env.PoW() 213 if pow < 2*target { 214 t.Fatalf("failed Wrap with seed %d: pow too small %f.", seed, pow) 215 } 216 } 217 218 func TestEnvelopeOpen(t *testing.T) { 219 InitSingleTest() 220 221 var symmetric bool 222 for i := 0; i < 256; i++ { 223 singleEnvelopeOpenTest(t, symmetric) 224 symmetric = !symmetric 225 } 226 } 227 228 func singleEnvelopeOpenTest(t *testing.T, symmetric bool) { 229 params, err := generateMessageParams() 230 if err != nil { 231 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 232 } 233 234 key, err := crypto.GenerateKey() 235 if err != nil { 236 t.Fatalf("failed GenerateKey with seed %d: %s.", seed, err) 237 } 238 239 if !symmetric { 240 params.KeySym = nil 241 params.Dst = &key.PublicKey 242 } 243 244 text := make([]byte, 0, 512) 245 text = append(text, params.Payload...) 246 247 msg, err := NewSentMessage(params) 248 if err != nil { 249 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 250 } 251 env, err := msg.Wrap(params) 252 if err != nil { 253 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 254 } 255 256 f := Filter{KeyAsym: key, KeySym: params.KeySym} 257 decrypted := env.Open(&f) 258 if decrypted == nil { 259 t.Fatalf("failed to open with seed %d.", seed) 260 } 261 262 if !bytes.Equal(text, decrypted.Payload) { 263 t.Fatalf("failed with seed %d: compare payload.", seed) 264 } 265 if !isMessageSigned(decrypted.Raw[0]) { 266 t.Fatalf("failed with seed %d: unsigned.", seed) 267 } 268 if len(decrypted.Signature) != signatureLength { 269 t.Fatalf("failed with seed %d: signature len %d.", seed, len(decrypted.Signature)) 270 } 271 if !IsPubKeyEqual(decrypted.Src, ¶ms.Src.PublicKey) { 272 t.Fatalf("failed with seed %d: signature mismatch.", seed) 273 } 274 if decrypted.isAsymmetricEncryption() == symmetric { 275 t.Fatalf("failed with seed %d: asymmetric %v vs. %v.", seed, decrypted.isAsymmetricEncryption(), symmetric) 276 } 277 if decrypted.isSymmetricEncryption() != symmetric { 278 t.Fatalf("failed with seed %d: symmetric %v vs. %v.", seed, decrypted.isSymmetricEncryption(), symmetric) 279 } 280 if !symmetric { 281 if decrypted.Dst == nil { 282 t.Fatalf("failed with seed %d: dst is nil.", seed) 283 } 284 if !IsPubKeyEqual(decrypted.Dst, &key.PublicKey) { 285 t.Fatalf("failed with seed %d: Dst.", seed) 286 } 287 } 288 } 289 290 func TestEncryptWithZeroKey(t *testing.T) { 291 InitSingleTest() 292 293 params, err := generateMessageParams() 294 if err != nil { 295 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 296 } 297 msg, err := NewSentMessage(params) 298 if err != nil { 299 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 300 } 301 params.KeySym = make([]byte, aesKeyLength) 302 _, err = msg.Wrap(params) 303 if err == nil { 304 t.Fatalf("wrapped with zero key, seed: %d.", seed) 305 } 306 307 params, err = generateMessageParams() 308 if err != nil { 309 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 310 } 311 msg, err = NewSentMessage(params) 312 if err != nil { 313 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 314 } 315 params.KeySym = make([]byte, 0) 316 _, err = msg.Wrap(params) 317 if err == nil { 318 t.Fatalf("wrapped with empty key, seed: %d.", seed) 319 } 320 321 params, err = generateMessageParams() 322 if err != nil { 323 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 324 } 325 msg, err = NewSentMessage(params) 326 if err != nil { 327 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 328 } 329 params.KeySym = nil 330 _, err = msg.Wrap(params) 331 if err == nil { 332 t.Fatalf("wrapped with nil key, seed: %d.", seed) 333 } 334 } 335 336 func TestRlpEncode(t *testing.T) { 337 InitSingleTest() 338 339 params, err := generateMessageParams() 340 if err != nil { 341 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 342 } 343 msg, err := NewSentMessage(params) 344 if err != nil { 345 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 346 } 347 env, err := msg.Wrap(params) 348 if err != nil { 349 t.Fatalf("wrapped with zero key, seed: %d.", seed) 350 } 351 352 raw, err := rlp.EncodeToBytes(env) 353 if err != nil { 354 t.Fatalf("RLP encode failed: %s.", err) 355 } 356 357 var decoded Envelope 358 rlp.DecodeBytes(raw, &decoded) 359 if err != nil { 360 t.Fatalf("RLP decode failed: %s.", err) 361 } 362 363 he := env.Hash() 364 hd := decoded.Hash() 365 366 if he != hd { 367 t.Fatalf("Hashes are not equal: %x vs. %x", he, hd) 368 } 369 } 370 371 func singlePaddingTest(t *testing.T, padSize int) { 372 params, err := generateMessageParams() 373 if err != nil { 374 t.Fatalf("failed generateMessageParams with seed %d and sz=%d: %s.", seed, padSize, err) 375 } 376 params.Padding = make([]byte, padSize) 377 params.PoW = 0.0000000001 378 pad := make([]byte, padSize) 379 _, err = mrand.Read(pad) 380 if err != nil { 381 t.Fatalf("padding is not generated (seed %d): %s", seed, err) 382 } 383 n := copy(params.Padding, pad) 384 if n != padSize { 385 t.Fatalf("padding is not copied (seed %d): %s", seed, err) 386 } 387 msg, err := NewSentMessage(params) 388 if err != nil { 389 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 390 } 391 env, err := msg.Wrap(params) 392 if err != nil { 393 t.Fatalf("failed to wrap, seed: %d and sz=%d.", seed, padSize) 394 } 395 f := Filter{KeySym: params.KeySym} 396 decrypted := env.Open(&f) 397 if decrypted == nil { 398 t.Fatalf("failed to open, seed and sz=%d: %d.", seed, padSize) 399 } 400 if !bytes.Equal(pad, decrypted.Padding) { 401 t.Fatalf("padding is not retireved as expected with seed %d and sz=%d:\n[%x]\n[%x].", seed, padSize, pad, decrypted.Padding) 402 } 403 } 404 405 func TestPadding(t *testing.T) { 406 InitSingleTest() 407 408 for i := 1; i < 260; i++ { 409 singlePaddingTest(t, i) 410 } 411 412 lim := 256 * 256 413 for i := lim - 5; i < lim+2; i++ { 414 singlePaddingTest(t, i) 415 } 416 417 for i := 0; i < 256; i++ { 418 n := mrand.Intn(256*254) + 256 419 singlePaddingTest(t, n) 420 } 421 422 for i := 0; i < 256; i++ { 423 n := mrand.Intn(256*1024) + 256*256 424 singlePaddingTest(t, n) 425 } 426 } 427