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 {
186190var testingOnlyEncapsulate func () (ss , ct []byte )
187191
188192func (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