| // Copyright 2025 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. |
| |
| //go:build boringcrypto |
| |
| package tls |
| |
| import ( |
| "crypto/ecdsa" |
| "crypto/elliptic" |
| "crypto/rsa" |
| "crypto/x509" |
| ) |
| |
| // These Go+BoringCrypto policies mostly match BoringSSL's |
| // ssl_compliance_policy_fips_202205, which is based on NIST SP 800-52r2. |
| // https://cs.opensource.google/boringssl/boringssl/+/master:ssl/ssl_lib.cc;l=3289;drc=ea7a88fa |
| // |
| // P-521 is allowed per https://go.dev/issue/71757. |
| // |
| // They are applied when crypto/tls/fipsonly is imported with GOEXPERIMENT=boringcrypto. |
| |
| var ( |
| allowedSupportedVersionsFIPS = []uint16{ |
| VersionTLS12, |
| VersionTLS13, |
| } |
| allowedCurvePreferencesFIPS = []CurveID{ |
| CurveP256, |
| CurveP384, |
| CurveP521, |
| } |
| allowedSignatureAlgorithmsFIPS = []SignatureScheme{ |
| PSSWithSHA256, |
| PSSWithSHA384, |
| PSSWithSHA512, |
| PKCS1WithSHA256, |
| ECDSAWithP256AndSHA256, |
| PKCS1WithSHA384, |
| ECDSAWithP384AndSHA384, |
| PKCS1WithSHA512, |
| ECDSAWithP521AndSHA512, |
| } |
| allowedCipherSuitesFIPS = []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, |
| } |
| allowedCipherSuitesTLS13FIPS = []uint16{ |
| TLS_AES_128_GCM_SHA256, |
| TLS_AES_256_GCM_SHA384, |
| } |
| ) |
| |
| func isCertificateAllowedFIPS(c *x509.Certificate) bool { |
| // The key must be RSA 2048, RSA 3072, RSA 4096, |
| // or ECDSA P-256, P-384, P-521. |
| switch k := c.PublicKey.(type) { |
| case *rsa.PublicKey: |
| size := k.N.BitLen() |
| return size == 2048 || size == 3072 || size == 4096 |
| case *ecdsa.PublicKey: |
| return k.Curve == elliptic.P256() || k.Curve == elliptic.P384() || k.Curve == elliptic.P521() |
| } |
| |
| return false |
| } |