@atlasauth/pca-less-wasm

中文文档
0.4.3发布于 2026/10/28MITTypeScriptESM + CJS零依赖近 30 天下载 4476

LESS(代码等同,NIST额外签名 第2轮候选) 签名后端为@atlasauth/pca:官方的LESS参考 C编译为WebAssembly,并配有可移植的无依赖加载器(Node QQ20,浏览器,Deno, Bun,边缘). 由th验证

中文使用文档
文档目录10 节
  1. 安装
  2. 使用量
  3. 浏览器,工人,德诺,边缘:可移植路径
  4. 建立来源
  5. 证据和调查结果
  6. 发现上游缺陷(固定在已编译的参考文献中;包装器保留自己的守卫)
  7. 易残性
  8. 还缺少什么(为什么这是候选人,而不是推荐)
  9. 复制
  10. 许可证

@atlasauth/pca-less-wasm (英语)

减 基于代码的签名 @atlasauth/pca页:1 官方LESS参考C编译为WebAssembly,配有小型便携式装载机 无依赖 没有 node: 导入 - 它运行在节点QQ20,浏览器,Web Workers,Deno,Bun和边缘运行时间.

地位,直言不讳. LESS是一个无线 增加数字签字 第2轮候选人 - 这是 不是一个标准。这个包装被检查为官方的答案测试,一个本地的vs -wasm 差异、消毒器和坚固套房(以下数字),但已经 无独立 审计,这里有 无独立执行 比较起来,参考的键源/符号是: 而不是恒定时间,参考核查员对伪造的签名有三个内存安全缺陷 这个套件在周围工作。 利用它来创造硬度多样性, 与经典相混合 签名 (《刑法》) hybrid-ed25519-less-cat1 而不是作为唯一的签名.

LESS的安全取决于代码等同性问题 -- -- 硬度家族与纬度不同 (ML-DSA,FN-DSA)和散列(SLH-DSA).

安装

npm install @atlasauth/pca-less-wasm

使用量

import { keygen, sign, open, signDetached, verify, seedWith, sizes, VARIANT } from '@atlasauth/pca-less-wasm';

console.log(VARIANT);   // 'less-252-45'  (NIST category 1, short-signature corner)
console.log(sizes());   // { publicKey: 97484, secretKey: 32, signatureMax: 1329, seed: 16 }

const { publicKey, secretKey } = keygen();               // seeds from crypto.getRandomValues
const msg = new TextEncoder().encode('proof-carrying authority');

const sm = sign(secretKey, msg);                          // attached: message || signature
const { ok, message } = open(publicKey, sm);              // ok === true

const sig = signDetached(secretKey, msg);                 // detached, 1153-1329 bytes
verify(publicKey, msg, sig);                              // true; never throws on bad input

seedWith(seed48) 使键源/符号具有确定性(KATs,测试). verify编号 :open 消耗不随机.

浏览器,工人,德诺,边缘:可移植路径

