Switch to Go standard library functions where available

Change-Id: I84c157f0a810a3d04e2f58b829073f6a49efdbd6
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/76187
Auto-Submit: David Benjamin <davidben@google.com>
Commit-Queue: David Benjamin <davidben@google.com>
Reviewed-by: Bob Beck <bbe@google.com>
diff --git a/go.mod b/go.mod
index b308b1e..811bf7d 100644
--- a/go.mod
+++ b/go.mod
@@ -4,7 +4,6 @@
 
 require (
 	filippo.io/edwards25519 v1.1.0
-	filippo.io/mlkem768 v0.0.0-20241021091500-d85de16e2039
 	golang.org/x/crypto v0.31.0
 	golang.org/x/net v0.27.0
 )
diff --git a/go.sum b/go.sum
index 5683f99..3b0bcfc 100644
--- a/go.sum
+++ b/go.sum
@@ -1,7 +1,5 @@
 filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
 filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
-filippo.io/mlkem768 v0.0.0-20241021091500-d85de16e2039 h1:I/alPPIVzEkPeQKVU7Sl5gv/sQ0IC4zgqHiACrSgUW8=
-filippo.io/mlkem768 v0.0.0-20241021091500-d85de16e2039/go.mod h1:IkpYfciLz5fI/S4/Z0NlhR4cpv6ubCMDnIwAe0XiojA=
 golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
 golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
 golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
diff --git a/ssl/test/runner/hpke/kem.go b/ssl/test/runner/hpke/kem.go
index 4955433..6bc58a7 100644
--- a/ssl/test/runner/hpke/kem.go
+++ b/ssl/test/runner/hpke/kem.go
@@ -16,10 +16,10 @@
 
 import (
 	"crypto"
+	"crypto/hkdf"
 	"crypto/rand"
 
 	"golang.org/x/crypto/curve25519"
-	"golang.org/x/crypto/hkdf"
 )
 
 const (
@@ -44,7 +44,11 @@
 	labeledIKM = append(labeledIKM, suiteID...)
 	labeledIKM = append(labeledIKM, label...)
 	labeledIKM = append(labeledIKM, ikm...)
-	return hkdf.Extract(kdfHash.New, labeledIKM, salt)
+	ret, err := hkdf.Extract(kdfHash.New, labeledIKM, salt)
+	if err != nil {
+		panic(err)
+	}
+	return ret
 }
 
 func labeledExpand(kdfHash crypto.Hash, prk, suiteID, label, info []byte, length int) []byte {
@@ -60,11 +64,9 @@
 	labeledInfo = append(labeledInfo, label...)
 	labeledInfo = append(labeledInfo, info...)
 
-	reader := hkdf.Expand(kdfHash.New, prk, labeledInfo)
-	key := make([]uint8, length)
-	_, err := reader.Read(key)
+	key, err := hkdf.Expand(kdfHash.New, prk, string(labeledInfo), length)
 	if err != nil {
-		panic("failed to perform HKDF expand operation")
+		panic(err)
 	}
 	return key
 }
diff --git a/ssl/test/runner/key_agreement.go b/ssl/test/runner/key_agreement.go
index b5a0e1a..fa57b9f 100644
--- a/ssl/test/runner/key_agreement.go
+++ b/ssl/test/runner/key_agreement.go
@@ -9,6 +9,7 @@
 	"crypto/ecdsa"
 	"crypto/ed25519"
 	"crypto/elliptic"
+	"crypto/mlkem"
 	"crypto/rsa"
 	"crypto/subtle"
 	"crypto/x509"
@@ -19,7 +20,6 @@
 	"slices"
 
 	"boringssl.googlesource.com/boringssl.git/ssl/test/runner/kyber"
-	"filippo.io/mlkem768"
 	"golang.org/x/crypto/curve25519"
 )
 
