摘要

  • draft-tiloca-lake-private-use-ranges-01 为 EDHOC 的方法类型、错误码和外部授权数据标签提出新的私用范围,所选整数以四字节 CBOR 参数表示,连同首字节共五字节。
  • 正端点 4294967295 与负端点 -4294967296 都不属于有符号 32 位整数域;解析成功不能证明后续类型转换、范围检查或绝对值计算正确。
  • 私用数值只在明确的协调域内有意义。认证同一段消息,并不证明两端采用同一语义,更不证明应用动作已经成功。

最值得测试的并不是一个常见的小整数,而是两端点。设备甲收到 4294967295,64 位 CBOR 解码器保留原值;设备乙的旧接口把它转成 int32,结果变为 -1 或直接拒绝。两台设备都可能声称“已支持 EDHOC”,但它们已经不再处理同一个数。

2026 年 9 月 30 日的个体 Internet-Draft 《为 LAKE 协议的 IANA 注册表增加私用范围》把这个问题写得很具体。修订版 01 把私用值放到现有短编码范围之外,使方法类型和错误码的正负范围延伸到四字节 CBOR 参数的极限;EAD 注册表则登记相应的绝对值正范围。

五个线上字节不等于一个 int32

RFC 8949 用主类型 0 表示无符号整数 N,用主类型 1 表示 -1-N。四字节参数最大为 4294967295。因此它既能表示同值的正整数,也能在负主类型下表示 -4294967296。首字节再加四字节参数,线上长度都是五字节;数学值域却比有符号 32 位多出一整侧。

草案因此要求支持完整范围的实现采用可保留所有值的表示,例如有符号 64 位,或把符号与无符号参数分开保存。该要求不能只停在解码器。分派表、枚举、序列化、数据库列、遥测字段和日志都可能再次收窄。

五个线上字节不等于一个 int32
层次 成功能说明什么 仍不能说明什么
CBOR 解析 字节构成合法整数 应用类型装得下
范围判断 数值属于拟议私用区间 双方赋予同一含义
EDHOC 认证 受保护的 transcript 验证通过 本地策略授权了此扩展
本地分派 找到了一个处理器 对端选择了等价处理器
应用回执 观察到一次结果 私用编号具有全球唯一性

EAD 的符号不是装饰

RFC 9528 规定 IANA 登记 ead_label 的绝对值,而线上负值表示“关键”项目,非负值表示“非关键”项目。因此 65536 与 -65536 指向同一种私用 EAD,却要求未知接收方作出不同决定。

这组数还有一个编码陷阱。正 65536 需要四字节参数,总长五字节;负 -65536 对应的参数是 65535,只需两字节参数,总长三字节。若实现先取绝对值再决定关键性,可能丢掉符号;若在 32 位有符号类型中对 -4294967296 取绝对值,连原始值都无法表示。

审计记录必须分别保存:收到的有符号标签、用于注册表查找的绝对值、关键性判断。把三者压成一个“规范化编号”,会删除最需要解释的控制信息。

私用空间是范围,不是全球命名权

RFC 8126 明确说明,Private Use 不面向一般互操作,也不会阻止不同主体把同一数值用于不同目的。草案把防碰撞责任交给每个预定部署范围。

所以“70000”本身不是完整语义。它还需要私用协调域、配置版本和兼容集合。两家厂商可以各自正确使用 70000;当并购、共享网关或通用 SDK 把它们接在一起时,数值相同反而可能掩盖语义冲突。安全默认应是不认识协调域就拒绝,而不是凭数字猜测。

三个注册表意味着三种后果

方法类型决定认证方法;错误码决定故障解释;EAD 标签选择对 EDHOC 不透明的应用数据,并由符号携带关键性。相同的截断缺陷,在三个位置可能表现为错误方法、错误恢复路径或错误的继续/中止决定。

这不是在宣称 EDHOC 已被攻破。草案称新增范围不改变 RFC 9528 的安全考虑,也没有报告任何具体产品事故。它指出的是实现责任:协议可表示的整数必须被完整带过每个软件边界。

测试必须覆盖边缘而不是只覆盖入口

至少测试 65535/65536、4294967295、-65536/-65537、-4294967296 以及各范围外一格。EAD 同一私用项目要分别用正负标签;另应让两个私用配置故意为同一数值声明不同含义,确认系统能够识别并拒绝不兼容域。

断言对象包括原始字节、数学整数、转换结果、范围分类、处理器、关键性和日志。仅看到握手成功,不能证明这些环节一致。

当前 IANA EDHOC 注册表只是 RFC 9528 建立的基线。Datatracker把修订版 01 列为个体草案,并不表示 IANA 已执行请求、IETF 已形成共识或实现已经部署。RFC 9668 中相邻的凭据类型私用范围,也不能替这些新代码路径提供运行证据。

保住原值的回执

每次接收私用值,记录所属注册表、CBOR 原始字节、主类型、参数宽度、收窄前数学整数、每次受检转换、EAD 的符号/绝对值/关键性、本地协调域与版本、双方兼容集合、选中的处理器、认证 transcript 引用和下游结果。专有语义可以用稳定标识或配置摘要表示,不必公开正文。

这样的回执不会把私用编号变成全球编号,也不会证明应用正确;它只确保发生分歧时,组织仍能知道线上究竟来了什么、哪条本地规则解释了它、系统最终做了什么。

来源