soupq 后量子签名模块

require "soupq" · SPHINCS+ 风格无状态哈希签名,底层 SM3(libsmx)

概述

生产参数

参数含义
N32哈希/密钥字节长
W16WOTS+ base-w(每链最多 15 次哈希)
LEN67WOTS+ 链数(64 + 3 校验)
D10每层 XMSS 树高(2^10 叶)
LAYERS4超树层数(总高 40)
WOTS_PK_LEN2144单 WOTS+ 公钥字节
PUB_LEN192公钥字节(4×32 + 2×32)
SIG_LEN9904签名字节
私钥64Bsk_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≥64Bsig (binary)失败抛错
verify(pub, msg, sig)pub≥192Bbool非法参数抛错;验签失败返回 false
sm3(data)data(string)32BSM3 摘要
version()string版本/算法说明

二进制密钥与签名建议 base64 存储/传输(BamZap 的 manifest 中 sig/pub/signed_payload 均以 base64 落地)。

在 BamZap 中使用

签名后端自动选择:soupq(后量子)→ smx(SM2)→ openssl ed25519(回退)。构建含 soupq.dllkeygen 默认即用后量子密钥。

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>)

安全边界(审计视角)

  1. 随机数源OsRng(操作系统 CSPRNG);宿主机熵源不可用时安全性下降。
  2. SM3 依赖 libsmx:soupq 静态链接 libsmx,SM3 正确性等同 libsmx(sm3("abc") 标准向量已验证)。
  3. 非 NIST 参数集:当前为自定义生产参数(D=10/LAYERS=4),非 SPHINCS+-SHA2/SM3 标准参数集。
  4. 验签语义:C-ABI 返回 1(通过)/0(不通过)/-1(参数非法),Soup 绑定对 -1 抛错。
  5. 密钥长度强制:sign 要求 priv≥64B、verify 要求 pub≥192B,不足即报错。
  6. 去状态:签名不含状态文件,同一消息多次签名产生不同签名,不泄露额外信息。

已验证:Rust 单测 + 100 次签名/验签压测 roundtrip 全过;BamZap 端到端(本地签名链、HTTPS 分发、deny-by-default、篡改检测、bare run)全绿。

模块维护

← 返回 BamZap · ← 返回首页