github.com/myafeier/go-ethereum@v1.6.8-0.20170719123245-3e0dbe0eaa72/whisper/whisperv5/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 whisperv5
    18  
    19  import (
    20  	"bytes"
    21  	"crypto/ecdsa"
    22  	mrand "math/rand"
    23  	"testing"
    24  	"time"
    25  )
    26  
    27  func TestWhisperBasic(t *testing.T) {
    28  	w := New(&DefaultConfig)
    29  	p := w.Protocols()
    30  	shh := p[0]
    31  	if shh.Name != ProtocolName {
    32  		t.Fatalf("failed Protocol Name: %v.", shh.Name)
    33  	}
    34  	if uint64(shh.Version) != ProtocolVersion {
    35  		t.Fatalf("failed Protocol Version: %v.", shh.Version)
    36  	}
    37  	if shh.Length != NumberOfMessageCodes {
    38  		t.Fatalf("failed Protocol Length: %v.", shh.Length)
    39  	}
    40  	if shh.Run == nil {
    41  		t.Fatalf("failed shh.Run.")
    42  	}
    43  	if uint64(w.Version()) != ProtocolVersion {
    44  		t.Fatalf("failed whisper Version: %v.", shh.Version)
    45  	}
    46  	if w.GetFilter("non-existent") != nil {
    47  		t.Fatalf("failed GetFilter.")
    48  	}
    49  
    50  	peerID := make([]byte, 64)
    51  	mrand.Read(peerID)
    52  	peer, _ := w.getPeer(peerID)
    53  	if peer != nil {
    54  		t.Fatal("found peer for random key.")
    55  	}
    56  	if err := w.AllowP2PMessagesFromPeer(peerID); err == nil {
    57  		t.Fatalf("failed MarkPeerTrusted.")
    58  	}
    59  	exist := w.HasSymKey("non-existing")
    60  	if exist {
    61  		t.Fatalf("failed HasSymKey.")
    62  	}
    63  	key, err := w.GetSymKey("non-existing")
    64  	if err == nil {
    65  		t.Fatalf("failed GetSymKey(non-existing): false positive.")
    66  	}
    67  	if key != nil {
    68  		t.Fatalf("failed GetSymKey: false positive.")
    69  	}
    70  	mail := w.Envelopes()
    71  	if len(mail) != 0 {
    72  		t.Fatalf("failed w.Envelopes().")
    73  	}
    74  	m := w.Messages("non-existent")
    75  	if len(m) != 0 {
    76  		t.Fatalf("failed w.Messages.")
    77  	}
    78  
    79  	var derived []byte
    80  	ver := uint64(0xDEADBEEF)
    81  	if _, err := deriveKeyMaterial(peerID, ver); err != unknownVersionError(ver) {
    82  		t.Fatalf("failed deriveKeyMaterial with param = %v: %s.", peerID, err)
    83  	}
    84  	derived, err = deriveKeyMaterial(peerID, 0)
    85  	if err != nil {
    86  		t.Fatalf("failed second deriveKeyMaterial with param = %v: %s.", peerID, err)
    87  	}
    88  	if !validateSymmetricKey(derived) {
    89  		t.Fatalf("failed validateSymmetricKey with param = %v.", derived)
    90  	}
    91  	if containsOnlyZeros(derived) {
    92  		t.Fatalf("failed containsOnlyZeros with param = %v.", derived)
    93  	}
    94  
    95  	buf := []byte{0xFF, 0xE5, 0x80, 0x2, 0}
    96  	le := bytesToUintLittleEndian(buf)
    97  	be := BytesToUintBigEndian(buf)
    98  	if le != uint64(0x280e5ff) {
    99  		t.Fatalf("failed bytesToIntLittleEndian: %d.", le)
   100  	}
   101  	if be != uint64(0xffe5800200) {
   102  		t.Fatalf("failed BytesToIntBigEndian: %d.", be)
   103  	}
   104  
   105  	id, err := w.NewKeyPair()
   106  	if err != nil {
   107  		t.Fatalf("failed to generate new key pair: %s.", err)
   108  	}
   109  	pk, err := w.GetPrivateKey(id)
   110  	if err != nil {
   111  		t.Fatalf("failed to retrieve new key pair: %s.", err)
   112  	}
   113  	if !validatePrivateKey(pk) {
   114  		t.Fatalf("failed validatePrivateKey: %v.", pk)
   115  	}
   116  	if !ValidatePublicKey(&pk.PublicKey) {
   117  		t.Fatalf("failed ValidatePublicKey: %v.", pk)
   118  	}
   119  }
   120  
   121  func TestWhisperAsymmetricKeyImport(t *testing.T) {
   122  	var (
   123  		w           = New(&DefaultConfig)
   124  		privateKeys []*ecdsa.PrivateKey
   125  	)
   126  
   127  	for i := 0; i < 50; i++ {
   128  		id, err := w.NewKeyPair()
   129  		if err != nil {
   130  			t.Fatalf("could not generate key: %v", err)
   131  		}
   132  
   133  		pk, err := w.GetPrivateKey(id)
   134  		if err != nil {
   135  			t.Fatalf("could not export private key: %v", err)
   136  		}
   137  
   138  		privateKeys = append(privateKeys, pk)
   139  
   140  		if !w.DeleteKeyPair(id) {
   141  			t.Fatalf("could not delete private key")
   142  		}
   143  	}
   144  
   145  	for _, pk := range privateKeys {
   146  		if _, err := w.AddKeyPair(pk); err != nil {
   147  			t.Fatalf("could not import private key: %v", err)
   148  		}
   149  	}
   150  }
   151  
   152  func TestWhisperIdentityManagement(t *testing.T) {
   153  	w := New(&DefaultConfig)
   154  	id1, err := w.NewKeyPair()
   155  	if err != nil {
   156  		t.Fatalf("failed to generate new key pair: %s.", err)
   157  	}
   158  	id2, err := w.NewKeyPair()
   159  	if err != nil {
   160  		t.Fatalf("failed to generate new key pair: %s.", err)
   161  	}
   162  	pk1, err := w.GetPrivateKey(id1)
   163  	if err != nil {
   164  		t.Fatalf("failed to retrieve the key pair: %s.", err)
   165  	}
   166  	pk2, err := w.GetPrivateKey(id2)
   167  	if err != nil {
   168  		t.Fatalf("failed to retrieve the key pair: %s.", err)
   169  	}
   170  
   171  	if !w.HasKeyPair(id1) {
   172  		t.Fatalf("failed HasIdentity(pk1).")
   173  	}
   174  	if !w.HasKeyPair(id2) {
   175  		t.Fatalf("failed HasIdentity(pk2).")
   176  	}
   177  	if pk1 == nil {
   178  		t.Fatalf("failed GetIdentity(pk1).")
   179  	}
   180  	if pk2 == nil {
   181  		t.Fatalf("failed GetIdentity(pk2).")
   182  	}
   183  
   184  	if !validatePrivateKey(pk1) {
   185  		t.Fatalf("pk1 is invalid.")
   186  	}
   187  	if !validatePrivateKey(pk2) {
   188  		t.Fatalf("pk2 is invalid.")
   189  	}
   190  
   191  	// Delete one identity
   192  	done := w.DeleteKeyPair(id1)
   193  	if !done {
   194  		t.Fatalf("failed to delete id1.")
   195  	}
   196  	pk1, err = w.GetPrivateKey(id1)
   197  	if err == nil {
   198  		t.Fatalf("retrieve the key pair: false positive.")
   199  	}
   200  	pk2, err = w.GetPrivateKey(id2)
   201  	if err != nil {
   202  		t.Fatalf("failed to retrieve the key pair: %s.", err)
   203  	}
   204  	if w.HasKeyPair(id1) {
   205  		t.Fatalf("failed DeleteIdentity(pub1): still exist.")
   206  	}
   207  	if !w.HasKeyPair(id2) {
   208  		t.Fatalf("failed DeleteIdentity(pub1): pub2 does not exist.")
   209  	}
   210  	if pk1 != nil {
   211  		t.Fatalf("failed DeleteIdentity(pub1): first key still exist.")
   212  	}
   213  	if pk2 == nil {
   214  		t.Fatalf("failed DeleteIdentity(pub1): second key does not exist.")
   215  	}
   216  
   217  	// Delete again non-existing identity
   218  	done = w.DeleteKeyPair(id1)
   219  	if done {
   220  		t.Fatalf("delete id1: false positive.")
   221  	}
   222  	pk1, err = w.GetPrivateKey(id1)
   223  	if err == nil {
   224  		t.Fatalf("retrieve the key pair: false positive.")
   225  	}
   226  	pk2, err = w.GetPrivateKey(id2)
   227  	if err != nil {
   228  		t.Fatalf("failed to retrieve the key pair: %s.", err)
   229  	}
   230  	if w.HasKeyPair(id1) {
   231  		t.Fatalf("failed delete non-existing identity: exist.")
   232  	}
   233  	if !w.HasKeyPair(id2) {
   234  		t.Fatalf("failed delete non-existing identity: pub2 does not exist.")
   235  	}
   236  	if pk1 != nil {
   237  		t.Fatalf("failed delete non-existing identity: first key exist.")
   238  	}
   239  	if pk2 == nil {
   240  		t.Fatalf("failed delete non-existing identity: second key does not exist.")
   241  	}
   242  
   243  	// Delete second identity
   244  	done = w.DeleteKeyPair(id2)
   245  	if !done {
   246  		t.Fatalf("failed to delete id2.")
   247  	}
   248  	pk1, err = w.GetPrivateKey(id1)
   249  	if err == nil {
   250  		t.Fatalf("retrieve the key pair: false positive.")
   251  	}
   252  	pk2, err = w.GetPrivateKey(id2)
   253  	if err == nil {
   254  		t.Fatalf("retrieve the key pair: false positive.")
   255  	}
   256  	if w.HasKeyPair(id1) {
   257  		t.Fatalf("failed delete second identity: first identity exist.")
   258  	}
   259  	if w.HasKeyPair(id2) {
   260  		t.Fatalf("failed delete second identity: still exist.")
   261  	}
   262  	if pk1 != nil {
   263  		t.Fatalf("failed delete second identity: first key exist.")
   264  	}
   265  	if pk2 != nil {
   266  		t.Fatalf("failed delete second identity: second key exist.")
   267  	}
   268  }
   269  
   270  func TestWhisperSymKeyManagement(t *testing.T) {
   271  	InitSingleTest()
   272  
   273  	var err error
   274  	var k1, k2 []byte
   275  	w := New(&DefaultConfig)
   276  	id1 := string("arbitrary-string-1")
   277  	id2 := string("arbitrary-string-2")
   278  
   279  	id1, err = w.GenerateSymKey()
   280  	if err != nil {
   281  		t.Fatalf("failed GenerateSymKey with seed %d: %s.", seed, err)
   282  	}
   283  
   284  	k1, err = w.GetSymKey(id1)
   285  	if err != nil {
   286  		t.Fatalf("failed GetSymKey(id1).")
   287  	}
   288  	k2, err = w.GetSymKey(id2)
   289  	if err == nil {
   290  		t.Fatalf("failed GetSymKey(id2): false positive.")
   291  	}
   292  	if !w.HasSymKey(id1) {
   293  		t.Fatalf("failed HasSymKey(id1).")
   294  	}
   295  	if w.HasSymKey(id2) {
   296  		t.Fatalf("failed HasSymKey(id2): false positive.")
   297  	}
   298  	if k1 == nil {
   299  		t.Fatalf("first key does not exist.")
   300  	}
   301  	if k2 != nil {
   302  		t.Fatalf("second key still exist.")
   303  	}
   304  
   305  	// add existing id, nothing should change
   306  	randomKey := make([]byte, aesKeyLength)
   307  	mrand.Read(randomKey)
   308  	id1, err = w.AddSymKeyDirect(randomKey)
   309  	if err != nil {
   310  		t.Fatalf("failed AddSymKey with seed %d: %s.", seed, err)
   311  	}
   312  
   313  	k1, err = w.GetSymKey(id1)
   314  	if err != nil {
   315  		t.Fatalf("failed w.GetSymKey(id1).")
   316  	}
   317  	k2, err = w.GetSymKey(id2)
   318  	if err == nil {
   319  		t.Fatalf("failed w.GetSymKey(id2): false positive.")
   320  	}
   321  	if !w.HasSymKey(id1) {
   322  		t.Fatalf("failed w.HasSymKey(id1).")
   323  	}
   324  	if w.HasSymKey(id2) {
   325  		t.Fatalf("failed w.HasSymKey(id2): false positive.")
   326  	}
   327  	if k1 == nil {
   328  		t.Fatalf("first key does not exist.")
   329  	}
   330  	if !bytes.Equal(k1, randomKey) {
   331  		t.Fatalf("k1 != randomKey.")
   332  	}
   333  	if k2 != nil {
   334  		t.Fatalf("second key already exist.")
   335  	}
   336  
   337  	id2, err = w.AddSymKeyDirect(randomKey)
   338  	if err != nil {
   339  		t.Fatalf("failed AddSymKey(id2) with seed %d: %s.", seed, err)
   340  	}
   341  	k1, err = w.GetSymKey(id1)
   342  	if err != nil {
   343  		t.Fatalf("failed w.GetSymKey(id1).")
   344  	}
   345  	k2, err = w.GetSymKey(id2)
   346  	if err != nil {
   347  		t.Fatalf("failed w.GetSymKey(id2).")
   348  	}
   349  	if !w.HasSymKey(id1) {
   350  		t.Fatalf("HasSymKey(id1) failed.")
   351  	}
   352  	if !w.HasSymKey(id2) {
   353  		t.Fatalf("HasSymKey(id2) failed.")
   354  	}
   355  	if k1 == nil {
   356  		t.Fatalf("k1 does not exist.")
   357  	}
   358  	if k2 == nil {
   359  		t.Fatalf("k2 does not exist.")
   360  	}
   361  	if !bytes.Equal(k1, k2) {
   362  		t.Fatalf("k1 != k2.")
   363  	}
   364  	if !bytes.Equal(k1, randomKey) {
   365  		t.Fatalf("k1 != randomKey.")
   366  	}
   367  	if len(k1) != aesKeyLength {
   368  		t.Fatalf("wrong length of k1.")
   369  	}
   370  	if len(k2) != aesKeyLength {
   371  		t.Fatalf("wrong length of k2.")
   372  	}
   373  
   374  	w.DeleteSymKey(id1)
   375  	k1, err = w.GetSymKey(id1)
   376  	if err == nil {
   377  		t.Fatalf("failed w.GetSymKey(id1): false positive.")
   378  	}
   379  	if k1 != nil {
   380  		t.Fatalf("failed GetSymKey(id1): false positive.")
   381  	}
   382  	k2, err = w.GetSymKey(id2)
   383  	if err != nil {
   384  		t.Fatalf("failed w.GetSymKey(id2).")
   385  	}
   386  	if w.HasSymKey(id1) {
   387  		t.Fatalf("failed to delete first key: still exist.")
   388  	}
   389  	if !w.HasSymKey(id2) {
   390  		t.Fatalf("failed to delete first key: second key does not exist.")
   391  	}
   392  	if k1 != nil {
   393  		t.Fatalf("failed to delete first key.")
   394  	}
   395  	if k2 == nil {
   396  		t.Fatalf("failed to delete first key: second key is nil.")
   397  	}
   398  
   399  	w.DeleteSymKey(id1)
   400  	w.DeleteSymKey(id2)
   401  	k1, err = w.GetSymKey(id1)
   402  	if err == nil {
   403  		t.Fatalf("failed w.GetSymKey(id1): false positive.")
   404  	}
   405  	k2, err = w.GetSymKey(id2)
   406  	if err == nil {
   407  		t.Fatalf("failed w.GetSymKey(id2): false positive.")
   408  	}
   409  	if k1 != nil || k2 != nil {
   410  		t.Fatalf("k1 or k2 is not nil")
   411  	}
   412  	if w.HasSymKey(id1) {
   413  		t.Fatalf("failed to delete second key: first key exist.")
   414  	}
   415  	if w.HasSymKey(id2) {
   416  		t.Fatalf("failed to delete second key: still exist.")
   417  	}
   418  	if k1 != nil {
   419  		t.Fatalf("failed to delete second key: first key is not nil.")
   420  	}
   421  	if k2 != nil {
   422  		t.Fatalf("failed to delete second key: second key is not nil.")
   423  	}
   424  
   425  	randomKey = make([]byte, aesKeyLength+1)
   426  	mrand.Read(randomKey)
   427  	id1, err = w.AddSymKeyDirect(randomKey)
   428  	if err == nil {
   429  		t.Fatalf("added the key with wrong size, seed %d.", seed)
   430  	}
   431  
   432  	const password = "arbitrary data here"
   433  	id1, err = w.AddSymKeyFromPassword(password)
   434  	if err != nil {
   435  		t.Fatalf("failed AddSymKeyFromPassword(id1) with seed %d: %s.", seed, err)
   436  	}
   437  	id2, err = w.AddSymKeyFromPassword(password)
   438  	if err != nil {
   439  		t.Fatalf("failed AddSymKeyFromPassword(id2) with seed %d: %s.", seed, err)
   440  	}
   441  	k1, err = w.GetSymKey(id1)
   442  	if err != nil {
   443  		t.Fatalf("failed w.GetSymKey(id1).")
   444  	}
   445  	k2, err = w.GetSymKey(id2)
   446  	if err != nil {
   447  		t.Fatalf("failed w.GetSymKey(id2).")
   448  	}
   449  	if !w.HasSymKey(id1) {
   450  		t.Fatalf("HasSymKey(id1) failed.")
   451  	}
   452  	if !w.HasSymKey(id2) {
   453  		t.Fatalf("HasSymKey(id2) failed.")
   454  	}
   455  	if k1 == nil {
   456  		t.Fatalf("k1 does not exist.")
   457  	}
   458  	if k2 == nil {
   459  		t.Fatalf("k2 does not exist.")
   460  	}
   461  	if !bytes.Equal(k1, k2) {
   462  		t.Fatalf("k1 != k2.")
   463  	}
   464  	if len(k1) != aesKeyLength {
   465  		t.Fatalf("wrong length of k1.")
   466  	}
   467  	if len(k2) != aesKeyLength {
   468  		t.Fatalf("wrong length of k2.")
   469  	}
   470  	if !validateSymmetricKey(k2) {
   471  		t.Fatalf("key validation failed.")
   472  	}
   473  }
   474  
   475  func TestExpiry(t *testing.T) {
   476  	InitSingleTest()
   477  
   478  	w := New(&DefaultConfig)
   479  	w.SetMinimumPoW(0.0000001)
   480  	defer w.SetMinimumPoW(DefaultMinimumPoW)
   481  	w.Start(nil)
   482  	defer w.Stop()
   483  
   484  	params, err := generateMessageParams()
   485  	if err != nil {
   486  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   487  	}
   488  
   489  	params.TTL = 1
   490  	msg, err := NewSentMessage(params)
   491  	if err != nil {
   492  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   493  	}
   494  	env, err := msg.Wrap(params)
   495  	if err != nil {
   496  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   497  	}
   498  
   499  	err = w.Send(env)
   500  	if err != nil {
   501  		t.Fatalf("failed to send envelope with seed %d: %s.", seed, err)
   502  	}
   503  
   504  	// wait till received or timeout
   505  	var received, expired bool
   506  	for j := 0; j < 20; j++ {
   507  		time.Sleep(100 * time.Millisecond)
   508  		if len(w.Envelopes()) > 0 {
   509  			received = true
   510  			break
   511  		}
   512  	}
   513  
   514  	if !received {
   515  		t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
   516  	}
   517  
   518  	// wait till expired or timeout
   519  	for j := 0; j < 20; j++ {
   520  		time.Sleep(100 * time.Millisecond)
   521  		if len(w.Envelopes()) == 0 {
   522  			expired = true
   523  			break
   524  		}
   525  	}
   526  
   527  	if !expired {
   528  		t.Fatalf("expire failed, seed: %d.", seed)
   529  	}
   530  }
   531  
   532  func TestCustomization(t *testing.T) {
   533  	InitSingleTest()
   534  
   535  	w := New(&DefaultConfig)
   536  	defer w.SetMinimumPoW(DefaultMinimumPoW)
   537  	defer w.SetMaxMessageSize(DefaultMaxMessageSize)
   538  	w.Start(nil)
   539  	defer w.Stop()
   540  
   541  	const smallPoW = 0.00001
   542  
   543  	f, err := generateFilter(t, true)
   544  	params, err := generateMessageParams()
   545  	if err != nil {
   546  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   547  	}
   548  
   549  	params.KeySym = f.KeySym
   550  	params.Topic = BytesToTopic(f.Topics[2])
   551  	params.PoW = smallPoW
   552  	params.TTL = 3600 * 24 // one day
   553  	msg, err := NewSentMessage(params)
   554  	if err != nil {
   555  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   556  	}
   557  	env, err := msg.Wrap(params)
   558  	if err != nil {
   559  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   560  	}
   561  
   562  	err = w.Send(env)
   563  	if err == nil {
   564  		t.Fatalf("successfully sent envelope with PoW %.06f, false positive (seed %d).", env.PoW(), seed)
   565  	}
   566  
   567  	w.SetMinimumPoW(smallPoW / 2)
   568  	err = w.Send(env)
   569  	if err != nil {
   570  		t.Fatalf("failed to send envelope with seed %d: %s.", seed, err)
   571  	}
   572  
   573  	params.TTL++
   574  	msg, err = NewSentMessage(params)
   575  	if err != nil {
   576  		t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
   577  	}
   578  	env, err = msg.Wrap(params)
   579  	if err != nil {
   580  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   581  	}
   582  	w.SetMaxMessageSize(uint32(env.size() - 1))
   583  	err = w.Send(env)
   584  	if err == nil {
   585  		t.Fatalf("successfully sent oversized envelope (seed %d): false positive.", seed)
   586  	}
   587  
   588  	w.SetMaxMessageSize(DefaultMaxMessageSize)
   589  	err = w.Send(env)
   590  	if err != nil {
   591  		t.Fatalf("failed to send second envelope with seed %d: %s.", seed, err)
   592  	}
   593  
   594  	// wait till received or timeout
   595  	var received bool
   596  	for j := 0; j < 20; j++ {
   597  		time.Sleep(100 * time.Millisecond)
   598  		if len(w.Envelopes()) > 1 {
   599  			received = true
   600  			break
   601  		}
   602  	}
   603  
   604  	if !received {
   605  		t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
   606  	}
   607  
   608  	// check w.messages()
   609  	id, err := w.Subscribe(f)
   610  	time.Sleep(5 * time.Millisecond)
   611  	mail := f.Retrieve()
   612  	if len(mail) > 0 {
   613  		t.Fatalf("received premature mail")
   614  	}
   615  
   616  	mail = w.Messages(id)
   617  	if len(mail) != 2 {
   618  		t.Fatalf("failed to get whisper messages")
   619  	}
   620  }