mirror of https://github.com/cbeuw/Cloak
Rebase fixup
This commit is contained in:
parent
0a6846fbfc
commit
018994bfd1
|
|
@ -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
|
||||
|
||||
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{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue