Aller au contenu
ecdsa.com
WebCrypto crypto.subtleWebCrypto

Message d’erreur

NotSupportedError: Unrecognized algorithm name

Le texte ci-dessus est celui de Node ; Node signale aussi « Unrecognized namedCurve » pour les courbes inconnues. Chrome affiche « Failed to execute 'generateKey' on 'SubtleCrypto': Algorithm: Unrecognized name », Firefox « Operation is not supported », Safari « The operation is not supported. » ; le nom de la DOMException, NotSupportedError, est la partie stable.

WebCrypto crypto.subtle — browsers & Node

Ce que cela signifie

L’algorithme (ou la courbe) que vous avez nommé ne fait pas partie de ceux que propose cette implémentation WebCrypto. Soit l’identifiant contient une faute de frappe, soit vous avez demandé quelque chose qui sort réellement de l’ensemble standard : le plus souvent secp256k1, que WebCrypto n’inclut pas bien qu’il s’agisse d’une courbe EC comme celles de la famille P-*. La vérification a lieu avant que le moindre élément de clé ne soit manipulé : le même appel réussit donc une fois le nom corrigé.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Utiliser les identifiants WebCrypto exacts

    Les noms sont comparés sans tenir compte de la casse, mais il doit s’agir des noms enregistrés ; les noms de courbes, eux, doivent être exacts. Notez les deux dictionnaires : generateKey/importKey prennent namedCurve, tandis que sign/verify prennent hash ; les confondre est une variante à part entière de cette erreur.

    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.

    Pour secp256k1, utiliser une bibliothèque

    Dans les navigateurs, une implémentation auditée en JavaScript pur est la voie habituelle ; dans Node, le module crypto intégré (hors WebCrypto) gère la courbe nativement : le code serveur a donc deux options.

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

Erreurs associées

Parcourir toute la base de données des erreurs de signature