纯 JavaScript ML-DSA-44/65/87 自研实现 — 与 @noble/post-quantum 双向验证全绿
fml-dsa 是 FIBEMATE 自研的纯 JavaScript FIPS 204 (ML-DSA) 参考实现。
覆盖 ML-DSA-44 (security strength II)、ML-DSA-65 (III)、ML-DSA-87 (V) 三个参数集。
与 @noble/post-quantum 完成 sign→verify 和 verify→sign 双向交叉验证——双方生成/验证对方签名全部通过。
| 测试套件 | 结果 | 说明 |
|---|---|---|
ntt.test.js | 6/6 PASS | NTT 轮转·零点·线性·100x 随机·INV_N·边界值 — Noble 对齐 |
noble-oracle.test.js | 7/7 PASS | Noble ml_dsa65 尺寸·签名·确定性·消息区分性·错误拒绝 |
fml-dsa.test.js | ⚠ KAT 向量目录缺失 | API 表面 (44/65/87 keygen/sign/verify) ✓ · KAT 75 向量需 kat-vectors/ 目录 |
edge.test.js | 96/96 PASS | 空消息·单字节·10KB·无效公钥·无效私钥·篡改签名·密钥不匹配·确定性·零消息·Nonce 变化 |
input-validation.test.js | 65/66 PASS | modMul·ctAdd/ctSub·NTT 输入验证·参数自洽·随机压力;1 项 known: ntt(负数) 未抛异常 |
fml-dsa.sign(sk, msg) → noble.verify(fml-pk, msg, fml-sig) ✅ noble.sign(sk, msg) → fml-dsa.verify(noble-pk, msg, noble-sig) ✅
| ML-DSA-44 | ML-DSA-65 | ML-DSA-87 | |
|---|---|---|---|
| 安全强度 | II (≈AES-128) | III (≈AES-192) | V (≈AES-256) |
| 公钥 | 1,312 B | 1,952 B | 2,592 B |
| 密钥 | 2,560 B | 4,032 B | 4,896 B |
| 签名 | 2,420 B | 3,309 B | 4,627 B |
| k × ℓ | 4 × 4 | 6 × 5 | 8 × 7 |
| 模数 q | 8,380,417 (= 2²³ − 2¹³ + 1) | ||
kat-vectors/ 缺失——NIST ML-DSA 75 向量待补充