本文へスキップ
ecdsa.com
WebCrypto crypto.subtleWebCrypto

エラーメッセージ

NotSupportedError: Unrecognized algorithm name

上記は Node の文言です。Node は未知の曲線に対して「Unrecognized namedCurve」も報告します。Chrome は「Failed to execute 'generateKey' on 'SubtleCrypto': Algorithm: Unrecognized name」、Firefox は「Operation is not supported」、Safari は「The operation is not supported.」と出力します。変わらないのは DOMException の名前 NotSupportedError です。

WebCrypto crypto.subtle — browsers & Node

このエラーの意味

指定したアルゴリズム(または曲線)は、この WebCrypto 実装が提供しているものではありません。識別子の綴りが間違っているか、本当に標準のセットに含まれないものを要求しています。最も多いのは secp256k1 で、P-* ファミリーと同じ EC 曲線であるにもかかわらず、WebCrypto には含まれていません。このチェックは鍵データに触れる前に行われるため、名前を直せばまったく同じ呼び出しが成功します。

発生する理由

修正方法

  1. 1.

    WebCrypto の識別子を正確に使う

    名前は大文字と小文字を区別せずに照合されますが、登録済みの名前でなければなりません。また、曲線名は完全に一致する必要があります。2 つの辞書に注意してください。generateKey/importKey は namedCurve を、sign/verify は hash を受け取ります。この 2 つを取り違えるのも、このエラーの一種です。

    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.

    secp256k1 にはライブラリを使う

    ブラウザーでは、監査済みの純粋な JS 実装を使うのが標準的な方法です。Node では、組み込みの(WebCrypto ではない)crypto モジュールがこの曲線にネイティブで対応しているため、サーバー側のコードには選択肢が 2 つあります。

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

関連するエラー

署名エラーデータベースをすべて見る