Rebase fixup

ptspec
Andy Wang 1 year ago
parent 0a6846fbfc
commit 018994bfd1
No known key found for this signature in database
GPG Key ID: 181B49F9F38F3374

@ -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
}

@ -1,20 +1,13 @@
package client package client
import ( import (
"crypto"
"encoding/json"
"fmt" "fmt"
"github.com/cbeuw/Cloak/internal/common" "github.com/cbeuw/Cloak/internal/common"
"github.com/cbeuw/Cloak/libcloak/client/browsers"
"github.com/cbeuw/Cloak/libcloak/client/transports" "github.com/cbeuw/Cloak/libcloak/client/transports"
"io/ioutil"
"net" "net"
"strings" "strings"
"time" "time"
"github.com/cbeuw/Cloak/internal/common"
log "github.com/sirupsen/logrus"
"github.com/cbeuw/Cloak/internal/ecdh" "github.com/cbeuw/Cloak/internal/ecdh"
mux "github.com/cbeuw/Cloak/internal/multiplex" mux "github.com/cbeuw/Cloak/internal/multiplex"
) )
@ -179,17 +172,18 @@ func (raw *Config) Process(worldState common.WorldState) (remote RemoteConnConfi
CDNPort: cdnPort, CDNPort: cdnPort,
} }
} }
case "direct": case "direct", "":
var browser browser var browser transports.Browser
switch strings.ToLower(raw.BrowserSig) { switch strings.ToLower(raw.BrowserSig) {
case "firefox": case "firefox":
browser = firefox browser = transports.Firefox
case "safari": case "safari":
browser = safari browser = transports.Safari
case "chrome": case "chrome", "":
fallthrough browser = transports.Chrome
default: default:
browser = chrome err = fmt.Errorf("unknown browser signature %v", raw.BrowserSig)
return
} }
remote.TransportMaker = func() transports.Transport { remote.TransportMaker = func() transports.Transport {
return &transports.DirectTLS{ return &transports.DirectTLS{

@ -2,16 +2,11 @@ package transports
import ( import (
"github.com/cbeuw/Cloak/internal/common" "github.com/cbeuw/Cloak/internal/common"
"github.com/cbeuw/Cloak/libcloak/client/browsers"
utls "github.com/refraction-networking/utls" utls "github.com/refraction-networking/utls"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"net" "net"
"github.com/cbeuw/Cloak/internal/common"
) )
const appDataMaxLength = 16401
type clientHelloFields struct { type clientHelloFields struct {
random []byte random []byte
sessionId []byte sessionId []byte
@ -19,31 +14,30 @@ type clientHelloFields struct {
serverName string serverName string
} }
type browser int type Browser int
const ( const (
chrome = iota Chrome = iota
firefox Firefox
safari Safari
) )
type DirectTLS struct { type DirectTLS struct {
*common.TLSConn *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 don't use utls to handle connections (as it'll attempt a real TLS negotiation)
// We only want it to build the ClientHello locally // We only want it to build the ClientHello locally
fakeConn := net.TCPConn{} fakeConn := net.TCPConn{}
var helloID utls.ClientHelloID var helloID utls.ClientHelloID
switch browser { switch browser {
case chrome: case Chrome:
helloID = utls.HelloChrome_Auto helloID = utls.HelloChrome_Auto
case firefox: case Firefox:
helloID = utls.HelloFirefox_Auto helloID = utls.HelloFirefox_Auto
case safari: case Safari:
helloID = utls.HelloSafari_Auto helloID = utls.HelloSafari_Auto
} }
@ -92,7 +86,7 @@ func (tls *DirectTLS) Handshake(rawConn net.Conn, authInfo AuthInfo) (sessionKey
serverName: authInfo.MockDomain, serverName: authInfo.MockDomain,
} }
var ch []byte var ch []byte
ch, err = buildClientHello(tls.browser, fields) ch, err = buildClientHello(tls.Browser, fields)
if err != nil { if err != nil {
return return
} }

Loading…
Cancel
Save