mirror of
https://github.com/XTLS/REALITY.git
synced 2025-08-22 14:38:35 +00:00
crypto/tls: align FIPS-only mode with BoringSSL policy
This enables TLS 1.3, disables P-521, and disables non-ECDHE suites. Reapplies CL 549975. Updates #64717 Updates #62372 Change-Id: I6c608704638d59a063a657fbd4eb1126027112dd Reviewed-on: https://go-review.googlesource.com/c/go/+/603376 Reviewed-by: Roland Shoemaker <roland@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
parent
ba70d1d948
commit
b9a81d6b52
@ -89,13 +89,16 @@ var defaultCipherSuitesTLS13NoAES = []uint16{
|
|||||||
TLS_AES_256_GCM_SHA384,
|
TLS_AES_256_GCM_SHA384,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The FIPS-only policies below match BoringSSL's ssl_policy_fips_202205.
|
||||||
|
|
||||||
var defaultSupportedVersionsFIPS = []uint16{
|
var defaultSupportedVersionsFIPS = []uint16{
|
||||||
VersionTLS12,
|
VersionTLS12,
|
||||||
|
VersionTLS13,
|
||||||
}
|
}
|
||||||
|
|
||||||
// defaultCurvePreferencesFIPS are the FIPS-allowed curves,
|
// defaultCurvePreferencesFIPS are the FIPS-allowed curves,
|
||||||
// in preference order (most preferable first).
|
// in preference order (most preferable first).
|
||||||
var defaultCurvePreferencesFIPS = []CurveID{CurveP256, CurveP384, CurveP521}
|
var defaultCurvePreferencesFIPS = []CurveID{CurveP256, CurveP384}
|
||||||
|
|
||||||
// defaultSupportedSignatureAlgorithmsFIPS currently are a subset of
|
// defaultSupportedSignatureAlgorithmsFIPS currently are a subset of
|
||||||
// defaultSupportedSignatureAlgorithms without Ed25519 and SHA-1.
|
// defaultSupportedSignatureAlgorithms without Ed25519 and SHA-1.
|
||||||
@ -108,7 +111,6 @@ var defaultSupportedSignatureAlgorithmsFIPS = []SignatureScheme{
|
|||||||
PKCS1WithSHA384,
|
PKCS1WithSHA384,
|
||||||
ECDSAWithP384AndSHA384,
|
ECDSAWithP384AndSHA384,
|
||||||
PKCS1WithSHA512,
|
PKCS1WithSHA512,
|
||||||
ECDSAWithP521AndSHA512,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// defaultCipherSuitesFIPS are the FIPS-allowed cipher suites.
|
// defaultCipherSuitesFIPS are the FIPS-allowed cipher suites.
|
||||||
@ -117,8 +119,6 @@ var defaultCipherSuitesFIPS = []uint16{
|
|||||||
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
|
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
|
||||||
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
|
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
|
||||||
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
|
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.
|
// defaultCipherSuitesTLS13FIPS are the FIPS-allowed cipher suites for TLS 1.3.
|
||||||
|
@ -141,13 +141,18 @@ func (c *Conn) makeClientHello() (*clientHelloMsg, *keySharePrivateKeys, *echCon
|
|||||||
if len(hello.supportedVersions) == 1 {
|
if len(hello.supportedVersions) == 1 {
|
||||||
hello.cipherSuites = nil
|
hello.cipherSuites = nil
|
||||||
}
|
}
|
||||||
if hasAESGCMHardwareSupport {
|
if needFIPS() {
|
||||||
|
hello.cipherSuites = append(hello.cipherSuites, defaultCipherSuitesTLS13FIPS...)
|
||||||
|
} else if hasAESGCMHardwareSupport {
|
||||||
hello.cipherSuites = append(hello.cipherSuites, defaultCipherSuitesTLS13...)
|
hello.cipherSuites = append(hello.cipherSuites, defaultCipherSuitesTLS13...)
|
||||||
} else {
|
} else {
|
||||||
hello.cipherSuites = append(hello.cipherSuites, defaultCipherSuitesTLS13NoAES...)
|
hello.cipherSuites = append(hello.cipherSuites, defaultCipherSuitesTLS13NoAES...)
|
||||||
}
|
}
|
||||||
|
|
||||||
curveID := config.curvePreferences(maxVersion)[0]
|
if len(hello.supportedCurves) == 0 {
|
||||||
|
return nil, nil, nil, errors.New("tls: no supported elliptic curves for ECDHE")
|
||||||
|
}
|
||||||
|
curveID := hello.supportedCurves[0]
|
||||||
keyShareKeys = &keySharePrivateKeys{curveID: curveID}
|
keyShareKeys = &keySharePrivateKeys{curveID: curveID}
|
||||||
if curveID == x25519Kyber768Draft00 {
|
if curveID == x25519Kyber768Draft00 {
|
||||||
keyShareKeys.ecdhe, err = generateECDHEKey(config.rand(), X25519)
|
keyShareKeys.ecdhe, err = generateECDHEKey(config.rand(), X25519)
|
||||||
|
@ -45,10 +45,6 @@ type clientHandshakeStateTLS13 struct {
|
|||||||
func (hs *clientHandshakeStateTLS13) handshake() error {
|
func (hs *clientHandshakeStateTLS13) handshake() error {
|
||||||
c := hs.c
|
c := hs.c
|
||||||
|
|
||||||
if needFIPS() {
|
|
||||||
return errors.New("tls: internal error: TLS 1.3 reached in FIPS mode")
|
|
||||||
}
|
|
||||||
|
|
||||||
// The server must not select TLS 1.3 in a renegotiation. See RFC 8446,
|
// The server must not select TLS 1.3 in a renegotiation. See RFC 8446,
|
||||||
// sections 4.1.2 and 4.1.3.
|
// sections 4.1.2 and 4.1.3.
|
||||||
if c.handshakes > 0 {
|
if c.handshakes > 0 {
|
||||||
|
@ -64,10 +64,6 @@ func init() {
|
|||||||
func (hs *serverHandshakeStateTLS13) handshake() error {
|
func (hs *serverHandshakeStateTLS13) handshake() error {
|
||||||
c := hs.c
|
c := hs.c
|
||||||
|
|
||||||
if needFIPS() {
|
|
||||||
return errors.New("tls: internal error: TLS 1.3 reached in FIPS mode")
|
|
||||||
}
|
|
||||||
|
|
||||||
// For an overview of the TLS 1.3 handshake, see RFC 8446, Section 2.
|
// For an overview of the TLS 1.3 handshake, see RFC 8446, Section 2.
|
||||||
/*
|
/*
|
||||||
if err := hs.processClientHello(); err != nil {
|
if err := hs.processClientHello(); err != nil {
|
||||||
@ -218,6 +214,9 @@ func (hs *serverHandshakeStateTLS13) processClientHello() error {
|
|||||||
if !hasAESGCMHardwareSupport || !aesgcmPreferred(hs.clientHello.cipherSuites) {
|
if !hasAESGCMHardwareSupport || !aesgcmPreferred(hs.clientHello.cipherSuites) {
|
||||||
preferenceList = defaultCipherSuitesTLS13NoAES
|
preferenceList = defaultCipherSuitesTLS13NoAES
|
||||||
}
|
}
|
||||||
|
if needFIPS() {
|
||||||
|
preferenceList = defaultCipherSuitesTLS13FIPS
|
||||||
|
}
|
||||||
for _, suiteID := range preferenceList {
|
for _, suiteID := range preferenceList {
|
||||||
hs.suite = mutualCipherSuiteTLS13(hs.clientHello.cipherSuites, suiteID)
|
hs.suite = mutualCipherSuiteTLS13(hs.clientHello.cipherSuites, suiteID)
|
||||||
if hs.suite != nil {
|
if hs.suite != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user