github.com/ethereum-optimism/optimism/l2geth@v0.0.0-20230612200230-50b04ade19e3/whisper/whisperv6/whisper_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 whisperv6
    18  
    19  import (
    20  	"bytes"
    21  	"crypto/ecdsa"
    22  	"crypto/sha256"
    23  	mrand "math/rand"
    24  	"testing"
    25  	"time"
    26  
    27  	"github.com/ethereum-optimism/optimism/l2geth/common"
    28  	"golang.org/x/crypto/pbkdf2"
    29  )
    30  
    31  func TestWhisperBasic(t *testing.T) {
    32  	w := New(&DefaultConfig)
    33  	p := w.Protocols()
    34  	shh := p[0]
    35  	if shh.Name != ProtocolName {
    36  		t.Fatalf("failed Protocol Name: %v.", shh.Name)
    37  	}
    38  	if uint64(shh.Version) != ProtocolVersion {
    39  		t.Fatalf("failed Protocol Version: %v.", shh.Version)
    40  	}
    41  	if shh.Length != NumberOfMessageCodes {
    42  		t.Fatalf("failed Protocol Length: %v.", shh.Length)
    43  	}
    44  	if shh.Run == nil {
    45  		t.Fatalf("failed shh.Run.")
    46  	}
    47  	if uint64(w.Version()) != ProtocolVersion {
    48  		t.Fatalf("failed whisper Version: %v.", shh.Version)
    49  	}
    50  	if w.GetFilter("non-existent") != nil {
    51  		t.Fatalf("failed GetFilter.")
    52  	}
    53  
    54  	peerID := make([]byte, 64)
    55  	mrand.Read(peerID)
    56  	peer, _ := w.getPeer(peerID)
    57  	if peer != nil {
    58  		t.Fatal("found peer for random key.")
    59  	}
    60  	if err := w.AllowP2PMessagesFromPeer(peerID); err == nil {
    61  		t.Fatalf("failed MarkPeerTrusted.")
    62  	}
    63  	exist := w.HasSymKey("non-existing")
    64  	if exist {
    65  		t.Fatalf("failed HasSymKey.")
    66  	}
    67  	key, err := w.GetSymKey("non-existing")
    68  	if err == nil {
    69  		t.Fatalf("failed GetSymKey(non-existing): false positive.")
    70  	}
    71  	if key != nil {
    72  		t.Fatalf("failed GetSymKey: false positive.")
    73  	}
    74  	mail := w.Envelopes()
    75  	if len(mail) != 0 {
    76  		t.Fatalf("failed w.Envelopes().")
    77  	}
    78  
    79  	derived := pbkdf2.Key(peerID, nil, 65356, aesKeyLength, sha256.New)
    80  	if !validateDataIntegrity(derived, aesKeyLength) {
    81  		t.Fatalf("failed validateSymmetricKey with param = %v.", derived)
    82  	}
    83  	if containsOnlyZeros(derived) {
    84  		t.Fatalf("failed containsOnlyZeros with param = %v.", derived)
    85  	}
    86  
    87  	buf := []byte{0xFF, 0xE5, 0x80, 0x2, 0}
    88  	le := bytesToUintLittleEndian(buf)
    89  	be := BytesToUintBigEndian(buf)
    90  	if le != uint64(0x280e5ff) {
    91  		t.Fatalf("failed bytesToIntLittleEndian: %d.", le)
    92  	}
    93  	if be != uint64(0xffe5800200) {
    94  		t.Fatalf("failed BytesToIntBigEndian: %d.", be)
    95  	}
    96  
    97  	id, err := w.NewKeyPair()
    98  	if err != nil {
    99  		t.Fatalf("failed to generate new key pair: %s.", err)
   100  	}
   101  	pk, err := w.GetPrivateKey(id)
   102  	if err != nil {
   103  		t.Fatalf("failed to retrieve new key pair: %s.", err)
   104  	}
   105  	if !validatePrivateKey(pk) {
   106  		t.Fatalf("failed validatePrivateKey: %v.", pk)
   107  	}
   108  	if !ValidatePublicKey(&pk.PublicKey) {
   109  		t.Fatalf("failed ValidatePublicKey: %v.", pk)
   110  	}
   111  }
   112  
   113  func TestWhisperAsymmetricKeyImport(t *testing.T) {
   114  	var (
   115  		w           = New(&DefaultConfig)
   116  		privateKeys []*ecdsa.PrivateKey
   117  	)
   118  
   119  	for i := 0; i < 50; i++ {
   120  		id, err := w.NewKeyPair()
   121  		if err != nil {
   122  			t.Fatalf("could not generate key: %v", err)
   123  		}
   124  
   125  		pk, err := w.GetPrivateKey(id)
   126  		if err != nil {
   127  			t.Fatalf("could not export private key: %v", err)
   128  		}
   129  
   130  		privateKeys = append(privateKeys, pk)
   131  
   132  		if !w.DeleteKeyPair(id) {
   133  			t.Fatalf("could not delete private key")
   134  		}
   135  	}
   136  
   137  	for _, pk := range privateKeys {
   138  		if _, err := w.AddKeyPair(pk); err != nil {
   139  			t.Fatalf("could not import private key: %v", err)
   140  		}
   141  	}
   142  }
   143  
   144  func TestWhisperIdentityManagement(t *testing.T) {
   145  	w := New(&DefaultConfig)
   146  	id1, err := w.NewKeyPair()
   147  	if err != nil {
   148  		t.Fatalf("failed to generate new key pair: %s.", err)
   149  	}
   150  	id2, err := w.NewKeyPair()
   151  	if err != nil {
   152  		t.Fatalf("failed to generate new key pair: %s.", err)
   153  	}
   154  	pk1, err := w.GetPrivateKey(id1)
   155  	if err != nil {
   156  		t.Fatalf("failed to retrieve the key pair: %s.", err)
   157  	}
   158  	pk2, err := w.GetPrivateKey(id2)
   159  	if err != nil {
   160  		t.Fatalf("failed to retrieve the key pair: %s.", err)
   161  	}
   162  
   163  	if !w.HasKeyPair(id1) {
   164  		t.Fatalf("failed HasIdentity(pk1).")
   165  	}
   166  	if !w.HasKeyPair(id2) {
   167  		t.Fatalf("failed HasIdentity(pk2).")
   168  	}
   169  	if pk1 == nil {
   170  		t.Fatalf("failed GetIdentity(pk1).")
   171  	}
   172  	if pk2 == nil {
   173  		t.Fatalf("failed GetIdentity(pk2).")
   174  	}
   175  
   176  	if !validatePrivateKey(pk1) {
   177  		t.Fatalf("pk1 is invalid.")
   178  	}
   179  	if !validatePrivateKey(pk2) {
   180  		t.Fatalf("pk2 is invalid.")
   181  	}
   182  
   183  	// Delete one identity
   184  	done := w.DeleteKeyPair(id1)
   185  	if !done {
   186  		t.Fatalf("failed to delete id1.")
   187  	}
   188  	pk1, err = w.GetPrivateKey(id1)
   189  	if err == nil {
   190  		t.Fatalf("retrieve the key pair: false positive.")
   191  	}
   192  	pk2, err = w.GetPrivateKey(id2)
   193  	if err != nil {
   194  		t.Fatalf("failed to retrieve the key pair: %s.", err)
   195  	}
   196  	if w.HasKeyPair(id1) {
   197  		t.Fatalf("failed DeleteIdentity(pub1): still exist.")
   198  	}
   199  	if !w.HasKeyPair(id2) {
   200  		t.Fatalf("failed DeleteIdentity(pub1): pub2 does not exist.")
   201  	}
   202  	if pk1 != nil {
   203  		t.Fatalf("failed DeleteIdentity(pub1): first key still exist.")
   204  	}
   205  	if pk2 == nil {
   206  		t.Fatalf("failed DeleteIdentity(pub1): second key does not exist.")
   207  	}
   208  
   209  	// Delete again non-existing identity
   210  	done = w.DeleteKeyPair(id1)
   211  	if done {
   212  		t.Fatalf("delete id1: false positive.")
   213  	}
   214  	pk1, err = w.GetPrivateKey(id1)
   215  	if err == nil {
   216  		t.Fatalf("retrieve the key pair: false positive.")
   217  	}
   218  	pk2, err = w.GetPrivateKey(id2)
   219  	if err != nil {
   220  		t.Fatalf("failed to retrieve the key pair: %s.", err)
   221  	}
   222  	if w.HasKeyPair(id1) {
   223  		t.Fatalf("failed delete non-existing identity: exist.")
   224  	}
   225  	if !w.HasKeyPair(id2) {
   226  		t.Fatalf("failed delete non-existing identity: pub2 does not exist.")
   227  	}
   228  	if pk1 != nil {
   229  		t.Fatalf("failed delete non-existing identity: first key exist.")
   230  	}
   231  	if pk2 == nil {
   232  		t.Fatalf("failed delete non-existing identity: second key does not exist.")
   233  	}
   234  
   235  	// Delete second identity
   236  	done = w.DeleteKeyPair(id2)
   237  	if !done {
   238  		t.Fatalf("failed to delete id2.")
   239  	}
   240  	pk1, err = w.GetPrivateKey(id1)
   241  	if err == nil {
   242  		t.Fatalf("retrieve the key pair: false positive.")
   243  	}
   244  	pk2, err = w.GetPrivateKey(id2)
   245  	if err == nil {
   246  		t.Fatalf("retrieve the key pair: false positive.")
   247  	}
   248  	if w.HasKeyPair(id1) {
   249  		t.Fatalf("failed delete second identity: first identity exist.")
   250  	}
   251  	if w.HasKeyPair(id2) {
   252  		t.Fatalf("failed delete second identity: still exist.")
   253  	}
   254  	if pk1 != nil {
   255  		t.Fatalf("failed delete second identity: first key exist.")
   256  	}
   257  	if pk2 != nil {
   258  		t.Fatalf("failed delete second identity: second key exist.")
   259  	}
   260  }
   261  
   262  func TestWhisperSymKeyManagement(t *testing.T) {
   263  	InitSingleTest()
   264  
   265  	var (
   266  		k1, k2 []byte
   267  		w      = New(&DefaultConfig)
   268  		id2    = string("arbitrary-string-2")
   269  	)
   270  	id1, err := w.GenerateSymKey()
   271  	if err != nil {
   272  		t.Fatalf("failed GenerateSymKey with seed %d: %s.", seed, err)
   273  	}
   274  
   275  	k1, err = w.GetSymKey(id1)
   276  	if err != nil {
   277  		t.Fatalf("failed GetSymKey(id1).")
   278  	}
   279  	k2, err = w.GetSymKey(id2)
   280  	if err == nil {
   281  		t.Fatalf("failed GetSymKey(id2): false positive.")
   282  	}
   283  	if !w.HasSymKey(id1) {
   284  		t.Fatalf("failed HasSymKey(id1).")
   285  	}
   286  	if w.HasSymKey(id2) {
   287  		t.Fatalf("failed HasSymKey(id2): false positive.")
   288  	}
   289  	if k1 == nil {
   290  		t.Fatalf("first key does not exist.")
   291  	}
   292  	if k2 != nil {
   293  		t.Fatalf("second key still exist.")
   294  	}
   295  
   296  	// add existing id, nothing should change
   297  	randomKey := make([]byte, aesKeyLength)
   298  	mrand.Read(randomKey)
   299  	id1, err = w.AddSymKeyDirect(randomKey)
   300  	if err != nil {
   301  		t.Fatalf("failed AddSymKey with seed %d: %s.", seed, err)
   302  	}
   303  
   304  	k1, err = w.GetSymKey(id1)
   305  	if err != nil {
   306  		t.Fatalf("failed w.GetSymKey(id1).")
   307  	}
   308  	k2, err = w.GetSymKey(id2)
   309  	if err == nil {
   310  		t.Fatalf("failed w.GetSymKey(id2): false positive.")
   311  	}
   312  	if !w.HasSymKey(id1) {
   313  		t.Fatalf("failed w.HasSymKey(id1).")
   314  	}
   315  	if w.HasSymKey(id2) {
   316  		t.Fatalf("failed w.HasSymKey(id2): false positive.")
   317  	}
   318  	if k1 == nil {
   319  		t.Fatalf("first key does not exist.")
   320  	}
   321  	if !bytes.Equal(k1, randomKey) {
   322  		t.Fatalf("k1 != randomKey.")
   323  	}
   324  	if k2 != nil {
   325  		t.Fatalf("second key already exist.")
   326  	}
   327  
   328  	id2, err = w.AddSymKeyDirect(randomKey)
   329  	if err != nil {
   330  		t.Fatalf("failed AddSymKey(id2) with seed %d: %s.", seed, err)
   331  	}
   332  	k1, err = w.GetSymKey(id1)
   333  	if err != nil {
   334  		t.Fatalf("failed w.GetSymKey(id1).")
   335  	}
   336  	k2, err = w.GetSymKey(id2)
   337  	if err != nil {
   338  		t.Fatalf("failed w.GetSymKey(id2).")
   339  	}
   340  	if !w.HasSymKey(id1) {
   341  		t.Fatalf("HasSymKey(id1) failed.")
   342  	}
   343  	if !w.HasSymKey(id2) {
   344  		t.Fatalf("HasSymKey(id2) failed.")
   345  	}
   346  	if k1 == nil {
   347  		t.Fatalf("k1 does not exist.")
   348  	}
   349  	if k2 == nil {
   350  		t.Fatalf("k2 does not exist.")
   351  	}
   352  	if !bytes.Equal(k1, k2) {
   353  		t.Fatalf("k1 != k2.")
   354  	}
   355  	if !bytes.Equal(k1, randomKey) {
   356  		t.Fatalf("k1 != randomKey.")
   357  	}
   358  	if len(k1) != aesKeyLength {
   359  		t.Fatalf("wrong length of k1.")
   360  	}
   361  	if len(k2) != aesKeyLength {
   362  		t.Fatalf("wrong length of k2.")
   363  	}
   364  
   365  	w.DeleteSymKey(id1)
   366  	k1, err = w.GetSymKey(id1)
   367  	if err == nil {
   368  		t.Fatalf("failed w.GetSymKey(id1): false positive.")
   369  	}
   370  	if k1 != nil {
   371  		t.Fatalf("failed GetSymKey(id1): false positive.")
   372  	}
   373  	k2, err = w.GetSymKey(id2)
   374  	if err != nil {
   375  		t.Fatalf("failed w.GetSymKey(id2).")
   376  	}
   377  	if w.HasSymKey(id1) {
   378  		t.Fatalf("failed to delete first key: still exist.")
   379  	}
   380  	if !w.HasSymKey(id2) {
   381  		t.Fatalf("failed to delete first key: second key does not exist.")
   382  	}
   383  	if k1 != nil {
   384  		t.Fatalf("failed to delete first key.")
   385  	}
   386  	if k2 == nil {
   387  		t.Fatalf("failed to delete first key: second key is nil.")
   388  	}
   389  
   390  	w.DeleteSymKey(id1)
   391  	w.DeleteSymKey(id2)
   392  	k1, err = w.GetSymKey(id1)
   393  	if err == nil {
   394  		t.Fatalf("failed w.GetSymKey(id1): false positive.")
   395  	}
   396  	k2, err = w.GetSymKey(id2)
   397  	if err == nil {
   398  		t.Fatalf("failed w.GetSymKey(id2): false positive.")
   399  	}
   400  	if k1 != nil || k2 != nil {
   401  		t.Fatalf("k1 or k2 is not nil")
   402  	}
   403  	if w.HasSymKey(id1) {
   404  		t.Fatalf("failed to delete second key: first key exist.")
   405  	}
   406  	if w.HasSymKey(id2) {
   407  		t.Fatalf("failed to delete second key: still exist.")
   408  	}
   409  	if k1 != nil {
   410  		t.Fatalf("failed to delete second key: first key is not nil.")
   411  	}
   412  	if k2 != nil {
   413  		t.Fatalf("failed to delete second key: second key is not nil.")
   414  	}
   415  
   416  	randomKey = make([]byte, aesKeyLength+1)
   417  	mrand.Read(randomKey)
   418  	_, err = w.AddSymKeyDirect(randomKey)
   419  	if err == nil {
   420  		t.Fatalf("added the key with wrong size, seed %d.", seed)
   421  	}
   422  
   423  	const password = "arbitrary data here"
   424  	id1, err = w.AddSymKeyFromPassword(password)
   425  	if err != nil {
   426  		t.Fatalf("failed AddSymKeyFromPassword(id1) with seed %d: %s.", seed, err)
   427  	}
   428  	id2, err = w.AddSymKeyFromPassword(password)
   429  	if err != nil {
   430  		t.Fatalf("failed AddSymKeyFromPassword(id2) with seed %d: %s.", seed, err)
   431  	}
   432  	k1, err = w.GetSymKey(id1)
   433  	if err != nil {
   434  		t.Fatalf("failed w.GetSymKey(id1).")
   435  	}
   436  	k2, err = w.GetSymKey(id2)
   437  	if err != nil {
   438  		t.Fatalf("failed w.GetSymKey(id2).")
   439  	}
   440  	if !w.HasSymKey(id1) {
   441  		t.Fatalf("HasSymKey(id1) failed.")
   442  	}
   443  	if !w.HasSymKey(id2) {
   444  		t.Fatalf("HasSymKey(id2) failed.")
   445  	}
   446  	if !validateDataIntegrity(k2, aesKeyLength) {
   447  		t.Fatalf("key validation failed.")
   448  	}
   449  	if !bytes.Equal(k1, k2) {
   450  		t.Fatalf("k1 != k2.")
   451  	}
   452  }
   453  
   454  func TestExpiry(t *testing.T) {
   455  	InitSingleTest()
   456  
   457  	w := New(&DefaultConfig)
   458  	w.SetMinimumPowTest(0.0000001)
   459  	defer w.SetMinimumPowTest(DefaultMinimumPoW)
   460  	w.Start(nil)
   461  	defer w.Stop()
   462  
   463  	params, err := generateMessageParams()
   464  	if err != nil {
   465  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   466  	}
   467  	params.TTL = 1
   468  
   469  	messagesCount := 5
   470  
   471  	// Send a few messages one after another. Due to low PoW and expiration buckets
   472  	// with one second resolution, it covers a case when there are multiple items
   473  	// in a single expiration bucket.
   474  	for i := 0; i < messagesCount; i++ {
   475  		msg, err := NewSentMessage(params)
   476  		if err != nil {
   477  			t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   478  		}
   479  		env, err := msg.Wrap(params)
   480  		if err != nil {
   481  			t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   482  		}
   483  
   484  		err = w.Send(env)
   485  		if err != nil {
   486  			t.Fatalf("failed to send envelope with seed %d: %s.", seed, err)
   487  		}
   488  	}
   489  
   490  	// wait till received or timeout
   491  	var received, expired bool
   492  	for j := 0; j < 20; j++ {
   493  		time.Sleep(100 * time.Millisecond)
   494  		if len(w.Envelopes()) == messagesCount {
   495  			received = true
   496  			break
   497  		}
   498  	}
   499  
   500  	if !received {
   501  		t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
   502  	}
   503  
   504  	// wait till expired or timeout
   505  	for j := 0; j < 20; j++ {
   506  		time.Sleep(100 * time.Millisecond)
   507  		if len(w.Envelopes()) == 0 {
   508  			expired = true
   509  			break
   510  		}
   511  	}
   512  
   513  	if !expired {
   514  		t.Fatalf("expire failed, seed: %d.", seed)
   515  	}
   516  }
   517  
   518  func TestCustomization(t *testing.T) {
   519  	InitSingleTest()
   520  
   521  	w := New(&DefaultConfig)
   522  	defer w.SetMinimumPowTest(DefaultMinimumPoW)
   523  	defer w.SetMaxMessageSize(DefaultMaxMessageSize)
   524  	w.Start(nil)
   525  	defer w.Stop()
   526  
   527  	const smallPoW = 0.00001
   528  
   529  	f, err := generateFilter(t, true)
   530  	if err != nil {
   531  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   532  	}
   533  	params, err := generateMessageParams()
   534  	if err != nil {
   535  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   536  	}
   537  
   538  	params.KeySym = f.KeySym
   539  	params.Topic = BytesToTopic(f.Topics[2])
   540  	params.PoW = smallPoW
   541  	params.TTL = 3600 * 24 // one day
   542  	msg, err := NewSentMessage(params)
   543  	if err != nil {
   544  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   545  	}
   546  	env, err := msg.Wrap(params)
   547  	if err != nil {
   548  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   549  	}
   550  
   551  	err = w.Send(env)
   552  	if err == nil {
   553  		t.Fatalf("successfully sent envelope with PoW %.06f, false positive (seed %d).", env.PoW(), seed)
   554  	}
   555  
   556  	w.SetMinimumPowTest(smallPoW / 2)
   557  	err = w.Send(env)
   558  	if err != nil {
   559  		t.Fatalf("failed to send envelope with seed %d: %s.", seed, err)
   560  	}
   561  
   562  	params.TTL++
   563  	msg, err = NewSentMessage(params)
   564  	if err != nil {
   565  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   566  	}
   567  	env, err = msg.Wrap(params)
   568  	if err != nil {
   569  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   570  	}
   571  	w.SetMaxMessageSize(uint32(env.size() - 1))
   572  	err = w.Send(env)
   573  	if err == nil {
   574  		t.Fatalf("successfully sent oversized envelope (seed %d): false positive.", seed)
   575  	}
   576  
   577  	w.SetMaxMessageSize(DefaultMaxMessageSize)
   578  	err = w.Send(env)
   579  	if err != nil {
   580  		t.Fatalf("failed to send second envelope with seed %d: %s.", seed, err)
   581  	}
   582  
   583  	// wait till received or timeout
   584  	var received bool
   585  	for j := 0; j < 20; j++ {
   586  		time.Sleep(100 * time.Millisecond)
   587  		if len(w.Envelopes()) > 1 {
   588  			received = true
   589  			break
   590  		}
   591  	}
   592  
   593  	if !received {
   594  		t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
   595  	}
   596  
   597  	// check w.messages()
   598  	_, err = w.Subscribe(f)
   599  	if err != nil {
   600  		t.Fatalf("failed subscribe with seed %d: %s.", seed, err)
   601  	}
   602  	time.Sleep(5 * time.Millisecond)
   603  	mail := f.Retrieve()
   604  	if len(mail) > 0 {
   605  		t.Fatalf("received premature mail")
   606  	}
   607  }
   608  
   609  func TestSymmetricSendCycle(t *testing.T) {
   610  	InitSingleTest()
   611  
   612  	w := New(&DefaultConfig)
   613  	defer w.SetMinimumPowTest(DefaultMinimumPoW)
   614  	defer w.SetMaxMessageSize(DefaultMaxMessageSize)
   615  	w.Start(nil)
   616  	defer w.Stop()
   617  
   618  	filter1, err := generateFilter(t, true)
   619  	if err != nil {
   620  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   621  	}
   622  	filter1.PoW = DefaultMinimumPoW
   623  
   624  	// Copy the first filter since some of its fields
   625  	// are randomly gnerated.
   626  	filter2 := &Filter{
   627  		KeySym:   filter1.KeySym,
   628  		Topics:   filter1.Topics,
   629  		PoW:      filter1.PoW,
   630  		AllowP2P: filter1.AllowP2P,
   631  		Messages: make(map[common.Hash]*ReceivedMessage),
   632  	}
   633  
   634  	params, err := generateMessageParams()
   635  	if err != nil {
   636  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   637  	}
   638  
   639  	filter1.Src = &params.Src.PublicKey
   640  	filter2.Src = &params.Src.PublicKey
   641  
   642  	params.KeySym = filter1.KeySym
   643  	params.Topic = BytesToTopic(filter1.Topics[2])
   644  	params.PoW = filter1.PoW
   645  	params.WorkTime = 10
   646  	params.TTL = 50
   647  	msg, err := NewSentMessage(params)
   648  	if err != nil {
   649  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   650  	}
   651  	env, err := msg.Wrap(params)
   652  	if err != nil {
   653  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   654  	}
   655  
   656  	_, err = w.Subscribe(filter1)
   657  	if err != nil {
   658  		t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err)
   659  	}
   660  
   661  	_, err = w.Subscribe(filter2)
   662  	if err != nil {
   663  		t.Fatalf("failed subscribe 2 with seed %d: %s.", seed, err)
   664  	}
   665  
   666  	err = w.Send(env)
   667  	if err != nil {
   668  		t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err)
   669  	}
   670  
   671  	// wait till received or timeout
   672  	var received bool
   673  	for j := 0; j < 200; j++ {
   674  		time.Sleep(10 * time.Millisecond)
   675  		if len(w.Envelopes()) > 0 {
   676  			received = true
   677  			break
   678  		}
   679  	}
   680  
   681  	if !received {
   682  		t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
   683  	}
   684  
   685  	// check w.messages()
   686  	time.Sleep(5 * time.Millisecond)
   687  	mail1 := filter1.Retrieve()
   688  	mail2 := filter2.Retrieve()
   689  	if len(mail2) == 0 {
   690  		t.Fatalf("did not receive any email for filter 2")
   691  	}
   692  	if len(mail1) == 0 {
   693  		t.Fatalf("did not receive any email for filter 1")
   694  	}
   695  
   696  }
   697  
   698  func TestSymmetricSendWithoutAKey(t *testing.T) {
   699  	InitSingleTest()
   700  
   701  	w := New(&DefaultConfig)
   702  	defer w.SetMinimumPowTest(DefaultMinimumPoW)
   703  	defer w.SetMaxMessageSize(DefaultMaxMessageSize)
   704  	w.Start(nil)
   705  	defer w.Stop()
   706  
   707  	filter, err := generateFilter(t, true)
   708  	if err != nil {
   709  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   710  	}
   711  	filter.PoW = DefaultMinimumPoW
   712  
   713  	params, err := generateMessageParams()
   714  	if err != nil {
   715  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   716  	}
   717  
   718  	filter.Src = nil
   719  
   720  	params.KeySym = filter.KeySym
   721  	params.Topic = BytesToTopic(filter.Topics[2])
   722  	params.PoW = filter.PoW
   723  	params.WorkTime = 10
   724  	params.TTL = 50
   725  	msg, err := NewSentMessage(params)
   726  	if err != nil {
   727  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   728  	}
   729  	env, err := msg.Wrap(params)
   730  	if err != nil {
   731  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   732  	}
   733  
   734  	_, err = w.Subscribe(filter)
   735  	if err != nil {
   736  		t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err)
   737  	}
   738  
   739  	err = w.Send(env)
   740  	if err != nil {
   741  		t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err)
   742  	}
   743  
   744  	// wait till received or timeout
   745  	var received bool
   746  	for j := 0; j < 200; j++ {
   747  		time.Sleep(10 * time.Millisecond)
   748  		if len(w.Envelopes()) > 0 {
   749  			received = true
   750  			break
   751  		}
   752  	}
   753  
   754  	if !received {
   755  		t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
   756  	}
   757  
   758  	// check w.messages()
   759  	time.Sleep(5 * time.Millisecond)
   760  	mail := filter.Retrieve()
   761  	if len(mail) == 0 {
   762  		t.Fatalf("did not receive message in spite of not setting a public key")
   763  	}
   764  }
   765  
   766  func TestSymmetricSendKeyMismatch(t *testing.T) {
   767  	InitSingleTest()
   768  
   769  	w := New(&DefaultConfig)
   770  	defer w.SetMinimumPowTest(DefaultMinimumPoW)
   771  	defer w.SetMaxMessageSize(DefaultMaxMessageSize)
   772  	w.Start(nil)
   773  	defer w.Stop()
   774  
   775  	filter, err := generateFilter(t, true)
   776  	if err != nil {
   777  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   778  	}
   779  	filter.PoW = DefaultMinimumPoW
   780  
   781  	params, err := generateMessageParams()
   782  	if err != nil {
   783  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   784  	}
   785  
   786  	params.KeySym = filter.KeySym
   787  	params.Topic = BytesToTopic(filter.Topics[2])
   788  	params.PoW = filter.PoW
   789  	params.WorkTime = 10
   790  	params.TTL = 50
   791  	msg, err := NewSentMessage(params)
   792  	if err != nil {
   793  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   794  	}
   795  	env, err := msg.Wrap(params)
   796  	if err != nil {
   797  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   798  	}
   799  
   800  	_, err = w.Subscribe(filter)
   801  	if err != nil {
   802  		t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err)
   803  	}
   804  
   805  	err = w.Send(env)
   806  	if err != nil {
   807  		t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err)
   808  	}
   809  
   810  	// wait till received or timeout
   811  	var received bool
   812  	for j := 0; j < 200; j++ {
   813  		time.Sleep(10 * time.Millisecond)
   814  		if len(w.Envelopes()) > 0 {
   815  			received = true
   816  			break
   817  		}
   818  	}
   819  
   820  	if !received {
   821  		t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
   822  	}
   823  
   824  	// check w.messages()
   825  	time.Sleep(5 * time.Millisecond)
   826  	mail := filter.Retrieve()
   827  	if len(mail) > 0 {
   828  		t.Fatalf("received a message when keys weren't matching")
   829  	}
   830  }
   831  
   832  func TestBloom(t *testing.T) {
   833  	topic := TopicType{0, 0, 255, 6}
   834  	b := TopicToBloom(topic)
   835  	x := make([]byte, BloomFilterSize)
   836  	x[0] = byte(1)
   837  	x[32] = byte(1)
   838  	x[BloomFilterSize-1] = byte(128)
   839  	if !BloomFilterMatch(x, b) || !BloomFilterMatch(b, x) {
   840  		t.Fatalf("bloom filter does not match the mask")
   841  	}
   842  
   843  	_, err := mrand.Read(b)
   844  	if err != nil {
   845  		t.Fatalf("math rand error")
   846  	}
   847  	_, err = mrand.Read(x)
   848  	if err != nil {
   849  		t.Fatalf("math rand error")
   850  	}
   851  	if !BloomFilterMatch(b, b) {
   852  		t.Fatalf("bloom filter does not match self")
   853  	}
   854  	x = addBloom(x, b)
   855  	if !BloomFilterMatch(x, b) {
   856  		t.Fatalf("bloom filter does not match combined bloom")
   857  	}
   858  	if !isFullNode(nil) {
   859  		t.Fatalf("isFullNode did not recognize nil as full node")
   860  	}
   861  	x[17] = 254
   862  	if isFullNode(x) {
   863  		t.Fatalf("isFullNode false positive")
   864  	}
   865  	for i := 0; i < BloomFilterSize; i++ {
   866  		b[i] = byte(255)
   867  	}
   868  	if !isFullNode(b) {
   869  		t.Fatalf("isFullNode false negative")
   870  	}
   871  	if BloomFilterMatch(x, b) {
   872  		t.Fatalf("bloomFilterMatch false positive")
   873  	}
   874  	if !BloomFilterMatch(b, x) {
   875  		t.Fatalf("bloomFilterMatch false negative")
   876  	}
   877  
   878  	w := New(&DefaultConfig)
   879  	f := w.BloomFilter()
   880  	if f != nil {
   881  		t.Fatalf("wrong bloom on creation")
   882  	}
   883  	err = w.SetBloomFilter(x)
   884  	if err != nil {
   885  		t.Fatalf("failed to set bloom filter: %s", err)
   886  	}
   887  	f = w.BloomFilter()
   888  	if !BloomFilterMatch(f, x) || !BloomFilterMatch(x, f) {
   889  		t.Fatalf("retireved wrong bloom filter")
   890  	}
   891  }