refactor(netxlite): add factories to create TLS handshakers (#460)

See https://github.com/ooni/probe/issues/1591
This commit is contained in:
Simone Basso 2021-09-05 20:59:42 +02:00 committed by GitHub
parent 6a1e92cace
commit 5b8df394b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 61 additions and 3 deletions

View File

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

View File

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

View File

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

View File

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

View File

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