refactor(netxlite): add factories to create TLS handshakers (#460)
See https://github.com/ooni/probe/issues/1591
This commit is contained in:
parent
6a1e92cace
commit
5b8df394b1
|
@ -44,6 +44,7 @@ func reduceErrors(errorslist []error) error {
|
||||||
var (
|
var (
|
||||||
DefaultDialer = defaultDialer
|
DefaultDialer = defaultDialer
|
||||||
DefaultTLSHandshaker = defaultTLSHandshaker
|
DefaultTLSHandshaker = defaultTLSHandshaker
|
||||||
|
NewConnUTLS = newConnUTLS
|
||||||
)
|
)
|
||||||
|
|
||||||
// These types export internal names to legacy ooni/probe-cli code.
|
// These types export internal names to legacy ooni/probe-cli code.
|
||||||
|
|
|
@ -124,6 +124,15 @@ type TLSHandshaker interface {
|
||||||
net.Conn, tls.ConnectionState, error)
|
net.Conn, tls.ConnectionState, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewTLSHandshakerStdlib creates a new TLS handshaker using the
|
||||||
|
// go standard library to create TLS connections.
|
||||||
|
func NewTLSHandshakerStdlib(logger Logger) TLSHandshaker {
|
||||||
|
return &tlsHandshakerLogger{
|
||||||
|
TLSHandshaker: &tlsHandshakerConfigurable{},
|
||||||
|
Logger: logger,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// tlsHandshakerConfigurable is a configurable TLS handshaker that
|
// tlsHandshakerConfigurable is a configurable TLS handshaker that
|
||||||
// uses by default the standard library's TLS implementation.
|
// uses by default the standard library's TLS implementation.
|
||||||
type tlsHandshakerConfigurable struct {
|
type tlsHandshakerConfigurable struct {
|
||||||
|
|
|
@ -407,3 +407,21 @@ func TestTLSDialerConfigWithALPN(t *testing.T) {
|
||||||
t.Fatal(diff)
|
t.Fatal(diff)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestNewTLSHandshakerStdlibTypes(t *testing.T) {
|
||||||
|
th := NewTLSHandshakerStdlib(log.Log)
|
||||||
|
thl, okay := th.(*tlsHandshakerLogger)
|
||||||
|
if !okay {
|
||||||
|
t.Fatal("invalid type")
|
||||||
|
}
|
||||||
|
if thl.Logger != log.Log {
|
||||||
|
t.Fatal("invalid logger")
|
||||||
|
}
|
||||||
|
thc, okay := thl.TLSHandshaker.(*tlsHandshakerConfigurable)
|
||||||
|
if !okay {
|
||||||
|
t.Fatal("invalid type")
|
||||||
|
}
|
||||||
|
if thc.NewConn != nil {
|
||||||
|
t.Fatal("expected nil NewConn")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -7,13 +7,24 @@ import (
|
||||||
utls "gitlab.com/yawning/utls.git"
|
utls "gitlab.com/yawning/utls.git"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewTLSHandshakerUTLS creates a new TLS handshaker using the
|
||||||
|
// gitlab.com/yawning/utls library to create TLS conns.
|
||||||
|
func NewTLSHandshakerUTLS(logger Logger, id *utls.ClientHelloID) TLSHandshaker {
|
||||||
|
return &tlsHandshakerLogger{
|
||||||
|
TLSHandshaker: &tlsHandshakerConfigurable{
|
||||||
|
NewConn: newConnUTLS(id),
|
||||||
|
},
|
||||||
|
Logger: logger,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// utlsConn implements TLSConn and uses a utls UConn as its underlying connection
|
// utlsConn implements TLSConn and uses a utls UConn as its underlying connection
|
||||||
type utlsConn struct {
|
type utlsConn struct {
|
||||||
*utls.UConn
|
*utls.UConn
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewConnUTLS creates a NewConn function creating a utls connection with a specified ClientHelloID
|
// newConnUTLS creates a NewConn function creating a utls connection with a specified ClientHelloID
|
||||||
func NewConnUTLS(clientHello *utls.ClientHelloID) func(conn net.Conn, config *tls.Config) TLSConn {
|
func newConnUTLS(clientHello *utls.ClientHelloID) func(conn net.Conn, config *tls.Config) TLSConn {
|
||||||
return func(conn net.Conn, config *tls.Config) TLSConn {
|
return func(conn net.Conn, config *tls.Config) TLSConn {
|
||||||
uConfig := &utls.Config{
|
uConfig := &utls.Config{
|
||||||
RootCAs: config.RootCAs,
|
RootCAs: config.RootCAs,
|
||||||
|
|
|
@ -6,12 +6,13 @@ import (
|
||||||
"net"
|
"net"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/apex/log"
|
||||||
utls "gitlab.com/yawning/utls.git"
|
utls "gitlab.com/yawning/utls.git"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestUTLSHandshakerChrome(t *testing.T) {
|
func TestUTLSHandshakerChrome(t *testing.T) {
|
||||||
h := &tlsHandshakerConfigurable{
|
h := &tlsHandshakerConfigurable{
|
||||||
NewConn: NewConnUTLS(&utls.HelloChrome_Auto),
|
NewConn: newConnUTLS(&utls.HelloChrome_Auto),
|
||||||
}
|
}
|
||||||
cfg := &tls.Config{ServerName: "google.com"}
|
cfg := &tls.Config{ServerName: "google.com"}
|
||||||
conn, err := net.Dial("tcp", "google.com:443")
|
conn, err := net.Dial("tcp", "google.com:443")
|
||||||
|
@ -26,3 +27,21 @@ func TestUTLSHandshakerChrome(t *testing.T) {
|
||||||
t.Fatal("nil connection")
|
t.Fatal("nil connection")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestNewTLSHandshakerUTLSTypes(t *testing.T) {
|
||||||
|
th := NewTLSHandshakerUTLS(log.Log, &utls.HelloChrome_83)
|
||||||
|
thl, okay := th.(*tlsHandshakerLogger)
|
||||||
|
if !okay {
|
||||||
|
t.Fatal("invalid type")
|
||||||
|
}
|
||||||
|
if thl.Logger != log.Log {
|
||||||
|
t.Fatal("invalid logger")
|
||||||
|
}
|
||||||
|
thc, okay := thl.TLSHandshaker.(*tlsHandshakerConfigurable)
|
||||||
|
if !okay {
|
||||||
|
t.Fatal("invalid type")
|
||||||
|
}
|
||||||
|
if thc.NewConn == nil {
|
||||||
|
t.Fatal("expected non-nil NewConn")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user