1

我正在尝试验证欧盟 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怀疑这是因为:

  • 我使用了错误的加密工具;和/或
  • 我正在验证错误的数据(导致签名无法匹配)

欢迎大家指点

4

1 回答 1

2

您应该使用 'cose-js' 来验证。由于数据是按照 COSE 规范签名的,因此应该按照相同的规范对其进行验证。规范定义了在调用验证函数之前必须执行的 CBOR 数据的转换。

话虽如此,JavaScript 中的大多数 COSE 库都不包含 DCC 使用的全套可能的关键算法。为了正确验证 DCC,我必须扩展 COSE-JS 库以支持 RSA-PSS。你可以在这里看到完整的代码:https ://github.com/Path-Check/dcc-sdk.js

于 2021-08-21T20:45:15.133 回答