handshake_test.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. // Copyright 2018 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. package pss
  17. import (
  18. "strconv"
  19. "strings"
  20. "testing"
  21. "time"
  22. "github.com/ethereum/go-ethereum/swarm/log"
  23. )
  24. // asymmetrical key exchange between two directly connected peers
  25. // full address, partial address (8 bytes) and empty address
  26. func TestHandshake(t *testing.T) {
  27. t.Skip("Handshakes have not been maintained for a longer period, and have started to fail. They should be reviewed and possible removed.")
  28. t.Run("32", testHandshake)
  29. t.Run("8", testHandshake)
  30. t.Run("0", testHandshake)
  31. }
  32. func testHandshake(t *testing.T) {
  33. // how much of the address we will use
  34. useHandshake = true
  35. var addrsize int64
  36. var err error
  37. addrsizestring := strings.Split(t.Name(), "/")
  38. addrsize, _ = strconv.ParseInt(addrsizestring[1], 10, 0)
  39. // set up two nodes directly connected
  40. // (we are not testing pss routing here)
  41. clients, err := setupNetwork(2, true)
  42. if err != nil {
  43. t.Fatal(err)
  44. }
  45. var topic string
  46. err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42")
  47. if err != nil {
  48. t.Fatal(err)
  49. }
  50. var loaddr string
  51. err = clients[0].Call(&loaddr, "pss_baseAddr")
  52. if err != nil {
  53. t.Fatalf("rpc get node 1 baseaddr fail: %v", err)
  54. }
  55. // "0x" = 2 bytes + addrsize address bytes which in hex is 2x length
  56. loaddr = loaddr[:2+(addrsize*2)]
  57. var roaddr string
  58. err = clients[1].Call(&roaddr, "pss_baseAddr")
  59. if err != nil {
  60. t.Fatalf("rpc get node 2 baseaddr fail: %v", err)
  61. }
  62. roaddr = roaddr[:2+(addrsize*2)]
  63. log.Debug("addresses", "left", loaddr, "right", roaddr)
  64. // retrieve public key from pss instance
  65. // set this public key reciprocally
  66. var lpubkey string
  67. err = clients[0].Call(&lpubkey, "pss_getPublicKey")
  68. if err != nil {
  69. t.Fatalf("rpc get node 1 pubkey fail: %v", err)
  70. }
  71. var rpubkey string
  72. err = clients[1].Call(&rpubkey, "pss_getPublicKey")
  73. if err != nil {
  74. t.Fatalf("rpc get node 2 pubkey fail: %v", err)
  75. }
  76. time.Sleep(time.Millisecond * 1000) // replace with hive healthy code
  77. // give each node its peer's public key
  78. err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddr)
  79. if err != nil {
  80. t.Fatal(err)
  81. }
  82. err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddr)
  83. if err != nil {
  84. t.Fatal(err)
  85. }
  86. // perform the handshake
  87. // after this each side will have defaultSymKeyBufferCapacity symkeys each for in- and outgoing messages:
  88. // L -> request 4 keys -> R
  89. // L <- send 4 keys, request 4 keys <- R
  90. // L -> send 4 keys -> R
  91. // the call will fill the array with symkeys L needs for sending to R
  92. err = clients[0].Call(nil, "pss_addHandshake", topic)
  93. if err != nil {
  94. t.Fatal(err)
  95. }
  96. err = clients[1].Call(nil, "pss_addHandshake", topic)
  97. if err != nil {
  98. t.Fatal(err)
  99. }
  100. var lhsendsymkeyids []string
  101. err = clients[0].Call(&lhsendsymkeyids, "pss_handshake", rpubkey, topic, true, true)
  102. if err != nil {
  103. t.Fatal(err)
  104. }
  105. // make sure the r-node gets its keys
  106. time.Sleep(time.Second)
  107. // check if we have 6 outgoing keys stored, and they match what was received from R
  108. var lsendsymkeyids []string
  109. err = clients[0].Call(&lsendsymkeyids, "pss_getHandshakeKeys", rpubkey, topic, false, true)
  110. if err != nil {
  111. t.Fatal(err)
  112. }
  113. m := 0
  114. for _, hid := range lhsendsymkeyids {
  115. for _, lid := range lsendsymkeyids {
  116. if lid == hid {
  117. m++
  118. }
  119. }
  120. }
  121. if m != defaultSymKeyCapacity {
  122. t.Fatalf("buffer size mismatch, expected %d, have %d: %v", defaultSymKeyCapacity, m, lsendsymkeyids)
  123. }
  124. // check if in- and outgoing keys on l-node and r-node match up and are in opposite categories (l recv = r send, l send = r recv)
  125. var rsendsymkeyids []string
  126. err = clients[1].Call(&rsendsymkeyids, "pss_getHandshakeKeys", lpubkey, topic, false, true)
  127. if err != nil {
  128. t.Fatal(err)
  129. }
  130. var lrecvsymkeyids []string
  131. err = clients[0].Call(&lrecvsymkeyids, "pss_getHandshakeKeys", rpubkey, topic, true, false)
  132. if err != nil {
  133. t.Fatal(err)
  134. }
  135. var rrecvsymkeyids []string
  136. err = clients[1].Call(&rrecvsymkeyids, "pss_getHandshakeKeys", lpubkey, topic, true, false)
  137. if err != nil {
  138. t.Fatal(err)
  139. }
  140. // get outgoing symkeys in byte form from both sides
  141. var lsendsymkeys []string
  142. for _, id := range lsendsymkeyids {
  143. var key string
  144. err = clients[0].Call(&key, "pss_getSymmetricKey", id)
  145. if err != nil {
  146. t.Fatal(err)
  147. }
  148. lsendsymkeys = append(lsendsymkeys, key)
  149. }
  150. var rsendsymkeys []string
  151. for _, id := range rsendsymkeyids {
  152. var key string
  153. err = clients[1].Call(&key, "pss_getSymmetricKey", id)
  154. if err != nil {
  155. t.Fatal(err)
  156. }
  157. rsendsymkeys = append(rsendsymkeys, key)
  158. }
  159. // get incoming symkeys in byte form from both sides and compare
  160. var lrecvsymkeys []string
  161. for _, id := range lrecvsymkeyids {
  162. var key string
  163. err = clients[0].Call(&key, "pss_getSymmetricKey", id)
  164. if err != nil {
  165. t.Fatal(err)
  166. }
  167. match := false
  168. for _, otherkey := range rsendsymkeys {
  169. if otherkey == key {
  170. match = true
  171. }
  172. }
  173. if !match {
  174. t.Fatalf("no match right send for left recv key %s", id)
  175. }
  176. lrecvsymkeys = append(lrecvsymkeys, key)
  177. }
  178. var rrecvsymkeys []string
  179. for _, id := range rrecvsymkeyids {
  180. var key string
  181. err = clients[1].Call(&key, "pss_getSymmetricKey", id)
  182. if err != nil {
  183. t.Fatal(err)
  184. }
  185. match := false
  186. for _, otherkey := range lsendsymkeys {
  187. if otherkey == key {
  188. match = true
  189. }
  190. }
  191. if !match {
  192. t.Fatalf("no match left send for right recv key %s", id)
  193. }
  194. rrecvsymkeys = append(rrecvsymkeys, key)
  195. }
  196. // send new handshake request, should send no keys
  197. err = clients[0].Call(nil, "pss_handshake", rpubkey, topic, false)
  198. if err == nil {
  199. t.Fatal("expected full symkey buffer error")
  200. }
  201. // expire one key, send new handshake request
  202. err = clients[0].Call(nil, "pss_releaseHandshakeKey", rpubkey, topic, lsendsymkeyids[0], true)
  203. if err != nil {
  204. t.Fatalf("release left send key %s fail: %v", lsendsymkeyids[0], err)
  205. }
  206. var newlhsendkeyids []string
  207. // send new handshake request, should now receive one key
  208. // check that it is not in previous right recv key array
  209. err = clients[0].Call(&newlhsendkeyids, "pss_handshake", rpubkey, topic, true, false)
  210. if err != nil {
  211. t.Fatalf("handshake send fail: %v", err)
  212. } else if len(newlhsendkeyids) != defaultSymKeyCapacity {
  213. t.Fatalf("wrong receive count, expected 1, got %d", len(newlhsendkeyids))
  214. }
  215. var newlrecvsymkey string
  216. err = clients[0].Call(&newlrecvsymkey, "pss_getSymmetricKey", newlhsendkeyids[0])
  217. if err != nil {
  218. t.Fatal(err)
  219. }
  220. var rmatchsymkeyid *string
  221. for i, id := range rrecvsymkeyids {
  222. var key string
  223. err = clients[1].Call(&key, "pss_getSymmetricKey", id)
  224. if err != nil {
  225. t.Fatal(err)
  226. }
  227. if newlrecvsymkey == key {
  228. rmatchsymkeyid = &rrecvsymkeyids[i]
  229. }
  230. }
  231. if rmatchsymkeyid != nil {
  232. t.Fatalf("right sent old key id %s in second handshake", *rmatchsymkeyid)
  233. }
  234. // clean the pss core keystore. Should clean the key released earlier
  235. var cleancount int
  236. clients[0].Call(&cleancount, "psstest_clean")
  237. if cleancount > 1 {
  238. t.Fatalf("pss clean count mismatch; expected 1, got %d", cleancount)
  239. }
  240. }