NIST KAT(已知答案测试)符合性¶
本文是英文版本的参考译文,更新于2026年10月25日。如有差异,以英文原文为准。标识符和代码块(包括注释)均保留原文。
此目录包含 DCP-AI 密码学提供程序使用的已知答案向量和属性测试。通过这些测试只能确认其覆盖的行为,不代表算法完全符合标准,也不代表密码模块通过了 NIST 验证;请参阅 NIST 符合性与范围。
目录结构¶
nist-kat/
ed25519/
vectors.json -- RFC 8032 deterministic test vectors
ml-dsa-65/
vectors.json -- FIPS 204 property test configuration
ml-kem-768/
vectors.json -- FIPS 203 NIST ACVP decapsulation and key-check vectors
slh-dsa-192f/
vectors.json -- FIPS 205 NIST ACVP signature-verification vectors
Ed25519¶
Ed25519(RFC 8032)使用确定性签名。vectors.json 包含 RFC 8032 第7.1节中的确切测试向量。对于给定的秘密密钥和消息,所有 SDK 必须(MUST)生成完全相同的签名。
ML-DSA-65¶
ML-DSA-65(FIPS 204)在 TypeScript 和 Rust 提供程序中的签名是 hedged(随机化)的,在 Go 提供程序中则是确定性的;两种变体都有效,验证方式相同。直接 KAT 向量需要控制种子,而不同实现对此的支持各异。这里的检查覆盖:
- 大小符合性 - 公钥(1952 B)、签名(3309 B)
- 往返测试 - 签名后验证成功
- 错误密钥拒绝 - 使用不同密钥验证失败
- 跨 SDK 验证 - TypeScript SDK 生成的签名可在所有其他 SDK 中验证
- 确定性 kid - kid 派生在各 SDK 间可重现
ML-KEM-768¶
ML-KEM-768(FIPS 203)的解封装是确定性的,因此 NIST ACVP(ML-KEM-encapDecap-FIPS203)的 (dk, c) -> k 用例对于任何实现都是真正的 KAT,包括对修改后的密文进行隐式拒绝。该文件还包含 FIPS 203 输入检查:必须拒绝系数 >= q 的封装密钥,以及 H(ek) 错误的解封装密钥。
SLH-DSA-192f¶
SLH-DSA-SHA2-192f(FIPS 205)的签名是随机化的,因此这些向量是 NIST ACVP 签名验证用例(SLH-DSA-sigVer-FIPS205,外部接口,pure 模式)。有效用例只有在应用 FIPS 205 的 0x00 || len(ctx) || ctx 前缀时才能验证通过,而标准化前的 SPHINCS+ 会省略此前缀。DCP 使用空上下文签名;这些用例带有上下文,因此测试会显式传入它。
两个文件均记录 ACVP-Server 版本和源文件的 SHA-256。数值按原样复制:绝不能为迎合某个 SDK 而修改它们。
第一阶段通过条件¶
CI 中每个 SDK 的测试任务都运行其 KAT 测试:TypeScript src/__tests__/nist-kat.test.ts、Python tests/test_nist_kat.py、Go dcp/nist_kat_test.go(在 go test ./... 中)和 Rust tests/nist_kat.rs。KAT 失败会导致相应任务失败。