Skip to content

Commit b130dab

Browse files
FiloSottilegopherbot
authored andcommitted
crypto/hpke: apply fips140.WithoutEnforcement to ML-KEM+X25519 hybrid
Since it uses an Approved KEM (ML-KEM), the overall hybrid KEM is Approved, even if X25519 is not. Updates #70514 Updates #74630 Change-Id: I2bb60c36fcf570baa3c389e2daa3698e6a6a6964 Reviewed-on: https://go-review.googlesource.com/c/go/+/728505 Auto-Submit: Filippo Valsorda <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Roland Shoemaker <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]>
1 parent c39fe18 commit b130dab

File tree

1 file changed

+25
-6
lines changed

1 file changed

+25
-6
lines changed

src/crypto/hpke/pq.go

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"bytes"
99
"crypto"
1010
"crypto/ecdh"
11+
"crypto/fips140"
1112
"crypto/internal/fips140/drbg"
1213
"crypto/internal/rand"
1314
"crypto/mlkem"
@@ -168,7 +169,10 @@ func (kem *hybridKEM) NewPublicKey(data []byte) (PublicKey, error) {
168169
if err != nil {
169170
return nil, err
170171
}
171-
k, err := kem.curve.NewPublicKey(data[kem.pqEncapsKeySize:])
172+
var k *ecdh.PublicKey
173+
fips140.WithoutEnforcement(func() { // Hybrid of ML-KEM, which is Approved.
174+
k, err = kem.curve.NewPublicKey(data[kem.pqEncapsKeySize:])
175+
})
172176
if err != nil {
173177
return nil, err
174178
}
@@ -186,14 +190,20 @@ func (pk *hybridPublicKey) Bytes() []byte {
186190
var testingOnlyEncapsulate func() (ss, ct []byte)
187191

188192
func (pk *hybridPublicKey) encap() (sharedSecret []byte, encapPub []byte, err error) {
189-
skE, err := pk.t.Curve().GenerateKey(rand.Reader)
193+
var skE *ecdh.PrivateKey
194+
fips140.WithoutEnforcement(func() { // Hybrid of ML-KEM, which is Approved.
195+
skE, err = pk.t.Curve().GenerateKey(rand.Reader)
196+
})
190197
if err != nil {
191198
return nil, nil, err
192199
}
193200
if testingOnlyGenerateKey != nil {
194201
skE = testingOnlyGenerateKey()
195202
}
196-
ssT, err := skE.ECDH(pk.t)
203+
var ssT []byte
204+
fips140.WithoutEnforcement(func() {
205+
ssT, err = skE.ECDH(pk.t)
206+
})
197207
if err != nil {
198208
return nil, nil, err
199209
}
@@ -259,7 +269,10 @@ func (kem *hybridKEM) NewPrivateKey(priv []byte) (PrivateKey, error) {
259269
seedT := make([]byte, kem.curveSeedSize)
260270
for {
261271
s.Read(seedT)
262-
k, err := kem.curve.NewPrivateKey(seedT)
272+
var k ecdh.KeyExchanger
273+
fips140.WithoutEnforcement(func() { // Hybrid of ML-KEM, which is Approved.
274+
k, err = kem.curve.NewPrivateKey(seedT)
275+
})
263276
if err != nil {
264277
continue
265278
}
@@ -326,11 +339,17 @@ func (k *hybridPrivateKey) decap(enc []byte) ([]byte, error) {
326339
if err != nil {
327340
return nil, err
328341
}
329-
pub, err := k.t.Curve().NewPublicKey(ctT)
342+
var pub *ecdh.PublicKey
343+
fips140.WithoutEnforcement(func() { // Hybrid of ML-KEM, which is Approved.
344+
pub, err = k.t.Curve().NewPublicKey(ctT)
345+
})
330346
if err != nil {
331347
return nil, err
332348
}
333-
ssT, err := k.t.ECDH(pub)
349+
var ssT []byte
350+
fips140.WithoutEnforcement(func() {
351+
ssT, err = k.t.ECDH(pub)
352+
})
334353
if err != nil {
335354
return nil, err
336355
}

0 commit comments

Comments
 (0)