github.com/status-im/status-go@v1.1.0/waku/waku_test.go (about)

     1  // Copyright 2019 The Waku Library Authors.
     2  //
     3  // The Waku library is free software: you can redistribute it and/or modify
     4  // it under the terms of the GNU Lesser General Public License as published by
     5  // the Free Software Foundation, either version 3 of the License, or
     6  // (at your option) any later version.
     7  //
     8  // The Waku library is distributed in the hope that it will be useful,
     9  // but WITHOUT ANY WARRANTY; without even the implied warranty off
    10  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    11  // GNU Lesser General Public License for more details.
    12  //
    13  // You should have received a copy of the GNU Lesser General Public License
    14  // along with the Waku library. If not, see <http://www.gnu.org/licenses/>.
    15  //
    16  // This software uses the go-ethereum library, which is licensed
    17  // under the GNU Lesser General Public Library, version 3 or any later.
    18  
    19  package waku
    20  
    21  import (
    22  	"bytes"
    23  	"crypto/ecdsa"
    24  	"crypto/sha256"
    25  	mrand "math/rand"
    26  	"testing"
    27  	"time"
    28  
    29  	"golang.org/x/crypto/pbkdf2"
    30  
    31  	"github.com/stretchr/testify/require"
    32  
    33  	"github.com/ethereum/go-ethereum/crypto"
    34  	"github.com/ethereum/go-ethereum/p2p"
    35  	"github.com/ethereum/go-ethereum/p2p/enode"
    36  
    37  	"github.com/status-im/status-go/eth-node/types"
    38  	"github.com/status-im/status-go/waku/common"
    39  	v0 "github.com/status-im/status-go/waku/v0"
    40  	v1 "github.com/status-im/status-go/waku/v1"
    41  )
    42  
    43  var seed int64
    44  
    45  // InitSingleTest should be called in the beginning of every
    46  // test, which uses RNG, in order to make the tests
    47  // reproducibility independent of their sequence.
    48  func InitSingleTest() {
    49  	seed = time.Now().Unix()
    50  	mrand.Seed(seed)
    51  }
    52  
    53  func TestBasic(t *testing.T) {
    54  	w := New(nil, nil)
    55  	p := w.Protocols()
    56  	waku0 := p[0]
    57  	waku1 := p[1]
    58  	if waku0.Name != v0.Name {
    59  		t.Fatalf("failed Peer Name: %v.", waku0.Name)
    60  	}
    61  	if uint64(waku0.Version) != v0.Version {
    62  		t.Fatalf("failed Peer Version: %v.", waku0.Version)
    63  	}
    64  	if waku0.Length != v0.NumberOfMessageCodes {
    65  		t.Fatalf("failed Peer Length: %v.", waku0.Length)
    66  	}
    67  	if waku0.Run == nil {
    68  		t.Fatalf("failed waku.Run.")
    69  	}
    70  	if waku1.Name != v1.Name {
    71  		t.Fatalf("failed Peer Name: %v.", waku1.Name)
    72  	}
    73  	if uint64(waku1.Version) != v1.Version {
    74  		t.Fatalf("failed Peer Version: %v.", waku1.Version)
    75  	}
    76  	if waku1.Length != v1.NumberOfMessageCodes {
    77  		t.Fatalf("failed Peer Length: %v.", waku1.Length)
    78  	}
    79  	if waku1.Run == nil {
    80  		t.Fatalf("failed waku.Run.")
    81  	}
    82  
    83  	if w.GetFilter("non-existent") != nil {
    84  		t.Fatalf("failed GetFilter.")
    85  	}
    86  
    87  	peerID := make([]byte, 64)
    88  	mrand.Read(peerID) // nolint: gosec
    89  	peer, _ := w.getPeer(peerID)
    90  	if peer != nil {
    91  		t.Fatal("found peer for random key.")
    92  	}
    93  	if err := w.AllowP2PMessagesFromPeer(peerID); err == nil {
    94  		t.Fatalf("failed MarkPeerTrusted.")
    95  	}
    96  	exist := w.HasSymKey("non-existing")
    97  	if exist {
    98  		t.Fatalf("failed HasSymKey.")
    99  	}
   100  	key, err := w.GetSymKey("non-existing")
   101  	if err == nil {
   102  		t.Fatalf("failed GetSymKey(non-existing): false positive.")
   103  	}
   104  	if key != nil {
   105  		t.Fatalf("failed GetSymKey: false positive.")
   106  	}
   107  	mail := w.Envelopes()
   108  	if len(mail) != 0 {
   109  		t.Fatalf("failed w.Envelopes().")
   110  	}
   111  
   112  	derived := pbkdf2.Key(peerID, nil, 65356, common.AESKeyLength, sha256.New)
   113  	if !common.ValidateDataIntegrity(derived, common.AESKeyLength) {
   114  		t.Fatalf("failed validateSymmetricKey with param = %v.", derived)
   115  	}
   116  	if common.ContainsOnlyZeros(derived) {
   117  		t.Fatalf("failed containsOnlyZeros with param = %v.", derived)
   118  	}
   119  
   120  	buf := []byte{0xFF, 0xE5, 0x80, 0x2, 0}
   121  	le := common.BytesToUintLittleEndian(buf)
   122  	be := common.BytesToUintBigEndian(buf)
   123  	if le != uint64(0x280e5ff) {
   124  		t.Fatalf("failed bytesToIntLittleEndian: %d.", le)
   125  	}
   126  	if be != uint64(0xffe5800200) {
   127  		t.Fatalf("failed BytesToIntBigEndian: %d.", be)
   128  	}
   129  
   130  	id, err := w.NewKeyPair()
   131  	if err != nil {
   132  		t.Fatalf("failed to generate new key pair: %s.", err)
   133  	}
   134  	pk, err := w.GetPrivateKey(id)
   135  	if err != nil {
   136  		t.Fatalf("failed to retrieve new key pair: %s.", err)
   137  	}
   138  	if !validatePrivateKey(pk) {
   139  		t.Fatalf("failed validatePrivateKey: %v.", pk)
   140  	}
   141  	if !common.ValidatePublicKey(&pk.PublicKey) {
   142  		t.Fatalf("failed ValidatePublicKey: %v.", pk)
   143  	}
   144  }
   145  
   146  func TestAsymmetricKeyImport(t *testing.T) {
   147  	var (
   148  		w           = New(nil, nil)
   149  		privateKeys []*ecdsa.PrivateKey
   150  	)
   151  
   152  	for i := 0; i < 50; i++ {
   153  		id, err := w.NewKeyPair()
   154  		if err != nil {
   155  			t.Fatalf("could not generate key: %v", err)
   156  		}
   157  
   158  		pk, err := w.GetPrivateKey(id)
   159  		if err != nil {
   160  			t.Fatalf("could not export private key: %v", err)
   161  		}
   162  
   163  		privateKeys = append(privateKeys, pk)
   164  
   165  		if !w.DeleteKeyPair(id) {
   166  			t.Fatalf("could not delete private key")
   167  		}
   168  	}
   169  
   170  	for _, pk := range privateKeys {
   171  		if _, err := w.AddKeyPair(pk); err != nil {
   172  			t.Fatalf("could not import private key: %v", err)
   173  		}
   174  	}
   175  }
   176  
   177  func TestWakuIdentityManagement(t *testing.T) {
   178  	w := New(nil, nil)
   179  	id1, err := w.NewKeyPair()
   180  	if err != nil {
   181  		t.Fatalf("failed to generate new key pair: %s.", err)
   182  	}
   183  	id2, err := w.NewKeyPair()
   184  	if err != nil {
   185  		t.Fatalf("failed to generate new key pair: %s.", err)
   186  	}
   187  	pk1, err := w.GetPrivateKey(id1)
   188  	if err != nil {
   189  		t.Fatalf("failed to retrieve the key pair: %s.", err)
   190  	}
   191  	pk2, err := w.GetPrivateKey(id2)
   192  	if err != nil {
   193  		t.Fatalf("failed to retrieve the key pair: %s.", err)
   194  	}
   195  
   196  	if !w.HasKeyPair(id1) {
   197  		t.Fatalf("failed HasIdentity(pk1).")
   198  	}
   199  	if !w.HasKeyPair(id2) {
   200  		t.Fatalf("failed HasIdentity(pk2).")
   201  	}
   202  	if pk1 == nil {
   203  		t.Fatalf("failed GetIdentity(pk1).")
   204  	}
   205  	if pk2 == nil {
   206  		t.Fatalf("failed GetIdentity(pk2).")
   207  	}
   208  
   209  	if !validatePrivateKey(pk1) {
   210  		t.Fatalf("pk1 is invalid.")
   211  	}
   212  	if !validatePrivateKey(pk2) {
   213  		t.Fatalf("pk2 is invalid.")
   214  	}
   215  
   216  	// Delete one identity
   217  	done := w.DeleteKeyPair(id1)
   218  	if !done {
   219  		t.Fatalf("failed to delete id1.")
   220  	}
   221  	pk1, err = w.GetPrivateKey(id1)
   222  	if err == nil {
   223  		t.Fatalf("retrieve the key pair: false positive.")
   224  	}
   225  	pk2, err = w.GetPrivateKey(id2)
   226  	if err != nil {
   227  		t.Fatalf("failed to retrieve the key pair: %s.", err)
   228  	}
   229  	if w.HasKeyPair(id1) {
   230  		t.Fatalf("failed DeleteIdentity(pub1): still exist.")
   231  	}
   232  	if !w.HasKeyPair(id2) {
   233  		t.Fatalf("failed DeleteIdentity(pub1): pub2 does not exist.")
   234  	}
   235  	if pk1 != nil {
   236  		t.Fatalf("failed DeleteIdentity(pub1): first key still exist.")
   237  	}
   238  	if pk2 == nil {
   239  		t.Fatalf("failed DeleteIdentity(pub1): second key does not exist.")
   240  	}
   241  
   242  	// Delete again non-existing identity
   243  	done = w.DeleteKeyPair(id1)
   244  	if done {
   245  		t.Fatalf("delete id1: false positive.")
   246  	}
   247  	pk1, err = w.GetPrivateKey(id1)
   248  	if err == nil {
   249  		t.Fatalf("retrieve the key pair: false positive.")
   250  	}
   251  	pk2, err = w.GetPrivateKey(id2)
   252  	if err != nil {
   253  		t.Fatalf("failed to retrieve the key pair: %s.", err)
   254  	}
   255  	if w.HasKeyPair(id1) {
   256  		t.Fatalf("failed delete non-existing identity: exist.")
   257  	}
   258  	if !w.HasKeyPair(id2) {
   259  		t.Fatalf("failed delete non-existing identity: pub2 does not exist.")
   260  	}
   261  	if pk1 != nil {
   262  		t.Fatalf("failed delete non-existing identity: first key exist.")
   263  	}
   264  	if pk2 == nil {
   265  		t.Fatalf("failed delete non-existing identity: second key does not exist.")
   266  	}
   267  
   268  	// Delete second identity
   269  	done = w.DeleteKeyPair(id2)
   270  	if !done {
   271  		t.Fatalf("failed to delete id2.")
   272  	}
   273  	pk1, err = w.GetPrivateKey(id1)
   274  	if err == nil {
   275  		t.Fatalf("retrieve the key pair: false positive.")
   276  	}
   277  	pk2, err = w.GetPrivateKey(id2)
   278  	if err == nil {
   279  		t.Fatalf("retrieve the key pair: false positive.")
   280  	}
   281  	if w.HasKeyPair(id1) {
   282  		t.Fatalf("failed delete second identity: first identity exist.")
   283  	}
   284  	if w.HasKeyPair(id2) {
   285  		t.Fatalf("failed delete second identity: still exist.")
   286  	}
   287  	if pk1 != nil {
   288  		t.Fatalf("failed delete second identity: first key exist.")
   289  	}
   290  	if pk2 != nil {
   291  		t.Fatalf("failed delete second identity: second key exist.")
   292  	}
   293  }
   294  
   295  func TestSymKeyManagement(t *testing.T) {
   296  	InitSingleTest()
   297  
   298  	var err error
   299  	var k1, k2 []byte
   300  	w := New(nil, nil)
   301  	id2 := "arbitrary-string-2"
   302  
   303  	id1, err := w.GenerateSymKey()
   304  	if err != nil {
   305  		t.Fatalf("failed GenerateSymKey with seed %d: %s.", seed, err)
   306  	}
   307  
   308  	k1, err = w.GetSymKey(id1)
   309  	if err != nil {
   310  		t.Fatalf("failed GetSymKey(id1).")
   311  	}
   312  	k2, err = w.GetSymKey(id2)
   313  	if err == nil {
   314  		t.Fatalf("failed GetSymKey(id2): false positive.")
   315  	}
   316  	if !w.HasSymKey(id1) {
   317  		t.Fatalf("failed HasSymKey(id1).")
   318  	}
   319  	if w.HasSymKey(id2) {
   320  		t.Fatalf("failed HasSymKey(id2): false positive.")
   321  	}
   322  	if k1 == nil {
   323  		t.Fatalf("first key does not exist.")
   324  	}
   325  	if k2 != nil {
   326  		t.Fatalf("second key still exist.")
   327  	}
   328  
   329  	// add existing id, nothing should change
   330  	randomKey := make([]byte, common.AESKeyLength)
   331  	mrand.Read(randomKey) // nolint: gosec
   332  	id1, err = w.AddSymKeyDirect(randomKey)
   333  	if err != nil {
   334  		t.Fatalf("failed AddSymKey with seed %d: %s.", seed, err)
   335  	}
   336  
   337  	k1, err = w.GetSymKey(id1)
   338  	if err != nil {
   339  		t.Fatalf("failed w.GetSymKey(id1).")
   340  	}
   341  	k2, err = w.GetSymKey(id2)
   342  	if err == nil {
   343  		t.Fatalf("failed w.GetSymKey(id2): false positive.")
   344  	}
   345  	if !w.HasSymKey(id1) {
   346  		t.Fatalf("failed w.HasSymKey(id1).")
   347  	}
   348  	if w.HasSymKey(id2) {
   349  		t.Fatalf("failed w.HasSymKey(id2): false positive.")
   350  	}
   351  	if k1 == nil {
   352  		t.Fatalf("first key does not exist.")
   353  	}
   354  	if !bytes.Equal(k1, randomKey) {
   355  		t.Fatalf("k1 != randomKey.")
   356  	}
   357  	if k2 != nil {
   358  		t.Fatalf("second key already exist.")
   359  	}
   360  
   361  	id2, err = w.AddSymKeyDirect(randomKey)
   362  	if err != nil {
   363  		t.Fatalf("failed AddSymKey(id2) with seed %d: %s.", seed, err)
   364  	}
   365  	k1, err = w.GetSymKey(id1)
   366  	if err != nil {
   367  		t.Fatalf("failed w.GetSymKey(id1).")
   368  	}
   369  	k2, err = w.GetSymKey(id2)
   370  	if err != nil {
   371  		t.Fatalf("failed w.GetSymKey(id2).")
   372  	}
   373  	if !w.HasSymKey(id1) {
   374  		t.Fatalf("HasSymKey(id1) failed.")
   375  	}
   376  	if !w.HasSymKey(id2) {
   377  		t.Fatalf("HasSymKey(id2) failed.")
   378  	}
   379  	if k1 == nil {
   380  		t.Fatalf("k1 does not exist.")
   381  	}
   382  	if k2 == nil {
   383  		t.Fatalf("k2 does not exist.")
   384  	}
   385  	if !bytes.Equal(k1, k2) {
   386  		t.Fatalf("k1 != k2.")
   387  	}
   388  	if !bytes.Equal(k1, randomKey) {
   389  		t.Fatalf("k1 != randomKey.")
   390  	}
   391  	if len(k1) != common.AESKeyLength {
   392  		t.Fatalf("wrong length of k1.")
   393  	}
   394  	if len(k2) != common.AESKeyLength {
   395  		t.Fatalf("wrong length of k2.")
   396  	}
   397  
   398  	w.DeleteSymKey(id1)
   399  	k1, err = w.GetSymKey(id1)
   400  	if err == nil {
   401  		t.Fatalf("failed w.GetSymKey(id1): false positive.")
   402  	}
   403  	if k1 != nil {
   404  		t.Fatalf("failed GetSymKey(id1): false positive.")
   405  	}
   406  	k2, err = w.GetSymKey(id2)
   407  	if err != nil {
   408  		t.Fatalf("failed w.GetSymKey(id2).")
   409  	}
   410  	if w.HasSymKey(id1) {
   411  		t.Fatalf("failed to delete first key: still exist.")
   412  	}
   413  	if !w.HasSymKey(id2) {
   414  		t.Fatalf("failed to delete first key: second key does not exist.")
   415  	}
   416  	if k2 == nil {
   417  		t.Fatalf("failed to delete first key: second key is nil.")
   418  	}
   419  
   420  	w.DeleteSymKey(id1)
   421  	w.DeleteSymKey(id2)
   422  	k1, err = w.GetSymKey(id1)
   423  	if err == nil {
   424  		t.Fatalf("failed w.GetSymKey(id1): false positive.")
   425  	}
   426  	k2, err = w.GetSymKey(id2)
   427  	if err == nil {
   428  		t.Fatalf("failed w.GetSymKey(id2): false positive.")
   429  	}
   430  	if k1 != nil || k2 != nil {
   431  		t.Fatalf("k1 or k2 is not nil")
   432  	}
   433  	if w.HasSymKey(id1) {
   434  		t.Fatalf("failed to delete second key: first key exist.")
   435  	}
   436  	if w.HasSymKey(id2) {
   437  		t.Fatalf("failed to delete second key: still exist.")
   438  	}
   439  
   440  	randomKey = make([]byte, common.AESKeyLength+1)
   441  	mrand.Read(randomKey) // nolint: gosec
   442  	_, err = w.AddSymKeyDirect(randomKey)
   443  	if err == nil {
   444  		t.Fatalf("added the key with wrong size, seed %d.", seed)
   445  	}
   446  
   447  	const password = "arbitrary data here"
   448  	id1, err = w.AddSymKeyFromPassword(password)
   449  	if err != nil {
   450  		t.Fatalf("failed AddSymKeyFromPassword(id1) with seed %d: %s.", seed, err)
   451  	}
   452  	id2, err = w.AddSymKeyFromPassword(password)
   453  	if err != nil {
   454  		t.Fatalf("failed AddSymKeyFromPassword(id2) with seed %d: %s.", seed, err)
   455  	}
   456  	k1, err = w.GetSymKey(id1)
   457  	if err != nil {
   458  		t.Fatalf("failed w.GetSymKey(id1).")
   459  	}
   460  	k2, err = w.GetSymKey(id2)
   461  	if err != nil {
   462  		t.Fatalf("failed w.GetSymKey(id2).")
   463  	}
   464  	if !w.HasSymKey(id1) {
   465  		t.Fatalf("HasSymKey(id1) failed.")
   466  	}
   467  	if !w.HasSymKey(id2) {
   468  		t.Fatalf("HasSymKey(id2) failed.")
   469  	}
   470  	if !common.ValidateDataIntegrity(k2, common.AESKeyLength) {
   471  		t.Fatalf("key validation failed.")
   472  	}
   473  	if !bytes.Equal(k1, k2) {
   474  		t.Fatalf("k1 != k2.")
   475  	}
   476  }
   477  
   478  func TestExpiry(t *testing.T) {
   479  	InitSingleTest()
   480  
   481  	w := New(nil, nil)
   482  	if err := w.SetMinimumPoW(0.0000001, false); err != nil {
   483  		t.Fatal("failed to set min pow")
   484  	}
   485  
   486  	defer func() { handleError(t, w.SetMinimumPoW(common.DefaultMinimumPoW, false)) }()
   487  	if err := w.Start(); err != nil {
   488  		t.Fatal("failed to start waku")
   489  	}
   490  	defer func() { handleError(t, w.Stop()) }()
   491  
   492  	params, err := generateMessageParams()
   493  	if err != nil {
   494  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   495  	}
   496  	params.TTL = 1
   497  
   498  	messagesCount := 5
   499  
   500  	// Send a few messages one after another. Due to low PoW and expiration buckets
   501  	// with one second resolution, it covers a case when there are multiple items
   502  	// in a single expiration bucket.
   503  	for i := 0; i < messagesCount; i++ {
   504  		msg, err := common.NewSentMessage(params)
   505  		if err != nil {
   506  			t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   507  		}
   508  		env, err := msg.Wrap(params, time.Now())
   509  		if err != nil {
   510  			t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   511  		}
   512  
   513  		err = w.Send(env)
   514  		if err != nil {
   515  			t.Fatalf("failed to send envelope with seed %d: %s.", seed, err)
   516  		}
   517  	}
   518  
   519  	// wait till received or timeout
   520  	var received, expired bool
   521  	for j := 0; j < 20; j++ {
   522  		time.Sleep(100 * time.Millisecond)
   523  		if len(w.Envelopes()) == messagesCount {
   524  			received = true
   525  			break
   526  		}
   527  	}
   528  
   529  	if !received {
   530  		t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
   531  	}
   532  
   533  	// wait till expired or timeout
   534  	for j := 0; j < 20; j++ {
   535  		time.Sleep(100 * time.Millisecond)
   536  		if len(w.Envelopes()) == 0 {
   537  			expired = true
   538  			break
   539  		}
   540  	}
   541  
   542  	if !expired {
   543  		t.Fatalf("expire failed, seed: %d.", seed)
   544  	}
   545  }
   546  
   547  func TestCustomization(t *testing.T) {
   548  	InitSingleTest()
   549  
   550  	w := New(nil, nil)
   551  	defer func() { handleError(t, w.SetMinimumPoW(common.DefaultMinimumPoW, false)) }()
   552  	defer func() { handleError(t, w.SetMaxMessageSize(common.DefaultMaxMessageSize)) }()
   553  	if err := w.Start(); err != nil {
   554  		t.Fatal("failed to start node")
   555  	}
   556  	defer func() { handleError(t, w.Stop()) }()
   557  
   558  	const smallPoW = 0.00001
   559  
   560  	f, err := generateFilter(t, true)
   561  	if err != nil {
   562  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   563  	}
   564  	params, err := generateMessageParams()
   565  	if err != nil {
   566  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   567  	}
   568  
   569  	params.KeySym = f.KeySym
   570  	params.Topic = common.BytesToTopic(f.Topics[2])
   571  	params.PoW = smallPoW
   572  	params.TTL = 3600 * 24 // one day
   573  	msg, err := common.NewSentMessage(params)
   574  	if err != nil {
   575  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   576  	}
   577  	env, err := msg.Wrap(params, time.Now())
   578  	if err != nil {
   579  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   580  	}
   581  
   582  	err = w.Send(env)
   583  	if err == nil {
   584  		t.Fatalf("successfully sent envelope with PoW %.06f, false positive (seed %d).", env.PoW(), seed)
   585  	}
   586  
   587  	_ = w.SetMinimumPoW(smallPoW/2, true)
   588  	err = w.Send(env)
   589  	if err != nil {
   590  		t.Fatalf("failed to send envelope with seed %d: %s.", seed, err)
   591  	}
   592  
   593  	params.TTL++
   594  	msg, err = common.NewSentMessage(params)
   595  	if err != nil {
   596  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   597  	}
   598  	env, err = msg.Wrap(params, time.Now())
   599  	if err != nil {
   600  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   601  	}
   602  	_ = w.SetMaxMessageSize(uint32(env.Size() - 1))
   603  	err = w.Send(env)
   604  	if err == nil {
   605  		t.Fatalf("successfully sent oversized envelope (seed %d): false positive.", seed)
   606  	}
   607  
   608  	_ = w.SetMaxMessageSize(common.DefaultMaxMessageSize)
   609  	err = w.Send(env)
   610  	if err != nil {
   611  		t.Fatalf("failed to send second envelope with seed %d: %s.", seed, err)
   612  	}
   613  
   614  	// wait till received or timeout
   615  	var received bool
   616  	for j := 0; j < 20; j++ {
   617  		time.Sleep(100 * time.Millisecond)
   618  		if len(w.Envelopes()) > 1 {
   619  			received = true
   620  			break
   621  		}
   622  	}
   623  
   624  	if !received {
   625  		t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
   626  	}
   627  
   628  	// check w.messages()
   629  	_, err = w.Subscribe(f)
   630  	if err != nil {
   631  		t.Fatalf("failed subscribe with seed %d: %s.", seed, err)
   632  	}
   633  	time.Sleep(5 * time.Millisecond)
   634  	mail := f.Retrieve()
   635  	if len(mail) > 0 {
   636  		t.Fatalf("received premature mail")
   637  	}
   638  }
   639  
   640  func TestSymmetricSendCycle(t *testing.T) {
   641  	InitSingleTest()
   642  
   643  	w := New(nil, nil)
   644  	defer func() { handleError(t, w.SetMinimumPoW(common.DefaultMinimumPoW, false)) }()
   645  	defer func() { handleError(t, w.SetMaxMessageSize(common.DefaultMaxMessageSize)) }()
   646  	if err := w.Start(); err != nil {
   647  		t.Fatal("failed to start node")
   648  	}
   649  	defer func() { handleError(t, w.Stop()) }()
   650  
   651  	filter1, err := generateFilter(t, true)
   652  	if err != nil {
   653  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   654  	}
   655  	filter1.PoW = common.DefaultMinimumPoW
   656  
   657  	// Copy the first filter since some of its fields
   658  	// are randomly generated.
   659  	filter2 := &common.Filter{
   660  		KeySym:   filter1.KeySym,
   661  		Topics:   filter1.Topics,
   662  		PoW:      filter1.PoW,
   663  		AllowP2P: filter1.AllowP2P,
   664  		Messages: common.NewMemoryMessageStore(),
   665  	}
   666  
   667  	params, err := generateMessageParams()
   668  	if err != nil {
   669  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   670  	}
   671  
   672  	filter1.Src = &params.Src.PublicKey
   673  	filter2.Src = &params.Src.PublicKey
   674  
   675  	params.KeySym = filter1.KeySym
   676  	params.Topic = common.BytesToTopic(filter1.Topics[2])
   677  	params.PoW = filter1.PoW
   678  	params.WorkTime = 10
   679  	params.TTL = 50
   680  	msg, err := common.NewSentMessage(params)
   681  	if err != nil {
   682  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   683  	}
   684  	env, err := msg.Wrap(params, time.Now())
   685  	if err != nil {
   686  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   687  	}
   688  
   689  	_, err = w.Subscribe(filter1)
   690  	if err != nil {
   691  		t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err)
   692  	}
   693  
   694  	_, err = w.Subscribe(filter2)
   695  	if err != nil {
   696  		t.Fatalf("failed subscribe 2 with seed %d: %s.", seed, err)
   697  	}
   698  
   699  	err = w.Send(env)
   700  	if err != nil {
   701  		t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err)
   702  	}
   703  
   704  	// wait till received or timeout
   705  	var received bool
   706  	for j := 0; j < 200; j++ {
   707  		time.Sleep(10 * time.Millisecond)
   708  		if len(w.Envelopes()) > 0 {
   709  			received = true
   710  			break
   711  		}
   712  	}
   713  
   714  	if !received {
   715  		t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
   716  	}
   717  
   718  	// check w.messages()
   719  	time.Sleep(5 * time.Millisecond)
   720  	mail1 := filter1.Retrieve()
   721  	mail2 := filter2.Retrieve()
   722  	if len(mail2) == 0 {
   723  		t.Fatalf("did not receive any email for filter 2")
   724  	}
   725  	if len(mail1) == 0 {
   726  		t.Fatalf("did not receive any email for filter 1")
   727  	}
   728  
   729  }
   730  
   731  func TestSymmetricSendCycleWithTopicInterest(t *testing.T) {
   732  	InitSingleTest()
   733  
   734  	w := New(nil, nil)
   735  	defer func() { handleError(t, w.SetMinimumPoW(common.DefaultMinimumPoW, false)) }()
   736  	defer func() { handleError(t, w.SetMaxMessageSize(common.DefaultMaxMessageSize)) }()
   737  	if err := w.Start(); err != nil {
   738  		t.Fatal("could not start node")
   739  	}
   740  	defer func() { handleError(t, w.Stop()) }()
   741  
   742  	filter1, err := generateFilter(t, true)
   743  	if err != nil {
   744  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   745  	}
   746  	filter1.PoW = common.DefaultMinimumPoW
   747  
   748  	// Copy the first filter since some of its fields
   749  	// are randomly generated.
   750  	filter2 := &common.Filter{
   751  		KeySym:   filter1.KeySym,
   752  		Topics:   filter1.Topics,
   753  		PoW:      filter1.PoW,
   754  		AllowP2P: filter1.AllowP2P,
   755  		Messages: common.NewMemoryMessageStore(),
   756  	}
   757  
   758  	params, err := generateMessageParams()
   759  	if err != nil {
   760  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   761  	}
   762  
   763  	filter1.Src = &params.Src.PublicKey
   764  	filter2.Src = &params.Src.PublicKey
   765  
   766  	params.KeySym = filter1.KeySym
   767  	params.Topic = common.BytesToTopic(filter1.Topics[2])
   768  	params.PoW = filter1.PoW
   769  	params.WorkTime = 10
   770  	params.TTL = 50
   771  	msg, err := common.NewSentMessage(params)
   772  	if err != nil {
   773  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   774  	}
   775  	env, err := msg.Wrap(params, time.Now())
   776  	if err != nil {
   777  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   778  	}
   779  
   780  	_, err = w.Subscribe(filter1)
   781  	if err != nil {
   782  		t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err)
   783  	}
   784  
   785  	_, err = w.Subscribe(filter2)
   786  	if err != nil {
   787  		t.Fatalf("failed subscribe 2 with seed %d: %s.", seed, err)
   788  	}
   789  
   790  	err = w.Send(env)
   791  	if err != nil {
   792  		t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err)
   793  	}
   794  
   795  	// wait till received or timeout
   796  	var received bool
   797  	for j := 0; j < 200; j++ {
   798  		time.Sleep(10 * time.Millisecond)
   799  		if len(w.Envelopes()) > 0 {
   800  			received = true
   801  			break
   802  		}
   803  	}
   804  
   805  	if !received {
   806  		t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
   807  	}
   808  
   809  	// check w.messages()
   810  	time.Sleep(5 * time.Millisecond)
   811  	mail1 := filter1.Retrieve()
   812  	mail2 := filter2.Retrieve()
   813  	if len(mail2) == 0 {
   814  		t.Fatalf("did not receive any email for filter 2")
   815  	}
   816  	if len(mail1) == 0 {
   817  		t.Fatalf("did not receive any email for filter 1")
   818  	}
   819  
   820  }
   821  
   822  func TestSymmetricSendWithoutAKey(t *testing.T) {
   823  	InitSingleTest()
   824  
   825  	w := New(nil, nil)
   826  	if err := w.Start(); err != nil {
   827  		t.Errorf("failed to start waku: '%s'", err)
   828  	}
   829  
   830  	defer func() { handleError(t, w.SetMinimumPoW(common.DefaultMinimumPoW, false)) }()
   831  	defer func() { handleError(t, w.SetMaxMessageSize(common.DefaultMaxMessageSize)) }()
   832  	defer func() { handleError(t, w.Stop()) }()
   833  
   834  	filter, err := generateFilter(t, true)
   835  	if err != nil {
   836  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   837  	}
   838  	filter.PoW = common.DefaultMinimumPoW
   839  
   840  	params, err := generateMessageParams()
   841  	if err != nil {
   842  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   843  	}
   844  
   845  	filter.Src = nil
   846  
   847  	params.KeySym = filter.KeySym
   848  	params.Topic = common.BytesToTopic(filter.Topics[2])
   849  	params.PoW = filter.PoW
   850  	params.WorkTime = 10
   851  	params.TTL = 50
   852  	msg, err := common.NewSentMessage(params)
   853  	if err != nil {
   854  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   855  	}
   856  	env, err := msg.Wrap(params, time.Now())
   857  	if err != nil {
   858  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   859  	}
   860  
   861  	_, err = w.Subscribe(filter)
   862  	if err != nil {
   863  		t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err)
   864  	}
   865  
   866  	err = w.Send(env)
   867  	if err != nil {
   868  		t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err)
   869  	}
   870  
   871  	// wait till received or timeout
   872  	var received bool
   873  	for j := 0; j < 200; j++ {
   874  		time.Sleep(10 * time.Millisecond)
   875  		if len(w.Envelopes()) > 0 {
   876  			received = true
   877  			break
   878  		}
   879  	}
   880  
   881  	if !received {
   882  		t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
   883  	}
   884  
   885  	// check w.messages()
   886  	time.Sleep(5 * time.Millisecond)
   887  	mail := filter.Retrieve()
   888  	if len(mail) == 0 {
   889  		t.Fatalf("did not receive message in spite of not setting a public key")
   890  	}
   891  }
   892  
   893  func TestSymmetricSendKeyMismatch(t *testing.T) {
   894  	InitSingleTest()
   895  
   896  	w := New(nil, nil)
   897  	if err := w.Start(); err != nil {
   898  		t.Errorf("failed to start waku: '%s'", err)
   899  	}
   900  	defer func() { handleError(t, w.SetMinimumPoW(common.DefaultMinimumPoW, false)) }()
   901  	defer func() { handleError(t, w.SetMaxMessageSize(common.DefaultMaxMessageSize)) }()
   902  	defer func() { handleError(t, w.Stop()) }()
   903  
   904  	filter, err := generateFilter(t, true)
   905  	if err != nil {
   906  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   907  	}
   908  	filter.PoW = common.DefaultMinimumPoW
   909  
   910  	params, err := generateMessageParams()
   911  	if err != nil {
   912  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   913  	}
   914  
   915  	params.KeySym = filter.KeySym
   916  	params.Topic = common.BytesToTopic(filter.Topics[2])
   917  	params.PoW = filter.PoW
   918  	params.WorkTime = 10
   919  	params.TTL = 50
   920  	msg, err := common.NewSentMessage(params)
   921  	if err != nil {
   922  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   923  	}
   924  	env, err := msg.Wrap(params, time.Now())
   925  	if err != nil {
   926  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   927  	}
   928  
   929  	_, err = w.Subscribe(filter)
   930  	if err != nil {
   931  		t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err)
   932  	}
   933  
   934  	err = w.Send(env)
   935  	if err != nil {
   936  		t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err)
   937  	}
   938  
   939  	// wait till received or timeout
   940  	var received bool
   941  	for j := 0; j < 200; j++ {
   942  		time.Sleep(10 * time.Millisecond)
   943  		if len(w.Envelopes()) > 0 {
   944  			received = true
   945  			break
   946  		}
   947  	}
   948  
   949  	if !received {
   950  		t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
   951  	}
   952  
   953  	// check w.messages()
   954  	time.Sleep(5 * time.Millisecond)
   955  	mail := filter.Retrieve()
   956  	if len(mail) > 0 {
   957  		t.Fatalf("received a message when keys weren't matching")
   958  	}
   959  }
   960  
   961  func TestFullNode(t *testing.T) {
   962  
   963  	config := &Config{FullNode: true}
   964  	w := New(config, nil)
   965  
   966  	require.True(t, w.FullNode(), "full node should be true")
   967  	require.True(t, common.IsFullNode(w.BloomFilter()), "bloom filter should be full")
   968  	require.True(t, common.IsFullNode(w.BloomFilterTolerance()), "bloom filter tolerance should be full")
   969  	require.Nil(t, w.TopicInterest(), "topic interest should be nil")
   970  
   971  	// Set a topic
   972  	require.NoError(t, w.SetTopicInterest([]common.TopicType{common.BytesToTopic([]byte("a"))}))
   973  
   974  	// Make sure everything is the same
   975  	require.True(t, w.FullNode(), "full node should be true")
   976  	require.True(t, common.IsFullNode(w.BloomFilter()), "bloom filter should be full")
   977  	require.True(t, common.IsFullNode(w.BloomFilterTolerance()), "bloom filter tolerance should be full")
   978  	require.Nil(t, w.TopicInterest(), "topic interest should be nil")
   979  
   980  	// unset full node
   981  	w.SetFullNode(false)
   982  	require.False(t, w.FullNode(), "full node should be false")
   983  	require.NotNil(t, w.TopicInterest(), "topic interest should not be nil")
   984  }
   985  
   986  func TestBloom(t *testing.T) {
   987  	topic := common.TopicType{0, 0, 255, 6}
   988  	b := topic.ToBloom()
   989  	x := make([]byte, common.BloomFilterSize)
   990  	x[0] = byte(1)
   991  	x[32] = byte(1)
   992  	x[common.BloomFilterSize-1] = byte(128)
   993  	if !common.BloomFilterMatch(x, b) || !common.BloomFilterMatch(b, x) {
   994  		t.Fatalf("bloom filter does not match the mask")
   995  	}
   996  
   997  	_, err := mrand.Read(b) // nolint: gosec
   998  	if err != nil {
   999  		t.Fatalf("math rand error")
  1000  	}
  1001  	_, err = mrand.Read(x) // nolint: gosec
  1002  	if err != nil {
  1003  		t.Fatalf("math rand error")
  1004  	}
  1005  	if !common.BloomFilterMatch(b, b) {
  1006  		t.Fatalf("bloom filter does not match self")
  1007  	}
  1008  	x = addBloom(x, b)
  1009  	if !common.BloomFilterMatch(x, b) {
  1010  		t.Fatalf("bloom filter does not match combined bloom")
  1011  	}
  1012  	if !common.IsFullNode(nil) {
  1013  		t.Fatalf("common.IsFullNode did not recognize nil as full node")
  1014  	}
  1015  	x[17] = 254
  1016  	if common.IsFullNode(x) {
  1017  		t.Fatalf("common.IsFullNode false positive")
  1018  	}
  1019  	for i := 0; i < common.BloomFilterSize; i++ {
  1020  		b[i] = byte(255)
  1021  	}
  1022  	if !common.IsFullNode(b) {
  1023  		t.Fatalf("common.IsFullNode false negative")
  1024  	}
  1025  	if common.BloomFilterMatch(x, b) {
  1026  		t.Fatalf("bloomFilterMatch false positive")
  1027  	}
  1028  	if !common.BloomFilterMatch(b, x) {
  1029  		t.Fatalf("bloomFilterMatch false negative")
  1030  	}
  1031  
  1032  	w := New(nil, nil)
  1033  	f := w.BloomFilter()
  1034  	if f != nil {
  1035  		t.Fatalf("wrong bloom on creation")
  1036  	}
  1037  	err = w.SetBloomFilter(x)
  1038  	if err != nil {
  1039  		t.Fatalf("failed to set bloom filter: %s", err)
  1040  	}
  1041  	f = w.BloomFilter()
  1042  	if !common.BloomFilterMatch(f, x) || !common.BloomFilterMatch(x, f) {
  1043  		t.Fatalf("retireved wrong bloom filter")
  1044  	}
  1045  }
  1046  
  1047  func TestTopicInterest(t *testing.T) {
  1048  	w := New(nil, nil)
  1049  	topicInterest := w.TopicInterest()
  1050  	if topicInterest != nil {
  1051  		t.Fatalf("wrong topic on creation")
  1052  	}
  1053  
  1054  	filter1, err := generateFilter(t, true)
  1055  	if err != nil {
  1056  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
  1057  	}
  1058  
  1059  	_, err = w.Subscribe(filter1)
  1060  	if err != nil {
  1061  		t.Fatalf("failed subscribe with seed %d: %s.", seed, err)
  1062  	}
  1063  
  1064  	topicInterest = w.TopicInterest()
  1065  	if len(topicInterest) != len(filter1.Topics) {
  1066  		t.Fatalf("wrong number of topics created")
  1067  	}
  1068  
  1069  	filter2, err := generateFilter(t, true)
  1070  	if err != nil {
  1071  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
  1072  	}
  1073  
  1074  	_, err = w.Subscribe(filter2)
  1075  	if err != nil {
  1076  		t.Fatalf("failed subscribe with seed %d: %s.", seed, err)
  1077  	}
  1078  
  1079  	topicInterest = w.TopicInterest()
  1080  	if len(topicInterest) != len(filter1.Topics)+len(filter2.Topics) {
  1081  		t.Fatalf("wrong number of topics created")
  1082  	}
  1083  
  1084  }
  1085  
  1086  func TestOnNewEnvelopesSoftBlacklist(t *testing.T) {
  1087  	w1 := New(nil, nil)
  1088  
  1089  	envelope := &common.Envelope{}
  1090  	stats := &common.StatsTracker{}
  1091  	p2pPeer := p2p.NewPeer(enode.ID{0x4}, "test", []p2p.Cap{})
  1092  	peer := v1.NewPeer(w1, p2pPeer, nil, nil, stats)
  1093  
  1094  	// Pre-condition, we need to make sure this envelope returns an EnvelopeError
  1095  	envelopeError, err := w1.OnNewEnvelopes([]*common.Envelope{envelope}, peer)
  1096  	require.NoError(t, err)
  1097  	// Make sure this envelope returns an error
  1098  	require.NotNil(t, envelopeError)
  1099  
  1100  	// build black listed waku
  1101  	cfg := &Config{
  1102  		SoftBlacklistedPeerIDs: []string{types.EncodeHex(peer.ID())},
  1103  	}
  1104  	w2 := New(cfg, nil)
  1105  
  1106  	envelopeError, err = w2.OnNewEnvelopes([]*common.Envelope{envelope}, peer)
  1107  	require.NoError(t, err)
  1108  	// Since it's blacklisted, it will just drop envelopes, keep the connection open
  1109  	require.Nil(t, envelopeError)
  1110  }
  1111  
  1112  func handleError(t *testing.T, err error) {
  1113  	if err != nil {
  1114  		t.Logf("deferred function error: '%s'", err)
  1115  	}
  1116  }
  1117  
  1118  func generateFilter(t *testing.T, symmetric bool) (*common.Filter, error) {
  1119  	var f common.Filter
  1120  	f.Messages = common.NewMemoryMessageStore()
  1121  
  1122  	const topicNum = 8
  1123  	f.Topics = make([][]byte, topicNum)
  1124  	for i := 0; i < topicNum; i++ {
  1125  		f.Topics[i] = make([]byte, 4)
  1126  		mrand.Read(f.Topics[i]) // nolint: gosec
  1127  		f.Topics[i][0] = 0x01
  1128  	}
  1129  
  1130  	key, err := crypto.GenerateKey()
  1131  	if err != nil {
  1132  		t.Fatalf("generateFilter 1 failed with seed %d.", seed)
  1133  		return nil, err
  1134  	}
  1135  	f.Src = &key.PublicKey
  1136  
  1137  	if symmetric {
  1138  		f.KeySym = make([]byte, common.AESKeyLength)
  1139  		mrand.Read(f.KeySym) // nolint: gosec
  1140  		f.SymKeyHash = crypto.Keccak256Hash(f.KeySym)
  1141  	} else {
  1142  		f.KeyAsym, err = crypto.GenerateKey()
  1143  		if err != nil {
  1144  			t.Fatalf("generateFilter 2 failed with seed %d.", seed)
  1145  			return nil, err
  1146  		}
  1147  	}
  1148  
  1149  	// AcceptP2P & PoW are not set
  1150  	return &f, nil
  1151  }