Meshline Protocol 1.0 规范测试向量
以下 8 个 JSON 文件提供实现无关的规范测试向量。每个文件包含执行该专题所需的固定输入,可独立读取。先阅读本页通用执行规则,再按专题执行说明中的“覆盖范围 → 固定输入与引用 → 执行步骤与断言”验证。
| 文件 | 专题 | 验证内容 |
|---|---|---|
common-v1.json |
公共基础 | Canonical JSON、base64url、unsigned-varint、类型分派、网络绑定、X25519、密文容器结构 |
identity-auth-v1.json |
身份与认证 | 设备身份派生、证书双签名、origin、设备与账户认证签名 |
contacts-v1.json |
联系人 | 授权签名与格式、授权选择与合并、邀请签名与类型 |
message-encryption-v1.json |
消息加密 | 信封签名、AAD 认证、payload 加解密、收发双方密钥盒 |
message-content-v1.json |
正文与附件 | 正文格式与渲染安全、附件加密、哈希引用解析、消息认证绑定 |
channels-v1.json |
频道 | 频道 ID、发布与编辑签名、连续编辑投影、附件引用解析 |
groups-v1.json |
群组 | 群 ID 与密码学、管理链与状态转换、证书及账户绑定、可见性、加密昵称与本地状态 |
dht-keyspace-v1.json |
DHT | 资源 key 派生、FIND_NODE 请求与分帧、keyspace 映射与 XOR 距离 |
通用执行规则
其中的输入值、原始 UTF-8 bytes 和预期结果都是规范性数据。向量中的私钥只用于互操作测试,任何部署不得使用这些密钥。
文件结构与可信上下文
- 文件根统一使用
$type: "meshline.protocol.test-vectors"和字符串protocol_version: "1.0",其余具名章节按专题组织。文件元数据不属于线上协议对象。 - 向量文件中的
protocol_version和文件名中的v1标识适用的规范版本,不是协议对象的格式选择字段。对象及密码学输入只使用各自的$type;按对象类型解释,不补入默认version。 network_context和candidate_network_context是测试使用的可信上下文字符串,格式与$context相同,不是网络对象的字段。签名、哈希及定义为网络绑定的密码学输入使用$context,网络传输对象不携带该字段;aad_overrides中的$context只用于篡改本地 AAD 的认证失败测试。- 根
network_context是该文件涉及网络绑定操作时使用的可信值;纯编码、X25519、容器结构及原始 Peer ID 的 keyspace 运算不使用它。用例明确提供候选上下文时,只覆盖该项指定的测试输入。
向量中的账户 ID 使用 CAIP-10 格式 neo:<reference>:<address>;涉及账户 ID 的密码学输入使用这一完整字符串,相应签名、标识符、哈希、密钥派生和加密结果须与之匹配。
精确数据与结果比对
input_json是需要解析的精确 JSON 文本,input_utf8_hex是该文本的 UTF-8 bytes;两者解码后必须逐字相同。canonical_json是规范化后的单行 JSON,utf8_hex和utf8_base64是它的精确 UTF-8 bytes;实现不得通过重新格式化这些展示值替代原始 bytes 比较。sha256_hex和sha256_base64url是同一 32-byte SHA-256 结果的两种表示;base64url 必须符合总则的规范编码。展示用utf8_base64是普通 base64,不是协议 base64url 字段。rejection_vectors中的输入必须在生成签名、哈希或业务对象之前被拒绝;实现不得先改写为另一个 JSON 值后继续处理。- 各专题中的签名输入、AAD、KDF info、密文、认证标签和签名均为精确协议 bytes,必须从固定输入独立重建并比对;账户 ECDSA 签名生成的比对遵循下述 nonce 规则。
对于 JSON 向量,实现应先验证 input_json 与 input_utf8_hex 一致,再执行向量指定的操作,并同时比对 Canonical JSON、原始 bytes、摘要和最终 ID 或 key;随后逐项确认相应拒绝用例不会产生 Canonical JSON。任何必须精确比对的结果不同都表示实现不兼容。
签名与密码学验证
向量中的账户 ECDSA 签名使用 RFC 6979 和 SHA-256 确定性生成:
- 实现采用该生成方式时,必须逐 byte 比对生成的签名。
- 采用协议允许的随机 nonce 时,必须独立重建并比对签名输入、验证向量所给签名,并验证自行生成的签名,不要求随机生成的签名字节等于向量值。
- 向量中的签名作为嵌套对象、后续签名或哈希的输入时,必须使用向量所给的原始签名字节,不能替换为另一次生成的签名后要求派生结果相同。
- Ed25519 签名及其他确定性结果仍须精确比对。
密码学向量还必须完成适用的签名验证、密钥盒解封、payload 解密和外部内容解密。
同文件输入引用
- 测试元数据中的
<字段名>_ref替代同一位置的<字段名>,值为以/开始的同文件 JSON Pointer;属性名中的~、/分别以~0、~1表示,数组项使用从 0 开始的索引。读取时复制指向的实际值,还原原字段后再执行用例。例如signing_device_ref: "/grants/signing_devices/0"还原为完整signing_device输入。 - 引用直接指向实际数据,不跨文件、不串联;字段和对应的
_ref不同时出现。每项篡改用例独立复制展开后的输入,不能修改共享原值。 - 仅解析各专题执行说明明确列出的外围测试引用。完整传输对象、签名输入和预期响应内部保持原样;真实协议对象中的未知属性即使以
_ref结尾,也不作为测试指令解析。 - 既有
label、name、id、post_case、事件索引等用例关联保持原规则。各专题执行说明中的字段路径相对于所指出的专题章节;文件根可信上下文及跨章节路径另行注明。
测试元数据与断言边界
scope、用例名称、输入变更、预期结果及投影等外围字段用于描述测试,不加入线上请求、响应、签名输入或业务对象。用例中的结果名称和标签只按执行说明解释,不自行注册协议字段、对象类型或错误码。
每项用例只断言列出的检查结果。格式通过、验签成功、AEAD 认证成功和业务授权有效须分别验证;其中一项通过不能代替其他适用检查。专题说明保留各组的具体边界,未覆盖的行为按下述一致性要求验证。
一致性测试边界
兼容实现必须通过适用的向量,并验证所实现模块的行为;确定性结果比对不能代替行为测试。
行为测试须覆盖正常路径、字段省略与非法输入、编码与签名篡改、数值及时间边界、文本与完整对象大小限制;涉及状态或异步处理时,还须覆盖并发、重复提交、响应或通知丢失、配置变化及重启恢复。一个方法支持多种传输形式时,其参数、授权、业务结果与错误语义必须一致。
字段约束、状态转换及预期结果由对应正文规定。以下入口按主题汇总验证范围,具体用例从正文规则和适用向量推导:
- 客户端—中继协议覆盖中继发现、会话、账户状态、联系人和可靠消息;
- 频道托管协议覆盖频道 ID、签名、revision、权限、帖子删除、有限保留、sequence 缺口和时间线重建;
- 群组托管协议覆盖固定托管、分离秘密、成员与设备访问状态机、私有状态和关闭语义;
- 中继 DHT覆盖多节点存取、路由过期及重启后的版本防回退、同版本冲突保留、网络分区和无效 Peer;
- 中继 RPC覆盖连接身份、跨中继查询、可靠投递、错误恢复和重启。
一致性验证必须至少使用一个参考实现与独立网络传输测试工具,或两个相互独立的实现执行互操作测试。