Pular para o conteúdo
ecdsa.com
WebCrypto crypto.subtleWebCrypto

Mensagem de erro

NotSupportedError: Unrecognized algorithm name

Texto do Node; o Node também informa “Unrecognized namedCurve” para curvas desconhecidas. O Chrome imprime “Failed to execute 'generateKey' on 'SubtleCrypto': Algorithm: Unrecognized name”, o Firefox, “Operation is not supported”, e o Safari, “The operation is not supported.” — a parte estável é o nome da DOMException, NotSupportedError.

WebCrypto crypto.subtle — browsers & Node

O que significa

O algoritmo (ou a curva) que você indicou não está entre os que esta implementação do WebCrypto oferece. Ou o identificador tem um erro de digitação, ou você pediu algo que de fato está fora do conjunto padrão — na maioria das vezes, a secp256k1, que o WebCrypto não inclui, embora seja uma curva EC como as da família P-*. A verificação acontece antes de qualquer material de chave ser usado, então a mesma chamada funciona assim que o nome é corrigido.

Por que acontece

Como corrigir

  1. 1.

    Usar os identificadores exatos do WebCrypto

    Os nomes são comparados sem diferenciar maiúsculas de minúsculas, mas precisam ser os registrados — e os nomes de curva precisam ser exatos. Repare nos dois dicionários: generateKey/importKey recebem namedCurve, enquanto sign/verify recebem hash; confundir os dois é uma variante própria deste erro.

    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.

    Para secp256k1, usar uma biblioteca

    Nos navegadores, o caminho padrão é uma implementação auditada em JS puro; no Node, o módulo crypto embutido (fora do WebCrypto) oferece suporte nativo à curva, então o código de servidor tem duas opções.

    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" });

Erros relacionados

Ver toda a base de erros de assinatura