Aller au contenu
ecdsa.com
WebCrypto SubtleCrypto.sign / verify with ECDSAWebCrypto

Message d’erreur

TypeError: Failed to execute 'sign' on 'SubtleCrypto': EcdsaParams: hash: Missing or not an AlgorithmIdentifier

Également affiché sous la forme

  • TypeError: Failed to execute 'verify' on 'SubtleCrypto': EcdsaParams: hash: Missing or not an AlgorithmIdentifier
  • TypeError: Member EcdsaParams.hash is required and must be an instance of (object or DOMString)
  • NotSupportedError: Failed to execute 'sign' on 'SubtleCrypto': EcdsaParams: hash: Algorithm: Unrecognized name

Le texte ci-dessus est celui de Chromium (pour `verify`, le nom de la méthode change) ; Safari/WebKit : « Member EcdsaParams.hash is required and must be an instance of (object or DOMString) » ; Firefox signale une `SyntaxError` générique (« An invalid or illegal string was specified »).

WebCrypto SubtleCrypto.sign / verify with ECDSA — algorithm parameter without hash (Chromium / WebKit)

Ce que cela signifie

Dans WebCrypto, ECDSA reçoit la fonction de hachage à chaque opération, et non avec la clé : `sign` et `verify` exigent `{ name: "ECDSA", hash: "SHA-256" }`. L’appel a passé un objet d’algorithme sans `hash` (généralement l’objet `{ name, namedCurve }` de la génération de clé), et le navigateur a donc rejeté les paramètres avant de signer. (Les clés RSA font l’inverse : leur fonction de hachage est fixée à l’importation.) Un nom d’algorithme de hachage mal orthographié, comme `"SHA256"`, échoue en revanche avec une `NotSupportedError` signalant un nom non reconnu.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Séparer les paramètres de clé et les paramètres d’opération

    Définissez un objet pour la création de clé et un autre pour la signature. Pour les JWT ES256/ES384/ES512, utilisez respectivement SHA-256/384/512 avec P-256/384/521.

    js
    const KEY_ALG = { name: "ECDSA", namedCurve: "P-256" };   // generateKey / importKey
    const SIGN_ALG = { name: "ECDSA", hash: "SHA-256" };        // sign / verify (ES256)
    
    const pair = await crypto.subtle.generateKey(KEY_ALG, false, ["sign", "verify"]);
    const signature = await crypto.subtle.sign(SIGN_ALG, pair.privateKey, data);   // 64 bytes, raw r||s
    const ok = await crypto.subtle.verify(SIGN_ALG, pair.publicKey, signature, data);

Erreurs associées

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