# @atlasauth/pca-less-wasm 中文文档

规范地址：https://npmcn.com/package/%40atlasauth/pca-less-wasm/

版本：0\.4\.3
npm 元数据更新时间：2026-10-27T19:47:56.338Z
中文译文更新时间：2026-11-07T02:25:52.479Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40atlasauth/pca-less-wasm
原文对照：https://npmcn.com/package/%40atlasauth/pca-less-wasm/?lang=original
项目主页：https://github.com/Atlas-Authorization/pca#readme
源码仓库：https://github.com/Atlas-Authorization/pca

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：580 kB，22 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- Node.js 要求：\>=20
- 运行依赖：0 个
- 首次发布：2026-10-09T01:40:20.261Z
- 最新版本发布：2026-10-27T19:47:56.129Z
- 近 30 天下载量：4476（2026-10-07 至 2026-11-05，npm 官方下载统计）
- 已发布版本数：7（近 12 个月 7 个）

## 中文简介

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

## 安装

```sh
npm install @atlasauth/pca-less-wasm
```

也可以使用：`pnpm add @atlasauth/pca-less-wasm`、`yarn add @atlasauth/pca-less-wasm`、`bun add @atlasauth/pca-less-wasm`

## README

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

**减** 基于代码的签名 [`@atlasauth/pca`](https://www.npmjs.com/package/@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).

## 安装

```bash
npm install @atlasauth/pca-less-wasm
```

## 使用量

```ts
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 一次同步:

```ts
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 (英语)](https://github.com/Atlas-Authorization/LESS)分支 `atlas-verifier-hardening`,承诺 `0b8b9a07ce029bd9af12d701f5093c5ca0d9418b` = 上游 [https://github.com/less-sig/LESS (英语)](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, 本地语族 `-O2` | 100/100 (单位:100) |
| 同样的KAT,回族 22 `-O3 -fsanitize=undefined` | 100/100 (单位:100) |
| 同样的 KAT, 苹果花纹 `-O0 -fsanitize=address,undefined -fno-sanitize-recover` | 100/100,无疗效检测结果(有效输入路径) |
| 差异对本地 `-O2`,随机(种子32或48 B,msg 0-399 B) | 300/300字节-同用pk, sk, 有签名的消息; 每方打开对方的签名 |
| 差异对本地 `-O3`+UBSan 组合键 | 300/300, 不变 |
| 差异对本地的Asan/UBsan `-O0` | 10/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中复制的可复制的建筑(今天它是一个手动的离盒建筑;剧本将标注上游承诺,但是 未显示已发送文件的比特式重建 .

### 复制

```bash
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 是什么？

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 和提交记录判断。

