@@ -28,8 +28,13 @@ import (
2828 "github.com/quic-go/quic-go/http3"
2929 "golang.org/x/net/http2"
3030 netproxy "golang.org/x/net/proxy"
31+ "golang.org/x/sys/cpu"
3132)
3233
34+ var hasAESGCMHardwareSupport = cpu .X86 .HasAES && cpu .X86 .HasPCLMULQDQ ||
35+ cpu .ARM64 .HasAES && cpu .ARM64 .HasPMULL ||
36+ cpu .S390X .HasAES && cpu .S390X .HasAESGCM
37+
3338const (
3439 DefaultBootstrapResolver = "9.9.9.9:53"
3540 DefaultKeepAlive = 5 * time .Second
@@ -77,6 +82,7 @@ type XTransport struct {
7782 http3 bool
7883 http3Probe bool
7984 tlsDisableSessionTickets bool
85+ tlsPreferRSA bool
8086 proxyDialer * netproxy.Dialer
8187 httpProxyFunction func (* http.Request ) (* url.URL , error )
8288 tlsClientCreds DOHClientCreds
@@ -99,6 +105,7 @@ func NewXTransport() *XTransport {
99105 useIPv6 : false ,
100106 http3Probe : false ,
101107 tlsDisableSessionTickets : false ,
108+ tlsPreferRSA : false ,
102109 keyLogWriter : nil ,
103110 }
104111 return & xTransport
@@ -328,6 +335,28 @@ func (xTransport *XTransport) rebuildTransport() {
328335 if xTransport .tlsDisableSessionTickets {
329336 tlsClientConfig .SessionTicketsDisabled = true
330337 }
338+ if xTransport .tlsPreferRSA {
339+ tlsClientConfig .MaxVersion = tls .VersionTLS12
340+ if hasAESGCMHardwareSupport {
341+ tlsClientConfig .CipherSuites = []uint16 {
342+ tls .TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ,
343+ tls .TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ,
344+ tls .TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 ,
345+ tls .TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 ,
346+ tls .TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 ,
347+ tls .TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 ,
348+ }
349+ } else {
350+ tlsClientConfig .CipherSuites = []uint16 {
351+ tls .TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 ,
352+ tls .TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ,
353+ tls .TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ,
354+ tls .TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 ,
355+ tls .TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 ,
356+ tls .TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 ,
357+ }
358+ }
359+ }
331360 transport .TLSClientConfig = & tlsClientConfig
332361 if http2Transport , _ := http2 .ConfigureTransports (transport ); http2Transport != nil {
333362 http2Transport .ReadIdleTimeout = timeout
0 commit comments