encoding.go 19 KB

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