# 算法注册表

本表定义 [ADR 005](adr/005-wire-format.zh.md) 的稳定算法号与文本值。编号按类别独立，签名和公钥使用两套枚举；编号与文本名永不重新分配。0 表示未指定，不能选中算法。注册允许表达该值，实际执行还须支持所请求的用途。

当前所有条目均为 `active`，没有截止时间。`deprecated_after` 中的 `—` 表示未设（`None`）。protobuf 持久化、仓库策略检查和能力通告已实现；当前边界见[架构](architecture.zh.md#持久化与公开身份)，验证见[实现记录](IMPLEMENTATION_AUDIT.md)。

## 哈希

| ID | 算法 | 文本标识 | 值字节数 | 状态 | deprecated_after（UTC） | 当前用途 |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | BLAKE3 | `b3` | 32 | active | — | 正文哈希与协议身份 |
| 2 | SHA-256 | `sha256` | 32 | active | — | 可表达的摘要值；正文与协议身份拒绝此算法 |
| 3 | SHA-512 | `sha512` | 64 | active | — | 可表达的摘要值；正文与协议身份拒绝此算法 |

## AEAD

| ID | 算法 | 文本标识 | nonce 字节数 | tag 字节数 | 状态 | deprecated_after（UTC） | 当前用途 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 1 | XChaCha20-Poly1305 | `xchacha20poly1305` | 24 | 16 | active | — | 正文、本机保护、索引段/快照和密钥封装 |
| 2 | AES-256-GCM | `aes256gcm` | 12 | 16 | active | — | 正文 |
| 3 | ChaCha20-Poly1305 | `chacha20poly1305` | 12 | 16 | active | — | 正文 |

## 签名

| ID | 算法 | 文本标识 | 值字节数 | 状态 | deprecated_after（UTC） | 当前用途 |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Ed25519 | `ed25519` | 64 | active | — | 设备与恢复权限签名 |

## 公钥

| ID | 算法 | 文本标识 | 值字节数 | 状态 | deprecated_after（UTC） | 当前用途 |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Ed25519 | `ed25519` | 32 | active | — | 设备身份与签名验证 |
| 2 | X25519 | `x25519` | 32 | active | — | 非对称封装的接收者与临时公钥 |

## KDF

| ID | 算法 | 文本标识 | 状态 | deprecated_after（UTC） | 当前用途 |
| --- | --- | --- | --- | --- | --- |
| 1 | Argon2id | `argon2id` | active | — | 从密码派生封装密钥；盐、线上 `memory_cost_bytes`、迭代数、并行度、输出长度与版本是显式参数 |

Rust `VaultConfig.argon2_m_cost` 仍以 KiB 表示，protobuf codec 严格校验对齐和边界后与 `memory_cost_bytes` 转换。现有按用途区分的密钥派生标签保持原义。

## 分块

| ID | 算法 | 文本标识 | 状态 | deprecated_after（UTC） | 当前用途 |
| --- | --- | --- | --- | --- | --- |
| 1 | FastCDC 2020 | `fastcdc-2020` | active | — | 正文写入策略，含最小/平均/最大块大小参数 |
| 2 | 固定边界 | `fixed` | active | — | 正文写入策略，含块大小参数 |

这些编号分配给已有写入策略；读取方按保存的单元边界读取。

## 规范文本与验证

`Digest`、`Signature`、`PublicKey` 的文本为 `<文本标识>.<base58值>`。算法前缀必须是注册的小写名字；值区分大小写，使用比特币 base58 字母表 `123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz`。直接编码原始字节，不附加校验和，每个前导零字节保留为一个前导 `1`。解码后须满足本类别的精确字节数，重新编码须与输入逐字相同；空白、别名、未知前缀、空值、非法字符或非规范编码均拒绝。AEAD、KDF 与分块的文本标识用于指定算法，本身不编码一个值。

DeviceId 与公开对端 NodeId 使用 `ed25519.`；VersionId、RetirementId、KeyEpoch 使用 `b3.`。FileId、SubtreeId、StoreId、VaultId 是精确 16-byte 的随机身份，使用无前缀 base58，不是摘要或公钥。公开 JSON 使用规范字符串，拒绝旧 hex 别名；私有恢复密钥与配对 ticket 的表达不变。

Genesis 钉仓库允许的算法。能解析注册值不代表获准执行，还须通过策略、已实现用途和截止时间检查。当前本机保护、索引封装及密钥封装使用 XChaCha20-Poly1305，其余 AEAD 只用于正文。运行中策略切换尚未实现；配对保留 keyed BLAKE3 MAC/SAS，不增加独立签名。

`deprecated` 表示计划退役；截止前或未设截止时间时，在已实现用途内仍可使用。截止时间是可选的 UTC 时刻，以带 `Z` 的 RFC 3339 表示；代码存为 `deprecated_after_epoch_ms: Option<u64>`（Unix 纪元毫秒）。注册表通过 `ensure_usable_at(scope, now_epoch_ms)` 检查；`now_epoch_ms >= deprecated_after_epoch_ms` 即拒绝过期条目，包含等于截止时刻的边界。未知算法或所请求用途尚未实现的算法也明确失败。能解析 SHA 摘要文本不代表允许它用于正文或协议身份；失败不选择其他算法，也不忽略截止时间。

复制或手工构造的注册元数据也须与静态注册项的类别、ID 和文本标识一致；只能收紧支持用途和截止时间，不能启用未实现用途或延后注册表截止时间。
