From 018994bfd1d3af91555e8fd2e7f498a3db33200c Mon Sep 17 00:00:00 2001 From: Andy Wang Date: Sat, 22 Apr 2023 12:51:18 +0200 Subject: [PATCH] Rebase fixup --- libcloak/client/browsers/browser.go | 41 ----------------------------- libcloak/client/config.go | 22 ++++++---------- libcloak/client/transports/TLS.go | 26 +++++++----------- 3 files changed, 18 insertions(+), 71 deletions(-) delete mode 100644 libcloak/client/browsers/browser.go diff --git a/libcloak/client/browsers/browser.go b/libcloak/client/browsers/browser.go deleted file mode 100644 index 3e89875..0000000 --- a/libcloak/client/browsers/browser.go +++ /dev/null @@ -1,41 +0,0 @@ -package browsers - -import "encoding/binary" - -type ClientHelloFields struct { - Random []byte - SessionId []byte - X25519KeyShare []byte - ServerName string -} - -// Browser represents the signature of a browser at a particular version -type Browser interface { - // ComposeClientHello produces the ClientHello message (without TLS record layer) as the mimicking browser would - ComposeClientHello(ClientHelloFields) []byte -} - -// addExtensionRecord, add type, length to extension data -func addExtRec(typ []byte, data []byte) []byte { - length := make([]byte, 2) - binary.BigEndian.PutUint16(length, uint16(len(data))) - ret := make([]byte, 2+2+len(data)) - copy(ret[0:2], typ) - copy(ret[2:4], length) - copy(ret[4:], data) - return ret -} - -func generateSNI(serverName string) []byte { - serverNameListLength := make([]byte, 2) - binary.BigEndian.PutUint16(serverNameListLength, uint16(len(serverName)+3)) - serverNameType := []byte{0x00} // host_name - serverNameLength := make([]byte, 2) - binary.BigEndian.PutUint16(serverNameLength, uint16(len(serverName))) - ret := make([]byte, 2+1+2+len(serverName)) - copy(ret[0:2], serverNameListLength) - copy(ret[2:3], serverNameType) - copy(ret[3:5], serverNameLength) - copy(ret[5:], serverName) - return ret -} diff --git a/libcloak/client/config.go b/libcloak/client/config.go index ffaf7f3..21bda3a 100644 --- a/libcloak/client/config.go +++ b/libcloak/client/config.go @@ -1,20 +1,13 @@ package client import ( - "crypto" - "encoding/json" "fmt" "github.com/cbeuw/Cloak/internal/common" - "github.com/cbeuw/Cloak/libcloak/client/browsers" "github.com/cbeuw/Cloak/libcloak/client/transports" - "io/ioutil" "net" "strings" "time" - "github.com/cbeuw/Cloak/internal/common" - log "github.com/sirupsen/logrus" - "github.com/cbeuw/Cloak/internal/ecdh" mux "github.com/cbeuw/Cloak/internal/multiplex" ) @@ -179,17 +172,18 @@ func (raw *Config) Process(worldState common.WorldState) (remote RemoteConnConfi CDNPort: cdnPort, } } - case "direct": - var browser browser + case "direct", "": + var browser transports.Browser switch strings.ToLower(raw.BrowserSig) { case "firefox": - browser = firefox + browser = transports.Firefox case "safari": - browser = safari - case "chrome": - fallthrough + browser = transports.Safari + case "chrome", "": + browser = transports.Chrome default: - browser = chrome + err = fmt.Errorf("unknown browser signature %v", raw.BrowserSig) + return } remote.TransportMaker = func() transports.Transport { return &transports.DirectTLS{ diff --git a/libcloak/client/transports/TLS.go b/libcloak/client/transports/TLS.go index b0dfedb..eaf514d 100644 --- a/libcloak/client/transports/TLS.go +++ b/libcloak/client/transports/TLS.go @@ -2,16 +2,11 @@ package transports import ( "github.com/cbeuw/Cloak/internal/common" - "github.com/cbeuw/Cloak/libcloak/client/browsers" utls "github.com/refraction-networking/utls" log "github.com/sirupsen/logrus" "net" - - "github.com/cbeuw/Cloak/internal/common" ) -const appDataMaxLength = 16401 - type clientHelloFields struct { random []byte sessionId []byte @@ -19,31 +14,30 @@ type clientHelloFields struct { serverName string } -type browser int +type Browser int const ( - chrome = iota - firefox - safari + Chrome = iota + Firefox + Safari ) type DirectTLS struct { *common.TLSConn - Browser browsers.Browser - browser browser + Browser Browser } -func buildClientHello(browser browser, fields clientHelloFields) ([]byte, error) { +func buildClientHello(browser Browser, fields clientHelloFields) ([]byte, error) { // We don't use utls to handle connections (as it'll attempt a real TLS negotiation) // We only want it to build the ClientHello locally fakeConn := net.TCPConn{} var helloID utls.ClientHelloID switch browser { - case chrome: + case Chrome: helloID = utls.HelloChrome_Auto - case firefox: + case Firefox: helloID = utls.HelloFirefox_Auto - case safari: + case Safari: helloID = utls.HelloSafari_Auto } @@ -92,7 +86,7 @@ func (tls *DirectTLS) Handshake(rawConn net.Conn, authInfo AuthInfo) (sessionKey serverName: authInfo.MockDomain, } var ch []byte - ch, err = buildClientHello(tls.browser, fields) + ch, err = buildClientHello(tls.Browser, fields) if err != nil { return }