CBOR编解码缓冲区不一致排查及欧盟绿色通行证QR码解码实现
问题原因
- 错误1:
cbor.decodeAllSync()方法返回的是所有解码结果组成的数组,你直接将整个数组传入cbor.encode(),编码结果会比原始单条CBOR数据多一层数组包装,自然和原始cbor_data不一致。 - 错误2:欧盟绿色通行证的CBOR数据采用*确定性CBOR编码规范(RFC 8949)*生成,默认的
cbor.encode()没有开启确定性配置,会因为map键排序规则、整数编码长度选择的差异,导致相同语义的数据编码后字节不同。
解决方案
修正代码逻辑,取解码后的单条数据,同时编码时开启确定性配置即可:
// 解码时取数组第一个元素,即原始CBOR对应的单条数据 const greenpassData = cbor.decodeAllSync(cbor_data)[0]; // 编码时传入deterministic参数开启确定性编码 const greenpassDataEncode = cbor.encode(greenpassData, { deterministic: true }); // 此时输出的greenpassDataEncode就会和原始cbor_data完全一致 console.log(greenpassDataEncode); console.log(cbor_data);
补充说明
如果你的后续逻辑需要用到COSE签名校验,无需重新编码payload,直接使用原始cbor_data参与签名校验即可,避免编码参数差异导致签名校验失败。
内容的提问来源于stack exchange,提问作者Shahryar Rafique
相关产品推荐
相关产品推荐

