摘要

  • CPB 草案第03版为类型化摘要引用规定四种不同结果:Malformed、Unresolved、Failed 与 Verified;“结构合法”只是其中一个入口条件。
  • Verified 只证明在一个已声明且获授权的摘要语境下,取得的材料与引用值相符,并不自动证明签名者有权、材料有效、回执可信或行动获准。
  • 运行系统应分别保存 carrier、语法、profile、digest context、材料取得、重算、表示形式、签名、发行者、透明度回执、材料评估和本地决定的凭据。

第03版改变了“验证”一词的对象

Datatracker 将 draft-mih-sokolov-scitt-payload-binding-03 列为个人提交的有效 Internet-Draft。文件日期为2026年9月5日,作者把 SCITT 工作组写作预期讨论场所,但它没有 IETF stream、负责的 Area Director、telechat 或共识地位。它是可能继续修改、替换或到期的工作文件,不能写成既成标准或部署事实。

这次修订的关键不在于又提出一种摘要。第03版把 Canonical Payload Binding(CPB)的中性机制同具体 payload 格式分开,把类型化摘要引用定义为四成员信息模型。具体 profile 可以在 payload 中定义自己的序列化;CPB 另给出一个可选的 COSE 受保护头 carrier:cpb-refs。上一版所设想的 artifact-type registry 被撤下,消费 profile 必须通过稳定的规范引用声明自己接受哪些材料类型与摘要语境。

同一修订还把 Full-Content Mode 与 RFC 9995 Hash Envelope Mode 分清,并规定一份 Signed Statement 最多采用一个引用 carrier。更重要的是,它不再允许系统用一个“verified”状态覆盖全部过程。引用处理得到四种结果,而 COSE 签名是否有效、签名密钥是否获准代表发行者,则独立报告。

四种结果不是成功与失败的别名

Malformed 是入站结构失败。cpb-refs 或其中引用缺少必需成员、类型错误、超出长度/数量限制、出现重复 map key、重复四元组或未知内层键,都会进入该状态。内层 map 是封闭的,键1至4以外的内容不是可忽略扩展。一个条目畸形时,验证器不能从同一个头值中挑出其他条目报成 Verified;但 Signed Statement 的签名结果仍可单独记录。

Unresolved 的前提恰恰可能是格式完全正确。验证器若不能依 type 与可选 purpose 选出唯一、由消费 profile 授权的 digest context,就无法开始可信比较;若被引材料取不到,或本机没有执行该合法构造的实现,同样是 Unresolved。这不是摘要不相等的证据,也不是内容绑定的证据。

Failed 表示验证器已经掌握了更多事实:唯一获授权语境已选定,但引用声明的算法或表示形式与它冲突;token 永久未定义或被禁止;或者取得材料并重算后结果不等。把 Failed 与 Unresolved 混在一起,会把配置歧义、保留失败、能力缺口和真正的摘要不一致交给同一个错误处理程序。

Verified 要求整条链闭合:选出唯一授权语境,取得准确材料,执行其中的字段选择、排除集、规范化、域分隔、预映像编码、哈希与输出表示规则,再得到相同值。它证明的是“该材料在这个语境下与该引用绑定”。这句话没有包含“发行者可信”“材料安全”“可以部署”。

摘要算法名称不足以选定语境

第03版把 digest context 定义为产生比较值所需的全部参数。除算法外,还包括哪些字段进入预映像、哪些字段排除、采用哪一种 canonicalization、是否有 domain separation、预映像怎样编码,以及输出使用原始字节、裸十六进制还是带前缀文本。两串看起来相同的十六进制字符,只有在完整语境相容时才能比较。

选择由消费 profile 掌权。若一种 type 只获准一个语境,purpose 可以省略;一旦出现就必须匹配。若同一类型获准多个语境,每个语境必须有独立且非空的 purpose,引用也必须明确选择。没有匹配或有多个规范来源留下歧义时,结果是 Unresolved。实现不能按列表顺序、摘要长度、payload 外形或熟悉的 SHA-256 拼写自作主张。

这条边界会决定通用库是否越权。库也许会执行 RFC 8785 JCS 和 SHA-256,却不知道一个业务 profile 的字段集、排除集、版本与表示形式。若它凭经验补齐缺失配置,便把程序员的默认值冒充为消费机构的政策。正确输出应是“语境未解析”,并保留当时采用的 profile 版本与规范引用。

payload 中携带的 derived identifier 也只是提示值。验证器必须依据 profile 声明的排除集和明确排序的转换重新计算。复制生产者给出的 identifier,再把它与自己复制的值比较,不是验证。

一个 carrier,不能合并

CPB 让 profile 在每份 Signed Statement 中二选一:使用受保护头里的 cpb-refs,或使用 profile 自己的 payload carrier。生产者不能两者并用,即使两边引用不同材料。profile-aware 验证器看到两个 carrier 时,应把 statement 判为不符合规范,既不能求并集,也不能偏爱先被代码路径读到的一方。

