security: Allow passing `CurvePreferences` in advancedtls (#9292)
This PR adds a passthrough for `tls.Config.CurvePreferences` in
`advancedtls.Options`.
RELEASE NOTES:
* Add passthrough for `tls.Config.CurvePreferences` in
`advancedtls.Options`.
diff --git a/security/advancedtls/advancedtls.go b/security/advancedtls/advancedtls.go
index bbef75d..3c70323 100644
--- a/security/advancedtls/advancedtls.go
+++ b/security/advancedtls/advancedtls.go
@@ -221,6 +221,9 @@
// ciphersuites. TLS 1.3 ciphersuites are not configurable. If nil, a
// safe default list is used.
CipherSuites []uint16
+ // CurvePreferences contains the elliptic curves that will be used during the
+ // key exchange, in preference order. If empty, the default will be used.
+ CurvePreferences []tls.CurveID
// serverNameOverride is for testing only and only relevant on the client
// side. If set to a non-empty string, it will override the virtual host
// name of authority (e.g. :authority header field) in requests and the
@@ -278,6 +281,7 @@
MinVersion: o.MinTLSVersion,
MaxVersion: o.MaxTLSVersion,
CipherSuites: o.CipherSuites,
+ CurvePreferences: o.CurvePreferences,
}
// Propagate root-certificate-related fields in tls.Config.
switch {
@@ -363,10 +367,11 @@
clientAuth = tls.RequireAnyClientCert
}
config := &tls.Config{
- ClientAuth: clientAuth,
- MinVersion: o.MinTLSVersion,
- MaxVersion: o.MaxTLSVersion,
- CipherSuites: o.CipherSuites,
+ ClientAuth: clientAuth,
+ MinVersion: o.MinTLSVersion,
+ MaxVersion: o.MaxTLSVersion,
+ CipherSuites: o.CipherSuites,
+ CurvePreferences: o.CurvePreferences,
}
// Propagate root-certificate-related fields in tls.Config.
switch {
diff --git a/security/advancedtls/advancedtls_test.go b/security/advancedtls/advancedtls_test.go
index 9fcd2a8..a34ba3c 100644
--- a/security/advancedtls/advancedtls_test.go
+++ b/security/advancedtls/advancedtls_test.go
@@ -161,6 +161,7 @@
MinVersion uint16
MaxVersion uint16
cipherSuites []uint16
+ curvePreferences []tls.CurveID
}{
{
desc: "Use system default if no fields in RootCertificateOptions is specified",
@@ -187,6 +188,13 @@
tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
},
},
+ {
+ desc: "CurvePreferences plumbing through client options",
+ curvePreferences: []tls.CurveID{
+ tls.X25519,
+ tls.CurveP256,
+ },
+ },
}
for _, test := range tests {
test := test
@@ -198,6 +206,7 @@
MinTLSVersion: test.MinVersion,
MaxTLSVersion: test.MaxVersion,
CipherSuites: test.cipherSuites,
+ CurvePreferences: test.curvePreferences,
}
clientConfig, err := clientOptions.clientConfig()
if err != nil {
@@ -232,6 +241,9 @@
if diff := cmp.Diff(clientConfig.CipherSuites, test.cipherSuites); diff != "" {
t.Errorf("cipherSuites diff (-want +got):\n%s", diff)
}
+ if diff := cmp.Diff(clientConfig.CurvePreferences, test.curvePreferences); diff != "" {
+ t.Errorf("curvePreferences diff (-want +got):\n%s", diff)
+ }
})
}
}
@@ -317,6 +329,7 @@
MinVersion uint16
MaxVersion uint16
cipherSuites []uint16
+ curvePreferences []tls.CurveID
}{
{
desc: "Use system default if no fields in RootCertificateOptions is specified",
@@ -367,6 +380,19 @@
},
MinVersion: tls.VersionTLS12,
},
+ {
+ desc: "CurvePreferences plumbing through server options",
+ IdentityOptions: IdentityCertificateOptions{
+ Certificates: []tls.Certificate{},
+ },
+ RootOptions: RootCertificateOptions{
+ RootCertificates: x509.NewCertPool(),
+ },
+ curvePreferences: []tls.CurveID{
+ tls.X25519,
+ tls.CurveP256,
+ },
+ },
}
for _, test := range tests {
test := test
@@ -379,6 +405,7 @@
MinTLSVersion: test.MinVersion,
MaxTLSVersion: test.MaxVersion,
CipherSuites: test.cipherSuites,
+ CurvePreferences: test.curvePreferences,
}
serverConfig, err := serverOptions.serverConfig()
if err != nil {
@@ -395,6 +422,9 @@
if diff := cmp.Diff(serverConfig.CipherSuites, test.cipherSuites); diff != "" {
t.Errorf("cipherSuites diff (-want +got):\n%s", diff)
}
+ if diff := cmp.Diff(serverConfig.CurvePreferences, test.curvePreferences); diff != "" {
+ t.Errorf("curvePreferences diff (-want +got):\n%s", diff)
+ }
})
}
}