shadowsocks_test.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855
  1. package scenarios
  2. import (
  3. "crypto/rand"
  4. "fmt"
  5. "sync"
  6. "testing"
  7. "time"
  8. "v2ray.com/core"
  9. "v2ray.com/core/app/log"
  10. "v2ray.com/core/app/proxyman"
  11. "v2ray.com/core/common/buf"
  12. clog "v2ray.com/core/common/log"
  13. "v2ray.com/core/common/net"
  14. "v2ray.com/core/common/protocol"
  15. "v2ray.com/core/common/serial"
  16. "v2ray.com/core/proxy/dokodemo"
  17. "v2ray.com/core/proxy/freedom"
  18. "v2ray.com/core/proxy/shadowsocks"
  19. "v2ray.com/core/testing/servers/tcp"
  20. "v2ray.com/core/testing/servers/udp"
  21. . "v2ray.com/ext/assert"
  22. ss "github.com/shadowsocks/go-shadowsocks2/core"
  23. )
  24. func TestShadowsocksAES256TCP(t *testing.T) {
  25. assert := With(t)
  26. tcpServer := tcp.Server{
  27. MsgProcessor: xor,
  28. }
  29. dest, err := tcpServer.Start()
  30. assert(err, IsNil)
  31. defer tcpServer.Close()
  32. account := serial.ToTypedMessage(&shadowsocks.Account{
  33. Password: "shadowsocks-password",
  34. CipherType: shadowsocks.CipherType_AES_256_CFB,
  35. Ota: shadowsocks.Account_Enabled,
  36. })
  37. serverPort := tcp.PickPort()
  38. serverConfig := &core.Config{
  39. App: []*serial.TypedMessage{
  40. serial.ToTypedMessage(&log.Config{
  41. ErrorLogLevel: clog.Severity_Debug,
  42. ErrorLogType: log.LogType_Console,
  43. }),
  44. },
  45. Inbound: []*core.InboundHandlerConfig{
  46. {
  47. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  48. PortRange: net.SinglePortRange(serverPort),
  49. Listen: net.NewIPOrDomain(net.LocalHostIP),
  50. }),
  51. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  52. User: &protocol.User{
  53. Account: account,
  54. Level: 1,
  55. },
  56. }),
  57. },
  58. },
  59. Outbound: []*core.OutboundHandlerConfig{
  60. {
  61. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  62. },
  63. },
  64. }
  65. clientPort := tcp.PickPort()
  66. clientConfig := &core.Config{
  67. App: []*serial.TypedMessage{
  68. serial.ToTypedMessage(&log.Config{
  69. ErrorLogLevel: clog.Severity_Debug,
  70. ErrorLogType: log.LogType_Console,
  71. }),
  72. },
  73. Inbound: []*core.InboundHandlerConfig{
  74. {
  75. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  76. PortRange: net.SinglePortRange(clientPort),
  77. Listen: net.NewIPOrDomain(net.LocalHostIP),
  78. }),
  79. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  80. Address: net.NewIPOrDomain(dest.Address),
  81. Port: uint32(dest.Port),
  82. NetworkList: &net.NetworkList{
  83. Network: []net.Network{net.Network_TCP},
  84. },
  85. }),
  86. },
  87. },
  88. Outbound: []*core.OutboundHandlerConfig{
  89. {
  90. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  91. Server: []*protocol.ServerEndpoint{
  92. {
  93. Address: net.NewIPOrDomain(net.LocalHostIP),
  94. Port: uint32(serverPort),
  95. User: []*protocol.User{
  96. {
  97. Account: account,
  98. },
  99. },
  100. },
  101. },
  102. }),
  103. },
  104. },
  105. }
  106. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  107. assert(err, IsNil)
  108. var wg sync.WaitGroup
  109. wg.Add(10)
  110. for i := 0; i < 10; i++ {
  111. go func() {
  112. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  113. IP: []byte{127, 0, 0, 1},
  114. Port: int(clientPort),
  115. })
  116. assert(err, IsNil)
  117. payload := make([]byte, 10240*1024)
  118. rand.Read(payload)
  119. nBytes, err := conn.Write([]byte(payload))
  120. assert(err, IsNil)
  121. assert(nBytes, Equals, len(payload))
  122. response := readFrom(conn, time.Second*20, 10240*1024)
  123. assert(response, Equals, xor([]byte(payload)))
  124. assert(conn.Close(), IsNil)
  125. wg.Done()
  126. }()
  127. }
  128. wg.Wait()
  129. CloseAllServers(servers)
  130. }
  131. func TestShadowsocksAES128UDP(t *testing.T) {
  132. assert := With(t)
  133. udpServer := udp.Server{
  134. MsgProcessor: xor,
  135. }
  136. dest, err := udpServer.Start()
  137. assert(err, IsNil)
  138. defer udpServer.Close()
  139. account := serial.ToTypedMessage(&shadowsocks.Account{
  140. Password: "shadowsocks-password",
  141. CipherType: shadowsocks.CipherType_AES_128_CFB,
  142. Ota: shadowsocks.Account_Enabled,
  143. })
  144. serverPort := tcp.PickPort()
  145. serverConfig := &core.Config{
  146. App: []*serial.TypedMessage{
  147. serial.ToTypedMessage(&log.Config{
  148. ErrorLogLevel: clog.Severity_Debug,
  149. ErrorLogType: log.LogType_Console,
  150. }),
  151. },
  152. Inbound: []*core.InboundHandlerConfig{
  153. {
  154. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  155. PortRange: net.SinglePortRange(serverPort),
  156. Listen: net.NewIPOrDomain(net.LocalHostIP),
  157. }),
  158. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  159. UdpEnabled: true,
  160. User: &protocol.User{
  161. Account: account,
  162. Level: 1,
  163. },
  164. }),
  165. },
  166. },
  167. Outbound: []*core.OutboundHandlerConfig{
  168. {
  169. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  170. },
  171. },
  172. }
  173. clientPort := tcp.PickPort()
  174. clientConfig := &core.Config{
  175. App: []*serial.TypedMessage{
  176. serial.ToTypedMessage(&log.Config{
  177. ErrorLogLevel: clog.Severity_Debug,
  178. ErrorLogType: log.LogType_Console,
  179. }),
  180. },
  181. Inbound: []*core.InboundHandlerConfig{
  182. {
  183. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  184. PortRange: net.SinglePortRange(clientPort),
  185. Listen: net.NewIPOrDomain(net.LocalHostIP),
  186. }),
  187. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  188. Address: net.NewIPOrDomain(dest.Address),
  189. Port: uint32(dest.Port),
  190. NetworkList: &net.NetworkList{
  191. Network: []net.Network{net.Network_UDP},
  192. },
  193. }),
  194. },
  195. },
  196. Outbound: []*core.OutboundHandlerConfig{
  197. {
  198. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  199. Server: []*protocol.ServerEndpoint{
  200. {
  201. Address: net.NewIPOrDomain(net.LocalHostIP),
  202. Port: uint32(serverPort),
  203. User: []*protocol.User{
  204. {
  205. Account: account,
  206. },
  207. },
  208. },
  209. },
  210. }),
  211. },
  212. },
  213. }
  214. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  215. assert(err, IsNil)
  216. var wg sync.WaitGroup
  217. wg.Add(10)
  218. for i := 0; i < 10; i++ {
  219. go func() {
  220. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  221. IP: []byte{127, 0, 0, 1},
  222. Port: int(clientPort),
  223. })
  224. assert(err, IsNil)
  225. payload := make([]byte, 1024)
  226. rand.Read(payload)
  227. nBytes, err := conn.Write([]byte(payload))
  228. assert(err, IsNil)
  229. assert(nBytes, Equals, len(payload))
  230. response := readFrom(conn, time.Second*5, 1024)
  231. assert(response, Equals, xor([]byte(payload)))
  232. assert(conn.Close(), IsNil)
  233. wg.Done()
  234. }()
  235. }
  236. wg.Wait()
  237. CloseAllServers(servers)
  238. }
  239. func TestShadowsocksChacha20TCP(t *testing.T) {
  240. assert := With(t)
  241. tcpServer := tcp.Server{
  242. MsgProcessor: xor,
  243. }
  244. dest, err := tcpServer.Start()
  245. assert(err, IsNil)
  246. defer tcpServer.Close()
  247. account := serial.ToTypedMessage(&shadowsocks.Account{
  248. Password: "shadowsocks-password",
  249. CipherType: shadowsocks.CipherType_CHACHA20_IETF,
  250. Ota: shadowsocks.Account_Enabled,
  251. })
  252. serverPort := tcp.PickPort()
  253. serverConfig := &core.Config{
  254. App: []*serial.TypedMessage{
  255. serial.ToTypedMessage(&log.Config{
  256. ErrorLogLevel: clog.Severity_Debug,
  257. ErrorLogType: log.LogType_Console,
  258. }),
  259. },
  260. Inbound: []*core.InboundHandlerConfig{
  261. {
  262. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  263. PortRange: net.SinglePortRange(serverPort),
  264. Listen: net.NewIPOrDomain(net.LocalHostIP),
  265. }),
  266. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  267. User: &protocol.User{
  268. Account: account,
  269. Level: 1,
  270. },
  271. }),
  272. },
  273. },
  274. Outbound: []*core.OutboundHandlerConfig{
  275. {
  276. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  277. },
  278. },
  279. }
  280. clientPort := tcp.PickPort()
  281. clientConfig := &core.Config{
  282. App: []*serial.TypedMessage{
  283. serial.ToTypedMessage(&log.Config{
  284. ErrorLogLevel: clog.Severity_Debug,
  285. ErrorLogType: log.LogType_Console,
  286. }),
  287. },
  288. Inbound: []*core.InboundHandlerConfig{
  289. {
  290. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  291. PortRange: net.SinglePortRange(clientPort),
  292. Listen: net.NewIPOrDomain(net.LocalHostIP),
  293. }),
  294. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  295. Address: net.NewIPOrDomain(dest.Address),
  296. Port: uint32(dest.Port),
  297. NetworkList: &net.NetworkList{
  298. Network: []net.Network{net.Network_TCP},
  299. },
  300. }),
  301. },
  302. },
  303. Outbound: []*core.OutboundHandlerConfig{
  304. {
  305. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  306. Server: []*protocol.ServerEndpoint{
  307. {
  308. Address: net.NewIPOrDomain(net.LocalHostIP),
  309. Port: uint32(serverPort),
  310. User: []*protocol.User{
  311. {
  312. Account: account,
  313. },
  314. },
  315. },
  316. },
  317. }),
  318. },
  319. },
  320. }
  321. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  322. assert(err, IsNil)
  323. var wg sync.WaitGroup
  324. wg.Add(10)
  325. for i := 0; i < 10; i++ {
  326. go func() {
  327. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  328. IP: []byte{127, 0, 0, 1},
  329. Port: int(clientPort),
  330. })
  331. assert(err, IsNil)
  332. payload := make([]byte, 10240*1024)
  333. rand.Read(payload)
  334. nBytes, err := conn.Write([]byte(payload))
  335. assert(err, IsNil)
  336. assert(nBytes, Equals, len(payload))
  337. response := readFrom(conn, time.Second*20, 10240*1024)
  338. assert(response, Equals, xor([]byte(payload)))
  339. assert(conn.Close(), IsNil)
  340. wg.Done()
  341. }()
  342. }
  343. wg.Wait()
  344. CloseAllServers(servers)
  345. }
  346. func TestShadowsocksAES256GCMTCP(t *testing.T) {
  347. assert := With(t)
  348. tcpServer := tcp.Server{
  349. MsgProcessor: xor,
  350. }
  351. dest, err := tcpServer.Start()
  352. assert(err, IsNil)
  353. defer tcpServer.Close()
  354. account := serial.ToTypedMessage(&shadowsocks.Account{
  355. Password: "shadowsocks-password",
  356. CipherType: shadowsocks.CipherType_AES_256_GCM,
  357. })
  358. serverPort := tcp.PickPort()
  359. serverConfig := &core.Config{
  360. App: []*serial.TypedMessage{
  361. serial.ToTypedMessage(&log.Config{
  362. ErrorLogLevel: clog.Severity_Debug,
  363. ErrorLogType: log.LogType_Console,
  364. }),
  365. },
  366. Inbound: []*core.InboundHandlerConfig{
  367. {
  368. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  369. PortRange: net.SinglePortRange(serverPort),
  370. Listen: net.NewIPOrDomain(net.LocalHostIP),
  371. }),
  372. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  373. User: &protocol.User{
  374. Account: account,
  375. Level: 1,
  376. },
  377. }),
  378. },
  379. },
  380. Outbound: []*core.OutboundHandlerConfig{
  381. {
  382. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  383. },
  384. },
  385. }
  386. clientPort := tcp.PickPort()
  387. clientConfig := &core.Config{
  388. App: []*serial.TypedMessage{
  389. serial.ToTypedMessage(&log.Config{
  390. ErrorLogLevel: clog.Severity_Debug,
  391. ErrorLogType: log.LogType_Console,
  392. }),
  393. },
  394. Inbound: []*core.InboundHandlerConfig{
  395. {
  396. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  397. PortRange: net.SinglePortRange(clientPort),
  398. Listen: net.NewIPOrDomain(net.LocalHostIP),
  399. }),
  400. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  401. Address: net.NewIPOrDomain(dest.Address),
  402. Port: uint32(dest.Port),
  403. NetworkList: &net.NetworkList{
  404. Network: []net.Network{net.Network_TCP},
  405. },
  406. }),
  407. },
  408. },
  409. Outbound: []*core.OutboundHandlerConfig{
  410. {
  411. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  412. Server: []*protocol.ServerEndpoint{
  413. {
  414. Address: net.NewIPOrDomain(net.LocalHostIP),
  415. Port: uint32(serverPort),
  416. User: []*protocol.User{
  417. {
  418. Account: account,
  419. },
  420. },
  421. },
  422. },
  423. }),
  424. },
  425. },
  426. }
  427. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  428. assert(err, IsNil)
  429. var wg sync.WaitGroup
  430. wg.Add(10)
  431. for i := 0; i < 10; i++ {
  432. go func() {
  433. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  434. IP: []byte{127, 0, 0, 1},
  435. Port: int(clientPort),
  436. })
  437. assert(err, IsNil)
  438. payload := make([]byte, 10240*1024)
  439. rand.Read(payload)
  440. nBytes, err := conn.Write([]byte(payload))
  441. assert(err, IsNil)
  442. assert(nBytes, Equals, len(payload))
  443. response := readFrom(conn, time.Second*20, 10240*1024)
  444. assert(response, Equals, xor([]byte(payload)))
  445. assert(conn.Close(), IsNil)
  446. wg.Done()
  447. }()
  448. }
  449. wg.Wait()
  450. CloseAllServers(servers)
  451. }
  452. func TestShadowsocksAES128GCMUDP(t *testing.T) {
  453. assert := With(t)
  454. udpServer := udp.Server{
  455. MsgProcessor: xor,
  456. }
  457. dest, err := udpServer.Start()
  458. assert(err, IsNil)
  459. defer udpServer.Close()
  460. account := serial.ToTypedMessage(&shadowsocks.Account{
  461. Password: "shadowsocks-password",
  462. CipherType: shadowsocks.CipherType_AES_128_GCM,
  463. })
  464. serverPort := tcp.PickPort()
  465. serverConfig := &core.Config{
  466. App: []*serial.TypedMessage{
  467. serial.ToTypedMessage(&log.Config{
  468. ErrorLogLevel: clog.Severity_Debug,
  469. ErrorLogType: log.LogType_Console,
  470. }),
  471. },
  472. Inbound: []*core.InboundHandlerConfig{
  473. {
  474. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  475. PortRange: net.SinglePortRange(serverPort),
  476. Listen: net.NewIPOrDomain(net.LocalHostIP),
  477. }),
  478. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  479. UdpEnabled: true,
  480. User: &protocol.User{
  481. Account: account,
  482. Level: 1,
  483. },
  484. }),
  485. },
  486. },
  487. Outbound: []*core.OutboundHandlerConfig{
  488. {
  489. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  490. },
  491. },
  492. }
  493. clientPort := tcp.PickPort()
  494. clientConfig := &core.Config{
  495. App: []*serial.TypedMessage{
  496. serial.ToTypedMessage(&log.Config{
  497. ErrorLogLevel: clog.Severity_Debug,
  498. ErrorLogType: log.LogType_Console,
  499. }),
  500. },
  501. Inbound: []*core.InboundHandlerConfig{
  502. {
  503. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  504. PortRange: net.SinglePortRange(clientPort),
  505. Listen: net.NewIPOrDomain(net.LocalHostIP),
  506. }),
  507. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  508. Address: net.NewIPOrDomain(dest.Address),
  509. Port: uint32(dest.Port),
  510. NetworkList: &net.NetworkList{
  511. Network: []net.Network{net.Network_UDP},
  512. },
  513. }),
  514. },
  515. },
  516. Outbound: []*core.OutboundHandlerConfig{
  517. {
  518. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  519. Server: []*protocol.ServerEndpoint{
  520. {
  521. Address: net.NewIPOrDomain(net.LocalHostIP),
  522. Port: uint32(serverPort),
  523. User: []*protocol.User{
  524. {
  525. Account: account,
  526. },
  527. },
  528. },
  529. },
  530. }),
  531. },
  532. },
  533. }
  534. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  535. assert(err, IsNil)
  536. var wg sync.WaitGroup
  537. wg.Add(10)
  538. for i := 0; i < 10; i++ {
  539. go func() {
  540. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  541. IP: []byte{127, 0, 0, 1},
  542. Port: int(clientPort),
  543. })
  544. assert(err, IsNil)
  545. payload := make([]byte, 1024)
  546. rand.Read(payload)
  547. nBytes, err := conn.Write([]byte(payload))
  548. assert(err, IsNil)
  549. assert(nBytes, Equals, len(payload))
  550. response := readFrom(conn, time.Second*5, 1024)
  551. assert(response, Equals, xor([]byte(payload)))
  552. assert(conn.Close(), IsNil)
  553. wg.Done()
  554. }()
  555. }
  556. wg.Wait()
  557. CloseAllServers(servers)
  558. }
  559. func TestShadowsocksAES256GCMConformance(t *testing.T) {
  560. assert := With(t)
  561. tcpServer := tcp.Server{
  562. MsgProcessor: xor,
  563. }
  564. dest, err := tcpServer.Start()
  565. assert(err, IsNil)
  566. defer tcpServer.Close()
  567. account := serial.ToTypedMessage(&shadowsocks.Account{
  568. Password: "ss-password",
  569. CipherType: shadowsocks.CipherType_AES_256_GCM,
  570. })
  571. serverPort := tcp.PickPort()
  572. serverConfig := &core.Config{
  573. App: []*serial.TypedMessage{
  574. serial.ToTypedMessage(&log.Config{
  575. ErrorLogLevel: clog.Severity_Debug,
  576. ErrorLogType: log.LogType_Console,
  577. }),
  578. },
  579. Inbound: []*core.InboundHandlerConfig{
  580. {
  581. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  582. PortRange: net.SinglePortRange(serverPort),
  583. Listen: net.NewIPOrDomain(net.LocalHostIP),
  584. }),
  585. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  586. User: &protocol.User{
  587. Account: account,
  588. Level: 1,
  589. },
  590. }),
  591. },
  592. },
  593. Outbound: []*core.OutboundHandlerConfig{
  594. {
  595. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  596. },
  597. },
  598. }
  599. servers, err := InitializeServerConfigs(serverConfig)
  600. assert(err, IsNil)
  601. var wg sync.WaitGroup
  602. wg.Add(10)
  603. for i := 0; i < 10; i++ {
  604. go func() {
  605. cipher, err := ss.PickCipher("AES-256-GCM", nil, "ss-password")
  606. assert(err, IsNil)
  607. conn, err := ss.Dial("tcp", fmt.Sprintf(":%d", serverPort), cipher)
  608. assert(err, IsNil)
  609. _, err = conn.Write([]byte{1, 127, 0, 0, 1})
  610. assert(err, IsNil)
  611. _, err = conn.Write(serial.Uint16ToBytes(dest.Port.Value(), nil))
  612. assert(err, IsNil)
  613. payload := make([]byte, 10240*1024)
  614. rand.Read(payload)
  615. nBytes, err := conn.Write([]byte(payload))
  616. assert(err, IsNil)
  617. assert(nBytes, Equals, len(payload))
  618. response := readFrom(conn, time.Second*30, 10240*1024)
  619. assert(response, Equals, xor([]byte(payload)))
  620. assert(conn.Close(), IsNil)
  621. wg.Done()
  622. }()
  623. }
  624. wg.Wait()
  625. CloseAllServers(servers)
  626. }
  627. func TestShadowsocksChacha20Poly1305UDPConformance(t *testing.T) {
  628. assert := With(t)
  629. udpServer := udp.Server{
  630. MsgProcessor: xor,
  631. }
  632. dest, err := udpServer.Start()
  633. assert(err, IsNil)
  634. defer udpServer.Close()
  635. account := serial.ToTypedMessage(&shadowsocks.Account{
  636. Password: "ss-password",
  637. CipherType: shadowsocks.CipherType_CHACHA20_POLY1305,
  638. })
  639. serverPort := tcp.PickPort()
  640. serverConfig := &core.Config{
  641. App: []*serial.TypedMessage{
  642. serial.ToTypedMessage(&log.Config{
  643. ErrorLogLevel: clog.Severity_Debug,
  644. ErrorLogType: log.LogType_Console,
  645. }),
  646. },
  647. Inbound: []*core.InboundHandlerConfig{
  648. {
  649. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  650. PortRange: net.SinglePortRange(serverPort),
  651. Listen: net.NewIPOrDomain(net.LocalHostIP),
  652. }),
  653. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  654. UdpEnabled: true,
  655. User: &protocol.User{
  656. Account: account,
  657. Level: 1,
  658. },
  659. }),
  660. },
  661. },
  662. Outbound: []*core.OutboundHandlerConfig{
  663. {
  664. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  665. },
  666. },
  667. }
  668. servers, err := InitializeServerConfigs(serverConfig)
  669. assert(err, IsNil)
  670. cipher, err := ss.PickCipher("CHACHA20-IETF-POLY1305", nil, "ss-password")
  671. assert(err, IsNil)
  672. conn, err := ss.ListenPacket("udp", ":0", cipher)
  673. assert(err, IsNil)
  674. for i := 0; i < 100; i++ {
  675. payload := buf.New()
  676. payload.AppendBytes(1, 127, 0, 0, 1)
  677. payload.AppendSupplier(serial.WriteUint16(dest.Port.Value()))
  678. payload.AppendSupplier(buf.ReadFullFrom(rand.Reader, 10))
  679. nBytes, err := conn.WriteTo(payload.Bytes(), &net.UDPAddr{
  680. IP: []byte{127, 0, 0, 1},
  681. Port: int(serverPort),
  682. })
  683. assert(err, IsNil)
  684. assert(nBytes, Equals, payload.Len())
  685. conn.SetReadDeadline(time.Now().Add(time.Second * 10))
  686. response := make([]byte, 10240)
  687. nBytes, _, err = conn.ReadFrom(response)
  688. assert(err, IsNil)
  689. assert(response[:7], Equals, payload.BytesTo(7))
  690. assert(response[7:nBytes], Equals, xor(payload.BytesFrom(7)))
  691. }
  692. assert(conn.Close(), IsNil)
  693. CloseAllServers(servers)
  694. }
  695. func TestShadowsocksChacha20Conformance(t *testing.T) {
  696. assert := With(t)
  697. tcpServer := tcp.Server{
  698. MsgProcessor: xor,
  699. }
  700. dest, err := tcpServer.Start()
  701. assert(err, IsNil)
  702. defer tcpServer.Close()
  703. account := serial.ToTypedMessage(&shadowsocks.Account{
  704. Password: "ss-password",
  705. CipherType: shadowsocks.CipherType_CHACHA20_IETF,
  706. Ota: shadowsocks.Account_Disabled,
  707. })
  708. serverPort := tcp.PickPort()
  709. serverConfig := &core.Config{
  710. App: []*serial.TypedMessage{
  711. serial.ToTypedMessage(&log.Config{
  712. ErrorLogLevel: clog.Severity_Debug,
  713. ErrorLogType: log.LogType_Console,
  714. }),
  715. },
  716. Inbound: []*core.InboundHandlerConfig{
  717. {
  718. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  719. PortRange: net.SinglePortRange(serverPort),
  720. Listen: net.NewIPOrDomain(net.LocalHostIP),
  721. }),
  722. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  723. User: &protocol.User{
  724. Account: account,
  725. Level: 1,
  726. },
  727. }),
  728. },
  729. },
  730. Outbound: []*core.OutboundHandlerConfig{
  731. {
  732. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  733. },
  734. },
  735. }
  736. servers, err := InitializeServerConfigs(serverConfig)
  737. assert(err, IsNil)
  738. var wg sync.WaitGroup
  739. wg.Add(10)
  740. for i := 0; i < 10; i++ {
  741. go func() {
  742. cipher, err := ss.PickCipher("CHACHA20-IETF", nil, "ss-password")
  743. assert(err, IsNil)
  744. conn, err := ss.Dial("tcp", fmt.Sprintf(":%d", serverPort), cipher)
  745. assert(err, IsNil)
  746. _, err = conn.Write([]byte{1, 127, 0, 0, 1})
  747. assert(err, IsNil)
  748. _, err = conn.Write(serial.Uint16ToBytes(dest.Port.Value(), nil))
  749. assert(err, IsNil)
  750. payload := make([]byte, 10240*1024)
  751. rand.Read(payload)
  752. nBytes, err := conn.Write([]byte(payload))
  753. assert(err, IsNil)
  754. assert(nBytes, Equals, len(payload))
  755. response := readFrom(conn, time.Second*30, 10240*1024)
  756. assert(response, Equals, xor([]byte(payload)))
  757. assert(conn.Close(), IsNil)
  758. wg.Done()
  759. }()
  760. }
  761. wg.Wait()
  762. CloseAllServers(servers)
  763. }