From ec5052e55f6dc94a44adcaf8e5e4693ac9e30584 Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Tue, 3 Mar 2020 18:56:43 +0800 Subject: [PATCH] obfs: tls max data length limitation --- obfs.go | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/obfs.go b/obfs.go index 060f4e5..f797af3 100644 --- a/obfs.go +++ b/obfs.go @@ -25,6 +25,10 @@ import ( dissector "github.com/ginuerzh/tls-dissector" ) +const ( + maxTLSDataLen = 16384 +) + type obfsHTTPTransporter struct { tcpTransporter } @@ -544,21 +548,30 @@ func (c *obfsTLSConn) Write(b []byte) (n int, err error) { } } - record := &dissector.Record{ - Type: dissector.AppData, - Version: tls.VersionTLS12, - Opaque: b, - } + for len(b) > 0 { + data := b + if len(b) > maxTLSDataLen { + data = b[:maxTLSDataLen] + b = b[maxTLSDdataLen:] + } else { + b = b[:0] + } + record := &dissector.Record{ + Type: dissector.AppData, + Version: tls.VersionTLS12, + Opaque: data, + } - if c.wbuf.Len() > 0 { - record.Type = dissector.Handshake - record.WriteTo(&c.wbuf) - _, err = c.wbuf.WriteTo(c.Conn) - return - } + if c.wbuf.Len() > 0 { + record.Type = dissector.Handshake + record.WriteTo(&c.wbuf) + _, err = c.wbuf.WriteTo(c.Conn) + return + } - if _, err = record.WriteTo(c.Conn); err != nil { - return + if _, err = record.WriteTo(c.Conn); err != nil { + return + } } return }