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