@@ -432,23 +432,23 @@
 
 // mlkem768KEM implements ML-KEM-768
 type mlkem768KEM struct {
-	decapKey *mlkem768.DecapsulationKey
+	decapKey *mlkem.DecapsulationKey768
 }
 
 func (e *mlkem768KEM) encapsulationKeySize() int {
-	return mlkem768.EncapsulationKeySize
+	return mlkem.EncapsulationKeySize768
 }
 
 func (e *mlkem768KEM) ciphertextSize() int {
-	return mlkem768.CiphertextSize
+	return mlkem.CiphertextSize768
 }
 
 func (m *mlkem768KEM) generate(config *Config) (publicKey []byte, err error) {
-	m.decapKey, err = mlkem768.GenerateKey()
+	m.decapKey, err = mlkem.GenerateKey768()
 	if err != nil {
 		return
 	}
-	publicKey = m.decapKey.EncapsulationKey()
+	publicKey = m.decapKey.EncapsulationKey().Bytes()
 	if config.Bugs.MLKEMEncapKeyNotReduced {
 		// Set the first 12 bits so that the first word is definitely
 		// not reduced.
@@ -459,11 +459,16 @@
 }
 
 func (m *mlkem768KEM) encap(config *Config, peerKey []byte) (ciphertext []byte, secret []byte, err error) {
-	return mlkem768.Encapsulate(peerKey)
+	key, err := mlkem.NewEncapsulationKey768(peerKey)
+	if err != nil {
+		return nil, nil, err
+	}
+	secret, ciphertext = key.Encapsulate()
+	return
 }
 
 func (m *mlkem768KEM) decap(config *Config, ciphertext []byte) (secret []byte, err error) {
-	return mlkem768.Decapsulate(m.decapKey, ciphertext)
+	return m.decapKey.Decapsulate(ciphertext)
 }
 
 // concatKEM concatenates two kemImplementations.
diff --git a/ssl/test/runner/kyber/kyber.go b/ssl/test/runner/kyber/kyber.go
index acae886..c3f3a87 100644
--- a/ssl/test/runner/kyber/kyber.go
+++ b/ssl/test/runner/kyber/kyber.go
@@ -17,10 +17,9 @@
 // This code is ported from kyber.c.
 
 import (
+	"crypto/sha3"
 	"crypto/subtle"
 	"io"
-
-	"golang.org/x/crypto/sha3"
 )
 
 const (
@@ -255,8 +254,7 @@
 }
 
 func (s *scalar) centeredBinomialEta2(input *[33]byte) {
-	var entropy [128]byte
-	sha3.ShakeSum256(entropy[:], input[:])
+	entropy := sha3.SumSHAKE256(input[:], 128)
 
 	for i := 0; i < len(s); i += 2 {
 		b := uint16(entropy[i/2])
@@ -452,7 +450,7 @@
 type matrix [rank][rank]scalar
 
 func (m *matrix) expand(rho *[32]byte) {
-	shake := sha3.NewShake128()
+	shake := sha3.NewSHAKE128()
 
 	var input [34]byte
 	copy(input[:], rho[:])
@@ -538,7 +536,7 @@
 	ciphertext := pub.encryptCPA(entropy, (*[32]byte)(prekeyAndRandomness[32:]))
 	ciphertextHash := sha3.Sum256(ciphertext[:])
 	copy(prekeyAndRandomness[32:], ciphertextHash[:])
-	sha3.ShakeSum256(outSharedSecret, prekeyAndRandomness[:])
+	copy(outSharedSecret, sha3.SumSHAKE256(prekeyAndRandomness[:], len(outSharedSecret)))
 	return ciphertext
 }
 
@@ -605,7 +603,7 @@
 	}
 	ciphertextHash := sha3.Sum256(ciphertext[:])
 
-	shake := sha3.NewShake256()
+	shake := sha3.NewSHAKE256()
 	shake.Write(secret[:])
 	shake.Write(ciphertextHash[:])
 	shake.Read(outSharedSecret)
diff --git a/ssl/test/runner/kyber/kyber_test.go b/ssl/test/runner/kyber/kyber_test.go
index 2dd20d0..5ad7cae 100644
--- a/ssl/test/runner/kyber/kyber_test.go
+++ b/ssl/test/runner/kyber/kyber_test.go
@@ -17,13 +17,12 @@
 import (
 	"bufio"
 	"bytes"
+	"crypto/sha3"
 	"encoding/hex"
 	"flag"
 	"os"
 	"strings"
 	"testing"
-
-	"golang.org/x/crypto/sha3"
 )
 
 var testVectorsPath = flag.String("test-vectors", "../../../../crypto/kyber/kyber_tests.txt", "The path to the test vectors to use")
@@ -96,7 +95,7 @@
 }
 
 func TestIteration(t *testing.T) {
-	h := sha3.NewShake256()
+	h := sha3.NewSHAKE256()
 
 	for i := 0; i < 4096; i++ {
 		var generateEntropy [64]byte
diff --git a/ssl/test/runner/prf.go b/ssl/test/runner/prf.go
index c497ae9..4585e46 100644
--- a/ssl/test/runner/prf.go
+++ b/ssl/test/runner/prf.go
@@ -6,6 +6,7 @@
 
 import (
 	"crypto"
+	"crypto/hkdf"
 	"crypto/hmac"
 	"crypto/md5"
 	"crypto/sha1"
@@ -14,7 +15,6 @@
 	"hash"
 
 	"golang.org/x/crypto/cryptobyte"
-	"golang.org/x/crypto/hkdf"
 )
 
 // copyHash returns a copy of |h|, which must be an instance of |hashType|.
@@ -341,7 +341,11 @@
 
 // addEntropy incorporates ikm into the running TLS 1.3 secret with HKDF-Expand.
 func (h *finishedHash) addEntropy(ikm []byte) {
-	h.secret = hkdf.Extract(h.suite.hash().New, ikm, h.secret)
+	var err error
+	h.secret, err = hkdf.Extract(h.suite.hash().New, ikm, h.secret)
+	if err != nil {
+		panic(err)
+	}
 }
 
 func (h *finishedHash) nextSecret() {
@@ -371,9 +375,9 @@
 	x = x[len(label):]
 	x[0] = byte(len(hashValue))
 	copy(x[1:], hashValue)
-	ret := make([]byte, length)
-	if n, err := hkdf.Expand(hash.New, secret, hkdfLabel).Read(ret); err != nil || n != length {
-		panic("hkdfExpandLabel: hkdf.Expand unexpectedly failed")
+	ret, err := hkdf.Expand(hash.New, secret, string(hkdfLabel), length)
+	if err != nil {
+		panic(err)
 	}
 	return ret
 }
@@ -414,7 +418,10 @@
 // in sections 7.2 and 7.2.1 of draft-ietf-tls-esni-13. The transcript hash is
 // computed by concatenating |h| with |extraMessages|.
 func (h *finishedHash) echAcceptConfirmation(clientRandom, label, extraMessages []byte) []byte {
-	secret := hkdf.Extract(h.suite.hash().New, clientRandom, h.zeroSecret())
+	secret, err := hkdf.Extract(h.suite.hash().New, clientRandom, h.zeroSecret())
+	if err != nil {
+		panic(err)
+	}
 	hashCopy := copyHash(h.hash, h.suite.hash())
 	hashCopy.Write(extraMessages)
 	return hkdfExpandLabel(h.suite.hash(), secret, label, hashCopy.Sum(nil), echAcceptConfirmationLength, h.isDTLS)
diff --git a/ssl/test/runner/spake2plus/spake2plus.go b/ssl/test/runner/spake2plus/spake2plus.go
index 048e12e..abef785 100644
--- a/ssl/test/runner/spake2plus/spake2plus.go
+++ b/ssl/test/runner/spake2plus/spake2plus.go
@@ -18,6 +18,7 @@
 import (
 	"bytes"
 	"crypto/elliptic"
+	"crypto/hkdf"
 	"crypto/hmac"
 	"crypto/rand"
 	"crypto/sha256"
@@ -26,7 +27,6 @@
 	"io"
 	"math/big"
 
-	"golang.org/x/crypto/hkdf"
 	"golang.org/x/crypto/scrypt"
 )
 
@@ -330,9 +330,10 @@
 }
 
 func doHKDF(ikm, info []byte, size int) []byte {
-	h := hkdf.New(sha256.New, ikm, nil, info)
-	out := make([]byte, size)
-	h.Read(out)
+	out, err := hkdf.Key(sha256.New, ikm, nil, string(info), size)
+	if err != nil {
+		panic(err)
+	}
 	return out
 }
 
diff --git a/util/fipstools/acvp/acvptool/testmodulewrapper/testmodulewrapper.go b/util/fipstools/acvp/acvptool/testmodulewrapper/testmodulewrapper.go
index 98c520d..83691d6 100644
--- a/util/fipstools/acvp/acvptool/testmodulewrapper/testmodulewrapper.go
+++ b/util/fipstools/acvp/acvptool/testmodulewrapper/testmodulewrapper.go
@@ -24,9 +24,12 @@
 	"crypto/aes"
 	"crypto/cipher"
 	"crypto/ed25519"
+	"crypto/hkdf"
 	"crypto/hmac"
+	"crypto/pbkdf2"
 	"crypto/rand"
 	"crypto/sha256"
+	"crypto/sha3"
 	"crypto/sha512"
 	"encoding/binary"
 	"errors"
@@ -37,9 +40,6 @@
 
 	"filippo.io/edwards25519"
 
-	"golang.org/x/crypto/hkdf"
-	"golang.org/x/crypto/pbkdf2"
-	"golang.org/x/crypto/sha3"
 	"golang.org/x/crypto/xts"
 )
 
@@ -64,16 +64,16 @@
 	"EDDSA/keyVer":             eddsaKeyVer,
 	"EDDSA/sigGen":             eddsaSigGen,
 	"EDDSA/sigVer":             eddsaSigVer,
-	"SHAKE-128":                shakeAftVot(sha3.NewShake128),
-	"SHAKE-128/VOT":            shakeAftVot(sha3.NewShake128),
-	"SHAKE-128/MCT":            shakeMct(sha3.NewShake128),
-	"SHAKE-256":                shakeAftVot(sha3.NewShake256),
-	"SHAKE-256/VOT":            shakeAftVot(sha3.NewShake256),
-	"SHAKE-256/MCT":            shakeMct(sha3.NewShake256),
-	"cSHAKE-128":               cShakeAft(sha3.NewCShake128),
-	"cSHAKE-128/MCT":           cShakeMct(sha3.NewCShake128),
-	"cSHAKE-256":               cShakeAft(sha3.NewCShake256),
-	"cSHAKE-256/MCT":           cShakeMct(sha3.NewCShake256),
+	"SHAKE-128":                shakeAftVot(sha3.NewSHAKE128),
+	"SHAKE-128/VOT":            shakeAftVot(sha3.NewSHAKE128),
+	"SHAKE-128/MCT":            shakeMct(sha3.NewSHAKE128),
+	"SHAKE-256":                shakeAftVot(sha3.NewSHAKE256),
+	"SHAKE-256/VOT":            shakeAftVot(sha3.NewSHAKE256),
+	"SHAKE-256/MCT":            shakeMct(sha3.NewSHAKE256),
+	"cSHAKE-128":               cShakeAft(sha3.NewCSHAKE128),
+	"cSHAKE-128/MCT":           cShakeMct(sha3.NewCSHAKE128),
+	"cSHAKE-256":               cShakeAft(sha3.NewCSHAKE256),
+	"cSHAKE-256/MCT":           cShakeMct(sha3.NewCSHAKE256),
 }
 
 func flush(args [][]byte) error {
@@ -428,9 +428,10 @@
 
 	length := binary.LittleEndian.Uint32(lengthBytes)
 
-	mac := hkdf.New(sha256.New, key, salt, info)
-	ret := make([]byte, length)
-	mac.Read(ret)
+	ret, err := hkdf.Key(sha256.New, key, salt, string(info), int(length))
+	if err != nil {
+		return err
+	}
 
 	return reply(ret)
 }
@@ -615,13 +616,13 @@
 	case "SHA2-512/256":
 		h = sha512.New512_256
 	case "SHA3-224":
-		h = sha3.New224
+		h = func() hash.Hash { return sha3.New224() }
 	case "SHA3-256":
-		h = sha3.New256
+		h = func() hash.Hash { return sha3.New256() }
 	case "SHA3-384":
-		h = sha3.New384
+		h = func() hash.Hash { return sha3.New384() }
 	case "SHA3-512":
-		h = sha3.New512
+		h = func() hash.Hash { return sha3.New512() }
 	default:
 		return fmt.Errorf("pbkdf unknown HMAC algorithm: %q", hmacName)
 	}
@@ -629,7 +630,10 @@
 	salt, password := args[2], args[3]
 	iterationCount := binary.LittleEndian.Uint32(args[4])
 
-	derivedKey := pbkdf2.Key(password, salt, int(iterationCount), int(keyLen), h)
+	derivedKey, err := pbkdf2.Key(h, string(password), salt, int(iterationCount), int(keyLen))
+	if err != nil {
+		return err
+	}
 
 	return reply(derivedKey)
 }
@@ -731,7 +735,7 @@
 	return reply([]byte{1})
 }
 
-func shakeAftVot(digestFn func() sha3.ShakeHash) func([][]byte) error {
+func shakeAftVot(digestFn func() *sha3.SHAKE) func([][]byte) error {
 	return func(args [][]byte) error {
 		if len(args) != 2 {
 			return fmt.Errorf("shakeAftVot received %d args, wanted 2", len(args))
@@ -749,7 +753,7 @@
 	}
 }
 
-func shakeMct(digestFn func() sha3.ShakeHash) func([][]byte) error {
+func shakeMct(digestFn func() *sha3.SHAKE) func([][]byte) error {
 	return func(args [][]byte) error {
 		if len(args) != 4 {
 			return fmt.Errorf("shakeMct received %d args, wanted 4", len(args))
@@ -797,7 +801,7 @@
 	}
 }
 
-func cShakeAft(hFn func(N, S []byte) sha3.ShakeHash) func([][]byte) error {
+func cShakeAft(hFn func(N, S []byte) *sha3.SHAKE) func([][]byte) error {
 	return func(args [][]byte) error {
 		if len(args) != 4 {
 			return fmt.Errorf("cShakeAft received %d args, wanted 4", len(args))
@@ -817,7 +821,7 @@
 	}
 }
 
-func cShakeMct(hFn func(N, S []byte) sha3.ShakeHash) func([][]byte) error {
+func cShakeMct(hFn func(N, S []byte) *sha3.SHAKE) func([][]byte) error {
 	return func(args [][]byte) error {
 		if len(args) != 6 {
 			return fmt.Errorf("cShakeMct received %d args, wanted 6", len(args))