encoding.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  1. package encoding
  2. //go:generate go run github.com/xtls/xray-core/common/errors/errorgen
  3. import (
  4. "bytes"
  5. "context"
  6. "crypto/rand"
  7. "fmt"
  8. "io"
  9. "math/big"
  10. "runtime"
  11. "strconv"
  12. "syscall"
  13. "time"
  14. "github.com/xtls/xray-core/common/buf"
  15. "github.com/xtls/xray-core/common/errors"
  16. "github.com/xtls/xray-core/common/net"
  17. "github.com/xtls/xray-core/common/protocol"
  18. "github.com/xtls/xray-core/common/session"
  19. "github.com/xtls/xray-core/common/signal"
  20. "github.com/xtls/xray-core/features/stats"
  21. "github.com/xtls/xray-core/proxy/vless"
  22. "github.com/xtls/xray-core/transport/internet/stat"
  23. "github.com/xtls/xray-core/transport/internet/tls"
  24. "github.com/xtls/xray-core/transport/internet/xtls"
  25. )
  26. const (
  27. Version = byte(0)
  28. )
  29. var tls13SupportedVersions = []byte{0x00, 0x2b, 0x00, 0x02, 0x03, 0x04}
  30. var tlsClientHandShakeStart = []byte{0x16, 0x03}
  31. var tlsServerHandShakeStart = []byte{0x16, 0x03, 0x03}
  32. var tlsApplicationDataStart = []byte{0x17, 0x03, 0x03}
  33. var addrParser = protocol.NewAddressParser(
  34. protocol.AddressFamilyByte(byte(protocol.AddressTypeIPv4), net.AddressFamilyIPv4),
  35. protocol.AddressFamilyByte(byte(protocol.AddressTypeDomain), net.AddressFamilyDomain),
  36. protocol.AddressFamilyByte(byte(protocol.AddressTypeIPv6), net.AddressFamilyIPv6),
  37. protocol.PortThenAddress(),
  38. )
  39. // EncodeRequestHeader writes encoded request header into the given writer.
  40. func EncodeRequestHeader(writer io.Writer, request *protocol.RequestHeader, requestAddons *Addons) error {
  41. buffer := buf.StackNew()
  42. defer buffer.Release()
  43. if err := buffer.WriteByte(request.Version); err != nil {
  44. return newError("failed to write request version").Base(err)
  45. }
  46. if _, err := buffer.Write(request.User.Account.(*vless.MemoryAccount).ID.Bytes()); err != nil {
  47. return newError("failed to write request user id").Base(err)
  48. }
  49. if err := EncodeHeaderAddons(&buffer, requestAddons); err != nil {
  50. return newError("failed to encode request header addons").Base(err)
  51. }
  52. if err := buffer.WriteByte(byte(request.Command)); err != nil {
  53. return newError("failed to write request command").Base(err)
  54. }
  55. if request.Command != protocol.RequestCommandMux {
  56. if err := addrParser.WriteAddressPort(&buffer, request.Address, request.Port); err != nil {
  57. return newError("failed to write request address and port").Base(err)
  58. }
  59. }
  60. if _, err := writer.Write(buffer.Bytes()); err != nil {
  61. return newError("failed to write request header").Base(err)
  62. }
  63. return nil
  64. }
  65. // DecodeRequestHeader decodes and returns (if successful) a RequestHeader from an input stream.
  66. func DecodeRequestHeader(isfb bool, first *buf.Buffer, reader io.Reader, validator *vless.Validator) (*protocol.RequestHeader, *Addons, bool, error) {
  67. buffer := buf.StackNew()
  68. defer buffer.Release()
  69. request := new(protocol.RequestHeader)
  70. if isfb {
  71. request.Version = first.Byte(0)
  72. } else {
  73. if _, err := buffer.ReadFullFrom(reader, 1); err != nil {
  74. return nil, nil, false, newError("failed to read request version").Base(err)
  75. }
  76. request.Version = buffer.Byte(0)
  77. }
  78. switch request.Version {
  79. case 0:
  80. var id [16]byte
  81. if isfb {
  82. copy(id[:], first.BytesRange(1, 17))
  83. } else {
  84. buffer.Clear()
  85. if _, err := buffer.ReadFullFrom(reader, 16); err != nil {
  86. return nil, nil, false, newError("failed to read request user id").Base(err)
  87. }
  88. copy(id[:], buffer.Bytes())
  89. }
  90. if request.User = validator.Get(id); request.User == nil {
  91. return nil, nil, isfb, newError("invalid request user id")
  92. }
  93. if isfb {
  94. first.Advance(17)
  95. }
  96. requestAddons, err := DecodeHeaderAddons(&buffer, reader)
  97. if err != nil {
  98. return nil, nil, false, newError("failed to decode request header addons").Base(err)
  99. }
  100. buffer.Clear()
  101. if _, err := buffer.ReadFullFrom(reader, 1); err != nil {
  102. return nil, nil, false, newError("failed to read request command").Base(err)
  103. }
  104. request.Command = protocol.RequestCommand(buffer.Byte(0))
  105. switch request.Command {
  106. case protocol.RequestCommandMux:
  107. request.Address = net.DomainAddress("v1.mux.cool")
  108. request.Port = 0
  109. case protocol.RequestCommandTCP, protocol.RequestCommandUDP:
  110. if addr, port, err := addrParser.ReadAddressPort(&buffer, reader); err == nil {
  111. request.Address = addr
  112. request.Port = port
  113. }
  114. }
  115. if request.Address == nil {
  116. return nil, nil, false, newError("invalid request address")
  117. }
  118. return request, requestAddons, false, nil
  119. default:
  120. return nil, nil, isfb, newError("invalid request version")
  121. }
  122. }
  123. // EncodeResponseHeader writes encoded response header into the given writer.
  124. func EncodeResponseHeader(writer io.Writer, request *protocol.RequestHeader, responseAddons *Addons) error {
  125. buffer := buf.StackNew()
  126. defer buffer.Release()
  127. if err := buffer.WriteByte(request.Version); err != nil {
  128. return newError("failed to write response version").Base(err)
  129. }
  130. if err := EncodeHeaderAddons(&buffer, responseAddons); err != nil {
  131. return newError("failed to encode response header addons").Base(err)
  132. }
  133. if _, err := writer.Write(buffer.Bytes()); err != nil {
  134. return newError("failed to write response header").Base(err)
  135. }
  136. return nil
  137. }
  138. // DecodeResponseHeader decodes and returns (if successful) a ResponseHeader from an input stream.
  139. func DecodeResponseHeader(reader io.Reader, request *protocol.RequestHeader) (*Addons, error) {
  140. buffer := buf.StackNew()
  141. defer buffer.Release()
  142. if _, err := buffer.ReadFullFrom(reader, 1); err != nil {
  143. return nil, newError("failed to read response version").Base(err)
  144. }
  145. if buffer.Byte(0) != request.Version {
  146. return nil, newError("unexpected response version. Expecting ", int(request.Version), " but actually ", int(buffer.Byte(0)))
  147. }
  148. responseAddons, err := DecodeHeaderAddons(&buffer, reader)
  149. if err != nil {
  150. return nil, newError("failed to decode response header addons").Base(err)
  151. }
  152. return responseAddons, nil
  153. }
  154. func ReadV(reader buf.Reader, writer buf.Writer, timer signal.ActivityUpdater, conn *xtls.Conn, rawConn syscall.RawConn, counter stats.Counter, ctx context.Context) error {
  155. err := func() error {
  156. var ct stats.Counter
  157. for {
  158. if conn.DirectIn {
  159. conn.DirectIn = false
  160. if inbound := session.InboundFromContext(ctx); inbound != nil && inbound.Conn != nil {
  161. iConn := inbound.Conn
  162. statConn, ok := iConn.(*stat.CounterConnection)
  163. if ok {
  164. iConn = statConn.Connection
  165. }
  166. if xc, ok := iConn.(*xtls.Conn); ok {
  167. iConn = xc.NetConn()
  168. }
  169. if tc, ok := iConn.(*net.TCPConn); ok {
  170. if conn.SHOW {
  171. fmt.Println(conn.MARK, "Splice")
  172. }
  173. runtime.Gosched() // necessary
  174. w, err := tc.ReadFrom(conn.NetConn())
  175. if counter != nil {
  176. counter.Add(w)
  177. }
  178. if statConn != nil && statConn.WriteCounter != nil {
  179. statConn.WriteCounter.Add(w)
  180. }
  181. return err
  182. } else {
  183. panic("XTLS Splice: not TCP inbound")
  184. }
  185. }
  186. reader = buf.NewReadVReader(conn.NetConn(), rawConn, nil)
  187. ct = counter
  188. if conn.SHOW {
  189. fmt.Println(conn.MARK, "ReadV")
  190. }
  191. }
  192. buffer, err := reader.ReadMultiBuffer()
  193. if !buffer.IsEmpty() {
  194. if ct != nil {
  195. ct.Add(int64(buffer.Len()))
  196. }
  197. timer.Update()
  198. if werr := writer.WriteMultiBuffer(buffer); werr != nil {
  199. return werr
  200. }
  201. }
  202. if err != nil {
  203. return err
  204. }
  205. }
  206. }()
  207. if err != nil && errors.Cause(err) != io.EOF {
  208. return err
  209. }
  210. return nil
  211. }
  212. // XtlsRead filter and read xtls protocol
  213. func XtlsRead(reader buf.Reader, writer buf.Writer, timer signal.ActivityUpdater, conn net.Conn, rawConn syscall.RawConn, counter stats.Counter, ctx context.Context, userUUID []byte, numberOfPacketToFilter *int, enableXtls *bool, isTLS12orAbove *bool, isTLS *bool) error {
  214. err := func() error {
  215. var ct stats.Counter
  216. filterUUID := true
  217. shouldSwitchToDirectCopy := false
  218. var remainingContent int32 = -1
  219. var remainingPadding int32 = -1
  220. currentCommand := 0
  221. for {
  222. if shouldSwitchToDirectCopy {
  223. shouldSwitchToDirectCopy = false
  224. if runtime.GOOS == "linux" || runtime.GOOS == "android" {
  225. if inbound := session.InboundFromContext(ctx); inbound != nil && inbound.Conn != nil {
  226. iConn := inbound.Conn
  227. statConn, ok := iConn.(*stat.CounterConnection)
  228. if ok {
  229. iConn = statConn.Connection
  230. }
  231. if xc, ok := iConn.(*tls.Conn); ok {
  232. iConn = xc.NetConn()
  233. }
  234. if tc, ok := iConn.(*net.TCPConn); ok {
  235. newError("XtlsRead splice").WriteToLog(session.ExportIDToError(ctx))
  236. runtime.Gosched() // necessary
  237. w, err := tc.ReadFrom(conn)
  238. if counter != nil {
  239. counter.Add(w)
  240. }
  241. if statConn != nil && statConn.WriteCounter != nil {
  242. statConn.WriteCounter.Add(w)
  243. }
  244. return err
  245. } else {
  246. panic("XTLS Splice: not TCP inbound")
  247. }
  248. } else {
  249. // panic("XTLS Splice: nil inbound or nil inbound.Conn")
  250. }
  251. }
  252. reader = buf.NewReadVReader(conn, rawConn, nil)
  253. ct = counter
  254. newError("XtlsRead readV").WriteToLog(session.ExportIDToError(ctx))
  255. }
  256. buffer, err := reader.ReadMultiBuffer()
  257. if !buffer.IsEmpty() {
  258. if filterUUID && (*isTLS || *numberOfPacketToFilter > 0) {
  259. buffer = XtlsUnpadding(ctx, buffer, userUUID, &remainingContent, &remainingPadding, &currentCommand)
  260. if remainingContent == 0 && remainingPadding == 0 {
  261. if currentCommand == 1 {
  262. filterUUID = false
  263. } else if currentCommand == 2 {
  264. filterUUID = false
  265. shouldSwitchToDirectCopy = true
  266. } else if currentCommand != 0 {
  267. newError("XtlsRead unknown command ", currentCommand, buffer.Len()).WriteToLog(session.ExportIDToError(ctx))
  268. }
  269. }
  270. }
  271. if *numberOfPacketToFilter > 0 {
  272. XtlsFilterTls(buffer, numberOfPacketToFilter, enableXtls, isTLS12orAbove, isTLS, ctx)
  273. }
  274. if ct != nil {
  275. ct.Add(int64(buffer.Len()))
  276. }
  277. timer.Update()
  278. if werr := writer.WriteMultiBuffer(buffer); werr != nil {
  279. return werr
  280. }
  281. }
  282. if err != nil {
  283. return err
  284. }
  285. }
  286. }()
  287. if err != nil && errors.Cause(err) != io.EOF {
  288. return err
  289. }
  290. return nil
  291. }
  292. // XtlsWrite filter and write xtls protocol
  293. func XtlsWrite(reader buf.Reader, writer buf.Writer, timer signal.ActivityUpdater, conn net.Conn, counter stats.Counter, ctx context.Context, userUUID *[]byte, numberOfPacketToFilter *int, enableXtls *bool, isTLS12orAbove *bool, isTLS *bool) error {
  294. err := func() error {
  295. var ct stats.Counter
  296. filterTlsApplicationData := true
  297. shouldSwitchToDirectCopy := false
  298. for {
  299. buffer, err := reader.ReadMultiBuffer()
  300. if !buffer.IsEmpty() {
  301. if *numberOfPacketToFilter > 0 {
  302. XtlsFilterTls(buffer, numberOfPacketToFilter, enableXtls, isTLS12orAbove, isTLS, ctx)
  303. }
  304. if filterTlsApplicationData && *isTLS {
  305. buffer = ReshapeMultiBuffer(ctx, buffer)
  306. var xtlsSpecIndex int
  307. for i, b := range buffer {
  308. if b.Len() >= 6 && bytes.Equal(tlsApplicationDataStart, b.BytesTo(3)) {
  309. var command byte = 0x01
  310. if *enableXtls {
  311. shouldSwitchToDirectCopy = true
  312. xtlsSpecIndex = i
  313. command = 0x02
  314. }
  315. filterTlsApplicationData = false
  316. buffer[i] = XtlsPadding(b, command, userUUID, ctx)
  317. break
  318. } else if !*isTLS12orAbove && *numberOfPacketToFilter <= 0 {
  319. //maybe tls 1.1 or 1.0
  320. filterTlsApplicationData = false
  321. buffer[i] = XtlsPadding(b, 0x01, userUUID, ctx)
  322. break
  323. }
  324. buffer[i] = XtlsPadding(b, 0x00, userUUID, ctx)
  325. }
  326. if shouldSwitchToDirectCopy {
  327. encryptBuffer, directBuffer := buf.SplitMulti(buffer, xtlsSpecIndex+1)
  328. length := encryptBuffer.Len()
  329. if !encryptBuffer.IsEmpty() {
  330. timer.Update()
  331. if werr := writer.WriteMultiBuffer(encryptBuffer); werr != nil {
  332. return werr
  333. }
  334. }
  335. buffer = directBuffer
  336. writer = buf.NewWriter(conn)
  337. ct = counter
  338. newError("XtlsWrite writeV ", xtlsSpecIndex, " ", length, " ", buffer.Len()).WriteToLog(session.ExportIDToError(ctx))
  339. time.Sleep(5 * time.Millisecond) // for some device, the first xtls direct packet fails without this delay
  340. }
  341. }
  342. if !buffer.IsEmpty() {
  343. if ct != nil {
  344. ct.Add(int64(buffer.Len()))
  345. }
  346. timer.Update()
  347. if werr := writer.WriteMultiBuffer(buffer); werr != nil {
  348. return werr
  349. }
  350. }
  351. }
  352. if err != nil {
  353. return err
  354. }
  355. }
  356. }()
  357. if err != nil && errors.Cause(err) != io.EOF {
  358. return err
  359. }
  360. return nil
  361. }
  362. // XtlsFilterTls filter and recognize tls 1.3 and other info
  363. func XtlsFilterTls(buffer buf.MultiBuffer, numberOfPacketToFilter *int, enableXtls *bool, isTLS12orAbove *bool, isTLS *bool, ctx context.Context) {
  364. for _, b := range buffer {
  365. *numberOfPacketToFilter--
  366. if b.Len() >= 6 {
  367. startsBytes := b.BytesTo(6)
  368. if bytes.Equal(tlsServerHandShakeStart, startsBytes[:3]) && startsBytes[5] == 0x02 {
  369. total := (int(startsBytes[3])<<8 | int(startsBytes[4])) + 5
  370. if b.Len() >= int32(total) {
  371. if bytes.Contains(b.BytesTo(int32(total)), tls13SupportedVersions) {
  372. *enableXtls = true
  373. newError("XtlsFilterTls13 found tls 1.3! ", buffer.Len()).WriteToLog(session.ExportIDToError(ctx))
  374. } else {
  375. newError("XtlsFilterTls13 found tls 1.2! ", buffer.Len()).WriteToLog(session.ExportIDToError(ctx))
  376. }
  377. *isTLS12orAbove = true
  378. *isTLS = true
  379. *numberOfPacketToFilter = 0
  380. return
  381. }
  382. } else if bytes.Equal(tlsClientHandShakeStart, startsBytes[:2]) && startsBytes[5] == 0x01 {
  383. *isTLS = true
  384. newError("XtlsFilterTls13 found tls client hello! ", buffer.Len()).WriteToLog(session.ExportIDToError(ctx))
  385. }
  386. }
  387. if *numberOfPacketToFilter <= 0 {
  388. newError("XtlsFilterTls13 stop filtering", buffer.Len()).WriteToLog(session.ExportIDToError(ctx))
  389. }
  390. }
  391. }
  392. // ReshapeMultiBuffer prepare multi buffer for padding stucture (max 21 bytes)
  393. func ReshapeMultiBuffer(ctx context.Context, buffer buf.MultiBuffer) buf.MultiBuffer {
  394. needReshape := false
  395. for _, b := range buffer {
  396. if b.Len() >= buf.Size-21 {
  397. needReshape = true
  398. }
  399. }
  400. if !needReshape {
  401. return buffer
  402. }
  403. mb2 := make(buf.MultiBuffer, 0, len(buffer))
  404. print := ""
  405. for _, b := range buffer {
  406. if b.Len() >= buf.Size-21 {
  407. index := int32(bytes.LastIndex(b.Bytes(), tlsApplicationDataStart))
  408. if index <= 0 {
  409. index = buf.Size / 2
  410. }
  411. buffer1 := buf.New()
  412. buffer2 := buf.New()
  413. buffer1.Write(b.BytesTo(index))
  414. buffer2.Write(b.BytesFrom(index))
  415. mb2 = append(mb2, buffer1, buffer2)
  416. print += " " + strconv.Itoa(int(buffer1.Len())) + " " + strconv.Itoa(int(buffer2.Len()))
  417. } else {
  418. newbuffer := buf.New()
  419. newbuffer.Write(b.Bytes())
  420. mb2 = append(mb2, newbuffer)
  421. print += " " + strconv.Itoa(int(b.Len()))
  422. }
  423. }
  424. buf.ReleaseMulti(buffer)
  425. newError("ReshapeMultiBuffer ", print).WriteToLog(session.ExportIDToError(ctx))
  426. return mb2
  427. }
  428. // XtlsPadding add padding to eliminate length siganature during tls handshake
  429. func XtlsPadding(b *buf.Buffer, command byte, userUUID *[]byte, ctx context.Context) *buf.Buffer {
  430. var length int32 = 0
  431. if b.Len() < 900 {
  432. l, err := rand.Int(rand.Reader, big.NewInt(500))
  433. if err != nil {
  434. newError("failed to generate padding").Base(err).WriteToLog(session.ExportIDToError(ctx))
  435. }
  436. length = int32(l.Int64()) + 900 - b.Len()
  437. }
  438. newbuffer := buf.New()
  439. if userUUID != nil {
  440. newbuffer.Write(*userUUID)
  441. *userUUID = nil
  442. }
  443. newbuffer.Write([]byte{command, byte(b.Len() >> 8), byte(b.Len()), byte(length >> 8), byte(length)})
  444. newbuffer.Write(b.Bytes())
  445. newbuffer.Extend(length)
  446. newError("XtlsPadding ", b.Len(), " ", length, " ", command).WriteToLog(session.ExportIDToError(ctx))
  447. b.Release()
  448. b = nil
  449. return newbuffer
  450. }
  451. // XtlsUnpadding remove padding and parse command
  452. func XtlsUnpadding(ctx context.Context, buffer buf.MultiBuffer, userUUID []byte, remainingContent *int32, remainingPadding *int32, currentCommand *int) buf.MultiBuffer {
  453. posindex := 0
  454. var posByte int32 = 0
  455. if *remainingContent == -1 && *remainingPadding == -1 {
  456. for i, b := range buffer {
  457. if b.Len() >= 21 && bytes.Equal(userUUID, b.BytesTo(16)) {
  458. posindex = i
  459. posByte = 16
  460. *remainingContent = 0
  461. *remainingPadding = 0
  462. break
  463. }
  464. }
  465. }
  466. if *remainingContent == -1 && *remainingPadding == -1 {
  467. return buffer
  468. }
  469. mb2 := make(buf.MultiBuffer, 0, len(buffer))
  470. for i := 0; i < posindex; i++ {
  471. newbuffer := buf.New()
  472. newbuffer.Write(buffer[i].Bytes())
  473. mb2 = append(mb2, newbuffer)
  474. }
  475. for i := posindex; i < len(buffer); i++ {
  476. b := buffer[i]
  477. for posByte < b.Len() {
  478. if *remainingContent <= 0 && *remainingPadding <= 0 {
  479. if *currentCommand == 1 { // possible buffer after padding, no need to worry about xtls (command 2)
  480. len := b.Len() - posByte
  481. newbuffer := buf.New()
  482. newbuffer.Write(b.BytesRange(posByte, posByte+len))
  483. mb2 = append(mb2, newbuffer)
  484. posByte += len
  485. } else {
  486. paddingInfo := b.BytesRange(posByte, posByte+5)
  487. *currentCommand = int(paddingInfo[0])
  488. *remainingContent = int32(paddingInfo[1])<<8 | int32(paddingInfo[2])
  489. *remainingPadding = int32(paddingInfo[3])<<8 | int32(paddingInfo[4])
  490. newError("Xtls Unpadding new block", i, " ", posByte, " content ", *remainingContent, " padding ", *remainingPadding, " ", paddingInfo[0]).WriteToLog(session.ExportIDToError(ctx))
  491. posByte += 5
  492. }
  493. } else if *remainingContent > 0 {
  494. len := *remainingContent
  495. if b.Len() < posByte+*remainingContent {
  496. len = b.Len() - posByte
  497. }
  498. newbuffer := buf.New()
  499. newbuffer.Write(b.BytesRange(posByte, posByte+len))
  500. mb2 = append(mb2, newbuffer)
  501. *remainingContent -= len
  502. posByte += len
  503. } else { // remainingPadding > 0
  504. len := *remainingPadding
  505. if b.Len() < posByte+*remainingPadding {
  506. len = b.Len() - posByte
  507. }
  508. *remainingPadding -= len
  509. posByte += len
  510. }
  511. if posByte == b.Len() {
  512. posByte = 0
  513. break
  514. }
  515. }
  516. }
  517. buf.ReleaseMulti(buffer)
  518. return mb2
  519. }