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