mirror of
https://github.com/XTLS/REALITY.git
synced 2025-08-22 14:38:35 +00:00
crypto/tls: move defaults into defaults.go
Fixes #65265 Updates #60790 Change-Id: Iaa5f475d614d3ed87f091c93a3f888b7eb3433f2 Reviewed-on: https://go-review.googlesource.com/c/go/+/587296 Auto-Submit: Filippo Valsorda <filippo@golang.org> Reviewed-by: Roland Shoemaker <roland@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Reviewed-by: Derek Parker <parkerderek86@gmail.com>
This commit is contained in:
parent
194e345d4a
commit
e27f1d3a30
2
auth.go
2
auth.go
@ -242,7 +242,7 @@ func selectSignatureScheme(vers uint16, c *Certificate, peerAlgs []SignatureSche
|
|||||||
// Pick signature scheme in the peer's preference order, as our
|
// Pick signature scheme in the peer's preference order, as our
|
||||||
// preference order is not configurable.
|
// preference order is not configurable.
|
||||||
for _, preferredAlg := range peerAlgs {
|
for _, preferredAlg := range peerAlgs {
|
||||||
if needFIPS() && !isSupportedSignatureAlgorithm(preferredAlg, fipsSupportedSignatureAlgorithms) {
|
if needFIPS() && !isSupportedSignatureAlgorithm(preferredAlg, defaultSupportedSignatureAlgorithmsFIPS) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if isSupportedSignatureAlgorithm(preferredAlg, supportedAlgs) {
|
if isSupportedSignatureAlgorithm(preferredAlg, supportedAlgs) {
|
||||||
|
@ -16,7 +16,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"hash"
|
"hash"
|
||||||
"runtime"
|
"runtime"
|
||||||
"slices"
|
|
||||||
|
|
||||||
"golang.org/x/crypto/chacha20poly1305"
|
"golang.org/x/crypto/chacha20poly1305"
|
||||||
"golang.org/x/sys/cpu"
|
"golang.org/x/sys/cpu"
|
||||||
@ -353,30 +352,6 @@ var tdesCiphers = map[uint16]bool{
|
|||||||
TLS_RSA_WITH_3DES_EDE_CBC_SHA: true,
|
TLS_RSA_WITH_3DES_EDE_CBC_SHA: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
func defaultCipherSuites() []uint16 {
|
|
||||||
suites := slices.Clone(cipherSuitesPreferenceOrder)
|
|
||||||
return slices.DeleteFunc(suites, func(c uint16) bool {
|
|
||||||
return disabledCipherSuites[c] ||
|
|
||||||
rsaKexCiphers[c] ||
|
|
||||||
tdesCiphers[c]
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// defaultCipherSuitesTLS13 is also the preference order, since there are no
|
|
||||||
// disabled by default TLS 1.3 cipher suites. The same AES vs ChaCha20 logic as
|
|
||||||
// cipherSuitesPreferenceOrder applies.
|
|
||||||
var defaultCipherSuitesTLS13 = []uint16{
|
|
||||||
TLS_AES_128_GCM_SHA256,
|
|
||||||
TLS_AES_256_GCM_SHA384,
|
|
||||||
TLS_CHACHA20_POLY1305_SHA256,
|
|
||||||
}
|
|
||||||
|
|
||||||
var defaultCipherSuitesTLS13NoAES = []uint16{
|
|
||||||
TLS_CHACHA20_POLY1305_SHA256,
|
|
||||||
TLS_AES_128_GCM_SHA256,
|
|
||||||
TLS_AES_256_GCM_SHA384,
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
hasGCMAsmAMD64 = cpu.X86.HasAES && cpu.X86.HasPCLMULQDQ
|
hasGCMAsmAMD64 = cpu.X86.HasAES && cpu.X86.HasPCLMULQDQ
|
||||||
hasGCMAsmARM64 = cpu.ARM64.HasAES && cpu.ARM64.HasPMULL
|
hasGCMAsmARM64 = cpu.ARM64.HasAES && cpu.ARM64.HasPMULL
|
||||||
|
75
common.go
75
common.go
@ -20,6 +20,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
@ -199,25 +200,6 @@ const (
|
|||||||
// hash function associated with the Ed25519 signature scheme.
|
// hash function associated with the Ed25519 signature scheme.
|
||||||
var directSigning crypto.Hash = 0
|
var directSigning crypto.Hash = 0
|
||||||
|
|
||||||
// defaultSupportedSignatureAlgorithms contains the signature and hash algorithms that
|
|
||||||
// the code advertises as supported in a TLS 1.2+ ClientHello and in a TLS 1.2+
|
|
||||||
// CertificateRequest. The two fields are merged to match with TLS 1.3.
|
|
||||||
// Note that in TLS 1.2, the ECDSA algorithms are not constrained to P-256, etc.
|
|
||||||
var defaultSupportedSignatureAlgorithms = []SignatureScheme{
|
|
||||||
PSSWithSHA256,
|
|
||||||
ECDSAWithP256AndSHA256,
|
|
||||||
Ed25519,
|
|
||||||
PSSWithSHA384,
|
|
||||||
PSSWithSHA512,
|
|
||||||
PKCS1WithSHA256,
|
|
||||||
PKCS1WithSHA384,
|
|
||||||
PKCS1WithSHA512,
|
|
||||||
ECDSAWithP384AndSHA384,
|
|
||||||
ECDSAWithP521AndSHA512,
|
|
||||||
PKCS1WithSHA1,
|
|
||||||
ECDSAWithSHA1,
|
|
||||||
}
|
|
||||||
|
|
||||||
// helloRetryRequestRandom is set as the Random value of a ServerHello
|
// helloRetryRequestRandom is set as the Random value of a ServerHello
|
||||||
// to signal that the message is actually a HelloRetryRequest.
|
// to signal that the message is actually a HelloRetryRequest.
|
||||||
var helloRetryRequestRandom = []byte{ // See RFC 8446, Section 4.1.3.
|
var helloRetryRequestRandom = []byte{ // See RFC 8446, Section 4.1.3.
|
||||||
@ -1052,13 +1034,19 @@ func (c *Config) time() time.Time {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Config) cipherSuites() []uint16 {
|
func (c *Config) cipherSuites() []uint16 {
|
||||||
|
if c.CipherSuites == nil {
|
||||||
|
if needFIPS() {
|
||||||
|
return defaultCipherSuitesFIPS
|
||||||
|
}
|
||||||
|
return defaultCipherSuites()
|
||||||
|
}
|
||||||
if needFIPS() {
|
if needFIPS() {
|
||||||
return fipsCipherSuites(c)
|
cipherSuites := slices.Clone(c.CipherSuites)
|
||||||
|
return slices.DeleteFunc(cipherSuites, func(id uint16) bool {
|
||||||
|
return !slices.Contains(defaultCipherSuitesFIPS, id)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
if c.CipherSuites != nil {
|
return c.CipherSuites
|
||||||
return c.CipherSuites
|
|
||||||
}
|
|
||||||
return defaultCipherSuites()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var supportedVersions = []uint16{
|
var supportedVersions = []uint16{
|
||||||
@ -1076,7 +1064,7 @@ const roleServer = false
|
|||||||
func (c *Config) supportedVersions(isClient bool) []uint16 {
|
func (c *Config) supportedVersions(isClient bool) []uint16 {
|
||||||
versions := make([]uint16, 0, len(supportedVersions))
|
versions := make([]uint16, 0, len(supportedVersions))
|
||||||
for _, v := range supportedVersions {
|
for _, v := range supportedVersions {
|
||||||
if needFIPS() && (v < fipsMinVersion(c) || v > fipsMaxVersion(c)) {
|
if needFIPS() && !slices.Contains(defaultSupportedVersionsFIPS, v) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if (c == nil || c.MinVersion == 0) && v < VersionTLS12 {
|
if (c == nil || c.MinVersion == 0) && v < VersionTLS12 {
|
||||||
@ -1115,21 +1103,26 @@ func supportedVersionsFromMax(maxVersion uint16) []uint16 {
|
|||||||
return versions
|
return versions
|
||||||
}
|
}
|
||||||
|
|
||||||
var defaultCurvePreferences = []CurveID{x25519Kyber768Draft00, X25519, CurveP256, CurveP384, CurveP521}
|
|
||||||
|
|
||||||
var defaultCurvePreferencesWithoutKyber = []CurveID{X25519, CurveP256, CurveP384, CurveP521}
|
|
||||||
|
|
||||||
func (c *Config) curvePreferences(version uint16) []CurveID {
|
func (c *Config) curvePreferences(version uint16) []CurveID {
|
||||||
if needFIPS() {
|
var curvePreferences []CurveID
|
||||||
return fipsCurvePreferences(c)
|
if c != nil && len(c.CurvePreferences) != 0 {
|
||||||
}
|
curvePreferences = slices.Clone(c.CurvePreferences)
|
||||||
if c == nil || len(c.CurvePreferences) == 0 {
|
if needFIPS() {
|
||||||
if version < VersionTLS13 || true /*tlskyber.Value() == "0"*/ {
|
return slices.DeleteFunc(curvePreferences, func(c CurveID) bool {
|
||||||
return defaultCurvePreferencesWithoutKyber
|
return !slices.Contains(defaultCurvePreferencesFIPS, c)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
return defaultCurvePreferences
|
} else if needFIPS() {
|
||||||
|
curvePreferences = slices.Clone(defaultCurvePreferencesFIPS)
|
||||||
|
} else {
|
||||||
|
curvePreferences = defaultCurvePreferences()
|
||||||
}
|
}
|
||||||
return c.CurvePreferences
|
if version < VersionTLS13 {
|
||||||
|
return slices.DeleteFunc(curvePreferences, func(c CurveID) bool {
|
||||||
|
return c == x25519Kyber768Draft00
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return curvePreferences
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Config) supportsCurve(version uint16, curve CurveID) bool {
|
func (c *Config) supportsCurve(version uint16, curve CurveID) bool {
|
||||||
@ -1580,6 +1573,14 @@ func unexpectedMessageError(wanted, got any) error {
|
|||||||
return fmt.Errorf("tls: received unexpected handshake message of type %T when waiting for %T", got, wanted)
|
return fmt.Errorf("tls: received unexpected handshake message of type %T when waiting for %T", got, wanted)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// supportedSignatureAlgorithms returns the supported signature algorithms.
|
||||||
|
func supportedSignatureAlgorithms() []SignatureScheme {
|
||||||
|
if !needFIPS() {
|
||||||
|
return defaultSupportedSignatureAlgorithms
|
||||||
|
}
|
||||||
|
return defaultSupportedSignatureAlgorithmsFIPS
|
||||||
|
}
|
||||||
|
|
||||||
func isSupportedSignatureAlgorithm(sigAlg SignatureScheme, supportedSignatureAlgorithms []SignatureScheme) bool {
|
func isSupportedSignatureAlgorithm(sigAlg SignatureScheme, supportedSignatureAlgorithms []SignatureScheme) bool {
|
||||||
for _, s := range supportedSignatureAlgorithms {
|
for _, s := range supportedSignatureAlgorithms {
|
||||||
if s == sigAlg {
|
if s == sigAlg {
|
||||||
|
106
defaults.go
Normal file
106
defaults.go
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
// Copyright 2024 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package reality
|
||||||
|
|
||||||
|
import (
|
||||||
|
"slices"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Defaults are collected in this file to allow distributions to more easily patch
|
||||||
|
// them to apply local policies.
|
||||||
|
|
||||||
|
//var tlskyber = godebug.New("tlskyber")
|
||||||
|
|
||||||
|
func defaultCurvePreferences() []CurveID {
|
||||||
|
if false {
|
||||||
|
return []CurveID{X25519, CurveP256, CurveP384, CurveP521}
|
||||||
|
}
|
||||||
|
// For now, x25519Kyber768Draft00 must always be followed by X25519.
|
||||||
|
return []CurveID{x25519Kyber768Draft00, X25519, CurveP256, CurveP384, CurveP521}
|
||||||
|
}
|
||||||
|
|
||||||
|
// defaultSupportedSignatureAlgorithms contains the signature and hash algorithms that
|
||||||
|
// the code advertises as supported in a TLS 1.2+ ClientHello and in a TLS 1.2+
|
||||||
|
// CertificateRequest. The two fields are merged to match with TLS 1.3.
|
||||||
|
// Note that in TLS 1.2, the ECDSA algorithms are not constrained to P-256, etc.
|
||||||
|
var defaultSupportedSignatureAlgorithms = []SignatureScheme{
|
||||||
|
PSSWithSHA256,
|
||||||
|
ECDSAWithP256AndSHA256,
|
||||||
|
Ed25519,
|
||||||
|
PSSWithSHA384,
|
||||||
|
PSSWithSHA512,
|
||||||
|
PKCS1WithSHA256,
|
||||||
|
PKCS1WithSHA384,
|
||||||
|
PKCS1WithSHA512,
|
||||||
|
ECDSAWithP384AndSHA384,
|
||||||
|
ECDSAWithP521AndSHA512,
|
||||||
|
PKCS1WithSHA1,
|
||||||
|
ECDSAWithSHA1,
|
||||||
|
}
|
||||||
|
|
||||||
|
//var tlsrsakex = godebug.New("tlsrsakex")
|
||||||
|
//var tls3des = godebug.New("tls3des")
|
||||||
|
|
||||||
|
func defaultCipherSuites() []uint16 {
|
||||||
|
suites := slices.Clone(cipherSuitesPreferenceOrder)
|
||||||
|
return slices.DeleteFunc(suites, func(c uint16) bool {
|
||||||
|
return disabledCipherSuites[c] ||
|
||||||
|
rsaKexCiphers[c] ||
|
||||||
|
tdesCiphers[c]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// defaultCipherSuitesTLS13 is also the preference order, since there are no
|
||||||
|
// disabled by default TLS 1.3 cipher suites. The same AES vs ChaCha20 logic as
|
||||||
|
// cipherSuitesPreferenceOrder applies.
|
||||||
|
var defaultCipherSuitesTLS13 = []uint16{
|
||||||
|
TLS_AES_128_GCM_SHA256,
|
||||||
|
TLS_AES_256_GCM_SHA384,
|
||||||
|
TLS_CHACHA20_POLY1305_SHA256,
|
||||||
|
}
|
||||||
|
|
||||||
|
var defaultCipherSuitesTLS13NoAES = []uint16{
|
||||||
|
TLS_CHACHA20_POLY1305_SHA256,
|
||||||
|
TLS_AES_128_GCM_SHA256,
|
||||||
|
TLS_AES_256_GCM_SHA384,
|
||||||
|
}
|
||||||
|
|
||||||
|
var defaultSupportedVersionsFIPS = []uint16{
|
||||||
|
VersionTLS12,
|
||||||
|
}
|
||||||
|
|
||||||
|
// defaultCurvePreferencesFIPS are the FIPS-allowed curves,
|
||||||
|
// in preference order (most preferable first).
|
||||||
|
var defaultCurvePreferencesFIPS = []CurveID{CurveP256, CurveP384, CurveP521}
|
||||||
|
|
||||||
|
// defaultSupportedSignatureAlgorithmsFIPS currently are a subset of
|
||||||
|
// defaultSupportedSignatureAlgorithms without Ed25519 and SHA-1.
|
||||||
|
var defaultSupportedSignatureAlgorithmsFIPS = []SignatureScheme{
|
||||||
|
PSSWithSHA256,
|
||||||
|
PSSWithSHA384,
|
||||||
|
PSSWithSHA512,
|
||||||
|
PKCS1WithSHA256,
|
||||||
|
ECDSAWithP256AndSHA256,
|
||||||
|
PKCS1WithSHA384,
|
||||||
|
ECDSAWithP384AndSHA384,
|
||||||
|
PKCS1WithSHA512,
|
||||||
|
ECDSAWithP521AndSHA512,
|
||||||
|
}
|
||||||
|
|
||||||
|
// defaultCipherSuitesFIPS are the FIPS-allowed cipher suites.
|
||||||
|
var defaultCipherSuitesFIPS = []uint16{
|
||||||
|
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
|
||||||
|
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
|
||||||
|
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
|
||||||
|
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
|
||||||
|
TLS_RSA_WITH_AES_128_GCM_SHA256,
|
||||||
|
TLS_RSA_WITH_AES_256_GCM_SHA384,
|
||||||
|
}
|
||||||
|
|
||||||
|
// defaultCipherSuitesTLS13FIPS are the FIPS-allowed cipher suites for TLS 1.3.
|
||||||
|
var defaultCipherSuitesTLS13FIPS = []uint16{
|
||||||
|
TLS_AES_128_GCM_SHA256,
|
||||||
|
TLS_AES_256_GCM_SHA384,
|
||||||
|
}
|
11
notboring.go
11
notboring.go
@ -7,14 +7,3 @@
|
|||||||
package reality
|
package reality
|
||||||
|
|
||||||
func needFIPS() bool { return false }
|
func needFIPS() bool { return false }
|
||||||
|
|
||||||
func supportedSignatureAlgorithms() []SignatureScheme {
|
|
||||||
return defaultSupportedSignatureAlgorithms
|
|
||||||
}
|
|
||||||
|
|
||||||
func fipsMinVersion(c *Config) uint16 { panic("fipsMinVersion") }
|
|
||||||
func fipsMaxVersion(c *Config) uint16 { panic("fipsMaxVersion") }
|
|
||||||
func fipsCurvePreferences(c *Config) []CurveID { panic("fipsCurvePreferences") }
|
|
||||||
func fipsCipherSuites(c *Config) []uint16 { panic("fipsCipherSuites") }
|
|
||||||
|
|
||||||
var fipsSupportedSignatureAlgorithms []SignatureScheme
|
|
||||||
|
Loading…
Reference in New Issue
Block a user