feat(ios): 中继通道 P4/P5——端点抽象、信封、传输、配对与分层错误
- InstanceEndpoint 取代 Instance.origin(旧数据 init(from:) 读成 .direct, 写盘只输出 endpoint;dedupKey 直通用 origin、中继用 relay:<nodeID>) - RelayWire:Swift 侧重算 contracts/test-vectors.json(CanonicalJSON 手写解析器, 因为 Foundation 的解码器会抹掉'拼写',而 intent 摘要定义的正是拼写) - NodeTransport 抽象 + DirectTransport / RelayTransport / NodeTransportRouter; DirectTransport 是薄适配,直通路径行为不变 - RelayTransport:信封构造、签名、加密、验签、解密;响应验签失败即丢弃, 四类以上失败各有独立 UpstreamError 分支与用户文案 - DeviceIdentity(沙盒文件 0600,配对时由节点分配 deviceID)、RelayPairing、配对 sheet - 卡片通道徽标 + freshness 副标题;危险写 intent 在发送瞬间生成 - scripts/export-app-routes.swift 生成 vendored 路由表,AppRoutesContractTests 反向守卫 - 测试 78→92:向量互算、迁移(字面量旧 JSON)、配对四类失败、路由器、 传输往返与各类拒绝路径
This commit is contained in:
@@ -283,6 +283,27 @@ agent 都从它加载,并加一个测试断言两侧解析结果一致。这
|
||||
P2/P3 可并行。P4 是唯一动到现有 iOS 数据模型的部分,风险集中在迁移,建议单独一个分支并配
|
||||
旧数据升级测试。
|
||||
|
||||
> **实现进度(2026-09)**:P1–P5 已落地,P6 部分完成。
|
||||
>
|
||||
> - P1:`contracts/agent-policy.json` + `app-routes.json` 钉死策略面,`relay/src/errors.js` 枚举
|
||||
> 中继错误码,iOS 侧 `RelayErrorCode` / `AgentOutcome` / `SnapshotFreshness` 与之一一对应;
|
||||
> `scripts/export-app-routes.swift` 生成 vendored 路由表,iOS 的 `AppRoutesContractTests`
|
||||
> 反向断言它仍与应用可构造的路由一致(此前这条链中间有一个手抄环节)。
|
||||
> - P4:`InstanceEndpoint` 取代 `Instance.origin`,旧数据由 `init(from:)` 读成 `.direct`,
|
||||
> `FileInstanceRepository` 只写新形状;迁移由 `InstanceEndpointMigrationTests` 用字面量旧 JSON 覆盖。
|
||||
> `NodeTransport` 抽象 + `DirectTransport`/`RelayTransport`/`NodeTransportRouter`。
|
||||
> `RelayWire` 在 Swift 侧重算 `contracts/test-vectors.json`(见下)。
|
||||
> - P5:卡片通道徽标与 freshness 副标题、`ErrorMessage.describe` 的四类以上分层文案、
|
||||
> 危险写 intent 由 `RelayTransport.encode` 在发送瞬间生成、配对 sheet(`RelayPairingView`)。
|
||||
> 吊销入口仍未做:目前需要在内网对节点跑一次 `--pair --destroy`。
|
||||
> - P6:部署与渗透自查未做。
|
||||
>
|
||||
> **Swift 侧签名不是逐字节可复算的**:CryptoKit 的 Ed25519 签名是随机化的(同一密钥同一消息
|
||||
> 两次签名结果不同),Go 与 Node 用的是 RFC 8032 确定性实现。因此 `RelayWireTests` 校验的是
|
||||
> 更强的性质——双方各自验证对方产出的签名,以及签名输入与向量中的规范化字节完全相等——而不是
|
||||
> 签名本身相等。这一点已实测确认:CryptoKit 能验证 Go 生成的签名,Go 也能验证 CryptoKit 生成的
|
||||
> 签名。
|
||||
|
||||
## 10. 已知代价
|
||||
|
||||
- 中继被攻破 = 服务不可用(拒绝投递),不等于数据泄露。这是本方案换来的东西。
|
||||
|
||||
Reference in New Issue
Block a user