Член JWK "key_ops" несовместим с элементом, указанным в вызове Web Crypto.

На NodeJS я генерирую ключ и экспортирую его следующим образом:

const { Crypto } = require("@peculiar/webcrypto");
const crypto = new Crypto();
....
....
....

    let KeyPair = await crypto.subtle.generateKey(
        {
          name: "ECDH",
          namedCurve: "P-384"
        },
        false,
        ["deriveKey"]
    );


    let exportPubKey = await crypto.subtle.exportKey(
        "jwk",
        KeyPair.publicKey
    )

Теперь, когда я пытаюсь импортировать экспортированный ключ на клиенте, который использует браузер Chrome, он выдает исключение DOM, я импортирую его следующим образом:

window.crypto.subtle.importKey("jwk", {"kty":"EC","crv":"P-384","key_ops":[],"ext":true,"x":"mbLH4QWKwgYu3cwaUsk59M9awwhJydGdJOH0z8WapKuW6DAlnI8bcUg7kOl9ZCdb","y":"-PQ_HUtA45oC8YL3Zk2dExIWxykhimjfqFAc2pQrPTmrDKa-5AVn4Noz3PitZw2W"}, {"name": "ECDH", "namedCurve": "P-384"}, false, ["deriveKey"])

Ошибка,

DOMException: The JWK "key_ops" member was inconsistent with that specified by the Web Crypto call. The JWK usage must be a superset of those requested

Что меня удивляет, я могу импортировать то же самое на Node без ошибок. Я имею в виду, что клиент генерирует JWK в почти таком же формате.

1 ответ

Решение

После битового фаззинга я понял, что вам нужно передать пустой массив, чтобы преодолеть ошибку.

window.crypto.subtle.importKey("jwk", {"kty":"EC","crv":"P-384","key_ops":[],"ext":true,"x":"mbLH4QWKwgYu3cwaUsk59M9awwhJydGdJOH0z8WapKuW6DAlnI8bcUg7kOl9ZCdb","y":"-PQ_HUtA45oC8YL3Zk2dExIWxykhimjfqFAc2pQrPTmrDKa-5AVn4Noz3PitZw2W"}, {"name": "ECDH", "namedCurve": "P-384"}, false, ["deriveKey"])

Становится,

window.crypto.subtle.importKey("jwk", {"kty":"EC","crv":"P-384","key_ops":[],"ext":true,"x":"mbLH4QWKwgYu3cwaUsk59M9awwhJydGdJOH0z8WapKuW6DAlnI8bcUg7kOl9ZCdb","y":"-PQ_HUtA45oC8YL3Zk2dExIWxykhimjfqFAc2pQrPTmrDKa-5AVn4Noz3PitZw2W"}, {"name": "ECDH", "namedCurve": "P-384"}, false, [])
Другие вопросы по тегам