Перейти к содержимому
ecdsa.com
WebCrypto crypto.subtleWebCrypto

Сообщение об ошибке

NotSupportedError: Unrecognized algorithm name

Это формулировка Node; для неизвестных кривых Node также выдаёт «Unrecognized namedCurve». Chrome выводит «Failed to execute 'generateKey' on 'SubtleCrypto': Algorithm: Unrecognized name», Firefox — «Operation is not supported», Safari — «The operation is not supported.». Неизменным остаётся только имя DOMException — NotSupportedError.

WebCrypto crypto.subtle — browsers & Node

Что это означает

Указанного алгоритма (или кривой) нет в этой реализации WebCrypto. Либо в идентификаторе опечатка, либо вы запросили что-то действительно за пределами стандартного набора, чаще всего secp256k1: WebCrypto не включает эту кривую, хотя она такая же кривая EC, как семейство P-*. Проверка выполняется до какой-либо работы с ключевым материалом, поэтому тот же самый вызов пройдёт, как только имя будет исправлено.

Почему это происходит

Как исправить

  1. 1.

    Используйте точные идентификаторы WebCrypto

    Имена алгоритмов сравниваются без учёта регистра, но должны быть зарегистрированными, а имена кривых должны совпадать точно. Обратите внимание на два словаря: generateKey/importKey принимают namedCurve, а sign/verify — hash; если их перепутать, получится отдельная разновидность этой ошибки.

    js
    const key = await crypto.subtle.generateKey(
      { name: "ECDSA", namedCurve: "P-256" },   // not "ES256", not "secp256r1"
      false, ["sign", "verify"],
    );
    const sig = await crypto.subtle.sign({ name: "ECDSA", hash: "SHA-256" }, key.privateKey, data);
  2. 2.

    Для secp256k1 используйте библиотеку

    В браузерах стандартный путь — реализация на чистом JS, прошедшая аудит; в Node встроенный модуль crypto (не WebCrypto) поддерживает эту кривую нативно, поэтому у серверного кода есть два варианта.

    js
    // browser: @noble/curves (audited, dependency-free)
    import { secp256k1 } from "@noble/curves/secp256k1";
    const ok = secp256k1.verify(signature, msgHash, publicKey);
    
    // node: built-in
    crypto.generateKeyPairSync("ec", { namedCurve: "secp256k1" });

Связанные ошибки

Открыть всю базу ошибок подписей