算法注册表
本表定义 ADR 005 的稳定算法号与文本值。编号按类别独立,签名和公钥使用两套枚举;编号与文本名永不重新分配。0 表示未指定,不能选中算法。注册允许表达该值,实际执行还须支持所请求的用途。
当前所有条目均为 active,没有截止时间。deprecated_after 中的 — 表示未设(None)。protobuf 持久化、仓库策略检查和能力通告已实现;当前边界见架构,验证见实现记录。
哈希
| 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 和文本标识一致;只能收紧支持用途和截止时间,不能启用未实现用途或延后注册表截止时间。