"bytes"
"crypto"
"crypto/ecdh"
+ "crypto/fips140"
"crypto/internal/fips140/drbg"
"crypto/internal/rand"
"crypto/mlkem"
if err != nil {
return nil, err
}
- k, err := kem.curve.NewPublicKey(data[kem.pqEncapsKeySize:])
+ var k *ecdh.PublicKey
+ fips140.WithoutEnforcement(func() { // Hybrid of ML-KEM, which is Approved.
+ k, err = kem.curve.NewPublicKey(data[kem.pqEncapsKeySize:])
+ })
if err != nil {
return nil, err
}
var testingOnlyEncapsulate func() (ss, ct []byte)
func (pk *hybridPublicKey) encap() (sharedSecret []byte, encapPub []byte, err error) {
- skE, err := pk.t.Curve().GenerateKey(rand.Reader)
+ var skE *ecdh.PrivateKey
+ fips140.WithoutEnforcement(func() { // Hybrid of ML-KEM, which is Approved.
+ skE, err = pk.t.Curve().GenerateKey(rand.Reader)
+ })
if err != nil {
return nil, nil, err
}
if testingOnlyGenerateKey != nil {
skE = testingOnlyGenerateKey()
}
- ssT, err := skE.ECDH(pk.t)
+ var ssT []byte
+ fips140.WithoutEnforcement(func() {
+ ssT, err = skE.ECDH(pk.t)
+ })
if err != nil {
return nil, nil, err
}
seedT := make([]byte, kem.curveSeedSize)
for {
s.Read(seedT)
- k, err := kem.curve.NewPrivateKey(seedT)
+ var k ecdh.KeyExchanger
+ fips140.WithoutEnforcement(func() { // Hybrid of ML-KEM, which is Approved.
+ k, err = kem.curve.NewPrivateKey(seedT)
+ })
if err != nil {
continue
}
if err != nil {
return nil, err
}
- pub, err := k.t.Curve().NewPublicKey(ctT)
+ var pub *ecdh.PublicKey
+ fips140.WithoutEnforcement(func() { // Hybrid of ML-KEM, which is Approved.
+ pub, err = k.t.Curve().NewPublicKey(ctT)
+ })
if err != nil {
return nil, err
}
- ssT, err := k.t.ECDH(pub)
+ var ssT []byte
+ fips140.WithoutEnforcement(func() {
+ ssT, err = k.t.ECDH(pub)
+ })
if err != nil {
return nil, err
}