tls_test.go 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. package scenarios
  2. import (
  3. "net"
  4. "testing"
  5. "time"
  6. "v2ray.com/core"
  7. v2net "v2ray.com/core/common/net"
  8. "v2ray.com/core/common/protocol"
  9. "v2ray.com/core/common/serial"
  10. "v2ray.com/core/common/uuid"
  11. "v2ray.com/core/proxy/dokodemo"
  12. "v2ray.com/core/proxy/freedom"
  13. "v2ray.com/core/proxy/vmess"
  14. "v2ray.com/core/proxy/vmess/inbound"
  15. "v2ray.com/core/proxy/vmess/outbound"
  16. "v2ray.com/core/testing/assert"
  17. "v2ray.com/core/testing/servers/tcp"
  18. tlsgen "v2ray.com/core/testing/tls"
  19. "v2ray.com/core/transport/internet"
  20. "v2ray.com/core/transport/internet/tls"
  21. )
  22. func TestSimpleTLSConnection(t *testing.T) {
  23. assert := assert.On(t)
  24. tcpServer := tcp.Server{
  25. MsgProcessor: xor,
  26. }
  27. dest, err := tcpServer.Start()
  28. assert.Error(err).IsNil()
  29. defer tcpServer.Close()
  30. userID := protocol.NewID(uuid.New())
  31. serverPort := pickPort()
  32. serverConfig := &core.Config{
  33. Inbound: []*core.InboundConnectionConfig{
  34. {
  35. PortRange: v2net.SinglePortRange(serverPort),
  36. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  37. Settings: serial.ToTypedMessage(&inbound.Config{
  38. User: []*protocol.User{
  39. {
  40. Account: serial.ToTypedMessage(&vmess.Account{
  41. Id: userID.String(),
  42. }),
  43. },
  44. },
  45. }),
  46. StreamSettings: &internet.StreamConfig{
  47. SecurityType: serial.GetMessageType(&tls.Config{}),
  48. SecuritySettings: []*serial.TypedMessage{
  49. serial.ToTypedMessage(&tls.Config{
  50. Certificate: []*tls.Certificate{tlsgen.GenerateCertificateForTest()},
  51. }),
  52. },
  53. },
  54. },
  55. },
  56. Outbound: []*core.OutboundConnectionConfig{
  57. {
  58. Settings: serial.ToTypedMessage(&freedom.Config{}),
  59. },
  60. },
  61. }
  62. clientPort := pickPort()
  63. clientConfig := &core.Config{
  64. Inbound: []*core.InboundConnectionConfig{
  65. {
  66. PortRange: v2net.SinglePortRange(clientPort),
  67. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  68. Settings: serial.ToTypedMessage(&dokodemo.Config{
  69. Address: v2net.NewIPOrDomain(dest.Address),
  70. Port: uint32(dest.Port),
  71. NetworkList: &v2net.NetworkList{
  72. Network: []v2net.Network{v2net.Network_TCP},
  73. },
  74. }),
  75. },
  76. },
  77. Outbound: []*core.OutboundConnectionConfig{
  78. {
  79. Settings: serial.ToTypedMessage(&outbound.Config{
  80. Receiver: []*protocol.ServerEndpoint{
  81. {
  82. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  83. Port: uint32(serverPort),
  84. User: []*protocol.User{
  85. {
  86. Account: serial.ToTypedMessage(&vmess.Account{
  87. Id: userID.String(),
  88. }),
  89. },
  90. },
  91. },
  92. },
  93. }),
  94. StreamSettings: &internet.StreamConfig{
  95. SecurityType: serial.GetMessageType(&tls.Config{}),
  96. SecuritySettings: []*serial.TypedMessage{
  97. serial.ToTypedMessage(&tls.Config{
  98. AllowInsecure: true,
  99. }),
  100. },
  101. },
  102. },
  103. },
  104. }
  105. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  106. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  107. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  108. IP: []byte{127, 0, 0, 1},
  109. Port: int(clientPort),
  110. })
  111. assert.Error(err).IsNil()
  112. payload := "dokodemo request."
  113. nBytes, err := conn.Write([]byte(payload))
  114. assert.Error(err).IsNil()
  115. assert.Int(nBytes).Equals(len(payload))
  116. response := readFrom(conn, time.Second*2, len(payload))
  117. assert.Bytes(response).Equals(xor([]byte(payload)))
  118. assert.Error(conn.Close()).IsNil()
  119. CloseAllServers()
  120. }
  121. func TestTLSOverKCP(t *testing.T) {
  122. assert := assert.On(t)
  123. tcpServer := tcp.Server{
  124. MsgProcessor: xor,
  125. }
  126. dest, err := tcpServer.Start()
  127. assert.Error(err).IsNil()
  128. defer tcpServer.Close()
  129. userID := protocol.NewID(uuid.New())
  130. serverPort := pickPort()
  131. serverConfig := &core.Config{
  132. Inbound: []*core.InboundConnectionConfig{
  133. {
  134. PortRange: v2net.SinglePortRange(serverPort),
  135. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  136. Settings: serial.ToTypedMessage(&inbound.Config{
  137. User: []*protocol.User{
  138. {
  139. Account: serial.ToTypedMessage(&vmess.Account{
  140. Id: userID.String(),
  141. }),
  142. },
  143. },
  144. }),
  145. StreamSettings: &internet.StreamConfig{
  146. Protocol: internet.TransportProtocol_MKCP,
  147. SecurityType: serial.GetMessageType(&tls.Config{}),
  148. SecuritySettings: []*serial.TypedMessage{
  149. serial.ToTypedMessage(&tls.Config{
  150. Certificate: []*tls.Certificate{tlsgen.GenerateCertificateForTest()},
  151. }),
  152. },
  153. },
  154. },
  155. },
  156. Outbound: []*core.OutboundConnectionConfig{
  157. {
  158. Settings: serial.ToTypedMessage(&freedom.Config{}),
  159. },
  160. },
  161. }
  162. clientPort := pickPort()
  163. clientConfig := &core.Config{
  164. Inbound: []*core.InboundConnectionConfig{
  165. {
  166. PortRange: v2net.SinglePortRange(clientPort),
  167. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  168. Settings: serial.ToTypedMessage(&dokodemo.Config{
  169. Address: v2net.NewIPOrDomain(dest.Address),
  170. Port: uint32(dest.Port),
  171. NetworkList: &v2net.NetworkList{
  172. Network: []v2net.Network{v2net.Network_TCP},
  173. },
  174. }),
  175. },
  176. },
  177. Outbound: []*core.OutboundConnectionConfig{
  178. {
  179. Settings: serial.ToTypedMessage(&outbound.Config{
  180. Receiver: []*protocol.ServerEndpoint{
  181. {
  182. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  183. Port: uint32(serverPort),
  184. User: []*protocol.User{
  185. {
  186. Account: serial.ToTypedMessage(&vmess.Account{
  187. Id: userID.String(),
  188. }),
  189. },
  190. },
  191. },
  192. },
  193. }),
  194. StreamSettings: &internet.StreamConfig{
  195. Protocol: internet.TransportProtocol_MKCP,
  196. SecurityType: serial.GetMessageType(&tls.Config{}),
  197. SecuritySettings: []*serial.TypedMessage{
  198. serial.ToTypedMessage(&tls.Config{
  199. AllowInsecure: true,
  200. }),
  201. },
  202. },
  203. },
  204. },
  205. }
  206. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  207. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  208. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  209. IP: []byte{127, 0, 0, 1},
  210. Port: int(clientPort),
  211. })
  212. assert.Error(err).IsNil()
  213. payload := "dokodemo request."
  214. nBytes, err := conn.Write([]byte(payload))
  215. assert.Error(err).IsNil()
  216. assert.Int(nBytes).Equals(len(payload))
  217. response := readFrom(conn, time.Second*2, len(payload))
  218. assert.Bytes(response).Equals(xor([]byte(payload)))
  219. assert.Error(conn.Close()).IsNil()
  220. CloseAllServers()
  221. }
  222. func TestTLSConnectionReuse(t *testing.T) {
  223. assert := assert.On(t)
  224. tcpServer := tcp.Server{
  225. MsgProcessor: xor,
  226. }
  227. dest, err := tcpServer.Start()
  228. assert.Error(err).IsNil()
  229. defer tcpServer.Close()
  230. userID := protocol.NewID(uuid.New())
  231. serverPort := pickPort()
  232. serverConfig := &core.Config{
  233. Inbound: []*core.InboundConnectionConfig{
  234. {
  235. PortRange: v2net.SinglePortRange(serverPort),
  236. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  237. Settings: serial.ToTypedMessage(&inbound.Config{
  238. User: []*protocol.User{
  239. {
  240. Account: serial.ToTypedMessage(&vmess.Account{
  241. Id: userID.String(),
  242. }),
  243. },
  244. },
  245. }),
  246. StreamSettings: &internet.StreamConfig{
  247. SecurityType: serial.GetMessageType(&tls.Config{}),
  248. SecuritySettings: []*serial.TypedMessage{
  249. serial.ToTypedMessage(&tls.Config{
  250. Certificate: []*tls.Certificate{tlsgen.GenerateCertificateForTest()},
  251. }),
  252. },
  253. },
  254. },
  255. },
  256. Outbound: []*core.OutboundConnectionConfig{
  257. {
  258. Settings: serial.ToTypedMessage(&freedom.Config{}),
  259. },
  260. },
  261. }
  262. clientPort := pickPort()
  263. clientConfig := &core.Config{
  264. Inbound: []*core.InboundConnectionConfig{
  265. {
  266. PortRange: v2net.SinglePortRange(clientPort),
  267. ListenOn: v2net.NewIPOrDomain(v2net.LocalHostIP),
  268. Settings: serial.ToTypedMessage(&dokodemo.Config{
  269. Address: v2net.NewIPOrDomain(dest.Address),
  270. Port: uint32(dest.Port),
  271. NetworkList: &v2net.NetworkList{
  272. Network: []v2net.Network{v2net.Network_TCP},
  273. },
  274. }),
  275. },
  276. },
  277. Outbound: []*core.OutboundConnectionConfig{
  278. {
  279. Settings: serial.ToTypedMessage(&outbound.Config{
  280. Receiver: []*protocol.ServerEndpoint{
  281. {
  282. Address: v2net.NewIPOrDomain(v2net.LocalHostIP),
  283. Port: uint32(serverPort),
  284. User: []*protocol.User{
  285. {
  286. Account: serial.ToTypedMessage(&vmess.Account{
  287. Id: userID.String(),
  288. }),
  289. },
  290. },
  291. },
  292. },
  293. }),
  294. StreamSettings: &internet.StreamConfig{
  295. SecurityType: serial.GetMessageType(&tls.Config{}),
  296. SecuritySettings: []*serial.TypedMessage{
  297. serial.ToTypedMessage(&tls.Config{
  298. AllowInsecure: true,
  299. }),
  300. },
  301. },
  302. },
  303. },
  304. }
  305. assert.Error(InitializeServerConfig(serverConfig)).IsNil()
  306. assert.Error(InitializeServerConfig(clientConfig)).IsNil()
  307. for i := 0; i < 5; i++ {
  308. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  309. IP: []byte{127, 0, 0, 1},
  310. Port: int(clientPort),
  311. })
  312. assert.Error(err).IsNil()
  313. payload := "dokodemo request."
  314. nBytes, err := conn.Write([]byte(payload))
  315. assert.Error(err).IsNil()
  316. assert.Int(nBytes).Equals(len(payload))
  317. response := readFrom(conn, time.Second*2, len(payload))
  318. assert.Bytes(response).Equals(xor([]byte(payload)))
  319. assert.Error(conn.Close()).IsNil()
  320. }
  321. time.Sleep(time.Second * 10)
  322. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  323. IP: []byte{127, 0, 0, 1},
  324. Port: int(clientPort),
  325. })
  326. assert.Error(err).IsNil()
  327. payload := "dokodemo request."
  328. nBytes, err := conn.Write([]byte(payload))
  329. assert.Error(err).IsNil()
  330. assert.Int(nBytes).Equals(len(payload))
  331. response := readFrom(conn, time.Second*2, len(payload))
  332. assert.Bytes(response).Equals(xor([]byte(payload)))
  333. assert.Error(conn.Close()).IsNil()
  334. CloseAllServers()
  335. }