Saltar al contenido
ecdsa.com
WebCrypto crypto.subtleWebCrypto

Mensaje de error

NotSupportedError: Unrecognized algorithm name

Es el texto de Node; con curvas desconocidas, Node también muestra «Unrecognized namedCurve». Chrome imprime «Failed to execute 'generateKey' on 'SubtleCrypto': Algorithm: Unrecognized name»; Firefox, «Operation is not supported», y Safari, «The operation is not supported.»; la parte estable es el nombre de la DOMException, NotSupportedError.

WebCrypto crypto.subtle — browsers & Node

Qué significa

El algoritmo (o la curva) que indicas no está entre los que ofrece esta implementación de WebCrypto. O el identificador tiene una errata, o pides algo que de verdad está fuera del conjunto estándar; lo más habitual es secp256k1, que WebCrypto no incluye a pesar de ser una curva EC como las de la familia P-*. La comprobación se ejecuta antes de tocar ningún material de clave, así que la misma llamada funciona en cuanto se corrige el nombre.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Usar los identificadores exactos de WebCrypto

    Los nombres se comparan sin distinguir mayúsculas y minúsculas, pero deben ser los registrados, y los nombres de curva se comparan de forma exacta. Fíjate en los dos diccionarios: generateKey/importKey reciben namedCurve, mientras que sign/verify reciben hash; confundirlos es una variante propia de este error.

    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 una biblioteca

    En los navegadores, lo habitual es una implementación auditada en JS puro; en Node, el módulo crypto integrado (ajeno a WebCrypto) maneja la curva de forma nativa, así que el código del servidor tiene dos opciones.

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

Errores relacionados

Explorar toda la base de datos de errores de firma