soupq 后量子签名模块
require "soupq" · SPHINCS+ 风格无状态哈希签名,底层 SM3(libsmx)
概述
- 算法:SPHINCS+ 风格超树(hypertree)——XMSS 二叉默克尔树(每层高 D)串联 LAYERS 层,叶子为 WOTS+ 一次签名。
- 哈希原语:SM3(国密哈希),复用项目自有
libsmx。 - 无状态:每次签名随机选叶索引,无需 nonce/状态文件。
- 抗量子依据:安全性归约到 SM3 抗碰撞;Grover 仅平方根加速,总树高 40 bit,多目标碰撞概率可忽略。
生产参数
| 参数 | 值 | 含义 |
|---|---|---|
N | 32 | 哈希/密钥字节长 |
W | 16 | WOTS+ base-w(每链最多 15 次哈希) |
LEN | 67 | WOTS+ 链数(64 + 3 校验) |
D | 10 | 每层 XMSS 树高(2^10 叶) |
LAYERS | 4 | 超树层数(总高 40) |
WOTS_PK_LEN | 2144 | 单 WOTS+ 公钥字节 |
PUB_LEN | 192 | 公钥字节(4×32 + 2×32) |
SIG_LEN | 9904 | 签名字节 |
| 私钥 | 64B | sk_seed(32) || prf_seed(32) |
| 公钥 | 192B | 各层根 + sk_seed + prf_seed |
Soup API
local pq = require("soupq")
local priv, pub = pq.keypair() -- priv 64B, pub 192B
local sig = pq.sign(priv, "hello world") -- 签名(最大 9904B)
assert(pq.verify(pub, "hello world", sig) == true)
assert(pq.verify(pub, "hello worm", sig) == false) -- 篡改检测
print(pq.sm3("abc")) -- SM3 摘要(32B)
print(pq.version())
| 函数 | 参数 | 返回 | 说明 |
|---|---|---|---|
keypair() | — | priv(64B), pub(192B) | OsRng 生成随机种子 |
sign(priv, msg) | priv≥64B | sig (binary) | 失败抛错 |
verify(pub, msg, sig) | pub≥192B | bool | 非法参数抛错;验签失败返回 false |
sm3(data) | data(string) | 32B | SM3 摘要 |
version() | — | string | 版本/算法说明 |
二进制密钥与签名建议 base64 存储/传输(BamZap 的 manifest 中 sig/pub/signed_payload 均以 base64 落地)。
在 BamZap 中使用
签名后端自动选择:soupq(后量子)→ smx(SM2)→ openssl ed25519(回退)。构建含 soupq.dll 时 keygen 默认即用后量子密钥。
soupx bamzap.sar keygen myorg soupx bamzap.sar trust add <fp> "myorg release key" export SOUPKG_SIGN_ID=myorg soupx bamzap.sar pool register myapp ./myapp/ soupx bamzap.sar verify myapp # verify myapp: OK (signer=<fp>)
安全边界(审计视角)
- 随机数源:
OsRng(操作系统 CSPRNG);宿主机熵源不可用时安全性下降。 - SM3 依赖 libsmx:soupq 静态链接 libsmx,SM3 正确性等同 libsmx(
sm3("abc")标准向量已验证)。 - 非 NIST 参数集:当前为自定义生产参数(D=10/LAYERS=4),非 SPHINCS+-SHA2/SM3 标准参数集。
- 验签语义:C-ABI 返回 1(通过)/0(不通过)/-1(参数非法),Soup 绑定对 -1 抛错。
- 密钥长度强制:sign 要求 priv≥64B、verify 要求 pub≥192B,不足即报错。
- 去状态:签名不含状态文件,同一消息多次签名产生不同签名,不泄露额外信息。
已验证:Rust 单测 + 100 次签名/验签压测 roundtrip 全过;BamZap 端到端(本地签名链、HTTPS 分发、deny-by-default、篡改检测、bare run)全绿。
模块维护
- 源码:
src/rust/soupq/(Rust cdylib)+src/ssoupqlib.c(Soup 绑定)。 - 构建:
cargo build --release -p soupq;soupq.dll须与soupx.exe/soup55b.dll同目录。 - 调参:改
lib.rs顶部D/LAYERS/W后需同步ssoupqlib.c的PQ_*宏。 - 回归:
test_soupq.soup(模块自检)+e2e_test.py(BamZap 全链路)。