github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/swarm/pss/handshake_test.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //
    10  //
    11  //
    12  //
    13  //
    14  //
    15  //
    16  //
    17  //
    18  //
    19  //
    20  //
    21  //
    22  //
    23  //
    24  
    25  //
    26  
    27  package pss
    28  
    29  import (
    30  	"strconv"
    31  	"strings"
    32  	"testing"
    33  	"time"
    34  
    35  	"github.com/ethereum/go-ethereum/swarm/log"
    36  )
    37  
    38  //
    39  //
    40  func TestHandshake(t *testing.T) {
    41  	t.Run("32", testHandshake)
    42  	t.Run("8", testHandshake)
    43  	t.Run("0", testHandshake)
    44  }
    45  
    46  func testHandshake(t *testing.T) {
    47  
    48  //
    49  	useHandshake = true
    50  	var addrsize int64
    51  	var err error
    52  	addrsizestring := strings.Split(t.Name(), "/")
    53  	addrsize, _ = strconv.ParseInt(addrsizestring[1], 10, 0)
    54  
    55  //
    56  //
    57  	clients, err := setupNetwork(2)
    58  	if err != nil {
    59  		t.Fatal(err)
    60  	}
    61  
    62  	var topic string
    63  	err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42")
    64  	if err != nil {
    65  		t.Fatal(err)
    66  	}
    67  
    68  	var loaddr string
    69  	err = clients[0].Call(&loaddr, "pss_baseAddr")
    70  	if err != nil {
    71  		t.Fatalf("rpc get node 1 baseaddr fail: %v", err)
    72  	}
    73  //
    74  	loaddr = loaddr[:2+(addrsize*2)]
    75  	var roaddr string
    76  	err = clients[1].Call(&roaddr, "pss_baseAddr")
    77  	if err != nil {
    78  		t.Fatalf("rpc get node 2 baseaddr fail: %v", err)
    79  	}
    80  	roaddr = roaddr[:2+(addrsize*2)]
    81  	log.Debug("addresses", "left", loaddr, "right", roaddr)
    82  
    83  //
    84  //
    85  	var lpubkey string
    86  	err = clients[0].Call(&lpubkey, "pss_getPublicKey")
    87  	if err != nil {
    88  		t.Fatalf("rpc get node 1 pubkey fail: %v", err)
    89  	}
    90  	var rpubkey string
    91  	err = clients[1].Call(&rpubkey, "pss_getPublicKey")
    92  	if err != nil {
    93  		t.Fatalf("rpc get node 2 pubkey fail: %v", err)
    94  	}
    95  
    96  time.Sleep(time.Millisecond * 1000) //
    97  
    98  //
    99  	err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddr)
   100  	if err != nil {
   101  		t.Fatal(err)
   102  	}
   103  	err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddr)
   104  	if err != nil {
   105  		t.Fatal(err)
   106  	}
   107  
   108  //
   109  //
   110  //
   111  //
   112  //
   113  //
   114  	err = clients[0].Call(nil, "pss_addHandshake", topic)
   115  	if err != nil {
   116  		t.Fatal(err)
   117  	}
   118  	err = clients[1].Call(nil, "pss_addHandshake", topic)
   119  	if err != nil {
   120  		t.Fatal(err)
   121  	}
   122  
   123  	var lhsendsymkeyids []string
   124  	err = clients[0].Call(&lhsendsymkeyids, "pss_handshake", rpubkey, topic, true, true)
   125  	if err != nil {
   126  		t.Fatal(err)
   127  	}
   128  
   129  //
   130  	time.Sleep(time.Second)
   131  
   132  //
   133  	var lsendsymkeyids []string
   134  	err = clients[0].Call(&lsendsymkeyids, "pss_getHandshakeKeys", rpubkey, topic, false, true)
   135  	if err != nil {
   136  		t.Fatal(err)
   137  	}
   138  	m := 0
   139  	for _, hid := range lhsendsymkeyids {
   140  		for _, lid := range lsendsymkeyids {
   141  			if lid == hid {
   142  				m++
   143  			}
   144  		}
   145  	}
   146  	if m != defaultSymKeyCapacity {
   147  		t.Fatalf("buffer size mismatch, expected %d, have %d: %v", defaultSymKeyCapacity, m, lsendsymkeyids)
   148  	}
   149  
   150  //
   151  	var rsendsymkeyids []string
   152  	err = clients[1].Call(&rsendsymkeyids, "pss_getHandshakeKeys", lpubkey, topic, false, true)
   153  	if err != nil {
   154  		t.Fatal(err)
   155  	}
   156  	var lrecvsymkeyids []string
   157  	err = clients[0].Call(&lrecvsymkeyids, "pss_getHandshakeKeys", rpubkey, topic, true, false)
   158  	if err != nil {
   159  		t.Fatal(err)
   160  	}
   161  	var rrecvsymkeyids []string
   162  	err = clients[1].Call(&rrecvsymkeyids, "pss_getHandshakeKeys", lpubkey, topic, true, false)
   163  	if err != nil {
   164  		t.Fatal(err)
   165  	}
   166  
   167  //
   168  	var lsendsymkeys []string
   169  	for _, id := range lsendsymkeyids {
   170  		var key string
   171  		err = clients[0].Call(&key, "pss_getSymmetricKey", id)
   172  		if err != nil {
   173  			t.Fatal(err)
   174  		}
   175  		lsendsymkeys = append(lsendsymkeys, key)
   176  	}
   177  	var rsendsymkeys []string
   178  	for _, id := range rsendsymkeyids {
   179  		var key string
   180  		err = clients[1].Call(&key, "pss_getSymmetricKey", id)
   181  		if err != nil {
   182  			t.Fatal(err)
   183  		}
   184  		rsendsymkeys = append(rsendsymkeys, key)
   185  	}
   186  
   187  //
   188  	var lrecvsymkeys []string
   189  	for _, id := range lrecvsymkeyids {
   190  		var key string
   191  		err = clients[0].Call(&key, "pss_getSymmetricKey", id)
   192  		if err != nil {
   193  			t.Fatal(err)
   194  		}
   195  		match := false
   196  		for _, otherkey := range rsendsymkeys {
   197  			if otherkey == key {
   198  				match = true
   199  			}
   200  		}
   201  		if !match {
   202  			t.Fatalf("no match right send for left recv key %s", id)
   203  		}
   204  		lrecvsymkeys = append(lrecvsymkeys, key)
   205  	}
   206  	var rrecvsymkeys []string
   207  	for _, id := range rrecvsymkeyids {
   208  		var key string
   209  		err = clients[1].Call(&key, "pss_getSymmetricKey", id)
   210  		if err != nil {
   211  			t.Fatal(err)
   212  		}
   213  		match := false
   214  		for _, otherkey := range lsendsymkeys {
   215  			if otherkey == key {
   216  				match = true
   217  			}
   218  		}
   219  		if !match {
   220  			t.Fatalf("no match left send for right recv key %s", id)
   221  		}
   222  		rrecvsymkeys = append(rrecvsymkeys, key)
   223  	}
   224  
   225  //
   226  	err = clients[0].Call(nil, "pss_handshake", rpubkey, topic, false)
   227  	if err == nil {
   228  		t.Fatal("expected full symkey buffer error")
   229  	}
   230  
   231  //
   232  	err = clients[0].Call(nil, "pss_releaseHandshakeKey", rpubkey, topic, lsendsymkeyids[0], true)
   233  	if err != nil {
   234  		t.Fatalf("release left send key %s fail: %v", lsendsymkeyids[0], err)
   235  	}
   236  
   237  	var newlhsendkeyids []string
   238  
   239  //
   240  //
   241  	err = clients[0].Call(&newlhsendkeyids, "pss_handshake", rpubkey, topic, true, false)
   242  	if err != nil {
   243  		t.Fatalf("handshake send fail: %v", err)
   244  	} else if len(newlhsendkeyids) != defaultSymKeyCapacity {
   245  		t.Fatalf("wrong receive count, expected 1, got %d", len(newlhsendkeyids))
   246  	}
   247  
   248  	var newlrecvsymkey string
   249  	err = clients[0].Call(&newlrecvsymkey, "pss_getSymmetricKey", newlhsendkeyids[0])
   250  	if err != nil {
   251  		t.Fatal(err)
   252  	}
   253  	var rmatchsymkeyid *string
   254  	for i, id := range rrecvsymkeyids {
   255  		var key string
   256  		err = clients[1].Call(&key, "pss_getSymmetricKey", id)
   257  		if err != nil {
   258  			t.Fatal(err)
   259  		}
   260  		if newlrecvsymkey == key {
   261  			rmatchsymkeyid = &rrecvsymkeyids[i]
   262  		}
   263  	}
   264  	if rmatchsymkeyid != nil {
   265  		t.Fatalf("right sent old key id %s in second handshake", *rmatchsymkeyid)
   266  	}
   267  
   268  //
   269  	var cleancount int
   270  	clients[0].Call(&cleancount, "psstest_clean")
   271  	if cleancount > 1 {
   272  		t.Fatalf("pss clean count mismatch; expected 1, got %d", cleancount)
   273  	}
   274  }