--- id: T-101 title: 签名 Catalog 验签与缓存回退原型 phase: 1 deps: [T-002] status: DONE created: 2026-07-16 issue: null context_ref: 45c242ecec153aa2d409a46883da9845503f185c claim_branch: null work_branch: agent/codex/T-101 write_paths: - docs/tasks/T-101.md - core/catalog/ - testdata/catalog/ - testdata/README.md - docs/api.md - docs/04-architecture.md - docs/current-state.md --- ## 问题 / 背景 Catalog 是后续下载与执行链路的信任根。当前协议只约定 Ed25519 和顶层 `signature`,尚未验证签名域、JSON 歧义处理、缓存替换与断网回退行为。若这里错误,篡改清单可能进入安装链路。 ## 方案 1. 在 `core/catalog` 建立 Ed25519 verifier,签名域为“移除顶层 `signature` 后的受限规范 JSON”。 2. 解析时拒绝重复字段、尾随 JSON、非对象根、非整数数字、缺失/非法长度签名,避免不同解析器对同一文档产生歧义。 3. 建立 Fetcher/Cache 接口与 Loader:远端验签成功后才写缓存;远端获取或验签失败时只使用再次验签通过的缓存。 4. 提供文件缓存原型,使用同目录临时文件 + current/backup 改名,并能读取中断后遗留的 backup。 5. 在 `testdata/catalog` 放置假数据与恶意样例;测试使用明确标注的专用测试密钥,不提交生产私钥。 6. 将签名域与原型结论同步到 `docs/api.md`、`docs/04-architecture.md`。 ## 验收要点 - 合法测试清单验签通过。 - 篡改内容复用合法签名、伪造签名、重复字段、浮点/指数数字均被拒绝。 - 远端验签失败不会覆盖最后有效缓存;断网可返回再次验签通过的缓存。 - 缓存自身被篡改时拒绝,不得当作离线可信数据。 - 文件缓存更新与 backup 恢复测试通过。 - `cd core && go vet ./... && go test -count=1 ./...` 通过,Phase 0 双目标闸门继续通过。 ## 边界(不改什么) - 不实现 HTTPS 客户端、Catalog 字段 Schema、OS/架构过滤或 UI 接入(T-201)。 - 不定稿密钥轮换、撤销名单和 package 独立签名域。 - 不引入第三方 JSON canonicalization 或加密依赖。 - 不提交生产私钥、真实 URL 或真实签名。 ## 协作约束 未启用 Gitea;本任务在 `agent/codex/T-101` 分支串行执行。签名格式结论标记为 Phase 1 原型,T-201 正式接入时再与发布端共同冻结。 ## 执行记录 - 2026-07-16:在 `core/catalog` 建立受限 JSON 解析/规范化与 Ed25519 verifier;拒绝重复字段、尾随值、无效 UTF-8、非对象根、非整数数字和非法签名编码/长度。 - 2026-07-16:签名域确定为移除顶层 `signature` 后的受限规范 JSON;对象键排序、数组保序、字符串标准 JSON 转义、数字仅允许整数。该结论已同步 `docs/api.md` 与 `docs/04-architecture.md`,并明确为 T-201 前的 Phase 1 原型。 - 2026-07-16:建立 Fetcher/Cache/Loader;远端只有验签成功才写缓存,获取失败或验签失败时只返回再次验签成功的缓存;缓存写失败作为非致命 warning 暴露。 - 2026-07-16:建立 FileCache 临时文件 + current/backup 切换原型,并支持 current 缺失时读取中断遗留 backup。 - 2026-07-16:新增公开虚构的 Catalog testdata;测试密钥由测试代码中的明确测试 seed 运行时派生,仓库不含生产私钥。 - 定向测试通过:合法、篡改、伪造、重复字段、浮点、指数、缺签名、尾随 JSON、无效 UTF-8、断网回退、坏缓存、缓存写失败与中断 backup 恢复。 - 验证通过:Go 1.20.14 `go vet ./...`、`go test -count=1 ./...`。 - 验证通过:`./scripts/verify_phase0.ps1`,包含 core 边界/版本检查和 modern/win7 双目标构建。 - 验证通过:`python scripts/validate_harness_governance.py`。