这个 browser 出口条件(和 /web (子路径) node: 进口。 浏览器限制大型模块的同步编译, 因此 Onvil 一次同步:

import { initLess, keygen, verify } from '@atlasauth/pca-less-wasm/web';

await initLess(new URL('/assets/less_cat1.wasm', import.meta.url)); // or a URL string, a Response, or bytes
// ...or fully self-contained (base64 inside the JS, ~130 KB):
//   import { initLessEmbedded } from '@atlasauth/pca-less-wasm/embedded'; await initLessEmbedded();

原文件本身导出为 @atlasauth/pca-less-wasm/less_cat1.wasm 用于捆绑者(?url, (中文(简体) ), new URL(..., import.meta.url)) (中文(简体) ). 在节点/Bun/Deno中,默认的条目会同步加载捆绑的文件, 所以不需要打电话 唯一需要导入的宿主为 WASI random_get已执行 globalThis.crypto.getRandomValues· ; 如果缺少 Web 加密, 键源/ 签名抛出( 未关闭) 相当 而不是任何较弱的种子,而核查(不需要随机性)则继续工作.

建立来源

艺术wasm/less_cat1.wasm, 96,720 字节
SHA-256 (英语)473d20c2713ef30ab3b4cb3ac2b59c51f801501fa49ad046b999cb53afa77957 (记录在 wasm/BUILD.json(中文(简体) )
来源lESS 与 Atlas 验证器的参考,销售于 sdks/pca-less-c (单位:千美元)https://github.com/Atlas-Authorization/LESS (英语)分支 atlas-verifier-hardening,承诺 0b8b9a07ce029bd9af12d701f5093c5ca0d9418b = 上游 https://github.com/less-sig/LESS (英语) 6383430b9123e69d2ef6a6224f930972e3225610 加上以下1至3个缺陷的补救), Reference_Implementation/, (中文(简体) ), -DCATEGORY=252 -DTARGET=45 (CC0) (简体中文)
工具链was-sdk 25.0 (clang 19.1.5-wasi-sdk,收录于被子园 producers 由SHA-256所固定的放出焦油球, -O2 -std=c99,可移动scalar C(未定义AVX/NEON), -mexec-model=reactor, 8 MiB 堆栈
已添加 C~40线接合线 scripts/less_wasm_glue.c: 种子参考 CSPRNG 并曝光平缓器
重现scripts/build-wasm.sh (x86 64 Linux 或 arm64 macOS:下载和散列检查 wasi-sdk 25.0,检查源代码摘要,写作) wasm/less_cat1.wasm 财务报告和审定财务报表 wasm/BUILD.json,则 node scripts/embed-wasm.mjs

建筑可复制:同名剧本给出了x86 64 Linux上的同名SHA-256(农活) q261012-203714-gvc8和继续 arm64 macOS (2026-10-12) (英语). 以前的文物(2d6c8141...以早期的剧本建造 日志没有保存)从未显示与重建的位同;这是 。 新工艺品复制出官方的KAT 100/100(关键词和签名按修正不变).

证据和调查结果

(2026-10-08,苹果氏族21 / Homebrew LVM氏族22.1.8 在arm64上) macOS;由wasi-sdk-25所建). 这是证据 忠诚和坚挺, (中文(简体) ), 没有 密码安全.

源被绑定: 上游 https://github.com/less-sig/LESS 承诺 6383430b9123e69d2ef6a6224f930972e3225610 (当前) main 撰写时的头; "Version 2.1" 树, Reference_Implementation/, (中文(简体) ), -DCATEGORY=252 -DTARGET=45。下表按 该日期的文物(未标注的上游,SHA-256) 2d6c8141...) (中文(简体) ). 目前的文物是补丁建筑 2026-10-12. 它的官方KAT运行(100-100)被重复.

检查结果
官方 KAT (英语:Utilities/KAT_Generation/KAT/PQCsignKAT_97484.rsp,其pk长度=此建筑为97,484 B;上游舰艇7 .rsp,每个参数集一个,每个条目100个) 原声100/100 (单位:100) 字节相同(pk, sk, 已签名的消息)并全部打开(src/kat.test.ts,在 src/kat/(中文(简体) )
相同的 KAT, 本地语族 -O2100/100 (单位:100)
同样的KAT,回族 22 -O3 -fsanitize=undefined100/100 (单位:100)
同样的 KAT, 苹果花纹 -O0 -fsanitize=address,undefined -fno-sanitize-recover100/100,无疗效检测结果(有效输入路径)
差异对本地 -O2,随机(种子32或48 B,msg 0-399 B)300/300字节-同用pk, sk, 有签名的消息; 每方打开对方的签名
差异对本地 -O3+UBSan 组合键300/300, 不变
差异对本地的Asan/UBsan -O010/10, 不变
一个有效签名的每一个位的穷尽式单位翻转( native) -O2(中文(简体) )10,370个翻转, 0项已接受; 又有6个( 最终字节, 参见缺陷 1) 被拉带所跳过, 因为它们崩溃了原始参考文献
关于100个被篡改的签名的原生-vs-wasm接受/拒绝协议不变
原生原生核查器的结构意识模糊(scripts/fuzz-open.mjs(中文(简体) )UBSan+Asan(第2版)下未装出随机体 / 参考行崩溃;被伪造的文摘在未添加的缓冲器上坠入ASan(第3版). ASan/UBSan(4个结构类),0个消毒器发现,0个接受
瓦斯负数套间(src/robustness.test.ts,12个测试)篡改(在所有区域取样),错误的信息/密钥/大小,截取(前缀和后缀),超大小,400个垃圾缓冲器,重复决定,区域补充/逆转:全部拒绝,永远不扔

不可用/ 不运行 : valgrind (不运行于此 macOS), 漏取( 不支持于 arm64 macOS, Msan, 一秒钟 原声 工具链(此机上没有等离子体)。 原创建筑 汇编 不变 C,因此他们的协议排除了工具链/ABI/UB驱动的对被测试投入的分歧; 它不是独立执行LESS规格,而KAT是同一种技术生产的 参考代码.

发现上游缺陷(固定在已编译的参考文献中;包装器保留自己的守卫)

三者都在公共投入的道路上(伪造) 签名因此,它们对于核查者很重要.

  1. crypto_sign_open 没有 smlen >= sig_len 检查 (单位:千美元)sign.c) (中文(简体) ). 简短输入、空输入或空输入 其最终叶数字节有一点向上翻转的有效签名 (例如:. 9 -> 11制造( ) *mlen = smlen - sig_len 资源流入和以下 memcpy 崩溃: SIGBUS 原生, RuntimeError: memory access out of bounds 陷阱在等元中( 它以前做过 ) open编号 :verify 掷出 打开 垃圾 垃圾 垃圾 垃圾 垃圾 原生亚种 : negative-size-param 时间 sign.c:81。 。 。 .
  2. 铺入位数 cf_monom_actions数字 : CheckCanonicalAction 需要所有256个字母的密码 位数行但 UnpackCosetRep 只走第一个N=252,所以一行有垫位252-255套 (和总重量K)使核查者写出最多4字节的过去 permuted_G_col_pivot[252] 和过去 生成矩阵。 原生亚种/ UBSan : stack-buffer-overflow 时间 monomial.c:201 / 指数 252 超出范围 monomial.c:205在原地没有探测器,它会悄悄地腐蚀邻近的 堆栈内存(在本地消毒器报告之外没有显示) .
  3. RebuildGGM 超过签名的读取 (单位:千美元)seedtree.c:262: 读取的种子数量来自 挑战的花序,而不是被储存的花叶数, 所以一个伪造的文摘使它读取到 (T-W)*16 = 176 签名结束后的字节( 本地 ASan) heap-buffer-overflow,16字节读取,0字节后读取 缓冲。 只读; 不显示为泄漏 .

修复(汇编的C, sdks/pca-less-c/README.md: crypto_sign_open 拒绝比后缀短的输入 字节索赔(1); CheckCanonicalAction 拒绝任何粘贴位数(2); crypto_sign_open 需要存储的种子计数到 等于挑战的种子数量 RebuildGGM 改为(3)。 包装警卫(在 src/core.ts,保留为秒 层 : 相同的长度和加载检查, 零填充 signatureMax- 签名留言后的字节尾巴和 犬科种子计数检查在"马列易被"下描述. 诚实的输出从不跳过这些: 每个 KAT 和 几百个新产生的签名通过它们。 缓解后,同样的模糊课 运行干净 由ASan和UBSan(本地添加驱动程序, LESS_PAD=1) (中文(简体) ). 这些缺陷 没有 报告 从工作上游.

易残性

发现2026-10-12并固定: uNPATCHED 参考文献接受有效签名,其种子储存延长了16个 任意的字节, 后面的种子计数由 1 起( qq 11) 起: 它只读取挑战需要的种子和 忽略了其余的,所以一个有效的签名每个额外的种子槽最多有2^128个被接受的变体. 单位翻转( 下) 找不到这个 Fix 3在编译参考书中拒绝了它 open 拒绝任何仍然随其 上个种子倒下,即使在一个未标注的二进制下,其倒数也下降了一个(非冠状种子倒数). 两种表格 是每个核查者必须拒绝的包/pca/符合/小监测器中的矢量.

在10,370个单位变体中,没有找到其他有效签名的编码以验证:0, + 区域补充/逆向/互通测试。 签名相同( 密钥, 信件) 2 次 不同的有效签名(随机化盐);即方案随机化,而不是可折叠性。 这是 对试验空间没有证据,而不是证明有强烈的不可原谅性/不可危险性.

还缺少什么(为什么这是候选人,而不是推荐)

证据确实存在 没有 已经存在 :

  • 一个 独立执行 (第三方,不同的代码库)同意KATs. 只有 上游参考在这里存在;所有的KAT都是由它自行生成的.
  • 外部密码分析: LESS的安全(代码等同)是一个积极研究的年轻问题; 上面都没有提到这件事.
  • 这个 NIST结果: LESS是第2轮附加签名的候选人,而不是标准.
  • A 类 安全/代码审计 (发现核查人存在三个内存-安全缺陷) 有几个小时的消毒剂工作, 认为参考文献还没有硬化)和上游 确定或接受三个缺陷.
  • 常时 键源/ 符号。 统计时间测试(固定输入与随机输入,每个样本1000万个,土建) 检测签名路径组件中依赖秘密的时间(单键和盐样、生成器乘法、同位素代表) 计算和致盲使用CF),测试统计从大约70到大约1 700,而检测阈值为4.5,而随机对随机 控制在1至2附近,并检测到故意漏出比较。 Valgrind 有密钥标记的未定义报告 47 密钥依赖 解密签名所发布内容后,32个源行的背景。 将签名和密钥生成视为 非常数时间: 只运行它们 对手无法遵守时机。 核查只处理公共数据,不受影响.
  • 在CI中复制的可复制的建筑(今天它是一个手动的离盒建筑;剧本将标注上游承诺,但是 未显示已发送文件的比特式重建 .

复制

scripts/build-native.sh /tmp/less-nat            # pinned upstream + 3 native variants
LESS_NATIVE_DIR=/tmp/less-nat/bin LESS_DIFF_N=300 npx vitest run src/crosscheck.test.ts   # ~16 min
LESS_PAD=1 node scripts/fuzz-open.mjs /tmp/less-nat/bin/less_O0asan 40                    # ASan fuzz
npx vitest run                                    # default: KAT + negative suite + portability + round trip (~3 min)

scripts/make-kat-digest.mjs 重新生成 src/kat/less-252-45.digest.json 从上游 .rsp。 。 。 .

许可证

麻省理工学院(见 LICENSE) (中文(简体) ). LESS 参考执行是公有领域(见上游部分) LICENSE) (中文(简体) ).

版本与发布记录

@atlasauth/pca-less-wasm 共发布 7 个版本,首次发布于 2026/10/09;过去 12 个月发布了 7 个版本。

版本发布日期距今
0.4.3latest2026/10/2811 天前
0.4.22026/10/2612 天前
0.4.12026/10/1226 天前
0.4.02026/10/1226 天前
0.3.02026/10/0929 天前
0.2.02026/10/0929 天前

关于 @atlasauth/pca-less-wasm 的常见问题

@atlasauth/pca-less-wasm 是什么?

LESS(代码等同,NIST额外签名 第2轮候选) 签名后端为@atlasauth/pca:官方的LESS参考 C编译为WebAssembly,并配有可移植的无依赖加载器(Node QQ20,浏览器,Deno, Bun,边缘). 由th验证

如何安装 @atlasauth/pca-less-wasm?

在项目目录运行 npm install @atlasauth/pca-less-wasm,或使用 pnpm add / yarn add / bun add。

@atlasauth/pca-less-wasm 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@atlasauth/pca-less-wasm 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@atlasauth/pca-less-wasm 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@atlasauth/pca-less-wasm 可以商用吗?

@atlasauth/pca-less-wasm 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@atlasauth/pca-less-wasm 的下载量有多少?

根据 npm 官方下载统计,@atlasauth/pca-less-wasm 在 2026/10/07 – 2026/11/05 这 30 天内被下载 4,476 次,日均约 149 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@atlasauth/pca-less-wasm 还在维护吗?

最新版本 0.4.3 发布于 2026/10/28(11 天前);至今共发布 7 个版本,其中过去 12 个月发布了 7 个;首次发布于 2026/10/09。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。