这避免了顺序和覆盖权悄然进入协议。如果两组引用可以合并,重复项可能被当成更高权重,payload 中的值可能覆盖受签名保护的值,不同语言或运行库也可能得出不同引用集合。一个 carrier 让入站表面与审计凭据保持单一。

可选的 cpb-refs 是1至64项的数组。每项以整数键表示 type、可选 purpose、digest_alg 和 digest,并限制文本与字节串长度。CBOR 解码器必须在转成可能丢失重复项的数据模型之前发现重复 key。first-wins、last-wins、部分成功以及重复加权都被禁止。

CDDL 约束的是数据模型,不是唯一 CBOR 字节编码。测试向量可以固定一种编码以便复现,但验证器不能仅因另一种合法编码与 fixture 字节不同而拒绝。这与先前“同一签名输入可能对应不同传输 framing”的测量文章边界不同:本篇关心的是一个已入站的类型化引用能否在唯一授权语境下形成外部材料绑定。

表示形式与材料取得都要有记录

32个原始摘要字节、64字符小写十六进制文本和带前缀文本不是同一种协议值。若语境要求 raw octets,收到其 hex 拼写也不能无声转换。只有规范或适用 profile 明确声明转换及转换后的比较形式时,验证器才能执行它。否则语境已选而表示冲突,结果是 Failed。

材料取得是另一道门。语境清楚但材料暂时不可用时,引用是 Unresolved。一场网络故障、访问控制拒绝、缓存缺失、保留对象丢失或不支持的检索方案,都应保留成独立事件。稍后重试也许能取得材料,却不会改写原声明;两次观察都值得保存。

本机缺少构造实现亦然。它没有证明摘要失败,只证明此验证器无法完成验证。系统可以转交另一验证器、安装获准能力、延期或按本地政策拒绝,但不能借用其他组件的绿色状态填补空白。

签名覆盖了引用声明,并没有完成引用验证

cpb-refs 位于 COSE 受保护头,因此签名成功时其完整性受到保护。但受保护不等于加密,也不等于有权。第03版分别定义 Signature-Valid 与 Issuer-Authenticated:前者说明用选定密钥验证了密码学签名;后者说明本地政策接受该密钥代表所称发行者。

签名有效的 statement 可以含 Unresolved 或 Failed 引用。反过来,某个摘要成功重算也不能替签名失败的发行者取得身份。若界面只有一个勾,运维人员无法知道究竟是哪一层成功。

RFC 9943 的 SCITT receipt 再增加一个独立结果。声称 receipt-backed 状态之前,需要在验证器信任的 Transparency Service 密钥下检查回执,并从受保护头读取 VDS 标识。回执可以证明某份 Signed Statement 的登记性质,却不能修复畸形引用、替系统取回材料,或决定消费方是否采取行动。

即便 typed reference 达到 Verified,其范围仍很窄。草案明确排除 issuer authority、artifact validity、scope、freshness、revocation、policy compliance、semantic acceptance 与 application authorization。共享绑定层的价值,在于让一个有限 join 可跨机构复现,而不是代替所有后续判断。

受保护头不是保密层

cpb-refs 会公开类型、purpose、摘要算法、摘要值及引用图结构。稳定摘要可以把多份 statement 关联起来;低熵材料即使未随包传输,也可能受到字典猜测。运维问题因而不只是“通用验证器是否需要看到”,还包括“该关联边是否适合公开”。

草案建议在公开头不合适时省略 cpb-refs,或使用 profile 定义的保密 payload carrier。这个决定必须在分发前作出。签名材料一旦公开,后来改变网页权限并不能收回已经泄露的摘要图。

提案坐标不能写成 IANA 既成事实

第03版请求创建 Canonicalization Algorithm Registry,并请求登记 cpb-refs COSE Header Parameter。它们是 Internet-Draft 中的协调方案,不是已经完成的 IANA 动作。实现若在此阶段试用,必须保留草案版本、临时坐标和迁移假设。

这与 Heng Lu 的“最小初始规范”原则相合:共同层只需让一个小而可复现的事实流通——一个声明语境作用于一份取得的材料,产生一个比较结果。各消费方继续拥有新 profile、材料评估与行动的未来决定权。Running code 可以证明机制运行,但必须把当时的配置、字节、选择与执行凭据留下。

范围与不确定性

本文不主张 IETF 采纳、工作组共识、IANA 分配、产品支持或现实部署;不把附录的 field instances 写成广泛互操作证据;没有测试实现、透明度服务、供应链、事故、性能或漏洞。第03版可能继续修改、替换或到期。

Canonicalization 也不保证 payload 的语义正确。四态过程只产出一项有限证据。签名、发行者、回执、引用、材料评估、本地决定与现实效果必须分开,因为它们由不同主体负责、回答不同问题。

来源