github.com/devfans/go-ethereum@v1.5.10-0.20170326212234-7419d0c38291/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  	mrand "math/rand"
    22  	"testing"
    23  	"time"
    24  
    25  	"github.com/ethereum/go-ethereum/common"
    26  	"github.com/ethereum/go-ethereum/crypto"
    27  )
    28  
    29  func TestWhisperBasic(t *testing.T) {
    30  	w := New()
    31  	p := w.Protocols()
    32  	shh := p[0]
    33  	if shh.Name != ProtocolName {
    34  		t.Fatalf("failed Protocol Name: %v.", shh.Name)
    35  	}
    36  	if uint64(shh.Version) != ProtocolVersion {
    37  		t.Fatalf("failed Protocol Version: %v.", shh.Version)
    38  	}
    39  	if shh.Length != NumberOfMessageCodes {
    40  		t.Fatalf("failed Protocol Length: %v.", shh.Length)
    41  	}
    42  	if shh.Run == nil {
    43  		t.Fatalf("failed shh.Run.")
    44  	}
    45  	if uint64(w.Version()) != ProtocolVersion {
    46  		t.Fatalf("failed whisper Version: %v.", shh.Version)
    47  	}
    48  	if w.GetFilter("non-existent") != nil {
    49  		t.Fatalf("failed GetFilter.")
    50  	}
    51  
    52  	peerID := make([]byte, 64)
    53  	mrand.Read(peerID)
    54  	peer, _ := w.getPeer(peerID)
    55  	if peer != nil {
    56  		t.Fatal("found peer for random key.")
    57  	}
    58  	if err := w.MarkPeerTrusted(peerID); err == nil {
    59  		t.Fatalf("failed MarkPeerTrusted.")
    60  	}
    61  	exist := w.HasSymKey("non-existing")
    62  	if exist {
    63  		t.Fatalf("failed HasSymKey.")
    64  	}
    65  	key := w.GetSymKey("non-existing")
    66  	if key != nil {
    67  		t.Fatalf("failed GetSymKey.")
    68  	}
    69  	mail := w.Envelopes()
    70  	if len(mail) != 0 {
    71  		t.Fatalf("failed w.Envelopes().")
    72  	}
    73  	m := w.Messages("non-existent")
    74  	if len(m) != 0 {
    75  		t.Fatalf("failed w.Messages.")
    76  	}
    77  
    78  	var derived []byte
    79  	ver := uint64(0xDEADBEEF)
    80  	if _, err := deriveKeyMaterial(peerID, ver); err != unknownVersionError(ver) {
    81  		t.Fatalf("failed deriveKeyMaterial with param = %v: %s.", peerID, err)
    82  	}
    83  	derived, err := deriveKeyMaterial(peerID, 0)
    84  	if err != nil {
    85  		t.Fatalf("failed second deriveKeyMaterial with param = %v: %s.", peerID, err)
    86  	}
    87  	if !validateSymmetricKey(derived) {
    88  		t.Fatalf("failed validateSymmetricKey with param = %v.", derived)
    89  	}
    90  	if containsOnlyZeros(derived) {
    91  		t.Fatalf("failed containsOnlyZeros with param = %v.", derived)
    92  	}
    93  
    94  	buf := []byte{0xFF, 0xE5, 0x80, 0x2, 0}
    95  	le := bytesToIntLittleEndian(buf)
    96  	be := BytesToIntBigEndian(buf)
    97  	if le != uint64(0x280e5ff) {
    98  		t.Fatalf("failed bytesToIntLittleEndian: %d.", le)
    99  	}
   100  	if be != uint64(0xffe5800200) {
   101  		t.Fatalf("failed BytesToIntBigEndian: %d.", be)
   102  	}
   103  
   104  	pk := w.NewIdentity()
   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 TestWhisperIdentityManagement(t *testing.T) {
   114  	w := New()
   115  	id1 := w.NewIdentity()
   116  	id2 := w.NewIdentity()
   117  	pub1 := common.ToHex(crypto.FromECDSAPub(&id1.PublicKey))
   118  	pub2 := common.ToHex(crypto.FromECDSAPub(&id2.PublicKey))
   119  	pk1 := w.GetIdentity(pub1)
   120  	pk2 := w.GetIdentity(pub2)
   121  	if !w.HasIdentity(pub1) {
   122  		t.Fatalf("failed HasIdentity(pub1).")
   123  	}
   124  	if !w.HasIdentity(pub2) {
   125  		t.Fatalf("failed HasIdentity(pub2).")
   126  	}
   127  	if pk1 != id1 {
   128  		t.Fatalf("failed GetIdentity(pub1).")
   129  	}
   130  	if pk2 != id2 {
   131  		t.Fatalf("failed GetIdentity(pub2).")
   132  	}
   133  
   134  	// Delete one identity
   135  	w.DeleteIdentity(pub1)
   136  	pk1 = w.GetIdentity(pub1)
   137  	pk2 = w.GetIdentity(pub2)
   138  	if w.HasIdentity(pub1) {
   139  		t.Fatalf("failed DeleteIdentity(pub1): still exist.")
   140  	}
   141  	if !w.HasIdentity(pub2) {
   142  		t.Fatalf("failed DeleteIdentity(pub1): pub2 does not exist.")
   143  	}
   144  	if pk1 != nil {
   145  		t.Fatalf("failed DeleteIdentity(pub1): first key still exist.")
   146  	}
   147  	if pk2 != id2 {
   148  		t.Fatalf("failed DeleteIdentity(pub1): second key does not exist.")
   149  	}
   150  
   151  	// Delete again non-existing identity
   152  	w.DeleteIdentity(pub1)
   153  	pk1 = w.GetIdentity(pub1)
   154  	pk2 = w.GetIdentity(pub2)
   155  	if w.HasIdentity(pub1) {
   156  		t.Fatalf("failed delete non-existing identity: exist.")
   157  	}
   158  	if !w.HasIdentity(pub2) {
   159  		t.Fatalf("failed delete non-existing identity: pub2 does not exist.")
   160  	}
   161  	if pk1 != nil {
   162  		t.Fatalf("failed delete non-existing identity: first key exist.")
   163  	}
   164  	if pk2 != id2 {
   165  		t.Fatalf("failed delete non-existing identity: second key does not exist.")
   166  	}
   167  
   168  	// Delete second identity
   169  	w.DeleteIdentity(pub2)
   170  	pk1 = w.GetIdentity(pub1)
   171  	pk2 = w.GetIdentity(pub2)
   172  	if w.HasIdentity(pub1) {
   173  		t.Fatalf("failed delete second identity: first identity exist.")
   174  	}
   175  	if w.HasIdentity(pub2) {
   176  		t.Fatalf("failed delete second identity: still exist.")
   177  	}
   178  	if pk1 != nil {
   179  		t.Fatalf("failed delete second identity: first key exist.")
   180  	}
   181  	if pk2 != nil {
   182  		t.Fatalf("failed delete second identity: second key exist.")
   183  	}
   184  }
   185  
   186  func TestWhisperSymKeyManagement(t *testing.T) {
   187  	InitSingleTest()
   188  
   189  	var k1, k2 []byte
   190  	w := New()
   191  	id1 := string("arbitrary-string-1")
   192  	id2 := string("arbitrary-string-2")
   193  
   194  	err := w.GenerateSymKey(id1)
   195  	if err != nil {
   196  		t.Fatalf("failed GenerateSymKey with seed %d: %s.", seed, err)
   197  	}
   198  
   199  	k1 = w.GetSymKey(id1)
   200  	k2 = w.GetSymKey(id2)
   201  	if !w.HasSymKey(id1) {
   202  		t.Fatalf("failed HasSymKey(id1).")
   203  	}
   204  	if w.HasSymKey(id2) {
   205  		t.Fatalf("failed HasSymKey(id2).")
   206  	}
   207  	if k1 == nil {
   208  		t.Fatalf("first key does not exist.")
   209  	}
   210  	if k2 != nil {
   211  		t.Fatalf("second key still exist.")
   212  	}
   213  
   214  	// add existing id, nothing should change
   215  	randomKey := make([]byte, 16)
   216  	mrand.Read(randomKey)
   217  	err = w.AddSymKey(id1, randomKey)
   218  	if err == nil {
   219  		t.Fatalf("failed AddSymKey with seed %d.", seed)
   220  	}
   221  
   222  	k1 = w.GetSymKey(id1)
   223  	k2 = w.GetSymKey(id2)
   224  	if !w.HasSymKey(id1) {
   225  		t.Fatalf("failed w.HasSymKey(id1).")
   226  	}
   227  	if w.HasSymKey(id2) {
   228  		t.Fatalf("failed w.HasSymKey(id2).")
   229  	}
   230  	if k1 == nil {
   231  		t.Fatalf("first key does not exist.")
   232  	}
   233  	if bytes.Equal(k1, randomKey) {
   234  		t.Fatalf("k1 == randomKey.")
   235  	}
   236  	if k2 != nil {
   237  		t.Fatalf("second key already exist.")
   238  	}
   239  
   240  	err = w.AddSymKey(id2, randomKey) // add non-existing (yet)
   241  	if err != nil {
   242  		t.Fatalf("failed AddSymKey(id2) with seed %d: %s.", seed, err)
   243  	}
   244  	k1 = w.GetSymKey(id1)
   245  	k2 = w.GetSymKey(id2)
   246  	if !w.HasSymKey(id1) {
   247  		t.Fatalf("HasSymKey(id1) failed.")
   248  	}
   249  	if !w.HasSymKey(id2) {
   250  		t.Fatalf("HasSymKey(id2) failed.")
   251  	}
   252  	if k1 == nil {
   253  		t.Fatalf("k1 does not exist.")
   254  	}
   255  	if k2 == nil {
   256  		t.Fatalf("k2 does not exist.")
   257  	}
   258  	if bytes.Equal(k1, k2) {
   259  		t.Fatalf("k1 == k2.")
   260  	}
   261  	if bytes.Equal(k1, randomKey) {
   262  		t.Fatalf("k1 == randomKey.")
   263  	}
   264  	if len(k1) != aesKeyLength {
   265  		t.Fatalf("wrong length of k1.")
   266  	}
   267  	if len(k2) != aesKeyLength {
   268  		t.Fatalf("wrong length of k2.")
   269  	}
   270  
   271  	w.DeleteSymKey(id1)
   272  	k1 = w.GetSymKey(id1)
   273  	k2 = w.GetSymKey(id2)
   274  	if w.HasSymKey(id1) {
   275  		t.Fatalf("failed to delete first key: still exist.")
   276  	}
   277  	if !w.HasSymKey(id2) {
   278  		t.Fatalf("failed to delete first key: second key does not exist.")
   279  	}
   280  	if k1 != nil {
   281  		t.Fatalf("failed to delete first key.")
   282  	}
   283  	if k2 == nil {
   284  		t.Fatalf("failed to delete first key: second key is nil.")
   285  	}
   286  
   287  	w.DeleteSymKey(id1)
   288  	w.DeleteSymKey(id2)
   289  	k1 = w.GetSymKey(id1)
   290  	k2 = w.GetSymKey(id2)
   291  	if w.HasSymKey(id1) {
   292  		t.Fatalf("failed to delete second key: first key exist.")
   293  	}
   294  	if w.HasSymKey(id2) {
   295  		t.Fatalf("failed to delete second key: still exist.")
   296  	}
   297  	if k1 != nil {
   298  		t.Fatalf("failed to delete second key: first key is not nil.")
   299  	}
   300  	if k2 != nil {
   301  		t.Fatalf("failed to delete second key: second key is not nil.")
   302  	}
   303  }
   304  
   305  func TestExpiry(t *testing.T) {
   306  	InitSingleTest()
   307  
   308  	w := New()
   309  	w.test = true
   310  	w.Start(nil)
   311  	defer w.Stop()
   312  
   313  	params, err := generateMessageParams()
   314  	if err != nil {
   315  		t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   316  	}
   317  
   318  	params.TTL = 1
   319  	msg := NewSentMessage(params)
   320  	env, err := msg.Wrap(params)
   321  	if err != nil {
   322  		t.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   323  	}
   324  
   325  	err = w.Send(env)
   326  	if err != nil {
   327  		t.Fatalf("failed to send envelope with seed %d: %s.", seed, err)
   328  	}
   329  
   330  	// wait till received or timeout
   331  	var received, expired bool
   332  	for j := 0; j < 20; j++ {
   333  		time.Sleep(100 * time.Millisecond)
   334  		if len(w.Envelopes()) > 0 {
   335  			received = true
   336  			break
   337  		}
   338  	}
   339  
   340  	if !received {
   341  		t.Fatalf("did not receive the sent envelope, seed: %d.", seed)
   342  	}
   343  
   344  	// wait till expired or timeout
   345  	for j := 0; j < 20; j++ {
   346  		time.Sleep(100 * time.Millisecond)
   347  		if len(w.Envelopes()) == 0 {
   348  			expired = true
   349  			break
   350  		}
   351  	}
   352  
   353  	if !expired {
   354  		t.Fatalf("expire failed, seed: %d.", seed)
   355  	}
   356  }