Aller au contenu
ecdsa.com
WebCrypto SubtleCrypto.importKeyWebCrypto

Message d’erreur

TypeError: Failed to execute 'importKey' on 'SubtleCrypto': The provided value is not of type '(ArrayBuffer or ArrayBufferView or JsonWebKey)'.

Également affiché sous la forme

  • TypeError: SubtleCrypto.importKey: Argument 2 is not an object.
  • TypeError: Type error

Le texte ci-dessus est celui de Chromium ; Firefox affiche « SubtleCrypto.importKey: Argument 2 is not an object. », Safari/WebKit simplement « Type error ». Node.js signale `ERR_INVALID_ARG_TYPE` pour le même appel.

WebCrypto SubtleCrypto.importKey — PEM text passed as keyData (Chromium / Firefox / WebKit)

Ce que cela signifie

`importKey` a reçu une chaîne comme `keyData`. WebCrypto n’analyse jamais de texte : pour `"spki"`, `"pkcs8"` et `"raw"`, il attend du DER binaire (un `ArrayBuffer` ou un tableau typé) ; pour `"jwk"`, un objet JavaScript. Le navigateur rejette l’appel pendant la conversion des arguments, avant d’examiner le format ou la clé : le PEM peut donc être parfaitement valide.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Retirer l’armure et décoder en octets

    Supprimez les lignes BEGIN/END et les blancs, décodez le base64 et choisissez le format d’après le libellé : `PUBLIC KEY` → `spki`, `PRIVATE KEY` → `pkcs8`.

    js
    function pemToDer(pem) {
      const base64 = pem.replace(/-----(BEGIN|END) [A-Z ]+-----/g, "").replace(/\s+/g, "");
      return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
    }
    
    const publicKey = await crypto.subtle.importKey(
      "spki", pemToDer(publicKeyPem),               // "PUBLIC KEY" -> spki, "PRIVATE KEY" -> pkcs8
      { name: "ECDSA", namedCurve: "P-256" }, false, ["verify"],
    );
  2. 2.

    Passer les JWK sous forme d’objets

    Les points de terminaison JWKS fournissent déjà des objets ; analysez le texte JSON une seule fois et passez l’objet avec la courbe correspondante.

    js
    const jwk = JSON.parse(jwkText);                  // an object, not the JSON string
    const key = await crypto.subtle.importKey("jwk", jwk, { name: "ECDSA", namedCurve: jwk.crv }, false, ["verify"]);

Erreurs associées

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