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
|
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…
Reference in New Issue