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 }