|
|
|
@ -10,6 +10,7 @@ import (
|
|
|
|
|
"io"
|
|
|
|
|
"math/big"
|
|
|
|
|
"runtime"
|
|
|
|
|
"strconv"
|
|
|
|
|
"syscall"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
@ -339,6 +340,7 @@ func XtlsWrite(reader buf.Reader, writer buf.Writer, timer signal.ActivityUpdate
|
|
|
|
|
XtlsFilterTls13(buffer, numberOfPacketToFilter, isTLS13, isTLS12, isTLS, ctx)
|
|
|
|
|
}
|
|
|
|
|
if filterTlsApplicationData && *isTLS {
|
|
|
|
|
buffer = ReshapeMultiBuffer(ctx, buffer)
|
|
|
|
|
var xtlsSpecIndex int
|
|
|
|
|
for i, b := range buffer {
|
|
|
|
|
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
|
|
|
|
|
func XtlsPadding(b *buf.Buffer, command byte, userUUID *[]byte, ctx context.Context) *buf.Buffer {
|
|
|
|
|
var length int32 = 0
|
|
|
|
@ -480,7 +519,7 @@ func XtlsUnpadding(ctx context.Context, buffer buf.MultiBuffer, userUUID []byte,
|
|
|
|
|
b := buffer[i]
|
|
|
|
|
for posByte < b.Len() {
|
|
|
|
|
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
|
|
|
|
|
newbuffer := buf.New()
|
|
|
|
|
newbuffer.Write(b.BytesRange(posByte, posByte+len))
|
|
|
|
|