shadowsocks_test.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979
  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 TestShadowsocksAES128GCMUDPMux(t *testing.T) {
  560. assert := With(t)
  561. udpServer := udp.Server{
  562. MsgProcessor: xor,
  563. }
  564. dest, err := udpServer.Start()
  565. assert(err, IsNil)
  566. defer udpServer.Close()
  567. account := serial.ToTypedMessage(&shadowsocks.Account{
  568. Password: "shadowsocks-password",
  569. CipherType: shadowsocks.CipherType_AES_128_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. UdpEnabled: false,
  587. User: &protocol.User{
  588. Account: account,
  589. Level: 1,
  590. },
  591. }),
  592. },
  593. },
  594. Outbound: []*core.OutboundHandlerConfig{
  595. {
  596. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  597. },
  598. },
  599. }
  600. clientPort := tcp.PickPort()
  601. clientConfig := &core.Config{
  602. App: []*serial.TypedMessage{
  603. serial.ToTypedMessage(&log.Config{
  604. ErrorLogLevel: clog.Severity_Debug,
  605. ErrorLogType: log.LogType_Console,
  606. }),
  607. },
  608. Inbound: []*core.InboundHandlerConfig{
  609. {
  610. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  611. PortRange: net.SinglePortRange(clientPort),
  612. Listen: net.NewIPOrDomain(net.LocalHostIP),
  613. }),
  614. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  615. Address: net.NewIPOrDomain(dest.Address),
  616. Port: uint32(dest.Port),
  617. NetworkList: &net.NetworkList{
  618. Network: []net.Network{net.Network_UDP},
  619. },
  620. }),
  621. },
  622. },
  623. Outbound: []*core.OutboundHandlerConfig{
  624. {
  625. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  626. MultiplexSettings: &proxyman.MultiplexingConfig{
  627. Enabled: true,
  628. Concurrency: 8,
  629. },
  630. }),
  631. ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{
  632. Server: []*protocol.ServerEndpoint{
  633. {
  634. Address: net.NewIPOrDomain(net.LocalHostIP),
  635. Port: uint32(serverPort),
  636. User: []*protocol.User{
  637. {
  638. Account: account,
  639. },
  640. },
  641. },
  642. },
  643. }),
  644. },
  645. },
  646. }
  647. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  648. assert(err, IsNil)
  649. var wg sync.WaitGroup
  650. wg.Add(10)
  651. for i := 0; i < 10; i++ {
  652. go func() {
  653. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  654. IP: []byte{127, 0, 0, 1},
  655. Port: int(clientPort),
  656. })
  657. assert(err, IsNil)
  658. payload := make([]byte, 1024)
  659. rand.Read(payload)
  660. nBytes, err := conn.Write([]byte(payload))
  661. assert(err, IsNil)
  662. assert(nBytes, Equals, len(payload))
  663. response := readFrom(conn, time.Second*5, 1024)
  664. assert(response, Equals, xor([]byte(payload)))
  665. assert(conn.Close(), IsNil)
  666. wg.Done()
  667. }()
  668. }
  669. wg.Wait()
  670. CloseAllServers(servers)
  671. }
  672. func TestShadowsocksAES256GCMConformance(t *testing.T) {
  673. assert := With(t)
  674. tcpServer := tcp.Server{
  675. MsgProcessor: xor,
  676. }
  677. dest, err := tcpServer.Start()
  678. assert(err, IsNil)
  679. defer tcpServer.Close()
  680. account := serial.ToTypedMessage(&shadowsocks.Account{
  681. Password: "ss-password",
  682. CipherType: shadowsocks.CipherType_AES_256_GCM,
  683. })
  684. serverPort := tcp.PickPort()
  685. serverConfig := &core.Config{
  686. App: []*serial.TypedMessage{
  687. serial.ToTypedMessage(&log.Config{
  688. ErrorLogLevel: clog.Severity_Debug,
  689. ErrorLogType: log.LogType_Console,
  690. }),
  691. },
  692. Inbound: []*core.InboundHandlerConfig{
  693. {
  694. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  695. PortRange: net.SinglePortRange(serverPort),
  696. Listen: net.NewIPOrDomain(net.LocalHostIP),
  697. }),
  698. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  699. User: &protocol.User{
  700. Account: account,
  701. Level: 1,
  702. },
  703. }),
  704. },
  705. },
  706. Outbound: []*core.OutboundHandlerConfig{
  707. {
  708. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  709. },
  710. },
  711. }
  712. servers, err := InitializeServerConfigs(serverConfig)
  713. assert(err, IsNil)
  714. var wg sync.WaitGroup
  715. wg.Add(10)
  716. for i := 0; i < 10; i++ {
  717. go func() {
  718. cipher, err := ss.PickCipher("AES-256-GCM", nil, "ss-password")
  719. assert(err, IsNil)
  720. conn, err := ss.Dial("tcp", fmt.Sprintf(":%d", serverPort), cipher)
  721. assert(err, IsNil)
  722. _, err = conn.Write([]byte{1, 127, 0, 0, 1})
  723. assert(err, IsNil)
  724. _, err = conn.Write(serial.Uint16ToBytes(dest.Port.Value(), nil))
  725. assert(err, IsNil)
  726. payload := make([]byte, 10240*1024)
  727. rand.Read(payload)
  728. nBytes, err := conn.Write([]byte(payload))
  729. assert(err, IsNil)
  730. assert(nBytes, Equals, len(payload))
  731. response := readFrom(conn, time.Second*30, 10240*1024)
  732. assert(response, Equals, xor([]byte(payload)))
  733. assert(conn.Close(), IsNil)
  734. wg.Done()
  735. }()
  736. }
  737. wg.Wait()
  738. CloseAllServers(servers)
  739. }
  740. func TestShadowsocksChacha20Poly1305UDPConformance(t *testing.T) {
  741. assert := With(t)
  742. udpServer := udp.Server{
  743. MsgProcessor: xor,
  744. }
  745. dest, err := udpServer.Start()
  746. assert(err, IsNil)
  747. defer udpServer.Close()
  748. account := serial.ToTypedMessage(&shadowsocks.Account{
  749. Password: "ss-password",
  750. CipherType: shadowsocks.CipherType_CHACHA20_POLY1305,
  751. })
  752. serverPort := tcp.PickPort()
  753. serverConfig := &core.Config{
  754. App: []*serial.TypedMessage{
  755. serial.ToTypedMessage(&log.Config{
  756. ErrorLogLevel: clog.Severity_Debug,
  757. ErrorLogType: log.LogType_Console,
  758. }),
  759. },
  760. Inbound: []*core.InboundHandlerConfig{
  761. {
  762. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  763. PortRange: net.SinglePortRange(serverPort),
  764. Listen: net.NewIPOrDomain(net.LocalHostIP),
  765. }),
  766. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  767. UdpEnabled: true,
  768. User: &protocol.User{
  769. Account: account,
  770. Level: 1,
  771. },
  772. }),
  773. },
  774. },
  775. Outbound: []*core.OutboundHandlerConfig{
  776. {
  777. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  778. },
  779. },
  780. }
  781. servers, err := InitializeServerConfigs(serverConfig)
  782. assert(err, IsNil)
  783. cipher, err := ss.PickCipher("CHACHA20-IETF-POLY1305", nil, "ss-password")
  784. assert(err, IsNil)
  785. conn, err := ss.ListenPacket("udp", ":0", cipher)
  786. assert(err, IsNil)
  787. for i := 0; i < 100; i++ {
  788. payload := buf.New()
  789. payload.AppendBytes(1, 127, 0, 0, 1)
  790. payload.AppendSupplier(serial.WriteUint16(dest.Port.Value()))
  791. payload.AppendSupplier(buf.ReadFullFrom(rand.Reader, 10))
  792. nBytes, err := conn.WriteTo(payload.Bytes(), &net.UDPAddr{
  793. IP: []byte{127, 0, 0, 1},
  794. Port: int(serverPort),
  795. })
  796. assert(err, IsNil)
  797. assert(int32(nBytes), Equals, payload.Len())
  798. conn.SetReadDeadline(time.Now().Add(time.Second * 10))
  799. response := make([]byte, 10240)
  800. nBytes, _, err = conn.ReadFrom(response)
  801. assert(err, IsNil)
  802. assert(response[:7], Equals, payload.BytesTo(7))
  803. assert(response[7:nBytes], Equals, xor(payload.BytesFrom(7)))
  804. }
  805. assert(conn.Close(), IsNil)
  806. CloseAllServers(servers)
  807. }
  808. func TestShadowsocksChacha20Conformance(t *testing.T) {
  809. assert := With(t)
  810. tcpServer := tcp.Server{
  811. MsgProcessor: xor,
  812. }
  813. dest, err := tcpServer.Start()
  814. assert(err, IsNil)
  815. defer tcpServer.Close()
  816. account := serial.ToTypedMessage(&shadowsocks.Account{
  817. Password: "ss-password",
  818. CipherType: shadowsocks.CipherType_CHACHA20_IETF,
  819. Ota: shadowsocks.Account_Disabled,
  820. })
  821. serverPort := tcp.PickPort()
  822. serverConfig := &core.Config{
  823. App: []*serial.TypedMessage{
  824. serial.ToTypedMessage(&log.Config{
  825. ErrorLogLevel: clog.Severity_Debug,
  826. ErrorLogType: log.LogType_Console,
  827. }),
  828. },
  829. Inbound: []*core.InboundHandlerConfig{
  830. {
  831. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  832. PortRange: net.SinglePortRange(serverPort),
  833. Listen: net.NewIPOrDomain(net.LocalHostIP),
  834. }),
  835. ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{
  836. User: &protocol.User{
  837. Account: account,
  838. Level: 1,
  839. },
  840. }),
  841. },
  842. },
  843. Outbound: []*core.OutboundHandlerConfig{
  844. {
  845. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  846. },
  847. },
  848. }
  849. servers, err := InitializeServerConfigs(serverConfig)
  850. assert(err, IsNil)
  851. var wg sync.WaitGroup
  852. wg.Add(10)
  853. for i := 0; i < 10; i++ {
  854. go func() {
  855. cipher, err := ss.PickCipher("CHACHA20-IETF", nil, "ss-password")
  856. assert(err, IsNil)
  857. conn, err := ss.Dial("tcp", fmt.Sprintf(":%d", serverPort), cipher)
  858. assert(err, IsNil)
  859. _, err = conn.Write([]byte{1, 127, 0, 0, 1})
  860. assert(err, IsNil)
  861. _, err = conn.Write(serial.Uint16ToBytes(dest.Port.Value(), nil))
  862. assert(err, IsNil)
  863. payload := make([]byte, 10240*1024)
  864. rand.Read(payload)
  865. nBytes, err := conn.Write([]byte(payload))
  866. assert(err, IsNil)
  867. assert(nBytes, Equals, len(payload))
  868. response := readFrom(conn, time.Second*30, 10240*1024)
  869. assert(response, Equals, xor([]byte(payload)))
  870. assert(conn.Close(), IsNil)
  871. wg.Done()
  872. }()
  873. }
  874. wg.Wait()
  875. CloseAllServers(servers)
  876. }