Web認証:
公開鍵資格情報にアクセスするための API
レベル 3

W3C 候補勧告 スナップショット,

この文書の詳細
この版:
https://www.w3.org/TR/2026/CR-webauthn-3-20260113/
最新公開版:
https://www.w3.org/TR/webauthn-3/
編集者草案:
https://w3c.github.io/webauthn/
以前の版:
履歴:
https://www.w3.org/standards/history/webauthn-3/
実装レポート:
https://www.w3.org/2020/12/webauthn-report.html
フィードバック:
GitHub
編集者:
(Okta)
(Self-Issued Consulting)
(Microsoft)
(Yubico)
(Cisco)
前編集者:
(Google)
(Microsoft)
(Google)
(Google)
Jeff Hodges (formerly Google)
J.C. Jones (formerly Mozilla)
(PayPal)
(Microsoft)
(Nok Nok Labs)
寄稿者:
John Bradley (Yubico)
Christiaan Brand (Google)
Adam Langley (Google)
Giridhar Mandyam (Qualcomm)
Pascoe (Apple)
Nina Satragno (Google)
Ki-Eun Shin (SK Telecom)
Nick Steele (1Password)
Jiewen Tan (Apple)
Shane Weeden (IBM)
Mike West (Google)
Jeffrey Yasskin (Google)
Anders Åberg (Bitwarden)
テスト:
web-platform-tests webauthn/ (進行中の作業)

要約

この仕様は、ウェブアプリケーションがユーザーを強力に認証する目的で、強力で証明済み(attested)、スコープ付きの公開鍵ベースの資格情報を作成および使用できる API を定義します。概念的には、1つ以上の公開鍵資格情報が、それぞれ特定のスコープで与えられたWebAuthn Relying Partyに対してウェブアプリケーションの要求に基づいて作成され、バインドされます。ユーザーエージェントはユーザーのプライバシーを保護するために認証器およびそれらの公開鍵資格情報へのアクセスを仲介します。認証器は、ユーザー同意なしに操作が行われないことを保証する責任を負います。認証器は、attestationを通じてその特性の暗号学的証明をRelying Partiesに提供します。本仕様はまた、署名およびattestation機能を含む、WebAuthn に準拠した認証器の機能モデルも記述します。

この文書の状態

このセクションでは、公開時点での本書のステータスについて説明します。現在の W3C 公開物一覧および本技術レポートの最新改訂版は、W3C 標準およびドラフト インデックスで確認できます。

Web Authentication 規格が Candidate Recommendation を超えて進展するためには、新しい機能や拡張をサポートする 2 つのブラウザー実装を示す必要があります。 この仕様は Web Platform Tests のレベル 3 で検証されます。

この文書は、Web Authentication Working GroupRecommendation トラックを利用して Candidate Recommendation Snapshot として公開したものです。

この仕様に対するフィードバックやコメントを歓迎します。Github Issuesをご利用ください。議論はpublic-webauthn@w3.org アーカイブにもあります。

Candidate Recommendation として公開されたことは、 W3C およびその会員による支持を意味するものではありません。 Candidate Recommendation Snapshot は幅広いレビューを受けており、実装経験を収集することを目的とし、作業グループメンバーは実装に対しロイヤリティ無償ライセンスを約束しています。

この文書はドラフトであり、今後更新、置換、または廃止される可能性があります。進行中の作業以外の用途で本書を引用するのは不適切です。

この Candidate Recommendation が Recommendation に進むのは早くとも 2026年2月10日以降になる見込みです。

この文書は、W3C Patent Policy に基づいて活動するグループによって作成されました。W3C は本グループの成果物に関連して公開された特許開示の一覧を維持しています。そのページには特許開示の方法も記載されています。個人が、Essential Claim(s)を含むと考える特許について実際の知識がある場合、W3C Patent Policy のセクション 6に従って情報開示が必要です。

この文書は、2025年8月18日 W3C プロセス文書に従って管理されています。

1. はじめに

この節は規範的ではありません。

この仕様は、ウェブアプリケーションがユーザーを強力に認証する目的で、強力で証明済み(attested)、スコープ付きの公開鍵に基づく資格情報を作成および使用できる API を定義します。公開鍵資格情報は、WebAuthn Authenticatorによって、WebAuthn Relying Partyの指示のもと、ユーザー同意の下で作成・保存されます。その後、当該公開鍵資格情報へアクセスできるのは、そのRelying Partyに属するオリジンのみとなります。このスコープ付けは、準拠するユーザーエージェント認証器が共同で強制します。さらに、異なるRelying Parties間のプライバシーが維持されるため、あるRelying Partyは、他のRelying Partiesに対して、そのスコープされた資格情報の特性や存在さえも検出できません。

Relying Partiesは、ユーザーを伴う2つの区別されつつ関連する儀式の間に、Web Authentication APIを使用します。ひとつは登録(Registration)で、そこで公開鍵資格情報認証器上で作成され、当該ユーザーのアカウントに対してスコープ付けされます(アカウントは既に存在する場合もあれば、この時点で作成される場合もあります)。もうひとつは認証(Authentication)で、そこではRelying Partyに対して、当該資格情報を登録したユーザーの存在と同意を証明するAuthentication Assertionが提示されます。機能的には、Web Authentication APIは、Credential Management API を拡張するPublicKeyCredentialと、これらの資格情報を navigator.credentials.create() および navigator.credentials.get() で使用できるようにするインフラストラクチャから構成されます。前者は 登録 中に使用され、後者は 認証 中に使用されます。

大まかに言えば、準拠する認証器公開鍵資格情報を保護し、ユーザーエージェントと連携してWeb Authentication APIを実装します。準拠する認証器は、次のいずれかの方法でソフトウェアとして実装可能です:(a) 汎用計算機上で実行、(b) デバイス内の Secure Execution Environment、Trusted Platform Module (TPM)、または Secure Element (SE) 上で、あるいは (c) デバイス外で。デバイス上で実装される認証器は プラットフォーム認証器と呼ばれます。デバイス外で実装される認証器(ローミング認証器)には、USB、Bluetooth Low Energy(BLE)、Near Field Communications(NFC)などのトランスポート経由でアクセスできます。

1.1. 仕様ロードマップ

多くの W3C 仕様は主にユーザーエージェント開発者およびウェブアプリケーション開発者(いわゆる「Web 作者」)向けに書かれていますが、Web Authentication の性質上、本仕様は以下に示すように複数の聴衆によって正しく利用される必要があります。

全ての聴衆はまず § 1.2 ユースケース§ 1.3 API 利用のサンプルシナリオ、および § 4 用語を参照し、全体的なチュートリアルについては [WebAuthnAPIGuide] を参照することが推奨されます。それ以外に、本書の想定読者は以下の主要グループです。

注: 本仕様は Web Authentication API 自体に加えて、要求-応答の暗号プロトコル、すなわち WebAuthn/FIDO2 プロトコル を定義します。これは WebAuthn Relying Party サーバーと 認証器 の間のもので、Relying Party の要求は チャレンジ と、Relying Party によって提供され認証器へ送られる他の入力データで構成されます。要求は HTTPS、Relying PartyウェブアプリケーションWebAuthn API、およびユーザーエージェントと認証器間のプラットフォーム固有の通信チャネルの組み合わせを通じて伝達されます。認証器 はデジタル署名されたauthenticator data メッセージおよびその他の出力データで応答し、それが同じ経路を逆に辿ってRelying Party サーバーへ伝えられます。プロトコルの詳細は、認証 操作と 登録 操作のどちらが呼び出されるかによって異なります。図1 および 図2 も参照してください。

エンドツーエンドのセキュリティのためには重要です が、各コンポーネント—Relying Party サーバー、クライアント、および 認証器—の役割、および § 13 セキュリティ考慮事項§ 14 プライバシー考慮事項 を全ての聴衆が理解することが重要です。

1.2. ユースケース

以下のユースケースは、非常に異なる種類の認証器と資格情報の使用を、二つの一般的なデプロイメントタイプに渡って例示し、さらに他のシナリオも概説します。追加のシナリオ(サンプルコードを含む)は後述の § 1.3 サンプル API 利用シナリオ にあります。これらの例は説明目的のみであり、クライアントや認証器の実装によって機能の可用性が異なる場合があります。

1.2.1. マルチデバイス資格情報を持つ消費者

このユースケースは、消費者向けのRelying Partyが、ユーザーのデバイスに組み込まれた認証器を活用して、マルチデバイス資格情報(一般に同期されたパスキーと呼ばれる)を用いたフィッシング耐性のあるサインインを提供する方法を示します。

1.2.1.1. 登録
1.2.1.2. 認証

1.2.2. シングルデバイス資格情報を持つ職場利用者

このユースケースは、職場向けのRelying Partyが、USB セキュリティキーのようなローミング認証器と、組み込みの指紋センサーのようなプラットフォーム認証器を組み合わせて活用できる方法を示します。その結果、ユーザーは以下を持ちます:

1.2.2.1. 登録

この例では、雇用者がデバイスにバインドされたパスキーで事前設定されたセキュリティキーをユーザーに郵送します。

一時的な PIN がアウトオブバンドでユーザーに送信されました(例:RCS メッセージ経由)。

1.2.2.2. 認証

1.2.3. その他のユースケースと構成

その他にも様々なユースケースや構成が可能です(以下は一例に過ぎません):

1.3. サンプル API 利用シナリオ

この節は規範的ではありません。

この節では、公開鍵資格情報のライフサイクルにおけるいくつかのイベントと、この API を使った対応するサンプルコードを順に説明します。これは例示的なフローであり、API の利用方法を制限するものではありません。

前節と同様に、このフローは独自の表示を持つパスキーローミング認証器(例:スマートフォン)を伴うユースケースに焦点を当てています。他のタイプの認証器もクライアントプラットフォームが実装すれば本 API によってサポートされます。例えば、このフローはクライアントデバイスに組み込まれた認証器の場合でも変更なしに動作します。独自の表示を持たない認証器(スマートカードに類似)の場合も、クライアントプラットフォームが認証器が通常表示するプロンプトを代わりに表示し、認証器がすべての資格情報を列挙できるようにしてクライアントが適切なプロンプトを表示できるようにする等の実装上の考慮事項に従えば動作します。

1.3.1. 登録

これは初回フローで、新しい資格情報が作成されサーバーに登録されます。このフローでは、WebAuthn Relying Party はプラットフォーム認証器とローミング認証器のいずれにも特に優先を持ちません。

  1. ユーザーは example.com を訪問し、スクリプトが配信されます。この時点でユーザーは既に従来のユーザー名とパスワードや追加の認証器などでログインしている場合もありますし、新しいアカウントを作成中である場合もあります。

  2. Relying Party のスクリプトが以下のコードスニペットを実行します。

  3. クライアントプラットフォーム が認証器を検索して検出します。

  4. クライアント が認証器に接続し、必要ならばペアリング操作を行います。

  5. 認証器はユーザーに対してバイオメトリや他の認可ジェスチャーを要求するための適切な UI を表示します。

  6. 認証器はクライアントにレスポンスを返し、それがさらにRelying Party スクリプトにレスポンスを返します。ユーザーが認証器の選択や認可を拒否した場合は、適切なエラーが返されます。

  7. もし新しい資格情報が作成された場合、

    • Relying Party スクリプトは新しく生成されたcredential public keyをサーバーに送信し、認証器の起源や特性に関するアテステーションなどの追加情報も送ります。

    • サーバーはcredential public keyをデータベースに保存し、それをユーザーおよびアテステーションで示された認証の特性と関連付け、後で使用するためのフレンドリ名も保存します。

    • スクリプトは将来の UX を改善するために credential ID のようなデータをローカルストレージに保存することがあります。

新しい鍵を生成して登録するサンプルコードは次の通りです:

if (!window.PublicKeyCredential) { /* クライアントが対応していません。エラーを処理してください。 */ }

var publicKey = {
  // チャレンジはサーバーによって生成されます。セキュリティ上の注意点を参照してください
  challenge: new Uint8Array([21,31,105 /* サーバーによって生成されたさらに29個のランダムバイト */]),

  // Relying Party:
  rp: {
    name: "ACME Corporation"
  },

  // ユーザー:
  user: {
    id: Uint8Array.from(window.atob("MIIBkzCCATigAwIBAjCCAZMwggE4oAMCAQIwggGTMII="), c=>c.charCodeAt(0)),
    name: "alex.mueller@example.com",
    displayName: "Alex Müller",
  },

  // このRelying PartyはEdDSA、ES256、またはRS256のいずれかの認証情報を受け入れますが
  // EdDSAの認証情報を優先します。
  pubKeyCredParams: [
    {
      type: "public-key",
      alg: -8 // IANA COSEアルゴリズムレジストリに登録されている"EdDSA"
    },
    {
      type: "public-key",
      alg: -7 // IANA COSEアルゴリズムレジストリに登録されている"ES256"
    },
    {
      type: "public-key",
      alg: -257 // この仕様で登録された"RS256"の値
    }
  ],

  authenticatorSelection: {
    // 可能な場合はUV(ユーザー検証)を使用します。これはデフォルトでもあります。
    userVerification: "preferred"
  },

  timeout: 300000,  // 5分
  excludeCredentials: [
    // これらの認証情報を持つ認証器は再登録しません
    {"id": Uint8Array.from(window.atob("ufJWp8YGlibm1Kd9XQBWN1WAw2jy5In2Xhon9HAqcXE="), c=>c.charCodeAt(0)), "type": "public-key"},
    {"id": Uint8Array.from(window.atob("E/e1dhZc++mIsz4f9hb6NifAzJpF1V4mEtRlIPBiWdY="), c=>c.charCodeAt(0)), "type": "public-key"}
  ],

  // excludeCredentialsチェックをU2Fで登録された認証情報とも互換性を持たせる
  extensions: {"appidExclude": "https://acme.example.com"}
};

// 注意: 以下の呼び出しにより認証器がUIを表示します。
navigator.credentials.create({ publicKey })
  .then(function (newCredentialInfo) {
    // 新しい認証情報をサーバーに送信して検証および登録します。
  }).catch(function (err) {
    // 受け入れ可能な認証器がないか、ユーザーが承諾しませんでした。適切に処理してください。
  });

1.3.2. ユーザー検証を行うプラットフォーム認証器を用いた登録

これは WebAuthn Relying Party が特に 公開鍵資格情報ユーザー検証を行うプラットフォーム認証器 として作成することに関心がある場合の例です。

  1. ユーザーは example.com を訪れ、ログインボタンをクリックして login.example.com にリダイレクトされます。

  2. ユーザーはユーザー名とパスワードを入力してログインし、成功すると example.com にリダイレクトされます。

  3. Relying Party のスクリプトが次のコードスニペットを実行します。

    1. ユーザーエージェントは ユーザー検証を行うプラットフォーム認証器 が利用可能か確認します。利用できない場合はこのフローを終了します。

    2. Relying Party はユーザーに資格情報を作成するか尋ねます。ユーザーが作成を望まない場合はこのフローを終了します。

    3. ユーザーエージェントや/または OS が適切な UI を表示し、利用可能なプラットフォーム認証器のいずれかを使って資格情報を作成するようユーザーを案内します。

    4. 作成が成功したら、Relying Party スクリプトは新しい資格情報をサーバーに送信します。

if (!window.PublicKeyCredential) { /* Client not capable of the API. Handle error. */ }

PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable()
    .then(function (uvpaAvailable) {
        // If there is a user-verifying platform authenticator
        if (uvpaAvailable) {
            // Render some RP-specific UI and get a Promise for a Boolean value
            return askIfUserWantsToCreateCredential();
        }
    }).then(function (userSaidYes) {
        // If there is a user-verifying platform authenticator
        // AND the user wants to create a credential
        if (userSaidYes) {
            var publicKeyOptions = { /* Public key credential creation options. */};
            return navigator.credentials.create({ "publicKey": publicKeyOptions });
        }
    }).then(function (newCredentialInfo) {
        if (newCredentialInfo) {
            // Send new credential info to server for verification and registration.
        }
    }).catch(function (err) {
        // Something went wrong. Handle appropriately.
    });

1.3.3. 認証

これは既に登録済みの資格情報を持つユーザーがウェブサイトを訪れて、その資格情報を使って認証する際のフローです。

  1. ユーザーは example.com を訪問し、スクリプトが配信されます。

  2. そのスクリプトは、可能な限り多くの情報を提供してクライアントに Authentication Assertion を要求し、ユーザーが受け入れ可能な資格情報の選択肢を絞り込みます。これは登録後にローカルに保存されたデータや、ユーザー名の入力のような他の手段から得られます。

  3. Relying Party のスクリプトは以下のいずれかのコードスニペットを実行します。

  4. クライアントプラットフォーム が認証器を検索して検出します。

  5. クライアント が認証器に接続し、必要ならばペアリング操作を行います。

  6. 認証器はユーザーに注意を促す通知を表示します。通知を開くと、認証器は資格情報作成時に提供されたアカウント情報を用いて許容される資格情報のフレンドリな選択メニューを表示し、要求しているオリジンに関するいくつかの情報も示します。

  7. 認証器はユーザーからバイオメトリや他の認可ジェスチャーを取得します。

  8. 認証器はクライアントにレスポンスを返し、それがさらにRelying Party スクリプトにレスポンスを返します。ユーザーが資格情報の選択や認可を拒否した場合は、適切なエラーが返されます。

  9. もしアサーションが正常に生成され返された場合、

    • スクリプトはそのアサーションをサーバーに送信します。

    • サーバーはアサーションを検査し、credential ID を抽出して、データベース内の登録済みの公開鍵を参照し、アサーション署名を検証します。有効であれば、そのアサーションの credential ID に関連付けられた識別情報を検索し、その識別が認証されます。もしサーバーが credential ID を認識しない場合(例:非アクティブのために登録解除されている等)、認証は失敗します。各 Relying Party はこれを独自に扱います。

    • サーバーは成功した認証時に通常行う処理(成功ページの返却、認証クッキーの設定等)を行います。

もし Relying Party スクリプトがローカルに保存されたデータなどのヒントを持っておらず資格情報の候補を絞れない場合、認証を行うためのサンプルコードは次のようになります:

if (!window.PublicKeyCredential) { /* Client not capable. Handle error. */ }

// credentialId is generated by the authenticator and is an opaque random byte array
var credentialId = new Uint8Array([183, 148, 245 /* more random bytes previously generated by the authenticator */]);
var options = {
  // The challenge is produced by the server; see the Security Considerations
  challenge: new Uint8Array([4,101,15 /* 29 more random bytes generated by the server */]),
  timeout: 300000,  // 5 minutes
  allowCredentials: [{ type: "public-key", id: credentialId }]
};

navigator.credentials.get({ "publicKey": options })
    .then(function (assertion) {
    // Send assertion to server for verification
}).catch(function (err) {
    // No acceptable credential or user refused consent. Handle appropriately.
});

一方で、もし Relying Party スクリプトが資格情報の候補を絞り込むためのヒントを持っている場合、次のような認証のサンプルコードも考えられます。これは Credential Properties Extension の使い方も示しています。

if (!window.PublicKeyCredential) { /* Client not capable. Handle error. */ }

var encoder = new TextEncoder();
var acceptableCredential1 = {
    type: "public-key",
    id: encoder.encode("BA44712732CE")
};
var acceptableCredential2 = {
    type: "public-key",
    id: encoder.encode("BG35122345NF")
};

var options = {
  // The challenge is produced by the server; see the Security Considerations
  challenge: new Uint8Array([8,18,33 /* 29 more random bytes generated by the server */]),
  timeout: 300000,  // 5 minutes
  allowCredentials: [acceptableCredential1, acceptableCredential2],
  extensions: { 'credProps': true }
};

navigator.credentials.get({ "publicKey": options })
    .then(function (assertion) {
    // Send assertion to server for verification
}).catch(function (err) {
    // No acceptable credential or user refused consent. Handle appropriately.
});

1.3.4. 認証操作の中止

以下の例は、開発者が AbortSignal パラメータを使って資格情報登録操作を中止する方法を示します。認証操作についても同様の手順が適用されます。

const authAbortController = new AbortController();
const authAbortSignal = authAbortController.signal;

authAbortSignal.onabort = function () {
    // Once the page knows the abort started, inform user it is attempting to abort.
}

var options = {
    // A list of options.
}

navigator.credentials.create({
    publicKey: options,
    signal: authAbortSignal})
    .then(function (attestation) {
        // Register the user.
    }).catch(function (error) {
        if (error.name === "AbortError") {
            // Inform user the credential hasn't been created.
            // Let the server know a key hasn't been created.
        }
    });

// Assume widget shows up whenever authentication occurs.
if (widget == "disappear") {
    authAbortController.abort();
}

1.3.5. 廃止

資格情報を廃止したい状況として以下のようなものが考えられます。これらはすべてサーバー側で処理され、本仕様で定義された API のサポートを必要としないことに注意してください。

1.4. プラットフォーム固有の実装ガイダンス

この仕様は一般的なケースでの Web Authentication の使用方法を定義します。特定のプラットフォームサポート(例:アプリ)と連携して Web Authentication を使用する場合は、追加のガイダンスや制限についてプラットフォーム固有のドキュメントやガイドを参照することを推奨します。

2. 準拠性

この仕様は三つの準拠クラスを定義します。これら各クラスは、クラスに準拠するメンバーが他のクラスの非準拠または敵対的なメンバーに対して安全であるように指定されています。

2.1. ユーザーエージェント

ユーザーエージェントは、準拠と見なされるために § 5 Web Authentication API に記載された通りに振る舞わなければなりません。準拠するユーザーエージェントは、本仕様で示されたアルゴリズムを任意の方法で実装してもよく、最終的な結果が仕様のアルゴリズムによって得られる結果と区別できない限り許容されます。

準拠するユーザーエージェントはまた、本仕様の IDL フラグメントの準拠実装でなければなりません。「Web IDL」仕様に記載されている通りです。[WebIDL]

2.1.1. 列挙型を DOMString として扱う互換性

列挙型は Web IDL の他の部分から参照されないようになっており、これは仕様や実装を更新せずに他の値を使用できなくすることを避けるためです。後方互換性のために、クライアントプラットフォームRelying Partiesは未知の値を扱うことが重要です。本仕様の列挙型は文書化および登録のために存在します。列挙型が他所で表現される場合、それらは DOMString 型として表されます。例えば transports のように。

2.2. 認証器

WebAuthn Authenticatorは、§ 6 WebAuthn Authenticator Model によって定義された操作を提供し、それらの操作は同節に記述された通りに振る舞わなければなりません。これは、認証器が 準拠するユーザーエージェント によって使用可能であるための一連の機能的およびセキュリティ要件です。

前述の § 1.2 ユースケース に記載されているように、認証器はユーザーエージェントの基盤となるオペレーティングシステム内に実装される場合、外部ハードウェアに実装される場合、またはその両方の組み合わせで実装される場合があります。

2.2.1. FIDO U2F との下位互換性

認証器のうち、§ 8.6 FIDO U2F アテステーションステートメント形式 のみをサポートするものはユーザーハンドルを格納する仕組みがないため、返される userHandle は常に null になります。

2.3. WebAuthn Relying Parties

WebAuthn Relying Partyは、§ 7 WebAuthn Relying Party Operations に記載された通りに振る舞わなければ、この仕様が提供するすべてのセキュリティ上の利点を得ることはできません。詳細は § 13.4.1 WebAuthn Relying Parties のためのセキュリティ上の利点 を参照してください。

2.4. すべての準拠クラス

上記の準拠クラスのメンバーによって行われるすべての CBOR エンコーディングは、CTAP2 正準 CBOR エンコーディング形式 を用いて行われなければなりません。上記準拠クラスのすべてのデコーダは、CTAP2 正準 CBOR エンコーディング形式 で有効にエンコードされていない CBOR を拒否すべきであり、重複するマップキーを持つメッセージを拒否するべきです。

3. 依存関係

この仕様は、以下および 参照で定義された用語 に一覧される、いくつかの他の基礎的な仕様に依存しています。

Base64url エンコーディング

Base64url Encoding という用語は、[RFC4648] のセクション 5 で定義された、URL およびファイル名に安全な文字セットを用いる base64 エンコーディングを指し、末尾の '=' 文字はすべて省略され(セクション 3.2 により許可される)、改行や空白その他の追加文字を含まないものとします。

CBOR

本仕様のいくつかの構造(アテステーションステートメントや拡張を含む)は、Compact Binary Object Representation(CBOR)の CTAP2 正準 CBOR エンコーディング形式 を使用してエンコードされます(詳しくは [RFC8949] および [FIDO-CTAP] を参照してください)。

CDDL

本仕様は、CBOR エンコードされたすべてのデータの構文を CBOR Data Definition Language(CDDL)を使用して記述しています。参照: [RFC8610]

COSE

CBOR Object Signing and Encryption (COSE) に関する仕様([RFC9052]、および [RFC9053])。また、IANA の COSE Algorithms 登録([IANA-COSE-ALGS-REG])も使用します。これは元々 [RFC8152] によって確立され、その後これらの仕様で更新されています。

Credential Management

本書で記述されている API は、[CREDENTIAL-MANAGEMENT-1] で定義された Credential 概念の拡張です。

DOM

DOMException および本仕様で使用される DOMException の値は [DOM4] で定義されています。

ECMAScript

%ArrayBuffer%[ECMAScript] で定義されています。

URL

domainhostportschemevalid domain および valid domain string の概念は [URL] に定義されています。

Web IDL

本仕様の多くのインターフェイス定義およびすべての IDL は [WebIDL] に依存しています。この更新版 Web IDL 標準は Promise をサポートしており、これはすべての新しい Web API における非同期相互作用の推奨メカニズムです。

FIDO AppID

呼び出しアプリケーションの FacetID を決定するアルゴリズム および 呼び出し元の FacetID が AppID に対して許可されているかを決定するアルゴリズム(これは AppID 拡張 でのみ使用されます)は [FIDO-APPID] によって定義されています。

本文書中のキーワード "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", および "OPTIONAL" は、BCP 14 の記述に従って解釈されます(該当部分はすべて大文字で示されている場合に限る)。参照: [RFC2119] および [RFC8174]

4. 用語

アテステーション

一般に、attestation(アテステーション) は証明、確認、認証を行う発言を指します。WebAuthn の文脈では、アテステーション認証器 の起源およびそれが出力するデータに関する検証可能な証拠を提供するために用いられます。これには credential IDcredential key pairsignature counter 等が含まれます。

アテステーションステートメント は、アテステーションオブジェクト 内で 登録 の儀式中に提供されます。詳しくは § 6.5 アテステーション および 図6 を参照してください。クライアントがどのようにしてアテステーションステートメントaaguid 部分を Relying Party に伝えるかは、アテステーション伝達 によって記述されます。

アテステーション証明書

認証器が製造元や機能を証明するために使用するアテステーション鍵ペア用のX.509証明書です。登録時、認証器アテステーション秘密鍵を用いて、Relying Party専用の認証情報公開鍵(および追加データ)に署名し、それをauthenticatorMakeCredential操作を通じて生成・返却します。Relying Partyは、アテステーション証明書で渡されるアテステーション公開鍵を使い、アテステーション署名を検証します。自己アテステーションの場合は、認証器は個別のアテステーション鍵ペアアテステーション証明書を持ちません。詳細は自己アテステーションを参照してください。

認証
認証儀式

ユーザーと、そのユーザーの クライアントプラットフォーム(少なくとも一つの 認証器 を含む、または接続しているもの) が協調して、以前に登録された public key credentialcredential private key を制御していることを暗号学的に Relying Party に証明する 儀式 です(ユーザー存在テストユーザー検証 を含みます)。

WebAuthn の 認証儀式§ 7.2 認証アサーションの検証 で定義され、Relying Partynavigator.credentials.get() 操作を publicKey 引数で起動することで開始されます。導入の概観は § 5 Web Authentication API を、実装例は § 1.3.3 認証 を参照してください。

認証アサーション
アサーション

AuthenticatorAssertionResponse オブジェクトは、認証器authenticatorGetAssertion 操作の結果として返す、暗号学的に署名されたオブジェクトです。

これは [CREDENTIAL-MANAGEMENT-1] 仕様の単回使用の credential に対応します。

認証器
WebAuthn 認証器

ハードウェアまたはソフトウェア内に存在する暗号的実体で、ある Relying Party に対してユーザーを 登録 し、その後に登録された public key credential の所持を 証明 し、オプションで ユーザーを検証 することができます。認証器 は、登録やアサーションの際に アテステーション を通じて、その種類やセキュリティ特性に関する情報を報告できます。

WebAuthn Authenticator は、ローミング認証器、クライアントデバイスに統合された専用ハードウェアサブシステム、あるいはクライアントやクライアントデバイスのソフトウェアコンポーネントであり得ます。WebAuthn Authenticator はローカル環境に限らず、クライアント側ハードウェア外のサーバー上で credential key pair を生成・保存することもできます。

一般に、認証器 は単一のユーザーしか持たないと想定されます。複数の自然人が同じ認証器へアクセスを共有する場合、それらはその認証器の文脈において同一ユーザーを表すものと見なされます。もし認証器実装が分離されたコンパートメントで複数ユーザーをサポートするなら、各コンパートメントはそれぞれ別個の 認証器 とみなされ、他のユーザーの 資格情報 へアクセスできないものとします。

認可ジェスチャー

認可ジェスチャー は、登録や認証などの 儀式 の一部としてユーザーが認証器に対して行う物理的な操作で、ユーザーがその 儀式 を承認(つまり許可)したことを示します。これは、認証器が対応可能であれば ユーザー検証 を伴う場合もあれば、単純な ユーザー存在テスト にとどまる場合もあります。

バックアップ済み

公開鍵認証情報ソースは、何らかの方法でバックアップされることがあり、その場合、元の生成元認証器以外の認証器にも存在する可能性があります。バックアップは、ピアツーピア同期、クラウド同期、ローカルネットワーク同期、手動によるインポート/エクスポートなど、さまざまな仕組みで行われる場合があります。詳細は§ 6.1.3 認証情報のバックアップ状態も参照してください。

バックアップ適格性
バックアップ適格

公開鍵認証情報ソース生成元認証器は、作成時にその公開鍵認証情報ソースバックアップ可能かどうかを決定します。バックアップ適格性は、認証器データフラグで、現在のバックアップ状態とあわせて示されます。 バックアップ適格性は認証情報プロパティであり、特定の公開鍵認証情報ソースに対して恒久的です。 バックアップ適格な公開鍵認証情報ソース複数デバイス認証情報と呼ばれ、バックアップ適格でないものは単一デバイス認証情報と呼ばれます。詳細は§ 6.1.3 認証情報のバックアップ状態も参照してください。

バックアップ状態

現在の複数デバイス認証情報のバックアップ状態は、現在の管理認証器によって決定されます。 バックアップ状態は認証器データフラグで示され、時間とともに変化する場合があります。バックアップ適格性§ 6.1.3 認証情報のバックアップ状態も参照してください。

生体認証器

認証器 のうち、生体認証 を実装しているものを指します。

生体認証

生物学的および行動的特徴に基づいて個人を自動的に認識することを指します。参照: [ISOBiometricVocabulary]

バウンド資格情報
"Authenticator contains a credential"
"Credential created on an authenticator"

public key credential source または public key credential が、その 管理認証器バインド(bound) されていると言われます。これは、当該 管理認証器 のみが、その public key credential source に対して アサーション を生成できることを意味します。

これはまた、「管理認証器contains している バウンド資格情報」や、「バウンド資格情報 がその 管理認証器 上で 作成された」と表現され得ます。ただし、サーバー側資格情報 は認証器内の永続メモリに物理的に保存されていない場合があるため、「バインドされた(bound to)」が主要な用語となります。参照: § 6.2.2 Credential Storage Modality

儀式

儀式 の概念は、人的ノードを含むネットワークプロトコルの概念を拡張したもので、ユーザーインターフェース、人間間通信、データを運ぶ物理的オブジェクトの移転などを含む通信リンクを持ちます。プロトコルにとってアウト・オブ・バンドであるものが、儀式にとってはイン・バンドであることがあります。本仕様では、登録認証 は儀式であり、認可ジェスチャー はしばしばその構成要素です。

クライアント
WebAuthn クライアント

ここでは単に クライアント と呼ぶこともあります。参照: Conforming User AgentWebAuthn Client は通常ユーザーエージェント内(全部または一部)に実装される仲介的エンティティで、概念的には Web Authentication API を支え、[[Create]](origin, options, sameOriginWithAncestors) および [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) といった内部メソッドの実装を具現化します。これは、基礎となる 認証器操作 の入力をマーシャリングし、その結果を Web Authentication API の呼び出し元に返す責任を負います。

WebAuthn Client は、WebAuthn Client Device 上で動作し、これとは区別されます。

クライアント デバイス
WebAuthn クライアントデバイス

WebAuthn Client が動作するハードウェアデバイス、例えばスマートフォン、ラップトップ、デスクトップコンピュータ、およびそのデバイス上で動作するオペレーティングシステムを指します。

WebAuthn Client deviceclient の区別は次のとおりです:

一つの client device と一つの client が合わさって client platform を構成します。

クライアント プラットフォーム

client deviceclient が組み合わさって client platform を構成します。単一のハードウェアデバイスは異なる時点で異なるオペレーティングシステムや clients を実行することで、複数の異なる client platforms に属することができます。

クライアント側

一般に、ユーザーの client platform認証器、およびそれらを結びつけるすべての要素の組合せを指します。

クライアント側で発見可能な Public Key Credential Source
クライアント側で発見可能な資格情報
発見可能な資格情報
パスキー
[DEPRECATED] Resident Credential(非推奨)
[DEPRECATED] Resident Key(非推奨)

注:歴史的に、クライアント側で発見可能な資格情報resident credentialsresident keys として知られていました。互換性のため、ResidentKeyresidentKey といった語句は WebAuthn API や Authenticator Model の辞書メンバ名、アルゴリズム変数名、操作パラメータなどで広く使われているため、これらの名前は変更されていません。また、resident key はここでは クライアント側で発見可能な資格情報 と同義で定義されています。

Client-side discoverable Public Key Credential Source(略して Discoverable Credential)は、public key credential source であり、発見可能 であり、認証儀式 において Relying Partycredential ID を提供しない場合(すなわち emptyallowCredentials 引数で navigator.credentials.get() を呼び出す場合)に使用できることを意味します。これにより、Relying Party は事前にユーザーを特定する必要がないことがあります。

その結果、discoverable credential capable認証器 は、RP ID のみを与えられても discoverable credential のための アサーション署名 を生成できます。これは当該 public key credential source が認証器またはクライアントプラットフォームに保存されている必要があることを意味します。これは、Relying Party が必要な状態を保存することで認証器をほぼステートレスにできる、サーバー側の public key credential source(Server-side Public Key Credential Source)と対照的です。

参照: client-side credential storage modality および non-discoverable credential

注: Client-side discoverable credentials は、credential ID が与えられる認証儀式(すなわち navigator.credentials.get() を非 emptyallowCredentials 引数で呼ぶ場合にも使用可能です。

準拠するユーザーエージェント

ユーザーエージェントが基盤となる client device と協力して、本仕様で示された Web Authentication API とアルゴリズムを実装し、認証器Relying Parties 間の通信を扱うものを指します。

Credential ID

確率論的に一意な バイト列 で、public key credential source およびその authentication assertions を識別します。長さは最大 1023 バイトです。

Credential ID は認証器によって二つの形式で生成されます:

  1. 少なくとも 16 バイトで、少なくとも 100 ビットのエントロピーを含むもの、または

  2. 公開鍵認証情報ソースから、 認証情報IDおよび 可変項目を除いたものを、 その管理認証器だけが 復号できるように暗号化したもの。この形式を使うことで、Relying Party が必要な状態を保存することで、認証器をほぼステートレスにできます。

    注: [FIDO-UAF-AUTHNR-CMDS] は「Security Guidelines」内で暗号化技術に関するガイダンスを含んでいます。

Relying Parties は、これら二つの Credential ID 形式を区別する必要はありません。

Credential Key Pair
Credential Private Key
Credential Public Key
ユーザー公開鍵

credential key pair は、認証器によって生成され、特定の WebAuthn Relying Partyスコープ された非対称暗号鍵の対です。これは public key credential の中心要素です。

credential public key は、credential key pair の公開鍵部分です。credential public key登録儀式 中に Relying Party に返されます。

credential private key は credential key pair の秘密鍵部分です。credential private key は特定の 認証器(その 管理認証器)にバインドされ、認証器の所有者を含むどの当事者にも、さらには認証器自体にも公開されないことが期待されます。

自己アテステーションの場合、credential key pairアテステーション鍵対 としても使用される点に注意してください。詳細は 自己アテステーション を参照してください。

注: credential public key は FIDO UAF の文脈や FIDO U2F の一部で user public key と呼ばれることがあります(参照: [UAFProtocol]、および [FIDO-U2F-Message-Formats])。

資格情報プロパティ

credential property は、public key credential source の特性(たとえばクライアント側で発見可能かどうか、あるいはサーバー側資格情報かどうか)などの性質を指します。

資格情報レコード

§ 7 WebAuthn Relying Party Operations に定義されたアルゴリズムを実装するために、Relying Party は登録された public key credential source の一部のプロパティを保存する必要があります。credential record はそのようなプロパティの抽象化された struct です。credential record は登録儀式の際に作成され、その後の認証儀式で使用されます。Relying Parties は必要に応じて、またはユーザーから要求があった場合に credential records を削除することができます。

§ 7.1 と § 7.2 のすべての手順を実装するために推奨される items は次のとおりです:

type

credential record の type を示します。

id

credential record の Credential ID を示します。

publicKey

credential record の credential public key を示します。

signCount

その credential source を用いた任意の儀式からの authenticator data の署名カウンタ の最新値を示します。

transports

credential source が登録されたときに getTransports() から返された値を示します。

注: getTransports() から返される値から items を変更または削除すると、ユーザー体験に悪影響を及ぼしたり、該当資格情報の使用を妨げる可能性があります。

uvInitialized

この真偽値は、この認証情報ソース由来のいずれかの公開鍵認証情報ソースUV フラグ がセットされたことがあるかどうかを示します。

この値がtrueの場合、Relying PartyUV フラグ認証要素 として認証セレモニーで考慮してもよいです。 例:Relying PartyuvInitializedtrueかつ UV フラグがセットされている場合、 パスワードプロンプトを省略することができます。たとえユーザー検証が求められていなかった場合でも同様です。

この値がfalseの場合(認証セレモニーtrueに更新される場合も含む)、 UV フラグ認証要素として依拠することはできません。 なぜなら、公開鍵認証情報ソースが初めて UV フラグを1に設定した段階では、 Relying Party認証器ユーザー検証との間に 信頼関係がまだ確立していないためです。 したがって、uvInitializedfalseからtrueに更新する場合は、 WebAuthnのユーザー検証に相当する追加の認証要素による認可が必要となります。

backupEligible

public key credential source が作成された時の BE フラグ の値を示します。

backupState

その public key credential source を用いた任意の儀式からの BS フラグ の最新値を、authenticator data から示します。

次に示す items は任意です:

attestationObject

public key credential source が 登録 されたときの attestationObject 属性の値。これを保存しておくと、Relying Party は後でその資格情報の アテステーションステートメント を参照できます。

attestationClientDataJSON

public key credential source が 登録 されたときの clientDataJSON 属性の値。これを上記の attestationObject と組み合わせて保存することで、Relying Party は後で アテステーション署名 を再検証することができます。

rpId

rp.id パラメータは、資格情報登録時に create() 操作で指定されます。 この値は資格情報の中核的なプロパティであり、使用可能な場所を決定します。 登録時にこの値を保存しておくことで、将来的にその使用状況の監査や認証トラブルシュート、関連オリジンを利用して異なるドメイン間で使用する場合などに役立ちます。

WebAuthn 拡張 は、拡張を処理するのに必要な追加の items を定義してよいです。Relying Parties も必要に応じて任意の追加の items を含めることができ、実装に不要な items を省略してもかまいません。

credential record のための資格情報ディスクリプタ は、次の内容を持つ PublicKeyCredentialDescriptor 値です:

type

credential record の type

id

credential record の id

transports

credential record の transports

生成認証器

生成認証器は、ある authenticatorMakeCredential 操作に関与し、結果として特定の public key credential source を生成する認証器です。生成認証器は、single-device credentials に対しては当該 管理認証器 と同一です。multi-device credentials の場合、生成認証器が当該認証を行う特定の認証器と同一であるとは限りません。

人間にとって扱いやすい識別子

人間にとって記憶しやすく再現しやすい識別子を human-palatable と呼びます。これは、例えばランダムに生成されたビット列のような識別子とは対照的です。参照: [EduPersonObjectClassSpec]

非発見可能な資格情報

これは、allowCredentials において、navigator.credentials.get() を呼び出す際に credential ID を提供する必要がある credential です。これは サーバー側資格情報 とも関連します。

登録可能オリジンラベル

ドメインの登録可能ドメインの最初の domain label、あるいは登録可能ドメインが null の場合は null を示します。たとえば、example.co.ukwww.example.de の両方の registrable origin label は、co.ukde がそれぞれ public suffix の場合に example です。

公開鍵資格情報

一般的に、credential(クレデンシャル/認証情報)とは、ある主体が他の主体に対して自身をauthenticate(認証)するために提示するデータを指します [RFC4949]公開鍵認証情報(public key credential)という用語は、次のいずれかを意味します:公開鍵認証情報ソースアテステーション済みの場合もある認証情報公開鍵(公開鍵認証情報ソースに対応)、または認証アサーション。どれを指すかは文脈によって定まります。

注記: これは意図的な規格逸脱です [RFC4949]。英語において "credential" は、a) 証明のために提示するもの、b) 複数回使用されることを意図したもの、の両方の意味を持ちます。しかしパブリックキー方式では両方を同時に安全に実装することはできません。[RFC4949]は「複数回使用できるもの(公開鍵)」をcredentialと定義しますが、本仕様は"credential"の英語本来の柔軟性を採用しています。本仕様では[RFC4949]のcredentialに関連するデータを区別するために、より具体的な用語を使います:
「認証情報(Authentication information)」 (秘密鍵を含む場合あり)

公開鍵認証情報ソース

「署名値(Signed value)」

認証アサーション

[RFC4949] の "credential"

認証情報公開鍵 または アテステーションオブジェクト

登録時には、認証器が非対称鍵ペアを生成し、その秘密鍵部分Relying Partyからの情報を公開鍵認証情報ソースに保存します。公開鍵部分Relying Partyに返され、アクティブなユーザーアカウントに保存されます。 以降、RP IDで識別されるそのRelying Partyのみが、 get() メソッドを通して認証セレモニー公開鍵認証情報を利用できます。 Relying Partyは保存しておいた 認証情報公開鍵で、得られた認証アサーションを検証します。

Public Key Credential Source

credential source[CREDENTIAL-MANAGEMENT-1])で、認証器 が認証アサーションを生成するために使用するものです。public key credential source は次の struct を持ち、以下の items を含みます:

type

その値は PublicKeyCredentialType であり、デフォルトは public-key です。

id

Credential ID

privateKey

credential private key

rpId

当該 public key credential source がスコープされる Relying Party Identifier。これは create() 操作の rp.id パラメータによって決定されます。

userHandle

この public key credential source が作成されたときに関連付けられた user handle。この項目は nullable ですが、discoverable credentials の場合は常に user handle が設定されていなければなりません。

otherUI

認証器が UI に情報を表示するために使用する任意の追加情報(例: ユーザーの displayName)を含む可能性があります。otherUImutable item とされ、更新可能であるように public key credential source に結び付けるべきではありません。

authenticatorMakeCredential操作は、公開鍵クレデンシャルソースを作成し、それを管理認証器バインドします。そして、そのクレデンシャル秘密鍵に対応するクレデンシャル公開鍵を返します。Relying Partyは、このクレデンシャル公開鍵を用いて、この公開鍵クレデンシャルソースによって作成された認証アサーションを検証できます。

レート制限

ブルートフォース攻撃に対抗するために、認証器が連続した失敗した認証試行の回数を一定期間内に制限することで制御を実装するプロセス(スロットリングとも呼ばれる)。制限に達した場合、認証器は各試行に対して指数的に増加する遅延を課すか、現在の認証モダリティを無効にして利用可能な別の 認証要素 を提供すべきです。レート制限はしばしば ユーザー検証 の側面として実装されます。

登録
登録儀式

ユーザー、Relying Party、および client platform が協調して public key credential を作成し、ユーザーアカウント に関連付ける 儀式 です。これには ユーザー存在テストユーザー検証 が含まれます。登録儀式が成功した後、ユーザーは認証儀式によって認証され得ます。

WebAuthn の 登録儀式§ 7.1 新しい資格情報の登録 で定義され、Relying Partynavigator.credentials.create()publicKey 引数で呼び出すことにより開始されます。導入は § 5 Web Authentication API、実装例は § 1.3.1 Registration を参照してください。

Relying Party
WebAuthn Relying Party

web application を用いてユーザーを Web Authentication API登録 し、認証 する主体を指します。

Relying Party 実装は通常、クライアント側スクリプト(Web Authentication APIclient 内で呼び出すもの)と、サーバー側コンポーネント(Relying Party 操作 やその他のアプリケーションロジックを実行するもの)で構成されます。両者間の通信は HTTPS または同等のトランスポートセキュリティを使用しなければなりませんが、それ以外は本仕様の範囲外です。

注:他の文脈(例: X.509 や OAuth)でも Relying Party という用語が使われますが、ある文脈で Relying Party として振る舞う主体が別の文脈でも同様に Relying Party であるとは限りません。本仕様では WebAuthn Relying Party が単に Relying Party と略されることがあり、これは WebAuthn の文脈における Relying Party を指します。実際の具象化では、WebAuthn の文脈は OAuth に基づくより広い文脈に埋め込まれる場合があります。

Relying Party 識別子
RP ID

WebAuthn API の文脈において、リライングパーティ識別子とは、特定の有効なドメイン文字列であり、特定のWebAuthnリライングパーティを識別します。このリライングパーティの名義で、登録認証式が実行されます。公開鍵クレデンシャルは、登録時と同じ(RP IDによって識別される)実体とのみ認証に使用できます。

デフォルトでは、WebAuthn操作のRP IDは呼び出し元のオリジン有効ドメインに設定されます。このデフォルトは、呼び出し元が指定したRP ID値が、呼び出し元のオリジン有効ドメイン登録可能ドメインサフィックスまたは等価である限り、上書きが可能です。§ 5.1.3 新しいクレデンシャルの作成 - PublicKeyCredentialの[[Create]](origin, options, sameOriginWithAncestors) 内部メソッドや、§ 5.1.4 既存のクレデンシャルでアサーションを行うも参照してください。

RP IDホストドメイン名に基づきます。それ自体はスキームポートを含みません(オリジンが含むのとは異なります)。 RP ID公開鍵クレデンシャルスコープを決定します。 すなわち、その公開鍵クレデンシャルが使用できるオリジンの集合を決定します。その条件は次の通りです:

たとえば、リライングパーティのオリジンがhttps://login.example.com:1337の場合、有効なRP IDlogin.example.com(デフォルト)やexample.comですが、m.login.example.comcomは無効です。もう一つの有効なオリジンの例としてhttp://localhost:8000があります。これはオリジンがlocalhostであるためです。

これは、広く普及しているアンビエントクレデンシャル(例:Cookie、[RFC6265])の挙動に合わせるために行われています。これはdocument.domainのsetterによる「同一オリジン」制限よりも緩い制約であることに注意してください。

これらのオリジン値に対する制限は、WebAuthnクライアントに適用されます。

WebAuthn 公開鍵クレデンシャルをWeb以外のプラットフォーム(例:ネイティブモバイルアプリ)で有効にするためにWebAuthn APIを模倣する他の仕様では、呼び出し元とリライングパーティ識別子を紐づけるために異なるルールを定めても構いません。ただし、RP IDの構文は有効なドメイン文字列またはURI [RFC3986] [URL]に準拠しなければなりません。

サーバー側 Public Key Credential Source
サーバー側資格情報
[DEPRECATED] Non-Resident Credential(非推奨)

注:歴史的に、server-side credentialsnon-resident credentials として知られていました。互換性のために、WebAuthn API や Authenticator Model のコンポーネント中の resident を含む名称は変更されていません。

Server-side Public Key Credential Source(略して Server-side Credential)は、認証儀式で Relying Party がその credential IDnavigator.credentials.get()allowCredentials 引数として提供する場合にのみ使用できる public key credential source です。これは、Relying Party が当該資格情報の保存と探索を管理し、ユーザーをまず特定できる必要があることを意味します。

クライアント側への public key credential source の保存はサーバー側資格情報には要求されません。これは、クライアント側で発見可能な資格情報とは対照的で、クライアント側で発見可能な資格情報は認証のための credential ID を提供する際にユーザーの先行特定を必ずしも必要としません。

参照: server-side credential storage modality および non-discoverable credential

ユーザー存在テスト

ユーザー存在テスト は、通常は単にタッチするなどにより認証器とユーザーが相互作用するシンプルな 認可ジェスチャー であり、ブール値の結果を生じます。これは ユーザー検証 を構成するものではありません。なぜならユーザー存在テストは生体認証を実行する能力を持たず、パスワードや PIN のような共有秘密の提示を伴わないからです。

ユーザーアカウント

本仕様の文脈では、user account は、(部分)集合の credentials を Relying Party のリソースにマッピングすることを示し、これは Relying Party によって維持および認可されます。Relying Party は、public key credential をユーザーアカウントにマップするために、その credential の user handle にユーザーアカウント特有の値を割り当て、credential のための credential record をユーザーアカウントに保存します。マッピングや資格情報の集合、およびそれらの許可は時間とともに変化し得ます。ある user account が一人以上の自然人(ユーザー)によってアクセスされ得ることもあり、逆に一人の自然人が一つ以上の user account にアクセスすることもあり得ます。

ユーザー同意

ユーザー同意とは、ユーザーが求められていることに同意することであり、表示されるプロンプトを読み理解することを包含します。認可ジェスチャー は、しばしば 儀式 の構成要素としてユーザー同意を示すために用いられます。

ユーザーハンドル

ユーザーハンドルは、user account の識別子で、Relying Party が登録時に user.id として指定するものです。Discoverable credentials はこの識別子を格納し、認証儀式で userHandle として返すことが必須です(empty な allowCredentials 引数で呼び出された認証儀式の場合)。

user handle の主な用途は、認証儀式においてユーザーアカウントを識別することですが、代わりに credential ID を使用することもできます。主な違いは、credential ID が認証器によって選ばれ各資格情報ごとに一意である一方で、user handle は Relying Party によって選ばれ、同一のユーザーアカウントに登録されたすべての資格情報で同じであるべきという点です。

認証器 は RP ID と user handle の組を public key credential sources にマップします。その結果、認証器は各 RP ごとに各 user handle に対して高々一つの discoverable credential を保存します。したがって、user handle の二次的な用途は、登録儀式の際に既存の discoverable credential を新しいもので置き換えるかどうかを認証器が判断するのに用いることです。

ユーザーハンドルは最大 64 バイトの不透明なバイト列であり、ユーザーに表示されることを意図しません。また、個人を特定し得る情報を含んではいけません。詳しくは § 14.6.1 User Handle Contents を参照してください。

ユーザーが存在する

ユーザー存在テストが正常に完了したとき、ユーザーは "present" と見なされます。

ユーザー検証

認証器 がローカルで authenticatorMakeCredential および authenticatorGetAssertion 操作の呼び出しを許可する技術的プロセスを指します。ユーザー検証は様々な認可ジェスチャーモダリティ(例えばタッチ+ PIN、パスワード入力、あるいは生体認証)を通じて行われることがあります。目的は個々のユーザーを識別することです。詳細は § 6.2.3 を参照してください。

注意: ユーザー検証は Relying Party に対して具体的なユーザーの識別を与えるものではありませんが、同じ資格情報で 2 回以上のユーザー検証が行われた場合、それが同一のユーザーによって実行されたことを示すものです。ただし、複数の自然人が同じ認証器へのアクセスを共有する場合、同一の自然人であるとは限りません。

注: 自然人を区別することはクライアントプラットフォームや認証器の能力に大きく依存します。たとえば、単一ユーザー向けのデバイスでも複数の人物が指紋を登録したり同じ PIN を知っている場合、同じ認証器を用いて同一の user account にアクセスできることがあります。

注: authenticatorMakeCredential および authenticatorGetAssertion の呼び出しは、認証器が管理する鍵材の使用を伴うことを意味します。

セキュリティ上、ユーザー検証credential private keys の使用はすべて認証器を定義する論理的セキュリティ境界内で行われなければなりません。

ユーザー検証 の手順は、ブルートフォース攻撃に対する保護として レート制限 を実装してもよいです。

ユーザーが検証済み

ユーザー検証 が成功裏に完了したとき、ユーザーは "verified" と見なされます。

5. Web Authentication API

この節では、public key credentials を作成および使用するための API を規範的に定義します。基本的な考え方は、資格情報はユーザーに属し、WebAuthn Authenticator によって 管理 され、WebAuthn Relying Partyclient platform を介してやり取りする、というものです。Relying Party のスクリプトは(ユーザーの 同意 があれば)ブラウザに対して将来その Relying Party が使用するための新しい資格情報を作成するよう要求できます。下の を参照してください。

登録フロー

スクリプトは、既存の資格情報を用いて 認証 操作を行うためのユーザーの許可を要求することもできます。下の を参照してください。

認証フロー

これらの操作はすべて認証器内で行われ、ユーザーに代わって client platform によって仲介されます。スクリプトが資格情報自体へアクセスすることは一切なく、資格情報に関する情報はオブジェクトの形でのみ受け取ります。

上記のスクリプトインターフェースに加え、認証器は管理用のユーザーインターフェースを実装する(またはそれを実装するクライアントソフトウェアとともに提供される)ことがあります。そのようなインターフェースは、例えば認証器を初期状態にリセットしたり、認証器の現在の状態を検査したりするために使用され得ます。言い換えれば、そのようなインターフェースはブラウザが履歴、保存されたパスワード、クッキーなどのユーザーステートを管理するために提供するユーザーインターフェースに類似しています。資格情報の削除などの認証器管理操作はそのようなユーザーインターフェースの責任とされ、スクリプトに公開される API からは意図的に省かれています。

この API のセキュリティ特性はクライアントと認証器が協調して提供します。資格情報を保持し 管理 する認証器は、すべての操作が特定の originスコープ され、別の origin に対してリプレイできないように、応答に origin を組み込むことでこれを保証します。具体的には、§ 6.3 Authenticator Operations で定義されているように、要求元の完全な origin が含まれ、それに署名されて、新しい資格情報が作成された際に生成される attestation object および WebAuthn 資格情報によって生成されるすべてのアサーションに含まれます。

さらに、ユーザーのプライバシーを維持し、悪意ある Relying Parties が他の Relying Parties に属する public key credentials の存在を探知するのを防ぐために、各 credentialRelying Party Identifier(いわゆる RP ID)にも スコープ されています。RP ID はクライアントがすべての操作で authenticator に提供し、authenticator はある Relying Party によって作成された credentials が同じ RP ID によって要求された操作でのみ使用できることを保証します。こうして originRP ID から分離することで、単一の Relying Party が複数の origins を保持している場合でも API を使用できるようにします。

クライアントはこれらのセキュリティ対策を促進するために、各操作ごとに Relying PartyoriginRP IDauthenticator に提供します。これは WebAuthn のセキュリティモデルにとって不可欠な部分であるため、ユーザーエージェントはこの API を secure contexts の呼び出し元にのみ公開します。特に Web コンテキストでは、これはエラーなしに確立された安全なトランスポート(例: TLS)経由でアクセスされたものに限られます。

Web Authentication API は、以下の節に示される Web IDL フラグメントの和集合によって定義されます。統合された IDL の一覧は IDL Index に示されています。

5.1. PublicKeyCredential インターフェイス

The PublicKeyCredential interface は Credential [CREDENTIAL-MANAGEMENT-1] を継承し、新しい資格情報が作成されたとき、または新しいアサーションが要求されたときに呼び出し元に返される属性を含みます。

[SecureContext, Exposed=Window]
interface PublicKeyCredential : Credential {
    [SameObject] readonly attribute ArrayBuffer              rawId;
    [SameObject] readonly attribute AuthenticatorResponse    response;
    readonly attribute DOMString?                            authenticatorAttachment;
    AuthenticationExtensionsClientOutputs getClientExtensionResults();
    static Promise<boolean> isConditionalMediationAvailable();
    PublicKeyCredentialJSON toJSON();
};
id

この属性は Credential から継承されますが、PublicKeyCredentialCredential の getter をオーバーライドしており、オブジェクトの内部スロット [[identifier]] に含まれるデータの base64url エンコーディング を返します。

rawId

この属性は、内部スロット [[identifier]] に含まれる ArrayBuffer を返します。

response, of type AuthenticatorResponse, readonly

この属性は、クライアントの要求に対する authenticator の応答を含みます。これは新しい public key credential を作成する要求、または authentication assertion を生成する要求のいずれかに対する応答です。PublicKeyCredentialcreate() に応じて作成された場合、この属性の値は AuthenticatorAttestationResponse になります。そうでない場合、PublicKeyCredentialget() に応じて作成され、この属性の値は AuthenticatorAssertionResponse になります。

authenticatorAttachment, of type DOMString, readonly, nullable

この属性は、navigator.credentials.create() または navigator.credentials.get() が正常に完了した時点で有効であった authenticator attachment modality を報告します。属性の値は AuthenticatorAttachment のメンバーであるべきです。Relying Parties は未知の値を null と扱うべきです。

Note: 登録儀式や認証儀式の結果として authenticatorAttachment の値が "cross-platform" であり、かつ isUserVerifyingPlatformAuthenticatorAvailabletrue を返す場合、ユーザーはその儀式において roaming authenticator を用い、同時に利用可能な platform authenticator が存在することになります。したがって Relying Party はユーザーに利用可能な platform authenticator の登録を促すことができ、よりスムーズなユーザー体験を可能にすることがあります。

認証器の attachment modality は時間の経過とともに変わり得ます。例えば、携帯電話はある時点では platform attachment のみをサポートしていても、後に cross-platform attachment もサポートするようアップデートされる場合があります。

getClientExtensionResults()

この操作は、[[clientExtensionsResults]] の値を返します。これは拡張のクライアント側処理によって生成された map で、拡張識別子 → クライアント拡張出力 のエントリを含みます。

isConditionalMediationAvailable()

PublicKeyCredential は、このメソッドをオーバーライドして、conditional メディエーションが navigator.credentials.get() 実行中に利用可能であることを示します。 WebAuthn Relying Partyは、options.mediationconditional に設定しようとする前に、利用可能か確認すべきです。

このメソッドが呼び出されると、conditional ユーザーメディエーションが利用可能な場合は true を、そうでない場合は false を値として解決される Promise が返されます。

このメソッドには引数がなく、Promise で Boolean 値を返します。

conditionalGet 能力は、この Promise が true で解決されることと同等です。

注: このメソッドが存在しない場合、 conditional ユーザーメディエーションnavigator.credentials.get() で利用できません。

注: このメソッドは、 conditional ユーザーメディエーションnavigator.credentials.create() で 利用可能かどうかを示すものではありません。 それについては conditionalCreate 能力および getClientCapabilities() を参照してください。

toJSON()

この操作は RegistrationResponseJSON または AuthenticationResponseJSON を返します。これらは PublicKeyCredential を反映した JSON 型の表現で、Relying Party サーバーに application/json ペイロードとして送信するのに適しています。クライアントは通常通り JSON 型へのシリアライズを担当しますが、ArrayBuffer 値を先に base64url エンコーディング を用いて DOMString 値に変換する追加の手順を必ず行わなければなりません。

RegistrationResponseJSON.clientExtensionResults または AuthenticationResponseJSON.clientExtensionResults メンバーは getClientExtensionResults() の出力に設定されなければならず、任意の ArrayBuffer 値は base64url エンコーディング を用いて DOMString に変換されなければなりません。これには IANA "WebAuthn Extension Identifiers" 登録にある拡張からの ArrayBuffer 値が含まれる場合がありますが、§ 9 WebAuthn Extensions に定義されていないものは含まれません。

AuthenticatorAttestationResponseJSON.transports メンバーは getTransports() の出力に設定されなければなりません。

AuthenticatorAttestationResponseJSON.publicKey メンバーは getPublicKey() の出力に設定されなければなりません。

AuthenticatorAttestationResponseJSON.publicKeyAlgorithm メンバーは getPublicKeyAlgorithm() の出力に設定されなければなりません。

typedef DOMString Base64URLString;
// The structure of this object will be either
// RegistrationResponseJSON or AuthenticationResponseJSON
typedef object PublicKeyCredentialJSON;

dictionary RegistrationResponseJSON {
    required DOMString id;
    required Base64URLString rawId;
    required AuthenticatorAttestationResponseJSON response;
    DOMString authenticatorAttachment;
    required AuthenticationExtensionsClientOutputsJSON clientExtensionResults;
    required DOMString type;
};

dictionary AuthenticatorAttestationResponseJSON {
    required Base64URLString clientDataJSON;
    required Base64URLString authenticatorData;
    required sequence<DOMString> transports;
    // The publicKey field will be missing if pubKeyCredParams was used to
    // negotiate a public-key algorithm that the user agent doesn't
    // understand. (See section “Easily accessing credential data” for a
    // list of which algorithms user agents must support.) If using such an
    // algorithm then the public key must be parsed directly from
    // attestationObject or authenticatorData.
    Base64URLString publicKey;
    required COSEAlgorithmIdentifier publicKeyAlgorithm;
    // This value contains copies of some of the fields above. See
    // section “Easily accessing credential data”.
    required Base64URLString attestationObject;
};

dictionary AuthenticationResponseJSON {
    required DOMString id;
    required Base64URLString rawId;
    required AuthenticatorAssertionResponseJSON response;
    DOMString authenticatorAttachment;
    required AuthenticationExtensionsClientOutputsJSON clientExtensionResults;
    required DOMString type;
};

dictionary AuthenticatorAssertionResponseJSON {
    required Base64URLString clientDataJSON;
    required Base64URLString authenticatorData;
    required Base64URLString signature;
    Base64URLString userHandle;
};

dictionary AuthenticationExtensionsClientOutputsJSON {
};
[[type]]

PublicKeyCredential インターフェースオブジェクト[[type]] 内部スロット の値は 文字列 "public-key" です。

注: これは type 属性ゲッターによって反映されます。このゲッターは Credential から継承されています。

[[discovery]]

PublicKeyCredential インターフェースオブジェクト[[discovery]] 内部スロット の値は "remote" です。

[[identifier]]

この 内部スロット には、認証器によって選択された 資格情報ID が含まれます。 資格情報ID は 認証情報を使用するための検索に利用されます。そのため、同じ型のすべての認証情報およびすべての認証器全体で高い確率でグローバル一意になることが期待されます。

このAPIはこの識別子の形式を制約しませんが、 1023バイトを超えてはならず、認証器が一意に鍵を選択できる十分な情報でなければなりません。 例えば、オンボードストレージを持たない認証器は、資格情報プライベートキー を 認証器に焼き込まれた対称鍵でラップした識別子を作成することがあります。

[[clientExtensionsResults]]

この 内部スロット には、 Relying Partynavigator.credentials.create() または navigator.credentials.get() を呼び出した際に要求したクライアント拡張の処理結果が含まれます。

PublicKeyCredentialインターフェースオブジェクトCredential の 実装 [[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors) を継承し、 [[Create]](origin, options, sameOriginWithAncestors) [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) [[Store]](credential, sameOriginWithAncestors) をそれぞれ独自実装で定義します。

CredentialsContainerpreventSilentAccess() メソッドを呼び出しても、PublicKeyCredential の 資格情報には影響しません。これらは常にユーザー操作を必要とするためです。

5.1.1. CredentialCreationOptions 辞書拡張

navigator.credentials.create() による登録をサポートするために、 本書は CredentialCreationOptions 辞書を以下の通り拡張します:

partial dictionary CredentialCreationOptions {
    PublicKeyCredentialCreationOptions      publicKey;
};

5.1.2. CredentialRequestOptions 辞書拡張

navigator.credentials.get() によるアサーション取得をサポートするために、 本書は CredentialRequestOptions 辞書を次のように拡張します:

partial dictionary CredentialRequestOptions {
    PublicKeyCredentialRequestOptions      publicKey;
};

5.1.3. 新しい資格情報の作成 - PublicKeyCredential の [[Create]](origin, options, sameOriginWithAncestors) 内部メソッド

PublicKeyCredentialインターフェースオブジェクトの実装である [[Create]](origin, options, sameOriginWithAncestors) 内部メソッドは、 [CREDENTIAL-MANAGEMENT-1] に従い、 WebAuthn Relying Party スクリプトが navigator.credentials.create() を呼び出して、新しい 公開鍵認証情報ソースを作成するよう要求し、 それを 認証器にバインドすることを可能にします。

options.mediationconditional に設定することで、 Relying Parties は、ユーザーが既に認証情報の作成に同意している場合に、目立つモーダルUIを表示せずに認証情報を登録したいことを示すことができます。 Relying Party はまず getClientCapabilities() を使って、クライアントconditionalCreate 機能をサポートしているかを確認すべきです。これは、この機能が利用できない場合にユーザーに見えるエラーを防ぐためです。 クライアントは、式典(ceremony)中に明示的に実行される可能性がある場合を除き、requireUserPresencerequireUserVerification の両方を FALSE に設定しなければなりません、これは options.mediationconditional に設定されているときの要件です。

任意の navigator.credentials.create() 操作は、AbortController を利用して中止できます; 詳細な手順については DOM § 3.3 Using AbortController and AbortSignal objects in APIs を参照してください。

この 内部メソッド は三つの引数を受け取ります:

origin

この引数は、呼び出し元の 関連設定オブジェクトオリジン であり、create() 実装によって決定されます。

options

この引数は CredentialCreationOptions オブジェクトで、その options.publicKey メンバーが、作成されるべき PublicKeyCredentialCreationOptions オブジェクトを含んでおり、作成対象の 公開鍵認証情報 の望ましい属性を指定します。

sameOriginWithAncestors

この引数はブール値であり、呼び出し元の environment settings objectその祖先と same-origin である 場合に限り true になります。呼び出し元がクロスオリジンの場合は false です。

Note: この 内部メソッド の呼び出しは、permissions policy によって許可されたことを示しており、これは [CREDENTIAL-MANAGEMENT-1] レベルで評価されます。 詳細は § 5.9 Permissions Policy integration を参照してください。

Note: このアルゴリズムは同期的です: Promise の解決/拒否は navigator.credentials.create() 側で扱われます。

このアルゴリズムで使用されるすべての BufferSource オブジェクトは、アルゴリズム開始時にスナップショットされなければなりません。これは同期の問題を避けるためです。実装は バッファソースが保持するバイトのコピーを取得 して、そのコピーをアルゴリズムの該当部分で使用することを推奨します。

このメソッドが呼び出されると、ユーザーエージェントは次のアルゴリズムを実行しなければなりません:

  1. 断言: options.publicKey が存在すること。

  2. もし sameOriginWithAncestorsfalse の場合:

    1. もし options.mediation が存在し、その値が conditional の場合:

      1. "NotAllowedError" をスローする DOMException

    2. もし呼び出し側の relevant global object(create() 実装により決定される)が transient activation を持っていない場合:

      1. "NotAllowedError" をスローする DOMException.

    3. Consume user activation を呼び出し元の relevant global object 上で実行します。

    4. もし認証情報を作成している origin が、該当する top-level origin(ユーザーがアドレスバーで見ているオリジン)と異なる場合、 クライアント はその事実をユーザーに明示するべきです。

  3. pkOptionsoptions.publicKey の値とします。

  4. もし pkOptions.timeout が存在するなら、その値が クライアント によって定義された妥当な範囲内にあるか確認し、そうでなければその範囲内に最も近い値に補正します。タイマー lifetimeTimer をこの補正された値に設定します。もし pkOptions.timeout が存在しない場合、lifetimeTimer をクライアント固有のデフォルトに設定します。

    WebAuthn 式典タイムアウトの推奨範囲とデフォルトについては recommended range and default for a WebAuthn ceremony timeout を参照してください。

    クライアント は、特別なニーズを持つユーザーに配慮してタイムアウトに関する認知的ガイドラインを考慮すべきです。

  5. もし pkOptions.user.id の長さが 1〜64 バイト(両端含む)の範囲にない場合は TypeError をスローします。

  6. callerOriginorigin とします。もし callerOriginopaque origin であれば、"NotAllowedError" をスローします。

  7. effectiveDomaincallerOrigineffective domain とします。もし effective domain有効なドメイン でなければ、"SecurityError" をスローします。

    Note: effective domainhost に解決され、domain、ipv4 アドレス、ipv6 アドレス、opaque host、empty host など様々な表現を取ることがあります。 ここで許容されるのは domain 形式 のみです。これは単純化のためと、PKI ベースのセキュリティと直接 IP アドレス識別を組み合わせる際の諸問題を考慮したものです。

  8. もし pkOptions.rp.id

    存在する場合

    もし pkOptions.rp.ideffectiveDomain の registrable domain のサフィックスでも等しくもない場合、そしてクライアントが

    related origin requests をサポートする場合
    1. rpIdRequestedpkOptions.rp.id の値とします。

    2. related origins validation procedurecallerOriginrpIdRequested を引数として実行します。結果が false なら、"SecurityError" をスローします。

    related origin requests をサポートしない場合

    "SecurityError" をスローします。

    存在しない場合

    pkOptions.rp.ideffectiveDomain に設定します。

    Note: pkOptions.rp.id は呼び出し元の RP ID を表します。RP ID は、呼び出し元の origineffective domain にデフォルトされます。ただし、呼び出し側が明示的に pkOptions.rp.id を設定している場合はその値が使用されます。

  9. credTypesAndPubKeyAlgs を、新しい リスト とし、その 項目PublicKeyCredentialTypeCOSEAlgorithmIdentifier のペアであるようにします。

  10. もし pkOptions.pubKeyCredParamsサイズ

    ゼロである場合

    以下の PublicKeyCredentialTypeCOSEAlgorithmIdentifier のペアを credTypesAndPubKeyAlgs に追加します:

    非ゼロである場合

    currentpkOptions.pubKeyCredParams から取り出して処理します:

    1. もし current.type がこの実装でサポートされていない PublicKeyCredentialType を含んでいる場合、continue します。

    2. algcurrent.alg とします。

    3. ペアcurrent.typealg)を credTypesAndPubKeyAlgs に追加します。

    もし credTypesAndPubKeyAlgs であれば、"NotSupportedError" をスローします。

  11. clientExtensions を新しい map とし、authenticatorExtensions を新しい map とします。

  12. もし pkOptions.extensions が存在するなら、 extensionIdclientExtensionInput の組に対して次を行います(pkOptions.extensions に含まれる):
    1. もし extensionId がこの クライアントプラットフォーム によってサポートされていないか、あるいは registration extension でない場合、continue します。

    2. Set clientExtensions[extensionId] を clientExtensionInput に設定します。

    3. もし extensionIdauthenticator extension でない場合、continue します。

    4. authenticatorExtensionInput を、extensionIdclient extension processing アルゴリズムを clientExtensionInput に対して実行した結果(CBOR)とします。もしアルゴリズムがエラーを返した場合、continue します。

    5. Set authenticatorExtensions[extensionId] を base64url エンコーディング した authenticatorExtensionInput に設定します。

  13. collectedClientData を新しい CollectedClientData インスタンスとし、そのフィールドを次のようにします:

    type

    文字列 "webauthn.create".

    challenge

    pkOptions.challengebase64url エンコーディング

    origin

    callerOriginシリアライズ

    crossOrigin

    この内部メソッドに渡された sameOriginWithAncestors 引数の値の逆数(inverse)。

    topOrigin

    もしこの内部メソッドに渡された sameOriginWithAncestors 引数が false であれば、callerOrigintop-level origin のシリアライズ、さもなければ undefined

  14. clientDataJSON を、collectedClientData から構築した JSON 互換のクライアントデータのシリアライズ とします。

  15. clientDataHash を、clientDataJSON によって表される シリアライズされたクライアントデータのハッシュ とします。

  16. もし options.signal が存在し、且つ aborted であれば、options.signalabort reason をスローします。

  17. issuedRequests を新しい ordered set とします。

  18. authenticators を、任意の時点でこの クライアントプラットフォーム 上で利用可能な各 authenticator を識別するプラットフォーム固有のハンドルの 集合 を表す値とします。

    Note: どのような条件で authenticator が「利用可能」であると見なされるかは意図的に仕様化されていません;これは認証器が(例:USB 経由で)ホットプラグされたり(NFC や Bluetooth 経由で)クライアントによって検出されたり、あるいはクライアントに恒久的に組み込まれている場合があり得ることを表しています。

  19. もし options.mediation が存在し、その値が conditional の場合:

    1. もしユーザーエージェントが最近認証を仲介しておらず、その認証のオリジンが callerOrigin でなく、またはユーザーがこの種の認証情報作成に同意していない場合、"NotAllowedError" をスローします。

      認証式典が完了したとユーザーエージェントが判断するタイミングはユーザーエージェント側の裁量です。その認証式典は Web Authentication API 以外の手段で行われることもあります。

  20. hints の値を考慮し、ユーザーエージェントが適切と判断するようにユーザーインターフェイスを作成します。

  21. lifetimeTimer を開始します。

  22. While lifetimeTimer が満了していない間、次のアクションを lifetimeTimer と各 authenticator の状態および応答に応じて実行します。各 authenticatorauthenticators 内で反復します:
    もし lifetimeTimer が満了したら、

    authenticatorissuedRequests について反復し、各 authenticator に対して authenticatorCancel 操作を呼び出し、issuedRequests からその authenticator削除 します。

    ユーザーがユーザーエージェントの UI オプションを使って処理をキャンセルした場合、

    authenticatorissuedRequests の中で、authenticatorCancel 操作を authenticator に対して呼び出す。 そして、削除 authenticatorissuedRequests から。"NotAllowedError" DOMException を投げる。

    もし options.signal が存在し、且つ aborted であれば、

    authenticatorissuedRequests について反復し、各 authenticator に対して authenticatorCancel 操作を呼び出し、issuedRequests からその authenticator削除 します。次に options.signalabort reason をスローします。

    もし authenticator がこの クライアントデバイス 上で利用可能になった場合、

    Note: これは lifetimeTimer 開始時に既に authenticator が利用可能であった場合も含みます。

    1. この authenticator は今や candidate authenticator です。

    2. もし pkOptions.authenticatorSelection が存在するなら:

      1. もし pkOptions.authenticatorSelection.authenticatorAttachment が存在し、その値が現在の authenticatorauthenticator attachment modality と等しくない場合、continue します。

      2. もし pkOptions.authenticatorSelection.residentKey

        存在し、かつ required に設定されている場合

        もしその authenticatorclient-side discoverable public key credential source を保存する能力を持っていなければ、continue します。

        存在し、かつ preferred または discouraged に設定されている場合

        影響はありません。

        存在しない場合

        もし pkOptions.authenticatorSelection.requireResidentKeytrue に設定されており、その authenticatorclient-side discoverable public key credential source を保存する能力を持っていない場合、continue します。

      3. もし pkOptions.authenticatorSelection.userVerificationrequired に設定されており、その authenticatoruser verification を行う能力を持っていない場合、continue します。

    3. requireResidentKey を、credential creation に対する実効的な resident key 要件 とし、以下のように定義します:

      もし pkOptions.authenticatorSelection.residentKey

      存在し、requiredに設定されている場合

      requireResidentKeytrue にする。

      存在し、preferredに設定されている場合

      authenticator

      クライアントサイド資格情報保存方式に対応している場合

      requireResidentKeytrue にする。

      クライアントサイド資格情報保存方式に対応していない場合、またはクライアントが認証器の能力を判別できない場合

      requireResidentKeyfalse にする。

      存在し、discouragedに設定されている場合

      requireResidentKeyfalse にする。

      存在しない場合

      requireResidentKeypkOptions.authenticatorSelection.requireResidentKey の値にする。

    4. userVerification を、credential creation に対する実効的な user verification 要件 とし、以下のように定義します。もし pkOptions.authenticatorSelection.userVerification

      required に設定されている場合
      1. もし options.mediationconditional に設定されており、式典中に user verification を収集できない場合、ConstraintError をスローします。

      2. userVerificationtrue にします。

      preferred に設定されている場合

      もしその authenticatoruser verification に対応しているなら、userVerificationtrue にします。対応していなければ false にします。

      対応している場合

      userVerificationtrue にします。

      対応していない場合

      userVerificationfalse にします。

      discouraged に設定されている場合

      userVerificationfalse にします。

    5. enterpriseAttestationPossible を Boolean 値として次のように決定します。もし pkOptions.attestation

      enterprise に設定されている場合

      ユーザーエージェントが pkOptions.rp.id(上記 step 8 を参照) に対して enterprise attestation をサポートしたい場合、enterpriseAttestationPossibletrue にします。そうでなければ false にします。

      それ以外

      enterpriseAttestationPossiblefalse にします。

    6. attestationFormats を文字列のリストとして初期化し、その初期値を pkOptions.attestationFormats の値に設定します。

    7. もし pkOptions.attestation

      none に設定されている場合

      attestationFormats を単一要素リスト ["none"] に設定します。

    8. excludeCredentialDescriptorList を新しい リスト とします。

    9. 資格情報デスクリプタ CpkOptions.excludeCredentials から取り出して処理します:

      1. もし C.transports空でない かつ、その authenticatorC.transports に含まれていないトランスポートを通じて接続されている場合、クライアントは 続行することができます。

        Note: クライアントが 続行 を選択した場合、保存されたトランスポートヒントが正確でないと、同じ authenticator に複数の認証情報が誤って登録される可能性があります。 例えば、ソフトウェアのアップグレードによって新しい接続オプションが追加されると、保存されたトランスポートヒントが不正確になることがあります。

      2. そうでなければ、Append して CexcludeCredentialDescriptorList に追加します。

      3. authenticatorMakeCredential 操作をその authenticator に対して呼び出します。パラメータは clientDataHashpkOptions.rppkOptions.userrequireResidentKeyuserVerificationcredTypesAndPubKeyAlgsexcludeCredentialDescriptorListenterpriseAttestationPossibleattestationFormats、および authenticatorExtensions です。

    10. Append して authenticatorissuedRequests に追加します。

    もし authenticator がこの クライアントデバイス 上で利用できなくなった場合、

    Remove してその authenticatorissuedRequests から取り除きます。

    もし任意の authenticator がユーザーが操作をキャンセルしたことを示すステータスを返した場合、
    1. Remove してその authenticatorissuedRequests から取り除きます。

    2. 残りの authenticator に対して authenticatorCancel 操作を呼び出し、remove します。

      Note: Authenticators は「ユーザーが操作全体をキャンセルした」という通知を返すことがあります。ユーザーエージェントがこの状態をユーザーにどのように示すかは仕様で定められていません。

    もし任意の authenticator が "InvalidStateError" に相当するエラー状態を返した場合、
    1. Remove してその authenticatorissuedRequests から取り除きます。

    2. 残りの authenticator に対して authenticatorCancel 操作を呼び出し、remove します。

    3. "InvalidStateError" をスローします。

    Note: このエラー状態は別個に扱われます。なぜなら authenticator がこのエラーを返すのは、excludeCredentialDescriptorList がその authenticator にバインドされた認証情報を識別しており、かつユーザーがその操作に 同意 している場合に限られるからです。この明示的な同意があるため、このケースが Relying Party に対して区別可能であっても受け入れられます。

    もし任意の authenticator が "InvalidStateError" に相当しないエラー状態を返した場合、

    Remove してその authenticatorissuedRequests から取り除きます。

    Note: このケースは操作に対する ユーザーの同意 を意味しないため、エラーの詳細は潜在的に特定可能な情報の漏洩を防ぐために Relying Party から隠されます。詳細は § 14.5.1 Registration Ceremony Privacy を参照してください。

    もし任意の authenticator が成功を示した場合、
    1. Remove してその authenticatorissuedRequests から取り除きます。この認証器は現在 selected authenticator です。

    2. credentialCreationData を、次の struct として定義します。その 項目 は次の通りです:

      attestationObjectResult

      その値は成功した authenticatorMakeCredential 操作から返されたバイト列です。

      Note: この値は attObj です(§ 6.5.4 Generating an Attestation Object で定義)。

      clientDataJSONResult

      その値は clientDataJSON のバイト列です。

      attestationConveyancePreferenceOption

      その値は pkOptions.attestation の値です。

      clientExtensionResults

      その値は AuthenticationExtensionsClientOutputs オブジェクトで、拡張識別子クライアント拡張出力 のエントリを含みます。これらのエントリは、各拡張の client extension processing アルゴリズムを実行して クライアント拡張出力 を作成することによって生成されます。対象は pkOptions.extensions に含まれる各クライアント拡張です。

    3. constructCredentialAlg を、グローバルオブジェクト global を受け取り次の手順を実行するアルゴリズムとします:

      1. もし credentialCreationData.attestationConveyancePreferenceOption の値が次のいずれかである場合:

        none

        潜在的に識別可能な情報を、非識別的なバージョンに置き換えます:

        1. もし aaguidattested credential data にあり、その値が 16 バイトのゼロで、かつ credentialCreationData.attestationObjectResult.fmt が "packed" で、かつ "x5c"credentialCreationData.attestationObjectResult から欠落している場合、self attestation が使用されているため追加の処置は不要です。

        2. それ以外の場合:

          1. credentialCreationData.attestationObjectResult.fmt を "none" にし、credentialCreationData.attestationObjectResult.attStmt を空の CBOR マップに設定します。(参照: § 8.7 None Attestation Statement Format§ 6.5.4 Generating an Attestation Object)。

        indirect

        クライアントは aaguidattestation statement を、プライバシーに配慮したより扱いやすいバージョン(例えば Anonymization CA を用いる等)に置き換えることができます。

        direct または enterprise

        認証器の AAGUIDattestation statement をそのまま Relying Party に伝えます。

      2. attestationObject を、新しい ArrayBuffer として、global%ArrayBuffer% を用いて作成し、credentialCreationData.attestationObjectResult のバイトを含めます。

      3. idattestationObject.authData.attestedCredentialData.credentialId とします。

      4. pubKeyCred を、global に関連付けられた新しい PublicKeyCredential オブジェクトとし、そのフィールドは次のとおりです:

        [[identifier]]

        id

        authenticatorAttachment

        その authenticator の現在の authenticator attachment modality に一致する AuthenticatorAttachment の値。

        response

        global に関連付けられた新しい AuthenticatorAttestationResponse オブジェクトで、そのフィールドは次のとおりです:

        clientDataJSON

        新しい ArrayBuffer を、global%ArrayBuffer% を用いて作成し、credentialCreationData.clientDataJSONResult のバイトを含めます。

        attestationObject

        attestationObject

        [[transports]]

        その authenticator がサポートしていると思われる、重複のない 0 個以上の DOMString の列で、辞書順に並べられます。値は AuthenticatorTransport のメンバーであるべきですが、クライアントプラットフォーム は不明な値を無視しなければなりません。

        もしユーザーエージェントがこの情報を明かしたくない場合、プライバシーを保護するための任意の列を代わりに返すことができます。この列は有効でなければならず(辞書順で重複がないこと)、例えば空の列を用いることができます。いずれにせよ、この場合ユーザーエージェントは Relying Party の挙動が最適でなくなるリスクを負います。

        もしユーザーエージェントがトランスポート情報を持っていない場合、このフィールドを空の列に設定するべきです。

        Note: ある認証器がサポートするトランスポートをユーザーエージェントがどのように検出するかはこの仕様の範囲外ですが、例えば attestation certificate(例: [FIDO-Transports-Ext])からの情報、CTAP2 のような認証器プロトコルで通信されるメタデータ、あるいはプラットフォーム認証器に関する特別な知識などが含まれ得ます。

        [[clientExtensionsResults]]

        新しい ArrayBuffer を、global%ArrayBuffer% を用いて作成し、credentialCreationData.clientExtensionResults のバイトを含めます。

      5. pubKeyCred を返します。

    4. 残りの authenticator に対して authenticatorCancel 操作を呼び出し、remove します。

      constructCredentialAlg を返してこのアルゴリズムを終了します。

  23. "NotAllowedError" をスローします。

上記の過程の間、ユーザーエージェントは認証器の選択と承認の過程をユーザーに案内するために何らかの UI を表示するべきです。もし options.mediationconditional に設定されている場合、事前にユーザーが同意していない限り、目立つモーダル UI を表示してはなりません。

5.1.3.1. 作成リクエストに関する例外

この節は規範的ではありません。

WebAuthn の Relying Parties は、navigator.credentials.create() の呼び出しから多数の例外に遭遇することがあります。いくつかの例外は発生原因が複数考えられるため、WebAuthn Relying Parties は WebAuthn の利用状況に基づいて実際の原因を推測する必要があります。

Note: 本仕様外で定義されたものを含め、任意の WebAuthn Extensions の処理中に発生し得る例外はここには列挙されていません。

次の DOMException の例外が発生する可能性があります:

AbortError

式典は AbortController によってキャンセルされました。参照: § 5.6 Abort Operations with AbortSignal および § 1.3.4 Aborting Authentication Operations

ConstraintError

次のいずれか: residentKeyrequired に設定されており、利用可能な認証器が resident key をサポートしていなかった、あるいは userVerificationrequired に設定されており、利用可能な認証器が user verification を実行できなかった、のいずれかです。

InvalidStateError

式典で使用された認証器が、ユーザーが登録に同意した後に excludeCredentials 内のエントリを認識したためです。

NotSupportedError

pubKeyCredParams 内のいずれのエントリも type プロパティとして public-key を持っていなかった、または authenticatorpubKeyCredParams で指定された署名アルゴリズムのいずれもサポートしていなかった、ということです。

SecurityError

effective domain有効なドメイン ではなかった、または rp.ideffective domain と等しくないか、registrable domain のサフィックスではなかった、ということです。後者の場合、clientrelated origin requests をサポートしていないか、あるいは related origins validation procedure が失敗しました。

NotAllowedError

ユーザーが式典を中断したなど、さまざまな可能性のある理由を包括する汎用的なエラーです。これらの原因のいくつかは本仕様書の各所に記載されており、その他はクライアント固有のものです。

次の simple exceptions が発生する可能性があります:

TypeError

options 引数が有効な CredentialCreationOptions の値ではないか、 または user.id の値が空か、64バイトを超えていた。

5.1.4. 既存の資格情報を用いてアサーションを作成する

WebAuthn Relying Partiesnavigator.credentials.get({publicKey:..., ...}) を呼び出して既存の 公開鍵認証情報 を発見し利用します(ユーザーの同意 を得た上で)。Relying Party スクリプトは任意で、どのような 公開鍵認証情報ソース が受け入れ可能かを示す基準を指定できます。クライアントプラットフォーム は、指定された基準に一致する 公開鍵認証情報ソース を見つけ出し、スクリプトが使用を許可されるものをユーザーに選ばせるよう案内します。例えばプライバシー保護のために、公開鍵認証情報ソースが存在してもユーザーがやり取り全体を拒否することがあります。ユーザーが 公開鍵認証情報ソース を選択した場合、ユーザーエージェントは § 6.3.3 authenticatorGetAssertion 操作 を使って Relying Party 提供のチャレンジや収集した他のデータに署名し、認証アサーション を生成します。これが 認証情報 として使用されます。

The navigator.credentials.get() 実装は [CREDENTIAL-MANAGEMENT-1] に従って PublicKeyCredential.[[CollectFromCredentialStore]]() を呼び出し、ユーザー仲介(概ね本仕様の 承認ジェスチャー)なしで利用可能であるべき 認証情報 を収集します。もしそれらのうち正確に一つが見つからなければ、 PublicKeyCredential.[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) を呼び出してユーザーに 公開鍵認証情報ソース を選択させます。

本仕様は任意の 承認ジェスチャー を要求してアサーションを作成するため、 PublicKeyCredential[[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors) のデフォルト動作(空集合を返す)を継承します。 PublicKeyCredential[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) の実装は次の節で規定されています。

一般に、ユーザーエージェントは操作を完了するためにどの認証器を選択・承認するかをユーザーに案内する UI を表示するべきです。options.mediationconditional に設定することで、 Relying Parties は、認証情報が発見されない限り目立つモーダル UI を表示してはならないことを示すことができます。Relying Party はまず isConditionalMediationAvailable() または getClientCapabilities() を使って、クライアントconditionalGet 機能をサポートしているかを確認するべきであり、この機能が利用できない場合にユーザーに見えるエラーを防ぎます。

任意の navigator.credentials.get() 操作は AbortController を利用して中止できます; 詳細な手順は DOM § 3.3 Using AbortController and AbortSignal objects in APIs を参照してください。

5.1.4.1. PublicKeyCredential の [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) 内部メソッド

この internal method は3つの引数を受け取ります:

origin

この引数は、呼び出し側の get() 実装によって決定される relevant settings objectorigin です。すなわち CredentialsContainer の抽象操作 Request a Credential に対応します。

options

この引数は CredentialRequestOptions オブジェクトであり、options.publicKey メンバーが PublicKeyCredentialRequestOptions オブジェクトを含み、発見したい public key credential の望ましい属性を指定します。

sameOriginWithAncestors

この引数は Boolean 値で、呼び出し元の environment settings objectsame-origin with its ancestors の場合に限り true です。呼び出し元がクロスオリジンの場合は false です。

Note: この internal method の呼び出しは、permissions policy により許可されていることを示します。permissions policy は [CREDENTIAL-MANAGEMENT-1] レベルで評価されます。詳細は § 5.9 Permissions Policy integration を参照してください。

Note: このアルゴリズムは同期的です: Promise の解決/拒否は navigator.credentials.get() によって扱われます。

このアルゴリズムで使用されるすべての BufferSource オブジェクトは、同期の問題を避けるためにアルゴリズム開始時にスナップショットされなければなりません。実装は get a copy of the bytes held by the buffer source を行い、そのコピーをアルゴリズムの該当部分で使用することを推奨します。

このメソッドが呼び出されたとき、ユーザーエージェントは次のアルゴリズムを実行しなければなりません:

  1. アサート: options.publicKey が存在すること。

  2. pkOptionsoptions.publicKey の値とする。

  3. もし options.mediation が存在し、その値が conditional の場合:

    1. credentialIdFilterpkOptions.allowCredentials の値とします。

    2. pkOptions.allowCredentialsempty に設定します。

      Note: これは non-discoverable credentialsconditional リクエスト中に使用されるのを防ぎます。

    3. lifetimeTimer を無限大に設定します。

      Note: lifetimeTimer を無限大に設定するのは、ユーザーが Document の存続期間全体を用いて input 要素などの "webauthn" タグ付きフォームコントロールと相互作用できるようにするためです。例えばユーザーがそのような入力フィールドをクリックしたときに、ユーザーエージェントは発見された資格情報のリストを表示してユーザーに選択させたり、「別の方法を試す」オプションを提供したりできます。

  4. それ以外の場合:

    1. credentialIdFilter を空の list とします。

    2. もし pkOptions.timeout が存在するなら、その値が client によって定義される合理的な範囲内にあるか確認し、範囲外であれば最も近い範囲内の値に修正します。調整した値を lifetimeTimer に設定します。もし pkOptions.timeout が存在しない場合は、lifetimeTimerclient 固有のデフォルトに設定します。

      合理的な範囲とデフォルトの決定については、WebAuthn 儀式タイムアウトの推奨範囲とデフォルト を参照してください。

      ユーザーエージェントは、支援が必要なユーザー向けの認知ガイドラインを考慮してタイムアウトを決定するべきです。

  5. callerOriginorigin とします。もし callerOriginopaque origin であれば、"NotAllowedError" DOMException をスローします。

  6. effectiveDomaincallerOrigineffective domain とします。もし effectiveDomain有効なドメイン でなければ、"SecurityError" DOMException を投げます。

    Note: effective domain は host に解決されることがあり、その表現は domain、ipv4 アドレス、ipv6 アドレス、opaque host、empty host など様々です。ここでは host の domain 形式のみを許可します。これは簡便化のためであり、PKI ベースのセキュリティと直接 IP アドレス識別を組み合わせる際の諸問題を考慮したものです。

  7. もし pkOptions.rpId
    存在する場合

    もし pkOptions.rpIdeffectiveDomain の registrable domain suffix でも等しい値でもない 場合、かつクライアントが

    related origin requests をサポートする場合
    1. rpIdRequestedpkOptions.rpId の値とします。

    2. related origins validation procedurecallerOriginrpIdRequested を引数に実行します。結果が false の場合、"SecurityError" DOMException をスローします。

    related origin requests をサポートしない場合

    "SecurityError" DOMException をスローします。

    存在しない場合

    pkOptions.rpIdeffectiveDomain に設定します。

    Note: rpId は呼び出し元の RP ID を表します。RP ID は、呼び出し元が get() を呼ぶ際に明示的に設定していない限り、呼び出し元の origineffective domain がデフォルトになります。

  8. clientExtensions を新しい map とし、authenticatorExtensions を新しい map とします。

  9. もし pkOptions.extensions が存在するなら、for each を用いて extensionIdclientExtensionInput を取り出し次の処理を行います:

    1. もし extensionId がこの client platform でサポートされていないか、または authentication extension でないなら、continue します。

    2. Set を用いて clientExtensions[extensionId] に clientExtensionInput を設定します。

    3. もし extensionIdauthenticator extension でないなら、continue します。

    4. authenticatorExtensionInput を、extensionIdclient extension processing アルゴリズムを clientExtensionInput に対して実行した結果(CBOR)とします。アルゴリズムがエラーを返した場合は continue します。

    5. Set を用いて authenticatorExtensions[extensionId] に base64url encoding した authenticatorExtensionInput を設定します。

  10. collectedClientData を次のフィールドを持つ新しい CollectedClientData インスタンスとします:

    type

    文字列 "webauthn.get".

    challenge

    base64url encoding を用いた pkOptions.challenge の表現。

    origin

    callerOriginシリアライズ

    crossOrigin

    このメソッドに渡された sameOriginWithAncestors 引数の値の否定(inverse)。

    topOrigin

    もしこのメソッドの sameOriginWithAncestors 引数が false であれば、callerOrigintop-level originシリアライズ。そうでなければ undefined

  11. clientDataJSONcollectedClientData から構築した JSON 互換のシリアライズ とします。

  12. clientDataHash を、clientDataJSON によって表される シリアライズされたクライアントデータのハッシュ とします。

  13. もし options.signal が存在し、aborted であれば、options.signalabort reason をスローします。

  14. issuedRequests を新しい ordered set とします。

  15. savedCredentialIds を新しい map とします。

  16. authenticators を、任意の時点でクライアントプラットフォーム上で利用可能な各 authenticator を識別するクライアントプラットフォーム固有のハンドル集合を表す値とします。

    Note: どのような条件で認証器が「利用可能」と見なされるかは意図的に指定されていません。これは認証器が USB 経由でホットプラグされたり、NFC/Bluetooth で検出されたり、またはクライアントに恒久的に組み込まれている場合など、さまざまなメカニズムを表現するためです。

  17. silentlyDiscoveredCredentials を新しい map とし、そのエントリは DiscoverableCredentialMetadataauthenticator の形とします。

  18. hints の値を考慮して、ユーザーインターフェースを適宜作成してください。

  19. lifetimeTimer を開始します。

  20. While lifetimeTimer が期限切れになるまで、lifetimeTimerauthenticators の状態および応答に応じて各 authenticator に対して次の操作を行います:

    If lifetimeTimer が期限切れになったら,

    For each を用いて issuedRequests 内の各 authenticator に対し authenticatorCancel を呼び出し、remove します。

    If ユーザーが UI 操作でプロセスをキャンセルしたら,

    For each を用いて issuedRequests 内の各 authenticator に対し authenticatorCancel を呼び出し、remove します。その後 "NotAllowedError" DOMException をスローします。

    If options.signal が存在し aborted なら,

    For each を用いて issuedRequests 内の各 authenticator に対し authenticatorCancel を呼び出し、remove します。その後 options.signalabort reason をスローします。

    もし options.mediationconditional で、ユーザーが input または textarea のフォームコントロールと相互作用し、その autocomplete 属性の non-autofill credential type"webauthn" である場合,
    Note: "webauthn"autofill detail token は "Normal" や "Contact" タイプの最後の autofill detail token の直後に現れなければなりません。例えば:
    • "username webauthn"

    • "current-password webauthn"

    1. もし silentlyDiscoveredCredentialsempty でない場合:

      1. silentlyDiscoveredCredentials から DiscoverableCredentialMetadata をユーザーが任意で選択できるよう促します。プロンプトは各 DiscoverableCredentialMetadataotherUI の値(例えば namedisplayName)を表示するべきです。

        credentialMetadata を、ユーザーが選択した DiscoverableCredentialMetadata(存在する場合)とします。

      2. もしユーザーが credentialMetadata を選択した場合:

        1. publicKeyOptionspkOptions の一時的コピーとします。

        2. authenticatorsilentlyDiscoveredCredentials[credentialMetadata] の値とします。

        3. publicKeyOptions.allowCredentials を、1つの PublicKeyCredentialDescriptor リスト項目に設定し、その id の値を credentialMetadataid の値に、 また type の値を credentialMetadatatype に設定する。

        4. issuing a credential request to an authenticator アルゴリズムを authenticator, savedCredentialIds, publicKeyOptions, rpId, clientDataHash, authenticatorExtensions を引数として実行します。もしこれが false を返したら、continue します。

        5. Append を用いて authenticatorissuedRequests に追加します。

    もし options.mediationconditional でない場合、かつ issuedRequests が空で、pkOptions.allowCredentials が空でなく、そこに含まれる任意の authenticator について利用可能なものがない場合,

    ユーザーに対して、該当する認証情報が見つからなかったことを示します。ユーザーがダイアログを確認した後、"NotAllowedError" のDOMExceptionをスローします。

    注: クライアントプラットフォームが どのauthenticatorも利用可能にならないことを判断できる一つの方法は、存在する transports メンバーや PublicKeyCredentialDescriptor項目pkOptions.allowCredentialsで調べることです(存在する場合)。 例えば、全ての PublicKeyCredentialDescriptor 項目internal のみをリストしていて、全てのプラットフォームauthenticatorが既に試されていたら、そのリクエストは満たせません。あるいは、すべての PublicKeyCredentialDescriptor 項目が、クライアントプラットフォームでサポートされていない transports をリストしている場合も考えられます。

    もし authenticator がこの client device 上で利用可能になったら,

    Note: これは authenticatorlifetimeTimer 開始時に既に利用可能だった場合も含みます。

    1. もし options.mediationconditional で、その authenticatorsilentCredentialDiscovery 操作をサポートするなら:

      1. collectedDiscoveredCredentialMetadataauthenticator に対して silentCredentialDiscovery を呼び出した結果とします(rpId をパラメータとして渡します)。

      2. For each を用いて collectedDiscoveredCredentialMetadata の各 credentialMetadata について次を行います:

        1. もし credentialIdFilter が空であるか、または credentialIdFilterid がありその値が credentialMetadataid の値と一致するなら、set を用いて silentlyDiscoveredCredentials[credentialMetadata] に authenticator を設定します。

          Note: 要求は特定の UI コンテキストでユーザーが資格情報を選択した際にこの認証器に対して発行されます(詳細は ここ を参照)。

    2. それ以外の場合:

      1. issuing a credential request to an authenticator アルゴリズムを authenticator, savedCredentialIds, pkOptions, rpId, clientDataHash, authenticatorExtensions で実行します。もしこれが false を返したら continue します。

      2. Append を用いて authenticatorissuedRequests に追加します。

    もし authenticator がこの client device で利用不可になったら,

    Remove を用いて issuedRequests からその authenticator を削除します。

    もし任意の authenticator がユーザーが操作をキャンセルしたというステータスを返したら,
    1. Remove を用いてその authenticatorissuedRequests から取り除きます。

    2. For each を用いて残りの issuedRequests 内の各 authenticator に対し authenticatorCancel を呼び出し、remove します。

      Note: Authenticators は「ユーザーが操作全体をキャンセルした」という表示を返すことがあります。ユーザーエージェントがこの状態をユーザーにどのように示すかは未規定です。

    もし任意の authenticator がエラーステータスを返したら,

    Remove を用いてその authenticatorissuedRequests から取り除きます。

    もし任意の authenticator が成功を示したら,
    1. Remove を用いてその authenticatorissuedRequests から取り除きます。

    2. assertionCreationData を次の項目を持つ struct とします:

      credentialIdResult

      もし savedCredentialIds[authenticator] が存在するなら、credentialIdResult の値を savedCredentialIds[authenticator] のバイト列に設定します。そうでなければ、成功した authenticatorGetAssertion 操作から返された credential ID のバイト列を credentialIdResult の値として設定します。

      clientDataJSONResult

      その値は clientDataJSON のバイト列です。

      authenticatorDataResult

      その値は成功した authenticator により返された authenticator data のバイト列です。

      signatureResult

      その値は authenticator によって返された署名値のバイト列です。

      userHandleResult

      もし authenticatoruser handle を返した場合、userHandleResult に返された user handle のバイト列を設定します。そうでなければ userHandleResult を null に設定します。

      clientExtensionResults

      その値は AuthenticationExtensionsClientOutputs オブジェクトで、各 extension identifierclient extension output のエントリを含みます。これらのエントリは pkOptions.extensions 内の各クライアント拡張に対して各拡張の client extension processing アルゴリズムを実行して生成されます。

    3. もし credentialIdFilter が空でなく、かつ credentialIdFilterid が含まれており、その値が credentialIdResult の値と一致しない場合は continue します。

    4. もし credentialIdFilter が空で、かつ userHandleResult が null であれば、continue します。

    5. settingscurrent settings object とし、globalsettingsglobal object とします。

    6. pubKeyCred を、global に関連付けられた新しい PublicKeyCredential オブジェクトとし、そのフィールドを以下のように設定します:

      [[identifier]]

      新しい ArrayBufferglobal%ArrayBuffer% を用いて作成し、assertionCreationData.credentialIdResult のバイト列を格納します。

      authenticatorAttachment

      AuthenticatorAttachment の値を、この authenticator の現在の authenticator attachment modality に合わせて設定します。

      response

      新しい AuthenticatorAssertionResponse オブジェクトを global に関連付けて作成し、そのフィールドを以下のように設定します:

      clientDataJSON

      新しい ArrayBufferglobal%ArrayBuffer% を用いて作成し、assertionCreationData.clientDataJSONResult のバイト列を格納します。

      authenticatorData

      新しい ArrayBufferglobal%ArrayBuffer% を用いて作成し、assertionCreationData.authenticatorDataResult のバイト列を格納します。

      signature

      新しい ArrayBufferglobal%ArrayBuffer% を用いて作成し、assertionCreationData.signatureResult のバイト列を格納します。

      userHandle

      もし assertionCreationData.userHandleResult が null であれば、このフィールドを null に設定します。そうでなければ新しい ArrayBufferglobal%ArrayBuffer% を用いて作成し、assertionCreationData.userHandleResult のバイト列を格納します。

      [[clientExtensionsResults]]

      新しい ArrayBufferglobal%ArrayBuffer% を用いて作成し、assertionCreationData.clientExtensionResults のバイト列を格納します。

    7. For each を用いて残りの issuedRequests 内の各 authenticator に対し authenticatorCancel を呼び出し、remove します。

    8. 返り値として pubKeyCred を返し、アルゴリズムを終了します。

  21. "NotAllowedError" DOMException をスローします。

5.1.4.2. 認証器への資格情報要求の発行

この [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) のサブアルゴリズムは、与えられた credential を特定の authenticator(認証器) から要求するために必要な、 UI コンテキストに依存しない具体的な手順を包含します。これは、与えられた PublicKeyCredentialRequestOptions を使用します。呼び出しは、現在の 認証儀式 がどのような ユーザー仲介 の対象になっているかに応じて、さまざまな箇所から行われます(例: conditional 仲介の場合など)。

このアルゴリズムは次の引数を受け取ります:

authenticator

クライアントプラットフォーム 固有のハンドルで、当該 認証器 を識別します。これは現在この クライアントプラットフォーム 上で利用可能なものです。

savedCredentialIds

map で、各 authenticatorcredential ID を含みます。この引数はこのアルゴリズム内で修正されます。

pkOptions

この引数は PublicKeyCredentialRequestOptions オブジェクトで、発見したい public key credential の望ましい属性を指定します。

rpId

リクエストの RP ID です。

clientDataHash

clientDataJSONで表されるシリアライズされたクライアントデータのハッシュです。

authenticatorExtensions

map で、拡張識別子 をキーに、base64url エンコーディング された client extension processing の出力(authenticator extensions 用)を保持します。

このアルゴリズムは、client が当該 authenticator が要求を処理できないと判断した場合は false を返し、要求が正常に発行された場合は true を返します。

認証器への資格情報要求の発行 の手順は次のとおりです:

  1. もし pkOptions.userVerificationrequired に設定されていて、当該 authenticatoruser verification を実行できない場合、false を返します。

  2. userVerification を、assertion に対する有効な user verification 要求(Boolean)とします。もし pkOptions.userVerification が指定されている場合:

    required に設定されている場合

    userVerificationtrue にします。

    preferred に設定されている場合

    もし当該 authenticatoruser verification を実行できるなら userVerificationtrue にし、できないなら false にします。

    discouraged に設定されている場合

    userVerificationfalse にします。

  3. もし pkOptions.allowCredentials

    空でない
    1. allowCredentialDescriptorList を新しい リスト とする。

    2. クライアントプラットフォームごとの手順を実行し、 pkOptions.allowCredentials で記述された 公開鍵資格情報のうち どれがこの authenticatorバインドされているか(あるいは該当するものがあるか)rpIdpkOptions.allowCredentials.id, および pkOptions.allowCredentials.type でマッチングし、 このフィルタ済みリストを allowCredentialDescriptorList とする。

    3. allowCredentialDescriptorList空である場合、false を返す。

    4. distinctTransports を新しい 順序付きセット とする。

    5. allowCredentialDescriptorList に値がひとつだけある場合、 savedCredentialIds[authenticator]allowCredentialDescriptorList[0].id の値を設定する (詳細は こちら§ 6.3.3 authenticatorGetAssertion の操作 参照)。

    6. allowCredentialDescriptorList の各資格情報記述 C について、 存在する場合C.transports の値をそれぞれ distinctTransports に追加する。

      Note: この操作により、 認証器 に対し、distinctTransportstransports の値は重複のない値のみ集約されます(順序付きセットの仕様による)。

    7. distinctTransports

      空でない

      クライアントは distinctTransports の値から1つの transport 値を選び、 authenticator に対して使用すべき適切な transport に関するローカル設定情報も考慮しつつ 選択を行います。

      そして transport を使い、 authenticatorGetAssertion 操作を authenticator に対して実行し、引数として rpIdclientDataHashallowCredentialDescriptorListuserVerificationauthenticatorExtensions を渡す。

      空である

      authenticator に対しローカルの設定情報に基づき、 authenticatorGetAssertion 操作を実行し、引数として rpIdclientDataHashallowCredentialDescriptorListuserVerificationauthenticatorExtensions を渡す。

    空である

    ローカルの設定知識を用いて当該 authenticator に適したトランスポートを決定し、authenticatorGetAssertion 操作を当該 authenticator に対して呼び出します。パラメータは rpId, clientDataHash, userVerification, および authenticatorExtensions です。

    Note: この場合、Relying Party は受け入れ可能な資格情報ディスクリプタのリストを提供していません。したがって、認証器には rpId によって識別されるスコープ内の、認証器が保有する任意の資格情報を使用するよう求められます。

  4. true を返します。

5.1.4.3. Get リクエストの例外

この節は規範的ではありません。

WebAuthn Relying Partiesnavigator.credentials.get() の呼び出しからいくつかの例外に遭遇することがあります。これらの例外は複数の原因を持つことがあり、WebAuthn を使用する側が文脈に基づいて実際の理由を推測する必要がある場合があります。

Note: 本仕様の外で定義されたものを含め、任意の WebAuthn Extensions の処理中に発生し得る例外はここには列挙していません。

次の DOMException 例外が発生する可能性があります:

AbortError

式典はAbortControllerによってキャンセルされました。 § 5.6 AbortSignalによる操作の中断§ 1.3.4 認証操作の中断を参照してください。

SecurityError

有効なドメイン有効なドメインではなかった、 または rp.id有効なドメインと等しいか登録可能なドメインサフィックスでなかった。 後者の場合、 クライアント関連オリジンリクエストをサポートしていないか 関連オリジン検証手順に失敗しました。

NotAllowedError

ユーザーが式典をキャンセルした場合など、広範囲の理由を包括する一般的なエラーです。 これらの原因の一部は本仕様書内で説明されており、 その他はクライアント固有です。

次の simple exceptions が発生することがあります:

TypeError

options 引数が有効な CredentialRequestOptions 値ではなかった場合。

5.1.5. 既存の資格情報を格納する - PublicKeyCredential の [[Store]](credential, sameOriginWithAncestors) 内部メソッド

[[Store]](credential, sameOriginWithAncestors) メソッドは Web Authentication の PublicKeyCredential 型ではサポートされていないため、[[Store]](credential, sameOriginWithAncestors) internal method の実装は常にエラーを投げます。

Note: 本アルゴリズムは同期的です;Promise の解決/拒否は navigator.credentials.store() により扱われます。

この internal method は 2 つの引数を受け取ります:

credential

この引数は PublicKeyCredential オブジェクトです。

sameOriginWithAncestors

この引数は Boolean 値で、呼び出し元の environment settings objectsame-origin with its ancestors の場合に限り true です。

このメソッドが呼び出されたとき、ユーザーエージェントは次のアルゴリズムを実行しなければなりません:

  1. "NotSupportedError" DOMException をスローします。

5.1.6. User-Verifying Platform Authenticator の可用性 - PublicKeyCredential の isUserVerifyingPlatformAuthenticatorAvailable() メソッド

WebAuthn Relying Parties はこのメソッドを使用して、user-verifying platform authenticator を使って新しい資格情報を作成できるかを判定します。呼び出されると、clientクライアントプラットフォーム 固有の手順を用いて利用可能な user-verifying platform authenticator を探索します。もしいずれかが発見されれば、Promise は true で解決されます。発見されなければ false で解決されます。結果に基づき、Relying Party はユーザーに対して資格情報の作成を案内する追加の処理を行えます。

このメソッドは引数を取らず、Boolean 値を返します。

partial interface PublicKeyCredential {
    static Promise<boolean> isUserVerifyingPlatformAuthenticatorAvailable();
};

5.1.7. クライアントの能力の可用性 - PublicKeyCredential の getClientCapabilities() メソッド

WebAuthn Relying Parties はこのメソッドを使用して、特定のワークフローやユーザー体験を提供するための限られたセットの client 能力の可用性を判定します。例えば、ある RP はクライアント上でのみ hybrid トランスポートが利用可能な場合、あるいは conditional 仲介が利用できない場合にサインインボタンを表示する、といったことが可能になります(代わりにユーザー名フィールドを表示するよりよい選択など)。

呼び出されると、clientクライアントプラットフォーム 固有の手順を用いてこれらの能力の可用性を探索します。

このメソッドは引数を取らず、能力キーを Boolean 値にマッピングしたレコードを返します。

partial interface PublicKeyCredential {
    static Promise<PublicKeyCredentialClientCapabilities> getClientCapabilities();
};

typedef record<DOMString, boolean> PublicKeyCredentialClientCapabilities;

KeysPublicKeyCredentialClientCapabilities で昇順の辞書式順にソートされている必要があります。キーの集合には ClientCapability 列挙型の列挙値を含めるべきですが、クライアントは必要に応じてキーを省略できます(詳細は § 14.5.4 Disclosing Client Capabilities を参照)。

ある能力の値が true の場合、その機能は現在クライアントによってサポートされていることが知られます。値が false の場合、その機能は現在クライアントでサポートされていないことが知られます。ある能力がキーとして存在しない場合、その機能の可用性は不明です。

キーの集合には、クライアントが実装している各 拡張 に対しても、接頭辞 "extension:" を拡張識別子に付けた文字列をキーとして含めるべきです。実装された各拡張の関連値は true とすることが推奨されます。もし getClientCapabilities() がクライアントでサポートされているが、ある拡張が true にマップされていない場合、Relying Party はその拡張に対するクライアント側の処理が行われない可能性や、拡張が認証器に転送されない可能性を想定してよいです。

注: たとえ拡張が true にマップされていても、特定の操作で使用する認証器がその拡張をサポートしていない場合があるため、Relying Parties は認証器側の処理が必ず行われると仮定してはなりません。

5.1.8. 登録(Registration)儀式オプションの逆シリアライズ - PublicKeyCredential の parseCreationOptionsFromJSON() メソッド

WebAuthn Relying Parties はこのメソッドを使って、JSON 型 で表現された navigator.credentials.create() オプションを PublicKeyCredentialCreationOptions に変換します。

呼び出されると、clientoptions 引数を、新しいが同一構造の PublicKeyCredentialCreationOptions オブジェクトに変換する必要があります。変換の際、base64url エンコーディング を用いて、JSON の DOMString 属性のうち、PublicKeyCredentialCreationOptionsJSON 内で buffer source 型 に相当するものをデコードします。この変換は client extension inputs についてもクライアント側で処理される場合に適用される必要があります。

AuthenticationExtensionsClientInputsJSON には、IANA の "WebAuthn Extension Identifiers" レジストリに登録された拡張が含まれていてもよく([IANA-WebAuthn-Registries])、それが本仕様の § 9 WebAuthn Extensions で定義されていない場合でも構いません。

もし client が JSON 表現の解析に問題を検出した場合、クライアントは不適合な値の説明を付した "EncodingError" DOMException をスローし、操作を終了しなければなりません。

partial interface PublicKeyCredential {
    static PublicKeyCredentialCreationOptions parseCreationOptionsFromJSON(PublicKeyCredentialCreationOptionsJSON options);
};

dictionary PublicKeyCredentialCreationOptionsJSON {
    required PublicKeyCredentialRpEntity                    rp;
    required PublicKeyCredentialUserEntityJSON              user;
    required Base64URLString                                challenge;
    required sequence<PublicKeyCredentialParameters>        pubKeyCredParams;
    unsigned long                                           timeout;
    sequence<PublicKeyCredentialDescriptorJSON>             excludeCredentials = [];
    AuthenticatorSelectionCriteria                          authenticatorSelection;
    sequence<DOMString>                                     hints = [];
    DOMString                                               attestation = "none";
    sequence<DOMString>                                     attestationFormats = [];
    AuthenticationExtensionsClientInputsJSON                extensions;
};

dictionary PublicKeyCredentialUserEntityJSON {
    required Base64URLString        id;
    required DOMString              name;
    required DOMString              displayName;
};

dictionary PublicKeyCredentialDescriptorJSON {
    required DOMString              type;
    required Base64URLString        id;
    sequence<DOMString>             transports;
};

dictionary AuthenticationExtensionsClientInputsJSON {
};

5.1.9. 認証(Authentication)儀式オプションの逆シリアライズ - PublicKeyCredential の parseRequestOptionsFromJSON() メソッド

WebAuthn Relying Parties はこのメソッドを使用して、JSON 型 表現の navigator.credentials.get() オプションを PublicKeyCredentialRequestOptions に変換します。

呼び出されると、clientoptions 引数を、新しいが同一構造の PublicKeyCredentialRequestOptions オブジェクトに変換する必要があります。変換では base64url エンコーディング を用いて、DOMString 属性のうち PublicKeyCredentialRequestOptionsJSON 内で buffer source 型 に対応するものをデコードします。この変換はクライアントが処理する任意の client extension inputs に対しても適用されなければなりません。

AuthenticationExtensionsClientInputsJSON は、IANA の "WebAuthn Extension Identifiers" レジストリに登録された拡張を含んでもよく([IANA-WebAuthn-Registries])、それが本仕様の § 9 WebAuthn Extensions で定義されていない場合でも構いません。

もし client が JSON 表現の解析に問題を検出した場合、クライアントは不適合な値の説明を付した "EncodingError" DOMException をスローして操作を終了しなければなりません。

partial interface PublicKeyCredential {
    static PublicKeyCredentialRequestOptions parseRequestOptionsFromJSON(PublicKeyCredentialRequestOptionsJSON options);
};

dictionary PublicKeyCredentialRequestOptionsJSON {
    required Base64URLString                                challenge;
    unsigned long                                           timeout;
    DOMString                                               rpId;
    sequence<PublicKeyCredentialDescriptorJSON>             allowCredentials = [];
    DOMString                                               userVerification = "preferred";
    sequence<DOMString>                                     hints = [];
    AuthenticationExtensionsClientInputsJSON                extensions;
};

5.1.10. 認証器への資格情報変更の通知 - PublicKeyCredential の signal methods

partial interface PublicKeyCredential {
    static Promise<undefined> signalUnknownCredential(UnknownCredentialOptions options);
    static Promise<undefined> signalAllAcceptedCredentials(AllAcceptedCredentialsOptions options);
    static Promise<undefined> signalCurrentUserDetails(CurrentUserDetailsOptions options);
};

dictionary UnknownCredentialOptions {
    required DOMString                     rpId;
    required Base64URLString               credentialId;
};

dictionary AllAcceptedCredentialsOptions {
    required DOMString                     rpId;
    required Base64URLString               userId;
    required sequence<Base64URLString>     allAcceptedCredentialIds;
};

dictionary CurrentUserDetailsOptions {
    required DOMString                     rpId;
    required Base64URLString               userId;
    required DOMString                     name;
    required DOMString                     displayName;
};

WebAuthn Relying Parties は、これらの signal methods を用いて 認証器 に対して公開鍵資格情報の状態を通知し、誤ったまたは取り消された資格情報を更新、削除、あるいは非表示にできるようにすることができます。Clients はこの機能を機会的に提供します。というのも、認証器は資格情報マップを更新する機能を持たないか、要求時に接続されていない可能性があるからです。さらに、ユーザーの同意なしにユーザーの資格情報に関する情報を漏洩しないために、signal methods は操作が成功したかどうかを示しません。Promise が正常に解決されることは、単に options オブジェクトが正しく構成されていたことを意味するだけです。

signal method には authenticator actions が含まれます。認証器 は、本仕様から逸脱して独自の authenticator actions を選択してよい(たとえば、変更がユーザーの意向に反すると合理的に判断される場合は無視する、あるいは変更前にユーザーに確認する等)。したがって、authenticator actionssignal methods を処理する推奨手段として示されています。

認証器が特定の authenticator action を処理する能力を持たない場合、clients は既存のインフラ(たとえば [FIDO-CTAP]authenticatorCredentialManagement コマンド)を用いて同等の効果を達成することを選べます。

Note: Signal methods は意図的に認証器が authenticators 上で authenticator actions を完了するのを待たないようにしています。これは、WebAuthn Relying Parties が要求のタイミングに基づいてユーザーの資格情報の利用可否に関する情報をユーザーの同意なしに得ることを防ぐためです。

5.1.10.1. 非同期 RP ID 検証アルゴリズム

非同期 RP ID 検証アルゴリズムsignal methods が並列に RP ID を検証することを可能にします。アルゴリズムは DOMStringrpId を入力として取り、検証が失敗した場合は拒否される Promise を返します。手順は以下の通りです:

  1. effectiveDomain関連設定オブジェクトオリジン有効ドメイン とする。もし effectiveDomain有効なドメインでない場合、"SecurityError" で拒否された promise

  2. rpId登録可能なドメインサフィックスに該当するか、または等しい effectiveDomain であれば、undefined で解決された promise を返す。

  3. クライアントが 関連オリジンリクエスト をサポートしていない場合、"SecurityError" で拒否された promiseDOMException として返す。

  4. p新しい promiseとする。

  5. 以下の手順を 並列で実行する:

    1. 関連オリジン検証手順callerOriginrpId の引数で実行し、 結果が true なら p を解決 する。

    2. それ以外の場合は、p を拒否し、" DOMException" を渡す。

  6. p を返す。

5.1.10.2. signalUnknownCredential(options)

signalUnknownCredential メソッドは、ある credential idWebAuthn Relying Party によって認識されなかった(例: ユーザーが削除したため)ことを通知します。signalAllAcceptedCredentials(options) と異なり、このメソッドは受け入れられる全ての credential IDs の完全なリストを渡す必要はなく、認証されていない呼び出し元へのプライバシー漏洩を回避します(詳細は § 14.6.3 Privacy leak via credential IDs を参照)。

signalUnknownCredential(options) が呼び出されると、client は次の手順を実行します:

  1. もし base64url デコード の結果が options.credentialId に対してエラーであれば、TypeError の拒否された Promise を返します。

  2. p を、非同期 RP ID 検証アルゴリズムoptions.rpId で実行した結果とします。

  3. p の充足時 に、以下の手順を 並列に 実行します:

    1. 現在この クライアントプラットフォーム 上で利用可能なすべての authenticator に対して、unknownCredentialId authenticator actionoptions を入力として呼び出します。

  4. p を返します。

unknownCredentialId authenticator actionUnknownCredentialOptions options を取り、次のように実行されます:

  1. For each 当該 public key credential source credential が当該 authenticatorcredential map 内にある場合、次を行います:

    1. もし credentialrpIdoptions.rpId と等しく、かつ credentialidbase64url デコード した options.credentialId と等しい場合、credentialcredentials map から削除するか、将来の 認証儀式 から隠すために認証器固有の手順を用いてください。

ユーザーが credential を WebAuthn Relying Party の UI 上で削除しました。後に 同じ Relying Party に対して、allowCredentials で認証を試みたところ、認証器の UI が以前ユーザーが削除した credential を提示しました。ユーザーがその credential を選択し、サインイン試行を拒否した後、WebAuthn Relying Party は次を実行します:

PublicKeyCredential.signalUnknownCredential({
    rpId: "example.com",
    credentialId: "aabbcc"  // credential id the user just tried, base64url
});

その後、認証器 は将来の認証儀式から該当する credential を削除または非表示にします。

5.1.10.3. signalAllAcceptedCredentials(options)

指定ユーザーのための credential ids の完全なリストを通知します。WebAuthn Relying Parties は、ユーザーが認証済みでありプライバシー漏洩のリスクがない場合(詳細は § 14.6.3 Privacy leak via credential IDs を参照)には、このメソッドを signalUnknownCredential() より優先して使うべきです。全リストはユーザーのすべての公開鍵資格情報のスナップショットを提供し、現在接続された認証器にまだ報告されていない変更を反映する可能性があります。

signalAllAcceptedCredentials(options) が呼び出されると、client は次の手順を実行します:

  1. もし base64url デコード の結果が options.userId に対してエラーであれば、TypeError の拒否された Promise を返します。

  2. For each を用いて options.allAcceptedCredentialIds 内の各 credentialId について次を行います:

    1. もし base64url デコード の結果が当該 credentialId に対してエラーであれば、TypeError の拒否された Promise を返します。

  3. p を、非同期 RP ID 検証アルゴリズムoptions.rpId で実行した結果とします。

  4. p の充足時 に、次の手順を 並列に 実行します:

    1. 現在この クライアントプラットフォーム 上で利用可能なすべての authenticator に対して、allAcceptedCredentialIds authenticator actionoptions を入力として呼び出します。

  5. p を返します。

allAcceptedCredentialIds authenticator actionsAllAcceptedCredentialsOptions options を取り、次のように実行されます:

  1. userId base64url decoding の結果とします options.userId.

  2. 断言: userId はエラーではありません。

  3. credentialcredentials map[options.rpId, userId] とします。

  4. もし credential が存在しない場合、これらの手順を中止します。

  5. もし options.allAcceptedCredentialIdscontain しない、つまり base64url encoding した credentialid の結果を含まない場合、remove credentialcredentials map から削除するか、将来の authentication ceremonies から隠すために認証器固有の手順を行ってください。

  6. それ以外で、もし credential が認証器固有の手順によって隠されていた場合、その操作を元に戻して credential が将来の authentication ceremonies に表示されるようにします。

ユーザーは、base64url エンコードすると aabb になる 2 つの credential を持っており、ユーザーは資格情報 aa を WebAuthn Relying Party の UI 上で削除しました。WebAuthn Relying Party は次を実行します:

PublicKeyCredential.signalAllAcceptedCredentials({
    rpId: "example.com",
    userId: "aabbcc",  // user handle, base64url.
    allAcceptedCredentialIds: [
        "bb",
    ]
});

もし認証器が実行時に接続されていれば、該当する認証器は将来の認証儀式から aa に対応する credential を削除または非表示にします。

Note: 認証器 は、signalAllAcceptedCredentials(options) が実行された時点で接続されていない場合があります。したがって、Relying Parties は例えばサインインのたびに定期的に signalAllAcceptedCredentials(options) を実行することを選べます。

Note: allAcceptedCredentialIds に存在しない資格情報は削除または非表示にされ、回復不能になる可能性があります。Relying parties は有効な credential ID をリストから決して抜かないよう注意を払う必要があります。もし有効な credential ID が誤ってリストから抜けてしまった場合、relying party は可能な限り早急にそれを signalAllAcceptedCredentials(options) に含めて、認証器がサポートしていればそれを「再表示(unhide)」するべきです。

認証器 は可能な限り、資格情報を永久に削除するよりも一時的に非表示にすることを優先すべきです。これは、WebAuthn Relying Party が誤って有効な credential IDs を allAcceptedCredentialIds から除外してしまった場合の回復支援になります。

5.1.10.4. signalCurrentUserDetails(options)

signalCurrentUserDetails メソッドはユーザーの現在の namedisplayName を通知します。

signalCurrentUserDetails(options) が呼び出されると、client は次の手順を実行します:

  1. もし base64url デコード の結果が options.userId に対してエラーであれば、TypeError の拒否された Promise を返します。

  2. p を、非同期 RP ID 検証アルゴリズムoptions.rpId で実行した結果とします。

  3. p の充足時 に、次の手順を 並列に 実行します:

    1. 現在この クライアントプラットフォーム 上で利用可能なすべての authenticator に対して、currentUserDetails authenticator actionoptions を入力として呼び出します。

  4. p を返します。

currentUserDetails authenticator actionCurrentUserDetailsOptions options を取り、次のように実行されます:

  1. userIdbase64url デコード した options.userId の結果とします。

  2. アサーション: userId はエラーではない。

  3. credentialcredentials map[options.rpId, userId] とします。

  4. もし credential が存在しない場合は、この手順を中止します。

  5. credentialotherUIoptions.name および options.displayName に合わせて更新します。

ユーザーが WebAuthn Relying Party の UI 上で自分の名前を更新しました。Relying Party は次を実行します:

PublicKeyCredential.signalCurrentUserDetails({
    rpId: "example.com",
    userId: "aabbcc",  // user handle, base64url.
    name: "New user name",
    displayName: "New display name",
});

当該 authenticator は、対応する資格情報の otherUI を更新します。

Note: 認証器 は、signalCurrentUserDetails(options) 実行時に接続されていない場合があります。したがって、Relying Parties は、例えばサインインのたびに周期的に signalCurrentUserDetails(options) を実行することを選べます。

5.2. オーセンティケータ応答(インターフェース AuthenticatorResponse

オーセンティケータリライング・パーティの要求に応答して、AuthenticatorResponse インターフェースから派生したオブジェクトを返します:

[SecureContext, Exposed=Window]
interface AuthenticatorResponse {
    [SameObject] readonly attribute ArrayBuffer      clientDataJSON;
};
clientDataJSON, ArrayBuffer, 読み取り専用

この属性には、JSON互換の シリアライズが含まれます。クライアントデータハッシュ値は、 クライアントが認証器へ create() または get() を呼び出す際に渡されます(つまり クライアントデータ自体は 認証器には送信されません)。

5.2.1. 公開鍵クレデンシャルに関する情報(インターフェース AuthenticatorAttestationResponse

このAuthenticatorAttestationResponse インターフェースは、新しい公開鍵クレデンシャルの作成をクライアントが要求した際の認証器の応答を表します。ここには後で識別に使用できる新しいクレデンシャルに関する情報や、登録時にWebAuthn リライング・パーティがクレデンシャルの特性を評価するために使用できるメタデータが含まれます。

[SecureContext, Exposed=Window]
interface AuthenticatorAttestationResponse : AuthenticatorResponse {
    [SameObject] readonly attribute ArrayBuffer      attestationObject;
    sequence<DOMString>                              getTransports();
    ArrayBuffer                                      getAuthenticatorData();
    ArrayBuffer?                                     getPublicKey();
    COSEAlgorithmIdentifier                          getPublicKeyAlgorithm();
};
clientDataJSON

この属性はAuthenticatorResponse から継承されたもので、認証器を生成するためにクライアントが認証器に渡したクライアントデータのJSON互換シリアライズを含みます(詳細は § 6.5 証明 を参照)。正確なJSONシリアライズは保持される必要があり、シリアライズされたクライアントデータのハッシュがその上で計算されているためです。

attestationObject, 型は ArrayBuffer、読み取り専用

この属性にはアテステーションオブジェクトが含まれており、これはクライアントからは不透明であり、暗号技術によって改ざんから保護されています。アテステーションオブジェクトには、認証器データアテステーションステートメントの両方が含まれます。 前者には AAGUID、一意な認証情報ID、そして認証情報公開鍵が含まれています。 アテステーションステートメントの内容は、 使用されるアテステーションステートメントフォーマットによって認証器が決定します。 また、Relying Partyのサーバーが アテステーションステートメントを検証するため及び認証器データクライアントデータのJSON互換シリアル化を復号・検証するために必要な追加情報も含まれます。 詳細は§ 6.5 アテステーション§ 6.5.4 アテステーションオブジェクトの生成図6を参照してください。

getTransports()

この操作は[[transports]]の値を返します。

getAuthenticatorData()

この操作はattestationObjectに含まれるauthenticator dataを返します。詳しくは § 5.2.1.1 認証情報データへ簡単にアクセスする方法 を参照してください。

getPublicKey()

この操作は新しいクレデンシャルのDER形式のSubjectPublicKeyInfoを返します。利用できない場合はnullを返します。詳しくは § 5.2.1.1 認証情報データへ簡単にアクセスする方法 を参照してください。

getPublicKeyAlgorithm()

この操作は新しいクレデンシャルのCOSEAlgorithmIdentifierを返します。詳しくは § 5.2.1.1 認証情報データへ簡単にアクセスする方法 を参照してください。

[[transports]]

この内部スロットには、辞書順に並んだゼロ個以上の一意なDOMStringの列が含まれます。これらの値は認証器がサポートしていると考えられるトランスポートであり、情報が利用できない場合は空の列になります。値は AuthenticatorTransport のメンバーであるべきですが、リライング・パーティは未知の値を受け入れて保存するべきです。

5.2.1.1. 認証情報データへ簡単にアクセスする方法

すべての[[Create]](origin, options, sameOriginWithAncestors) メソッドの利用者は、返されたクレデンシャル公開鍵を解析して保存し、将来の認証アサーションを検証する必要があります。しかし、クレデンシャル公開鍵は COSE 形式であり([RFC9052]参照)、credentialPublicKey メンバの中にあり、さらにそれは attestedCredentialData の中の authenticator data、および attestation object の中にあります(AuthenticatorAttestationResponseattestationObject を参照)。リライング・パーティ がアテステーションを利用したい場合、アテステーションオブジェクトを解析してクレデンシャル公開鍵を取得する作業を行う義務があります。なぜなら、その公開鍵が認証器によって署名されたコピーだからです。しかし、多くの有効な WebAuthn のユースケースではアテステーションは必要ありません。そうした用途では、ユーザーエージェントが解析の作業を行い、authenticator data を直接公開し、クレデンシャル公開鍵 をより扱いやすい形式に変換することができます。

したがって、getPublicKey() 操作は、クレデンシャル公開鍵SubjectPublicKeyInfoとして返します。このArrayBufferは、例えば Java の java.security.spec.X509EncodedKeySpec、.NET の System.Security.Cryptography.ECDsa.ImportSubjectPublicKeyInfo、または Go の crypto/x509.ParsePKIXPublicKey に渡すことができます。

getPublicKey() の使用にはいくつかの制限があります:pubKeyCredParams を用いることで、リライング・パーティはユーザーエージェントが理解できない公開鍵アルゴリズムを認証器と交渉して使用させることができます。しかし、もしリライング・パーティがそのようにした場合、ユーザーエージェントは結果として得られたクレデンシャル公開鍵SubjectPublicKeyInfo形式に翻訳できず、getPublicKey() の戻り値が null になります。

ユーザーエージェントは、以下の COSEAlgorithmIdentifier 値を持つ場合に getPublicKey() に対して null でない値を返せる必要があります:

SubjectPublicKeyInfo は署名アルゴリズム(例えばどのハッシュ関数を使うか)に関する情報を含まないことがあります。これを提供するために、getPublicKeyAlgorithm() はクレデンシャル公開鍵の COSEAlgorithmIdentifier を返します。

多くのケースで CBOR をまったく解析する必要をなくすために、getAuthenticatorData()attestationObjectからauthenticator dataを返します。authenticator data にはバイナリ形式でエンコードされた他のフィールドが含まれますが、それらにアクセスするためのヘルパー関数は提供されていません。なぜなら、リライング・パーティは既にアサーションを取得する際にこれらのフィールドを抽出する必要があるためです。署名検証は認証要求時に常に行うべきであり、したがって署名されたauthenticator dataからフィールドを抽出する必要があります。そこに使われるのと同じ関数はクレデンシャル作成時にも役立ちます。

リライング・パーティは、これらの関数を使用する前に機能検出を行い、'getPublicKey' in AuthenticatorAttestationResponse.prototype の値をテストするべきです。

注: getPublicKey()getAuthenticatorData() はこの仕様のレベル2でのみ追加されました。これらの関数を必要とする リライング・パーティ は、古いユーザーエージェントと相互運用できない可能性があります。

5.2.2. Web 認証アサーション(インターフェース AuthenticatorAssertionResponse

このAuthenticatorAssertionResponse インターフェースは、クライアントが与えたリライング・パーティのチャレンジおよび(任意の)既知のクレデンシャル一覧に対して、新しい認証アサーションを生成するよう認証器に要求した際の応答を表します。この応答はクレデンシャル秘密鍵の保有を証明する暗号署名を含み、任意で特定のトランザクションに対するユーザー同意の証拠を含むことがあります。

[SecureContext, Exposed=Window]
interface AuthenticatorAssertionResponse : AuthenticatorResponse {
    [SameObject] readonly attribute ArrayBuffer      authenticatorData;
    [SameObject] readonly attribute ArrayBuffer      signature;
    [SameObject] readonly attribute ArrayBuffer?     userHandle;
};
clientDataJSON

この属性は AuthenticatorResponse から継承され、認証器がこのアサーションを生成するためにクライアントが認証器に渡したクライアントデータのJSON互換シリアライズを含みます(詳細は § 5.8.1 WebAuthn署名で使用されるクライアントデータ(辞書 CollectedClientData) を参照)。正確なJSONシリアライズは保持されなければならず、シリアライズされたクライアントデータのハッシュがその上で計算されているためです。

authenticatorData, 型は ArrayBuffer、読み取り専用

この属性は認証器から返されたauthenticator dataを含みます。詳しくは § 6.1 Authenticator Data を参照してください。

signature, 型は ArrayBuffer、読み取り専用

この属性は認証器から返された生の署名を含みます。詳しくは § 6.3.3 The authenticatorGetAssertion Operation を参照してください。

userHandle, 型は ArrayBuffer、読み取り専用、nullable

この属性は認証器から返されたユーザーハンドルを含むか、認証器がユーザーハンドルを返さなかった場合は null になります。詳しくは § 6.3.3 The authenticatorGetAssertion Operation を参照してください。allowCredentials オプションが認証式で空の場合、認証器は常にユーザーハンドルを返す必要があり、そうでなければ返してもよい (MAY) です。

5.3. クレデンシャル生成のパラメータ(辞書 PublicKeyCredentialParameters

dictionary PublicKeyCredentialParameters {
    required DOMString                    type;
    required COSEAlgorithmIdentifier      alg;
};
この辞書は新しいクレデンシャルを作成する際に追加のパラメータを供給するために使用されます。
type, 型は DOMString

このメンバは作成されるクレデンシャルの種類を指定します。値は PublicKeyCredentialType のメンバーであるべきですが、クライアントプラットフォームは未知の値を無視する必要があり、未知の PublicKeyCredentialParameterstype が未知の場合は無視します。

alg, 型は COSEAlgorithmIdentifier

このメンバは新しく生成されるクレデンシャルで使用される暗号署名アルゴリズム、すなわち生成される公開鍵ペアのタイプ(例:RSA や 楕円曲線)を指定します。

注:後者のメンバ名を "algorithm" と綴らずに "alg" としているのは、認証器へのメッセージにシリアライズされる際に低帯域のリンクを通る可能性があるためです。

5.4. クレデンシャル作成のオプション(辞書 PublicKeyCredentialCreationOptions

dictionary PublicKeyCredentialCreationOptions {
    required PublicKeyCredentialRpEntity         rp;
    required PublicKeyCredentialUserEntity       user;

    required BufferSource                             challenge;
    required sequence<PublicKeyCredentialParameters>  pubKeyCredParams;

    unsigned long                                timeout;
    sequence<PublicKeyCredentialDescriptor>      excludeCredentials = [];
    AuthenticatorSelectionCriteria               authenticatorSelection;
    sequence<DOMString>                          hints = [];
    DOMString                                    attestation = "none";
    sequence<DOMString>                          attestationFormats = [];
    AuthenticationExtensionsClientInputs         extensions;
};
rp, of type PublicKeyCredentialRpEntity

このメンバーは、リクエストに対して責任を負うリライイングパーティの名前と識別子を含みます。

その値のname メンバーは必須です。詳細は § 5.4.1 Public Key Entity Description (dictionary PublicKeyCredentialEntity) を参照してください。

その値のid メンバーは、資格情報がスコープされるべきRP IDを指定します。省略された場合、その値はCredentialsContainer オブジェクトの関連設定オブジェクトオリジン有効ドメインになります。詳細は § 5.4.2 Relying Party Parameters for Credential Generation (dictionary PublicKeyCredentialRpEntity) を参照してください。

user, of type PublicKeyCredentialUserEntity

このメンバーは、登録を行うユーザーアカウントの名前と識別子を含みます。

その値の namedisplayName および id メンバーは必須です。 id は、将来の 認証式userHandle として返される場合があり、 また、同じ rp.id および user.id を持つ既存の 検出可能な資格情報 を上書きするために使用されます。 namedisplayName は、将来の 認証式認証器クライアントによって ユーザーが資格情報を選択する際に利用される場合がありますが、将来の 認証式の結果としてRP には返されません。

詳細は § 5.4.1 Public Key Entity Description (dictionary PublicKeyCredentialEntity) および § 5.4.3 User Account Parameters for Credential Generation (dictionary PublicKeyCredentialUserEntity) を参照してください。

challenge, of type BufferSource

このメンバーは、新しく作成される資格情報のためのアテステーションオブジェクトを生成する際に、authenticatorが他のデータと共に署名するチャレンジを指定します。セキュリティ上の考慮事項は § 13.4.3 Cryptographic Challenges を参照してください。

pubKeyCredParams, of type sequence<PublicKeyCredentialParameters>

このメンバーは、リライイングパーティがサポートする鍵タイプと署名アルゴリズムを、最も好ましい順から最も好ましくない順に列挙します。重複は許容されますが実質的には無視されます。クライアントおよびauthenticatorは、可能な限り最も好まれるタイプの資格情報を作成するよう最善を尽くします。列挙されたどのタイプも作成できない場合、create() 操作は失敗します。

リライイングパーティ が多様なauthenticatorをサポートしたい場合、少なくとも次のCOSEAlgorithmIdentifier の値を含めるべきです:

  • -8 (EdDSA)

  • -7 (ES256)

  • -257 (RS256)

必要に応じて追加の署名アルゴリズムを含めることができます。

次に示す、COSEAlgorithmIdentifier による完全指定の値は、[RFC9864] によって導入されたもので、pubKeyCredParamsには推奨されません:

  • -9 (ESP256); 代わりに -7 (ES256) を使用するか、併用してください。

  • -51 (ESP384); 代わりに -35 (ES384) を使用するか、併用してください。

  • -52 (ESP512); 代わりに -36 (ES512) を使用するか、併用してください。

  • -19 (Ed25519); 代わりに -8 (EdDSA) を使用するか、併用してください。

注: WebAuthn 内では、値 -9 (ESP256)、-51 (ESP384)、-52 (ESP512) および -19 (Ed25519) は、それぞれ -7 (ES256)、-35 (ES384)、-36 (ES512) および -8 (EdDSA) と同じものを表します。これは § 5.8.5 Cryptographic Algorithm Identifier (typedef COSEAlgorithmIdentifier) に記載された追加の制約によるものです。しかし、多くの実装は後者の識別子をサポートするが前者をサポートしない場合があるため、実際には互換性がありません。したがって後者の識別子は互換性のためにpubKeyCredParams において推奨されます。

timeout, of type unsigned long

この任意のメンバーは、リライイングパーティが呼び出しの完了を待つ意志のある時間(ミリ秒)を指定します。これはヒントとして扱われ、クライアントによって上書きされることがあります。

excludeCredentials, of type sequence<PublicKeyCredentialDescriptor>, defaulting to []

リライイングパーティは、この任意のメンバーを使用して、この資格情報をそのユーザーアカウントにマップしている既存の資格情報(user.id により識別される)を列挙するべきです。これにより、新しい資格情報が既に同じauthenticator上にそのユーザーアカウントにマップされた資格情報を含んでいる場合に、該当する authenticator 上で作成されないようにします。その場合、クライアントは代わりにユーザーに別のauthenticatorの使用を促すか、それが失敗した場合はエラーを返すよう要求されます。

authenticatorSelection, of type AuthenticatorSelectionCriteria

リライイングパーティは、この任意のメンバーを使用して、authenticatorcreate() 操作に参加するために満たすべき必須または推奨の機能や設定を指定することができます。詳細は § 5.4.4 Authenticator Selection Criteria (dictionary AuthenticatorSelectionCriteria) を参照してください。

hints, of type sequence<DOMString>, defaulting to []

この任意のメンバーは、ユーザーエージェントがユーザーとやり取りする際の指針として用いるための、PublicKeyCredentialHint からのゼロ個以上の要素を含みます。要素は列挙型から取られますが型はDOMStringである点に注意してください。詳細は § 2.1.1 Enumerations as DOMString types を参照してください。

attestation, of type DOMString, defaulting to "none"

Relying Party は、このオプションメンバーを利用して attestation conveyance に関する希望を指定できる。 値は AttestationConveyancePreference のメンバーであるべきである。 Client platforms は未知の値を無視し、未知の値を そのメンバーが存在しない ものとして扱わなければならない。

デフォルト値は none です。

attestationFormats, of type sequence<DOMString>, defaulting to []

リライイングパーティは、この任意のメンバーを使用して、アテステーションステートメントのフォーマットに関する好みを指定することができます。値は [IANA-WebAuthn-Registries] にある "WebAuthn Attestation Statement Format Identifiers" 登録の項目から取るべきです。値は最も好ましい順から最も好ましくない順に並べられます。重複は許容されますが実質的には無視されます。このパラメータは助言的なものであり、authenticatorはこのパラメータに列挙されていないアテステーションステートメントを使用することがあります。

デフォルト値は空リストで、これは特に好みがないことを示します。

extensions, of type AuthenticationExtensionsClientInputs

リライイングパーティは、この任意のメンバーを使用して、クライアントおよびauthenticatorによる追加処理を要求するクライアント拡張入力(client extension inputs)を提供することができます。例えば、リライイングパーティはクライアントに対して作成された資格情報に関する追加情報を返すよう要求することができます。

拡張フレームワークは § 9 WebAuthn Extensions に定義されています。いくつかの拡張は § 10 Defined Extensions に定義されています;最新の登録済みのWebAuthn Extensionsの一覧については、[IANA-WebAuthn-Registries] を参照してください。

5.4.1. 公開鍵エンティティの説明(辞書 PublicKeyCredentialEntity

PublicKeyCredentialEntity 辞書は、ユーザーアカウントまたは WebAuthn リライングパーティを記述します。これは、公開鍵クレデンシャルが紐付けられている、または スコープされるものです。

dictionary PublicKeyCredentialEntity {
    required DOMString    name;
};
name, of type DOMString

エンティティの人間に読みやすい名前。このメンバーの機能は、PublicKeyCredentialEntity が何を表すかによって異なります:

  • [非推奨] PublicKeyCredentialRpEntity から継承される場合、表示用の人間に読みやすい識別子であり、例えば「ACME Corporation」、「Wonderful Widgets, Inc.」や「ОАО Примертех」のような表示を想定しています。

    多くのクライアントがこれを表示しないため、このメンバーは非推奨になっていますが、後方互換性のために辞書メンバーとしては必須のままです。リライイングパーティは、安全なデフォルトとしてこれをRP IDと同じ値に設定してもよいです。

    • リライイングパーティは、[RFC8266] のセクション2.3に記載された PRECIS FreeformClass の Nickname プロファイルの規定に従って、この name の値を設定するか、またはユーザーに表示する際に正規化と適切な扱いを行うべきです。

    • クライアントは、ユーザーに表示する前、または authenticatorMakeCredential 操作のパラメータとして含める前に、同じく [RFC8266] のセクション2.3に従った検証と正規化を実行するべきです。

  • PublicKeyCredentialUserEntity から継承される場合、人間に読みやすい識別子であり、ユーザーアカウントを示します。この識別子は、クライアントがユーザーに対して資格情報がどのユーザーアカウントに関連しているかを理解させるために主に表示する値です。

    この識別子の適切な例には "alexm", "+14255551234", "alex.mueller@example.com", "alex.mueller@example.com (prod-env)", または "alex.mueller@example.com (ОАО Примертех)" などがあります。

    • リライイングパーティは、この値をユーザーに選ばせることができます。リライイングパーティは、[RFC8265] のセクション3.4.3に記載された PRECIS IdentifierClass の UsernameCasePreserved プロファイルに従って、この name の値を設定するか、またはユーザーに表示する際に検証と正規化を行うべきです。

    • クライアントは、ユーザーに表示する前、または authenticatorMakeCredential 操作のパラメータとして含める前に、同じく [RFC8265] のセクション3.4.3に従った検証と正規化を実施するべきです。

クライアントクライアントプラットフォーム、または authenticatorsname の値を表示する場合、表示された値の周りに明確な境界を示す UI 要素を常に使用し、他の要素へオーバーフローしないようにすべきです [css-overflow-3]

name メンバーの値を保存する際、その値は § 6.4.1 String Truncation に記載されているように、64バイト以上のサイズ制限を用いて切り詰められてもよいです。

5.4.2. クレデンシャル生成時のリライングパーティのパラメーター(辞書 PublicKeyCredentialRpEntity

PublicKeyCredentialRpEntity 辞書は、新しい資格情報を作成する際に追加の リライイングパーティ 属性を提供するために使用されます。

dictionary PublicKeyCredentialRpEntity : PublicKeyCredentialEntity {
    DOMString      id;
};
id, の型は DOMString

リライイングパーティ エンティティの一意の識別子で、RP ID を設定します。

5.4.3. クレデンシャル生成時のユーザーアカウントパラメーター(辞書 PublicKeyCredentialUserEntity

PublicKeyCredentialUserEntity 辞書は、新しいユーザーアカウントの属性を追加で指定するために使われます。

dictionary PublicKeyCredentialUserEntity : PublicKeyCredentialEntity {
    required BufferSource   id;
    required DOMString      displayName;
};
id, of type BufferSource

ユーザーハンドルは、ユーザーアカウントのユーザーハンドルです。ユーザーハンドルは最大64バイトの不透明なバイト列であり、ユーザーに表示することを意図したものではありません。

安全な動作を確保するため、認証および認可の判断はこの id メンバーに基づいて行われなければならず、displayNamename メンバーに基づいて行ってはなりません。詳細は [RFC8266] のセクション6.1を参照してください。

ユーザーハンドルは、ユーザー名や電子メールアドレスなどのユーザーを特定可能にする個人情報を含んではなりません。詳細は § 14.6.1 User Handle Contents を参照してください。ユーザーハンドルは空にしてはなりません。

ユーザーハンドルは、非発見可能な資格情報の場合でも、異なるユーザーアカウント間で一定の値にしてはならないことが望ましいです。なぜなら、一部のauthenticatorは常に発見可能な資格情報を作成するためです。したがって一定のユーザーハンドルでは、当該authenticatorを同じリライイングパーティで複数のユーザーアカウントと共に使用することができなくなります。

displayName, of type DOMString

人間に読みやすい名前で、表示のためだけに使われるユーザーアカウントの名前です。リライイングパーティはユーザーにこの値を選ばせるべきであり、必要以上に選択を制限してはなりません。適切な人間に読みやすい名前が利用できない場合、リライイングパーティはこの値を空文字列に設定するべきです。

この識別子の適切な値の例には "Alex Müller", "Alex Müller (ACME Co.)" または "田中倫" などがあります。

  • リライイングパーティは、[RFC8266] のセクション2.3に記載された PRECIS FreeformClass の Nickname プロファイルに従って、displayName に非空の文字列を設定する場合、または非空の値をユーザーに表示する場合には整合性検査を行うべきです。

  • クライアントは、[RFC8266] のセクション2.3に従って、displayName の値を、ユーザーに非空の値を表示する前や、authenticatorMakeCredential 操作のパラメータとして非空の値を含める前に検査および正規化するべきです。

クライアントクライアントプラットフォーム、または authenticatordisplayName の値を表示する場合、表示された値の周囲に明確な境界を示す UI 要素を常に使用し、他の要素へのオーバーフローを許してはなりません [css-overflow-3]

displayName メンバーの値を保存する際、その値は § 6.4.1 String Truncation に記載されているように、64バイト以上のサイズ制限以上の値で切り詰められてもよいです。

5.4.4. 認証器選択基準(辞書 AuthenticatorSelectionCriteria

WebAuthn リライングパーティは、AuthenticatorSelectionCriteria辞書を利用して、認証器の属性に対する要件を指定することができます。

dictionary AuthenticatorSelectionCriteria {
    DOMString                    authenticatorAttachment;
    DOMString                    residentKey;
    boolean                      requireResidentKey = false;
    DOMString                    userVerification = "preferred";
};
authenticatorAttachment, of type DOMString

このメンバーが存在する場合、適格な authenticators は、指定された authenticator attachment modality で接続されているもののみに絞り込まれます(参照 § 6.2.1 Authenticator Attachment Modality)。このメンバーが存在しない場合は、いかなるアタッチメントモダリティも許容されます。 値は AuthenticatorAttachment のメンバーであるべきですが、client platforms は不明な値を無視し、不明な値を メンバーが存在しないかのように扱わなければなりません。

また、成功した create() または get() 操作でどの authenticator attachment modality が使われたかを示すことができる、authenticatorAttachment メンバーを持つ PublicKeyCredential も参照してください。

residentKey, of type DOMString

リライイングパーティがクライアント側発見可能な資格情報(client-side discoverable credential)をどの程度作成したいかを指定します。歴史的な理由により、名称には非推奨の “resident” 用語が残っています。値は ResidentKeyRequirement のメンバーであるべきですが、client platforms は不明な値を無視し、不明な値を メンバーが存在しないかのように扱わなければなりません。値が与えられない場合、required となるのは requireResidentKeytrue のときであり、discouraged となるのはそれが false または省略されたときです。

ResidentKeyRequirement を参照して、residentKey の値と意味を確認してください。

requireResidentKey, of type boolean, defaulting to false

このメンバーは WebAuthn Level 1 との後方互換のために残されており、歴史的理由から discoverable credentials に対する “resident” という非推奨の命名を保持しています。Relying Parties は、かつその場合に限り、residentKeyrequired に設定されているときにのみ、このメンバーを true に設定するべきです。

userVerification, of type DOMString, defaulting to "preferred"

このメンバーは、Relying Partycreate() 操作に対して要求する user verification に関する要件を指定します。 値は UserVerificationRequirement のメンバーであるべきですが、client platforms は不明な値を無視し、不明な値を メンバーが存在しないかのように扱わなければなりません。

UserVerificationRequirement を参照して、userVerification の値と意味を確認してください。

5.4.5. 認証器アタッチメント列挙型(enum AuthenticatorAttachment

この列挙型の値はauthenticatorsattachment modalitiesを説明します。 リライイングパーティは、authenticator attachment modalityの希望を、資格情報を作成するためにnavigator.credentials.create() を呼び出す際に表明するためにこれを使用し、クライアントは登録や認証セレモニーを完了するために使用されたauthenticator attachment modalityを報告するためにこれを使用します。

enum AuthenticatorAttachment {
    "platform",
    "cross-platform"
};

注: AuthenticatorAttachment 列挙は意図的に参照されていません。詳しくは § 2.1.1 Enumerations as DOMString types を参照してください。

platform

この値はplatform attachmentを示します。

cross-platform

この値はcross-platform attachmentを示します。

注: authenticator attachment modality の選択肢は、[[Create]](origin, options, sameOriginWithAncestors) 操作でのみ利用可能です。リライイングパーティは、例えば別のクライアントデバイスで認証するためのroaming credentialをユーザーが持っていることを確認したり、特定のクライアントデバイスで再認証を容易にするために明示的にplatform credentialを登録したりするためにこれを使用できます。[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) 操作にはauthenticator attachment modalityの選択肢はありません。クライアントおよびユーザーは、利用可能で便利な任意のcredentialを使用しますが、allowCredentials オプションの制約を受けます。

5.4.6. レジデントキー要件列挙型(enum ResidentKeyRequirement

enum ResidentKeyRequirement {
    "discouraged",
    "preferred",
    "required"
};

注: The ResidentKeyRequirement 列挙型は意図的に参照されていません。詳しくは § 2.1.1 Enumerations as DOMString types を参照してください。

この列挙型の値は、Relying Partyクライアント側発見可能な資格情報(以前は resident credentials または resident keys と呼ばれていた)に対して求める要件を記述します:

discouraged

Relying Partyサーバー側資格情報 の作成を好みますが、クライアント側発見可能な資格情報 を受け入れます。クライアントおよび authenticator は可能であれば サーバー側資格情報 を作成するべきです。

注: Relying Party は、作成された資格情報が サーバー側資格情報 であることを要求することはできず、Credential Properties Extensionrk プロパティの値を返さない場合があります。このため、資格情報がサーバー側資格情報かどうかを判別できないことがあり、同じ user handle を持つ 2 つ目の資格情報を作成すると最初のものが置換されるかどうかが分からない場合があります。

preferred

Relying Party はクライアント側発見可能な資格情報の作成を強く好みますが、サーバー側資格情報 も受け入れます。クライアントおよび authenticator は可能であれば 発見可能な資格情報 を作成するべきです。 例えば、クライアント は、発見可能な資格情報を作成するために ユーザー検証 の設定が必要な場合、ユーザーがその設定を行えるよう案内するべきです。これは userVerification の設定より優先されます。

required

Relying Partyクライアント側発見可能な資格情報 を要求します。クライアント は、クライアント側発見可能な資格情報を作成できない場合、エラーを返さなければなりません。

注: Relying Party は、Credential Properties Extensionresident key credential property を使用して、authenticator が クライアント側発見可能な資格情報 を作成したかどうかの情報を取得することができます。これは、discouragedpreferred の値が options.authenticatorSelection.residentKey に対して使用されている場合に有用です。なぜなら、そのような場合には authenticatorいずれか を作成する可能性があるからです—クライアント側発見可能な資格情報 または サーバー側資格情報

5.4.7. アテステーション伝達優先度列挙型(enum AttestationConveyancePreference

WebAuthn リライイングパーティは、資格情報生成時のアテステーション伝達に関する好みを指定するために、AttestationConveyancePreferenceを使用することがあります。

enum AttestationConveyancePreference {
    "none",
    "indirect",
    "direct",
    "enterprise"
};

Note: AttestationConveyancePreference 列挙型はあえて参照されていません。詳しくは § 2.1.1 Enumerations as DOMString types を参照してください。

none

Relying Partyauthenticatorattestation に関心がありません。例えば、user consent を取得して識別情報を Relying Party に送信する必要を回避したり、Attestation CAAnonymization CA への往復通信を省略するためです。 authenticatorattestation statement を生成し、それが self attestation でない場合、 client はそれを None の attestation statement に置き換えます。

これはデフォルトの動作であり、不明な値はこの値の振る舞いにフォールバックします。

indirect

Relying Party は検証可能な アテステーションステートメント を受け取りたいと望みますが、その取得方法は client に委ねます。クライアントは、ユーザーのプライバシーを保護するため、または異種のエコシステムで Relying Parties のアテステーション検証を助けるために、authenticator が生成した アテステーションステートメントAnonymization CA によって生成されたものに置き換えることがあります。

Note: この場合に Relying Party が必ずしも検証可能な アテステーションステートメント を取得できる保証はありません。たとえば、authenticator が self attestation を行い、client がその アテステーションステートメント を無修正で渡す場合などです。

direct

Relying Party は、authenticator によって生成されたとおりの アテステーションステートメント を受け取りたいと望みます。

enterprise

Relying Party は、企業向けアテステーション(enterprise attestation)を受け取りたいと考えています。これは認証器を一意に識別できる情報を含む場合がある アテステーションステートメント です。これは、組織が登録を特定の認証器に紐付けたい場合など、企業内での管理された配備を意図しています。ユーザーエージェントは、 要求されたRP ID に対してユーザーエージェントまたは認証器の設定が許可しない限り、そのようなアテステーションを提供してはなりません。

許可されている場合、ユーザーエージェントは 呼び出し時 に認証器へエンタープライズアテステーションが要求されていることを通知すべきであり、得られた AAGUIDアテステーションステートメント を改変せずに Relying Party に渡すべきです。

5.5. Assertion生成オプション(辞書 PublicKeyCredentialRequestOptions

PublicKeyCredentialRequestOptions 辞書はget() がアサーションを生成するのに必要なデータを提供します。 challenge メンバーは必須で、他のメンバーは省略可能です。

dictionary PublicKeyCredentialRequestOptions {
    required BufferSource                challenge;
    unsigned long                        timeout;
    DOMString                            rpId;
    sequence<PublicKeyCredentialDescriptor> allowCredentials = [];
    DOMString                            userVerification = "preferred";
    sequence<DOMString>                  hints = [];
    AuthenticationExtensionsClientInputs extensions;
};
challenge, of type BufferSource

このメンバーは、authenticator が、新しく生成する authentication assertion の作成時に、他のデータとともに署名するチャレンジを指定します。セキュリティ上の考慮事項については § 13.4.3 Cryptographic Challenges を参照してください。

timeout, of type unsigned long

この任意のメンバーは、Relying Party が呼び出しの完了を待つ意志のある時間(ミリ秒)を指定します。値はヒントとして扱われ、client によって上書きされることがあります。

rpId, of type DOMString

このオプションのメンバーは、RP IDを要求元Relying Partyが主張するものとして指定します。 クライアントは、Relying PartyオリジンがこのRP IDスコープと一致することを確認しなければなりません。 認証器は、 このRP IDrpIdと完全に一致することを、 認証式で使用される資格情報について確認しなければなりません。

指定されない場合、その値は CredentialsContainer オブジェクトの 関連設定オブジェクトorigineffective domain になります。

allowCredentials, of type sequence<PublicKeyCredentialDescriptor>, defaulting to []

この任意のメンバーは、client がこの authenticators の中から、この authentication ceremony に適格なものを見つけるために使用します。これは次の二つの方法で使用できます:

空でない場合(not empty)、リスト内のどの資格情報も使用できない場合は、クライアントはエラーを返さなければなりません。

リストは優先度の降順で並べられます:リストの最初の項目が最も優先され、最後の項目が最も優先度が低い資格情報です。

userVerification, of type DOMString, defaulting to "preferred"

このオプションのメンバーは、Relying Party による ユーザー認証 に関する要求を get() 操作に指定します。値は UserVerificationRequirement のメンバーであるべきですが、クライアントプラットフォーム は未知の値を無視し、未知の値を そのメンバーが存在しない かのように扱わなければなりません。条件を満たす認証器のみが対象としてフィルタされます。

UserVerificationRequirement を参照して、userVerification の値と意味を確認してください。

hints, of type sequence<DOMString>, defaulting to []

この任意のメンバーは、ユーザーエージェントがユーザーと対話する際の指針として用いるための、PublicKeyCredentialHint からのゼロ個以上の要素を含みます。要素はその列挙型から取られますが、型は DOMString である点に注意してください。詳しくは § 2.1.1 Enumerations as DOMString types を参照してください。

extensions, of type AuthenticationExtensionsClientInputs

Relying Party はこの任意のメンバーを使用して、client extension inputs を提供し、client および authenticator に追加処理を要求することができます。

拡張フレームワークは § 9 WebAuthn Extensions に定義されています。いくつかの拡張は § 10 Defined Extensions に定義されています;最新の登録済みの WebAuthn Extensions の一覧については、[IANA-WebAuthn-Registries] を参照してください。

5.6. AbortSignalによる操作の中断

開発者はAbortController を活用して、[[Create]](origin, options, sameOriginWithAncestors) および[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) 操作の管理を推奨します。 詳細はDOM § 3.3 AbortControllerとAbortSignalオブジェクトのAPI利用の記述を参照してください。

注: DOM § 3.3 AbortControllerとAbortSignalオブジェクトのAPI利用では、AbortControllerと統合しているWebプラットフォームAPIは、 AbortControllerAbortSignalabortされたら即座にpromiseを却下する必要がある旨が定められています。 [[Create]](origin, options, sameOriginWithAncestors) および [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) の継承・並列処理構造が複雑であるため 両APIのアルゴリズムでは[[Create]](origin, options, sameOriginWithAncestors) の場合、まず Credential Management 1 § 2.5.4 資格情報生成[[Create]](origin, options, sameOriginWithAncestors) 呼び出し直前、次に§ 5.1.3 新規資格情報生成認証器セッション開始直前、 そして最終的に認証器セッション中の三箇所でabortedプロパティを確認しています。 [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) も同様です。

5.7. WebAuthn拡張機能の入力と出力

以下の小節では、WebAuthn拡張機能の入力および出力を伝達するために使用されるデータ型について定義します。

注: 認証器拡張出力は、認証器データの一部として伝達されます(表1を参照)。

注: 以下で定義されている型(AuthenticationExtensionsClientInputs およびAuthenticationExtensionsClientOutputs)は、登録拡張認証拡張の両方に適用されます。 これらの名称内の "Authentication..." 部分は「WebAuthentication...」の意味と見なしてください。

5.7.1. 認証拡張 クライアント入力(辞書型 AuthenticationExtensionsClientInputs

dictionary AuthenticationExtensionsClientInputs {
};

これは、0個以上のWebAuthn拡張機能クライアント拡張入力値を含む辞書型です。

5.7.2. 認証拡張 クライアント出力(辞書型 AuthenticationExtensionsClientOutputs

dictionary AuthenticationExtensionsClientOutputs {
};

これは、0個以上のWebAuthn拡張機能クライアント拡張出力値を含む辞書型です。

5.7.3. 認証拡張 認証器入力(CDDL型 AuthenticationExtensionsAuthenticatorInputs

AuthenticationExtensionsAuthenticatorInputs = {
  * $$extensionInput
} .within { * tstr => any }

CDDLAuthenticationExtensionsAuthenticatorInputsは、0個以上のWebAuthn拡張機能認証器拡張入力値を含むCBORマップを定義します。 拡張機能は§ 9.3 拡張リクエストパラメーターで説明されているようにメンバーを追加できます。

この型はRelying Partyには公開されず、クライアントおよび認証器によって使用されます。

5.7.4. 認証拡張 認証器出力(CDDL型 AuthenticationExtensionsAuthenticatorOutputs

AuthenticationExtensionsAuthenticatorOutputs = {
  * $$extensionOutput
} .within { * tstr => any }

CDDLAuthenticationExtensionsAuthenticatorOutputsは、0個以上のWebAuthn拡張機能認証器拡張出力値を含むCBORマップを定義します。 拡張機能は§ 9.3 拡張リクエストパラメーターで説明されているようにメンバーを追加できます。

5.8. 補助データ構造

公開鍵資格情報型は、補助仕様で定義されているいくつかのデータ構造を使用します。 それらは次の通りです。

5.8.1. WebAuthn署名で使用されるクライアントデータ(辞書型 CollectedClientData

クライアントデータは、WebAuthn Relying Partyおよびクライアントの両方の文脈的結び付けを表します。これはキーが文字列であるキー・バリューのマッピングです。 値はJSONで有効なエンコーディングがあるいずれかの型とすることができます。その構造は以下のWebIDLで定義されます。

注: CollectedClientData は将来拡張される可能性があります。したがってパース時には未知のキーや任意のキー順序変化にも寛容であることが重要です。§ 5.8.1.2 制限付き検証アルゴリズムも併せて参照してください。

dictionary CollectedClientData {
    required DOMString           type;
    required DOMString           challenge;
    required DOMString           origin;
    boolean                      crossOrigin;
    DOMString                    topOrigin;
};

dictionary TokenBinding {
    required DOMString status;
    DOMString id;
};

enum TokenBindingStatus { "present", "supported" };
type, of type DOMString

このメンバーは新しい資格情報を作成するときは "webauthn.create"、既存の資格情報からアサーションを取得するときは "webauthn.get" という文字列を含みます。このメンバーの目的は、(攻撃者が正当な署名を別の署名とすり替える)特定の種類の署名混乱攻撃を防ぐことです。

challenge, of type DOMString

このメンバーはRelying Partyによって提供されたチャレンジのbase64urlエンコーディングを含みます。§ 13.4.3 暗号チャレンジのセキュリティ考慮事項を参照してください。

origin, of type DOMString

このメンバーは、クライアントから認証器へ提供される、リクエスターの完全修飾オリジン[RFC6454]で定義された構文で含みます。

crossOrigin, of type boolean

このオプションメンバーは、sameOriginWithAncestors引数値の逆論理値を含みます。 これは内部メソッドに渡される値です。

topOrigin, of type DOMString

このオプションメンバーは、リクエスターの完全修飾トップレベルオリジン[RFC6454]で定義された構文で含みます。 呼び出し元が先祖と同一オリジンでない場合、すなわちcrossOrigintrueの場合のみ設定されます。

[予約済] tokenBinding

このオプションメンバーは、Token Bindingプロトコルの状態情報を[TokenBinding]のもと、Relying Partyとの通信で使用された場合に含みます。省略されている場合はクライアントがトークンバインディングをサポートしていません。

注: Token BindingはWebAuthnレベル1・2で存在していましたが、レベル3での利用は想定されていません。tokenBindingフィールドは他目的での使いまわしを防ぐために予約されています。

status, of type DOMString

このメンバーはTokenBindingStatusのいずれかですが、クライアントプラットフォームは未知の値を無視し、それらをtokenBindingメンバーが存在しないものとして扱う必要があります。既知の場合、次のいずれかです:

supported

クライアントがトークンバインディングに対応しているが、Relying Partyとの通信時にネゴシエートされなかったことを示します。

present

トークンバインディングがRelying Partyとの通信で使用されたことを示します。この場合、idメンバーが必須です。

注: TokenBindingStatus列挙は意図的に参照されていません。§ 2.1.1 DOMString型としての列挙型を参照。

id, of type DOMString

このメンバーは、statuspresent の場合は必ず存在しなければならず、base64url エンコーディングであり、Token Binding IDリライイングパーティ と通信する際に使用されたものでなければなりません。

注: Token Binding IDの取得はクライアントプラットフォーム固有の操作です。

CollectedClientData構造は、クライアントによって次の値を計算するために使用されます:

クライアントデータのJSON互換シリアライズ

これは、CollectedClientData辞書に対してJSON互換シリアル化アルゴリズムを実行した結果です。

シリアライズされたクライアントデータのハッシュ

これは、クライアントが構築したクライアントデータのJSON互換シリアライズに対してSHA-256で計算されたハッシュ値です。

5.8.1.1. シリアライズ

CollectedClientDataのシリアライズは、JSON値をバイト列にシリアライズするアルゴリズムの部分集合です。すなわち、CollectedClientDataの有効なJSONエンコーディングを生成しますが、検証者が完全なJSONパーサを用いなくても済むように追加の構造も提供します。検証者は標準的なJSONパースを推奨されますが、完全なパーサが大きすぎる場合はより限定的なアルゴリズムを用いることもできます。この検証アルゴリズムでは、base64urlエンコーディング、バイト列の連結(固定テンプレートへの書き込みで実装可)、単純な条件分岐のみが必要です(入力値がエスケープを要しないと仮定)。

シリアライズアルゴリズムは空の部分結果バイト列から始め、順にバイト文字列を追加して最終結果を得ます。

  1. resultを空のバイト列とする。

  2. resultに0x7b2274797065223a({"type":)を追加する。

  3. CCDToString(type) をresultへ追加する。

  4. resultに0x2c226368616c6c656e6765223a(,"challenge":)を追加する。

  5. CCDToString(challenge) をresultへ追加する。

  6. resultに0x2c226f726967696e223a(,"origin":)を追加する。

  7. CCDToString(origin) をresultへ追加する。

  8. resultに0x2c2263726f73734f726967696e223a(,"crossOrigin":)を追加する。

  9. もしcrossOrigin が存在しないか、またはfalseの場合:

    1. 0x66616c7365(false)をresultへ追加する。

  10. そうでなければ:

    1. 0x74727565(true)をresultへ追加する。

  11. もしtopOrigin が存在する場合:

    1. 0x2c22746f704f726967696e223a(,"topOrigin":)をresultへ追加する。

    2. CCDToString(topOrigin) をresultへ追加する。

  12. CollectedClientDataの一時コピーを作成し、typechallengeorigincrossOrigin (存在すれば)、topOrigin (存在すれば)を削除する。

  13. 一時コピーにフィールドが一つも残っていない場合:

    1. 0x7d(})をresultへ追加する。

  14. そうでなければ:

    1. 一時コピーをJSONとしてバイト列にシリアライズし、バイト列remainderを得る。

    2. 0x2c(,)をresultへ追加する。

    3. remainderの先頭バイトを除去する。

    4. remainderresultへ追加する。

  15. シリアライズ結果はresultの値である。

CCDToString関数は上記アルゴリズムで使用され、次のように定義されます:

  1. encodedを空のバイト列とする。

  2. 0x22(")をencodedへ追加する。

  3. 与えられたオブジェクトにToStringを適用し文字列に変換する。

  4. 得られた文字列の各コードポイントについて、以下を判定:

    {U+0020, U+0021, U+0023–U+005B, U+005D–U+10FFFF}に含まれる場合

    そのコードポイントのUTF-8エンコーディングをencodedへ追加する。

    U+0022の場合

    0x5c22(\")をencodedへ追加する。

    U+005Cの場合

    0x5c5c(\\)をencodedへ追加する。

    その他

    0x5c75(\u)をencodedへ追加し、さらに下位の16進4桁小文字で表されるコードポイント値を追加。

  5. 0x22(")をencodedへ追加する。

  6. この関数の戻り値はencodedの値である。

5.8.1.2. 制限付き検証アルゴリズム

検証者は、完全なJSONパーサが利用できない場合、エンコードされたCollectedClientDataを下記アルゴリズムで検証できます:

  1. このアルゴリズムへの入力は次の通り:

    1. バイト列clientDataJSONclientDataJSON、すなわち検証すべきシリアライズされたCollectedClientData

    2. 文字列type。期待されるtype

    3. バイト列challengePublicKeyCredentialRequestOptions またはPublicKeyCredentialCreationOptions で与えられたチャレンジバイト列。

    4. 文字列origin。リクエストを発行した期待されるorigin

    5. オプションの文字列topOrigin。利用可能な場合、期待されるtopOrigin

    6. ブール値requireTopOrigintopOriginが定義されていてtopOrigin 属性がclientDataJSONに存在しないとき、検証を失敗すべき場合true

      この意味するところは、requireTopOriginfalseの時、検証アルゴリズムはWeb Authentication Level 2のJSON互換シリアル化アルゴリズムとも互換性を持つということです。

  2. expectedを空のバイト列とする。

  3. 0x7b2274797065223a({"type":)をexpectedへ追加。

  4. CCDToString(type)をexpectedへ追加。

  5. 0x2c226368616c6c656e6765223a(,"challenge":)をexpectedへ追加。

  6. challengebase64urlエンコーディングを施して文字列challengeBase64を得る。

  7. CCDToString(challengeBase64)をexpectedへ追加。

  8. 0x2c226f726967696e223a(,"origin":)をexpectedへ追加。

  9. CCDToString(origin)をexpectedへ追加。

  10. 0x2c2263726f73734f726967696e223a(,"crossOrigin":)をexpectedへ追加。

  11. もしtopOriginが定義されている場合:

    1. 0x74727565(true)をexpectedへ追加。

    2. もしrequireTopOriginがtrue または 0x2c22746f704f726967696e223a(,"topOrigin":)がclientDataJSONの先頭expected長の部分列の接頭辞の場合:

      1. 0x2c22746f704f726967696e223a(,"topOrigin":)をexpectedへ追加。

      2. CCDToString(topOrigin)をexpectedへ追加。

  12. それ以外、すなわちtopOriginが未定義:

    1. 0x66616c7365(false)をexpectedへ追加。

  13. もしexpectedclientDataJSONの接頭辞でなければ検証失敗。

  14. clientDataJSONexpectedより1バイト以上長くなければ検証失敗。

  15. expectedの長さ位置にあるclientDataJSONのバイトが:

    0x7d の場合

    検証成功。

    0x2c の場合

    検証成功。

    それ以外

    検証失敗。

5.8.1.3. 将来の発展

制限付き検証アルゴリズムとの互換性を維持するため、将来の本仕様バージョンでは、typechallengeorigincrossOrigintopOrigin のいずれもCollectedClientData から削除してはならない。またシリアル化アルゴリズムも、これらフィールドのシリアライズ順序を変更したり、それらの間に新しいフィールドを挿入してはならない。

もしCollectedClientData に追加フィールドが加えられた場合、制限付き検証アルゴリズムを使う検証者は、それらに対応できません。 アルゴリズムが更新されることで新しいフィールドも同じ制約を受けることになります。 このアルゴリズム更新では、旧バージョンのシリアライズも考慮する必要があります。すなわち、6つ目以降のフィールドは旧バージョンのユーザーエージェントによってシリアライズされないかもしれません。

5.8.2. クレデンシャル型の列挙(enum PublicKeyCredentialType

enum PublicKeyCredentialType {
    "public-key"
};

注: PublicKeyCredentialType の列挙は意図的に参照されていません。§ 2.1.1 DOMString型としての列挙を参照してください。

この列挙は有効なクレデンシャル型を定義します。拡張ポイントとなっており、今後さらに定義されれば値が追加されうるものです。この列挙の値は、認証器の型ごとにAuthentication Assertionや証明(attestation)構造のバージョン管理に用いられます。

現在定義されているクレデンシャル型は「public-key」のみです。

5.8.3. クレデンシャル記述子(辞書型 PublicKeyCredentialDescriptor

dictionary PublicKeyCredentialDescriptor {
    required DOMString                    type;
    required BufferSource                 id;
    sequence<DOMString>                   transports;
};

この辞書型は、特定の公開鍵クレデンシャルを識別します。 create() で同じ認証器上に重複クレデンシャルが作られるのを防ぐためや、 get() でクライアントがそのクレデンシャルに到達できるかどうか・どのように到達できるかを判定するために使われます。

資格情報レコードのためのクレデンシャル記述子は、その資格情報レコードのプロパティのサブセットであり、 PublicKeyCredential オブジェクト(create()get() で返される)の一部フィールドを反映しています。

type, of type DOMString

このメンバーは、呼び出し元が参照しているpublic key credential の型を含みます。 値は PublicKeyCredentialType のメンバーであるべきですが、クライアントプラットフォームは不明な PublicKeyCredentialDescriptor を含むものを無視しなければなりません。 しかし、もし不明な type のためにすべての要素が無視される場合、それは空の allowCredentials が意味的に異なるため、エラーを生じさせなければなりません。

これは、識別された public key credential source を表す credential recordtype 項の値に設定されるべきです。 これは type フィールドの PublicKeyCredential と対応します。

id, of type BufferSource

このメンバーは、呼び出し元が参照しているpublic key credentialcredential ID を含みます。

これは、識別された public key credential source を表す credential recordid 項の値に設定されるべきです。 これは rawId フィールドの PublicKeyCredential と対応します。

transports, of type sequence<DOMString>

この任意のメンバーは、呼び出し元が参照している public key credential の管理 authenticator とクライアントがどのように通信するかについてのヒントを含みます。 値は AuthenticatorTransport のメンバーであるべきですが、クライアントプラットフォームは不明な値を無視しなければなりません。

これは、識別された public key credential source を表す credential recordtransports 項の値に設定されるべきです。 これは、response.getTransports() メソッドと対応しており、PublicKeyCredential 構造が create() 操作によって作成されたときに得られるものです。

5.8.4. 認証器トランスポートの列挙(enum AuthenticatorTransport

enum AuthenticatorTransport {
    "usb",
    "nfc",
    "ble",
    "smart-card",
    "hybrid",
    "internal"
};

注: The AuthenticatorTransport enumeration is deliberately not referenced, see § 2.1.1 Enumerations as DOMString types.

Authenticatorstransports を通じて clients と通信するためのさまざまな実装を持つ場合があります。This enumeration は、特定の資格情報に対するアサーションを取得するためにクライアントが特定の認証器とどのように通信するかについてのヒントを定義します。これらのヒントは、認証器に到達する方法についてのWebAuthn Relying Party の最良の推測を表すことに注意してください。Relying Party は通常、 getTransports() を介して public key credential のサポートされている transports を学習します。
usb

それぞれの authenticator が着脱可能な USB 経由で接続できることを示します。

nfc

それぞれの authenticator が Near Field Communication (NFC) を介して接続できることを示します。

ble

それぞれの authenticator が Bluetooth Smart(Bluetooth Low Energy / BLE)を介して接続できることを示します。

smart-card

それぞれの authenticator が接点付きの ISO/IEC 7816 スマートカード経由で接続できることを示します。

hybrid

それぞれの authenticator が、(多くの場合別々の)データ伝送手段と近接手段の組み合わせを用いて接続できることを示します。例えば、スマートフォンを使用してデスクトップコンピュータ上で認証を行う場合などをサポートします。

internal

それぞれの authenticatorclient device 固有のトランスポートを使用して接続されることを示します。つまり、これは platform authenticator です。これらの認証器は client device から取り外すことはできません。

5.8.5. Cryptographic Algorithm Identifier (typedef COSEAlgorithmIdentifier)

typedef long COSEAlgorithmIdentifier;
COSEAlgorithmIdentifier の値は、暗号アルゴリズムを識別する数値です。 アルゴリズム識別子は、例えば "ES256" に対する -7 や "RS256" に対する -257 のように、IANA COSE Algorithms レジストリに登録された値であることが推奨されます([IANA-COSE-ALGS-REG])。

COSE アルゴリズムレジストリは、COSE key におけるその他のパラメータで指定される自由度を残しています。相互運用性を促進するために、本仕様は credential public keys に対して次の追加的な保証を行います:

  1. アルゴリズムが -7 (ES256) の鍵は、crv パラメータとして必ず 1 (P-256) を指定し、圧縮された点形式を使用してはなりません。

  2. アルゴリズムが -9 (ESP256) の鍵は、圧縮された点形式を使用してはなりません。

  3. アルゴリズムが -35 (ES384) の鍵は、crv パラメータとして必ず 2 (P-384) を指定し、圧縮された点形式を使用してはなりません。

  4. アルゴリズムが -51 (ESP384) の鍵は、圧縮された点形式を使用してはなりません。

  5. アルゴリズムが -36 (ES512) の鍵は、crv パラメータとして必ず 3 (P-521) を指定し、圧縮された点形式を使用してはなりません。

  6. アルゴリズムが -52 (ESP512) の鍵は、圧縮された点形式を使用してはなりません。

  7. アルゴリズムが -8 (EdDSA) の鍵は、crv パラメータとして必ず 6 (Ed25519) を指定しなければなりません。(これらは COSE では常に圧縮形式を使用します。)

これらの制約は、Section 2.1 の推奨と整合します([RFC9053])。

注: これらのアルゴリズムを正しく実装して署名検証を行うためには多くのチェックが必要です。そのうちの一つは、非圧縮の楕円曲線点を処理する際に、その点が実際に曲線上にあるかどうかを実装が検査するべき、という点です。このチェックは、暗号ライブラリとその他のコードの間で見落とされやすいと判断されるため、特に強調されています。

5.8.6. ユーザー検証要件の列挙(enum UserVerificationRequirement

enum UserVerificationRequirement {
    "required",
    "preferred",
    "discouraged"
};

WebAuthnリライングパーティは、操作によってはユーザー検証を要求することも、そうでないこともあり、この型によってその要求を表現できます。

注: UserVerificationRequirement の列挙は意図的に参照されていません。§ 2.1.1 DOMString型としての列挙を参照してください。

required

Relying Partyは、この操作にユーザー検証を要求し、応答にUV フラグが設定されていない場合、全体のセレモニーが失敗します。クライアントユーザー検証が実施できない場合、必ずエラーを返さなければなりません。

preferred

Relying Partyは、可能であればこの操作にユーザー検証を希望しますが、応答にUV フラグが設定されていなくても操作は失敗しません。

discouraged

Relying Partyは、この操作中にユーザー検証を実施してほしくありません(例:ユーザーの操作フローをなるべく妨げないため)。

5.8.7. クライアント機能の列挙(enum ClientCapability

enum ClientCapability {
    "conditionalCreate",
    "conditionalGet",
    "hybridTransport",
    "passkeyPlatformAuthenticator",
    "userVerifyingPlatformAuthenticator",
    "relatedOrigins",
    "signalAllAcceptedCredentials",
    "signalCurrentUserDetails",
    "signalUnknownCredential"
};

この列挙は、WebAuthnリライングパーティが特定のワークフローやユーザー体験を提供する際に参照できる、限定的なクライアント機能のセットを定義します。

リライングパーティgetClientCapabilities() メソッド(PublicKeyCredential )を用いて利用可能な機能の記述を取得できます。

注: ClientCapability の列挙は意図的に参照されていません。§ 2.1.1 DOMString型としての列挙を参照してください。

conditionalCreate

WebAuthnクライアントは、conditional メディエーションを登録式において行うことができます。

詳細は§ 5.1.3 新しい認証情報を作成する - PublicKeyCredentialの [[Create]](origin, options, sameOriginWithAncestors) 内部メソッドをご覧ください。

conditionalGet

WebAuthnクライアントは、conditional メディエーションを認証式において行うことができます。

この機能は、isConditionalMediationAvailable()trueを返す場合と同等です。

詳細は§ 5.1.4 既存の認証情報を用いた認証をご覧ください。

hybridTransport

WebAuthnクライアントhybrid トランスポートの利用をサポートします。

passkeyPlatformAuthenticator

WebAuthnクライアントは、パスキー プラットフォーム認証器のローカルおよび/またはhybrid トランスポート経由での利用をサポートします。

userVerifyingPlatformAuthenticator

WebAuthnクライアントは、ユーザ検証付きプラットフォーム認証器の利用をサポートします。

relatedOrigins

WebAuthnクライアントは、関連オリジンリクエストをサポートします。

signalAllAcceptedCredentials

WebAuthnクライアントsignalAllAcceptedCredentials() をサポートします。

signalCurrentUserDetails,

WebAuthnクライアントsignalCurrentUserDetails() をサポートします。

signalUnknownCredential

WebAuthnクライアントsignalUnknownCredential() をサポートします。

5.8.8. ユーザーエージェントヒントの列挙(enum PublicKeyCredentialHint

enum PublicKeyCredentialHint {
    "security-key",
    "client-device",
    "hybrid",
};

注記: PublicKeyCredentialHint 列挙型は意図的に参照されません。§ 2.1.1 列挙型をDOMString型として使用するを参照してください。

WebAuthn Relying Partiesは、この列挙体を使用して、リクエストが最適に完了される方法についてユーザーエージェントにヒントを伝えることができる。これらのヒントは要件ではなくユーザーエージェントを拘束するものではないが、Relying Partyがリクエストについて持つ文脈情報を用いて最適な体験を提供するための指針となり得る。ヒントは優先度の高い順に提供されるため、2つのヒントが矛盾する場合は最初のものが優先される。ヒントが重複することもあるが、より具体的なヒントが定義されている場合、Relying Partyは、より具体的なものを認識できないユーザーエージェント向けに、より抽象的なヒントも送信することが望ましい。その場合、より具体的なヒントを抽象的なものより前に送信すること。 同じヒントが複数回現れた場合、2回目以降は無視される。

ヒントが認証情報のtransportsauthenticatorAttachmentに含まれる情報と矛盾する場合があります。 その場合はヒントが優先されます。(なお、transportsの値はディスカバラブルクレデンシャルを使用する場合には提供されないため、そのようなリクエストの一部の側面を表現する唯一の方法としてヒントが使われます。)

security-key

Relying Partyが、物理的なセキュリティキーでこのリクエストを満たすことをユーザーが想定していることを示します。たとえば、企業のRelying Partyが、自社発行のセキュリティキーだけを認証器として登録認証に受け入れる場合、このヒントを設定することがあります。

古いユーザーエージェントとの互換性のために、このヒントをPublicKeyCredentialCreationOptionsで使用する場合は、 authenticatorAttachmentcross-platformに設定する必要があります。

client-device

Relying Partyが、プラットフォーム認証器がクライアントデバイスに接続されていて、このリクエストを満たすことをユーザーが想定していることを示します。

古いユーザーエージェントとの互換性のために、このヒントをPublicKeyCredentialCreationOptionsで使用する場合は、 authenticatorAttachmentplatformに設定する必要があります。

hybrid

Relying Party が、ユーザーがスマートフォンなどの汎用的な authenticator でこのリクエストを満たすと考えていることを示します。例えば、一般消費者向けの Relying Party は、専用のセキュリティキーを所有している顧客が少数と考える場合があります。このオプションは、ローカルの platform authenticator がUIで推奨されないことも意味します。

古いユーザーエージェントとの互換性のために、このヒントをPublicKeyCredentialCreationOptionsで使用する場合は、 authenticatorAttachmentcross-platformに設定する必要があります。

5.9. Permissions Policy統合

この仕様書は、以下の feature-identifier トークン "publickey-credentials-create" および "publickey-credentials-get" で識別される2つのポリシー制御機能を定義します。両者のデフォルト許可リストはどちらも 'self' です。[Permissions-Policy]

Documentパーミッションポリシーは、そのドキュメント内のいかなるコンテンツが 正常に呼び出すことが許可されているかどうかを決定します。Web Authentication API、すなわち navigator.credentials.create({publicKey:..., ...}) または navigator.credentials.get({publicKey:..., ...}) を通じての利用が該当します。 いずれかのドキュメントで無効化されている場合、そのドキュメント内のどのコンテンツも上記のメソッドを利用することは許可されません。 この操作を試みるとエラーが返されます

注: [CREDENTIAL-MANAGEMENT-1]で指定されたアルゴリズムが、実際の permissions policy 評価を行います。これは、そのようなポリシー評価は current settings object へのアクセスがあるときに行う必要があるためです。[[Create]](origin, options, sameOriginWithAncestors) および [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)internal methods は、そのようなアクセス権を持ちません。なぜならこれらは in parallelCredentialsContainerCreate a Credential および Request a Credential 抽象操作によって呼び出されるためです [CREDENTIAL-MANAGEMENT-1].

5.10. iframe要素内でのWeb Authenticationの利用

Web Authentication APIはデフォルトでクロスオリジンの iframeでは無効化されています。 このデフォルトポリシーを上書きし、クロスオリジンの iframeWeb Authentication API[[Create]](origin, options, sameOriginWithAncestors)[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) メソッドの呼出しを許可するには、 allow 属性を iframe 要素に指定して、 publickey-credentials-create または publickey-credentials-get のfeature-identifierトークンを allow 属性値にそれぞれ含めてください。

Relying Partyが埋め込みコンテキストでWebAuthn APIを利用する場合は、§ 13.4.2 埋め込み利用における可視性の考慮事項で記載されているUIレドレッシングとその対策について確認してください。

デフォルトでは、Web認証はRP IDオリジン有効ドメインと同じ、もしくは登録可能なドメインのサフィックスである必要があります。

このため、複数の国別ドメイン(例: example.comとexample.co.ukやexample.sg)、ブランドドメインや代替ドメイン(例: myexampletravel.comとexamplecruises.com)、PaaSによるモバイルアプリのサポート時など大規模環境でのデプロイメントが困難になる場合があります。

WebAuthn Relying Partyは、WebAuthn Clientに対して、関連した限定されたオリジンで証明書を作成・利用することを許す機能を有効化する選択ができます。 このようなRelying Partyは、関連するオリジンすべてで共通のRP IDを選択して用いなければなりません。

JSONドキュメントは、webauthnのウェルノウンURL[RFC8615]上にRP ID単位でホストされ、HTTPSで配信されなければなりません。JSONドキュメントは、 以下の要件を満たして返される必要があります:

例えば、RP IDがexample.comの場合:

{
    "origins": [
        "https://example.co.uk",
        "https://example.de",
        "https://example.sg",
        "https://example.net",
        "https://exampledelivery.com",
        "https://exampledelivery.co.uk",
        "https://exampledelivery.de",
        "https://exampledelivery.sg",
        "https://myexamplerewards.com",
        "https://examplecars.com"
    ]
}

この機能をサポートするWebAuthn Clientは、少なくとも5つの登録可能オリジンラベルをサポートしなければなりません。クライアントのポリシーでは悪用防止のため上限値を定義すべきです。

WebAuthn Clientからこのウェルノウンエンドポイントへのリクエストは、クレデンシャルなし、リファラーなし、 https:スキームを使って行わなければなりません。リダイレクトを追従する場合は、WebAuthn Clientはすべてのリダイレクトが同様にhttps: スキームであることを明示的に要求しなければなりません。

この機能をサポートするWebAuthn Clientは、relatedOriginsgetClientCapabilities()のレスポンスに含めるべきです。

5.11.1. 関連オリジンの検証

関連オリジン検証手続きは、引数callerOriginrpIdRequestedを受けて、次の通りです:

  1. クライアントポリシーで許可される登録可能オリジンラベルの最大数をmaxLabelsとする。

  2. RP IDrpIdRequestedwebauthnウェルノウンURL[RFC8615](例:https://rpIdRequested/.well-known/webauthn)を、クレデンシャルなし、リファラーなし、https:スキームで取得する。

    1. フェッチに失敗した場合、レスポンスのコンテンツタイプがapplication/jsonでない場合、またはリダイレクト後のステータスコードが200でない場合は、"SecurityError" DOMExceptionをthrowする。

    2. リソース本文が有効なJSONオブジェクトでない場合、"SecurityError" DOMExceptionをthrowする。

    3. JSONオブジェクトのoriginsプロパティの値が欠落している、または文字列の配列でない場合、"SecurityError" DOMExceptionをthrowする。

  3. labelsSeenを新しい空のセットとする。

  4. originsoriginItemについて:

    1. originItemを入力としてURLパーサーを実行した結果をurlとする。失敗した場合は続行

    2. url有効ドメインdomainとする。nullの場合は続行

    3. domain登録可能オリジンラベルlabelとする。

    4. labelが空またはnullの場合は続行

    5. labelsSeenサイズmaxLabels以上かつlabelsSeenlabelを含まない場合、続行

    6. callerOriginurlsame originの場合、trueを返す。

    7. labelsSeenサイズmaxLabels未満の場合、labelsSeenlabelを追加する。

  5. falseを返す。

6. WebAuthn 認証器モデル

Web認証APIは、WebAuthn認証器のための特定の抽象的な機能モデルを想定しています。このセクションではその認証器モデルについて説明します。

クライアントプラットフォームは、この抽象モデルを任意の方法で実装・公開してもかまいません。しかし、クライアントのWeb認証API実装の挙動は、そのクライアントプラットフォームがサポートする認証器に対して動作する際、§ 5 Web認証APIで指定された動作と区別できないものでなければなりません。

注: [FIDO-CTAP]はこのモデルの具体的実装例のひとつですが、これは返却されるデータとWebAuthn APIのアルゴリズムで期待されるものに違いがあります。CTAP2のレスポンスメッセージは、同じオブジェクト用に本仕様で定義された文字列キーではなく整数キーを使って構築されたCBORマップです。クライアントは、そのようなデータに必要な変換処理を行うことが期待されます。[FIDO-CTAP]仕様では、セクション§6. Authenticator APIでCTAP2の整数キーとWebAuthnの文字列キーの対応関係が記載されています。

認証器については、このモデルは認証器がサポートすべき論理操作と、クライアントおよびWebAuthn Relying Partyに公開するデータ形式を定義します。ただし、認証器がクライアントデバイスとどう通信するかの詳細は、Relying Partyとの相互運用性に必要な場合を除き定義しません。たとえば、この抽象モデルはUSBやNFCなどのトランスポート経由で認証器とクライアントを接続するためのプロトコルは定義しません。同様に、この抽象モデルは特定のエラーコードやその返却方法を定義しませんが、クライアントの要求に基づいてエラー動作の定義は行います。そのため、特定のエラーコードがどのエラー状態を区別する必要があるか(あるいは区別しなくてもよいか)を示す手段として言及され、準拠した安全なクライアント実装に必要な区別ができる設計となっています。

Relying Parties は、必要と判断した場合、資格情報の作成アサーションの生成の際に、さまざまな認証器の特性を規定することで、認証器の選択に影響を与えることができます。これらはそれぞれ 資格情報作成オプション または アサーション生成オプション を用いることで実現します。 WebAuthn API を構成するアルゴリズムはこれらのオプションを取りまとめ、下記で定義される適用可能な 認証器操作 に渡します。

この抽象モデルにおいて、認証器は鍵管理と暗号署名を提供します。認証器はWebAuthnクライアントに組み込むことも、完全に別デバイスとして存在させることもできます。認証器自体は、認証器本体より高いセキュリティレベルで動作する暗号モジュールを内蔵する場合があります。これはWebAuthnクライアント内蔵型認証器の場合とくに重要で、その場合暗号モジュール(たとえばTPM)は認証器本体より信頼性が高い存在とみなされる可能性もあります。

各認証器は、(rpId, userHandle)から公開鍵クレデンシャルソースへのマップであるcredentials mapを記憶します。

さらに、各認証器は認証器アテステーショングローバル一意識別子、またはAAGUIDという128ビットの識別子を持ちます。これは認証器の種別(メーカー・モデル等)を示します。AAGUIDはメーカーによって決定され、そのメーカーが製造する本質的に同一の認証器であれば全て同じAAGUIDを持ち、他の認証器種別とは高い確率で異なる値となるようにしなければなりません。認証器種別ごとにユニークさを確保するため、AAGUIDは無作為に生成すべきです。Relying Partyは、AAGUIDを使って、他の情報源から得た認証器の認証レベルや鍵保護強度などの特性を推定してもかまいません。また、Relying Partyはアテステーションの要求・検証なしで認証器製造元の特定を試みるためにAAGUIDを利用してもかまいませんが、AAGUID自体はアテステーションがなければ真正性は保証されません。

認証器の主な機能は、さまざまな文脈データにバインドされたWebAuthn署名の提供です。これらのデータは、署名要求がサーバーから認証器に渡る過程のさまざまなレイヤーで観測・追加されます。サーバーが署名を検証する際は、これらのバインディングと期待値とを照合します。文脈バインディングは次の2つに分けられます。Relying Partyまたはクライアントによって追加されるclient data、および認証器によって追加されるauthenticator dataです。認証器はclient dataの内容には関知せず、そのハッシュ値のみ署名します。通信帯域や認証器の処理負荷を削減するため、クライアントはclient dataをハッシュ化し、その結果のみ認証器に送ります。認証器はシリアライズ済みclient dataのハッシュと自身のauthenticator dataの組み合わせに対して署名を行います。

この設計の目標は次の通りまとめられます。

認証器は2つの異なる目的のために暗号署名を生成します:

  1. 新しい公開鍵クレデンシャルauthenticatorMakeCredential操作によって作成される際に、attestation signature(アテステーション署名)が生成されます。アテステーション署名は、認証器およびクレデンシャルに関する特定の属性の暗号的証明を提供します。例えば、アテステーション署名はAAGUIDで示される認証器種別やクレデンシャル公開鍵等を証明します。アテステーション署名は、希望するアテステーション種別に応じて選ばれたアテステーション秘密鍵で署名されます。アテステーションの詳細は§ 6.5 アテステーションを参照してください。

  2. authenticatorGetAssertionメソッドが呼び出された際には、assertion signature(アサーション署名)が生成されます。これは、認証器がユーザーによる特定の取引(ログインや購入完了など)への同意を主張するためのものです。したがって、アサーション署名は、その認証器が特定のクレデンシャル秘密鍵で署名を行い、この取引を要求したユーザーが、そのクレデンシャルを作成した際に同意した同一人物であることを可能な限り確認したことを主張します。さらに、client dataと呼ばれる追加情報(ユーザー同意の取得方法や認証器がユーザーに表示したプロンプトなど)も主張します。アサーション署名の形式は下記の図4に示します。

WebAuthn署名とは、アテステーション署名アサーション署名の両方を指します。これらの署名の形式と生成プロシージャは以下で規定されます。

6.1. 認証器データ

authenticator data構造体は認証器によって行われた文脈バインディングを符号化します。これらのバインディングは認証器自身が制御し、認証器のセキュリティ特性についてWebAuthn Relying Partyの判断によって信頼が決定されます。一方では認証器がクライアントに組み込まれており、バインディングの信頼性がclient dataと同程度である場合もあります。他方では、高度なセキュリティハードウェアとソフトウェアを備えた独立した認証器が安全なチャネル経由でクライアントに接続されている場合もあります。いずれの場合もRelying Partyauthenticator dataを同じ形式で受け取り、認証器の知識に基づいて信頼判断を行います。

authenticator dataはコンパクトかつ拡張性のある符号化方式を持ちます。認証器が機能や消費電力に限りがあり、クライアントプラットフォームよりずっと簡素なソフトウェアスタックである場合があるため、これは重要です。

authenticator data構造体は37バイト以上のバイト配列であり、の通りにレイアウトされています。

Name Length (in bytes) Description
rpIdHash 32 RP IDのSHA-256ハッシュ。credentialスコープされるRP ID。
flags 1 フラグ(ビット0が最下位ビット):
signCount 4 署名カウンタ。32ビット符号なしビッグエンディアン整数。
attestedCredentialData variable (if present) attested credential data(もし存在する場合)。詳細は§ 6.5.1 Attested Credential Data。その長さはcredential ID及びcredential public keyの長さによる。
extensions variable (if present) 拡張で定義されるauthenticator data。これはCBOR [RFC8949]マップであり、extension identifierをキーとし、authenticator extension outputを値とする。詳細は§ 9 WebAuthn Extensions
authenticator dataのレイアウト。Name列の名前は本ドキュメント内でのみ参照用であり、実際のauthenticator dataの表現には含まれません。

RP IDは、資格情報が作成される際にclientから最初に受信され、さらにassertionが生成されるときにも再度受信されます。ただし、いくつか重要な点で他のclient dataとは異なります。まず、他のclient dataと異なり、資格情報のRP IDは操作間で変わることはなく、その資格情報の存続期間を通じて同一のまま保持されます。第二に、要求されたcredentialがスコープされているRP IDが、clientによって提供されたRP IDと正確に一致することを、authenticatorGetAssertion操作中に認証器が検証することで確認されます。

認証器authenticator data構造体生成のために以下の手順を行います:

authenticator data構造体の図式表現を示します。

authenticator dataのレイアウト。
Note: authenticator dataは自身の長さを示す:ATおよびED flagがセットされていなければ、常に37バイト長となる。attested credential dataAT flagがセットされている場合のみ存在)は自身の長さを示す。ED flagがセットされている場合、全体の長さは37バイト+(AT flagがセットされた場合の)attested credential dataの長さ+続くextensions出力(CBORマップ)の長さ。

可変長なattested credential dataの長さの決定には、 先行するcredentialId長さをもとにcredentialPublicKeyの開始位置を決定、その後credentialPublicKeyの長さを決定する必要がある(RFC9052のSection 7も参照)。

6.1.1. 署名カウンターに関する考慮事項

認証器は署名カウンター機能を実装することが推奨されます。このカウンターは概念上、認証器が資格情報ごと、もしくは認証器全体で一括して管理します。資格情報の初期署名カウンター値は、signCountとして、認証器データに含まれ、authenticatorMakeCredentialによって返却されます。署名カウンターは、authenticatorGetAssertionごとに正の値でインクリメントされ、以降の値もWebAuthn リライングパーティ認証器データに含めて返却されます。署名カウンターは、リライングパーティが認証器のクローン検出を助けるためのものです。特に、保護機構が限定的な認証器においてクローン検出は重要となります。

署名カウンタを実装しない認証器は、 signCountauthenticator data内で常にゼロにします。

Relying Party は、直近の authenticatorGetAssertion 操作の 署名カウンター を保存します。(または、まだ authenticatorGetAssertion が行われていない資格情報の場合は authenticatorMakeCredential 操作のカウンターを保存します。)以降の authenticatorGetAssertion 操作で、Relying Party は保存された 署名カウンターの値と、アサーションで返される authenticator datasignCount の新しい値を比較します。いずれかが 0 でなく、新しい signCount の値が保存された値以下の場合、クローンされた認証器が存在する可能性や認証器の故障、 あるいは Relying Party が認証器で生成された順番と異なる順番でアサーションを受取り・処理するレースコンディションが存在する可能性があります。

署名カウンタ不一致の検知によって、現操作がクローン認証器なのか元認証器なのかは判別できません。Relying Partyは各々の状況下で適切に対応すべきです(=リスク許容度や実運用上の要件で値が増加しない場合の許容理由があるかもしれません)。

認証器:

6.1.2. FIDO U2F署名形式の互換性

認証器データ構造体と直列化クライアントデータのハッシュを連結した内容に署名するアサーション署名の形式は、FIDO U2F認証署名形式と互換性があります(セクション5.4[FIDO-U2F-Message-Formats]参照)。

これは、FIDO U2F認証応答メッセージで署名される最初の37バイトが有効な認証器データ構造体であり、残りの32バイトが直列化クライアントデータのハッシュであるためです。この認証器データ構造体において、rpIdHash はFIDO U2Fのアプリケーションパラメータであり、flagsUP以外は常にゼロ、attestedCredentialDataextensionsは存在しません。よって、FIDO U2F認証署名もauthenticatorGetAssertion操作で生成された他のアサーション署名と同じ方法で検証できます。

6.1.3. 認証情報のバックアップ状態

認証情報のバックアップ適格性および現在のバックアップ状態は、認証器データ内のBEおよびBS フラグとして表現されます。これはに定義されています。

BE フラグの値はauthenticatorMakeCredential時に設定され、その後変更してはなりません。

BS フラグの値は公開鍵認証情報ソースの現状態により時間と共に変化する場合があります。下記は有効な組み合わせ例とその意味を示します。

BE BS 説明
0 0 認証情報はシングルデバイス認証情報です。
0 1 この組み合わせは許可されません。
1 0 認証情報はマルチデバイス認証情報で、現在バックアップされていません
1 1 認証情報はマルチデバイス認証情報で、現在バックアップ済みです。
BEおよびBS フラグの組み合わせ

Relying Partiesは、これらのflagsの最新値をユーザーアカウントとともに保存し、今後の評価に用いることが推奨されます。

以下はRelying Partiesがこれらのflagsをどのように使用できるかの一例です(網羅的ではありません):

6.2. 認証器の分類

多くのユースケースは、使用される認証器の機能に依存します。 このセクションでは、それらの機能、それらの重要な組み合わせ、そしてそれらの組み合わせによって可能になるユースケースの用語を定義します。

例えば:

上記の例は、主要な認証器タイプの特性を示しています:

これらの特性は独立しており、理論上は自由に組み合わせることができますが、は特に関心が高い認証器タイプをいくつか提示しています。

認証器タイプ 認証器接続方式 認証情報保存方式 認証要素の機能
二要素プラットフォーム認証器 プラットフォーム いずれか 単一要素対応
ユーザー検証付きプラットフォーム認証器 プラットフォーム いずれか 多要素対応
二要素ローミング認証器 クロスプラットフォーム サーバー側保存 単一要素対応
パスキー・ローミング認証器 クロスプラットフォーム クライアント側保存 多要素対応
パスキー・プラットフォーム認証器 プラットフォーム (transport = internal) または クロスプラットフォーム (transport = hybrid) クライアント側保存 多要素対応
一部の認証器タイプの定義

同じクライアントデバイスで再認証する際にセカンドファクタ プラットフォーム認証器は便利であり、新しいセッションの開始時、または既存のセッションの再開時にもセキュリティを一層高めるために利用できます。 セカンドファクタ ローミング認証器は、特定のクライアントデバイスで初めて認証を行う場合や、複数のユーザーが共有するクライアントデバイスで利用されることが多いです。

パスキープラットフォーム認証器およびパスキーローミング認証器 は、パスワード不要の多要素認証を実現します。 クレデンシャル秘密鍵の所有証明に加え、 これらの認証器はPINや生体認証などを二番目の認証要素としてユーザー検証をサポートします。 認証器は、2種類の認証要素として機能でき、多要素認証を実現しつつ、Relying Partyへのパスワード共有を不要にします。 これらの認証器はまた、ディスカバラブルクレデンシャル(別名パスキー)にも対応しており、ユーザー名入力が不要な認証フローも実現できます。

ユーザー検証型プラットフォーム認証器クラスは、ほぼ全てパスキープラットフォーム認証器クラスに置き換えられていますが、定義自体はisUserVerifyingPlatformAuthenticatorAvailable メソッドで依然利用されています。

で名前が付いていない組み合わせは、用途があまり明確でありません:

以下のサブセクションでは、認証器接続方式クレデンシャル保存方式 および認証要素対応性の各観点について、一層詳しく定義します。

6.2.1. 認証器接続方式

クライアントは、認証器と さまざまな方法で通信できます。例えば、クライアントクライアントデバイス固有のAPIを用いて 認証器クライアントデバイスに物理的に結合されたもの) と通信できます。一方、クライアントは Bluetoothなど標準化されたクロスプラットフォームのトランスポートプロトコル(§ 5.8.4 Authenticator Transport Enumeration (enum AuthenticatorTransport)参照)を使って クロスプラットフォーム接続認証器を発見し、通信することもできます。 認証器クライアントデバイスの一部である場合、 それをプラットフォーム認証器と呼び、 クロスプラットフォームトランスポートで到達可能なものをローミング認証器と呼びます。

一部のプラットフォーム認証器は、状況によってローミング認証器としても動作可能です。例えば、モバイルデバイスに統合されたプラットフォーム認証器がBluetooth経由でローミング認証器として利用可能となる場合があります。 この場合、モバイルデバイス上で動作しているクライアントは当該認証器をプラットフォーム認証器として認識し、 他のクライアントデバイス上で動作し、同じ認証器とBluetoothで通信するクライアントは それをローミング認証器として認識します。

プライマリなユースケースは、プラットフォーム認証器が特定のクライアントデバイスを「信頼されたデバイス」として登録することで、クライアントデバイス自体が将来の認証のための所持しているもの 認証要素として機能することです。 これによりユーザーは将来の認証式でローミング認証器を必要としないという利便性を得られます。例えば、ユーザーは鍵のトークンや携帯電話をポケットの中で探し回る必要がなくなります。

ローミング認証器のユースケースは以下の通り:新しいクライアントデバイスで初めて認証を実行する場合、 使用頻度の低いクライアントデバイス、 複数ユーザーが共有するクライアントデバイスプラットフォーム認証器を搭載しないクライアントデバイスなどです。 また、ポリシーや利用者の好みによって、認証器を利用するクライアントデバイスと分離して保持したい場合にも用いられます。 さらに、ローミング認証器は 他の認証器が紛失した際、 バックアップ用クレデンシャルを保存する手段としても利用できます。

6.2.2. 認証情報保存方式

  1. 認証器クライアントまたはクライアントデバイス内に埋め込まれた永続的ストレージ(例:セキュアイレメントなど)に保存する。 これはクライアントサイドディスカバラブル公開鍵クレデンシャルソースの技術的要件である。

  2. 公開鍵クレデンシャルソース(public key credential source)を、この認証器のみが復号(アンラップ)できるよう暗号化(ラップ)し、その結果得られた暗号文を公開鍵クレデンシャルソースのクレデンシャルIDとする。クレデンシャルIDリライングパーティによって保存され、allowCredentialsオプション経由で get() によって認証器に返される。これにより、認証器公開鍵クレデンシャルソースを復号して利用できる。

    この方法により、認証器は無制限なクレデンシャル保存容量を持てる。なぜなら暗号化済み公開鍵クレデンシャルソース認証器ではなくRelying Party側に保存されるからである。 しかし、この方法で保存されたクレデンシャルは、認証器が利用する前にRelying Partyから取得しなければならない。

これらのどの保存戦略に対応しているかで、認証器クレデンシャル保存方式が定義される:

ディスカバラブルクレデンシャル対応認証器は両方の保存戦略に対応できる場合があることに注意。 この場合、認証器はクレデンシャルごとに異なる保存戦略を任意に使うことができるが、 residentKeyrequireResidentKey オプションの指定に従う必要がある。 create() の指定に従う。

6.2.3. 認証要素の機能

認証セレモニー中に身元を証明するために使用できる認証要素は大きく3つのクラスに分類されます:something you have(所有しているもの)something you know(知っているもの)、および something you are(あなた自身であるもの)です。 例としては、それぞれ物理的な鍵、パスワード、指紋などが挙げられます。

すべてのWebAuthn認証器something you have(所有しているもの)クラスに属しますが、認証器ユーザー検証をサポートする場合、追加で一つまたは二つの種類の認証要素としても機能できます。例えば、認証器がPINを検証できるなら、そのPINはsomething you know(知っているもの)に該当し、生体認証対応認証器something you are(あなた自身であるもの)を検証できます。 したがって、ユーザー検証をサポートする認証器多要素対応(multi-factor capable)です。逆に、認証器多要素非対応(single-factor capable)である場合もあります。なお、単一の多要素対応認証器は複数の方式のユーザー検証をサポートする可能性があり、結果として3種類すべての認証要素として振る舞うことができます。

ユーザー検証は認証器上でローカルに実行され、Relying Partyによって直接実行されるものではありませんが、認証器は署名された応答でUV フラグを設定することでユーザー検証が行われたかを示します。このため、Relying Partyは登録や認証セレモニーで追加の認証要素が使用されたかを検証するために、UVフラグを利用できます。さらに、そのUVフラグの真正性は認証器アテステーションステートメントを検査することで評価できます。

6.3. 認証器操作(Authenticator Operations)

WebAuthnクライアントは、認証器のいずれかの操作を呼び出すために認証器へ接続しなければなりません。この接続は認証器セッション(authenticator session)を定義します。認証器はセッション間での分離を維持する必要があります。これは、ある時点で一つのセッションのみを許可することで実現する場合もあれば、より複雑なセッション管理を提供する場合もあります。

以下の操作はクライアントが認証器セッションで呼び出すことができます。

6.3.1. クレデンシャルIDによるクレデンシャルソースの検索アルゴリズム

クレデンシャルID credentialId認証器内で検索した結果は、次のアルゴリズムの結果です:

  1. もし authenticatorcredentialId を復号して public key credential source credSource にできる場合:

    1. credSource.idcredentialId に設定する。

    2. credSource を返す。

  2. public key credential source credSource について、authenticatorcredentials map を反復処理する:

    1. もし credSource.idcredentialId と等しいなら、credSource を返す。

  3. null を返す。

6.3.2. authenticatorMakeCredential 操作

この操作を呼び出す前に、クライアントは authenticatorCancel 操作を呼び出して、 認証器セッション内で進行中の他のすべての操作を中断しなければならない。

この操作は次の入力パラメータを受け取ります:

hash

クライアントが提供する シリアライズされた client data のハッシュ

rpEntity

Relying PartyPublicKeyCredentialRpEntity

userEntity

ユーザーアカウントPublicKeyCredentialUserEntity、および user handle(Relying Party によって与えられる)を含む。

requireResidentKey

クレデンシャル作成に対する有効な resident key 要求、クライアントによって決定される真偽値。

requireUserPresence

定数の真偽値 true、または FALSEoptions.mediationconditional に設定され、ユーザーエージェントが事前にユーザーの同意を収集している場合)。

requireUserVerification

クレデンシャル作成に対する有効なユーザー検証要求、クライアントによって決定される真偽値。

credTypesAndPubKeyAlgs

credTypesAndPubKeyAlgs は、PublicKeyCredentialType と公開鍵アルゴリズム(COSEAlgorithmIdentifier)の組を順序付けた列です。これは Relying Party が要求するもので、最も好ましいものから順に並んでいます。認証器は可能な限り最も好ましいクレデンシャルを作成するよう最善を尽くします。

excludeCredentialDescriptorList

オプションで、PublicKeyCredentialDescriptor オブジェクトのリストが Relying Party によって提供される場合があります。これらが認証器内で既知である場合、認証器は新しいクレデンシャルを作成すべきではない(SHOULD NOT)という意図があります。excludeCredentialDescriptorList は既知のクレデンシャルのリストを含みます。

enterpriseAttestationPossible

認証器が個別識別可能なアテステーションを返す可能性があることを示す真偽値。

attestationFormats

Relying Party の望むアテステーションステートメント形式を、最も望ましいものから順に並べた文字列列。もし認証器がアテステーションを返す場合、利用可能な最も望ましい形式を使うよう最善を尽くします。

extensions

CBORマップ で、拡張識別子 から対応する 認証器拡張入力 へのマップです。これは クライアントRelying Party によって要求された(存在する場合)拡張機能に基づいて作成します。

この操作が呼び出されたとき、認証器は次の手順を実行しなければなりません:

  1. 供給されたすべてのパラメータが構文的に正しく、正しい長さであるかを確認します。そうでない場合は、"UnknownError" 相当のエラーコードを返し、操作を終了します。

  2. PublicKeyCredentialTypecredTypesAndPubKeyAlgs に含まれる暗号パラメータの組のうち、少なくとも一つがサポートされているか確認します。もしサポートされていない場合は、"NotSupportedError" 相当のエラーコードを返し、操作を終了します。

  3. descriptor について excludeCredentialDescriptorList を反復処理します:

    1. もしこの認証器で 検索した結果 descriptor.id が非 null を返し、返された要素の RP IDtyperpEntity.idexcludeCredentialDescriptorList.type にそれぞれ一致する場合、authorization gesture を収集して新しいクレデンシャルの作成に対するユーザー同意を確認します。authorization gestureユーザー存在検査を含まなければなりません。

      ユーザーが新しいクレデンシャル作成に同意した場合

      "InvalidStateError" 相当のエラーコードを返し、操作を終了します。

      同意しない場合

      NotAllowedError」に相当するエラーコードを返し、操作を終了する。

      Note: この authorization gesture の目的は新しいクレデンシャルの作成を進めることではなく、プライバシー上の理由から descriptor.id がこの 認証器バインドされていることを開示することへの許可を与えることにあります。ユーザーが同意した場合、クライアントRelying Party はこれを検出してユーザーに別の認証器を使うよう案内できます。ユーザーが同意しない場合、認証器は descriptor.id がこの認証器にバインドされていることを明かさず、あたかもユーザーが単にクレデンシャル作成を拒否したかのように応答します。

  4. もし requireResidentKeytrue で、その認証器が client-side discoverable public key credential source を格納できない場合は、"ConstraintError" 相当のエラーコードを返し、操作を終了します。

  5. もし requireUserVerificationtrue で、その認証器が ユーザー検証を実行できない場合は、"ConstraintError" 相当のエラーコードを返し、操作を終了します。

  6. 一旦 authorization gesture が完了し、ユーザー同意が得られたら、新しいクレデンシャルオブジェクトを生成します:

    1. publicKey, privateKey)を、credTypesAndPubKeyAlgs の最初のサポート可能な項目で表される PublicKeyCredentialType と暗号パラメータの組合せを用いて生成する。

    2. userHandleuserEntity.id に設定する。

    3. credentialSource を次のフィールドを持つ新しい public key credential source とする:

      type

      public-key.

      privateKey

      privateKey

      rpId

      rpEntity.id

      userHandle

      userHandle

      otherUI

      認証器が任意で含めるその他の情報。

    4. もし requireResidentKeytrue であるか、認証器が client-side discoverable public key credential source を作成することを選択した場合:

      1. 新しい credential idcredentialId とする。

      2. credentialSource.idcredentialId に設定する。

      3. credentials をこの認証器の credentials map とする。

      4. Set を用いて credentials[(rpEntity.id, userHandle)] に credentialSource を格納する。

    5. それ以外の場合:

      1. credentialId を、credentialSource をこの認証器だけが復号できるようにシリアライズおよび暗号化した結果とする。

  7. もし新しいクレデンシャルオブジェクトの作成中に何らかのエラーが発生した場合、"UnknownError" 相当のエラーコードを返し、操作を終了します。

  8. processedExtensions を、認証器拡張処理 の結果として得られる値とする(extensions 中の各サポートされる拡張識別子 → 入力に対して実行した結果)。

  9. もし該当の認証器が次のうちのどれかであれば:

    U2F デバイスである場合

    新しいクレデンシャルのための署名カウンタ値はゼロとする(U2F デバイスは署名カウンタをサポートしている場合があるが、クレデンシャル作成時にカウンタを返さない)。

    グローバルな署名カウンタをサポートする場合

    authenticator data を生成する際にグローバル署名カウンタの実際の値を使用する。

    クレデンシャルごとの署名カウンタをサポートする場合

    カウンタを割り当てて新しいクレデンシャルに関連付け、初期値をゼロに初期化する。

    署名カウンタをサポートしない場合

    新しいクレデンシャルの署名カウンタ値は常にゼロとなる。

  10. attestedCredentialDatacredentialIdpublicKey を含む attested credential data バイト配列とする。

  11. attestationFormat を、attestationFormats の中でサポートされる最初のアテステーションステートメント形式識別子とする(enterpriseAttestationPossible を考慮)。もし attestationFormats にサポートされる値が含まれない場合は、認証器が最も好むアテステーションステートメント形式識別子を選ぶ。

  12. authenticatorData を、§ 6.1 Authenticator Data で規定されるバイト配列とし、必要に応じて attestedCredentialDataattestedCredentialData として含め、processedExtensionsextensions として含める。

  13. 新しいクレデンシャルのための attestation object を、§ 6.5.4 Generating an Attestation Object に示された手順、選択した attestationFormat、および値 authenticatorDatahash を用いて生成する(enterpriseAttestationPossible の値を考慮)。アテステーションの詳細は § 6.5 Attestation を参照してください。

この操作が正常に完了した場合、認証器は attestation object をクライアントに返します。

6.3.3. authenticatorGetAssertion 操作

この操作を呼び出す前に、クライアントは現在の認証器セッション内で進行中のすべての操作を中止するために、authenticatorCancel 操作を呼び出さなければなりません。

この操作は次の入力パラメータを受け取ります:

rpId

呼び出し元の RP ID(ユーザーエージェントとクライアントによって 特定 されたもの)。

hash

クライアントが提供する シリアライズされた client data のハッシュ

allowCredentialDescriptorList

オプションで、Relying Party が受け入れるクレデンシャルを記述する PublicKeyCredentialDescriptor のリスト(クライアントによってフィルタリングされる場合あり)。

requireUserPresence

定数ブール値 true。 WebAuthnがユーザープレゼンスのテストをオプションにしない一方で、実装で ユーザープレゼンステストをオプションにしたい場合、 この抽象的な認証器モデル適用を簡素化するための疑似パラメータとしてここに含めている。

requireUserVerification

クライアントが提供する、アサーションに対する有効なユーザー検証要求(真偽値)。

extensions

クライアントが Relying Party の要求に基づいて作成する、拡張識別子からそれらの authenticator extension inputs への CBOR のマップ。

このメソッドが呼び出されたとき、認証器は次の手順を実行しなければなりません:

  1. 供給されたすべてのパラメータが構文的に正しく、正しい長さであるかを確認します。そうでない場合は、"UnknownError" 相当のエラーコードを返し、操作を終了します。

  2. credentialOptions を、新しい空のセットとして初期化します(public key credential sources の集合)。

  3. もし allowCredentialDescriptorList が供給されていたら、 descriptor について:

    1. credSource を、この認証器で 検索 した descriptor.id の結果とする。

    2. もし credSourcenull でなければ、append により credentialOptions に追加する。

  4. そうでない場合(allowCredentialDescriptorList が供給されなかった場合)、 keycredSource をこの認証器の credentials map から取り出し、append により credentialOptions に追加する。

  5. Remove を用いて、credentialOptions のうち rpIdrpId と等しくない項目を削除する。

  6. もし現在 credentialOptions が空であれば、"NotAllowedError" 相当のエラーコードを返し、操作を終了する。

  7. ユーザーに credentialOptions から使用する public key credential sourceselectedCredential) を選択するよう促します。選択後、authorization gesture を収集して ユーザー同意 を確認します。authorization gesture のプロンプトは、認証器が独自の出力機能を持つ場合は認証器が、そうでなければユーザーエージェントが表示してよい。

    もし requireUserVerificationtrue であれば、authorization gestureユーザー検証 を含まなければなりません。

    もし requireUserPresencetrue であれば、authorization gestureユーザー存在検査 を含まなければなりません。

    もしユーザーが 同意しない場合、"NotAllowedError" 相当のエラーコードを返し、操作を終了します。

  8. processedExtensions を、認証器拡張処理 の結果として得られる値とする(extensions 中のサポートされる拡張識別子 → 入力について反復処理して得た結果)。

  9. 関連するクレデンシャルの 署名カウンタ または認証器のグローバルな 署名カウンタ を(認証器が実装している方式に応じて)正の値だけインクリメントします。もし認証器が署名カウンタを実装していなければ、署名カウンタ値はゼロのままとします。

  10. authenticatorData§ 6.1 Authenticator Data に規定されたバイト配列とし、必要に応じて processedExtensionsextensions として含め、attestedCredentialData は含めない。

  11. signature を、アサーション署名 として、authenticatorData || hash の連結に対して、selectedCredentialprivateKey を用いて生成したものとします(図は を参照)。authenticator data が自身の長さを表すため、単純な区切りのない連結で問題ありません。シリアライズされた client data のハッシュ(可変長の可能性がある)は常に最後に置かれます。

    アサーション署名の生成。
  12. もしアサーション署名の生成中に何らかのエラーが発生した場合、"UnknownError" 相当のエラーコードを返し、操作を終了します。

  13. ユーザーエージェントに返す値:

    • selectedCredential.id(もしクライアントが長さ2以上のクレデンシャルリストを供給した場合、またはそのようなリストが供給されなかった場合)。

      Note: もし allowCredentialDescriptorList の中でクライアントがちょうど1つだけのクレデンシャルを供給し、それが正常に利用された場合、そのクレデンシャルの credential ID は返されません(クライアントは既に知っているため)。これは制約のある接続上でこれらのバイトの送信を節約するために有用です。

    • authenticatorData

    • signature

    • selectedCredential.userHandle

      Note: もし allowCredentialDescriptorList が供給されていた場合、返される userHandle 値は null であり得ます(詳細は userHandleResult を参照)。

もし 認証器 が、指定された基準に一致する当該 Relying Party に対応する クレデンシャル を見つけられない場合、その操作は終了しエラーを返します。

6.3.4. authenticatorCancel 操作

この操作は入力パラメータを取らず、結果も返しません。

この操作がクライアントによって認証器セッション内で呼び出されると、そのセッション内で現在進行中の authenticatorMakeCredential または authenticatorGetAssertion 操作を終了させる効果があります。認証器はキャンセルされた操作に関連するユーザー入力のプロンプトや受け付けを停止します。クライアントはキャンセルされた操作に対する認証器からのさらなる応答を無視します。

この操作は、現在進行中の authenticatorMakeCredential または authenticatorGetAssertion 操作を有しない 認証器セッション 内で呼び出された場合は無視されます。

6.3.5. silentCredentialDiscovery 操作

これはオプションの操作で、認証器が conditional なユーザーメディエーションを有効にするために認証器がサポートしてもよい操作です。

この操作は次の入力パラメータを取ります:

rpId

呼び出し元の RP ID、クライアントによって 特定 されたもの。

この操作が呼び出されたとき、認証器は次の手順を実行しなければなりません:

  1. collectedDiscoverableCredentialMetadata を、新しい リスト として初期化します。このリストの各項目は DiscoverableCredentialMetadata 構造体で、次の項目を持ちます:

    type

    PublicKeyCredentialType

    id

    Credential ID

    rpId

    Relying Party Identifier

    userHandle

    user handle

    otherUI

    認証器が UI を表示する際に使用するその他の情報。

  2. public key credential source credSource を、この認証器の credentials map から反復処理します:

    1. もし credSourceclient-side discoverable credential でない場合は continue

    2. もし credSource.rpIdrpId と等しくない場合は continue

    3. discoveredCredentialMetadata を新しい DiscoverableCredentialMetadata 構造体 とし、その アイテムcredSourcetype, id, rpId, userHandle および otherUI のコピーである。

    4. Append により discoveredCredentialMetadatacollectedDiscoverableCredentialMetadata に追加する。

  3. collectedDiscoverableCredentialMetadata を返す。

6.4. 文字列の取り扱い

認証器は、例えば Relying Party が選択した任意の文字列(例:namedisplayName を含む PublicKeyCredentialUserEntity)を保存する必要がある場合があります。本節では、人間に提示される可能性のある任意の文字列を扱う際のいくつかの実務的な帰結について説明します。

6.4.1. 文字列の切り詰め

API 中の各任意文字列は、認証器 が利用可能なリソースが限られている可能性を考慮した処理を備える必要があります。切り詰めを行う場合、文字列の値が破損しないよう注意が必要です。

例えば、Unicodeコードポイントに基づく切り詰めだけでは、グラフェームクラスタが途中で切り詰められてしまう可能性があります。 これにより、元のグラフェームクラスタが別のグリフとして表示されてしまい、 文字列の意味が変更されてしまうこともあり得ます(グリフ自体が削除されるのではなく)。 例えば、 は UTF-8 で符号化された長さ65バイトの文字列の末尾を示しています。 もし64バイトに切り詰める場合、まずサイズ制限を満たすため最後の0x88バイトが削除されます。 これによりUTF-8符号点が部分的に残るため、その符号点の残り部分も削除しなければなりません。 さらに、グラフェームクラスタも部分的に残るため、そのクラスタの残り部分も削除する必要があります。

UTF-8 エンコードされた文字列の末尾と、さまざまな切り詰め境界の位置を示す図。

これらの問題への対応責任は主に クライアント にあり、文字エンコーディングや Unicode 文字プロパティの理解を 認証器 に負わせないようにするべきです。 以下の小節では、クライアントと認証器がそれぞれ文字列の切り詰めをどのように行うべきかについて要件を定義します。

6.4.1.1. クライアントによる文字列の切り詰め

WebAuthn クライアント が文字列を切り詰める場合、Relying Party から観測可能な切り詰め挙動は以下の要件を満たさなければなりません:

指定された最小サポート長以上のサイズ制限を選択してください。 文字列は UTF-8 文字エンコーディングにおけるバイト長がその制限を満たすよう切り詰めされてもかまいません。 この切り詰めは UTF-8 のコードポイント境界を尊重しなければならず、グラフェム・クラスター 境界を尊重することが推奨されます [UAX29]。 結果として得られる切り詰め後の値は選択したサイズ制限より短くなってもよいですが、そのサイズ制限を満たし、かつグラフェム・クラスター境界で終わる最長の接頭辞より短くあってはなりません。

クライアントは、これらの要件を満たすのであれば 認証器 に切り詰めを任せてもよいです。そうでない場合、クライアントは認証器に渡す前に文字列を切り詰めなければなりません。

上記に加えて、バイト境界でのみ切り詰めるとユーザーエージェントが認識しておくべき既知の問題が生じます:認証器が [FIDO-CTAP] を使用している場合、その後の認証器からのメッセージに CBOR の不正が生じる可能性があります(値が CBOR 文字列型として型付けされており、有効な UTF-8 であることが要求されるため)。したがって、認証器 を扱う際、ユーザーエージェントは以下を行うべきです:

  1. 認証器に送る任意の文字列が有効にエンコードされていることを保証する。

  2. 切り詰めによりエンコーディングが無効になった場合の処理を行う。例えば、末尾の不完全なコードポイントは削除するか U+FFFD で置換するなど。

6.4.1.2. 認証器による文字列の切り詰め

WebAuthn 認証器は制約の多い環境で実装されることがあるため、認証器に対する要件は クライアント に対する要件より緩和されています。

WebAuthn 認証器 が文字列を切り詰める場合、切り詰めの挙動は次の要件を満たさなければなりません:

指定された最小サポート長以上のサイズ制限を選択してください。 文字列は UTF-8 文字エンコーディングにおけるバイト長がその制限を満たすよう切り詰めされてもかまいません。 この切り詰めは UTF-8 のコードポイント境界を尊重することが望ましく、グラフェム・クラスター 境界を尊重してもよいです [UAX29]。 結果として得られる切り詰め後の値は選択したサイズ制限より短くなってもよいですが、そのサイズ制限を満たし、かつグラフェム・クラスター境界で終わる最長の接頭辞より短くあってはなりません。

6.4.2. 言語および方向のエンコード

文字列が文脈に応じて正しく表示されるためには、その言語と基底方向が必要となる場合があります。この API の文字列は固定機能の 認証器 に書き込まれ、後で別のプラットフォームで読み出して表示される可能性があります。

専用の言語や方向のメタデータフィールドをサポートしない既存の固定機能 認証器 と互換性を保つために、Web Authentication Level 2 ではそのようなメタデータを文字列自身に埋め込んで原子的に輸送する規定を含めました。 しかしこのエンコーディングは推奨されません;クライアント および 認証器 は新しい値に含まれるそのようなエンコーディングを無視してもよいです。 クライアント および 認証器 は、既存の文字列にエンコードされている言語・方向のメタデータを Web Authentication Level 2 §6.4.2 に記載のとおり検出・処理してもよいです。

代わりに、将来のバージョンの Web Authentication API は専用の言語および方向のメタデータフィールドを提供する可能性があります。

6.5. アテステーション

認証器は可能であれば何らかの形の アテステーション を提供することが推奨されます。 認証器がアテステーションを行う場合、基本要件は各 credential public key に対して、WebAuthn Relying Party によって検証可能な attestation statement を生成できることです。典型的にはこの attestation statement は、アテステーション秘密鍵によるアテステートされた credential public key とチャレンジ上の署名、およびアテステーション公開鍵の出所情報を提供する証明書等を含み、Relying Party が信頼判断を行えるようにします。しかし、もし attestation key pair が利用できない場合は、認証器は対応する credential private key を用いて self attestation を行うか、あるいは アテステーションを行わない こともできます。これらの情報は新しい public key credential が生成されるたびに、認証器 によって返され、全体として attestation object の形で提供されます。attestation objectauthenticator dataattested credential data を含む)および attestation statement の関係は に示されています。

認証器が self attestation または アテステーションなし を行う場合、Relying Party が信頼判断の根拠とできる出所情報は提供されません。 そのような場合、認証器 は自身の動作について Relying Party に対して保証を与えません。

Attestation object のレイアウト(authenticator dataattested credential data を含む)と attestation statement が含まれる様子)。
注: この図は packedattestation statement format のみを示しています。いくつかの追加の attestation statement formats§ 8 Defined Attestation Statement Formats で定義されています。

attestation object の重要な構成要素のひとつは attestation statement です。これは特定の型の署名付きデータオブジェクトであり、public key credential 自体およびそれを作成した authenticator に関する陳述を含みます。通常これは(self attestation の場合を除き)アテスティング権限者の鍵によって生成された attestation signature を含みます。attestation statement を正しく解釈するために、Relying Party はアテステーションに関する次の2点を理解する必要があります:

  1. attestation statement format は、署名がどのように表現され、どのように文脈バインディングが 認証器 によってアテステーションステートメントに組み込まれるかを定義します。言い換えれば、これは陳述の構文を定義します。さまざまな既存コンポーネントや OS プラットフォーム(TPM や Android OS など)は以前から attestation statement formats を定義してきました。本仕様はそうした形式を拡張可能な方法でサポートします(詳細は § 6.5.2 Attestation Statement Formats)。形式自体は文字列で識別されます(詳細は § 8.1 Attestation Statement Format Identifiers を参照)。

  2. attestation type は、attestation statements とそれらの基礎となる信頼モデルの意味論を定義します。具体的には、Relying Party がある attestation statement を暗号学的に検証した後、どのようにしてその attestation statement を信頼するかを定義するものです。本仕様は複数の attestation types をサポートします(詳細は § 6.5.3 Attestation Types を参照)。

一般に、attestation statement formatsattestation types の間に単純な一対一対応関係はありません。例えば "packed" 形式はすべての attestation types と組み合わせて使うことができますが、他の形式や型は適用範囲がより限定されます。

アテステーション のプライバシー、セキュリティ、運用上の特性は以下に依存します:

attestation typeattestation statement format認証器 によって選択されます;Relying Partiesattestation および attestationFormats パラメータを設定して好みを示すことしかできません。

ほとんどの 認証器 は少数の attestation typesattestation statement formats をサポートすることが予想され、Relying Parties はポリシーに基づいて受け入れ可能な attestation types を決定します。Relying Parties は信頼する 認証器 の特性を理解する必要があります。例えば、FIDO Metadata Service [FIDOMetadataService] はそのような情報へアクセスする一つの手段を提供します。

6.5.1. アテステートされたクレデンシャルデータ

Attested credential data は、クレデンシャルのための attestation object を生成する際に authenticator data に追加される可変長のバイト配列です。そのフォーマットは に示されています。

Name Length (in bytes) Description
aaguid 16 認証器の AAGUID
credentialIdLength 2 credentialId のバイト長 L。16ビット符号なしビッグエンディアン整数。値は ≤ 1023 でなければならない。
credentialId L Credential ID
credentialPublicKey 可変 COSE_Key 形式でエンコードされた credential public key。形式は Section 7 of [RFC9052] に従い、CTAP2 canonical CBOR encoding form を使用します。 COSE_Key でエンコードされた credential public key は "alg" パラメータを含まなければならず、他の任意パラメータを含んではなりません。"alg" は COSEAlgorithmIdentifier の値でなければなりません。 エンコードされた credential public key は、該当する鍵タイプ仕様で規定された追加の必須パラメータ("kty" と "alg" に対する必須パラメータ)も含まなければなりません(詳細は Section 2 of [RFC9053] を参照)。
Attested credential data のレイアウト。Name 列の名前は本ドキュメント内での参照用であり、実際の attested credential data の表現には含まれません。
6.5.1.1. COSE_Key 形式でエンコードされた credentialPublicKey 値の例

この節では、ES256、PS256、および RS256 署名アルゴリズム用の COSE_Key エンコード済みの楕円曲線および RSA 公開鍵の例を示します。これらの例は上記で定義された credentialPublicKey 値のルールに従い、明確さのために CDDL 表記で示されています([RFC8610])。

Section 7 of [RFC9052] はすべての COSE_Key エンコード鍵の一般的枠組みを定義します。 特定の鍵タイプは RFC9053 やその他の仕様で定義されます。

以下は、EC2 形式の COSE_Key エンコード済み楕円曲線公開鍵の例(P-256 曲線、ES256 用)です:

{
  1:   2,  ; kty: EC2 key type
  3:  -7,  ; alg: ES256 signature algorithm
 -1:   1,  ; crv: P-256 curve
 -2:   x,  ; x-coordinate as byte string 32 bytes in length
           ; e.g., in hex: 65eda5a12577c2bae829437fe338701a10aaa375e1bb5b5de108de439c08551d
 -3:   y   ; y-coordinate as byte string 32 bytes in length
           ; e.g., in hex: 1e52ed75701163f7f9e40ddf9f341b3dc9ba860af7e0ca7ca7e9eecd0084d19c
}

上の楕円曲線公開鍵を CTAP2 の正準 CBOR エンコーディング形式で表現した例を示します(可読性のため空白と改行を含む):

A5
   01  02

   03  26

   20  01

   21  58 20   65eda5a12577c2bae829437fe338701a10aaa375e1bb5b5de108de439c08551d

   22  58 20   1e52ed75701163f7f9e40ddf9f341b3dc9ba860af7e0ca7ca7e9eecd0084d19c

以下は COSE_Key 形式でエンコードされた 2048 ビット RSA 公開鍵の例(PS256 用)です([RFC8230] Section 4)。

{
  1:   3,  ; kty: RSA key type
  3: -37,  ; alg: PS256
 -1:   n,  ; n:   RSA modulus n byte string 256 bytes in length
           ;      e.g., in hex (middle bytes elided for brevity): DB5F651550...6DC6548ACC3
 -2:   e   ; e:   RSA public exponent e byte string 3 bytes in length
           ;      e.g., in hex: 010001
}

以下は上と同じ RSA 公開鍵の例で、RS256(RSASSA-PKCS1-v1_5 with SHA-256)に用いる場合:

{
  1:   3,  ; kty: RSA key type
  3:-257,  ; alg: RS256
 -1:   n,  ; n:   RSA modulus n byte string 256 bytes in length
           ;      e.g., in hex (middle bytes elided for brevity): DB5F651550...6DC6548ACC3
 -2:   e   ; e:   RSA public exponent e byte string 3 bytes in length
           ;      e.g., in hex: 010001
}

6.5.2. アテステーションステートメント形式

前述のとおり、attestation statement format は、文脈バインディングの集合に対する 認証器 の暗号署名を表すデータ形式です。各 attestation statement format は次のテンプレートを使って定義されなければなりません:

最初に指定された attestation statement formats の一覧は § 8 Defined Attestation Statement Formats にあります。

6.5.3. アテステーションの種類

WebAuthn は複数の attestation types をサポートしており、これらは attestation statements とそれらの信頼モデルの意味論を定義します:

注: 本仕様は attestation types を明示的に表現するデータ構造を定義していません。Relying Partiesattestation statement の検証を行う際(すなわち navigator.credentials.create() を使い navigator.credentials.create()none 以外の attestation conveyance を選んだ場合)は、検証手続きの一部として用いられる attestation type を決定します(詳細は各形式の「Verification procedure」節参照)。また § 14.4.1 Attestation Privacy も参照してください。Self と None を除く本節で定義されたすべての attestation types については、検証後に trust path が受け入れ可能なルート証明書に一致するかを確認する(§ 7.1 のステップ 23)必要があります。これらの attestation types を区別することは、主に Relying Party のポリシーの下でアテステーションが受け入れ可能かどうかを判断する手段として有用です。

Basic Attestation (Basic)

Basic attestation の場合([UAFProtocol])、認証器の attestation key pair は認証器「モデル」すなわち一括で製造された認証器群に特有のものです。したがって同じか類似のモデルの認証器はしばしば同じ attestation key pair を共有します。詳細は § 14.4.1 Attestation Privacy を参照してください。

Basic attestationbatch attestation とも呼ばれます。

Self Attestation (Self)

self attestation(代替的な surrogate basic attestation とも)は、認証器が特定の attestation key pair を持たない場合に用いられ、代わりに credential private key を用いて attestation signature を作成します。アテステーション秘密鍵に対する有意な保護手段がない認証器は通常この型を使います。

Attestation CA (AttCA)

この場合、認証器 は TPM に基づいており、認証器固有の「endorsement key (EK)」を保有しています。この鍵は信頼できる第三者である Attestation CA(以前は "Privacy CA" と呼ばれていた)と安全に通信するために用いられます。認証器は複数の AIK(attestation identity key)ペアを生成し、各 AIK に対して Attestation CA に AIK 証明書の発行を要求できます。この方法により、認証器は EK(グローバルな相関ハンドル)の露出を Attestation CA に限定できます。AIK は認証器が生成する各 public key credential ごとに要求され、Relying Partiesattestation certificates として伝えられます。

注: 通常これは複数のアテステーション証明書を生みます。最新に要求されたアテステーション証明書は「アクティブ」と呼ばれます。

Anonymization CA (AnonCA)

この場合、認証器Anonymization CA を使用し、各 クレデンシャル 毎に動的に生成される attestation certificates を発行させます。これにより attestation statements によって Relying Parties に提示される情報が個別に識別可能な情報(追跡に利用され得るもの)を含まないようにします。

注: Attestation statements は AttCA や AnonCA によって伝えられるものも、Basic 型のものと同じデータ構造を用いるため、これら三つの attestation types は一般に attestation certificates の内容に関する外部情報がなければ区別できないことに注意してください。

No attestation statement (None)

この場合、アテステーション情報は存在しません。詳細は § 8.7 None Attestation Statement Format を参照してください。

6.5.4. Attestation Object の生成

与えられた以下を用いて attestation object(図参照)を生成するには:

attestationFormat

一つの attestation statement format

authData

authenticator data を含むバイト配列。

hash

シリアライズされた client data のハッシュ

認証器は次を実行しなければなりません:

  1. attStmt を、authDatahash を用いて attestationFormat署名手続き を実行した結果とする。

  2. fmtattestationFormatattestation statement format identifier とする。

  3. 次の構文の CBOR マップとして attestation object を返す:

    attObj = {
        authData: bytes,
    
        ; Each choice in $$attStmtType defines the fmt value and attStmt structure
        $$attStmtType
    } .within attStmtTemplate
    
    attStmtTemplate = {
        authData: bytes,
        fmt: text,
        attStmt: (
          { * tstr => any } ; Map is filled in by each concrete attStmtType
          //
          [ * any ]         ; attStmt may also be an array
        )
    }
    

6.5.5. Packed Attestation、FIDO U2F Attestation、およびアサーション署名のための署名形式

新しいアテステーション形式を定義する際には ASN.1 エンコーディングを使用せず、代わりに COSE 署名で定義されたのと同じ表現(内部構造を持たない同等の固定長バイト配列)を使うことが推奨されます([RFC9053]、[RFC8230] を参照)。

以下の署名形式の定義はこの要件を満たし、ここで明示されていない他の署名アルゴリズムについても同様に導出するための例を示します:

7. WebAuthn Relying Party の操作

A 登録 または 認証式典は、WebAuthn Relying Party がそれぞれ PublicKeyCredentialCreationOptions または PublicKeyCredentialRequestOptions オブジェクトを作成することから始まり、これらは 式典 のパラメータをエンコードします。Relying Party はこの段階で機密情報を漏洩しないよう注意すべきです;詳細は § 14.6.2 Username Enumeration を参照してください。

create() または get() の実行に成功すると、クライアントから Relying Party のスクリプトは、それぞれ PublicKeyCredential を受け取り、AuthenticatorAttestationResponse または AuthenticatorAssertionResponse 構造を含みます。次に、この構造の内容を本仕様の範囲外の方法を用いて Relying Party サーバーに送信する必要があります。本節では、これらの構造を受領した際に Relying Party が実行すべき操作について説明します。

7.1. 新しいクレデンシャルの登録

登録式典(registration ceremony)を実行するために、Relying Party MUST 以下の手順に従う:

  1. options を、CredentialCreationOptions 構造として新たに作成し、式典のために Relying Party の要件に合わせて設定します。pkOptionsoptions.publicKey とします。

  2. navigator.credentials.create() を呼び出し、引数として options を渡します。credential を、成功したプロミスの結果とします。 プロミスが拒否された場合は、ユーザーに見えるエラーで式典を中止するか、拒否されたプロミスから得られる文脈に基づいてユーザー体験を誘導します。例えば、プロミスが "InvalidStateError" 相当のエラーコードで拒否された場合、ユーザーに別の authenticator を使用するよう指示することが考えられます。 さまざまなエラー文脈やそれに至る状況の情報は、§ 6.3.2 The authenticatorMakeCredential Operation を参照してください。

  3. responsecredential.response とします。もし responseAuthenticatorAttestationResponse のインスタンスでない場合は、ユーザーに見えるエラーで式典を中止します。

  4. clientExtensionResultscredential.getClientExtensionResults() を呼び出した結果とします。

  5. JSONtext を、response.clientDataJSON の値に対して UTF-8 decode を実行した結果とします。

    注: 任意の実装の UTF-8 decode を使用して構いませんが、UTF-8 decode アルゴリズムと同じ結果を生む必要があります。特に、先頭のバイトオーダーマーク(BOM)は削除する必要があります。

  6. C を、登録作成中に収集されたと主張される クライアントデータ とし、JSONtext に対して実装固有の JSON パーサを実行した結果とします。

    注: C は任意の実装固有のデータ構造で構いませんが、本アルゴリズムが要求するように C の構成要素が参照可能である必要があります。

  7. 次の値を検証します: C.typewebauthn.create であることを検証します。

  8. 次の値を検証します: C.challengepkOptions.challenge の base64url エンコーディングと等しいこと。

  9. 次の値を検証します: C.originorigin であり、Relying Party が期待するものであることを検証します。 指針については § 13.4.9 Validating the origin of a credential を参照してください。
  10. もし C.crossOrigin が存在し true に設定されている場合、 このクレデンシャルが Relying Party によって、祖先と 同一オリジンではない iframe 内で作成された と期待されていることを検証します。

  11. もし C.topOrigin が存在する場合:

    1. Relying Party がこのクレデンシャルは祖先と同一オリジンではない iframe 内で作成されたと期待していることを検証します。

    2. 次を検証します: C.topOrigin の値が、origin と一致し、Relying Party がサブフレームとして期待するページの origin であることを確認します。 指針については § 13.4.9 Validating the origin of a credential を参照してください。

  12. hash を、response.clientDataJSON に対して SHA-256 を用いてハッシュを計算した結果とします。

  13. attestationObject フィールドに対して CBOR デコードを行い、アテステーションステートメント形式 fmtauthenticator data authData、およびアテステーションステートメント attStmt を取得します。

  14. rpIdHashRP ID の SHA-256 ハッシュであり、Relying Party が期待するものであることを検証します。

  15. もし options.mediationconditional に設定されていない場合、 UP ビットが authDataflags に設定されていることを検証します。

  16. もし Relying Party がこの登録に対して ユーザー確認(user verification) を要求する場合、 UV ビットが authDataflags に設定されていることを検証します。

  17. もし BE ビットが flagsauthData に設定されていない場合、BS ビットが設定されていないことを検証します。

  18. もし Relying Party がクレデンシャルの バックアップ適格性 をユーザー体験フローやポリシーに反映する場合、BE ビットを authDataflags から評価します。

  19. もし Relying Party がクレデンシャルの バックアップ状態 をユーザー体験フローやポリシーに反映する場合、BS ビットを authDataflags から評価します。

  20. authData 内の credential public key にある "alg" パラメータが、 pkOptions.pubKeyCredParams のアイテムの一つの alg 属性と一致することを検証します。

  21. fmt に対して USASCII 大文字小文字区別マッチを行い、アテステーションステートメント形式を決定します。サポートされている WebAuthn Attestation Statement Format Identifier 値の集合と照合します。 登録済みの識別子の最新の一覧は IANA の "WebAuthn Attestation Statement Format Identifiers" レジストリ [IANA-WebAuthn-Registries] によって管理されています(詳細は [RFC8809] を参照)。

  22. attStmt が正しい アテステーションステートメント であり、正当な アテステーション署名 を伝えていることを、 アテステーションステートメント形式 fmt検証手順 を用いて、attStmtauthData、および hash を元に検証します。

    注:アテステーションステートメント形式 はその固有の 検証手順 を規定します。最初に定義された形式については § 8 Defined Attestation Statement Formats を、最新の一覧については [IANA-WebAuthn-Registries] を参照してください。

  23. 検証が成功した場合、そのアテステーション種類およびアテステーションステートメント形式 fmt に対して受け入れ可能な信頼アンカー(つまりアテステーションルート証明書)の一覧を、信頼できるソースまたはポリシーから取得します。例えば、FIDO Metadata Service [FIDOMetadataService] は、この情報を入手する一つの方法を提供します。その際、aaguidattestedCredentialDataauthData から利用できます。
  24. 検証手順(ステップ 21 の結果)を用いて、アテステーションの信頼性を次のように評価します:
    • もし アテステーション無し が提供されている場合、None アテステーションが Relying Party のポリシーで許容されるかを検証します。

    • もし 自己アテステーション(self attestation) が使用されている場合、self attestationRelying Party のポリシーで許容されるかを検証します。

    • それ以外の場合、検証手順 から返された X.509 証明書をアテステーショントラストパスとして使用し、アテステーション公開鍵が受け入れ可能なルート証明書へ正しくチェーンしているか、またはそれ自体が受け入れ可能な証明書であるかを確認します(すなわち、ステップ 22 で取得したルート証明書と同一である可能性を含みます)。

    アテステーションステートメントが信頼に値しないと判断された場合、Relying Party は登録式典を失敗させるべきです(SHOULD)。

    注: ただし、ポリシーで許可されている場合、Relying Partycredential ID とクレデンシャル公開鍵を登録しつつ、そのクレデンシャルを 自己アテステーション として扱うことができます(詳細は § 6.5.3 Attestation Types を参照)。その場合、Relying Party はそのクレデンシャルが特定の authenticator モデルによって生成されたという暗号学的証明がないことを主張することになります。 詳細な議論については [FIDOSecRef] および [UAFProtocol] を参照してください。

  25. 次を検証します: credentialId が ≤ 1023 バイトであること。これを超える Credential ID は 登録式典 を失敗させるべきです(SHOULD)。

  26. 次を検証します: credentialId がまだどのユーザーにも登録されていないこと。もし既に知られている場合は、Relying Party はこの 登録式典 を失敗させるべきです(SHOULD)。

    注: Relying Parties が重複する credential IDs を拒否する理由は次の通りです: credential IDs は十分なエントロピーを含むため偶発的な重複は非常に稀です。しかし、attestation types のうち自己署名を含まないものは、登録時にクレデンシャル秘密鍵の所有を明示的に証明する自己署名を含みません。したがって、攻撃者がユーザーの credential ID と公開鍵を入手してしまうと(様々な方法で可能)、その被害者のクレデンシャルを攻撃者自身のものとしてサイトに登録しようとする可能性があります。Relying Party がこの新規登録を受け入れて被害者の既存登録を置き換え、かつ クレデンシャルが検出可能(discoverable) な場合、被害者は次回の試行時に攻撃者のアカウントでサインインさせられる可能性があります。その状態で被害者がサイトに保存したデータは攻撃者が利用可能になります。

  27. credentialRecord を次の内容を持つ新しい credential record とします:
    type

    credential.type.

    id

    credential.id または credential.rawId、 Relying Party が好む形式を使用します。

    publicKey

    credential public keyauthData から格納します。

    signCount

    authData.signCount.

    uvInitialized

    UV フラグの値を authData から格納します。

    transports

    response.getTransports() から返される値。

    backupEligible

    BE フラグの値を authData から格納します。

    backupState

    BS フラグの値を authData から格納します。

    新しい credential record は、次の任意の内容をオプションとして含めることができます:

    attestationObject

    response.attestationObject.

    attestationClientDataJSON

    response.clientDataJSON.

    rpId

    pkOptions.rp.id.

    Relying Party は必要に応じて追加の items を含めることができます。 非規範的な例として、Relying Party はユーザーがクレデンシャルに対して「ニックネーム」を設定できるようにし、アカウント設定とやり取りする際にどの credential がどの authenticator に結び付いているかをユーザーが覚えやすくすることが考えられます。

  28. clientExtensionResults にある クライアント拡張出力 と、authDataextensions にある オーセンティケーター拡張出力Relying Party の要求に従って処理します。 各 拡張 によって、処理手順が具体的に定義される場合や、Relying Party 側で拡張出力をどのように扱うか決定する場合があります。 Relying Party は任意の拡張出力を無視しても構いません。

    クライアント は追加の authenticator 拡張クライアント拡張 を設定することがあり、その結果 authenticator 拡張出力クライアント拡張出力 に、Relying PartypkOptions.extensions で要求していない値が現れることがあります。 Relying Party は、そのような状況に対処できるよう準備しておく必要があり、未要求の拡張を無視するかアテステーションを拒否するかを選択できます。この決定はローカルポリシーおよび使用されている拡張に基づいて行えます。

    すべての拡張はクライアントおよびオーセンティケーターの双方にとって任意であるため、Relying Party は要求した拡張が一つも、またはすべて実行されなかった場合にも対処できるようにしておかなければなりません。

  29. 上記のすべての手順が成功した場合、 credentialRecordユーザーアカウントpkOptions.user で示されたもの)に保存し、適切に登録式典を続行します。 そうでない場合は登録式典を失敗させます。

    もし Relying Party がこの時点で登録式典を失敗させない場合、 Relying Party は、クレデンシャル公開鍵が任意の特定の authenticator モデルによって生成されたという暗号学的証明がないことを受け入れたことになります。 Relying Party は、そのクレデンシャルを アテステーション無し(no attestation) と同等と見なすことができます(詳細は § 6.5.3 Attestation Types を参照)。 詳細な議論については [FIDOSecRef] および [UAFProtocol] を参照してください。

    アテステーションオブジェクトの検証には、Relying Party がステップ 22 における信頼アンカーを決定する信頼できる方法を持っていることが必要です。 また、証明書が使用される場合、Relying Party は中間 CA 証明書の証明書状態情報にアクセスできる必要があります。さらに、クライアントがアテステーション情報にチェーンを提供していない場合でも、Relying Party はアテステーション証明書チェーンを構築できなければなりません。

7.2. 認証アサーションの検証

認証式(authentication ceremony)を実施するために、Relying Partyは以下の手順に従わなければなりません:

  1. optionsCredentialRequestOptions 構造として新規作成し、式典に必要な Relying Party の要件に合わせて構成する。 pkOptionsoptions.publicKey とする。

  2. navigator.credentials.get() を呼び出し、引数に options を渡す。 credential を、成功したプロミスの結果とする。 プロミスが拒否された場合は、式典をユーザー向けエラーで中止するか、拒否されたプロミスから得られる文脈によってユーザー体験を誘導する。さまざまなエラー文脈や状況については、§ 6.3.3 The authenticatorGetAssertion Operation を参照。

  3. responsecredential.response とする。 responseAuthenticatorAssertionResponse のインスタンスでない場合、ユーザー可視なエラーで式典を中止する。

  4. clientExtensionResultscredential.getClientExtensionResults() を呼ぶことで得る。

  5. もし pkOptions.allowCredentials が空でない場合、 credential.idpkOptions.allowCredentials に列挙されている公開鍵資格情報のいずれかを識別することを確認する。

  6. 認証されるユーザーを特定し、credentialRecord をその credential record とする:

    ユーザーが 認証式典 開始前に(例: ユーザー名やCookie等で)特定されている場合

    特定された ユーザーアカウント に、 credential record があり、かつその idcredential.rawId と等しいことを検証する。 credentialRecord をこの credential record とする。 response.userHandle が存在する場合、 それが ユーザーハンドル と一致していることを検証する。

    ユーザーが 認証式典 開始前に特定されていない場合

    response.userHandle が存在することを確認する。 response.userHandle で特定される ユーザーアカウントcredential.rawId と等しい credential record を保持していることを検証し、 credentialRecord をその credential record とする。

  7. cData, authData, sig をそれぞれ responseclientDataJSON, authenticatorData, signature の値とする。

  8. JSONtextcData の値に UTF-8 decode を適用した結果とする。

    注: 任意の実装の UTF-8 decode を用いてもよいが、その出力が UTF-8 decode アルゴリズムと同一になる必要がある。特に、先頭のバイトオーダーマーク(BOM)は除去すること。

  9. C を、署名に利用されたと主張される クライアントデータ とし、JSONtext を実装依存のJSONパーサで解析した結果とする。

    注: C は本アルゴリズムが必要とするように参照できるものであれば、任意の実装依存のデータ構造でよい。

  10. C.type の値が文字列 webauthn.get であることを検証する。

  11. C.challenge の値が pkOptions.challenge の base64urlエンコーディングと等しいことを検証する。

  12. C.origin の値が origin であり、Relying Party が期待するものであることを検証する。 指針は § 13.4.9 Validating the origin of a credential を参照。
  13. C.crossOrigin が存在し、true の場合、 Relying Party が、このクレデンシャルを祖先と同一オリジンでない iframe 内で利用することを期待していることを検証する。

  14. C.topOrigin が存在する場合:

    1. Relying Party がこのクレデンシャルを祖先と同一オリジンでない iframe 内で利用することを期待していることを検証する。

    2. C.topOrigin の値が、 origin と一致し、 Relying Party がサブフレームとして期待するページの origin であることを検証する。 指針は § 13.4.9 Validating the origin of a credential を参照。

  15. authDatarpIdHash が、RP ID の SHA-256 ハッシュであり、それが Relying Party の期待どおりであることを検証。

    注: appid 拡張が使われている場合、本ステップには特別なロジックが必要となる。詳細は § 10.1.1 FIDO AppID Extension (appid) を参照。

  16. authDataUP ビットが flags に設定されていることを検証する。

  17. このアサーション(assertion)で ユーザー検証が必要か判定する。 pkOptions.userVerificationrequired の場合のみ ユーザー検証 を要求すべき(SHOULD)である。

    ユーザー検証が必須と判定されたならば、 authDataUV ビットが flags に設定されていることを検証する。 そうでない場合は、UV フラグの値を無視する。

  18. authDataBE ビットが flags にセットされていない場合、BS ビットがセットされていないことを検証する。

  19. クレデンシャルの バックアップ状態Relying Party の業務ロジックまたはポリシーの一部として利用する場合、 authDataBE, BS ビットの値を currentBe, currentBs とする。 credentialRecord.backupEligible および credentialRecord.backupState と比較:

    1. credentialRecord.backupEligible がセットされていれば currentBe がセットされていることを検証

    2. credentialRecord.backupEligible がセットされていなければ currentBe もセットされていないことを検証

    3. Relying Party のポリシーがあれば適用

    注: § 6.1.3 Credential Backup State に、Relying PartyBS フラグ値をどう処理するかの例がある。

  20. hashcData のSHA-256ハッシュとして得る。

  21. credentialRecord.publicKey を使って、sigauthDatahash のバイナリ連結の有効な署名であることを検証する。

    注: この検証ステップはFIDO U2Fオーセンティケーターで生成された署名とも互換がある。§ 6.1.2 FIDO U2F Signature Format Compatibility を参照。

  22. authData.signCount が非0、または credentialRecord.signCount が非0 ならば、次のサブステップを実行:

    • authData.signCount

      credentialRecord.signCount より大きければ
      署名カウンタは正当とみなす
      credentialRecord.signCount 以下であれば
      これはオーセンティケーターがクローンされている可能性の「シグナル」だが、証拠とは限らない。たとえば次のことが考えられる:
      • 2つ以上の クレデンシャル秘密鍵 が存在し並列で使われている可能性

      • オーセンティケーターの不調

      • Relying Party がアサーションレスポンスを、オーセンティケーター生成順と異なる順序で処理している競合状態

      Relying Parties は自身の運用特性に基づいてリスク評価に本情報を組み込むべき。 この場合 Relying PartycredentialRecord.signCount を以降で更新するか・しないか・認証式典 を失敗させるか等は、Relying Partyの判断でよい。

      署名カウンターに関する詳細は § 6.1.1 Signature Counter Considerations 参照。

  23. clientExtensionResults 内の クライアント拡張出力および authDataextensions 内の 認証器拡張出力Relying Party の要件に従い処理する。 各 拡張ごとに、 処理手順が具体的に指定されている場合もあれば、拡張出力の取り扱いを Relying Partyが判断する場合もある。 Relying Partyは、任意の拡張出力を無視してもよい。

    クライアント が追加の オーセンティケーター拡張 や、 クライアント拡張 をセットした場合、オーセンティケーター拡張出力クライアント拡張出力 に、 pkOptions.extensionsRelying Party が要求していなかった値が現れることがある。 Relying Party は、その場合に未要求の拡張を無視するかアサーションを拒否するか、どちらも許可されている。これはローカルポリシーや利用している拡張の内容に依って決めてよい。

    すべての拡張はクライアント・オーセンティケーター双方において任意なので、Relying Party は要求した拡張が一部または全て実行されていなくても対処できる必要がある。

  24. credentialRecord を新しい状態値で更新:
    1. credentialRecord.signCountauthData.signCount の値に更新。

    2. credentialRecord.backupStatecurrentBs の値に更新。

    3. credentialRecord.uvInitializedfalse の場合は、 authDataUV ビット値で更新する。 この変更にはWebAuthnの 認証ファクターに相当する追加認証要素による認可が必要であるべき(SHOULD); 認可されなければ、この手順をスキップする。

    Relying Party がWebAuthn 認証式典 手順以上の追加のセキュリティチェックを行う場合、これらの状態更新は追加チェックが成功した後に実施すべき(SHOULD)。

  25. 上記の全手順が成功した場合、必要に応じて認証式典を継続する。失敗した場合は 認証式典 を失敗させる。

8. 定義済みアテステーションステートメントフォーマット

WebAuthnはプラグイン可能なアテステーションステートメントフォーマットをサポートします。本節ではその初期セットを定義します。

8.1. アテステーションステートメントフォーマット識別子

アテステーションステートメントフォーマットは、そのアテステーションステートメントフォーマットの著者が定める文字列によって識別され、この文字列をアテステーションステートメントフォーマット識別子と呼びます。

アテステーションステートメントフォーマット識別子はIANA「WebAuthn Attestation Statement Format Identifiers」レジストリ [IANA-WebAuthn-Registries][RFC8809]にて設立)へ登録すべきです。 登録済みアテステーションステートメントフォーマット識別子はすべて一意です。

未登録のアテステーションステートメントフォーマット識別子は、識別子の一意性保証のために、開発者が所有するドメイン名を用いた小文字リバースドメイン名方式で命名すべきです。すべてのアテステーションステートメントフォーマット識別子は最大32オクテット以内かつ印字可能なUSASCII文字のみ(バックスラッシュおよびダブルクオーテーション除く)、すなわち[RFC5234]で定義されるVCHAR(但し%x22,%x5c除く)で構成しなければなりません。

注: つまりドメイン名ベース識別子はLDHラベル [RFC5890] のみ許可されます。

実装はWebAuthnアテステーションステートメントフォーマット識別子を大小区別して一致させなければなりません。

複数バージョンが存在し得るアテステーションステートメントフォーマットは、識別子にバージョンを含めるべきです。すなわち、異なるバージョンは別フォーマット扱いとなります(例:packed2§ 8.2 Packed Attestation Statement Formatの新バージョン)。

以下のセクションで、現在定義・登録済みのアテステーションステートメントフォーマットとその識別子を示します。 最新の登録済みアテステーションステートメントフォーマット識別子一覧は IANA「WebAuthn Attestation Statement Format Identifiers」レジストリ [IANA-WebAuthn-Registries][RFC8809])で管理されています。

8.2. Packedアテステーションステートメントフォーマット

これはWebAuthnに最適化されたアテステーションステートメント形式です。非常にコンパクトでありながら拡張可能な エンコーディング方式を使用しています。 リソースの限られたオーセンティケーター(例:セキュアイレメント)でも実装可能です。

アテステーションステートメント形式識別子

packed

対応するアテステーションタイプ

Basic, Self, AttCA

構文

Packed Attestationステートメントの構文は次のCDDLで定義されます:

$$attStmtType //= (
                      fmt: "packed",
                      attStmt: packedStmtFormat
                  )

packedStmtFormat = {
                       alg: COSEAlgorithmIdentifier,
                       sig: bytes,
                       x5c: [ attestnCert: bytes, * (caCert: bytes) ]
                   } //
                   {
                       alg: COSEAlgorithmIdentifier
                       sig: bytes,
                   }

各フィールドの意味は以下のとおりです:

alg

COSEAlgorithmIdentifier で、アテステーション署名生成に用いるアルゴリズムIDです。

sig

アテステーション署名を含むバイト列です。

x5c

この配列の要素はattestnCertおよびその証明書チェーン(ある場合)で、いずれもX.509形式で符号化されます。 アテステーション証明書attestnCertは必ず配列の先頭要素とします。

attestnCert

X.509形式で符号化されたアテステーション証明書です。

署名手順

このアテステーションステートメント形式の署名手順は アサーション署名生成手順に類似します。

  1. authenticatorDataアテステーションのためのオーセンティケーターデータとし、 clientDataHashシリアライズされたクライアントデータのハッシュとする。

  2. Basic または AttCA アテステーションを用いる場合、オーセンティケーターはauthenticatorDataclientDataHashを連結し、その結果にオーセンティケーター固有の機構で選ばれたアテステーション秘密鍵で署名しsigとする。 x5cにはattestnCertと、その関連証明書チェーン(あれば)を格納する。algはアテステーション秘密鍵のアルゴリズムとする。

  3. 自己アテステーションを用いる場合、オーセンティケーターはauthenticatorDataclientDataHashを連結しクレデンシャル秘密鍵で署名してsigとする。algはクレデンシャル秘密鍵のアルゴリズムとし、 他フィールドは省略する。

検証手順

検証手順の入力であるattStmt, authenticatorData, clientDataHashを受けて、検証手順は 以下の通りとなる:

  1. attStmtが上記構文の有効なCBORであることを検証し、CBORデコードで各フィールドを抽出する。

  2. x5cが存在する場合:

    • sigauthenticatorDataclientDataHashの連結に対し、 algで指定されたアルゴリズムおよびattestnCertのアテステーション公開鍵を使って有効な署名となっていることを確認。

    • attestnCert§ 8.2.1 Packed アテステーション証明書要件を満たしていることを確認。

    • attestnCertにOID 1.3.6.1.4.1.45724.1.1.4id-fido-gen-ce-aaguid)拡張があれば、 この拡張の値が aaguid と一致することを確認。

    • オプションで、x5cを調査し外部知識をもとにattStmtBasicAttCAアテステーションか判定する。

    • 成功した場合、アテステーションタイプBasicまたはAttCAまたは不明を表す実装依存値、 およびアテステーショントラストパスx5c)を返す。

  3. x5cが存在しない場合、自己アテステーションが使われている。

    • algauthenticatorDatacredentialPublicKey のアルゴリズムと一致することを確認。

    • sigauthenticatorDataclientDataHashの連結に対し algを使ってクレデンシャル公開鍵で検証できる署名となっていることを確認。

    • 成功した場合、アテステーションタイプSelfおよび空の トラストパスを表す実装依存値を返す。

8.2.1. Packed アテステーション証明書の要件

アテステーション証明書は下記フィールド・拡張を必須とします:

さらに、Authority Information Access (AIA) 拡張子(エントリー id-ad-ocsp)および CRL Distribution Point 拡張子 [RFC5280] は、認定証の多くのステータスが認証器メタデータサービスを通じて取得可能であるため、両方とも任意です。例として FIDOメタデータサービス [FIDOMetadataService] を参照してください。

特定の認証器モデルのファームウェアは、Extension OID 1.3.6.1.4.1.45724.1.1.5 (id-fido-gen-ce-fw-version) で区別することができます。存在する場合、この属性は非負の値を持つ INTEGER であり、新しい ファームウェアリリースバージョンのごとにインクリメントされます。この拡張は critical に指定してはいけません。

例として、以下は上記の拡張OIDおよび必須項目を含む認証証明書です:

-----BEGIN CERTIFICATE-----
MIIBzTCCAXOgAwIBAgIUYHS3FJEL/JTfFqafuAHvlAS+hDYwCgYIKoZIzj0EAwIw
QTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC1dlYkF1dGhuIFdHMRwwGgYDVQQDDBNF
eGFtcGxlIEF0dGVzdGF0aW9uMCAXDTI0MDEwMzE3NDUyMVoYDzIwNTAwMTA2MTc0
NTIxWjBBMQswCQYDVQQGEwJVUzEUMBIGA1UECgwLV2ViQXV0aG4gV0cxHDAaBgNV
BAMME0V4YW1wbGUgQXR0ZXN0YXRpb24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC
AATDQN9uaFFH4BKBjthHTM1drpb7gIuPod67qyF6UdL4qah6XUp6tE7Prl+DfQ7P
YH9yMOOcci3nr+Q/jOBaWVERo0cwRTAhBgsrBgEEAYLlHAEBBAQSBBDNjDlcJu3u
3mU7AHl9A8o8MBIGCysGAQQBguUcAQEFBAMCASowDAYDVR0TAQH/BAIwADAKBggq
hkjOPQQDAgNIADBFAiA3k3aAUVtLhDHLXOgY2kRnK2hrbRgf2EKdTDLJ1Ds/RAIh
AOmIblhI3ALCHOaO0IO7YlMpw/lSTvFYv3qwO3m7H8Dc
-----END CERTIFICATE-----

上記の属性はこの証明書内で次のように構造化されています:

30 21                                    -- SEQUENCE
  06 0B 2B 06 01 04 01 82 E5 1C 01 01 04 -- OID 1.3.6.1.4.1.45724.1.1.4
  04 12                                  -- OCTET STRING
    04  10                               -- OCTET STRING
      CD 8C 39 5C 26 ED EE DE            -- AAGUID cd8c395c-26ed-eede-653b-00797d03ca3c
      65 3B 00 79 7D 03 CA 3C 

30 12                                    -- SEQUENCE
  06 0B 2B 06 01 04 01 82 E5 1C 01 01 05 -- OID 1.3.6.1.4.1.45724.1.1.5
  04 03                                  -- OCTET STRING
    02 01                                -- INTEGER
      2A                                 -- Firmware version: 42

8.2.2. エンタープライズPackedアテステーション証明書要件

OID 1.3.6.1.4.1.45724.1.1.2id-fido-gen-ce-sernum)拡張は エンタープライズ用途のpackedアテステーションで追加可能(MAY)です。存在する場合、この拡張は特定AAGUIDにつき装置毎に一意なバイト列とする必要があります。 この値は工場出荷時リセット後も不変でなければならないが、他ハードウェア識別番号と異なる場合も認められる。criticalにはしないこと。 非エンタープライズアテステーションではこの拡張を含めてはなりません。

8.3. TPMアテステーションステートメント形式

このアテステーションステートメント形式は、暗号エンジンとしてTrusted Platform Moduleを使うオーセンティケーターで一般的に用いられます。

アテステーションステートメント形式識別子

tpm

対応するアテステーションタイプ

AttCA

構文

TPMアテステーションステートメントの構文は次の通り:

$$attStmtType // = (
                       fmt: "tpm",
                       attStmt: tpmStmtFormat
                   )

tpmStmtFormat = {
                    ver: "2.0",
                    (
                        alg: COSEAlgorithmIdentifier,
                        x5c: [ aikCert: bytes, * (caCert: bytes) ]
                    )
                    sig: bytes,
                    certInfo: bytes,
                    pubArea: bytes
                }

フィールドの意味は下記:

ver

署名が準拠するTPM仕様バージョンです。

alg

COSEAlgorithmIdentifier で、アテステーション署名生成に使うアルゴリズムIDです。

x5c

X.509で符号化されたaikCert および証明書チェーン。

aikCert

アテステーションに用いたAIK証明書(X.509形式)。

sig

アテステーション署名。 TPMT_SIGNATURE構造体形式。[TPMv2-Part2] 11.3.4参照。

certInfo

上記署名を計算したTPMS_ATTEST構造体。[TPMv2-Part2] 10.12.8参照。

pubArea

TPMT_PUBLIC構造体([TPMv2-Part2] 12.2.4参照)。TPMが保持するクレデンシャル公開鍵。

署名手順

authenticatorDataアテステーション用データとし、 clientDataHashシリアライズしたクライアントデータのハッシュ とする。

authenticatorDataclientDataHashを連結してattToBeSignedとする。

署名生成は、[TPMv2-Part3] Section 18.2手順に従い、 アテステーション秘密鍵で行う。extraDataパラメータはattToBeSignedダイジェストとする。 ("RS256"ではSHA-256ダイジェスト。)

pubAreaフィールドにはクレデンシャル公開鍵の公開領域(TPMT_PUBLIC構造体)、certInfoフィールド(TPMS_ATTEST構造体)にはパラメータ名と同じ出力値、 sigは上記署名値とする。

注: pubAreaがTPM2_ReadPublicコマンドで読み出される場合、 このコマンドの返すTPM2B_PUBLICは長さ2バイト+TPMT_PUBLIC構造になる。pubArea格納時に長さ2バイトを除去すること。

検証手順

検証入力 attStmt, authenticatorData, clientDataHashで、 検証手順は:

attStmtが上記構文準拠のCBORであるか検証しCBORデコードで各フィールドを抽出。

pubAreaparametersおよびuniquecredentialPublicKey および attestedCredentialDataauthenticatorData内)と一致することを確かめる。

authenticatorDataclientDataHashを連結しattToBeSignedを作る。

certInfoの整合性を検証:

  • x5cが存在することを確認。

  • aikCert§ 8.3.1 TPMアテステーション証明書要件を満たすことを確認。

  • aikCertにOID1.3.6.1.4.1.45724.1.1.4 (id-fido-gen-ce-aaguid)拡張があれば この値が aaguid と一致することを確認。

  • sigcertInfoに対しaikCertの公開鍵およびalg指定アルゴリズムで有効な署名となっていることを確認。

certInfoが妥当であることの検証: 注:certInfoはTPMS_ATTEST構造体

  • magicTPM_GENERATED_VALUEである

  • typeTPM_ST_ATTEST_CERTIFYである

  • extraDataattToBeSignedの、"alg"アルゴリズムでのハッシュ値である

  • attested[TPMv2-Part2] 10.12.3で定義されるTPMS_CERTIFY_INFO構造体であり、そのnamepubAreaについて有効なName(nameAlgアルゴリズムで算出)が入っている。

    注: TPMは常にTPMS_CERTIFY_INFO構造体nameのnameAlgをpubAreaと一致させる。

    注: “Standard Attestation Structure”[TPMv2-Part1] 31.2の残りフィールド(qualifiedSigner, clockInfo, firmwareVersion)は無視される。 aikCertのキー属性に依存してこれらが難読化される場合もある。もし妥当な場合はリスク解析エンジンへの入力に活用してもよい。

  • 成功時は、アテステーションタイプAttCAおよび アテステーショントラストパスx5c)を表す実装依存値を返す。

8.3.1. TPMアテステーション証明書の要件

TPM アテステーション証明書は下記フィールド・拡張を必須とします:

8.4. Androidキーアテステーションステートメントフォーマット

対象のオーセンティケーターがAndroid "N"以降プラットフォーム上の プラットフォームオーセンティケーターである場合、 アテステーションステートメントはAndroid key attestationに基づきます。この場合、アテステーションステートメントはセキュアな実行環境で動作するコンポーネントによって生成されますが、アテステーションのためのオーセンティケーターデータはこの環境の外部で生成されます。WebAuthn Relying Partyは、アテステーションに利用されたとされるオーセンティケーターデータが、アテステーション証明書の拡張データの内容と一致しているか確認することが求められます。

アテステーションステートメント形式識別子

android-key

対応するアテステーションタイプ

Basic

構文

Android Key Attestationステートメントは単にAndroidアテステーションステートメント(DERエンコードX.509証明書列)です。Android開発者ドキュメントも参照。構文は次の通りです:

$$attStmtType //= (
                      fmt: "android-key",
                      attStmt: androidStmtFormat
                  )

androidStmtFormat = {
                      alg: COSEAlgorithmIdentifier,
                      sig: bytes,
                      x5c: [ credCert: bytes, * (caCert: bytes) ]
                    }

署名手順

authenticatorDataアテステーションのためのオーセンティケーターデータclientDataHashシリアライズしたクライアントデータのハッシュ とする。

Android Key Attestationを keyStore.getCertificateChain(myKeyUUID) でリクエストし、clientDataHash をチャレンジ値として渡す(例: setAttestationChallenge を利用)。x5c には返却値を格納。

オーセンティケーターは authenticatorDataclientDataHash を連結し、クレデンシャル秘密鍵で署名して sig を生成。 alg には署名形式のアルゴリズムを格納する。

検証手順

検証手順入力 attStmt, authenticatorData, clientDataHash について、検証手順は次の通り:

  • attStmtが上記構文の有効なCBORであることを検証し、CBORデコードで各フィールドを抽出する。

  • sigが、authenticatorDataclientDataHashの連結に、x5cの最初の証明書の公開鍵およびalg指定アルゴリズムで有効な署名か検証。

  • x5cの最初の証明書公開鍵が、credentialPublicKeyattestedCredentialData 内、authenticatorDataから抽出)と一致していることを検証。

  • アテステーション証明書 拡張データattestationChallenge フィールドが clientDataHash と同一であることを検証する。

  • アテステーション証明書 拡張データ内 適切なauthorization listについて以下を確認する:

    • AuthorizationList.allApplicationsフィールドが(softwareEnforcedteeEnforcedも)存在しないこと (PublicKeyCredentialはRP IDにスコープされていなければならないため)。

    • 以下について、RPが信頼実行環境のみ許容する場合はteeEnforcedのみ、そうでなければその和集合を使う。

      • AuthorizationList.originの値がKM_ORIGIN_GENERATEDである。

      • AuthorizationList.purposeの値がKM_PURPOSE_SIGNである。

  • 成功した場合、アテステーションタイプBasicおよびアテステーショントラストパスx5c)を表す実装依存値を返却。

8.4.1. Android Key Attestation ステートメント証明書要件

Android Key Attestation アテステーション証明書android key attestation certificate extension dataはOID1.3.6.1.4.1.11129.2.1.17で識別され、そのスキーマはAndroid開発者ドキュメントに定義されています。

8.5. Android SafetyNet アテステーションステートメント形式

注: 本フォーマットは非推奨(deprecated)であり、今後の改訂で削除される予定です。

オーセンティケーターが特定のAndroidプラットフォーム上の プラットフォームオーセンティケーターの場合、 アテステーションステートメントはSafetyNet APIに基づく可能性があります。 このケースではオーセンティケーターデータは完全にSafetyNet API呼び出し元(典型的にはAndroid上のアプリ)によって制御され、 アテステーションステートメントはプラットフォームの健全性や呼び出しアプリの識別性に言及するものとなります。 (詳細は SafetyNet ドキュメント を参照)

アテステーションステートメント形式識別子

android-safetynet

対応するアテステーションタイプ

Basic

構文

Android Attestationステートメントの構文は次の通りです:

$$attStmtType //= (
                      fmt: "android-safetynet",
                      attStmt: safetynetStmtFormat
                  )

safetynetStmtFormat = {
                          ver: text,
                          response: bytes
                      }

各フィールドの意味:

ver

SafetyNet APIを提供するGoogle Play Servicesのバージョン番号。

response

SafetyNet APIのgetJwsResult()コールのUTF-8エンコード値。この値はJWS [RFC7515] オブジェクト( SafetyNet オンラインドキュメント参照) のCompact Serialization形式です。

署名手順

authenticatorDataアテステーション用データclientDataHashシリアライズクライアントデータのハッシュ とする。

authenticatorDataclientDataHashを連結し、それをSHA-256ハッシュし、そのハッシュをattToBeSignedとする。

SafetyNet アテステーションを要求し、attToBeSigned を nonce 値として提供する。response をその結果に設定し、ver を認証器で動作している Google Play Services のバージョンに設定する。

検証手順

検証手順入力 attStmt, authenticatorData, clientDataHashについて、検証手順は以下の通り:

8.6. FIDO U2F アテステーションステートメント形式

このアテステーションステートメント形式は、[FIDO-U2F-Message-Formats]で定義された形式を使うFIDO U2Fオーセンティケーターで用いられます。

アテステーションステートメント形式識別子

fido-u2f

対応するアテステーションタイプ

Basic, AttCA

構文

FIDO U2Fアテステーションステートメントの構文は次の通り:

$$attStmtType //= (
                      fmt: "fido-u2f",
                      attStmt: u2fStmtFormat
                  )

u2fStmtFormat = {
                    x5c: [ attestnCert: bytes ],
                    sig: bytes
                }

各フィールドの意味:

x5c

X.509形式アテステーション証明書の単要素配列

sig

アテステーション署名。 署名は[FIDO-U2F-Message-Formats]で定義のU2F登録応答メッセージ(raw)に対して、 クライアントがオーセンティケーターから受信したもの。

署名手順

attested credentialクレデンシャル公開鍵がアルゴリズム-7("ES256")でなければエラー返却。 それ以外はauthenticatorDataアテステーション用オーセンティケーターデータ)、 clientDataHashシリアライズクライアントデータハッシュ)とする(後者は32バイト)。

登録応答メッセージ生成は[FIDO-U2F-Message-Formats] Section 4.3の要領で(applicationはRP IDのSHA-256ハッシュ、challengeはclientDataHash、key handleは該当クレデンシャルID)、 Registration Response Messageのraw signature部分(ユーザー公開鍵、key handle、アテステーション証明書部分を除外)をsig、 アテステーション公開鍵の証明書群をx5cとする。

検証手順

検証手順入力 attStmt, authenticatorData, clientDataHashについて、検証手順は下記の通り:

  1. attStmtが上記構文準拠CBORであることを検証し、CBORデコードで各フィールドを抽出

  2. x5cが1つだけであること確認し、attCertとする。attCertに含まれる公開鍵をcertificate public keyとし、これがP-256曲線上のEC公開鍵でない場合はエラー返却。

  3. authenticatorDataから主張されているrpIdHashを取得、 authenticatorData.attestedCredentialDataからcredentialIdcredentialPublicKeyを得る。

  4. credentialPublicKey(COSE_KEY形式、RFC9052 Section 7参照)をRaw ANSI X9.62公開鍵形式( FIDO Registry 3.6.2)に変換。

    • xcredentialPublicKeyの"-2"キー(x座標)値とし、32バイトであることを確認。 サイズ異常または"-2"キー欠損時はエラー返却。

    • yを"-3"キー(y座標)値とし、32バイトであることを確認。 サイズ異常または"-3"キー欠損時はエラー返却。

    • publicKeyU2F0x04 || x || y連結値とする。

      注: これはアンコンプレスECC公開鍵形式。

  5. verificationDataを(0x00 || rpIdHash || clientDataHash || credentialId || publicKeyU2F)で連結。(Section 4.3

  6. verificationDatacertificate public keysigを、 [SEC1]4.1.4の要領で(SHA-256ハッシュ使用)、検証。

  7. オプションでx5cを調べ、attStmtBasicAttCAアテステーションか外部知識で判定。

  8. 成功時、アテステーションタイプBasic/AttCAまたは不明種別、およびアテステーショントラストパスx5c)を表す実装依存値を返す。

8.7. None アテステーションステートメント形式

noneアテステーションステートメント形式は、WebAuthn Relying Partyがアテステーション情報を受け取りたくない意思を示した際(§ 5.4.7 アテステーション伝達希望列挙(enum AttestationConveyancePreference)参照)に、オーセンティケーター提供のアテステーションステートメントを置き換える用途で利用されます。

オーセンティケーターアテステーションをサポートしていない場合、この形式のアテステーションステートメントを生成してもかまいません(MAY)。

アテステーションステートメント形式識別子

none

対応するアテステーションタイプ

None

構文

noneアテステーションステートメントの構文は次の通りです:

$$attStmtType //= (
                      fmt: "none",
                      attStmt: emptyMap
                  )

emptyMap = {}
署名手順

上記で定義した固定アテステーションステートメントを返す。

検証手順

アテステーションタイプNoneおよび空のアテステーショントラストパスを表す実装依存値を返す。

8.8. Apple匿名アテステーションステートメントフォーマット

このアテステーションステートメントフォーマットは、WebAuthnに対応した特定のAppleデバイスに対してAppleが専用で使用しています。

アテステーションステートメントフォーマット識別子

apple

対応するアテステーションタイプ

Anonymization CA

構文

Appleアテステーションステートメントの構文は以下の通り定義されます:

$$attStmtType //= (
                      fmt: "apple",
                      attStmt: appleStmtFormat
                  )

appleStmtFormat = {
                      x5c: [ credCert: bytes, * (caCert: bytes) ]
                  }

上記フィールドの意味は次の通りです:

x5c

credCertの後に、その証明書チェーンがX.509形式でそれぞれエンコードされて並びます。

credCert

アテステーション用に利用される資格情報公開鍵証明書。X.509形式でエンコードされます。

署名手順
  1. authenticatorDataをアテステーション用のオーセンティケーターデータとして、clientDataHashシリアライズされたクライアントデータのハッシュとして扱います。

  2. authenticatorDataclientDataHashを連結し、nonceToHashを生成します。

  3. nonceToHashにSHA-256ハッシュを実行し、nonceを得ます。

  4. Apple匿名アテステーションCAが資格情報公開鍵用のX.509証明書を生成し、nonceをOID1.2.840.113635.100.8.2の証明書拡張として含めます。credCertがこの証明書を指します。credCertはアテステーションの証明となり、含まれるnonceはアテステーションがリアルタイムで実行されたことの証明になります。さらに、nonceauthenticatorDataおよびクライアントデータの完全性も保護します。

  5. x5ccredCertおよびその証明書チェーンを設定します。

検証手順

検証手順の入力としてattStmtauthenticatorDataclientDataHashが与えられた場合、手順は次の通りです:

  1. attStmtが上記構文に適合したCBORであることを検証し、CBORデコードを行い内包フィールドを抽出します。

  2. authenticatorDataclientDataHashを連結してnonceToHashを作成します。

  3. nonceToHashをSHA-256ハッシュしnonceを生成します。

  4. credCertのOID1.2.840.113635.100.8.2拡張の値がnonceと等しいことを確認します。

  5. 資格情報公開鍵credCertのSubject Public Keyと等しいことを検証します。

  6. すべて成功した場合、アテステーションタイプAnonymization CAとアテステーショントラストパスx5cを表す実装固有値を返します。

8.9. 複合アテステーションステートメントフォーマット

「複合」アテステーションステートメントフォーマットは、1回のセレモニーで複数の自己完結型アテステーションステートメントを伝えるために使用します。

アテステーションステートメントフォーマット識別子

compound

対応するアテステーションタイプ

任意。§ 6.5.3 アテステーションタイプ参照。

構文

複合アテステーションステートメントの構文は以下の通り定義されます:

$$attStmtType //= (
                      fmt: "compound",
                      attStmt: [2* nonCompoundAttStmt]
                  )

nonCompoundAttStmt = { $$attStmtType } .within { fmt: text .ne "compound", * any => any }
署名手順

該当なし

検証手順

検証手順の入力として attStmtauthenticatorDataclientDataHashが与えられた場合、検証手順は 次の通りです:

  1. subStmtattStmt から取り出し、 アテステーションステートメント形式識別子 subStmt.fmt に対応する 検証手順検証手順の入力 subStmt, authenticatorData, clientDataHash で評価する。

    一つ以上の subStmt で検証が失敗した場合、Relying Party のポリシーに基づき適切な結果を決定する。

  2. 十分な数(Relying Party のポリシーで決定) の 項目attStmt で正常に検証された場合、 成功した 検証手順 から得られた出力の任意の組み合わせを表す実装依存の値を返す。

9. WebAuthn拡張

公開鍵クレデンシャルの生成の仕組み、および§ 5 Web Authentication APIで定義されている認証アサーションのリクエストと生成の仕組みは、特定のユースケースに合わせて拡張することができます。それぞれの場合は、登録拡張および/または認証拡張を定義することで対応されます。

すべての拡張はクライアント拡張です。つまり、この拡張はクライアントとの通信およびクライアントによる処理を伴います。クライアント拡張は、以下の手順とデータを定義します:

公開鍵クレデンシャルを作成する場合や認証アサーションを要求する場合、WebAuthn Relying Partyは拡張機能のセットの使用を要求できます。これらの拡張は、クライアントやWebAuthnオーセンティケーターがサポートしていれば、要求された処理中に呼び出されます。Relying Partyは各拡張についてクライアント拡張入力get()認証拡張用)または create()登録拡張用)の呼び出しとともに、クライアントに送信します。 クライアントは、対応する拡張ごとにクライアント拡張処理を行い、クライアントデータ を各拡張で規定された方法で補強し、拡張識別子クライアント拡張出力値を含めます。

拡張機能はまた、オーセンティケーター拡張である場合があります。これは、拡張がオーセンティケーターとの通信やオーセンティケーターでの処理を伴うことを意味します。オーセンティケーター拡張は以下の手順・データを定義します:

オーセンティケーター拡張については、クライアント拡張処理の一環として、クライアントは各拡張のCBOR オーセンティケーター拡張入力値も生成(多くは対応するクライアント拡張入力値に基づく)し、create() 呼び出し時(登録拡張用)、または get() 呼び出し時(認証拡張用)にオーセンティケーターへ渡します。これらのオーセンティケーター拡張入力値はCBORで表現され、名前と値のペア(名前は拡張識別子、値は該当オーセンティケーター拡張入力)として渡します。オーセンティケーターは対応する拡張について追加処理を行い、拡張で定義された各項目のCBOR オーセンティケーター拡張出力を返却します。 オーセンティケーター拡張出力は署名付きオーセンティケーターデータの一部として返されるため、オーセンティケーター拡張は オーセンティケーターデータ自体に依拠する場合など、 未署名拡張出力(unsigned extension output)を定義できる場合もあります。 クライアント拡張処理の一部として、オーセンティケーター拡張では オーセンティケーター拡張出力および 未署名拡張出力を使ってクライアント拡張出力を生成します。

すべてのWebAuthn拡張はクライアント・オーセンティケーター双方に対してOPTIONALです。そのためRelying Partyが要求した拡張は、クライアントブラウザやOSで無視されたり、オーセンティケーターに渡されないことがあります。また、オーセンティケーター側で拡張が無視される場合もあります。 拡張が無視されても、WebAuthn API処理の失敗とはなりません。したがってRelying PartiesはAPIコールで拡張を含める場合、いくつか、あるいはすべての拡張が無視された状況に対応できるよう準備しておく必要があります。

すべてのWebAuthn拡張は、クライアントオーセンティケーターがそれをサポートしていなくてもユーザーのセキュリティやプライバシーを損なわないよう設計されていなければなりません(MUST)。 例えば、拡張がクライアント処理を要求する場合、単純な通過体制としてJSON→CBORのトランスコードのみを行うと意味的に不正となるように設計し、オーセンティケーターで拡張が無視される(認識できない値になる)ようにできます。すべての拡張がOPTIONALならば、API処理が機能的に失敗することはありません。

IANA "WebAuthn Extension Identifiers"レジストリ[IANA-WebAuthn-Registries][RFC8809]で制定)は、登録済みWebAuthn拡張の最新版リストを参照できます。

9.1. 拡張識別子

拡張は、拡張作成者が選ぶ文字列(拡張識別子)で識別されます。

拡張識別子は、 IANA「WebAuthn Extension Identifiers」レジストリ[IANA-WebAuthn-Registries][RFC8809])への登録が推奨されます。 登録済み拡張識別子はユニークです。

未登録の拡張識別子も、グローバル一意性を目指すべきであり、たとえばmyCompany_extensionのように 制定者名を含めてください。

拡張識別子は最大32オクテット・印刷可能なUSASCII文字のみ(バックスラッシュとダブルクォートを除く)でなければなりません。 実装はWebAuthn拡張識別子の比較を大文字小文字区別で行う必要があります。

複数バージョンが存在する拡張は、識別子にバージョンを含める必要があります。これは異なるバージョンが異なる拡張として扱われることを意味します。例:myCompany_extension_01

§ 10 定義済み拡張で、追加の拡張と識別子を定義しています。 最新リストはIANA「WebAuthn Extension Identifiers」レジストリ[IANA-WebAuthn-Registries]および[RFC8809]参照。

9.2. 拡張の定義

拡張の定義には、拡張識別子get() または create() 呼び出しで送信されるクライアント拡張入力引数、 クライアント拡張処理のルール、 クライアント拡張出力 値を指定しなければならない(MUST)。 拡張がオーセンティケーターと通信する場合(オーセンティケーター拡張の場合)、 CBORオーセンティケーター拡張入力引数(authenticatorGetAssertionまたはauthenticatorMakeCredential呼び出しで送信)、 オーセンティケーター拡張処理のルール、 CBORオーセンティケーター拡張出力 値も指定しなければならない(MUST)。 拡張は未署名拡張出力も指定してよい(MAY)。

クライアントが処理するクライアント拡張は必ずクライアント拡張出力値を返却し、 WebAuthn Relying Party が クライアントが拡張に応答したことを識別できるようにしなければならない(MUST)。 同様に、オーセンティケーター処理を要する拡張は必ずオーセンティケーター拡張出力を返却し、 Relying Partyが オーセンティケーター側の応答を認識できるようにする必要がある(MUST)。 もし他に返却値が不要な拡張であれば、JSONのBoolean型クライアント拡張出力結果を true として返却すべきである(SHOULD)。同様に他に返却値不要な オーセンティケーター拡張も Boolean型(CBOR)オーセンティケーター拡張出力結果に true を返却すべきであり(SHOULD)、必ず何か値を返すこと(MUST)。

9.3. リクエストパラメータの拡張

拡張機能は1つまたは2つのリクエスト引数を定義します。クライアント拡張入力は、JSONでエンコード可能な値であり、WebAuthnリライングパーティからクライアントへ get() または create() 呼び出しで渡されます。 一方、CBOR認証器拡張入力は、 これらの呼び出し処理中に、クライアントから認証器へ認証器拡張のために渡されます。

Relying Party は 拡張の利用を要求し、そのクライアント拡張入力extensions オプション (create() または get() 呼び出し)で指定することで同時設定できます。 エントリーキーは拡張識別子、値はクライアント拡張入力です。

Note: 他文書では拡張入力で 拡張識別子をエントリーキーとして使用しない仕様もありますが、 上記の慣例は新しい拡張では適用されます。

var assertionPromise = navigator.credentials.get({
    publicKey: {
        // Other members omitted for brevity
        extensions: {
            // An "entry key" identifying the "webauthnExample_foobar" extension,
            // whose value is a map with two input parameters:
            "webauthnExample_foobar": {
              foo: 42,
              bar: "barfoo"
            }
        }
    }
});

拡張の定義では、そのクライアント拡張入力の有効値を必ず指定しなければなりません(MUST)。クライアントは 無効なクライアント拡張入力を持つ拡張を無視すべきです(SHOULD)。拡張がRelying Partyにパラメータを要求しない場合、Boolean型のクライアント引数を取り、trueで拡張が要求されたことを示す仕様とすべきです(SHOULD)。

クライアント処理のみに影響を与える拡張はオーセンティケーター拡張入力を指定する必要はありません。オーセンティケーター処理を含む拡張は、オーセンティケーター拡張入力クライアント拡張入力からどう導出されるかを指定しなければならず(MUST)、 またCDDLAuthenticationExtensionsAuthenticatorInputs および AuthenticationExtensionsAuthenticatorOutputs の拡張($$extensionInput$$extensionOutputグループソケット)にも、 拡張識別子 をキーとして追加すべきです。パラメータ不要(Boolean型でtrue)の拡張は オーセンティケーター拡張入力も定数Boolean true(CBOR種別7, 値21)とすべきです(SHOULD)。

以下の例は、識別子 webauthnExample_foobar を持つ拡張が、符号なし整数型オーセンティケーター拡張入力をとり、バイト列1つ以上の配列型オーセンティケーター拡張出力 を返すことを示します。

$$extensionInput //= (
  webauthnExample_foobar: uint
)
$$extensionOutput //= (
  webauthnExample_foobar: [+ bytes]
)

一部のオーセンティケーターはBluetooth Low-EnergyやNFCのような低帯域リンクを使うため、拡張はできるだけ引数を小さく設計すべきです(SHOULD)。

9.4. クライアント拡張処理

拡張は、クレデンシャル作成またはアサーション生成時にクライアントへ追加の処理要件を定義してもよい(MAY)。本処理で 拡張のクライアント拡張入力が入力として使用される。 サポートする各クライアント拡張について、 クライアントはclientExtensions マップ拡張識別子をキー、 拡張のクライアント拡張入力 を値として追加する。

同様に、クライアント拡張出力getClientExtensionResults() の結果に辞書型で表現され、拡張識別子がキー、各拡張の クライアント拡張出力値が値となる。 クライアント拡張入力と同様、 クライアント拡張出力もJSONで表現可能な値。 無視された拡張は値を返してはならない(MUST NOT)。

オーセンティケーター処理を要する拡張は、 クライアント拡張入力から CBORオーセンティケーター拡張入力をどう導出するか、 CBORオーセンティケーター拡張出力未署名拡張出力(使う場合)から クライアント拡張出力をどう得るか定義しなければならない(MUST)。

9.5. オーセンティケーター拡張処理

各処理済みオーセンティケーター拡張CBOR オーセンティケーター拡張入力値は、 authenticatorMakeCredentialおよびauthenticatorGetAssertion 操作時のextensionsパラメータに含められる。このextensionsパラメータは CBORマップで、各キーは 拡張識別子、 対応値はその拡張の オーセンティケーター拡張入力

同様に、拡張出力は拡張部にCBORのマップとして表現され、 オーセンティケーターデータ拡張部は 各拡張のオーセンティケーター拡張出力を値とするCBORマップ(キーは拡張識別子)。

未署名拡張出力オーセンティケーターデータと独立して管理され、 オーセンティケーターが同じ拡張識別子をキーとした別マップとして返す。このマップには未署名出力を使うオーセンティケーター拡張のみのエントリが含まれる。 未署名出力は、拡張がオーセンティケーターデータ自体に対し署名を出力する場合(署名がその構造自身を含めることは不可能なため)、あるいは一部の拡張出力をRelying Partyに送らせたくない場合に有用です。

Note: [FIDO-CTAP] では未署名拡張出力unsignedExtensionOutputsというトップレベルCBORフィールドで authenticatorMakeCredentialおよびauthenticatorGetAssertionから返されます。

各サポート拡張ごとに、オーセンティケーター拡張処理 ルールが オーセンティケーター拡張入力や 他の入力から オーセンティケーター拡張出力 および 未署名拡張出力(使う場合)を作る。 無視された拡張は値を返してはならない(MUST NOT)。

10. 定義済み拡張

本節とその子節では、IANA「WebAuthn Extension Identifiers」レジストリ[IANA-WebAuthn-Registries][RFC8809])へ登録される追加の拡張セットを定義します。 これらは広範な相互運用性をターゲットとするユーザエージェントで実装可能です。

10.1. クライアント拡張

本節ではクライアント拡張のみを定義します。

10.1.1. FIDO AppID拡張(appid)

この拡張機能は、以前レガシーなFIDO U2F JavaScript API [FIDOU2FJavaScriptAPI] を使用して認証情報を登録した WebAuthn リライングパーティ が、アサーション を要求できるようにします。FIDO APIは リライングパーティ のための別の識別子 AppID [FIDO-APPID] を使用し、それらAPIで作成された認証情報はその識別子に スコープ されます。この拡張機能がない場合、それらを スコープ し直すには再登録が必要になります。RP ID にスコープさせるためです。

appid 拡張入力を設定することに加え、この拡張を使うには、リライングパーティ が追加の処理を行い、利用者が登録済みのU2F認証情報で 認証 できるようにする必要があります。

  1. 希望するU2F認証情報を allowCredentials オプション の get() メソッドにリストします。

    • type メンバーを public-key に設定します。

    • id メンバーを希望する認証情報の該当U2Fキー・ハンドルに設定します。U2Fキー・ハンドルは通常 base64urlエンコーディング ですが、id で利用する際はバイナリ形式にデコードしなければなりません。

    allowCredentials にはWebAuthn credential ID とU2Fキー・ハンドルが混在しても構いません。 この拡張により appid を指定したとしても、WebAuthnで登録した認証情報を使い、指定したRP IDにスコープされている場合には利用できます。

  2. アサーションの検証時に、rpIdHashAppID のハッシュになっている場合があり、RP ID のハッシュとは限らない点に注意します。

この拡張はFIDO互換の認証情報を作成することはできません。そのため、WebAuthnで作成された認証情報はFIDO JavaScript APIと後方互換性がありません。

注意:appid には、リライングパーティ が過去にレガシーなFIDO APIで利用していたAppIDを指定してください。 これは、リライングパーティのWebAuthn RP ID をAppID形式に変換した結果と同じとは限りません。 例えば、以前使われていたAppIDが "https://accounts.example.com" の場合、現在のRP IDは "example.com" となることもあります。

拡張識別子

appid

運用適用範囲

認証

クライアント拡張入力

FIDOのAppIDを指定するDOMString

partial dictionary AuthenticationExtensionsClientInputs {
  DOMString appid;
};
partial dictionary AuthenticationExtensionsClientInputsJSON {
  DOMString appid;
};
クライアント拡張処理
  1. facetId を、呼び出し元のオリジン を FIDOの呼び出しアプリケーションのFacetIDの決定 アルゴリズムに渡して得ます。

  2. appId を拡張入力とします。

  3. facetIdappId を FIDOの呼び出し元のFacetIDがAppIDに対して認可されているかの決定アルゴリズムに渡します。そのアルゴリズムが appId を却下した場合は "SecurityError" DOMException を返します。

  4. allowCredentialDescriptorListの構築時に、 U2F認証器が認証情報が無効であることを示す場合(例:SW_WRONG_DATA が返る)、クライアントはU2Fアプリケーションパラメータを appId のSHA-256ハッシュに設定してリトライしなければなりません。これで有効となる場合は、その認証情報を allowCredentialDescriptorList に含める必要があります。その場合、appId の値が authenticatorGetAssertionrpId パラメータの代わりになります。

  5. output をブール値 false にします。

  6. assertionCreationDataの作成時に、 アサーション がU2F認証器で、U2Fアプリケーションパラメータが appId のSHA-256ハッシュで作成された場合は、outputtrue に設定します。

注意: 実際には、いくつかの実装では 呼び出し元のFacetIDがAppIDに対して認可されているかの決定の アルゴリズムの4ステップ以降は実装されていません。 代わりに、3ステップ目のホスト比較が、同一サイト 上のホストを許容するよう緩和されています。

クライアント拡張出力

output の値を返します。trueの場合、AppID が使われていたことになり、アサーションの検証時には リライングパーティrpIdHashAppIDのハッシュであると想定し、RP ID のハッシュではないことに注意します。

partial dictionary AuthenticationExtensionsClientOutputs {
  boolean appid;
};
partial dictionary AuthenticationExtensionsClientOutputsJSON {
  boolean appid;
};
認証器拡張入力

なし

認証器拡張処理

なし

認証器拡張出力

なし

10.1.2. FIDO AppID除外拡張(appidExclude)

この登録拡張は、WebAuthn リライングパーティ が、レガシーな FIDO U2F JavaScript API [FIDOU2FJavaScriptAPI] で作成された特定の認証情報を含む認証器を除外できるようにします。

FIDO U2F JavaScript APIからの移行中、リライングパーティ はすでにレガシー認証情報を登録済みのユーザーを抱えている場合があります。appid拡張はサインインフローをスムーズに移行することを可能にしますが、登録フローを移行する際には、excludeCredentials フィールドの内容は WebAuthn の認証情報として扱われるため、レガシー認証情報を持つ認証器の除外には有効ではありません。この拡張は クライアントプラットフォーム に、excludeCredentials の内容を WebAuthn とレガシー FIDO の認証情報の両方として扱うよう指示します。なお、U2F キーハンドルは通常 base64url エンコーディング されていますが、excludeCredentials で利用する際はバイナリ形式にデコードしなければなりません。

拡張識別子

appidExclude

運用適用範囲

登録

クライアント拡張入力

FIDO の AppID を指定する単一の DOMString

partial dictionary AuthenticationExtensionsClientInputs {
  DOMString appidExclude;
};
partial dictionary AuthenticationExtensionsClientInputsJSON {
  DOMString appidExclude;
};
クライアント拡張処理

新しい認証情報を作成する際:

  1. RP ID の決定直後に以下の手順を実行します。

    1. facetId を、呼び出し元のオリジンをFIDO の呼び出しアプリケーションの FacetID の決定アルゴリズムに渡して得た結果とします。

    2. appId を拡張入力 appidExclude の値とします。

    3. facetIdappId を FIDO の呼び出し元の FacetID が AppID に対して認可されているかの決定アルゴリズムに渡します。もし当該アルゴリズムが appId を却下した場合は、 "SecurityError" DOMException を返し、 新しい認証情報を作成アルゴリズムおよびこれらの手順を終了します。

      注意: 実際には、複数の実装で呼び出し元の FacetID が AppID に対して認可されているかの決定アルゴリズムの4ステップ目以降は実装されていません。代わりに3 ステップ目のホスト比較が、同一サイト上のホストを許容するよう緩和されます。

    4. それ以外は通常通り処理を続行します。

  2. authenticatorMakeCredential の呼び出し直前に以下の手順を実行します。

    1. もし authenticator が U2F プロトコル [FIDO-U2F-Message-Formats] をサポートする場合は、 認証情報ディスクリプタ C について excludeCredentialDescriptorList を反復します。

      1. Cauthenticator で U2F を用いて作成されたかどうか、authenticator に "five parts" を以下の値で設定した U2F_AUTHENTICATE メッセージを送信して確認します。

        control byte

        0x07 ("check-only")

        challenge parameter

        ランダムな32バイト

        application parameter

        appId の SHA-256 ハッシュ

        key handle length

        C.id の長さ(バイト数)

        key handle

        C.id の値 (認証情報ID

      2. もし authenticatormessage:error:test-of-user-presence-required(=成功)で応答した場合は、当該 authenticator の通常処理を中断し、プラットフォーム固有の方法で認証器が無効であることを示します。たとえばUIで表示したり、ユーザー同意authenticator から求めた上で、応答後に InvalidStateError を返した時と同じ扱いとします。ユーザー同意 の要求は、control byte0x03 ("enforce-user-presence-and-sign") にした U2F_AUTHENTICATE メッセージをもう一度送ればよく、応答は無視します。

    2. その後は通常通り処理を続行します。

クライアント拡張出力

拡張が有効だったことを リライングパーティ に示すため true の値を返します。

partial dictionary AuthenticationExtensionsClientOutputs {
  boolean appidExclude;
};
partial dictionary AuthenticationExtensionsClientOutputsJSON {
  boolean appidExclude;
};
認証器拡張入力

なし

認証器拡張処理

なし

認証器拡張出力

なし

10.1.3. クレデンシャルプロパティ拡張(credProps)

このクライアント登録拡張機能は、登録セレモニーの結果として公開鍵クレデンシャルソースが作成される際、クライアントが知っている特定のクレデンシャルプロパティをリクエストしたWebAuthn Relying Partyに報告することを容易にします。

現時点では、1つのクレデンシャルプロパティが定義されています。それは、クライアントサイド発見可能クレデンシャルプロパティです。

拡張機能識別子

credProps

適用操作

登録

クライアント拡張機能入力

この拡張機能がRelying Partyにより要求されたことを示すBoolean値trueです。

partial dictionary AuthenticationExtensionsClientInputs {
    boolean credProps;
};
partial dictionary AuthenticationExtensionsClientInputsJSON {
    boolean credProps;
};
クライアント拡張機能処理

rk を、invocationで使用されたrequireResidentKeyパラメータの値に設定します。

クライアント拡張機能出力

Set clientExtensionResults["credProps"]["rk"] を、invocationで使用されたrequireResidentKeyパラメータの値に設定します。

dictionary CredentialPropertiesOutput {
    boolean rk;
};

partial dictionary AuthenticationExtensionsClientOutputs {
    CredentialPropertiesOutput credProps;
};
partial dictionary AuthenticationExtensionsClientOutputsJSON {
    CredentialPropertiesOutput credProps;
};
rk, boolean

このオプションのプロパティは、抽象的にはクライアントサイド検出可能クレデンシャルプロパティ またはレジデントキークレデンシャルプロパティ と呼ばれ、 PublicKeyCredential登録セレモニーによって返されるものがクライアントサイド検出可能クレデンシャルであるかを示すBoolean値です。 rktrueの場合、そのクレデンシャルは検出可能クレデンシャルです。 rkfalseの場合、そのクレデンシャルはサーバーサイドクレデンシャルです。 rk が存在しない場合、そのクレデンシャルが検出可能クレデンシャルサーバーサイドクレデンシャルかは不明です。

注: 一部の認証器クライアントプラットフォームからリクエストされていなくても検出可能クレデンシャルを作成します。このため、クライアントプラットフォームrkプロパティをfalseで設定する保証ができず、省略せざるを得ない場合があります。Relying PartiescredProps拡張機能がサポートされている場合、クライアントプラットフォームrkプロパティをできる限り埋めるよう努めると考えるべきです。したがってrkが欠落している場合、その作成されたクレデンシャルはおそらく非検出可能クレデンシャルであることを意味します。

認証器拡張機能入力

なし

認証器拡張機能の処理

なし

認証器拡張機能出力

なし

10.1.4. 疑似乱数関数拡張(prf

この クライアント登録拡張機能 および 認証拡張機能 は、Relying Party が、クレデンシャル に関連付けられた擬似乱数生成関数(PRF)からの出力を評価できるようにします。 この拡張機能が提供する PRF は、任意の長さの BufferSource を入力として受け取り、32 バイトの BufferSource を出力します。

例として、PRF 出力を対称鍵としてユーザーデータを暗号化することが考えられます。こうして暗号化されたデータは、関連する クレデンシャル からアサーションを取得できない限りアクセスできません。以下の規定を用いて 1 回の アサーション 操作で 2 つの入力に対して PRF を評価することにより、アサーション時に新しいランダムな入力を選んで出力に基づいて再暗号化することで、暗号鍵を定期的にローテーションできます。評価入力が予測不能であれば、たとえ攻撃者が ユーザー検証 を満たし、認証器に時間限定のアクセスを持っていたとしても、正しい PRF 入力を知らなければ暗号鍵を知ることはできません。

この拡張機能は [FIDO-CTAP]hmac-secret 拡張を基にモデル化されていますが、他の方法でも実装可能です。 hmac-secret は入力と出力をユーザーエージェントだけが処理できる方法で暗号化することを要求するため、また WebAuthn による利用と基盤プラットフォームによる利用を分離するために、これは別個の クライアント拡張機能 となっています。 この分離は、与えられた PRF 入力をコンテキスト文字列とともにハッシュ化することで、任意の入力に対する PRF の評価を防ぐことで実現されています。

hmac-secret 拡張はクレデンシャルごとに 2 つの PRF を提供します:1 つは ユーザー検証 が行われるリクエストで使用されるもの、もう 1 つはそれ以外のリクエストで使用されるものです。この拡張はクレデンシャルごとに単一の PRF のみを公開し、hmac-secret 上に実装する場合、その PRF は ユーザー検証 が行われる場合に使用される方でなければなりません。必要ならばこれは UserVerificationRequirement を上書きします。

この拡張機能は、認証器[FIDO-CTAP] を使用しない場合にも実装され得ます。 クライアントと 認証器 間のインターフェースや、認証器による PRF の構成は抽象的にしか規定されていません。

注意: hmac-secret の上に実装すると、通常は存在しない 認証器拡張出力 が発生します。 これらの出力は暗号化されており、Relying Party によって使用できませんし、authenticator data が署名されているためクライアントから削除することもできません。

拡張機能識別子

prf

操作の適用範囲

登録 および 認証

クライアント拡張入力
dictionary AuthenticationExtensionsPRFValues {
    required BufferSource first;
    BufferSource second;
};
dictionary AuthenticationExtensionsPRFValuesJSON {
    required Base64URLString first;
    Base64URLString second;
};

dictionary AuthenticationExtensionsPRFInputs {
    AuthenticationExtensionsPRFValues eval;
    record<DOMString, AuthenticationExtensionsPRFValues> evalByCredential;
};
dictionary AuthenticationExtensionsPRFInputsJSON {
    AuthenticationExtensionsPRFValuesJSON eval;
    record<DOMString, AuthenticationExtensionsPRFValuesJSON> evalByCredential;
};

partial dictionary AuthenticationExtensionsClientInputs {
    AuthenticationExtensionsPRFInputs prf;
};
partial dictionary AuthenticationExtensionsClientInputsJSON {
    AuthenticationExtensionsPRFInputsJSON prf;
};
eval, の型 AuthenticationExtensionsPRFValues

PRF を評価するための 1 個または 2 個の入力。すべての 認証器 がクレデンシャル作成時に PRF の評価をサポートしているわけではないため、出力が提供されない場合があります。その場合は出力を取得するために アサーション が必要です。

evalByCredential, の型 record<DOMString, AuthenticationExtensionsPRFValues>

base64url エンコードされた クレデンシャル ID を、当該クレデンシャルの評価に使う PRF 入力へ対応付けるレコード。これは allowCredentials が空でない場合の アサーション 時にのみ適用されます。

クライアント拡張処理(登録
  1. evalByCredential が存在する場合は、名前が “NotSupportedError” の DOMException を返します。

  2. eval が存在する場合:

    • salt1SHA-256(UTF8Encode("WebAuthn PRF") || 0x00 || eval.first) の値とします。

    • もし eval.second が存在するなら、salt2SHA-256(UTF8Encode("WebAuthn PRF") || 0x00 || eval.second) の値とします。

  3. 認証器が CTAP2 の hmac-secret 拡張をサポートしている場合([FIDO-CTAP]):

    1. 認証器拡張入力で hmac-secrettrue に設定します。

    2. もし salt1 が定義されており、将来の [FIDO-CTAP] の拡張が作成時の PRF 評価を許可する場合は、salt1 と(定義されていれば)salt2 の値を用いて hmac-secret の入力を構成します。

    3. enabled を認証器拡張出力の hmac-secret の値に設定します。もし存在しなければ enabledfalse に設定します。

    4. results を、復号された PRF 結果(ある場合)に設定します。

  4. 認証器が CTAP2 hmac-secret 拡張をサポートしていないが、下記の抽象的な認証器処理と互換な別の実装をサポートする場合:

    1. enabledtrue に設定します。

    2. もし salt1 が定義されているなら、不特定の機構を用いて salt1 および(定義されていれば)salt2 を、その順序で認証器に PRF 入力として伝えます。

    3. 不特定の機構を用いて認証器から PRF 出力を受け取り、評価結果があれば results にその評価結果を設定します。

クライアント拡張処理(認証
  1. evalByCredential が空でないが allowCredentials が空である場合は、名前が “NotSupportedError” の DOMException を返します。

  2. evalByCredential の任意の キー が空文字列である、または有効な base64url エンコーディング でない、あるいは base64url デコード後に idallowCredentials の要素のいずれかと一致しない場合は、名前が “SyntaxError” の DOMException を返します。

  3. prf 拡張出力を空の辞書として初期化します。

  4. ev を null にし、適用可能な PRF 入力を見つけようとします:

    1. もし evalByCredential が存在し、かつ contains が、返されるクレデンシャル ID の base64url エンコーディング と一致する エントリキー を持つ場合は、そのエントリの ev に設定します。

    2. もし ev が null で、かつ eval が存在する場合は、eval の値を ev にします。

  5. もし ev が null でなければ:

    1. salt1SHA-256(UTF8Encode("WebAuthn PRF") || 0x00 || ev.first) の値とします。

    2. もし ev.second が存在するなら、salt2SHA-256(UTF8Encode("WebAuthn PRF") || 0x00 || ev.second) の値とします。

    3. もし認証器が CTAP2 の hmac-secret 拡張をサポートしている場合([FIDO-CTAP]):

      1. salt1 および(設定されていれば)salt2 の値を同名のパラメータとして用い、認証器に hmac-secret 拡張を送信します。

      2. 拡張結果を復号し、もしあれば PRF 結果を results に設定します。

    4. 認証器が CTAP2 hmac-secret 拡張をサポートしておらず、下記の抽象的認証器処理と互換な別実装をサポートする場合:

      1. 不特定の機構を用いて salt1 と(定義されていれば)salt2 をその順序で認証器に PRF 入力として伝えます。

      2. 不特定の機構を用いて、認証器から PRF 出力を AuthenticationExtensionsPRFValues 型の値 results として受け取り、resultsresults を設定します。

認証器拡張入力/出力

この拡張 は、認証器実装に対して抽象化されています。認証器との通信においては [FIDO-CTAP]hmac-secret 拡張を利用するか、あるいはクライアントと認証器間の通信のための未指定のインターフェースを用いることができます。したがって、入力および出力に対する CBOR インターフェースはここでは指定されません。

認証器拡張処理

認証器[FIDO-CTAP]hmac-secret 拡張をサポートする場合、その認証器は当該拡張で定義された認証器処理を実装します。

認証器[FIDO-CTAP]hmac-secret 拡張をサポートしていない場合でも、代わりに以下の抽象的手順を実装してもかまいません:

  1. 現在の クレデンシャル に関連付けられている擬似乱数生成関数を PRF とする、または未初期化なら関連付けを初期化します:

    PRF を、出力が正確に 32 バイトである擬似乱数生成関数とします。これは少なくとも 2^256 個の関数から一様にランダムに選ばれるべきです。PRF の選択は ユーザー検証 の状態に依存してはなりません。選択された PRF はこの拡張の実装以外の目的で使用すべきではありません。選択した PRF はクレデンシャルのライフタイムの間、そのクレデンシャルに関連付けられます。

  2. 不特定の機構を用いて、クライアントから順に PRF 入力 salt1 および(オプションで)salt2 を受け取ります。何も受け取られない場合は salt1salt2 は未定義とします。

  3. もし salt1 が定義されている場合:

    1. results を、与えられた入力での PRF の評価を含む AuthenticationExtensionsPRFValues 構造とします:

      • results.firstPRF(salt1) に設定します。

      • もし salt2 が定義されていれば、results.secondPRF(salt2) に設定します。

    2. 不特定の機構を用いて results をクライアントに PRF 出力として伝えます。

クライアント拡張出力
dictionary AuthenticationExtensionsPRFOutputs {
    boolean enabled;
    AuthenticationExtensionsPRFValues results;
};
dictionary AuthenticationExtensionsPRFOutputsJSON {
    boolean enabled;
    AuthenticationExtensionsPRFValuesJSON results;
};

partial dictionary AuthenticationExtensionsClientOutputs {
    AuthenticationExtensionsPRFOutputs prf;
};
partial dictionary AuthenticationExtensionsClientOutputsJSON {
    AuthenticationExtensionsPRFOutputsJSON prf;
};
enabled, の型 boolean

作成されたクレデンシャルで PRF が利用可能である場合に限り true になります。これは 登録 の際にのみ報告され、認証 の場合には存在しません。

results, の型 AuthenticationExtensionsPRFValues

eval または evalByCredential で指定された入力に対して PRF を評価した結果です。出力は 登録 時には利用できない場合があります;詳細は eval の注記を参照してください。

用途によっては、例えば PRF 出力をクライアント側のみで使用する暗号鍵の導出に使う場合など、results 出力を省略する必要があるかもしれません(例えば PublicKeyCredential をリモートサーバーに送信する場合など、§ 7 WebAuthn Relying Party Operations の手続きを行うとき)。特に RegistrationResponseJSON および AuthenticationResponseJSONPublicKeyCredential.toJSON() によって返される場合、もし存在すればこの results 出力が含まれることに注意してください。

10.1.5. ラージブロブストレージ拡張(largeBlob

この クライアント登録拡張機能 および 認証拡張機能 は、Relying Party がクレデンシャルに関連付けられた不透明なデータを保存できるようにします。認証器 は少量のデータしか保存できず、ほとんどの Relying Parties はユーザーの状態を任意の量で保存できるオンラインサービスであるため、これは特定のケースでのみ有用です。たとえば、Relying Party は集中型の認証サービスを運用する代わりに証明書を発行したい場合があります。

Note: Relying Parties は、不透明なデータが容量の限られたデバイスに書き込まれる際に圧縮されると仮定できるため、自分で圧縮する必要はありません。

証明書システムはクレデンシャルの公開鍵に対して署名する必要があり、その公開鍵は作成後にしか利用できないため、この拡張機能は 登録 コンテキストでブロブを書き込む能力を追加しません。しかし、将来 認証拡張機能 を使用したい場合、Relying Parties はクレデンシャルを作成する際に 登録拡張機能 を利用するべきです。

証明書は典型的な認証器の保存能力に対して大きいため、ユーザーエージェントはこの限られたリソースの割り当てをユーザーに適切に案内し悪用を防ぐために、どのような表示や確認が適切かを検討するべきです。

Note: 相互運用のため、[FIDO-CTAP] を使用して認証器に大きなブロブを保存するユーザーエージェントは、その仕様で詳述されている 大きな per-credential ブロブの保存 に関する規定を使用することが期待されます。

Note: ローミング認証器 は、クロスプラットフォームのトランスポートプロトコルとして [FIDO-CTAP] を使用する場合、この Large Blob 拡張機能を discoverable credentials のみに対してサポートし、そうでない場合はエラーを返すことがあります。そのときは authenticatorSelection.residentKeypreferred または required に設定されている必要があるかもしれません。しかし、認証器 の中には [FIDO-CTAP] を利用しないものもあり、それらはこの拡張を必ずしも discoverable credentials に限定しない可能性があります。

Extension identifier

largeBlob

Operation applicability

Registration および authentication

Client extension input
partial dictionary AuthenticationExtensionsClientInputs {
    AuthenticationExtensionsLargeBlobInputs largeBlob;
};
partial dictionary AuthenticationExtensionsClientInputsJSON {
    AuthenticationExtensionsLargeBlobInputsJSON largeBlob;
};

enum LargeBlobSupport {
  "required",
  "preferred",
};

dictionary AuthenticationExtensionsLargeBlobInputs {
    DOMString support;
    boolean read;
    BufferSource write;
};
dictionary AuthenticationExtensionsLargeBlobInputsJSON {
    DOMString support;
    boolean read;
    Base64URLString write;
};
support, of type DOMString

DOMString で、LargeBlobSupport の値のいずれかを取ります。(§ 2.1.1 Enumerations as DOMString types を参照。)これは 登録 時のみ有効です。

read, of type boolean

このブール値は、Relying Party が、主張されたクレデンシャルに関連付けて以前に書き込まれたブロブを取得したいことを示します。これは 認証 時のみ有効です。

write, of type BufferSource

これは Relying Party が既存のクレデンシャルとともに保存したい不透明なバイト列です。これは 認証 時のみ有効です。

Client extension processing (registration)
  1. もし read または write が存在するなら:

    1. DOMException を返します。その name は “NotSupportedError” です。

  2. もし support が存在し、その値が required であるなら:

    1. supportedtrue に設定します。

      Note: これは大きなブロブを格納できる認証器が利用可能になることを見越したものです。これは [[Create]](origin, options, sameOriginWithAncestors)step 12 の拡張処理中に発生します。満足のいく認証器が利用可能にならなければ、AuthenticationExtensionsLargeBlobOutputs は破棄されます。

    2. もし 候補認証器 が利用可能になった場合([[Create]](origin, options, sameOriginWithAncestors)step 22)、 その候補認証器が大きなブロブを格納できない場合は、どの options の評価より先にその候補認証器を無視(i.e. continue)します。

  3. それ以外(つまり support が存在しないか、値が preferred の場合):

    1. もし 認証器が選択され かつ選択された 認証器 が大きなブロブをサポートするなら、supportedtrue に、そうでなければ false に設定します。

Client extension processing (authentication)
  1. もし support が存在するなら:

    1. DOMException を返します。その name は “NotSupportedError” です。

  2. もし readwrite の両方が存在するなら:

    1. DOMException を返します。その name は “NotSupportedError” です。

  3. もし read が存在し値が true であるなら:

    1. クライアント拡張出力 を初期化します:largeBlob

    2. もし任意の認証器が成功を示すなら([[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) 内で)、 主張されたクレデンシャルに関連付けられた largeBlob データの読み取りを試みます。

    3. もし成功したら、blob に結果を設定します。

      Note: 読み取りに成功しなかった場合、largeBlobAuthenticationExtensionsClientOutputs に存在しますが、blob メンバーは存在しません。

  4. もし write が存在するなら:

    1. もし allowCredentials が正確に 1 要素を含んでいないなら:

      1. DOMException を返します。その name は “NotSupportedError” です。

    2. もし assertion 操作が成功したら、指定されたクレデンシャルに関連付けて、write の内容を認証器に保存することを試みます。

    3. 成功した場合は writtentrue に、そうでなければ false に設定します。

Client extension output
partial dictionary AuthenticationExtensionsClientOutputs {
    AuthenticationExtensionsLargeBlobOutputs largeBlob;
};
partial dictionary AuthenticationExtensionsClientOutputsJSON {
    AuthenticationExtensionsLargeBlobOutputsJSON largeBlob;
};

dictionary AuthenticationExtensionsLargeBlobOutputs {
    boolean supported;
    ArrayBuffer blob;
    boolean written;
};
dictionary AuthenticationExtensionsLargeBlobOutputsJSON {
    boolean supported;
    Base64URLString blob;
    boolean written;
};
supported, of type boolean

作成されたクレデンシャルが大きなブロブの保存をサポートする場合に限り true になります。これは 登録 出力にのみ存在します。

blob, of type ArrayBuffer

これは rawId によって識別されるクレデンシャルに関連付けられた不透明なバイト列です。これは readtrue であった場合にのみ有効です。

written, of type boolean

これは write の内容が指定されたクレデンシャルに関連付けて認証器上に正常に保存されたかどうかを示すブール値です。

Authenticator extension processing

この拡張機能 は、ユーザーエージェントに対して大きなブロブを認証器に保存または認証器から取得させることを指示します。したがって、Relying Parties に対する直接的な認証器とのやり取りはここでは規定しません。

10.2. 認証器拡張

本節では、クライアント拡張かつ認証器拡張の両方である拡張を定義します。

本節は現在空です。

11. ユーザーエージェントの自動化

ユーザーエージェントの自動化やウェブアプリケーションテスト目的のために、本書ではいくつかの[WebDriver] 拡張コマンドを定義します。

11.1. WebAuthn WebDriver拡張機能

以下で定義される拡張コマンドの利用可能性を広告するため、新しい拡張ケイパビリティ(extension capability)を定義します。

ケイパビリティ キー 値の型 説明
バーチャル認証器サポート "webauthn:virtualAuthenticators" boolean エンドポイントノードが、すべてのバーチャル認証器コマンドをサポートしているかどうか示します。

ケイパビリティのバリデーション時に、"webauthn:virtualAuthenticators"valueでバリデートする拡張特有のサブ手順は以下の通りです:

  1. valuebooleanでない場合、WebDriverエラーWebDriverエラーコード invalid argument)を返します。

  2. それ以外の場合、deserializedvalueを設定します。

ケイパビリティのマッチング時に、"webauthn:virtualAuthenticators"valueでマッチするための拡張特有の手順は次の通りです:

  1. valuetrueかつエンドポイントノードがいずれのバーチャル認証器コマンドもサポートしていない場合、 マッチ失敗とする。

  2. それ以外はマッチ成功とする。

11.1.1. 認証器拡張ケイパビリティ

さらに、本仕様で定義された各認証器拡張認証器拡張処理を定義するもの)ごとに、拡張ケイパビリティが定義されます:

ケイパビリティ キー 値の型 説明
疑似乱数関数拡張サポート "webauthn:extension:prf" boolean エンドポイントノードのWebAuthn WebDriver実装がprf拡張をサポートするか示す。
ラージブロブストレージ拡張サポート "webauthn:extension:largeBlob" boolean エンドポイントノードのWebAuthn WebDriver実装がlargeBlob拡張をサポートするか示す。
credBlob拡張サポート "webauthn:extension:credBlob" boolean エンドポイントノードのWebAuthn WebDriver実装が[FIDO-CTAP]で定義されるcredBlob拡張をサポートするか示す。

ケイパビリティバリデーション時に、認証器拡張ケイパビリティkeyvalueでバリデートする拡張特有サブ手順は以下の通りです:

  1. valuebooleanでない場合、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

  2. それ以外の場合はdeserializedvalueをセット。

ケイパビリティマッチング時に、認証器拡張ケイパビリティkeyvalueでマッチするための手順は次のとおりです:

  1. valuetrueで、エンドポイントノードのWebAuthn WebDriver実装がkeyで識別される認証器拡張をサポートしていなければ、マッチ失敗とする。

  2. それ以外はマッチ成功。

定義済み認証器拡張を実装するUser-Agentは、それに対応する認証器拡張ケイパビリティも実装するべきです。

11.2. バーチャル認証器

これらのWebDriverの拡張コマンドは、バーチャル認証器認証器モデルのソフトウェア実装)を作成し、操作します。バーチャル認証器バーチャル認証器データベースに記録されます。 保持されている各バーチャル認証器には下記プロパティがあります:

authenticatorId

仮想認証器 を一意に識別する、[RFC3986] の付録Aで定義された unreserved 生産の文字を最大48文字まで使って生成される非nullの文字列。

protocol

仮想認証器 が話すプロトコル。"ctap1/u2f""ctap2"、または "ctap2_1" のいずれか。 [FIDO-CTAP] 参照。

transport

シミュレートされる AuthenticatorTransporttransportinternal に設定されている場合、認証器は プラットフォームアタッチメント をシミュレートします。そうでない場合は、クロスプラットフォームアタッチメント をシミュレートします。

hasResidentKey

true に設定されている場合、認証器は クライアントサイド検出可能クレデンシャル をサポートします。

hasUserVerification

true に設定されている場合、この認証器は ユーザー検証 をサポートします。

isUserConsenting

すべての ユーザー同意 および 認可ジェスチャ の結果、さらに ユーザー在席テスト も決定します。 仮想認証器 上で行われます。true に設定されている場合、 ユーザー同意 は常に認可されます。false の場合は認可されません。

isUserVerified

仮想認証器 で実行される ユーザー検証 の結果を決定します。 true に設定されている場合、ユーザー検証 は常に成功します。 false なら失敗します。

Note: hasUserVerificationfalse ならこのプロパティは効果がありません。

extensions

仮想認証器 がサポートする 拡張機能識別子 の文字列配列です。

仮想認証器extensions 配列内のすべての 認証器拡張 をサポートしなければなりません。 また、extensions 配列に存在しない 認証器拡張 をサポートしてはなりません。

defaultBackupEligibility

新しく作成されたすべての 公開鍵クレデンシャルソース に対する クレデンシャルプロパティバックアップ適格性 のデフォルト状態を決定します。 この値は、仮想認証器 を使った authenticatorMakeCredential 操作時の authenticator dataBE フラグ に反映されなければなりません。

defaultBackupState

新しく作成されたすべての 公開鍵クレデンシャルソース に対する クレデンシャルプロパティバックアップ状態 のデフォルト状態を決定します。 この値は、仮想認証器 を使った authenticatorMakeCredential 操作時の authenticator dataBS フラグ に反映されなければなりません。

11.3. バーチャル認証器の追加

仮想認証器の追加 WebDriver 拡張コマンドは、ソフトウェアの仮想認証器を作成します。定義は次の通りです:

HTTPメソッド URIテンプレート
POST /session/{session id}/webauthn/authenticator

認証器設定は、Object型のJSONで、リモートエンドステップparametersとして渡されます。以下のkeyvalueのペアを含みます:

キー 値の型 有効な値 デフォルト
protocol string "ctap1/u2f", "ctap2", "ctap2_1" なし
transport string AuthenticatorTransport の値 なし
hasResidentKey boolean true, false false
hasUserVerification boolean true, false false
isUserConsenting boolean true, false true
isUserVerified boolean true, false false
extensions string配列 拡張識別子を含む配列 空配列
defaultBackupEligibility boolean true, false false
defaultBackupState boolean true, false false

リモートエンドステップは次の通りです:

  1. parameters が JSON Object でない場合、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

    Note: parameters認証器設定オブジェクトです。

  2. authenticator を新しい仮想認証器として生成する。

  3. parameters内のすべて列挙可能な自分自身のプロパティについて繰り返す:

    1. プロパティ名をkeyとする。

    2. parametersから名前keyプロパティ取得の結果をvalueとする。

    3. 認証器設定keyに一致するkeyがない場合、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

    4. valueがそのkeyに対しvalid valuesのいずれでもない場合、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

    5. プロパティ設定で、authenticator上のkeyvalueを設定する。

  4. 認証器設定のデフォルト値が定義されている全プロパティについて:

    1. authenticatorのプロパティとしてkeyが未定義の場合は、プロパティ設定defaultをセットする。

  5. 認証器設定の全プロパティについて:

    1. authenticatorのプロパティとしてkeyが未定義なら、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

  6. authenticator.extensionsの各extensionについて:

    1. extensionが当該エンドポイントノードWebAuthn WebDriver実装でサポートされていない拡張識別子なら、WebDriverエラーWebDriverエラーコード unsupported operation)を返す。

  7. 有効で一意なauthenticatorIdを生成する。

  8. プロパティ設定authenticatorauthenticatorIdauthenticatorIdをセットする。

  9. authenticator仮想認証器データベースに保存する。

  10. 成功として、データauthenticatorIdを返す。

11.4. 仮想認証器の削除

仮想認証器の削除 WebDriver 拡張コマンドは、既に作成された仮想認証器を削除します。 定義は次の通りです:

HTTPメソッド URIテンプレート
DELETE /session/{session id}/webauthn/authenticator/{authenticatorId}

リモートエンドステップは次の通りです:

  1. authenticatorId仮想認証器として仮想認証器データベースに保存されていない場合、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

  2. authenticatorIdで識別される仮想認証器仮想認証器データベースから削除する。

  3. 成功を返す。

11.5. クレデンシャルの追加

クレデンシャルの追加 WebDriver 拡張コマンドは、既存の仮想認証器公開鍵クレデンシャルソース をインジェクトします。定義は次の通りです:

HTTPメソッド URIテンプレート
POST /session/{session id}/webauthn/authenticator/{authenticatorId}/credential

クレデンシャルパラメータは、Object 型の JSON で、リモートエンドステップparametersとして渡されます。次のkeyvalueのペアを含みます:

キー 説明 値の型
credentialId クレデンシャルIDBase64url エンコードしたもの。 string
isResidentCredential true の場合、クライアントサイド検出可能クレデンシャルを作成。falseの場合はサーバーサイドクレデンシャル となる。 boolean
rpId クレデンシャルがスコープされるRelying Party IDstring
privateKey プライベートキー を一つ含む非対称鍵パッケージ。[RFC5958] に準拠し、Base64url エンコードでエンコード。 string
userHandle userHandleBase64url エンコード。未定義の場合もある。 string
signCount 署名カウンターの初期値。公開鍵クレデンシャルソース に関連。 number
largeBlob 大きな per-credential ブロブ公開鍵クレデンシャルソースに関連し、Base64url エンコードでエンコード。未定義の場合もある。 string
backupEligibility バックアップ適格性のシミュレーション値。未設定時は仮想認証器defaultBackupEligibilityを使う。 バックアップ適格性BE authenticator dataフラグに反映されること。 boolean
backupState バックアップ状態のシミュレーション値。未設定時は仮想認証器defaultBackupStateを使う。 バックアップ状態BS authenticator dataフラグに反映されること。 boolean
userName username 。未設定の場合、空文字列となる。 string
userDisplayName userdisplayName 。未設定の場合、空文字列となる。 string

リモートエンドステップは次の通りです:

  1. parameters が JSON Object でない場合、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

    Note: parametersクレデンシャルパラメータ オブジェクト。

  2. parameterscredentialIdプロパティに対しBase64urlデコードした結果をcredentialIdとする。

  3. credentialIdが失敗なら、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

  4. parametersisResidentCredentialプロパティをisResidentCredentialとする。

  5. isResidentCredentialが未定義なら、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

  6. parametersrpIdプロパティをrpIdとする。

  7. rpIdが有効なRP IDでなければ、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

  8. parametersprivateKeyプロパティに対しBase64urlデコードした結果をprivateKeyとする。

  9. privateKeyが失敗なら、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

  10. privateKeyが正しい形式のP-256カーブECDSA秘密鍵([RFC5958]に準拠)でなければ、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

  11. parametersuserHandleプロパティが定義されている場合:

    1. parametersuserHandleプロパティに対しBase64urlデコードした結果をuserHandleとする。

    2. userHandleが失敗なら、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

  12. そうでない場合:

    1. isResidentCredentialtrueの場合、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

    2. userHandlenullを代入する。

  13. authenticatorId仮想認証器として仮想認証器データベースに保存されていない場合、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

  14. authenticatorIdに対応する仮想認証器authenticatorとする。

  15. isResidentCredentialtrueauthenticatorhasResidentKeyプロパティがfalseの場合、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

  16. authenticatorlargeBlob拡張機能をサポートしていて、parameterslargeBlobが定義されている場合:

    1. parameterslargeBlobプロパティに対しBase64urlデコードした結果をlargeBlobとする。

    2. largeBlobが失敗なら、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

  17. そうでない場合:

    1. largeBlobnullを代入する。

  18. backupEligibilityparametersbackupEligibilityプロパティを代入。

  19. backupEligibilityが未定義なら、authenticatordefaultBackupEligibilityの値を使用。

  20. backupStateparametersbackupStateプロパティを代入。

  21. backupStateが未定義なら、authenticatordefaultBackupStateの値を使用。

  22. userNameparametersuserNameプロパティを代入。

  23. userNameが未定義の場合は空文字列を使用。

  24. userDisplayNameparametersuserDisplayNameプロパティを代入。

  25. userDisplayNameが未定義の場合は空文字列を使用。

  26. credentialを新規に作成(isResidentCredentialtrueならクライアントサイド検出可能公開鍵クレデンシャルソース、それ以外はサーバーサイド公開鍵クレデンシャルソース)し、各値は:

    type

    public-key

    id

    credentialId

    privateKey

    privateKey

    rpId

    rpId

    userHandle

    userHandle

    otherUI

    userNameuserDisplayName で構成。

  27. credentialバックアップ適格性 クレデンシャルプロパティbackupEligibilityをセット。

  28. credentialバックアップ状態 クレデンシャルプロパティbackupStateをセット。

  29. credential署名カウンター counter を関連付け、初期値はparameterssignCountまたは0

  30. largeBlobnullでない場合、大きな per-credential ブロブcredentialにセットする。

  31. credentialcounterauthenticatorのDBに保存。

  32. 成功を返す。

11.6. クレデンシャル取得

クレデンシャル取得 WebDriver 拡張コマンドは、公開鍵クレデンシャルソースごとに1つのクレデンシャルパラメータオブジェクトを返します(そのクレデンシャルがクレデンシャルの追加navigator.credentials.create()で保存されたかどうかを問わず)、対象となるバーチャル認証器が管理するもの全てが対象です。 定義は以下の通りです:

HTTPメソッド URIテンプレート
GET /session/{session id}/webauthn/authenticator/{authenticatorId}/credentials

リモートエンドステップは次の通りです:

  1. authenticatorIdバーチャル認証器 のいずれとも一致しない場合、バーチャル認証器データベースから見つからなければ、WebDriverエラーWebDriver エラーコード invalid argument)を返す。

  2. credentialsArrayを空配列として用意する。

  3. authenticatorIdで識別される認証器が管理する各公開鍵クレデンシャルソース credentialについて、対応するクレデンシャルパラメータオブジェクトを作成しcredentialsArrayに追加する。

  4. successcredentialsArrayをデータとして返す。

11.7. クレデンシャルの削除

クレデンシャルの削除 WebDriver 拡張コマンドは、バーチャル認証器に保存されている 公開鍵クレデンシャルソース を削除します。定義は以下の通りです:

HTTPメソッド URIテンプレート
DELETE /session/{session id}/webauthn/authenticator/{authenticatorId}/credentials/{credentialId}

リモートエンドステップは次の通りです:

  1. authenticatorIdバーチャル認証器 のいずれにも一致しなければ、バーチャル認証器データベースから見つからなければ、WebDriverエラーWebDriver エラーコード invalid argument)を返す。

  2. authenticatorIdで特定されるバーチャル認証器authenticatorとする。

  3. credentialIdauthenticatorで管理する公開鍵クレデンシャルソース のいずれにも一致しなければ、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

  4. authenticatorが管理するcredentialIdで特定される公開鍵クレデンシャルソースを削除する。

  5. successを返す。

11.8. すべてのクレデンシャルの削除

すべてのクレデンシャルの削除 WebDriver 拡張コマンドは、バーチャル認証器に保存されているすべての 公開鍵クレデンシャルソース を削除します。定義は以下の通りです:

HTTPメソッド URIテンプレート
DELETE /session/{session id}/webauthn/authenticator/{authenticatorId}/credentials

リモートエンドステップは次の通りです:

  1. authenticatorIdバーチャル認証器 のいずれにも一致しなければ、バーチャル認証器データベースから見つからなければ、WebDriverエラーWebDriver エラーコード invalid argument)を返す。

  2. authenticatorIdで特定されるバーチャル認証器が管理する公開鍵クレデンシャルソース をすべて削除する。

  3. successを返す。

11.9. ユーザー検証済みフラグ設定

ユーザー検証済みフラグ設定 拡張コマンドバーチャル認証器isUserVerifiedプロパティをセットします。 定義は以下の通りです。

HTTPメソッド URIテンプレート
POST /session/{session id}/webauthn/authenticator/{authenticatorId}/uv

リモートエンドステップは次の通りです:

  1. parametersがJSON オブジェクトでなければ、 WebDriverエラーWebDriver エラーコード invalid argument)を返す。

  2. authenticatorIdバーチャル認証器 のいずれにも一致しなければ、バーチャル認証器データベースから見つからなければ、WebDriverエラーWebDriver エラーコード invalid argument)を返す。

  3. parameters内にisUserVerifiedプロパティがない場合、WebDriverエラーWebDriverエラーコード invalid argument)を返す。

  4. authenticatorauthenticatorIdで識別されるバーチャル認証器とする。

  5. authenticatorisUserVerifiedプロパティを parametersisUserVerifiedプロパティ値にセット。

  6. successを返す。

11.10. クレデンシャルプロパティの設定

クレデンシャルプロパティの設定 拡張コマンドは、バーチャル認証器が持つ公開鍵クレデンシャルソースbackupEligibilityおよびbackupStateクレデンシャルプロパティを設定できます。定義は以下です。

HTTPメソッド URIテンプレート
POST /session/{session id}/webauthn/authenticator/{authenticatorId}/credentials/{credentialId}/props

Set Credential Properties Parameters は、JSON の Object であり、リモートエンドステップparameters として渡されます。 次の keyvalue のペアを含みます:

キー 説明 値の型
backupEligibility バックアップ有資格クレデンシャルプロパティ)。 boolean
backupState バックアップ状態クレデンシャルプロパティ)。 boolean

リモートエンドステップは次の通りです:

  1. parameters が JSON の Object でない場合、WebDriver エラーWebDriver エラーコード invalid argument)を返す。

    Note: parametersSet Credential Properties Parameters オブジェクトです。

  2. authenticatorId仮想認証器 として Virtual Authenticator Database に保存されていない場合、WebDriver エラーWebDriver エラーコード invalid argument)を返す。

  3. credentialcredentialId で一致する authenticator が管理する 公開鍵クレデンシャルソース とする。

  4. credential が空の場合、WebDriver エラーWebDriver エラーコード invalid argument)を返す。

  5. backupEligibilityparametersbackupEligibility プロパティを代入。

  6. backupEligibility が定義されていれば、credentialbackup eligibility クレデンシャルプロパティbackupEligibility の値に設定する。

    Note: 通常、backupEligibility プロパティは 公開鍵クレデンシャルソース に対して永続的です。 Set Credential Properties はテストやデバッグ目的でこれを変更できるようにします。

  7. backupStateparametersbackupState プロパティを代入。

  8. backupState が定義されていれば、credentialbackup state クレデンシャルプロパティbackupState の値に設定する。

  9. success を返す。

12. IANA考慮事項

12.1. WebAuthn アテステーションステートメントフォーマット識別子登録の更新

本節では、IANA「WebAuthn Attestation Statement Format Identifiers」レジストリ[IANA-WebAuthn-Registries][RFC8809]で設立、[WebAuthn-1]で初登録)における、§ 8 定義済みアテステーションステートメントフォーマットで定義された 以下のアテステーションステートメントフォーマットのエントリを、本仕様を参照するように更新します。

12.2. WebAuthn アテステーションステートメントフォーマット識別子新規登録

本節では、§ 8 定義済みアテステーションステートメントフォーマットで新たに定義された以下のアテステーションステートメントフォーマットを、IANA「WebAuthn Attestation Statement Format Identifiers」レジストリ[IANA-WebAuthn-Registries][RFC8809]で設立)に新規登録します。

12.3. WebAuthn拡張識別子登録の更新

このセクションでは、IANA「WebAuthn Extension Identifiers」レジストリ[IANA-WebAuthn-Registries][RFC8809]で設立、[WebAuthn-1]で初登録)において§ 10 定義済み拡張で定義された、以下の拡張識別子の値を本仕様へのリンクに更新します。

12.4. WebAuthn拡張識別子の登録

このセクションでは、第 § 10 定義された拡張 セクションで新しく定義された、以下にリストされた 拡張識別子 の値を、[RFC8809] によって確立されたIANA「WebAuthn Extension Identifiers」レジストリ [IANA-WebAuthn-Registries] に登録します。

12.5. Well-Known URI登録

このセクションでは、以下のwell-known URIをIANA「Well-Known URIs」レジストリ [IANA-Well-Known-URIs] に登録します。

13. セキュリティ考慮事項

この仕様は、Web APIと暗号化されたピアエンティティ認証プロトコルを定義しています。 Web Authentication APIにより、Web開発者(いわゆる「作成者」)は、登録および認証セレモニーにおいてWeb Authenticationプロトコルを利用できるようになります。 Web Authenticationプロトコルのエンドポイントを構成するエンティティは、ユーザー制御されたWebAuthn Authenticatorsと、WebAuthn Relying PartyウェブアプリケーションをホストするRelying Partyの計算環境です。 このモデルでは、ユーザーエージェントとWebAuthn Clientが一体となって、認証器Relying Partiesの間の中間者となります。 さらに、認証器 は、その出所についてアテステーション(証明)を行うことができます。

現時点では、この仕様には詳細なセキュリティ上の考慮事項は含まれていません。しかし、[FIDOSecRef] ドキュメントは、この仕様全体に適用可能なセキュリティ分析を提供しています。 また、[FIDOAuthnrSecReqs] ドキュメントスイートは、認証器のセキュリティ特性に関する有用な情報を提供しています。

以下のサブセクションは、現在のWeb Authenticationに固有のセキュリティ上の考慮事項から構成されています。 これらは対象別に分割されています。 一般的なセキュリティ上の考慮事項はこのセクションの直接のサブセクションですが、認証器クライアント、およびRelying Partyの実装者向けのセキュリティ上の考慮事項は、それぞれのサブセクションにグループ化されています。

13.1. Credential IDの未署名

認証アサーションに付随するcredential IDは署名されていません。 これは問題ではありません。なぜなら、認証器が誤ったcredential IDを返した場合や、攻撃者がcredential IDを傍受して改ざんした場合に起こることは、WebAuthn Relying Partyが、返された署名付きauthenticator data (別名、アサーション)を検証するための正しいcredential public keyを参照できないだけであり、したがってインタラクションはエラーで終了するからです。

13.2. クライアントと認証器の物理的近接性

WebAuthnの認証器モデルでは、一般にローミング認証器クライアントと物理的に近接しており、直接通信すると仮定されています。 この構成には重要な利点がいくつかあります。

クライアント認証器 の間の物理的な近接性の約束は、所持物 認証ファクターの重要な強みです。 たとえば、ローミング認証器がUSBまたはBluetooth経由でのみ通信できる場合、 これらのトランスポートの限られた範囲により、悪意のあるアクターが認証器と対話するには物理的にその範囲内にいる必要があります。 これは、リモートから呼び出すことができる認証器には必ずしも当てはまりません — 認証器ユーザーの存在 を検証したとしても、ユーザーはリモートで開始された悪意のあるリクエストを許可するように騙される可能性があります。

クライアント認証器 の間の直接通信は、クライアント認証情報スコープ制限を適用できることを意味します。 対照的に、クライアント認証器の間の通信が第三者によって仲介される場合、 クライアントは、スコープ制限の適用と認証器へのアクセス制御を第三者に委ねる必要があります。 いずれかを実行しない場合、悪意のあるRelying Party が他のRelying Parties向けの有効な認証アサーションを受け取ったり、 悪意のあるユーザーが他のユーザー向けの認証アサーションにアクセスしたりする結果になる可能性があります。

認証器クライアントの物理的に近くにある必要がない、またはクライアント認証器が直接通信しないソリューションを設計する場合、 設計者は、これがスコープ制限の適用と、認証器所持物 認証ファクターとしての強度にどのように影響するかを考慮する必要があります(SHOULD)。

13.3. 認証器のセキュリティに関する考慮事項

13.3.1. アテステーション証明書階層

アテステーション証明書には3層階層(Attestation Root、Attestation Issuing CA、Attestation Certificate)を使用することが推奨されます(RECOMMENDED)。また、各WebAuthn Authenticatorデバイスライン(つまりモデル)ごとに、認証器モデルの特定のバージョンに関する問題の分離を容易にするために、 発行CAを分けることも推奨されます。

アテステーションルート証明書が単一のWebAuthn Authenticatorデバイス ライン(つまりAAGUID)専用でない場合、authenticator dataに対して検証できるように、アテステーション証明書自体にAAGUIDを指定する必要があります(SHOULD)。

13.3.2. アテステーション証明書およびアテステーション証明書CAの侵害

アテステーション証明書の発行に使用される中間CAまたはルートCAが侵害された場合でも、WebAuthn Authenticatorアテステーションキー ペアは安全ですが、その証明書は信頼できなくなります。WebAuthn Authenticator メーカーは、認証器モデルのアテステーション公開鍵を記録している場合、新しい中間CAまたは新しいルートCAからこれらのキーの新しいアテステーション証明書を発行できます。ルートCAが変更された場合、WebAuthn Relying Partiesは、 それに応じて信頼するルート証明書を更新する必要があります(MUST)。

WebAuthn Authenticatorアテステーション証明書は、その秘密鍵が侵害された場合、発行CAによって失効させられる必要があります(MUST)。WebAuthn Authenticatorメーカーは、漏洩がファームウェアの欠陥によるものである場合、ファームウェアアップデートを出荷し、新しいアテステーション秘密鍵証明書を既に製造されたWebAuthn Authenticatorsに注入する必要がある場合があります。(これが発生するプロセスは、この仕様の範囲外です。)WebAuthn Authenticatorメーカーがこの機能を持っていない場合、Relying Parties が影響を受けたWebAuthn Authenticatorsからのさらなるアテステーションステートメントを信頼できない可能性があります。

§ 13.4.5 Revoked Attestation Certificatesの、Relying Partiesに関する関連するセキュリティ上の考慮事項も参照してください。

13.4. Relying Partiesのセキュリティに関する考慮事項

13.4.1. WebAuthn Relying Partiesのセキュリティ上の利点

この仕様によってWebAuthn Relying Partiesに提供される主な利点は次のとおりです。

  1. ユーザーとアカウントは、広く互換性があり、使いやすい多要素認証を使用して保護できます。

  2. Relying Partyは、利用者へauthenticatorハードウェアを準備する必要はありません。代わりに、各利用者は独立して適合するauthenticatorを入手し、同じauthenticatorを複数のRelying Partiesで利用できます。 Relying Partyはオプションで、 authenticatorのセキュリティ特性に関する要件を、attestation statementsを確認することで適用できます。 これらはauthenticatorsから返却されます。

  3. 認証セレモニーは、中間者攻撃に対して耐性があります。 登録セレモニーについては、以下の§ 13.4.4 Attestation Limitationsを参照してください。

  4. Relying Partyは、 コードをほとんど、あるいは全く変更せずに、PIN、生体認証、および将来の手法など、複数のタイプのユーザー検証を自動的にサポートでき、 各ユーザーが認証器の選択を通じて使用するものを決定できるようにすることができます。

  5. Relying Party は、上記の利点を得るために追加のシークレットを保存する必要はありません。

Conformanceセクションで述べたように、Relying Partyは、上記のすべてのセキュリティ上の利点を得るために、§ 7 WebAuthn Relying Party Operationsで説明されているように動作する必要があります(MUST)。ただし、これから少し外れる1つの注目すべきユースケースについては、以下の§ 13.4.4 Attestation Limitationsで説明します。

13.4.2. 埋め込み使用における可視性の考慮事項

§ 5.10 Using Web Authentication within iframe elementsで説明されているように、 iframe内などの埋め込みコンテキストでのWebAuthnの単純な使用は、 ユーザーを「UI Redressing」攻撃(「Clickjacking」とも呼ばれます)に対して脆弱にする可能性があります。これは、攻撃者がRelying Partyの意図したUIの上に独自のUIを重ね、ユーザーを騙してRelying Partyで意図しないアクションを実行させようとするものです。たとえば、これらの手法を使用して、攻撃者はユーザーを騙して商品を購入させたり、お金を送金させたりする可能性があります。

WebAuthn固有のUIは通常クライアントプラットフォームによって処理されるため、UI Redressingに対して脆弱ではありませんが、WebAuthnを使用する埋め込みコンテンツを持つRelying Partyにとって、コンテンツのUIがユーザーに表示されていることを確認することが重要である可能性があります。そのための新興手段は、実験的なIntersection Observer v2isVisible属性のステータスを観察することです。たとえば、埋め込みコンテキストで実行されているRelying Partyのスクリプトは、isVisblefalseに設定されていることを検出した場合、ポップアップウィンドウで事前に読み込まれることで、コンテンツの遮断を回避できます。

13.4.3. 暗号学的チャレンジ

暗号化プロトコルとして、Web Authenticationはリプレイ攻撃を回避するためにランダム化されたチャレンジに依存しています。したがって、PublicKeyCredentialCreationOptions.challenge および PublicKeyCredentialRequestOptions.challenge の値は、Relying Partiesによって、 それらが信頼する環境(サーバーサイドなど)でランダムに生成される必要があり(MUST)、クライアントの応答で返されたchallenge 値は生成されたものと一致している必要があります(MUST)。これは、クライアントの動作に依存しない方法で行う必要があります(SHOULD)。たとえば、Relying Partyは、操作が完了するまでチャレンジを一時的に保存する必要があります(SHOULD)。不一致を許容すると、プロトコルのセキュリティが損なわれる可能性があります。

チャレンジの有効期間は、WebAuthnセレモニータイムアウトの推奨範囲とデフォルトの上限に類似した期間である必要があります(SHOULD)。

リプレイ攻撃を防ぐために、チャレンジには推測が不可能な十分なエントロピーが含まれている必要があります(MUST)。したがって、チャレンジは少なくとも16バイトの長さである必要があります(SHOULD)。

13.4.4. アテステーションの制限

このセクションは規定的ではありません。

新しい認証情報を登録するとき、存在する場合、アテステーションステートメントは、WebAuthn Relying Partyが様々な認証器の品質について保証を導き出すことを可能にする場合があります。たとえば、認証器のモデルや、認証情報秘密鍵をどのように保存して保護するかなどです。 ただし、アテステーションステートメントだけでは、Relying Partyアテステーションオブジェクトがユーザーが意図した認証器によって生成されたものであり、中間者攻撃者によって生成されたものではないことを検証する手段がないことに注意することが重要です。 たとえば、そのような攻撃者は、Relying Partyスクリプトに注入された悪意のあるコードを使用する可能性があります。 したがって、Relying Partyは、アテステーションオブジェクト中間者攻撃から保護するために、TLSおよび関連技術などの他の手段に依存する必要があります。

登録セレモニーが安全に完了し、認証器認証情報秘密鍵の機密性を維持しているという仮定の下では、その公開鍵認証情報を使用した後続の認証セレモニーは、 中間者攻撃による改ざんに対して耐性があります。

上記の議論は、すべてのアテステーションタイプに当てはまります。すべての場合において、中間者攻撃者PublicKeyCredential オブジェクト(アテステーションステートメントおよび 登録される認証情報公開鍵を含む)を置き換え、その後、同じRelying Party向けで、同じ攻撃者を通過する将来の認証アサーションスコープして改ざんすることが可能です。

このような攻撃は検知可能である可能性があります。Relying Partyはユーザーのではなく攻撃者の認証情報公開鍵を登録しているため、攻撃者はそのRelying Partyとの後続のすべての認証セレモニーを改ざんする必要があります: 影響を受けないセレモニーは失敗し、攻撃を明らかにする可能性があります。

Self Attestation およびNone以外のアテステーションタイプは、Relying Partiesが認証器情報(モデル指定など)をユーザーに表示できる可能性があるため、このような攻撃の難易度を高める可能性があります。したがって、攻撃者はユーザーの認証器と同じモデルの本物の認証器を使用する必要があるか、またはユーザーがRelying Partyがユーザーが期待するものとは異なる認証器モデルを報告していることに気付く可能性があります。

注: 上記で説明した中間者攻撃 のすべての変種は、従来のパスワード認証に対する中間者攻撃よりも、攻撃者が実行するのがより困難です。

13.4.5. 失効したアテステーション証明書

失効した中間アテステーションCA証明書によりアテステーション証明書の検証が失敗し、Relying Partyのポリシーがこれらの状況で登録/認証リクエストを拒否することを要求している場合、 Relying Partyは、CA侵害日以降に同じ中間CAにチェーンするアテステーション証明書を使用して登録された公開鍵認証情報の登録も解除する(または「self attestation」と同等の信頼レベルでマークする)ことが推奨されます(RECOMMENDED)。したがって、Relying Parties は、そのような証明書の失効後に登録が実行された場合に関連する公開鍵認証情報を登録解除できるように、登録中に中間アテステーションCA証明書を記憶することが推奨されます(RECOMMENDED)。

§ 13.3.2 Attestation Certificate and Attestation Certificate CA Compromiseの、認証器に関する関連するセキュリティ上の考慮事項も参照してください。

13.4.6. 認証情報の損失とキーのモビリティ

この仕様は、認証情報秘密鍵のバックアップや、それらを認証器間で共有するためのプロトコルを定義していません。 一般に、認証情報秘密鍵は、それを作成した認証器から外部に出ないことが期待されます。したがって、一般に、認証器を紛失することは、失われた認証器バインドされたすべての認証情報を紛失することを意味し、 ユーザーがRelying Partyに登録している認証情報が1つしかない場合、ユーザーをアカウントからロックアウトする可能性があります。秘密鍵をバックアップまたは共有する代わりに、Web Authentication APIを使用すると、同じユーザーに対して複数の認証情報を登録できます。たとえば、ユーザーは頻繁に使用するクライアントデバイスプラットフォーム認証情報を登録し、バックアップおよび新規またはまれに使用するクライアントデバイス用に1つ以上のローミング認証情報を登録することができます。

Relying Partiesは、ユーザーが同じユーザーアカウントに複数の認証情報を登録することを許可し、推奨する必要があります(SHOULD)。 Relying Partiesは、 これらの異なる認証情報が異なる認証器バインドされていることを確認するために、 excludeCredentials および user.id オプションを使用する必要があります(SHOULD)。

13.4.7. 保護されていないアカウントの検出

このセクションは規定的ではありません。

このセキュリティ上の考慮事項は、空でない(non-emptyallowCredentials 引数を最初の認証ステップとして使用する認証セレモニーをサポートするRelying Partiesに適用されます。 たとえば、最初の認証ステップとしてサーバーサイド認証情報を使用した認証を使用する場合などです。

この場合、allowCredentials 引数は、どのユーザーアカウントがWebAuthn認証情報を登録しており、どのアカウントが登録していないかに関する情報を漏洩するリスクがあり、これはアカウントの保護強度の指標となる可能性があります。 たとえば、攻撃者がユーザー名のみを提供して認証セレモニーを開始でき、Relying Partyが一部のユーザーアカウントに対しては空でないallowCredentialsで応答し、他のユーザーアカウントに対しては失敗またはパスワードチャレンジで応答するとします。 そうすると、攻撃者は、後者のユーザーアカウントは、認証に成功するためにWebAuthnのアサーションを必要としない可能性が高いと結論付け、攻撃をそのような保護が弱いアカウントに集中させることができます。

この問題は、§ 14.6.2 Username Enumerationおよび§ 14.6.3 Privacy leak via credential IDsで説明されている問題に似ており、同様の方法で軽減できます。

13.4.8. コードインジェクション攻撃

Relying Party公開鍵認証情報スコープ内のorigin で実行されている悪意のあるコードは、WebAuthnが提供する可能性のあるセキュリティ保証をすべて無効にする可能性があります。 WebAuthn Clientsは、 セキュアコンテキストでのみWebAuthn APIを公開しますが、 これは最も基本的な攻撃を軽減するものであり、Relying Partiesによる追加の予防措置と組み合わせる必要があります(SHOULD)。

コードインジェクションはいくつかの方法で発生する可能性があります。 このセクションでは、起こりそうなシナリオをいくつか指摘し、適切な軽減策を提案しようと試みていますが、網羅的なリストではありません。

13.4.9. 認証情報のoriginの検証

認証情報を登録するときおよび アサーションを検証するとき、 Relying Partyクライアントデータoriginメンバーを検証する必要があります(MUST)。

Relying Partyは、予期しないorigin値を受け入れてはなりません(MUST)。 受け入れると、悪意のあるWebサイトが有効な認証情報を取得できるようになる可能性があるためです。 WebAuthn認証情報のスコープにより、登録されたRP ID外のドメインでの使用は防止されますが、 Relying Partyのorigin検証は、 不具合のある認証器が認証情報のスコープを適用しない場合の保護の追加の層として機能します。 悪意のあるサブドメインに関する議論については、§ 13.4.8 Code injection attacksも参照してください。

検証は、Relying Partyが必要に応じて正確な文字列照合またはその他の方法で実行できます(MAY)。 たとえば:

クライアントデータtopOriginメンバーを検証する場合にも同様の考慮事項が適用されます。 topOriginが存在する場合、Relying Partyはその値が予期されたものであることを検証する必要があります(MUST)。 この検証は、Relying Partyが必要に応じて正確な文字列照合またはその他の方法で実行できます(MAY)。 たとえば:

14. プライバシーに関する考慮事項

[FIDO-Privacy-Principles]のプライバシーの原則もこの仕様に適用されます。

このセクションは対象別に分割されています。 一般的なプライバシーの考慮事項はこのセクションの直接のサブセクションですが、認証器クライアント、およびRelying Partyの実装者向けのプライバシーの考慮事項は、それぞれのサブセクションにグループ化されています。

14.1. 匿名化防止策

このセクションは規定的ではありません。

Web Authentication APIの設計の多くの側面は、プライバシーへの懸念によって動機付けられています。この仕様で検討される主な懸念は、ユーザーの個人の身元、つまり人間の特定や、同一の人間に属する別の身元の相関関係の保護です。Web Authentication APIはグローバルなIDの形式を使用または提供しませんが、相関可能性のある次の種類の識別子が使用されます。

上記情報の一部は必然的にRelying Partyと共有されます。以下のセクションでは、悪意のあるRelying Partiesがそれを使用してユーザーの個人的な身元を発見することを防ぐために講じられた措置について説明します。

14.2. 匿名、スコープ設定、相関不可能な公開鍵認証情報

このセクションは規定的ではありません。

Credential IDscredential public keysは強力な認証を可能にするために必然的にWebAuthn Relying Partyと共有されますが、それらは識別情報を最小限に抑え、Relying Parties間で共有されないように設計されています。

さらに、クライアントサイド検出可能公開鍵認証情報ソースには、オプションでRelying Partyによって指定されたuser handleを含めることができます。その後、その認証情報を使用して、ユーザーを識別および認証することができます。 つまり、プライバシーを意識したRelying Partyは、従来のユーザー名なしでユーザーアカウントの作成を許可できるため、Relying Parties間の非相関性がさらに向上します。

14.3. 認証器ローカル生体認識

生体認証器は、認証器内で内部的に生体認識を実行します — ただし、プラットフォーム認証器の場合、実装によっては生体データがクライアントにも表示される場合があります。生体データはWebAuthn Relying Partyには公開されず、公開鍵認証情報の作成と登録、またはそれを使用した認証を承認するためにローカルでのみユーザー検証を実行するために使用されます。したがって、悪意のあるRelying Partyは生体データを通じてユーザーの個人的な身元を発見できず、Relying Partyでのセキュリティ侵害も、攻撃者が他のRelying Partiesでログインを偽造するために使用できる生体データを公開することはありません。

Relying Party生体認識を必要とする場合、これは生体認証器 によってユーザー検証を実行し、署名されたアサーション応答でUV フラグを設定することによって結果を通知することでローカルに実行され、 Relying Partyに生体データ自体を公開するのではありません。

14.4. 認証器のプライバシーに関する考慮事項

14.4.1. アテステーションのプライバシー

アテステーション証明書アテステーションキーペアは、ユーザーを追跡したり、同一ユーザーの様々なオンライン身元をリンクしたりするために使用される可能性があります。 これには、以下のような方法で軽減できます。

14.4.2. 認証器に保存される個人を特定できる情報のプライバシー

認証器は、この仕様で定義されているもの以外に、例えばユーザーが認証セレモニーに使用する認証情報を選択できるリッチなUIをクライアントに提供できるようにするために、 クライアントに追加情報を提供する場合があります(MAY)。 認証器がそうする場合、ユーザー検証が正常に完了していない限り、個人を特定できる情報を公開してはなりません(SHOULD NOT)。認証器が複数の登録済みユーザーでユーザー検証をサポートしている場合、 認証器は現在検証済みのユーザー以外のユーザーの個人を特定できる情報を公開してはなりません(SHOULD NOT)。したがって、ユーザー検証 ができない認証器は、個人を特定できる情報を保存すべきではありません(SHOULD NOT)。

この議論の目的上、id メンバーとして伝達されるuser handleは、個人を特定できる情報とは見なされません。§ 14.6.1 User Handle Contentsを参照してください。

これらの推奨事項は、認証器への物理的アクセスを持つ敵対者が、認証器の登録済みユーザーに関する個人を特定できる情報を抽出することを防ぐために役立ちます。

14.5. クライアントのプライバシーに関する考慮事項

14.5.1. 登録セレモニーのプライバシー

同意なしにユーザーが識別されるのを防ぐために、 [[Create]](origin, options, sameOriginWithAncestors) メソッドの実装は、悪意のあるWebAuthn Relying Partyが以下のケースを区別できるようにする情報が漏洩しないように注意する必要があります。ここで「除外」は、Relying PartyexcludeCredentialsにリストした認証情報の少なくとも1つが認証器バインドされていることを意味します。

上記のケースが区別できる場合、悪意のあるRelying Partyがどの認証情報が利用可能かを調査することでユーザーを識別できる情報が漏洩します。たとえば、そのような情報漏洩の1つは、除外された認証器が利用可能になるとすぐにクライアントが失敗応答を返す場合です。この場合 — 特に除外された認証器プラットフォーム認証器である場合 — Relying Partyは、ユーザーが手動でキャンセルする前にセレモニーがキャンセルされたことを検出でき、したがってexcludeCredentials パラメータにリストされた認証情報の少なくとも1つがユーザーに利用可能であると結論付ける可能性があります。

ただし、ユーザーが区別可能なエラーが返される前に新しい認証情報の作成に同意している場合、上記は懸事項ではありません。なぜなら、この場合、ユーザーは漏洩する情報を共有する意図を確認しているからです。

14.5.2. 認証セレモニーのプライバシー

同意なしにユーザーが識別されるのを防ぐために、 [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) メソッドの実装は、悪意のあるWebAuthn Relying Partyが以下のケースを区別できるようにする情報が漏洩しないように注意する必要があります。ここで「名前付き」は、認証情報Relying PartyによってallowCredentialsにリストされていることを意味します。

上記のケースが区別できる場合、悪意のあるRelying Partyがどの認証情報が利用可能かを調査することでユーザーを識別できる情報が漏洩します。 たとえば、そのような情報漏洩は、名前付きの認証情報含む認証器を発見した後にのみ、認証セレモニーをキャンセルまたは続行するための指示とコントロールをクライアントが表示する場合に発生する可能性があります。 この場合、Relying Partyがこのクライアント の動作を認識している場合、 Relying Partyは、 セレモニーがタイムアウトではなくユーザーによってキャンセルされたことを検出でき、したがってallowCredentials パラメータにリストされた認証情報の少なくとも1つがユーザーに利用可能であると結論付ける可能性があります。

この懸念は、名前付きの認証情報が利用可能かどうかにかかわらず、ユーザーがいつでも認証セレモニーをキャンセルできるコントロールを表示することで対処できる可能性があります。

14.5.3. オペレーティングシステムアカウント間のプライバシー

マルチユーザーオペレーティングシステムを持つクライアントデバイスプラットフォーム 認証器が含まれている場合、プラットフォーム 認証器クライアントデバイスは、 いずれかのプラットフォーム認証情報の存在が、そのプラットフォーム認証情報を作成したオペレーティングシステムユーザーにのみ公開されるように連携する必要があります(SHOULD)。

14.5.4. クライアント機能の開示

getClientCapabilities メソッドは、WebAuthn Relying Partiesが、クライアントおよび/またはユーザーとの成功の可能性が高い登録および認証エクスペリエンスを作成するのを支援します。

WebAuthn Clientの機能のサポート(または非サポート)は、フィンガープリンティングのリスクをもたらす可能性があります。このリスクを低減するために、クライアントはfalseの値を返すよりも、戻されたレコードからキーを省略することを優先する必要があります(SHOULD)。(§ 5.1.7 Availability of client capabilities - PublicKeyCredential’s getClientCapabilities() Methodで説明されているように)キーを省略することは、機能がサポートされていないことを明示的に確認するよりも、フィンガープリンティングの表面が少なくなります。クライアントの実装は、クライアントのポリシーや/またはユーザーの同意に基づいて機能の開示を制限することも希望する場合があります(MAY)。

14.6. Relying Partiesのプライバシーに関する考慮事項

14.6.1. ユーザーハンドルの内容

§ 14.4.2 Privacy of personally identifying information Stored in Authenticatorsにおいてuser handleは個人を特定できる情報とは見なされず、また認証器ユーザー検証を実行せずにuser handlesを公開する場合がある(MAY)ため、 Relying Partyuser handleに個人を特定できる情報(例:電子メールアドレスやユーザー名)を含めてはなりません(MUST NOT)。これには、個人を特定できる情報のハッシュ値も含まれます。Relying Partyに固有のソルト値でソルティングされていない限り、ハッシュ化は推測可能な入力値の探索を防ぐことができないためです。user handleを64バイトのランダム値にし、この値をユーザーアカウントに保存することが推奨されます(RECOMMENDED)。

14.6.2. ユーザー名の列挙

登録または認証セレモニーを開始する際、 WebAuthn Relying Partyが登録済みユーザーに関する機密情報を漏洩するリスクがあります。たとえば、Relying Partyが電子メールアドレスをユーザー名として使用しており、攻撃者が「alex.mueller@example.com」の認証セレモニーの開始を試みたがRelying Partyが失敗で応答し、その後「j.doe@example.com」で認証セレモニーを正常に開始した場合、攻撃者は「j.doe@example.com」が登録されており「alex.mueller@example.com」は登録されていないと結論付けることができます。したがって、Relying Partyは、「j.doe@example.com」がこのRelying Partyユーザーアカウントを持っているという、機密の可能性がある情報を漏洩したことになります。

以下は、Relying Partyがそのような攻撃による情報漏洩を軽減または防止するために実装できる対策の非網羅的なリストです。

14.6.3. Credential IDs経由のプライバシー漏洩

このセクションは規定的ではありません。

このプライバシー上の考慮事項は、空でない(non-emptyallowCredentials 引数を最初の認証ステップとして使用して認証セレモニーをサポートするRelying Partiesに適用されます。 たとえば、最初の認証ステップとしてサーバーサイド認証情報を使用した認証を使用する場合などです。

この場合、allowCredentials 引数は認証されていない発信者にユーザーのcredential IDsを公開するため、個人を特定できる情報を漏洩するリスクがあります。 Credential IDsRelying Parties間では相関できないように設計されていますが、credential IDの長さは、それを作成した認証器の種類の手がかりになる可能性があります。 ユーザーは複数のRelying Partiesで同じユーザー名と認証器のセットを使用する可能性が高いため、 allowCredentials内のcredential IDsの数とその長さが、ユーザーの匿名化を解除するためのグローバルな相関ハンドルとして機能する可能性があります。 また、ユーザーのcredential IDsを知っていると、ユーザーのいずれかの認証器への一時的な物理的アクセスがあれば、ユーザーの身元に関する推測を確認することも可能になります。

そのような情報漏洩を防ぐために、Relying Partyは、たとえば次のようなことができます。

上記の防止策が利用できない場合、つまりユーザー名のみが指定されているときにallowCredentials を公開する必要がある場合、Relying Partyは、§ 14.6.2 Username Enumerationで説明されているのと同様の方法で架空のcredential IDsを返すアプローチを使用してプライバシーの漏洩を軽減できます。

credential idが認識されなかったことを通知する際、WebAuthn Relying Partyは、認証されていない発信者にcredential IDsを公開しないように、signalAllAcceptedCredentials(options)メソッドの代わりにsignalUnknownCredential(options)メソッドを使用する必要があります(SHOULD)。

15. アクセシビリティに関する考慮事項

ユーザー認証対応の認証器は、ローミングまたはプラットフォームいずれであっても、ユーザーに複数のユーザー認証方法を提供するべきです。例えば、指紋認証とPIN入力の両方です。これにより、選択された方法が何らかの理由で機能しない場合でも、他のユーザー認証手段へのフォールバックが可能になります。ローミング認証器の場合、認証器とプラットフォームが協力してPIN入力などのユーザー認証方法を提供することがあります[FIDO-CTAP]

Relying Partyは、登録時に、ユーザーが将来的な認可ジェスチャーを正しく完了できるように工夫を提供するべきです。これには、認証器の名前付け、デバイスに関連づける画像の選択、自由形式のテキストによる指示の入力(例:自分へのリマインダーとして)などが含まれます。

セレモニーがタイミングに依存する場合、例:登録セレモニーtimeout参照) または認証セレモニーtimeout参照)は、[WCAG21]ガイドライン2.2「十分な時間」に従うべきです。クライアントプラットフォームRelying Partyが指定したタイムアウトが[WCAG21]ガイドラインに適切に準拠していないと判断した場合、クライアントプラットフォームはタイムアウトを適宜調整してもよいです。

WebAuthnセレモニーのタイムアウトに関する推奨範囲およびデフォルトは以下の通りです:

16. テストベクター

このセクションは規範的ではありません。

このセクションでは、実装の検証に使用できる例の値を示します。

例は、同じ登録および認証セレモニーで行われるペアの擬似コードとして示されます。 バイト列リテラルやコメントにはCDDL [RFC8610] の記法を用いています。 これらの例は網羅的ではなく、WebAuthn拡張は含まれていません。

例は入力から出力までの流れとして構成され、一部の中間値も含まれます。 登録例ではRelying Partychallenge 入力を定義し、 クライアントclientDataJSON 出力を生成し、 認証器attestationObject 出力を生成します。 認証例ではRelying Partychallenge 入力を定義し、 クライアントclientDataJSON 出力を生成し、 認証器authenticatorData およびsignature 出力を生成します。 その他の暗号的に無関係な入力・出力は含まれていません。

認証器実装者は、同様の構造の attestationObjectauthenticatorData およびsignature 出力を生成できることを確認できます。 クライアント実装者は、同様の構造のclientDataJSON 出力を生成できることを確認できます。 Relying Party実装者は、同じchallenge入力が与えられた場合に 登録出力を正常に検証できること、 また、同じchallenge 入力と、関連する登録例の証明書公開鍵およびcredential IDが 与えられた場合に認証出力を正常に検証できることを確認できます。

すべての例ではRP ID example.orgorigin https://example.org そして適用される場合はtopOrigin https://example.comを使用します。 例には、特に注記がない限り認証なしが含まれます。 clientDataJSONattestationObject、 証明書などの複合オブジェクトは 擬似コードに特に記載されていない追加の(通常は定数の)データを含む場合がありますのでご注意ください。

すべてのランダム値は、CDDLで'WebAuthn test vectors'と表されるベース入力鍵素材、または同等のh’576562417574686e207465737420766563746f7273' から HKDF-SHA-256 [RFC5869] によって決定的に生成されます。 ECDSA署名では決定論的ノンス[RFC6979] を使います。 例のRSA鍵は、p ≥ 1024となる最小の2つのメルセンヌ素数2p - 1から構成されています。

注意:

注: 認証器がCTAP2 [FIDO-CTAP] を実装している場合、本仕様で定められたものとは異なるキーを用いてattestation object を返します。 ここに示す例はWebAuthn Relying Party が期待する attestation object フォーマットを反映していますので、CTAP2から出力されるattestation object のキーは、ビットごとに同一となるように変換する必要があります。

16.1. アテステーション信頼ルート証明書

全ての アテステーション を含む例は、X.509 DER で符号化された attestation_ca_cert をアテステーション信頼ルート証明書として下記に使用しています [RFC5280]:

attestation_ca_key = h'7809337f05740a96a78eedf9e9280499dcc8f2aa129616049ec1dccfe103eb2a'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='Attestation CA', L=32)
attestation_ca_serial_number = h'ed7f905d8bd0b414d1784913170a90b6'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='Attestation CA', L=16)
attestation_ca_cert = h'30820207308201ada003020102021100ed7f905d8bd0b414d1784913170a90b6300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a3062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d030107034200043269300e5ff7b699015f70cf80a8763bf705bc2e2af0c1b39cff718b7c35880ca30f319078d91b03389a006fdfc8a1dcd84edfa07d30aa13474a248a0dab5baaa3423040300f0603551d130101ff040530030101ff300e0603551d0f0101ff040403020106301d0603551d0e0416041445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d04030203480030450220483063b6bb08dcc83da33a02c11d2f42203176893554d138c614a36908724cc8022100f5ef2c912d4500b3e2f5b591d0622491e9f220dfd1f9734ec484bb7e90887663'

16.2. アテステーションなしの ES256 資格情報

登録:

challenge = h'00c30fb78531c464d2b6771dab8d7b603c01162f2fa486bea70f283ae556e130'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='none.ES256', L=32)

credential_private_key = h'6e68e7a58484a3264f66b77f5d6dc5bc36a47085b615c9727ab334e8c369c2ee'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='none.ES256', L=32)
client_data_gen_flags = h'f9'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='none.ES256', L=1)
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
extraData_random = h'06441e0e375c4c1ad70620302532c4e5' = b64'BkQeDjdcTBrXBiAwJTLE5Q'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='none.ES256', L=16)
aaguid = h'8446ccb9ab1db374750b2367ff6f3a1f'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='none.ES256', L=16)
credential_id = h'f91f391db4c9b2fde0ea70189cba3fb63f579ba6122b33ad94ff3ec330084be4'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='none.ES256', L=32)
; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます
auth_data_UV_BE_BS = h'ba'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='none.ES256', L=1)

clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a22414d4d507434557878475453746e63647134313759447742466938767049612d7077386f4f755657345441222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a20426b5165446a646354427258426941774a544c453551227d'
attestationObject = h'a363666d74646e6f6e656761747453746d74a068617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b559000000008446ccb9ab1db374750b2367ff6f3a1f0020f91f391db4c9b2fde0ea70189cba3fb63f579ba6122b33ad94ff3ec330084be4a5010203262001215820afefa16f97ca9b2d23eb86ccb64098d20db90856062eb249c33a9b672f26df61225820930a56b87a2fca66334b03458abf879717c12cc68ed73290af2e2664796b9220'

認証:

challenge = h'39c0e7521417ba54d43e8dc95174f423dee9bf3cd804ff6d65c857c9abf4d408'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='none.ES256', L=32)

client_data_gen_flags = h'4a'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='none.ES256', L=1)
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
; auth_data_UV_BS は認証器データフラグの UV と BS ビットを設定しますが、BS は登録時に BE が設定されていた場合にのみ設定されます
auth_data_UV_BS = h'38'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='none.ES256', L=1)

authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b51900000000'
clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a224f63446e55685158756c5455506f334a5558543049393770767a7a59425039745a63685879617630314167222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d'
signature = h'3046022100f50a4e2e4409249c4a853ba361282f09841df4dd4547a13a87780218deffcd380221008480ac0f0b93538174f575bf11a1dd5d78c6e486013f937295ea13653e331e87'

16.3. 自己アテステーションの ES256 資格情報

登録:

challenge = h'7869c2b772d4b58eba9378cf8f29e26cf935aa77df0da89fa99c0bdc0a76f7e5'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='packed-self.ES256', L=32)

credential_private_key = h'b4bbfa5d68e1693b6ef5a19a0e60ef7ee2cbcac81f7fec7006ac3a21e0c5116a'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='packed-self.ES256', L=32)
client_data_gen_flags = h'db'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='packed-self.ES256', L=1)
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
extraData_random = h'53d8535ef284d944643276ffd3160756' = b64'U9hTXvKE2URkMnb_0xYHVg'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='packed-self.ES256', L=16)
aaguid = h'df850e09db6afbdfab51697791506cfc'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='packed-self.ES256', L=16)
credential_id = h'455ef34e2043a87db3d4afeb39bbcb6cc32df9347c789a865ecdca129cbef58c'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='packed-self.ES256', L=32)
; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます
auth_data_UV_BE_BS = h'fd'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='packed-self.ES256', L=1)

clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a2265476e4374334c55745936366b336a506a796e6962506b31716e666644616966715a774c33417032392d55222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a205539685458764b453255526b4d6e625f307859485667227d'
attestationObject = h'a363666d74667061636b65646761747453746d74a263616c672663736967584630440220067a20754ab925005dbf378097c92120031581c73228d1fb4f5b881bcd7da98302207fc7b147558c7c0eba3af18bd9d121fa3d3a26d17fe3f220272178f473b6006d68617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b55d00000000df850e09db6afbdfab51697791506cfc0020455ef34e2043a87db3d4afeb39bbcb6cc32df9347c789a865ecdca129cbef58ca5010203262001215820eb151c8176b225cc651559fecf07af450fd85802046656b34c18f6cf193843c5225820927b8aa427a2be1b8834d233a2d34f61f13bfd44119c325d5896e183fee484f2'

認証:

challenge = h'4478a10b1352348dd160c1353b0d469b5db19eb91c27f7dfa6fed39fe26af20b'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='packed-self.ES256', L=32)

client_data_gen_flags = h'1f'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='packed-self.ES256', L=1)
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
extraData_random = h'8136f9debcfa121496a265c6ce2982d5' = b64'gTb53rz6EhSWomXGzimC1Q'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='packed-self.ES256', L=16)
; auth_data_UV_BS は認証器データフラグの UV と BS ビットを設定しますが、BS は登録時に BE が設定されていた場合にのみ設定されます
auth_data_UV_BS = h'a1'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='packed-self.ES256', L=1)

authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50900000000'
clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a225248696843784e534e493352594d45314f7731476d3132786e726b634a5f6666707637546e2d4a71386773222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a206754623533727a36456853576f6d58477a696d433151227d'
signature = h'304402203310b9431903c401f1be2bdc8d23a4007682dbbddcf846994947b7f465daf84002204e94dd00047b316061b3b99772b7efd95994a83ef584b3b6b825ea3550251b66'

16.4. clientDataJSON に "crossOrigin": true を含む ES256 資格情報

登録:

challenge = h'3be5aacd03537142472340ab5969f240f1d87716e20b6807ac230655fa4b3b49'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='none.ES256.crossOrigin', L=32)

credential_private_key = h'96c940e769bd9f1237c119f144fa61a4d56af0b3289685ae2bef7fb89620623d'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='none.ES256.crossOrigin', L=32)
client_data_gen_flags = h'71'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='none.ES256.crossOrigin', L=1)
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
extraData_random = h'cd9aae12d0d1f435aaa56e6d0564c5ba' = b64'zZquEtDR9DWqpW5tBWTFug'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='none.ES256.crossOrigin', L=16)
aaguid = h'883f4f6014f19c09d87aa38123be48d0'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='none.ES256.crossOrigin', L=16)
credential_id = h'6e1050c0d2ca2f07c755cb2c66a74c64fa43065c18f938354d9915db2bd5ce57'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='none.ES256.crossOrigin', L=32)
; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます
auth_data_UV_BE_BS = h'27'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='none.ES256.crossOrigin', L=1)

clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a224f2d57717a514e5463554a484930437257576e7951504859647862694332674872434d475666704c4f306b222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a747275652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a207a5a7175457444523944577170573574425754467567227d'
attestationObject = h'a363666d74646e6f6e656761747453746d74a068617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b54500000000883f4f6014f19c09d87aa38123be48d000206e1050c0d2ca2f07c755cb2c66a74c64fa43065c18f938354d9915db2bd5ce57a501020326200121582022200a473f90b11078851550d03b4e44a2279f8c4eca27b3153dedfe03e4e97d225820cbd0be95e746ad6f5a8191be11756e4c0420e72f65b466d39bc56b8b123a9c6e'

認証:

challenge = h'876aa517ba83fdee65fcffdbca4c84eeae5d54f8041a1fc85c991e5bbb273137'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='none.ES256.crossOrigin', L=32)

client_data_gen_flags = h'57'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='none.ES256.crossOrigin', L=1)
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
extraData_random = h'f76a5c4d50f401bcbeab876d9a3e9e7e' = b64'92pcTVD0Aby-q4dtmj6efg'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='none.ES256.crossOrigin', L=16)
; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します
auth_data_UV_BS = h'0c'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='none.ES256.crossOrigin', L=1)

authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50500000000'
clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a226832716c463771445f65356c5f505f62796b7945377135645650674547685f49584a6b655737736e4d5463222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a747275652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a2039327063545644304162792d713464746d6a36656667227d'
signature = h'3046022100eb12fcf23b12764c0f122e22371fab92e283879fd798f38ee1841c951b6e40e7022100c76237ff9db77b3c56f30837cda6a09acfa2e915544e609c0733b1184036d1cf'

16.5. clientDataJSON に "topOrigin" を含む ES256 資格情報

登録:

challenge = h'4e1f4c6198699e33c14f192153f49d7e0e8e3577d5ac416c5f3adc92a41f27e5'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='none.ES256.topOrigin', L=32)

credential_private_key = h'a2d6de40ab974b80d8c1ef78c6d4300097754f7e016afe7f8ea0ad9798b0d420'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='none.ES256.topOrigin', L=32)
client_data_gen_flags = h'54'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='none.ES256.topOrigin', L=1)
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
aaguid = h'97586fd09799a76401c200455099ef2a'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='none.ES256.topOrigin', L=16)
credential_id = h'b8ad59b996047ab18e2ceb57206c362da57458793481f4a8ebf101c7ca7cc0f1'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='none.ES256.topOrigin', L=32)
; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます
auth_data_UV_BE_BS = h'a0'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='none.ES256.topOrigin', L=1)

clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a225468394d595a68706e6a504254786b68555f53646667364f4e58665672454673587a72636b7151664a2d55222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a747275652c22746f704f726967696e223a2268747470733a2f2f6578616d706c652e636f6d227d'
attestationObject = h'a363666d74646e6f6e656761747453746d74a068617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b5410000000097586fd09799a76401c200455099ef2a0020b8ad59b996047ab18e2ceb57206c362da57458793481f4a8ebf101c7ca7cc0f1a5010203262001215820a1c47c1d82da4ebe82cd72207102b380670701993bc35398ae2e5726427fe01d22582086c1080d82987028c7f54ecb1b01185de243b359294a0ed210cd47480f0adc88'

認証:

challenge = h'd54a5c8ca4b62a8e3bb321e3b2bc73856f85a10150db2939ac195739eb1ea066'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='none.ES256.topOrigin', L=32)

client_data_gen_flags = h'77'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='none.ES256.topOrigin', L=1)
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
extraData_random = h'52216824c5514070c0156162e2fc54a5' = b64'UiFoJMVRQHDAFWFi4vxUpQ'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='none.ES256.topOrigin', L=16)
; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します
auth_data_UV_BS = h'9f'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='none.ES256.topOrigin', L=1)

authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50500000000'
clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a22315570636a4b53324b6f34377379486a7372787a68572d466f51465132796b3572426c584f6573656f4759222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a747275652c22746f704f726967696e223a2268747470733a2f2f6578616d706c652e636f6d222c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a205569466f4a4d56525148444146574669347678557051227d'
signature = h'3045022100b5a70c81780d5fcc9a4f2ae9caae99058f8accaf58b91fb59329646c28ac6ffc022012e101c165db3c8e9957f0c54dd6ca9b56bc3bd2f280bd2faa6c1d02c6e5c171'

16.6. 非常に長い credential ID を持つ ES256 資格情報

登録:

challenge = h'1113c7265ccf5e65124282fa1d7819a7a14cb8539aa4cdbec7487e5f35d8ec6c'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='none.ES256.long-credential-id', L=32)

credential_private_key = h'6fd2149bb5f1597fe549b138794bde61893b2dc32ca316de65f04808dac211dc'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='none.ES256.long-credential-id', L=32)>
client_data_gen_flags = h'90'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='none.ES256.long-credential-id', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
aaguid = h'8f3360c2cd1b0ac14ffe0795c5d2638e'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='none.ES256.long-credential-id', L=16)>
credential_id = h'3a761a4e1674ad6c4305869435c0eee9c286172c229bb91b48b4ada140c0863417031305cce5b4a27a88d7fe728a5f5a627de771b4b40e77f187980c124f9fe832d7136010436a056cce716680587d23187cf1fc2c62ae86fc3e508ee9617ffc74fbc10488ec16ec5e9096328669a898709b655e549738c666c1ae6281dc3b5f733c251d3eefb76ee70a3805ca91bcc18e49c8dc7f63ebcb486ba8c3d6ab52b88ff72c6a5bb47c32f3ee8683a3ddc8abf60870448ec8a21b5bdcb183c7dead870255575a6df96eb1b6a2a1019780cba9e4887b17ff1164bbbcc10eb0d86ed75984cd3fa3419103024507dfd9ce8f92c56af7914cb0bb50b87ba82a312bb7dcd93028dbdcd6adb266979667158335171e3682d37755701edbf9d872846a291d49e57ef09da1ec637f5052ed2aa7407f7e61827468e94b461844f4c67be5fa9c6055a566f8fdfc29d4bf78a9ff275f552cc68ba543fa3962eea36fd1ea8453764577d021d0a181efc1f6100ab2e4110039e21ee16970bda7432b6134492155afc126295b3a2eccd12c66a68e340969e995e3e8c9c476e395cfc21203414110779474f1c9797406637dbe414f132519d3bf0ce4f01734ef0e1a12c3ad604ff15d766b1624db6a5a7ccbff7bc35c9908df94aba277e0af48f04ff3d16381c47e5a37ed3988a67a3b1ecaa926336b33391fff04128f869991c9fabd905b6fe3ceef5f8b630ec1c5d2636d5b1961ad5ca5004170f6f5e482792aad989b0287fe91e5c479403397152f1fa56aa79b156eb47e6c8ea3eb175c34cfb38ad8e772874639b1023d4d01395c94e55831671cc022aa6fa1e02a02c2e4abc776f6960e51f83b71a8c0f207b6a347573977812c9aa5480b0011aa739bd4b76c18c000cc4757cceccb920f007c40c00e37e5ab21476cd9f6054a8fffb55a108f5c706e2cea2049d81fd321ff47d2a5761b0800955ab1d4f4889f55a84e2601c684f17a4ade7453ea49591d0b59c8d9a765052f62219cf6ef4a5dd9539f0617d6ebbebce7c000455475d18449e25c49ef9a1e3efe18c09082ebe2058d7c347defaa92f0664553b805c7d76bbfce5f330aca220ac90a789380fc479ea0d8793205813cca590a912f699ad52f991a1bc0a503c3ec4b2a696719e3c26591a87127f7305cc7e72f4c8e39355ebb06a5b1042990f38710ee7aa612ee4374bb82e878585a70a96c2a6b47f101a4ff154be4fd76a3167577a5cc54d9167c154c69ac35485e44cc898b719e1be3cc9c0fb5624b8f8a0dae10947a41bf848b6c1bb33d1006ec077d7e286e3f2a7b4843716390119449fe2721e81a5ed2333d331c7120765da58fadae73c19d9a8c4509cf8ac1e9d98b799a5274509069739b5823f3fb496663820033426988eefca53e580e0f9e0dfe0992fc2e53a97e053639f98577058f995bdbd41cefdb'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='none.ES256.long-credential-id', L=1023)
; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます
auth_data_UV_BE_BS = h'69'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='none.ES256.long-credential-id', L=1)

clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a22455250484a6c7a50586d5553516f4c364858675a7036464d75464f61704d322d7830682d587a5859374777222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d'
attestationObject = h'a363666d74646e6f6e656761747453746d74a0686175746844617461590483bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b549000000008f3360c2cd1b0ac14ffe0795c5d2638e03ff3a761a4e1674ad6c4305869435c0eee9c286172c229bb91b48b4ada140c0863417031305cce5b4a27a88d7fe728a5f5a627de771b4b40e77f187980c124f9fe832d7136010436a056cce716680587d23187cf1fc2c62ae86fc3e508ee9617ffc74fbc10488ec16ec5e9096328669a898709b655e549738c666c1ae6281dc3b5f733c251d3eefb76ee70a3805ca91bcc18e49c8dc7f63ebcb486ba8c3d6ab52b88ff72c6a5bb47c32f3ee8683a3ddc8abf60870448ec8a21b5bdcb183c7dead870255575a6df96eb1b6a2a1019780cba9e4887b17ff1164bbbcc10eb0d86ed75984cd3fa3419103024507dfd9ce8f92c56af7914cb0bb50b87ba82a312bb7dcd93028dbdcd6adb266979667158335171e3682d37755701edbf9d872846a291d49e57ef09da1ec637f5052ed2aa7407f7e61827468e94b461844f4c67be5fa9c6055a566f8fdfc29d4bf78a9ff275f552cc68ba543fa3962eea36fd1ea8453764577d021d0a181efc1f6100ab2e4110039e21ee16970bda7432b6134492155afc126295b3a2eccd12c66a68e340969e995e3e8c9c476e395cfc21203414110779474f1c9797406637dbe414f132519d3bf0ce4f01734ef0e1a12c3ad604ff15d766b1624db6a5a7ccbff7bc35c9908df94aba277e0af48f04ff3d16381c47e5a37ed3988a67a3b1ecaa926336b33391fff04128f869991c9fabd905b6fe3ceef5f8b630ec1c5d2636d5b1961ad5ca5004170f6f5e482792aad989b0287fe91e5c479403397152f1fa56aa79b156eb47e6c8ea3eb175c34cfb38ad8e772874639b1023d4d01395c94e55831671cc022aa6fa1e02a02c2e4abc776f6960e51f83b71a8c0f207b6a347573977812c9aa5480b0011aa739bd4b76c18c000cc4757cceccb920f007c40c00e37e5ab21476cd9f6054a8fffb55a108f5c706e2cea2049d81fd321ff47d2a5761b0800955ab1d4f4889f55a84e2601c684f17a4ade7453ea49591d0b59c8d9a765052f62219cf6ef4a5dd9539f0617d6ebbebce7c000455475d18449e25c49ef9a1e3efe18c09082ebe2058d7c347defaa92f0664553b805c7d76bbfce5f330aca220ac90a789380fc479ea0d8793205813cca590a912f699ad52f991a1bc0a503c3ec4b2a696719e3c26591a87127f7305cc7e72f4c8e39355ebb06a5b1042990f38710ee7aa612ee4374bb82e878585a70a96c2a6b47f101a4ff154be4fd76a3167577a5cc54d9167c154c69ac35485e44cc898b719e1be3cc9c0fb5624b8f8a0dae10947a41bf848b6c1bb33d1006ec077d7e286e3f2a7b4843716390119449fe2721e81a5ed2333d331c7120765da58fadae73c19d9a8c4509cf8ac1e9d98b799a5274509069739b5823f3fb496663820033426988eefca53e580e0f9e0dfe0992fc2e53a97e053639f98577058f995bdbd41cefdb'

認証:

challenge = h'ef1deba56dce48f674a447ccf63b9599258ce87648e5c396f2ef0ca1da460e3b'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='none.ES256.long-credential-id', L=32)

client_data_gen_flags = h'80'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='none.ES256.long-credential-id', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します
auth_data_UV_BS = h'e5'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='none.ES256.long-credential-id', L=1)

authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50d00000000'
clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a22377833727057334f53505a307045664d396a75566d53574d36485a4935634f573875384d6f647047446a73222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d'
signature = h'304502203ecef83fb12a0cae7841055f9f87103a99fd14b424194bbf06c4623d3ee6e3fd022100d2ace346db262b1374a6b70faa51f518a42ddca13a4125ce6f5052a75bac9fb6'

16.7. ES256 資格情報の Packed アテステーション

登録:

challenge = h'c1184a5fddf8045e13dc47f54b61f5a656b666b59018f16d870e9256e9952012'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='packed.ES256', L=32)

credential_private_key = h'36ed7bea2357cefa8c4ec7e134f3312d2e6ca3058519d0bcb4c1424272010432'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='packed.ES256', L=32)>
client_data_gen_flags = h'8d'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='packed.ES256', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
extraData_random = h'f5af1b3588ca0a05ab05753e7c29756a' = b64'9a8bNYjKCgWrBXU-fCl1ag'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='packed.ES256', L=16)>
aaguid = h'876ca4f52071c3e9b25509ef2cdf7ed6'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='packed.ES256', L=16)>
credential_id = h'c9a6f5b3462d02873fea0c56862234f99f081728084e511bb7760201a89054a5'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='packed.ES256', L=32)>
; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます
auth_data_UV_BE_BS = h'4f'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='packed.ES256', L=1)>
attestation_private_key = h'ec2804b222552b4b277d1f58f8c4343c0b0b0db5474eb55365c89d66a2bc96be'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='packed.ES256', L=32)>
attestation_cert_serial_number = h'88c220f83c8ef1feafe94deae45faad0'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='packed.ES256', L=16)

clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a227752684b58393334424634543345663153324831706c61325a725751475046746877365356756d56494249222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a20396138624e596a4b436757724258552d66436c316167227d'
attestationObject = h'a363666d74667061636b65646761747453746d74a363616c6726637369675847304502203f19ec4b229f46ab8c45eff29b904ff10c0390dc40bf1216f04a78f4ceba3425022100fe7041a32759aff05a0f9f26c70a999c7a284451ba89234a1d3483c25e21925b637835638159022530820221308201c8a00302010202110088c220f83c8ef1feafe94deae45faad0300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d03010703420004a91ba4389409dd38a428141940ca8feb1ac0d7b4350558104a3777a49322f3798440f378b3398ab2d3bb7bf91322c92eb23556f59ad0a836fec4c7663b0e4dc3a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e04160414a589ba72d060842ab11f74fb246bdedab16f9b9b301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d040302034700304402201726b9d85ecd8a5ed51163722ca3a20886fd9b242a0aa0453d442116075defd502207ef471e530ac87961a88a7f0d0c17b091ffc6b9238d30f79f635b417be5910e768617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b54d00000000876ca4f52071c3e9b25509ef2cdf7ed60020c9a6f5b3462d02873fea0c56862234f99f081728084e511bb7760201a89054a5a50102032620012158201cf27f25da591208a4239c2e324f104f585525479a29edeedd830f48e77aeae522582059e4b7da6c0106e206ce390c93ab98a15a5ec3887e57f0cc2bece803b920c423'

認証:

challenge = h'b1106fa46a57bef1781511c0557dc898a03413d5f0f17d244630c194c7e1adb5'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='packed.ES256', L=32)

client_data_gen_flags = h'75'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='packed.ES256', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
extraData_random = h'019330c8cc486c3f3eba0b85369eabf1' = b64'AZMwyMxIbD8-uguFNp6r8Q'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0b', info='packed.ES256', L=16)>
; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します
auth_data_UV_BS = h'46'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0c', info='packed.ES256', L=1)

authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50d00000000'
clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2273524276704770587676463446524841565833496d4b4130453958773858306b526a44426c4d6668726255222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a20415a4d77794d78496244382d756775464e7036723851227d'
signature = h'30450220694969d3ee928de6f02ef23a9c644d7d779916451734a94b432542f498a1ebe90221008b0819c824218a97152cd099c55bfb1477b29d900a49a64018314f9bfccda163'

16.8. ES384 資格情報の Packed アテステーション

登録:

challenge = h'567b030b3e186bc1d169dd45b79f9e0d86f1fd63474da3eade5bdb8db379a0c3'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='packed.ES384', L=32)

credential_private_key = h'271e37d309c558c0f35222b37abba7500377d68e179e4c74b0cb558551b2e5276b47b90a317ca8ebbe1a12c93c2d5dd9'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='packed.ES384', L=48)>
client_data_gen_flags = h'32'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='packed.ES384', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
aaguid = h'e950dcda3bdae1d087cda380a897848b'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='packed.ES384', L=16)>
credential_id = h'953ae2dd9f28b1a1d5802c83e1f65833bb9769a08de82d812bc27c13fc6f06a9'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='packed.ES384', L=32)>
; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます
auth_data_UV_BE_BS = h'db'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='packed.ES384', L=1)>
attestation_private_key = h'8d979fbb6e49c4eeb5925a2bca0fcdb023d3fb90bcadce8391da9da4ed2aee9a'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='packed.ES384', L=32)>
attestation_cert_serial_number = h'3d0a5588bb87ebb1d4cee4a1807c1b7c'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='packed.ES384', L=16)

clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a22566e7344437a3459613848526164314674352d65445962785f574e4854615071336c76626a624e356f4d4d222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d'
attestationObject = h'a363666d74667061636b65646761747453746d74a363616c67266373696758473045022100c56ecc970b7843833e0f461fde26233f61eb395161d481558c08b9c6ed61675b022029f5e05033705cd0f9b0a07e149468ec308a4f84906409efdceb1da20a7518d6637835638159022530820221308201c7a00302010202103d0a5588bb87ebb1d4cee4a1807c1b7c300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d0301070342000417e5cc91d676d370e36aa7de40c25aacb45a3845f13d2932088ece2270b9b431241c219c22d0c256c9438ade00f2c05e62f8ef906b9b997ae9f3c460c2db66f5a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e04160414c7c8dd95382a2230e4c0dd3664338fa908169a9c301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d0403020349003046022100c56ecc970b7843833e0f461fde26233f61eb395161d481558c08b9c6ed61675b022029f5e05033705cd0f9b0a07e149468ec308a4f84906409efdceb1da20a7518d6637835638159022530820221308201c7a00302010202103d0a5588bb87ebb1d4cee4a1807c1b7c300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d0301070342000417e5cc91d676d370e36aa7de40c25aacb45a3845f13d2932088ece2270b9b431241c219c22d0c256c9438ade00f2c05e62f8ef906b9b997ae9f3c460c2db66f5a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e04160414c7c8dd95382a2230e4c0dd3664338fa908169a9c301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d040302034700304402201726b9d85ecd8a5ed51163722ca3a20886fd9b242a0aa0453d442116075defd502207ef471e530ac87961a88a7f0d0c17b091ffc6b9238d30f79f635b417be5910e768617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b55900000000e950dcda3bdae1d087cda380a897848b0020953ae2dd9f28b1a1d5802c83e1f65833bb9769a08de82d812bc27c13fc6f06a9a5010203382220022158304866bd8b01da789e9eb806e5eab05ae5a638542296ab057a2f1bbce9b58f8a08b9171390b58a37ac7fffc2c5f45857da2258302a0b024c7f4b72072a1f96bd30a7261aae9571dd39870eb29e55c0941c6b08e89629a1ea1216aa64ce57c2807bf3901a'

認証:

challenge = h'ff41c3d25dbd8966fb61e28ef5e47041e137ed268520412d76202ba0ad2d1453'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='packed.ES384', L=32)

client_data_gen_flags = h'0c'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='packed.ES384', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します
auth_data_UV_BS = h'af'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='packed.ES384', L=1)

authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50d00000000'
clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2273524276704770587676463446524841565833496d4b4130453958773858306b526a44426c4d6668726255222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a20415a4d77794d78496244382d756775464e7036723851227d'
signature = h'30650220694969d3ee928de6f02ef23a9c644d7d779916451734a94b432542f498a1ebe90221008b0819c824218a97152cd099c55bfb1477b29d900a49a64018314f9bfccda163'

16.9. ES512 資格情報の Packed アテステーション

登録:

challenge = h'4ee220cd92b07e11451cb4c201c5755bd879848e492a9b12d79135c62764dc2fd28ead4808cafe5ad1de8fa9e08d4a8eeafea4dfb333877b02bc503f475d3b0c1394a7683baaf4f2477829f7b8cf750948985558748c073068396fcfdcd3f245bf2038e6bb38d7532768aad13be8c118f727722e7426139041e9caca503884c5'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='packed.ES512', L=128)

credential_private_key = h'f11120594f6a4944ac3ba59adbbc5b85016895b649f4cc949a610f4b48be47b318850bacb105f747647bba8852b6b8e52a0b3679f1bbbdfe18c99409bcb644fa45'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='packed.ES512', L=65)>
client_data_gen_flags = h'6d'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='packed.ES512', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
extraData_random = h'a37a958ce2f6b535a6e06c64cc8fd082' = b64'o3qVjOL2tTWm4GxkzI_Qgg'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='packed.ES512', L=16)>
aaguid = h'39d8ce6a3cf61025775083a738e5c254'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='packed.ES512', L=16)>
credential_id = h'd17d5af7e3f37c56622a67c8462c9e1c6336dfccb8b61d359dc47378dba58ce4'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='packed.ES512', L=32)>
; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます
auth_data_UV_BE_BS = h'cf'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='packed.ES512', L=1)>
attestation_private_key = h'ffbc89d5f75994f52dc5e7538ee269402d26995d40c16fb713473e34fca98be4'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='packed.ES512', L=32)>
attestation_cert_serial_number = h'8a128b7ebe52b993835779e6d9b81355'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='packed.ES512', L=16)

clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a22547549677a5a4b7766684646484c544341635631573968356849354a4b707353313545317869646b33435f536a713149434d722d577448656a366e676a55714f3676366b33374d7a683373437646415f5231303744424f5570326737717654795233677039376a5064516c496d465659644977484d47673562385f63305f4a46767941343572733431314d6e614b72524f2d6a424750636e636935304a684f5151656e4b796c4134684d55222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a206f3371566a4f4c327454576d3447786b7a495f516767227d'
attestationObject = h'a363666d74667061636b65646761747453746d74a363616c67266373696758473045022100ce158f6c04aa5c14c0dd3e1103cf93664896fb5c337a66dbd7dba31546ff0d41022071cbcd0d3b8e218a6d05374e0ef8031329d25059002ac1603d02d5fd8a0a29cb637835638159022730820223308201c8a0030201020211008a128b7ebe52b993835779e6d9b81355300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d03010703420004940b68885291536e2f7c60c05acfb252e7eebcf4304425dd93ab7b1962f20492bf18dc0f12862599e81fb764ac92151f9a78fcbb35d7a26c8c52949b18133c06a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e041604143ffad863abcd3dc5717b8a252189f41af97e7f31301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d0403020349003046022100ce158f6c04aa5c14c0dd3e1103cf93664896fb5c337a66dbd7dba31546ff0d41022071cbcd0d3b8e218a6d05374e0ef8031329d25059002ac1603d02d5fd8a0a29cb637835638159022730820223308201c8a0030201020211008a128b7ebe52b993835779e6d9b81355300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d0301070342000417e5cc91d676d370e36aa7de40c25aacb45a3845f13d2932088ece2270b9b431241c219c22d0c256c9438ade00f2c05e62f8ef906b9b997ae9f3c460c2db66f5a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e04160414c7c8dd95382a2230e4c0dd3664338fa908169a9c301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d040302034700304402201726b9d85ecd8a5ed51163722ca3a20886fd9b242a0aa0453d442116075defd502207ef471e530ac87961a88a7f0d0c17b091ffc6b9238d30f79f635b417be5910e768617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b55900000000e950dcda3bdae1d087cda380a897848b0020953ae2dd9f28b1a1d5802c83e1f65833bb9769a08de82d812bc27c13fc6f06a9a5010203382220022158304866bd8b01da789e9eb806e5eab05ae5a638542296ab057a2f1bbce9b58f8a08b9171390b58a37ac7fffc2c5f45857da2258302a0b024c7f4b72072a1f96bd30a7261aae9571dd39870eb29e55c0941c6b08e89629a1ea1216aa64ce57c2807bf3901a'

認証:

challenge = h'08d3190c6dcb3d4f0cb659a0333bf5ea124ddf36a0cd33d5204b0d7a22a8cc26f2e4f169d200285c77b3fb22e0f1c7f49a87d4be2d25e92d797808ddaaa9b5715efd3a6ada9339d3052a687dbc5d2f8c871b0451e0691f57ad138541b7b72e7aa8933729ec1c664bf2e4dedae1616d08ecefa80a2a53b103663ce5a881048829'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='packed.ES512', L=128)

client_data_gen_flags = h'ac'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='packed.ES512', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します
auth_data_UV_BS = h'52'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0b', info='packed.ES512', L=1)

authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b51900000000'
clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a22434e4d5a4447334c5055384d746c6d674d7a763136684a4e337a61677a5450564945734e65694b6f7a436279355046703067416f5848657a2d794c67386366306d6f66557669306c3653313565416a6471716d31635637394f6d72616b7a6e544253706f666278644c3479484777525234476b66563630546855473374793536714a4d334b6577635a6b7679354e376134574674434f7a7671416f71553745445a6a7a6c7149454569436b222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d'
signature = h'3081870242009bda02fe384e77bcb9fb42b07c395b7a53ec9d9616dd0308ab8495c2141c8364c7d16e212a4a4fb8e3987ff6c99eafd64d8484fd28c3fc7968f658a9033d1bb1b802416383e9f3ee20c691b66620299fef36bea2df4d39c92b2ead92f58e7b79ab0d9864d2ebf3b0dcc66ea13234492ccee6e9d421db43c959bcb94c162dc9494136c9f6'

16.10. RS256 資格情報の Packed アテステーション

登録:

challenge = h'bea8f0770009bd57f2c0df6fea9f743a27e4b61bbe923c862c7aad7a9fc8e4a6'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='packed.RS256', L=32)

; 2 個の最小のメルセンヌ素数 2^p - 1(p ≥ 1024)を使用
private_key_p = 2^1279 - 1 = h'7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'
private_key_q = 2^2203 - 1 = h'07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'
client_data_gen_flags = h'1c'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='packed.RS256', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
aaguid = h'428f8878298b9862a36ad8c7527bfef2'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='packed.RS256', L=16)>
credential_id = h'992a18acc83f67533600c1138a4b4c4bd236de13629cf025ed17cb00b00b74df'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='packed.RS256', L=32)>
; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます
auth_data_UV_BE_BS = h'7e'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='packed.RS256', L=1)>
attestation_private_key = h'08a1322d5aa5b5b40cd67c2cc30b038e7921d7888c84c342d50d79f0c5fc3464'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='packed.RS256', L=32)>
attestation_cert_serial_number = h'1f6fb7a5ece81b45896b983a995da5f3'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='packed.RS256', L=16)

clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a2276716a776477414a76566679774e3976367039304f69666b7468752d6b6a79474c48717465705f49354b59222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d'
attestationObject = h'a363666d74667061636b65646761747453746d74a363616c672663736967584730450221008b8c5c6ea8c142c032e0be69e1353d44461c5c9109941cdda951b976eb95b6b302204d52f406c19e254b3ff9589bd18070fb055ac8db12fdd0a6734bea9d7168e900637835638159022630820222308201c7a00302010202101f6fb7a5ece81b45896b983a995da5f3300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d03010703420004b7b36b7542a11120b443c794d0c99fdc25a06b76586413d81e086163ef6fe147a557afc34e2861d9057d6d465d4705a0310550bdeeb5f35ee35b9425ab859981a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e04160414fb37b647bccfb9e54d989eaaacc1633868703fb3301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d0403020349003046022100b86bc129d92afca7d9869a39f70f139a305b4073a39eb654d81424bed5757d91022100cf9f7c60cab7c4a7d3e7f0020f281a93d4fd0a9f95121b989f56932a68885fba68617574684461746159021bbfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b55d00000000428f8878298b9862a36ad8c7527bfef20020992a18acc83f67533600c1138a4b4c4bd236de13629cf025ed17cb00b00b74dfa4010303390100205901b403fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012143010001'

認証:

challenge = h'295f59f5fa8fe62c5aca9e27626c78c8da376ae6d8cd2dd29aebad601e1bc4c5'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='packed.RS256', L=32)

client_data_gen_flags = h'0e'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='packed.RS256', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します
auth_data_UV_BS = h'ba'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='packed.RS256', L=1)

authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b51900000000'
clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a224b56395a39667150356978617970346e596d7834794e6f33617562597a5333536d75757459423462784d55222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d'
signature = h'01063d52d7c39b4d432fc7063c5d93e582bdcb16889cd71f888d67d880ea730a428498d3bc8e1ee11f2b1ecbe6c292b118c55ffaaddefa8cad0a54dd137c51f1eec673f1bb6c4d1789d6826a222b22d0f585fc901fdc933212e579d199b89d672aa44891333e6a1355536025e82b25590256c3538229b55737083b2f6b9377e49e2472f11952f79fdd0da180b5ffd901b4049a8f081bb40711bef76c62aed943571f2d0575304cb549d68d8892f95086a30f93716aee818f8dc06e96c0d5e0ed4cfa9fd8773d90464b68cf140f7986666ff9c9e3302acd0535d60d769f465e2ab57ef8aabc89fccfef7ba32a64154a8b3d26be2298f470b8cc5377dbe3dfd4b0b45f8f01e63bde6cfc76b62771f9b70aa27cf40152cad93aa5acd784fd4b90f676e2ea828d0bf2400aebbaae4153e5838f537f88b6228346782a93a899be66ec77de45b3efcf311da6321c92e6b0cd11bfe653bf3e98cee8e341f02d67dbb6f9c98d9e8178090cfb5b70fbc6d541599ac794ae2f1d4de1286ec8de8c2daf7b1d15c8438e90d924df5c19045220a4c8438c1b979bbe016cf3d0eeec23c3999d4882cc645b776de930756612cdc6dd398160ff02a6'

16.11. Ed25519 資格情報の Packed アテステーション

登録:

challenge = h'a8abf9dabdc6b0df63466b39bda9e8a34a34e185337a59f1c579990676d3b3bd'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='packed.EdDSA', L=32)

private_key = h'971f38c0f73aaf0c5a614eb5e26430ae1ea0ed13e4f425d96e9662349340b0b3'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='packed.EdDSA', L=32)>
client_data_gen_flags = h'bd'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='packed.EdDSA', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
extraData_random = h'07f0d3e60ed90fffbd3932d85f922f11' = b64'B_DT5g7ZD_-9OTLYX5IvEQ'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='packed.EdDSA', L=16)>
aaguid = h'd5aa33581e8ca478e20fe713f5d32ff2'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='packed.EdDSA', L=16)>
credential_id = h'ce9f840ed96599580cd140fbc7bb3230633f50f61041aff73308ae71caa8a2bd'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='packed.EdDSA', L=32)>
; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます
auth_data_UV_BE_BS = h'32'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='packed.EdDSA', L=1)>
attestation_private_key = h'fbe7f950684f23afd045072a8b287ad29528707c662672850ac69733ffe0db85'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='packed.EdDSA', L=32)>
attestation_cert_serial_number = h'b2cfc9ea33c8643b0e1a760463eaf164'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='packed.EdDSA', L=16)

clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a22714b763532723347734e396a526d733576616e6f6f306f303459557a656c6e7878586d5a426e6254733730222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a20425f44543567375a445f2d394f544c59583549764551227d'
attestationObject = h'a363666d74667061636b65646761747453746d74a363616c67266373696758483046022100d83f60bd80269537583218858aefb03ac57d45fa06e42feaae332d187f62da9f022100a02bd3cb6f7e1d283c93bad1f3f4b5a4c0494463da7fdbf256949116754d1f17637835638159022730820223308201c8a003020102021100b2cfc9ea33c8643b0e1a760463eaf164300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d03010703420004dd2b7a564b73b8c0b81c4c62e521925c4d1198ec9f583dbf1eebe364b65cd9c29a9bdf346aaa81fb6b9507e5249a52fdaf8e39e26b0b7dc45992a7e233b70f70a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e041604140ae27546bc7eccb1b4b597bd354f0c0b1f1f8f8e301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d0403020349003046022100a0d434ecb5fc3bfd7da5f41904517ad2836249f561bd834ba7a438a8ab7a4ce8022100fac845bb7a02513b58e9f319654dbe49b0f02b95835bac568c71f8a18cdde9ab6861757468446174615881bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b54100000000d5aa33581e8ca478e20fe713f5d32ff20020ce9f840ed96599580cd140fbc7bb3230633f50f61041aff73308ae71caa8a2bda401010327200621582044e06ddd331c36a8dc667bab52bcae63486c916aa5e339e6acebaa84934bf832'

認証:

challenge = h'895957e01c633a698348a2d8a31a54b7db27e8c1c43b2080d79ae2190267bfd2'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='packed.EdDSA', L=32)

client_data_gen_flags = h'8c'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='packed.EdDSA', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します
auth_data_UV_BS = h'ab'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0b', info='packed.EdDSA', L=1)

authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50100000000'
clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2269566c583442786a4f6d6d44534b4c596f7870557439736e364d48454f7943413135726947514a6e763949222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d'
signature = h'f5c59c7e46c34f6f8cc197101ddf9934fa2595f68eb1913a637e8419eb9ba4cfdfc48f85393bc0d40b011f0d6fecb097d6607525713223a0dc0d453993dae00b'

16.12. Ed448 資格情報の Packed アテステーション

登録:

challenge = h'2578d0801b5a005b5451e540121788cb01949e187b91db13f58755403efbf337'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='packed.Ed448', L=32)

private_key = h'ed479eecf63bd89e3898434798bb3c417bfc8284f6f011958bc0e78edbf6a2a640c0e358b1b1452a1f3782c400dabb4134192dee3031869a45'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='packed.Ed448', L=57)>
client_data_gen_flags = h'e3'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='packed.Ed448', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
extraData_random = h'050a80de27875521cc4c3316c06da42b' = b64'BQqA3ieHVSHMTDMWwG2kKw'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='packed.Ed448', L=16)>
aaguid = h'41c913aeda925fe02273322e34c2ae67'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='packed.Ed448', L=16)>
credential_id = h'224fcde324e6b075ede55098a24b9ddce5f5a7c71d23703efd528a38f8a5f33c'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='packed.Ed448', L=32)>
; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます
auth_data_UV_BE_BS = h'3b'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='packed.Ed448', L=1)>
attestation_private_key = h'd90faf5cc3f7853456b09124dd870250347f9c9ff66dba363aecd9194c665715'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='packed.Ed448', L=32)>
attestation_cert_serial_number = h'cff4228697d6e5ac47480b2390677f05'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='packed.Ed448', L=16)

clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a224a586a5167427461414674555565564145686549797747556e6868376b6473543959645651443737387a63222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a2042517141336965485653484d54444d577747326b4b77227d'
attestationObject = h'a363666d74667061636b65646761747453746d74a363616c67266373696758473045022100c5430b6b53f6b8fd1e5fa46ae7ebb8f9e9ae0d10ebc748e876e2d979b39b1382022008c5cda8af174f2d3c050d5d14eec0721031364cb12924a06633d4924c6bcad3637835638159022730820223308201c8a003020102021100cff4228697d6e5ac47480b2390677f05300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d03010703420004b85aaf790c824037cfe9fc56ab8d7ce6fbfaff2e3fe7c8d745734c3c6e3c6ce880d505ccdb1e2c3738680e6f49f475e4d8d0b6c29060e6e0d7a6392fb69094cea360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e04160414fa8f81c2dcc0e194ae5034c7e79dcf6d9d8593e2301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d0403020349003046022100e761f54215ad92f27c2c14b9eea3e39e8c22429e833ecba5be918987aa72e0e6022100d5a714df479c238586b7d9e6684ea84991087038b0fef6a29b57b66b74df05fd686175746844617461589bbfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b5590000000041c913aeda925fe02273322e34c2ae670020224fcde324e6b075ede55098a24b9ddce5f5a7c71d23703efd528a38f8a5f33ca4010103383420072158398051ef4f94670b5abf17da2e9558ba6eba94eb8704363915b4d666de287ad329de9f1f075211aba602dc6e7a5e52b15a8ee1c984a9f8887380'

認証:

challenge = h'1a942f401d8d8e36fe888c35c22b718217802fc6685bf139c47b311408128693'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='packed.Ed448', L=32)

client_data_gen_flags = h'2d'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='packed.Ed448', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
extraData_random = h'5ca1e381b5e009e01760db2eb632316f' = b64'XKHjgbXgCeAXYNsutjIxbw'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0b', info='packed.Ed448', L=16)>
; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します
auth_data_UV_BS = h'fc'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0c', info='packed.Ed448', L=1)

authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b51d00000000'
clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a22477051765142324e6a6a622d6949773177697478676865414c385a6f575f4535784873784641675368704d222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a20584b486a6762586743654158594e7375746a49786277227d'
signature = h'071db921430e13ca1a607eedb96cbd30fd63946a06e731217cad6fd82ba3b930d482308a2c101752a2518cff70918d4a20f29bd2eda4f45a80bba6c4ad85b10fb721b1849725b7dbef315d5fb101c6dab890b06d94a8b52a74b5848f68e6152af24867b7555d2b22b8955cbff5c87de73b00'

16.13. ES256 資格情報の TPM アテステーション

登録:

challenge = h'cfc82cdf1ceee876120aa88f0364f0910193460cfb97a317b2fe090694f9a299'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='tpm.ES256', L=32)

credential_private_key = h'80c60805e564f6d33e7abdff9d32e3db09a6219fe378a268d23107191b18e39f'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='tpm.ES256', L=32)>
client_data_gen_flags = h'84'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='tpm.ES256', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
aaguid = h'4b92a377fc5f6107c4c85c190adbfd99'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='tpm.ES256', L=16)>
credential_id = h'ec27bec7521c894bbb821105ea3724c90e770cf1fa354157ef18d0f18f78bea9'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='tpm.ES256', L=32)>
; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます
auth_data_UV_BE_BS = h'af'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='tpm.ES256', L=1)>
attestation_private_key = h'6210f09e0ce7593e851a880a4bdde2d2192afeac46104abce1a890a5a71cf0c6'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='tpm.ES256', L=32)>
attestation_cert_serial_number = h'311fc42da0ab10c43a9b1bf3a75e34e2'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='tpm.ES256', L=16)

clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a227a38677333787a753648595343716950413254776b51475452677a376c364d587376344a427054356f706b222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d'
attestationObject = h'a363666d746374706d6761747453746d74a663616c67266373696758463044022066e5826a652091030fd444e33c3eca2bc6dc548cf3045013addb38aa6457a21002203f3a5c95c9e707d0e555041bcc8698ee4ebc04e26cc8bae459705471789851766376657263322e30637835638159023a30820236308201dca0030201020210311fc42da0ab10c43a9b1bf3a75e34e2300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a30003059301306072a8648ce3d020106082a8648ce3d03010703420004c54e3f109094f60d7699b7db5d838569ffd1f3e1c9e897cd9eb40063f9402e3e9937e936cf1fcd5eb743ff443c97ab2edcd7c8e0e6cf6cfd413b8ab19fffa769a381d33081d0300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e041604145f546cb6973d4981e80fcdc7463859f5879680e4301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e30100603551d250409300706056781050803305e0603551d110101ff04543052a450304e314c3014060567810502010c0b69643a30303030303030303014060567810502030c0b69643a3030303030303030301e060567810502020c15576562417574686e207465737420766563746f7273300a06082a8648ce3d0403020348003045022063c9a2797b8066f1db34dd609f1ab6695607e7a98e9ff8090a68853c9a9fc949022100a55831a39f5b8a2aa9a68837829cabf43fea2a5cea4859ae851cac78e6ac3e97677075624172656158560023000b0004000000000010001000030010002041202698c9d9753fb4bb3f27cd09fe6b8afdb76438ee2ae54d7c9dade10d864b0020d8735115cdb330a63ea1d6e43d5000f4bd56f99bce83ee1d73301fc270116d076863657274496e666f5869ff544347801700000020277d0e05579dd013215a62273f7f3a3e7e191ead2654a3036d75a5a3ee37a6b0000000000000000011111111222222223300000000000000000022000b9c42d8aad5939331b9af3711af179f17123178098c9a7d0ca89fcd1fc800f3c7000068617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b54d000000004b92a377fc5f6107c4c85c190adbfd990020ec27bec7521c894bbb821105ea3724c90e770cf1fa354157ef18d0f18f78bea9a501020326200121582041202698c9d9753fb4bb3f27cd09fe6b8afdb76438ee2ae54d7c9dade10d864b225820d8735115cdb330a63ea1d6e43d5000f4bd56f99bce83ee1d73301fc270116d07'

認証:

challenge = h'00093b66c21d5b5e89f7a07082118907ea3e502d343b314b8c5a54d62db202fb'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='tpm.ES256', L=32)

client_data_gen_flags = h'86'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='tpm.ES256', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します
auth_data_UV_BS = h'87'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='tpm.ES256', L=1)

authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50d00000000'
clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2241416b375a7349645731364a393642776768474a422d6f2d554330304f7a464c6a46705531693279417673222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d'
signature = h'3045022060dc76b1607ec716c6e5eba8d056695ed6bc47b2e3d7a729c34e759e3ab66aa0022100d010a9e8fddcb64c439dfdca628ddb33cf245d567d157d9f66f942601bed9b38'

16.14. ES256 資格情報の Android Key アテステーション

登録:

challenge = h'3de1f0b7365dccde3ff0cbf25e26ffa7baff87ef106c80fc865dc402d9960050'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='android-key.ES256', L=32)

credential_private_key = h'd4328d911acb0ebcc42aad29b29ffb55d5bc31d8af7ca9a16703d56c21abc7b4'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='android-key.ES256', L=32)>
client_data_gen_flags = h'73'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='android-key.ES256', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
extraData_random = h'555d5c42e476a8b33f6a63dfa07ccbd2' = b64'VV1cQuR2qLM_amPfoHzL0g'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='android-key.ES256', L=16)>
aaguid = h'ade9705e1ce7085b899a540d02199bf8'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='android-key.ES256', L=16)>
credential_id = h'0a4729519788b6ed8a2d772b494e186244d8c798c052960dbc8c10c915176795'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='android-key.ES256', L=32)>
; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます
auth_data_UV_BE_BS = h'1e'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='android-key.ES256', L=1)>
attestation_cert_serial_number = h'1ff91f76b63f44812f998b250b0286bf'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='android-key.ES256', L=16)

clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a2250654877747a5a647a4e345f384d76795869625f7037725f682d385162494438686c334541746d57414641222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a205656316351755232714c4d5f616d50666f487a4c3067227d'
attestationObject = h'a363666d746b616e64726f69642d6b65796761747453746d74a363616c67266373696758483046022100e95512982aa3f216cff2e87c8ec57057b8529f674eaabeccaa27fd03d8779f19022100afb6bf459da4a826f00d01fc6b60712ff31dc4eb331619c8f874bb17e4314e94637835638159026f3082026b30820210a00302010202101ff91f76b63f44812f998b250b0286bf300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d0301070342000499169657036d089a2a9821a7d0063d341f1a4613389359636efab5f3cbf1accfdd91c55543176ea99b644406dd1dd63774b6af65ac759e06ff40b1c8ab02df6ba381a83081a5300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e041604141ac81e50641e8d1339ab9f7eb25f0cd5aac054b0301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e3045060a2b06010401d679020111043730350202012c0201000201000201000420b435028d7b6a8f83bb461d41c19b053a9d3cdb30351a4f374cd4cde8dbefb606040030003000300a06082a8648ce3d040302034900304602210081671f2474f336e6b5a868d28b47cd054c0ed4261f531fcdf1a1ceed19f600ad022100e7ac683848c34842a432ff4a26e9dbc537b88e83fc4cb59138de3ca3a3e1081468617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b55d00000000ade9705e1ce7085b899a540d02199bf800200a4729519788b6ed8a2d772b494e186244d8c798c052960dbc8c10c915176795a501020326200121582099169657036d089a2a9821a7d0063d341f1a4613389359636efab5f3cbf1accf225820dd91c55543176ea99b644406dd1dd63774b6af65ac759e06ff40b1c8ab02df6b'

認証:

challenge = h'e4ee05ca9dbced74116540f24ed9adc62aae8507560522844ffa7eea14f7af86'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='android-key.ES256', L=32)

client_data_gen_flags = h'43'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='android-key.ES256', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
extraData_random = h'ab127107eff182bc3230beb5f1dad29c' = b64'qxJxB-_xgrwyML618drSnA'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='android-key.ES256', L=16)>
; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します
auth_data_UV_BS = h'4a'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0b', info='android-key.ES256', L=1)

authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50900000000'
clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a22354f344679703238375851525a55447954746d74786971756851645742534b45545f702d36685433723459222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a2071784a78422d5f78677277794d4c3631386472536e41227d'
signature = h'3045022100a2b5e37da43ceb63566f6e2817c6cbef261073d0cadfd213ff6229bd33ddea6c02203d77eb3202fc92b9b5bb843ef082c7766f8c7f23194c92708ff2f3d1de765a8f'

16.15. ES256 資格情報の Apple 匿名アテステーション

登録:

challenge = h'f7f688213852007775009cf8c096fda89d60b9a9fb5a50dd81dd9898af5a0609'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='apple.ES256', L=32)

credential_private_key = h'de987bd9d43eeb44728ce0b14df11209dff931fb56b5b1948de4c0da1144ded0'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='apple.ES256', L=32)>
client_data_gen_flags = h'5f'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='apple.ES256', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
extraData_random = h'4e32cf9e939a5d052b14d71b1f6b5364' = b64'TjLPnpOaXQUrFNcbH2tTZA'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='apple.ES256', L=16)>
aaguid = h'748210a20076616a733b2114336fc384'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='apple.ES256', L=16)>
credential_id = h'9c4a5886af9283d9be3e9ec55978dedfdce2e3b365cab193ae850c16238fafb8'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='apple.ES256', L=32)>
; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます
auth_data_UV_BE_BS = h'2a'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='apple.ES256', L=1)>
attestation_cert_serial_number = h'394275613d5310b81a29ce90f48b61c1'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='apple.ES256', L=16)

clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a22395f61494954685341486431414a7a34774a6239714a316775616e37576c4464676432596d4b396142676b222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a20546a4c506e704f6158515572464e6362483274545a41227d'
attestationObject = h'a363666d74656170706c656761747453746d74a1637835638159025c30820258308201fea0030201020210394275613d5310b81a29ce90f48b61c1300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d030107034200048a3d5b1b4c543a706bf6e4b00afedb3c930b690dd286934fe2911f779cc7761af728e1aa3b0ff66692192daa776b83ddf8e3340d2d9a0eabdfc324eb3e2f136ca38196308193300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e0416041412f1ce6c0ae39b403bfc9200317bc183a4e4d766301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e303306092a864886f76364080204263024a1220420d7a86e7233fb843eb0eeb407d8b76ff7e4f82d218cf5dbb461d752073f5cb29a300a06082a8648ce3d0403020348003045022070f5c2ede3000e9dae358d412b26a4acbf18f4cdeb80f5b13fcd564d090c39ec022100f672e2c3dbe117c9b1490b3c660abf5dcd74398187082dacb58b6744de4aca6068617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b54900000000748210a20076616a733b2114336fc38400209c4a5886af9283d9be3e9ec55978dedfdce2e3b365cab193ae850c16238fafb8a50102032620012158208a3d5b1b4c543a706bf6e4b00afedb3c930b690dd286934fe2911f779cc7761a225820f728e1aa3b0ff66692192daa776b83ddf8e3340d2d9a0eabdfc324eb3e2f136c'

認証:

challenge = h'd3eb2964641e26fed023403a72dde093b19c4ba9008c3f9dd83fcfd347a66d05'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='apple.ES256', L=32)

client_data_gen_flags = h'c2'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='apple.ES256', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します
auth_data_UV_BS = h'e2'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='apple.ES256', L=1)

authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50900000000'
clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a22302d73705a4751654a76375149304136637433676b37476353366b416a442d6432445f503030656d625155222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d'
signature = h'3046022100ee35db795ce28044e1f8231d68b3d79a9882f7415aa35c1b5ac74d24251073c8022100dcc65691650a412d0ceef843710c09827acf26c7845bddac07eec95863e7fc4c'

16.16. ES256 資格情報の FIDO U2F アテステーション

登録:

challenge = h'e074372990b9caa507a227dfc67b003780c45325380d1a90c20f81ed7d080c06'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='fido-u2f.ES256', L=32)

credential_private_key = h'51bd002938fa10b83683ac2a2032d0a7338c7f65a90228cfd1f61b81ec7288d0'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='fido-u2f.ES256', L=32)>
client_data_gen_flags = h'00'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='fido-u2f.ES256', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
aaguid = h'afb3c2efc054df425013d5c88e79c3c1'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='fido-u2f.ES256', L=16)>
credential_id = h'a4ba6e2d2cfec43648d7d25c5ed5659bc18f2b781538527ebd492de03256bdf4'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='fido-u2f.ES256', L=32)>
attestation_private_key = h'66fda477a2a99d14c5edd7c1041a297ba5f3375108b1d032b79429f42349ce33'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='fido-u2f.ES256', L=32)>
attestation_cert_serial_number = h'04f66dc6542ea7719dea416d325a2401'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='fido-u2f.ES256', L=16)

clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a22344851334b5a4335797155486f696666786e73414e344445557955344452715177672d4237583049444159222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d'
attestationObject = h'a363666d74686669646f2d7532666761747453746d74a26373696758473045022100f41887a20063bb26867cb9751978accea5b81791a68f4f4dd6ea1fb6a5c086c302204e5e00aa3895777e6608f1f375f95450045da3da57a0e4fd451df35a31d2d98a637835638159022530820221308201c7a003020102021004f66dc6542ea7719dea416d325a2401300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d0301070342000456fffa7093dede46aefeefb6e520c7ccc78967636e2f92582ba71455f64e93932dff3be4e0d4ef68e3e3b73aa087e26a0a0a30b02dc2aa2309db4c3a2fc936dea360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e04160414420822eb1908b5cd3911017fbcad4641c05e05a3301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d040302034800304502200d0b777f0a0b181ad2830275acc3150fd6092430bcd034fd77beb7bdf8c2d546022100d4864edd95daa3927080855df199f1717299b24a5eecefbd017455a9b934d8f668617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b54100000000afb3c2efc054df425013d5c88e79c3c10020a4ba6e2d2cfec43648d7d25c5ed5659bc18f2b781538527ebd492de03256bdf4a5010203262001215820b0d62de6b30f86f0bac7a9016951391c2e31849e2e64661cbd2b13cd7d5508ad225820503b0bda2a357a9a4b34475a28e65b660b4898a9e3e9bbf0820d43494297edd0'

認証:

challenge = h'f90c612981d84f599438de1a500f76926e92cc84bef8e02c6e23553f00485435'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='fido-u2f.ES256', L=32)

client_data_gen_flags = h'2c'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='fido-u2f.ES256', L=1)>
; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます
; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します
auth_data_UV_BS = h'd1'   ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='fido-u2f.ES256', L=1)

authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50100000000'
clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a222d5178684b59485954316d554f4e3461554139326b6d36537a49532d2d4f417362694e5650774249564455222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d'
signature = h'304402206172459958fea907b7292b92f555034bfd884895f287a76200c1ba287239137002204727b166147e26a21bbc2921d192ebfed569b79438538e5c128b5e28e6926dd7'

16.17. WebAuthn 拡張のテストベクター (WebAuthn Extensions)

このセクションでは、WebAuthn 拡張の例示値を示します。

16.17.1. 疑似乱数関数拡張 (prf)

このセクションでは、疑似乱数関数(prf)拡張の例示値を示します。

prf拡張は CTAP2 の hmac-secret 拡張 [FIDO-CTAP] と統合するため、 例は 2 つの部分に分かれています: WebAuthn クライアントおよび WebAuthn Relying Party に関連する WebAuthn の prf 拡張の入力と出力の例、および WebAuthn の prf 拡張と CTAP2 の hmac-secret 拡張間の対応例(WebAuthn クライアントと WebAuthn 認証器に関連)です。

16.17.1.1. Web 認証 API

以下の例は、WebAuthn クライアント 実装および WebAuthn Relying Party における prf 拡張のテストに使用できます。 例は網羅的ではありません。

このセクションで使用される疑似乱数値は次の方法で生成されました:

16.17.1.2. CTAP2 の hmac-secret 拡張

以下の例は、WebAuthn クライアント 実装が prf 拡張で CTAP2 の hmac-secret 拡張をどのように使用するかをテストするために使用できます。 例は CDDL 表記 [RFC8610] で示します。 例は網羅的ではありません。

このセクションで使用された入力および疑似乱数値は次の方法で生成されました:

17. 謝辞

We thank the following people for their reviews of, and contributions to, this specification: Yuriy Ackermann, James Barclay, Richard Barnes, Dominic Battré, Julien Cayzac, Domenic Denicola, Rahul Ghosh, Brad Hill, Nidhi Jaju, Jing Jin, Wally Jones, Ian Kilpatrick, Axel Nennker, Zack Newman, Yoshikazu Nojima, Kimberly Paulhamus, Adam Powers, Yaron Sheffer, Anne van Kesteren, Johan Verrept, and Boris Zbarsky.

Thanks to Adam Powers for creating the overall registration and authentication flow diagrams (Figure 1 and Figure 2).

We thank Anthony Nadalin, John Fontana, and Richard Barnes for their contributions as co-chairs of the Web Authentication Working Group.

We also thank Simone Onofri, Philippe Le Hégaret, Wendy Seltzer, Samuel Weiler, and Harry Halpin for their contributions as our W3C Team Contacts.

18. 改訂履歴

This section is not normative.

このセクションは、本仕様に対して時間をかけて加えられた重要な変更点の要約です。

18.1. Web Authentication Level 2 [webauthn-2-20210408] 以降の変更

18.1.1. 実質的な変更点

次の変更は、Web Authentication API とその動作方法に対して行われました。

変更点:

廃止事項:

新機能:

18.1.2. 編集上の変更

明確さ、可読性、ナビゲーション性などを改善するために、次の変更が行われました。

索引

この仕様で定義された用語

参照によって定義される用語

参考文献

規範的参照

[CREDENTIAL-MANAGEMENT-1]
Nina Satragno; Marcos Caceres. Credential Management Level 1. 2025年10月28日。作業草案(WD)。URL: https://www.w3.org/TR/credential-management-1/
[CSP2]
Mike West; Adam Barth; Daniel Veditz. Content Security Policy Level 2. 2016年12月15日。勧告(REC)。URL: https://www.w3.org/TR/CSP2/
[DOM4]
Anne van Kesteren. DOM Standard. Living Standard。 URL: https://dom.spec.whatwg.org/
[ECMAScript]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[ENCODING]
Anne van Kesteren. Encoding Standard. Living Standard。URL: https://encoding.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch Standard. Living Standard。URL: https://fetch.spec.whatwg.org/
[FIDO-APPID]
D. Balfanz; et al. FIDO AppID and Facet Specification. 2018年2月27日。FIDO Alliance 実装ドラフト。URL: https://fidoalliance.org/specs/fido-v2.0-id-20180227/fido-appid-and-facets-v2.0-id-20180227.html
[FIDO-CLIENT-TO-AUTHENTICATOR-PROTOCOL-V2.1]
Client to Authenticator Protocol (CTAP). 編集者草案。URL: https://fidoalliance.org/specs/fido-v2.1-ps-20210615/fido-client-to-authenticator-protocol-v2.1-ps-errata-20220621.html
[FIDO-CTAP]
J. Bradley; et al. Client to Authenticator Protocol (CTAP). 2022年6月21日。FIDO Alliance 提案規格。URL: https://fidoalliance.org/specs/fido-v2.1-ps-20210615/fido-client-to-authenticator-protocol-v2.1-ps-errata-20220621.html
[FIDO-Privacy-Principles]
FIDO Alliance. FIDO Privacy Principles. FIDO Alliance ホワイトペーパー。URL: https://fidoalliance.org/wp-content/uploads/2014/12/FIDO_Alliance_Whitepaper_Privacy_Principles.pdf
[FIDO-Registry]
R. Lindemann; D. Baghdasaryan; B. Hill. FIDO Registry of Predefined Values. 2019年12月17日。FIDO Alliance 提案規格。URL: https://fidoalliance.org/specs/common-specs/fido-registry-v2.1-ps-20191217.html
[FIDO-U2F-Message-Formats]
D. Balfanz; J. Ehrensvard; J. Lang. FIDO U2F Raw Message Formats. FIDO Alliance 実装ドラフト。URL: https://fidoalliance.org/specs/fido-u2f-v1.1-id-20160915/fido-u2f-raw-message-formats-v1.1-id-20160915.html
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard。URL: https://html.spec.whatwg.org/multipage/
[I18N-GLOSSARY]
Richard Ishida; Addison Phillips. Internationalization Glossary. 2024年10月17日。注記(NOTE)。URL: https://www.w3.org/TR/i18n-glossary/
[IANA-COSE-ALGS-REG]
IANA CBOR Object Signing and Encryption (COSE) Algorithms Registry. URL: https://www.iana.org/assignments/cose/cose.xhtml#algorithms
[IANA-WebAuthn-Registries]
IANA. Web Authentication (WebAuthn) registries. URL: https://www.iana.org/assignments/webauthn/
[IANA-Well-Known-URIs]
IANA. Well-Known URIs. URL: https://www.iana.org/assignments/well-known-uris/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard。URL: https://infra.spec.whatwg.org/
[Permissions-Policy]
Ian Clelland. Permissions Policy. 2025年10月6日。作業草案(WD)。URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月。Best Current Practice。URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC3986]
T. Berners-Lee; R. Fielding; L. Masinter. Uniform Resource Identifier (URI): Generic Syntax. 2005年1月。Internet Standard。URL: https://www.rfc-editor.org/rfc/rfc3986
[RFC4648]
S. Josefsson. The Base16, Base32, and Base64 Data Encodings. 2006年10月。提案規格。URL: https://www.rfc-editor.org/rfc/rfc4648
[RFC4949]
R. Shirey. Internet Security Glossary, Version 2. 2007年8月。資料(Informational)。URL: https://www.rfc-editor.org/rfc/rfc4949
[RFC5234]
D. Crocker, Ed.; P. Overell. Augmented BNF for Syntax Specifications: ABNF. 2008年1月。Internet Standard。URL: https://www.rfc-editor.org/rfc/rfc5234
[RFC5280]
D. Cooper; et al. Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile. 2008年5月。 提案規格。URL: https://www.rfc-editor.org/rfc/rfc5280
[RFC5890]
J. Klensin. Internationalized Domain Names for Applications (IDNA): Definitions and Document Framework. 2010年8月。提案規格。 URL: https://www.rfc-editor.org/rfc/rfc5890
[RFC6454]
A. Barth. The Web Origin Concept. 2011年12月。提案規格。URL: https://www.rfc-editor.org/rfc/rfc6454
[RFC7515]
M. Jones; J. Bradley; N. Sakimura. JSON Web Signature (JWS). 2015年5月。提案規格。URL: https://www.rfc-editor.org/rfc/rfc7515
[RFC8152]
J. Schaad. CBOR Object Signing and Encryption (COSE). 2017年7月。提案規格。URL: https://www.rfc-editor.org/rfc/rfc8152
[RFC8174]
B. Leiba. Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. 2017年5月。Best Current Practice。URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC8230]
M. Jones. Using RSA Algorithms with CBOR Object Signing and Encryption (COSE) Messages. 2017年9月。提案規格。URL: https://www.rfc-editor.org/rfc/rfc8230
[RFC8264]
P. Saint-Andre; M. Blanchet. PRECIS Framework: Preparation, Enforcement, and Comparison of Internationalized Strings in Application Protocols. 2017年10月。提案規格。URL: https://www.rfc-editor.org/rfc/rfc8264
[RFC8265]
P. Saint-Andre; A. Melnikov. Preparation, Enforcement, and Comparison of Internationalized Strings Representing Usernames and Passwords. 2017年10月。提案規格。URL: https://www.rfc-editor.org/rfc/rfc8265
[RFC8266]
P. Saint-Andre. Preparation, Enforcement, and Comparison of Internationalized Strings Representing Nicknames. 2017年10月。提案規格。 URL: https://www.rfc-editor.org/rfc/rfc8266
[RFC8610]
H. Birkholz; C. Vigano; C. Bormann. Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures. 2019年6月。IETF 提案規格。URL: https://tools.ietf.org/html/rfc8610
[RFC8615]
M. Nottingham. Well-Known Uniform Resource Identifiers (URIs). 2019年5月。提案規格。URL: https://www.rfc-editor.org/rfc/rfc8615
[RFC8809]
Jeff Hodges; Giridhar Mandyam; Michael B. Jones. Registries for Web Authentication (WebAuthn). 2020年8月。IETF 提案規格。URL: https://www.rfc-editor.org/rfc/rfc8809
[RFC8949]
C. Bormann; P. Hoffman. Concise Binary Object Representation (CBOR). 2020年12月。Internet Standard。URL: https://www.rfc-editor.org/rfc/rfc8949
[RFC9052]
J. Schaad. CBOR Object Signing and Encryption (COSE): Structures and Process. 2022年8月。Internet Standard。URL: https://www.rfc-editor.org/rfc/rfc9052
[RFC9053]
J. Schaad. CBOR Object Signing and Encryption (COSE): Initial Algorithms. 2022年8月。参考資料(Informational)。URL: https://www.rfc-editor.org/rfc/rfc9053
[SEC1]
SEC1: Elliptic Curve Cryptography, Version 2.0. URL: http://www.secg.org/sec1-v2.pdf
[SP800-800-63r3]
Paul A. Grassi; Michael E. Garcia; James L. Fenton. NIST Special Publication 800-63: Digital Identity Guidelines. 2017年6月。URL: https://pages.nist.gov/800-63-3/sp800-63-3.html
[TCG-CMCProfile-AIKCertEnroll]
Scott Kelly; et al. TCG Infrastructure Working Group: A CMC Profile for AIK Certificate Enrollment. 2011年3月24日。公開資料。URL: https://trustedcomputinggroup.org/wp-content/uploads/IWG_CMC_Profile_Cert_Enrollment_v1_r7.pdf
[TokenBinding]
A. Popov; et al. The Token Binding Protocol Version 1.0. 2018年10月。IETF 提案規格。URL: https://tools.ietf.org/html/rfc8471
[TPMv2-EK-Profile]
TCG EK Credential Profile for TPM Family 2.0. URL: https://trustedcomputinggroup.org/wp-content/uploads/TCG-EK-Credential-Profile-V-2.5-R2_published.pdf
[TPMv2-Part1]
Trusted Platform Module Library, Part 1: Architecture. URL: https://www.trustedcomputinggroup.org/wp-content/uploads/TPM-Rev-2.0-Part-1-Architecture-01.38.pdf
[TPMv2-Part2]
Trusted Platform Module Library, Part 2: Structures. URL: https://www.trustedcomputinggroup.org/wp-content/uploads/TPM-Rev-2.0-Part-2-Structures-01.38.pdf
[TPMv2-Part3]
Trusted Platform Module Library, Part 3: Commands. URL: https://www.trustedcomputinggroup.org/wp-content/uploads/TPM-Rev-2.0-Part-3-Commands-01.38.pdf
[URL]
Anne van Kesteren. URL Standard. Living Standard。 URL: https://url.spec.whatwg.org/
[WCAG21]
Michael Cooper; et al. Web Content Accessibility Guidelines (WCAG) 2.1. 2025年5月6日。勧告(REC)。URL: https://www.w3.org/TR/WCAG21/
[WEBAUTHN-2-20210408]
Jeff Hodges; et al. Web Authentication: An API for accessing Public Key Credentials - Level 2. 2021年4月8日。勧告(REC)。URL: https://www.w3.org/TR/2021/REC-webauthn-2-20210408/
[WEBAUTHN-3-20250127]
Tim Cappalli; et al. Web Authentication: An API for accessing Public Key Credentials - Level 3. 2025年1月27日。作業草案(WD)。URL: https://www.w3.org/TR/2025/WD-webauthn-3-20250127/
[WebDriver]
Simon Stewart; David Burns. WebDriver. 2018年6月5日。勧告(REC)。URL: https://www.w3.org/TR/webdriver1/
[WEBDRIVER2]
Simon Stewart; David Burns. WebDriver. 2025年10月28日。作業草案(WD)。URL: https://www.w3.org/TR/webdriver2/
[WebIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard。URL: https://webidl.spec.whatwg.org/

参考情報

[Ceremony]
Carl Ellison. Ceremony Design and Analysis. 2007年。URL: https://eprint.iacr.org/2007/399.pdf
[CSS-OVERFLOW-3]
Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3. 2025年10月7日。作業草案(WD)。URL: https://www.w3.org/TR/css-overflow-3/
[EduPersonObjectClassSpec]
EduPerson. 継続中。URL: https://refeds.org/eduperson
[FIDO-Transports-Ext]
FIDO Alliance. FIDO U2F Authenticator Transports Extension. FIDO Alliance 提案規格。URL: https://fidoalliance.org/specs/fido-u2f-v1.2-ps-20170411/fido-u2f-authenticator-transports-extension-v1.2-ps-20170411.html
[FIDO-UAF-AUTHNR-CMDS]
R. Lindemann; J. Kemp. FIDO UAF Authenticator Commands. FIDO Alliance 実装ドラフト。URL: https://fidoalliance.org/specs/fido-uaf-v1.1-id-20170202/fido-uaf-authnr-cmds-v1.1-id-20170202.html
[FIDOAuthnrSecReqs]
D. Biggs; et al. FIDO Authenticator Security Requirements. FIDO Alliance 最終文書。URL: https://fidoalliance.org/specs/fido-security-requirements-v1.0-fd-20170524/
[FIDOMetadataService]
R. Lindemann; B. Hill; D. Baghdasaryan. FIDO Metadata Service. 2018年2月27日。FIDO Alliance 実装ドラフト。URL: https://fidoalliance.org/specs/fido-v2.0-id-20180227/fido-metadata-service-v2.0-id-20180227.html
[FIDOSecRef]
R. Lindemann; et al. FIDO Security Reference. 2018年2月27日。FIDO Alliance 実装ドラフト。URL: https://fidoalliance.org/specs/fido-v2.0-id-20180227/fido-security-ref-v2.0-id-20180227.html
[FIDOU2FJavaScriptAPI]
D. Balfanz; A. Birgisson; J. Lang. FIDO U2F JavaScript API. FIDO Alliance 提案規格。URL: https://fidoalliance.org/specs/fido-u2f-v1.2-ps-20170411/fido-u2f-javascript-api-v1.2-ps-20170411.html
[ISOBiometricVocabulary]
ISO/IEC JTC1/SC37. Information technology — Vocabulary — Biometrics. 2012年12月15日。国際標準: ISO/IEC 2382-37:2012(E) 第1版。URL: http://standards.iso.org/ittf/PubliclyAvailableStandards/c055194_ISOIEC_2382-37_2012.zip
[RFC3279]
L. Bassham; W. Polk; R. Housley. Algorithms and Identifiers for the Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile. 2002年4月。提案規格。URL: https://www.rfc-editor.org/rfc/rfc3279
[RFC5869]
H. Krawczyk; P. Eronen. HMAC-based Extract-and-Expand Key Derivation Function (HKDF). 2010年5月。情報(Informational)。URL: https://www.rfc-editor.org/rfc/rfc5869
[RFC5958]
S. Turner. Asymmetric Key Packages. 2010年8月。提案規格。URL: https://www.rfc-editor.org/rfc/rfc5958
[RFC6265]
A. Barth. HTTP State Management Mechanism. 2011年4月。提案規格。URL: https://httpwg.org/specs/rfc6265.html
[RFC6979]
T. Pornin. Deterministic Usage of the Digital Signature Algorithm (DSA) and Elliptic Curve Digital Signature Algorithm (ECDSA). 2013年8月。情報(Informational)。URL: https://www.rfc-editor.org/rfc/rfc6979
[RFC8017]
K. Moriarty, Ed.; et al. PKCS #1: RSA Cryptography Specifications Version 2.2. 2016年11月。情報(Informational)。URL: https://www.rfc-editor.org/rfc/rfc8017
[RFC9864]
M.B. Jones; O. Steele. Fully-Specified Algorithms for JSON Object Signing and Encryption (JOSE) and CBOR Object Signing and Encryption (COSE). 2025年10月。提案規格。URL: https://www.rfc-editor.org/rfc/rfc9864
[UAFProtocol]
R. Lindemann; et al. FIDO UAF Protocol Specification v1.0. FIDO Alliance 提案規格。URL: https://fidoalliance.org/specs/fido-uaf-v1.0-ps-20141208/fido-uaf-protocol-v1.0-ps-20141208.html
[UAX29]
UNICODE Text Segmentation. URL: http://www.unicode.org/reports/tr29/
[WebAuthn-1]
Dirk Balfanz; et al. Web Authentication:An API for accessing Public Key Credentials Level 1. 2019年3月4日。勧告(REC)。URL: https://www.w3.org/TR/webauthn-1/
[WebAuthnAPIGuide]
Web Authentication API Guide. 実験的。URL: https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API

IDL 索引

[SecureContext, Exposed=Window]
interface PublicKeyCredential : Credential {
    [SameObject] readonly attribute ArrayBuffer              rawId;
    [SameObject] readonly attribute AuthenticatorResponse    response;
    readonly attribute DOMString?                            authenticatorAttachment;
    AuthenticationExtensionsClientOutputs getClientExtensionResults();
    static Promise<boolean> isConditionalMediationAvailable();
    PublicKeyCredentialJSON toJSON();
};

typedef DOMString Base64URLString;
// The structure of this object will be either
// RegistrationResponseJSON or AuthenticationResponseJSON
typedef object PublicKeyCredentialJSON;

dictionary RegistrationResponseJSON {
    required DOMString id;
    required Base64URLString rawId;
    required AuthenticatorAttestationResponseJSON response;
    DOMString authenticatorAttachment;
    required AuthenticationExtensionsClientOutputsJSON clientExtensionResults;
    required DOMString type;
};

dictionary AuthenticatorAttestationResponseJSON {
    required Base64URLString clientDataJSON;
    required Base64URLString authenticatorData;
    required sequence<DOMString> transports;
    // The publicKey field will be missing if pubKeyCredParams was used to
    // negotiate a public-key algorithm that the user agent doesn't
    // understand. (See section “Easily accessing credential data” for a
    // list of which algorithms user agents must support.) If using such an
    // algorithm then the public key must be parsed directly from
    // attestationObject or authenticatorData.
    Base64URLString publicKey;
    required COSEAlgorithmIdentifier publicKeyAlgorithm;
    // This value contains copies of some of the fields above. See
    // section “Easily accessing credential data”.
    required Base64URLString attestationObject;
};

dictionary AuthenticationResponseJSON {
    required DOMString id;
    required Base64URLString rawId;
    required AuthenticatorAssertionResponseJSON response;
    DOMString authenticatorAttachment;
    required AuthenticationExtensionsClientOutputsJSON clientExtensionResults;
    required DOMString type;
};

dictionary AuthenticatorAssertionResponseJSON {
    required Base64URLString clientDataJSON;
    required Base64URLString authenticatorData;
    required Base64URLString signature;
    Base64URLString userHandle;
};

dictionary AuthenticationExtensionsClientOutputsJSON {
};

partial dictionary CredentialCreationOptions {
    PublicKeyCredentialCreationOptions      publicKey;
};

partial dictionary CredentialRequestOptions {
    PublicKeyCredentialRequestOptions      publicKey;
};

partial interface PublicKeyCredential {
    static Promise<boolean> isUserVerifyingPlatformAuthenticatorAvailable();
};

partial interface PublicKeyCredential {
    static Promise<PublicKeyCredentialClientCapabilities> getClientCapabilities();
};

typedef record<DOMString, boolean> PublicKeyCredentialClientCapabilities;

partial interface PublicKeyCredential {
    static PublicKeyCredentialCreationOptions parseCreationOptionsFromJSON(PublicKeyCredentialCreationOptionsJSON options);
};

dictionary PublicKeyCredentialCreationOptionsJSON {
    required PublicKeyCredentialRpEntity                    rp;
    required PublicKeyCredentialUserEntityJSON              user;
    required Base64URLString                                challenge;
    required sequence<PublicKeyCredentialParameters>        pubKeyCredParams;
    unsigned long                                           timeout;
    sequence<PublicKeyCredentialDescriptorJSON>             excludeCredentials = [];
    AuthenticatorSelectionCriteria                          authenticatorSelection;
    sequence<DOMString>                                     hints = [];
    DOMString                                               attestation = "none";
    sequence<DOMString>                                     attestationFormats = [];
    AuthenticationExtensionsClientInputsJSON                extensions;
};

dictionary PublicKeyCredentialUserEntityJSON {
    required Base64URLString        id;
    required DOMString              name;
    required DOMString              displayName;
};

dictionary PublicKeyCredentialDescriptorJSON {
    required DOMString              type;
    required Base64URLString        id;
    sequence<DOMString>             transports;
};

dictionary AuthenticationExtensionsClientInputsJSON {
};

partial interface PublicKeyCredential {
    static PublicKeyCredentialRequestOptions parseRequestOptionsFromJSON(PublicKeyCredentialRequestOptionsJSON options);
};

dictionary PublicKeyCredentialRequestOptionsJSON {
    required Base64URLString                                challenge;
    unsigned long                                           timeout;
    DOMString                                               rpId;
    sequence<PublicKeyCredentialDescriptorJSON>             allowCredentials = [];
    DOMString                                               userVerification = "preferred";
    sequence<DOMString>                                     hints = [];
    AuthenticationExtensionsClientInputsJSON                extensions;
};

partial interface PublicKeyCredential {
    static Promise<undefined> signalUnknownCredential(UnknownCredentialOptions options);
    static Promise<undefined> signalAllAcceptedCredentials(AllAcceptedCredentialsOptions options);
    static Promise<undefined> signalCurrentUserDetails(CurrentUserDetailsOptions options);
};

dictionary UnknownCredentialOptions {
    required DOMString                     rpId;
    required Base64URLString               credentialId;
};

dictionary AllAcceptedCredentialsOptions {
    required DOMString                     rpId;
    required Base64URLString               userId;
    required sequence<Base64URLString>     allAcceptedCredentialIds;
};

dictionary CurrentUserDetailsOptions {
    required DOMString                     rpId;
    required Base64URLString               userId;
    required DOMString                     name;
    required DOMString                     displayName;
};

[SecureContext, Exposed=Window]
interface AuthenticatorResponse {
    [SameObject] readonly attribute ArrayBuffer      clientDataJSON;
};

[SecureContext, Exposed=Window]
interface AuthenticatorAttestationResponse : AuthenticatorResponse {
    [SameObject] readonly attribute ArrayBuffer      attestationObject;
    sequence<DOMString>                              getTransports();
    ArrayBuffer                                      getAuthenticatorData();
    ArrayBuffer?                                     getPublicKey();
    COSEAlgorithmIdentifier                          getPublicKeyAlgorithm();
};

[SecureContext, Exposed=Window]
interface AuthenticatorAssertionResponse : AuthenticatorResponse {
    [SameObject] readonly attribute ArrayBuffer      authenticatorData;
    [SameObject] readonly attribute ArrayBuffer      signature;
    [SameObject] readonly attribute ArrayBuffer?     userHandle;
};

dictionary PublicKeyCredentialParameters {
    required DOMString                    type;
    required COSEAlgorithmIdentifier      alg;
};

dictionary PublicKeyCredentialCreationOptions {
    required PublicKeyCredentialRpEntity         rp;
    required PublicKeyCredentialUserEntity       user;

    required BufferSource                             challenge;
    required sequence<PublicKeyCredentialParameters>  pubKeyCredParams;

    unsigned long                                timeout;
    sequence<PublicKeyCredentialDescriptor>      excludeCredentials = [];
    AuthenticatorSelectionCriteria               authenticatorSelection;
    sequence<DOMString>                          hints = [];
    DOMString                                    attestation = "none";
    sequence<DOMString>                          attestationFormats = [];
    AuthenticationExtensionsClientInputs         extensions;
};

dictionary PublicKeyCredentialEntity {
    required DOMString    name;
};

dictionary PublicKeyCredentialRpEntity : PublicKeyCredentialEntity {
    DOMString      id;
};

dictionary PublicKeyCredentialUserEntity : PublicKeyCredentialEntity {
    required BufferSource   id;
    required DOMString      displayName;
};

dictionary AuthenticatorSelectionCriteria {
    DOMString                    authenticatorAttachment;
    DOMString                    residentKey;
    boolean                      requireResidentKey = false;
    DOMString                    userVerification = "preferred";
};

enum AuthenticatorAttachment {
    "platform",
    "cross-platform"
};

enum ResidentKeyRequirement {
    "discouraged",
    "preferred",
    "required"
};

enum AttestationConveyancePreference {
    "none",
    "indirect",
    "direct",
    "enterprise"
};

dictionary PublicKeyCredentialRequestOptions {
    required BufferSource                challenge;
    unsigned long                        timeout;
    DOMString                            rpId;
    sequence<PublicKeyCredentialDescriptor> allowCredentials = [];
    DOMString                            userVerification = "preferred";
    sequence<DOMString>                  hints = [];
    AuthenticationExtensionsClientInputs extensions;
};

dictionary AuthenticationExtensionsClientInputs {
};

dictionary AuthenticationExtensionsClientOutputs {
};

dictionary CollectedClientData {
    required DOMString           type;
    required DOMString           challenge;
    required DOMString           origin;
    boolean                      crossOrigin;
    DOMString                    topOrigin;
};

dictionary TokenBinding {
    required DOMString status;
    DOMString id;
};

enum TokenBindingStatus { "present", "supported" };

enum PublicKeyCredentialType {
    "public-key"
};

dictionary PublicKeyCredentialDescriptor {
    required DOMString                    type;
    required BufferSource                 id;
    sequence<DOMString>                   transports;
};

enum AuthenticatorTransport {
    "usb",
    "nfc",
    "ble",
    "smart-card",
    "hybrid",
    "internal"
};

typedef long COSEAlgorithmIdentifier;

enum UserVerificationRequirement {
    "required",
    "preferred",
    "discouraged"
};

enum ClientCapability {
    "conditionalCreate",
    "conditionalGet",
    "hybridTransport",
    "passkeyPlatformAuthenticator",
    "userVerifyingPlatformAuthenticator",
    "relatedOrigins",
    "signalAllAcceptedCredentials",
    "signalCurrentUserDetails",
    "signalUnknownCredential"
};

enum PublicKeyCredentialHint {
    "security-key",
    "client-device",
    "hybrid",
};

partial dictionary AuthenticationExtensionsClientInputs {
  DOMString appid;
};
partial dictionary AuthenticationExtensionsClientInputsJSON {
  DOMString appid;
};

partial dictionary AuthenticationExtensionsClientOutputs {
  boolean appid;
};
partial dictionary AuthenticationExtensionsClientOutputsJSON {
  boolean appid;
};

partial dictionary AuthenticationExtensionsClientInputs {
  DOMString appidExclude;
};
partial dictionary AuthenticationExtensionsClientInputsJSON {
  DOMString appidExclude;
};

partial dictionary AuthenticationExtensionsClientOutputs {
  boolean appidExclude;
};
partial dictionary AuthenticationExtensionsClientOutputsJSON {
  boolean appidExclude;
};

partial dictionary AuthenticationExtensionsClientInputs {
    boolean credProps;
};
partial dictionary AuthenticationExtensionsClientInputsJSON {
    boolean credProps;
};

dictionary CredentialPropertiesOutput {
    boolean rk;
};

partial dictionary AuthenticationExtensionsClientOutputs {
    CredentialPropertiesOutput credProps;
};
partial dictionary AuthenticationExtensionsClientOutputsJSON {
    CredentialPropertiesOutput credProps;
};

dictionary AuthenticationExtensionsPRFValues {
    required BufferSource first;
    BufferSource second;
};
dictionary AuthenticationExtensionsPRFValuesJSON {
    required Base64URLString first;
    Base64URLString second;
};

dictionary AuthenticationExtensionsPRFInputs {
    AuthenticationExtensionsPRFValues eval;
    record<DOMString, AuthenticationExtensionsPRFValues> evalByCredential;
};
dictionary AuthenticationExtensionsPRFInputsJSON {
    AuthenticationExtensionsPRFValuesJSON eval;
    record<DOMString, AuthenticationExtensionsPRFValuesJSON> evalByCredential;
};

partial dictionary AuthenticationExtensionsClientInputs {
    AuthenticationExtensionsPRFInputs prf;
};
partial dictionary AuthenticationExtensionsClientInputsJSON {
    AuthenticationExtensionsPRFInputsJSON prf;
};

dictionary AuthenticationExtensionsPRFOutputs {
    boolean enabled;
    AuthenticationExtensionsPRFValues results;
};
dictionary AuthenticationExtensionsPRFOutputsJSON {
    boolean enabled;
    AuthenticationExtensionsPRFValuesJSON results;
};

partial dictionary AuthenticationExtensionsClientOutputs {
    AuthenticationExtensionsPRFOutputs prf;
};
partial dictionary AuthenticationExtensionsClientOutputsJSON {
    AuthenticationExtensionsPRFOutputsJSON prf;
};

partial dictionary AuthenticationExtensionsClientInputs {
    AuthenticationExtensionsLargeBlobInputs largeBlob;
};
partial dictionary AuthenticationExtensionsClientInputsJSON {
    AuthenticationExtensionsLargeBlobInputsJSON largeBlob;
};

enum LargeBlobSupport {
  "required",
  "preferred",
};

dictionary AuthenticationExtensionsLargeBlobInputs {
    DOMString support;
    boolean read;
    BufferSource write;
};
dictionary AuthenticationExtensionsLargeBlobInputsJSON {
    DOMString support;
    boolean read;
    Base64URLString write;
};

partial dictionary AuthenticationExtensionsClientOutputs {
    AuthenticationExtensionsLargeBlobOutputs largeBlob;
};
partial dictionary AuthenticationExtensionsClientOutputsJSON {
    AuthenticationExtensionsLargeBlobOutputsJSON largeBlob;
};

dictionary AuthenticationExtensionsLargeBlobOutputs {
    boolean supported;
    ArrayBuffer blob;
    boolean written;
};
dictionary AuthenticationExtensionsLargeBlobOutputsJSON {
    boolean supported;
    Base64URLString blob;
    boolean written;
};

MDN

AuthenticatorAssertionResponse/authenticatorData

In all current engines.

Firefox60+Safari13+Chrome67+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android92+iOS Safari?Chrome for Android70+Android WebViewNoneSamsung Internet?Opera Mobile48+
MDN

AuthenticatorAssertionResponse/signature

In all current engines.

Firefox60+Safari13+Chrome67+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android92+iOS Safari?Chrome for Android70+Android WebViewNoneSamsung Internet?Opera Mobile48+
MDN

AuthenticatorAssertionResponse/userHandle

In all current engines.

Firefox60+Safari13+Chrome67+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android92+iOS Safari?Chrome for Android70+Android WebViewNoneSamsung Internet?Opera Mobile48+
MDN

AuthenticatorAssertionResponse

In all current engines.

Firefox60+Safari13+Chrome67+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android92+iOS Safari?Chrome for Android70+Android WebViewNoneSamsung Internet?Opera Mobile48+
MDN

AuthenticatorAttestationResponse/attestationObject

In all current engines.

Firefox60+Safari13+Chrome67+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android92+iOS Safari?Chrome for Android70+Android WebViewNoneSamsung Internet?Opera Mobile48+
MDN

AuthenticatorAttestationResponse/getTransports

FirefoxNoneSafari16+Chrome74+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

AuthenticatorAttestationResponse

In all current engines.

Firefox60+Safari13+Chrome67+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android92+iOS Safari?Chrome for Android70+Android WebViewNoneSamsung Internet?Opera Mobile48+
MDN

AuthenticatorResponse/clientDataJSON

In all current engines.

Firefox60+Safari13+Chrome67+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android92+iOS Safari?Chrome for Android70+Android WebViewNoneSamsung Internet?Opera Mobile48+
MDN

AuthenticatorResponse

In all current engines.

Firefox60+Safari13+Chrome67+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android92+iOS Safari?Chrome for Android70+Android WebViewNoneSamsung Internet?Opera Mobile48+
MDN

PublicKeyCredential/getClientExtensionResults

In all current engines.

Firefox60+Safari13+Chrome67+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android92+iOS Safari?Chrome for Android70+Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

PublicKeyCredential/isUserVerifyingPlatformAuthenticatorAvailable_static

In all current engines.

Firefox60+Safari13+Chrome67+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android92+iOS Safari?Chrome for Android70+Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

PublicKeyCredential/rawId

In all current engines.

Firefox60+Safari13+Chrome67+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android92+iOS Safari?Chrome for Android70+Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

PublicKeyCredential/response

In all current engines.

Firefox60+Safari13+Chrome67+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android92+iOS Safari?Chrome for Android70+Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

PublicKeyCredential

In all current engines.

Firefox60+Safari13+Chrome67+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android92+iOS Safari?Chrome for Android70+Android WebViewNoneSamsung Internet?Opera Mobile?
MDN

Headers/Feature-Policy/publickey-credentials-get

In only one current engine.

FirefoxNoneSafariNoneChrome84+
OperaNoneEdge84+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera MobileNone

Headers/Permissions-Policy/publickey-credentials-create

In only one current engine.

FirefoxNoneSafariNoneChrome88+
OperaNoneEdge88+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera MobileNone

Headers/Permissions-Policy/publickey-credentials-get

In only one current engine.

FirefoxNoneSafariNoneChrome88+
OperaNoneEdge88+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera MobileNone