【问题标题】:Verify COSE data (P-256)验证 COSE 数据 (P-256)
【发布时间】: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'];

标签: node.js sha cbor


【解决方案1】:

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

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

【讨论】:

  • 谢谢,后来我发现我上面的pKey需要更多的预处理才能使用,然后cos-js可以处理。我仍在尝试弄清楚 cose-js 是如何验证有效负载的,因为我最终想用另一种语言实现这一点
  • 嗨,我尝试使用 openssl 在 C/C++ 中实现 PS256(RSASSA-PSS w/ SHA-256),我可以从你那里获得一些信息吗?
猜你喜欢
  • 2022-01-18
  • 1970-01-01
  • 2022-08-16
  • 2020-09-17
  • 2019-05-25
  • 2019-02-12
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
相关资源
最近更新 更多