注意
该提案未按指定实现, 然而,ECIES 长短构建消息(提案 152 和 157)设计了可扩展的选项字段。 请参见 Tunnel Creation ECIES 规范 查看官方规范。
概述
在隧道构建和隧道构建回复消息中,添加一个灵活、可扩展的机制,用于 I2NP 隧道构建记录中的选项。
动机
有一些尚未记录的提案即将设定隧道构建消息中的选项或配置, 因此隧道的创建者可以将一些参数传递给每一个隧道跳。
TBM 中有 29 个备用字节。我们希望在保持灵活性的同时,也能明智地利用空间。 使用“映射”结构每个选项至少会使用 6 个字节(“1a=1b;")。 严格定义更多的选项字段可能会在以后引起问题。
本文档提出了一种新的、灵活的选项映射方案。
设计
我们需要一个既紧凑又灵活的选项表示,以便我们可以将多个不同长度的选项容纳在 29 字节内。 这些选项尚未定义,目前也没有定义的必要。 不要使用“映射”结构(它编码了一个 Java 属性对象),因为这太浪费。 使用一个数字来表示每个选项和长度,从而实现紧凑而灵活的编码。 选项必须在我们的规范中按数字注册,但我们也将保留一个范围用于实验选项。
规范
初步 – 下面描述了几种替代方案。
如果标志(字节 184)中的第 5 位设置为 1,则只有在这种情况下才会出现。
每个选项为两个字节的选项编号和长度,后跟长度字节数的选项值。
选项从字节 193 开始,并最多持续到最后一个字节 221。
选项编号/长度:
两字节。位 15-4 是 12 位选项编号,1 - 4095。 位 3-0 是后续选项值字节的数量,0 - 15。 一个布尔选项可以没有值字节。 我们将在规范中维护一个选项编号的注册表,并且还定义一个范围用于实验选项。
选项值是 0 到 15 字节,需由需要该选项的内容解释。未知的选项编号应被忽略。
选项以一个编号/长度为 0/0 的选项结束,也就是两个 0 字节。 如果有剩余字节,应像往常一样用随机填充填满。
这种编码为我们提供了 14 个 0 字节选项或 9 个 1 字节选项或 7 个 2 字节选项的空间。 另一种方法是仅使用一个字节来表示选项编号/长度, 或许使用 5 位表示选项编号(最多 32),3 位表示长度(最多 7)。 这将把容量增加到 28 个 0 字节选项、14 个 1 字节选项或 9 个 2 字节选项。 我们还可以使其可变,其中 5 位选项编号为 31 表示读取 8 更多位以获取选项编号。
如果隧道跳需要向创建者返回选项,我们可以在隧道构建回复消息中使用相同的格式, 并在前缀中添加一些几个字节的魔数(因为没有定义标志字节来指示选项的存在)。 TBRM 中有 495 个备用字节。
注意
这些更改适用于隧道构建记录,因此可以用于所有构建消息风味 - 隧道构建请求、可变隧道构建请求、隧道构建回复和可变隧道构建回复。
迁移
隧道构建记录中的未使用空间用随机数据填充并且目前被忽略。 该空间可以转换为包含选项而不会出现迁移问题。 在构建消息中,选项的存在通过标志字节表示。 在构建回复消息中,选项的存在通过一个多字节魔数表示。