github.com/digdeepmining/go-atheios@v1.5.13-0.20180902133602-d5687a2e6f43/whisper/whisperv5/message_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 "math/rand" 22 "testing" 23 24 "github.com/atheioschain/go-atheios/crypto" 25 "github.com/atheioschain/go-atheios/rlp" 26 ) 27 28 func copyFromBuf(dst []byte, src []byte, beg int) int { 29 copy(dst, src[beg:]) 30 return beg + len(dst) 31 } 32 33 func generateMessageParams() (*MessageParams, error) { 34 // set all the parameters except p.Dst 35 36 buf := make([]byte, 1024) 37 randomize(buf) 38 sz := rand.Intn(400) 39 40 var p MessageParams 41 p.PoW = 0.01 42 p.WorkTime = 1 43 p.TTL = uint32(rand.Intn(1024)) 44 p.Payload = make([]byte, sz) 45 p.Padding = make([]byte, padSizeLimitUpper) 46 p.KeySym = make([]byte, aesKeyLength) 47 48 var b int 49 b = copyFromBuf(p.Payload, buf, b) 50 b = copyFromBuf(p.Padding, buf, b) 51 b = copyFromBuf(p.KeySym, buf, b) 52 p.Topic = BytesToTopic(buf[b:]) 53 54 var err error 55 p.Src, err = crypto.GenerateKey() 56 if err != nil { 57 return nil, err 58 } 59 60 return &p, nil 61 } 62 63 func singleMessageTest(t *testing.T, symmetric bool) { 64 params, err := generateMessageParams() 65 if err != nil { 66 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 67 } 68 69 key, err := crypto.GenerateKey() 70 if err != nil { 71 t.Fatalf("failed GenerateKey with seed %d: %s.", seed, err) 72 } 73 74 if !symmetric { 75 params.KeySym = nil 76 params.Dst = &key.PublicKey 77 } 78 79 text := make([]byte, 0, 512) 80 steg := make([]byte, 0, 512) 81 text = append(text, params.Payload...) 82 steg = append(steg, params.Padding...) 83 84 msg := NewSentMessage(params) 85 env, err := msg.Wrap(params) 86 if err != nil { 87 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 88 } 89 90 var decrypted *ReceivedMessage 91 if symmetric { 92 decrypted, err = env.OpenSymmetric(params.KeySym) 93 } else { 94 decrypted, err = env.OpenAsymmetric(key) 95 } 96 97 if err != nil { 98 t.Fatalf("failed to encrypt with seed %d: %s.", seed, err) 99 } 100 101 if !decrypted.Validate() { 102 t.Fatalf("failed to validate with seed %d.", seed) 103 } 104 105 padsz := len(decrypted.Padding) 106 if !bytes.Equal(steg[:padsz], decrypted.Padding) { 107 t.Fatalf("failed with seed %d: compare padding.", seed) 108 } 109 if !bytes.Equal(text, decrypted.Payload) { 110 t.Fatalf("failed with seed %d: compare payload.", seed) 111 } 112 if !isMessageSigned(decrypted.Raw[0]) { 113 t.Fatalf("failed with seed %d: unsigned.", seed) 114 } 115 if len(decrypted.Signature) != signatureLength { 116 t.Fatalf("failed with seed %d: signature len %d.", seed, len(decrypted.Signature)) 117 } 118 if !IsPubKeyEqual(decrypted.Src, ¶ms.Src.PublicKey) { 119 t.Fatalf("failed with seed %d: signature mismatch.", seed) 120 } 121 } 122 123 func TestMessageEncryption(t *testing.T) { 124 InitSingleTest() 125 126 var symmetric bool 127 for i := 0; i < 256; i++ { 128 singleMessageTest(t, symmetric) 129 symmetric = !symmetric 130 } 131 } 132 133 func TestMessageWrap(t *testing.T) { 134 seed = int64(1777444222) 135 rand.Seed(seed) 136 target := 128.0 137 138 params, err := generateMessageParams() 139 if err != nil { 140 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 141 } 142 143 msg := NewSentMessage(params) 144 params.TTL = 1 145 params.WorkTime = 12 146 params.PoW = target 147 env, err := msg.Wrap(params) 148 if err != nil { 149 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 150 } 151 152 pow := env.PoW() 153 if pow < target { 154 t.Fatalf("failed Wrap with seed %d: pow < target (%f vs. %f).", seed, pow, target) 155 } 156 157 // set PoW target too high, expect error 158 msg2 := NewSentMessage(params) 159 params.TTL = 1000000 160 params.WorkTime = 1 161 params.PoW = 10000000.0 162 env, err = msg2.Wrap(params) 163 if err == nil { 164 t.Fatalf("unexpectedly reached the PoW target with seed %d.", seed) 165 } 166 } 167 168 func TestMessageSeal(t *testing.T) { 169 // this test depends on deterministic choice of seed (1976726903) 170 seed = int64(1976726903) 171 rand.Seed(seed) 172 173 params, err := generateMessageParams() 174 if err != nil { 175 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 176 } 177 178 msg := NewSentMessage(params) 179 params.TTL = 1 180 aesnonce := make([]byte, 12) 181 salt := make([]byte, 12) 182 randomize(aesnonce) 183 randomize(salt) 184 185 env := NewEnvelope(params.TTL, params.Topic, salt, aesnonce, msg) 186 if err != nil { 187 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 188 } 189 190 env.Expiry = uint32(seed) // make it deterministic 191 target := 32.0 192 params.WorkTime = 4 193 params.PoW = target 194 env.Seal(params) 195 196 env.calculatePoW(0) 197 pow := env.PoW() 198 if pow < target { 199 t.Fatalf("failed Wrap with seed %d: pow < target (%f vs. %f).", seed, pow, target) 200 } 201 202 params.WorkTime = 1 203 params.PoW = 1000000000.0 204 env.Seal(params) 205 env.calculatePoW(0) 206 pow = env.PoW() 207 if pow < 2*target { 208 t.Fatalf("failed Wrap with seed %d: pow too small %f.", seed, pow) 209 } 210 } 211 212 func TestEnvelopeOpen(t *testing.T) { 213 InitSingleTest() 214 215 var symmetric bool 216 for i := 0; i < 256; i++ { 217 singleEnvelopeOpenTest(t, symmetric) 218 symmetric = !symmetric 219 } 220 } 221 222 func singleEnvelopeOpenTest(t *testing.T, symmetric bool) { 223 params, err := generateMessageParams() 224 if err != nil { 225 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 226 } 227 228 key, err := crypto.GenerateKey() 229 if err != nil { 230 t.Fatalf("failed GenerateKey with seed %d: %s.", seed, err) 231 } 232 233 if !symmetric { 234 params.KeySym = nil 235 params.Dst = &key.PublicKey 236 } 237 238 text := make([]byte, 0, 512) 239 steg := make([]byte, 0, 512) 240 text = append(text, params.Payload...) 241 steg = append(steg, params.Padding...) 242 243 msg := NewSentMessage(params) 244 env, err := msg.Wrap(params) 245 if err != nil { 246 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 247 } 248 249 f := Filter{KeyAsym: key, KeySym: params.KeySym} 250 decrypted := env.Open(&f) 251 if decrypted == nil { 252 t.Fatalf("failed to open with seed %d.", seed) 253 } 254 255 padsz := len(decrypted.Padding) 256 if !bytes.Equal(steg[:padsz], decrypted.Padding) { 257 t.Fatalf("failed with seed %d: compare padding.", seed) 258 } 259 if !bytes.Equal(text, decrypted.Payload) { 260 t.Fatalf("failed with seed %d: compare payload.", seed) 261 } 262 if !isMessageSigned(decrypted.Raw[0]) { 263 t.Fatalf("failed with seed %d: unsigned.", seed) 264 } 265 if len(decrypted.Signature) != signatureLength { 266 t.Fatalf("failed with seed %d: signature len %d.", seed, len(decrypted.Signature)) 267 } 268 if !IsPubKeyEqual(decrypted.Src, ¶ms.Src.PublicKey) { 269 t.Fatalf("failed with seed %d: signature mismatch.", seed) 270 } 271 if decrypted.isAsymmetricEncryption() == symmetric { 272 t.Fatalf("failed with seed %d: asymmetric %v vs. %v.", seed, decrypted.isAsymmetricEncryption(), symmetric) 273 } 274 if decrypted.isSymmetricEncryption() != symmetric { 275 t.Fatalf("failed with seed %d: symmetric %v vs. %v.", seed, decrypted.isSymmetricEncryption(), symmetric) 276 } 277 if !symmetric { 278 if decrypted.Dst == nil { 279 t.Fatalf("failed with seed %d: dst is nil.", seed) 280 } 281 if !IsPubKeyEqual(decrypted.Dst, &key.PublicKey) { 282 t.Fatalf("failed with seed %d: Dst.", seed) 283 } 284 } 285 } 286 287 func TestEncryptWithZeroKey(t *testing.T) { 288 InitSingleTest() 289 290 params, err := generateMessageParams() 291 if err != nil { 292 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 293 } 294 295 msg := NewSentMessage(params) 296 297 params.KeySym = make([]byte, aesKeyLength) 298 _, err = msg.Wrap(params) 299 if err == nil { 300 t.Fatalf("wrapped with zero key, seed: %d.", seed) 301 } 302 303 params.KeySym = make([]byte, 0) 304 _, err = msg.Wrap(params) 305 if err == nil { 306 t.Fatalf("wrapped with empty key, seed: %d.", seed) 307 } 308 309 params.KeySym = nil 310 _, err = msg.Wrap(params) 311 if err == nil { 312 t.Fatalf("wrapped with nil key, seed: %d.", seed) 313 } 314 } 315 316 func TestRlpEncode(t *testing.T) { 317 InitSingleTest() 318 319 params, err := generateMessageParams() 320 if err != nil { 321 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 322 } 323 msg := NewSentMessage(params) 324 env, err := msg.Wrap(params) 325 if err != nil { 326 t.Fatalf("wrapped with zero key, seed: %d.", seed) 327 } 328 329 raw, err := rlp.EncodeToBytes(env) 330 if err != nil { 331 t.Fatalf("RLP encode failed: %s.", err) 332 } 333 334 var decoded Envelope 335 rlp.DecodeBytes(raw, &decoded) 336 if err != nil { 337 t.Fatalf("RLP decode failed: %s.", err) 338 } 339 340 he := env.Hash() 341 hd := decoded.Hash() 342 343 if he != hd { 344 t.Fatalf("Hashes are not equal: %x vs. %x", he, hd) 345 } 346 }