vless_test.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649
  1. package scenarios
  2. import (
  3. "encoding/base64"
  4. "encoding/hex"
  5. "sync"
  6. "testing"
  7. "time"
  8. "github.com/xtls/xray-core/app/log"
  9. "github.com/xtls/xray-core/app/proxyman"
  10. "github.com/xtls/xray-core/common"
  11. clog "github.com/xtls/xray-core/common/log"
  12. "github.com/xtls/xray-core/common/net"
  13. "github.com/xtls/xray-core/common/protocol"
  14. "github.com/xtls/xray-core/common/protocol/tls/cert"
  15. "github.com/xtls/xray-core/common/serial"
  16. "github.com/xtls/xray-core/common/uuid"
  17. core "github.com/xtls/xray-core/core"
  18. "github.com/xtls/xray-core/proxy/dokodemo"
  19. "github.com/xtls/xray-core/proxy/freedom"
  20. "github.com/xtls/xray-core/proxy/vless"
  21. "github.com/xtls/xray-core/proxy/vless/inbound"
  22. "github.com/xtls/xray-core/proxy/vless/outbound"
  23. "github.com/xtls/xray-core/testing/servers/tcp"
  24. "github.com/xtls/xray-core/transport/internet"
  25. "github.com/xtls/xray-core/transport/internet/reality"
  26. transtcp "github.com/xtls/xray-core/transport/internet/tcp"
  27. "github.com/xtls/xray-core/transport/internet/tls"
  28. "golang.org/x/sync/errgroup"
  29. )
  30. func TestVless(t *testing.T) {
  31. tcpServer := tcp.Server{
  32. MsgProcessor: xor,
  33. }
  34. dest, err := tcpServer.Start()
  35. common.Must(err)
  36. defer tcpServer.Close()
  37. userID := protocol.NewID(uuid.New())
  38. serverPort := tcp.PickPort()
  39. serverConfig := &core.Config{
  40. App: []*serial.TypedMessage{
  41. serial.ToTypedMessage(&log.Config{
  42. ErrorLogLevel: clog.Severity_Debug,
  43. ErrorLogType: log.LogType_Console,
  44. }),
  45. },
  46. Inbound: []*core.InboundHandlerConfig{
  47. {
  48. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  49. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  50. Listen: net.NewIPOrDomain(net.LocalHostIP),
  51. }),
  52. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  53. Clients: []*protocol.User{
  54. {
  55. Account: serial.ToTypedMessage(&vless.Account{
  56. Id: userID.String(),
  57. }),
  58. },
  59. },
  60. }),
  61. },
  62. },
  63. Outbound: []*core.OutboundHandlerConfig{
  64. {
  65. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  66. },
  67. },
  68. }
  69. clientPort := tcp.PickPort()
  70. clientConfig := &core.Config{
  71. App: []*serial.TypedMessage{
  72. serial.ToTypedMessage(&log.Config{
  73. ErrorLogLevel: clog.Severity_Debug,
  74. ErrorLogType: log.LogType_Console,
  75. }),
  76. },
  77. Inbound: []*core.InboundHandlerConfig{
  78. {
  79. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  80. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  81. Listen: net.NewIPOrDomain(net.LocalHostIP),
  82. }),
  83. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  84. Address: net.NewIPOrDomain(dest.Address),
  85. Port: uint32(dest.Port),
  86. Networks: []net.Network{net.Network_TCP},
  87. }),
  88. },
  89. },
  90. Outbound: []*core.OutboundHandlerConfig{
  91. {
  92. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  93. Vnext: &protocol.ServerEndpoint{
  94. Address: net.NewIPOrDomain(net.LocalHostIP),
  95. Port: uint32(serverPort),
  96. User: &protocol.User{
  97. Account: serial.ToTypedMessage(&vless.Account{
  98. Id: userID.String(),
  99. }),
  100. },
  101. },
  102. }),
  103. },
  104. },
  105. }
  106. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  107. common.Must(err)
  108. defer CloseAllServers(servers)
  109. var errg errgroup.Group
  110. for range 3 {
  111. errg.Go(testTCPConn(clientPort, 1024*1024, time.Second*30))
  112. }
  113. if err := errg.Wait(); err != nil {
  114. t.Error(err)
  115. }
  116. }
  117. func TestVlessTls(t *testing.T) {
  118. tcpServer := tcp.Server{
  119. MsgProcessor: xor,
  120. }
  121. dest, err := tcpServer.Start()
  122. common.Must(err)
  123. defer tcpServer.Close()
  124. ct, ctHash := cert.MustGenerate(nil, cert.CommonName("localhost"))
  125. userID := protocol.NewID(uuid.New())
  126. serverPort := tcp.PickPort()
  127. serverConfig := &core.Config{
  128. App: []*serial.TypedMessage{
  129. serial.ToTypedMessage(&log.Config{
  130. ErrorLogLevel: clog.Severity_Debug,
  131. ErrorLogType: log.LogType_Console,
  132. }),
  133. },
  134. Inbound: []*core.InboundHandlerConfig{
  135. {
  136. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  137. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  138. Listen: net.NewIPOrDomain(net.LocalHostIP),
  139. StreamSettings: &internet.StreamConfig{
  140. ProtocolName: "tcp",
  141. SecurityType: serial.GetMessageType(&tls.Config{}),
  142. SecuritySettings: []*serial.TypedMessage{
  143. serial.ToTypedMessage(&tls.Config{
  144. Certificate: []*tls.Certificate{tls.ParseCertificate(ct)},
  145. }),
  146. },
  147. },
  148. }),
  149. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  150. Clients: []*protocol.User{
  151. {
  152. Account: serial.ToTypedMessage(&vless.Account{
  153. Id: userID.String(),
  154. }),
  155. },
  156. },
  157. }),
  158. },
  159. },
  160. Outbound: []*core.OutboundHandlerConfig{
  161. {
  162. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  163. },
  164. },
  165. }
  166. clientPort := tcp.PickPort()
  167. clientConfig := &core.Config{
  168. App: []*serial.TypedMessage{
  169. serial.ToTypedMessage(&log.Config{
  170. ErrorLogLevel: clog.Severity_Debug,
  171. ErrorLogType: log.LogType_Console,
  172. }),
  173. },
  174. Inbound: []*core.InboundHandlerConfig{
  175. {
  176. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  177. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  178. Listen: net.NewIPOrDomain(net.LocalHostIP),
  179. }),
  180. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  181. Address: net.NewIPOrDomain(dest.Address),
  182. Port: uint32(dest.Port),
  183. Networks: []net.Network{net.Network_TCP},
  184. }),
  185. },
  186. },
  187. Outbound: []*core.OutboundHandlerConfig{
  188. {
  189. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  190. Vnext: &protocol.ServerEndpoint{
  191. Address: net.NewIPOrDomain(net.LocalHostIP),
  192. Port: uint32(serverPort),
  193. User: &protocol.User{
  194. Account: serial.ToTypedMessage(&vless.Account{
  195. Id: userID.String(),
  196. }),
  197. },
  198. },
  199. }),
  200. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  201. StreamSettings: &internet.StreamConfig{
  202. ProtocolName: "tcp",
  203. TransportSettings: []*internet.TransportConfig{
  204. {
  205. ProtocolName: "tcp",
  206. Settings: serial.ToTypedMessage(&transtcp.Config{}),
  207. },
  208. },
  209. SecurityType: serial.GetMessageType(&tls.Config{}),
  210. SecuritySettings: []*serial.TypedMessage{
  211. serial.ToTypedMessage(&tls.Config{
  212. PinnedPeerCertSha256: [][]byte{ctHash[:]},
  213. }),
  214. },
  215. },
  216. }),
  217. },
  218. },
  219. }
  220. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  221. common.Must(err)
  222. defer CloseAllServers(servers)
  223. var errg errgroup.Group
  224. for range 3 {
  225. errg.Go(testTCPConn(clientPort, 1024*1024, time.Second*30))
  226. }
  227. if err := errg.Wait(); err != nil {
  228. t.Error(err)
  229. }
  230. }
  231. func TestVlessXtlsVision(t *testing.T) {
  232. tcpServer := tcp.Server{
  233. MsgProcessor: xor,
  234. }
  235. dest, err := tcpServer.Start()
  236. common.Must(err)
  237. defer tcpServer.Close()
  238. ct, ctHash := cert.MustGenerate(nil, cert.CommonName("localhost"))
  239. userID := protocol.NewID(uuid.New())
  240. serverPort := tcp.PickPort()
  241. serverConfig := &core.Config{
  242. App: []*serial.TypedMessage{
  243. serial.ToTypedMessage(&log.Config{
  244. ErrorLogLevel: clog.Severity_Debug,
  245. ErrorLogType: log.LogType_Console,
  246. }),
  247. },
  248. Inbound: []*core.InboundHandlerConfig{
  249. {
  250. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  251. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  252. Listen: net.NewIPOrDomain(net.LocalHostIP),
  253. StreamSettings: &internet.StreamConfig{
  254. ProtocolName: "tcp",
  255. SecurityType: serial.GetMessageType(&tls.Config{}),
  256. SecuritySettings: []*serial.TypedMessage{
  257. serial.ToTypedMessage(&tls.Config{
  258. Certificate: []*tls.Certificate{tls.ParseCertificate(ct)},
  259. }),
  260. },
  261. },
  262. }),
  263. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  264. Clients: []*protocol.User{
  265. {
  266. Account: serial.ToTypedMessage(&vless.Account{
  267. Id: userID.String(),
  268. Flow: vless.XRV,
  269. }),
  270. },
  271. },
  272. }),
  273. },
  274. },
  275. Outbound: []*core.OutboundHandlerConfig{
  276. {
  277. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  278. },
  279. },
  280. }
  281. clientPort := tcp.PickPort()
  282. clientConfig := &core.Config{
  283. App: []*serial.TypedMessage{
  284. serial.ToTypedMessage(&log.Config{
  285. ErrorLogLevel: clog.Severity_Debug,
  286. ErrorLogType: log.LogType_Console,
  287. }),
  288. },
  289. Inbound: []*core.InboundHandlerConfig{
  290. {
  291. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  292. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  293. Listen: net.NewIPOrDomain(net.LocalHostIP),
  294. }),
  295. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  296. Address: net.NewIPOrDomain(dest.Address),
  297. Port: uint32(dest.Port),
  298. Networks: []net.Network{net.Network_TCP},
  299. }),
  300. },
  301. },
  302. Outbound: []*core.OutboundHandlerConfig{
  303. {
  304. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  305. Vnext: &protocol.ServerEndpoint{
  306. Address: net.NewIPOrDomain(net.LocalHostIP),
  307. Port: uint32(serverPort),
  308. User: &protocol.User{
  309. Account: serial.ToTypedMessage(&vless.Account{
  310. Id: userID.String(),
  311. Flow: vless.XRV,
  312. }),
  313. },
  314. },
  315. }),
  316. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  317. StreamSettings: &internet.StreamConfig{
  318. ProtocolName: "tcp",
  319. TransportSettings: []*internet.TransportConfig{
  320. {
  321. ProtocolName: "tcp",
  322. Settings: serial.ToTypedMessage(&transtcp.Config{}),
  323. },
  324. },
  325. SecurityType: serial.GetMessageType(&tls.Config{}),
  326. SecuritySettings: []*serial.TypedMessage{
  327. serial.ToTypedMessage(&tls.Config{
  328. PinnedPeerCertSha256: [][]byte{ctHash[:]},
  329. }),
  330. },
  331. },
  332. }),
  333. },
  334. },
  335. }
  336. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  337. common.Must(err)
  338. defer CloseAllServers(servers)
  339. var errg errgroup.Group
  340. for range 3 {
  341. errg.Go(testTCPConn(clientPort, 1024*1024, time.Second*30))
  342. }
  343. if err := errg.Wait(); err != nil {
  344. t.Error(err)
  345. }
  346. }
  347. func TestVlessXtlsVisionReality(t *testing.T) {
  348. tcpServer := tcp.Server{
  349. MsgProcessor: xor,
  350. }
  351. dest, err := tcpServer.Start()
  352. common.Must(err)
  353. defer tcpServer.Close()
  354. userID := protocol.NewID(uuid.New())
  355. serverPort := tcp.PickPort()
  356. privateKey, _ := base64.RawURLEncoding.DecodeString("aGSYystUbf59_9_6LKRxD27rmSW_-2_nyd9YG_Gwbks")
  357. publicKey, _ := base64.RawURLEncoding.DecodeString("E59WjnvZcQMu7tR7_BgyhycuEdBS-CtKxfImRCdAvFM")
  358. shortIds := make([][]byte, 1)
  359. shortIds[0] = make([]byte, 8)
  360. hex.Decode(shortIds[0], []byte("0123456789abcdef"))
  361. serverConfig := &core.Config{
  362. App: []*serial.TypedMessage{
  363. serial.ToTypedMessage(&log.Config{
  364. ErrorLogLevel: clog.Severity_Debug,
  365. ErrorLogType: log.LogType_Console,
  366. }),
  367. },
  368. Inbound: []*core.InboundHandlerConfig{
  369. {
  370. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  371. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  372. Listen: net.NewIPOrDomain(net.LocalHostIP),
  373. StreamSettings: &internet.StreamConfig{
  374. ProtocolName: "tcp",
  375. SecurityType: serial.GetMessageType(&reality.Config{}),
  376. SecuritySettings: []*serial.TypedMessage{
  377. serial.ToTypedMessage(&reality.Config{
  378. Show: true,
  379. Dest: "www.google.com:443", // use google for now, may fail in some region
  380. ServerNames: []string{"www.google.com"},
  381. PrivateKey: privateKey,
  382. ShortIds: shortIds,
  383. Type: "tcp",
  384. }),
  385. },
  386. },
  387. }),
  388. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  389. Clients: []*protocol.User{
  390. {
  391. Account: serial.ToTypedMessage(&vless.Account{
  392. Id: userID.String(),
  393. Flow: vless.XRV,
  394. }),
  395. },
  396. },
  397. }),
  398. },
  399. },
  400. Outbound: []*core.OutboundHandlerConfig{
  401. {
  402. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  403. },
  404. },
  405. }
  406. clientPort := tcp.PickPort()
  407. clientConfig := &core.Config{
  408. App: []*serial.TypedMessage{
  409. serial.ToTypedMessage(&log.Config{
  410. ErrorLogLevel: clog.Severity_Debug,
  411. ErrorLogType: log.LogType_Console,
  412. }),
  413. },
  414. Inbound: []*core.InboundHandlerConfig{
  415. {
  416. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  417. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  418. Listen: net.NewIPOrDomain(net.LocalHostIP),
  419. }),
  420. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  421. Address: net.NewIPOrDomain(dest.Address),
  422. Port: uint32(dest.Port),
  423. Networks: []net.Network{net.Network_TCP},
  424. }),
  425. },
  426. },
  427. Outbound: []*core.OutboundHandlerConfig{
  428. {
  429. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  430. Vnext: &protocol.ServerEndpoint{
  431. Address: net.NewIPOrDomain(net.LocalHostIP),
  432. Port: uint32(serverPort),
  433. User: &protocol.User{
  434. Account: serial.ToTypedMessage(&vless.Account{
  435. Id: userID.String(),
  436. Flow: vless.XRV,
  437. }),
  438. },
  439. },
  440. }),
  441. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  442. StreamSettings: &internet.StreamConfig{
  443. ProtocolName: "tcp",
  444. TransportSettings: []*internet.TransportConfig{
  445. {
  446. ProtocolName: "tcp",
  447. Settings: serial.ToTypedMessage(&transtcp.Config{}),
  448. },
  449. },
  450. SecurityType: serial.GetMessageType(&reality.Config{}),
  451. SecuritySettings: []*serial.TypedMessage{
  452. serial.ToTypedMessage(&reality.Config{
  453. Show: true,
  454. Fingerprint: "chrome",
  455. ServerName: "www.google.com",
  456. PublicKey: publicKey,
  457. ShortId: shortIds[0],
  458. SpiderX: "/",
  459. }),
  460. },
  461. },
  462. }),
  463. },
  464. },
  465. }
  466. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  467. common.Must(err)
  468. defer CloseAllServers(servers)
  469. var errg errgroup.Group
  470. for range 3 {
  471. errg.Go(testTCPConn(clientPort, 1024*1024, time.Second*30))
  472. }
  473. if err := errg.Wait(); err != nil {
  474. t.Error(err)
  475. }
  476. }
  477. // This testing test all known utls fingerprint in tls.PresetFingerprints that support reality (expect unsafe and random*)
  478. // Beacuse figerprint support may be broken after utls/reality update
  479. // Known broken fingerprint: android, 360
  480. func TestVlessRealityFingerprints(t *testing.T) {
  481. TestFingerprint := func(fingerprint string) error {
  482. tcpServer := tcp.Server{
  483. MsgProcessor: xor,
  484. }
  485. dest, err := tcpServer.Start()
  486. common.Must(err)
  487. defer tcpServer.Close()
  488. userID := protocol.NewID(uuid.New())
  489. serverPort := tcp.PickPort()
  490. privateKey, _ := base64.RawURLEncoding.DecodeString("aGSYystUbf59_9_6LKRxD27rmSW_-2_nyd9YG_Gwbks")
  491. publicKey, _ := base64.RawURLEncoding.DecodeString("E59WjnvZcQMu7tR7_BgyhycuEdBS-CtKxfImRCdAvFM")
  492. shortIds := make([][]byte, 1)
  493. shortIds[0] = make([]byte, 8)
  494. hex.Decode(shortIds[0], []byte("0123456789abcdef"))
  495. serverConfig := &core.Config{
  496. App: []*serial.TypedMessage{
  497. serial.ToTypedMessage(&log.Config{
  498. ErrorLogType: log.LogType_None,
  499. }),
  500. },
  501. Inbound: []*core.InboundHandlerConfig{
  502. {
  503. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  504. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(serverPort)}},
  505. Listen: net.NewIPOrDomain(net.LocalHostIP),
  506. StreamSettings: &internet.StreamConfig{
  507. ProtocolName: "tcp",
  508. SecurityType: serial.GetMessageType(&reality.Config{}),
  509. SecuritySettings: []*serial.TypedMessage{
  510. serial.ToTypedMessage(&reality.Config{
  511. Show: false,
  512. Dest: "www.google.com:443", // use google for now, may fail in some region
  513. ServerNames: []string{"www.google.com"},
  514. PrivateKey: privateKey,
  515. ShortIds: shortIds,
  516. Type: "tcp",
  517. }),
  518. },
  519. },
  520. }),
  521. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  522. Clients: []*protocol.User{
  523. {
  524. Account: serial.ToTypedMessage(&vless.Account{
  525. Id: userID.String(),
  526. }),
  527. },
  528. },
  529. }),
  530. },
  531. },
  532. Outbound: []*core.OutboundHandlerConfig{
  533. {
  534. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  535. },
  536. },
  537. }
  538. clientPort := tcp.PickPort()
  539. clientConfig := &core.Config{
  540. App: []*serial.TypedMessage{
  541. serial.ToTypedMessage(&log.Config{
  542. ErrorLogType: log.LogType_None,
  543. }),
  544. },
  545. Inbound: []*core.InboundHandlerConfig{
  546. {
  547. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  548. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(clientPort)}},
  549. Listen: net.NewIPOrDomain(net.LocalHostIP),
  550. }),
  551. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  552. Address: net.NewIPOrDomain(dest.Address),
  553. Port: uint32(dest.Port),
  554. Networks: []net.Network{net.Network_TCP},
  555. }),
  556. },
  557. },
  558. Outbound: []*core.OutboundHandlerConfig{
  559. {
  560. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  561. Vnext: &protocol.ServerEndpoint{
  562. Address: net.NewIPOrDomain(net.LocalHostIP),
  563. Port: uint32(serverPort),
  564. User: &protocol.User{
  565. Account: serial.ToTypedMessage(&vless.Account{
  566. Id: userID.String(),
  567. }),
  568. },
  569. },
  570. }),
  571. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  572. StreamSettings: &internet.StreamConfig{
  573. ProtocolName: "tcp",
  574. TransportSettings: []*internet.TransportConfig{
  575. {
  576. ProtocolName: "tcp",
  577. Settings: serial.ToTypedMessage(&transtcp.Config{}),
  578. },
  579. },
  580. SecurityType: serial.GetMessageType(&reality.Config{}),
  581. SecuritySettings: []*serial.TypedMessage{
  582. serial.ToTypedMessage(&reality.Config{
  583. Show: false,
  584. Fingerprint: fingerprint,
  585. ServerName: "www.google.com",
  586. PublicKey: publicKey,
  587. ShortId: shortIds[0],
  588. SpiderX: "/",
  589. }),
  590. },
  591. },
  592. }),
  593. },
  594. },
  595. }
  596. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  597. common.Must(err)
  598. defer CloseAllServers(servers)
  599. err = testTCPConn(clientPort, 1024*1024, time.Second*15)()
  600. if err != nil {
  601. return err
  602. }
  603. return nil
  604. }
  605. fingerPrints := []string{"chrome", "firefox", "safari", "ios", "edge", "qq"}
  606. wg := sync.WaitGroup{}
  607. wg.Add(len(fingerPrints))
  608. for _, fp := range fingerPrints {
  609. go func() {
  610. err := TestFingerprint(fp)
  611. if err != nil {
  612. t.Errorf("Fingerprint %s test failed: %v", fp, err)
  613. } else {
  614. t.Logf("Fingerprint %s test passed", fp)
  615. }
  616. wg.Done()
  617. }()
  618. }
  619. wg.Wait()
  620. }