From ac0f415d2e1b877b8d26ab42fe3e370da103f5b3 Mon Sep 17 00:00:00 2001 From: yuhan6665 <1588741+yuhan6665@users.noreply.github.com> Date: Sun, 10 May 2026 22:25:36 -0400 Subject: [PATCH] crypto/tls: wrap ML-KEM hybrids in fips140.WithoutEnforcement Fixes #78298 Fixes #78178 Fixes #75528 Fixes #75166 Fixes #76112 Change-Id: Ie78f3bf5f0b232482da44aba28a0f6d66a6a6964 Reviewed-on: https://go-review.googlesource.com/c/go/+/759383 Reviewed-by: David Chase LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com Reviewed-by: Daniel McCarney Reviewed-by: Mark Freeman Auto-Submit: Filippo Valsorda --- key_schedule.go | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/key_schedule.go b/key_schedule.go index 0d14dc3..b07a86f 100644 --- a/key_schedule.go +++ b/key_schedule.go @@ -7,6 +7,7 @@ package reality import ( "crypto" "crypto/ecdh" + "crypto/fips140" "crypto/hmac" "crypto/mlkem" "errors" @@ -166,7 +167,14 @@ type hybridKeyExchange struct { } func (ke *hybridKeyExchange) keyShares(rand io.Reader) (*keySharePrivateKeys, []keyShare, error) { - priv, ecdhShares, err := ke.ecdh.keyShares(rand) + var ( + priv *keySharePrivateKeys + ecdhShares []keyShare + err error + ) + fips140.WithoutEnforcement(func() { // Hybrid of ML-KEM, which is Approved. + priv, ecdhShares, err = ke.ecdh.keyShares(rand) + }) if err != nil { return nil, nil, err } @@ -202,7 +210,14 @@ func (ke *hybridKeyExchange) serverSharedSecret(rand io.Reader, clientKeyShare [ ecdhShareData = clientKeyShare[:ke.ecdhElementSize] mlkemShareData = clientKeyShare[ke.ecdhElementSize:] } - ecdhSharedSecret, ks, err := ke.ecdh.serverSharedSecret(rand, ecdhShareData) + var ( + ecdhSharedSecret []byte + ks keyShare + err error + ) + fips140.WithoutEnforcement(func() { // Hybrid of ML-KEM, which is Approved. + ecdhSharedSecret, ks, err = ke.ecdh.serverSharedSecret(rand, ecdhShareData) + }) if err != nil { return nil, keyShare{}, err } @@ -235,7 +250,13 @@ func (ke *hybridKeyExchange) clientSharedSecret(priv *keySharePrivateKeys, serve ecdhShareData = serverKeyShare[:ke.ecdhElementSize] mlkemShareData = serverKeyShare[ke.ecdhElementSize:] } - ecdhSharedSecret, err := ke.ecdh.clientSharedSecret(priv, ecdhShareData) + var ( + ecdhSharedSecret []byte + err error + ) + fips140.WithoutEnforcement(func() { // Hybrid of ML-KEM, which is Approved. + ecdhSharedSecret, err = ke.ecdh.clientSharedSecret(priv, ecdhShareData) + }) if err != nil { return nil, err }