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)
+			}
 		})
 	}
 }