github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/pss/handshake_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 19:16:44</date>
    10  //</624450116681469952>
    11  
    12  
    13  //+建立FO
    14  
    15  package pss
    16  
    17  import (
    18  	"strconv"
    19  	"strings"
    20  	"testing"
    21  	"time"
    22  
    23  	"github.com/ethereum/go-ethereum/swarm/log"
    24  )
    25  
    26  //两个直接连接的对等端之间的非对称密钥交换
    27  //完整地址、部分地址(8字节)和空地址
    28  func TestHandshake(t *testing.T) {
    29  	t.Skip("handshakes are not adapted to current pss core code")
    30  	t.Run("32", testHandshake)
    31  	t.Run("8", testHandshake)
    32  	t.Run("0", testHandshake)
    33  }
    34  
    35  func testHandshake(t *testing.T) {
    36  
    37  //我们要用多少地址
    38  	useHandshake = true
    39  	var addrsize int64
    40  	var err error
    41  	addrsizestring := strings.Split(t.Name(), "/")
    42  	addrsize, _ = strconv.ParseInt(addrsizestring[1], 10, 0)
    43  
    44  //设置两个直接连接的节点
    45  //(我们不在这里测试PSS路由)
    46  	clients, err := setupNetwork(2)
    47  	if err != nil {
    48  		t.Fatal(err)
    49  	}
    50  
    51  	var topic string
    52  	err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42")
    53  	if err != nil {
    54  		t.Fatal(err)
    55  	}
    56  
    57  	var loaddr string
    58  	err = clients[0].Call(&loaddr, "pss_baseAddr")
    59  	if err != nil {
    60  		t.Fatalf("rpc get node 1 baseaddr fail: %v", err)
    61  	}
    62  //“0x”=2字节+addrsize地址字节,十六进制为2x长度
    63  	loaddr = loaddr[:2+(addrsize*2)]
    64  	var roaddr string
    65  	err = clients[1].Call(&roaddr, "pss_baseAddr")
    66  	if err != nil {
    67  		t.Fatalf("rpc get node 2 baseaddr fail: %v", err)
    68  	}
    69  	roaddr = roaddr[:2+(addrsize*2)]
    70  	log.Debug("addresses", "left", loaddr, "right", roaddr)
    71  
    72  //从PSS实例检索公钥
    73  //互惠设置此公钥
    74  	var lpubkey string
    75  	err = clients[0].Call(&lpubkey, "pss_getPublicKey")
    76  	if err != nil {
    77  		t.Fatalf("rpc get node 1 pubkey fail: %v", err)
    78  	}
    79  	var rpubkey string
    80  	err = clients[1].Call(&rpubkey, "pss_getPublicKey")
    81  	if err != nil {
    82  		t.Fatalf("rpc get node 2 pubkey fail: %v", err)
    83  	}
    84  
    85  time.Sleep(time.Millisecond * 1000) //替换为配置单元正常代码
    86  
    87  //为每个节点提供其对等方的公钥
    88  	err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddr)
    89  	if err != nil {
    90  		t.Fatal(err)
    91  	}
    92  	err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddr)
    93  	if err != nil {
    94  		t.Fatal(err)
    95  	}
    96  
    97  //握手
    98  //在此之后,每侧将具有默认symkeybuffercapacity symkey,分别用于输入和输出消息:
    99  //L->REQUEST 4键->R
   100  //L<-发送4个键,请求4个键<-R
   101  //L->SEND 4键->R
   102  //调用将用L发送到R所需的符号键填充数组。
   103  	err = clients[0].Call(nil, "pss_addHandshake", topic)
   104  	if err != nil {
   105  		t.Fatal(err)
   106  	}
   107  	err = clients[1].Call(nil, "pss_addHandshake", topic)
   108  	if err != nil {
   109  		t.Fatal(err)
   110  	}
   111  
   112  	var lhsendsymkeyids []string
   113  	err = clients[0].Call(&lhsendsymkeyids, "pss_handshake", rpubkey, topic, true, true)
   114  	if err != nil {
   115  		t.Fatal(err)
   116  	}
   117  
   118  //确保R节点获取其键
   119  	time.Sleep(time.Second)
   120  
   121  //检查我们是否存储了6个传出密钥,它们与从R收到的密钥匹配
   122  	var lsendsymkeyids []string
   123  	err = clients[0].Call(&lsendsymkeyids, "pss_getHandshakeKeys", rpubkey, topic, false, true)
   124  	if err != nil {
   125  		t.Fatal(err)
   126  	}
   127  	m := 0
   128  	for _, hid := range lhsendsymkeyids {
   129  		for _, lid := range lsendsymkeyids {
   130  			if lid == hid {
   131  				m++
   132  			}
   133  		}
   134  	}
   135  	if m != defaultSymKeyCapacity {
   136  		t.Fatalf("buffer size mismatch, expected %d, have %d: %v", defaultSymKeyCapacity, m, lsendsymkeyids)
   137  	}
   138  
   139  //检查l-node和r-node上的输入和输出键是否匹配,是否在相反的类别中(l recv=r send,l send=r recv)
   140  	var rsendsymkeyids []string
   141  	err = clients[1].Call(&rsendsymkeyids, "pss_getHandshakeKeys", lpubkey, topic, false, true)
   142  	if err != nil {
   143  		t.Fatal(err)
   144  	}
   145  	var lrecvsymkeyids []string
   146  	err = clients[0].Call(&lrecvsymkeyids, "pss_getHandshakeKeys", rpubkey, topic, true, false)
   147  	if err != nil {
   148  		t.Fatal(err)
   149  	}
   150  	var rrecvsymkeyids []string
   151  	err = clients[1].Call(&rrecvsymkeyids, "pss_getHandshakeKeys", lpubkey, topic, true, false)
   152  	if err != nil {
   153  		t.Fatal(err)
   154  	}
   155  
   156  //从两侧获取字节形式的传出符号键
   157  	var lsendsymkeys []string
   158  	for _, id := range lsendsymkeyids {
   159  		var key string
   160  		err = clients[0].Call(&key, "pss_getSymmetricKey", id)
   161  		if err != nil {
   162  			t.Fatal(err)
   163  		}
   164  		lsendsymkeys = append(lsendsymkeys, key)
   165  	}
   166  	var rsendsymkeys []string
   167  	for _, id := range rsendsymkeyids {
   168  		var key string
   169  		err = clients[1].Call(&key, "pss_getSymmetricKey", id)
   170  		if err != nil {
   171  			t.Fatal(err)
   172  		}
   173  		rsendsymkeys = append(rsendsymkeys, key)
   174  	}
   175  
   176  //从两侧获取字节形式的传入符号键并进行比较
   177  	var lrecvsymkeys []string
   178  	for _, id := range lrecvsymkeyids {
   179  		var key string
   180  		err = clients[0].Call(&key, "pss_getSymmetricKey", id)
   181  		if err != nil {
   182  			t.Fatal(err)
   183  		}
   184  		match := false
   185  		for _, otherkey := range rsendsymkeys {
   186  			if otherkey == key {
   187  				match = true
   188  			}
   189  		}
   190  		if !match {
   191  			t.Fatalf("no match right send for left recv key %s", id)
   192  		}
   193  		lrecvsymkeys = append(lrecvsymkeys, key)
   194  	}
   195  	var rrecvsymkeys []string
   196  	for _, id := range rrecvsymkeyids {
   197  		var key string
   198  		err = clients[1].Call(&key, "pss_getSymmetricKey", id)
   199  		if err != nil {
   200  			t.Fatal(err)
   201  		}
   202  		match := false
   203  		for _, otherkey := range lsendsymkeys {
   204  			if otherkey == key {
   205  				match = true
   206  			}
   207  		}
   208  		if !match {
   209  			t.Fatalf("no match left send for right recv key %s", id)
   210  		}
   211  		rrecvsymkeys = append(rrecvsymkeys, key)
   212  	}
   213  
   214  //发送新的握手请求,不应发送密钥
   215  	err = clients[0].Call(nil, "pss_handshake", rpubkey, topic, false)
   216  	if err == nil {
   217  		t.Fatal("expected full symkey buffer error")
   218  	}
   219  
   220  //使一个密钥过期,发送新的握手请求
   221  	err = clients[0].Call(nil, "pss_releaseHandshakeKey", rpubkey, topic, lsendsymkeyids[0], true)
   222  	if err != nil {
   223  		t.Fatalf("release left send key %s fail: %v", lsendsymkeyids[0], err)
   224  	}
   225  
   226  	var newlhsendkeyids []string
   227  
   228  //发送新的握手请求,现在应该收到一个密钥
   229  //检查它是否不在上一个右recv key数组中
   230  	err = clients[0].Call(&newlhsendkeyids, "pss_handshake", rpubkey, topic, true, false)
   231  	if err != nil {
   232  		t.Fatalf("handshake send fail: %v", err)
   233  	} else if len(newlhsendkeyids) != defaultSymKeyCapacity {
   234  		t.Fatalf("wrong receive count, expected 1, got %d", len(newlhsendkeyids))
   235  	}
   236  
   237  	var newlrecvsymkey string
   238  	err = clients[0].Call(&newlrecvsymkey, "pss_getSymmetricKey", newlhsendkeyids[0])
   239  	if err != nil {
   240  		t.Fatal(err)
   241  	}
   242  	var rmatchsymkeyid *string
   243  	for i, id := range rrecvsymkeyids {
   244  		var key string
   245  		err = clients[1].Call(&key, "pss_getSymmetricKey", id)
   246  		if err != nil {
   247  			t.Fatal(err)
   248  		}
   249  		if newlrecvsymkey == key {
   250  			rmatchsymkeyid = &rrecvsymkeyids[i]
   251  		}
   252  	}
   253  	if rmatchsymkeyid != nil {
   254  		t.Fatalf("right sent old key id %s in second handshake", *rmatchsymkeyid)
   255  	}
   256  
   257  //清理PSS核心密钥库。应该清洗之前释放的钥匙
   258  	var cleancount int
   259  	clients[0].Call(&cleancount, "psstest_clean")
   260  	if cleancount > 1 {
   261  		t.Fatalf("pss clean count mismatch; expected 1, got %d", cleancount)
   262  	}
   263  }
   264