encoding.go 16 KB

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