@@ -29,6 +29,7 @@ import (
29
29
"crypto/internal/fips140/ecdsa"
30
30
"crypto/internal/fips140/ed25519"
31
31
"crypto/internal/fips140/edwards25519"
32
+ "crypto/internal/fips140/hkdf"
32
33
"crypto/internal/fips140/hmac"
33
34
"crypto/internal/fips140/mlkem"
34
35
"crypto/internal/fips140/pbkdf2"
@@ -111,6 +112,8 @@ var (
111
112
// https://pages.nist.gov/ACVP/draft-fussell-acvp-ecdsa.html#section-7
112
113
// AES algorithm capabilities:
113
114
// https://pages.nist.gov/ACVP/draft-celi-acvp-symmetric.html#section-7.3
115
+ // HKDF KDA algorithm capabilities:
116
+ // https://pages.nist.gov/ACVP/draft-hammett-acvp-kas-kdf-hkdf.html#section-7.3
114
117
//go:embed acvp_capabilities.json
115
118
capabilitiesJson []byte
116
119
@@ -164,6 +167,17 @@ var (
164
167
"HMAC-SHA3-384" : cmdHmacAft (func () fips140.Hash { return sha3 .New384 () }),
165
168
"HMAC-SHA3-512" : cmdHmacAft (func () fips140.Hash { return sha3 .New512 () }),
166
169
170
+ "HKDF/SHA2-224" : cmdHkdfAft (func () fips140.Hash { return sha256 .New224 () }),
171
+ "HKDF/SHA2-256" : cmdHkdfAft (func () fips140.Hash { return sha256 .New () }),
172
+ "HKDF/SHA2-384" : cmdHkdfAft (func () fips140.Hash { return sha512 .New384 () }),
173
+ "HKDF/SHA2-512" : cmdHkdfAft (func () fips140.Hash { return sha512 .New () }),
174
+ "HKDF/SHA2-512/224" : cmdHkdfAft (func () fips140.Hash { return sha512 .New512_224 () }),
175
+ "HKDF/SHA2-512/256" : cmdHkdfAft (func () fips140.Hash { return sha512 .New512_256 () }),
176
+ "HKDF/SHA3-224" : cmdHkdfAft (func () fips140.Hash { return sha3 .New224 () }),
177
+ "HKDF/SHA3-256" : cmdHkdfAft (func () fips140.Hash { return sha3 .New256 () }),
178
+ "HKDF/SHA3-384" : cmdHkdfAft (func () fips140.Hash { return sha3 .New384 () }),
179
+ "HKDF/SHA3-512" : cmdHkdfAft (func () fips140.Hash { return sha3 .New512 () }),
180
+
167
181
"PBKDF" : cmdPbkdf (),
168
182
169
183
"ML-KEM-768/keyGen" : cmdMlKem768KeyGenAft (),
@@ -500,6 +514,20 @@ func cmdHmacAft(h func() fips140.Hash) command {
500
514
}
501
515
}
502
516
517
+ func cmdHkdfAft (h func () fips140.Hash ) command {
518
+ return command {
519
+ requiredArgs : 4 , // Key, salt, info, length bytes
520
+ handler : func (args [][]byte ) ([][]byte , error ) {
521
+ key := args [0 ]
522
+ salt := args [1 ]
523
+ info := args [2 ]
524
+ keyLen := int (binary .LittleEndian .Uint32 (args [3 ]))
525
+
526
+ return [][]byte {hkdf .Key (h , key , salt , string (info ), keyLen )}, nil
527
+ },
528
+ }
529
+ }
530
+
503
531
func cmdPbkdf () command {
504
532
return command {
505
533
// Hash name, key length, salt, password, iteration count
0 commit comments