我正在尝试验证欧盟 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 在这里。我已经headers1
进一步解码并声称该算法是ES256
(我不知道它是如何对应的P-256
)。
我总是verified: false
怀疑这是因为:
- 我使用了错误的加密工具;和/或
- 我正在验证错误的数据(导致签名无法匹配)
欢迎大家指点