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] を参照することが推奨されます。それ以外に、本書の想定読者は以下の主要グループです。
-
Relying Party のウェブアプリケーション開発者、特にログインフロー、アカウント復旧フロー、ユーザーアカウントデータベースの内容などに責任を負う者。
-
ウェブフレームワーク開発者
-
上の二つの聴衆は特に § 7 WebAuthn Relying Party Operations を参照すべきです。§ 5 Web Authentication API の導入は参考になりますが、同節は主にユーザーエージェント開発者向けであることに注意してください。さらに、認証器のattestation を検証する意図がある場合は、§ 6.5 Attestation および § 8 定義されたアテステーションステートメント形式 も関連します。拡張を利用したい場合は § 9 WebAuthn Extensions および § 10 定義された拡張 を確認してください。最後に、§ 13.4 Relying Parties に関するセキュリティ考慮事項 および § 14.6 Relying Parties に関するプライバシー考慮事項 を読んで、自分のアプリケーションとユーザーにどの課題が適用されるか検討してください。
-
-
ユーザーエージェント開発者
-
OS プラットフォーム開発者。プラットフォーム固有の認証器 API の設計と実装、プラットフォームの WebAuthn Client のインスタンス化等に責任を負う者。
-
上の二つの聴衆は、§ 5 Web Authentication API を慎重に読み、拡張をサポートするつもりであれば § 9 WebAuthn Extensions も読むべきです。また、§ 14.5 クライアントに関するプライバシー考慮事項 を注意深く読む必要があります。
-
-
認証器 開発者。これらの読者は特に § 6 WebAuthn Authenticator Model、§ 8 定義されたアテステーションステートメント形式、§ 9 WebAuthn Extensions、および § 10 定義された拡張 に注目するでしょう。また、§ 13.3 認証器に関するセキュリティ考慮事項 および § 14.4 認証器に関するプライバシー考慮事項 も注意深く読むべきです。
エンドツーエンドのセキュリティのためには重要です が、各コンポーネント—Relying Party サーバー、クライアント、および 認証器—の役割、および § 13 セキュリティ考慮事項 と § 14 プライバシー考慮事項 を全ての聴衆が理解することが重要です。
1.2. ユースケース
以下のユースケースは、非常に異なる種類の認証器と資格情報の使用を、二つの一般的なデプロイメントタイプに渡って例示し、さらに他のシナリオも概説します。追加のシナリオ(サンプルコードを含む)は後述の § 1.3 サンプル API 利用シナリオ にあります。これらの例は説明目的のみであり、クライアントや認証器の実装によって機能の可用性が異なる場合があります。
1.2.1. マルチデバイス資格情報を持つ消費者
このユースケースは、消費者向けのRelying Partyが、ユーザーのデバイスに組み込まれた認証器を活用して、マルチデバイス資格情報(一般に同期されたパスキーと呼ばれる)を用いたフィッシング耐性のあるサインインを提供する方法を示します。
1.2.1.1. 登録
-
携帯電話上で:
-
ユーザーはブラウザで example.com に移動し、これまで使用してきた任意の方法(おそらくパスワードなどの従来の方法)で既存のアカウントにサインインするか、新しいアカウントを作成します。
-
電話は「example.com のためのパスキーを作成しますか?」と促します。
-
ユーザーが同意します。
-
電話は事前に設定された認可ジェスチャー(PIN、バイオメトリなど)を要求し、ユーザーがこれを提供します。
-
ウェブサイトは「登録が完了しました。」と表示します。
-
1.2.1.2. 認証
-
ノートパソコンまたはデスクトップ上で:
-
ユーザーはブラウザで example.com に移動し、サインインを開始します。
-
もしそのデバイス上でマルチデバイス資格情報(同期されたパスキー)が利用可能であれば:
-
ブラウザまたは OS はユーザーに事前に設定された認可ジェスチャー(PIN、バイオメトリ等)を要求し、ユーザーがこれを提供します。
-
ウェブページは選択されたユーザーがサインインしたことを示し、サインイン後のページへ遷移します。
-
-
もし同期されたパスキーがそのデバイスで利用できない場合:
-
ブラウザまたは OS はユーザーに外部認証器(電話やセキュリティキーなど)を要求します。
-
ユーザーは以前にリンクした電話を選択します。
-
-
-
次に、電話上で:
-
ユーザーは「example.com にサインイン」といった通知またはプロンプトを受け取ります。
-
ユーザーはそのプロンプト/通知を選択します。
-
ユーザーは自分の example.com の識別名(例:「Mohamed としてサインイン / 张三 としてサインイン」)の一覧を表示されます。
-
ユーザーは識別名を選び、認可ジェスチャー(PIN、バイオメトリ等)を求められ、これを提供します。
-
-
その後、ノートパソコン側に戻ると:
-
ウェブページは選択されたユーザーがサインインしたことを示し、サインイン後のページへ遷移します。
-
1.2.2. シングルデバイス資格情報を持つ職場利用者
このユースケースは、職場向けのRelying Partyが、USB セキュリティキーのようなローミング認証器と、組み込みの指紋センサーのようなプラットフォーム認証器を組み合わせて活用できる方法を示します。その結果、ユーザーは以下を持ちます:
-
新しいクライアントデバイス(例:ノートパソコン、デスクトップ)上やプラットフォーム認証器を搭載していないクライアントデバイス上で認証するために使う「プライマリ」なローミング認証器、
-
プラットフォーム認証器を持つクライアントデバイス上で低摩擦に強力に再認証する手段、または
-
単一デバイス資格情報(デバイスにバインドされたパスキー)をサポートしないパスキープラットフォーム認証器を持つクライアントデバイス上で強力に再認証する手段。
1.2.2.1. 登録
この例では、雇用者がデバイスにバインドされたパスキーで事前設定されたセキュリティキーをユーザーに郵送します。
一時的な PIN がアウトオブバンドでユーザーに送信されました(例:RCS メッセージ経由)。
1.2.2.2. 認証
-
ノートパソコンまたはデスクトップ上で:
-
ユーザーはブラウザで corp.example.com に移動し、サインインを開始します。
-
ブラウザまたは OS はユーザーにセキュリティキーを要求します。
-
ユーザーは USB セキュリティキーを接続します。
-
USB セキュリティキーが点滅してボタンを押すよう示し、ユーザーがそれを押します。
-
ブラウザまたは OS はユーザーに PIN の入力を求めます。
-
ユーザーは受け取った一時的な PIN を入力して続行します。
-
ブラウザまたは OS は PIN を変更するようユーザーに通知し、新しい PIN の入力を促します。
-
ユーザーは新しい PIN を入力して続行します。
-
ブラウザまたは OS は認証フローを再起動し、ユーザーに PIN の入力を再度求めます。
-
ユーザーは新しい PIN を入力してセキュリティキーをタップします。
-
ウェブページは選択されたユーザーがサインインしたことを示し、サインイン後のページへ遷移します。
-
1.2.3. その他のユースケースと構成
その他にも様々なユースケースや構成が可能です(以下は一例に過ぎません):
-
ユーザーがノートパソコンで example.com にアクセスし、電話上で資格情報を作成・登録するフローに案内される。
-
ユーザーが USB や NFC を備えた ローミング認証器(例:セキュリティキー)を入手し、ノートパソコンや電話のブラウザで example.com を開いてそのセキュリティキー上で資格情報を作成・登録するフローに案内される。
-
Relying Partyがユーザーに単一のトランザクション(支払いなど)を承認するために認可ジェスチャーを求める。
1.3. サンプル API 利用シナリオ
この節は規範的ではありません。
この節では、公開鍵資格情報のライフサイクルにおけるいくつかのイベントと、この API を使った対応するサンプルコードを順に説明します。これは例示的なフローであり、API の利用方法を制限するものではありません。
前節と同様に、このフローは独自の表示を持つパスキーローミング認証器(例:スマートフォン)を伴うユースケースに焦点を当てています。他のタイプの認証器もクライアントプラットフォームが実装すれば本 API によってサポートされます。例えば、このフローはクライアントデバイスに組み込まれた認証器の場合でも変更なしに動作します。独自の表示を持たない認証器(スマートカードに類似)の場合も、クライアントプラットフォームが認証器が通常表示するプロンプトを代わりに表示し、認証器がすべての資格情報を列挙できるようにしてクライアントが適切なプロンプトを表示できるようにする等の実装上の考慮事項に従えば動作します。
1.3.1. 登録
これは初回フローで、新しい資格情報が作成されサーバーに登録されます。このフローでは、WebAuthn Relying Party はプラットフォーム認証器とローミング認証器のいずれにも特に優先を持ちません。
-
ユーザーは example.com を訪問し、スクリプトが配信されます。この時点でユーザーは既に従来のユーザー名とパスワードや追加の認証器などでログインしている場合もありますし、新しいアカウントを作成中である場合もあります。
-
Relying Party のスクリプトが以下のコードスニペットを実行します。
-
クライアントプラットフォーム が認証器を検索して検出します。
-
クライアント が認証器に接続し、必要ならばペアリング操作を行います。
-
認証器はユーザーに対してバイオメトリや他の認可ジェスチャーを要求するための適切な UI を表示します。
-
認証器はクライアントにレスポンスを返し、それがさらにRelying Party スクリプトにレスポンスを返します。ユーザーが認証器の選択や認可を拒否した場合は、適切なエラーが返されます。
-
もし新しい資格情報が作成された場合、
-
Relying Party スクリプトは新しく生成されたcredential public keyをサーバーに送信し、認証器の起源や特性に関するアテステーションなどの追加情報も送ります。
-
サーバーはcredential public keyをデータベースに保存し、それをユーザーおよびアテステーションで示された認証の特性と関連付け、後で使用するためのフレンドリ名も保存します。
-
スクリプトは将来の UX を改善するために credential ID のようなデータをローカルストレージに保存することがあります。
-
新しい鍵を生成して登録するサンプルコードは次の通りです:
if ( ! window. PublicKeyCredential) { /* Client not capable. Handle error. */ } var publicKey= { // The challenge is produced by the server; see the Security Considerations challenge: new Uint8Array([ 21 , 31 , 105 /* 29 more random bytes generated by the server */ ]), // Relying Party: rp: { name: "ACME Corporation" }, // User: user: { id: Uint8Array. from ( window. atob( "MIIBkzCCATigAwIBAjCCAZMwggE4oAMCAQIwggGTMII=" ), c=> c. charCodeAt( 0 )), name: "alex.mueller@example.com" , displayName: "Alex Müller" , }, // This Relying Party will accept either an ES256 or RS256 credential, but // prefers an ES256 credential. pubKeyCredParams: [ { type: "public-key" , alg: - 7 // "ES256" as registered in the IANA COSE Algorithms registry }, { type: "public-key" , alg: - 257 // Value registered by this specification for "RS256" } ], authenticatorSelection: { // Try to use UV if possible. This is also the default. userVerification: "preferred" }, timeout: 300000 , // 5 minutes excludeCredentials: [ // Don't re-register any authenticator that has one of these credentials { "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" } ], // Make excludeCredentials check backwards compatible with credentials registered with U2F extensions: { "appidExclude" : "https://acme.example.com" } }; // Note: The following call will cause the authenticator to display UI. navigator. credentials. create({ publicKey}) . then( function ( newCredentialInfo) { // Send new credential info to server for verification and registration. }). catch ( function ( err) { // No acceptable authenticator or user refused consent. Handle appropriately. });
1.3.2. ユーザー検証を行うプラットフォーム認証器を用いた登録
これは WebAuthn Relying Party が特に 公開鍵資格情報 を ユーザー検証を行うプラットフォーム認証器 として作成することに関心がある場合の例です。
-
ユーザーは example.com を訪れ、ログインボタンをクリックして login.example.com にリダイレクトされます。
-
ユーザーはユーザー名とパスワードを入力してログインし、成功すると example.com にリダイレクトされます。
-
Relying Party のスクリプトが次のコードスニペットを実行します。
-
ユーザーエージェントは ユーザー検証を行うプラットフォーム認証器 が利用可能か確認します。利用できない場合はこのフローを終了します。
-
Relying Party はユーザーに資格情報を作成するか尋ねます。ユーザーが作成を望まない場合はこのフローを終了します。
-
ユーザーエージェントや/または OS が適切な UI を表示し、利用可能なプラットフォーム認証器のいずれかを使って資格情報を作成するようユーザーを案内します。
-
作成が成功したら、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. 認証
これは既に登録済みの資格情報を持つユーザーがウェブサイトを訪れて、その資格情報を使って認証する際のフローです。
-
ユーザーは example.com を訪問し、スクリプトが配信されます。
-
そのスクリプトは、可能な限り多くの情報を提供してクライアントに Authentication Assertion を要求し、ユーザーが受け入れ可能な資格情報の選択肢を絞り込みます。これは登録後にローカルに保存されたデータや、ユーザー名の入力のような他の手段から得られます。
-
Relying Party のスクリプトは以下のいずれかのコードスニペットを実行します。
-
クライアントプラットフォーム が認証器を検索して検出します。
-
クライアント が認証器に接続し、必要ならばペアリング操作を行います。
-
認証器はユーザーに注意を促す通知を表示します。通知を開くと、認証器は資格情報作成時に提供されたアカウント情報を用いて許容される資格情報のフレンドリな選択メニューを表示し、要求しているオリジンに関するいくつかの情報も示します。
-
認証器はユーザーからバイオメトリや他の認可ジェスチャーを取得します。
-
認証器はクライアントにレスポンスを返し、それがさらにRelying Party スクリプトにレスポンスを返します。ユーザーが資格情報の選択や認可を拒否した場合は、適切なエラーが返されます。
-
もしアサーションが正常に生成され返された場合、
-
スクリプトはそのアサーションをサーバーに送信します。
-
サーバーはアサーションを検査し、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== "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 -- ユーザーが資格情報を紛失したと報告する場合。
-
ユーザーは server.example.net にアクセスし、認証して紛失/盗難報告用のリンクに従い認証器を報告します。
-
サーバーは登録済み資格情報の一覧(登録時に設定されたフレンドリ名付き)を表示するページを返します。
-
ユーザーは資格情報を選択し、サーバーはそれをデータベースから削除します。
-
将来的に、Relying Party スクリプトはその資格情報を許容資格情報のリストに含めず、その資格情報によって署名されたアサーションは拒否されます。
-
-
可能性 #2 -- サーバーが非アクティブのために資格情報を登録解除する場合。
-
サーバーは保守作業中に資格情報をデータベースから削除します。
-
将来的に、Relying Party スクリプトはその資格情報を許容資格情報のリストに含めず、その資格情報によって署名されたアサーションは拒否されます。
-
-
可能性 #3 -- ユーザーが認証器から資格情報を削除する場合。
-
ユーザーは認証器固有の方法(例:デバイス設定の UI)を用いて認証器から資格情報を削除します。
-
この時点以降、その資格情報は選択プロンプトに表示されず、アサーションを生成できなくなります。
-
その後、サーバーが非アクティブのためにその資格情報を登録解除することがあります。
-
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
-
domain、host、port、scheme、valid 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 ID、credential key pair、signature counter 等が含まれます。
アテステーションステートメント は、アテステーションオブジェクト 内で 登録 の儀式中に提供されます。詳しくは § 6.5 アテステーション および 図6 を参照してください。クライアントがどのようにしてアテステーションステートメントや aaguid 部分を Relying Party に伝えるかは、アテステーション伝達 によって記述されます。
- アテステーション証明書
-
認証器が製造元や機能を証明するために使用するアテステーション鍵ペア用のX.509証明書です。登録時、認証器はアテステーション秘密鍵を用いて、Relying Party専用の認証情報公開鍵(および追加データ)に署名し、それをauthenticatorMakeCredential操作を通じて生成・返却します。Relying Partyは、アテステーション証明書で渡されるアテステーション公開鍵を使い、アテステーション署名を検証します。自己アテステーションの場合は、認証器は個別のアテステーション鍵ペアやアテステーション証明書を持ちません。詳細は自己アテステーションを参照してください。
- 認証
- 認証儀式
-
ユーザーと、そのユーザーの クライアントプラットフォーム(少なくとも一つの 認証器 を含む、または接続しているもの) が協調して、以前に登録された public key credential の credential private key を制御していることを暗号学的に Relying Party に証明する 儀式 です(ユーザー存在テスト や ユーザー検証 を含みます)。
WebAuthn の 認証儀式 は § 7.2 認証アサーションの検証 で定義され、Relying Party が
操作をnavigator.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"
- "Authenticator contains a credential"
-
public key credential source または public key credential が、その 管理認証器 に バインド(bound) されていると言われます。これは、当該 管理認証器 のみが、その public key credential source に対して アサーション を生成できることを意味します。
これはまた、「管理認証器 が contains している バウンド資格情報」や、「バウンド資格情報 がその 管理認証器 上で 作成された」と表現され得ます。ただし、サーバー側資格情報 は認証器内の永続メモリに物理的に保存されていない場合があるため、「バインドされた(bound to)」が主要な用語となります。参照: § 6.2.2 Credential Storage Modality。
- 儀式
-
儀式 の概念は、人的ノードを含むネットワークプロトコルの概念を拡張したもので、ユーザーインターフェース、人間間通信、データを運ぶ物理的オブジェクトの移転などを含む通信リンクを持ちます。プロトコルにとってアウト・オブ・バンドであるものが、儀式にとってはイン・バンドであることがあります。本仕様では、登録 と 認証 は儀式であり、認可ジェスチャー はしばしばその構成要素です。
- クライアント
- WebAuthn クライアント
-
ここでは単に クライアント と呼ぶこともあります。参照: Conforming User Agent。WebAuthn 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 device と client の区別は次のとおりです:
-
単一の client device は複数の clients(つまりブラウザ実装)をサポートすることがあり、これらはすべて当該 client device 上で利用可能な同じ 認証器 にアクセスできます。
-
プラットフォーム認証器 は client device にバインドされ、WebAuthn Client にではない、という点があります。
一つの client device と一つの client が合わさって client platform を構成します。
-
- クライアント プラットフォーム
-
client device と client が組み合わさって client platform を構成します。単一のハードウェアデバイスは異なる時点で異なるオペレーティングシステムや clients を実行することで、複数の異なる client platforms に属することができます。
- クライアント側
-
一般に、ユーザーの client platform、認証器、およびそれらを結びつけるすべての要素の組合せを指します。
- クライアント側で発見可能な Public Key Credential
Source
- クライアント側で発見可能な資格情報
- 発見可能な資格情報
- パスキー
- [DEPRECATED] Resident Credential(非推奨)
- [DEPRECATED] Resident Key(非推奨)
- クライアント側で発見可能な資格情報
-
注:歴史的に、クライアント側で発見可能な資格情報 は resident credentials や resident keys として知られていました。互換性のため、
ResidentKeyやresidentKeyといった語句は WebAuthn API や Authenticator Model の辞書メンバ名、アルゴリズム変数名、操作パラメータなどで広く使われているため、これらの名前は変更されていません。また、resident key はここでは クライアント側で発見可能な資格情報 と同義で定義されています。Client-side discoverable Public Key Credential Source(略して Discoverable Credential)は、public key credential source であり、発見可能 であり、認証儀式 において Relying Party が credential ID を提供しない場合(すなわち empty の
allowCredentials引数で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()を非 empty なallowCredentials引数で呼ぶ場合にも使用可能です。 - 準拠するユーザーエージェント
-
ユーザーエージェントが基盤となる client device と協力して、本仕様で示された Web Authentication API とアルゴリズムを実装し、認証器 と Relying Parties 間の通信を扱うものを指します。
- Credential ID
-
確率論的に一意な バイト列 で、public key credential source およびその authentication assertions を識別します。長さは最大 1023 バイトです。
Credential ID は認証器によって二つの形式で生成されます:
-
少なくとも 16 バイトで、少なくとも 100 ビットのエントロピーを含むもの、または
-
公開鍵認証情報ソースから、 認証情報IDおよび 可変項目を除いたものを、 その管理認証器だけが 復号できるように暗号化したもの。この形式を使うことで、Relying Party が必要な状態を保存することで、認証器をほぼステートレスにできます。
注: [FIDO-UAF-AUTHNR-CMDS] は「Security Guidelines」内で暗号化技術に関するガイダンスを含んでいます。
Relying Parties は、これら二つの Credential ID 形式を区別する必要はありません。
-
- Credential
Key Pair
- Credential Private Key
- Credential Public Key
- ユーザー公開鍵
- Credential Private 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 Partyは UV フラグを 認証要素 として認証セレモニーで考慮してもよいです。 例:Relying PartyはuvInitializedがtrueかつ UV フラグがセットされている場合、 パスワードプロンプトを省略することができます。たとえユーザー検証が求められていなかった場合でも同様です。この値が
falseの場合(認証セレモニーでtrueに更新される場合も含む)、 UV フラグを 認証要素として依拠することはできません。 なぜなら、公開鍵認証情報ソースが初めて UV フラグを1に設定した段階では、 Relying Partyと 認証器のユーザー検証との間に 信頼関係がまだ確立していないためです。 したがって、uvInitializedをfalseから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 は後で アテステーション署名 を再検証することができます。
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.ukとwww.example.deの両方の registrable origin label は、co.ukとdeがそれぞれ 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
- privateKey
- 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)を含む可能性があります。otherUI は mutable item とされ、更新可能であるように public key credential source に結び付けるべきではありません。
authenticatorMakeCredential操作は、公開鍵クレデンシャルソースを作成し、それを管理認証器にバインドします。そして、そのクレデンシャル秘密鍵に対応するクレデンシャル公開鍵を返します。Relying Partyは、このクレデンシャル公開鍵を用いて、この公開鍵クレデンシャルソースによって作成された認証アサーションを検証できます。
- レート制限
-
ブルートフォース攻撃に対抗するために、認証器が連続した失敗した認証試行の回数を一定期間内に制限することで制御を実装するプロセス(スロットリングとも呼ばれる)。制限に達した場合、認証器は各試行に対して指数的に増加する遅延を課すか、現在の認証モダリティを無効にして利用可能な別の 認証要素 を提供すべきです。レート制限はしばしば ユーザー検証 の側面として実装されます。
- 登録
- 登録儀式
-
ユーザー、Relying Party、および client platform が協調して public key credential を作成し、ユーザーアカウント に関連付ける 儀式 です。これには ユーザー存在テスト や ユーザー検証 が含まれます。登録儀式が成功した後、ユーザーは認証儀式によって認証され得ます。
WebAuthn の 登録儀式 は § 7.1 新しい資格情報の登録 で定義され、Relying Party が
をnavigator.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 API を client 内で呼び出すもの)と、サーバー側コンポーネント(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は公開鍵クレデンシャルのスコープを決定します。 すなわち、その公開鍵クレデンシャルが使用できるオリジンの集合を決定します。その条件は次の通りです:
-
RP IDはオリジンの有効ドメインと一致するか、または登録可能なドメインサフィックスでなければなりません。
-
次のいずれかが真でなければなりません:
たとえば、リライングパーティのオリジンが
https://login.example.com:1337の場合、有効なRP IDはlogin.example.com(デフォルト)やexample.comですが、m.login.example.comやcomは無効です。もう一つの有効なオリジンの例として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 credentials は non-resident credentials として知られていました。互換性のために、WebAuthn API や Authenticator Model のコンポーネント中の
residentを含む名称は変更されていません。Server-side Public Key Credential Source(略して Server-side Credential)は、認証儀式で Relying Party がその credential ID を
navigator.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 が登録時に
として指定するものです。Discoverable credentials はこの識別子を格納し、認証儀式でuser.iduserHandleとして返すことが必須です(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 の使用はすべて認証器を定義する論理的セキュリティ境界内で行われなければなりません。
- ユーザーが検証済み
5. Web Authentication API
この節では、public key credentials を作成および使用するための API を規範的に定義します。基本的な考え方は、資格情報はユーザーに属し、WebAuthn Authenticator によって 管理 され、WebAuthn Relying Party は client 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 の存在を探知するのを防ぐために、各 credential は Relying Party Identifier(いわゆる RP ID)にも スコープ されています。RP ID はクライアントがすべての操作で authenticator に提供し、authenticator はある Relying Party によって作成された credentials が同じ RP ID によって要求された操作でのみ使用できることを保証します。こうして origin を RP ID から分離することで、単一の Relying Party が複数の origins を保持している場合でも API を使用できるようにします。
クライアントはこれらのセキュリティ対策を促進するために、各操作ごとに Relying Party の origin と RP ID を authenticator に提供します。これは WebAuthn のセキュリティモデルにとって不可欠な部分であるため、ユーザーエージェントはこの API を secure contexts の呼び出し元にのみ公開します。特に Web コンテキストでは、これはエラーなしに確立された安全なトランスポート(例: TLS)経由でアクセスされたものに限られます。
Web Authentication API は、以下の節に示される Web IDL フラグメントの和集合によって定義されます。統合された IDL の一覧は IDL Index に示されています。
5.1. PublicKeyCredential Interface
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から継承されますが、PublicKeyCredentialはCredentialの getter をオーバーライドしており、オブジェクトの内部スロット[[identifier]]に含まれるデータの base64url エンコーディング を返します。 rawId-
この属性は、内部スロット
[[identifier]]に含まれるArrayBufferを返します。 response, of type AuthenticatorResponse, readonly-
この属性は、クライアントの要求に対する authenticator の応答を含みます。これは新しい public key credential を作成する要求、または authentication assertion を生成する要求のいずれかに対する応答です。
PublicKeyCredentialがcreate()に応じて作成された場合、この属性の値はAuthenticatorAttestationResponseになります。そうでない場合、PublicKeyCredentialはget()に応じて作成され、この属性の値はAuthenticatorAssertionResponseになります。 authenticatorAttachment, of type DOMString, readonly, nullable-
この属性は、
navigator.credentials.create()またはnavigator.credentials.get()が正常に完了した時点で有効であった authenticator attachment modality を報告します。属性の値はAuthenticatorAttachmentのメンバーであるべきです。Relying Parties は未知の値を null と扱うべきです。Note: 登録儀式や認証儀式の結果としてauthenticatorAttachmentの値が "cross-platform" であり、かつisUserVerifyingPlatformAuthenticatorAvailableがtrueを返す場合、ユーザーはその儀式において 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 ; // The structure of this object will be either // RegistrationResponseJSON or AuthenticationResponseJSONBase64URLString 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 >; // 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.transports Base64URLString ;publicKey required COSEAlgorithmIdentifier ; // This value contains copies of some of the fields above. See // section “Easily accessing credential data”.publicKeyAlgorithm 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]]-
The
PublicKeyCredentialインターフェイスオブジェクトの[[type]]の 内部スロット の値は文字列 "public-key" です。注:これは
type属性ゲッターを通じて反映されており、そのゲッターはCredentialから継承されています。 [[discovery]]-
The
PublicKeyCredentialインターフェイスオブジェクトの[[discovery]]の 内部スロット の値は "remote" です。 [[identifier]]-
This 内部スロット には、認証器が選択した credential ID が含まれます。 この credential ID は資格情報を参照するために使用されるため、同じ種類のすべての資格情報やすべての認証器にまたがって、高い確率でグローバルに一意であることが期待されます。
この API はこの識別子の形式を制約しませんが、1023 バイトより長くしてはならず、かつ authenticator が鍵を一意に選択できるだけの情報を持っていることが必要です。 例えば、オンボードストレージを持たない認証器は、認証器に書き込まれた対称鍵でラップした credential private key を含む識別子を作成することがあります。
[[clientExtensionsResults]]-
This 内部スロット には、Relying Party が要求したクライアント拡張の処理結果が含まれます。これらは Relying Party による
navigator.credentials.create()またはnavigator.credentials.get()の呼び出し時に生成されます。
PublicKeyCredential
の
インターフェイスオブジェクト は、Credential
の
[[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors)
の実装を継承し、
さらに [[Create]](origin, options, sameOriginWithAncestors)、
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)、
および [[Store]](credential, sameOriginWithAncestors)
の各実装を独自に定義します。
CredentialsContainer
の
preventSilentAccess()
メソッドを呼び出しても、PublicKeyCredential
資格情報には影響しません。これらは常にユーザーの操作を必要とするためです。
5.1.1. CredentialCreationOptions Dictionary
Extension
この文書は navigator.credentials.create()
による登録をサポートするために、CredentialCreationOptions
辞書を次のように拡張します:
partial dictionary CredentialCreationOptions {PublicKeyCredentialCreationOptions ; };publicKey
5.1.2. CredentialRequestOptions Dictionary
Extension
この文書は navigator.credentials.get()
によるアサーション取得をサポートするために、CredentialRequestOptions
辞書を次のように拡張します:
partial dictionary CredentialRequestOptions {PublicKeyCredentialRequestOptions ; };publicKey
5.1.3.
新しい資格情報の作成 - PublicKeyCredential の [[Create]](origin, options, sameOriginWithAncestors)
内部メソッド
PublicKeyCredentialの
interface object に実装された [[Create]](origin, options, sameOriginWithAncestors)
internal method は [CREDENTIAL-MANAGEMENT-1] に従い、WebAuthn Relying Party のスクリプトが
navigator.credentials.create()
を呼び出して、public key credential source(bound された authenticator)の作成を要求できるようにします。
もし
options.
を mediationconditional
に設定すると、Relying Parties は
ユーザーが既に資格情報の作成に同意している場合に目立つモーダル UI を伴わずに資格情報を登録したいことを示すことができます。
Relying Party はまず getClientCapabilities()
を使用して、client が conditionalCreate
能力をサポートしているか確認するべきです。そうしないと、この機能が利用できない場合にユーザーに見えるエラーが発生する恐れがあります。
クライアントは、options.
が mediationconditional
に設定されている場合、requireUserPresence と requireUserVerification の両方を
明示的に儀式中に実行されない限り FALSE に設定しなければなりません。
任意の navigator.credentials.create()
操作は AbortController
を利用して中止できます。詳細な手順については DOM § 3.3 Using
AbortController and AbortSignal objects in APIs を参照してください。
この internal method は 3 つの引数を受け取ります:
origin-
この引数は呼び出し
create()実装によって決定される、relevant settings object の origin です。 options-
この引数は
CredentialCreationOptionsオブジェクトで、options.メンバーが作成される PublicKeyCredentialCreationOptions オブジェクトを含み、作成される public key credential の望ましい属性を指定します。publicKey sameOriginWithAncestors-
この引数は Boolean 値で、呼び出し元の environment settings object が same-origin with its ancestors の場合に限り
trueです。 呼び出し元がクロスオリジンの場合はfalseです。注:この internal method の呼び出しは、 permissions policy により許可されていることを示します。permissions policy は [CREDENTIAL-MANAGEMENT-1] レベルで評価されます。詳細は § 5.9 Permissions Policy integration を参照してください。
注: このアルゴリズムは同期的です: Promise
の解決/拒否は navigator.credentials.create()
により扱われます。
このアルゴリズムで使用されるすべての BufferSource
オブジェクトは、同期の問題を避けるためにアルゴリズム開始時にスナップショットされなければなりません。実装は get a copy of the bytes held by the buffer source
を行い、そのコピーをアルゴリズムの該当部分で使用することを推奨します。
このメソッドが呼び出されたとき、ユーザーエージェントは次のアルゴリズムを実行しなければなりません:
-
アサート:
options.が存在すること。publicKey -
もし sameOriginWithAncestors が
falseの場合:-
もし
options.が存在し、その値がmediationconditionalのとき:-
"
NotAllowedError"DOMExceptionをスローする。
-
-
もし呼び出し
create()実装によって決まる relevant global object が transient activation を持っていないとき:-
"
NotAllowedError"DOMExceptionをスローする。
-
-
もし資格情報を作成しようとしている origin が、relevant global object の top-level origin と異なる場合(つまり、ユーザーがアドレスバーで見ているオリジンと異なる場合)、 client はこの事実をユーザーに明示すべきです。
-
-
pkOptions を
options.の値とする。publicKey -
もし
pkOptions.が存在する場合、その値が client によって定義される合理的な範囲内にあるか確認し、範囲外であれば最も近い範囲内の値に修正します。調整した値をタイマー lifetimeTimer に設定します。もしtimeoutpkOptions.が存在しない場合は、lifetimeTimer をクライアント固有のデフォルトに設定します。timeout合理的な範囲とデフォルトの決定については、WebAuthn 儀式タイムアウトの推奨範囲とデフォルト を参照してください。
クライアントは、特別な支援を要するユーザーに配慮してタイムアウトに関する認知ガイドラインを考慮に入れるべきです。
-
もし
pkOptions.の長さが 1 ~ 64 バイト(両端含む)でない場合はuser.idTypeErrorをスローします。 -
callerOrigin を
originとします。もし callerOrigin が opaque origin であれば、"NotAllowedError"DOMExceptionをスローします。 -
effectiveDomain を callerOrigin の effective domain とします。 もし effective domain が 有効なドメイン でなければ、"
SecurityError"DOMExceptionを投げます。注:effective domain は host を解決することがあり、その表現は domain、ipv4 アドレス、ipv6 アドレス、opaque host、empty host など様々です。ここでは host の domain 形式のみを許可します。これは簡便化のため、また PKI ベースのセキュリティと直接 IP アドレス識別の併用に関する諸問題を考慮したものです。
-
- 存在する場合
-
もし
pkOptions.が effectiveDomain の registrable domain suffix でないか等しくない場合、かつクライアントがrp.id- related origin requests をサポートする場合
-
-
callerOrigin と rpIdRequested を引数として related origins validation procedure を実行します。結果が
falseなら "SecurityError"DOMExceptionをスローします。
- related origin requests をサポートしない場合
-
"
SecurityError"DOMExceptionをスローします。
- 存在しない場合
注:
pkOptions.は呼び出し元の RP ID を表します。RP ID は、呼び出し元がrp.idcreate()を呼ぶ際に明示的に設定していない限り、呼び出し元の origin の effective domain がデフォルトになります。 -
credTypesAndPubKeyAlgs を、要素が
PublicKeyCredentialTypeとCOSEAlgorithmIdentifierのペアである新しい list とします。 -
もし
pkOptions.の sizepubKeyCredParams- が 0 の場合
-
Append を用いて、以下の
PublicKeyCredentialTypeとCOSEAlgorithmIdentifierのペアを credTypesAndPubKeyAlgs に追加します:-
public-keyと-7("ES256"). -
public-keyと-257("RS256").
-
- が 0 でない場合
-
For each を用いて、
pkOptions.の各 current について処理を行います:pubKeyCredParams-
もし
current.がこの実装でサポートされているtypePublicKeyCredentialTypeを含まない場合は、continue します。 -
alg を
current.とします。alg -
Append を用いて、
current.と alg のペアを credTypesAndPubKeyAlgs に追加します。type
もし credTypesAndPubKeyAlgs が 空 であれば、 "
NotSupportedError"DOMExceptionをスローします。 -
-
clientExtensions を新しい map、authenticatorExtensions を新しい map とします。
-
もし
pkOptions.が存在するなら、for each を用いて extensionId → clientExtensionInput をextensionspkOptions.から取り出し、次の処理を行います:extensions-
もし extensionId がこの client platform でサポートされていないか、または registration extension でない場合、continue します。
-
Set を用いて clientExtensions[extensionId] に clientExtensionInput を設定します。
-
もし extensionId が authenticator extension でないなら、continue します。
-
authenticatorExtensionInput を、extensionId の client extension processing アルゴリズムを clientExtensionInput に対して実行した結果(CBOR)とします。もしアルゴリズムがエラーを返した場合は、continue します。
-
Set を用いて authenticatorExtensions[extensionId] に authenticatorExtensionInput を base64url encoding したものを設定します。
-
-
collectedClientData を以下のフィールドを持つ新しい
CollectedClientDataインスタンスとします:type-
文字列 "webauthn.create".
challenge-
pkOptions.
challengeの base64url エンコーディング。 origin-
callerOrigin の シリアライズ。
crossOrigin-
この sameOriginWithAncestors 引数の値の否定(inverse)です。
topOrigin-
もしこのメソッドの sameOriginWithAncestors 引数が
falseなら、callerOrigin の top-level origin の シリアライズ。そうでなければundefined。
-
clientDataJSON を、collectedClientData から構築された JSON 互換のシリアライズ とします。
-
clientDataHash を、clientDataJSON によって表される シリアライズされたクライアントデータのハッシュ とします。
-
もし
options.が存在し、aborted なら、signaloptions.の abort reason をスローします。signal -
issuedRequests を新しい ordered set とします。
-
authenticators を、任意の時点でこのクライアントプラットフォーム上で利用可能な各 authenticator を識別するクライアントプラットフォーム固有ハンドルの集合を表す値とします。
注:どのような条件で認証器が「利用可能」と見なされるかは意図的に指定されていません。これは認証器が USB 等でホットプラグされる、または NFC や Bluetooth で検出される、あるいはクライアントに恒久的に組み込まれているといった様々なメカニズムを表すためです。
-
もし
options.がmediationconditionalの場合:-
もしユーザーエージェントが最近認証を仲介していない、当該認証のオリジンが callerOrigin でない、またはユーザーがこの種の資格情報作成に同意していない場合、"
NotAllowedError"DOMExceptionをスローします。どの時点でユーザーエージェントが認証儀式が完了したと判断するかはユーザーエージェント次第です。その認証儀式は Web Authentication API 以外の手段で行われる場合もあります。
-
-
hintsの値を考慮し、ユーザーエージェントは適宜ユーザーインターフェースを作成してください。 -
lifetimeTimer を開始します。
-
While
lifetimeTimer が期限切れになっていない間、lifetimeTimer と authenticators
の状態および応答に応じて、各 authenticator に対して次の操作を行います:
- もし lifetimeTimer が期限切れになったら、
-
For each を用いて issuedRequests 内の各 authenticator に対して authenticatorCancel を呼び出し、remove します。
- ユーザーがユーザーエージェントの UI 操作でプロセスをキャンセルしたら、
-
For each を用いて issuedRequests 内の各 authenticator に対して authenticatorCancel を呼び出し、remove します。その後 "
NotAllowedError"DOMExceptionをスローします。 - もし
options.が存在し、aborted なら、signal -
For each を用いて issuedRequests 内の各 authenticator に対して authenticatorCancel を呼び出し、remove します。その後
options.の abort reason をスローします。signal - もし authenticator がこの client device で利用可能になったら、
-
注:これは authenticator が lifetimeTimer 開始時に既に利用可能であった場合も含みます。
-
この authenticator は今や candidate authenticator です。
-
もし
pkOptions.が存在する場合:authenticatorSelection-
もし
pkOptions.が存在し、その値がこの authenticator の authenticator attachment modality と等しくない場合、continue します。authenticatorSelection.authenticatorAttachment -
もし
pkOptions.が存在するなら:authenticatorSelection.residentKey- もし
requiredに設定されている場合 -
もしこの authenticator が client-side discoverable public key credential source を格納する能力を持たないなら、continue します。
- もし
preferredまたはdiscouragedに設定されている場合 -
影響はありません。
- 存在しない場合
-
もし
pkOptions.がauthenticatorSelection.requireResidentKeytrueに設定されていて、authenticatorがクライアント側探索可能公開鍵認証情報ソースを保存できない場合、続行してください。
- もし
-
もし
pkOptions.がauthenticatorSelection.userVerificationrequiredに設定されており、この authenticator が user verification を実行する能力を持たない場合、continue します。
-
-
requireResidentKey を クレデンシャル作成時の実効レジデントキー要件(Boolean 値)とし、以下のように定める:
pkOptions.authenticatorSelection.residentKey- が存在し、
requiredに設定されている場合 -
requireResidentKey を
trueとする。 - が存在し、
preferredに設定されている場合 -
authenticator
- クライアントサイドのクレデンシャル保存方式 をサポートしている場合
-
requireResidentKey を
trueとする。 - クライアントサイドのクレデンシャル保存方式 をサポートしていない場合、あるいは クライアント が認証器の能力を判別できない場合
-
requireResidentKey を
falseとする。
- が存在し、
discouragedに設定されている場合 -
requireResidentKey を
falseとする。 - が存在しない場合
-
requireResidentKey を
pkOptions.の値とする。authenticatorSelection.requireResidentKey
- が存在し、
-
userVerificationを認証情報作成のための実効ユーザー検証要件(Boolean値)として、以下のように定義する。もし
pkOptions.authenticatorSelection.userVerification- もし
requiredに設定されている場合 -
-
もし
options.がmediationconditionalに設定されており、儀式中に user verification を収集できない場合は、ConstraintErrorDOMExceptionをスローします。 -
userVerification を
trueにします。
-
- もし
preferredに設定されている場合 -
もしこの authenticator が user verification に対応していれば userVerification を
trueにし、 そうでなければfalseにします。 - もし
discouragedに設定されている場合 -
userVerification を
falseにします。
- もし
-
enterpriseAttestationPossible を Boolean 値とします。もし
attestationがenterpriseに設定されている場合-
もしユーザーエージェントが
pkOptions.に対して enterprise attestation をサポートしたいなら enterpriseAttestationPossible をrp.idtrueにします。そうでなければfalseにします。 - その他
-
enterpriseAttestationPossible を
falseにします。
-
attestationFormats を文字列のリストとし、その初期値を
pkOptions.の値に設定します。attestationFormats -
もし
pkOptions.がattestationnone-
attestationFormats を単一要素リスト ["none"] に設定します。
-
excludeCredentialDescriptorList を新しい list とします。
-
For each credential descriptor C を
pkOptions.から読み取ります:excludeCredentials-
もし
C.が 空でない かつ 現在の authenticator がtransportsC.に記載されていないトランスポートで接続されている場合、クライアントは continue してもよいです。transports注:クライアントが continue を選択すると、
C.のヒントが正確でない場合に、同じ authenticator に対して複数の資格情報が誤って登録される可能性があります。例えば、ソフトウェアアップデートにより保存されたトランスポートヒントが不正確になることがあります。transports -
それ以外の場合は Append を用いて C を excludeCredentialDescriptorList に追加します。
-
- authenticator 上で authenticatorMakeCredential を
clientDataHash,
pkOptions.,rppkOptions., requireResidentKey, userVerification, credTypesAndPubKeyAlgs, excludeCredentialDescriptorList, enterpriseAttestationPossible, attestationFormats, および authenticatorExtensions をパラメータとして呼び出します。user -
Append により authenticator を issuedRequests に追加します。
-
- もし authenticator がこの client device で利用できなくなったら、
-
Remove を用いて issuedRequests からその authenticator を削除します。
- もし任意の authenticator がユーザーが操作をキャンセルしたというステータスを返したら、
-
-
Remove を用いてその authenticator を issuedRequests から取り除きます。
-
For each を用いて残りの issuedRequests 内の各 authenticator に対し authenticatorCancel を呼び出し、remove します。
注:認証器は「ユーザーが操作全体をキャンセルした」という表示を返すことがあります。ユーザーエージェントがこの状態をユーザーにどのように示すかは未規定です。
-
- もし任意の authenticator が "
InvalidStateError" と等価なエラーステータスを返したら、 -
-
Remove を用いてその authenticator を issuedRequests から取り除きます。
-
For each を用いて残りの issuedRequests 内の各 authenticator に対して authenticatorCancel を呼び出し、remove します。
-
"
InvalidStateError"DOMExceptionをスローします。
注:このエラーは、excludeCredentialDescriptorList が該当する認証器にバインドされた資格情報を識別し、ユーザーが作業に同意している場合にのみ認証器が返すため、別個に扱われます。この明示的な同意がある場合、本ケースが Relying Party に区別されることは許容されます。
-
- もし任意の authenticator が上記以外のエラーステータスを返したら、
-
Remove を用いてその authenticator を issuedRequests から取り除きます。
注:この場合は操作に対するユーザー同意を示すものではないため、エラーの詳細は Relying Party に対して秘匿され、潜在的に識別可能な情報の漏洩を防ぎます。詳細は § 14.5.1 Registration Ceremony Privacy を参照してください。
- もし任意の authenticator が成功を示したら、
-
-
Remove を用いてその authenticator を issuedRequests から取り除きます。この認証器が今や selected authenticator です。
-
credentialCreationData を、次の struct とし、その items は以下の通りとします:
-
attestationObjectResult -
その値は成功した authenticatorMakeCredential 操作から返されたバイト列です。
注:この値は § 6.5.4 Generating an Attestation Object で定義された
attObjに相当します。 -
clientDataJSONResult -
その値は clientDataJSON のバイト列です。
-
attestationConveyancePreferenceOption -
その値は pkOptions.
attestationの値です。 -
clientExtensionResults -
その値は
AuthenticationExtensionsClientOutputsオブジェクトで、各 extension identifier → client extension output エントリを含みます。これらのエントリは、pkOptions.の各 client extension に対して各拡張の client extension processing アルゴリズムを実行して生成されます。extensions
-
-
constructCredentialAlg を、グローバルオブジェクト global を取り、以下の手順を実行するアルゴリズムとします:
-
もし
credentialCreationData.attestationConveyancePreferenceOptionが次のいずれかの値であれば:none-
識別可能な情報を非識別化されたバージョンに置換します:
-
もし aaguid が 16 バイトのゼロであり、
credentialCreationData.attestationObjectResult.fmtが "packed" で、かつattestationObjectResultに "x5c" が存在しない場合、これは self attestation が使用されているため、追加の処理は不要です。 -
それ以外の場合:
-
credentialCreationData.attestationObjectResult.fmtを "none" に設定し、credentialCreationData.attestationObjectResult.attStmtを空の CBOR マップに設定します。(参照: § 8.7 None Attestation Statement Format および § 6.5.4 Generating an Attestation Object)。
-
-
indirect-
クライアントは aaguid と attestation statement をよりプライバシーに配慮した、または検証しやすいバージョン(例えば Anonymization CA を用いるなど)に置き換えてもよいです。
directまたはenterprise-
authenticator の AAGUID と attestation statement を改変せずに Relying Party に渡します。
-
attestationObject を新しい
ArrayBufferとして、global の %ArrayBuffer% を使って作成し、credentialCreationData.attestationObjectResultのバイト列を格納します。 -
id を
attestationObject.authData.attestedCredentialData.credentialIdとします。 -
pubKeyCred を、新しい
PublicKeyCredentialオブジェクトとして、グローバルを global に関連づけ、そのフィールドを以下のように設定します:[[identifier]]-
id
authenticatorAttachment-
AuthenticatorAttachment値を、この authenticator の現在の authenticator attachment modality に合わせて設定します。 response-
global に関連づけられた新しい
AuthenticatorAttestationResponseオブジェクトを作り、そのフィールドを以下のように設定します:clientDataJSON-
新しい
ArrayBufferを global の %ArrayBuffer% を用いて作成し、credentialCreationData.clientDataJSONResultのバイトを格納します。 attestationObject-
attestationObject
[[transports]]-
その authenticator がサポートしていると考えられる 0 個以上のユニークな
DOMStringの列で、辞書式順(lexicographical order)になっています。値はAuthenticatorTransportのメンバーであるべきですが、client platforms は未知の値を無視しなければなりません。ユーザーエージェントがこの情報の開示を望まない場合、プライバシーを保護するために任意の列を代わりに返してもよいです。この列は依然として有効(辞書式順かつ重複なし)でなければなりません。例えば空列を用いることができます。いずれにせよ、その場合は Relying Party の挙動が最適でなくなるリスクをユーザーエージェントが負います。
もしユーザーエージェントがトランスポート情報を持っていない場合、このフィールドは空列に設定するべきです。
注:ある認証器がサポートするトランスポートをユーザーエージェントがどのように発見するかは本仕様の範囲外ですが、attestation certificate(例: [FIDO-Transports-Ext])や CTAP2 のような認証器プロトコルのメタデータ、あるいは platform authenticator に関する特殊な知識に基づく場合があります。
[[clientExtensionsResults]]-
新しい
ArrayBufferを global の %ArrayBuffer% を用いて作成し、credentialCreationData.clientExtensionResultsのバイト列を格納します。
-
返り値として pubKeyCred を返します。
-
-
For each を用いて残りの issuedRequests 内の各 authenticator に対して authenticatorCancel を呼び出し、remove します。
-
返り値として constructCredentialAlg を返し、アルゴリズムを終了します。
-
-
"
NotAllowedError"DOMExceptionをスローします。
上記の過程において、ユーザーエージェントは認証器の選択および認可の過程でユーザーを誘導するための UI を表示することを推奨します。もし
options.
が mediationconditional
に設定されている場合、事前にユーザーエージェントが同意を得ていない限り、目立つモーダル UI を表示すべきではありません。
5.1.3.1. Create Request Exceptions
この節は規範的ではありません。
WebAuthn Relying
Parties は navigator.credentials.create()
の呼び出しからいくつかの例外に遭遇することがあります。これらの例外の中には発生理由が複数考えられるものがあり、WebAuthn を利用する側が文脈に基づいて実際の理由を推測する必要がある場合があります。
Note: 本仕様の外部で定義されたものを含め、任意の WebAuthn Extensions の処理中に発生し得る例外はここには列挙していません。
次の DOMException
例外が発生する可能性があります:
AbortError-
儀式が
AbortControllerによりキャンセルされました。§ 5.6 Abort Operations with AbortSignal と § 1.3.4 Aborting Authentication Operations を参照してください。 ConstraintError-
次のいずれか:
residentKeyがrequiredに設定されていて利用可能な認証器が resident key をサポートしていなかった、またはuserVerificationがrequiredに設定されていて利用可能な認証器が user verification を行えなかった。 InvalidStateError-
儀式で使用された認証器が、ユーザーが登録に 同意 した後で
excludeCredentials内のエントリを認識した。 NotSupportedError-
pubKeyCredParamsのいずれのエントリにもtypeプロパティとしてpublic-keyが含まれていなかった、あるいは認証器がpubKeyCredParamsで指定された署名アルゴリズムをいずれもサポートしていなかった。 SecurityError-
effective domain が 有効なドメイン でなかった、または
が effective domain と等しくないか registrable domain suffix ではなかった場合です。後者の場合、client が related origin requests をサポートしていないか、related origins validation procedure が失敗しました。rp.id NotAllowedError-
ユーザーが儀式を中止するなど、幅広い理由を包括する汎用のエラーです。これらの原因の一部は本仕様の各所で説明されていますが、その他はクライアント固有の理由であることがあります。
次の simple exceptions が発生することがあります:
TypeError-
options引数が有効なCredentialCreationOptions値ではなかった、またはの値が空であったか 64 バイトより長かった。user.id
5.1.4. 既存の資格情報を用いてアサーションを作成する
WebAuthn Relying
Parties は
navigator.credentials.get({publicKey:..., ...})
を呼び出して、既存の public
key credential を発見して使用します(ユーザーの同意が必要です)。Relying Party スクリプトはオプションでいくつかの基準を指定し、どの public key credential
sources が受け入れ可能かを示します。client platform は指定された基準に一致する public key credential
sources を見つけ出し、ユーザーにスクリプトが使用を許可されるものを選択させるよう導きます。ユーザーはプライバシー保護のために、public key credential
source が存在しても対話全体を拒否することができます。ユーザーが public key credential source を選択した場合、ユーザーエージェントは § 6.3.3 The authenticatorGetAssertion Operation を用いて、Relying Party
が提供したチャレンジや他の収集データに署名して authentication assertion を作成し、それを credential として使用します。
navigator.credentials.get()
の実装は [CREDENTIAL-MANAGEMENT-1] に従い、
PublicKeyCredential.
を呼んで、credentials のうちユーザー介在なしに利用可能であるべきもの(概ね本仕様の authorization gesture
に相当)を収集し、それらがちょうど一つでない場合は
[[CollectFromCredentialStore]]()PublicKeyCredential.
を呼んでユーザーに public key credential source を選択させます。
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
本仕様は任意の authorization gesture を要求してアサーションを作成することを求めているため、PublicKeyCredential
は [[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors)
のデフォルト動作(空集合を返す)を継承します。PublicKeyCredential
の
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
の実装は次の節で規定されています。
一般に、ユーザーエージェントは操作を完了するために使用する認証器の選択と認可に関してユーザーを導く何らかの UI
を表示するべきです。options.
を mediationconditional
に設定すると、Relying Parties
は、資格情報が発見されない限り目立つモーダル UI を表示すべきではないことを示すことができます。Relying Party はまず isConditionalMediationAvailable()
または getClientCapabilities()
を用いて client が conditionalGet
能力をサポートしているか確認し、この機能が利用できない場合のユーザー可視エラーを防ぐべきです。
任意の navigator.credentials.get()
操作は AbortController
を利用して中止できます。詳細は DOM
§ 3.3 Using AbortController and AbortSignal objects in APIs を参照してください。
5.1.4.1. PublicKeyCredential の
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
内部メソッド
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)この internal method は3つの引数を受け取ります:
origin-
この引数は、呼び出し側の
get()実装によって決定される relevant settings object の origin です。すなわち CredentialsContainer の抽象操作 Request aCredentialに対応します。 options-
この引数は
CredentialRequestOptionsオブジェクトであり、options.メンバーがpublicKeyPublicKeyCredentialRequestOptionsオブジェクトを含み、発見したい public key credential の望ましい属性を指定します。 sameOriginWithAncestors-
この引数は Boolean 値で、呼び出し元の environment settings object が same-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
を行い、そのコピーをアルゴリズムの該当部分で使用することを推奨します。
このメソッドが呼び出されたとき、ユーザーエージェントは次のアルゴリズムを実行しなければなりません:
-
アサート:
options.が存在すること。publicKey -
pkOptions を
options.の値とする。publicKey -
もし
options.が存在し、その値がmediationconditionalの場合:-
credentialIdFilter を
pkOptions.の値とします。allowCredentials -
pkOptions.を empty に設定します。allowCredentialsNote: これは non-discoverable credentials が
conditionalリクエスト中に使用されるのを防ぎます。 -
lifetimeTimer を無限大に設定します。
Note: lifetimeTimer を無限大に設定するのは、ユーザーが Document の存続期間全体を用いて
input要素などの "webauthn" タグ付きフォームコントロールと相互作用できるようにするためです。例えばユーザーがそのような入力フィールドをクリックしたときに、ユーザーエージェントは発見された資格情報のリストを表示してユーザーに選択させたり、「別の方法を試す」オプションを提供したりできます。
-
-
それ以外の場合:
-
credentialIdFilter を空の list とします。
-
もし
pkOptions.が存在するなら、その値が client によって定義される合理的な範囲内にあるか確認し、範囲外であれば最も近い範囲内の値に修正します。調整した値を lifetimeTimer に設定します。もしtimeoutpkOptions.が存在しない場合は、lifetimeTimer を client 固有のデフォルトに設定します。timeout合理的な範囲とデフォルトの決定については、WebAuthn 儀式タイムアウトの推奨範囲とデフォルト を参照してください。
ユーザーエージェントは、支援が必要なユーザー向けの認知ガイドラインを考慮してタイムアウトを決定するべきです。
-
-
callerOrigin を
originとします。もし callerOrigin が opaque origin であれば、"NotAllowedError"DOMExceptionをスローします。 -
effectiveDomain を callerOrigin の effective domain とします。もし effectiveDomain が 有効なドメイン でなければ、"
SecurityError"DOMExceptionを投げます。Note: effective domain は host に解決されることがあり、その表現は domain、ipv4 アドレス、ipv6 アドレス、opaque host、empty host など様々です。ここでは host の domain 形式のみを許可します。これは簡便化のためであり、PKI ベースのセキュリティと直接 IP アドレス識別を組み合わせる際の諸問題を考慮したものです。
-
もし
pkOptions.がrpId- 存在する場合
-
もし
pkOptions.が effectiveDomain の registrable domain suffix でも等しい値でもない 場合、かつクライアントがrpId- related origin requests をサポートする場合
-
-
rpIdRequested を
pkOptions.の値とします。rpId -
related origins validation procedure を callerOrigin と rpIdRequested を引数に実行します。結果が
falseの場合、"SecurityError"DOMExceptionをスローします。
-
- related origin requests をサポートしない場合
-
"
SecurityError"DOMExceptionをスローします。
- 存在しない場合
-
pkOptions.を effectiveDomain に設定します。rpId
Note: rpId は呼び出し元の RP ID を表します。RP ID は、呼び出し元が
get()を呼ぶ際に明示的に設定していない限り、呼び出し元の origin の effective domain がデフォルトになります。 -
clientExtensions を新しい map とし、authenticatorExtensions を新しい map とします。
-
もし
pkOptions.が存在するなら、for each を用いて extensionId → clientExtensionInput を取り出し次の処理を行います:extensions-
もし extensionId がこの client platform でサポートされていないか、または authentication extension でないなら、continue します。
-
Set を用いて clientExtensions[extensionId] に clientExtensionInput を設定します。
-
もし extensionId が authenticator extension でないなら、continue します。
-
authenticatorExtensionInput を、extensionId の client extension processing アルゴリズムを clientExtensionInput に対して実行した結果(CBOR)とします。アルゴリズムがエラーを返した場合は continue します。
-
Set を用いて authenticatorExtensions[extensionId] に base64url encoding した authenticatorExtensionInput を設定します。
-
-
collectedClientData を次のフィールドを持つ新しい
CollectedClientDataインスタンスとします:type-
文字列 "webauthn.get".
challenge-
base64url encoding を用いた pkOptions.
challengeの表現。 origin-
callerOrigin の シリアライズ。
crossOrigin-
このメソッドに渡された
sameOriginWithAncestors引数の値の否定(inverse)。 topOrigin-
もしこのメソッドの
sameOriginWithAncestors引数がfalseであれば、callerOrigin の top-level origin の シリアライズ。そうでなければundefined。
-
clientDataJSON を collectedClientData から構築した JSON 互換のシリアライズ とします。
-
clientDataHash を、clientDataJSON によって表される シリアライズされたクライアントデータのハッシュ とします。
-
もし
options.が存在し、aborted であれば、signaloptions.の abort reason をスローします。signal -
issuedRequests を新しい ordered set とします。
-
savedCredentialIds を新しい map とします。
-
authenticators を、任意の時点でクライアントプラットフォーム上で利用可能な各 authenticator を識別するクライアントプラットフォーム固有のハンドル集合を表す値とします。
Note: どのような条件で認証器が「利用可能」と見なされるかは意図的に指定されていません。これは認証器が USB 経由でホットプラグされたり、NFC/Bluetooth で検出されたり、またはクライアントに恒久的に組み込まれている場合など、さまざまなメカニズムを表現するためです。
-
silentlyDiscoveredCredentials を新しい map とし、そのエントリは DiscoverableCredentialMetadata → authenticator の形とします。
-
hintsの値を考慮して、ユーザーインターフェースを適宜作成してください。 -
lifetimeTimer を開始します。
-
While lifetimeTimer が期限切れになるまで、lifetimeTimer と authenticators の状態および応答に応じて各 authenticator に対して次の操作を行います:
- If lifetimeTimer が期限切れになったら,
-
For each を用いて issuedRequests 内の各 authenticator に対し authenticatorCancel を呼び出し、remove します。
- If ユーザーが UI 操作でプロセスをキャンセルしたら,
-
For each を用いて issuedRequests 内の各 authenticator に対し authenticatorCancel を呼び出し、remove します。その後 "
NotAllowedError"DOMExceptionをスローします。 - If
options.が存在し aborted なら,signal -
For each を用いて issuedRequests 内の各 authenticator に対し authenticatorCancel を呼び出し、remove します。その後
options.の abort reason をスローします。signal - もし
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"
-
もし silentlyDiscoveredCredentials が empty でない場合:
-
silentlyDiscoveredCredentials から DiscoverableCredentialMetadata をユーザーが任意で選択できるよう促します。プロンプトは各 DiscoverableCredentialMetadata の otherUI の値(例えば
nameやdisplayName)を表示するべきです。credentialMetadata を、ユーザーが選択した DiscoverableCredentialMetadata(存在する場合)とします。
-
もしユーザーが credentialMetadata を選択した場合:
-
publicKeyOptions を pkOptions の一時的コピーとします。
-
authenticator を silentlyDiscoveredCredentials[credentialMetadata] の値とします。
-
publicKeyOptions.を、単一要素の list に設定します。そのリストの要素はallowCredentialsPublicKeyCredentialDescriptorで、そのid値は credentialMetadata の id の値に、また別のid値は credentialMetadata の type の値に設定します。 -
issuing a credential request to an authenticator アルゴリズムを authenticator, savedCredentialIds, publicKeyOptions, rpId, clientDataHash, authenticatorExtensions を引数として実行します。もしこれが
falseを返したら、continue します。 -
Append を用いて authenticator を issuedRequests に追加します。
-
-
-
- もし
options.がmediationconditionalでない場合、かつ issuedRequests が空で、pkOptions.が空でなく、そこに含まれる任意の authenticator について利用可能なものがない場合,allowCredentials -
ユーザーに対して、該当する認証情報が見つからなかったことを示します。ユーザーがダイアログを確認した後、"
NotAllowedError" のDOMExceptionをスローします。注: クライアントプラットフォームが どのauthenticatorも利用可能にならないことを判断できる一つの方法は、存在する
メンバーやtransportsの 項目 をPublicKeyCredentialDescriptorpkOptions.で調べることです(存在する場合)。 例えば、全てのallowCredentials項目がPublicKeyCredentialDescriptorのみをリストしていて、全てのプラットフォーム型authenticatorが既に試されていたら、そのリクエストは満たせません。あるいは、すべてのinternal項目が、クライアントプラットフォームでサポートされていないPublicKeyCredentialDescriptorをリストしている場合も考えられます。transports - もし authenticator がこの client device 上で利用可能になったら,
-
Note: これは authenticator が lifetimeTimer 開始時に既に利用可能だった場合も含みます。
-
もし
options.がmediationconditionalで、その authenticator が silentCredentialDiscovery 操作をサポートするなら:-
collectedDiscoveredCredentialMetadata を authenticator に対して silentCredentialDiscovery を呼び出した結果とします(rpId をパラメータとして渡します)。
-
For each を用いて collectedDiscoveredCredentialMetadata の各 credentialMetadata について次を行います:
-
-
それ以外の場合:
-
issuing a credential request to an authenticator アルゴリズムを authenticator, savedCredentialIds, pkOptions, rpId, clientDataHash, authenticatorExtensions で実行します。もしこれが
falseを返したら continue します。 -
Append を用いて authenticator を issuedRequests に追加します。
-
-
- もし authenticator がこの client device で利用不可になったら,
-
Remove を用いて issuedRequests からその authenticator を削除します。
- もし任意の authenticator がユーザーが操作をキャンセルしたというステータスを返したら,
-
-
Remove を用いてその authenticator を issuedRequests から取り除きます。
-
For each を用いて残りの issuedRequests 内の各 authenticator に対し authenticatorCancel を呼び出し、remove します。
Note: Authenticators は「ユーザーが操作全体をキャンセルした」という表示を返すことがあります。ユーザーエージェントがこの状態をユーザーにどのように示すかは未規定です。
-
- もし任意の authenticator がエラーステータスを返したら,
-
Remove を用いてその authenticator を issuedRequests から取り除きます。
- もし任意の authenticator が成功を示したら,
-
-
Remove を用いてその authenticator を issuedRequests から取り除きます。
-
assertionCreationData を次の項目を持つ struct とします:
-
credentialIdResult -
もし
savedCredentialIds[authenticator]が存在するなら、credentialIdResult の値をsavedCredentialIds[authenticator]のバイト列に設定します。そうでなければ、成功した authenticatorGetAssertion 操作から返された credential ID のバイト列を credentialIdResult の値として設定します。 -
clientDataJSONResult -
その値は clientDataJSON のバイト列です。
-
authenticatorDataResult -
その値は成功した authenticator により返された authenticator data のバイト列です。
-
signatureResult -
その値は authenticator によって返された署名値のバイト列です。
-
userHandleResult -
もし authenticator が user handle を返した場合、userHandleResult に返された user handle のバイト列を設定します。そうでなければ userHandleResult を null に設定します。
-
clientExtensionResults -
その値は
AuthenticationExtensionsClientOutputsオブジェクトで、各 extension identifier → client extension output のエントリを含みます。これらのエントリはpkOptions.内の各クライアント拡張に対して各拡張の client extension processing アルゴリズムを実行して生成されます。extensions
-
-
もし credentialIdFilter が空でなく、かつ credentialIdFilter に id が含まれており、その値が credentialIdResult の値と一致しない場合は continue します。
-
もし credentialIdFilter が空で、かつ userHandleResult が null であれば、continue します。
-
settings を current settings object とし、global を settings の global object とします。
-
pubKeyCred を、global に関連付けられた新しい
PublicKeyCredentialオブジェクトとし、そのフィールドを以下のように設定します:[[identifier]]-
新しい
ArrayBufferを global の %ArrayBuffer% を用いて作成し、assertionCreationData.credentialIdResultのバイト列を格納します。 authenticatorAttachment-
AuthenticatorAttachmentの値を、この authenticator の現在の authenticator attachment modality に合わせて設定します。 response-
新しい
AuthenticatorAssertionResponseオブジェクトを global に関連付けて作成し、そのフィールドを以下のように設定します:clientDataJSON-
新しい
ArrayBufferを global の %ArrayBuffer% を用いて作成し、assertionCreationData.clientDataJSONResultのバイト列を格納します。 authenticatorData-
新しい
ArrayBufferを global の %ArrayBuffer% を用いて作成し、assertionCreationData.authenticatorDataResultのバイト列を格納します。 signature-
新しい
ArrayBufferを global の %ArrayBuffer% を用いて作成し、assertionCreationData.signatureResultのバイト列を格納します。 userHandle-
もし
assertionCreationData.userHandleResultが null であれば、このフィールドを null に設定します。そうでなければ新しいArrayBufferを global の %ArrayBuffer% を用いて作成し、assertionCreationData.userHandleResultのバイト列を格納します。
[[clientExtensionsResults]]-
新しい
ArrayBufferを global の %ArrayBuffer% を用いて作成し、assertionCreationData.clientExtensionResultsのバイト列を格納します。
-
For each を用いて残りの issuedRequests 内の各 authenticator に対し authenticatorCancel を呼び出し、remove します。
-
返り値として pubKeyCred を返し、アルゴリズムを終了します。
-
-
"
NotAllowedError"DOMExceptionをスローします。
5.1.4.2. 認証器への資格情報要求の発行
この [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
のサブアルゴリズムは、与えられた credential を特定の authenticator(認証器) から要求するために必要な、
UI コンテキストに依存しない具体的な手順を包含します。これは、与えられた PublicKeyCredentialRequestOptions
を使用します。呼び出しは、現在の 認証儀式 がどのような ユーザー仲介
の対象になっているかに応じて、さまざまな箇所から行われます(例: conditional
仲介の場合など)。
このアルゴリズムは次の引数を受け取ります:
authenticator-
クライアントプラットフォーム 固有のハンドルで、当該 認証器 を識別します。これは現在この クライアントプラットフォーム 上で利用可能なものです。
savedCredentialIds-
map で、各 authenticator → credential ID を含みます。この引数はこのアルゴリズム内で修正されます。
pkOptions-
この引数は
PublicKeyCredentialRequestOptionsオブジェクトで、発見したい public key credential の望ましい属性を指定します。 rpId-
リクエストの RP ID です。
clientDataHash-
clientDataJSONで表されるシリアライズされたクライアントデータのハッシュです。
authenticatorExtensions-
map で、拡張識別子 をキーに、base64url エンコーディング された client extension processing の出力(authenticator extensions 用)を保持します。
このアルゴリズムは、client が当該
authenticator が要求を処理できないと判断した場合は false を返し、要求が正常に発行された場合は true を返します。
認証器への資格情報要求の発行 の手順は次のとおりです:
-
もし
pkOptions.がuserVerificationrequiredに設定されていて、当該 authenticator が user verification を実行できない場合、falseを返します。 -
userVerification を、assertion に対する有効な user verification 要求(Boolean)とします。もし
pkOptions.が指定されている場合:userVerification- が
requiredに設定されている場合 -
userVerification を
trueにします。 - が
preferredに設定されている場合 -
もし当該 authenticator が user verification を実行できるなら userVerification を
trueにし、できないならfalseにします。 - が
discouragedに設定されている場合 -
userVerification を
falseにします。
- が
-
もし
pkOptions.allowCredentials- 空でない
-
-
allowCredentialDescriptorList を新しい list とします。
-
クライアントプラットフォーム 固有の手順を実行して、もし存在すれば
pkOptions.に記載されたどの public key credential がこの authenticator に bound されているかを、rpId、allowCredentialspkOptions...、およびidpkOptions...と照合することで判断します。結果として得られたフィルタ済みリストを allowCredentialDescriptorList に設定します。type -
もし allowCredentialDescriptorList が 空 であれば、
falseを返します。 -
distinctTransports を新しい ordered set とします。
-
もし allowCredentialDescriptorList がちょうど一つの値を持つなら、
savedCredentialIds[authenticator]をallowCredentialDescriptorList[0].idの値に設定します(詳細は ここ と § 6.3.3 The authenticatorGetAssertion Operation を参照してください)。 -
For each credential descriptor C in allowCredentialDescriptorList について、append を用いて
C.の各値(もしあれば)を distinctTransports に追加します。transportsNote: ordered set の特性により、ここで集計されるのは当該 authenticator に対する重複しない
transportsのみです。 -
もし distinctTransports が
- 空でない
-
クライアントは distinctTransports から 1 つの transport 値を選択します。選択には、当該 authenticator に対してどのトランスポートが適切かというローカルの設定知識を考慮することができます。
次に、選択した transport を用いて、authenticatorGetAssertion 操作を当該 authenticator に対して呼び出します。パラメータは rpId, clientDataHash, allowCredentialDescriptorList, userVerification, および authenticatorExtensions です。
- 空である
-
ローカルの設定知識に基づき当該 authenticator に適切なトランスポートを判断し、authenticatorGetAssertion 操作を authenticator に対して呼び出します。パラメータは rpId, clientDataHash, allowCredentialDescriptorList, userVerification, および authenticatorExtensions です。
-
- 空である
-
ローカルの設定知識を用いて当該 authenticator に適したトランスポートを決定し、authenticatorGetAssertion 操作を当該 authenticator に対して呼び出します。パラメータは rpId, clientDataHash, userVerification, および authenticatorExtensions です。
Note: この場合、Relying Party は受け入れ可能な資格情報ディスクリプタのリストを提供していません。したがって、認証器には rpId によって識別されるスコープ内の、認証器が保有する任意の資格情報を使用するよう求められます。
-
trueを返します。
5.1.4.3. Get リクエストの例外
この節は規範的ではありません。
WebAuthn Relying
Parties は navigator.credentials.get()
の呼び出しからいくつかの例外に遭遇することがあります。これらの例外は複数の原因を持つことがあり、WebAuthn を使用する側が文脈に基づいて実際の理由を推測する必要がある場合があります。
Note: 本仕様の外で定義されたものを含め、任意の WebAuthn Extensions の処理中に発生し得る例外はここには列挙していません。
次の DOMException
例外が発生する可能性があります:
AbortError-
儀式が
AbortControllerによってキャンセルされました。§ 5.6 Abort Operations with AbortSignal と § 1.3.4 Aborting Authentication Operations を参照してください。 SecurityError-
effective domain が 有効なドメイン でなかった、または
が effective domain と等しくないか registrable domain suffix ではなかった場合です。後者の場合、client が related origin requests をサポートしていないか、related origins validation procedure が失敗しました。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 object が same-origin with its ancestors の場合に限り
trueです。
このメソッドが呼び出されたとき、ユーザーエージェントは次のアルゴリズムを実行しなければなりません:
-
"
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
Note: このメソッドを、browsing context から呼び出し、その Web Authentication API が allowed to use のアルゴリズムにより "disabled" と評価される(つまり permissions policy によって無効化されている)場合、Promise
は名前が "NotAllowedError"
の DOMException
で拒否されます。詳細は § 5.9 Permissions Policy integration を参照してください。
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
Keys は PublicKeyCredentialClientCapabilities
で昇順の辞書式順にソートされている必要があります。キーの集合には ClientCapability 列挙型の列挙値を含めるべきですが、クライアントは必要に応じてキーを省略できます(詳細は
§ 14.5.4 Disclosing Client Capabilities を参照)。
ある能力の値が true の場合、その機能は現在クライアントによってサポートされていることが知られます。値が false
の場合、その機能は現在クライアントでサポートされていないことが知られます。ある能力がキーとして存在しない場合、その機能の可用性は不明です。
キーの集合には、クライアントが実装している各 拡張 に対しても、接頭辞 "extension:"
を拡張識別子に付けた文字列をキーとして含めるべきです。実装された各拡張の関連値は true とすることが推奨されます。もし
getClientCapabilities() がクライアントでサポートされているが、ある拡張が true にマップされていない場合、Relying Party
はその拡張に対するクライアント側の処理が行われない可能性や、拡張が認証器に転送されない可能性を想定してよいです。
注: たとえ拡張が true にマップされていても、特定の操作で使用する認証器がその拡張をサポートしていない場合があるため、Relying Parties は認証器側の処理が必ず行われると仮定してはなりません。
Note: このメソッドを、browsing context から呼び出し、その Web Authentication API が disabled と評価される場合、Promise は名前が "NotAllowedError"
の DOMException
で拒否されます。詳細は § 5.9 Permissions Policy integration を参照してください。
5.1.8.
登録(Registration)儀式オプションの逆シリアライズ - PublicKeyCredential の
parseCreationOptionsFromJSON() メソッド
WebAuthn
Relying Parties はこのメソッドを使用して、JSON 型
表現の navigator.credentials.create()
のオプションを、PublicKeyCredentialCreationOptions
に変換します。
呼び出されると、client は options
引数を、新しいが同一構造の 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 = "none";attestation 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
に変換します。
呼び出されると、client は options
引数を、新しいが同一構造の 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 = "preferred";userVerification 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 actions は signal 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
を検証することを可能にします。アルゴリズムは DOMString
の rpId を入力として取り、検証が失敗した場合は拒否される Promise を返します。手順は以下の通りです:
-
effectiveDomain を relevant settings object の origin の effective domain とします。もし effectiveDomain が 有効なドメイン でない場合、"
SecurityError"DOMExceptionで拒否された Promise を返します。 -
もし rpId が effectiveDomain の registrable domain suffix であるか等しい場合は、未定義値で解決された Promise を返します。
-
もしクライアントが related origin requests をサポートしていないなら、"
SecurityError"DOMExceptionで拒否された Promise を返します。 -
p を新しい Promise とします。
-
次の手順を 並列に 実行します:
-
もし related origins validation procedure を callerOrigin と rpId で実行した結果が
trueであれば、p を解決します。 -
それ以外の場合、p を "
SecurityError"DOMExceptionで拒否します。
-
-
p を返します。
5.1.10.2. signalUnknownCredential(options)
signalUnknownCredential
メソッドは、ある credential id が WebAuthn
Relying Party によって認識されなかった(例: ユーザーが削除したため)ことを通知します。signalAllAcceptedCredentials(options)
と異なり、このメソッドは受け入れられる全ての credential
IDs の完全なリストを渡す必要はなく、認証されていない呼び出し元へのプライバシー漏洩を回避します(詳細は § 14.6.3 Privacy leak via credential IDs を参照)。
signalUnknownCredential(options)
が呼び出されると、client は次の手順を実行します:
-
もし base64url デコード の結果が
options.に対してエラーであれば、TypeError の拒否された Promise を返します。credentialId -
p を、非同期 RP ID 検証アルゴリズム を
options.で実行した結果とします。rpId -
-
現在この クライアントプラットフォーム 上で利用可能なすべての authenticator に対して、unknownCredentialId authenticator action を options を入力として呼び出します。
-
-
p を返します。
unknownCredentialId authenticator action は UnknownCredentialOptions
options を取り、次のように実行されます:
-
For each 当該 public key credential source credential が当該 authenticator の credential map 内にある場合、次を行います:
-
もし credential の rpId が
options.と等しく、かつ credential の id が base64url デコード したrpIdoptions.と等しい場合、credential を credentials map から削除するか、将来の 認証儀式 から隠すために認証器固有の手順を用いてください。credentialId
-
ユーザーが 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 は次の手順を実行します:
-
もし base64url デコード の結果が
options.に対してエラーであれば、TypeError の拒否された Promise を返します。userId -
For each を用いて
options.内の各 credentialId について次を行います:allAcceptedCredentialIds-
もし base64url デコード の結果が当該 credentialId に対してエラーであれば、TypeError の拒否された Promise を返します。
-
-
p を、非同期 RP ID 検証アルゴリズム を
options.で実行した結果とします。rpId -
-
現在この クライアントプラットフォーム 上で利用可能なすべての authenticator に対して、allAcceptedCredentialIds authenticator action を options を入力として呼び出します。
-
-
p を返します。
allAcceptedCredentialIds authenticator actions は AllAcceptedCredentialsOptions
options を取り、次のように実行されます:
-
userId を base64url デコード した
options.の結果とします。userId -
アサーション: userId はエラーではない。
-
credential を
credentials map[options.とします。rpId, userId] -
もし credential が存在しない場合は、この手順を中止します。
-
もし
options.が 含まない なら、その credential の id を base64url エンコード したものが含まれていない場合、credential を credentials map から削除するか、認証器固有の手順で将来の認証儀式から非表示にします。allAcceptedCredentialIds -
そうでなければ、もし当該 credential が認証器固有の手順により非表示にされていたなら、その操作を元に戻して当該 credential が将来の認証儀式に現れるようにします。
ユーザーは、base64url エンコードすると aa と bb になる 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
メソッドはユーザーの現在の name
と displayName
を通知します。
signalCurrentUserDetails(options)
が呼び出されると、client は次の手順を実行します:
-
もし base64url デコード の結果が
options.に対してエラーであれば、TypeError の拒否された Promise を返します。userId -
p を、非同期 RP ID 検証アルゴリズム を
options.で実行した結果とします。rpId -
-
現在この クライアントプラットフォーム 上で利用可能なすべての authenticator に対して、currentUserDetails authenticator action を options を入力として呼び出します。
-
-
p を返します。
currentUserDetails authenticator action は CurrentUserDetailsOptions
options を取り、次のように実行されます:
-
userId を base64url デコード した
options.の結果とします。userId -
アサーション: userId はエラーではない。
-
credential を
credentials map[options.とします。rpId, userId] -
もし credential が存在しない場合は、この手順を中止します。
-
credential の otherUI を
options.およびnameoptions.に合わせて更新します。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
の中にあります(AuthenticatorAttestationResponse
の attestationObject
を参照)。リライング・パーティ
がアテステーションを利用したい場合、アテステーションオブジェクトを解析してクレデンシャル公開鍵を取得する作業を行う義務があります。なぜなら、その公開鍵が認証器によって署名されたコピーだからです。しかし、多くの有効な
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 でない値を返せる必要があります:
-
-257 (RS256)。
-
-8 (EdDSA)、ここで crv は 6(Ed25519)であること。
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のメンバーであるべきですが、クライアントプラットフォームは未知の値を無視する必要があり、未知のPublicKeyCredentialParametersをtypeが未知の場合は無視します。 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, 型は PublicKeyCredentialRpEntity-
このメンバは要求を行っているリライング・パーティの名前と識別子を含みます。
その値の
nameメンバは必須です。詳細は § 5.4.1 Public Key Entity Description (辞書 PublicKeyCredentialEntity) を参照してください。その値の
idメンバは、クレデンシャルがスコープされるべき RP ID を指定します。省略された場合、その値はCredentialsContainerオブジェクトの relevant settings object の origin の effective domain になります。詳細は § 5.4.2 Relying Party Parameters for Credential Generation (辞書 PublicKeyCredentialRpEntity) を参照してください。 user, 型は PublicKeyCredentialUserEntity-
このメンバは登録を行うユーザーアカウントの名前と識別子を含みます。
その値の
name、displayNameおよびidのメンバは必須です。idは将来の認証式においてuserHandleとして返される可能性があり、同じとrp.idが同じである場合に既存の発見可能なクレデンシャルを上書きするために使用されます。user.idnameとdisplayNameは将来の認証式でユーザーがクレデンシャルを選択するのを助けるために認証器やクライアントによって使用されることがありますが、それらは将来の認証式の結果としてリライング・パーティに返されることはありません。詳細は § 5.4.1 Public Key Entity Description (辞書 PublicKeyCredentialEntity) と § 5.4.3 ユーザーアカウントのパラメータ(辞書 PublicKeyCredentialUserEntity) を参照してください。
challenge, 型は BufferSource-
このメンバは、認証器が新しく作成されるクレデンシャルのためのアテステーションオブジェクトを生成する際に署名するチャレンジを指定します。セキュリティ考慮事項については § 13.4.3 暗号学的チャレンジ を参照してください。
pubKeyCredParams, 型は sequence<PublicKeyCredentialParameters>-
このメンバはリライング・パーティがサポートする鍵の種類と署名アルゴリズムの一覧を最も好ましい順から最も好ましくない順に並べたものを示します。重複は許容されますが実質的に無視されます。クライアントと認証器は可能な限り最も好ましい型のクレデンシャルを作成するよう最善を尽くします。リスト内のどの型も作成できない場合、
create()操作は失敗します。リライング・パーティ が幅広い認証器をサポートしたい場合、少なくとも次の
COSEAlgorithmIdentifier値を含めるべきです:-
-8 (Ed25519)
-
-7 (ES256)
-
-257 (RS256)
追加の署名アルゴリズムは必要に応じて含めることができます。
-
timeout, 型は unsigned long-
この任意のメンバは、リライング・パーティが呼び出しの完了を待つことを許容する時間(ミリ秒単位)を指定します。これはヒントとして扱われ、クライアントによって上書きされる可能性があります。
excludeCredentials, 型は sequence<PublicKeyCredentialDescriptor>, デフォルトは[]-
リライング・パーティはこの任意のメンバを使用して、このユーザーアカウント(値は
user.idで識別される)にマッピングされている既存のクレデンシャルを列挙することを推奨します。これにより、新しいクレデンシャルがすでにこのユーザーアカウントにマッピングされたクレデンシャルを既に含んでいる認証器に作成されないようにします。もしそうであれば、クライアントは代わりにユーザーに別の認証器を使用するよう案内するか、それが失敗した場合はエラーを返すことが要求されます。 authenticatorSelection, 型は AuthenticatorSelectionCriteria-
リライング・パーティはこの任意のメンバを使用して、create() 操作に参加するために認証器が満たすべき機能や設定を指定することができます。詳細は § 5.4.4 Authenticator Selection Criteria (辞書 AuthenticatorSelectionCriteria) を参照してください。
hints, 型は sequence<DOMString>, デフォルトは[]-
この任意のメンバは、ユーザーエージェントがユーザーとやり取りする際のガイドとして
PublicKeyCredentialHintからのゼロ個以上の要素を含みます。要素は列挙型から取られますが型はDOMStringである点に注意してください。詳細は § 2.1.1 列挙型を DOMString 型として扱う を参照してください。 attestation, 型は DOMString、デフォルトは"none"-
リライング・パーティはこの任意のメンバを使用してアテステーション伝達に関する好みを指定することができます。値は
AttestationConveyancePreferenceのメンバーであるべきです。クライアントプラットフォームは未知の値を無視し、そのメンバが存在しないかのように扱わなければなりません。デフォルト値は
noneです。 attestationFormats, 型は sequence<DOMString>, デフォルトは[]-
リライング・パーティはこの任意のメンバを使用して、認証器が使用するアテステーションステートメント形式についての好みを指定することができます。値は IANA の "WebAuthn Attestation Statement Format Identifiers" レジストリから取られるべきです [IANA-WebAuthn-Registries]。値は最も好ましい順に並べられ、重複は許容されますが実質的に無視されます。このパラメータは助言的であり、認証器は列挙されていないアテステーション形式を使用することがあります。
デフォルト値は空のリストで、好みがないことを示します。
extensions, 型は AuthenticationExtensionsClientInputs-
リライング・パーティはこの任意のメンバを使用して、クライアントと認証器に追加処理を要求するクライアント拡張入力(client extension inputs)を提供することができます。例えば、リライング・パーティは作成されたクレデンシャルに関する追加情報をクライアントに返すよう要求することができます。
拡張フレームワークは § 9 WebAuthn Extensions で定義されています。いくつかの拡張は § 10 定義済み拡張 で定義されています。登録済みの WebAuthn 拡張の最新の一覧については IANA の "WebAuthn Extension Identifiers" レジストリ [IANA-WebAuthn-Registries] を参照してください。
5.4.1.
公開鍵エンティティの説明(辞書 PublicKeyCredentialEntity)
PublicKeyCredentialEntity
辞書は、ユーザーアカウントまたは WebAuthn
リライングパーティを記述します。これは、公開鍵クレデンシャルが紐付けられている、または スコープされるものです。
dictionary PublicKeyCredentialEntity {required DOMString name ; };
name, 型 DOMString-
このエンティティの人にわかりやすい名前です。
PublicKeyCredentialEntityが何を表すかによって機能が変わります。-
【非推奨】
PublicKeyCredentialRpEntityで継承されるときは、人にわかりやすい リライングパーティの識別子になり、表示専用です。例:「ACME株式会社」「ワンダフルウィジェット株式会社」「ОАО Примертех」など。このメンバーは、ほとんどのクライアントが表示しないため非推奨ですが、後方互換性のため必須メンバーです。リライングパーティは、安全なデフォルトとしてRP IDと同じ値にすることができます。
-
リライングパーティは、[RFC8266] Section 2.3(PRECIS FreeformClassのニックネームプロファイル)の要件に従って、
nameの値の設定・表示時に厳格化を行うべきです([RFC8264]も参照)。 -
この文字列には言語や方向のメタデータを含めることができます。リライングパーティは、RP ID以外の値を設定する場合、この情報を付与することを推奨します。 言語・方向メタデータについては§ 6.4.2 言語と方向のエンコーディングを参照してください。
-
クライアントも、[RFC8266] Section 2.3のニックネームプロファイル([RFC8264])要件に従って
nameの値を表示する前や authenticatorMakeCredential オペレーションのパラメータとして値を含める前に厳格化すべきです。
-
-
PublicKeyCredentialUserEntityで継承される場合、人にわかりやすい ユーザーアカウントの識別子になります。この識別子は、クライアントがユーザーに このクレデンシャルがどのユーザーアカウントに結びついているか分かりやすく提示するために使われます。例:"alexm"、"+14255551234"、"alex.mueller@example.com"、"alex.mueller@example.com (prod-env)"、"alex.mueller@example.com (ОАО Примертех)" など。
-
リライングパーティはこの値をユーザーに選ばせてもよいです。 また、[RFC8265] Section 3.4.3(PRECIS IdentifierClassのUsernameCasePreservedプロファイル)の要件に従い
name値を設定・表示する際に厳格化を行うべきです([RFC8264]参照)。 -
この文字列は言語・方向メタデータを含めても構いません。リライングパーティはこの情報を付与することを勧めます。エンコーディング方法は§ 6.4.2 言語と方向のエンコーディングを参照してください。
-
クライアントもまた、[RFC8265] Section 3.4.3およびPRECIS IdentifierClassのUsernameCasePreservedプロファイル([RFC8264])に従い
nameの値を 表示やauthenticatorMakeCredentialのパラメータに含める前に厳格化すべきです。
-
クライアントやクライアントプラットフォーム、認証器が
nameの値を表示するときは、必ずUI要素で明確な表示範囲を設け、他の要素へのはみ出しを防ぐようにしてください([css-overflow-3])。nameメンバーの値を保存する際は、§ 6.4.1 文字列の切り詰めで述べるように、64バイト以上の制限で切り詰めても構いません。 -
5.4.2.
クレデンシャル生成時のリライングパーティのパラメーター(辞書 PublicKeyCredentialRpEntity)
PublicKeyCredentialRpEntity
辞書は、新しいクレデンシャル作成時に追加のリライングパーティ属性を提供するために使われます。
dictionary PublicKeyCredentialRpEntity :PublicKeyCredentialEntity {DOMString id ; };
5.4.3.
クレデンシャル生成時のユーザーアカウントパラメーター(辞書 PublicKeyCredentialUserEntity)
PublicKeyCredentialUserEntity
辞書は、新しいユーザーアカウントの属性を追加で指定するために使われます。
dictionary PublicKeyCredentialUserEntity :PublicKeyCredentialEntity {required BufferSource id ;required DOMString displayName ; };
id, 型 BufferSource-
ユーザーハンドルを示します。これはユーザーアカウントの識別子です。 ユーザーハンドルは最大64バイトの 不透明なバイト列で、 ユーザーに表示するものではありません。
安全な運用のために、認証と認可の判定は必ずこの
idメンバーに基づいて行い、displayNameやnameは使わないでください。[RFC8266] Section 6.1 を参照してください。ユーザーハンドルには、ユーザーに関する個人情報(ユーザー名やメールアドレスなど)を含めてはいけません。 詳しくは§ 14.6.1 ユーザーハンドル内容を参照してください。ユーザーハンドルは空であってはなりません。
ユーザーハンドルは 異なるユーザーアカウント間で一定であってはなりません。 たとえ非発見型クレデンシャルでも、認証器によっては 常に発見型クレデンシャルを生成する場合があります。 したがって固定のユーザーハンドルでは、 1つの認証器を1つのユーザーアカウントでしか リライングパーティで利用できなくなることがあります。
displayName, 型 DOMString-
人にわかりやすい ユーザーアカウントの名前で、表示専用を目的とします。リライングパーティは、ユーザー自身にこの値を選択させるべきであり、必要以上の制限を加えないようにしてください。適切な、人にとってわかりやすい名前がなければ空文字列としてください。
例: "Alex Müller", "Alex Müller (ACME Co.)", "田中倫"
-
リライングパーティは、[RFC8266] Section 2.3(ニックネームプロファイル)および [RFC8264] に従い、
displayName値が空でない場合、設定時・表示時に厳格化すべきです。 -
この文字列は言語や方向のメタデータを含めることができます。 リライングパーティはこの情報を提示することを推奨します。エンコーディングは§ 6.4.2 言語と方向のエンコーディングを参照してください。
-
クライアントもまた、[RFC8266] Section 2.3(PRECIS FreeformClassのニックネームプロファイル)と [RFC8264] に従い、
displayName値を 表示またはauthenticatorMakeCredentialオペレーションのパラメータとして組み込む前に、必ず厳格化すべきです。
クライアントやクライアントプラットフォーム、認証器が
displayNameの値を表示する際は、必ずUI要素で明確な範囲を設け、他の要素にはみ出さないようにしてください([css-overflow-3])。displayNameメンバーの値を保存する際も、§ 6.4.1 文字列の切り詰めで述べる64バイト以上の制限で切り詰めても構いません。 -
5.4.4.
認証器選択基準(辞書 AuthenticatorSelectionCriteria)
WebAuthn
リライングパーティは、AuthenticatorSelectionCriteria辞書を利用して、認証器の属性に対する要件を指定することができます。
dictionary AuthenticatorSelectionCriteria {DOMString authenticatorAttachment ;DOMString residentKey ;boolean requireResidentKey =false ;DOMString userVerification = "preferred"; };
authenticatorAttachment, 型 DOMString-
このメンバーが存在する場合、利用可能な認証器は、指定された認証器アタッチメントモダリティで付属されているものだけに絞り込まれます(§ 6.2.1 認証器アタッチメントモダリティも参照)。 このメンバーがない場合、どのアタッチメントモダリティでも許可されます。 値は
AuthenticatorAttachmentのメンバーであるべきですが、クライアントプラットフォームは未知の値は無視し、 メンバーが存在しないものとして扱います。また、
authenticatorAttachmentメンバー(PublicKeyCredential内)で、 実際にどの認証器アタッチメントモダリティが 成功時に使われたかを知ることができます。create()やget()操作も参照してください。 residentKey, 型 DOMString-
リライングパーティがクライアントサイド発見型クレデンシャルの作成をどの程度望むか指定します。 歴史的経緯により「resident(レジデント)」という用語が残っています。値は
ResidentKeyRequirementのメンバーであるべきですが、クライアントプラットフォームは未知の値を無視し、存在しないものとして扱います。値がない場合、requireResidentKeyがtrueならrequired、falseもしくは省略ならdiscouragedになります。ResidentKeyRequirementの 各値と意味についてはそちらを参照してください。 requireResidentKey, 型 boolean(既定値false)-
このメンバーはWebAuthn Level 1との後方互換のため保持されており、歴史的理由で「resident」の語を使っています。発見型クレデンシャル用です。リライングパーティは、
residentKeyがrequiredの場合のみtrueとするべきです。 userVerification, 型 DOMString(既定値"preferred")-
このメンバーは、リライングパーティが
create()操作でユーザー検証にどんな要件を持つか指定します。 値はUserVerificationRequirementのメンバーであるべきですが、クライアントプラットフォームは未知の値は無視し、存在しないものとして扱います。UserVerificationRequirementの説明はそちらを参照してください。
5.4.5. 認証器アタッチメント列挙型(enum AuthenticatorAttachment)
この列挙型の値は、認証器のアタッチメント方式を表します。リライングパーティはクレデンシャル生成時(navigator.credentials.create())で
希望する認証器アタッチメント方式を指定し、
クライアントは実際にどの認証器アタッチメント方式で
登録や認証式が完了したか報告します。
enum AuthenticatorAttachment {"platform" ,"cross-platform" };
注:AuthenticatorAttachment
列挙型はあえて参照しない設計になっています。§ 2.1.1
DOMString型列挙についてを参照してください。
platform-
この値はプラットフォームアタッチメントを示します。
cross-platform-
この値はクロスプラットフォームアタッチメントを示します。
注:認証器アタッチメント方式の選択オプションは
[[Create]](origin, options, sameOriginWithAncestors)
操作にのみ存在し、
例えばユーザーがローミングクレデンシャルを発行し別のクライアントデバイスで認証できるようにしたり、
あるいは特定のクライアントデバイス
に簡単に再認証できるようにプラットフォームクレデンシャル
を登録したりできます。[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
操作には認証器アタッチメント方式の選択肢はありません。クライアントとユーザーは、その時点で利用可能かつ便利な
クレデンシャルを使うことになり、
allowCredentials
オプションの制約を受けます。
5.4.6.
レジデントキー要件列挙型(enum ResidentKeyRequirement)
enum ResidentKeyRequirement {"discouraged" ,"preferred" ,"required" };
注:ResidentKeyRequirement
列挙型はあえて参照しない設計になっています。§ 2.1.1
DOMString型列挙についてを参照してください。
この列挙型の値は、リライングパーティがクライアントサイド発見型クレデンシャル(旧称レジデントクレデンシャル、レジデントキー)に対して要求する内容を示します:
discouraged-
リライングパーティは サーバサイドクレデンシャルの作成を好みますが、クライアントサイド発見型クレデンシャルも許可します。 クライアントと認証器は可能であれば サーバサイドクレデンシャルを作成すべきです。
注: リライングパーティは、作成されるクレデンシャルがサーバサイドクレデンシャルであることを強制できません。また、Credential Properties Extensionの
rkプロパティが値を返さない場合もあります。 そのため、特定のユーザーハンドルで2つ目のクレデンシャルを作成したとき、最初のものが上書きされるかどうかリライングパーティは分からない場合があります。 preferred-
リライングパーティは クライアントサイド発見型クレデンシャルの作成を強く望みますが、サーバサイドクレデンシャルも許可します。 クライアントと認証器は できるだけ発見型クレデンシャルを作成すべきです。 例えば、クライアントは 発見型クレデンシャルを作成するために必要があればユーザー検証の設定を案内するなど、この設定は
userVerificationの値よりも優先されます。 required-
リライングパーティ はクライアントサイド発見型クレデンシャルを必須とします。 クライアントは クライアントサイド発見型クレデンシャルが作成できない場合には エラーを返さなければなりません。
注:リライングパーティは、Credential
Properties Extensionのresident key credential
property
を使って、認証器がクライアントサイド発見型クレデンシャルを作成したかを確認できます。
これは discouraged
または preferred
が
options.で
指定された場合に有用です。これらのケースでは認証器がクライアントサイド発見型クレデンシャルもサーバサイドクレデンシャルも作成できるためです。
authenticatorSelection.residentKey
5.4.7.
アテステーション伝達優先度列挙型(enum AttestationConveyancePreference)
WebAuthnリライングパーティは、資格情報生成時のアテステーション伝達に関する希望を
AttestationConveyancePreference
で指定できます。
enum AttestationConveyancePreference {"none" ,"indirect" ,"direct" ,"enterprise" };
注:AttestationConveyancePreference
列挙型は意図的に参照されません。§ 2.1.1 列挙型のDOMString型としての扱いを参照してください。
none-
リライングパーティは 認証器のアテステーションに関心がありません。たとえば、ユーザーの同意を得て識別情報をリライングパーティに送信する事態や、 アテステーションCAや匿名化CAへの往復通信を回避したい場合などです。 認証器がアテステーション文を生成し、それが自己アテステーションでない場合、 クライアントはそれをNoneのアテステーション文に置き換えます。
これがデフォルトであり、未知の値もこの動作にフォールバックします。
indirect-
リライングパーティは 検証可能なアテステーション文の受取を希望しますが、 どのようにそのアテステーション文を取得するかはクライアントに任せます。 クライアントはユーザーのプライバシーを守る、もしくは異種エコシステムでリライングパーティのアテステーション検証を補助するため、 認証器が生成したアテステーション文を匿名化CAによるものに置き換えても構いません。
注:この場合、リライングパーティが必ずしも検証可能なアテステーション文を得られる保証はありません。 たとえば認証器が自己アテステーションを行う場合や、 クライアントがアテステーション文をそのまま通す場合などです。
directenterprise-
リライングパーティが エンタープライズアテステーション(認証器を一意に識別可能な情報を含むアテステーション文)の受取を希望する場合に指定します。 この用途は組織内で認証器を特定した登録を行いたいなど、企業内のコントロールされた環境を想定しています。 ユーザーエージェントは、要求されたRP ID 用に明示的に許可されている場合を除き、このアテステーションを提供してはなりません。
許可されている場合、ユーザーエージェントは(認証器呼び出し時に)認証器へエンタープライズアテステーション要求を伝え、その結果として得られたAAGUIDおよびアテステーション文を変更せずリライングパーティへ送るべきです。
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, 型 BufferSource-
このメンバーは、認証器が認証アサーションを生成する際に他のデータとともに署名するチャレンジを指定します。詳細およびセキュリティ上の考慮は§ 13.4.3 暗号チャレンジを参照してください。
timeout, 型 unsigned long-
この省略可能なメンバーは、リライングパーティが 完了まで待つ意思のある時間(ミリ秒単位)を指定します。 この値はヒントとして扱われ、クライアント側で上書きされることがあります。
rpId, 型 DOMString-
この省略可能なメンバーは、リライングパーティが主張するRP IDを指定します。 クライアントは、リライングパーティのオリジンが このRP IDのスコープに一致することを必ず検証しなければなりません。 認証器は、 この
rpIdが資格情報ソースのrpIdと完全一致することを必ず検証しなければなりません。省略された場合、値は
CredentialsContainerオブジェクトの関連設定オブジェクトのオリジンの有効ドメインになります。 allowCredentials, 型 sequence<PublicKeyCredentialDescriptor>, 既定値[]-
この省略可能なメンバーは、クライアントがこの認証式に利用可能な認証器を見つけるために使います。 使い方は2通りです:
-
認証対象のユーザーアカウントが既に特定されている場合(例:ユーザーがユーザー名を入力した場合)は、 リライングパーティ はユーザーアカウント内の資格情報レコードの記述子をリストすべきです。 これは通常、ユーザーアカウント内の 全資格情報レコードを含むべきです。
リスト項目には、可能な限り
transportsを指定してください。 これによりクライアントは状況に応じたUX改善が可能になります。 また、リライングパーティはユーザー検証を要求する場合でもリストをフィルタする必要はありません。userVerificationがrequiredの場合、クライアント側で自動的に非対象クレデンシャルが無視されます。プライバシー観点では§ 14.6.3 資格情報IDによる情報漏洩も参照してください。
-
認証対象のユーザーアカウントが特定されていない場合、 リライングパーティはこのメンバーを空もしくは省略しても構いません。 この場合、発見型クレデンシャルのみがこの認証式で利用されます。 ユーザーアカウントは 結果の
userHandleで特定されても構いません。 利用可能な認証器が、リライングパーティに スコープされた複数の発見型クレデンシャルを含んでいる場合、 クレデンシャルの選択肢がクライアントプラットフォームまたは認証器によりユーザーに提示されます(手順7と § 6.3.3 authenticatorGetAssertion操作を参照)。
空でない場合、リスト内のどのクレデンシャルも利用できなければクライアントはエラーを返さなければなりません。
優先度の高い順に並び、リストの最初が最も優先、最後が最も低優先です。
-
userVerification, 型 DOMString、既定値"preferred"-
この省略可能なメンバーは
get()操作におけるリライングパーティのユーザー検証要件を指定します。 値はUserVerificationRequirement列挙型のメンバーであるべきですが、クライアントプラットフォームは未知の値を無視し、メンバーが存在しないかのように扱います。利用可能な認証器はこの要件を満たすものだけに絞り込まれます。値や意味については
UserVerificationRequirementを参照してください。 hints, 型 sequence<DOMString>、既定値[]-
この省略可能なメンバーは、
PublicKeyCredentialHintから一つ以上の要素を持ち、ユーザーエージェントがユーザーとやりとりする際の参考になります。これらは型としてはDOMStringですが、列挙型から取得されます。§ 2.1.1 列挙型のDOMString型としての扱い を参照してください。 extensions, 型 AuthenticationExtensionsClientInputs-
リライングパーティは この省略可能なメンバーでクライアント拡張入力を指定し、クライアントや認証器に追加処理を要求できます。
拡張機構は§ 9 WebAuthn拡張に定義されており、一部の拡張は§ 10 定義済み拡張にあります。登録済み拡張の最新リストはIANA「WebAuthn Extension Identifiers」レジストリ[IANA-WebAuthn-Registries]や[RFC8809]も参照してください。
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は、
AbortController
のAbortSignal
がabortされたら即座に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)
も同様です。
可視性およびフォーカス状態によって
Window
オブジェクトの関連づけるDocumentがフォーカスを失う場合、
[[Create]](origin, options, sameOriginWithAncestors)
および
[[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 }
CDDL型
AuthenticationExtensionsAuthenticatorInputsは、0個以上のWebAuthn拡張機能の認証器拡張入力値を含むCBORマップを定義します。
拡張機能は§ 9.3 拡張リクエストパラメーターで説明されているようにメンバーを追加できます。
この型はRelying Partyには公開されず、クライアントおよび認証器によって使用されます。
5.7.4. 認証拡張 認証器出力(CDDL型
AuthenticationExtensionsAuthenticatorOutputs)
AuthenticationExtensionsAuthenticatorOutputs = {
* $$extensionOutput
} .within { * tstr => any }
CDDL型
AuthenticationExtensionsAuthenticatorOutputsは、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]で定義された構文で含みます。 呼び出し元が先祖と同一オリジンでない場合、すなわち
crossOriginがtrueの場合のみ設定されます。 - [予約済] 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-
statusがpresentである場合、このメンバーは必須です。また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エンコーディング、バイト列の連結(固定テンプレートへの書き込みで実装可)、単純な条件分岐のみが必要です(入力値がエスケープを要しないと仮定)。
シリアライズアルゴリズムは空の部分結果バイト列から始め、順にバイト文字列を追加して最終結果を得ます。
-
resultを空のバイト列とする。
-
resultに0x7b2274797065223a(
{"type":)を追加する。 -
CCDToString(
type) をresultへ追加する。 -
resultに0x2c226368616c6c656e6765223a(
,"challenge":)を追加する。 -
CCDToString(
challenge) をresultへ追加する。 -
resultに0x2c226f726967696e223a(
,"origin":)を追加する。 -
CCDToString(
origin) をresultへ追加する。 -
resultに0x2c2263726f73734f726967696e223a(
,"crossOrigin":)を追加する。 -
もし
crossOriginが存在しないか、またはfalseの場合:-
0x66616c7365(
false)をresultへ追加する。
-
-
そうでなければ:
-
0x74727565(
true)をresultへ追加する。
-
-
もし
topOriginが存在する場合:-
0x2c22746f704f726967696e223a(
,"topOrigin":)をresultへ追加する。 -
CCDToString(
topOrigin) をresultへ追加する。
-
-
CollectedClientDataの一時コピーを作成し、type、challenge、origin、crossOrigin(存在すれば)、topOrigin(存在すれば)を削除する。 -
一時コピーにフィールドが一つも残っていない場合:
-
0x7d(
})をresultへ追加する。
-
-
そうでなければ:
-
一時コピーをJSONとしてバイト列にシリアライズし、バイト列remainderを得る。
-
0x2c(
,)をresultへ追加する。 -
remainderの先頭バイトを除去する。
-
remainderをresultへ追加する。
-
-
シリアライズ結果はresultの値である。
CCDToString関数は上記アルゴリズムで使用され、次のように定義されます:
-
encodedを空のバイト列とする。
-
0x22(
")をencodedへ追加する。 -
与えられたオブジェクトにToStringを適用し文字列に変換する。
-
得られた文字列の各コードポイントについて、以下を判定:
- {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桁小文字で表されるコードポイント値を追加。
-
0x22(
")をencodedへ追加する。 -
この関数の戻り値はencodedの値である。
5.8.1.2. 制限付き検証アルゴリズム
検証者は、完全なJSONパーサが利用できない場合、エンコードされたCollectedClientDataを下記アルゴリズムで検証できます:
-
このアルゴリズムへの入力は次の通り:
-
バイト列clientDataJSON。
clientDataJSON、すなわち検証すべきシリアライズされたCollectedClientData。 -
文字列type。期待される
type。 -
バイト列challenge。
PublicKeyCredentialRequestOptionsまたはPublicKeyCredentialCreationOptionsで与えられたチャレンジバイト列。 -
文字列origin。リクエストを発行した期待される
origin。 -
オプションの文字列topOrigin。利用可能な場合、期待される
topOrigin。 -
ブール値requireTopOrigin。topOriginが定義されていて
topOrigin属性がclientDataJSONに存在しないとき、検証を失敗すべき場合true。この意味するところは、requireTopOriginが
falseの時、検証アルゴリズムはWeb Authentication Level 2のJSON互換シリアル化アルゴリズムとも互換性を持つということです。
-
-
expectedを空のバイト列とする。
-
0x7b2274797065223a(
{"type":)をexpectedへ追加。 -
CCDToString(type)をexpectedへ追加。
-
0x2c226368616c6c656e6765223a(
,"challenge":)をexpectedへ追加。 -
challengeにbase64urlエンコーディングを施して文字列challengeBase64を得る。
-
CCDToString(challengeBase64)をexpectedへ追加。
-
0x2c226f726967696e223a(
,"origin":)をexpectedへ追加。 -
CCDToString(origin)をexpectedへ追加。
-
0x2c2263726f73734f726967696e223a(
,"crossOrigin":)をexpectedへ追加。 -
もしtopOriginが定義されている場合:
-
0x74727565(
true)をexpectedへ追加。 -
もしrequireTopOriginがtrue または 0x2c22746f704f726967696e223a(
,"topOrigin":)がclientDataJSONの先頭expected長の部分列の接頭辞の場合:-
0x2c22746f704f726967696e223a(
,"topOrigin":)をexpectedへ追加。 -
CCDToString(topOrigin)をexpectedへ追加。
-
-
-
それ以外、すなわちtopOriginが未定義:
-
0x66616c7365(
false)をexpectedへ追加。
-
-
もしexpectedがclientDataJSONの接頭辞でなければ検証失敗。
-
clientDataJSONがexpectedより1バイト以上長くなければ検証失敗。
-
expectedの長さ位置にあるclientDataJSONのバイトが:
- 0x7d の場合
-
検証成功。
- 0x2c の場合
-
検証成功。
- それ以外
-
検証失敗。
5.8.1.3. 将来の発展
制限付き検証アルゴリズムとの互換性を維持するため、将来の本仕様バージョンでは、type、
challenge、
origin、
crossOrigin、
topOrigin
のいずれもCollectedClientData
から削除してはならない。またシリアル化アルゴリズムも、これらフィールドのシリアライズ順序を変更したり、それらの間に新しいフィールドを挿入してはならない。
もしCollectedClientData
に追加フィールドが加えられた場合、制限付き検証アルゴリズムを使う検証者は、それらに対応できません。
アルゴリズムが更新されることで新しいフィールドも同じ制約を受けることになります。
このアルゴリズム更新では、旧バージョンのシリアライズも考慮する必要があります。すなわち、6つ目以降のフィールドは旧バージョンのユーザーエージェントによってシリアライズされないかもしれません。
5.8.2. クレデンシャル型の列挙(enum PublicKeyCredentialType)
enum PublicKeyCredentialType {"public-key" };
注: PublicKeyCredentialType
の列挙は意図的に参照されていません。§ 2.1.1 DOMString型としての列挙を参照してください。
現在定義されているクレデンシャル型は「public-key」のみです。
5.8.3.
クレデンシャル記述子(辞書型 PublicKeyCredentialDescriptor)
dictionary PublicKeyCredentialDescriptor {required DOMString type ;required BufferSource id ;sequence <DOMString >transports ; };
この辞書型は、特定の公開鍵クレデンシャルを識別します。
create()
で同じ認証器上に重複クレデンシャルが作られるのを防ぐためや、
get()
でクライアントがそのクレデンシャルに到達できるかどうか・どのように到達できるかを判定するために使われます。
資格情報レコードのためのクレデンシャル記述子は、その資格情報レコードのプロパティのサブセットであり、
PublicKeyCredential
オブジェクト(create()や
get()
で返される)の一部フィールドを反映しています。
type, 型 DOMString-
このメンバーは、呼び出し元が参照する公開鍵クレデンシャルの型を格納します。 値は
PublicKeyCredentialTypeのメンバーであるべきですが、クライアントプラットフォームは未知のPublicKeyCredentialDescriptorのtypeを無視しなければなりません。ただし、要素すべてが未知のtypeで無視された場合は、空のallowCredentialsとは意味が異なるため、必ずエラーとなる必要があります。これは識別された資格情報レコードを表すtype要素の値に設定すべきです。 またこれは
typeフィールド(PublicKeyCredential)を反映します。 id, 型 BufferSource-
このメンバーは呼び出し元が参照する公開鍵クレデンシャルのクレデンシャルIDを格納します。
これは識別された資格情報レコードを表すid要素の値に設定すべきです。 またこれは
rawIdフィールド(PublicKeyCredential)を反映します。 transports, 型 sequence<DOMString>-
このオプションメンバーは、呼び出し元が参照する公開鍵クレデンシャルの管理認証器とクライアントがどのような通信手段をとれるかのヒントを格納します。 この値は
AuthenticatorTransportのメンバーであるべきですが、クライアントプラットフォームは未知の値を無視しなければなりません。これは識別された公開鍵クレデンシャルソースを表す資格情報レコードのtransports項目の値に設定すべきです。 これは
メソッド (response.getTransports()PublicKeyCredential構造体、create()で生成) を反映します。
5.8.4. 認証器トランスポートの列挙(enum AuthenticatorTransport)
enum AuthenticatorTransport {"usb" ,"nfc" ,"ble" ,"smart-card" ,"hybrid" ,"internal" };
注: AuthenticatorTransport
の列挙は意図的に参照されていません。§ 2.1.1 DOMString型としての列挙を参照してください。
getTransports()経由で知ることができます。
usb-
該当する認証器がリムーバブルなUSB経由で接続できることを示します。
nfc-
該当する認証器がNFC(近距離無線通信)経由で接続できることを示します。
ble-
該当する認証器がBluetooth Low Energy / Bluetooth Smart (BLE)経由で接続できることを示します。
smart-card-
該当する認証器がISO/IEC 7816準拠のスマートカード(接点あり)経由で接続できることを示します。
hybrid-
該当する認証器が複数(通常は分離した)データトランスポート手段と近接手段の組み合わせで通信できることを示します。たとえば、デスクトップPC上でスマートフォンを用いた認証などが該当します。
internal-
該当する認証器がクライアントデバイス固有のトランスポート手段で接続されることを示します。つまりプラットフォーム認証器であり、クライアントデバイスから取り外せません。
5.8.5. 暗号アルゴリズム識別子(typedef COSEAlgorithmIdentifier)
typedef long ;COSEAlgorithmIdentifier
COSEAlgorithmIdentifierの値は暗号アルゴリズムを識別する数値です。
アルゴリズム識別子は、IANA COSEアルゴリズムレジストリ[IANA-COSE-ALGS-REG]に登録された値を用いるべきです。たとえば"ES256"は
-7、"RS256"なら -257です。
COSEアルゴリズムレジストリでは、COSE Key内の他のパラメータによって決まる部分が残されています。相互運用性を高めるため、本仕様はcredential public keyに以下の追加制約を課します:
-
アルゴリズムES256(-7)の鍵は crvパラメータとしてP-256(1)を指定し、圧縮点形式は使用してはなりません。
-
アルゴリズムES384(-35)の鍵は crvパラメータとしてP-384(2)を指定し、圧縮点形式は使用してはなりません。
-
アルゴリズムES512(-36)の鍵は crvパラメータとしてP-521(3)を指定し、圧縮点形式は使用してはなりません。
-
アルゴリズムEdDSA(-8)の鍵は crvパラメータとしてEd25519(6)を指定する必要があります。(これらは常にCOSEで圧縮形式を使用します)
これらの制約は、RFC9053セクション2.1 の勧告に沿っています。
注: これらのアルゴリズムで署名検証を正しく実装するには、多くのチェックが必要です。そのひとつは、非圧縮楕円曲線ポイントを処理する場合、実際にその点が曲線上にあることを確認する必要があることです。これは暗号ライブラリとアプリの隙間で見落とされやすいリスクがあるため強調されています。
5.8.6.
ユーザー検証要件の列挙(enum UserVerificationRequirement)
enum UserVerificationRequirement {"required" ,"preferred" ,"discouraged" };
WebAuthnリライングパーティは、操作によってはユーザー検証を要求することも、そうでないこともあり、この型によってその要求を表現できます。
注: UserVerificationRequirement
の列挙は意図的に参照されていません。§ 2.1.1 DOMString型としての列挙を参照してください。
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メディエーションを登録式において行うことができます。 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型として使用するを参照してください。
ヒントは、認証情報の transports
や authenticatorAttachment
に含まれる情報と矛盾することがあります。この場合、ヒントが優先されます。(なお、transports
の値は発見可能な認証情報を使用する場合は提供されないため、一部のリクエストの要素を表現するための唯一の手段としてヒントが活用されます。)
security-key-
リライングパーティが、このリクエストを物理的なセキュリティキーで満たすと考えていることを示します。例えば、企業のリライングパーティが従業員にセキュリティキーを配布し、その認証器のみを 登録や認証 に受け付ける場合などです。
旧バージョンのユーザーエージェントとの互換性のため、このヒントが
PublicKeyCredentialCreationOptionsで使われる場合、authenticatorAttachmentはcross-platformに設定されるべきです。 client-device-
リライングパーティが、このリクエストをプラットフォーム認証器を持つクライアントデバイスで満たすと考えていることを示します。
旧バージョンのユーザーエージェントとの互換性のため、このヒントが
PublicKeyCredentialCreationOptionsで使われる場合、authenticatorAttachmentはplatformに設定されるべきです。 hybrid-
リライングパーティが、このリクエストをスマートフォンなど一般用途の認証器で満たすと考えていることを示します。例えば、コンシューマー向けのリライングパーティは、専用のセキュリティキーを持つ顧客はごく一部だと考えることがあります。このオプションを指定すると、UI上でローカルのプラットフォーム認証器が積極的に表示されなくなります。
旧バージョンのユーザーエージェントとの互換性のため、このヒントが
PublicKeyCredentialCreationOptionsで使われる場合、authenticatorAttachmentはcross-platformに設定されるべきです。
5.9. Permissions Policy統合
この仕様は、feature-identifierトークン
"publickey-credentials-create"
および
"publickey-credentials-get"
で識別される2つのポリシー制御機能を定義します。両デフォルト許可リストは 'self' です。[Permissions-Policy]
Document
の
permissions policyが、その
document内のどんなコンテンツでも Web Authentication API を正常に呼び出すことができるかを決定します。つまり、
navigator.credentials.create({publicKey:..., ...})
または
navigator.credentials.get({publicKey:..., ...})
です。いずれかのドキュメントで無効になっている場合、そのドキュメント内のどんなコンテンツも上記メソッドを
使用することができなくなります。実行しようとすると、エラーが返されます。
注記: [CREDENTIAL-MANAGEMENT-1]で定義されたアルゴリズムが実際の権限ポリシーの評価を行います。これは、ポリシー評価が現在の設定オブジェクトへアクセスできる際に行う必要があるためです。[[Create]](origin, options, sameOriginWithAncestors)
および [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
の内部メソッドは、そのようなアクセス権限を持ちません。なぜならそれらはCredentialsContainer
の
Create a CredentialやRequest a Credentialという抽象操作によって並列に呼び出されるためです。
5.10. iframe要素内でのWeb Authenticationの利用
Web
Authentication APIは、クロスオリジンの
iframeではデフォルトで無効です。
このデフォルトポリシーを上書きして、クロスオリジン
iframe
からWeb
Authentication APIの [[Create]](origin, options, sameOriginWithAncestors)
および[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
メソッドを使用できるようにするには、
allow
属性に
publickey-credentials-create
またはpublickey-credentials-get
を値として指定してください。
WebAuthn APIを埋め込み文脈で利用するリライングパーティは、§ 13.4.2 埋め込み利用時の可視性に関する考慮事項で述べられているUIの偽装とその対策について確認してください。
5.11. 関連するオリジン間でのWeb Authentication利用
デフォルトでは、Web AuthenticationはRP IDがオリジンの 有効ドメインに等しいか、または登録可能なドメインサフィックスである必要があります。
これは、複数の国別ドメイン(例: example.com、example.co.uk、example.sg)やブランド(例: myexampletravel.com、examplecruises.com)、プラットフォームサービス提供者など、多数の多様な環境での導入の妨げとなることがあります。
WebAuthnリライングパーティは、関連オリジン間で資格情報を作成および利用できるよう、WebAuthnクライアントに許可を与える選択が可能です。このようなリライングパーティは、すべての関連オリジンの認証式で共通のRP IDを選択しなければなりません。
JSON ドキュメントは、その webauthn well-known URL [RFC8615] に必ずホストされ、HTTPS
を利用して提供されなければなりません。このJSONドキュメントは次の形式で返却されます:
-
Content-Type は
application/jsonでなければなりません。 -
トップレベルの JSON オブジェクトには
originsという名前のキーを持ち、その値は 1 つ以上の Web オリジンである文字列配列でなければなりません。
例えば 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クライアントは、最低でも5つの登録可能オリジンラベルをサポートしなければなりません。クライアントポリシーで上限を設定して乱用を防ぐべきです。
この well-known エンドポイントへのWebAuthnクライアントのリクエストは、認証情報やリファラーを付加せず、かつ https: スキームを使って行わなければなりません。リダイレクトを辿る際には、WebAuthnクライアントは全リダイレクトが https:
スキームであることも明示的に要求しなければなりません。
本機能に対応するWebAuthnクライアントは、getClientCapabilities()に対する応答にrelatedOriginsを含めるべきです。
5.11.1. 関連オリジンの検証
関連オリジン検証手続きは、引数callerOriginとrpIdRequestedを受けて、次の通りです:
-
クライアントポリシーで許可されている登録可能オリジンラベルの最大数をmaxLabelsとする。
-
RP ID rpIdRequested(つまり
https://rpIdRequested/.well-known/webauthn)のwebauthnwell-known URLを、認証情報やリファラーなしで、https:スキームを用いて取得する。-
取得に失敗した場合や、Content-Typeが
application/jsonでない場合、リダイレクト後ステータスコードが200でない場合は "SecurityError"DOMExceptionをthrowする。 -
リソースのボディが有効な JSON オブジェクトでない場合は "
SecurityError"DOMExceptionをthrowする。 -
JSON オブジェクトの origins プロパティが存在しない、または文字列配列でない場合は "
SecurityError"DOMExceptionをthrowする。
-
-
labelsSeenを空のセットとして初期化する。
-
各originsのoriginItemについて:
-
labelにdomainの登録可能オリジンラベルを割り当て。
-
labelが空またはnullの場合は次へ。
-
labelsSeenのサイズがmaxLabels以上であり、 labelsSeenがlabelを含まない場合、次へ。
-
callerOriginとurlが同一オリジンである場合、
trueを返す。 -
labelsSeenのサイズがmaxLabels未満なら、 labelをlabelsSeenへ追加 する。
-
falseを返す。
6. WebAuthn 認証器モデル
Web認証 API は、WebAuthn 認証器 のための特定の抽象的な機能モデルを示唆しています。このセクションでは、その認証器モデルについて説明します。
クライアントプラットフォームは、この抽象モデルを任意の方法で実装して公開してもかまいません。ただし、そのクライアントプラットフォームに対応する認証器で動作するクライアントのWeb認証API実装の挙動は、§ 5 Web Authentication APIで規定されている挙動と区別がつかないものでなければなりません。
注: [FIDO-CTAP] は、このモデルの具体的な実装例ですが、返すデータとWebAuthn APIで期待されるものには違いがあります。CTAP2のレスポンスメッセージは、この仕様で同じオブジェクトに対して定義されている文字列キーではなく、整数キーを用いて構築されたCBORマップです。クライアントは、そのようなデータに必要な変換を行うことが期待されます。[FIDO-CTAP]の仕様では、セクション§6. Authenticator APIでCTAP2整数キーとWebAuthn文字列キーの対応を詳述しています。
認証器に関して、このモデルはサポートしなければならない論理的操作や、クライアントおよびWebAuthn Relying Partyに公開するデータフォーマットを定義します。ただし、クライアントデバイスとの通信方法の詳細は、Relying Partiesとの相互運用性に必要な場合を除き、定義しません。例えば、この抽象モデルはUSBやNFC等のトランスポートを利用して認証器とクライアントを接続するプロトコルを定義しません。同様に、この抽象モデルは特定のエラーコードやその返却方法を定義しませんが、クライアントの要請に基づいてエラーの挙動は定義します。したがって、特定のエラーコードについては、準拠かつセキュアなクライアント実装を可能にするため、どのエラー条件を区別(または区別不可)とする必要があるかを示すために言及しています。
Relying Partiesは、必要と判断した場合、クレデンシャルの作成時やアサーションの生成時に、それぞれクレデンシャル作成オプションやアサーション生成オプションの利用を通じて、様々な認証器の特性を指定することで、認証器の選択に影響を与えることができます。WebAuthn API の根底にあるアルゴリズムは、これらのオプションをまとめて、以下で定義される該当する認証器操作に渡します。
この抽象モデルにおいて、認証器は鍵管理および暗号署名を提供します。認証器はWebAuthnクライアント内に組み込まれていても、完全に別のデバイスであってもかまいません。認証器自体は、認証器の他の部分よりも高いセキュリティレベルで動作する暗号モジュールを内蔵することができます。特にWebAuthnクライアントに内蔵されている認証器の場合、その暗号モジュール(例えばTPMなど)は、認証器全体よりも信頼できるものとみなされます。
各認証器は、(rpId, userHandle) から 公開鍵クレデンシャルソース への クレデンシャルマップ(マップ)を格納しています。
さらに、各認証器にはAuthenticator Attestation Globally Unique Identifier、すなわちAAGUIDがあり、これは認証器のタイプ(例:製造元やモデル)を示す128ビットの識別子です。AAGUIDは、その製造元によって、実質的に同一の認証器全てで同じに、かつ他の認証器タイプのAAGUIDとは(高い確率で)異なるように選択されなければなりません。ある認証器タイプのAAGUIDは、これを確実にするため乱数生成されるべきです。Relying Partyは、他の情報源を利用して認証レベルや鍵保護の強度など特定の特性を推測するためにAAGUIDを利用してもかまいません。また、Relying Partyは、アテステーションをリクエスト・検証しなくても認証器メーカーの特定をAAGUIDで試みてもよいですが、アテステーションが無い場合、AAGUIDの正当性は保証されません。
認証器の主な役割は、様々なコンテキストデータに結び付けられたWebAuthn署名を提供することです。これらのデータは、署名要求がサーバから認証器へ渡る過程でスタック内の様々なレベルで観測・追加されます。サーバは署名を検証する際に、これらのバインディングを想定される値と照合します。こうしたコンテキストバインディングは2つに分けられます。Relying Partyやクライアントが追加するもの(クライアントデータ)と、認証器が追加するもの(認証器データ)です。認証器はクライアントデータに署名しますが、その内容自体には関心がありません。帯域や認証器の処理負荷を減らすため、クライアントはクライアントデータをハッシュ化し、その結果だけを認証器に渡します。認証器はシリアライズ済みクライアントデータのハッシュと自身の認証器データの組み合わせに対して署名を行います。
この設計の目的は以下の通りにまとめられます。
-
署名生成方式は、クライアントデバイス と認証器の通信経路が帯域やレイテンシの点で極めて制限されるケース(Bluetooth Low Energyや近距離無線通信など)にも対応できる設計であるべきです。
-
認証器が処理するデータは小さく、低レベルコードで解釈しやすい必要があります。特に、認証器がJSON等の高レベルエンコーディングを解析する必要がないようにするべきです。
-
クライアントおよび認証器は、必要に応じてコンテキストバインディングを追加する柔軟性を持つべきです。
-
設計は、既存のエンコーディングフォーマットを極力再利用し、普及と実装を促進することを目指します。
認証器は、暗号署名を2つの異なる目的で生成します:
-
新しい公開鍵クレデンシャルがauthenticatorMakeCredential操作により作成されたとき、アテステーション署名が生成されます。アテステーション署名は、認証器およびクレデンシャルの特定の特性を証明します。たとえば、アテステーション署名は、AAGUIDで示される認証器タイプやクレデンシャル公開鍵を主張します。アテステーション署名は、必要なアテステーション秘密鍵によって署名されます。アテステーションの詳細については、§ 6.5 アテステーション を参照してください。
-
authenticatorGetAssertionメソッドが呼び出された際、アサーション署名が生成されます。これは、認証器がユーザーの特定の取引(例:ログインや購入手続きなど)に同意したことを示すアサーションです。つまり、アサーション署名は、あるクレデンシャル秘密鍵を保持している認証器が、そのトランザクションのリクエスト元ユーザーと当該公開鍵クレデンシャル作成時に同意したユーザーが同一であると最大限確認したことを主張します。さらに、ユーザー同意の提供方法や認証器がユーザーに表示したプロンプトなど、呼び出し元に有用な追加情報(クライアントデータ)も主張します。アサーション署名のフォーマットは、下記の図4に示されています。
WebAuthn署名という用語は、アテステーション署名とアサーション署名の両方を指します。これら署名のフォーマットおよび生成手順は以下で定義されています。
6.1. 認証器データ
認証器データ構造体は、認証器によって行われるコンテキストバインディングを符号化します。これらのバインディングは認証器自身によって制御され、その信頼性はWebAuthnリライングパーティがその認証器のセキュリティ特性をどのように評価するかに依存します。極端な例として、認証器がクライアント内部に組み込まれている場合、そのバインディングはクライアントデータと同程度の信頼性しか持たないかもしれません。逆に、認証器が高セキュリティのハードウェア・ソフトウェアを備えた独立した装置として、安全なチャネルでクライアントと接続されている場合もあります。いずれの場合でも、リライングパーティは認証器データを同じ形式で受け取り、認証器に関する自身の知識を基に信頼判断を下します。
認証器データは、コンパクトかつ拡張性のある符号化を採用しています。これは、認証器が機能や消費電力に制約のあるデバイスであり、クライアントプラットフォームに比べて遥かにシンプルなソフトウェアスタックしか持たない場合があるためです。
認証器データ構造体は37バイト以上のバイト配列であり、表のように配置されます。
| 名称 | 長さ(バイト数) | 説明 |
|---|---|---|
| rpIdHash | 32 | 認証情報がスコープされるRP IDのSHA-256ハッシュ。 |
| flags | 1 |
フラグ(ビット0が最下位ビット):
|
| signCount | 4 | 署名カウンターであり、32ビット符号なしビッグエンディアン整数。 |
| attestedCredentialData | 可変(存在する場合) | 証明付き認証情報データ(存在する場合)。詳細は§ 6.5.1 証明付き認証情報データを参照。長さはcredential IDとcredential public keyの長さに依存する。 |
| extensions | 可変(存在する場合) | 拡張によって定義される認証器データ。これはCBOR [RFC8949] マップであり、拡張識別子がキー、認証器拡張出力が値となる。詳細は§ 9 WebAuthn拡張参照。 |
RP IDは認証情報が作成される際およびアサーション生成時にクライアントから受け取りますが、クライアントデータとはいくつかの重要な点で異なります。まず、クライアントデータとは異なり、認証情報のRP IDは操作間で変わらず、その認証情報のライフタイムで同一です。次に、これはauthenticatorGetAssertion操作中に認証器自身によって検証され、リクエストされた認証情報のスコープされたRP IDがクライアントから渡されたRP IDと完全に一致しているかを認証器が確認します。
認証器は、認証器データ構造体の生成に次の手順を行います:
-
認証器がユーザーの存在確認を実行した場合のみUP フラグをセットする。ユーザー検証を実行した場合のみUV フラグをセットする。
RFUビットは0とすること。注記: 認証器がユーザーの存在確認およびユーザー検証の両方を、単一の認可ジェスチャーで組み合わせて実行した場合、認証器は
UPおよびUVフラグ両方をセットします。 -
マルチデバイス認証情報の場合のみBE フラグをセットする。この値は§ 6.1.3 認証情報バックアップ状態で定義されるように登録式後に変化してはならない。
-
認証情報がマルチデバイス認証情報であり、かつ現在バックアップされている場合のみBS フラグをセットする。
認証情報のバックアップ状態が不明な場合や、認証器がバックアップ済み認証情報に問題ありと疑う場合、BS フラグはセットしないことが望ましい。
-
認証署名時には認証器は
attestedCredentialDataを含めてAT フラグを立てること。アサーション署名時はattestedCredentialDataを含めずAT フラグをセットしないこと。
証明付き認証情報データの長さ(可変)を決定するには、直前のcredentialIdの長さ
を使って、
credentialPublicKeyの開始位置を決め、
さらにその長さを求めます(詳細はRFC9052セクション7も参照)。
6.1.1. 署名カウンターに関する考慮事項
認証器は署名カウンター機能を実装すべきです。このカウンターは論理的に認証情報ごと、または認証器全体として保存されます。認証情報の初期署名カウンター値は、authenticatorMakeCredentialによって返される認証器データ内のsignCount値に記録されています。署名カウンターは、各authenticatorGetAssertion操作のたびに正の値でインクリメントされ、以降の値も再度WebAuthnリライングパーティに認証器データ内で返されます。署名カウンターは複製された認証器の検出補助という目的があり、保護が限定的な認証器では特に重要です。
署名カウンターを実装しない認証器は、認証器データのsignCountを常に0とします。
リライングパーティは、直近のauthenticatorGetAssertion操作時の署名カウンターを保存しておきます(もしくは認証情報に対するauthenticatorMakeCredentialで初回作成時)。その後のauthenticatorGetAssertion呼び出し時に、保存済みカウンターと新たに返されるsignCount
を比較します。いずれかが0以外の値で、新しいsignCount値が保存値以下の場合は、認証器が複製されている可能性、認証器の故障、またはリライングパーティがアサーションを認証器で生成された順序と異なる順序で受信・処理している可能性があります。
署名カウンターの不一致検出は、今回の操作が複製認証器によるものか元の認証器によるものかまでは判定しません。リライングパーティは自組織のリスク耐性や運用実態に応じて、このような状況に適切に対応すべきです(非増加な値に正当理由がある場合も想定)。
認証器は:
-
認証情報ごとの署名カウンターを実装することが推奨されます。これにより、リライングパーティ間で値が共有され、ユーザーの相関ハンドルとして悪用されるのを防げます。認証器単位でのグローバル署名カウンターの実装も可能ですが、これはプライバシー保護の観点で劣ります。
-
ハードウェア障害等によって署名カウンターが意図せず減少しないようにすべきです。
6.1.2. FIDO U2F署名形式の互換性
認証器データ構造体と直列化クライアントデータのハッシュを連結した内容に署名するアサーション署名の形式は、FIDO U2F認証署名形式と互換性があります(セクション5.4、[FIDO-U2F-Message-Formats]参照)。
これは、FIDO U2F認証応答メッセージで署名される最初の37バイトが有効な認証器データ構造体であり、残りの32バイトが直列化クライアントデータのハッシュであるためです。この認証器データ構造体において、rpIdHash
はFIDO U2Fのアプリケーションパラメータであり、flagsはUP以外は常にゼロ、attestedCredentialData、extensionsは存在しません。よって、FIDO
U2F認証署名もauthenticatorGetAssertion操作で生成された他のアサーション署名と同じ方法で検証できます。
6.1.3. 認証情報のバックアップ状態
認証情報のバックアップ適格性および現在のバックアップ状態は、認証器データ内のBEおよびBS フラグとして表現されます。これは表に定義されています。
BE フラグの値はauthenticatorMakeCredential時に設定され、その後変更してはなりません。
BS フラグの値は公開鍵認証情報ソースの現状態により時間と共に変化する場合があります。下記表は有効な組み合わせ例とその意味を示します。
| BE | BS | 説明 |
|---|---|---|
0
| 0
| 認証情報はシングルデバイス認証情報です。 |
0
| 1
| この組み合わせは許可されません。 |
1
| 0
| 認証情報はマルチデバイス認証情報で、現在バックアップされていません。 |
1
| 1
| 認証情報はマルチデバイス認証情報で、現在バックアップ済みです。 |
リライングパーティは、これらのフラグの最新値をユーザーアカウントと一緒に記録し、将来再評価できるようにしておくことを推奨します。
以下はリライングパーティがこれらのフラグを利用する代表例の一部です:
-
追加認証器の要求:
BE フラグが
0の場合、その認証情報はシングルデバイス認証情報であり、生成認証器はバックアップを許可しません。シングルデバイス認証情報はデバイス単独喪失に耐性がありません。リライングパーティは、各ユーザーアカウントに追加認証器の登録やアカウント回復プロセスの実装を推奨します。 例えば、ユーザーに追加認証器(ローミング認証器やマルチデバイス認証情報対応認証器など)の設定を促すこともできます。
-
ユーザーをパスワードレスアカウントへアップグレード:
BS フラグが
0から1に変化した場合、認証器は認証情報がバックアップ済みであり、単一デバイス喪失に備えられていることを示しています。リライングパーティは、ユーザーへアカウントのセキュリティ向上やパスワード削除の提案を行っても構いません。
-
状態変化後の追加要素追加:
BS フラグが
1から0に変化した場合、認証器は認証情報がもはやバックアップされておらず、単一デバイス喪失に備えられていないことを示しています。これはユーザーがバックアップサービスを無効化したり、サービス側のエラー等が原因の可能性があります。この遷移が発生した場合、リライングパーティは他の認証要素の検証手順をユーザーへ案内すべきです。ユーザーがアカウントに別の認証情報を持たない場合、新たな認証要素追加を促し、アカウントへのアクセスを失わないよう支援すべきです。例えば、ユーザーに追加認証器(ローミング認証器やマルチデバイス認証情報対応認証器など)の設定を促します。
6.2. 認証器の分類
多くのユースケースは、使用される認証器の機能に依存します。 このセクションでは、それらの機能、それらの重要な組み合わせ、そしてそれらの組み合わせによって可能になるユースケースの用語を定義します。
例えば:
-
特定のクライアントデバイスで初めて認証を行う際には、ローミング認証器が一般的に必要です。 ユーザーはまだそのプラットフォーム認証情報をそのクライアントデバイス上に持っていないためです。
-
同じクライアントデバイスで以降の再認証を行う場合、プラットフォーム認証器がもっとも便利です。 それはクライアントデバイスに直接組み込まれているため、ユーザーが別のデバイスを探す必要がありません。
-
パスワードレスの多要素認証には、ユーザー検証可能な認証器、 場合によっては探索可能認証情報対応が必要です。
-
ノートパソコンはUSBやBluetooth経由でローミング認証器への接続をサポートできますが、モバイルフォンはNFCのみをサポートする場合もあります。
上記の例は、主要な認証器タイプの特性を示しています:
-
認証器がローミング型かプラットフォーム型か、 または場合によっては両方であるか(認証器接続方式)。 ローミング認証器は、トランスポートを複数サポートすることがあります。
-
認証器が探索可能認証情報対応かどうか — 認証情報保存方式。
これらの特性は独立しており、理論上は自由に組み合わせることができますが、表は特に関心が高い認証器タイプをいくつか提示しています。
| 認証器タイプ | 認証器接続方式 | 認証情報保存方式 | 認証要素の機能 |
|---|---|---|---|
| 二要素プラットフォーム認証器 | プラットフォーム | いずれか | 単一要素対応 |
| ユーザー検証付きプラットフォーム認証器 | プラットフォーム | いずれか | 多要素対応 |
| 二要素ローミング認証器 | クロスプラットフォーム | サーバー側保存 | 単一要素対応 |
| パスキー・ローミング認証器 | クロスプラットフォーム | クライアント側保存 | 多要素対応 |
| パスキー・プラットフォーム認証器 | プラットフォーム (transport
= internal)
または クロスプラットフォーム (transport
= hybrid)
| クライアント側保存 | 多要素対応 |
二要素プラットフォーム認証器は、同じクライアントデバイスで再認証する場合に便利で、 新しいセッションの開始時や既存セッションの再開時など、追加のセキュリティ層を加えるためにも使用できます。 二要素ローミング認証器は、特定のクライアントデバイスで初めて認証する場合や、 複数ユーザーが共有するクライアントデバイスで利用される可能性が高いです。
パスキープラットフォーム認証器とパスキーローミング認証器は、パスワードレスの多要素認証を実現します。 認証情報秘密鍵の所持証明に加えて、 これらの認証器はユーザー検証を第二の認証要素としてサポートします。 これは通常PINまたは生体認証です。 認証器はこのように 二種類の認証要素として機能し、 多要素認証を可能にしつつ、Relying Partyにパスワードを共有する必要をなくします。 また、これらの認証器は探索可能な認証情報(パスキーとも呼ばれる)もサポートしており、 ユーザー名の入力が不要な認証フローも実現できます。
ユーザー検証付きプラットフォーム認証器クラスは、
パスキープラットフォーム認証器クラスによってほぼ置き換えられていますが、
その定義はisUserVerifyingPlatformAuthenticatorAvailable
メソッドでいまだに使用されています。
表で名前がつけられていない組み合わせは、顕著なユースケースはあまりありません:
-
ローミング認証器が探索可能認証情報対応だが多要素対応ではない場合、 ユーザー名を使わずに単一要素認証に利用できます。 この場合ユーザーはユーザーハンドルで自動識別され、認証情報秘密鍵の所持のみが認証要素となります。 これは一部状況で有用ですが、認証器の盗難リスクが高まります。
-
ローミング認証器が多要素対応だが 探索可能認証情報対応でない場合、 多要素認証で使用できますが、ユーザーを先に識別する必要があり、 個人情報が漏れるリスクがあります。詳細は§ 14.6.3 認証情報IDによるプライバシー漏洩を参照してください。
次章では、認証器接続方式、 認証情報保存方式、 認証要素の機能 をより詳しく定義します。
6.2.1. 認証器接続方式
クライアントは、認証器と さまざまな方法で通信できます。例えば、クライアントはクライアントデバイス固有のAPIを用いて 認証器(クライアントデバイスに物理的に結合されたもの) と通信できます。一方、クライアントは Bluetoothなど標準化されたクロスプラットフォームのトランスポートプロトコル(§ 5.8.4 Authenticator Transport Enumeration (enum AuthenticatorTransport)参照)を使って クロスプラットフォーム接続の認証器を発見し、通信することもできます。 認証器がクライアントデバイスの一部である場合、 それをプラットフォーム認証器と呼び、 クロスプラットフォームトランスポートで到達可能なものをローミング認証器と呼びます。
-
プラットフォーム認証器はクライアントデバイス固有のトランスポート(プラットフォーム接続)で接続され、通常はクライアントデバイスから取り外せません。 公開鍵認証情報が バインドされていれば、それはプラットフォーム認証情報と呼ばれます。
-
ローミング認証器はクロスプラットフォームトランスポート(クロスプラットフォーム接続)で接続されます。このクラスの認証器は クライアントデバイスから取り外し可能で、 「ローミング」できます。公開鍵認証情報がバインドされていれば、それは ローミング認証情報と呼ばれます。
一部のプラットフォーム認証器は、 文脈によってはローミング認証器としても動作できます。例えば、モバイルデバイスに組み込まれた プラットフォーム認証器が Bluetooth経由でローミング認証器として利用可能にすることがあります。 この場合、モバイルデバイス上のクライアントは それをプラットフォーム認証器として認識し、 別のクライアントデバイスのクライアントは Bluetooth経由で同じ認証器をローミング認証器として認識します。
プラットフォーム認証器の主なユースケースは、特定のクライアントデバイスを「信頼できるデバイス」として登録することです。 クライアントデバイス自体が将来の所持品の認証要素となるので、 ユーザーは今後ローミング認証器を必要としなくなり、 例えばキーフォブや携帯電話を探し出す必要がなくなります。
ローミング認証器のユースケース例: 新しいクライアントデバイスでの初回認証、 あまり使わないクライアントデバイスや、 複数ユーザーで共有するクライアントデバイス、 プラットフォーム認証器が含まれないクライアントデバイスへの認証や、 ポリシーや好みにより認証器をクライアントデバイスから切り離して使用したい場合です。 また、ローミング認証器は 他の認証器を紛失した場合のバックアップとしても利用できます。
6.2.2. 認証情報保存方式
認証器は 公開鍵認証情報ソースを2通りの方法で保存できます:
-
認証器・クライアント・クライアントデバイスなどに埋め込まれた永続ストレージ(例:セキュアイレメント)に保存。これはクライアント側探索可能公開鍵認証情報ソースの技術的要件です。
-
公開鍵認証情報ソースを暗号化(ラップ)し、その認証器のみが復号(アンラップ)できるようにし、その暗号文を認証情報IDとして用いる。 認証情報IDはRelying Partyによって保存され、
allowCredentialsオプションを通じて認証器に返されることで、 復号・利用できるようになります。この方式では認証器が無制限の認証情報保存容量を持てます。 暗号化された公開鍵認証情報ソースがRelying Partyに保存され、認証器自体には保存されません。 ただしこの場合認証情報は利用時にRelying Partyから取得しなければなりません。
認証器がどちらの保存戦略をサポートしているかが、その認証器の認証情報保存方式を定めます:
-
認証器がクライアント側探索可能公開鍵認証情報ソースに対応していれば、 クライアント側認証情報保存方式を持ちます。 この場合認証器はクライアント側認証情報保存方式であるとも呼ばれ、探索可能認証情報対応と呼ばれます。
-
認証器がクライアント側認証情報保存方式に対応していなければ、 サーバー側認証情報保存方式となり、 公開鍵認証情報ソースを暗号文として認証情報IDにのみ保存できます。
なお、探索可能認証情報対応な認証器は両方の戦略をサポートしている可能性があります。
この場合、認証器は認証情報ごとにどちらの戦略を使うか自由に選択できますが、residentKey
やrequireResidentKey
オプション(create())の制約は受けます。
6.2.3. 認証要素の機能
認証要素は3つの大別できるクラスがあり、 認証セレモニー中に本人性証明に利用できます:所持品・知識・本人属性 です。例:物理鍵・パスワード・指紋など。
すべてのWebAuthn認証器は 所持品要素に属しますが、 認証器がユーザー検証をサポートしている場合、 他の(または両方の)認証要素としても機能できます。 例えば認証器がPINを検証できる場合、 それは知識要素であり、 生体認証器は本人属性を証明します。 したがって、認証器がユーザー検証をサポートしている場合、多要素対応です。逆に、認証器が多要素対応でなければ、単一要素対応です。単一の多要素対応 認証器が複数種のユーザー検証 に対応している場合、3つの種類すべての認証要素としても 動作可能です。
ユーザー検証は 認証器上でローカルに実施され、Relying Partyでは検証されませんが、 認証器は サイン応答でUVフラグをセットすることで、ユーザー検証の有無を示します。 Relying Partyは UV フラグで、追加の認証要素利用の有無を登録や認証セレモニーで確認できます。 認証器のアテステーション・ステートメントを検査すれば、UVフラグの真正性も確認できます。
6.3. 認証器操作
WebAuthnクライアントは、その認証器のいずれかの操作を実行するために、認証器へ接続しなければなりません。 この接続が認証器セッションを定義します。 認証器は各セッション間を分離しなければならず、同時に一つのみ許可するまたはより複雑なセッション管理を行います。
クライアントは認証器セッション中に次の操作を呼び出せます。
6.3.1. 認証情報IDによる認証情報ソース検索アルゴリズム
検索の結果は、認証情報IDcredentialIdを認証器authenticatorで検索した結果で、以下のアルゴリズムに従います:
-
もしauthenticatorがcredentialIdを公開鍵認証情報ソース credSourceに復号できる場合:
-
credSource.id にcredentialIdをセットする。
-
credSourceを返す。
-
-
すべての 公開鍵認証情報ソース credSourceについて、authenticatorの認証情報マップ内を反復:
-
もしcredSource.idがcredentialIdと等しければ credSourceを返す。
-
-
nullを返す。
6.3.2. authenticatorMakeCredential操作
この操作を呼び出す前に、クライアントはauthenticatorCancel操作を呼び出して 認証器セッションで進行中の他の全操作を中断しなければなりません。
この操作は以下の入力パラメーターを受け取ります:
- hash
-
シリアライズされたクライアントデータのハッシュ。クライアントにより提供されます。
- rpEntity
- userEntity
- requireResidentKey
-
認証情報作成における実効resident key要件(クライアントで決定される真偽値)。
- requireUserPresence
-
定数真偽値
trueまたはoptions.がmediationconditionalかつユーザーから事前に同意取得済みならFALSE - requireUserVerification
-
認証情報作成における実効ユーザー検証要件 (クライアントで決定される真偽値)
- credTypesAndPubKeyAlgs
-
PublicKeyCredentialTypeおよび 公開鍵アルゴリズム(COSEAlgorithmIdentifier)のペア列。 Relying Partyが要求します(優先順)。認証器は、 サポートできる中から最も好ましい認証情報をベストエフォートで作成します。 - excludeCredentialDescriptorList
-
(オプション)Relying Partyが認証器に知られている場合は新規作成しないことを意図して提供する
PublicKeyCredentialDescriptorオブジェクトリスト。 excludeCredentialDescriptorListは既知の認証情報のリスト。 - enterpriseAttestationPossible
-
個人識別可能なアテステーションを認証器が返してよいかを示す真偽値。
- attestationFormats
-
アテステーション・ステートメント形式について、Relying Partyの希望する順序づき文字列列。認証器がアテステーションを返す場合、 サポートする中から最も好ましいものを選択。
- extensions
この操作を呼び出した時、認証器は以下の手順を実行します:
-
すべてのパラメーターが構文的に正しく長さも適切か確認。そうでなければ "
UnknownError"相当のエラーを返して終了。 -
指定された
PublicKeyCredentialTypeと credTypesAndPubKeyAlgsの暗号パラメータの組み合わせのいずれか1つ以上に対応しているか確認。 なければ"NotSupportedError"相当のエラーを返して終了。 -
すべてのexcludeCredentialDescriptorListのdescriptorにつき:
-
この認証器で検索
descriptor.がnullでなく、そのididとtypeが一致すれば 認可ジェスチャー とユーザーの同意を取得。認可ジェスチャーは ユーザー存在テストを含みます。もし- 新規認証情報作成に同意した場合
-
"
InvalidStateError"相当のエラーを返して終了。 - 同意しない場合
-
"
NotAllowedError"相当のエラーを返して終了。
注記: この認可ジェスチャーの目的は新規認証情報を作成するためでなく、 プライバシー上、
descriptor.がこの認証器にバインドされていることの開示を認可するためです。 ユーザーが同意すればクライアントおよびRelying Partyがこの事実を検出し、他認証器を使うよう誘導可能です。 同意しなければ、そのバインドの有無は開示されず、 ユーザーが単に新規作成に同意しなかったものとして応答します。id
-
-
requireResidentKeyが
trueで認証器がクライアント側探索可能公開鍵認証情報ソースを保存できなければ、 "ConstraintError"相当のエラーで終了。 -
requireUserVerificationが
trueで認証器がユーザー検証 できなければ "ConstraintError"相当のエラーで終了。 -
認可ジェスチャーと
ユーザーの同意を
取得して新規認証情報作成。出力機能のある認証器なら認証器自身が、ない場合はユーザーエージェントがプロンプトを表示します。
プロンプトには
rpEntity.,idrpEntity.,nameuserEntity.とnameuserEntity.を表示すべきです。displayNamerequireUserVerificationが
trueなら、認可ジェスチャー はユーザー検証 を必須とします。requireUserPresenceが
trueなら、認可ジェスチャー はユーザー存在テストを必須とします。ユーザーが同意しない、またはユーザー検証失敗時は "
NotAllowedError"相当のエラーで終了。 -
認可ジェスチャー完了し同意取得後、新規認証情報オブジェクトを生成:
-
公開鍵・秘密鍵ペア(publicKey, privateKey)を、
PublicKeyCredentialTypeとcredTypesAndPubKeyAlgs最初のサポート組み合わせで新規生成。 -
userHandleとして
userEntity.を用いる。id -
credentialSourceとして公開鍵認証情報ソース新規作成し、以下のフィールドを持たせる:
- type
- privateKey
-
privateKey
- rpId
-
rpEntity.id - userHandle
-
userHandle
- otherUI
-
認証器が任意で含めたい他情報
-
requireResidentKeyが
trueまたは認証器がクライアント側探索可能公開鍵認証情報ソースを作成する場合: -
そうでなければ:
-
credentialIdをcredentialSourceをシリアライズ・暗号化したものとする(この認証器しか復号できない形)。
-
-
-
認証情報オブジェクト作成中にエラーが生じた場合、"
UnknownError"相当のエラーで終了。 -
processedExtensionsとして認証器拡張処理を各サポート拡張ID→拡張入力ペアについて実行した結果とする。
-
認証器が:
-
attestedCredentialDataとして、アテスト認証情報データバイト列(credentialIdとpublicKey含む)を生成。
-
attestationFormatは、enterpriseAttestationPossibleも考慮して attestationFormatsの中で最初にサポートされているアテステーション・ステートメント形式IDとする。 サポートする値がなければこの認証器で最も好ましい形式IDを選択。
-
authenticatorDataは§ 6.1認証器データに従いバイト列として生成し、
attestedCredentialDataに attestedCredentialData、extensionsに processedExtensions(あれば)を含める。 -
新規認証情報用アテステーション・オブジェクトを、 § 6.5.4 アテステーション・オブジェクトの生成に従い アテステーション・ステートメント形式 attestationFormat、authenticatorData、hash(および
enterpriseAttestationPossibleを考慮)で作成。 詳細は§ 6.5 アテステーション参照。
この操作が成功した場合、認証器はアテステーション・オブジェクトをクライアントに返します。
6.3.3. authenticatorGetAssertion 操作
この操作を呼び出す前に、クライアントはauthenticatorCancel操作を呼び出し、認証器セッション内で進行中の他のすべての操作を中断しなければなりません(MUST)。
この操作は以下の入力パラメーターを受け取ります:
- rpId
- hash
-
クライアントによって提供されたシリアライズされたクライアントデータのハッシュ。
- allowCredentialDescriptorList
-
OPTIONALのリスト。
PublicKeyCredentialDescriptorのリストであり、 Relying Partyが受け入れ可能な認証情報(クライアントによってフィルタリングされている可能性あり)を記述します(もしあれば)。 - requireUserPresence
-
定数ブール値
true。これはパラメータのようにここに含まれていますが、WebAuthnがユーザープレゼンスのテストを省略可能にはしていないにも関わらず、 実装によってはユーザープレゼンスのテストをオプションとする場合に、この抽象的な認証モデルを適用しやすくするためです。 - requireUserVerification
-
アサーションに対する有効なユーザー検証要件。クライアントによって与えられるブール値です。
- extensions
-
CBOR マップ。拡張識別子から、それぞれの認証器拡張入力へのマップであり、Relying Party(もしあれば)が要求した拡張を元にクライアントが作成します。
このメソッドが呼び出されると、認証器は以下の手順を実行しなければなりません(MUST):
-
すべてのパラメーターが構文的に正しく、長さも正しいかをチェックします。もしそうでなければ、
UnknownErrorに相当するエラーコードを返して操作を終了します。 -
credentialOptionsを、新しい空のセットとして初期化します。要素は公開鍵認証情報ソースです。
-
allowCredentialDescriptorListが指定されている場合、各descriptorについて:
-
credSourceを、credential-idの参照により、 この認証器内で
descriptor.から見つけます。id -
もしcredSourceが
nullでなければ、credentialOptionsに追加します。
-
-
それ以外の場合(allowCredentialDescriptorListが指定されていない場合)、この認証器の認証情報マップから各key→credSource について、credentialOptionsに追加します。
-
credentialOptionsから、rpIdがrpIdと一致しないアイテムを削除します。
-
もしcredentialOptionsが空の場合、
NotAllowedErrorに相当するエラーコードを返して、操作を終了します。 -
ユーザーに、公開鍵認証情報ソース
selectedCredentialをcredentialOptionsから選択するよう促します。
認可ジェスチャ(ユーザーがselectedCredential使用に同意したことを確認するもの)を収集します。
認可ジェスチャのプロンプトは、
認証器に出力機能があれば認証器自身が、なければユーザーエージェントが表示します。
もしrequireUserVerificationが
trueなら、認可ジェスチャにはユーザー検証が含まれていなければなりません(MUST)。もしrequireUserPresenceが
trueなら、認可ジェスチャにはユーザープレゼンスのテストが含まれていなければなりません(MUST)。もしユーザーが同意しなかった場合、
NotAllowedErrorに相当するエラーコードを返して、操作を終了します。 -
processedExtensionsを、認証器拡張の処理の結果とします。各サポートされている拡張識別子→認証器拡張入力について extensions 内で処理する。
-
認証情報に関連付けられている署名カウンタ、またはグローバルな署名カウンタ値を、どちらの方式を認証器が実装するかに応じて、正の値分増加させます。 もし認証器が署名カウンタを実装していない場合、署名カウンタ値はゼロのままです。
-
authenticatorDataを、バイト配列として § 6.1 Authenticator Dataで指定された通りに生成します。processedExtensions(もしあれば)を
extensionsとして含め、attestedCredentialDataは含めません。 -
signatureを、アサーション署名として
authenticatorData || hashという連結データにselectedCredentialのprivateKeyで 署名したものとします。詳細は下図を参照してください。 ここでは単純かつ区切りなしの連結ですが、認証器データ自体が長さ情報を含んでいるため安全です。 シリアライズされたクライアントデータのハッシュ(可変長である可能性がある)は常に最後につけます。アサーション署名の生成 -
アサーション署名生成時にエラーが発生した場合は、
UnknownErrorに相当するエラーコードを返して終了します。 -
ユーザーエージェントへ返す値:
-
もしクライアントがallowCredentialDescriptorList(2つ以上の場合)、またはそもそもリストが提供されなかった場合は、selectedCredential.idを返します。
注: allowCredentialDescriptorList内に1つだけクレデンシャルを指定し、それが使われた場合、credential IDは返しません(クライアントが既に知っているため)。これは一般的なケースであり、転送バイト削減のためです。
-
authenticatorData
-
signature
-
selectedCredential.userHandle
注: allowCredentialDescriptorListが提供された場合、返されるuserHandleは
nullになる場合もあります。詳細はuserHandleResultを参照してください。
-
もし認証器が、指定されたRelying Partyに合致する認証情報を見つけられない場合、操作を終了しエラーを返します。
6.3.4. authenticatorCancel 操作
この操作は入力パラメーターを取らず、結果も返しません。
この操作がクライアントによって認証器セッション内で呼ばれると、そのセッションで現在進行中のauthenticatorMakeCredentialまたはauthenticatorGetAssertion操作を終了させる効果があります。 認証器はキャンセルされた操作に関連するユーザー入力の促しや入力受付を停止します。 クライアントはキャンセル済み操作について認証器から返される追加レスポンスを無視します。
この操作が認証器セッションで呼ばれても、authenticatorMakeCredentialやauthenticatorGetAssertion操作が進行中でない場合は無視されます。
6.3.5. silentCredentialDiscovery 操作
これはOPTIONALな操作であり、認証器がconditional
ユーザー仲介を可能とするためにサポートしてもよい(MAY)ものです。
この操作は以下の入力パラメーターを取ります:
- rpId
-
呼び出し元のRP ID。ユーザーエージェントによって決定されます。
この操作が呼ばれた場合、認証器は次の手順を実行しなければなりません(MUST):
-
collectedDiscoverableCredentialMetadataを新しいリストとし、その要素はDiscoverableCredentialMetadata 構造体(以下の要素を持つ)です:
- type
- id
- rpId
- userHandle
- otherUI
-
認証器がUIを表示する際に利用する、その他の情報。
-
認証器の 公開鍵認証情報ソース(credSource)について、credentials mapから:
-
もしcredSourceがクライアント発見可能認証情報でなければ、次へ。
-
discoveredCredentialMetadataを新規DiscoverableCredentialMetadata 構造体とし、要素はcredSourceのtype、id、 rpId、 userHandle およびotherUIのコピーです。
-
discoveredCredentialMetadataを collectedDiscoverableCredentialMetadataに追加します。
-
-
collectedDiscoverableCredentialMetadataを返します。
6.4. 文字列の取り扱い
認証器はRelying
Partyによって選択された任意の文字列、
例えばnameやdisplayName(
PublicKeyCredentialUserEntity内)
を保存する必要がある場合があります。このセクションでは人に提示される可能性がある任意の文字列の取り扱いに関する
実用的な結果について議論します。
6.4.1. 文字列の切り捨て
API内の任意の文字列は、認証器で利用可能な リソースが制限されている可能性を考慮しなければなりません。 切り捨て方針として文字列の切り捨てを選択する場合は、文字列値を破損しないよう慎重に行う必要があります。
例えば、Unicodeコードポイント単位の切り捨てだけだと、 書記素クラスタを途中で切り捨ててしまう場合があります。 これにより書記素クラスタが本来と異なるグリフで表示され、 単にグリフを削除するのではなく、文字列の意味自体が変化することがあります。 例えば、図はUTF-8エンコードされた 文字列の末尾で、そのエンコーディングは65バイトです。 サイズ制限64バイトに切り捨てる際、まず末尾の0x88バイトが除かれます。 これによってUTF-8のコードポイントが部分的に残る場合、その残りも削除する必要があります。 さらに書記素クラスタも部分的に残る場合は、その残りも削除しなければなりません。
これらに対応する責任は主にクライアントにあります。 認証器に文字コードやUnicode特性への理解の負担を 与えないためです。 以下のサブセクションで、クライアントおよび認証器による文字列切り捨ての要件を定義します。
6.4.1.1. クライアントによる文字列の切り捨て
WebAuthnクライアントが 文字列を切り捨てる場合、 Relying Partyが観測できる切り捨て動作は以下の要件を満たさなければなりません(MUST):
指定された最小対応長以上のサイズ上限を選択すること。 文字列はUTF-8エンコーディングでバイト長がその制限を満たすように切り捨ててもよい(MAY)。 この切り捨てはUTF-8コードポイント境界を必ず守る必要があり(MUST)、 さらに書記素クラスタ境界もできるだけ守るべきです(SHOULD) [UAX29]。 切り捨て結果は選んだサイズ制限より短くても良いですが、 制限を満たしかつ書記素クラスタの境界で終わる最長接頭辞より短くなってはなりません(MUST NOT)。
クライアントは、上記要件を満たすのであれば認証器に切り捨てを任せてもよい(MAY)。 満たさない場合は、値を認証器に引き渡す前にクライアント側で切り捨てを行わなければなりません(MUST)。
さらに、バイト境界だけで切り捨てるとよく知られた問題があり、ユーザーエージェントは注意すべきです。 認証器が[FIDO-CTAP]を用いている場合、 認証器から送信される将来のメッセージに無効なCBORが含まれる恐れがあります。 (値はCBOR文字列として型付けされており、これは有効なUTF-8である必要がある。) よって、認証器を扱う際、ユーザーエージェントは以下に従うべきです(SHOULD):
-
認証器に送信する文字列が正しくエンコードされていることを確認すること。
-
切り捨ての結果、エンコーディングが無効になる場合の対応を行うこと。 例えば末尾の部分的なコードポイントは削除するか、U+FFFDに置き換える、など。
6.4.1.2. 認証器による文字列の切り捨て
WebAuthn認証器は制限された環境で実装される場合があるため、 認証器に対する要件はクライアントより緩和されています。
WebAuthn認証器 が文字列を切り捨てる場合、その切り捨て動作は以下の要件を満たさなければなりません(MUST):
指定された最小対応長以上のサイズ上限を選択すること。 文字列はUTF-8エンコーディングでバイト長がその制限を満たすように切り捨ててもよい(MAY)。 この切り捨てはUTF-8コードポイント境界をできるだけ守るべきで(SHOULD)、 書記素クラスタ境界も守ってもよい(MAY) [UAX29]。 切り捨て結果は選んだサイズ制限より短くても良いですが、 制限を満たしかつ書記素クラスタの境界で終わる最長接頭辞より短くなってはなりません(MUST NOT)。
6.4.2. 言語および方向情報のエンコーディング
コンテキストにおいて正しく表示されるためには、文字列の言語と基準方向の情報が必要となる場合があります。 このAPIの文字列は、固定機能の認証器に書き込まれ、後で異なるプラットフォームで 表示されることがあります。そのため、言語・方向メタデータは文字列自体にエンコードされ、 アトミックに受け渡されることが保証されます。
言語・方向メタデータを許容する文字列にエンコードするには、コードポイントの末尾に以下2つのシーケンスを付与します:
ひとつ目は言語タグで、U+E0001の後に言語タグのASCII値それぞれにU+E0000加えた コードポイントを続ける。たとえば“en-US”はU+E0001, U+E0065, U+E006E, U+E002D, U+E0055, U+E0053 となります。
ふたつめはU+200E(“左から右マーク”)、U+200F(“右から左マーク”)、またはU+E007F(“CANCEL TAG”)から ひとつのコードポイント。最初の2つは必要時のみ使用すべきですが(SHOULD)、 方向性を明示できます(例:RTL文字列で先頭がLTR強い字種の場合など)。 U+E007Fは言語タグ終了の方向非依存インジケーターです。
従って、“حبیب الرحمان”という文字列は言語エンコードの有無で2つのDOMString値がありえます (方向が明確なため、この例では方向マーカは不要です)。
-
修飾なし: U+062D, U+0628, U+06CC, U+0628, U+0020, U+0627, U+0644, U+0631, U+062D, U+0645, U+0627, U+0646
-
“ar-SA”言語付き: U+062D, U+0628, U+06CC, U+0628, U+0020, U+0627, U+0644, U+0631, U+062D, U+0645, U+0627, U+0646, U+E0001, U+E0061, U+E0072, U+E002D, U+E0053, U+E0041, U+E007F
言語や方向情報付き文字列の利用者は、切り捨てによって 言語タグが別だが依然有効な言語になる場合があることに注意すべきです。 最終方向性マーカまたはCANCEL TAGコードポイントが切り捨て検出の明確な手がかりになります。
6.5. アテステーション
認証器は、可能であれば何らかのアテステーションも提供すべきです(SHOULD)。 認証器がそうする場合、基本要件は、認証器が 各クレデンシャル公開鍵ごとに、アテステーションステートメントを生成し、 これがWebAuthn Relying Partyによって検証可能であることです。一般的に、このアテステーションステートメントには、アテステーション対象となるクレデンシャル公開鍵とチャレンジに対するアテステーション秘密鍵による署名、ならびにアテステーション公開鍵の証明元を示す証明書や同等のデータが含まれます。 これにより、Relying Partyは信頼判定を行うことができます。ただし、アテステーション鍵ペアが利用できない場合、認証器はクレデンシャル公開鍵を対応するクレデンシャル秘密鍵で自己アテステーションするか、あるいはアテステーションなしを選択してもかまいません(MAY)。 これらの情報はすべて、新たな公開鍵クレデンシャルが生成されるたびに認証器から返され、全体としてアテステーションオブジェクトの形になります。アテステーションオブジェクトと、認証器データ(アテステーション付きクレデンシャルデータを含む)およびアテステーションステートメントの関係については、下記の図で示されています。
認証器が自己アテステーションや アテステーションなしを行う場合、 Relying Partyに対する由来情報は 提供されません。 この場合、認証器はRelying Partyに対し 動作保証を行いません。
attestation objectの重要な構成要素のひとつが attestation statementです。 これは署名付きデータオブジェクトであり、 公開鍵認証情報および、それを作成した 認証器についての情報を含みます。 attestation signatureは 証明主体の鍵で生成され(自己アテステーション時除く)ます。 attestation statementを正しく解釈するには、 Relying Partyが attestationの 以下2つの側面を理解する必要があります:
-
attestation statement format は、署名の表現方法および各種関連情報を 認証器が attestation statementにどのように組み込むかという形式です(構文定義)。既存OSやTPM等も attestation statement formatを定義しており、 本仕様は
§ 6.5.2 Attestation Statement Formatsで多様な拡張性のある形式をサポートします。 フォーマットIDは文字列です(§ 8.1 形式ID参照)。 -
attestation type は、attestation statement および信頼モデルの意味論です。 つまり、Relying Partyが あるattestation statementに どのように信頼を置くかを定めています。 本仕様は複数のattestation typeを § 6.5.3でサポートします。
一般に、attestation statement formatsと attestation typesには 単純な一対一の対応はありません。 例えばpackedは、すべての typeで使用可能ですが、 他は用途制限があります。
attestationのプライバシー、セキュリティ、運用特性は以下に依存します:
-
attestation type (信頼モデルの決定)
-
attestation statement format (表現力によりattestation強度を制限可能)
-
認証器自体の特性(構成やセキュア実行環境の有無等)
attestation typeおよび
attestation statement formatは
認証器が選択します。
Relying Partyは
attestation
やattestationFormats
パラメータでのみ希望を示せます。
ほとんどの認証器は、少数のattestation typeおよび attestation statement formatのみをサポートする想定です。 一方Relying Partyは ポリシーで受容形式を選択し、さらに信頼する認証器の特性自体 も理解する必要があります。例:FIDO Metadata Service([FIDOMetadataService])
6.5.1. 認証済みクレデンシャルデータ
認証済みクレデンシャルデータは、クレデンシャルのアテステーションオブジェクトを生成する際に認証器データに追加される可変長のバイト配列です。そのフォーマットは表に示されています。
| 名称 | 長さ(バイト数) | 説明 |
|---|---|---|
| aaguid | 16 | 認証器のAAGUID。 |
| credentialIdLength | 2 | credentialIdのバイト長L、16ビットの符号なしビッグエンディアン整数。値は1023以下でなければなりません(MUST)。 |
| credentialId | L | クレデンシャルID |
| credentialPublicKey | 可変 | クレデンシャル公開鍵をCOSE_Key形式でエンコードしたもの。定義はRFC9052セクション7。CTAP2カノニカルCBOR符号化形を使用。
COSE_Keyでエンコードされた公開鍵には必ず"alg"パラメータが含まれ、
その他のオプションパラメータは含まれてはならない(MUST NOT)。
"alg"パラメータにはCOSEAlgorithmIdentifier値をいれます。
エンコードされたクレデンシャル公開鍵には、該当キー種別仕様で要求されたREQUIREDパラメータ
("kty"及び"alg"でREQUIREDなもの、RFC9053セクション2参照)も含めなければなりません(MUST)。
|
6.5.1.1. credentialPublicKeyのCOSE_Key形式エンコード値の例
この項では、ES256、PS256、RS256署名アルゴリズム用のCOSE_Keyでエンコードされた楕円曲線およびRSA公開鍵の例を示します。 これらは上記credentialPublicKey値のルールに従い、説明のため CDDL [RFC8610] で記載しています。
RFC9052セクション7で すべてのCOSE_Keyエンコード鍵の一般枠組みが定義されています。 個別アルゴリズム用の具体的なキー種別仕様は、[RFC9053] などに定められています。
以下はEC2形式(RFC9053セクション7.1)の楕円曲線公開鍵(P-256曲線、ES256署名アルゴリズム用)のエンコード例です(ECDSA + SHA-256、RFC9053セクション2.1)。
{ 1 : 2 , ; kty: EC2 key type 3 : -7 , ; alg: ES256 signature algorithm -1 : 1 , ; crv: P-256 curve -2 : x , ; x座標(32バイトのバイト列) ; 例: 16進: 65eda5a12577c2bae829437fe338701a10aaa375e1bb5b5de108de439c08551d -3 : y ; y座標(32バイトのバイト列) ; 例: 16進: 1e52ed75701163f7f9e40ddf9f341b3dc9ba860af7e0ca7ca7e9eecd0084d19c }
上記楕円曲線公開鍵のCTAP2カノニカルCBOR符号化形によるエンコード例(スペース・改行を挿入)は次です(CDDL表記にあわせるため):
A5 01 02 03 26 20 01 21 58 20 65eda5a12577c2bae829437fe338701a10aaa375e1bb5b5de108de439c08551d 22 58 20 1e52ed75701163f7f9e40ddf9f341b3dc9ba860af7e0ca7ca7e9eecd0084d19c
次は2048ビットRSA公開鍵(COSE_Keyエンコード)のPS256署名アルゴリズム対応例です([RFC8230] セクション4、 PS256署名アルゴリズム:RSASSA-PSS+SHA-256、セクション2)。
{ 1 : 3 , ; kty: RSA key type 3 : -37 , ; alg: PS256 -1 : n , ; n: RSA法モジュラスn(256バイトのバイト列) ; 例: 16進(中略): DB5F651550...6DC6548ACC3 -2 : e ; e: RSA公開指数e(3バイトのバイト列) ; 例: 16進: 010001 }
下は同じRSA公開鍵をRS256署名アルゴリズム(RSASSA-PKCS1-v1_5+SHA-256)用とした例です:
{ 1 : 3 , ; kty: RSA key type 3 : -257 , ; alg: RS256 -1 : n , ; n: RSA法モジュラスn(256バイトのバイト列) ; 例: 16進(中略): DB5F651550...6DC6548ACC3 -2 : e ; e: RSA公開指数e(3バイトのバイト列) ; 例: 16進: 010001 }
6.5.2. アテステーションステートメント形式
上記で述べたように、アテステーションステートメント形式は、認証器によるコンテキスト情報への暗号署名を表現するデータ形式です。各アテステーションステートメント形式は下記のテンプレートで定義しなければなりません(MUST):
-
対応アテステーション種別:
-
構文:この形式で生成されたアテステーションステートメントの構文は、拡張ポイント
$$attStmtType用にCDDL [RFC8610] で定義する(§ 6.5.4 アテステーションオブジェクトの生成参照)。 -
署名手順: この形式でアテステーションステートメントを算出するための署名手順。証明すべき公開鍵クレデンシャル、認証器データ構造体(アテステーション用認証器データ)、シリアライズ済クライアントデータのハッシュを引数とする。
-
検証手順: アテステーションステートメントを検証するための手順で、以下の検証手順入力をとる:
-
attStmt: アテステーションステートメント構造体
-
authenticatorData: アテステーションで使用されたと主張される認証器データ
-
clientDataHash: シリアライズ済クライアントデータのハッシュ
この手順の戻り値は:
-
アテステーションが無効であることを示すエラー、または
-
実装依存値(アテステーション種別および信頼経路、この信頼経路は (自己アテステーション時は空、またはX.509証明書の集合)
-
規定済みアテステーションステートメント形式の初期リストは§ 8 定義済みアテステーションステートメント形式にあります。
6.5.3. アテステーション種別
WebAuthnは複数のアテステーション種別をサポートしており、アテステーションステートメントの意味論および背後にある信頼モデルを定義します:
注: この仕様は、認証器が用いるアテステーション種別を明示的に表現するデータ構造を定義していません。アテステーションステートメント検証
に関わるRelying Party(
例:navigator.credentials.create()
呼び出し時にnone以外の
伝達モードを選択し、受け取ったアテステーションステートメントを検証する)では、
検証の過程で用いられたアテステーション種別を特定します。
"Verification procedure"の詳細は§ 8参照。
§ 14.4.1 アテステーションプライバシーも参照してください。
本セクションで定義されるSelfとNone以外の
すべてのアテステーション種別では、Relying Partyの検証
の後に信頼経路が7.1-23ステップで
許容ルート証明書とマッチングされます。これらの区別は、アテステーションがRelying Partyのポリシーで許容されるか判断する際に特に有用です。
- 基本アテステーション(Basic)
-
基本アテステーション[UAFProtocol]の場合、認証器のアテステーション鍵ペアは 認証器「モデル」(いわゆるバッチ)に固有です。よって同一または類似モデルの認証器は同じ鍵ペアを共有する場合があります。詳細は§ 14.4.1 アテステーションプライバシー参照。
基本アテステーションはバッチアテステーションとも呼ばれます。
- 自己アテステーション(Self)
-
自己アテステーション、別名代理基本アテステーション[UAFProtocol]では、 認証器は特定のアテステーション鍵ペアを持ちません。その代わり、クレデンシャル秘密鍵を使いアテステーション署名を作成します。アテステーション秘密鍵に実質的な保護がない認証器によく使われます。
- アテステーションCA(AttCA)
-
この場合、認証器はTPM上に構築されており、認証器固有の「認証鍵」(EK)を持っています。この鍵は信頼できる第三者であるアテステーションCA と安全に通信するために使われます。アテステーションCA(旧称Privacy CA)[TCG-CMCProfile-AIKCertEnroll] です。認証器は複数のAIK(アテステーション用識別鍵ペア)を生成でき、個々にアテステーションCAに証明書発行を依頼できます。この方式でEK(グローバル固有ハンドル)の露出制限も可能です。各認証器生成公開鍵クレデンシャルごとにAIK発行が可能で Relying Partyへは アテステーション証明書として伝達されます。
注: この概念では複数アテステーション証明書となる場合があり、 直近に要求された証明書が「アクティブ」となります。
- 匿名化CA(AnonCA)
-
この場合、認証器は匿名化CAを利用し、各クレデンシャルごとに動的にアテステーション証明書を生成します。これによりアテステーションステートメントが一意識別情報を持たず 追跡目的等に悪用されにくくなります。
注: アテステーションステートメントで attestation種別AttCAやAnonCAを伝送する場合も、Basicと同じデータ構造です。よって3種別の違いは外部知識・証明書内容に依存します。
- アテステーションステートメントなし(None)
-
この場合、アテステーション情報は存在しません。§ 8.7 アテステーションなしステートメント形式も参照。
6.5.4. アテステーションオブジェクトの生成
アテステーションオブジェクト(図6参照)を生成するために、次を与える:
- attestationFormat
- authData
-
認証器データを含むバイト配列
- hash
認証器は次を行わなければなりません(MUST):
-
attStmtを、attestationFormatの署名手順をauthDataとhashを使い実行した結果とします。
-
fmtをattestationFormatのアテステーションステートメント形式識別子とします。
-
アテステーションオブジェクトを以下のCBORマップ構文で返します。本アルゴリズムで初期化した変数値で埋めます:
attObj = { authData: bytes, ; $$attStmtTypeの各選択肢がfmt値・attStmt構造を定義 $$attStmtType } .within attStmtTemplate attStmtTemplate = { authData: bytes, fmt: text, attStmt: ( { * tstr => any } ; 各具体的attStmtTypeごとにMapが埋まる // [ * any ] ; attStmtが配列となる場合もある ) }
6.5.5. Packed Attestation、FIDO U2Fアテステーションおよびアサーション署名の署名フォーマット
-
COSEAlgorithmIdentifier -7(ES256)やその他ECDSA系アルゴリズムでは、
sig値は[RFC3279] セクション2.2.3で定義されるASN.1 DER Ecdsa-Sig-Valueとしてエンコードしなければなりません(MUST)。例: 30 44 ; シーケンス(68バイト) 02 20 ; 整数(32バイト) | 3d 46 28 7b 8c 6e 8c 8c 26 1c 1b 88 f2 73 b0 9a | 32 a6 cf 28 09 fd 6e 30 d5 a7 9f 26 37 00 8f 54 02 20 ; 整数(32バイト) | 4e 72 23 6e a3 90 a9 a1 7b cf 5f 7a 09 d6 3a b2 | 17 6c 92 bb 8e 36 c0 41 98 a2 7b 90 9b 6e 8f 13注: CTAP1/U2Fの認証器は既にこの形式で署名値を生成しており、 CTAP2の認証器も同じ署名フォーマットとなります(一貫性保持のため)。
新たに定義されるアテステーション形式はASN.1符号化を使わず、 内部構造を持たない同じ長さのバイト配列(固定長)として、 [RFC9053]や[RFC8230] で定義されるCOSE署名と同じ表現を用いることが推奨されます(RECOMMENDED)。
下記署名フォーマット定義はこの要件を満たしており、 ここに明記されていない他の署名アルゴリズムでも同じ方式で導出可能です:
-
COSEAlgorithmIdentifier -257(RS256)の場合、
sigは[RFC8017]セクション8.2.1に定義されSHA-256を使うRSASSA-PKCS1-v1_5署名方式で生成したものを必ず含めなければなりません(MUST)。 署名はASN.1ラップされません。 -
COSEAlgorithmIdentifier -37(PS256)の場合、
sigは[RFC8017]セクション8.1.1に定義されSHA-256を使うRSASSA-PSS署名方式で生成したものを必ず含めなければなりません(MUST)。 署名はASN.1ラップされません。
7. WebAuthn Relying Party の操作
登録
または 認証セレモニー は、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. 新しい認証情報の登録
登録セレモニー を実施するには、Relying Party は次の手順に従う必要があります:
-
options を新しい
CredentialCreationOptions構造体として、Relying Party のセレモニー要件に合わせて設定する。 pkOptions をoptions.とする。publicKey -
navigator.credentials.create()を呼び出し、引数として options を渡す。 credential を正常に解決された promise の結果とする。 promise が拒否された場合は、ユーザーに可視化されたエラーでセレモニーを中止するか、拒否された promise 内で入手可能なコンテキストから導かれるようなユーザー体験を案内する。 例えば、promise が "InvalidStateError" に相当するエラーコードで拒否された場合、ユーザーには別の 認証器 の利用を促すよう案内できる。 さまざまなエラーコンテキストやそれに至る状況については § 6.3.2 The authenticatorMakeCredential Operation を参照。 -
response を
credential.とする。 response がresponseAuthenticatorAttestationResponseのインスタンスでない場合は、ユーザーに可視化されたエラーでセレモニーを中止する。 -
clientExtensionResults を
credential.の呼び出し結果とする。getClientExtensionResults() -
JSONtext を UTF-8 デコード を
response.に実行した結果とする。clientDataJSON注: どの実装の UTF-8 decode を使っても、UTF-8 decode アルゴリズムと同じ結果が得られれば問題ありません。特に、先頭のバイト順マーク(BOM)は削除されなければなりません。
-
C(資格情報作成時に収集されたと主張されるクライアントデータ)を、JSONtext に実装依存の JSON パーサーを実行した結果とする。
注: C は、その要素をこのアルゴリズムで参照できる限り、どのような実装依存データ構造表現でも可。
-
C.の値がtypewebauthn.createであることを検証する。 -
C.の値が、 base64url エンコーディング済みchallengepkOptions.と等しいことを検証する。challenge -
C.の値が origin であり、Relying Party が想定するものと一致することを確認する。 § 13.4.9 資格情報のオリジンの検証 を参照。origin -
C.が存在しcrossOrigintrueの場合、 Relying Party がこの資格情報が same-origin with its ancestors でない iframe 内で生成されたことを期待しているか検証する。 -
もし
C.が存在する場合:topOrigin-
Relying Party が認証情報が same-origin with its ancestors でない iframe 内で作成されたことを期待しているか確認する。
-
C.の値が、 オリジン が Relying Party がサブフレームであることを想定するページのオリジン と一致することを検証してください。 詳しくは § 13.4.9 クレデンシャルのオリジンの検証 を参照してください。topOrigin
-
-
hash を、
response.にSHA-256を使ってハッシュした結果とする。clientDataJSON -
attestationObjectフィールドにCBORデコードを実行し、アテステーションステートメントフォーマット fmt、認証器データ authData、 アテステーションステートメント attStmt を得る。 -
rpIdHashが authData 内で、RP ID のSHA-256ハッシュ値(Relying Party の想定するもの)と一致することを確認する。 -
options.がmediationconditionalでない場合、authData 内flagsの UP ビットがセットされているか確認する。 -
Relying Party がこの登録で ユーザー検証 を必須とする場合、 authData 内
flagsの UV ビットがセットされているか確認する。 -
BE ビットが authData 内
flagsでセットされていない場合、BS ビットもセットされていないことを検証する。 -
Relying Party が認証情報の バックアップ適格性 を利用する場合、authData の
flagsの BE ビットを評価する。 -
Relying Party が認証情報の バックアップ状態 を利用する場合、authData の
flagsの BS ビットを評価する。 -
credential public key 内の "alg" パラメータが authData で、
alg属性とpkOptions.内いずれかの 項目 に一致することを確認する。pubKeyCredParams -
USASCII 大文字小文字区別で fmt を一致させてアテステーションステートメントフォーマットを特定し、サポートされている WebAuthn アテステーションステートメントフォーマット識別子セットに含まれていることを確認する。登録済みWebAuthnアテステーションステートメントフォーマット識別子値は IANA「WebAuthn Attestation Statement Format Identifiers」レジストリ[IANA-WebAuthn-Registries]にて管理され、[RFC8809]によって制定されている。
-
attStmt が正しい アテステーションステートメント(有効なアテステーション署名を持つ)であることを、アテステーションステートメントフォーマット fmt の検証手順で
attStmt, authData, hash を使って検証する。
注: 各 アテステーションステートメントフォーマット は独自の 検証手順 を定義しています。初期定義フォーマットは § 8 Defined Attestation Statement Formats 参照、最新は[IANA-WebAuthn-Registries]へ。
-
検証に成功したら、そのアテステーション種別とフォーマット fmt
にとって許容できる信頼アンカー(=アテステーションルート証明書)リストを信頼できる経路またはポリシーから取得する。例えば、FIDO メタデータサービス[FIDOMetadataService]が情報取得の一方法を提供しており、
aaguid(attestedCredentialData内)を利用する。 -
検証手順の出力を使ってアテステーションの信頼性を評価する(ステップ21)。
-
ノーアテステーションが提供された場合は、None アテステーションが Relying Party ポリシーで許容されるか検証する。
-
自己アテステーションが用いられた場合は、自己アテステーションが Relying Party ポリシーで許容されるか検証する。
-
その他の場合は、X.509 証明書(アテステーション信頼パスとして検証手順から返される)を利用し、アテステーション公開鍵が適切なルート証明書へ連鎖するか、またはそれ自体が適切な証明書であること(例:この証明書とステップ22で得たルート証明書が同一でもよい)を検証する。
アテステーションステートメントが信頼できないと判断された場合、Relying Party は 登録セレモニー を失敗させるべきです。
注: ただし、ポリシーで許可されているなら、Relying Party は credential ID および公開鍵を登録して 自己アテステーション (§ 6.5.3 Attestation Types 参照)として扱うこともできます。 その場合、Relying Party は当該 公開鍵資格情報 が特定の 認証器 モデルで生成されたという暗号学的証拠はないことを受け入れていることになります。 詳細は [FIDOSecRef] および [UAFProtocol] を参照してください。
-
-
credentialIdは1023バイト以下か検証する。これより大きい場合、その 登録セレモニー を失敗させるべきです。 -
credentialIdがまだどのユーザーにも登録されていないか検証する。既知ならcredentialIdは Relying Party がこの 登録セレモニー を失敗させるべきです。注: Relying Parties が重複する credential IDs を拒否する根拠は次のとおりです。credential IDs には十分なエントロピーがあるため偶発的に重複する可能性は非常に低いですが、自己アテステーション以外のアテステーション種別 では秘密鍵の所有証明となる署名が含まれません。攻撃者が既存の credential ID および 公開鍵 を何らかの方法で入手し悪用した場合、本来のユーザーの資格情報が攻撃者のものに上書きされてしまう可能性があります。被害ユーザーが再度サインインした際に攻撃者のアカウントにログインされ得ます。
-
credentialRecord を新しい
認証情報レコード
とし、内容は以下とする:
- type
-
credential.type - id
-
credential.またはidcredential.(Relying Party が好む形式)rawId - publicKey
-
公開鍵(authData内)
- signCount
-
authData.signCount - uvInitialized
- transports
-
response.の戻り値。getTransports() - backupEligible
- backupState
新しい認証情報レコードには次のオプション内容も含めてよい:
- attestationObject
-
response.attestationObject - attestationClientDataJSON
-
response.clientDataJSON
Relying Party はさらに必要に応じて 項目 を追加することもできます。 非規範的な例として、Relying Party はユーザーがアカウント設定時に どの 認証情報 がどの 認証器 に紐付くか覚えやすくするために ニックネームを指定できるようにすることが考えられます。
-
clientExtensionResults 内の クライアント拡張出力 と、authData の
extensions内の 認証器拡張出力 を Relying Party 要件に従い処理する。 各 拡張 により、処理手順が具体的に規定されている場合もあれば Relying Party に任される場合もある。 Relying Party は任意の拡張出力を無視できる。クライアント は 認証器拡張やクライアント拡張を追加設定でき、その結果として 認証器拡張出力 や クライアント拡張出力に Relying Party が
pkOptions.でリクエストしていない値が含まれることもある。 Relying Party はこれに対応できるよう備える必要があり、 拡張を無視するかアテステーションを拒否するかローカルポリシーで判断できる。extensionsすべての拡張は クライアント・認証器 の両方で任意であるため、Relying Party は、 リクエストした拡張の一部またはすべてが省略された場合にも対応できなければならない。
-
以上すべての手順に成功したら、 ユーザーアカウントに credentialRecord を保存し、 登録セレモニー を続行する。 うまくいかなければ 登録セレモニー を失敗させる。
Relying Party がこのケースで 登録セレモニー を失敗させない場合、 特定の 認証器 モデルで 公開鍵資格情報 が生成された暗号学的証拠がないことを受け入れたことになる。 Relying Party はこの認証情報を ノーアテステーションと同等扱いにしてよい(§ 6.5.3 Attestation Types参照)。 [FIDOSecRef] および [UAFProtocol] に詳細あり。
アテステーションオブジェクトの検証には Relying Party が ステップ22で適切な信頼アンカーを取得する信頼できる方法を持っている必要があります。 また証明書利用時、Relying Party は中間CA証明書の状態情報にアクセスできる必要があり、 Relying Party はクライアントからアテステーション情報で証明書チェーンが提供されなかった場合にもチェーンの構築ができなければならない。
7.2. 認証アサーションの検証
認証セレモニー を実行するために、Relying Party は以下の手順を実施しなければなりません。
-
options を新しい
CredentialRequestOptions構造体とし、Relying Party のセレモニー要件に応じて設定する。 pkOptions をoptions.とする。publicKey -
navigator.credentials.get()を呼び出し、引数に options を渡す。 credential を promise が正常に解決された結果とする。 promise が拒否された場合は、ユーザーに可視化されるエラーでセレモニーを中止するか、拒否理由に基づいてユーザー体験を案内すること。 様々なエラーの詳細は § 6.3.3 authenticatorGetAssertion Operation を参照。 -
response を
credential.とする。 response がresponseAuthenticatorAssertionResponseのインスタンスでない場合、可視化エラーでセレモニーを中止する。 -
clientExtensionResults を
credential.の結果とする。getClientExtensionResults() -
もし
pkOptions.が 空でない場合は、allowCredentialscredential.がidpkOptions.に列挙された公開鍵クレデンシャルのいずれかを識別していることを検証してください。allowCredentials -
認証されようとしているユーザーを特定し、その credential record を credentialRecord とする:
- ユーザーが 認証セレモニー 前に(例:ユーザー名やCookie経由で)特定されていた場合
-
特定された ユーザーアカウント に credential record が存在し、その id が
credential.と等しいことを検証し、 その credential record を credentialRecord とする。rawIdresponse.が存在する場合は、 これが user handle(ユーザーアカウントの)と一致するか検証する。userHandle - ユーザーが 認証セレモニー 開始時に特定されていなかった場合
-
response.が存在することを検証する。userHandleresponse.で特定される ユーザーアカウント に credential record があり、その id がuserHandlecredential.と等しいことを検証する。 その credential record を credentialRecord とする。rawId
-
cData、authData、sig を response の
clientDataJSON、authenticatorData、signatureの値とする。 -
JSONtext を UTF-8 デコード を cData に実行した結果とする。
注: どの実装の UTF-8 decode を使っても、UTF-8 decode アルゴリズムと同じ結果が得られれば可。特に先頭のバイト順マーク(BOM)は削除が必要。
-
C(署名に使われたと主張されるクライアントデータ)を、JSONtext に実装依存のJSONパーサを実行した結果とする。
注: C は本アルゴリズムで要素参照可能であれば実装依存の構造体でよい。
-
C.の値が文字列typewebauthn.getであることを検証する。 -
C.の値が、challengepkOptions.の base64url エンコード値と等しいことを検証する。challenge -
C.の値が origin であり、Relying Party が期待するものと一致するか検証する。 手順は § 13.4.9 資格情報のオリジンの検証 参照。origin -
C.が存在しcrossOrigintrueの場合、 Relying Party がこの認証情報が same-origin with its ancestors でない iframe 内で使われることを想定しているか検証する。 -
C.が存在する場合:topOrigin-
Relying Party がこの認証情報が same-origin with its ancestors でない iframe 内で使われることを想定しているか検証する。
-
C.の値が origin であり、 Relying Party が サブフレームとして期待するページの origin に一致することを検証する。 § 13.4.9 資格情報のオリジンの検証 参照。topOrigin
-
-
rpIdHash(authData 内)が、RP ID のSHA-256ハッシュ値(Relying Partyの想定値)と等しいか検証する。注: appid拡張利用時は特別な条件が必要。 § 10.1.1 FIDO AppID Extension (appid) 参照。
-
このアサーションで ユーザー検証 が必要か判定する。
pkOptions.がuserVerificationrequiredに設定されている場合のみ、ユーザー検証 を要求すべき。実際に ユーザー検証 が必要と判定された場合は
flagsの UV ビット(authData内)が セットされているか確認し、それ以外の場合は UV フラグの値は無視する。 -
BE ビットが
flags(authData 内)でセットされていない場合は、BS ビットもセットされていないことを確認する。 -
認証情報の バックアップ状態 を Relying Party のビジネスロジックまたはポリシーで利用する場合は、 currentBe, currentBs を
BE, BS 各ビット(authData 内flags) の値とし、これをcredentialRecord.backupEligibleおよびcredentialRecord.backupStateと比較する:-
credentialRecord.backupEligibleがセットされていれば currentBe もセットされているか検証する。 -
credentialRecord.backupEligibleが未セットの場合、currentBe も未セットであることを検証する。 -
必要に応じて Relying Party ポリシーを適用する。
注: § 6.1.3 Credential Backup State に Relying Party による BS フラグ処理例あり。
-
-
hash を cData を SHA-256 でハッシュした結果とする。
-
credentialRecord.publicKeyを使い、authData と hash のバイナリ連結に対する sig の署名検証を行う。注: この検証手順は FIDO U2F 認証器が生成した署名とも互換性がある。 § 6.1.2 FIDO U2F Signature Format Compatibility を参照。
-
authData.
signCountまたはcredentialRecord.signCountが0でない場合、以下のサブステップを実行する:-
authData.
signCount-
credentialRecord.signCountより大きい場合 - 署名カウンターは有効である。
-
credentialRecord.signCount以下の場合 -
これは認証器のクローン疑いの信号だが証明ではない。例えば次のような理由が考えられる:
-
複数個のcredential private keyが並行利用されている。
-
認証器の不具合。
-
Relying Party 側でアサーション応答を認証器生成順と異なる順で処理しているレースコンディション。
Relying Party は自組織の運用特性を評価し、この情報をリスク判定に活用すべきです。 Relying Party がこの場合に
credentialRecord.signCountを更新するか、認証セレモニー を失敗とするか否かは Relying Party固有判断です。署名カウンターについて詳しくは § 6.1.1 Signature Counter Considerations を参照。
-
-
-
-
clientExtensionResults の クライアント拡張出力 と
authData の
extensions内の 認証器拡張出力 を Relying Party 要件に従い処理する。 各 拡張ごとに処理手順が規定されている場合もあるし、Relying Party が出力をどう扱うか決めてもよい。 Relying Party は全てまたは一部の拡張出力を無視してもよい。クライアント が追加の 認証器拡張や クライアント拡張 をセットした結果、 認証器拡張出力や クライアント拡張出力 に Relying Party が
pkOptions.でリクエストしていない値が現れることもある。 Relying Party はそのような状況にも対応できるようにし、 拡張を無視するか却下するかはローカルポリシーで決めてよい。extensions全ての拡張は クライアント・認証器 の両方で任意実装であるため、 Relying Party はリクエストした拡張が全く使われない・全部は使われない場合にも対応できなければならない。
-
credentialRecord の新たな状態を反映して更新する:
-
credentialRecord.backupStateを currentBs の値で更新する。 -
credentialRecord.uvInitializedがfalseであれば、 UV ビット(flags、authData内)値に更新する。 この変更は WebAuthn ユーザー検証と同等の 追加認証要素による認証を必須とするべきで、認可できない場合はこの手順をスキップする。
Relying Party が これらWebAuthn 認証セレモニー 手順より追加のセキュリティチェックを行う場合は、上記状態更新はそれら追加チェックが完了し成功するまで遅延させるべきです。
-
以上すべてのステップが成功した場合は 認証セレモニー を適切に続行する。 そうでなければ 認証セレモニー を失敗させる。
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
- サポートされるアテステーション種別
- 構文
-
Packedアテステーションステートメントの構文は次のCDDLで定義されます:
$$attStmtType //= ( fmt: "packed", attStmt: packedStmtFormat ) packedStmtFormat = { alg: COSEAlgorithmIdentifier, sig: bytes, x5c: [ attestnCert: bytes, * (caCert: bytes) ] } // { alg: COSEAlgorithmIdentifier sig: bytes, }各フィールドの意味は以下の通りです:
- alg
-
COSEAlgorithmIdentifierであり、アテステーション署名に用いるアルゴリズムの識別子 - sig
-
アテステーション署名を格納するバイト列
- x5c
-
この配列の各要素はattestnCertおよびその証明書チェーン(存在する場合)をX.509形式で格納。先頭要素はattestnCertとすること。
- attestnCert
-
X.509形式でエンコードされたアテステーション証明書
- 署名手順
-
このアテステーションステートメントフォーマットの署名手順は アサーション署名生成手順と類似です。
-
authenticatorData を アテステーション用認証器データ とし、clientDataHash を シリアライズしたクライアントデータのハッシュ とする。
-
Basic または AttCA アテステーション利用では、認証器はauthenticatorDataとclientDataHashを連結し、認証器固有の方法で選択したアテステーション秘密鍵 で署名(sig)し出力する。x5cにはattestnCertとその証明書チェーン(存在する場合)を格納し、algには秘密鍵のアルゴリズムを指定する。
-
自己アテステーション利用の場合は、認証器はauthenticatorDataとclientDataHashを連結し、 資格情報秘密鍵で署名する(sig)。algは資格情報秘密鍵のアルゴリズム、他フィールドは省略。
-
- 検証手順
-
検証手順入力 attStmt、authenticatorData、clientDataHash を受け、 検証手順は次の通り:
-
attStmt が上記構文にかなう有効なCBORか検証し、CBORデコードでフィールドを抽出。
-
x5cが存在する場合:
-
sigが、authenticatorDataとclientDataHash連結に対しalgアルゴリズム指定・attestnCert内公開鍵で正当な署名か検証。
-
attestnCertが§ 8.2.1 Packedアテステーション証明書要件 を満たすか検証。
-
attestnCertに拡張OID
1.3.6.1.4.1.45724.1.1.4(id-fido-gen-ce-aaguid)が含まれる場合、その値がaaguid(authenticatorData内)と一致するか検証。 -
成功した場合は実装依存の値(アテステーションタイプ Basic、AttCAまたは不確定値、および アテステーション信頼パス(x5c))を返す。
-
-
x5cが無い場合は自己アテステーション利用になる。
-
algが
credentialPublicKey(authenticatorData内)のアルゴリズムと一致するか検証。 -
credential public key・algでsigがauthenticatorDataとclientDataHash連結に対し有効署名か検証。
-
成功した場合は実装依存の値(アテステーションタイプ Selfと空の 信頼パス)を返す。
-
-
8.2.1. Packedアテステーションステートメントの証明書要件
アテステーション証明書には次のフィールド/拡張が必須です:
-
バージョンは3(ASN.1 INTEGER値2で表現)でなければなりません。
-
Subjectフィールドは下記の通り:
- Subject-C
-
認証器ベンダの法人所在地国(ISO3166コード、PrintableString)
- Subject-O
-
認証器ベンダの正式名(UTF8String)
- Subject-OU
-
リテラル値 “Authenticator Attestation”(UTF8String)
- Subject-CN
-
ベンダが任意に選択するUTF8String
-
ルート証明書が複数モデルで使われる場合、拡張OID
1.3.6.1.4.1.45724.1.1.4(id-fido-gen-ce-aaguid)が必須で、16バイトOCTET STRING形式のAAGUIDを格納すること。 この拡張はcritical指定不可。アテステーションルート証明書が複数モデルで使われるかを RP 側が知り得ない場合もあるので、RP側では拡張有無をチェックし、 拡張があればその値がアテステーションオブジェクトのAAGUIDと一致するか検証が推奨されます。
X.509 Extensionは値のDERエンコーディングをOCTET STRINGで包むため、AAGUIDはOCTET STRINGが二重にネストされた形式でエンコードされる必要あり。
-
Basic Constraints拡張のCA項目は
falseでなければなりません。
さらにAuthority Information Access(AIA)拡張のid-ad-ocspエントリとCRL Distribution Point拡張
[RFC5280]
は、省略可。多くのアテステーション証明書の状態は認証器メタデータサービス経由でも取得できるため。例:FIDOメタデータサービス
[FIDOMetadataService]
特定認証器モデルのファームウェアを識別する拡張OID1.3.6.1.4.1.45724.1.1.5(id-fido-gen-ce-fw-version)も存在可能。
これが含まれる場合、非負整数(新ファームリリース毎に増加)。critical指定不可。
例えば以下は必須拡張OIDとフィールドを含むアテステーション証明書例です:
-----BEGIN CERTIFICATE-----MIIBzTCCAXOgAwIBAgIUYHS3FJEL/JTfFqafuAHvlAS+hDYwCgYIKoZIzj0EAwIw QTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC1dlYkF1dG4gV0cxHDAaBgNVBAwME0V4 YW1wbGUgQXR0ZXN0YXRpb24wIBcNMjQwMTAzMTc0NTIxWhgPMjA1MDAxMDYxNzQ1 MjFaMEErMAkGA1UEBhMCVVMxFDASBgNVBAoMC1dlYkF1dG4gV0cxHDAaBgNVBAwM E0V4YW1wbGUgQXR0ZXN0YXRpb24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQE Q0DfYmhRR+ASgY7YR0zNXa6W+4CLj6Heu6sh+lHS+Kmoel1K+rROz65fg30Oz2B/ cjDjHItd5v5D+M4FhZREaNHMEUwIQYKKwYBBAGC5RwBAQQEEgQQzYw5XCDt7t5lO wB5fQPKPDASBgsrBgEEAYLlHAEBBAQDAgEqMAwGA1UdEwEB/wQCMAAwCgYIKoZI zj0EAwIDSAAwRQIhANA5NoBRW0uEMc5c6BjaRGcrqGttGB/YQp1MsnUOz9EAiEA6 YhuWEjcAsIczmjvQgbuJTKcP5Uk7xWL96sDt5ux/A3A== -----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.2(id-fido-gen-ce-sernum)は、エンタープライズ用途のpackedアテステーションで追加的に含めることができます。含まれる場合、この拡張子は特定AAGUIDごとにデバイス毎にユニークなオクテット列値を示さなければなりません。この値は工場出荷時リセット後も不変ですが、他のシリアル番号やハードウェア識別子と異なっていてもかまいません。この拡張はcritical指定不可かつOCTET
STRING形式、エンタープライズ用途以外では含めてはなりません。
8.3. TPMアテステーションステートメントフォーマット
このアテステーションステートメントフォーマットは、暗号エンジンとしてTPM(Trusted Platform Module)を用いる認証器が主に使用します。
- アテステーションステートメントフォーマット識別子
-
tpm
- サポートされるアテステーション種別
- 構文
-
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であり、アテステーション署名に用いるアルゴリズムの識別子 - x5c
-
X.509エンコーディングのaikCert+その証明書チェーン
- aikCert
-
アテステーションに用いるAIK証明書(X.509形式)
- sig
-
アテステーション署名( [TPMv2-Part2] 11.3.4仕様 TPMT_SIGNATURE 構造体形式)
- certInfo
-
上記署名の対象としたTPMS_ATTEST構造体。 [TPMv2-Part2] 10.12.8仕様参照。
- pubArea
-
TPMで資格情報公開鍵を表すTPMT_PUBLIC構造体 ([TPMv2-Part2] 12.2.4参照)
- 署名手順
-
authenticatorData を アテステーション用認証器データ とし、clientDataHash を シリアライズしたクライアントデータのハッシュとする。
authenticatorDataとclientDataHashを連結しattToBeSignedを生成。
[TPMv2-Part3] 18.2節の手順に従い、attestation秘密鍵で署名を生成する。
extraDataパラメータにはattToBeSignedのダイジェスト値(署名アルゴリズム"alg"に対応するハッシュを適用)を指定。 (例:"RS256"ならSHA-256ダイジェスト。)pubAreaは資格情報公開鍵のパブリックエリア(TPMT_PUBLIC構造体)、 certInfo(TPMS_ATTEST構造体)は同名出力パラメータ、 sigは上記署名手順で得られた署名値を格納する。
注: pubAreaをTPMからTPM2_ReadPublicコマンドで取得した場合はTPM2B_PUBLIC構造体となる。その場合、先頭2バイト長情報を除去したうえでpubAreaとすること。
- 検証手順
-
検証手順入力 attStmt、authenticatorData、clientDataHash を受け取り 検証手順は次の通り:
attStmt が上記構文の有効なCBORか検証し、CBORデコードで各フィールド抽出。
parametersおよびunique(pubArea内)で規定される公開鍵がcredentialPublicKey(authenticatorData内attestedCredentialData)と同値であるか検証。authenticatorDataとclientDataHashを連結しattToBeSignedを生成。
certInfoの整合性検証:
-
x5cが存在することを検証。
-
aikCertが§ 8.3.1 TPMアテステーション証明書要件を満たすか検証。
-
aikCertにOID
1.3.6.1.4.1.45724.1.1.4(id-fido-gen-ce-aaguid)拡張が含まれる場合、 その値がaaguid(authenticatorData)と一致するか検証。 -
sigがcertInfoに対してalgのアルゴリズム・aikCert内公開鍵で有効な署名か検証。
certInfoが有効か検証(TPMS_ATTEST構造体):
-
magicがTPM_GENERATED_VALUEに設定されているか検証。 -
typeがTPM_ST_ATTEST_CERTIFYに設定されているか検証。 -
extraDataがattToBeSignedのハッシュ("alg"のハッシュアルゴリズム)値であるか検証。 -
attestedフィールドが [TPMv2-Part2] 10.12.3で定義されるTPMS_CERTIFY_INFO構造体であり、 そのnameフィールドにpubAreaに有効なName値を持つか確認([TPMv2-Part1] 16節の手順で計算、nameAlgはpubAreaに従う)。注: 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 アテステーション証明書 には、次のフィールド/拡張が必須です:
-
バージョン(Version)は3に設定しなければなりません。
-
Subjectフィールドは空でなければなりません。
-
Subject Alternative Name拡張は [TPMv2-EK-Profile] 3.2.9節で定義された通りに設定しなければなりません。
注: [TPMv2-EK-Profile] の旧バージョンでは、EK証明書にTPMシリアル番号を持つ HardwareModuleName という任意属性を含めることもできましたが、HardwareModuleNameは アテステーション証明書 のSubject Alternative Nameに置いてはなりません。
-
Extended Key Usage拡張にはOID
2.23.133.8.3("joint-iso-itu-t(2) internationalorganizations(23) 133 tcg-kp(8) tcg-kp-AIKCertificate(3)")が必須です。 -
Basic Constraints拡張のCA項目は
falseでなければなりません。 -
Authority Information Access (AIA)拡張で
id-ad-ocspのエントリと、CRL Distribution Point拡張 [RFC5280] は、 多くのアテステーション証明書の状態がメタデータサービスにより取得できるため、どちらも任意です。 例としてFIDOメタデータサービス [FIDOMetadataService] を参照。
8.4. Androidキーアテステーションステートメントフォーマット
該当する 認証器 がAndroid "N" 以降に対応した プラットフォーム認証器である場合、 アテステーションステートメントは Android キーアテステーション に基づきます。このケースでは、アテステーションステートメントはセキュアな実行環境で動作するコンポーネントによって生成されますが、アテステーション用認証器データ はその外部で生成されます。WebAuthn Relying Party はアテステーションで使用されたと主張される認証器データがアテステーション証明書拡張データのフィールドと矛盾しないかチェックすることが期待されます。
- アテステーションステートメントフォーマット識別子
-
android-key
- サポートされるアテステーション種別
- 構文
-
Androidキーアテステーションステートメントは単に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 を返り値でセット。認証器は authenticatorData と clientDataHash 連結に資格情報秘密鍵で署名して sig を生成し、 alg を署名フォーマットのアルゴリズム値で設定します。
- 検証手順
-
検証手順入力 attStmt, authenticatorData, clientDataHashを受けた場合、検証手順は以下です:
-
attStmt が上記構文準拠の有効なCBORか確認し、CBORデコードしてフィールドを抽出する。
-
sigが、x5c 先頭証明書の公開鍵・algアルゴリズムで、authenticatorDataとclientDataHash連結への署名として有効か検証する。
-
x5c の先頭証明書の公開鍵が、
credentialPublicKey(attestedCredentialData、authenticatorData内)と一致するか検証。 -
アテステーション証明書の
attestationChallengeフィールド (拡張データ内)が clientDataHash と同一であるか検証。 -
アテステーション証明書 拡張データ 内の適切なAuthorizationListを使い、以下も検証する:
-
AuthorizationList.allApplicationsフィールドがsoftwareEnforcedとteeEnforcedのいずれにも存在しないこと。(PublicKeyCredentialは RP ID にスコープされなければならないため。) -
以下についてはRPが信頼実行環境(TEE)由来キーのみ受け入れる場合は
teeEnforced、それ以外はteeEnforcedとsoftwareEnforcedの和集合から判定:-
AuthorizationList.originフィールド値はKM_ORIGIN_GENERATEDと同値であること。 -
AuthorizationList.purposeフィールド値はKM_PURPOSE_SIGNと同値であること。
-
-
-
すべて成功すれば、実装依存の値として アテステーション種別 Basic と アテステーション信頼パス x5c を返す。
-
8.4.1. Androidキーアテステーション証明書の要件
Android Key Attestation アテステーション証明書 の Androidキーアテステーション証明書拡張データはOID
1.3.6.1.4.1.11129.2.1.17で識別され、そのスキーマ定義は
Android開発者ドキュメントにあります。
8.5. Android SafetyNetアテステーションステートメントフォーマット
注: このフォーマットは非推奨です。今後のリビジョンで削除予定です。
該当 認証器 が 一部Androidプラットフォーム上の プラットフォーム認証器 の場合、アテステーションステートメントは SafetyNet API によることもあります。 この場合、認証器データは SafetyNet API 利用者(通常はAndroidアプリケーション)が完全に制御しており、 アテステーションステートメントはプラットフォームの健全性やアプリID等に関する情報を提供します (詳細は SafetyNet Document 参照)。
- アテステーションステートメントフォーマット識別子
-
android-safetynet
- サポートされるアテステーション種別
- 構文
-
Androidアテステーションステートメントの構文は下記の通りです:
$$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 online documentation 参照) のCompact Serialization。
- 署名手順
-
authenticatorData を アテステーション用認証器データ、 clientDataHash を シリアライズしたクライアントデータのハッシュとする。
authenticatorDataとclientDataHashを連結してSHA-256ハッシュを計算し、その結果を attToBeSigned とする。
SafetyNetアテステーションをリクエストする際に attToBeSigned をnonce値として指定。 responseにその結果、verに認証器で実行されているGoogle Play Servicesのバージョンをセットする。
- 検証手順
-
検証手順入力 attStmt, authenticatorData, clientDataHashを受け取った場合、 検証手順は以下です:
-
attStmtが上記構文準拠の有効なCBORか検証し、CBORデコードでフィールド抽出。
-
responseが verバージョンの正しいSafetyNetレスポンスか ( SafetyNet online documentation 参照)。 現時点ではSafetyNetレスポンス形式は1種のみで verは将来拡張用。
-
responseペイロードの
nonce属性が、authenticatorDataとclientDataHash連結のSHA-256ハッシュ後のBase64エンコードと等価であるか確認。 -
SafetyNetレスポンスが実際にSafetyNetサービス発であることを SafetyNet online documentation の手順で検証。
-
すべて成功すれば、実装依存の値として アテステーションタイプ Basic と アテステーション信頼パス x5c を返す。
-
8.6. FIDO U2Fアテステーションステートメントフォーマット
このアテステーションステートメントフォーマットは、[FIDO-U2F-Message-Formats]で規定されたフォーマットを使うFIDO U2F認証器で利用されます。
- アテステーションステートメントフォーマット識別子
-
fido-u2f
- サポートされるアテステーション種別
- 構文
-
FIDO U2Fアテステーションステートメントの構文は下記の通りです:
$$attStmtType //= ( fmt: "fido-u2f", attStmt: u2fStmtFormat ) u2fStmtFormat = { x5c: [ attestnCert: bytes ], sig: bytes }上記フィールドの意味:
- x5c
-
X.509形式のアテステーション証明書を1つ含む配列。
- sig
-
アテステーション署名。 署名は、クライアントが認証器から受け取った(生の)U2F登録応答メッセージ ([FIDO-U2F-Message-Formats]) 上で計算されています。
- 署名手順
-
対象の資格情報の公開鍵がアルゴリズム-7("ES256")でなければエラーを返して終了。 そうでなければ、authenticatorDataを アテステーション用認証器データ、 clientDataHashを シリアライズしたクライアントデータのハッシュ (SHA-256利用のため32バイト)とする。
登録応答メッセージは [FIDO-U2F-Message-Formats] Section 4.3の形式で作成し、applicationパラメータは 与えられた資格情報のスコープとなるRP ID のSHA-256値、challengeパラメータはclientDataHash、key handleパラメータは該当credential ID。このメッセージの署名部分(公開鍵・key handle・証明書情報除く)がsigで、アテステーション公開鍵の証明書をx5cとする。
- 検証手順
-
検証手順入力 attStmt, authenticatorData, clientDataHash を受けた場合、検証手順は以下です:
-
attStmt が上記構文の有効なCBORか確認し、CBORデコードでフィールド抽出。
-
x5cがちょうど1要素かチェックし、その値をattCertとする。 certificate public keyはattCertが持つ公開鍵。 これがP-256曲線上EC公開鍵でなければエラー。
-
claimed rpIdHashはauthenticatorDataから、 claimed credentialIdとcredentialPublicKeyは authenticatorData.
attestedCredentialDataから抽出。 -
COSE_KEY形式credentialPublicKeyをRaw ANSI X9.62公開鍵形式(RFC9052 7節)に変換:
-
xは"-2"キー(x座標)の値。32バイトでなければエラー。
-
yは"-3"キー(y座標)の値。32バイトでなければエラー。
-
publicKeyU2Fは
0x04 || x || yの連結。注: これは未圧縮ECC鍵フォーマット。
-
-
verificationData を (0x00 || rpIdHash || clientDataHash || credentialId || publicKeyU2F) 連結として生成(Section 4.3 参照)。
-
sigがverificationDataとcertificate public keyで正しい署名か確認([SEC1] 4.1.4節、ハッシュはSHA-256)。
-
すべて成功した場合、実装依存の値(アテステーションタイプ Basic、 AttCAまたは不明値、および アテステーション信頼パス x5c) を返す。
-
8.7. Noneアテステーションステートメントフォーマット
noneアテステーションステートメントフォーマットは、WebAuthn Relying Partyがアテステーション情報の受領を希望しないことを示した場合(§5.4.7 アテステーション伝達ポリシー(enum AttestationConveyancePreference)参照)、認証器が提供するあらゆる アテステーションステートメント の代替として使われます。
また、認証器がアテステーション非対応の場合も、認証器自身がこのフォーマットでアテステーションステートメントを直接生成しても良いです。
- アテステーションステートメントフォーマット識別子
-
none
- サポートされるアテステーション種別
- 構文
-
noneアテステーションステートメントの構文は下記の通りです:
$$attStmtType //= ( fmt: "none", attStmt: emptyMap ) emptyMap = {} - 署名手順
-
上記で定義した固定のアテステーションステートメントを返します。
- 検証手順
-
実装依存の値として アテステーションタイプ None と空の アテステーション信頼パスを返します。
8.8. Apple匿名アテステーションステートメントフォーマット
このアテステーションステートメントフォーマットは、WebAuthnに対応した特定のAppleデバイスに対してAppleが専用で使用しています。
- アテステーションステートメントフォーマット識別子
-
apple
- 対応するアテステーションタイプ
- 構文
-
Appleアテステーションステートメントの構文は以下の通り定義されます:
$$attStmtType //= ( fmt: "apple", attStmt: appleStmtFormat ) appleStmtFormat = { x5c: [ credCert: bytes, * (caCert: bytes) ] }上記フィールドの意味は次の通りです:
- x5c
-
credCertの後に、その証明書チェーンがX.509形式でそれぞれエンコードされて並びます。
- credCert
-
アテステーション用に利用される資格情報公開鍵証明書。X.509形式でエンコードされます。
- 署名手順
-
-
authenticatorDataをアテステーション用のオーセンティケーターデータとして、clientDataHashをシリアライズされたクライアントデータのハッシュとして扱います。
-
authenticatorDataとclientDataHashを連結し、nonceToHashを生成します。
-
nonceToHashにSHA-256ハッシュを実行し、nonceを得ます。
-
Apple匿名アテステーションCAが資格情報公開鍵用のX.509証明書を生成し、nonceをOID
1.2.840.113635.100.8.2の証明書拡張として含めます。credCertがこの証明書を指します。credCertはアテステーションの証明となり、含まれるnonceはアテステーションがリアルタイムで実行されたことの証明になります。さらに、nonceはauthenticatorDataおよびクライアントデータの完全性も保護します。 -
x5cにcredCertおよびその証明書チェーンを設定します。
-
- 検証手順
-
検証手順の入力としてattStmt、authenticatorData、clientDataHashが与えられた場合、手順は次の通りです:
-
attStmtが上記構文に適合したCBORであることを検証し、CBORデコードを行い内包フィールドを抽出します。
-
authenticatorDataとclientDataHashを連結してnonceToHashを作成します。
-
nonceToHashをSHA-256ハッシュしnonceを生成します。
-
credCertのOID
1.2.840.113635.100.8.2拡張の値がnonceと等しいことを確認します。 -
資格情報公開鍵がcredCertのSubject Public Keyと等しいことを検証します。
-
すべて成功した場合、アテステーションタイプ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 } - 署名手順
-
該当なし
- 検証手順
-
検証手順の入力として attStmt、authenticatorData、clientDataHashが与えられた場合、検証手順は 次の通りです:
-
各subStmtについて、検証手順をアテステーションステートメントフォーマット識別子
subStmt.fmtに対応して、検証手順の入力 subStmt、authenticatorData、clientDataHashで評価します。1つまたは複数のsubStmtで検証に失敗した場合、Relying Partyポリシーに従い適切な結果を判断します。
-
Relying Partyポリシーで定められた十分な数の項目が attStmtで正常に検証された場合、 成功した検証手順の出力から任意の組み合わせを実装固有値として返します。
-
9. WebAuthn拡張
公開鍵クレデンシャルの生成の仕組み、および§ 5 Web Authentication APIで定義されている認証アサーションのリクエストと生成の仕組みは、特定のユースケースに合わせて拡張することができます。それぞれの場合は、登録拡張および/または認証拡張を定義することで対応されます。
すべての拡張はクライアント拡張です。つまり、この拡張はクライアントとの通信およびクライアントによる処理を伴います。クライアント拡張は、以下の手順とデータを定義します:
-
navigator.credentials.create()の拡張リクエストパラメータ・レスポンス値(登録拡張に対するもの)。 -
navigator.credentials.get()の拡張リクエストパラメータ・レスポンス値(認証拡張に対するもの)。 -
クライアント拡張の処理(登録拡張および認証拡張に対するもの)。
公開鍵クレデンシャルの作成や認証アサーションの要求時に、WebAuthnリライングパーティは、拡張のセット利用をリクエストできます。クライアントやWebAuthn認証器が対応している場合、これらの拡張はリクエストされた操作中に実行されます。リライングパーティは、各拡張のクライアント拡張入力を
get()
呼び出し(認証拡張のもの)や
create()
呼び出し(登録拡張のもの)でクライアントに送ります。
クライアントはサポートしている各拡張についてクライアント拡張処理を行い、クライアントデータを各拡張の指示通りに拡張し、拡張識別子とクライアント拡張出力を含めます。
拡張は、認証器拡張である場合もあります。これは拡張処理が認証器の通信や処理を含むことを意味します。認証器拡張は以下の手順・データを定義します:
-
authenticatorMakeCredential拡張リクエストパラメータ・レスポンス値(登録拡張用)。
-
authenticatorGetAssertion拡張リクエストパラメータ・レスポンス値(認証拡張用)。
認証器拡張については、クライアント拡張処理の一部として、クライアントは各拡張に
認証器拡張入力値(多くの場合、
対応するクライアント拡張入力値に基づく)を
create()
呼び出し(登録拡張用)やget()
呼び出し(認証拡張用)で認証器に渡します。これら認証器拡張入力はCBORで表現され、名前・値のペアとなり、名前が拡張識別子、値が対応する認証器拡張入力です。認証器は対応する拡張に対して追加処理を実行し、拡張仕様に従って認証器拡張出力を返します。
認証器拡張出力は署名済み認証器データに含まれるため、拡張は未署名拡張出力も指定できます(出力自体が認証器データに依存する場合など)。
認証器拡張に対するクライアント拡張処理の一部は、この認証器拡張出力や未署名拡張出力を材料にしてクライアント拡張出力を作ることです。
全WebAuthn拡張は、クライアント・認証器いずれも必須ではありません。そのため、リライングパーティがリクエストした拡張でも、クライアントブラウザやOSで無視されたり、認証器に渡されずに 終了したりします。また、認証器が対応していない場合も無視できます。 拡張が無視されてもWebAuthn APIの処理による失敗にはなりません。従って、リライングパーティはAPIコールで拡張を指定した場合、 それらの一部または全部が無視されても正しくハンドリングできるよう備えなければなりません。
全WebAuthn拡張は、クライアントや認証器が未対応でも安全性やプライバシーを脅かさないよう定義されなければなりません。 例えば、拡張でクライアント処理を要求する場合、単純なパススルー(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()
経由で送信)、
クライアント拡張処理規則、クライアント拡張出力値を必ず指定する必要があります。
拡張が認証器と通信する場合(認証器拡張)、CBORの認証器拡張入力引数(authenticatorGetAssertionやauthenticatorMakeCredential経由で送信)、
認証器拡張処理規則、およびCBORの認証器拡張出力も必ず指定。
拡張は未署名拡張出力も指定できます。
クライアントが処理するクライアント拡張は必ずクライアント拡張出力値を返し、WebAuthnリライングパーティが拡張が認識されたことを判別可能にしなければいけません。同様に、認証器による拡張処理が必要な場合も 認証器拡張出力を必ず返し、リライングパーティが 認証器が拡張を認識したことを判別できるようにしなければなりません。出力値不要の拡張は、JSON Booleanのクライアント拡張出力を返し、trueなら対応されたとみなします。同様に出力値不要の認証器拡張は値を返し、CBOR Booleanの認証器拡張出力trueを返すのが推奨されます。
9.3. リクエストパラメータの拡張
拡張は一つまたは二つのリクエスト引数を定義します。クライアント拡張入力
はJSONでエンコード可能な値であり、WebAuthnリライングパーティからクライアントへ
get()
またはcreate()
呼び出しで送信されます。
CBORの認証器拡張入力
は、クライアントから認証器拡張を持つ拡張処理時に認証器へ渡されます。
リライングパーティは、拡張の利用要求とクライアント拡張入力指定を同時に、extensions
オプションで
create()
またはget()
呼び出し時に行います。
拡張識別子がエントリーキー、クライアント拡張入力が値です。
注: 他のドキュメントでは、拡張入力で常に拡張識別子をエントリーキーとしないものもありますが、 上記は新規拡張に推奨される慣例です。
var assertionPromise= navigator. credentials. get({ publicKey: { // 他のメンバーは省略 extensions: { // 拡張 "webauthnExample_foobar" のエントリーキー。値は2つの入力パラメータがあるmapです。 "webauthnExample_foobar" : { foo: 42 , bar: "barfoo" } } } });
拡張定義は、そのクライアント拡張入力の有効値を明記しなければなりません。クライアントは無効なクライアント拡張入力の拡張は無視推奨です。リライングパーティ由来の引数が不要な場合は、Booleanクライアント 引数trueで拡張リクエストを表現すべきです。
クライアント処理のみ影響のある拡張は認証器拡張入力の定義は不要です。認証器側処理が必要な拡張は、どのようにクライアント拡張入力から認証器拡張入力を計算するかを定義し、さらにCDDL型の
AuthenticationExtensionsAuthenticatorInputs
および
AuthenticationExtensionsAuthenticatorOutputs
のために、$$extensionInputと$$extensionOutputのグループソケットで拡張識別子分岐を追加してください。
入力不要の拡張(Boolean クライアント拡張入力値true)は、認証器拡張入力も定数Boolean値true(CBOR major type7 値21)に定義すべきです。
次の例では、識別子webauthnExample_foobar拡張が、符号なし整数を認証器拡張入力に、1つ以上のバイト列配列を認証器拡張出力として返すことを定義します:
$$extensionInput //= ( webauthnExample_foobar : uint) $$extensionOutput //= ( webauthnExample_foobar : [ + bytes] )
一部の認証器はBluetooth Low-EnergyやNFCなど低帯域通信を用いるため、拡張の認証器引数はなるべく小さく定義すべきです。
9.4. クライアント拡張処理
拡張は、クレデンシャル作成やアサーション生成時、クライアントで追加処理を要求できます。その処理の入力としてクライアント拡張入力が使われます。 サポートされるクライアント拡張ごとに、クライアントはclientExtensions mapに拡張識別子をキー、拡張のクライアント拡張入力を値として追加します。
同様にクライアント拡張出力は、getClientExtensionResults()の結果として、拡張識別子をキー、各拡張のクライアント拡張出力値を値とするdictionaryとして表現します。
クライアント拡張入力同様、クライアント拡張出力もJSONでエンコード可能な値です。
無視された拡張については値を返してはいけません。
認証器処理が必要な拡張は、クライアント拡張入力からCBOR形式の認証器拡張入力を決定する手順、CBORの認証器拡張出力・未署名拡張出力からクライアント拡張出力を導く手順を定義しなければなりません。
9.5. 認証器拡張処理
各対応認証器拡張のCBOR 認証器拡張入力値は、 authenticatorMakeCredentialやauthenticatorGetAssertion操作のextensionsパラメータに含まれます。extensionsはCBORマップであり、各キーが拡張識別子、値が認証器拡張入力です。
同様に、拡張の出力はextensions部分(認証器データ内)で表現されます。extensions部は 認証器データのCBORマップで、 各キーが拡張識別子、値が認証器拡張出力です。
未署名拡張出力は認証器データとは独立して表現され、認証器はこれらを拡張識別子キーの別マップとして返します。このマップは未署名出力を持つ拡張専用です。未署名出力は、例えば出力自体が認証器データの署名(自己署名不可な場合など)や、一部出力をリライングパーティへ渡したくない場合などに有用です。
注: [FIDO-CTAP] 仕様では 未署名拡張出力は、unsignedExtensionOutputs
というトップレベルCBORマップで
authenticatorMakeCredentialおよびauthenticatorGetAssertion両方で返されます。
対応する各拡張ごとに、認証器拡張処理規則で認証器拡張出力・未署名拡張出力(利用時)を認証器拡張入力など必要なものから生成します。 無視された拡張については値を返してはいけません。
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クレデンシャルでユーザーが認証できるように追加処理が必要です:
-
希望するU2Fクレデンシャルを
allowCredentialsオプションにリストアップし、get()メソッドに渡します:-
typeメンバーをpublic-keyに設定します。 -
idメンバーを希望するU2Fキーのハンドル値(base64url形式だがバイナリにデコードして使用)に設定します。
allowCredentialsは、 WebAuthn クレデンシャルIDとU2Fキーハンドルの混在も可です。 この拡張(appid)の指定は RP IDにスコープ化されたWebAuthnクレデンシャルの利用を妨げません。 -
この拡張はFIDO互換クレデンシャルの作成はできません。WebAuthnで作成したクレデンシャルはFIDO JavaScript APIの後方互換性がありません。
注: appid
には、Relying Partyが旧FIDO
APIで以前に使用していたAppIDを設定する必要があります。
これは、Relying
PartyのWebAuthnのRP
IDをAppID形式に変換した結果と同じであるとは限りません。
例えば、以前使用していたAppIDが "https://accounts.example.com" であっても、
現在使用しているRP IDは "example.com" かもしれません。
- 拡張識別子
-
appid - 操作適用範囲
- クライアント拡張入力
-
FIDO AppIDを指定するDOMString
partial dictionary AuthenticationExtensionsClientInputs {DOMString ; };appid - クライアント拡張処理
-
-
facetIdとして呼び出し元のオリジンを FIDOアルゴリズム「呼び出しアプリケーションのFacetID決定」に渡して得ます。
-
appIdを拡張入力とします。
-
facetId・appIdをFIDOアルゴリズム「FacetIDがAppIDに許可されているか確認」に通します。不許可であれば "
SecurityError"DOMExceptionを返します。 -
allowCredentialDescriptorList生成 時、 U2F認証器が適用外(
SW_WRONG_DATA返す等)の場合、U2Fアプリケーションパラメータを appIdのSHA-256ハッシュで再試行。対応するクレデンシャルが得られた場合、必ず allowCredentialDescriptorListに含めます。その時点でappIdがauthenticatorGetAssertionのrpIdパラメータとなります。 -
outputをBoolean値
falseで初期化します。 -
assertionCreationData作成 時、 U2F認証器でappIdのSHA-256がU2Fアプリケーションパラメータに使われアサーションが返された場合、 outputを
trueに設定します。
-
注: 実際には、多くの実装が FacetIDがAppIDに許可されているか確認アルゴリズムの4ステップ以降を未実装です。 ステップ3で、ホスト比較を同一サイトで妥協するケースもあります。
- クライアント拡張出力
-
outputの値を返します。trueのとき、AppIDが使用されたため、アサーション検証時、 リライングパーティは
rpIdHashがAppIDのハッシュ(RP IDではない)であることを前提にしてください。partial dictionary AuthenticationExtensionsClientOutputs {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を指定する1つのDOMString。
partial dictionary AuthenticationExtensionsClientInputs {DOMString ; };appidExclude - クライアント拡張処理
-
-
RP IDの確定直後に、次を実行:
-
facetIdとして、呼び出し元のオリジンをFIDOアルゴリズム呼び出しアプリのFacetID決定に渡し得られたものとします。
-
appIdは、拡張入力
appidExcludeの値とします。 -
facetId・appIdをFIDOアルゴリズムFacetIDがAppIDに許可されているかの判定 に通します。不許可の場合、"
SecurityError"DOMExceptionを返し、 新しいクレデンシャル作成アルゴリズムおよびこの手順を中断します。注: 実際、多くの実装はこのアルゴリズムの4手順目以降を未実装です。代わりに3手順目で、ホストの比較が同一サイトで緩和されます。
-
問題なければ通常処理を続行します。
-
-
authenticatorMakeCredential呼び出し直前に次を実行:
-
authenticatorがU2Fプロトコル[FIDO-U2F-Message-Formats]をサポートする場合、各 クレデンシャル記述子 Cについて、次を行う:
-
CがU2Fでauthenticator上で作成されたかを、"五つのパート"を以下の値で設定した
U2F_AUTHENTICATEメッセージを authenticatorに送信して判定する: -
authenticatorが
message:error:test-of-user-presence-required(成功の意)で応答した場合、 そのauthenticatorの通常処理を中止し、プラットフォーム固有の方法(例:UI表示やユーザー同意要求)で認証器が不適合であることを示してください。同意要求は、control byteだけ0x03("enforce-user-presence-and-sign")にして再度U2F_AUTHENTICATEを送り、応答を無視することで実現できます。
-
-
通常処理を続行します。
-
-
- クライアント拡張出力
-
この拡張が取り扱われたことをリライングパーティに伝えるため
trueを返します。partial dictionary AuthenticationExtensionsClientOutputs {boolean ; };appidExclude - 認証器拡張入力
-
なし。
- 認証器拡張処理
-
なし。
- 認証器拡張出力
-
なし。
10.1.3. クレデンシャルプロパティ拡張(credProps)
このクライアント登録拡張は、登録セレモニーの結果として公開鍵クレデンシャルソースを作成する際、クライアントが把握している特定のクレデンシャルプロパティをリクエストしたWebAuthnリライングパーティへ報告することを可能にします。
現時点で定義されているクレデンシャルプロパティはひとつであり、それはクライアント側判明クレデンシャルプロパティです。
- 拡張識別子
-
credProps - 適用操作
- クライアント拡張入力
-
この拡張がリライングパーティによって要求されたことを示すBoolean値
true。partial dictionary AuthenticationExtensionsClientInputs {boolean ; };credProps - クライアント拡張処理
-
authenticatorMakeCredential操作の呼び出しで使用したrequireResidentKeyパラメータの値を
rkに設定します。 - クライアント拡張出力
-
clientExtensionResults["
credProps"]["rk"]に、authenticatorMakeCredential呼び出し時のrequireResidentKeyの値を設定してください。dictionary {CredentialPropertiesOutput boolean rk ; };partial dictionary AuthenticationExtensionsClientOutputs {CredentialPropertiesOutput ; };credProps rk, 型: boolean-
このOPTIONALプロパティは、抽象的にはクライアント側判明クレデンシャルプロパティまたはリデントキークレデンシャルプロパティと呼ばれるものであり、登録セレモニーで返された
PublicKeyCredentialがクライアント側で発見可能なクレデンシャルかを示すBoolean値です。rkがtrueの場合は発見可能クレデンシャル、rkがfalseの場合はサーバ側クレデンシャルです。rkが存在しない場合は、作成されたクレデンシャルが発見可能クレデンシャルかサーバ側クレデンシャルか判別できません。注: 一部の認証器はクライアントプラットフォームから要求されていなくても発見可能クレデンシャルを作成する場合があります。そのため、クライアントプラットフォームは本当に
falseと断定できなければこのrkプロパティを省略しなければならない場合があります。リライングパーティは、credProps拡張がサポートされている場合、クライアントプラットフォームがこのrkプロパティを値と共にセットしようと努力するはずと仮定するとよいです。従って、rkが省略された場合、作成されたクレデンシャルは 非発見可能クレデンシャルである可能性が高いと推測できます。
- 認証器拡張入力
-
なし。
- 認証器拡張処理
-
なし。
- 認証器拡張出力
-
なし。
10.1.4. 疑似乱数関数拡張(prf)
このクライアント登録拡張および認証拡張は、リライングパーティが、あるクレデンシャルに結び付いた疑似乱数関数(PRF)の出力を取得できるようにします。この拡張で提供されるPRFは、任意長のBufferSourceから、32バイトのBufferSourceへ写像します。
動機例として、PRFの出力を対称鍵としてユーザーデータの暗号化に利用可能です。このように暗号化されたデータは、関連するクレデンシャルでアサーションを取得する能力がなければ復号できません。下記の手順により1回のアサーション操作で2つの入力でPRF評価を行うことで、アサーション時ごとに新しい乱数入力を選び再暗号化することで暗号鍵を定期的にローテーションできます。評価入力が予測不可能であれば、ユーザー検証を通過でき、かつ認証器へのアクセスが一時的な攻撃者でも、正しいPRF入力を知らなければ暗号鍵を知ることはできません。
この拡張は[FIDO-CTAP]のhmac-secret拡張の上に実装されています。hmac-secretが入力・出力をユーザーエージェントのみが暗号化できる方法でやり取りし、WebAuthn用途と下層プラットフォーム用途を分離する必要があるため、本拡張は独立したクライアント拡張となっています。この分離は、渡されたPRF入力にコンテキスト文字列でハッシュ処理を行い、任意入力でのPRF評価ができなくなっていることで実現します。
hmac-secret拡張は1クレデンシャルにつき2つのPRF(ユーザー検証あり・なし)を提供しますが、この拡張は1クレデンシャルにつき1つのみ露出します。hmac-secret実装時は、ユーザー検証ありの方を使うことが必須です。必要な場合UserVerificationRequirementを上書きします。
注: この拡張は認証器が[FIDO-CTAP]を使わなくても、リライングパーティでの振る舞いが等しければ実装可能です。
- 拡張識別子
-
prf - 適用操作
- クライアント拡張入力
-
dictionary {AuthenticationExtensionsPRFValues required BufferSource ;first BufferSource ; };second dictionary {AuthenticationExtensionsPRFInputs AuthenticationExtensionsPRFValues eval ;record <DOMString ,AuthenticationExtensionsPRFValues >evalByCredential ; };partial dictionary AuthenticationExtensionsClientInputs {AuthenticationExtensionsPRFInputs ; };prf eval, 型: AuthenticationExtensionsPRFValues-
PRFを評価する1つまたは2つの入力。認証器の中には、クレデンシャル作成時にPRF評価をサポートしないものもあり、その場合は出力が得られません。その場合、出力取得にはアサーションが必要です。
evalByCredential, 型: record<DOMString, AuthenticationExtensionsPRFValues>-
base64urlエンコードされたクレデンシャルIDごとにPRF入力をマッピングするレコード。
allowCredentialsが空でないアサーション中のみ有効。
- クライアント拡張処理(登録)
-
-
evalByCredentialが指定された場合、名前が“NotSupportedError”のDOMExceptionを返します。 -
認証器拡張入力で
hmac-secretをtrueに設定します。 -
evalが指定されていて、将来の[FIDO-CTAP]拡張が作成時PRF評価を許容する場合、hmac-secret入力を以下で設定: -
復号済みPRF結果(存在すれば)を
resultsにセット。
-
- クライアント拡張処理(認証)
-
-
evalByCredentialが空でなく、かつallowCredentialsが空なら名前が“NotSupportedError”のDOMExceptionを返す。 -
evalByCredentialの任意のkeyが空文字列、または有効なbase64urlエンコーディングでなく、あるいはidがallowCredentialsの要素idと一致しない場合、“SyntaxError”のDOMExceptionを返す。 -
prf拡張出力は空のディクショナリで初期化。 -
evをnullで初期化し、該当PRF入力探索:
-
evalByCredentialに返却される予定のクレデンシャルIDのbase64urlエンコード値を持つentryがあれば そのvalueをevに。
-
-
evがnullでない場合:
-
- 認証器拡張 入力・処理・出力
-
この拡張は認証器との通信時、[FIDO-CTAP]の
hmac-secret拡張を使用します。そのため本拡張はリライングパーティには直接の認証器インタラクション指定をしません。 - クライアント拡張出力
-
dictionary {AuthenticationExtensionsPRFOutputs boolean enabled ;AuthenticationExtensionsPRFValues results ; };partial dictionary AuthenticationExtensionsClientOutputs {AuthenticationExtensionsPRFOutputs ; };prf enabled, 型: boolean-
1つまたは2つのPRFが作成クレデンシャルで利用可能な場合のみ
true。これは登録時のみ報告され、認証時には返されません。 results, 型: AuthenticationExtensionsPRFValues-
evalまたはevalByCredentialで指定した入力に対するPRF評価の結果。登録時は返されない場合もあります(下記eval説明参照)。クライアント側専用暗号鍵導出用途等の場合、
PublicKeyCredentialをリモートサーバへ送る場合はこのresults出力の除去が必要なことがあります。具体的にはPublicKeyCredential.toJSON()がRegistrationResponseJSONやAuthenticationResponseJSON返却時にこのresultsを含むので注意。
10.1.5. ラージブロブストレージ拡張(largeBlob)
このクライアント 登録拡張および認証拡張は、リライングパーティがクレデンシャルに関連付けられた不透明データを保存できるようにします。認証器はごく少量のデータしか保存できず、また大半のリライングパーティはユーザーのための状態を任意に保存できるオンラインサービスであるため、これは限定的なケースにのみ有用です。たとえば、リライングパーティが中央集権型の認証サービス運営ではなく、証明書を発行したい場合などがあげられます。
注: リライングパーティは、不透明データが容量制限デバイスに書き込まれる際に圧縮されると想定できるため、自前で圧縮する必要はありません。
証明書システムではクレデンシャルの公開鍵に署名する必要がありますが、その鍵は作成後にしか得られません。そのため、この拡張は登録時の文脈でブロブ書き込みを追加しません。ただし、もし後で認証拡張を利用したい場合、リライングパーティはクレデンシャル作成時に登録拡張を使うべきです。
証明書は典型的な認証器のストレージ能力と比較して大きいため、ユーザーエージェントはユーザーがこの限られたリソース配分をより良く判断し、悪用を防ぐためにどのような表示・確認が適切か考慮すべきです。
注: 相互運用のため、[FIDO-CTAP]を使って認証器にラージブロブを保存するユーザーエージェントは、同仕様のラージ・パークレデンシャル・ブロブの手順を使うことが期待されます。
注: ローミング認証器でクロスプラットフォーム転送に[FIDO-CTAP]を使うものは、このLarge Blob拡張のサポートを発見可能クレデンシャルのみに限定しがちであり、次のいずれかを設定した場合以外エラーになることがあります:
がauthenticatorSelection.residentKeypreferred
またはrequired。ただし、FIDO-CTAP未使用の認証器ではこの制限がない場合もあります。
- 拡張識別子
-
largeBlob - 適用操作
- クライアント拡張入力
-
partial dictionary AuthenticationExtensionsClientInputs {AuthenticationExtensionsLargeBlobInputs ; };largeBlob enum {LargeBlobSupport ,"required" , };"preferred" dictionary {AuthenticationExtensionsLargeBlobInputs DOMString support ;boolean read ;BufferSource write ; };support, 型: DOMString-
LargeBlobSupportのいずれかの値をとるDOMString(§ 2.1.1 列挙型をDOMString型で表す参照)。登録時のみ有効。 read, 型: boolean-
ブール値。主張されたクレデンシャルに関連付けられた事前書込ブロブの取得をリライングパーティが希望することを示す。認証時のみ有効。
write, 型: BufferSource
- クライアント拡張処理(登録)
-
-
-
名前 “
NotSupportedError” のDOMExceptionを返してください。
-
-
-
supportedをtrueに設定してください。注: これはラージブロブ対応認証器が登場する将来を見越したものです。[[Create]](origin, options, sameOriginWithAncestors)ステップ12の拡張処理中に発生し、該当認証器が見つからなければ
AuthenticationExtensionsLargeBlobOutputsは破棄されます。 -
候補認証器が利用可能(step 22)となった時は、optionsより前に、その認証器がラージブロブ非対応なら
continue(無視)してください。
-
-
それ以外(
supportが指定されていない/"preferred"の場合):
-
- クライアント拡張処理(認証)
-
-
supportが指定されている場合:-
名前 “
NotSupportedError” のDOMExceptionを返してください。
-
-
-
名前 “
NotSupportedError” のDOMExceptionを返してください。
-
-
readがtrueとして指定された場合:-
クライアント拡張出力(
largeBlob)を初期化してください。 -
いずれかの認証器が成功を示した場合(
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors))、 クレデンシャルに付随したlargeBlobデータの読取を試みます。 -
成功したら
blobに結果を代入。注: 失敗時も
largeBlobはAuthenticationExtensionsClientOutputsに現れるが、blobメンバーは現れません。
-
-
writeが指定された場合:-
allowCredentialsがちょうど1つの要素のみ含む場合でないとき:-
名前 “
NotSupportedError” のDOMExceptionを返してください。
-
-
保存に成功したら
writtenをtrue、失敗ならfalseにしてください。
-
-
- クライアント拡張出力
-
partial dictionary AuthenticationExtensionsClientOutputs {AuthenticationExtensionsLargeBlobOutputs ; };largeBlob dictionary {AuthenticationExtensionsLargeBlobOutputs boolean supported ;ArrayBuffer blob ;boolean written ; }; - 認証器拡張処理
-
この拡張はユーザーエージェントに、ラージブロブを認証器に保存または取得させます。したがって、リライングパーティに対して認証器との直接やりとりは規定しません。
10.2. 認証器拡張
本節では、クライアント拡張かつ認証器拡張の両方である拡張を定義します。
本節は現在空です。
11. ユーザーエージェントの自動化
ユーザーエージェントの自動化やウェブアプリケーションテスト目的のために、本書ではいくつかの[WebDriver] 拡張コマンドを定義します。
11.1. WebAuthn WebDriver拡張機能
以下で定義される拡張コマンドの利用可能性を広告するため、新しい拡張ケイパビリティ(extension capability)を定義します。
| ケイパビリティ | キー | 値の型 | 説明 |
|---|---|---|---|
| バーチャル認証器サポート | "webauthn:virtualAuthenticators"
| boolean | エンドポイントノードが、すべてのバーチャル認証器コマンドをサポートしているかどうか示します。 |
ケイパビリティのバリデーション時に、"webauthn:virtualAuthenticators"をvalueでバリデートする拡張特有のサブ手順は以下の通りです:
-
valueがbooleanでない場合、WebDriverエラー (WebDriverエラーコード invalid argument)を返します。 -
それ以外の場合、
deserializedにvalueを設定します。
ケイパビリティのマッチング時に、"webauthn:virtualAuthenticators"をvalueでマッチするための拡張特有の手順は次の通りです:
-
valueがtrueかつエンドポイントノードがいずれのバーチャル認証器コマンドもサポートしていない場合、 マッチ失敗とする。 -
それ以外はマッチ成功とする。
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拡張をサポートするか示す。
|
ケイパビリティバリデーション時に、認証器拡張ケイパビリティkeyをvalueでバリデートする拡張特有サブ手順は以下の通りです:
-
valueがbooleanでない場合、WebDriverエラー (WebDriverエラーコード invalid argument)を返す。 -
それ以外の場合は
deserializedにvalueをセット。
ケイパビリティマッチング時に、認証器拡張ケイパビリティkeyをvalueでマッチするための手順は次のとおりです:
-
valueがtrueで、エンドポイントノードのWebAuthn WebDriver実装がkeyで識別される認証器拡張をサポートしていなければ、マッチ失敗とする。 -
それ以外はマッチ成功。
定義済み認証器拡張を実装するUser-Agentは、それに対応する認証器拡張ケイパビリティも実装するべきです。
11.2. バーチャル認証器
これらのWebDriverの拡張コマンドは、バーチャル認証器(認証器モデルのソフトウェア実装)を作成し、操作します。バーチャル認証器はバーチャル認証器データベースに記録されます。 保持されている各バーチャル認証器には下記プロパティがあります:
- authenticatorId
-
48文字までの
unreserved([RFC3986]付録A参照)からなるnull不可文字列で、そのバーチャル認証器を一意に識別します。 - protocol
-
バーチャル認証器がサポートするプロトコル:
"ctap1/u2f"、"ctap2"、"ctap2_1"のいずれか [FIDO-CTAP]。 - transport
-
シミュレートする
AuthenticatorTransport。transportがinternalなら 認証器はプラットフォームアタッチメントをシミュレート。他はクロスプラットフォームアタッチメントをシミュレート。 - hasResidentKey
-
trueの場合、認証器はクライアント側発見可能クレデンシャルをサポートします。 - hasUserVerification
-
trueの場合、認証器はユーザー検証をサポートします。 - isUserConsenting
-
この値で全てのユーザー同意認可ジェスチャーや、拡張で発生するユーザープレゼンスのテストの結果を制御します。
trueなら ユーザー同意は必ず承認され、falseなら拒否されます。 - isUserVerified
-
この値でユーザー検証の結果が制御されます。
trueなら 常に検証は成功、falseなら失敗とします。注: hasUserVerificationが
falseの場合このプロパティは効果を持ちません。 - extensions
- defaultBackupEligibility
-
新規に作られる公開鍵クレデンシャルソースのバックアップ有資格(クレデンシャルプロパティ)のデフォルト状態。authenticatorMakeCredentialの際、この値は
BE(authenticator dataフラグ)に反映されます。 - defaultBackupState
-
新規に作成された公開鍵クレデンシャルソースのバックアップ状態(クレデンシャルプロパティ)のデフォルト値。authenticatorMakeCredentialでこの値は
BS(authenticator dataフラグ)に反映されます。
11.3. バーチャル認証器の追加
バーチャル認証器の追加WebDriver 拡張コマンドは、ソフトウェア実装のバーチャル認証器を生成します。定義は以下の通りです:
| HTTPメソッド | URIテンプレート |
|---|---|
| POST | /session/{session id}/webauthn/authenticator
|
認証器構成は、オブジェクトのJSON形式で、リモートエンド手順にparametersとして渡します。内容は以下のkey・valueのペアです:
| キー | 値の型 | 有効値 | デフォルト |
|---|---|---|---|
| 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 array | 拡張識別子を含む配列 | 空配列 |
| defaultBackupEligibility | boolean | true, false
| false
|
| defaultBackupState | boolean | true, false
| false
|
リモートエンド手順は次の通りです:
-
もし parameters が JSON の Object でない場合は、 WebDriver エラー(WebDriver エラーコード invalid argument)を返す。
注記: parameters は 認証器設定 オブジェクトである。
-
authenticator を新しい 仮想認証器として作成する。
-
parameters の列挙可能な各 自分自身のプロパティ について:
-
key をプロパティ名とする。
-
value を、parameters から key という名前で プロパティを取得した結果とする。
-
その key に対応する
keyが 認証器設定 に存在しない場合は、 WebDriver エラー(WebDriver エラーコード invalid argument)を返す。 -
value が、その key の
valid valuesのいずれでもない場合は、 WebDriver エラー(WebDriver エラーコード invalid argument)を返す。 -
プロパティ key に value を authenticator に設定する。
-
-
認証器設定 でデフォルト値が定義されている各プロパティについて:
-
keyが authenticator の定義済みプロパティでなければ、プロパティkeyをdefaultで authenticator に設定する。
-
-
認証器設定 の各プロパティについて:
-
keyが authenticator の定義済みプロパティでない場合は、WebDriver エラー(WebDriver エラーコード invalid argument)を返す。
-
-
authenticator.extensions の各 extension について:
-
その extension が 拡張子識別子であり、かつ エンドポイントノード の WebAuthn WebDriver 実装でサポートされていなければ、 WebDriver エラー(WebDriver エラーコード 未対応操作)を返す。
-
-
有効で一意な authenticatorId を生成する。
-
プロパティ
authenticatorIdに authenticatorId を authenticator に設定する。 -
authenticator を 仮想認証器データベースに保存する。
-
成功 (success) とデータ authenticatorId を返す。
11.4. バーチャル認証器の削除
バーチャル認証器の削除WebDriver 拡張コマンドは、以前作成されたバーチャル認証器を削除します。 定義は以下の通りです:
| HTTPメソッド | URIテンプレート |
|---|---|
| DELETE | /session/{session id}/webauthn/authenticator/{authenticatorId}
|
リモートエンド手順は以下の通りです:
-
authenticatorIdがバーチャル認証器 のいずれとも一致しない場合、バーチャル認証器データベース内に保存されているものと一致しない場合、WebDriverエラー(WebDriver エラーコード invalid argument)を返してください。
-
authenticatorIdで特定されるバーチャル認証器をバーチャル認証器データベースから削除してください。
-
success を返してください。
11.5. クレデンシャルの追加
クレデンシャルの追加 WebDriver 拡張コマンドは、既存のバーチャル認証器に公開鍵クレデンシャルソースをインジェクトします。定義は以下です:
| HTTPメソッド | URIテンプレート |
|---|---|
| POST | /session/{session id}/webauthn/authenticator/{authenticatorId}/credential
|
クレデンシャルパラメータは、JSONのオブジェクト形式で、リモートエンド手順にparametersとして渡されます。以下のkeyとvalueのペアが含まれます:
| キー | 説明 | 値の型 |
|---|---|---|
| credentialId | Credential IDをBase64urlエンコーディングでエンコードしたもの。 | string |
| isResidentCredential | trueの場合、クライアント側発見可能クレデンシャルを作成し、falseならサーバ側クレデンシャルを作成します。
| boolean |
| rpId | このクレデンシャルがスコープされるリライングパーティID。 | string |
| privateKey | 単一の秘密鍵のみを含む非対称鍵パッケージ。[RFC5958]に従い、Base64urlエンコーディングでエンコード。 | string |
| userHandle | このクレデンシャルに紐づくuserHandle。Base64urlエンコーディングでエンコード。未指定の場合あり。 | string |
| signCount | この公開鍵クレデンシャルソースに紐付けられる署名カウンターの初期値。 | number |
| largeBlob | このラージ・パークレデンシャル・ブロブを公開鍵クレデンシャルソースに紐付けて保存。Base64urlエンコーディング。未指定の場合あり。 | string |
| backupEligibility | この公開鍵クレデンシャルソースに対するシミュレートされたバックアップ有資格。未指定の場合、バーチャル認証器のdefaultBackupEligibilityを使用。 シミュレートされたバックアップ有資格は、BE authenticator data flagに反映される必要あり。 | boolean |
| backupState | この公開鍵クレデンシャルソースに対するシミュレートされたバックアップ状態。未指定の場合、バーチャル認証器のdefaultBackupStateを使用。 シミュレートされたバックアップ状態は、BSauthenticator data flagに反映される必要あり。 | boolean |
| userName | userのname(ユーザーの名前)。未指定なら空文字列。
| string |
| userDisplayName | userのdisplayName(ユーザー表示名)。未指定なら空文字列。
| string |
リモートエンド手順は下記:
-
parametersがJSON オブジェクトでなければ、 WebDriverエラー(WebDriver エラーコード invalid argument)を返してください。
注: parametersはクレデンシャルパラメータ オブジェクトです。
-
parametersのcredentialIdプロパティについてBase64urlエンコーディングをデコードし、その結果をcredentialIdとします。
-
credentialIdが失敗なら、WebDriverエラー (WebDriverエラーコード invalid argument)を返してください。
-
parametersのisResidentCredentialプロパティをisResidentCredentialとする。
-
isResidentCredential未定義なら、WebDriverエラー (WebDriverエラーコード invalid argument)を返す。
-
parametersのrpIdプロパティをrpIdとする。
-
rpIdが有効なRP IDでないなら、WebDriverエラー(WebDriver エラーコード invalid argument)を返す。
-
parametersのprivateKeyプロパティについてBase64urlエンコーディングをデコードし、その結果をprivateKeyとします。
-
privateKeyが失敗なら、WebDriverエラー (WebDriverエラーコード invalid argument)を返す。
-
privateKeyが妥当なエンコードのP-256楕円曲線上の単一ECDSA秘密鍵を含む非対称鍵パッケージでなければ、WebDriverエラー (WebDriverエラーコード invalid argument)を返す。
-
parametersのuserHandleプロパティが定義されていれば:
-
userHandleをparametersのuserHandleについてBase64urlエンコーディングでデコードした結果に設定。
-
userHandleが失敗なら、WebDriverエラー (WebDriverエラーコード invalid argument)を返す。
-
-
そうでなければ:
-
isResidentCredentialが
trueなら、WebDriverエラー (WebDriverエラーコード invalid argument)を返す。 -
userHandleを
nullとする。
-
-
authenticatorIdがバーチャル認証器 と一致しない場合、バーチャル認証器データベース に保存されていない場合、WebDriverエラー (WebDriverエラーコード invalid argument)を返す。
-
authenticatorをauthenticatorIdで一致したバーチャル認証器とする。
-
isResidentCredentialが
trueで、authenticatorのhasResidentKeyがfalseの場合、WebDriverエラー (WebDriverエラーコード invalid argument)を返す。 -
authenticatorがlargeBlob拡張をサポートし、かつparametersにlargeBlobが定義されていれば:
-
largeBlobをparametersのlargeBlob に対してBase64urlエンコーディングでデコードした結果とする。
-
largeBlobが失敗なら、WebDriverエラー (WebDriverエラーコード invalid argument)を返してください。
-
-
そうでない場合:
-
largeBlobを
nullにする。
-
-
parametersのbackupEligibilityプロパティをbackupEligibilityとする。
-
backupEligibility未定義の場合は、authenticatorのdefaultBackupEligibility値で初期化。
-
parametersのbackupStateプロパティをbackupStateとする。
-
backupState未定義なら、authenticatorのdefaultBackupState値で初期化。
-
parametersのuserNameプロパティをuserNameとする。
-
userName未定義なら、空文字列で初期化。
-
parametersのuserDisplayNameプロパティをuserDisplayNameとする。
-
userDisplayName未定義なら空文字列で初期化する。
-
isResidentCredentialが
trueなら新たなクライアント側発見可能公開鍵クレデンシャルソース、それ以外はサーバ側公開鍵クレデンシャルソースを下記アイテムで生成:- type
- id
-
credentialId
- privateKey
-
privateKey
- rpId
-
rpId
- userHandle
-
userHandle
- otherUI
-
userNameとuserDisplayNameから構成。
-
credentialのバックアップ有資格(クレデンシャルプロパティ)をbackupEligibilityにセット。
-
credentialのバックアップ状態(クレデンシャルプロパティ)をbackupStateにセット。
-
署名カウンターcounterを作成し、開始値はparametersのsignCountまたは signCountが
nullなら0。 -
largeBlobが
nullでなければ、 ラージ・パークレデンシャル・ブロブにcredentialをlargeBlobとして関連付け。 -
credentialとcounterをauthenticatorのデータベースに保存。
-
successを返す。
11.6. クレデンシャル取得
クレデンシャル取得
WebDriver 拡張コマンドは、公開鍵クレデンシャルソースごとに1つのクレデンシャルパラメータオブジェクトを返します(そのクレデンシャルがクレデンシャルの追加やnavigator.credentials.create()で保存されたかどうかを問わず)、対象となるバーチャル認証器が管理するもの全てが対象です。
定義は以下の通りです:
| HTTPメソッド | URIテンプレート |
|---|---|
| GET | /session/{session id}/webauthn/authenticator/{authenticatorId}/credentials
|
リモートエンド手順は以下の通りです:
-
authenticatorIdがバーチャル認証器 のいずれとも一致しない場合、バーチャル認証器データベースから見つからなければ、WebDriverエラー(WebDriver エラーコード invalid argument)を返す。
-
credentialsArrayを空配列として用意する。
-
authenticatorIdで識別される認証器が管理する各公開鍵クレデンシャルソース credentialについて、対応するクレデンシャルパラメータオブジェクトを作成しcredentialsArrayに追加する。
-
successでcredentialsArrayをデータとして返す。
11.7. クレデンシャルの削除
クレデンシャルの削除 WebDriver 拡張コマンドは、バーチャル認証器に保存されている 公開鍵クレデンシャルソース を削除します。定義は以下の通りです:
| HTTPメソッド | URIテンプレート |
|---|---|
| DELETE | /session/{session id}/webauthn/authenticator/{authenticatorId}/credentials/{credentialId}
|
リモートエンド手順は以下の通りです:
-
authenticatorIdがバーチャル認証器 のいずれにも一致しなければ、バーチャル認証器データベースから見つからなければ、WebDriverエラー(WebDriver エラーコード invalid argument)を返す。
-
authenticatorIdで特定されるバーチャル認証器をauthenticatorとする。
-
credentialIdがauthenticatorで管理する公開鍵クレデンシャルソース のいずれにも一致しなければ、WebDriverエラー (WebDriverエラーコード invalid argument)を返す。
-
authenticatorが管理するcredentialIdで特定される公開鍵クレデンシャルソースを削除する。
-
successを返す。
11.8. すべてのクレデンシャルの削除
すべてのクレデンシャルの削除 WebDriver 拡張コマンドは、バーチャル認証器に保存されているすべての 公開鍵クレデンシャルソース を削除します。定義は以下の通りです:
| HTTPメソッド | URIテンプレート |
|---|---|
| DELETE | /session/{session id}/webauthn/authenticator/{authenticatorId}/credentials
|
リモートエンド手順は以下の通りです:
-
authenticatorIdがバーチャル認証器 のいずれにも一致しなければ、バーチャル認証器データベースから見つからなければ、WebDriverエラー(WebDriver エラーコード invalid argument)を返す。
-
authenticatorIdで特定されるバーチャル認証器が管理する公開鍵クレデンシャルソース をすべて削除する。
-
successを返す。
11.9. ユーザー検証済みフラグ設定
ユーザー検証済みフラグ設定 拡張コマンドはバーチャル認証器のisUserVerifiedプロパティをセットします。 定義は以下の通りです。
| HTTPメソッド | URIテンプレート |
|---|---|
| POST | /session/{session id}/webauthn/authenticator/{authenticatorId}/uv
|
リモートエンド手順は以下:
-
parametersがJSON オブジェクトでなければ、 WebDriverエラー(WebDriver エラーコード invalid argument)を返す。
-
authenticatorIdがバーチャル認証器 のいずれにも一致しなければ、バーチャル認証器データベースから見つからなければ、WebDriverエラー(WebDriver エラーコード invalid argument)を返す。
-
parameters内にisUserVerifiedプロパティがない場合、WebDriverエラー (WebDriverエラーコード invalid argument)を返す。
-
authenticatorをauthenticatorIdで識別されるバーチャル認証器とする。
-
authenticatorのisUserVerifiedプロパティを parametersの isUserVerifiedプロパティ値にセット。
-
successを返す。
11.10. クレデンシャルプロパティの設定
クレデンシャルプロパティの設定 拡張コマンドは、バーチャル認証器が持つ公開鍵クレデンシャルソースのbackupEligibilityおよびbackupStateクレデンシャルプロパティを設定できます。定義は以下です。
| HTTPメソッド | URIテンプレート |
|---|---|
| POST | /session/{session id}/webauthn/authenticator/{authenticatorId}/credentials/{credentialId}/props
|
クレデンシャルプロパティ設定パラメータは、JSONのオブジェクトで、リモートエンド手順のparametersとして渡します。 内容は次のkey・valueのペアです:
| キー | 説明 | 値の型 |
|---|---|---|
| backupEligibility | バックアップ有資格(クレデンシャルプロパティ)。 | boolean |
| backupState | バックアップ状態 (クレデンシャルプロパティ)。 | boolean |
リモートエンド手順は次の通りです:
-
parametersがJSON オブジェクトでなければ、 WebDriverエラー(WebDriver エラーコード invalid argument)を返す。
注: parametersはクレデンシャルプロパティ設定パラメータ オブジェクト。
-
authenticatorIdがバーチャル認証器 のいずれにも一致しなければ、バーチャル認証器データベースから見つからなければ、WebDriverエラー(WebDriver エラーコード invalid argument)を返す。
-
authenticatorで credentialId に一致する公開鍵クレデンシャルソースをcredentialとする。
-
credentialが空なら、WebDriverエラー(WebDriverエラーコード invalid argument)を返す。
-
parametersのbackupEligibilityプロパティを backupEligibilityとする。
-
backupEligibilityが定義されていれば、credential の バックアップ有資格 クレデンシャルプロパティ をその値に設定する。
注: 通常backupEligibilityプロパティは公開鍵クレデンシャルソースで固定です。 クレデンシャルプロパティの設定はテスト・デバッグ用に変更を許可します。
-
parametersのbackupStateプロパティをbackupStateとする。
-
backupStateが定義されていれば、credentialの バックアップ状態 クレデンシャルプロパティ をその値に設定する。
-
successを返す。
12. IANA考慮事項
12.1. WebAuthn アテステーションステートメントフォーマット識別子登録の更新
本節では、IANA「WebAuthn Attestation Statement Format Identifiers」レジストリ[IANA-WebAuthn-Registries]([RFC8809]で設立、[WebAuthn-1]で初登録)における、§ 8 定義済みアテステーションステートメントフォーマットで定義された 以下のアテステーションステートメントフォーマットのエントリを、本仕様を参照するように更新します。
-
WebAuthnアテステーションステートメントフォーマット識別子: packed
-
説明: "packed" アテステーションステートメントフォーマットはWebAuthn最適化型のアテステーション形式であり、非常にコンパクトかつ拡張性のあるエンコード法を使用します。このフォーマットはリソース制限のある認証器(例:セキュアエレメントなど)でも実装できます。
-
仕様文書: 本仕様 § 8.2 Packedアテステーションステートメントフォーマット
-
WebAuthnアテステーションステートメントフォーマット識別子: tpm
-
説明: TPMアテステーションステートメントフォーマットは、packedと同じフォーマットでアテステーションステートメントを返しますが、rawDataおよびsignatureフィールドの計算が異なります。
-
仕様文書: 本仕様 § 8.3 TPMアテステーションステートメントフォーマット
-
WebAuthnアテステーションステートメントフォーマット識別子: android-key
-
説明: バージョン"N"以降のプラットフォーム認証器は、この独自の"ハードウェアアテステーション"ステートメントを提供することがあります。
-
仕様文書: 本仕様 § 8.4 Android Keyアテステーションステートメントフォーマット
-
WebAuthnアテステーションステートメントフォーマット識別子: android-safetynet
-
説明: Android搭載プラットフォーム認証器は、Android SafetyNet APIベースのアテステーションステートメントを生成することがあります。
-
WebAuthnアテステーションステートメントフォーマット識別子: fido-u2f
-
説明: FIDO U2F認証器で使用
-
仕様文書: 本仕様 § 8.6 FIDO U2Fアテステーションステートメントフォーマット
12.2. WebAuthn アテステーションステートメントフォーマット識別子新規登録
本節では、§ 8 定義済みアテステーションステートメントフォーマットで新たに定義された以下のアテステーションステートメントフォーマットを、IANA「WebAuthn Attestation Statement Format Identifiers」レジストリ[IANA-WebAuthn-Registries]([RFC8809]で設立)に新規登録します。
-
WebAuthnアテステーションステートメントフォーマット識別子: apple
-
説明: Appleデバイス上のプラットフォーム認証器で利用。
-
仕様文書: 本仕様 § 8.8 Apple匿名アテステーションステートメントフォーマット
-
WebAuthnアテステーションステートメントフォーマット識別子: none
-
説明: WebAuthnリライングパーティがアテステーション情報不要を示した場合、認証器側アテステーションステートメントを置き換える時に使用。
-
仕様文書: 本仕様 § 8.7 noneアテステーションステートメントフォーマット
12.3. WebAuthn拡張識別子登録の更新
このセクションでは、IANA「WebAuthn Extension Identifiers」レジストリ[IANA-WebAuthn-Registries]([RFC8809]で設立、[WebAuthn-1]で初登録)において§ 10 定義済み拡張で定義された、以下の拡張識別子の値を本仕様へのリンクに更新します。
-
WebAuthn拡張識別子: appid
-
説明: この認証拡張は、以前にレガシーFIDO JavaScript APIを用いてクレデンシャルを登録したWebAuthnリライングパーティがアサーション要求できるようにします。
-
仕様ドキュメント: 本仕様 § 10.1.1 FIDO AppID Extension (appid)
12.4. WebAuthn拡張識別子の登録
このセクションでは、§ 10 定義済み拡張で新たに定義された以下の拡張識別子の値を、IANA「WebAuthn Extension Identifiers」レジストリ[IANA-WebAuthn-Registries]([RFC8809]で設立)に登録します。
-
WebAuthn拡張識別子: appidExclude
-
説明: この登録拡張は、WebAuthnリライングパーティが、レガシーFIDO U2F JavaScript API [FIDOU2FJavaScriptAPI]で作成された特定のクレデンシャルを含む認証器を除外できるようにします。
-
仕様ドキュメント: 本仕様 § 10.1.2 FIDO AppID Exclusion Extension (appidExclude)
-
WebAuthn拡張識別子: credProps
-
説明: このクライアント登録拡張は、クレデンシャルが新規作成された際に、そのプロパティをクライアントにより判定し、呼び出し元のWebAuthnリライングパーティのウェブアプリケーションに通知できるようにします。
-
仕様ドキュメント: 本仕様 § 10.1.3 Credential Properties Extension (credProps)
-
WebAuthn拡張識別子: largeBlob
-
説明: このクライアント登録拡張及び認証拡張は、リライングパーティがクレデンシャルに関連付けた不透明データを保存できるようにします。
-
仕様ドキュメント: 本仕様 § 10.1.5 Large blob storage extension (largeBlob)
13. セキュリティ考慮事項
本仕様はWeb APIと暗号学的なピアエンティティ認証プロトコルを定義します。 Web Authentication APIは、ウェブ開発者(つまり「作者」)が自らの登録および認証セレモニーでWeb Authenticationプロトコルを利用できるようにします。 Web Authenticationプロトコルのエンドポイントを構成する実体は、ユーザーが管理するWebAuthn Authenticatorと、Relying Partyのウェブアプリケーションをホストする計算環境です。 このモデルでは、ユーザーエージェントはWebAuthn Clientとともに、authenticatorとRelying Partiesの間の仲介を構成します。 さらに、authenticatorはその由来についてattestすることができます。
現時点で本仕様は詳細なセキュリティ考慮を網羅していません。しかし、[FIDOSecRef]文書は本仕様に概ね適用できるセキュリティ分析を提供しています。 また、[FIDOAuthnrSecReqs]ドキュメント群はauthenticatorのセキュリティ特性に関する有益な情報を提供します。
以下の小節は現在のWeb Authentication固有のセキュリティ考慮事項を構成します。 これらは対象読者別に分かれており、一般的なセキュリティ考慮事項は本節の直接の小節で述べられ、 authenticator、client、およびRelying Party実装者向けの考慮事項はそれぞれの小節にまとめられています。
13.1. Credential ID の未署名性
credential IDはauthentication assertionに付随していますが署名されていません。 これは問題ではありません。なぜなら、もしauthenticatorが誤ったcredential IDを返すか、攻撃者がcredential IDを傍受・改ざんした場合に起こるのは、WebAuthn Relying Partyが返却された署名済みのauthenticator data(つまりassertion)を検証するための正しいcredential public keyを参照できなくなるだけであり、やり取りはエラーで終了します。
13.2. クライアントと認証器の物理的近接性
WebAuthnの認証器モデルでは、一般的にローミング認証器が物理的にクライアントの近くにあり直接通信することが想定されています。 この構成にはいくつか重要な利点があります。
クライアントと認証器の物理的な近接性が保証されることは、所持要素 (something you have)型認証要素の大きな強みです。 たとえば、ローミング認証器がUSBやBluetoothでしか通信できない場合、 これらのトランスポートの通信範囲が限定的なため、攻撃者が認証器とやり取りするにはその範囲の物理的な近くにいなければなりません。 遠隔的に呼び出せる認証器の場合は必ずしもそうとは限りません— たとえ認証器がユーザの存在を確認したとしても、 ユーザは遠隔から発生した悪意のある要求の許可を騙されてしまうおそれがあります。
クライアントと認証器が直接通信するなら、クライアントはスコープ制限を適用できます。 一方、クライアントと認証器の通信が何らかの第三者によって仲介される場合、 クライアントは第三者がスコープ制限を適切に適用し、認証器へのアクセスを管理してくれることを信頼しなければなりません。 このいずれかが十分でない場合、 悪意あるRelying Partyが他のRelying Partyに有効な認証アサーションを受け取ってしまったり、 悪意のあるユーザが他のユーザの認証アサーションにアクセスできてしまう可能性があります。
認証器がクライアントの近くに物理的でいる必要がない、もしくはクライアントと認証器が直接通信しない構成でソリューションを設計する場合、 このことがスコープ制限の適用や、 認証器が所持要素認証要素としてどれほどの強度をもつかにどのような影響を及ぼすか、設計上十分考慮してください(SHOULD)。
13.3. 認証器(authenticators)に関するセキュリティ考慮事項
13.3.1. アテステーション証明書階層
アテステーション証明書については3層階層(Attestation Root、Attestation Issuing CA、Attestation Certificate)を推奨します。また、各WebAuthn Authenticatorのデバイスライン(モデル)ごとに別の発行CAを使用することを推奨します。これにより特定の認証器モデルのバージョンに関する問題の切り分けが容易になります。
アテステーションルート証明書が単一のデバイスライン(AAGUID)専用でない場合、アテステーション証明書自体にAAGUIDを指定しておくことが推奨されます。これによりauthenticator dataと照合できます。
13.3.2. アテステーション証明書および発行CAの侵害
もしアテステーション証明書を発行する中間CAやルートCAが侵害された場合、WebAuthn Authenticatorのattestation key pairs自体は安全であっても、それらの証明書は信頼できなくなります。認証器メーカーが自らのモデルのためのattestation public keysを記録していれば、新しい中間CAや新しいルートCAからこれらの鍵に対する新しいアテステーション証明書を発行できます。ルートCAが変更された場合、Relying Partiesは信頼するルート証明書を更新する必要があります。
発行CAが認証器のアテステーション証明書の秘密鍵侵害を知った場合、当該発行CAはその証明書を失効させる必要があります。認証器メーカーはファームウェア更新を出し、既製造のWebAuthn Authenticatorsに新しいattestation private keysとcertificatesを注入する必要があるかもしれません(このプロセスの詳細は本仕様の範囲外です)。もしメーカーにその手段がない場合、当該メーカー製のWebAuthn Authenticatorsからのさらなるアテステーションステートメントを信頼することは困難になる可能性があります。
関連する考慮事項として、§ 13.4.5 失効したアテステーション証明書を参照してください。
13.4. Relying Parties向けのセキュリティ考慮事項
13.4.1. WebAuthnがRelying Partiesに提供するセキュリティ上の利点
本仕様がWebAuthn Relying Partiesに提供する主な利点は次のとおりです:
-
ユーザーおよびアカウントを、広く互換性があり使いやすい多要素認証で保護できます。
-
Relying Partyはユーザーに認証器ハードウェアを配布する必要がありません。代わりに各ユーザーが任意の準拠するauthenticatorを独自に入手し、同じ認証器を多数のRelying Partiesで使用できます。Relying Partyは必要に応じて、返却されたattestation statementsを検査してauthenticatorのセキュリティ特性に対する要件を課すことができます。
-
Authentication ceremoniesは中間者攻撃に対して耐性があります。登録セレモニーについては下の§ 13.4.4 Attestation Limitationsを参照してください。
-
Relying PartyはPINや生体認証など複数のユーザー検証方式をほとんどコード変更なく自動的にサポートでき、各ユーザーは使用する認証器を選ぶことで好みの方式を選択できます。
-
Relying Partyは上記の利点を得るために追加の秘密を保存する必要がありません。
Conformance節にあるとおり、上記のセキュリティ上の利点を得るためにはRelying Partyは§ 7 WebAuthn Relying Party Operationsに記載された通りに振る舞う必要があります。ただし、登録に関しては下の§ 13.4.4 Attestation Limitationsで述べる若干異なるユースケースがあります。
13.4.2. 埋め込み利用における可視性に関する考慮
埋め込みコンテキスト、例えば§ 5.10 iframe要素内でのWeb認証の利用で説明されている
iframe内でのWebAuthnの単純な利用は、ユーザーをUI改ざん攻撃(「Clickjacking」とも呼ばれる)に晒す可能性があります。これは、攻撃者が自分のUIをRelying
Partyが意図したUIの上に重ねて表示し、ユーザーにRelying
Partyとの意図しない操作を行わせようとするものです。たとえば、こうした手法によって、攻撃者がユーザーに商品を購入させたり、送金させたりすることが可能になる場合があります。
WebAuthn固有のUIは通常クライアントプラットフォームによって処理されるためUI改ざんの影響は受けませんが、WebAuthnを埋め込んだコンテンツを提供するRelying
Partyは、自分のコンテンツのUIがユーザーに見えていることを保証することが重要となりそうです。そのための新しい方法として、実験的なIntersection Observer v2の
isVisible属性の状態を確認する手法が注目されています。例えば、埋め込みコンテキストで動作するRelying
Partyのスクリプトは、isVisibleがfalseと判定された時点で事前に自分自身をポップアップウィンドウで読み込むことで、コンテンツの隠蔽を回避するといった処理を行えます。
13.4.3. 暗号学的チャレンジ
暗号プロトコルとして、Web Authenticationはリプレイ攻撃を避けるためにランダム化されたチャレンジに依存します。したがって、PublicKeyCredentialCreationOptionsのchallengeおよびPublicKeyCredentialRequestOptionsのchallengeの値は、信頼できる環境(例えばサーバー側)でRelying
Partiesがランダムに生成しなければなりません。クライアントの応答に含まれるchallenge値は、生成したものと一致する必要があります。これはクライアントの挙動に依存するべきではなく、Relying
Partyは操作が完了するまでチャレンジを一時的に保管することが推奨されます。ミスマッチを許容するとプロトコルの安全性が損なわれます。
チャレンジは、WebAuthnセレモニーの推奨タイムアウト範囲と同等の有効期間を持つべきです。
リプレイ攻撃を防ぐため、チャレンジは推測不可能にするため十分なエントロピーを含む必要があります。したがってチャレンジは少なくとも16バイト以上であることが推奨されます。
13.4.4. アテステーションの限界
この節は規範的ではありません。
新しいクレデンシャルを登録する際、もしattestation statementが存在すれば、それはWebAuthn Relying Partyに対して認証器の性質(例えば認証器モデルやクレデンシャル秘密鍵の保管・保護方法)についての保証を与えることがあります。 しかし重要なのは、単一のattestation statementだけでは、Relying Partyがそのattestation objectがユーザーの意図したauthenticatorによって生成されたことを検証する手段を提供しない点です。例えば、攻撃者がRelying Partyのスクリプトに悪意あるコードを注入している場合です。 したがって、Relying PartyはTLSなどの関連技術に依存し、attestation objectを中間者攻撃から保護する必要があります。
登録セレモニーが安全に完了し、認証器がcredential private keyの機密性を維持しているという前提の下、そのクレデンシャルを用いた後続のauthentication ceremoniesは中間者による改ざんに抵抗します。
上の議論はすべてのattestation
typesに当てはまります。いずれの場合も、中間者攻撃者はPublicKeyCredentialオブジェクト(attestation
statementや登録されるcredential public keyを含む)を置換し、以降の認証アサーションを改ざんすることが可能です。
そのような攻撃は検出可能である可能性があります。なぜなら、Relying Partyが登録したのが攻撃者のcredential public keyであれば、攻撃者は以降の全ての認証セレモニーをその鍵で改ざんする必要があり、問題のないセレモニーが失敗することで攻撃が露呈する可能性があります。
Self AttestationやNone以外のアテステーション種別は、Relying Partiesが例えば認証器のモデル表示などの情報をユーザーに示せるため、そのような攻撃をより難しくする可能性があります。攻撃者はユーザーの認証器と同じモデルの本物の認証器を用意する必要があるか、ユーザーが期待する認証器モデルと異なることに気づくかもしれません。
注: 上述の中間者攻撃のバリアントは、従来のパスワード認証に対する中間者攻撃よりも攻撃者にとって困難です。
13.4.5. 失効したアテステーション証明書
もしアテステーション証明書の検証が中間発行CAの失効により失敗し、かつそのような状況で登録/認証要求を拒否するというRelying Partyの方針がある場合、Relying Partyは同じ中間CAに紐づく証明書を使ってCA侵害日以降に登録された公開鍵クレデンシャルを登録解除する(または「self attestation」と同等の信頼レベルにマークする)ことを推奨します。 したがって、Relying Partiesは登録時に中間発行CA証明書を記憶しておき、もしその証明書が失効した場合に関連する公開鍵クレデンシャルを登録解除できるようにすることが推奨されます。
関連して、§ 13.3.2 アテステーション証明書および発行CAの侵害を参照してください。
13.4.6. クレデンシャル紛失と鍵の移動性
本仕様はcredential private keysのバックアップや複数のauthenticators間での共有のためのプロトコルを定義していません。 一般に、credential private keyはそれを作成したauthenticatorから出ることはないと期待されます。したがって認証器を紛失すると、通常その認証器に紐づくすべてのcredentialsを失うことになり、ユーザーがそのRelying Partyに対して唯一の登録クレデンシャルしか持っていなければアカウントへアクセスできなくなる恐れがあります。秘密鍵をバックアップ・共有する代わりに、Web Authentication APIは同じユーザーに対して複数のcredentialsを登録することを許容します。例えばユーザーは頻繁に使うクライアントデバイスにプラットフォームクレデンシャルを登録し、バックアップ用や稀に使うデバイス用に1つ以上のローミングクレデンシャルを登録することができます。
Relying
Partiesはユーザーに対して同一アカウントに複数のcredentialsの登録を許可し奨励するべきです。Relying PartiesはexcludeCredentialsやuser.idオプションを活用して、これらの異なるクレデンシャルが異なるauthenticatorsにboundされることを保証するべきです。
13.4.7. 保護されていないアカウントの検出
この節は規範的ではありません。
このセキュリティ考慮は、認証セレモニーの最初のステップとして空でないallowCredentials引数を使う形で認証をサポートするRelying
Partiesに適用されます。
例えばサーバ側クレデンシャルを最初の認証ステップで用いる場合などが該当します。
この場合、allowCredentials引数はどのユーザーアカウントにWebAuthnクレデンシャルが登録されているか、登録されていないかという情報を漏らすリスクがあります。攻撃者がユーザー名だけを提供して認証セレモニーを開始でき、Relying
Partyがあるユーザーには非空のallowCredentialsで応答し、他のユーザーには失敗やパスワードチャレンジで応答するなら、攻撃者は後者のアカウントにはWebAuthnアサーションが必要ない可能性が高いと推測し、より弱いアカウントを標的にすることができます。
この問題は§ 14.6.2 ユーザー名列挙や§ 14.6.3 credential IDsを介したプライバシー漏洩で述べられる問題と類似しており、類似の方法で緩和できます。
13.4.8. コード注入攻撃
あるオリジン上で実行される悪意あるコードは、そのオリジンがpublic-key
credentialを行使できるオリジン群を決定する範囲内にある場合、WebAuthnが提供するあらゆるセキュリティ保証を無効にする可能性があります。WebAuthn ClientsはWebAuthn
APIをsecure contextsでのみ公開しており、これは基本的な攻撃を軽減しますが、Relying Partiesは追加の対策を組み合わせるべきです。
コード注入は様々な方法で発生し得ます。本節は典型的なシナリオとその緩和策の例を挙げますが網羅的ではありません。
-
悪意あるコードは、Relying Partyが意図的にまたは第三者の脆弱性により含めたサードパーティスクリプトによって注入される可能性があります。
したがって、Relying Partyはスコープ内のオリジンで含めるサードパーティスクリプトの量を制限するべきです。
Relying PartyはContent Security Policy(CSP2)やその他当時利用可能な適切な技術を用いて、オリジン上で実行できるスクリプトを制限するべきです。
-
悪意あるコードは、クレデンシャルのscopeルールによりRP IDのサブドメイン上でホストされる可能性があります。 例えば、ユーザー提出コードが
usercontent.example.orgでホストされていると、そのコードがexample.orgにスコープされたクレデンシャルを行使できる可能性があります。 もしRelying Partyがアサーション検証時にサブドメインoriginを許可していると、悪意あるユーザーは中間者攻撃を仕掛けて有効なアサーションを取得し被害者をなりすますことが可能です。したがって、デフォルトでRelying Partyはアサーション検証時にサブドメインoriginを許可すべきではありません。もしサブドメインoriginを許可する必要がある場合、許可されたサブドメイン上で信頼できないコードを配信してはならない、という前提を守る必要があります。
13.4.9. クレデンシャルのオリジンの検証
クレデンシャルを登録する際および
アサーションを検証する際、
Relying Partyは
クライアントデータの
origin
メンバーを検証しなければなりません。
Relying Party は予期しない origin
の値を受け入れてはならない。そうすると悪意あるウェブサイトが有効な credentials を取得する可能性がある。scope は WebAuthn credentials の使用を登録された RP ID 以外のドメインでの利用から防ぐが、Relying Party の origin 検証は、故障した authenticator が credential scope
を強制できなかった場合の追加の保護層として機能する。潜在的に悪意のあるサブドメインについての議論は § 13.4.8 Code injection
attacks も参照のこと。
検証は完全一致による文字列比較や、Relying Partyが必要とするその他の方法で行っても構いません(MAY)。 例:
-
単一のドメイン
https://example.orgで提供されるウェブアプリケーションは、originが正確にhttps://example.orgであることを要求するべきです。これは最も単純なケースであり、
originはhttps://に続くRP IDと一致する文字列であることが期待されます。 -
少数のドメインで提供されるウェブアプリケーションは、
originが許可されたオリジンのリストのいずれかと正確に一致することを要求するかもしれません。例えば["https://example.org", "https://login.example.org"]のように。 -
関連オリジンを利用するウェブアプリケーションは、許可されたオリジンのリストのいずれかと
originが一致することを要求するかもしれません。例:["https://example.co.uk", "https://example.de", "https://myexamplerewards.com"]。このリストは通常RP IDのwell-known URIに記載されたオリジンと一致します。詳細は§ 5.11 Using Web Authentication across related originsを参照してください。 -
多くの頻繁に変化するドメインで提供されるウェブアプリケーションは、
originを構造的に解析し、スキームがhttpsであり、オーソリティ部がRP IDと等しいかRP IDのサブドメインであることを要求するかもしれません(例:example.orgやその任意のサブドメイン)。注: RP IDの任意のサブドメインを許可するリスクについては§ 13.4.8 Code injection attacksを参照してください。
-
ネイティブアプリを持つウェブアプリケーションは、
originにOS依存のネイティブアプリ識別子を許可する場合があります。例えば["https://example.org", "example-os:appid:204ffa1a5af110ac483f131a1bef8a841a7adb0d8d135908bbd964ed05d2653b"]のように。
topOriginメンバーの検証についても同様の考慮が適用されます。もしtopOriginが存在する場合、Relying
Partyはその値が期待通りであることを検証しなければなりません。
この検証は文字列の完全一致や必要に応じた他の方法で行ってよいです。例えば:
-
外部のiframeに埋め込まれたくないウェブアプリケーションは、
topOriginが自らのoriginと正確に等しいことを要求するかもしれません。 -
特定の少数のドメインに埋め込まれることを許容するウェブアプリケーションは、
topOriginが許可されたオリジンのリストのいずれかと正確に一致することを要求するかもしれません。例:["https://example-partner1.org", "https://login.partner2-example.org"]。 -
多数のドメインに埋め込まれることを許容するウェブアプリケーションは、
topOriginの任意の値を許容するか、あるいは動的手順で与えられた値がそのセレモニーに許可されるかを判断することができます。
14. プライバシーに関する考慮事項
[FIDO-Privacy-Principles] に記載されているプライバシー原則は本仕様にも適用されます。
このセクションは対象読者ごとに分けられています。 一般的なプライバシーに関する考慮事項は本セクションの直接のサブセクションとなっており、 認証器、クライアント、Relying Partyの実装者向けの考慮事項は、それぞれの小節にまとめられています。
14.1. 再識別防止策
このセクションは規範的ではありません。
Web認証API の設計の多くの側面は、プライバシー上の懸念によって動機付けられています。本仕様で考慮されている主な懸念は、ユーザーの個人識別情報、つまり一人の人間の識別や別々のIDを同じ本人として紐付けることに関する保護です。Web認証API はグローバルなIDの形式を利用・提供していませんが、以下のような相関される可能性のある識別子が用いられています。
-
ユーザーのクレデンシャルIDやクレデンシャル公開鍵。
これらはWebAuthn Relying Partyによって登録され、ユーザーがそれに対応するクレデンシャル秘密鍵の所有を証明するために利用されます。また、クライアント と 認証器 間の通信においても可視化されます。
-
各Relying Partyごとに固有のユーザーID(例:ユーザー名やユーザーハンドル)
これらのIDは各Relying Partyのシステム内でユーザーを識別するために利用されます。また、クライアント と 認証器 間の通信でも可視化されます。
-
ユーザーの生体的特徴(例:指紋や顔認識データ)[ISOBiometricVocabulary]
これは認証器がユーザー検証を行う際に任意で使用します。Relying Party には開示されませんが、プラットフォーム認証器の場合、実装によっては クライアント から見える場合があります。
-
ユーザーの認証器のモデル(例:製品名など)。
これは、アテステーションステートメントでRelying Partyへ登録時に提供されます。また、クライアント と 認証器間通信でも可視化されます。
-
ユーザーの認証器の識別情報(例:シリアル番号など)
これはクライアントが認証器と通信するために利用する可能性がありますが、Relying Partyには開示されません。
上記のいくつかの情報は、Relying Partyと必然的に共有されます。以下のセクションでは、悪意あるRelying Partyがこれを使ってユーザーの個人識別情報を発見するのを防ぐための措置を説明します。
14.2. 匿名・スコープ化・相関不能な公開鍵クレデンシャル
このセクションは規範的ではありません。
クレデンシャルIDやクレデンシャル公開鍵は強力な認証を実現するためにWebAuthn Relying Partyと共有される必要がありますが、最小限の識別性となるよう設計されており、Relying Party間で共有されることはありません。
-
クレデンシャルIDやクレデンシャル公開鍵はそれ自体では無意味であり、直接ユーザーを識別するものではなくクレデンシャル鍵ペアのみを識別します。
-
各公開鍵クレデンシャルは特定のスコープを持つRelying Partyに厳密に紐付けられ、クライアントはこの存在を他のRelying Partyに露呈しません。したがって、悪意のあるRelying Partyは、クライアントを使ってユーザーの他のIDを暴くことはできません。
-
クライアントも公開鍵クレデンシャルの存在をRelying Partyへユーザーの同意なしに露呈しません。詳細は§ 14.5.1 登録セレモニーのプライバシーや§ 14.5.2 認証セレモニーのプライバシーを参照してください。このため、悪意のあるRelying Partyでも公開鍵クレデンシャルが登録済かつ有効な場合でも、サイレントにユーザーを識別できません。
-
認証器は、異なる公開鍵クレデンシャルのクレデンシャルIDやクレデンシャル公開鍵が同一ユーザーに帰属していることを相関されないようにします。したがって、一対の悪意あるRelying Party間で追加情報(意図的に再利用したユーザー名やメールアドレスなど)がなければユーザーを相関することはできません。
-
認証器は、そのアテステーション証明書が単一または小規模な認証器を特定しないような十分な非特異性を持つよう保証します。詳細は§ 14.4.1 アテステーションのプライバシーを参照してください。これにより、一対の悪意あるRelying Party間で認証器単位でユーザーを追跡することを防げます。
さらに、クライアントサイドで発見可能な公開鍵クレデンシャルソースには、Relying Partyにより指定されたユーザーハンドルを任意で含めることができます。このクレデンシャルは、ユーザーの識別および認証の両方に利用できます。 つまり、プライバシーに配慮したRelying Partyは、従来のユーザー名を持たないユーザーアカウントの作成を認めることができ、Relying Party間の相関性をさらに低減します。
14.3. 認証器内ローカル生体認証
生体認証器は、認証器内部で生体認証を実施します。ただし、プラットフォーム認証器の場合、実装によっては生体データがクライアントから見えることがあります。生体データはWebAuthn Relying Partyには開示されず、ローカルでユーザー検証のためだけに用いられ、新規登録や認証に利用されます。そのため、悪意あるRelying Partyが生体データを利用してユーザーの個人識別情報を特定したり、Relying Partyでのセキュリティ侵害により生体データが流出し、攻撃者が他のRelying Partyでなりすましログインに用いるリスクはありません。
Relying Partyが生体認証を必要とする場合、これは生体認証器によるユーザー検証でローカル実行され、その結果を署名済みアサーションレスポンスのUVフラグをセットすることで通知します。生体データ自体はRelying Partyに開示されません。
14.4. 認証器に関するプライバシーの考慮事項
14.4.1. アテステーションのプライバシー
アテステーション証明書やアテステーション鍵ペアは、ユーザーの追跡や同一ユーザーによる複数のオンラインIDの関連付けに利用される恐れがあります。 これを緩和する方法として、いくつかの手段があります:
-
WebAuthn認証器メーカーは、バッチ内の認証器が同一のアテステーション証明書を共有する形(Basic Attestationまたはバッチアテステーション)で出荷することを選択できます。これにより、ユーザーの匿名性は高まりますが、アテステーション証明書の秘密鍵が漏洩した場合の個別証明書失効ができなくなります。 このような場合、認証器メーカーは意味のある匿名性を確保できる十分なバッチサイズと、漏洩時に影響を受けるユーザー数を最小限に抑えるバッチサイズの両者の観点からバランスをとる必要があります。
[UAFProtocol] では、十分な匿名性を確保するため少なくとも10万台の認証器が同じアテステーション証明書を共有することが求められています。これが適切なバッチサイズの参考となります。
-
WebAuthn認証器は、アテステーション鍵ペアをクレデンシャルごとに動的生成し(必要な証明書を要求する)、Anonymization CA方式を実現できます。たとえば、認証器がメインのアテステーション秘密鍵と証明書を持ち、クラウド運用されるAnonymization CAと組み合わせてクレデンシャル毎に動的にアテステーション鍵ペアやアテステーション証明書を発行できます。
注記: 本仕様外部では「Privacy CA」という用語がここでいうAnonymization CAを指す場合がありますが、TCGでは「Privacy CA」はAttestation CA(ACA)[TCG-CMCProfile-AIKCertEnroll]と呼称が変更されているため、本仕様では混同防止の観点からAnonymization CAと記載します。
14.4.2. 認証器内に保存される個人識別情報のプライバシー
認証器は、本仕様で定義している範囲外の追加情報をクライアントへ提供する場合があります(例:クライアントが豊富なUIを表示し、ユーザーがどのクレデンシャルを選ぶかなど)。こうした場合、認証器はユーザー検証に成功しない限り個人識別情報を露出すべきではありません。さらに認証器が複数ユーザーを同時登録できる場合は、現在検証済みユーザー 以外の個人識別情報を露出すべきでありません。したがってユーザー検証に対応していない認証器が個人識別情報を保存すべきではありません。
この議論において、ユーザーハンドルとしてid
メンバーに渡される値は個人識別情報とは見なされません。詳細は§ 14.6.1 ユーザーハンドルの内容を参照してください。
これらの推奨事項は、物理的に認証器へ不正アクセスした攻撃者が、その認証器の登録ユーザーに関する個人識別情報を引き出すのを防ぐためのものです。
14.5. クライアントに関するプライバシーの考慮事項
14.5.1. 登録セレモニーのプライバシー
ユーザーの同意なく識別されるのを防ぐため、[[Create]](origin, options, sameOriginWithAncestors)
メソッドの実装では、悪意のあるWebAuthn Relying
Partyが以下のようなケースを区別できる情報を漏らさないよう注意が必要です。ここで「除外済み」とは、Relying PartyのexcludeCredentials
にリストされるクレデンシャルのうち、少なくとも一つが認証器にバインドされている場合です:
上記のケースが区別できると、悪意のあるRelying
Partyが、どのクレデンシャルが利用可能かを探ることでユーザーを識別できてしまいます。たとえば、クライアントが除外済み認証器出現時に即座にエラー応答する場合、特にそれがプラットフォーム認証器であれば、ユーザーが手動でキャンセルする前にセレモニー中断が発生したことから、excludeCredentials
リスト内のいずれかが利用可能だと推測できてしまいます。
ただし、ユーザーが新規クレデンシャル作成への同意を済ませている場合は、情報リークのリスクは問題となりません。なぜなら、この時点ではユーザーがその情報共有を意図的に認めているからです。
14.5.2. 認証セレモニーのプライバシー
ユーザーの同意なく識別されるのを防ぐため、[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
メソッドの実装では、悪意のあるWebAuthn Relying
Partyが以下のケースを区別できる情報を漏らさないよう注意が必要です。ここで「named」とは、Relying PartyのallowCredentials
にリストされているクレデンシャルが該当します:
上記のケースが区別できると、悪意のあるRelying
Partyが利用可能なクレデンシャルを特定し、ユーザー識別の手掛かりにできます。たとえば、クライアントが認証器が見つかってから初めて認証セレモニーのキャンセルや継続のUIを表示する場合にこの情報漏洩が発生します。Relying
Partyがこのクライアント仕様を認識していれば、ユーザーがタイムアウトではなく自主的にキャンセルしたことが分かり、allowCredentials
パラメータ内のいずれかが利用可能だと推測できます。
この懸念への対策としては、namedクレデンシャルの有無にかかわらず認証セレモニーをいつでもキャンセルできるUIを提供することが挙げられます。
14.5.3. OSアカウント間のプライバシー
プラットフォーム認証器がマルチユーザーOSのクライアントデバイスに含まれる場合、プラットフォーム認証器とクライアントデバイスは協調して、プラットフォームクレデンシャルの存在が、そのプラットフォームクレデンシャルを作成したOSユーザーにのみ開示されるようにすべきです。
14.5.4. クライアント機能の開示
getClientCapabilities
メソッドは、WebAuthn
Relying Partyがそのクライアントやユーザーで高い成功率を持つ登録・認証体験を設計するのに役立ちます。
クライアントが特定のWebAuthn機能に対応しているか否かがフィンガープリンティングのリスクになり得ます。実装によってはクライアントの方針やユーザーの同意に基づき機能開示の範囲を制限することができます。
14.6. Relying Partyに関するプライバシーの考慮事項
14.6.1. ユーザーハンドルの内容
ユーザーハンドルは§ 14.4.2 認証器に保存される個人識別情報のプライバシーにおいて個人識別情報とは見なされず、かつ認証器はユーザー検証を実施せずともユーザーハンドルを開示する場合があるため、Relying Partyはユーザーハンドルにメールアドレスやユーザー名等の個人識別情報を含めてはなりません。これは、そのハッシュ値も同様ですが、ハッシュ関数がソルト付きでソルト値がRelying Party専用である場合は例外です。入力値の推測的な探索を完全に防げるわけではないため、ユーザーハンドルには64バイトのランダム値を使い、この値をユーザーアカウントで管理することが推奨されます。
14.6.2. ユーザー名列挙
登録や認証セレモニーを開始する際、WebAuthn Relying Partyが登録ユーザーに関する機微情報を漏らす可能性があります。たとえばRelying Partyがメールアドレスをユーザー名として使い、「alex.mueller@example.com」で認証を試みると失敗し、「j.doe@example.com」だと成功する場合、攻撃者は「j.doe@example.com」が登録済みで「alex.mueller@example.com」は未登録だと推測できます。Relying Partyは、"j.doe@example.com"がユーザーアカウントを持っているという機微な情報を漏らしたことになります。
これを緩和または防止するため、Relying Partyが実施可能な(非規範的かつ非網羅的な)例:
-
登録セレモニーの場合:
-
Relying Partyが、独自のユーザー名で識別する場合:
-
ユーザーが登録セレモニーを開始する際、メールアドレスとして成立する名前での登録を不許可とする。
注記: この提案の動機は、この場合ユーザー名がすでに登録済みであれば登録セレモニーを失敗させざるを得ず、情報漏洩が不可避となりやすいためです。メールアドレスの利用を禁じれば、他サービスとのユーザー名重複リスクや漏洩の影響を軽減できます。
-
-
Relying Partyがメールアドレスで識別する場合:
-
ユーザーがメールアドレスを入力した後、ユーザーとのやり取りを一度中断し、そのアドレスに予測困難なワンタイムコードと案内を送信する。Web画面には、すべてのケースで同じ案内を表示すること。
注記: この提案は他の意味づけられたID(例:国民番号やクレジットカード番号など、外部連絡先を提供できる場合)にも適用できます。
-
-
-
認証セレモニーの場合:
-
入力されたユーザー名に該当するユーザーアカウントが存在しない場合でも、実在しうる値で初期化した
navigator.credentials.get()やPublicKeyCredentialRequestOptionsを使ってセレモニーを継続する。この手法は
allowCredentialsによる情報漏洩の緩和にも有効です。詳細は§ 13.4.7 未保護アカウント検出や§ 14.6.3 クレデンシャルIDによるプライバシー漏洩を参照してください。注記: ユーザー名はログインフォーム、セッションCookie等、様々な方法で「供給」され得ます。
注記: 返されたダミー値が実際の値と明確に異なる場合、巧妙な攻撃者はその差から実在アカウントの有無を推測できてしまいます。常に同じ値や繰り返しでの値の変化が例です。
allowCredentialsメンバにはユーザー名から決定的に導かれる疑似ランダム値を用いる等が望ましいでしょう。 -
AuthenticatorAssertionResponseレスポンス検証時、署名不正かユーザーやクレデンシャルの未登録かを区別できないようにします。 -
認証セレモニーを段階的にし、例えば初期段階でユーザー名とパスワードまたはセッションCookie等を利用、その後WebAuthn処理を行うことによって、ユーザー名列挙の課題をWebAuthn以前の認証処理へ移し、対応しやすくします。
-
14.6.3. クレデンシャルIDによるプライバシー漏洩
このセクションは規範的ではありません。
このプライバシー考慮事項は、Relying
Partyが非空なallowCredentials
引数を使って認証セレモニーを最初の認証手順とする場合に該当します。
例として、サーバーサイドクレデンシャルによる認証プロセスがあります。
この場合、allowCredentials
引数がユーザーのクレデンシャルIDを認証前に露出するため、個人識別情報の漏洩リスクがあります。クレデンシャルIDはRelying Party間で相関されないよう設計されていますが、その長さが認証器の種類を示してしまうことがあります。
また、ユーザーは同じユーザー名や認証器セットを複数Relying Partyで使う可能性があるため、クレデンシャルIDの個数や長さがグローバルな相関子となり得ます。
さらに、クレデンシャルIDが分かると、ユーザーの認証器に物理的に一瞬アクセスするだけで本人確認ができてしまいます。
こうした情報漏洩を防ぐため、Relying Partyは例えば以下の対策を採ることができます:
-
認証前にユーザー名とパスワード認証やセッションCookie認証等、WebAuthn認証セレモニーを始める前の追加認証手順を経てからユーザーのクレデンシャルIDを露出する。
-
クライアントサイドで発見可能なクレデンシャルを用い、
allowCredentials引数自体を不要とする。
上記対応策が取れず、すなわちユーザー名のみでallowCredentials
を公開する必要がある場合は、§ 14.6.2 ユーザー名列挙で述べた「疑似的なクレデンシャルID返却」の手法で漏洩を緩和できます。
シグナリングによってクレデンシャルIDが認識されなかったことを通知する場合、WebAuthn Relying Partyは、signalUnknownCredential(options)
メソッドを用い、signalAllAcceptedCredentials(options)
メソッドは避けることで未認証の呼び出し元にクレデンシャルIDを露呈しないようにすべきです。
15. アクセシビリティに関する考慮事項
ユーザー検証が可能な認証器は、ローミングでもプラットフォームでも、ユーザーに複数のユーザー検証方法を提供するべきです。例えば、指紋認証とPIN入力の両方を提供することが挙げられます。これは、選択した手段が何らかの理由で機能しない場合、他のユーザー検証手段へのフォールバックを可能にします。なお、ローミング認証器については、認証器とプラットフォームが連携してPIN入力などのユーザー検証手段を提供することがあります [FIDO-CTAP]。
Relying Partyは、登録時に、ユーザーが将来の認可操作を正しく行えるよう利便性を提供すべきです。例えば、認証器に名前をつける、デバイスに関連付ける画像を選ぶ、自由記述のテキスト指示(自分へのリマインダー等)を入力するなどが該当します。
15.1. セレモニータイムアウトの推奨範囲
セレモニーでタイミングに依存する場合、例えば登録セレモニー(timeout
参照)や認証セレモニー(timeout参照)は、[WCAG21]の
ガイドライン2.2「十分な時間」を遵守する必要があります。クライアントプラットフォームがRelying
Partyが指定したタイムアウトが[WCAG21]ガイドラインに従っていないと判断する場合、クライアントプラットフォームはタイムアウト値を調整してもよいです。
WebAuthnセレモニータイムアウトの推奨範囲とデフォルトは以下の通りです:
-
推奨範囲:300000ミリ秒〜600000ミリ秒。
-
推奨デフォルト値:300000ミリ秒(5分)。
16. テストベクター
このセクションは規範的なものではありません。
このセクションでは、実装の検証に使えるサンプル値を示します。
例は、同じ登録および認証セレモニーの組み合わせとして疑似コードで示されています。 バイト列リテラルとコメントはCDDL [RFC8610]記法となります。 例は網羅的ではなく、WebAuthn拡張は含みません。
例は入力から出力への流れとして構成され、一部中間値も含みます。
登録の例ではRelying Partyがchallenge
入力を指定し、
クライアントがclientDataJSON
出力を生成し、
認証器がattestationObject
出力を生成します。
認証の例ではRelying Partyがchallenge
入力を指定し、
クライアントがclientDataJSON
出力を生成し、
認証器がauthenticatorData
およびsignature
出力を生成します。
その他の暗号的に無関係な入力や出力は含まれていません。
認証器の実装者は、
同様の構造のattestationObject、authenticatorData、
signature
を生成できるかを確認できます。クライアントの実装者は同様にclientDataJSON
を生成できるか確認できます。Relying
Partyの実装者は、同じchallenge
入力のもと、登録出力を正しく検証できるか、
また同じchallenge
入力および登録例で得たcredential public keyとcredential IDにより、認証出力を正しく検証できるか確認できます。
全例でRP ID
example.org、
origin
https://example.org、
および該当する場合はtopOrigin
https://example.comを使用します。
特に注記がない限り、アテステーションなしの例も含みます。
全てのランダム値は、CDDLで'WebAuthn test vectors'と表現したベース入力鍵素材からHKDF-SHA-256 [RFC5869]で決定論的に生成されています。
またこれと同等なのはh'576562417574686e207465737420766563746f7273'です。
ECDSA署名は決定論的ノンス[RFC6979]を使います。
RSA鍵は、p ≥ 1024の2つの最小メルセンヌ素数 2p - 1から構成されています。
注意:
-
例には再現性のためcredential private keysやattestation private keysを含みますが、 通常これらはクライアントやRelying Partyと共有されません。
注意: CTAP2を実装した認証器は、[FIDO-CTAP]でアテステーションオブジェクトを本仕様で定義されたものとは異なる鍵で返します。 これらの例はWebAuthn Relying Partyが期待するアテステーションオブジェクトの形式を反映しており、 CTAP2から出力されるアテステーションオブジェクトとビット単位で一致させるためには鍵の変換が必要です。
16.1. アテステーショントラストルート証明書
アテステーションを含む全ての例では、X.509 DERで符号化した以下のattestation_ca_certトラストルート証明書を用います [RFC5280]:
attestation_ca_key = h'7809337f05740a96a78eedf9e9280499dcc8f2aa129616049ec1dccfe103eb2a' ; Derived by: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='Attestation CA', L=32) attestation_ca_serial_number = h'ed7f905d8bd0b414d1784913170a90b6' ; Derived by: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='Attestation CA', L=16) attestation_ca_cert = h'30820207308201ada003020102021100ed7f905d8bd0b414d1784913170a90b6300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a3062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d030107034200043269300e5ff7b699015f70cf80a8763bf705bc2e2af0c1b39cff718b7c35880ca30f319078d91b03389a006fdfc8a1dcd84edfa07d30aa13474a248a0dab5baaa3423040300f0603551d130101ff040530030101ff300e0603551d0f0101ff040403020106301d0603551d0e0416041445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d04030203480030450220483063b6bb08dcc83da33a02c11d2f42203176893554d138c614a36908724cc8022100f5ef2c912d4500b3e2f5b591d0622491e9f220dfd1f9734ec484bb7e90887663'
16.1.1. 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) ; bit 0x01 of client_data_gen_flags が 1 の場合のみ extra_client_data を含む extra_client_data = h'06441e0e375c4c1ad70620302532c4e5' ; 派生元: 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'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a22414d4d507434557878475453746e63647134313759447742466938767049612d7077386f4f755657345441222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a20426b5165446a646354427258426941774a544c4535513d3d227d' 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) ; bit 0x01 of client_data_gen_flags が 1 の場合のみ extra_client_data を含む ; 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.1.2. 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) ; bit 0x01 of client_data_gen_flags が 1 の場合のみ extra_client_data を含む extra_client_data = h'53d8535ef284d944643276ffd3160756' ; 派生元: 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'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a2265476e4374334c55745936366b336a506a796e6962506b31716e666644616966715a774c33417032392d55222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a205539685458764b453255526b4d6e625f3078594856673d3d227d' attestationObject = h'a363666d74667061636b65646761747453746d74a263616c67266373696758483046022100ae045923ded832b844cae4d5fc864277c0dc114ad713e271af0f0d371bd3ac540221009077a088ed51a673951ad3ba2673d5029bab65b64f4ea67b234321f86fcfac5d68617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b55d00000000df850e09db6afbdfab51697791506cfc0020455ef34e2043a87db3d4afeb39bbcb6cc32df9347c789a865ecdca129cbef58ca5010203262001215820eb151c8176b225cc651559fecf07af450fd85802046656b34c18f6cf193843c5225820927b8aa427a2be1b8834d233a2d34f61f13bfd44119c325d5896e183fee484f2'
認証:
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) ; bit 0x01 of client_data_gen_flags が 1 の場合のみ extra_client_data を含む extra_client_data = h'8136f9debcfa121496a265c6ce2982d5' ; 派生元: 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'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a225248696843784e534e493352594d45314f7731476d3132786e726b634a5f6666707637546e2d4a71386773222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a206754623533727a36456853576f6d58477a696d4331513d3d227d' signature = h'3044022076691be76a8618976d9803c4cdc9b97d34a7af37e3bdc894a2bf54f040ffae850220448033a015296ffb09a762efd0d719a55346941e17e91ebf64c60d439d0b9744'
16.1.3. ES256 クレデンシャル(clientDataJSON 内で "crossOrigin": true)
登録:
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) ; bit 0x01 of client_data_gen_flags が 1 の場合のみ extra_client_data を含む extra_client_data = h'cd9aae12d0d1f435aaa56e6d0564c5ba' ; 派生元: 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'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a224f2d57717a514e5463554a484930437257576e7951504859647862694332674872434d475666704c4f306b222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a747275652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a207a5a71754574445239445771705735744257544675673d3d227d' 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) ; bit 0x01 of client_data_gen_flags が 1 の場合のみ extra_client_data を含む extra_client_data = h'f76a5c4d50f401bcbeab876d9a3e9e7e' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='none.ES256.crossOrigin', L=16) ; auth_data_UV_BS は認証器データフラグのUVとBSビットを設定するが、BSは登録時にBEがセットされている場合のみ 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'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a226832716c463771445f65356c5f505f62796b7945377135645650674547685f49584a6b655737736e4d5463222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a747275652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a2039327063545644304162792d713464746d6a366566673d3d227d' signature = h'304402204396b14b216ed47920dc359e46aa0a1d4a912cf9d50f25a58ec236a11db4cf5e02204fdb59ff01656c4b0868e415436a464b0e30e94b02c719b995afaba9c917146b'
16.1.4. ES256 クレデンシャル(clientDataJSON 内で "topOrigin")
登録:
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) ; bit 0x01 of client_data_gen_flags が 1 の場合のみ extra_client_data を含む 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) ; bit 0x01 of client_data_gen_flags が 1 の場合のみ extra_client_data を含む extra_client_data = h'52216824c5514070c0156162e2fc54a5' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='none.ES256.topOrigin', L=16) ; auth_data_UV_BS は認証器データフラグのUVとBSビットを設定するが、BSは登録時にBEがセットされている場合のみ 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'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a22315570636a4b53324b6f34377379486a7372787a68572d466f51465132796b3572426c584f6573656f4759222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a747275652c22746f704f726967696e223a2268747470733a2f2f6578616d706c652e636f6d222c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a205569466f4a4d565251484441465746693476785570513d3d227d' signature = h'304402206a19613fa8cfacfc8027272aec5dae3555fea9f983d841581466678d71e6761a02207a9785ba22e48eb18525850357d9dc70795aaad2e6021159c4a4a183146eaa71'
16.1.5. ES256 クレデンシャル(非常に長いクレデンシャルID)
登録:
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) ; bit 0x01 of client_data_gen_flags が 1 の場合のみ extra_client_data を含む 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'a363666d74646e6f6e656761747453746d74a0686175746844617461590483bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b549000000008f3360c2cd1b0ac14ffe0795c5d2638e03ff3a761a4e1674ad6c4305869435c0eee9c286172c229bb91b48b4ada140c0863417031305cce5b4a27a88d7fe728a5f5a627de771b4b40e77f187980c124f9fe832d7136010436a056cce716680587d23187cf1fc2c62ae86fc3e508ee9617ffc74fbc10488ec16ec5e9096328669a898709b655e549738c666c1ae6281dc3b5f733c251d3eefb76ee70a3805ca91bcc18e49c8dc7f63ebcb486ba8c3d6ab52b88ff72c6a5bb47c32f3ee8683a3ddc8abf60870448ec8a21b5bdcb183c7dead870255575a6df96eb1b6a2a1019780cba9e4887b17ff1164bbbcc10eb0d86ed75984cd3fa3419103024507dfd9ce8f92c56af7914cb0bb50b87ba82a312bb7dcd93028dbdcd6adb266979667158335171e3682d37755701edbf9d872846a291d49e57ef09da1ec637f5052ed2aa7407f7e61827468e94b461844f4c67be5fa9c6055a566f8fdfc29d4bf78a9ff275f552cc68ba543fa3962eea36fd1ea8453764577d021d0a181efc1f6100ab2e4110039e21ee16970bda7432b6134492155afc126295b3a2eccd12c66a68e340969e995e3e8c9c476e395cfc21203414110779474f1c9797406637dbe414f132519d3bf0ce4f01734ef0e1a12c3ad604ff15d766b1624db6a5a7ccbff7bc35c9908df94aba277e0af48f04ff3d16381c47e5a37ed3988a67a3b1ecaa926336b33391fff04128f869991c9fabd905b6fe3ceef5f8b630ec1c5d2636d5b1961ad5ca5004170f6f5e482792aad989b0287fe91e5c479403397152f1fa56aa79b156eb47e6c8ea3eb175c34cfb38ad8e772874639b1023d4d01395c94e55831671cc022aa6fa1e02a02c2e4abc776f6960e51f83b71a8c0f207b6a347573977812c9aa5480b0011aa739bd4b76c18c000cc4757cceccb920f007c40c00e37e5ab21476cd9f6054a8fffb55a108f5c706e2cea2049d81fd321ff47d2a5761b0800955ab1d4f4889f55a84e2601c684f17a4ade7453ea49591d0b59c8d9a765052f62219cf6ef4a5dd9539f0617d6ebbebce7c000455475d18449e25c49ef9a1e3efe18c09082ebe2058d7c347defaa92f0664553b805c7d76bbfce5f330aca220ac90a789380fc479ea0d8793205813cca590a912f699ad52f991a1bc0a503c3ec4b2a696719e3c26591a87127f7305cc7e72f4c8e39355ebb06a5b1042990f38710ee7aa612ee4374bb82e878585a70a96c2a6b47f101a4ff154be4fd76a3167577a5cc54d9167c154c69ac35485e44cc898b719e1be3cc9c0fb5624b8f8a0dae10947a41bf848b6c1bb33d1006ec077d7e286e3f2a7b4843716390119449fe2721e81a5ed2333d331c7120765da58fadae73c19d9a8c4509cf8ac1e9d98b799a5274509069739b5823f3fb496663820033426988eefca53e580e0f9e0dfe0992fc2e53a97e053639f98577058f995bdbd41cefdba50102032620012158203b8176b7504489cc593046d7988abb7905a742de6ac2cdc748a873c663e90cb12258201436d5edc9a75f23999eef9d5950a5c2455514ee1014084720f841a06b828a11'
認証:
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) ; bit 0x01 of client_data_gen_flags が 1 の場合のみ extra_client_data を含む ; auth_data_UV_BS は認証器データフラグのUVとBSビットを設定するが、BSは登録時にBEがセットされている場合のみ 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.1.6. Packed アテステーション(ES256クレデンシャル)
登録:
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) ; bit 0x01 of client_data_gen_flags が 1 の場合のみ extra_client_data を含む extra_client_data = h'f5af1b3588ca0a05ab05753e7c29756a' ; 派生元: 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'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a227752684b58393334424634543345663153324831706c61325a725751475046746877365356756d56494249222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a20396138624e596a4b436757724258552d66436c3161673d3d227d' attestationObject = h'a363666d74667061636b65646761747453746d74a363616c67266373696758473045022025fcee945801b94e63d7c029e6f761654cf02e7100d5364a3b90e03daa6276fc022100eabcdf4ce19feb0980e829c3b6137079b18e42f43ce5c3c573b83368794f354c637835638159022530820221308201c8a00302010202110088c220f83c8ef1feafe94deae45faad0300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d03010703420004a91ba4389409dd38a428141940ca8feb1ac0d7b4350558104a3777a49322f3798440f378b3398ab2d3bb7bf91322c92eb23556f59ad0a836fec4c7663b0e4dc3a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e04160414a589ba72d060842ab11f74fb246bdedab16f9b9b301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d040302034700304402201726b9d85ecd8a5ed51163722ca3a20886fd9b242a0aa0453d442116075defd502207ef471e530ac87961a88a7f0d0c17b091ffc6b9238d30f79f635b417be5910e768617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b54d00000000876ca4f52071c3e9b25509ef2cdf7ed60020c9a6f5b3462d02873fea0c56862234f99f081728084e511bb7760201a89054a5a50102032620012158201cf27f25da591208a4239c2e324f104f585525479a29edeedd830f48e77aeae522582059e4b7da6c0106e206ce390c93ab98a15a5ec3887e57f0cc2bece803b920c423'
認証:
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) ; bit 0x01 of client_data_gen_flags が 1 の場合のみ extra_client_data を含む extra_client_data = h'019330c8cc486c3f3eba0b85369eabf1' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0b', info='packed.ES256', L=16) ; auth_data_UV_BS は認証器データフラグのUVとBSビットを設定するが、BSは登録時にBEがセットされている場合のみ 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'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2273524276704770587676463446524841565833496d4b4130453958773858306b526a44426c4d6668726255222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a20415a4d77794d78496244382d756775464e70367238513d3d227d' signature = h'30460221009d8d54895393894d37b9fa7bdfbcff05403de3cf0d6443ffb394fa239f101579022100c8871288f19c6c48a3b64c09d39868c12d16ed80ea4c5d8890288975c0272f50'
16.1.7. 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 の場合のみ extra_client_data を含む 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が1の場合のみ 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'a363666d74667061636b65646761747453746d74a363616c67266373696758473045022100c56ecc970b7843833e0f461fde26233f61eb395161d481558c08b9c6ed61675b022029f5e05033705cd0f9b0a07e149468ec308a4f84906409efdceb1da20a7518d6637835638159022530820221308201c7a00302010202103d0a5588bb87ebb1d4cee4a1807c1b7c300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d0301070342000417e5cc91d676d370e36aa7de40c25aacb45a3845f13d2932088ece2270b9b431241c219c22d0c256c9438ade00f2c05e62f8ef906b9b997ae9f3c460c2db66f5a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e04160414c7c8dd95382a2230e4c0dd3664338fa908169a9c301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d0403020348003045022054068cc9ae038937b7c468c307edb9c6927ffdeb6a20070c483eb40330f99f10022100cf41953919c3c04693d6b1f42a613753f204e70e85fc6e9b17036170b83596e068617574684461746158c5bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b55900000000e950dcda3bdae1d087cda380a897848b0020953ae2dd9f28b1a1d5802c83e1f65833bb9769a08de82d812bc27c13fc6f06a9a5010203382220022158304866bd8b01da789e9eb806e5eab05ae5a638542296ab057a2f1bbce9b58f8a08b9171390b58a37ac7fffc2c5f45857da2258302a0b024c7f4b72072a1f96bd30a7261aae9571dd39870eb29e55c0941c6b08e89629a1ea1216aa64ce57c2807bf3901a'
認証:
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 の場合のみ extra_client_data を含む ; auth_data_UV_BS は認証データフラグのUV, BSビットを設定(BSは登録時にBEがセットされた場合のみ) 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'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a225f304844306c32396957623759654b4f39655277516545333753614649454574646941726f4b307446464d222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d' signature = h'3065023100e4efbb46745ed00e67c4d51ab2bacab2af62ffa8b7c5fecec6d7d9bf2582275034a713a3dd731685eee81adfaf6aa63f0230161655353f07e018a3c2539f8de7c8c4cf88d4c32d2be29fe4e76fa096ecc9458bbfe0895d57129ab324130e6f0692db'
16.1.8. 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 の場合のみ extra_client_data を含む extra_client_data = h'a37a958ce2f6b535a6e06c64cc8fd082' ; 派生元: 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が1の場合のみ 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'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a22547549677a5a4b7766684646484c544341635631573968356849354a4b707353313545317869646b33435f536a713149434d722d577448656a366e676a55714f3676366b33374d7a683373437646415f5231303744424f5570326737717654795233677039376a5064516c496d465659644977484d47673562385f63305f4a46767941343572733431314d6e614b72524f2d6a424750636e636935304a684f5151656e4b796c4134684d55222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a206f3371566a4f4c327454576d3447786b7a495f5167673d3d227d' attestationObject = h'a363666d74667061636b65646761747453746d74a363616c67266373696758483046022100c48fcbd826bbc79680802026688d41ab6da8c3a1d22ab6cecf36c8d7695d22500221008767dfe591277e973078d5692c8c35cf9d579792822e7145c96a0ac4515df5b0637835638159022730820223308201c8a0030201020211008a128b7ebe52b993835779e6d9b81355300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d03010703420004940b68885291536e2f7c60c05acfb252e7eebcf4304425dd93ab7b1962f20492bf18dc0f12862599e81fb764ac92151f9a78fcbb35d7a26c8c52949b18133c06a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e041604143ffad863abcd3dc5717b8a252189f41af97e7f31301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d0403020349003046022100832c8b64c4f0188bd32e1bec63e13301cdc03165d3ef840d1f3dabb9a5719f83022100add57a9d5bedec98f29222dfc97ea795d055ee13a02a153d02be9ce00aedeb9168617574684461746158e9bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b54d0000000039d8ce6a3cf61025775083a738e5c2540020d17d5af7e3f37c56622a67c8462c9e1c6336dfccb8b61d359dc47378dba58ce4a5010203382320032158420083240a2c3ad21a3dc0a6daa3d8bc05a46d7cd9825ba010ae2a22686c2d6d663d7d5f678987fb1e767542e63dc197ae915e25f8ee284651af29066910a2cc083f50225842017337df47ab5cce5d716ef8caffa97a3012689b1f326ea6c43a1ba9596c72f71f0122390143552b42be772b4c35ffb961220c743b486a601ea4cb6d5412f5b078d3'
認証:
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 の場合のみ extra_client_data を含む ; auth_data_UV_BS は認証データフラグのUVおよびBSビットを設定(BSは登録時にBEが1の場合のみ) 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.1.9. 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 の場合のみ extra_client_data を含む 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が1の場合のみ 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 の場合のみ extra_client_data を含む ; auth_data_UV_BS は認証データフラグのUV, BSビットを設定(BSは登録時にBEが1の場合のみ) 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.1.10. Ed25519 資格情報を用いた Packed アテステーション
登録:
challenge = h'560c73a09ce7a1586d61c1d6e41fef149be523e220fc9f385d38ab23702ebf1b' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='packed.Ed25519', L=32) private_key = h'c87fce9e9cd283d272a2418d9683366f83661e458ad4451f0f1c95cb83b0f0a8' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='packed.Ed25519', L=32) client_data_gen_flags = h'41' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='packed.Ed25519', L=1) ; client_data_gen_flags のビット 0x01 が 1 の場合に限り extra_client_data を含む extra_client_data = h'db7587e24b9187edb77933754331e443' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='packed.Ed25519', L=16) aaguid = h'164009ea09faae7c397bc3e2ad0e7ec0' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='packed.Ed25519', L=16) credential_id = h'c6cffa01b7fda368a7e0b29c1384a719820246bca894dd12914708743af0cecd' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='packed.Ed25519', L=32) ; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定する。ただし BS は BE がセットされている場合にのみセットされる auth_data_UV_BE_BS = h'e8' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='packed.Ed25519', L=1) attestation_private_key = h'673ee7fd94405de523fd84a088ab082d75b7fceef02a301e2bca0a28537cf243' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='packed.Ed25519', L=32) attestation_cert_serial_number = h'6e391f23f57150dc7a12dad18f2b43ad' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='packed.Ed25519', L=16) clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a225667787a6f4a7a6e6f5668745963485735425f76464a766c492d49675f4a38345854697249334175767873222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a2032335748346b7552682d323365544e31517a486b51773d3d227d' attestationObject = h'a363666d74667061636b65646761747453746d74a363616c672663736967584730450220730a54d4f76cb1f2b7dd4a5a6eee3374e3c8a60fb3c4daa527c9277e365b64aa0221008b31a04a28cc4148b14c42a916548ee7f430bc7629295b42ee93e5d1aaba8ee6637835638159022530820221308201c7a00302010202106e391f23f57150dc7a12dad18f2b43ad300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d03010703420004fb96a581a0b36742a8c45d6ffb5af1ef155524b50339445ec1109874045e0087db77edef91f3dc949927470d84b01627087b72c86b7c9d02e1389cba680ffc36a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e04160414ef2ce1a86caba85121130a16e8ce82a75d5a6653301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d0403020348003045022100ad4fa628cffba5a642a562cbfefe63efecce26d90c80114114d1745383e12f01022028af87ba3b0ff868a34b9458bc6973b27380a328dd87b7436651ffa823280bca6861757468446174615881bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b54900000000164009ea09faae7c397bc3e2ad0e7ec00020c6cffa01b7fda368a7e0b29c1384a719820246bca894dd12914708743af0cecda401010327200621582089f81eba4a1f510cb243ff7fb9e9cf899bf627e49ce1ac3c3eae8adb2a8d7d7b'
認証:
challenge = h'3790da8b2b72ee8ce19761787ad38cbfaa697eb3ca013a1342988756b98785ab' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='packed.Ed25519', L=32) client_data_gen_flags = h'de' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='packed.Ed25519', L=1) ; client_data_gen_flags のビット 0x01 が 1 の場合に限り extra_client_data を含む ; auth_data_UV_BS は認証器データフラグの UV と BS ビットを設定する。ただし登録時に BE が設定されていた場合に限り BS が設定される auth_data_UV_BS = h'18' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0b', info='packed.Ed25519', L=1) authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b51900000000' clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a224e35446169797479376f7a686c32463465744f4d763670706672504b41546f545170694856726d48686173222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d' signature = h'4c873571377ac019f257d6bf07249f63ac2487483c51bc511ce0f0e3266c840cb07a09cdc445a2f963d8603a9f0f6cf9ce709d7fc6a96c7c51ea08d33776010c'
16.1.11. 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 の場合に限り extra_client_data を含む 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 の場合に限り extra_client_data を含む ; auth_data_UV_BS は認証器データフラグの 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.1.12. 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 の場合に限り extra_client_data を含む extra_client_data = h'555d5c42e476a8b33f6a63dfa07ccbd2' ; 派生元: 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'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a2250654877747a5a647a4e345f384d76795869625f7037725f682d385162494438686c334541746d57414641222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a205656316351755232714c4d5f616d50666f487a4c30673d3d227d' attestationObject = h'a363666d746b616e64726f69642d6b65796761747453746d74a363616c672663736967584630440220592bbc3c4c5f6158b52be1e085c92848986d7844245dfc9512e1a7e9ff7a2cd8022015bdd0852d3bd091e1c22da4211f4ccf0fdf4d912599d1c6630b1f310d3166f5637835638159026d3082026930820210a00302010202101ff91f76b63f44812f998b250b0286bf300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d0301070342000499169657036d089a2a9821a7d0063d341f1a4613389359636efab5f3cbf1accfdd91c55543176ea99b644406dd1dd63774b6af65ac759e06ff40b1c8ab02df6ba381a83081a5300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e041604141ac81e50641e8d1339ab9f7eb25f0cd5aac054b0301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e3045060a2b06010401d679020111043730350202012c0201000201000201000420b20e943e3a7544b3a438943b6d5655313a47ef1af34e00ff3261aeb9ed155817040030003000300a06082a8648ce3d040302034700304402206f4609c9ffc946c418cef04c64a0d07bcce78f329b99270b822f2a4d1e3b75330220093c8d18328f36ef157f296393bdc7721dd2bd67438ffeaa42f051a044b7457168617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b55d00000000ade9705e1ce7085b899a540d02199bf800200a4729519788b6ed8a2d772b494e186244d8c798c052960dbc8c10c915176795a501020326200121582099169657036d089a2a9821a7d0063d341f1a4613389359636efab5f3cbf1accf225820dd91c55543176ea99b644406dd1dd63774b6af65ac759e06ff40b1c8ab02df6b'
認証:
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 の場合に限り extra_client_data を含む extra_client_data = h'ab127107eff182bc3230beb5f1dad29c' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='android-key.ES256', L=16) ; auth_data_UV_BS は認証器データフラグの 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'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a22354f344679703238375851525a55447954746d74786971756851645742534b45545f702d36685433723459222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a2071784a78422d5f78677277794d4c3631386472536e413d3d227d' signature = h'304502202060107d953b286aa1bf35e3e8c78b383fddab5591b2db17ffb23ed83fe7df20022100a99be0297cb0d9d38aa96f30b760a4e0749dab385acd2a51d0560caae570d225'
16.1.13. 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 の場合に限り extra_client_data を含む extra_client_data = h'4e32cf9e939a5d052b14d71b1f6b5364' ; 派生元: 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'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a22395f61494954685341486431414a7a34774a6239714a316775616e37576c4464676432596d4b396142676b222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a20546a4c506e704f6158515572464e6362483274545a413d3d227d' attestationObject = h'a363666d74656170706c656761747453746d74a1637835638159025c30820258308201fea0030201020210394275613d5310b81a29ce90f48b61c1300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d030107034200048a3d5b1b4c543a706bf6e4b00afedb3c930b690dd286934fe2911f779cc7761af728e1aa3b0ff66692192daa776b83ddf8e3340d2d9a0eabdfc324eb3e2f136ca38196308193300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e0416041412f1ce6c0ae39b403bfc9200317bc183a4e4d766301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e303306092a864886f76364080204263024a122042097851a1a98b69c0614b26a94b70ec3aa07c061f89dbee23fbee01b6c42d718b0300a06082a8648ce3d040302034800304502207d541a5553f38b93b78b26a9dca58e64a7f8fac15ca206ae3ea32497cda375fb0221009137c6b75e767ec08224b29a7f703db4b745686dcc8a26b66e793688866d064f68617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b54900000000748210a20076616a733b2114336fc38400209c4a5886af9283d9be3e9ec55978dedfdce2e3b365cab193ae850c16238fafb8a50102032620012158208a3d5b1b4c543a706bf6e4b00afedb3c930b690dd286934fe2911f779cc7761a225820f728e1aa3b0ff66692192daa776b83ddf8e3340d2d9a0eabdfc324eb3e2f136c'
認証:
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 の場合に限り extra_client_data を含む ; auth_data_UV_BS は認証器データフラグの 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.1.14. 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 の場合に限り extra_client_data を含む 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 の場合に限り extra_client_data を含む ; auth_data_UV_BS は認証器データフラグの 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.2. WebAuthn 拡張機能のテストベクトル
この節では WebAuthn 拡張機能の例示値を示す。
16.2.1. 疑似乱数関数拡張 (prf)
この節では疑似乱数関数(prf)拡張の例示値を示す。
prf 拡張は CTAP2 の hmac-secret 拡張と統合されるため、例は二つのセクションに分かれる: WebAuthn の prf 拡張に対する例入力・出力(WebAuthn クライアントおよび WebAuthn リライイングパーティ向け)と、 WebAuthn prf 拡張と CTAP2 の hmac-secret 拡張とのマッピングの例(WebAuthn クライアントおよび WebAuthn 認証器向け)。
16.2.1.1. Web Authentication API
以下の例は、WebAuthn クライアントの実装や WebAuthn リライイングパーティによる prf 拡張の使用をテストするために使える。 例は網羅的ではない。
-
enabled出力は登録時に常に存在し、認証時には決して存在しない:// 拡張入力の例: { prf: {} } // navigator.credentials.create() からのクライアント拡張出力の例: { prf: { enabled: true } } { prf: { enabled: false } } // navigator.credentials.get() からのクライアント拡張出力の例: { prf: {} } -
results出力は、registration または authentication の際に、evalまたはevalByCredential入力が存在する場合に出現し得る:// 拡張入力の例: { prf: { eval: { first: new Uint8Array([ 1 , 2 , 3 , 4 ]) } } } // navigator.credentials.create() からのクライアント拡張出力の例: { prf: { enabled: true } } { prf: { enabled: false } } { prf: { enabled: true , results: { first: ArrayBuffer} } } // navigator.credentials.get() からのクライアント拡張出力の例: { prf: {} } { prf: { results: { first: ArrayBuffer} } } -
results.second出力は、results 出力が存在し、かつ選択された PRF 入力に second 入力が含まれていた場合に限り存在する:// 拡張入力の例: { prf: { eval: { first: new Uint8Array([ 1 , 2 , 3 , 4 ]), second: new Uint8Array([ 5 , 6 , 7 , 8 ]), }, evalByCredential: { "e02eZ9lPp0UdkF4vGRO4-NxlhWBkL1FCmsmb1tTfRyE" : { first: new Uint8Array([ 9 , 10 , 11 , 12 ]), } } } } // 資格情報 "e02eZ9lP..." が使用された場合の navigator.credentials.get() からの出力例: { prf: { results: { first: ArrayBuffer} } } // 別の資格情報が使用された場合の例: { prf: {} } { prf: { results: { first: ArrayBuffer, second: ArrayBuffer} } } -
first および second 出力は任意の BufferSource 型になり得る。等しい first と second の入力は等しい first と second の出力をもたらす:
// 拡張入力の例: { prf: { evalByCredential: { "e02eZ9lPp0UdkF4vGRO4-NxlhWBkL1FCmsmb1tTfRyE" : { first: new Uint8Array([ 9 , 10 , 11 , 12 ]), second: new Uint8Array([ 9 , 10 , 11 , 12 ]) } } } } // navigator.credentials.get() からの出力例: { prf: { results: { first: new Uint8Array([ 0xc4 , 0x17 , 0x2e , 0x98 , 0x2e , 0x90 , 0x97 , 0xc3 , 0x9a , 0x6c , 0x0c , 0xb7 , 0x20 , 0xcb , 0x37 , 0x5b , 0x92 , 0xe3 , 0xfc , 0xad , 0x15 , 0x4a , 0x63 , 0xe4 , 0x3a , 0x93 , 0xf1 , 0x09 , 0x6b , 0x1e , 0x19 , 0x73 ]), second: new Uint32Array([ 0x982e17c4 , 0xc397902e , 0xb70c6c9a , 0x5b37cb20 , 0xadfce392 , 0xe4634a15 , 0x09f1933a , 0x73191e6b ]), } } }
この節で使用された疑似乱数値は以下の方法で生成された:
-
"e02eZ9lPp0UdkF4vGRO4-NxlhWBkL1FCmsmb1tTfRyE" = Base64Url(SHA-256(UTF-8("WebAuthn PRF test vectors") || 0x00)) -
h'c4172e982e9097c39a6c0cb720cb375b92e3fcad154a63e43a93f1096b1e1973' = SHA-256(UTF-8("WebAuthn PRF test vectors") || 0x01)
16.2.1.2. CTAP2 の hmac-secret 拡張
以下の例は、WebAuthn クライアント実装が prf 拡張を CTAP の hmac-secret 拡張とどのように連携させるかをテストするためのもの。 例は CDDL 表記で示す。例は網羅的ではない。
-
以下の共通定義は後続のすべての例で使われる:
; 与えられた入力パラメータ: platform_key_agreement_private_key = 0x0971bc7fb1be48270adcd3d9a5fc15d5fb0f335b3071ff36a54c007fa6c76514 authenticator_key_agreement_public_key = { 1 : 2 , 3 : -25 , -1 : 1 , -2 : h'a30522c2de402b561965c3cf949a1cab020c6f6ea36fcf7e911ac1a0f1515300' , -3 : h'9961a929abdb2f42e6566771887d41484d889e735e3248518a53112d2b915f00' , } authenticator_cred_random = h'437e065e723a98b2f08f39d8baf7c53ecb3c363c5e5104bdaaf5d5ca2e028154' ここで、first / second 入力はそれぞれ prf_eval_first / prf_eval_second にマップされる。 例の prf_results_first / prf_results_second は、クライアント出力の results.first / results.second に対応する。
-
PIN プロトコル 2 を使用する単一入力の場合:
; リライイングパーティからの入力: prf_eval_first = h'576562417574686e20505246207465737420766563746f727302' ; クライアントが計算: shared_secret = h'0c63083de8170101d38bcf8bd72309568ddb4550867e23404b35d85712f7c20d8bc911ee23c06034cbc14290b9669bec07739053c5a416e313ef905c79955876' salt1 = h'527413ebb48293772df30f031c5ac4650c7de14bf9498671ae163447b6a772b3' salt_enc = h'437e065e723a98b2f08f39d8baf7c53ebbb2ed3e746b87576fd81f95def5757cad24be18eaef892e97692e684e07da53' ; 認証器が計算: output1 = h'3c33e07d202c3b029cc21f1722767021bf27d595933b3d2b6a1b9d5dddc77fae' output_enc = h'3bfaa48f7952330d63e35ff8cd5bca48d2a12823828915749287256ab146272f9fb437bf65691243c3f504bd7ea6d5e6' ; クライアントが復号: prf_results_first = h'3c33e07d202c3b029cc21f1722767021bf27d595933b3d2b6a1b9d5dddc77fae' -
PIN プロトコル 2 を使用する二入力の場合:
; リライイングパーティからの入力: prf_eval_first = h'576562417574686e20505246207465737420766563746f727302' prf_eval_second = h'576562417574686e20505246207465737420766563746f727303' ; クライアントが計算: shared_secret = h'0c63083de8170101d38bcf8bd72309568ddb4550867e23404b35d85712f7c20d8bc911ee23c06034cbc14290b9669bec07739053c5a416e313ef905c79955876' salt1 = h'527413ebb48293772df30f031c5ac4650c7de14bf9498671ae163447b6a772b3' salt2 = h'd68ac03329a10ee5e0ec834492bb9a96a0e547baf563bf78ccbe8789b22e776b' salt_enc = h'23dde5e3462daf36559b85c4ac5f9656aa9bfd81c1dc2bf8533c8b9f3882854786b4f500e25b4e3d81f7fc7c742362294d92926c883b3fae1a3673246464bf730446e1fa4698c432a9092477c5dde5e3' ; 認証器が計算: output1 = h'3c33e07d202c3b029cc21f1722767021bf27d595933b3d2b6a1b9d5dddc77fae' output2 = h'a62a8773b19cda90d7ed4ef72a80a804320dbd3997e2f663805ad1fd3293d50b' output_enc = h'90ee52f739043bc17b3488a74306d7801debb5b61f18662c648a25b5b5678ede482cdaff99a537a44f064fcb10ce6e04dfd27619dc96a0daff8507e499296b1eecf0981f7c8518b277a7a3018f5ec6fb' ; クライアントが復号: prf_results_first = h'3c33e07d202c3b029cc21f1722767021bf27d595933b3d2b6a1b9d5dddc77fae' prf_results_second = h'a62a8773b19cda90d7ed4ef72a80a804320dbd3997e2f663805ad1fd3293d50b' -
PIN プロトコル 1 を使用する単一入力の場合:
; リライイングパーティからの入力: prf_eval_first = h'576562417574686e20505246207465737420766563746f727302' ; クライアントが計算: shared_secret = h'23e5ed7157c25892b77732fb9c8a107e3518800db2af4142f9f4adfacb771d39' salt1 = h'527413ebb48293772df30f031c5ac4650c7de14bf9498671ae163447b6a772b3' salt_enc = h'ab8c878bb05d04700f077ed91845ec9c503c925cb12b327ddbeb4243c397f913' ; 認証器が計算: output1 = h'3c33e07d202c3b029cc21f1722767021bf27d595933b3d2b6a1b9d5dddc77fae' output_enc = h'15d4e4f3f04109b492b575c1b38c28585b6719cf8d61304215108d939f37ccfb' ; クライアントが復号: prf_results_first = h'3c33e07d202c3b029cc21f1722767021bf27d595933b3d2b6a1b9d5dddc77fae'
この節で使われた入力および疑似乱数値は次のように生成された:
-
seed = UTF-8("WebAuthn PRF test vectors") -
prf_eval_first = seed || 0x02 -
prf_eval_second = seed || 0x03 -
platform_key_agreement_private_key = SHA-256(seed || 0x04) -
authenticator_key_agreement_public_key = P256-Public-Key(sk)wheresk = SHA-256(seed || 0x05) -
authenticator_cred_random = SHA-256(seed || 0x06) -
iv(PIN プロトコル 2 の単一入力 salt_enc):切り詰めたSHA-256(seed || 0x07) -
iv(PIN プロトコル 2 の二入力 salt_enc):切り詰めたSHA-256(seed || 0x08) -
iv(PIN プロトコル 2 の単一入力 output_enc):切り詰めたSHA-256(seed || 0x09) -
iv(PIN プロトコル 2 の二入力 output_enc):切り詰めたSHA-256(seed || 0x0a)
17. 謝辞
この仕様のレビューや貢献をしてくださった以下の方々に感謝いたします: 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、 そして Boris Zbarsky。Adam Powers には、全体の 登録 および 認証 フロー図 (図1 および 図2)を作成していただいたことに感謝します。
Anthony Nadalin、 John Fontana、 そして Richard Barnes には Web Authentication Working Group の共同議長としての貢献を感謝します。
また Simone Onofri、 Philippe Le Hégaret、 Wendy Seltzer、 Samuel Weiler、 そして Harry Halpin には W3C チームコンタクトとしての貢献に感謝します。
18. 改訂履歴
この節は規範的ではありません。
この節では、仕様に対してこれまで行われた主な変更点をまとめています。
18.1. Web Authentication Level 2 [webauthn-2-20210408] 以降の変更点
18.1.1. 本質的な変更点
次の変更が Web Authentication API およびその挙動に対して加えられました。
変更点:
-
タイムアウトのガイダンスを更新: § 15.1 セレモニーのタイムアウト推奨範囲
-
uvm拡張は含まれなくなりました。代わりに L2 [webauthn-2-20210408] を参照してください -
aaguid は 証明付き資格情報データ 内で もはや 0 で埋められなくなりました その
attestationの優先度がnoneの場合: § 5.1.3 新しい資格情報の作成 - PublicKeyCredential の [[Create]](origin, options, sameOriginWithAncestors) 内部メソッド
非推奨:
-
登録パラメーター
: § 5.4.1 公開鍵エンティティ記述 (dictionary PublicKeyCredentialEntity)publicKey.rp.name -
tokenBinding は [RESERVED] に変更されました。
新機能:
-
新しいJSONの(逆)シリアライズメソッド:
-
クロスオリジン iframe での create 操作:
-
create の条件付きメディエーション: § 5.1.3 新しい資格情報の作成 - PublicKeyCredential の [[Create]](origin, options, sameOriginWithAncestors) 内部メソッド
-
get の条件付きメディエーション: § 5.1.4 既存の資格情報を使ったアサーションの生成
-
§ 5.1.7 クライアント機能の利用可否 - PublicKeyCredential の getClientCapabilities() メソッド
-
新しい列挙値
hybrid§ 5.8.4 認証器トランスポート列挙(enum AuthenticatorTransport) に追加。 -
新しい クライアントデータ 属性
topOrigin: § 5.8.1 WebAuthn シグネチャに用いられるクライアントデータ (dictionary CollectedClientData)
18.1.2. 編集上の変更
この文書の明瞭性、可読性、ナビゲーション性等を向上させるために下記の編集が行われました。
-
§ 1.2 利用例 を展開し、展開状況の発展を反映しました。
-
資格情報レコード の概念を導入し、リライイングパーティ が記憶すべきデータと 登録・認証セレモニー間の関係を明確化しました。
-
エラー条件の明確化:
-
§ 6.4 文字列の取扱い を分割し、 § 6.4.1.1 クライアントによる文字列切り詰め と § 6.4.1.2 認証器による文字列切り詰め の 2 項目として責任範囲を明確化。
-
§ 16 テストベクトル を追加。
-
規範的な記述を "note" ブロック外に移動。