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