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, &params.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, &params.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  }