【发布时间】:2021-10-22 15:55:36
【问题描述】:
我正在尝试验证欧盟 covid 护照中的 COSE 数据。
使用https://github.com/panzi/verify-ehc 进行验证,但这使用python 库,我想在JS 中进行。验证依赖于这个公共证书:
let pKey = {
"kty": "EC",
"crv": "P-256",
"x": "snip",
"y": "snip",
"key_ops": [
"verify"
],
"kid": "snip"
}
我要验证的数据是COSE/CBOR数据(下面result),看起来像
Tagged {
tag: 18,
value: [
<Buffer a2 01 26 04 ...>,
{},
<Buffer a4 01 62 42 ... 179 more bytes>,
<Buffer 7e a4 63 4f ... 14 more bytes>
],
err: undefined
}
我尝试使用以下
const cbor = require("cbor");
const ECKey = require('ec-key');
const result = cbor.decode(coseMessage);
let [headers1, headers2, cbor_data, signature] = result.value;
const key = new ECKey(pKey)
const verified =
key.createVerify('SHA256')
.update(cbor_data)
.verify("", signature);
createVerify 是here。我已经进一步解码了headers1,并声称该算法是ES256(我不知道它如何对应于P-256)。
我总是收到verified: false 并怀疑这是因为:
- 我使用了错误的加密工具;和/或
- 我正在验证错误的数据(导致签名无法匹配)
欢迎大家指点
【问题讨论】:
-
这方面有什么进展吗?我也解码了protected_header,但我坚持解码签名。但我使用的是纯 JavaScript,而不是节点:
protected_headerArr = typedArrayToBuffer(protected_header); protected_headerData = CBOR.decode(protected_headerArr); let kid = protected_headerData['4'];