mirror of
https://github.com/XTLS/Xray-core.git
synced 2024-11-26 14:49:20 +02:00
Reshape multi buffer to fix the padding when buffer is full
This commit is contained in:
parent
8e75e9d763
commit
48f7cc2132
|
@ -10,6 +10,7 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"math/big"
|
"math/big"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"strconv"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -339,6 +340,7 @@ func XtlsWrite(reader buf.Reader, writer buf.Writer, timer signal.ActivityUpdate
|
||||||
XtlsFilterTls13(buffer, numberOfPacketToFilter, isTLS13, isTLS12, isTLS, ctx)
|
XtlsFilterTls13(buffer, numberOfPacketToFilter, isTLS13, isTLS12, isTLS, ctx)
|
||||||
}
|
}
|
||||||
if filterTlsApplicationData && *isTLS {
|
if filterTlsApplicationData && *isTLS {
|
||||||
|
buffer = ReshapeMultiBuffer(ctx, buffer)
|
||||||
var xtlsSpecIndex int
|
var xtlsSpecIndex int
|
||||||
for i, b := range buffer {
|
for i, b := range buffer {
|
||||||
if b.Len() >= 6 && bytes.Equal(tlsApplicationDataStart, b.BytesTo(3)) {
|
if b.Len() >= 6 && bytes.Equal(tlsApplicationDataStart, b.BytesTo(3)) {
|
||||||
|
@ -428,6 +430,43 @@ func XtlsFilterTls13(buffer buf.MultiBuffer, numberOfPacketToFilter *int, isTLS1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReshapeMultiBuffer prepare multi buffer for padding stucture (max 21 bytes)
|
||||||
|
func ReshapeMultiBuffer(ctx context.Context, buffer buf.MultiBuffer) buf.MultiBuffer {
|
||||||
|
needReshape := false
|
||||||
|
for _, b := range buffer {
|
||||||
|
if b.Len() >= buf.Size - 21 {
|
||||||
|
needReshape = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !needReshape {
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
mb2 := make(buf.MultiBuffer, 0, len(buffer))
|
||||||
|
print := ""
|
||||||
|
for _, b := range buffer {
|
||||||
|
if b.Len() >= buf.Size - 21 {
|
||||||
|
index := int32(bytes.LastIndex(b.Bytes(), tlsApplicationDataStart))
|
||||||
|
if index <= 0 {
|
||||||
|
index = buf.Size / 2
|
||||||
|
}
|
||||||
|
buffer1 := buf.New()
|
||||||
|
buffer2 := buf.New()
|
||||||
|
buffer1.Write(b.BytesTo(index))
|
||||||
|
buffer2.Write(b.BytesFrom(index))
|
||||||
|
mb2 = append(mb2, buffer1, buffer2)
|
||||||
|
print += " " + strconv.Itoa(int(buffer1.Len())) + " " + strconv.Itoa(int(buffer2.Len()))
|
||||||
|
} else {
|
||||||
|
newbuffer := buf.New()
|
||||||
|
newbuffer.Write(b.Bytes())
|
||||||
|
mb2 = append(mb2, newbuffer)
|
||||||
|
print += " " + strconv.Itoa(int(b.Len()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buf.ReleaseMulti(buffer)
|
||||||
|
newError("ReshapeMultiBuffer ", print).WriteToLog(session.ExportIDToError(ctx))
|
||||||
|
return mb2
|
||||||
|
}
|
||||||
|
|
||||||
// XtlsPadding add padding to eliminate length siganature during tls handshake
|
// XtlsPadding add padding to eliminate length siganature during tls handshake
|
||||||
func XtlsPadding(b *buf.Buffer, command byte, userUUID *[]byte, ctx context.Context) *buf.Buffer {
|
func XtlsPadding(b *buf.Buffer, command byte, userUUID *[]byte, ctx context.Context) *buf.Buffer {
|
||||||
var length int32 = 0
|
var length int32 = 0
|
||||||
|
@ -480,7 +519,7 @@ func XtlsUnpadding(ctx context.Context, buffer buf.MultiBuffer, userUUID []byte,
|
||||||
b := buffer[i]
|
b := buffer[i]
|
||||||
for posByte < b.Len() {
|
for posByte < b.Len() {
|
||||||
if *remainingContent <= 0 && *remainingPadding <= 0 {
|
if *remainingContent <= 0 && *remainingPadding <= 0 {
|
||||||
if *currentCommand == 1 {
|
if *currentCommand == 1 { // possible buffer after padding, no need to worry about xtls (command 2)
|
||||||
len := b.Len() - posByte
|
len := b.Len() - posByte
|
||||||
newbuffer := buf.New()
|
newbuffer := buf.New()
|
||||||
newbuffer.Write(b.BytesRange(posByte, posByte+len))
|
newbuffer.Write(b.BytesRange(posByte, posByte+len))
|
||||||
|
|
|
@ -563,8 +563,8 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s
|
||||||
if requestAddons.Flow == vless.XRV {
|
if requestAddons.Flow == vless.XRV {
|
||||||
encoding.XtlsFilterTls13(multiBuffer, &numberOfPacketToFilter, &isTLS13, &isTLS12, &isTLS, ctx)
|
encoding.XtlsFilterTls13(multiBuffer, &numberOfPacketToFilter, &isTLS13, &isTLS12, &isTLS, ctx)
|
||||||
if isTLS {
|
if isTLS {
|
||||||
|
multiBuffer = encoding.ReshapeMultiBuffer(ctx, multiBuffer)
|
||||||
for i, b := range multiBuffer {
|
for i, b := range multiBuffer {
|
||||||
|
|
||||||
multiBuffer[i] = encoding.XtlsPadding(b, 0x00, &userUUID, ctx)
|
multiBuffer[i] = encoding.XtlsPadding(b, 0x00, &userUUID, ctx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue