Skip to content

Commit f68ee16

Browse files
committed
remove allocation
1 parent 5fa8d39 commit f68ee16

File tree

1 file changed

+14
-22
lines changed

1 file changed

+14
-22
lines changed

cng/mlkem.go

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -77,17 +77,17 @@ func SupportsMLKEM() bool {
7777
}
7878

7979
// generateMLKEMKey generates a new ML-KEM key pair with the specified parameter set
80-
// and returns the raw key bytes (not the blob).
81-
func generateMLKEMKey(paramSet string, expectedSize int) ([]byte, error) {
80+
// and writes the raw key bytes (not the blob) into dst.
81+
func generateMLKEMKey(paramSet string, dst []byte) error {
8282
alg, err := loadMLKEM()
8383
if err != nil {
84-
return nil, errors.New("mlkem: failed to open algorithm provider")
84+
return errors.New("mlkem: failed to open algorithm provider")
8585
}
8686

8787
var hKey bcrypt.KEY_HANDLE
8888
err = bcrypt.GenerateKeyPair(alg.handle, &hKey, 0, 0)
8989
if err != nil {
90-
return nil, errors.New("mlkem: key generation failed")
90+
return errors.New("mlkem: key generation failed")
9191
}
9292
defer bcrypt.DestroyKey(hKey)
9393

@@ -99,33 +99,29 @@ func generateMLKEMKey(paramSet string, expectedSize int) ([]byte, error) {
9999
}
100100
err = bcrypt.SetProperty(bcrypt.HANDLE(hKey), utf16PtrFromString(bcrypt.PARAMETER_SET_NAME), paramSetBytes, 0)
101101
if err != nil {
102-
return nil, errors.New("mlkem: failed to set parameter set")
102+
return errors.New("mlkem: failed to set parameter set")
103103
}
104104

105105
err = bcrypt.FinalizeKeyPair(hKey, 0)
106106
if err != nil {
107-
return nil, errors.New("mlkem: key finalization failed")
107+
return errors.New("mlkem: key finalization failed")
108108
}
109109

110110
// Export the private key blob
111111
var size uint32
112112
err = bcrypt.ExportKey(hKey, 0, utf16PtrFromString(bcrypt.MLKEM_PRIVATE_BLOB), nil, &size, 0)
113113
if err != nil {
114-
return nil, errors.New("mlkem: failed to get key blob size")
114+
return errors.New("mlkem: failed to get key blob size")
115115
}
116116

117117
blob := make([]byte, size)
118118
err = bcrypt.ExportKey(hKey, 0, utf16PtrFromString(bcrypt.MLKEM_PRIVATE_BLOB), blob, &size, 0)
119119
if err != nil {
120-
return nil, errors.New("mlkem: failed to export key")
120+
return errors.New("mlkem: failed to export key")
121121
}
122122

123-
// Extract and return raw key bytes
124-
keyBytes := make([]byte, expectedSize)
125-
if err := extractMLKEMKeyBytes(blob, keyBytes); err != nil {
126-
return nil, err
127-
}
128-
return keyBytes, nil
123+
// Extract raw key bytes into destination
124+
return extractMLKEMKeyBytes(blob, dst)
129125
}
130126

131127
// newMLKEMDecapsulationKeyFromBytes creates a decapsulation key blob from raw key bytes.
@@ -295,12 +291,10 @@ type DecapsulationKeyMLKEM768 [decapsulationKeySizeMLKEM768]byte
295291
// GenerateKeyMLKEM768 generates a new decapsulation key, drawing random bytes from
296292
// the default crypto/rand source. The decapsulation key must be kept secret.
297293
func GenerateKeyMLKEM768() (DecapsulationKeyMLKEM768, error) {
298-
keyBytes, err := generateMLKEMKey(bcrypt.MLKEM_PARAMETER_SET_768, decapsulationKeySizeMLKEM768)
299-
if err != nil {
294+
var dk DecapsulationKeyMLKEM768
295+
if err := generateMLKEMKey(bcrypt.MLKEM_PARAMETER_SET_768, dk[:]); err != nil {
300296
return DecapsulationKeyMLKEM768{}, err
301297
}
302-
var dk DecapsulationKeyMLKEM768
303-
copy(dk[:], keyBytes)
304298
return dk, nil
305299
}
306300

@@ -391,12 +385,10 @@ type DecapsulationKeyMLKEM1024 [decapsulationKeySizeMLKEM1024]byte
391385
// GenerateKeyMLKEM1024 generates a new decapsulation key, drawing random bytes from
392386
// the default crypto/rand source. The decapsulation key must be kept secret.
393387
func GenerateKeyMLKEM1024() (DecapsulationKeyMLKEM1024, error) {
394-
keyBytes, err := generateMLKEMKey(bcrypt.MLKEM_PARAMETER_SET_1024, decapsulationKeySizeMLKEM1024)
395-
if err != nil {
388+
var dk DecapsulationKeyMLKEM1024
389+
if err := generateMLKEMKey(bcrypt.MLKEM_PARAMETER_SET_1024, dk[:]); err != nil {
396390
return DecapsulationKeyMLKEM1024{}, err
397391
}
398-
var dk DecapsulationKeyMLKEM1024
399-
copy(dk[:], keyBytes)
400392
return dk, nil
401393
}
402394

0 commit comments

Comments
 (0)