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) { /* クライアントが対応していません。エラーを処理してください。 */ } var publicKey= { // チャレンジはサーバーによって生成されます。セキュリティ上の注意点を参照してください challenge: new Uint8Array([ 21 , 31 , 105 /* サーバーによって生成されたさらに29個のランダムバイト */ ]), // Relying Party: rp: { name: "ACME Corporation" }, // ユーザー: user: { id: Uint8Array. from ( window. atob( "MIIBkzCCATigAwIBAjCCAZMwggE4oAMCAQIwggGTMII=" ), c=> c. charCodeAt( 0 )), name: "alex.mueller@example.com" , displayName: "Alex Müller" , }, // このRelying PartyはEdDSA、ES256、またはRS256のいずれかの認証情報を受け入れますが // EdDSAの認証情報を優先します。 pubKeyCredParams: [ { type: "public-key" , alg: - 8 // IANA COSEアルゴリズムレジストリに登録されている"EdDSA" }, { type: "public-key" , alg: - 7 // IANA COSEアルゴリズムレジストリに登録されている"ES256" }, { type: "public-key" , alg: - 257 // この仕様で登録された"RS256"の値 } ], authenticatorSelection: { // 可能な場合はUV(ユーザー検証)を使用します。これはデフォルトでもあります。 userVerification: "preferred" }, timeout: 300000 , // 5分 excludeCredentials: [ // これらの認証情報を持つ認証器は再登録しません { "id" : Uint8Array. from ( window. atob( "ufJWp8YGlibm1Kd9XQBWN1WAw2jy5In2Xhon9HAqcXE=" ), c=> c. charCodeAt( 0 )), "type" : "public-key" }, { "id" : Uint8Array. from ( window. atob( "E/e1dhZc++mIsz4f9hb6NifAzJpF1V4mEtRlIPBiWdY=" ), c=> c. charCodeAt( 0 )), "type" : "public-key" } ], // excludeCredentialsチェックをU2Fで登録された認証情報とも互換性を持たせる extensions: { "appidExclude" : "https://acme.example.com" } }; // 注意: 以下の呼び出しにより認証器がUIを表示します。 navigator. credentials. create({ publicKey}) . then( function ( newCredentialInfo) { // 新しい認証情報をサーバーに送信して検証および登録します。 }). catch ( function ( err) { // 受け入れ可能な認証器がないか、ユーザーが承諾しませんでした。適切に処理してください。 });
1.3.2. ユーザー検証を行うプラットフォーム認証器を用いた登録
これは WebAuthn Relying Party が特に 公開鍵資格情報 を ユーザー検証を行うプラットフォーム認証器 として作成することに関心がある場合の例です。
-
ユーザーは 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. name=== "AbortError" ) { // Inform user the credential hasn't been created. // Let the server know a key hasn't been created. } }); // Assume widget shows up whenever authentication occurs. if ( widget== "disappear" ) { authAbortController. abort(); }
1.3.5. 廃止
資格情報を廃止したい状況として以下のようなものが考えられます。これらはすべてサーバー側で処理され、本仕様で定義された API のサポートを必要としないことに注意してください。
-
可能性 #1 -- ユーザーが資格情報を紛失したと報告する場合。
-
ユーザーは 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 は後で アテステーション署名 を再検証することができます。 - rpId
-
パラメータは、資格情報登録時にrp.idcreate()操作で指定されます。 この値は資格情報の中核的なプロパティであり、使用可能な場所を決定します。 登録時にこの値を保存しておくことで、将来的にその使用状況の監査や認証トラブルシュート、関連オリジンを利用して異なるドメイン間で使用する場合などに役立ちます。
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 インターフェイス
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]]-
PublicKeyCredentialインターフェースオブジェクト の[[type]]内部スロット の値は 文字列 "public-key" です。注: これは
type属性ゲッターによって反映されます。このゲッターはCredentialから継承されています。 [[discovery]]-
PublicKeyCredentialインターフェースオブジェクト の[[discovery]]内部スロット の値は "remote" です。 [[identifier]]-
この 内部スロット には、認証器によって選択された 資格情報ID が含まれます。 資格情報ID は 認証情報を使用するための検索に利用されます。そのため、同じ型のすべての認証情報およびすべての認証器全体で高い確率でグローバル一意になることが期待されます。
このAPIはこの識別子の形式を制約しませんが、 1023バイトを超えてはならず、認証器が一意に鍵を選択できる十分な情報でなければなりません。 例えば、オンボードストレージを持たない認証器は、資格情報プライベートキー を 認証器に焼き込まれた対称鍵でラップした識別子を作成することがあります。
[[clientExtensionsResults]]-
この 内部スロット には、 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 辞書拡張
navigator.credentials.create()
による登録をサポートするために、
本書は
CredentialCreationOptions
辞書を以下の通り拡張します:
partial dictionary CredentialCreationOptions {PublicKeyCredentialCreationOptions ; };publicKey
5.1.2. CredentialRequestOptions 辞書拡張
navigator.credentials.get()
によるアサーション取得をサポートするために、
本書は
CredentialRequestOptions
辞書を次のように拡張します:
partial dictionary CredentialRequestOptions {PublicKeyCredentialRequestOptions ; };publicKey
5.1.3.
新しい資格情報の作成 - PublicKeyCredential の [[Create]](origin, options, sameOriginWithAncestors)
内部メソッド
PublicKeyCredentialの
インターフェースオブジェクトの実装である [[Create]](origin, options, sameOriginWithAncestors)
内部メソッドは、 [CREDENTIAL-MANAGEMENT-1] に従い、
WebAuthn
Relying Party スクリプトが navigator.credentials.create()
を呼び出して、新しい
公開鍵認証情報ソースを作成するよう要求し、
それを 認証器にバインドすることを可能にします。
options.
を mediationconditional
に設定することで、
Relying Parties
は、ユーザーが既に認証情報の作成に同意している場合に、目立つモーダルUIを表示せずに認証情報を登録したいことを示すことができます。
Relying Party はまず getClientCapabilities()
を使って、クライアント が
conditionalCreate
機能をサポートしているかを確認すべきです。これは、この機能が利用できない場合にユーザーに見えるエラーを防ぐためです。
クライアントは、式典(ceremony)中に明示的に実行される可能性がある場合を除き、requireUserPresence と
requireUserVerification の両方を FALSE に設定しなければなりません、これは
options.
が mediationconditional
に設定されているときの要件です。
任意の navigator.credentials.create()
操作は、AbortController
を利用して中止できます;
詳細な手順については DOM § 3.3
Using AbortController and AbortSignal objects in APIs を参照してください。
この 内部メソッド は三つの引数を受け取ります:
origin-
この引数は、呼び出し元の 関連設定オブジェクト の オリジン であり、
create()実装によって決定されます。 options-
この引数は
CredentialCreationOptionsオブジェクトで、そのoptions.メンバーが、作成されるべき PublicKeyCredentialCreationOptions オブジェクトを含んでおり、作成対象の 公開鍵認証情報 の望ましい属性を指定します。publicKey sameOriginWithAncestors-
この引数はブール値であり、呼び出し元の environment settings object が その祖先と same-origin である 場合に限り
trueになります。呼び出し元がクロスオリジンの場合はfalseです。Note: この 内部メソッド の呼び出しは、permissions policy によって許可されたことを示しており、これは [CREDENTIAL-MANAGEMENT-1] レベルで評価されます。 詳細は § 5.9 Permissions Policy integration を参照してください。
Note: このアルゴリズムは同期的です: Promise
の解決/拒否は
navigator.credentials.create()
側で扱われます。
このアルゴリズムで使用されるすべての BufferSource
オブジェクトは、アルゴリズム開始時にスナップショットされなければなりません。これは同期の問題を避けるためです。実装は バッファソースが保持するバイトのコピーを取得
して、そのコピーをアルゴリズムの該当部分で使用することを推奨します。
このメソッドが呼び出されると、ユーザーエージェントは次のアルゴリズムを実行しなければなりません:
-
断言:
options.が存在すること。publicKey -
もし sameOriginWithAncestors が
falseの場合:-
もし
options.が存在し、その値がmediationconditionalの場合:-
"
NotAllowedError" をスローするDOMException
-
-
もし呼び出し側の relevant global object(create() 実装により決定される)が transient activation を持っていない場合:
-
"
NotAllowedError" をスローするDOMException.
-
-
Consume user activation を呼び出し元の relevant global object 上で実行します。
-
もし認証情報を作成している origin が、該当する top-level origin(ユーザーがアドレスバーで見ているオリジン)と異なる場合、 クライアント はその事実をユーザーに明示するべきです。
-
-
pkOptions を
options.の値とします。publicKey -
もし
pkOptions.が存在するなら、その値が クライアント によって定義された妥当な範囲内にあるか確認し、そうでなければその範囲内に最も近い値に補正します。タイマー lifetimeTimer をこの補正された値に設定します。もしtimeoutpkOptions.が存在しない場合、lifetimeTimer をクライアント固有のデフォルトに設定します。timeoutWebAuthn 式典タイムアウトの推奨範囲とデフォルトについては recommended range and default for a WebAuthn ceremony timeout を参照してください。
クライアント は、特別なニーズを持つユーザーに配慮してタイムアウトに関する認知的ガイドラインを考慮すべきです。
-
もし
pkOptions.の長さが 1〜64 バイト(両端含む)の範囲にない場合はuser.idTypeErrorをスローします。 -
callerOrigin を
originとします。もし callerOrigin が opaque origin であれば、"NotAllowedError" をスローします。 -
effectiveDomain を callerOrigin の effective domain とします。もし effective domain が 有効なドメイン でなければ、"
SecurityError" をスローします。Note: effective domain は host に解決され、domain、ipv4 アドレス、ipv6 アドレス、opaque host、empty host など様々な表現を取ることがあります。 ここで許容されるのは domain 形式 のみです。これは単純化のためと、PKI ベースのセキュリティと直接 IP アドレス識別を組み合わせる際の諸問題を考慮したものです。
-
- 存在する場合
-
もし
pkOptions.が effectiveDomain の registrable domain のサフィックスでも等しくもない場合、そしてクライアントがrp.id- related origin requests をサポートする場合
-
-
related origins validation procedure を callerOrigin と rpIdRequested を引数として実行します。結果が
falseなら、"SecurityError" をスローします。
- related origin requests をサポートしない場合
-
"
SecurityError" をスローします。
- 存在しない場合
Note:
pkOptions.は呼び出し元の RP ID を表します。RP ID は、呼び出し元の origin の effective domain にデフォルトされます。ただし、呼び出し側が明示的にrp.idpkOptions.を設定している場合はその値が使用されます。rp.id -
credTypesAndPubKeyAlgs を、新しい リスト とし、その 項目 が
PublicKeyCredentialTypeとCOSEAlgorithmIdentifierのペアであるようにします。 -
もし
pkOptions.の サイズ がpubKeyCredParams- ゼロである場合
-
以下の
PublicKeyCredentialTypeとCOSEAlgorithmIdentifierのペアを credTypesAndPubKeyAlgs に追加します:-
public-keyと-7("ES256"). -
public-keyと-257("RS256").
-
- 非ゼロである場合
-
各 current を
pkOptions.から取り出して処理します:pubKeyCredParams-
もし
current.がこの実装でサポートされていないtypePublicKeyCredentialTypeを含んでいる場合、continue します。 -
alg を
current.とします。alg
もし credTypesAndPubKeyAlgs が 空 であれば、"
NotSupportedError" をスローします。 -
-
clientExtensions を新しい map とし、authenticatorExtensions を新しい map とします。
-
もし
pkOptions.が存在するなら、各 extensionId → clientExtensionInput の組に対して次を行います(extensionspkOptions.に含まれる):extensions-
もし extensionId がこの クライアントプラットフォーム によってサポートされていないか、あるいは registration extension でない場合、continue します。
-
Set clientExtensions[extensionId] を clientExtensionInput に設定します。
-
もし extensionId が authenticator extension でない場合、continue します。
-
authenticatorExtensionInput を、extensionId の client extension processing アルゴリズムを clientExtensionInput に対して実行した結果(CBOR)とします。もしアルゴリズムがエラーを返した場合、continue します。
-
Set authenticatorExtensions[extensionId] を base64url エンコーディング した authenticatorExtensionInput に設定します。
-
-
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 を識別するプラットフォーム固有のハンドルの 集合 を表す値とします。
Note: どのような条件で authenticator が「利用可能」であると見なされるかは意図的に仕様化されていません;これは認証器が(例:USB 経由で)ホットプラグされたり(NFC や Bluetooth 経由で)クライアントによって検出されたり、あるいはクライアントに恒久的に組み込まれている場合があり得ることを表しています。
-
もし
options.が存在し、その値がmediationconditionalの場合:-
もしユーザーエージェントが最近認証を仲介しておらず、その認証のオリジンが callerOrigin でなく、またはユーザーがこの種の認証情報作成に同意していない場合、"
NotAllowedError" をスローします。認証式典が完了したとユーザーエージェントが判断するタイミングはユーザーエージェント側の裁量です。その認証式典は Web Authentication API 以外の手段で行われることもあります。
-
-
hintsの値を考慮し、ユーザーエージェントが適切と判断するようにユーザーインターフェイスを作成します。 -
lifetimeTimer を開始します。
-
While lifetimeTimer が満了していない間、次のアクションを
lifetimeTimer と各 authenticator の状態および応答に応じて実行します。各 authenticator は
authenticators 内で反復します:
- もし lifetimeTimer が満了したら、
-
各 authenticator を issuedRequests について反復し、各 authenticator に対して authenticatorCancel 操作を呼び出し、issuedRequests からその authenticator を 削除 します。
- ユーザーがユーザーエージェントの UI オプションを使って処理をキャンセルした場合、
-
各 authenticator を issuedRequests の中で、authenticatorCancel 操作を authenticator に対して呼び出す。 そして、削除 authenticator を issuedRequests から。"
NotAllowedError"DOMExceptionを投げる。 - もし
options.が存在し、且つ aborted であれば、signal -
各 authenticator を issuedRequests について反復し、各 authenticator に対して authenticatorCancel 操作を呼び出し、issuedRequests からその authenticator を 削除 します。次に
options.の abort reason をスローします。signal - もし authenticator がこの クライアントデバイス 上で利用可能になった場合、
-
Note: これは lifetimeTimer 開始時に既に authenticator が利用可能であった場合も含みます。
-
この 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 が client-side discoverable public key credential source を保存する能力を持っていない場合、continue します。
- 存在し、かつ
-
もし
pkOptions.がauthenticatorSelection.userVerificationrequiredに設定されており、その authenticator が user verification を行う能力を持っていない場合、continue します。
-
-
requireResidentKey を、credential creation に対する実効的な resident key 要件 とし、以下のように定義します:
もし
pkOptions.がauthenticatorSelection.residentKey- 存在し、
requiredに設定されている場合 -
requireResidentKey を
trueにする。 - 存在し、
preferredに設定されている場合 -
authenticatorが
- クライアントサイド資格情報保存方式に対応している場合
-
requireResidentKey を
trueにする。 - クライアントサイド資格情報保存方式に対応していない場合、またはクライアントが認証器の能力を判別できない場合
-
requireResidentKey を
falseにする。
- 存在し、
discouragedに設定されている場合 -
requireResidentKey を
falseにする。 - 存在しない場合
-
requireResidentKey を
pkOptions.の値にする。authenticatorSelection.requireResidentKey
- 存在し、
-
userVerification を、credential creation に対する実効的な user verification 要件 とし、以下のように定義します。もし
pkOptions.がauthenticatorSelection.userVerification- が
requiredに設定されている場合 -
-
もし
options.がmediationconditionalに設定されており、式典中に user verification を収集できない場合、ConstraintErrorをスローします。 -
userVerification を
trueにします。
-
- が
preferredに設定されている場合 -
もしその authenticator が user verification に対応しているなら、userVerification を
trueにします。対応していなければfalseにします。- 対応している場合
-
userVerification を
trueにします。 - 対応していない場合
-
userVerification を
falseにします。
- が
discouragedに設定されている場合 -
userVerification を
falseにします。
- が
-
enterpriseAttestationPossible を Boolean 値として次のように決定します。もし
pkOptions.がattestation- が
enterpriseに設定されている場合 -
ユーザーエージェントが
pkOptions.(上記 step 8 を参照) に対して enterprise attestation をサポートしたい場合、enterpriseAttestationPossible をrp.idtrueにします。そうでなければfalseにします。 - それ以外
-
enterpriseAttestationPossible を
falseにします。
- が
-
attestationFormats を文字列のリストとして初期化し、その初期値を
pkOptions.の値に設定します。attestationFormats -
もし
pkOptions.がattestation- が
noneに設定されている場合 -
attestationFormats を単一要素リスト ["none"] に設定します。
- が
-
excludeCredentialDescriptorList を新しい リスト とします。
-
各 資格情報デスクリプタ C を
pkOptions.から取り出して処理します:excludeCredentials-
もし
C.が 空でない かつ、その authenticator がtransportsC.に含まれていないトランスポートを通じて接続されている場合、クライアントは 続行することができます。transportsNote: クライアントが 続行 を選択した場合、保存されたトランスポートヒントが正確でないと、同じ authenticator に複数の認証情報が誤って登録される可能性があります。 例えば、ソフトウェアのアップグレードによって新しい接続オプションが追加されると、保存されたトランスポートヒントが不正確になることがあります。
-
そうでなければ、Append して C を excludeCredentialDescriptorList に追加します。
-
authenticatorMakeCredential 操作をその authenticator に対して呼び出します。パラメータは clientDataHash、
pkOptions.、rppkOptions.、requireResidentKey、userVerification、credTypesAndPubKeyAlgs、excludeCredentialDescriptorList、enterpriseAttestationPossible、attestationFormats、および authenticatorExtensions です。user
-
-
Append して authenticator を issuedRequests に追加します。
-
- もし authenticator がこの クライアントデバイス 上で利用できなくなった場合、
-
Remove してその authenticator を issuedRequests から取り除きます。
- もし任意の authenticator がユーザーが操作をキャンセルしたことを示すステータスを返した場合、
-
-
Remove してその authenticator を issuedRequests から取り除きます。
-
各 残りの authenticator に対して authenticatorCancel 操作を呼び出し、remove します。
Note: Authenticators は「ユーザーが操作全体をキャンセルした」という通知を返すことがあります。ユーザーエージェントがこの状態をユーザーにどのように示すかは仕様で定められていません。
-
- もし任意の authenticator が "
InvalidStateError" に相当するエラー状態を返した場合、 -
-
Remove してその authenticator を issuedRequests から取り除きます。
-
各 残りの authenticator に対して authenticatorCancel 操作を呼び出し、remove します。
-
"
InvalidStateError" をスローします。
Note: このエラー状態は別個に扱われます。なぜなら authenticator がこのエラーを返すのは、excludeCredentialDescriptorList がその authenticator にバインドされた認証情報を識別しており、かつユーザーがその操作に 同意 している場合に限られるからです。この明示的な同意があるため、このケースが Relying Party に対して区別可能であっても受け入れられます。
-
- もし任意の authenticator が "
InvalidStateError" に相当しないエラー状態を返した場合、 -
Remove してその authenticator を issuedRequests から取り除きます。
Note: このケースは操作に対する ユーザーの同意 を意味しないため、エラーの詳細は潜在的に特定可能な情報の漏洩を防ぐために Relying Party から隠されます。詳細は § 14.5.1 Registration Ceremony Privacy を参照してください。
- もし任意の authenticator が成功を示した場合、
-
-
Remove してその authenticator を issuedRequests から取り除きます。この認証器は現在 selected authenticator です。
-
credentialCreationData を、次の struct として定義します。その 項目 は次の通りです:
-
attestationObjectResult -
その値は成功した authenticatorMakeCredential 操作から返されたバイト列です。
Note: この値は
attObjです(§ 6.5.4 Generating an Attestation Object で定義)。 -
clientDataJSONResult -
その値は clientDataJSON のバイト列です。
-
attestationConveyancePreferenceOption -
その値は pkOptions.
attestationの値です。 -
clientExtensionResults -
その値は
AuthenticationExtensionsClientOutputsオブジェクトで、拡張識別子 → クライアント拡張出力 のエントリを含みます。これらのエントリは、各拡張の client extension processing アルゴリズムを実行して クライアント拡張出力 を作成することによって生成されます。対象はpkOptions.に含まれる各クライアント拡張です。extensions
-
-
constructCredentialAlg を、グローバルオブジェクト global を受け取り次の手順を実行するアルゴリズムとします:
-
もし
credentialCreationData.attestationConveyancePreferenceOptionの値が次のいずれかである場合:none-
潜在的に識別可能な情報を、非識別的なバージョンに置き換えます:
-
もし aaguid が attested credential data にあり、その値が 16 バイトのゼロで、かつ
credentialCreationData.attestationObjectResult.fmtが "packed" で、かつ"x5c"がcredentialCreationData.attestationObjectResultから欠落している場合、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-
認証器の AAGUID と attestation statement をそのまま Relying Party に伝えます。
-
attestationObject を、新しい
ArrayBufferとして、global の %ArrayBuffer% を用いて作成し、credentialCreationData.attestationObjectResultのバイトを含めます。 -
id を
attestationObject.authData.attestedCredentialData.credentialIdとします。 -
pubKeyCred を、global に関連付けられた新しい
PublicKeyCredentialオブジェクトとし、そのフィールドは次のとおりです:[[identifier]]-
id
authenticatorAttachment-
その authenticator の現在の authenticator attachment modality に一致する
AuthenticatorAttachmentの値。 response-
global に関連付けられた新しい
AuthenticatorAttestationResponseオブジェクトで、そのフィールドは次のとおりです:clientDataJSON-
新しい
ArrayBufferを、global の %ArrayBuffer% を用いて作成し、credentialCreationData.clientDataJSONResultのバイトを含めます。 attestationObject-
attestationObject
[[transports]]-
その authenticator がサポートしていると思われる、重複のない 0 個以上の
DOMStringの列で、辞書順に並べられます。値はAuthenticatorTransportのメンバーであるべきですが、クライアントプラットフォーム は不明な値を無視しなければなりません。もしユーザーエージェントがこの情報を明かしたくない場合、プライバシーを保護するための任意の列を代わりに返すことができます。この列は有効でなければならず(辞書順で重複がないこと)、例えば空の列を用いることができます。いずれにせよ、この場合ユーザーエージェントは Relying Party の挙動が最適でなくなるリスクを負います。
もしユーザーエージェントがトランスポート情報を持っていない場合、このフィールドを空の列に設定するべきです。
Note: ある認証器がサポートするトランスポートをユーザーエージェントがどのように検出するかはこの仕様の範囲外ですが、例えば attestation certificate(例: [FIDO-Transports-Ext])からの情報、CTAP2 のような認証器プロトコルで通信されるメタデータ、あるいはプラットフォーム認証器に関する特別な知識などが含まれ得ます。
[[clientExtensionsResults]]-
新しい
ArrayBufferを、global の %ArrayBuffer% を用いて作成し、credentialCreationData.clientExtensionResultsのバイトを含めます。
-
pubKeyCred を返します。
-
-
各 残りの authenticator に対して authenticatorCancel 操作を呼び出し、remove します。
constructCredentialAlg を返してこのアルゴリズムを終了します。
-
-
"
NotAllowedError" をスローします。
上記の過程の間、ユーザーエージェントは認証器の選択と承認の過程をユーザーに案内するために何らかの UI を表示するべきです。もし
options.
が mediationconditional
に設定されている場合、事前にユーザーが同意していない限り、目立つモーダル UI を表示してはなりません。
5.1.3.1. 作成リクエストに関する例外
この節は規範的ではありません。
WebAuthn の
Relying Parties は、navigator.credentials.create()
の呼び出しから多数の例外に遭遇することがあります。いくつかの例外は発生原因が複数考えられるため、WebAuthn Relying Parties は WebAuthn
の利用状況に基づいて実際の原因を推測する必要があります。
Note: 本仕様外で定義されたものを含め、任意の WebAuthn Extensions の処理中に発生し得る例外はここには列挙されていません。
次の DOMException
の例外が発生する可能性があります:
AbortError-
式典は
AbortControllerによってキャンセルされました。参照: § 5.6 Abort Operations with AbortSignal および § 1.3.4 Aborting Authentication Operations。 ConstraintError-
次のいずれか:
residentKeyがrequiredに設定されており、利用可能な認証器が resident key をサポートしていなかった、あるいはuserVerificationがrequiredに設定されており、利用可能な認証器が user verification を実行できなかった、のいずれかです。 InvalidStateError-
式典で使用された認証器が、ユーザーが登録に同意した後に
excludeCredentials内のエントリを認識したためです。 NotSupportedError-
pubKeyCredParams内のいずれのエントリもtypeプロパティとしてpublic-keyを持っていなかった、または authenticator がpubKeyCredParamsで指定された署名アルゴリズムのいずれもサポートしていなかった、ということです。 SecurityError-
effective domain が 有効なドメイン ではなかった、または
が effective domain と等しくないか、registrable domain のサフィックスではなかった、ということです。後者の場合、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:..., ...})
を呼び出して既存の 公開鍵認証情報 を発見し利用します(ユーザーの同意 を得た上で)。Relying Party スクリプトは任意で、どのような 公開鍵認証情報ソース
が受け入れ可能かを示す基準を指定できます。クライアントプラットフォーム は、指定された基準に一致する 公開鍵認証情報ソース
を見つけ出し、スクリプトが使用を許可されるものをユーザーに選ばせるよう案内します。例えばプライバシー保護のために、公開鍵認証情報ソースが存在してもユーザーがやり取り全体を拒否することがあります。ユーザーが 公開鍵認証情報ソース を選択した場合、ユーザーエージェントは § 6.3.3 authenticatorGetAssertion 操作 を使って Relying Party
提供のチャレンジや収集した他のデータに署名し、認証アサーション を生成します。これが 認証情報 として使用されます。
The navigator.credentials.get()
実装は [CREDENTIAL-MANAGEMENT-1] に従って
PublicKeyCredential.
を呼び出し、ユーザー仲介(概ね本仕様の 承認ジェスチャー)なしで利用可能であるべき 認証情報 を収集します。もしそれらのうち正確に一つが見つからなければ、
[[CollectFromCredentialStore]]()PublicKeyCredential.
を呼び出してユーザーに 公開鍵認証情報ソース を選択させます。
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
本仕様は任意の 承認ジェスチャー を要求してアサーションを作成するため、
PublicKeyCredential
は [[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors)
のデフォルト動作(空集合を返す)を継承します。
PublicKeyCredential
の
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
の実装は次の節で規定されています。
一般に、ユーザーエージェントは操作を完了するためにどの認証器を選択・承認するかをユーザーに案内する UI
を表示するべきです。options.
を mediationconditional
に設定することで、
Relying Parties
は、認証情報が発見されない限り目立つモーダル UI を表示してはならないことを示すことができます。Relying Party はまず isConditionalMediationAvailable()
または getClientCapabilities()
を使って、クライアント が conditionalGet
機能をサポートしているかを確認するべきであり、この機能が利用できない場合にユーザーに見えるエラーを防ぎます。
任意の
navigator.credentials.get()
操作は AbortController
を利用して中止できます;
詳細な手順は DOM § 3.3 Using
AbortController and AbortSignal objects in APIs を参照してください。
5.1.4.1. PublicKeyCredential の
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
内部メソッド
[[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.を、1つのallowCredentialsPublicKeyCredentialDescriptorリストの 項目に設定し、そのidの値を credentialMetadata の id の値に、 またtypeの値を 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 を新しい リスト とする。
-
クライアントプラットフォームごとの手順を実行し、
pkOptions.で記述された 公開鍵資格情報のうち どれがこの authenticator に バインドされているか(あるいは該当するものがあるか)rpId、allowCredentialspkOptions., およびallowCredentials.idpkOptions.でマッチングし、 このフィルタ済みリストを allowCredentialDescriptorList とする。allowCredentials.type -
allowCredentialDescriptorList が 空である場合、
falseを返す。 -
distinctTransports を新しい 順序付きセット とする。
-
allowCredentialDescriptorList に値がひとつだけある場合、
savedCredentialIds[authenticator]にallowCredentialDescriptorList[0].idの値を設定する (詳細は こちらや § 6.3.3 authenticatorGetAssertion の操作 参照)。 -
allowCredentialDescriptorList の各資格情報記述 C について、 存在する場合は
C.の値をそれぞれ distinctTransports に追加する。transportsNote: この操作により、 認証器 に対し、distinctTransports の
transportsの値は重複のない値のみ集約されます(順序付きセットの仕様による)。 -
distinctTransports
- 空でない
-
クライアントは distinctTransports の値から1つの transport 値を選び、 authenticator に対して使用すべき適切な transport に関するローカル設定情報も考慮しつつ 選択を行います。
そして transport を使い、 authenticatorGetAssertion 操作を authenticator に対して実行し、引数として rpId、clientDataHash、 allowCredentialDescriptorList、 userVerification、 authenticatorExtensions を渡す。
- 空である
-
authenticator に対しローカルの設定情報に基づき、 authenticatorGetAssertion 操作を実行し、引数として 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 AbortSignalによる操作の中断と§ 1.3.4 認証操作の中断を参照してください。 SecurityError-
有効なドメインが有効なドメインではなかった、 または
が有効なドメインと等しいか登録可能なドメインサフィックスでなかった。 後者の場合、 クライアントが関連オリジンリクエストをサポートしていないか 関連オリジン検証手順に失敗しました。rp.id NotAllowedError-
ユーザーが式典をキャンセルした場合など、広範囲の理由を包括する一般的なエラーです。 これらの原因の一部は本仕様書内で説明されており、 その他はクライアント固有です。
次の simple exceptions が発生することがあります:
TypeError-
options引数が有効なCredentialRequestOptions値ではなかった場合。
5.1.5. 既存の資格情報を格納する - PublicKeyCredential の
[[Store]](credential, sameOriginWithAncestors) 内部メソッド
[[Store]](credential, sameOriginWithAncestors)
メソッドは Web Authentication の PublicKeyCredential
型ではサポートされていないため、[[Store]](credential, sameOriginWithAncestors)
internal method の実装は常にエラーを投げます。
Note: 本アルゴリズムは同期的です;Promise
の解決/拒否は navigator.credentials.store()
により扱われます。
この internal method は 2 つの引数を受け取ります:
credential-
この引数は
PublicKeyCredentialオブジェクトです。 sameOriginWithAncestors-
この引数は Boolean 値で、呼び出し元の environment settings 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
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 は認証器側の処理が必ず行われると仮定してはなりません。
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 を 関連設定オブジェクト の オリジン の 有効ドメイン とする。もし effectiveDomain が 有効なドメインでない場合、"SecurityError" で拒否された promise
-
rpId が 登録可能なドメインサフィックスに該当するか、または等しい effectiveDomain であれば、undefined で解決された promise を返す。
-
クライアントが 関連オリジンリクエスト をサポートしていない場合、"SecurityError" で拒否された promise を
DOMExceptionとして返す。 -
p を 新しい promiseとする。
-
以下の手順を 並列で実行する:
-
関連オリジン検証手順 を callerOrigin と rpId の引数で実行し、 結果が
trueなら p を解決 する。 -
それ以外の場合は、p を拒否し、"
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 decoding の結果とします
options..userId -
断言: userId はエラーではありません。
-
credential を
credentials map[options.とします。rpId, userId] -
もし credential が存在しない場合、これらの手順を中止します。
-
もし
options.が contain しない、つまり base64url encoding した credential の id の結果を含まない場合、remove credential を credentials map から削除するか、将来の authentication ceremonies から隠すために認証器固有の手順を行ってください。allAcceptedCredentialIds -
それ以外で、もし credential が認証器固有の手順によって隠されていた場合、その操作を元に戻して credential が将来の authentication ceremonies に表示されるようにします。
ユーザーは、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, of type PublicKeyCredentialRpEntity-
このメンバーは、リクエストに対して責任を負うリライイングパーティの名前と識別子を含みます。
その値の
nameメンバーは必須です。詳細は § 5.4.1 Public Key Entity Description (dictionary PublicKeyCredentialEntity) を参照してください。その値の
idメンバーは、資格情報がスコープされるべきRP IDを指定します。省略された場合、その値はCredentialsContainerオブジェクトの関連設定オブジェクトのオリジンの有効ドメインになります。詳細は § 5.4.2 Relying Party Parameters for Credential Generation (dictionary PublicKeyCredentialRpEntity) を参照してください。 user, of type PublicKeyCredentialUserEntity-
このメンバーは、登録を行うユーザーアカウントの名前と識別子を含みます。
その値の
name、displayNameおよびidメンバーは必須です。idは、将来の 認証式でuserHandleとして返される場合があり、 また、同じおよびrp.idを持つ既存の 検出可能な資格情報 を上書きするために使用されます。user.idnameとdisplayNameは、将来の 認証式で 認証器や クライアントによって ユーザーが資格情報を選択する際に利用される場合がありますが、将来の 認証式の結果としてRP には返されません。詳細は § 5.4.1 Public Key Entity Description (dictionary PublicKeyCredentialEntity) および § 5.4.3 User Account Parameters for Credential Generation (dictionary PublicKeyCredentialUserEntity) を参照してください。
challenge, of type BufferSource-
このメンバーは、新しく作成される資格情報のためのアテステーションオブジェクトを生成する際に、authenticatorが他のデータと共に署名するチャレンジを指定します。セキュリティ上の考慮事項は § 13.4.3 Cryptographic Challenges を参照してください。
pubKeyCredParams, of type sequence<PublicKeyCredentialParameters>-
このメンバーは、リライイングパーティがサポートする鍵タイプと署名アルゴリズムを、最も好ましい順から最も好ましくない順に列挙します。重複は許容されますが実質的には無視されます。クライアントおよびauthenticatorは、可能な限り最も好まれるタイプの資格情報を作成するよう最善を尽くします。列挙されたどのタイプも作成できない場合、
create()操作は失敗します。リライイングパーティ が多様なauthenticatorをサポートしたい場合、少なくとも次の
COSEAlgorithmIdentifierの値を含めるべきです:-
-8 (EdDSA)
-
-7 (ES256)
-
-257 (RS256)
必要に応じて追加の署名アルゴリズムを含めることができます。
次に示す、
COSEAlgorithmIdentifierによる完全指定の値は、[RFC9864] によって導入されたもので、pubKeyCredParamsには推奨されません:-
-9 (ESP256); 代わりに -7 (ES256) を使用するか、併用してください。
-
-51 (ESP384); 代わりに -35 (ES384) を使用するか、併用してください。
-
-52 (ESP512); 代わりに -36 (ES512) を使用するか、併用してください。
-
-19 (Ed25519); 代わりに -8 (EdDSA) を使用するか、併用してください。
注: WebAuthn 内では、値 -9 (ESP256)、-51 (ESP384)、-52 (ESP512) および -19 (Ed25519) は、それぞれ -7 (ES256)、-35 (ES384)、-36 (ES512) および -8 (EdDSA) と同じものを表します。これは § 5.8.5 Cryptographic Algorithm Identifier (typedef COSEAlgorithmIdentifier) に記載された追加の制約によるものです。しかし、多くの実装は後者の識別子をサポートするが前者をサポートしない場合があるため、実際には互換性がありません。したがって後者の識別子は互換性のために
pubKeyCredParamsにおいて推奨されます。 -
timeout, of type unsigned long-
この任意のメンバーは、リライイングパーティが呼び出しの完了を待つ意志のある時間(ミリ秒)を指定します。これはヒントとして扱われ、クライアントによって上書きされることがあります。
excludeCredentials, of type sequence<PublicKeyCredentialDescriptor>, defaulting to[]-
リライイングパーティは、この任意のメンバーを使用して、この資格情報をそのユーザーアカウントにマップしている既存の資格情報(
user.idにより識別される)を列挙するべきです。これにより、新しい資格情報が既に同じauthenticator上にそのユーザーアカウントにマップされた資格情報を含んでいる場合に、該当する authenticator 上で作成されないようにします。その場合、クライアントは代わりにユーザーに別のauthenticatorの使用を促すか、それが失敗した場合はエラーを返すよう要求されます。 authenticatorSelection, of type AuthenticatorSelectionCriteria-
リライイングパーティは、この任意のメンバーを使用して、authenticatorが
create()操作に参加するために満たすべき必須または推奨の機能や設定を指定することができます。詳細は § 5.4.4 Authenticator Selection Criteria (dictionary AuthenticatorSelectionCriteria) を参照してください。 hints, of type sequence<DOMString>, defaulting to[]-
この任意のメンバーは、ユーザーエージェントがユーザーとやり取りする際の指針として用いるための、
PublicKeyCredentialHintからのゼロ個以上の要素を含みます。要素は列挙型から取られますが型はDOMStringである点に注意してください。詳細は § 2.1.1 Enumerations as DOMString types を参照してください。 attestation, of type DOMString, defaulting to"none"-
Relying Party は、このオプションメンバーを利用して attestation conveyance に関する希望を指定できる。 値は
AttestationConveyancePreferenceのメンバーであるべきである。 Client platforms は未知の値を無視し、未知の値を そのメンバーが存在しない ものとして扱わなければならない。デフォルト値は
noneです。 attestationFormats, of type sequence<DOMString>, defaulting to[]-
リライイングパーティは、この任意のメンバーを使用して、アテステーションステートメントのフォーマットに関する好みを指定することができます。値は [IANA-WebAuthn-Registries] にある "WebAuthn Attestation Statement Format Identifiers" 登録の項目から取るべきです。値は最も好ましい順から最も好ましくない順に並べられます。重複は許容されますが実質的には無視されます。このパラメータは助言的なものであり、authenticatorはこのパラメータに列挙されていないアテステーションステートメントを使用することがあります。
デフォルト値は空リストで、これは特に好みがないことを示します。
extensions, of type AuthenticationExtensionsClientInputs-
リライイングパーティは、この任意のメンバーを使用して、クライアントおよびauthenticatorによる追加処理を要求するクライアント拡張入力(client extension inputs)を提供することができます。例えば、リライイングパーティはクライアントに対して作成された資格情報に関する追加情報を返すよう要求することができます。
拡張フレームワークは § 9 WebAuthn Extensions に定義されています。いくつかの拡張は § 10 Defined Extensions に定義されています;最新の登録済みのWebAuthn Extensionsの一覧については、[IANA-WebAuthn-Registries] を参照してください。
5.4.1.
公開鍵エンティティの説明(辞書 PublicKeyCredentialEntity)
PublicKeyCredentialEntity
辞書は、ユーザーアカウントまたは WebAuthn
リライングパーティを記述します。これは、公開鍵クレデンシャルが紐付けられている、または スコープされるものです。
dictionary PublicKeyCredentialEntity {required DOMString name ; };
name, of type DOMString-
エンティティの人間に読みやすい名前。このメンバーの機能は、
PublicKeyCredentialEntityが何を表すかによって異なります:-
[非推奨]
PublicKeyCredentialRpEntityから継承される場合、表示用の人間に読みやすい識別子であり、例えば「ACME Corporation」、「Wonderful Widgets, Inc.」や「ОАО Примертех」のような表示を想定しています。多くのクライアントがこれを表示しないため、このメンバーは非推奨になっていますが、後方互換性のために辞書メンバーとしては必須のままです。リライイングパーティは、安全なデフォルトとしてこれをRP IDと同じ値に設定してもよいです。
-
リライイングパーティは、[RFC8266] のセクション2.3に記載された PRECIS FreeformClass の Nickname プロファイルの規定に従って、この
nameの値を設定するか、またはユーザーに表示する際に正規化と適切な扱いを行うべきです。 -
クライアントは、ユーザーに表示する前、または authenticatorMakeCredential 操作のパラメータとして含める前に、同じく [RFC8266] のセクション2.3に従った検証と正規化を実行するべきです。
-
-
PublicKeyCredentialUserEntityから継承される場合、人間に読みやすい識別子であり、ユーザーアカウントを示します。この識別子は、クライアントがユーザーに対して資格情報がどのユーザーアカウントに関連しているかを理解させるために主に表示する値です。この識別子の適切な例には "alexm", "+14255551234", "alex.mueller@example.com", "alex.mueller@example.com (prod-env)", または "alex.mueller@example.com (ОАО Примертех)" などがあります。
-
リライイングパーティは、この値をユーザーに選ばせることができます。リライイングパーティは、[RFC8265] のセクション3.4.3に記載された PRECIS IdentifierClass の UsernameCasePreserved プロファイルに従って、この
nameの値を設定するか、またはユーザーに表示する際に検証と正規化を行うべきです。 -
クライアントは、ユーザーに表示する前、または authenticatorMakeCredential 操作のパラメータとして含める前に、同じく [RFC8265] のセクション3.4.3に従った検証と正規化を実施するべきです。
-
クライアント、クライアントプラットフォーム、または authenticators が
nameの値を表示する場合、表示された値の周りに明確な境界を示す UI 要素を常に使用し、他の要素へオーバーフローしないようにすべきです [css-overflow-3]。nameメンバーの値を保存する際、その値は § 6.4.1 String Truncation に記載されているように、64バイト以上のサイズ制限を用いて切り詰められてもよいです。 -
5.4.2.
クレデンシャル生成時のリライングパーティのパラメーター(辞書 PublicKeyCredentialRpEntity)
PublicKeyCredentialRpEntity
辞書は、新しい資格情報を作成する際に追加の リライイングパーティ 属性を提供するために使用されます。
dictionary PublicKeyCredentialRpEntity :PublicKeyCredentialEntity {DOMString id ; };
id, の型は DOMString-
リライイングパーティ エンティティの一意の識別子で、RP ID を設定します。
5.4.3.
クレデンシャル生成時のユーザーアカウントパラメーター(辞書 PublicKeyCredentialUserEntity)
PublicKeyCredentialUserEntity
辞書は、新しいユーザーアカウントの属性を追加で指定するために使われます。
dictionary PublicKeyCredentialUserEntity :PublicKeyCredentialEntity {required BufferSource id ;required DOMString displayName ; };
id, of type BufferSource-
ユーザーハンドルは、ユーザーアカウントのユーザーハンドルです。ユーザーハンドルは最大64バイトの不透明なバイト列であり、ユーザーに表示することを意図したものではありません。
安全な動作を確保するため、認証および認可の判断はこの
idメンバーに基づいて行われなければならず、displayNameやnameメンバーに基づいて行ってはなりません。詳細は [RFC8266] のセクション6.1を参照してください。ユーザーハンドルは、ユーザー名や電子メールアドレスなどのユーザーを特定可能にする個人情報を含んではなりません。詳細は § 14.6.1 User Handle Contents を参照してください。ユーザーハンドルは空にしてはなりません。
ユーザーハンドルは、非発見可能な資格情報の場合でも、異なるユーザーアカウント間で一定の値にしてはならないことが望ましいです。なぜなら、一部のauthenticatorは常に発見可能な資格情報を作成するためです。したがって一定のユーザーハンドルでは、当該authenticatorを同じリライイングパーティで複数のユーザーアカウントと共に使用することができなくなります。
displayName, of type DOMString-
人間に読みやすい名前で、表示のためだけに使われるユーザーアカウントの名前です。リライイングパーティはユーザーにこの値を選ばせるべきであり、必要以上に選択を制限してはなりません。適切な人間に読みやすい名前が利用できない場合、リライイングパーティはこの値を空文字列に設定するべきです。
この識別子の適切な値の例には "Alex Müller", "Alex Müller (ACME Co.)" または "田中倫" などがあります。
-
リライイングパーティは、[RFC8266] のセクション2.3に記載された PRECIS FreeformClass の Nickname プロファイルに従って、
displayNameに非空の文字列を設定する場合、または非空の値をユーザーに表示する場合には整合性検査を行うべきです。 -
クライアントは、[RFC8266] のセクション2.3に従って、
displayNameの値を、ユーザーに非空の値を表示する前や、authenticatorMakeCredential 操作のパラメータとして非空の値を含める前に検査および正規化するべきです。
クライアント、クライアントプラットフォーム、または authenticator が
displayNameの値を表示する場合、表示された値の周囲に明確な境界を示す UI 要素を常に使用し、他の要素へのオーバーフローを許してはなりません [css-overflow-3]。displayNameメンバーの値を保存する際、その値は § 6.4.1 String Truncation に記載されているように、64バイト以上のサイズ制限以上の値で切り詰められてもよいです。 -
5.4.4.
認証器選択基準(辞書 AuthenticatorSelectionCriteria)
WebAuthn
リライングパーティは、AuthenticatorSelectionCriteria辞書を利用して、認証器の属性に対する要件を指定することができます。
dictionary AuthenticatorSelectionCriteria {DOMString authenticatorAttachment ;DOMString residentKey ;boolean requireResidentKey =false ;DOMString userVerification = "preferred"; };
authenticatorAttachment, of type DOMString-
このメンバーが存在する場合、適格な authenticators は、指定された authenticator attachment modality で接続されているもののみに絞り込まれます(参照 § 6.2.1 Authenticator Attachment Modality)。このメンバーが存在しない場合は、いかなるアタッチメントモダリティも許容されます。 値は
AuthenticatorAttachmentのメンバーであるべきですが、client platforms は不明な値を無視し、不明な値を メンバーが存在しないかのように扱わなければなりません。また、成功した
create()またはget()操作でどの authenticator attachment modality が使われたかを示すことができる、authenticatorAttachmentメンバーを持つPublicKeyCredentialも参照してください。 residentKey, of type DOMString-
リライイングパーティがクライアント側発見可能な資格情報(client-side discoverable credential)をどの程度作成したいかを指定します。歴史的な理由により、名称には非推奨の “resident” 用語が残っています。値は
ResidentKeyRequirementのメンバーであるべきですが、client platforms は不明な値を無視し、不明な値を メンバーが存在しないかのように扱わなければなりません。値が与えられない場合、requiredとなるのはrequireResidentKeyがtrueのときであり、discouragedとなるのはそれがfalseまたは省略されたときです。ResidentKeyRequirementを参照して、residentKeyの値と意味を確認してください。 requireResidentKey, of type boolean, defaulting tofalse-
このメンバーは WebAuthn Level 1 との後方互換のために残されており、歴史的理由から discoverable credentials に対する “resident” という非推奨の命名を保持しています。Relying Parties は、かつその場合に限り、
residentKeyがrequiredに設定されているときにのみ、このメンバーをtrueに設定するべきです。 userVerification, of type DOMString, defaulting to"preferred"-
このメンバーは、Relying Party が
create()操作に対して要求する user verification に関する要件を指定します。 値はUserVerificationRequirementのメンバーであるべきですが、client platforms は不明な値を無視し、不明な値を メンバーが存在しないかのように扱わなければなりません。UserVerificationRequirementを参照して、userVerificationの値と意味を確認してください。
5.4.5. 認証器アタッチメント列挙型(enum AuthenticatorAttachment)
この列挙型の値はauthenticatorsのattachment
modalitiesを説明します。
リライイングパーティは、authenticator attachment
modalityの希望を、資格情報を作成するためにnavigator.credentials.create()
を呼び出す際に表明するためにこれを使用し、クライアントは登録や認証セレモニーを完了するために使用されたauthenticator
attachment modalityを報告するためにこれを使用します。
enum AuthenticatorAttachment {"platform" ,"cross-platform" };
注: AuthenticatorAttachment
列挙は意図的に参照されていません。詳しくは § 2.1.1
Enumerations as DOMString types を参照してください。
platform-
この値はplatform attachmentを示します。
cross-platform-
この値はcross-platform attachmentを示します。
注: authenticator
attachment modality の選択肢は、[[Create]](origin, options, sameOriginWithAncestors)
操作でのみ利用可能です。リライイングパーティは、例えば別のクライアントデバイスで認証するためのroaming credentialをユーザーが持っていることを確認したり、特定のクライアントデバイスで再認証を容易にするために明示的にplatform
credentialを登録したりするためにこれを使用できます。[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
操作にはauthenticator attachment modalityの選択肢はありません。クライアントおよびユーザーは、利用可能で便利な任意のcredentialを使用しますが、allowCredentials
オプションの制約を受けます。
5.4.6.
レジデントキー要件列挙型(enum ResidentKeyRequirement)
enum ResidentKeyRequirement {"discouraged" ,"preferred" ,"required" };
注: The ResidentKeyRequirement
列挙型は意図的に参照されていません。詳しくは § 2.1.1
Enumerations as DOMString types を参照してください。
この列挙型の値は、Relying Party が クライアント側発見可能な資格情報(以前は resident credentials または resident keys と呼ばれていた)に対して求める要件を記述します:
discouraged-
Relying Party は サーバー側資格情報 の作成を好みますが、クライアント側発見可能な資格情報 を受け入れます。クライアントおよび authenticator は可能であれば サーバー側資格情報 を作成するべきです。
注: Relying Party は、作成された資格情報が サーバー側資格情報 であることを要求することはできず、Credential Properties Extension が
rkプロパティの値を返さない場合があります。このため、資格情報がサーバー側資格情報かどうかを判別できないことがあり、同じ user handle を持つ 2 つ目の資格情報を作成すると最初のものが置換されるかどうかが分からない場合があります。 preferred-
Relying Party はクライアント側発見可能な資格情報の作成を強く好みますが、サーバー側資格情報 も受け入れます。クライアントおよび authenticator は可能であれば 発見可能な資格情報 を作成するべきです。 例えば、クライアント は、発見可能な資格情報を作成するために ユーザー検証 の設定が必要な場合、ユーザーがその設定を行えるよう案内するべきです。これは
userVerificationの設定より優先されます。 required-
Relying Party は クライアント側発見可能な資格情報 を要求します。クライアント は、クライアント側発見可能な資格情報を作成できない場合、エラーを返さなければなりません。
注: Relying Party は、Credential Properties Extension の resident key credential
property を使用して、authenticator が クライアント側発見可能な資格情報
を作成したかどうかの情報を取得することができます。これは、discouraged
や preferred
の値が
options.
に対して使用されている場合に有用です。なぜなら、そのような場合には authenticator が いずれか を作成する可能性があるからです—クライアント側発見可能な資格情報 または サーバー側資格情報。
authenticatorSelection.residentKey
5.4.7.
アテステーション伝達優先度列挙型(enum AttestationConveyancePreference)
WebAuthn
リライイングパーティは、資格情報生成時のアテステーション伝達に関する好みを指定するために、AttestationConveyancePreferenceを使用することがあります。
enum AttestationConveyancePreference {"none" ,"indirect" ,"direct" ,"enterprise" };
Note: AttestationConveyancePreference
列挙型はあえて参照されていません。詳しくは § 2.1.1 Enumerations as DOMString
types を参照してください。
none-
Relying Party は authenticator の attestation に関心がありません。例えば、user consent を取得して識別情報を Relying Party に送信する必要を回避したり、Attestation CA や Anonymization CA への往復通信を省略するためです。 authenticator が attestation statement を生成し、それが self attestation でない場合、 client はそれを None の attestation statement に置き換えます。
これはデフォルトの動作であり、不明な値はこの値の振る舞いにフォールバックします。
indirect-
Relying Party は検証可能な アテステーションステートメント を受け取りたいと望みますが、その取得方法は client に委ねます。クライアントは、ユーザーのプライバシーを保護するため、または異種のエコシステムで Relying Parties のアテステーション検証を助けるために、authenticator が生成した アテステーションステートメント を Anonymization CA によって生成されたものに置き換えることがあります。
Note: この場合に Relying Party が必ずしも検証可能な アテステーションステートメント を取得できる保証はありません。たとえば、authenticator が self attestation を行い、client がその アテステーションステートメント を無修正で渡す場合などです。
direct-
Relying Party は、authenticator によって生成されたとおりの アテステーションステートメント を受け取りたいと望みます。
enterprise-
Relying Party は、企業向けアテステーション(enterprise attestation)を受け取りたいと考えています。これは認証器を一意に識別できる情報を含む場合がある アテステーションステートメント です。これは、組織が登録を特定の認証器に紐付けたい場合など、企業内での管理された配備を意図しています。ユーザーエージェントは、 要求されたRP ID に対してユーザーエージェントまたは認証器の設定が許可しない限り、そのようなアテステーションを提供してはなりません。
許可されている場合、ユーザーエージェントは 呼び出し時 に認証器へエンタープライズアテステーションが要求されていることを通知すべきであり、得られた AAGUID と アテステーションステートメント を改変せずに Relying Party に渡すべきです。
5.5.
Assertion生成オプション(辞書 PublicKeyCredentialRequestOptions)
PublicKeyCredentialRequestOptions
辞書はget()
がアサーションを生成するのに必要なデータを提供します。
challenge
メンバーは必須で、他のメンバーは省略可能です。
dictionary PublicKeyCredentialRequestOptions {required BufferSource challenge ;unsigned long timeout ;DOMString rpId ;sequence <PublicKeyCredentialDescriptor >allowCredentials = [];DOMString userVerification = "preferred";sequence <DOMString >hints = [];AuthenticationExtensionsClientInputs extensions ; };
challenge, of type BufferSource-
このメンバーは、authenticator が、新しく生成する authentication assertion の作成時に、他のデータとともに署名するチャレンジを指定します。セキュリティ上の考慮事項については § 13.4.3 Cryptographic Challenges を参照してください。
timeout, of type unsigned long-
この任意のメンバーは、Relying Party が呼び出しの完了を待つ意志のある時間(ミリ秒)を指定します。値はヒントとして扱われ、client によって上書きされることがあります。
rpId, of type DOMString-
このオプションのメンバーは、RP IDを要求元Relying Partyが主張するものとして指定します。 クライアントは、Relying PartyのオリジンがこのRP IDのスコープと一致することを確認しなければなりません。 認証器は、 このRP IDが rpIdと完全に一致することを、 認証式で使用される資格情報について確認しなければなりません。
指定されない場合、その値は
CredentialsContainerオブジェクトの 関連設定オブジェクト の origin の effective domain になります。 allowCredentials, of type sequence<PublicKeyCredentialDescriptor>, defaulting to[]-
この任意のメンバーは、client がこの authenticators の中から、この authentication ceremony に適格なものを見つけるために使用します。これは次の二つの方法で使用できます:
-
認証対象の user account が既に特定されている場合(例:ユーザーがユーザー名を入力している場合)、Relying Party はこのメンバーを使って credential descriptors for credential records をその user account 内に列挙すべきです。通常これは user account 内のすべての credential records を含むべきです。
その items は可能な場合は
transportsを指定するべきです。これは client が特定状況におけるユーザー体験を最適化するのに役立ちます。また、Relying Party は user verification を要求する際にリストをフィルタリングする必要はありません — client は自動的に適格でない資格情報を無視します(userVerificationがrequiredに設定されている場合)。プライバシーに関する考慮事項については § 14.6.3 Privacy leak via credential IDs を参照してください。
-
認証対象の user account がまだ特定されていない場合、Relying Party はこのメンバーを空にするか未指定のままにすることがあります。この場合、認証セレモニーでは discoverable credentials のみが利用され、結果として得られる
userHandleによって user account が特定されることがあります。利用可能な authenticators が同じ Relying Party にスコープされた複数の discoverable credential を含んでいる場合、クライアントプラットフォームまたは authenticator がユーザーに選択させるよう表示します(step 7、§ 6.3.3 The authenticatorGetAssertion Operation を参照)。
空でない場合(not empty)、リスト内のどの資格情報も使用できない場合は、クライアントはエラーを返さなければなりません。
リストは優先度の降順で並べられます:リストの最初の項目が最も優先され、最後の項目が最も優先度が低い資格情報です。
-
userVerification, of type DOMString, defaulting to"preferred"-
このオプションのメンバーは、Relying Party による ユーザー認証 に関する要求を
get()操作に指定します。値はUserVerificationRequirementのメンバーであるべきですが、クライアントプラットフォーム は未知の値を無視し、未知の値を そのメンバーが存在しない かのように扱わなければなりません。条件を満たす認証器のみが対象としてフィルタされます。UserVerificationRequirementを参照して、userVerificationの値と意味を確認してください。 hints, of type sequence<DOMString>, defaulting to[]-
この任意のメンバーは、ユーザーエージェントがユーザーと対話する際の指針として用いるための、
PublicKeyCredentialHintからのゼロ個以上の要素を含みます。要素はその列挙型から取られますが、型はDOMStringである点に注意してください。詳しくは § 2.1.1 Enumerations as DOMString types を参照してください。 extensions, of type AuthenticationExtensionsClientInputs-
Relying Party はこの任意のメンバーを使用して、client extension inputs を提供し、client および authenticator に追加処理を要求することができます。
拡張フレームワークは § 9 WebAuthn Extensions に定義されています。いくつかの拡張は § 10 Defined Extensions に定義されています;最新の登録済みの WebAuthn Extensions の一覧については、[IANA-WebAuthn-Registries] を参照してください。
5.6. AbortSignalによる操作の中断
開発者はAbortController
を活用して、[[Create]](origin, options, sameOriginWithAncestors)
および[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
操作の管理を推奨します。
詳細はDOM § 3.3
AbortControllerとAbortSignalオブジェクトのAPI利用の記述を参照してください。
注: DOM § 3.3
AbortControllerとAbortSignalオブジェクトのAPI利用では、AbortControllerと統合しているWebプラットフォームAPIは、
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)
も同様です。
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, of type DOMString-
このメンバーは、呼び出し元が参照しているpublic key credential の型を含みます。 値は
PublicKeyCredentialTypeのメンバーであるべきですが、クライアントプラットフォームは不明なPublicKeyCredentialDescriptorを含むものを無視しなければなりません。 しかし、もし不明なtypeのためにすべての要素が無視される場合、それは空のallowCredentialsが意味的に異なるため、エラーを生じさせなければなりません。これは、識別された public key credential source を表す credential record の type 項の値に設定されるべきです。 これは
typeフィールドのPublicKeyCredentialと対応します。 id, of type BufferSource-
このメンバーは、呼び出し元が参照しているpublic key credential の credential ID を含みます。
これは、識別された public key credential source を表す credential record の id 項の値に設定されるべきです。 これは
rawIdフィールドのPublicKeyCredentialと対応します。 transports, of type sequence<DOMString>-
この任意のメンバーは、呼び出し元が参照している public key credential の管理 authenticator とクライアントがどのように通信するかについてのヒントを含みます。 値は
AuthenticatorTransportのメンバーであるべきですが、クライアントプラットフォームは不明な値を無視しなければなりません。これは、識別された public key credential source を表す credential record の transports 項の値に設定されるべきです。 これは、
メソッドと対応しており、response.getTransports()PublicKeyCredential構造がcreate()操作によって作成されたときに得られるものです。
5.8.4. 認証器トランスポートの列挙(enum AuthenticatorTransport)
enum AuthenticatorTransport {"usb" ,"nfc" ,"ble" ,"smart-card" ,"hybrid" ,"internal" };
注: The AuthenticatorTransport
enumeration is deliberately not referenced, see § 2.1.1
Enumerations as DOMString types.
getTransports()
を介して public key
credential のサポートされている transports を学習します。
usb-
それぞれの authenticator が着脱可能な USB 経由で接続できることを示します。
nfc-
それぞれの authenticator が Near Field Communication (NFC) を介して接続できることを示します。
ble-
それぞれの authenticator が Bluetooth Smart(Bluetooth Low Energy / BLE)を介して接続できることを示します。
smart-card-
それぞれの authenticator が接点付きの ISO/IEC 7816 スマートカード経由で接続できることを示します。
hybrid-
それぞれの authenticator が、(多くの場合別々の)データ伝送手段と近接手段の組み合わせを用いて接続できることを示します。例えば、スマートフォンを使用してデスクトップコンピュータ上で認証を行う場合などをサポートします。
internal-
それぞれの authenticator が client device 固有のトランスポートを使用して接続されることを示します。つまり、これは platform authenticator です。これらの認証器は client device から取り外すことはできません。
5.8.5. Cryptographic Algorithm Identifier (typedef COSEAlgorithmIdentifier)
typedef long ;COSEAlgorithmIdentifier
COSEAlgorithmIdentifier
の値は、暗号アルゴリズムを識別する数値です。
アルゴリズム識別子は、例えば "ES256" に対する -7 や "RS256" に対する -257 のように、IANA COSE Algorithms
レジストリに登録された値であることが推奨されます([IANA-COSE-ALGS-REG])。
COSE アルゴリズムレジストリは、COSE key におけるその他のパラメータで指定される自由度を残しています。相互運用性を促進するために、本仕様は credential public keys に対して次の追加的な保証を行います:
-
アルゴリズムが
-7(ES256) の鍵は、crv パラメータとして必ず 1 (P-256) を指定し、圧縮された点形式を使用してはなりません。 -
アルゴリズムが
-9(ESP256) の鍵は、圧縮された点形式を使用してはなりません。 -
アルゴリズムが
-35(ES384) の鍵は、crv パラメータとして必ず 2 (P-384) を指定し、圧縮された点形式を使用してはなりません。 -
アルゴリズムが
-51(ESP384) の鍵は、圧縮された点形式を使用してはなりません。 -
アルゴリズムが
-36(ES512) の鍵は、crv パラメータとして必ず 3 (P-521) を指定し、圧縮された点形式を使用してはなりません。 -
アルゴリズムが
-52(ESP512) の鍵は、圧縮された点形式を使用してはなりません。 -
アルゴリズムが
-8(EdDSA) の鍵は、crv パラメータとして必ず 6 (Ed25519) を指定しなければなりません。(これらは COSE では常に圧縮形式を使用します。)
これらの制約は、Section 2.1 の推奨と整合します([RFC9053])。
注: これらのアルゴリズムを正しく実装して署名検証を行うためには多くのチェックが必要です。そのうちの一つは、非圧縮の楕円曲線点を処理する際に、その点が実際に曲線上にあるかどうかを実装が検査するべき、という点です。このチェックは、暗号ライブラリとその他のコードの間で見落とされやすいと判断されるため、特に強調されています。
5.8.6.
ユーザー検証要件の列挙(enum UserVerificationRequirement)
enum UserVerificationRequirement {"required" ,"preferred" ,"discouraged" };
WebAuthnリライングパーティは、操作によってはユーザー検証を要求することも、そうでないこともあり、この型によってその要求を表現できます。
注: UserVerificationRequirement
の列挙は意図的に参照されていません。§ 2.1.1 DOMString型としての列挙を参照してください。
required-
Relying Partyは、この操作にユーザー検証を要求し、応答にUV フラグが設定されていない場合、全体のセレモニーが失敗します。クライアントはユーザー検証が実施できない場合、必ずエラーを返さなければなりません。
preferred-
Relying Partyは、可能であればこの操作にユーザー検証を希望しますが、応答にUV フラグが設定されていなくても操作は失敗しません。
discouraged-
Relying Partyは、この操作中にユーザー検証を実施してほしくありません(例:ユーザーの操作フローをなるべく妨げないため)。
5.8.7.
クライアント機能の列挙(enum ClientCapability)
enum ClientCapability {"conditionalCreate" ,"conditionalGet" ,"hybridTransport" ,"passkeyPlatformAuthenticator" ,"userVerifyingPlatformAuthenticator" ,"relatedOrigins" ,"signalAllAcceptedCredentials" ,"signalCurrentUserDetails" ,"signalUnknownCredential" };
この列挙は、WebAuthnリライングパーティが特定のワークフローやユーザー体験を提供する際に参照できる、限定的なクライアント機能のセットを定義します。
リライングパーティはgetClientCapabilities()
メソッド(PublicKeyCredential
)を用いて利用可能な機能の記述を取得できます。
注: ClientCapability
の列挙は意図的に参照されていません。§ 2.1.1 DOMString型としての列挙を参照してください。
conditionalCreate-
WebAuthnクライアントは、
conditionalメディエーションを登録式において行うことができます。 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-
Relying Partyが、物理的なセキュリティキーでこのリクエストを満たすことをユーザーが想定していることを示します。たとえば、企業のRelying Partyが、自社発行のセキュリティキーだけを認証器として登録や認証に受け入れる場合、このヒントを設定することがあります。
古いユーザーエージェントとの互換性のために、このヒントを
PublicKeyCredentialCreationOptionsで使用する場合は、authenticatorAttachmentをcross-platformに設定する必要があります。 client-device-
Relying Partyが、プラットフォーム認証器がクライアントデバイスに接続されていて、このリクエストを満たすことをユーザーが想定していることを示します。
古いユーザーエージェントとの互換性のために、このヒントを
PublicKeyCredentialCreationOptionsで使用する場合は、authenticatorAttachmentをplatformに設定する必要があります。 hybrid-
Relying Party が、ユーザーがスマートフォンなどの汎用的な authenticator でこのリクエストを満たすと考えていることを示します。例えば、一般消費者向けの Relying Party は、専用のセキュリティキーを所有している顧客が少数と考える場合があります。このオプションは、ローカルの platform authenticator がUIで推奨されないことも意味します。
古いユーザーエージェントとの互換性のために、このヒントを
PublicKeyCredentialCreationOptionsで使用する場合は、authenticatorAttachmentをcross-platformに設定する必要があります。
5.9. Permissions Policy統合
この仕様書は、以下の feature-identifier トークン
"publickey-credentials-create"
および
"publickey-credentials-get"
で識別される2つのポリシー制御機能を定義します。両者のデフォルト許可リストはどちらも
'self' です。[Permissions-Policy]
Documentの
パーミッションポリシーは、そのドキュメント内のいかなるコンテンツが
正常に呼び出すことが許可されているかどうかを決定します。Web Authentication API、すなわち
navigator.credentials.create({publicKey:..., ...})
または
navigator.credentials.get({publicKey:..., ...})
を通じての利用が該当します。
いずれかのドキュメントで無効化されている場合、そのドキュメント内のどのコンテンツも上記のメソッドを利用することは許可されません。
この操作を試みるとエラーが返されます。
注: [CREDENTIAL-MANAGEMENT-1]で指定されたアルゴリズムが、実際の permissions policy
評価を行います。これは、そのようなポリシー評価は current settings object へのアクセスがあるときに行う必要があるためです。[[Create]](origin, options, sameOriginWithAncestors)
および [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
の internal methods
は、そのようなアクセス権を持ちません。なぜならこれらは in parallel に CredentialsContainer
の Create a Credential および Request a Credential
抽象操作によって呼び出されるためです [CREDENTIAL-MANAGEMENT-1].
5.10. iframe要素内でのWeb Authenticationの利用
Web
Authentication APIはデフォルトでクロスオリジンの
iframeでは無効化されています。
このデフォルトポリシーを上書きし、クロスオリジンの
iframeでWeb
Authentication APIの
[[Create]](origin, options, sameOriginWithAncestors)
や [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
メソッドの呼出しを許可するには、
allow
属性を
iframe
要素に指定して、
publickey-credentials-create
または
publickey-credentials-get
のfeature-identifierトークンを
allow
属性値にそれぞれ含めてください。
Relying Partyが埋め込みコンテキストでWebAuthn APIを利用する場合は、§ 13.4.2 埋め込み利用における可視性の考慮事項で記載されているUIレドレッシングとその対策について確認してください。
5.11. 関連するオリジン間でのWeb Authentication利用
デフォルトでは、Web認証はRP IDがオリジンの 有効ドメインと同じ、もしくは登録可能なドメインのサフィックスである必要があります。
このため、複数の国別ドメイン(例: example.comとexample.co.ukやexample.sg)、ブランドドメインや代替ドメイン(例: myexampletravel.comとexamplecruises.com)、PaaSによるモバイルアプリのサポート時など大規模環境でのデプロイメントが困難になる場合があります。
WebAuthn Relying Partyは、WebAuthn Clientに対して、関連した限定されたオリジンで証明書を作成・利用することを許す機能を有効化する選択ができます。 このようなRelying Partyは、関連するオリジンすべてで共通のRP IDを選択して用いなければなりません。
JSONドキュメントは、webauthnのウェルノウンURL[RFC8615]上にRP ID単位でホストされ、HTTPSで配信されなければなりません。JSONドキュメントは、
以下の要件を満たして返される必要があります:
-
コンテンツタイプは
application/jsonである必要があります。 -
トップレベルのJSONオブジェクトは
originsというキーを持ち、その値は1つ以上のウェブオリジン文字列の配列である必要があります。
例えば、RP IDがexample.comの場合:
{ "origins" : [ "https://example.co.uk" , "https://example.de" , "https://example.sg" , "https://example.net" , "https://exampledelivery.com" , "https://exampledelivery.co.uk" , "https://exampledelivery.de" , "https://exampledelivery.sg" , "https://myexamplerewards.com" , "https://examplecars.com" ] }
この機能をサポートするWebAuthn Clientは、少なくとも5つの登録可能オリジンラベルをサポートしなければなりません。クライアントのポリシーでは悪用防止のため上限値を定義すべきです。
WebAuthn
Clientからこのウェルノウンエンドポイントへのリクエストは、クレデンシャルなし、リファラーなし、
https:スキームを使って行わなければなりません。リダイレクトを追従する場合は、WebAuthn
Clientはすべてのリダイレクトが同様にhttps: スキームであることを明示的に要求しなければなりません。
この機能をサポートするWebAuthn
Clientは、relatedOrigins
をgetClientCapabilities()のレスポンスに含めるべきです。
5.11.1. 関連オリジンの検証
関連オリジン検証手続きは、引数callerOriginとrpIdRequestedを受けて、次の通りです:
-
クライアントポリシーで許可される登録可能オリジンラベルの最大数をmaxLabelsとする。
-
RP IDrpIdRequestedの
webauthnウェルノウンURL[RFC8615](例:https://rpIdRequested/.well-known/webauthn)を、クレデンシャルなし、リファラーなし、https:スキームで取得する。-
フェッチに失敗した場合、レスポンスのコンテンツタイプが
application/jsonでない場合、またはリダイレクト後のステータスコードが200でない場合は、"SecurityError"DOMExceptionをthrowする。 -
リソース本文が有効なJSONオブジェクトでない場合、"
SecurityError"DOMExceptionをthrowする。 -
JSONオブジェクトのoriginsプロパティの値が欠落している、または文字列の配列でない場合、"
SecurityError"DOMExceptionをthrowする。
-
-
labelsSeenを新しい空のセットとする。
-
各originsのoriginItemについて:
-
domainの登録可能オリジンラベルをlabelとする。
-
labelが空またはnullの場合は続行。
-
labelsSeenのサイズがmaxLabels以上かつlabelsSeenがlabelを含まない場合、続行。
-
callerOriginとurlがsame originの場合、
trueを返す。 -
labelsSeenのサイズがmaxLabels未満の場合、labelsSeenにlabelを追加する。
-
falseを返す。
6. WebAuthn 認証器モデル
Web認証APIは、WebAuthn認証器のための特定の抽象的な機能モデルを想定しています。このセクションではその認証器モデルについて説明します。
クライアントプラットフォームは、この抽象モデルを任意の方法で実装・公開してもかまいません。しかし、クライアントのWeb認証API実装の挙動は、そのクライアントプラットフォームがサポートする認証器に対して動作する際、§ 5 Web認証APIで指定された動作と区別できないものでなければなりません。
注: [FIDO-CTAP]はこのモデルの具体的実装例のひとつですが、これは返却されるデータとWebAuthn APIのアルゴリズムで期待されるものに違いがあります。CTAP2のレスポンスメッセージは、同じオブジェクト用に本仕様で定義された文字列キーではなく整数キーを使って構築されたCBORマップです。クライアントは、そのようなデータに必要な変換処理を行うことが期待されます。[FIDO-CTAP]仕様では、セクション§6. Authenticator APIでCTAP2の整数キーとWebAuthnの文字列キーの対応関係が記載されています。
認証器については、このモデルは認証器がサポートすべき論理操作と、クライアントおよびWebAuthn Relying Partyに公開するデータ形式を定義します。ただし、認証器がクライアントデバイスとどう通信するかの詳細は、Relying Partyとの相互運用性に必要な場合を除き定義しません。たとえば、この抽象モデルはUSBやNFCなどのトランスポート経由で認証器とクライアントを接続するためのプロトコルは定義しません。同様に、この抽象モデルは特定のエラーコードやその返却方法を定義しませんが、クライアントの要求に基づいてエラー動作の定義は行います。そのため、特定のエラーコードがどのエラー状態を区別する必要があるか(あるいは区別しなくてもよいか)を示す手段として言及され、準拠した安全なクライアント実装に必要な区別ができる設計となっています。
Relying Parties は、必要と判断した場合、資格情報の作成や アサーションの生成の際に、さまざまな認証器の特性を規定することで、認証器の選択に影響を与えることができます。これらはそれぞれ 資格情報作成オプション または アサーション生成オプション を用いることで実現します。 WebAuthn API を構成するアルゴリズムはこれらのオプションを取りまとめ、下記で定義される適用可能な 認証器操作 に渡します。
この抽象モデルにおいて、認証器は鍵管理と暗号署名を提供します。認証器はWebAuthnクライアントに組み込むことも、完全に別デバイスとして存在させることもできます。認証器自体は、認証器本体より高いセキュリティレベルで動作する暗号モジュールを内蔵する場合があります。これはWebAuthnクライアント内蔵型認証器の場合とくに重要で、その場合暗号モジュール(たとえばTPM)は認証器本体より信頼性が高い存在とみなされる可能性もあります。
各認証器は、(rpId, userHandle)から公開鍵クレデンシャルソースへのマップであるcredentials mapを記憶します。
さらに、各認証器は認証器アテステーショングローバル一意識別子、またはAAGUIDという128ビットの識別子を持ちます。これは認証器の種別(メーカー・モデル等)を示します。AAGUIDはメーカーによって決定され、そのメーカーが製造する本質的に同一の認証器であれば全て同じAAGUIDを持ち、他の認証器種別とは高い確率で異なる値となるようにしなければなりません。認証器種別ごとにユニークさを確保するため、AAGUIDは無作為に生成すべきです。Relying Partyは、AAGUIDを使って、他の情報源から得た認証器の認証レベルや鍵保護強度などの特性を推定してもかまいません。また、Relying Partyはアテステーションの要求・検証なしで認証器製造元の特定を試みるためにAAGUIDを利用してもかまいませんが、AAGUID自体はアテステーションがなければ真正性は保証されません。
認証器の主な機能は、さまざまな文脈データにバインドされたWebAuthn署名の提供です。これらのデータは、署名要求がサーバーから認証器に渡る過程のさまざまなレイヤーで観測・追加されます。サーバーが署名を検証する際は、これらのバインディングと期待値とを照合します。文脈バインディングは次の2つに分けられます。Relying Partyまたはクライアントによって追加されるclient data、および認証器によって追加されるauthenticator dataです。認証器はclient dataの内容には関知せず、そのハッシュ値のみ署名します。通信帯域や認証器の処理負荷を削減するため、クライアントはclient dataをハッシュ化し、その結果のみ認証器に送ります。認証器はシリアライズ済みclient dataのハッシュと自身のauthenticator dataの組み合わせに対して署名を行います。
この設計の目標は次の通りまとめられます。
-
署名生成のスキームは、クライアントデバイスと認証器の間の帯域・レイテンシが極低い場合にも対応できるようにすべきです。例としてはBluetooth Low EnergyやNFCなどが挙げられます。
-
認証器が処理するデータは小さく、低水準コードで解釈しやすいものでなければなりません。特に、認証器がJSONのような高水準エンコーディングをパースする必要はありません。
-
クライアントと認証器の双方が、必要に応じて文脈バインディングを柔軟に追加できる設計である必要があります。
-
設計上できるだけ既存のエンコーディング形式を再利用して、導入・実装を容易にすることを目指しています。
認証器は2つの異なる目的のために暗号署名を生成します:
-
新しい公開鍵クレデンシャルがauthenticatorMakeCredential操作によって作成される際に、attestation signature(アテステーション署名)が生成されます。アテステーション署名は、認証器およびクレデンシャルに関する特定の属性の暗号的証明を提供します。例えば、アテステーション署名はAAGUIDで示される認証器種別やクレデンシャル公開鍵等を証明します。アテステーション署名は、希望するアテステーション種別に応じて選ばれたアテステーション秘密鍵で署名されます。アテステーションの詳細は§ 6.5 アテステーションを参照してください。
-
authenticatorGetAssertionメソッドが呼び出された際には、assertion signature(アサーション署名)が生成されます。これは、認証器がユーザーによる特定の取引(ログインや購入完了など)への同意を主張するためのものです。したがって、アサーション署名は、その認証器が特定のクレデンシャル秘密鍵で署名を行い、この取引を要求したユーザーが、そのクレデンシャルを作成した際に同意した同一人物であることを可能な限り確認したことを主張します。さらに、client dataと呼ばれる追加情報(ユーザー同意の取得方法や認証器がユーザーに表示したプロンプトなど)も主張します。アサーション署名の形式は下記の図4に示します。
WebAuthn署名とは、アテステーション署名とアサーション署名の両方を指します。これらの署名の形式と生成プロシージャは以下で規定されます。
6.1. 認証器データ
authenticator data構造体は認証器によって行われた文脈バインディングを符号化します。これらのバインディングは認証器自身が制御し、認証器のセキュリティ特性についてWebAuthn Relying Partyの判断によって信頼が決定されます。一方では認証器がクライアントに組み込まれており、バインディングの信頼性がclient dataと同程度である場合もあります。他方では、高度なセキュリティハードウェアとソフトウェアを備えた独立した認証器が安全なチャネル経由でクライアントに接続されている場合もあります。いずれの場合もRelying Partyはauthenticator dataを同じ形式で受け取り、認証器の知識に基づいて信頼判断を行います。
authenticator dataはコンパクトかつ拡張性のある符号化方式を持ちます。認証器が機能や消費電力に限りがあり、クライアントプラットフォームよりずっと簡素なソフトウェアスタックである場合があるため、これは重要です。
authenticator data構造体は37バイト以上のバイト配列であり、表の通りにレイアウトされています。
| Name | Length (in bytes) | Description |
|---|---|---|
| rpIdHash | 32 | RP IDのSHA-256ハッシュ。credentialがスコープされるRP ID。 |
| flags | 1 |
フラグ(ビット0が最下位ビット):
|
| signCount | 4 | 署名カウンタ。32ビット符号なしビッグエンディアン整数。 |
| attestedCredentialData | variable (if present) | attested credential data(もし存在する場合)。詳細は§ 6.5.1 Attested Credential Data。その長さはcredential ID及びcredential public keyの長さによる。 |
| extensions | variable (if present) | 拡張で定義されるauthenticator data。これはCBOR [RFC8949]マップであり、extension identifierをキーとし、authenticator extension outputを値とする。詳細は§ 9 WebAuthn Extensions。 |
RP IDは、資格情報が作成される際にclientから最初に受信され、さらにassertionが生成されるときにも再度受信されます。ただし、いくつか重要な点で他のclient dataとは異なります。まず、他のclient dataと異なり、資格情報のRP IDは操作間で変わることはなく、その資格情報の存続期間を通じて同一のまま保持されます。第二に、要求されたcredentialがスコープされているRP IDが、clientによって提供されたRP IDと正確に一致することを、authenticatorGetAssertion操作中に認証器が検証することで確認されます。
認証器はauthenticator data構造体生成のために以下の手順を行います:
-
UP flagは認証器がユーザー存在検査を実施した場合のみ設定される。UV flagは認証器がユーザー検証を実施した場合のみ設定される。
RFUビットはゼロにすること。Note: 認証器がユーザー存在検査及びユーザー検証の両方(単一の認可ジェスチャで同時実施など)を行った場合、UP flag及びUV flagの両方を設定する。
-
BE flagはクレデンシャルがマルチデバイスクレデンシャルの場合のみ設定すること。値は登録セレモニー後は変更不可(§ 6.1.3 Credential Backup State参照)。
-
BS flagはクレデンシャルがマルチデバイスクレデンシャルかつ現在バックアップ済みの場合のみ設定する。
クレデンシャルのバックアップ状態が不明または認証器がバックアップ済みクレデンシャルに異常を疑う場合、BS flagは設定しないこと。
-
アテステーション署名の場合、認証器は AT フラグをセットし、
attestedCredentialDataを含める必要がある。 アサーション署名の場合、 AT フラグはセットしてはならず、attestedCredentialDataを含めてはならない。
図はauthenticator data構造体の図式表現を示します。
可変長なattested credential dataの長さの決定には、
先行するcredentialIdの長さをもとにcredentialPublicKeyの開始位置を決定、その後credentialPublicKeyの長さを決定する必要がある(RFC9052のSection 7も参照)。
6.1.1. 署名カウンターに関する考慮事項
認証器は署名カウンター機能を実装することが推奨されます。このカウンターは概念上、認証器が資格情報ごと、もしくは認証器全体で一括して管理します。資格情報の初期署名カウンター値は、signCountとして、認証器データに含まれ、authenticatorMakeCredentialによって返却されます。署名カウンターは、authenticatorGetAssertionごとに正の値でインクリメントされ、以降の値もWebAuthn
リライングパーティへ認証器データに含めて返却されます。署名カウンターは、リライングパーティが認証器のクローン検出を助けるためのものです。特に、保護機構が限定的な認証器においてクローン検出は重要となります。
署名カウンタを実装しない認証器は、
signCount
をauthenticator
data内で常にゼロにします。
Relying Party は、直近の authenticatorGetAssertion 操作の 署名カウンター を保存します。(または、まだ authenticatorGetAssertion が行われていない資格情報の場合は authenticatorMakeCredential 操作のカウンターを保存します。)以降の authenticatorGetAssertion 操作で、Relying Party は保存された 署名カウンターの値と、アサーションで返される authenticator data
の
signCount
の新しい値を比較します。いずれかが 0 でなく、新しい
signCount
の値が保存された値以下の場合、クローンされた認証器が存在する可能性や認証器の故障、
あるいは Relying Party が認証器で生成された順番と異なる順番でアサーションを受取り・処理するレースコンディションが存在する可能性があります。
署名カウンタ不一致の検知によって、現操作がクローン認証器なのか元認証器なのかは判別できません。Relying Partyは各々の状況下で適切に対応すべきです(=リスク許容度や実運用上の要件で値が増加しない場合の許容理由があるかもしれません)。
認証器:
-
各クレデンシャルごとの署名カウンタを実装すべきです。これにより署名カウンタ値がRelying Party間で共有されず、ユーザー相関ハンドルとして利用されるのを防ぎます。認証器はグローバルな署名カウンタ(認証器毎)を実装してもよいですが、これはユーザーにとってプライバシーに優しくありません。
-
署名カウンタ値が偶発的に減少しないようにすべきです(例:ハードウェア障害等)。
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
| 認証情報はマルチデバイス認証情報で、現在バックアップ済みです。 |
Relying Partiesは、これらのflagsの最新値をユーザーアカウントとともに保存し、今後の評価に用いることが推奨されます。
以下はRelying Partiesがこれらのflagsをどのように使用できるかの一例です(網羅的ではありません):
-
追加の認証器の要求:
BE フラグが
0に設定されている場合、資格情報は単一デバイス資格情報であり、生成認証器は資格情報のバックアップを一切許可しない。シングルデバイスクレデンシャルは単一デバイス損失に対して耐性がありません。Relying Partiesは各ユーザーアカウントについて、 追加の認証器の登録や、 アカウント復元プロセスを用意すべきです。 例えば、ユーザーに追加の認証器(ローミング認証器や マルチデバイスクレデンシャル対応認証器など)のセットアップを促すことができます。
-
パスワード不要アカウントへのアップグレード:
BS flagが
0から1へ変化した場合、 認証器は、そのクレデンシャルがバックアップされ、単一デバイス損失に対する保護があることを通知しています。Relying Partyは、ユーザーにアカウントセキュリティのアップグレードとパスワード削除を促す選択ができます。
-
状態変化後の追加要素の導入:
BS flagが
1から0へ変化した場合は、認証器が、 クレデンシャルがもはやバックアップされておらず、単一デバイス損失への保護もないことを通知しています。これはユーザー操作(バックアップサービスを無効化等)や エラー(バックアップサービスの問題等)が原因となり得ます。この遷移が発生した場合、Relying Partyは他の認証要素の検証手順をユーザーに案内すべきです。 もしユーザーがそのアカウントに他のクレデンシャルを持たない場合は、追加のクレデンシャル登録を案内して、アカウントアクセス喪失を防ぐべきです。 例えばユーザーに追加の認証器 (ローミング認証器やマルチデバイスクレデンシャル対応認証器など)のセットアップを促すことができます。
6.2. 認証器の分類
多くのユースケースは、使用される認証器の機能に依存します。 このセクションでは、それらの機能、それらの重要な組み合わせ、そしてそれらの組み合わせによって可能になるユースケースの用語を定義します。
例えば:
-
特定のクライアントデバイスで初めて認証を行う際には、ローミング認証器が一般的に必要です。 ユーザーはまだそのプラットフォーム認証情報をそのクライアントデバイス上に持っていないためです。
-
同じクライアントデバイスで以降の再認証を行う場合、プラットフォーム認証器がもっとも便利です。 それはクライアントデバイスに直接組み込まれているため、ユーザーが別のデバイスを探す必要がありません。
-
パスワードレスの多要素認証には、ユーザー検証可能な認証器、 場合によっては探索可能認証情報対応が必要です。
-
ノートパソコンはUSBやBluetooth経由でローミング認証器への接続をサポートできますが、モバイルフォンはNFCのみをサポートする場合もあります。
上記の例は、主要な認証器タイプの特性を示しています:
-
認証器がローミング型かプラットフォーム型か、 または場合によっては両方であるか(認証器接続方式)。 ローミング認証器は、トランスポートを複数サポートすることがあります。
-
認証器が探索可能認証情報対応かどうか — 認証情報保存方式。
これらの特性は独立しており、理論上は自由に組み合わせることができますが、表は特に関心が高い認証器タイプをいくつか提示しています。
| 認証器タイプ | 認証器接続方式 | 認証情報保存方式 | 認証要素の機能 |
|---|---|---|---|
| 二要素プラットフォーム認証器 | プラットフォーム | いずれか | 単一要素対応 |
| ユーザー検証付きプラットフォーム認証器 | プラットフォーム | いずれか | 多要素対応 |
| 二要素ローミング認証器 | クロスプラットフォーム | サーバー側保存 | 単一要素対応 |
| パスキー・ローミング認証器 | クロスプラットフォーム | クライアント側保存 | 多要素対応 |
| パスキー・プラットフォーム認証器 | プラットフォーム (transport
= internal)
または クロスプラットフォーム (transport
= hybrid)
| クライアント側保存 | 多要素対応 |
同じクライアントデバイスで再認証する際にセカンドファクタ プラットフォーム認証器は便利であり、新しいセッションの開始時、または既存のセッションの再開時にもセキュリティを一層高めるために利用できます。 セカンドファクタ ローミング認証器は、特定のクライアントデバイスで初めて認証を行う場合や、複数のユーザーが共有するクライアントデバイスで利用されることが多いです。
パスキープラットフォーム認証器およびパスキーローミング認証器 は、パスワード不要の多要素認証を実現します。 クレデンシャル秘密鍵の所有証明に加え、 これらの認証器はPINや生体認証などを二番目の認証要素としてユーザー検証をサポートします。 認証器は、2種類の認証要素として機能でき、多要素認証を実現しつつ、Relying Partyへのパスワード共有を不要にします。 これらの認証器はまた、ディスカバラブルクレデンシャル(別名パスキー)にも対応しており、ユーザー名入力が不要な認証フローも実現できます。
ユーザー検証型プラットフォーム認証器クラスは、ほぼ全てパスキープラットフォーム認証器クラスに置き換えられていますが、定義自体はisUserVerifyingPlatformAuthenticatorAvailable
メソッドで依然利用されています。
表で名前が付いていない組み合わせは、用途があまり明確でありません:
-
ローミング認証器でディスカバラブルクレデンシャル対応だが多要素対応ではないものは、 単要素認証(ユーザー名不要)に利用できます。この場合、ユーザーハンドルで自動識別され、 クレデンシャル秘密鍵の所有のみが認証要素となります。 一部状況で有用ですが、認証器盗難リスクが高まります。
-
ローミング認証器で多要素対応だがディスカバラブルクレデンシャル対応ではないものは、 多要素認証に利用できるものの、 ユーザーの事前識別が必要となり、個人情報漏洩リスクがあります(§ 14.6.3 Credential IDによるプライバシー漏洩を参照)。
以下のサブセクションでは、認証器接続方式、 クレデンシャル保存方式 および認証要素対応性の各観点について、一層詳しく定義します。
6.2.1. 認証器接続方式
クライアントは、認証器と さまざまな方法で通信できます。例えば、クライアントはクライアントデバイス固有のAPIを用いて 認証器(クライアントデバイスに物理的に結合されたもの) と通信できます。一方、クライアントは Bluetoothなど標準化されたクロスプラットフォームのトランスポートプロトコル(§ 5.8.4 Authenticator Transport Enumeration (enum AuthenticatorTransport)参照)を使って クロスプラットフォーム接続の認証器を発見し、通信することもできます。 認証器がクライアントデバイスの一部である場合、 それをプラットフォーム認証器と呼び、 クロスプラットフォームトランスポートで到達可能なものをローミング認証器と呼びます。
-
プラットフォーム認証器はクライアントデバイス固有のトランスポート(プラットフォーム接続)で接続され、通常はクライアントデバイスから取り外せません。 公開鍵認証情報が バインドされていれば、それはプラットフォーム認証情報と呼ばれます。
-
ローミング認証器はクロスプラットフォームトランスポート(クロスプラットフォーム接続)で接続されます。このクラスの認証器は クライアントデバイスから取り外し可能で、 「ローミング」できます。公開鍵認証情報がバインドされていれば、それは ローミング認証情報と呼ばれます。
一部のプラットフォーム認証器は、状況によってローミング認証器としても動作可能です。例えば、モバイルデバイスに統合されたプラットフォーム認証器がBluetooth経由でローミング認証器として利用可能となる場合があります。 この場合、モバイルデバイス上で動作しているクライアントは当該認証器をプラットフォーム認証器として認識し、 他のクライアントデバイス上で動作し、同じ認証器とBluetoothで通信するクライアントは それをローミング認証器として認識します。
プライマリなユースケースは、プラットフォーム認証器が特定のクライアントデバイスを「信頼されたデバイス」として登録することで、クライアントデバイス自体が将来の認証のための所持しているもの 認証要素として機能することです。 これによりユーザーは将来の認証式でローミング認証器を必要としないという利便性を得られます。例えば、ユーザーは鍵のトークンや携帯電話をポケットの中で探し回る必要がなくなります。
ローミング認証器のユースケースは以下の通り:新しいクライアントデバイスで初めて認証を実行する場合、 使用頻度の低いクライアントデバイス、 複数ユーザーが共有するクライアントデバイス、 プラットフォーム認証器を搭載しないクライアントデバイスなどです。 また、ポリシーや利用者の好みによって、認証器を利用するクライアントデバイスと分離して保持したい場合にも用いられます。 さらに、ローミング認証器は 他の認証器が紛失した際、 バックアップ用クレデンシャルを保存する手段としても利用できます。
6.2.2. 認証情報保存方式
-
認証器、クライアントまたはクライアントデバイス内に埋め込まれた永続的ストレージ(例:セキュアイレメントなど)に保存する。 これはクライアントサイドディスカバラブル公開鍵クレデンシャルソースの技術的要件である。
-
公開鍵クレデンシャルソース(public key credential source)を、この認証器のみが復号(アンラップ)できるよう暗号化(ラップ)し、その結果得られた暗号文を公開鍵クレデンシャルソースのクレデンシャルIDとする。クレデンシャルIDはリライングパーティによって保存され、
allowCredentialsオプション経由でget()によって認証器に返される。これにより、認証器は公開鍵クレデンシャルソースを復号して利用できる。この方法により、認証器は無制限なクレデンシャル保存容量を持てる。なぜなら暗号化済み公開鍵クレデンシャルソースは認証器ではなくRelying Party側に保存されるからである。 しかし、この方法で保存されたクレデンシャルは、認証器が利用する前にRelying Partyから取得しなければならない。
これらのどの保存戦略に対応しているかで、認証器のクレデンシャル保存方式が定義される:
-
認証器がクライアントサイドディスカバラブル公開鍵クレデンシャルソースに対応している場合、クライアントサイド保存方式を持つという。 クライアントサイド保存方式対応認証器はディスカバラブルクレデンシャル対応とも呼ばれる。
-
認証器がサーバーサイド保存方式を持つ場合は、クライアントサイド保存方式を持たず、公開鍵クレデンシャルソースを暗号文としてクレデンシャルIDにのみ保存できる。
ディスカバラブルクレデンシャル対応の認証器は両方の保存戦略に対応できる場合があることに注意。
この場合、認証器はクレデンシャルごとに異なる保存戦略を任意に使うことができるが、
residentKey
とrequireResidentKey
オプションの指定に従う必要がある。
create()
の指定に従う。
6.2.3. 認証要素の機能
認証セレモニー中に身元を証明するために使用できる認証要素は大きく3つのクラスに分類されます:something you have(所有しているもの)、something you know(知っているもの)、および something you are(あなた自身であるもの)です。 例としては、それぞれ物理的な鍵、パスワード、指紋などが挙げられます。
すべてのWebAuthn認証器はsomething you have(所有しているもの)クラスに属しますが、認証器がユーザー検証をサポートする場合、追加で一つまたは二つの種類の認証要素としても機能できます。例えば、認証器がPINを検証できるなら、そのPINはsomething you know(知っているもの)に該当し、生体認証対応認証器はsomething you are(あなた自身であるもの)を検証できます。 したがって、ユーザー検証をサポートする認証器は多要素対応(multi-factor capable)です。逆に、認証器が多要素非対応(single-factor capable)である場合もあります。なお、単一の多要素対応認証器は複数の方式のユーザー検証をサポートする可能性があり、結果として3種類すべての認証要素として振る舞うことができます。
ユーザー検証は認証器上でローカルに実行され、Relying Partyによって直接実行されるものではありませんが、認証器は署名された応答でUV フラグを設定することでユーザー検証が行われたかを示します。このため、Relying Partyは登録や認証セレモニーで追加の認証要素が使用されたかを検証するために、UVフラグを利用できます。さらに、そのUVフラグの真正性は認証器のアテステーションステートメントを検査することで評価できます。
6.3. 認証器操作(Authenticator Operations)
WebAuthnクライアントは、認証器のいずれかの操作を呼び出すために認証器へ接続しなければなりません。この接続は認証器セッション(authenticator session)を定義します。認証器はセッション間での分離を維持する必要があります。これは、ある時点で一つのセッションのみを許可することで実現する場合もあれば、より複雑なセッション管理を提供する場合もあります。
以下の操作はクライアントが認証器セッションで呼び出すことができます。
6.3.1. クレデンシャルIDによるクレデンシャルソースの検索アルゴリズム
クレデンシャルID credentialId を 認証器内で検索した結果は、次のアルゴリズムの結果です:
-
もし authenticator が credentialId を復号して public key credential source credSource にできる場合:
-
credSource.id を credentialId に設定する。
-
credSource を返す。
-
-
各 public key credential source credSource について、authenticator の credentials map を反復処理する:
-
もし credSource.id が credentialId と等しいなら、credSource を返す。
-
-
nullを返す。
6.3.2. authenticatorMakeCredential 操作
この操作を呼び出す前に、クライアントは authenticatorCancel 操作を呼び出して、 認証器セッション内で進行中の他のすべての操作を中断しなければならない。
この操作は次の入力パラメータを受け取ります:
- hash
-
クライアントが提供する シリアライズされた client data のハッシュ。
- rpEntity
- userEntity
-
ユーザーアカウントの
PublicKeyCredentialUserEntity、および user handle(Relying Party によって与えられる)を含む。 - requireResidentKey
-
クレデンシャル作成に対する有効な resident key 要求、クライアントによって決定される真偽値。
- requireUserPresence
-
定数の真偽値
true、または FALSE(options.がmediationconditionalに設定され、ユーザーエージェントが事前にユーザーの同意を収集している場合)。 - requireUserVerification
-
クレデンシャル作成に対する有効なユーザー検証要求、クライアントによって決定される真偽値。
- credTypesAndPubKeyAlgs
-
credTypesAndPubKeyAlgs は、
PublicKeyCredentialTypeと公開鍵アルゴリズム(COSEAlgorithmIdentifier)の組を順序付けた列です。これは Relying Party が要求するもので、最も好ましいものから順に並んでいます。認証器は可能な限り最も好ましいクレデンシャルを作成するよう最善を尽くします。 - excludeCredentialDescriptorList
-
オプションで、
PublicKeyCredentialDescriptorオブジェクトのリストが Relying Party によって提供される場合があります。これらが認証器内で既知である場合、認証器は新しいクレデンシャルを作成すべきではない(SHOULD NOT)という意図があります。excludeCredentialDescriptorList は既知のクレデンシャルのリストを含みます。 - enterpriseAttestationPossible
-
認証器が個別識別可能なアテステーションを返す可能性があることを示す真偽値。
- attestationFormats
-
Relying Party の望むアテステーションステートメント形式を、最も望ましいものから順に並べた文字列列。もし認証器がアテステーションを返す場合、利用可能な最も望ましい形式を使うよう最善を尽くします。
- extensions
-
CBOR の マップ で、拡張識別子 から対応する 認証器拡張入力 へのマップです。これは クライアント が Relying Party によって要求された(存在する場合)拡張機能に基づいて作成します。
この操作が呼び出されたとき、認証器は次の手順を実行しなければなりません:
-
供給されたすべてのパラメータが構文的に正しく、正しい長さであるかを確認します。そうでない場合は、"
UnknownError" 相当のエラーコードを返し、操作を終了します。 -
PublicKeyCredentialTypeと credTypesAndPubKeyAlgs に含まれる暗号パラメータの組のうち、少なくとも一つがサポートされているか確認します。もしサポートされていない場合は、"NotSupportedError" 相当のエラーコードを返し、操作を終了します。 -
各 descriptor について excludeCredentialDescriptorList を反復処理します:
-
もしこの認証器で 検索した結果
descriptor.が非 null を返し、返された要素の RP ID と type がidrpEntity.とidexcludeCredentialDescriptorList.にそれぞれ一致する場合、authorization gesture を収集して新しいクレデンシャルの作成に対するユーザー同意を確認します。authorization gesture は ユーザー存在検査を含まなければなりません。type- ユーザーが新しいクレデンシャル作成に同意した場合
-
"
InvalidStateError" 相当のエラーコードを返し、操作を終了します。 - 同意しない場合
-
「
NotAllowedError」に相当するエラーコードを返し、操作を終了する。
Note: この authorization gesture の目的は新しいクレデンシャルの作成を進めることではなく、プライバシー上の理由から
descriptor.がこの 認証器 にバインドされていることを開示することへの許可を与えることにあります。ユーザーが同意した場合、クライアントと Relying Party はこれを検出してユーザーに別の認証器を使うよう案内できます。ユーザーが同意しない場合、認証器はiddescriptor.がこの認証器にバインドされていることを明かさず、あたかもユーザーが単にクレデンシャル作成を拒否したかのように応答します。id
-
-
もし requireResidentKey が
trueで、その認証器が client-side discoverable public key credential source を格納できない場合は、"ConstraintError" 相当のエラーコードを返し、操作を終了します。 -
もし requireUserVerification が
trueで、その認証器が ユーザー検証を実行できない場合は、"ConstraintError" 相当のエラーコードを返し、操作を終了します。 -
新しいクレデンシャルを作成するためのauthorization gestureを収集し、ユーザー同意を確認します。authorization gesture
用のプロンプトは、認証器が独自の出力機能を持つ場合は認証器によって、そうでない場合はユーザーエージェントによって表示されるべきです。プロンプトは可能であれば
rpEntity.、idrpEntity.、nameuserEntity.およびnameuserEntity.を表示すべきです。displayNameもし requireUserVerification が
trueなら、authorization gesture は ユーザー検証 を含まなければなりません。もし requireUserPresence が
trueなら、authorization gesture は ユーザー存在検査 を含まなければなりません。もしユーザーが同意しない、あるいはユーザー検証が失敗した場合、"
NotAllowedError" 相当のエラーコードを返し、操作を終了します。 -
一旦 authorization gesture が完了し、ユーザー同意が得られたら、新しいクレデンシャルオブジェクトを生成します:
-
(publicKey, privateKey)を、credTypesAndPubKeyAlgs の最初のサポート可能な項目で表される
PublicKeyCredentialTypeと暗号パラメータの組合せを用いて生成する。 -
userHandle を
userEntity.に設定する。id -
credentialSource を次のフィールドを持つ新しい public key credential source とする:
- type
- privateKey
-
privateKey
- rpId
-
rpEntity.id - userHandle
-
userHandle
- otherUI
-
認証器が任意で含めるその他の情報。
-
もし requireResidentKey が
trueであるか、認証器が client-side discoverable public key credential source を作成することを選択した場合:-
新しい credential id を credentialId とする。
-
credentialSource.id を credentialId に設定する。
-
credentials をこの認証器の credentials map とする。
-
Set を用いて credentials[(
rpEntity., userHandle)] に credentialSource を格納する。id
-
-
それ以外の場合:
-
credentialId を、credentialSource をこの認証器だけが復号できるようにシリアライズおよび暗号化した結果とする。
-
-
-
もし新しいクレデンシャルオブジェクトの作成中に何らかのエラーが発生した場合、"
UnknownError" 相当のエラーコードを返し、操作を終了します。 -
processedExtensions を、認証器拡張処理 の結果として得られる値とする(extensions 中の各サポートされる拡張識別子 → 入力に対して実行した結果)。
-
もし該当の認証器が次のうちのどれかであれば:
- U2F デバイスである場合
-
新しいクレデンシャルのための署名カウンタ値はゼロとする(U2F デバイスは署名カウンタをサポートしている場合があるが、クレデンシャル作成時にカウンタを返さない)。
- グローバルな署名カウンタをサポートする場合
-
authenticator data を生成する際にグローバル署名カウンタの実際の値を使用する。
- クレデンシャルごとの署名カウンタをサポートする場合
-
カウンタを割り当てて新しいクレデンシャルに関連付け、初期値をゼロに初期化する。
- 署名カウンタをサポートしない場合
-
新しいクレデンシャルの署名カウンタ値は常にゼロとなる。
-
attestedCredentialData を credentialId と publicKey を含む attested credential data バイト配列とする。
-
attestationFormat を、attestationFormats の中でサポートされる最初のアテステーションステートメント形式識別子とする(enterpriseAttestationPossible を考慮)。もし attestationFormats にサポートされる値が含まれない場合は、認証器が最も好むアテステーションステートメント形式識別子を選ぶ。
-
authenticatorData を、§ 6.1 Authenticator Data で規定されるバイト配列とし、必要に応じて attestedCredentialData を
attestedCredentialDataとして含め、processedExtensions をextensionsとして含める。 -
新しいクレデンシャルのための attestation object を、§ 6.5.4 Generating an Attestation Object に示された手順、選択した attestationFormat、および値 authenticatorData と hash を用いて生成する(enterpriseAttestationPossible の値を考慮)。アテステーションの詳細は § 6.5 Attestation を参照してください。
この操作が正常に完了した場合、認証器は attestation object をクライアントに返します。
6.3.3. authenticatorGetAssertion 操作
この操作を呼び出す前に、クライアントは現在の認証器セッション内で進行中のすべての操作を中止するために、authenticatorCancel 操作を呼び出さなければなりません。
この操作は次の入力パラメータを受け取ります:
- rpId
- hash
-
クライアントが提供する シリアライズされた client data のハッシュ。
- allowCredentialDescriptorList
-
オプションで、Relying Party が受け入れるクレデンシャルを記述する
PublicKeyCredentialDescriptorのリスト(クライアントによってフィルタリングされる場合あり)。 - requireUserPresence
-
定数ブール値
true。 WebAuthnがユーザープレゼンスのテストをオプションにしない一方で、実装で ユーザープレゼンステストをオプションにしたい場合、 この抽象的な認証器モデル適用を簡素化するための疑似パラメータとしてここに含めている。 - requireUserVerification
-
クライアントが提供する、アサーションに対する有効なユーザー検証要求(真偽値)。
- extensions
-
クライアントが Relying Party の要求に基づいて作成する、拡張識別子からそれらの authenticator extension inputs への CBOR のマップ。
このメソッドが呼び出されたとき、認証器は次の手順を実行しなければなりません:
-
供給されたすべてのパラメータが構文的に正しく、正しい長さであるかを確認します。そうでない場合は、"
UnknownError" 相当のエラーコードを返し、操作を終了します。 -
credentialOptions を、新しい空のセットとして初期化します(public key credential sources の集合)。
-
もし allowCredentialDescriptorList が供給されていたら、各 descriptor について:
-
そうでない場合(allowCredentialDescriptorList が供給されなかった場合)、各 key → credSource をこの認証器の credentials map から取り出し、append により credentialOptions に追加する。
-
Remove を用いて、credentialOptions のうち rpId が rpId と等しくない項目を削除する。
-
もし現在 credentialOptions が空であれば、"
NotAllowedError" 相当のエラーコードを返し、操作を終了する。 -
ユーザーに credentialOptions から使用する public key credential source(selectedCredential) を選択するよう促します。選択後、authorization gesture を収集して ユーザー同意 を確認します。authorization gesture のプロンプトは、認証器が独自の出力機能を持つ場合は認証器が、そうでなければユーザーエージェントが表示してよい。
もし requireUserVerification が
trueであれば、authorization gesture は ユーザー検証 を含まなければなりません。もし requireUserPresence が
trueであれば、authorization gesture は ユーザー存在検査 を含まなければなりません。もしユーザーが 同意しない場合、"
NotAllowedError" 相当のエラーコードを返し、操作を終了します。 -
processedExtensions を、認証器拡張処理 の結果として得られる値とする(extensions 中のサポートされる拡張識別子 → 入力について反復処理して得た結果)。
-
関連するクレデンシャルの 署名カウンタ または認証器のグローバルな 署名カウンタ を(認証器が実装している方式に応じて)正の値だけインクリメントします。もし認証器が署名カウンタを実装していなければ、署名カウンタ値はゼロのままとします。
-
authenticatorData を § 6.1 Authenticator Data に規定されたバイト配列とし、必要に応じて processedExtensions を
extensionsとして含め、attestedCredentialDataは含めない。 -
signature を、アサーション署名 として、
authenticatorData || hashの連結に対して、selectedCredential の privateKey を用いて生成したものとします(図は 図 を参照)。authenticator data が自身の長さを表すため、単純な区切りのない連結で問題ありません。シリアライズされた client data のハッシュ(可変長の可能性がある)は常に最後に置かれます。アサーション署名の生成。 -
もしアサーション署名の生成中に何らかのエラーが発生した場合、"
UnknownError" 相当のエラーコードを返し、操作を終了します。 -
ユーザーエージェントに返す値:
-
selectedCredential.id(もしクライアントが長さ2以上のクレデンシャルリストを供給した場合、またはそのようなリストが供給されなかった場合)。
Note: もし allowCredentialDescriptorList の中でクライアントがちょうど1つだけのクレデンシャルを供給し、それが正常に利用された場合、そのクレデンシャルの credential ID は返されません(クライアントは既に知っているため)。これは制約のある接続上でこれらのバイトの送信を節約するために有用です。
-
authenticatorData
-
signature
-
selectedCredential.userHandle
Note: もし allowCredentialDescriptorList が供給されていた場合、返される userHandle 値は
nullであり得ます(詳細は userHandleResult を参照)。
-
もし 認証器 が、指定された基準に一致する当該 Relying Party に対応する クレデンシャル を見つけられない場合、その操作は終了しエラーを返します。
6.3.4. authenticatorCancel 操作
この操作は入力パラメータを取らず、結果も返しません。
この操作がクライアントによって認証器セッション内で呼び出されると、そのセッション内で現在進行中の authenticatorMakeCredential または authenticatorGetAssertion 操作を終了させる効果があります。認証器はキャンセルされた操作に関連するユーザー入力のプロンプトや受け付けを停止します。クライアントはキャンセルされた操作に対する認証器からのさらなる応答を無視します。
この操作は、現在進行中の authenticatorMakeCredential または authenticatorGetAssertion 操作を有しない 認証器セッション 内で呼び出された場合は無視されます。
6.3.5. silentCredentialDiscovery 操作
これはオプションの操作で、認証器が conditional
なユーザーメディエーションを有効にするために認証器がサポートしてもよい操作です。
この操作は次の入力パラメータを取ります:
この操作が呼び出されたとき、認証器は次の手順を実行しなければなりません:
-
collectedDiscoverableCredentialMetadata を、新しい リスト として初期化します。このリストの各項目は DiscoverableCredentialMetadata 構造体で、次の項目を持ちます:
- type
- id
- rpId
- userHandle
- otherUI
-
認証器が UI を表示する際に使用するその他の情報。
-
各 public key credential source credSource を、この認証器の credentials map から反復処理します:
-
もし credSource が client-side discoverable credential でない場合は continue。
-
discoveredCredentialMetadata を新しい DiscoverableCredentialMetadata 構造体 とし、その アイテム は credSource の type, id, rpId, userHandle および otherUI のコピーである。
-
Append により 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 から観測可能な切り詰め挙動は以下の要件を満たさなければなりません:
指定された最小サポート長以上のサイズ制限を選択してください。 文字列は UTF-8 文字エンコーディングにおけるバイト長がその制限を満たすよう切り詰めされてもかまいません。 この切り詰めは UTF-8 のコードポイント境界を尊重しなければならず、グラフェム・クラスター 境界を尊重することが推奨されます [UAX29]。 結果として得られる切り詰め後の値は選択したサイズ制限より短くなってもよいですが、そのサイズ制限を満たし、かつグラフェム・クラスター境界で終わる最長の接頭辞より短くあってはなりません。
クライアントは、これらの要件を満たすのであれば 認証器 に切り詰めを任せてもよいです。そうでない場合、クライアントは認証器に渡す前に文字列を切り詰めなければなりません。
上記に加えて、バイト境界でのみ切り詰めるとユーザーエージェントが認識しておくべき既知の問題が生じます:認証器が [FIDO-CTAP] を使用している場合、その後の認証器からのメッセージに CBOR の不正が生じる可能性があります(値が CBOR 文字列型として型付けされており、有効な UTF-8 であることが要求されるため)。したがって、認証器 を扱う際、ユーザーエージェントは以下を行うべきです:
-
認証器に送る任意の文字列が有効にエンコードされていることを保証する。
-
切り詰めによりエンコーディングが無効になった場合の処理を行う。例えば、末尾の不完全なコードポイントは削除するか U+FFFD で置換するなど。
6.4.1.2. 認証器による文字列の切り詰め
WebAuthn 認証器は制約の多い環境で実装されることがあるため、認証器に対する要件は クライアント に対する要件より緩和されています。
WebAuthn 認証器 が文字列を切り詰める場合、切り詰めの挙動は次の要件を満たさなければなりません:
指定された最小サポート長以上のサイズ制限を選択してください。 文字列は UTF-8 文字エンコーディングにおけるバイト長がその制限を満たすよう切り詰めされてもかまいません。 この切り詰めは UTF-8 のコードポイント境界を尊重することが望ましく、グラフェム・クラスター 境界を尊重してもよいです [UAX29]。 結果として得られる切り詰め後の値は選択したサイズ制限より短くなってもよいですが、そのサイズ制限を満たし、かつグラフェム・クラスター境界で終わる最長の接頭辞より短くあってはなりません。
6.4.2. 言語および方向のエンコード
文字列が文脈に応じて正しく表示されるためには、その言語と基底方向が必要となる場合があります。この API の文字列は固定機能の 認証器 に書き込まれ、後で別のプラットフォームで読み出して表示される可能性があります。
専用の言語や方向のメタデータフィールドをサポートしない既存の固定機能 認証器 と互換性を保つために、Web Authentication Level 2 ではそのようなメタデータを文字列自身に埋め込んで原子的に輸送する規定を含めました。 しかしこのエンコーディングは推奨されません;クライアント および 認証器 は新しい値に含まれるそのようなエンコーディングを無視してもよいです。 クライアント および 認証器 は、既存の文字列にエンコードされている言語・方向のメタデータを Web Authentication Level 2 §6.4.2 に記載のとおり検出・処理してもよいです。
代わりに、将来のバージョンの Web Authentication API は専用の言語および方向のメタデータフィールドを提供する可能性があります。
6.5. アテステーション
認証器は可能であれば何らかの形の アテステーション を提供することが推奨されます。 認証器がアテステーションを行う場合、基本要件は各 credential public key に対して、WebAuthn Relying Party によって検証可能な attestation statement を生成できることです。典型的にはこの attestation statement は、アテステーション秘密鍵によるアテステートされた credential public key とチャレンジ上の署名、およびアテステーション公開鍵の出所情報を提供する証明書等を含み、Relying Party が信頼判断を行えるようにします。しかし、もし attestation key pair が利用できない場合は、認証器は対応する credential private key を用いて self attestation を行うか、あるいは アテステーションを行わない こともできます。これらの情報は新しい public key credential が生成されるたびに、認証器 によって返され、全体として attestation object の形で提供されます。attestation object と authenticator data(attested credential data を含む)および attestation statement の関係は 図 に示されています。
認証器が self attestation または アテステーションなし を行う場合、Relying Party が信頼判断の根拠とできる出所情報は提供されません。 そのような場合、認証器 は自身の動作について Relying Party に対して保証を与えません。
packed の attestation statement
format のみを示しています。いくつかの追加の attestation statement formats が § 8 Defined Attestation Statement Formats で定義されています。
attestation object の重要な構成要素のひとつは attestation statement です。これは特定の型の署名付きデータオブジェクトであり、public key credential 自体およびそれを作成した authenticator に関する陳述を含みます。通常これは(self attestation の場合を除き)アテスティング権限者の鍵によって生成された attestation signature を含みます。attestation statement を正しく解釈するために、Relying Party はアテステーションに関する次の2点を理解する必要があります:
-
attestation statement format は、署名がどのように表現され、どのように文脈バインディングが 認証器 によってアテステーションステートメントに組み込まれるかを定義します。言い換えれば、これは陳述の構文を定義します。さまざまな既存コンポーネントや OS プラットフォーム(TPM や Android OS など)は以前から attestation statement formats を定義してきました。本仕様はそうした形式を拡張可能な方法でサポートします(詳細は § 6.5.2 Attestation Statement Formats)。形式自体は文字列で識別されます(詳細は § 8.1 Attestation Statement Format Identifiers を参照)。
-
attestation type は、attestation statements とそれらの基礎となる信頼モデルの意味論を定義します。具体的には、Relying Party がある attestation statement を暗号学的に検証した後、どのようにしてその attestation statement を信頼するかを定義するものです。本仕様は複数の attestation types をサポートします(詳細は § 6.5.3 Attestation Types を参照)。
一般に、attestation statement formats と attestation types の間に単純な一対一対応関係はありません。例えば "packed" 形式はすべての attestation types と組み合わせて使うことができますが、他の形式や型は適用範囲がより限定されます。
アテステーション のプライバシー、セキュリティ、運用上の特性は以下に依存します:
-
信頼モデルを決定する attestation type、
-
アテステーションで表現できる内容を制限することでアテステーションの強度を制約する可能性のある attestation statement format、および
-
その 個々の認証器 の特性(構造、セキュアな実行環境で動作しているかどうか等)。
attestation type と
attestation statement format は 認証器 によって選択されます;Relying Parties は attestation
および attestationFormats
パラメータを設定して好みを示すことしかできません。
ほとんどの 認証器 は少数の attestation types と attestation statement formats をサポートすることが予想され、Relying Parties はポリシーに基づいて受け入れ可能な attestation types を決定します。Relying Parties は信頼する 認証器 の特性を理解する必要があります。例えば、FIDO Metadata Service [FIDOMetadataService] はそのような情報へアクセスする一つの手段を提供します。
6.5.1. アテステートされたクレデンシャルデータ
Attested credential data は、クレデンシャルのための attestation object を生成する際に authenticator data に追加される可変長のバイト配列です。そのフォーマットは 表 に示されています。
| Name | Length (in bytes) | Description |
|---|---|---|
| aaguid | 16 | 認証器の AAGUID。 |
| credentialIdLength | 2 | credentialId のバイト長 L。16ビット符号なしビッグエンディアン整数。値は ≤ 1023 でなければならない。 |
| credentialId | L | Credential ID |
| credentialPublicKey | 可変 |
COSE_Key 形式でエンコードされた credential public key。形式は Section 7 of [RFC9052]
に従い、CTAP2 canonical CBOR encoding form
を使用します。
COSE_Key でエンコードされた credential public key は "alg"
パラメータを含まなければならず、他の任意パラメータを含んではなりません。"alg" は COSEAlgorithmIdentifier
の値でなければなりません。
エンコードされた credential public key
は、該当する鍵タイプ仕様で規定された追加の必須パラメータ("kty" と "alg" に対する必須パラメータ)も含まなければなりません(詳細は Section 2 of [RFC9053]
を参照)。
|
6.5.1.1. COSE_Key 形式でエンコードされた
credentialPublicKey 値の例
この節では、ES256、PS256、および RS256 署名アルゴリズム用の COSE_Key エンコード済みの楕円曲線および RSA 公開鍵の例を示します。これらの例は上記で定義された credentialPublicKey 値のルールに従い、明確さのために CDDL 表記で示されています([RFC8610])。
Section 7 of [RFC9052] はすべての COSE_Key エンコード鍵の一般的枠組みを定義します。 特定の鍵タイプは RFC9053 やその他の仕様で定義されます。
以下は、EC2 形式の COSE_Key エンコード済み楕円曲線公開鍵の例(P-256 曲線、ES256 用)です:
{ 1 : 2 , ; kty: EC2 key type 3 : -7 , ; alg: ES256 signature algorithm -1 : 1 , ; crv: P-256 curve -2 : x , ; x-coordinate as byte string 32 bytes in length ; e.g., in hex: 65eda5a12577c2bae829437fe338701a10aaa375e1bb5b5de108de439c08551d -3 : y ; y-coordinate as byte string 32 bytes in length ; e.g., in hex: 1e52ed75701163f7f9e40ddf9f341b3dc9ba860af7e0ca7ca7e9eecd0084d19c }
上の楕円曲線公開鍵を CTAP2 の正準 CBOR エンコーディング形式で表現した例を示します(可読性のため空白と改行を含む):
A5 01 02 03 26 20 01 21 58 20 65eda5a12577c2bae829437fe338701a10aaa375e1bb5b5de108de439c08551d 22 58 20 1e52ed75701163f7f9e40ddf9f341b3dc9ba860af7e0ca7ca7e9eecd0084d19c
以下は COSE_Key 形式でエンコードされた 2048 ビット RSA 公開鍵の例(PS256 用)です([RFC8230] Section 4)。
{ 1 : 3 , ; kty: RSA key type 3 : -37 , ; alg: PS256 -1 : n , ; n: RSA modulus n byte string 256 bytes in length ; e.g., in hex (middle bytes elided for brevity): DB5F651550...6DC6548ACC3 -2 : e ; e: RSA public exponent e byte string 3 bytes in length ; e.g., in hex: 010001 }
以下は上と同じ RSA 公開鍵の例で、RS256(RSASSA-PKCS1-v1_5 with SHA-256)に用いる場合:
{ 1 : 3 , ; kty: RSA key type 3 : -257 , ; alg: RS256 -1 : n , ; n: RSA modulus n byte string 256 bytes in length ; e.g., in hex (middle bytes elided for brevity): DB5F651550...6DC6548ACC3 -2 : e ; e: RSA public exponent e byte string 3 bytes in length ; e.g., in hex: 010001 }
6.5.2. アテステーションステートメント形式
前述のとおり、attestation statement format は、文脈バインディングの集合に対する 認証器 の暗号署名を表すデータ形式です。各 attestation statement format は次のテンプレートを使って定義されなければなりません:
-
サポートされる attestation types:
-
構文: この形式で生成される attestation statement の構文を、CDDL [RFC8610] を使って定義します。これは § 6.5.4 Generating an Attestation Object の拡張点
$$attStmtTypeに対する定義です。 -
署名手順: このフォーマットにおいて 公開鍵資格情報の認証証明を計算するための署名手順です。 認証証明用の認証器データ構造および 認証証明に用いる認証器データ、 シリアライズされたクライアントデータのハッシュが与えられます。
-
検証手続き: attestation statement を検証するための手続きで、以下の 検証入力 を取ります:
-
attStmt: 認証証明ステートメントの構造
-
authenticatorData: 認証器データ(認証証明に使用されたと主張されるもの)
-
clientDataHash: シリアライズされたクライアントデータのハッシュ
この手続きは次のいずれかを返します:
-
アテステーションが無効であることを示すエラー、または
-
実装依存の値(attestation type と trust path を表す)。この attestation trust path は self attestation の場合は空、あるいは X.509 証明書の集合となります。
-
最初に指定された attestation statement formats の一覧は § 8 Defined Attestation Statement Formats にあります。
6.5.3. アテステーションの種類
WebAuthn は複数の attestation types をサポートしており、これらは attestation statements とそれらの信頼モデルの意味論を定義します:
注: 本仕様は attestation types を明示的に表現するデータ構造を定義していません。Relying Parties が attestation statement
の検証を行う際(すなわち navigator.credentials.create() を使い navigator.credentials.create()
で none
以外の attestation conveyance を選んだ場合)は、検証手続きの一部として用いられる attestation type を決定します(詳細は各形式の「Verification
procedure」節参照)。また § 14.4.1 Attestation Privacy も参照してください。Self と None
を除く本節で定義されたすべての attestation
types については、検証後に trust path が受け入れ可能なルート証明書に一致するかを確認する(§ 7.1 のステップ
23)必要があります。これらの attestation types を区別することは、主に Relying Party のポリシーの下でアテステーションが受け入れ可能かどうかを判断する手段として有用です。
- Basic Attestation (Basic)
-
Basic attestation の場合([UAFProtocol])、認証器の attestation key pair は認証器「モデル」すなわち一括で製造された認証器群に特有のものです。したがって同じか類似のモデルの認証器はしばしば同じ attestation key pair を共有します。詳細は § 14.4.1 Attestation Privacy を参照してください。
Basic attestation は batch attestation とも呼ばれます。
- Self Attestation (Self)
-
self attestation(代替的な surrogate basic attestation とも)は、認証器が特定の attestation key pair を持たない場合に用いられ、代わりに credential private key を用いて attestation signature を作成します。アテステーション秘密鍵に対する有意な保護手段がない認証器は通常この型を使います。
- Attestation CA (AttCA)
-
この場合、認証器 は TPM に基づいており、認証器固有の「endorsement key (EK)」を保有しています。この鍵は信頼できる第三者である Attestation CA(以前は "Privacy CA" と呼ばれていた)と安全に通信するために用いられます。認証器は複数の AIK(attestation identity key)ペアを生成し、各 AIK に対して Attestation CA に AIK 証明書の発行を要求できます。この方法により、認証器は EK(グローバルな相関ハンドル)の露出を Attestation CA に限定できます。AIK は認証器が生成する各 public key credential ごとに要求され、Relying Parties に attestation certificates として伝えられます。
注: 通常これは複数のアテステーション証明書を生みます。最新に要求されたアテステーション証明書は「アクティブ」と呼ばれます。
- Anonymization CA (AnonCA)
-
この場合、認証器 は Anonymization CA を使用し、各 クレデンシャル 毎に動的に生成される attestation certificates を発行させます。これにより attestation statements によって Relying Parties に提示される情報が個別に識別可能な情報(追跡に利用され得るもの)を含まないようにします。
注: Attestation statements は AttCA や AnonCA によって伝えられるものも、Basic 型のものと同じデータ構造を用いるため、これら三つの attestation types は一般に attestation certificates の内容に関する外部情報がなければ区別できないことに注意してください。
- No attestation statement (None)
-
この場合、アテステーション情報は存在しません。詳細は § 8.7 None Attestation Statement Format を参照してください。
6.5.4. Attestation Object の生成
与えられた以下を用いて attestation object(図参照)を生成するには:
- attestationFormat
- authData
-
authenticator data を含むバイト配列。
- hash
認証器は次を実行しなければなりません:
-
attStmt を、authData と hash を用いて attestationFormat の 署名手続き を実行した結果とする。
-
fmt を attestationFormat の attestation statement format identifier とする。
-
次の構文の CBOR マップとして attestation object を返す:
attObj = { authData: bytes, ; Each choice in $$attStmtType defines the fmt value and attStmt structure $$attStmtType } .within attStmtTemplate attStmtTemplate = { authData: bytes, fmt: text, attStmt: ( { * tstr => any } ; Map is filled in by each concrete attStmtType // [ * any ] ; attStmt may also be an array ) }
6.5.5. Packed Attestation、FIDO U2F Attestation、およびアサーション署名のための署名形式
-
COSEAlgorithmIdentifier -7 (ES256) および他の ECDSA ベースのアルゴリズムの場合、
sig値は ASN.1 DER の Ecdsa-Sig-Value としてエンコードされなければなりません([RFC3279] セクション 2.2.3 に定義)。Example: Note: Encoding lengths vary with INTEGER magnitude and curve size. 30 43 ; SEQUENCE (67 Bytes) 02 21 ; INTEGER (33 Bytes) | 00 89 90 95 04 e1 4f 1e 29 db a8 15 8f a7 c3 87 | e8 88 ff be 07 d8 24 bb 21 43 20 55 06 ab 15 9c | 3e 02 1e ; INTEGER (30 Bytes) | 56 55 4f b5 81 9b 12 84 5e 85 be 2f 78 37 1c f3 | cb 95 e3 87 f4 51 cb 36 2b 94 78 d1 83 d2注: CTAP1/U2F 認証器は既にこの形式で署名値を生成しているため、整合性の観点から CTAP2 認証器も同じ形式の署名値を生成します。
新しいアテステーション形式を定義する際には ASN.1 エンコーディングを使用せず、代わりに COSE 署名で定義されたのと同じ表現(内部構造を持たない同等の固定長バイト配列)を使うことが推奨されます([RFC9053]、[RFC8230] を参照)。
以下の署名形式の定義はこの要件を満たし、ここで明示されていない他の署名アルゴリズムについても同様に導出するための例を示します:
-
COSEAlgorithmIdentifier -257 (RS256) の場合、
sigは RSASSA-PKCS1-v1_5([RFC8017] セクション 8.2.1)で SHA-256 をハッシュ関数として用いて生成された署名を含まなければなりません。署名は ASN.1 でラップされません。 -
COSEAlgorithmIdentifier -37 (PS256) の場合、
sigは RSASSA-PSS([RFC8017] セクション 8.1.1)で SHA-256 をハッシュ関数として用いて生成された署名を含まなければなりません。署名は ASN.1 でラップされません。
7. WebAuthn Relying Party の操作
A 登録
または 認証式典は、WebAuthn
Relying Party がそれぞれ PublicKeyCredentialCreationOptions
または PublicKeyCredentialRequestOptions
オブジェクトを作成することから始まり、これらは 式典
のパラメータをエンコードします。Relying
Party はこの段階で機密情報を漏洩しないよう注意すべきです;詳細は § 14.6.2 Username
Enumeration を参照してください。
create() または get() の実行に成功すると、クライアントから Relying Party のスクリプトは、それぞれ PublicKeyCredential
を受け取り、AuthenticatorAttestationResponse
または AuthenticatorAssertionResponse
構造を含みます。次に、この構造の内容を本仕様の範囲外の方法を用いて Relying Party サーバーに送信する必要があります。本節では、これらの構造を受領した際に Relying Party
が実行すべき操作について説明します。
7.1. 新しいクレデンシャルの登録
登録式典(registration ceremony)を実行するために、Relying Party MUST 以下の手順に従う:
-
options を、
CredentialCreationOptions構造として新たに作成し、式典のために Relying Party の要件に合わせて設定します。pkOptions をoptions.とします。publicKey -
navigator.credentials.create()を呼び出し、引数として options を渡します。credential を、成功したプロミスの結果とします。 プロミスが拒否された場合は、ユーザーに見えるエラーで式典を中止するか、拒否されたプロミスから得られる文脈に基づいてユーザー体験を誘導します。例えば、プロミスが "InvalidStateError" 相当のエラーコードで拒否された場合、ユーザーに別の authenticator を使用するよう指示することが考えられます。 さまざまなエラー文脈やそれに至る状況の情報は、§ 6.3.2 The authenticatorMakeCredential Operation を参照してください。 -
response を
credential.とします。もし response がresponseAuthenticatorAttestationResponseのインスタンスでない場合は、ユーザーに見えるエラーで式典を中止します。 -
clientExtensionResults を
credential.を呼び出した結果とします。getClientExtensionResults() -
JSONtext を、
response.の値に対して UTF-8 decode を実行した結果とします。clientDataJSON注: 任意の実装の UTF-8 decode を使用して構いませんが、UTF-8 decode アルゴリズムと同じ結果を生む必要があります。特に、先頭のバイトオーダーマーク(BOM)は削除する必要があります。
-
C を、登録作成中に収集されたと主張される クライアントデータ とし、JSONtext に対して実装固有の JSON パーサを実行した結果とします。
注: C は任意の実装固有のデータ構造で構いませんが、本アルゴリズムが要求するように C の構成要素が参照可能である必要があります。
-
次の値を検証します:
C.がtypewebauthn.createであることを検証します。 -
次の値を検証します:
C.がchallengepkOptions.の base64url エンコーディングと等しいこと。challenge -
次の値を検証します:
C.が origin であり、Relying Party が期待するものであることを検証します。 指針については § 13.4.9 Validating the origin of a credential を参照してください。origin -
もし
C.が存在し true に設定されている場合、 このクレデンシャルが Relying Party によって、祖先と 同一オリジンではない iframe 内で作成された と期待されていることを検証します。crossOrigin -
もし
C.が存在する場合:topOrigin-
Relying Party がこのクレデンシャルは祖先と同一オリジンではない iframe 内で作成されたと期待していることを検証します。
-
次を検証します:
C.の値が、origin と一致し、Relying Party がサブフレームとして期待するページの origin であることを確認します。 指針については § 13.4.9 Validating the origin of a credential を参照してください。topOrigin
-
-
hash を、
response.に対して SHA-256 を用いてハッシュを計算した結果とします。clientDataJSON -
attestationObjectフィールドに対して CBOR デコードを行い、アテステーションステートメント形式 fmt、authenticator data authData、およびアテステーションステートメント attStmt を取得します。 -
rpIdHashが RP ID の SHA-256 ハッシュであり、Relying Party が期待するものであることを検証します。 -
もし
options.がmediationconditionalに設定されていない場合、UPビットが authData のflagsに設定されていることを検証します。 -
もし Relying Party がこの登録に対して ユーザー確認(user verification) を要求する場合、
UVビットが authData のflagsに設定されていることを検証します。 -
もし BE ビットが
flagsの authData に設定されていない場合、BS ビットが設定されていないことを検証します。 -
もし Relying Party がクレデンシャルの バックアップ適格性 をユーザー体験フローやポリシーに反映する場合、BE ビットを authData の
flagsから評価します。 -
もし Relying Party がクレデンシャルの バックアップ状態 をユーザー体験フローやポリシーに反映する場合、BS ビットを authData の
flagsから評価します。 -
authData 内の credential public key にある "alg" パラメータが、
pkOptions.のアイテムの一つのpubKeyCredParamsalg属性と一致することを検証します。 -
fmt に対して USASCII 大文字小文字区別マッチを行い、アテステーションステートメント形式を決定します。サポートされている WebAuthn Attestation Statement Format Identifier 値の集合と照合します。 登録済みの識別子の最新の一覧は 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 Metadata Service [FIDOMetadataService]
は、この情報を入手する一つの方法を提供します。その際、
aaguidをattestedCredentialDataの authData から利用できます。 -
検証手順(ステップ 21 の結果)を用いて、アテステーションの信頼性を次のように評価します:
-
もし アテステーション無し が提供されている場合、None アテステーションが Relying Party のポリシーで許容されるかを検証します。
-
もし 自己アテステーション(self attestation) が使用されている場合、self attestation が Relying Party のポリシーで許容されるかを検証します。
-
それ以外の場合、検証手順 から返された X.509 証明書をアテステーショントラストパスとして使用し、アテステーション公開鍵が受け入れ可能なルート証明書へ正しくチェーンしているか、またはそれ自体が受け入れ可能な証明書であるかを確認します(すなわち、ステップ 22 で取得したルート証明書と同一である可能性を含みます)。
アテステーションステートメントが信頼に値しないと判断された場合、Relying Party は登録式典を失敗させるべきです(SHOULD)。
注: ただし、ポリシーで許可されている場合、Relying Party は credential ID とクレデンシャル公開鍵を登録しつつ、そのクレデンシャルを 自己アテステーション として扱うことができます(詳細は § 6.5.3 Attestation Types を参照)。その場合、Relying Party はそのクレデンシャルが特定の authenticator モデルによって生成されたという暗号学的証明がないことを主張することになります。 詳細な議論については [FIDOSecRef] および [UAFProtocol] を参照してください。
-
-
次を検証します:
credentialIdが ≤ 1023 バイトであること。これを超える Credential ID は 登録式典 を失敗させるべきです(SHOULD)。 -
次を検証します:
credentialIdがまだどのユーザーにも登録されていないこと。もし既に知られている場合は、Relying Party はこの 登録式典 を失敗させるべきです(SHOULD)。注: Relying Parties が重複する credential IDs を拒否する理由は次の通りです: credential IDs は十分なエントロピーを含むため偶発的な重複は非常に稀です。しかし、attestation types のうち自己署名を含まないものは、登録時にクレデンシャル秘密鍵の所有を明示的に証明する自己署名を含みません。したがって、攻撃者がユーザーの credential ID と公開鍵を入手してしまうと(様々な方法で可能)、その被害者のクレデンシャルを攻撃者自身のものとしてサイトに登録しようとする可能性があります。Relying Party がこの新規登録を受け入れて被害者の既存登録を置き換え、かつ クレデンシャルが検出可能(discoverable) な場合、被害者は次回の試行時に攻撃者のアカウントでサインインさせられる可能性があります。その状態で被害者がサイトに保存したデータは攻撃者が利用可能になります。
-
credentialRecord を次の内容を持つ新しい credential record とします:
- type
-
credential..type - id
-
credential.またはidcredential.、 Relying Party が好む形式を使用します。rawId - publicKey
-
credential public key を authData から格納します。
- signCount
-
authData.signCount. - uvInitialized
-
UV フラグの値を authData から格納します。
- transports
-
response.
getTransports()から返される値。 - backupEligible
-
BE フラグの値を authData から格納します。
- backupState
-
BS フラグの値を authData から格納します。
新しい credential record は、次の任意の内容をオプションとして含めることができます:
- attestationObject
-
response..attestationObject - attestationClientDataJSON
-
response..clientDataJSON - rpId
Relying Party は必要に応じて追加の items を含めることができます。 非規範的な例として、Relying Party はユーザーがクレデンシャルに対して「ニックネーム」を設定できるようにし、アカウント設定とやり取りする際にどの credential がどの authenticator に結び付いているかをユーザーが覚えやすくすることが考えられます。
-
clientExtensionResults にある クライアント拡張出力 と、authData の
extensionsにある オーセンティケーター拡張出力 を Relying Party の要求に従って処理します。 各 拡張 によって、処理手順が具体的に定義される場合や、Relying Party 側で拡張出力をどのように扱うか決定する場合があります。 Relying Party は任意の拡張出力を無視しても構いません。クライアント は追加の authenticator 拡張 や クライアント拡張 を設定することがあり、その結果 authenticator 拡張出力 や クライアント拡張出力 に、Relying Party が
pkOptions.で要求していない値が現れることがあります。 Relying Party は、そのような状況に対処できるよう準備しておく必要があり、未要求の拡張を無視するかアテステーションを拒否するかを選択できます。この決定はローカルポリシーおよび使用されている拡張に基づいて行えます。extensionsすべての拡張はクライアントおよびオーセンティケーターの双方にとって任意であるため、Relying Party は要求した拡張が一つも、またはすべて実行されなかった場合にも対処できるようにしておかなければなりません。
-
上記のすべての手順が成功した場合、 credentialRecord を ユーザーアカウント(
pkOptions.で示されたもの)に保存し、適切に登録式典を続行します。 そうでない場合は登録式典を失敗させます。userもし Relying Party がこの時点で登録式典を失敗させない場合、 Relying Party は、クレデンシャル公開鍵が任意の特定の authenticator モデルによって生成されたという暗号学的証明がないことを受け入れたことになります。 Relying Party は、そのクレデンシャルを アテステーション無し(no attestation) と同等と見なすことができます(詳細は § 6.5.3 Attestation Types を参照)。 詳細な議論については [FIDOSecRef] および [UAFProtocol] を参照してください。
アテステーションオブジェクトの検証には、Relying Party がステップ 22 における信頼アンカーを決定する信頼できる方法を持っていることが必要です。 また、証明書が使用される場合、Relying Party は中間 CA 証明書の証明書状態情報にアクセスできる必要があります。さらに、クライアントがアテステーション情報にチェーンを提供していない場合でも、Relying Party はアテステーション証明書チェーンを構築できなければなりません。
7.2. 認証アサーションの検証
認証式(authentication ceremony)を実施するために、Relying Partyは以下の手順に従わなければなりません:
-
options を
CredentialRequestOptions構造として新規作成し、式典に必要な Relying Party の要件に合わせて構成する。 pkOptions をoptions.とする。publicKey -
navigator.credentials.get()を呼び出し、引数に options を渡す。 credential を、成功したプロミスの結果とする。 プロミスが拒否された場合は、式典をユーザー向けエラーで中止するか、拒否されたプロミスから得られる文脈によってユーザー体験を誘導する。さまざまなエラー文脈や状況については、§ 6.3.3 The authenticatorGetAssertion Operation を参照。 -
response を
credential.とする。 response がresponseAuthenticatorAssertionResponseのインスタンスでない場合、ユーザー可視なエラーで式典を中止する。 -
clientExtensionResults を
credential.を呼ぶことで得る。getClientExtensionResults() -
もし
pkOptions.が空でない場合、allowCredentialscredential.がidpkOptions.に列挙されている公開鍵資格情報のいずれかを識別することを確認する。allowCredentials -
認証されるユーザーを特定し、credentialRecord をその credential record とする:
- ユーザーが 認証式典 開始前に(例: ユーザー名やCookie等で)特定されている場合
-
特定された ユーザーアカウント に、 credential record があり、かつその id が
credential.と等しいことを検証する。 credentialRecord をこの credential record とする。rawIdresponse.が存在する場合、 それが ユーザーハンドル と一致していることを検証する。userHandle - ユーザーが 認証式典 開始前に特定されていない場合
-
response.が存在することを確認する。userHandleresponse.で特定される ユーザーアカウント がuserHandlecredential.と等しい credential record を保持していることを検証し、 credentialRecord をその credential record とする。rawId
-
cData, authData, sig をそれぞれ response の
clientDataJSON,authenticatorData,signatureの値とする。 -
JSONtext を cData の値に UTF-8 decode を適用した結果とする。
注: 任意の実装の 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 Validating the origin of a credential を参照。origin -
C.が存在し、crossOrigintrueの場合、 Relying Party が、このクレデンシャルを祖先と同一オリジンでない iframe 内で利用することを期待していることを検証する。 -
C.が存在する場合:topOrigin-
Relying Party がこのクレデンシャルを祖先と同一オリジンでない iframe 内で利用することを期待していることを検証する。
-
C.の値が、 origin と一致し、 Relying Party がサブフレームとして期待するページの origin であることを検証する。 指針は § 13.4.9 Validating the origin of a credential を参照。topOrigin
-
-
authData の
rpIdHashが、RP ID の SHA-256 ハッシュであり、それが Relying Party の期待どおりであることを検証。注: appid 拡張が使われている場合、本ステップには特別なロジックが必要となる。詳細は § 10.1.1 FIDO AppID Extension (appid) を参照。
-
このアサーション(assertion)で ユーザー検証が必要か判定する。
pkOptions.がuserVerificationrequiredの場合のみ ユーザー検証 を要求すべき(SHOULD)である。ユーザー検証が必須と判定されたならば、 authData の
UVビットがflagsに設定されていることを検証する。 そうでない場合は、UV フラグの値を無視する。 -
authData の BE ビットが
flagsにセットされていない場合、BS ビットがセットされていないことを検証する。 -
クレデンシャルの バックアップ状態 を Relying Party の業務ロジックまたはポリシーの一部として利用する場合、 authData の BE, BS ビットの値を currentBe, currentBs とする。
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を使って、sig が authData と hash のバイナリ連結の有効な署名であることを検証する。注: この検証ステップはFIDO U2Fオーセンティケーターで生成された署名とも互換がある。§ 6.1.2 FIDO U2F Signature Format Compatibility を参照。
-
authData.
signCountが非0、またはcredentialRecord.signCountが非0 ならば、次のサブステップを実行:-
authData.
signCountが-
credentialRecord.signCountより大きければ - 署名カウンタは正当とみなす
-
credentialRecord.signCount以下であれば -
これはオーセンティケーターがクローンされている可能性の「シグナル」だが、証拠とは限らない。たとえば次のことが考えられる:
-
2つ以上の クレデンシャル秘密鍵 が存在し並列で使われている可能性
-
オーセンティケーターの不調
-
Relying Party がアサーションレスポンスを、オーセンティケーター生成順と異なる順序で処理している競合状態
Relying Parties は自身の運用特性に基づいてリスク評価に本情報を組み込むべき。 この場合 Relying Party が
credentialRecord.signCountを以降で更新するか・しないか・認証式典 を失敗させるか等は、Relying Partyの判断でよい。署名カウンターに関する詳細は § 6.1.1 Signature Counter Considerations 参照。
-
-
-
-
clientExtensionResults 内の クライアント拡張出力および
authData の
extensions内の 認証器拡張出力 を Relying Party の要件に従い処理する。 各 拡張ごとに、 処理手順が具体的に指定されている場合もあれば、拡張出力の取り扱いを Relying Partyが判断する場合もある。 Relying Partyは、任意の拡張出力を無視してもよい。クライアント が追加の オーセンティケーター拡張 や、 クライアント拡張 をセットした場合、オーセンティケーター拡張出力や クライアント拡張出力 に、
pkOptions.で Relying Party が要求していなかった値が現れることがある。 Relying Party は、その場合に未要求の拡張を無視するかアサーションを拒否するか、どちらも許可されている。これはローカルポリシーや利用している拡張の内容に依って決めてよい。extensionsすべての拡張はクライアント・オーセンティケーター双方において任意なので、Relying Party は要求した拡張が一部または全て実行されていなくても対処できる必要がある。
-
credentialRecord を新しい状態値で更新:
-
credentialRecord.backupStateを currentBs の値に更新。 -
credentialRecord.uvInitializedがfalseの場合は、 authData の UV ビット値で更新する。 この変更にはWebAuthnの 認証ファクターに相当する追加認証要素による認可が必要であるべき(SHOULD); 認可されなければ、この手順をスキップする。
Relying Party がWebAuthn 認証式典 手順以上の追加のセキュリティチェックを行う場合、これらの状態更新は追加チェックが成功した後に実施すべき(SHOULD)。
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 Attestationステートメントの構文は次のCDDLで定義されます:
$$attStmtType //= ( fmt: "packed", attStmt: packedStmtFormat ) packedStmtFormat = { alg: COSEAlgorithmIdentifier, sig: bytes, x5c: [ attestnCert: bytes, * (caCert: bytes) ] } // { alg: COSEAlgorithmIdentifier sig: bytes, }各フィールドの意味は以下のとおりです:
- alg
-
COSEAlgorithmIdentifierで、アテステーション署名生成に用いるアルゴリズムIDです。 - sig
-
アテステーション署名を含むバイト列です。
- x5c
-
この配列の要素はattestnCertおよびその証明書チェーン(ある場合)で、いずれもX.509形式で符号化されます。 アテステーション証明書attestnCertは必ず配列の先頭要素とします。
- attestnCert
-
X.509形式で符号化されたアテステーション証明書です。
- 署名手順
-
このアテステーションステートメント形式の署名手順は アサーション署名生成手順に類似します。
-
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と一致することを確認。 -
成功した場合、アテステーションタイプBasicまたはAttCAまたは不明を表す実装依存値、 およびアテステーショントラストパス(x5c)を返す。
-
-
x5cが存在しない場合、自己アテステーションが使われている。
-
algがauthenticatorData内
credentialPublicKeyのアルゴリズムと一致することを確認。 -
sigがauthenticatorDataとclientDataHashの連結に対し algを使ってクレデンシャル公開鍵で検証できる署名となっていることを確認。
-
成功した場合、アテステーションタイプ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)を含める必要があり、 内容はAAGUIDを16バイトのOCTET STRINGで格納します。 この拡張はcriticalにしてはなりません。Relying Parties はアテステーションルート証明書が複数モデルで共有されているか知り得ない可能性があるため、本拡張が存在する場合は拡張の値が アテステーションオブジェクトの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] を参照してください。
特定の認証器モデルのファームウェアは、Extension OID 1.3.6.1.4.1.45724.1.1.5
(id-fido-gen-ce-fw-version) で区別することができます。存在する場合、この属性は非負の値を持つ INTEGER であり、新しい
ファームウェアリリースバージョンのごとにインクリメントされます。この拡張は critical に指定してはいけません。
例として、以下は上記の拡張OIDおよび必須項目を含む認証証明書です:
-----BEGIN CERTIFICATE-----MIIBzTCCAXOgAwIBAgIUYHS3FJEL/JTfFqafuAHvlAS+hDYwCgYIKoZIzj0EAwIw QTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC1dlYkF1dGhuIFdHMRwwGgYDVQQDDBNF eGFtcGxlIEF0dGVzdGF0aW9uMCAXDTI0MDEwMzE3NDUyMVoYDzIwNTAwMTA2MTc0 NTIxWjBBMQswCQYDVQQGEwJVUzEUMBIGA1UECgwLV2ViQXV0aG4gV0cxHDAaBgNV BAMME0V4YW1wbGUgQXR0ZXN0YXRpb24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC AATDQN9uaFFH4BKBjthHTM1drpb7gIuPod67qyF6UdL4qah6XUp6tE7Prl+DfQ7P YH9yMOOcci3nr+Q/jOBaWVERo0cwRTAhBgsrBgEEAYLlHAEBBAQSBBDNjDlcJu3u 3mU7AHl9A8o8MBIGCysGAQQBguUcAQEFBAMCASowDAYDVR0TAQH/BAIwADAKBggq hkjOPQQDAgNIADBFAiA3k3aAUVtLhDHLXOgY2kRnK2hrbRgf2EKdTDLJ1Ds/RAIh AOmIblhI3ALCHOaO0IO7YlMpw/lSTvFYv3qwO3m7H8Dc -----END CERTIFICATE-----
上記の属性はこの証明書内で次のように構造化されています:
30 21 -- SEQUENCE
06 0B 2B 06 01 04 01 82 E5 1C 01 01 04 -- OID 1.3.6.1.4.1.45724.1.1.4
04 12 -- OCTET STRING
04 10 -- OCTET STRING
CD 8C 39 5C 26 ED EE DE -- AAGUID cd8c395c-26ed-eede-653b-00797d03ca3c
65 3B 00 79 7D 03 CA 3C
30 12 -- SEQUENCE
06 0B 2B 06 01 04 01 82 E5 1C 01 01 05 -- OID 1.3.6.1.4.1.45724.1.1.5
04 03 -- OCTET STRING
02 01 -- INTEGER
2A -- Firmware version: 42
8.2.2. エンタープライズPackedアテステーション証明書要件
OID 1.3.6.1.4.1.45724.1.1.2(id-fido-gen-ce-sernum)拡張は
エンタープライズ用途のpackedアテステーションで追加可能(MAY)です。存在する場合、この拡張は特定AAGUIDにつき装置毎に一意なバイト列とする必要があります。
この値は工場出荷時リセット後も不変でなければならないが、他ハードウェア識別番号と異なる場合も認められる。criticalにはしないこと。
非エンタープライズアテステーションではこの拡張を含めてはなりません。
8.3. 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で、アテステーション署名生成に使うアルゴリズムIDです。 - x5c
-
X.509で符号化されたaikCert および証明書チェーン。
- aikCert
-
アテステーションに用いたAIK証明書(X.509形式)。
- sig
-
アテステーション署名。 TPMT_SIGNATURE構造体形式。[TPMv2-Part2] 11.3.4参照。
- certInfo
-
上記署名を計算したTPMS_ATTEST構造体。[TPMv2-Part2] 10.12.8参照。
- pubArea
-
TPMT_PUBLIC構造体([TPMv2-Part2] 12.2.4参照)。TPMが保持するクレデンシャル公開鍵。
- 署名手順
-
authenticatorDataをアテステーション用データとし、 clientDataHashを シリアライズしたクライアントデータのハッシュ とする。
authenticatorDataとclientDataHashを連結してattToBeSignedとする。
署名生成は、[TPMv2-Part3] Section 18.2手順に従い、 アテステーション秘密鍵で行う。
extraDataパラメータはattToBeSignedダイジェストとする。 ("RS256"ではSHA-256ダイジェスト。)pubAreaフィールドにはクレデンシャル公開鍵の公開領域(TPMT_PUBLIC構造体)、certInfoフィールド(TPMS_ATTEST構造体)にはパラメータ名と同じ出力値、 sigは上記署名値とする。
注: pubAreaがTPM2_ReadPublicコマンドで読み出される場合、 このコマンドの返すTPM2B_PUBLICは長さ2バイト+TPMT_PUBLIC構造になる。pubArea格納時に長さ2バイトを除去すること。
- 検証手順
-
検証入力 attStmt, authenticatorData, clientDataHashで、 検証手順は:
attStmtが上記構文準拠のCBORであるか検証しCBORデコードで各フィールドを抽出。
pubAreaの
parametersおよびuniqueがcredentialPublicKeyおよびattestedCredentialData(authenticatorData内)と一致することを確かめる。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と一致することを確認。 -
sigがcertInfoに対しaikCertの公開鍵およびalg指定アルゴリズムで有効な署名となっていることを確認。
certInfoが妥当であることの検証: 注: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(nameAlgアルゴリズムで算出)が入っている。注: TPMは常にTPMS_CERTIFY_INFO構造体
nameのnameAlgをpubAreaと一致させる。注: “Standard Attestation Structure”[TPMv2-Part1] 31.2の残りフィールド(
qualifiedSigner,clockInfo,firmwareVersion)は無視される。 aikCertのキー属性に依存してこれらが難読化される場合もある。もし妥当な場合はリスク解析エンジンへの入力に活用してもよい。 -
成功時は、アテステーションタイプAttCAおよび アテステーショントラストパス(x5c)を表す実装依存値を返す。
-
8.3.1. TPMアテステーション証明書の要件
TPM アテステーション証明書は下記フィールド・拡張を必須とします:
-
バージョンは3でなければならない。
-
Subjectフィールドは空でなければならない。
-
Subject Alternative Name拡張は[TPMv2-EK-Profile] 3.2.9の定義に従い設定すること。
注: [TPMv2-EK-Profile]の過去バージョンでは、EK証明書のHardwareModuleName属性(TPMシリアル番号を含む)をオプションで含めてよいとしていたが、 HardwareModuleNameはアテステーション証明書 のSubject Alternative Nameとして格納してはならない(SHOULD NOT)。
-
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 Metadata Service [FIDOMetadataService]参照。
8.4. Androidキーアテステーションステートメントフォーマット
対象のオーセンティケーターがAndroid "N"以降プラットフォーム上の プラットフォームオーセンティケーターである場合、 アテステーションステートメントはAndroid key attestationに基づきます。この場合、アテステーションステートメントはセキュアな実行環境で動作するコンポーネントによって生成されますが、アテステーションのためのオーセンティケーターデータはこの環境の外部で生成されます。WebAuthn Relying Partyは、アテステーションに利用されたとされるオーセンティケーターデータが、アテステーション証明書の拡張データの内容と一致しているか確認することが求められます。
- アテステーションステートメント形式識別子
-
android-key
- 対応するアテステーションタイプ
- 構文
-
Android Key Attestationステートメントは単にAndroidアテステーションステートメント(DERエンコードX.509証明書列)です。Android開発者ドキュメントも参照。構文は次の通りです:
$$attStmtType //= ( fmt: "android-key", attStmt: androidStmtFormat ) androidStmtFormat = { alg: COSEAlgorithmIdentifier, sig: bytes, x5c: [ credCert: bytes, * (caCert: bytes) ] } - 署名手順
-
authenticatorData を アテステーションのためのオーセンティケーターデータ、 clientDataHash を シリアライズしたクライアントデータのハッシュ とする。
Android Key Attestationを
keyStore.getCertificateChain(myKeyUUID)でリクエストし、clientDataHash をチャレンジ値として渡す(例: setAttestationChallenge を利用)。x5c には返却値を格納。オーセンティケーターは authenticatorData と clientDataHash を連結し、クレデンシャル秘密鍵で署名して sig を生成。 alg には署名形式のアルゴリズムを格納する。
- 検証手順
-
検証手順入力 attStmt, authenticatorData, clientDataHash について、検証手順は次の通り:
-
attStmtが上記構文の有効なCBORであることを検証し、CBORデコードで各フィールドを抽出する。
-
sigが、authenticatorDataとclientDataHashの連結に、x5cの最初の証明書の公開鍵およびalg指定アルゴリズムで有効な署名か検証。
-
x5cの最初の証明書公開鍵が、
credentialPublicKey(attestedCredentialData内、authenticatorDataから抽出)と一致していることを検証。 -
アテステーション証明書 拡張データ内
attestationChallengeフィールドが clientDataHash と同一であることを検証する。 -
アテステーション証明書 拡張データ内 適切なauthorization listについて以下を確認する:
-
AuthorizationList.allApplicationsフィールドが(softwareEnforcedもteeEnforcedも)存在しないこと (PublicKeyCredentialはRP IDにスコープされていなければならないため)。 -
以下について、RPが信頼実行環境のみ許容する場合は
teeEnforcedのみ、そうでなければその和集合を使う。-
AuthorizationList.originの値がKM_ORIGIN_GENERATEDである。 -
AuthorizationList.purposeの値がKM_PURPOSE_SIGNである。
-
-
-
成功した場合、アテステーションタイプBasicおよびアテステーショントラストパス(x5c)を表す実装依存値を返却。
-
8.4.1. Android Key Attestation ステートメント証明書要件
Android Key Attestation アテステーション証明書のandroid key attestation certificate extension
dataはOID1.3.6.1.4.1.11129.2.1.17で識別され、そのスキーマはAndroid開発者ドキュメントに定義されています。
8.5. Android SafetyNet アテステーションステートメント形式
注: 本フォーマットは非推奨(deprecated)であり、今後の改訂で削除される予定です。
オーセンティケーターが特定のAndroidプラットフォーム上の プラットフォームオーセンティケーターの場合、 アテステーションステートメントはSafetyNet APIに基づく可能性があります。 このケースではオーセンティケーターデータは完全にSafetyNet API呼び出し元(典型的にはAndroid上のアプリ)によって制御され、 アテステーションステートメントはプラットフォームの健全性や呼び出しアプリの識別性に言及するものとなります。 (詳細は SafetyNet ドキュメント を参照)
- アテステーションステートメント形式識別子
-
android-safetynet
- 対応するアテステーションタイプ
- 構文
-
Android Attestationステートメントの構文は次の通りです:
$$attStmtType //= ( fmt: "android-safetynet", attStmt: safetynetStmtFormat ) safetynetStmtFormat = { ver: text, response: bytes }各フィールドの意味:
- ver
-
SafetyNet APIを提供するGoogle Play Servicesのバージョン番号。
- response
-
SafetyNet APIのgetJwsResult()コールのUTF-8エンコード値。この値はJWS [RFC7515] オブジェクト( SafetyNet オンラインドキュメント参照) のCompact Serialization形式です。
- 署名手順
-
authenticatorData を アテステーション用データ、 clientDataHash を シリアライズクライアントデータのハッシュ とする。
authenticatorDataとclientDataHashを連結し、それをSHA-256ハッシュし、そのハッシュをattToBeSignedとする。
SafetyNet アテステーションを要求し、attToBeSigned を nonce 値として提供する。response をその結果に設定し、ver を認証器で動作している Google Play Services のバージョンに設定する。
- 検証手順
-
検証手順入力 attStmt, authenticatorData, clientDataHashについて、検証手順は以下の通り:
-
attStmtが上記構文準拠CBORであることを検証、CBORデコードで各フィールド抽出。
-
responseがバージョンverに対応する有効なSafetyNetレスポンスであることを SafetyNetオンラインドキュメント手順で検証。 現在は形式一種のみでverは将来利用のため予約されている。
-
responseペイロードの
nonce属性が、authenticatorDataとclientDataHash連結のSHA-256ハッシュBase64と等しいことを確認。 -
SafetyNetレスポンスが実際にSafetyNetサービス発行であることを SafetyNetオンラインドキュメントの手順で検証。
-
成功時、アテステーションタイプ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形式アテステーション証明書の単要素配列
- sig
-
アテステーション署名。 署名は[FIDO-U2F-Message-Formats]で定義のU2F登録応答メッセージ(raw)に対して、 クライアントがオーセンティケーターから受信したもの。
- 署名手順
-
attested credentialの クレデンシャル公開鍵がアルゴリズム-7("ES256")でなければエラー返却。 それ以外はauthenticatorData(アテステーション用オーセンティケーターデータ)、 clientDataHash(シリアライズクライアントデータハッシュ)とする(後者は32バイト)。
登録応答メッセージ生成は[FIDO-U2F-Message-Formats] Section 4.3の要領で(applicationはRP IDのSHA-256ハッシュ、challengeはclientDataHash、key handleは該当クレデンシャルID)、 Registration Response Messageのraw signature部分(ユーザー公開鍵、key handle、アテステーション証明書部分を除外)をsig、 アテステーション公開鍵の証明書群をx5cとする。
- 検証手順
-
検証手順入力 attStmt, authenticatorData, clientDataHashについて、検証手順は下記の通り:
-
attStmtが上記構文準拠CBORであることを検証し、CBORデコードで各フィールドを抽出
-
x5cが1つだけであること確認し、attCertとする。attCertに含まれる公開鍵をcertificate public keyとし、これがP-256曲線上のEC公開鍵でない場合はエラー返却。
-
authenticatorDataから主張されているrpIdHashを取得、 authenticatorData.
attestedCredentialDataからcredentialIdとcredentialPublicKeyを得る。 -
credentialPublicKey(COSE_KEY形式、RFC9052 Section 7参照)をRaw ANSI X9.62公開鍵形式( FIDO Registry 3.6.2)に変換。
-
xをcredentialPublicKeyの"-2"キー(x座標)値とし、32バイトであることを確認。 サイズ異常または"-2"キー欠損時はエラー返却。
-
yを"-3"キー(y座標)値とし、32バイトであることを確認。 サイズ異常または"-3"キー欠損時はエラー返却。
-
publicKeyU2Fを
0x04 || x || y連結値とする。注: これはアンコンプレスECC公開鍵形式。
-
-
verificationDataを(0x00 || rpIdHash || clientDataHash || credentialId || publicKeyU2F)で連結。(Section 4.3)
-
verificationDataとcertificate public keyでsigを、 [SEC1]4.1.4の要領で(SHA-256ハッシュ使用)、検証。
-
成功時、アテステーションタイプBasic/AttCAまたは不明種別、およびアテステーショントラストパス(x5c)を表す実装依存値を返す。
-
8.7. None アテステーションステートメント形式
noneアテステーションステートメント形式は、WebAuthn Relying Partyがアテステーション情報を受け取りたくない意思を示した際(§ 5.4.7 アテステーション伝達希望列挙(enum AttestationConveyancePreference)参照)に、オーセンティケーター提供のアテステーションステートメントを置き換える用途で利用されます。
オーセンティケーターが アテステーションをサポートしていない場合、この形式のアテステーションステートメントを生成してもかまいません(MAY)。
- アテステーションステートメント形式識別子
-
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 を attStmt から取り出し、 アテステーションステートメント形式識別子
subStmt.fmtに対応する 検証手順 を 検証手順の入力 subStmt, authenticatorData, clientDataHash で評価する。一つ以上の subStmt で検証が失敗した場合、Relying Party のポリシーに基づき適切な結果を決定する。
-
十分な数(Relying Party のポリシーで決定) の 項目 が attStmt で正常に検証された場合、 成功した 検証手順 から得られた出力の任意の組み合わせを表す実装依存の値を返す。
-
9. WebAuthn拡張
公開鍵クレデンシャルの生成の仕組み、および§ 5 Web Authentication APIで定義されている認証アサーションのリクエストと生成の仕組みは、特定のユースケースに合わせて拡張することができます。それぞれの場合は、登録拡張および/または認証拡張を定義することで対応されます。
すべての拡張はクライアント拡張です。つまり、この拡張はクライアントとの通信およびクライアントによる処理を伴います。クライアント拡張は、以下の手順とデータを定義します:
-
navigator.credentials.create()の拡張リクエストパラメータ・レスポンス値(登録拡張に対するもの)。 -
navigator.credentials.get()の拡張リクエストパラメータ・レスポンス値(認証拡張に対するもの)。 -
クライアント拡張の処理(登録拡張および認証拡張に対するもの)。
公開鍵クレデンシャルを作成する場合や認証アサーションを要求する場合、WebAuthn
Relying Partyは拡張機能のセットの使用を要求できます。これらの拡張は、クライアントやWebAuthnオーセンティケーターがサポートしていれば、要求された処理中に呼び出されます。Relying Partyは各拡張についてクライアント拡張入力を
get()
(認証拡張用)または
create()
(登録拡張用)の呼び出しとともに、クライアントに送信します。
クライアントは、対応する拡張ごとにクライアント拡張処理を行い、クライアントデータ
を各拡張で規定された方法で補強し、拡張識別子とクライアント拡張出力値を含めます。
拡張機能はまた、オーセンティケーター拡張である場合があります。これは、拡張がオーセンティケーターとの通信やオーセンティケーターでの処理を伴うことを意味します。オーセンティケーター拡張は以下の手順・データを定義します:
-
authenticatorMakeCredential拡張リクエストパラメータおよび応答値(登録拡張用)。
-
authenticatorGetAssertion拡張リクエストパラメータおよび応答値(認証拡張用)。
-
オーセンティケーター拡張処理(登録拡張および認証拡張両用)。
オーセンティケーター拡張については、クライアント拡張処理の一環として、クライアントは各拡張のCBOR
オーセンティケーター拡張入力値も生成(多くは対応するクライアント拡張入力値に基づく)し、create()
呼び出し時(登録拡張用)、または
get()
呼び出し時(認証拡張用)にオーセンティケーターへ渡します。これらのオーセンティケーター拡張入力値はCBORで表現され、名前と値のペア(名前は拡張識別子、値は該当オーセンティケーター拡張入力)として渡します。オーセンティケーターは対応する拡張について追加処理を行い、拡張で定義された各項目のCBOR
オーセンティケーター拡張出力を返却します。
オーセンティケーター拡張出力は署名付きオーセンティケーターデータの一部として返されるため、オーセンティケーター拡張は
オーセンティケーターデータ自体に依拠する場合など、
未署名拡張出力(unsigned extension output)を定義できる場合もあります。
クライアント拡張処理の一部として、オーセンティケーター拡張では
オーセンティケーター拡張出力および
未署名拡張出力を使ってクライアント拡張出力を生成します。
すべてのWebAuthn拡張はクライアント・オーセンティケーター双方に対してOPTIONALです。そのためRelying Partyが要求した拡張は、クライアントブラウザやOSで無視されたり、オーセンティケーターに渡されないことがあります。また、オーセンティケーター側で拡張が無視される場合もあります。 拡張が無視されても、WebAuthn API処理の失敗とはなりません。したがってRelying PartiesはAPIコールで拡張を含める場合、いくつか、あるいはすべての拡張が無視された状況に対応できるよう準備しておく必要があります。
すべてのWebAuthn拡張は、クライアントやオーセンティケーターがそれをサポートしていなくてもユーザーのセキュリティやプライバシーを損なわないよう設計されていなければなりません(MUST)。 例えば、拡張がクライアント処理を要求する場合、単純な通過体制としてJSON→CBORのトランスコードのみを行うと意味的に不正となるように設計し、オーセンティケーターで拡張が無視される(認識できない値になる)ようにできます。すべての拡張がOPTIONALならば、API処理が機能的に失敗することはありません。
IANA "WebAuthn Extension Identifiers"レジストリ[IANA-WebAuthn-Registries]([RFC8809]で制定)は、登録済みWebAuthn拡張の最新版リストを参照できます。
9.1. 拡張識別子
拡張は、拡張作成者が選ぶ文字列(拡張識別子)で識別されます。
拡張識別子は、 IANA「WebAuthn Extension Identifiers」レジストリ[IANA-WebAuthn-Registries]([RFC8809])への登録が推奨されます。 登録済み拡張識別子はユニークです。
未登録の拡張識別子も、グローバル一意性を目指すべきであり、たとえばmyCompany_extensionのように
制定者名を含めてください。
拡張識別子は最大32オクテット・印刷可能なUSASCII文字のみ(バックスラッシュとダブルクォートを除く)でなければなりません。 実装はWebAuthn拡張識別子の比較を大文字小文字区別で行う必要があります。
複数バージョンが存在する拡張は、識別子にバージョンを含める必要があります。これは異なるバージョンが異なる拡張として扱われることを意味します。例:myCompany_extension_01
§ 10 定義済み拡張で、追加の拡張と識別子を定義しています。 最新リストはIANA「WebAuthn Extension Identifiers」レジストリ[IANA-WebAuthn-Registries]および[RFC8809]参照。
9.2. 拡張の定義
拡張の定義には、拡張識別子、get()
または create()
呼び出しで送信されるクライアント拡張入力引数、
クライアント拡張処理のルール、
クライアント拡張出力
値を指定しなければならない(MUST)。
拡張がオーセンティケーターと通信する場合(オーセンティケーター拡張の場合)、
CBORの
オーセンティケーター拡張入力引数(authenticatorGetAssertionまたはauthenticatorMakeCredential呼び出しで送信)、
オーセンティケーター拡張処理のルール、
CBORの
オーセンティケーター拡張出力
値も指定しなければならない(MUST)。
拡張は未署名拡張出力も指定してよい(MAY)。
クライアントが処理するクライアント拡張は必ずクライアント拡張出力値を返却し、
WebAuthn
Relying Party が
クライアントが拡張に応答したことを識別できるようにしなければならない(MUST)。
同様に、オーセンティケーター処理を要する拡張は必ずオーセンティケーター拡張出力を返却し、
Relying Partyが
オーセンティケーター側の応答を認識できるようにする必要がある(MUST)。
もし他に返却値が不要な拡張であれば、JSONのBoolean型クライアント拡張出力結果を
true として返却すべきである(SHOULD)。同様に他に返却値不要な
オーセンティケーター拡張も
Boolean型(CBOR)オーセンティケーター拡張出力結果に
true を返却すべきであり(SHOULD)、必ず何か値を返すこと(MUST)。
9.3. リクエストパラメータの拡張
拡張機能は1つまたは2つのリクエスト引数を定義します。クライアント拡張入力は、JSONでエンコード可能な値であり、WebAuthnリライングパーティからクライアントへ
get()
または create()
呼び出しで渡されます。
一方、CBORの認証器拡張入力は、
これらの呼び出し処理中に、クライアントから認証器へ認証器拡張のために渡されます。
Relying Party は
拡張の利用を要求し、そのクライアント拡張入力を
extensions
オプション
(create()
または get()
呼び出し)で指定することで同時設定できます。
エントリーキーは拡張識別子、値はクライアント拡張入力です。
Note: 他文書では拡張入力で 拡張識別子をエントリーキーとして使用しない仕様もありますが、 上記の慣例は新しい拡張では適用されます。
var assertionPromise= navigator. credentials. get({ publicKey: { // Other members omitted for brevity extensions: { // An "entry key" identifying the "webauthnExample_foobar" extension, // whose value is a map with two input parameters: "webauthnExample_foobar" : { foo: 42 , bar: "barfoo" } } } });
拡張の定義では、そのクライアント拡張入力の有効値を必ず指定しなければなりません(MUST)。クライアントは
無効なクライアント拡張入力を持つ拡張を無視すべきです(SHOULD)。拡張がRelying
Partyにパラメータを要求しない場合、Boolean型のクライアント引数を取り、trueで拡張が要求されたことを示す仕様とすべきです(SHOULD)。
クライアント処理のみに影響を与える拡張はオーセンティケーター拡張入力を指定する必要はありません。オーセンティケーター処理を含む拡張は、オーセンティケーター拡張入力がクライアント拡張入力からどう導出されるかを指定しなければならず(MUST)、
またCDDL型
AuthenticationExtensionsAuthenticatorInputs
および
AuthenticationExtensionsAuthenticatorOutputs
の拡張($$extensionInput、$$extensionOutputのグループソケット)にも、
拡張識別子
をキーとして追加すべきです。パラメータ不要(Boolean型でtrue)の拡張は
オーセンティケーター拡張入力も定数Boolean true(CBOR種別7,
値21)とすべきです(SHOULD)。
以下の例は、識別子
webauthnExample_foobar
を持つ拡張が、符号なし整数型オーセンティケーター拡張入力をとり、バイト列1つ以上の配列型オーセンティケーター拡張出力
を返すことを示します。
$$extensionInput //= ( webauthnExample_foobar : uint) $$extensionOutput //= ( webauthnExample_foobar : [ + bytes] )
一部のオーセンティケーターはBluetooth Low-EnergyやNFCのような低帯域リンクを使うため、拡張はできるだけ引数を小さく設計すべきです(SHOULD)。
9.4. クライアント拡張処理
拡張は、クレデンシャル作成またはアサーション生成時にクライアントへ追加の処理要件を定義してもよい(MAY)。本処理で 拡張のクライアント拡張入力が入力として使用される。 サポートする各クライアント拡張について、 クライアントはclientExtensions マップに 拡張識別子をキー、 拡張のクライアント拡張入力 を値として追加する。
同様に、クライアント拡張出力は
getClientExtensionResults()
の結果に辞書型で表現され、拡張識別子がキー、各拡張の
クライアント拡張出力値が値となる。
クライアント拡張入力と同様、
クライアント拡張出力もJSONで表現可能な値。
無視された拡張は値を返してはならない(MUST NOT)。
オーセンティケーター処理を要する拡張は、 クライアント拡張入力から CBORの オーセンティケーター拡張入力をどう導出するか、 CBORの オーセンティケーター拡張出力や 未署名拡張出力(使う場合)から クライアント拡張出力をどう得るか定義しなければならない(MUST)。
9.5. オーセンティケーター拡張処理
各処理済みオーセンティケーター拡張のCBOR オーセンティケーター拡張入力値は、 authenticatorMakeCredentialおよびauthenticatorGetAssertion 操作時のextensionsパラメータに含められる。このextensionsパラメータは CBORマップで、各キーは 拡張識別子、 対応値はその拡張の オーセンティケーター拡張入力。
同様に、拡張出力は拡張部にCBORのマップとして表現され、 オーセンティケーターデータの 拡張部は 各拡張のオーセンティケーター拡張出力を値とするCBORマップ(キーは拡張識別子)。
未署名拡張出力はオーセンティケーターデータと独立して管理され、 オーセンティケーターが同じ拡張識別子をキーとした別マップとして返す。このマップには未署名出力を使うオーセンティケーター拡張のみのエントリが含まれる。 未署名出力は、拡張がオーセンティケーターデータ自体に対し署名を出力する場合(署名がその構造自身を含めることは不可能なため)、あるいは一部の拡張出力をRelying Partyに送らせたくない場合に有用です。
Note: [FIDO-CTAP] では未署名拡張出力はunsignedExtensionOutputsというトップレベルCBORフィールドで
authenticatorMakeCredentialおよびauthenticatorGetAssertionから返されます。
各サポート拡張ごとに、オーセンティケーター拡張処理 ルールが オーセンティケーター拡張入力や 他の入力から オーセンティケーター拡張出力 および 未署名拡張出力(使う場合)を作る。 無視された拡張は値を返してはならない(MUST NOT)。
10. 定義済み拡張
本節とその子節では、IANA「WebAuthn Extension Identifiers」レジストリ[IANA-WebAuthn-Registries]([RFC8809])へ登録される追加の拡張セットを定義します。 これらは広範な相互運用性をターゲットとするユーザエージェントで実装可能です。
10.1. クライアント拡張
本節ではクライアント拡張のみを定義します。
10.1.1. FIDO AppID拡張(appid)
この拡張機能は、以前レガシーなFIDO U2F JavaScript API [FIDOU2FJavaScriptAPI] を使用して認証情報を登録した WebAuthn リライングパーティ が、アサーション を要求できるようにします。FIDO APIは リライングパーティ のための別の識別子 AppID [FIDO-APPID] を使用し、それらAPIで作成された認証情報はその識別子に スコープ されます。この拡張機能がない場合、それらを スコープ し直すには再登録が必要になります。RP ID にスコープさせるためです。
appid
拡張入力を設定することに加え、この拡張を使うには、リライングパーティ が追加の処理を行い、利用者が登録済みのU2F認証情報で 認証 できるようにする必要があります。
-
希望するU2F認証情報を
allowCredentialsオプション のget()メソッドにリストします。-
typeメンバーをpublic-keyに設定します。 -
idメンバーを希望する認証情報の該当U2Fキー・ハンドルに設定します。U2Fキー・ハンドルは通常 base64urlエンコーディング ですが、idで利用する際はバイナリ形式にデコードしなければなりません。
allowCredentialsにはWebAuthn credential ID とU2Fキー・ハンドルが混在しても構いません。 この拡張によりappidを指定したとしても、WebAuthnで登録した認証情報を使い、指定したRP IDにスコープされている場合には利用できます。 -
-
アサーションの検証時に、
rpIdHashが AppID のハッシュになっている場合があり、RP ID のハッシュとは限らない点に注意します。
この拡張はFIDO互換の認証情報を作成することはできません。そのため、WebAuthnで作成された認証情報はFIDO JavaScript APIと後方互換性がありません。
注意:appid
には、リライングパーティ
が過去にレガシーなFIDO APIで利用していたAppIDを指定してください。
これは、リライングパーティのWebAuthn RP ID をAppID形式に変換した結果と同じとは限りません。
例えば、以前使われていたAppIDが "https://accounts.example.com" の場合、現在のRP IDは "example.com" となることもあります。
- 拡張識別子
-
appid - 運用適用範囲
- クライアント拡張入力
-
FIDOのAppIDを指定するDOMString
partial dictionary AuthenticationExtensionsClientInputs {DOMString ; };appid partial dictionary AuthenticationExtensionsClientInputsJSON {DOMString ; };appid - クライアント拡張処理
-
-
facetId を、呼び出し元のオリジン を FIDOの呼び出しアプリケーションのFacetIDの決定 アルゴリズムに渡して得ます。
-
appId を拡張入力とします。
-
facetId と appId を FIDOの呼び出し元のFacetIDがAppIDに対して認可されているかの決定アルゴリズムに渡します。そのアルゴリズムが appId を却下した場合は "
SecurityError"DOMExceptionを返します。 -
allowCredentialDescriptorListの構築時に、 U2F認証器が認証情報が無効であることを示す場合(例:
SW_WRONG_DATAが返る)、クライアントはU2Fアプリケーションパラメータを appId のSHA-256ハッシュに設定してリトライしなければなりません。これで有効となる場合は、その認証情報を allowCredentialDescriptorList に含める必要があります。その場合、appId の値が authenticatorGetAssertion のrpIdパラメータの代わりになります。 -
output をブール値
falseにします。 -
assertionCreationDataの作成時に、 アサーション がU2F認証器で、U2Fアプリケーションパラメータが appId のSHA-256ハッシュで作成された場合は、outputを
trueに設定します。
-
注意: 実際には、いくつかの実装では 呼び出し元のFacetIDがAppIDに対して認可されているかの決定の アルゴリズムの4ステップ以降は実装されていません。 代わりに、3ステップ目のホスト比較が、同一サイト 上のホストを許容するよう緩和されています。
- クライアント拡張出力
-
output の値を返します。trueの場合、AppID が使われていたことになり、アサーションの検証時には リライングパーティ は
rpIdHashがAppIDのハッシュであると想定し、RP ID のハッシュではないことに注意します。partial dictionary AuthenticationExtensionsClientOutputs {boolean ; };appid partial dictionary AuthenticationExtensionsClientOutputsJSON {boolean ; };appid - 認証器拡張入力
-
なし
- 認証器拡張処理
-
なし
- 認証器拡張出力
-
なし
10.1.2. FIDO AppID除外拡張(appidExclude)
この登録拡張は、WebAuthn リライングパーティ が、レガシーな FIDO U2F JavaScript API [FIDOU2FJavaScriptAPI] で作成された特定の認証情報を含む認証器を除外できるようにします。
FIDO U2F JavaScript APIからの移行中、リライングパーティ はすでにレガシー認証情報を登録済みのユーザーを抱えている場合があります。appid拡張はサインインフローをスムーズに移行することを可能にしますが、登録フローを移行する際には、excludeCredentials フィールドの内容は WebAuthn の認証情報として扱われるため、レガシー認証情報を持つ認証器の除外には有効ではありません。この拡張は クライアントプラットフォーム に、excludeCredentials の内容を WebAuthn とレガシー FIDO の認証情報の両方として扱うよう指示します。なお、U2F キーハンドルは通常 base64url エンコーディング されていますが、excludeCredentials で利用する際はバイナリ形式にデコードしなければなりません。
- 拡張識別子
-
appidExclude - 運用適用範囲
- クライアント拡張入力
-
FIDO の AppID を指定する単一の DOMString
partial dictionary AuthenticationExtensionsClientInputs {DOMString ; };appidExclude partial dictionary AuthenticationExtensionsClientInputsJSON {DOMString ; };appidExclude - クライアント拡張処理
-
新しい認証情報を作成する際:
-
RP ID の決定直後に以下の手順を実行します。
-
facetId を、呼び出し元のオリジンをFIDO の呼び出しアプリケーションの FacetID の決定アルゴリズムに渡して得た結果とします。
-
appId を拡張入力
appidExcludeの値とします。 -
facetId と appId を FIDO の呼び出し元の FacetID が AppID に対して認可されているかの決定アルゴリズムに渡します。もし当該アルゴリズムが appId を却下した場合は、 "
SecurityError"DOMExceptionを返し、 新しい認証情報を作成アルゴリズムおよびこれらの手順を終了します。注意: 実際には、複数の実装で呼び出し元の FacetID が AppID に対して認可されているかの決定アルゴリズムの4ステップ目以降は実装されていません。代わりに3 ステップ目のホスト比較が、同一サイト上のホストを許容するよう緩和されます。
-
それ以外は通常通り処理を続行します。
-
-
authenticatorMakeCredential の呼び出し直前に以下の手順を実行します。
-
もし authenticator が U2F プロトコル [FIDO-U2F-Message-Formats] をサポートする場合は、各 認証情報ディスクリプタ C について excludeCredentialDescriptorList を反復します。
-
C が authenticator で U2F を用いて作成されたかどうか、authenticator に "five parts" を以下の値で設定した
U2F_AUTHENTICATEメッセージを送信して確認します。 -
もし authenticator が
message:error:test-of-user-presence-required(=成功)で応答した場合は、当該 authenticator の通常処理を中断し、プラットフォーム固有の方法で認証器が無効であることを示します。たとえばUIで表示したり、ユーザー同意 を authenticator から求めた上で、応答後にInvalidStateErrorを返した時と同じ扱いとします。ユーザー同意 の要求は、control byte を0x03("enforce-user-presence-and-sign") にしたU2F_AUTHENTICATEメッセージをもう一度送ればよく、応答は無視します。
-
-
その後は通常通り処理を続行します。
-
-
- クライアント拡張出力
-
拡張が有効だったことを リライングパーティ に示すため
trueの値を返します。partial dictionary AuthenticationExtensionsClientOutputs {boolean ; };appidExclude partial dictionary AuthenticationExtensionsClientOutputsJSON {boolean ; };appidExclude - 認証器拡張入力
-
なし
- 認証器拡張処理
-
なし
- 認証器拡張出力
-
なし
10.1.3. クレデンシャルプロパティ拡張(credProps)
このクライアントの登録拡張機能は、登録セレモニーの結果として公開鍵クレデンシャルソースが作成される際、クライアントが知っている特定のクレデンシャルプロパティをリクエストしたWebAuthn Relying Partyに報告することを容易にします。
現時点では、1つのクレデンシャルプロパティが定義されています。それは、クライアントサイド発見可能クレデンシャルプロパティです。
- 拡張機能識別子
-
credProps - 適用操作
- クライアント拡張機能入力
-
この拡張機能がRelying Partyにより要求されたことを示すBoolean値
trueです。partial dictionary AuthenticationExtensionsClientInputs {boolean ; };credProps partial dictionary AuthenticationExtensionsClientInputsJSON {boolean ; };credProps - クライアント拡張機能処理
-
rkを、invocationで使用されたrequireResidentKeyパラメータの値に設定します。 - クライアント拡張機能出力
-
Set
clientExtensionResults["を、invocationで使用されたrequireResidentKeyパラメータの値に設定します。credProps"]["rk"]dictionary {CredentialPropertiesOutput boolean rk ; };partial dictionary AuthenticationExtensionsClientOutputs {CredentialPropertiesOutput ; };credProps partial dictionary AuthenticationExtensionsClientOutputsJSON {CredentialPropertiesOutput ; };credProps rk, 型boolean-
このオプションのプロパティは、抽象的にはクライアントサイド検出可能クレデンシャルプロパティ またはレジデントキークレデンシャルプロパティ と呼ばれ、
PublicKeyCredentialが登録セレモニーによって返されるものがクライアントサイド検出可能クレデンシャルであるかを示すBoolean値です。rkがtrueの場合、そのクレデンシャルは検出可能クレデンシャルです。rkがfalseの場合、そのクレデンシャルはサーバーサイドクレデンシャルです。rkが存在しない場合、そのクレデンシャルが検出可能クレデンシャルかサーバーサイドクレデンシャルかは不明です。注: 一部の認証器はクライアントプラットフォームからリクエストされていなくても検出可能クレデンシャルを作成します。このため、クライアントプラットフォームは
rkプロパティをfalseで設定する保証ができず、省略せざるを得ない場合があります。Relying Parties はcredProps拡張機能がサポートされている場合、クライアントプラットフォームがrkプロパティをできる限り埋めるよう努めると考えるべきです。したがってrkが欠落している場合、その作成されたクレデンシャルはおそらく非検出可能クレデンシャルであることを意味します。
- 認証器拡張機能入力
-
なし
- 認証器拡張機能の処理
-
なし
- 認証器拡張機能出力
-
なし
10.1.4. 疑似乱数関数拡張(prf)
この クライアント の 登録拡張機能 および
認証拡張機能
は、Relying Party が、クレデンシャル に関連付けられた擬似乱数生成関数(PRF)からの出力を評価できるようにします。 この拡張機能が提供する PRF
は、任意の長さの BufferSource
を入力として受け取り、32 バイトの BufferSource
を出力します。
例として、PRF 出力を対称鍵としてユーザーデータを暗号化することが考えられます。こうして暗号化されたデータは、関連する クレデンシャル からアサーションを取得できない限りアクセスできません。以下の規定を用いて 1 回の アサーション 操作で 2 つの入力に対して PRF を評価することにより、アサーション時に新しいランダムな入力を選んで出力に基づいて再暗号化することで、暗号鍵を定期的にローテーションできます。評価入力が予測不能であれば、たとえ攻撃者が ユーザー検証 を満たし、認証器に時間限定のアクセスを持っていたとしても、正しい PRF 入力を知らなければ暗号鍵を知ることはできません。
この拡張機能は [FIDO-CTAP] の hmac-secret
拡張を基にモデル化されていますが、他の方法でも実装可能です。
hmac-secret は入力と出力をユーザーエージェントだけが処理できる方法で暗号化することを要求するため、また WebAuthn
による利用と基盤プラットフォームによる利用を分離するために、これは別個の クライアント拡張機能 となっています。
この分離は、与えられた PRF 入力をコンテキスト文字列とともにハッシュ化することで、任意の入力に対する PRF の評価を防ぐことで実現されています。
hmac-secret 拡張はクレデンシャルごとに 2 つの PRF を提供します:1 つは ユーザー検証 が行われるリクエストで使用されるもの、もう 1
つはそれ以外のリクエストで使用されるものです。この拡張はクレデンシャルごとに単一の PRF のみを公開し、hmac-secret 上に実装する場合、その PRF は ユーザー検証
が行われる場合に使用される方でなければなりません。必要ならばこれは UserVerificationRequirement
を上書きします。
この拡張機能は、認証器 が [FIDO-CTAP] を使用しない場合にも実装され得ます。 クライアントと 認証器 間のインターフェースや、認証器による PRF の構成は抽象的にしか規定されていません。
注意: hmac-secret の上に実装すると、通常は存在しない 認証器拡張出力 が発生します。
これらの出力は暗号化されており、Relying
Party によって使用できませんし、authenticator data が署名されているためクライアントから削除することもできません。
- 拡張機能識別子
-
prf - 操作の適用範囲
- クライアント拡張入力
-
dictionary {AuthenticationExtensionsPRFValues required BufferSource ;first BufferSource ; };second dictionary {AuthenticationExtensionsPRFValuesJSON required Base64URLString ;first Base64URLString ; };second dictionary {AuthenticationExtensionsPRFInputs AuthenticationExtensionsPRFValues eval ;record <DOMString ,AuthenticationExtensionsPRFValues >evalByCredential ; };dictionary {AuthenticationExtensionsPRFInputsJSON AuthenticationExtensionsPRFValuesJSON ;eval record <DOMString ,AuthenticationExtensionsPRFValuesJSON >; };evalByCredential partial dictionary AuthenticationExtensionsClientInputs {AuthenticationExtensionsPRFInputs ; };prf partial dictionary AuthenticationExtensionsClientInputsJSON {AuthenticationExtensionsPRFInputsJSON ; };prf eval, の型 AuthenticationExtensionsPRFValues-
PRF を評価するための 1 個または 2 個の入力。すべての 認証器 がクレデンシャル作成時に PRF の評価をサポートしているわけではないため、出力が提供されない場合があります。その場合は出力を取得するために アサーション が必要です。
evalByCredential, の型 record<DOMString, AuthenticationExtensionsPRFValues>-
base64url エンコードされた クレデンシャル ID を、当該クレデンシャルの評価に使う PRF 入力へ対応付けるレコード。これは
allowCredentialsが空でない場合の アサーション 時にのみ適用されます。
- クライアント拡張処理(登録)
-
-
evalByCredentialが存在する場合は、名前が “NotSupportedError” のDOMExceptionを返します。 -
evalが存在する場合: -
認証器が CTAP2 の
hmac-secret拡張をサポートしている場合([FIDO-CTAP]):-
認証器拡張入力で
hmac-secretをtrueに設定します。 -
もし salt1 が定義されており、将来の [FIDO-CTAP] の拡張が作成時の PRF 評価を許可する場合は、salt1 と(定義されていれば)salt2 の値を用いて
hmac-secretの入力を構成します。 -
enabledを認証器拡張出力のhmac-secretの値に設定します。もし存在しなければenabledをfalseに設定します。 -
resultsを、復号された PRF 結果(ある場合)に設定します。
-
-
認証器が CTAP2
hmac-secret拡張をサポートしていないが、下記の抽象的な認証器処理と互換な別の実装をサポートする場合:
-
- クライアント拡張処理(認証)
-
-
evalByCredentialが空でないがallowCredentialsが空である場合は、名前が “NotSupportedError” のDOMExceptionを返します。 -
evalByCredentialの任意の キー が空文字列である、または有効な base64url エンコーディング でない、あるいは base64url デコード後にidがallowCredentialsの要素のいずれかと一致しない場合は、名前が “SyntaxError” のDOMExceptionを返します。 -
prf拡張出力を空の辞書として初期化します。 -
ev を null にし、適用可能な PRF 入力を見つけようとします:
-
もし
evalByCredentialが存在し、かつ contains が、返されるクレデンシャル ID の base64url エンコーディング と一致する エントリ の キー を持つ場合は、そのエントリの 値 を ev に設定します。
-
-
もし ev が null でなければ:
-
salt1 を
SHA-256(UTF8Encode("WebAuthn PRF") || 0x00 || ev.の値とします。first) -
もし
ev.が存在するなら、salt2 をsecondSHA-256(UTF8Encode("WebAuthn PRF") || 0x00 || ev.の値とします。second) -
もし認証器が CTAP2 の
hmac-secret拡張をサポートしている場合([FIDO-CTAP]):-
salt1 および(設定されていれば)salt2 の値を同名のパラメータとして用い、認証器に
hmac-secret拡張を送信します。 -
拡張結果を復号し、もしあれば PRF 結果を
resultsに設定します。
-
-
認証器が CTAP2
hmac-secret拡張をサポートしておらず、下記の抽象的認証器処理と互換な別実装をサポートする場合:-
不特定の機構を用いて salt1 と(定義されていれば)salt2 をその順序で認証器に PRF 入力として伝えます。
-
不特定の機構を用いて、認証器から PRF 出力を
AuthenticationExtensionsPRFValues型の値 results として受け取り、に results を設定します。results
-
-
-
- 認証器拡張入力/出力
-
この拡張 は、認証器実装に対して抽象化されています。認証器との通信においては [FIDO-CTAP] の
hmac-secret拡張を利用するか、あるいはクライアントと認証器間の通信のための未指定のインターフェースを用いることができます。したがって、入力および出力に対する CBOR インターフェースはここでは指定されません。 - 認証器拡張処理
-
認証器 が [FIDO-CTAP] の
hmac-secret拡張をサポートする場合、その認証器は当該拡張で定義された認証器処理を実装します。認証器 が [FIDO-CTAP] の
hmac-secret拡張をサポートしていない場合でも、代わりに以下の抽象的手順を実装してもかまいません:-
現在の クレデンシャル に関連付けられている擬似乱数生成関数を PRF とする、または未初期化なら関連付けを初期化します:
PRF を、出力が正確に 32 バイトである擬似乱数生成関数とします。これは少なくとも 2^256 個の関数から一様にランダムに選ばれるべきです。PRF の選択は ユーザー検証 の状態に依存してはなりません。選択された PRF はこの拡張の実装以外の目的で使用すべきではありません。選択した PRF はクレデンシャルのライフタイムの間、そのクレデンシャルに関連付けられます。
-
不特定の機構を用いて、クライアントから順に PRF 入力 salt1 および(オプションで)salt2 を受け取ります。何も受け取られない場合は salt1 と salt2 は未定義とします。
-
もし salt1 が定義されている場合:
-
results を、与えられた入力での PRF の評価を含む
AuthenticationExtensionsPRFValues構造とします: -
不特定の機構を用いて results をクライアントに PRF 出力として伝えます。
-
-
- クライアント拡張出力
-
dictionary {AuthenticationExtensionsPRFOutputs boolean enabled ;AuthenticationExtensionsPRFValues results ; };dictionary {AuthenticationExtensionsPRFOutputsJSON boolean ;enabled AuthenticationExtensionsPRFValuesJSON ; };results partial dictionary AuthenticationExtensionsClientOutputs {AuthenticationExtensionsPRFOutputs ; };prf partial dictionary AuthenticationExtensionsClientOutputsJSON {AuthenticationExtensionsPRFOutputsJSON ; };prf enabled, の型 boolean-
作成されたクレデンシャルで PRF が利用可能である場合に限り
trueになります。これは 登録 の際にのみ報告され、認証 の場合には存在しません。 results, の型 AuthenticationExtensionsPRFValues-
evalまたはevalByCredentialで指定された入力に対して PRF を評価した結果です。出力は 登録 時には利用できない場合があります;詳細はevalの注記を参照してください。用途によっては、例えば PRF 出力をクライアント側のみで使用する暗号鍵の導出に使う場合など、
results出力を省略する必要があるかもしれません(例えば PublicKeyCredential をリモートサーバーに送信する場合など、§ 7 WebAuthn Relying Party Operations の手続きを行うとき)。特にRegistrationResponseJSONおよびAuthenticationResponseJSONがPublicKeyCredential.toJSON()によって返される場合、もし存在すればこのresults出力が含まれることに注意してください。
10.1.5. ラージブロブストレージ拡張(largeBlob)
この クライアント の 登録拡張機能 および 認証拡張機能 は、Relying Party がクレデンシャルに関連付けられた不透明なデータを保存できるようにします。認証器 は少量のデータしか保存できず、ほとんどの Relying Parties はユーザーの状態を任意の量で保存できるオンラインサービスであるため、これは特定のケースでのみ有用です。たとえば、Relying Party は集中型の認証サービスを運用する代わりに証明書を発行したい場合があります。
Note: Relying Parties は、不透明なデータが容量の限られたデバイスに書き込まれる際に圧縮されると仮定できるため、自分で圧縮する必要はありません。
証明書システムはクレデンシャルの公開鍵に対して署名する必要があり、その公開鍵は作成後にしか利用できないため、この拡張機能は 登録 コンテキストでブロブを書き込む能力を追加しません。しかし、将来 認証拡張機能 を使用したい場合、Relying Parties はクレデンシャルを作成する際に 登録拡張機能 を利用するべきです。
証明書は典型的な認証器の保存能力に対して大きいため、ユーザーエージェントはこの限られたリソースの割り当てをユーザーに適切に案内し悪用を防ぐために、どのような表示や確認が適切かを検討するべきです。
Note: 相互運用のため、[FIDO-CTAP] を使用して認証器に大きなブロブを保存するユーザーエージェントは、その仕様で詳述されている 大きな per-credential ブロブの保存 に関する規定を使用することが期待されます。
Note: ローミング認証器
は、クロスプラットフォームのトランスポートプロトコルとして [FIDO-CTAP] を使用する場合、この Large Blob 拡張機能を discoverable credentials
のみに対してサポートし、そうでない場合はエラーを返すことがあります。そのときは
が authenticatorSelection.residentKeypreferred
または required
に設定されている必要があるかもしれません。しかし、認証器
の中には [FIDO-CTAP] を利用しないものもあり、それらはこの拡張を必ずしも discoverable
credentials に限定しない可能性があります。
- Extension identifier
-
largeBlob - Operation applicability
- Client extension input
-
partial dictionary AuthenticationExtensionsClientInputs {AuthenticationExtensionsLargeBlobInputs ; };largeBlob partial dictionary AuthenticationExtensionsClientInputsJSON {AuthenticationExtensionsLargeBlobInputsJSON ; };largeBlob enum {LargeBlobSupport ,"required" , };"preferred" dictionary {AuthenticationExtensionsLargeBlobInputs DOMString support ;boolean read ;BufferSource write ; };dictionary {AuthenticationExtensionsLargeBlobInputsJSON DOMString ;support boolean ;read Base64URLString ; };write support, of type DOMString-
DOMString で、
LargeBlobSupportの値のいずれかを取ります。(§ 2.1.1 Enumerations as DOMString types を参照。)これは 登録 時のみ有効です。 read, of type boolean-
このブール値は、Relying Party が、主張されたクレデンシャルに関連付けて以前に書き込まれたブロブを取得したいことを示します。これは 認証 時のみ有効です。
write, of type BufferSource-
これは Relying Party が既存のクレデンシャルとともに保存したい不透明なバイト列です。これは 認証 時のみ有効です。
- Client extension processing (registration)
-
-
-
DOMExceptionを返します。その name は “NotSupportedError” です。
-
-
もし
supportが存在し、その値がrequiredであるなら:-
supportedをtrueに設定します。Note: これは大きなブロブを格納できる認証器が利用可能になることを見越したものです。これは
[[Create]](origin, options, sameOriginWithAncestors)の step 12 の拡張処理中に発生します。満足のいく認証器が利用可能にならなければ、AuthenticationExtensionsLargeBlobOutputsは破棄されます。 -
もし 候補認証器 が利用可能になった場合(
[[Create]](origin, options, sameOriginWithAncestors)の step 22)、 その候補認証器が大きなブロブを格納できない場合は、どのoptionsの評価より先にその候補認証器を無視(i.e. continue)します。
-
-
- Client extension processing (authentication)
-
-
もし
supportが存在するなら:-
DOMExceptionを返します。その name は “NotSupportedError” です。
-
-
-
DOMExceptionを返します。その name は “NotSupportedError” です。
-
-
もし
readが存在し値がtrueであるなら:-
クライアント拡張出力 を初期化します:
largeBlob。 -
もし任意の認証器が成功を示すなら(
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)内で)、 主張されたクレデンシャルに関連付けられた largeBlob データの読み取りを試みます。 -
もし成功したら、
blobに結果を設定します。Note: 読み取りに成功しなかった場合、
largeBlobはAuthenticationExtensionsClientOutputsに存在しますが、blobメンバーは存在しません。
-
-
もし
writeが存在するなら:-
もし
allowCredentialsが正確に 1 要素を含んでいないなら:-
DOMExceptionを返します。その name は “NotSupportedError” です。
-
-
もし assertion 操作が成功したら、指定されたクレデンシャルに関連付けて、
writeの内容を認証器に保存することを試みます。 -
成功した場合は
writtenをtrueに、そうでなければfalseに設定します。
-
-
- Client extension output
-
partial dictionary AuthenticationExtensionsClientOutputs {AuthenticationExtensionsLargeBlobOutputs ; };largeBlob partial dictionary AuthenticationExtensionsClientOutputsJSON {AuthenticationExtensionsLargeBlobOutputsJSON ; };largeBlob dictionary {AuthenticationExtensionsLargeBlobOutputs boolean supported ;ArrayBuffer blob ;boolean written ; };dictionary {AuthenticationExtensionsLargeBlobOutputsJSON boolean ;supported Base64URLString ;blob boolean ; };written - Authenticator extension processing
-
この拡張機能 は、ユーザーエージェントに対して大きなブロブを認証器に保存または認証器から取得させることを指示します。したがって、Relying Parties に対する直接的な認証器とのやり取りはここでは規定しません。
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
-
仮想認証器 を一意に識別する、[RFC3986] の付録Aで定義された
unreserved生産の文字を最大48文字まで使って生成される非nullの文字列。 - protocol
-
仮想認証器 が話すプロトコル。
"ctap1/u2f"、"ctap2"、または"ctap2_1"のいずれか。 [FIDO-CTAP] 参照。 - transport
-
シミュレートされる
AuthenticatorTransport。 transport がinternalに設定されている場合、認証器は プラットフォームアタッチメント をシミュレートします。そうでない場合は、クロスプラットフォームアタッチメント をシミュレートします。 - hasResidentKey
-
trueに設定されている場合、認証器は クライアントサイド検出可能クレデンシャル をサポートします。 - hasUserVerification
-
trueに設定されている場合、この認証器は ユーザー検証 をサポートします。 - isUserConsenting
-
すべての ユーザー同意 および 認可ジェスチャ の結果、さらに ユーザー在席テスト も決定します。 仮想認証器 上で行われます。
trueに設定されている場合、 ユーザー同意 は常に認可されます。falseの場合は認可されません。 - isUserVerified
-
仮想認証器 で実行される ユーザー検証 の結果を決定します。
trueに設定されている場合、ユーザー検証 は常に成功します。falseなら失敗します。Note: hasUserVerification が
falseならこのプロパティは効果がありません。 - extensions
-
仮想認証器 がサポートする 拡張機能識別子 の文字列配列です。
仮想認証器 は extensions 配列内のすべての 認証器拡張 をサポートしなければなりません。 また、extensions 配列に存在しない 認証器拡張 をサポートしてはなりません。
- defaultBackupEligibility
-
新しく作成されたすべての 公開鍵クレデンシャルソース に対する クレデンシャルプロパティ、バックアップ適格性 のデフォルト状態を決定します。 この値は、仮想認証器 を使った authenticatorMakeCredential 操作時の authenticator data の BE フラグ に反映されなければなりません。
- defaultBackupState
-
新しく作成されたすべての 公開鍵クレデンシャルソース に対する クレデンシャルプロパティ、バックアップ状態 のデフォルト状態を決定します。 この値は、仮想認証器 を使った authenticatorMakeCredential 操作時の authenticator data の BS フラグ に反映されなければなりません。
11.3. バーチャル認証器の追加
仮想認証器の追加 WebDriver 拡張コマンドは、ソフトウェアの仮想認証器を作成します。定義は次の通りです:
| HTTPメソッド | URIテンプレート |
|---|---|
| POST | /session/{session id}/webauthn/authenticator
|
認証器設定は、Object型の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配列 | 拡張識別子を含む配列 | 空配列 |
| defaultBackupEligibility | boolean | true, false
| false
|
| defaultBackupState | boolean | true, false
| false
|
リモートエンドステップは次の通りです:
-
parameters が JSON Object でない場合、WebDriverエラー(WebDriverエラーコード invalid argument)を返す。
Note: parametersは認証器設定オブジェクトです。
-
authenticator を新しい仮想認証器として生成する。
-
parameters内のすべて列挙可能な自分自身のプロパティについて繰り返す:
-
プロパティ名をkeyとする。
-
parametersから名前keyのプロパティ取得の結果をvalueとする。
-
認証器設定にkeyに一致する
keyがない場合、WebDriverエラー( WebDriverエラーコード invalid argument)を返す。 -
valueがそのkeyに対し
valid valuesのいずれでもない場合、WebDriverエラー(WebDriverエラーコード invalid argument)を返す。 -
プロパティ設定で、authenticator上のkeyにvalueを設定する。
-
-
認証器設定のデフォルト値が定義されている全プロパティについて:
-
authenticatorのプロパティとして
keyが未定義の場合は、プロパティ設定でdefaultをセットする。
-
-
認証器設定の全プロパティについて:
-
authenticatorのプロパティとして
keyが未定義なら、WebDriverエラー(WebDriverエラーコード invalid argument)を返す。
-
-
authenticator.extensionsの各extensionについて:
-
extensionが当該エンドポイントノードWebAuthn WebDriver実装でサポートされていない拡張識別子なら、WebDriverエラー(WebDriverエラーコード unsupported operation)を返す。
-
-
有効で一意なauthenticatorIdを生成する。
-
プロパティ設定でauthenticatorの
authenticatorIdにauthenticatorIdをセットする。 -
authenticatorを仮想認証器データベースに保存する。
-
成功として、データauthenticatorIdを返す。
11.4. 仮想認証器の削除
仮想認証器の削除 WebDriver 拡張コマンドは、既に作成された仮想認証器を削除します。 定義は次の通りです:
| HTTPメソッド | URIテンプレート |
|---|---|
| DELETE | /session/{session id}/webauthn/authenticator/{authenticatorId}
|
リモートエンドステップは次の通りです:
-
authenticatorId が仮想認証器として仮想認証器データベースに保存されていない場合、WebDriverエラー(WebDriverエラーコード invalid argument)を返す。
-
authenticatorIdで識別される仮想認証器を仮想認証器データベースから削除する。
-
成功を返す。
11.5. クレデンシャルの追加
クレデンシャルの追加 WebDriver 拡張コマンドは、既存の仮想認証器に公開鍵クレデンシャルソース をインジェクトします。定義は次の通りです:
| HTTPメソッド | URIテンプレート |
|---|---|
| POST | /session/{session id}/webauthn/authenticator/{authenticatorId}/credential
|
クレデンシャルパラメータは、Object 型の JSON で、リモートエンドステップ にparametersとして渡されます。次のkeyとvalueのペアを含みます:
| キー | 説明 | 値の型 |
|---|---|---|
| credentialId | クレデンシャルIDをBase64url エンコードしたもの。 | string |
| isResidentCredential |
true の場合、クライアントサイド検出可能クレデンシャルを作成。falseの場合はサーバーサイドクレデンシャル
となる。
| boolean |
| rpId | クレデンシャルがスコープされるRelying Party ID。 | string |
| privateKey | プライベートキー を一つ含む非対称鍵パッケージ。[RFC5958] に準拠し、Base64url エンコードでエンコード。 | string |
| userHandle | userHandle。Base64url エンコード。未定義の場合もある。 | string |
| signCount | 署名カウンターの初期値。公開鍵クレデンシャルソース に関連。 | number |
| largeBlob | 大きな per-credential ブロブ。公開鍵クレデンシャルソースに関連し、Base64url エンコードでエンコード。未定義の場合もある。 | string |
| backupEligibility | バックアップ適格性のシミュレーション値。未設定時は仮想認証器のdefaultBackupEligibilityを使う。 バックアップ適格性はBE authenticator dataのフラグに反映されること。 | boolean |
| backupState | バックアップ状態のシミュレーション値。未設定時は仮想認証器のdefaultBackupStateを使う。 バックアップ状態はBS authenticator data のフラグに反映されること。 | boolean |
| userName |
userの
name
。未設定の場合、空文字列となる。
| string |
| userDisplayName |
userの
displayName
。未設定の場合、空文字列となる。
| string |
リモートエンドステップは次の通りです:
-
parameters が JSON Object でない場合、WebDriverエラー(WebDriverエラーコード invalid argument)を返す。
Note: 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秘密鍵([RFC5958]に準拠)でなければ、WebDriverエラー(WebDriverエラーコード invalid argument)を返す。
-
parametersのuserHandleプロパティが定義されている場合:
-
parametersのuserHandleプロパティに対しBase64urlデコードした結果をuserHandleとする。
-
userHandleが失敗なら、WebDriverエラー(WebDriverエラーコード invalid argument)を返す。
-
-
そうでない場合:
-
isResidentCredentialが
trueの場合、WebDriverエラー(WebDriverエラーコード invalid argument)を返す。 -
userHandleに
nullを代入する。
-
-
authenticatorIdが仮想認証器として仮想認証器データベースに保存されていない場合、WebDriverエラー(WebDriverエラーコード invalid argument)を返す。
-
authenticatorIdに対応する仮想認証器をauthenticatorとする。
-
isResidentCredentialが
trueでauthenticatorのhasResidentKeyプロパティがfalseの場合、WebDriverエラー(WebDriverエラーコード invalid argument)を返す。 -
authenticatorがlargeBlob拡張機能をサポートしていて、parametersのlargeBlobが定義されている場合:
-
parametersのlargeBlobプロパティに対しBase64urlデコードした結果をlargeBlobとする。
-
largeBlobが失敗なら、WebDriverエラー(WebDriverエラーコード invalid argument)を返す。
-
-
そうでない場合:
-
largeBlobに
nullを代入する。
-
-
backupEligibilityにparametersのbackupEligibilityプロパティを代入。
-
backupEligibilityが未定義なら、authenticatorのdefaultBackupEligibilityの値を使用。
-
backupStateにparametersのbackupStateプロパティを代入。
-
backupStateが未定義なら、authenticatorのdefaultBackupStateの値を使用。
-
userNameにparametersのuserNameプロパティを代入。
-
userNameが未定義の場合は空文字列を使用。
-
userDisplayNameにparametersのuserDisplayNameプロパティを代入。
-
userDisplayNameが未定義の場合は空文字列を使用。
-
credentialを新規に作成(isResidentCredentialが
trueならクライアントサイド検出可能公開鍵クレデンシャルソース、それ以外はサーバーサイド公開鍵クレデンシャルソース)し、各値は:- type
- id
-
credentialId
- privateKey
-
privateKey
- rpId
-
rpId
- userHandle
-
userHandle
- otherUI
-
userName と userDisplayName で構成。
-
credentialのバックアップ適格性 クレデンシャルプロパティにbackupEligibilityをセット。
-
credentialのバックアップ状態 クレデンシャルプロパティにbackupStateをセット。
-
credentialに署名カウンター counter を関連付け、初期値はparametersのsignCountまたは
0。 -
largeBlobが
nullでない場合、大きな per-credential ブロブをcredentialにセットする。 -
credentialとcounterをauthenticatorのDBに保存。
-
成功を返す。
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
|
Set Credential Properties Parameters は、JSON の Object であり、リモートエンドステップ に parameters として渡されます。 次の key と value のペアを含みます:
| キー | 説明 | 値の型 |
|---|---|---|
| backupEligibility | バックアップ有資格(クレデンシャルプロパティ)。 | boolean |
| backupState | バックアップ状態 (クレデンシャルプロパティ)。 | boolean |
リモートエンドステップは次の通りです:
-
parameters が JSON の Object でない場合、WebDriver エラー(WebDriver エラーコード invalid argument)を返す。
Note: parameters は Set Credential Properties Parameters オブジェクトです。
-
authenticatorId が 仮想認証器 として Virtual Authenticator Database に保存されていない場合、WebDriver エラー(WebDriver エラーコード invalid argument)を返す。
-
credential を credentialId で一致する authenticator が管理する 公開鍵クレデンシャルソース とする。
-
credential が空の場合、WebDriver エラー (WebDriver エラーコード invalid argument)を返す。
-
backupEligibility に parameters の backupEligibility プロパティを代入。
-
backupEligibility が定義されていれば、credential の backup eligibility クレデンシャルプロパティを backupEligibility の値に設定する。
Note: 通常、backupEligibility プロパティは 公開鍵クレデンシャルソース に対して永続的です。 Set Credential Properties はテストやデバッグ目的でこれを変更できるようにします。
-
backupState に parameters の backupState プロパティを代入。
-
backupState が定義されていれば、credential の backup state クレデンシャルプロパティを backupState の値に設定する。
-
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 定義された拡張 セクションで新しく定義された、以下にリストされた 拡張識別子 の値を、[RFC8809] によって確立されたIANA「WebAuthn Extension Identifiers」レジストリ [IANA-WebAuthn-Registries] に登録します。
-
WebAuthn Extension Identifier: appidExclude
-
Description: この登録拡張機能により、WebAuthn Relying Parties は、従来のFIDO U2F JavaScript API [FIDOU2FJavaScriptAPI] を使用して作成された特定の認証情報を含む認証器を除外できます。
-
Specification Document: この仕様書のセクション § 10.1.2 FIDO AppID Exclusion Extension (appidExclude)
-
WebAuthn Extension Identifier: credProps
-
Description: このクライアントの登録拡張機能 は、クライアントによって決定された、新しく作成された 認証情報 のプロパティを、呼び出し元の WebAuthn Relying Party の ウェブアプリケーション に報告できるようにします。
-
Specification Document: この仕様書のセクション § 10.1.3 Credential Properties Extension (credProps)
-
WebAuthn Extension Identifier: largeBlob
-
Description: このクライアントの登録拡張機能 および 認証拡張機能 は、Relying Party が認証情報に関連付けられた不透明なデータを保存できるようにします。
-
Specification Document: この仕様書のセクション § 10.1.5 Large blob storage extension (largeBlob)
12.5. Well-Known URI登録
このセクションでは、以下のwell-known URIをIANA「Well-Known URIs」レジストリ [IANA-Well-Known-URIs] に登録します。
-
URI Suffix:
webauthn -
Reference: この仕様書のセクション § 5.11.1 Validating Related Origins
-
Status: permanent
-
Change Controller: W3C Web Authentication Working Group (public-webauthn@w3.org)
-
Related Information: (なし)
13. セキュリティ考慮事項
この仕様は、Web APIと暗号化されたピアエンティティ認証プロトコルを定義しています。 Web Authentication APIにより、Web開発者(いわゆる「作成者」)は、登録および認証のセレモニーにおいてWeb Authenticationプロトコルを利用できるようになります。 Web Authenticationプロトコルのエンドポイントを構成するエンティティは、ユーザー制御されたWebAuthn Authenticatorsと、WebAuthn Relying PartyのウェブアプリケーションをホストするRelying Partyの計算環境です。 このモデルでは、ユーザーエージェントとWebAuthn Clientが一体となって、認証器とRelying Partiesの間の中間者となります。 さらに、認証器 は、その出所についてアテステーション(証明)を行うことができます。
現時点では、この仕様には詳細なセキュリティ上の考慮事項は含まれていません。しかし、[FIDOSecRef] ドキュメントは、この仕様全体に適用可能なセキュリティ分析を提供しています。 また、[FIDOAuthnrSecReqs] ドキュメントスイートは、認証器のセキュリティ特性に関する有用な情報を提供しています。
以下のサブセクションは、現在のWeb Authenticationに固有のセキュリティ上の考慮事項から構成されています。 これらは対象別に分割されています。 一般的なセキュリティ上の考慮事項はこのセクションの直接のサブセクションですが、認証器、クライアント、およびRelying Partyの実装者向けのセキュリティ上の考慮事項は、それぞれのサブセクションにグループ化されています。
13.1. Credential IDの未署名
認証アサーションに付随するcredential IDは署名されていません。 これは問題ではありません。なぜなら、認証器が誤ったcredential IDを返した場合や、攻撃者がcredential IDを傍受して改ざんした場合に起こることは、WebAuthn Relying Partyが、返された署名付きauthenticator data (別名、アサーション)を検証するための正しいcredential public keyを参照できないだけであり、したがってインタラクションはエラーで終了するからです。
13.2. クライアントと認証器の物理的近接性
WebAuthnの認証器モデルでは、一般にローミング認証器 はクライアントと物理的に近接しており、直接通信すると仮定されています。 この構成には重要な利点がいくつかあります。
クライアントと認証器 の間の物理的な近接性の約束は、所持物 認証ファクターの重要な強みです。 たとえば、ローミング認証器がUSBまたはBluetooth経由でのみ通信できる場合、 これらのトランスポートの限られた範囲により、悪意のあるアクターが認証器と対話するには物理的にその範囲内にいる必要があります。 これは、リモートから呼び出すことができる認証器には必ずしも当てはまりません — 認証器がユーザーの存在 を検証したとしても、ユーザーはリモートで開始された悪意のあるリクエストを許可するように騙される可能性があります。
クライアントと認証器 の間の直接通信は、クライアントが認証情報のスコープ制限を適用できることを意味します。 対照的に、クライアントと認証器の間の通信が第三者によって仲介される場合、 クライアントは、スコープ制限の適用と認証器へのアクセス制御を第三者に委ねる必要があります。 いずれかを実行しない場合、悪意のあるRelying Party が他のRelying Parties向けの有効な認証アサーションを受け取ったり、 悪意のあるユーザーが他のユーザー向けの認証アサーションにアクセスしたりする結果になる可能性があります。
認証器がクライアントの物理的に近くにある必要がない、またはクライアントと認証器が直接通信しないソリューションを設計する場合、 設計者は、これがスコープ制限の適用と、認証器の所持物 認証ファクターとしての強度にどのように影響するかを考慮する必要があります(SHOULD)。
13.3. 認証器のセキュリティに関する考慮事項
13.3.1. アテステーション証明書階層
アテステーション証明書には3層階層(Attestation Root、Attestation Issuing CA、Attestation Certificate)を使用することが推奨されます(RECOMMENDED)。また、各WebAuthn Authenticatorデバイスライン(つまりモデル)ごとに、認証器モデルの特定のバージョンに関する問題の分離を容易にするために、 発行CAを分けることも推奨されます。
アテステーションルート証明書が単一のWebAuthn Authenticatorデバイス ライン(つまりAAGUID)専用でない場合、authenticator dataに対して検証できるように、アテステーション証明書自体にAAGUIDを指定する必要があります(SHOULD)。
13.3.2. アテステーション証明書およびアテステーション証明書CAの侵害
アテステーション証明書の発行に使用される中間CAまたはルートCAが侵害された場合でも、WebAuthn Authenticator のアテステーションキー ペアは安全ですが、その証明書は信頼できなくなります。WebAuthn Authenticator メーカーは、認証器モデルのアテステーション公開鍵を記録している場合、新しい中間CAまたは新しいルートCAからこれらのキーの新しいアテステーション証明書を発行できます。ルートCAが変更された場合、WebAuthn Relying Partiesは、 それに応じて信頼するルート証明書を更新する必要があります(MUST)。
WebAuthn Authenticatorのアテステーション証明書は、その秘密鍵が侵害された場合、発行CAによって失効させられる必要があります(MUST)。WebAuthn Authenticatorメーカーは、漏洩がファームウェアの欠陥によるものである場合、ファームウェアアップデートを出荷し、新しいアテステーション秘密鍵 と証明書を既に製造されたWebAuthn Authenticatorsに注入する必要がある場合があります。(これが発生するプロセスは、この仕様の範囲外です。)WebAuthn Authenticatorメーカーがこの機能を持っていない場合、Relying Parties が影響を受けたWebAuthn Authenticatorsからのさらなるアテステーションステートメントを信頼できない可能性があります。
§ 13.4.5 Revoked Attestation Certificatesの、Relying Partiesに関する関連するセキュリティ上の考慮事項も参照してください。
13.4. Relying Partiesのセキュリティに関する考慮事項
13.4.1. WebAuthn Relying Partiesのセキュリティ上の利点
この仕様によってWebAuthn Relying Partiesに提供される主な利点は次のとおりです。
-
ユーザーとアカウントは、広く互換性があり、使いやすい多要素認証を使用して保護できます。
-
Relying Partyは、利用者へauthenticatorハードウェアを準備する必要はありません。代わりに、各利用者は独立して適合するauthenticatorを入手し、同じauthenticatorを複数のRelying Partiesで利用できます。 Relying Partyはオプションで、 authenticatorのセキュリティ特性に関する要件を、attestation statementsを確認することで適用できます。 これらはauthenticatorsから返却されます。
-
認証セレモニーは、中間者攻撃に対して耐性があります。 登録セレモニーについては、以下の§ 13.4.4 Attestation Limitationsを参照してください。
-
Relying Partyは、 コードをほとんど、あるいは全く変更せずに、PIN、生体認証、および将来の手法など、複数のタイプのユーザー検証を自動的にサポートでき、 各ユーザーが認証器の選択を通じて使用するものを決定できるようにすることができます。
-
Relying Party は、上記の利点を得るために追加のシークレットを保存する必要はありません。
Conformanceセクションで述べたように、Relying Partyは、上記のすべてのセキュリティ上の利点を得るために、§ 7 WebAuthn Relying Party Operationsで説明されているように動作する必要があります(MUST)。ただし、これから少し外れる1つの注目すべきユースケースについては、以下の§ 13.4.4 Attestation Limitationsで説明します。
13.4.2. 埋め込み使用における可視性の考慮事項
§ 5.10 Using Web Authentication within iframe elementsで説明されているように、
iframe内などの埋め込みコンテキストでのWebAuthnの単純な使用は、
ユーザーを「UI
Redressing」攻撃(「Clickjacking」とも呼ばれます)に対して脆弱にする可能性があります。これは、攻撃者がRelying
Partyの意図したUIの上に独自のUIを重ね、ユーザーを騙してRelying
Partyで意図しないアクションを実行させようとするものです。たとえば、これらの手法を使用して、攻撃者はユーザーを騙して商品を購入させたり、お金を送金させたりする可能性があります。
WebAuthn固有のUIは通常クライアントプラットフォームによって処理されるため、UI
Redressingに対して脆弱ではありませんが、WebAuthnを使用する埋め込みコンテンツを持つRelying
Partyにとって、コンテンツのUIがユーザーに表示されていることを確認することが重要である可能性があります。そのための新興手段は、実験的なIntersection Observer v2の
isVisible属性のステータスを観察することです。たとえば、埋め込みコンテキストで実行されているRelying
Partyのスクリプトは、isVisbleがfalseに設定されていることを検出した場合、ポップアップウィンドウで事前に読み込まれることで、コンテンツの遮断を回避できます。
13.4.3. 暗号学的チャレンジ
暗号化プロトコルとして、Web Authenticationはリプレイ攻撃を回避するためにランダム化されたチャレンジに依存しています。したがって、PublicKeyCredentialCreationOptions.challenge
および PublicKeyCredentialRequestOptions.challenge
の値は、Relying Partiesによって、
それらが信頼する環境(サーバーサイドなど)でランダムに生成される必要があり(MUST)、クライアントの応答で返されたchallenge
値は生成されたものと一致している必要があります(MUST)。これは、クライアントの動作に依存しない方法で行う必要があります(SHOULD)。たとえば、Relying
Partyは、操作が完了するまでチャレンジを一時的に保存する必要があります(SHOULD)。不一致を許容すると、プロトコルのセキュリティが損なわれる可能性があります。
チャレンジの有効期間は、WebAuthnセレモニータイムアウトの推奨範囲とデフォルトの上限に類似した期間である必要があります(SHOULD)。
リプレイ攻撃を防ぐために、チャレンジには推測が不可能な十分なエントロピーが含まれている必要があります(MUST)。したがって、チャレンジは少なくとも16バイトの長さである必要があります(SHOULD)。
13.4.4. アテステーションの制限
このセクションは規定的ではありません。
新しい認証情報を登録するとき、存在する場合、アテステーションステートメントは、WebAuthn Relying Partyが様々な認証器の品質について保証を導き出すことを可能にする場合があります。たとえば、認証器のモデルや、認証情報秘密鍵をどのように保存して保護するかなどです。 ただし、アテステーションステートメントだけでは、Relying Partyがアテステーションオブジェクトがユーザーが意図した認証器によって生成されたものであり、中間者攻撃者によって生成されたものではないことを検証する手段がないことに注意することが重要です。 たとえば、そのような攻撃者は、Relying Partyスクリプトに注入された悪意のあるコードを使用する可能性があります。 したがって、Relying Partyは、アテステーションオブジェクトを中間者攻撃から保護するために、TLSおよび関連技術などの他の手段に依存する必要があります。
登録セレモニーが安全に完了し、認証器が認証情報秘密鍵の機密性を維持しているという仮定の下では、その公開鍵認証情報を使用した後続の認証セレモニーは、 中間者攻撃による改ざんに対して耐性があります。
上記の議論は、すべてのアテステーションタイプに当てはまります。すべての場合において、中間者攻撃者がPublicKeyCredential
オブジェクト(アテステーションステートメントおよび
登録される認証情報公開鍵を含む)を置き換え、その後、同じRelying Party向けで、同じ攻撃者を通過する将来の認証アサーション
をスコープして改ざんすることが可能です。
このような攻撃は検知可能である可能性があります。Relying Partyはユーザーのではなく攻撃者の認証情報公開鍵を登録しているため、攻撃者はそのRelying Partyとの後続のすべての認証セレモニーを改ざんする必要があります: 影響を受けないセレモニーは失敗し、攻撃を明らかにする可能性があります。
Self Attestation およびNone以外のアテステーションタイプは、Relying Partiesが認証器情報(モデル指定など)をユーザーに表示できる可能性があるため、このような攻撃の難易度を高める可能性があります。したがって、攻撃者はユーザーの認証器と同じモデルの本物の認証器を使用する必要があるか、またはユーザーがRelying Partyがユーザーが期待するものとは異なる認証器モデルを報告していることに気付く可能性があります。
注: 上記で説明した中間者攻撃 のすべての変種は、従来のパスワード認証に対する中間者攻撃よりも、攻撃者が実行するのがより困難です。
13.4.5. 失効したアテステーション証明書
失効した中間アテステーションCA証明書によりアテステーション証明書の検証が失敗し、Relying Partyのポリシーがこれらの状況で登録/認証リクエストを拒否することを要求している場合、 Relying Partyは、CA侵害日以降に同じ中間CAにチェーンするアテステーション証明書を使用して登録された公開鍵認証情報の登録も解除する(または「self attestation」と同等の信頼レベルでマークする)ことが推奨されます(RECOMMENDED)。したがって、Relying Parties は、そのような証明書の失効後に登録が実行された場合に関連する公開鍵認証情報を登録解除できるように、登録中に中間アテステーションCA証明書を記憶することが推奨されます(RECOMMENDED)。
§ 13.3.2 Attestation Certificate and Attestation Certificate CA Compromiseの、認証器に関する関連するセキュリティ上の考慮事項も参照してください。
13.4.6. 認証情報の損失とキーのモビリティ
この仕様は、認証情報秘密鍵のバックアップや、それらを認証器間で共有するためのプロトコルを定義していません。 一般に、認証情報秘密鍵は、それを作成した認証器から外部に出ないことが期待されます。したがって、一般に、認証器を紛失することは、失われた認証器にバインドされたすべての認証情報を紛失することを意味し、 ユーザーがRelying Partyに登録している認証情報が1つしかない場合、ユーザーをアカウントからロックアウトする可能性があります。秘密鍵をバックアップまたは共有する代わりに、Web Authentication APIを使用すると、同じユーザーに対して複数の認証情報を登録できます。たとえば、ユーザーは頻繁に使用するクライアントデバイスにプラットフォーム認証情報を登録し、バックアップおよび新規またはまれに使用するクライアントデバイス用に1つ以上のローミング認証情報を登録することができます。
Relying Partiesは、ユーザーが同じユーザーアカウントに複数の認証情報を登録することを許可し、推奨する必要があります(SHOULD)。
Relying Partiesは、
これらの異なる認証情報が異なる認証器にバインドされていることを確認するために、
および
excludeCredentials
オプションを使用する必要があります(SHOULD)。
user.id
13.4.7. 保護されていないアカウントの検出
このセクションは規定的ではありません。
このセキュリティ上の考慮事項は、空でない(non-empty)allowCredentials
引数を最初の認証ステップとして使用する認証セレモニーをサポートするRelying Partiesに適用されます。
たとえば、最初の認証ステップとしてサーバーサイド認証情報を使用した認証を使用する場合などです。
この場合、allowCredentials
引数は、どのユーザーアカウントがWebAuthn認証情報を登録しており、どのアカウントが登録していないかに関する情報を漏洩するリスクがあり、これはアカウントの保護強度の指標となる可能性があります。
たとえば、攻撃者がユーザー名のみを提供して認証セレモニーを開始でき、Relying Partyが一部のユーザーアカウントに対しては空でないallowCredentialsで応答し、他のユーザーアカウントに対しては失敗またはパスワードチャレンジで応答するとします。
そうすると、攻撃者は、後者のユーザーアカウントは、認証に成功するためにWebAuthnのアサーションを必要としない可能性が高いと結論付け、攻撃をそのような保護が弱いアカウントに集中させることができます。
この問題は、§ 14.6.2 Username Enumerationおよび§ 14.6.3 Privacy leak via credential IDsで説明されている問題に似ており、同様の方法で軽減できます。
13.4.8. コードインジェクション攻撃
Relying Partyの公開鍵認証情報のスコープ内のorigin で実行されている悪意のあるコードは、WebAuthnが提供する可能性のあるセキュリティ保証をすべて無効にする可能性があります。 WebAuthn Clientsは、 セキュアコンテキストでのみWebAuthn APIを公開しますが、 これは最も基本的な攻撃を軽減するものであり、Relying Partiesによる追加の予防措置と組み合わせる必要があります(SHOULD)。
コードインジェクションはいくつかの方法で発生する可能性があります。 このセクションでは、起こりそうなシナリオをいくつか指摘し、適切な軽減策を提案しようと試みていますが、網羅的なリストではありません。
-
悪意のあるコードは、Relying Partyによって含まれる第三者スクリプトによって(意図的または第三者のセキュリティ脆弱性により)注入される可能性があります。
したがって、Relying Party は、その認証情報のスコープ内のoriginsに含まれるサードパーティスクリプトの量を制限する必要があります(SHOULD)。
Relying Party は、Content Security Policy [CSP2]および/または当時利用可能なその他の適切な技術を使用して、そのoriginsで実行できるスクリプトを制限する必要があります(SHOULD)。
-
認証情報のスコープルールにより、悪意のあるコードがRP IDのサブドメインでホストされている可能性があります。 たとえば、
usercontent.example.orgでホストされているユーザー投稿のコードは、example.orgというRP IDにスコープされた任意の認証情報を使用できる可能性があります。 Relying Partyがアサーションの検証時にサブドメインoriginを許可する場合、悪意のあるユーザーはこれを使用して中間者攻撃 を開始し、有効な認証アサーションを取得して攻撃の被害者になりすます可能性があります。したがって、Relying Partyは、デフォルトではアサーションの検証時にサブドメイン
originを許可しないようにする必要があります(SHOULD)。 Relying Partyがサブドメインoriginを許可する必要がある場合、 Relying Partyは、その公開鍵認証情報のスコープ内のoriginsの許可されたサブドメインで、信頼されていないコードを提供してはいけません(MUST)。
13.4.9. 認証情報のoriginの検証
認証情報を登録するときおよび
アサーションを検証するとき、
Relying Partyはクライアントデータのoriginメンバーを検証する必要があります(MUST)。
Relying Partyは、予期しないorigin値を受け入れてはなりません(MUST)。
受け入れると、悪意のあるWebサイトが有効な認証情報を取得できるようになる可能性があるためです。
WebAuthn認証情報のスコープにより、登録されたRP ID外のドメインでの使用は防止されますが、
Relying Partyのorigin検証は、
不具合のある認証器が認証情報のスコープを適用しない場合の保護の追加の層として機能します。
悪意のあるサブドメインに関する議論については、§ 13.4.8 Code injection attacksも参照してください。
検証は、Relying Partyが必要に応じて正確な文字列照合またはその他の方法で実行できます(MAY)。 たとえば:
-
https://example.orgでのみ提供されるWebアプリケーションは、originがhttps://example.orgと完全に等しいことを要求する必要があります(SHOULD)。 -
少数のドメインで提供されるWebアプリケーションは、
originが許可されるoriginのリストの要素と完全に等しいことを要求する場合があります。 たとえば、リスト["https://example.org", "https://login.example.org"]などです。 -
関連するoriginリクエストを利用するWebアプリケーションは、
originが許可されるoriginのリストの要素と完全に等しいことも要求する場合があります。 たとえば、リスト["https://example.co.uk", "https://example.de", "https://myexamplerewards.com"]などです。 このリストは通常、RP IDのwell-known URIにリストされたoriginと一致します。§ 5.11 Using Web Authentication across related originsを参照してください。 -
頻繁に変更される多数のドメインのセットで提供されるWebアプリケーションは、
originを構造的に解析し、URLスキームがhttpsであり、 オーソリティがRP IDと等しいか、またはそのサブドメイン(たとえば、example.orgまたはexample.orgの任意のサブドメイン)であることを要求する場合があります。注: RP IDの任意のサブドメインを許可することのリスクについては、§ 13.4.8 Code injection attacksを参照してください。
-
同伴するネイティブアプリケーションを持つWebアプリケーションは、
originがネイティブアプリケーションのオペレーティングシステムに依存する識別子であることを許可する場合があります。たとえば、そのようなRelying Partyは、originがリスト["https://example.org", "example-os:appid:204ffa1a5af110ac483f131a1bef8a841a7adb0d8d135908bbd964ed05d2653b"]の要素と完全に等しいことを要求する場合があります。
クライアントデータのtopOriginメンバーを検証する場合にも同様の考慮事項が適用されます。
topOriginが存在する場合、Relying
Partyはその値が予期されたものであることを検証する必要があります(MUST)。
この検証は、Relying
Partyが必要に応じて正確な文字列照合またはその他の方法で実行できます(MAY)。
たとえば:
-
クロスオリジン
iframeに埋め込まれないWebアプリケーションは、topOriginがoriginと完全に等しいことを要求する場合があります。 -
少数のドメインのクロスオリジン
iframeに埋め込まれることを望むWebアプリケーションは、topOriginが許可されるoriginのリストの要素と完全に等しいことを要求する場合があります。 たとえば、リスト["https://example-partner1.org", "https://login.partner2-example.org"]などです。 -
多数のドメインのクロスオリジン
iframeに埋め込まれることを望むWebアプリケーションは、topOriginの任意の値を許可するか、動的なプロシージャを使用して、特定のセレモニーに対して特定のtopOrigin値が許可されているかどうかを判断する場合があります。
14. プライバシーに関する考慮事項
[FIDO-Privacy-Principles]のプライバシーの原則もこの仕様に適用されます。
このセクションは対象別に分割されています。 一般的なプライバシーの考慮事項はこのセクションの直接のサブセクションですが、認証器、クライアント、およびRelying Partyの実装者向けのプライバシーの考慮事項は、それぞれのサブセクションにグループ化されています。
14.1. 匿名化防止策
このセクションは規定的ではありません。
Web Authentication APIの設計の多くの側面は、プライバシーへの懸念によって動機付けられています。この仕様で検討される主な懸念は、ユーザーの個人の身元、つまり人間の特定や、同一の人間に属する別の身元の相関関係の保護です。Web Authentication APIはグローバルなIDの形式を使用または提供しませんが、相関可能性のある次の種類の識別子が使用されます。
-
ユーザーのcredential IDsおよびcredential public keys。
これらはWebAuthn Relying Partyによって登録され、その後、対応するcredential private keyの所有を証明するためにユーザーによって使用されます。また、これらは認証器との通信においてクライアントにも表示されます。
-
各Relying Partyに固有のユーザーの身元(例:ユーザー名やuser handles)。
これらの身元は、各Relying Partyがシステム内でユーザーを識別するために明らかに使用されます。また、これらは認証器との通信においてクライアントにも表示されます。
-
ユーザーの生体認証特性(例:指紋や顔認識データ)[ISOBiometricVocabulary]。
これはオプションで認証器によってユーザー検証を実行するために使用されます。Relying Partyには公開されませんが、プラットフォーム認証器の場合、実装によってはクライアントにも表示される可能性があります。
-
ユーザーの認証器のモデル(例:製品名)。
これは登録中にRelying Partyに提供されるアテステーションステートメントで公開されます。また、これらは認証器との通信においてクライアントにも表示されます。
-
ユーザーの認証器の身元(例:シリアル番号)。
これはおそらくクライアントが認証器との通信を有効にするために使用されますが、Relying Partyには公開されません。
上記情報の一部は必然的にRelying Partyと共有されます。以下のセクションでは、悪意のあるRelying Partiesがそれを使用してユーザーの個人的な身元を発見することを防ぐために講じられた措置について説明します。
14.2. 匿名、スコープ設定、相関不可能な公開鍵認証情報
このセクションは規定的ではありません。
Credential IDsとcredential public keysは強力な認証を可能にするために必然的にWebAuthn Relying Partyと共有されますが、それらは識別情報を最小限に抑え、Relying Parties間で共有されないように設計されています。
-
Credential IDsとcredential public keysは、単独では意味をなさず、credential key pairsのみを識別し、ユーザーを直接識別しないためです。
-
各公開鍵認証情報は特定のRelying Partyに厳密にスコープされており、クライアントはその存在が他のRelying Partiesに公開されないようにします。したがって、悪意のあるRelying Partyはクライアントに対してユーザーの他の身元を公開するよう要求できません。
-
クライアントはまた、ユーザーの同意なしに公開鍵認証情報の存在がRelying Partyに公開されないようにします。これは§ 14.5.1 Registration Ceremony Privacyおよび§ 14.5.2 Authentication Ceremony Privacyで詳しく説明されています。 したがって、悪意のあるRelying Partyは、ユーザーが公開鍵認証情報を登録して利用可能であっても、ユーザーを黙って識別することはできません。
-
認証器は、異なる公開鍵認証情報のcredential IDsとcredential public keysが同一ユーザーに属するものとして相関されないようにします。したがって、悪意のあるRelying Partiesのペアは、ユーザー名や電子メールアドレスの意図的な再利用などの追加情報がなければ、システム間でユーザーを相関できません。
-
認証器は、そのアテステーション証明書が単一の認証器や認証器の小グループを識別するほど一意ではないことを保証します。これは§ 14.4.1 Attestation Privacyで詳しく説明されています。したがって、悪意のあるRelying Partiesのペアは、個々の認証器を追跡することによってシステム間でユーザーを相関できません。
さらに、クライアントサイド検出可能公開鍵認証情報ソースには、オプションでRelying Partyによって指定されたuser handleを含めることができます。その後、その認証情報を使用して、ユーザーを識別および認証することができます。 つまり、プライバシーを意識したRelying Partyは、従来のユーザー名なしでユーザーアカウントの作成を許可できるため、Relying Parties間の非相関性がさらに向上します。
14.3. 認証器ローカル生体認識
生体認証器は、認証器内で内部的に生体認識を実行します — ただし、プラットフォーム認証器の場合、実装によっては生体データがクライアントにも表示される場合があります。生体データはWebAuthn Relying Partyには公開されず、公開鍵認証情報の作成と登録、またはそれを使用した認証を承認するためにローカルでのみユーザー検証を実行するために使用されます。したがって、悪意のあるRelying Partyは生体データを通じてユーザーの個人的な身元を発見できず、Relying Partyでのセキュリティ侵害も、攻撃者が他のRelying Partiesでログインを偽造するために使用できる生体データを公開することはありません。
Relying Partyが生体認識を必要とする場合、これは生体認証器 によってユーザー検証を実行し、署名されたアサーション応答でUV フラグを設定することによって結果を通知することでローカルに実行され、 Relying Partyに生体データ自体を公開するのではありません。
14.4. 認証器のプライバシーに関する考慮事項
14.4.1. アテステーションのプライバシー
アテステーション証明書とアテステーションキーペアは、ユーザーを追跡したり、同一ユーザーの様々なオンライン身元をリンクしたりするために使用される可能性があります。 これには、以下のような方法で軽減できます。
-
WebAuthn Authenticatorメーカーは、バッチ単位で認証器を出荷することを選択できます。バッチ内の認証器 は同じアテステーション証明書(Basic Attestationまたはバッチアテステーションと呼ばれます)を共有します。 これによりユーザーは匿名化されますが、その秘密鍵が侵害された場合、特定のアテステーション証明書を失効できないリスクがあります。 認証器 メーカーは、そのようなバッチが意味のある匿名化を提供するのに十分な大きさでありながら、 アテステーション秘密鍵が侵害された場合の影響を受けるユーザーの数を制限するためにバッチサイズを最小限に抑えるようにする必要があります(SHOULD)。
[UAFProtocol]では、少なくとも100,000台の認証器デバイスが同じアテステーション証明書を共有して、十分に大きなグループを生成することが必要とされています。これは適切なバッチサイズに関するガイダンスとして役立つ可能性があります。
-
WebAuthn Authenticatorは、Anonymization CAアプローチで説明されているように、認証情報ごとに異なるアテステーションキーペア(および関連する証明書)を動的に生成できる場合があります。たとえば、認証器はメインのアテステーション秘密鍵(および証明書)を搭載して出荷され、 クラウド運営のAnonymization CAと組み合わせることで、認証情報ごとのアテステーションキーペアとアテステーション証明書を動的に生成できます。
注: この仕様外の様々な場所では、ここでAnonymization CAと呼ばれているものを指す用語として「Privacy CA」が使用されています。Trusted Computing Group (TCG)も、TCGが現在Attestation CA (ACA)と呼んでいるものを指すために「Privacy CA」という用語を使用していたため [TCG-CMCProfile-AIKCertEnroll]、 この仕様の特定のコンテキストでの混乱を軽減するために、ここではAnonymization CAという用語を使用しています。
14.4.2. 認証器に保存される個人を特定できる情報のプライバシー
認証器は、この仕様で定義されているもの以外に、例えばユーザーが認証セレモニーに使用する認証情報を選択できるリッチなUIをクライアントに提供できるようにするために、 クライアントに追加情報を提供する場合があります(MAY)。 認証器がそうする場合、ユーザー検証が正常に完了していない限り、個人を特定できる情報を公開してはなりません(SHOULD NOT)。認証器が複数の登録済みユーザーでユーザー検証をサポートしている場合、 認証器は現在検証済みのユーザー以外のユーザーの個人を特定できる情報を公開してはなりません(SHOULD NOT)。したがって、ユーザー検証 ができない認証器は、個人を特定できる情報を保存すべきではありません(SHOULD NOT)。
この議論の目的上、id
メンバーとして伝達されるuser
handleは、個人を特定できる情報とは見なされません。§ 14.6.1 User
Handle Contentsを参照してください。
これらの推奨事項は、認証器への物理的アクセスを持つ敵対者が、認証器の登録済みユーザーに関する個人を特定できる情報を抽出することを防ぐために役立ちます。
14.5. クライアントのプライバシーに関する考慮事項
14.5.1. 登録セレモニーのプライバシー
同意なしにユーザーが識別されるのを防ぐために、
[[Create]](origin, options, sameOriginWithAncestors)
メソッドの実装は、悪意のあるWebAuthn Relying
Partyが以下のケースを区別できるようにする情報が漏洩しないように注意する必要があります。ここで「除外」は、Relying PartyがexcludeCredentialsにリストした認証情報の少なくとも1つが認証器にバインドされていることを意味します。
上記のケースが区別できる場合、悪意のあるRelying
Partyがどの認証情報が利用可能かを調査することでユーザーを識別できる情報が漏洩します。たとえば、そのような情報漏洩の1つは、除外された認証器が利用可能になるとすぐにクライアントが失敗応答を返す場合です。この場合 — 特に除外された認証器がプラットフォーム認証器である場合 — Relying
Partyは、ユーザーが手動でキャンセルする前にセレモニーがキャンセルされたことを検出でき、したがってexcludeCredentials
パラメータにリストされた認証情報の少なくとも1つがユーザーに利用可能であると結論付ける可能性があります。
ただし、ユーザーが区別可能なエラーが返される前に新しい認証情報の作成に同意している場合、上記は懸事項ではありません。なぜなら、この場合、ユーザーは漏洩する情報を共有する意図を確認しているからです。
14.5.2. 認証セレモニーのプライバシー
同意なしにユーザーが識別されるのを防ぐために、
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
メソッドの実装は、悪意のあるWebAuthn Relying
Partyが以下のケースを区別できるようにする情報が漏洩しないように注意する必要があります。ここで「名前付き」は、認証情報がRelying PartyによってallowCredentialsにリストされていることを意味します。
上記のケースが区別できる場合、悪意のあるRelying
Partyがどの認証情報が利用可能かを調査することでユーザーを識別できる情報が漏洩します。
たとえば、そのような情報漏洩は、名前付きの認証情報を含む認証器を発見した後にのみ、認証セレモニーをキャンセルまたは続行するための指示とコントロールをクライアントが表示する場合に発生する可能性があります。
この場合、Relying
Partyがこのクライアント
の動作を認識している場合、
Relying Partyは、
セレモニーがタイムアウトではなくユーザーによってキャンセルされたことを検出でき、したがってallowCredentials
パラメータにリストされた認証情報の少なくとも1つがユーザーに利用可能であると結論付ける可能性があります。
この懸念は、名前付きの認証情報が利用可能かどうかにかかわらず、ユーザーがいつでも認証セレモニーをキャンセルできるコントロールを表示することで対処できる可能性があります。
14.5.3. オペレーティングシステムアカウント間のプライバシー
マルチユーザーオペレーティングシステムを持つクライアントデバイスにプラットフォーム 認証器が含まれている場合、プラットフォーム 認証器とクライアントデバイスは、 いずれかのプラットフォーム認証情報の存在が、そのプラットフォーム認証情報を作成したオペレーティングシステムユーザーにのみ公開されるように連携する必要があります(SHOULD)。
14.5.4. クライアント機能の開示
getClientCapabilities
メソッドは、WebAuthn
Relying Partiesが、クライアントおよび/またはユーザーとの成功の可能性が高い登録および認証エクスペリエンスを作成するのを支援します。
WebAuthn Clientの機能のサポート(または非サポート)は、フィンガープリンティングのリスクをもたらす可能性があります。このリスクを低減するために、クライアントはfalseの値を返すよりも、戻されたレコードからキーを省略することを優先する必要があります(SHOULD)。(§ 5.1.7 Availability of client capabilities - PublicKeyCredential’s getClientCapabilities() Methodで説明されているように)キーを省略することは、機能がサポートされていないことを明示的に確認するよりも、フィンガープリンティングの表面が少なくなります。クライアントの実装は、クライアントのポリシーや/またはユーザーの同意に基づいて機能の開示を制限することも希望する場合があります(MAY)。
14.6. Relying Partiesのプライバシーに関する考慮事項
14.6.1. ユーザーハンドルの内容
§ 14.4.2 Privacy of personally identifying information Stored in Authenticatorsにおいてuser handleは個人を特定できる情報とは見なされず、また認証器はユーザー検証を実行せずにuser handlesを公開する場合がある(MAY)ため、 Relying Partyはuser handleに個人を特定できる情報(例:電子メールアドレスやユーザー名)を含めてはなりません(MUST NOT)。これには、個人を特定できる情報のハッシュ値も含まれます。Relying Partyに固有のソルト値でソルティングされていない限り、ハッシュ化は推測可能な入力値の探索を防ぐことができないためです。user handleを64バイトのランダム値にし、この値をユーザーアカウントに保存することが推奨されます(RECOMMENDED)。
14.6.2. ユーザー名の列挙
登録または認証セレモニーを開始する際、 WebAuthn Relying Partyが登録済みユーザーに関する機密情報を漏洩するリスクがあります。たとえば、Relying Partyが電子メールアドレスをユーザー名として使用しており、攻撃者が「alex.mueller@example.com」の認証セレモニーの開始を試みたがRelying Partyが失敗で応答し、その後「j.doe@example.com」で認証セレモニーを正常に開始した場合、攻撃者は「j.doe@example.com」が登録されており「alex.mueller@example.com」は登録されていないと結論付けることができます。したがって、Relying Partyは、「j.doe@example.com」がこのRelying Partyにユーザーアカウントを持っているという、機密の可能性がある情報を漏洩したことになります。
以下は、Relying Partyがそのような攻撃による情報漏洩を軽減または防止するために実装できる対策の非網羅的なリストです。
-
登録セレモニーの場合:
-
Relying PartyがRelying Party固有のユーザー名を使用してユーザーを識別する場合:
-
登録セレモニーを開始する際、構文的に有効な電子メールアドレスであるユーザー名の登録を許可しないでください。
注: この提案の動機は、この場合、ユーザーがすでに登録されているユーザー名を登録しようとすると、Relying Partyは登録セレモニーを失敗させるしかなく、したがって情報漏洩が避けられない可能性が高いことです。電子メールアドレスをユーザー名として使用することを禁止することで、ユーザーがこのRelying Partyと他のRelying Partiesで同じユーザー名を持っている可能性が低くなるため、漏洩の影響を軽減できます。
-
-
Relying Partyが電子メールアドレスを使用してユーザーを識別する場合:
-
登録セレモニーを開始する際、電子メールアドレスが提供された後にユーザーとの対話を中断し、予測不可能なワンタイムコードとセレモニーを進める方法に関する指示を含むメッセージをこのアドレスに送信してください。送信された電子メールの内容や、その電子メールアドレスがすでに登録されているかどうかにかかわらず、Webインターフェースでユーザーに同じメッセージを表示してください。
注: この提案は、同様の帯域外の連絡先情報(例:通常の郵送先住所)を提供する場合、国民ID番号やクレジットカード番号など、他の外的に意味のある識別子についても同様に適用できます。
-
-
-
認証セレモニーの場合:
-
認証式(authentication ceremony)の開始時に、提供されたユーザー名に一致するユーザーアカウントが存在しない場合は、
navigator.credentials.get()を呼び出して、構文的に有効なPublicKeyCredentialRequestOptionsオブジェクトにもっともらしい架空の値を設定して式を継続します。この手法は
allowCredentialsによる情報漏えいを緩和するためにも利用できます。§ 13.4.7 非保護アカウント検出や§ 14.6.3 資格情報IDによるプライバシー漏えいを参照してください。注: ユーザー名はログインフォームやセッションCookie等、様々なRelying Party独自の方法で「提供」される場合があります。
注: もし返却される架空の値が実際のものと著しく異なる場合、巧妙な攻撃者はそれを識別し、結果として実際のアカウントの存在を検証できてしまう可能性があります。著しく異なる値の例として、全てのユーザー名入力で返される値が常に同じである場合や、同じユーザー名入力を繰り返しても毎回異なる値になる場合などが挙げられます。このため、
allowCredentialsメンバーには例えばユーザー名から決定的に導出された擬似ランダム値を設定するなどの工夫が考えられます。 -
AuthenticatorAssertionResponseの応答を認証器から検証する際は、署名が無効で失敗したのか、該当するユーザーや資格情報が登録されていないため失敗したのか、判別できないようにすること。 -
マルチステップの認証式(authentication ceremony)を実施すること。例えば、最初にユーザー名・パスワードの入力やセッションCookieの供給などを行い、その後のステップとしてWebAuthnの式(ceremony)を開始する。この方法では、ユーザー名列挙の問題がWebAuthnステップから前段の認証ステップへ移るため、そこでの対応が容易となる場合があります。
-
14.6.3. Credential IDs経由のプライバシー漏洩
このセクションは規定的ではありません。
このプライバシー上の考慮事項は、空でない(non-empty)allowCredentials
引数を最初の認証ステップとして使用して認証セレモニーをサポートするRelying Partiesに適用されます。
たとえば、最初の認証ステップとしてサーバーサイド認証情報を使用した認証を使用する場合などです。
この場合、allowCredentials
引数は認証されていない発信者にユーザーのcredential
IDsを公開するため、個人を特定できる情報を漏洩するリスクがあります。
Credential IDsはRelying
Parties間では相関できないように設計されていますが、credential
IDの長さは、それを作成した認証器の種類の手がかりになる可能性があります。
ユーザーは複数のRelying
Partiesで同じユーザー名と認証器のセットを使用する可能性が高いため、
allowCredentials内のcredential
IDsの数とその長さが、ユーザーの匿名化を解除するためのグローバルな相関ハンドルとして機能する可能性があります。
また、ユーザーのcredential
IDsを知っていると、ユーザーのいずれかの認証器への一時的な物理的アクセスがあれば、ユーザーの身元に関する推測を確認することも可能になります。
そのような情報漏洩を防ぐために、Relying Partyは、たとえば次のようなことができます。
-
WebAuthn 認証セレモニーを開始し、ユーザーのcredential IDsを公開する前に、ユーザー名とパスワード認証やセッションクッキー認証などの別の認証ステップを実行します。
-
クライアントサイド検出可能認証情報を使用するため、
allowCredentials引数が不要になります。
上記の防止策が利用できない場合、つまりユーザー名のみが指定されているときにallowCredentials
を公開する必要がある場合、Relying
Partyは、§ 14.6.2 Username Enumerationで説明されているのと同様の方法で架空のcredential
IDsを返すアプローチを使用してプライバシーの漏洩を軽減できます。
credential idが認識されなかったことを通知する際、WebAuthn
Relying Partyは、認証されていない発信者にcredential IDsを公開しないように、signalAllAcceptedCredentials(options)メソッドの代わりにsignalUnknownCredential(options)メソッドを使用する必要があります(SHOULD)。
15. アクセシビリティに関する考慮事項
ユーザー認証対応の認証器は、ローミングまたはプラットフォームいずれであっても、ユーザーに複数のユーザー認証方法を提供するべきです。例えば、指紋認証とPIN入力の両方です。これにより、選択された方法が何らかの理由で機能しない場合でも、他のユーザー認証手段へのフォールバックが可能になります。ローミング認証器の場合、認証器とプラットフォームが協力してPIN入力などのユーザー認証方法を提供することがあります[FIDO-CTAP]。
Relying Partyは、登録時に、ユーザーが将来的な認可ジェスチャーを正しく完了できるように工夫を提供するべきです。これには、認証器の名前付け、デバイスに関連づける画像の選択、自由形式のテキストによる指示の入力(例:自分へのリマインダーとして)などが含まれます。
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 IDが 与えられた場合に認証出力を正常に検証できることを確認できます。
すべての例ではRP ID
example.org、origin
https://example.org
そして適用される場合はtopOrigin
https://example.comを使用します。
例には、特に注記がない限り認証なしが含まれます。
clientDataJSONやattestationObject、
証明書などの複合オブジェクトは 擬似コードに特に記載されていない追加の(通常は定数の)データを含む場合がありますのでご注意ください。
すべてのランダム値は、CDDLで'WebAuthn test vectors'と表されるベース入力鍵素材、または同等のh’576562417574686e207465737420766563746f7273'
から
HKDF-SHA-256 [RFC5869]
によって決定的に生成されます。
ECDSA署名では決定論的ノンス[RFC6979]
を使います。
例のRSA鍵は、p ≥ 1024となる最小の2つのメルセンヌ素数2p - 1から構成されています。
注意:
-
例には再現性のために認証情報の秘密鍵や認証の秘密鍵も含みますが、 これらは通常クライアントやRelying Partyと共有されることはありません。
注: 認証器がCTAP2 [FIDO-CTAP] を実装している場合、本仕様で定められたものとは異なるキーを用いてattestation object を返します。 ここに示す例はWebAuthn Relying Party が期待する attestation object フォーマットを反映していますので、CTAP2から出力されるattestation object のキーは、ビットごとに同一となるように変換する必要があります。
16.1. アテステーション信頼ルート証明書
全ての アテステーション を含む例は、X.509 DER
で符号化された attestation_ca_cert をアテステーション信頼ルート証明書として下記に使用しています [RFC5280]:
attestation_ca_key = h'7809337f05740a96a78eedf9e9280499dcc8f2aa129616049ec1dccfe103eb2a' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='Attestation CA', L=32) attestation_ca_serial_number = h'ed7f905d8bd0b414d1784913170a90b6' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='Attestation CA', L=16) attestation_ca_cert = h'30820207308201ada003020102021100ed7f905d8bd0b414d1784913170a90b6300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a3062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d030107034200043269300e5ff7b699015f70cf80a8763bf705bc2e2af0c1b39cff718b7c35880ca30f319078d91b03389a006fdfc8a1dcd84edfa07d30aa13474a248a0dab5baaa3423040300f0603551d130101ff040530030101ff300e0603551d0f0101ff040403020106301d0603551d0e0416041445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d04030203480030450220483063b6bb08dcc83da33a02c11d2f42203176893554d138c614a36908724cc8022100f5ef2c912d4500b3e2f5b591d0622491e9f220dfd1f9734ec484bb7e90887663'
16.2. アテステーションなしの ES256 資格情報
登録:
challenge = h'00c30fb78531c464d2b6771dab8d7b603c01162f2fa486bea70f283ae556e130' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='none.ES256', L=32) credential_private_key = h'6e68e7a58484a3264f66b77f5d6dc5bc36a47085b615c9727ab334e8c369c2ee' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='none.ES256', L=32) client_data_gen_flags = h'f9' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='none.ES256', L=1) ; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます extraData_random = h'06441e0e375c4c1ad70620302532c4e5' = b64'BkQeDjdcTBrXBiAwJTLE5Q' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='none.ES256', L=16) aaguid = h'8446ccb9ab1db374750b2367ff6f3a1f' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='none.ES256', L=16) credential_id = h'f91f391db4c9b2fde0ea70189cba3fb63f579ba6122b33ad94ff3ec330084be4' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='none.ES256', L=32) ; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます auth_data_UV_BE_BS = h'ba' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='none.ES256', L=1) clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a22414d4d507434557878475453746e63647134313759447742466938767049612d7077386f4f755657345441222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a20426b5165446a646354427258426941774a544c453551227d' attestationObject = h'a363666d74646e6f6e656761747453746d74a068617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b559000000008446ccb9ab1db374750b2367ff6f3a1f0020f91f391db4c9b2fde0ea70189cba3fb63f579ba6122b33ad94ff3ec330084be4a5010203262001215820afefa16f97ca9b2d23eb86ccb64098d20db90856062eb249c33a9b672f26df61225820930a56b87a2fca66334b03458abf879717c12cc68ed73290af2e2664796b9220'
認証:
challenge = h'39c0e7521417ba54d43e8dc95174f423dee9bf3cd804ff6d65c857c9abf4d408' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='none.ES256', L=32) client_data_gen_flags = h'4a' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='none.ES256', L=1) ; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます ; auth_data_UV_BS は認証器データフラグの UV と BS ビットを設定しますが、BS は登録時に BE が設定されていた場合にのみ設定されます auth_data_UV_BS = h'38' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='none.ES256', L=1) authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b51900000000' clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a224f63446e55685158756c5455506f334a5558543049393770767a7a59425039745a63685879617630314167222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d' signature = h'3046022100f50a4e2e4409249c4a853ba361282f09841df4dd4547a13a87780218deffcd380221008480ac0f0b93538174f575bf11a1dd5d78c6e486013f937295ea13653e331e87'
16.3. 自己アテステーションの ES256 資格情報
登録:
challenge = h'7869c2b772d4b58eba9378cf8f29e26cf935aa77df0da89fa99c0bdc0a76f7e5' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='packed-self.ES256', L=32) credential_private_key = h'b4bbfa5d68e1693b6ef5a19a0e60ef7ee2cbcac81f7fec7006ac3a21e0c5116a' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='packed-self.ES256', L=32) client_data_gen_flags = h'db' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='packed-self.ES256', L=1) ; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます extraData_random = h'53d8535ef284d944643276ffd3160756' = b64'U9hTXvKE2URkMnb_0xYHVg' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='packed-self.ES256', L=16) aaguid = h'df850e09db6afbdfab51697791506cfc' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='packed-self.ES256', L=16) credential_id = h'455ef34e2043a87db3d4afeb39bbcb6cc32df9347c789a865ecdca129cbef58c' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='packed-self.ES256', L=32) ; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます auth_data_UV_BE_BS = h'fd' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='packed-self.ES256', L=1) clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a2265476e4374334c55745936366b336a506a796e6962506b31716e666644616966715a774c33417032392d55222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a205539685458764b453255526b4d6e625f307859485667227d' attestationObject = h'a363666d74667061636b65646761747453746d74a263616c672663736967584630440220067a20754ab925005dbf378097c92120031581c73228d1fb4f5b881bcd7da98302207fc7b147558c7c0eba3af18bd9d121fa3d3a26d17fe3f220272178f473b6006d68617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b55d00000000df850e09db6afbdfab51697791506cfc0020455ef34e2043a87db3d4afeb39bbcb6cc32df9347c789a865ecdca129cbef58ca5010203262001215820eb151c8176b225cc651559fecf07af450fd85802046656b34c18f6cf193843c5225820927b8aa427a2be1b8834d233a2d34f61f13bfd44119c325d5896e183fee484f2'
認証:
challenge = h'4478a10b1352348dd160c1353b0d469b5db19eb91c27f7dfa6fed39fe26af20b' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='packed-self.ES256', L=32) client_data_gen_flags = h'1f' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='packed-self.ES256', L=1) ; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます extraData_random = h'8136f9debcfa121496a265c6ce2982d5' = b64'gTb53rz6EhSWomXGzimC1Q' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='packed-self.ES256', L=16) ; auth_data_UV_BS は認証器データフラグの UV と BS ビットを設定しますが、BS は登録時に BE が設定されていた場合にのみ設定されます auth_data_UV_BS = h'a1' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='packed-self.ES256', L=1) authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50900000000' clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a225248696843784e534e493352594d45314f7731476d3132786e726b634a5f6666707637546e2d4a71386773222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a206754623533727a36456853576f6d58477a696d433151227d' signature = h'304402203310b9431903c401f1be2bdc8d23a4007682dbbddcf846994947b7f465daf84002204e94dd00047b316061b3b99772b7efd95994a83ef584b3b6b825ea3550251b66'
16.4. clientDataJSON に "crossOrigin": true を含む ES256 資格情報
登録:
challenge = h'3be5aacd03537142472340ab5969f240f1d87716e20b6807ac230655fa4b3b49' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='none.ES256.crossOrigin', L=32) credential_private_key = h'96c940e769bd9f1237c119f144fa61a4d56af0b3289685ae2bef7fb89620623d' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='none.ES256.crossOrigin', L=32) client_data_gen_flags = h'71' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='none.ES256.crossOrigin', L=1) ; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます extraData_random = h'cd9aae12d0d1f435aaa56e6d0564c5ba' = b64'zZquEtDR9DWqpW5tBWTFug' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='none.ES256.crossOrigin', L=16) aaguid = h'883f4f6014f19c09d87aa38123be48d0' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='none.ES256.crossOrigin', L=16) credential_id = h'6e1050c0d2ca2f07c755cb2c66a74c64fa43065c18f938354d9915db2bd5ce57' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='none.ES256.crossOrigin', L=32) ; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます auth_data_UV_BE_BS = h'27' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='none.ES256.crossOrigin', L=1) clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a224f2d57717a514e5463554a484930437257576e7951504859647862694332674872434d475666704c4f306b222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a747275652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a207a5a7175457444523944577170573574425754467567227d' attestationObject = h'a363666d74646e6f6e656761747453746d74a068617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b54500000000883f4f6014f19c09d87aa38123be48d000206e1050c0d2ca2f07c755cb2c66a74c64fa43065c18f938354d9915db2bd5ce57a501020326200121582022200a473f90b11078851550d03b4e44a2279f8c4eca27b3153dedfe03e4e97d225820cbd0be95e746ad6f5a8191be11756e4c0420e72f65b466d39bc56b8b123a9c6e'
認証:
challenge = h'876aa517ba83fdee65fcffdbca4c84eeae5d54f8041a1fc85c991e5bbb273137' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='none.ES256.crossOrigin', L=32) client_data_gen_flags = h'57' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='none.ES256.crossOrigin', L=1) ; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます extraData_random = h'f76a5c4d50f401bcbeab876d9a3e9e7e' = b64'92pcTVD0Aby-q4dtmj6efg' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='none.ES256.crossOrigin', L=16) ; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します auth_data_UV_BS = h'0c' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='none.ES256.crossOrigin', L=1) authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50500000000' clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a226832716c463771445f65356c5f505f62796b7945377135645650674547685f49584a6b655737736e4d5463222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a747275652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a2039327063545644304162792d713464746d6a36656667227d' signature = h'3046022100eb12fcf23b12764c0f122e22371fab92e283879fd798f38ee1841c951b6e40e7022100c76237ff9db77b3c56f30837cda6a09acfa2e915544e609c0733b1184036d1cf'
16.5. clientDataJSON に "topOrigin" を含む ES256 資格情報
登録:
challenge = h'4e1f4c6198699e33c14f192153f49d7e0e8e3577d5ac416c5f3adc92a41f27e5' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='none.ES256.topOrigin', L=32) credential_private_key = h'a2d6de40ab974b80d8c1ef78c6d4300097754f7e016afe7f8ea0ad9798b0d420' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='none.ES256.topOrigin', L=32) client_data_gen_flags = h'54' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='none.ES256.topOrigin', L=1) ; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます aaguid = h'97586fd09799a76401c200455099ef2a' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='none.ES256.topOrigin', L=16) credential_id = h'b8ad59b996047ab18e2ceb57206c362da57458793481f4a8ebf101c7ca7cc0f1' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='none.ES256.topOrigin', L=32) ; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます auth_data_UV_BE_BS = h'a0' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='none.ES256.topOrigin', L=1) clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a225468394d595a68706e6a504254786b68555f53646667364f4e58665672454673587a72636b7151664a2d55222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a747275652c22746f704f726967696e223a2268747470733a2f2f6578616d706c652e636f6d227d' attestationObject = h'a363666d74646e6f6e656761747453746d74a068617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b5410000000097586fd09799a76401c200455099ef2a0020b8ad59b996047ab18e2ceb57206c362da57458793481f4a8ebf101c7ca7cc0f1a5010203262001215820a1c47c1d82da4ebe82cd72207102b380670701993bc35398ae2e5726427fe01d22582086c1080d82987028c7f54ecb1b01185de243b359294a0ed210cd47480f0adc88'
認証:
challenge = h'd54a5c8ca4b62a8e3bb321e3b2bc73856f85a10150db2939ac195739eb1ea066' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='none.ES256.topOrigin', L=32) client_data_gen_flags = h'77' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='none.ES256.topOrigin', L=1) ; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます extraData_random = h'52216824c5514070c0156162e2fc54a5' = b64'UiFoJMVRQHDAFWFi4vxUpQ' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='none.ES256.topOrigin', L=16) ; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します auth_data_UV_BS = h'9f' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='none.ES256.topOrigin', L=1) authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50500000000' clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a22315570636a4b53324b6f34377379486a7372787a68572d466f51465132796b3572426c584f6573656f4759222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a747275652c22746f704f726967696e223a2268747470733a2f2f6578616d706c652e636f6d222c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a205569466f4a4d56525148444146574669347678557051227d' signature = h'3045022100b5a70c81780d5fcc9a4f2ae9caae99058f8accaf58b91fb59329646c28ac6ffc022012e101c165db3c8e9957f0c54dd6ca9b56bc3bd2f280bd2faa6c1d02c6e5c171'
16.6. 非常に長い credential ID を持つ ES256 資格情報
登録:
challenge = h'1113c7265ccf5e65124282fa1d7819a7a14cb8539aa4cdbec7487e5f35d8ec6c' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='none.ES256.long-credential-id', L=32) credential_private_key = h'6fd2149bb5f1597fe549b138794bde61893b2dc32ca316de65f04808dac211dc' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='none.ES256.long-credential-id', L=32) >client_data_gen_flags = h'90' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='none.ES256.long-credential-id', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます aaguid = h'8f3360c2cd1b0ac14ffe0795c5d2638e' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='none.ES256.long-credential-id', L=16) >credential_id = h'3a761a4e1674ad6c4305869435c0eee9c286172c229bb91b48b4ada140c0863417031305cce5b4a27a88d7fe728a5f5a627de771b4b40e77f187980c124f9fe832d7136010436a056cce716680587d23187cf1fc2c62ae86fc3e508ee9617ffc74fbc10488ec16ec5e9096328669a898709b655e549738c666c1ae6281dc3b5f733c251d3eefb76ee70a3805ca91bcc18e49c8dc7f63ebcb486ba8c3d6ab52b88ff72c6a5bb47c32f3ee8683a3ddc8abf60870448ec8a21b5bdcb183c7dead870255575a6df96eb1b6a2a1019780cba9e4887b17ff1164bbbcc10eb0d86ed75984cd3fa3419103024507dfd9ce8f92c56af7914cb0bb50b87ba82a312bb7dcd93028dbdcd6adb266979667158335171e3682d37755701edbf9d872846a291d49e57ef09da1ec637f5052ed2aa7407f7e61827468e94b461844f4c67be5fa9c6055a566f8fdfc29d4bf78a9ff275f552cc68ba543fa3962eea36fd1ea8453764577d021d0a181efc1f6100ab2e4110039e21ee16970bda7432b6134492155afc126295b3a2eccd12c66a68e340969e995e3e8c9c476e395cfc21203414110779474f1c9797406637dbe414f132519d3bf0ce4f01734ef0e1a12c3ad604ff15d766b1624db6a5a7ccbff7bc35c9908df94aba277e0af48f04ff3d16381c47e5a37ed3988a67a3b1ecaa926336b33391fff04128f869991c9fabd905b6fe3ceef5f8b630ec1c5d2636d5b1961ad5ca5004170f6f5e482792aad989b0287fe91e5c479403397152f1fa56aa79b156eb47e6c8ea3eb175c34cfb38ad8e772874639b1023d4d01395c94e55831671cc022aa6fa1e02a02c2e4abc776f6960e51f83b71a8c0f207b6a347573977812c9aa5480b0011aa739bd4b76c18c000cc4757cceccb920f007c40c00e37e5ab21476cd9f6054a8fffb55a108f5c706e2cea2049d81fd321ff47d2a5761b0800955ab1d4f4889f55a84e2601c684f17a4ade7453ea49591d0b59c8d9a765052f62219cf6ef4a5dd9539f0617d6ebbebce7c000455475d18449e25c49ef9a1e3efe18c09082ebe2058d7c347defaa92f0664553b805c7d76bbfce5f330aca220ac90a789380fc479ea0d8793205813cca590a912f699ad52f991a1bc0a503c3ec4b2a696719e3c26591a87127f7305cc7e72f4c8e39355ebb06a5b1042990f38710ee7aa612ee4374bb82e878585a70a96c2a6b47f101a4ff154be4fd76a3167577a5cc54d9167c154c69ac35485e44cc898b719e1be3cc9c0fb5624b8f8a0dae10947a41bf848b6c1bb33d1006ec077d7e286e3f2a7b4843716390119449fe2721e81a5ed2333d331c7120765da58fadae73c19d9a8c4509cf8ac1e9d98b799a5274509069739b5823f3fb496663820033426988eefca53e580e0f9e0dfe0992fc2e53a97e053639f98577058f995bdbd41cefdb' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='none.ES256.long-credential-id', L=1023) ; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます auth_data_UV_BE_BS = h'69' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='none.ES256.long-credential-id', L=1) clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a22455250484a6c7a50586d5553516f4c364858675a7036464d75464f61704d322d7830682d587a5859374777222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d' attestationObject = h'a363666d74646e6f6e656761747453746d74a0686175746844617461590483bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b549000000008f3360c2cd1b0ac14ffe0795c5d2638e03ff3a761a4e1674ad6c4305869435c0eee9c286172c229bb91b48b4ada140c0863417031305cce5b4a27a88d7fe728a5f5a627de771b4b40e77f187980c124f9fe832d7136010436a056cce716680587d23187cf1fc2c62ae86fc3e508ee9617ffc74fbc10488ec16ec5e9096328669a898709b655e549738c666c1ae6281dc3b5f733c251d3eefb76ee70a3805ca91bcc18e49c8dc7f63ebcb486ba8c3d6ab52b88ff72c6a5bb47c32f3ee8683a3ddc8abf60870448ec8a21b5bdcb183c7dead870255575a6df96eb1b6a2a1019780cba9e4887b17ff1164bbbcc10eb0d86ed75984cd3fa3419103024507dfd9ce8f92c56af7914cb0bb50b87ba82a312bb7dcd93028dbdcd6adb266979667158335171e3682d37755701edbf9d872846a291d49e57ef09da1ec637f5052ed2aa7407f7e61827468e94b461844f4c67be5fa9c6055a566f8fdfc29d4bf78a9ff275f552cc68ba543fa3962eea36fd1ea8453764577d021d0a181efc1f6100ab2e4110039e21ee16970bda7432b6134492155afc126295b3a2eccd12c66a68e340969e995e3e8c9c476e395cfc21203414110779474f1c9797406637dbe414f132519d3bf0ce4f01734ef0e1a12c3ad604ff15d766b1624db6a5a7ccbff7bc35c9908df94aba277e0af48f04ff3d16381c47e5a37ed3988a67a3b1ecaa926336b33391fff04128f869991c9fabd905b6fe3ceef5f8b630ec1c5d2636d5b1961ad5ca5004170f6f5e482792aad989b0287fe91e5c479403397152f1fa56aa79b156eb47e6c8ea3eb175c34cfb38ad8e772874639b1023d4d01395c94e55831671cc022aa6fa1e02a02c2e4abc776f6960e51f83b71a8c0f207b6a347573977812c9aa5480b0011aa739bd4b76c18c000cc4757cceccb920f007c40c00e37e5ab21476cd9f6054a8fffb55a108f5c706e2cea2049d81fd321ff47d2a5761b0800955ab1d4f4889f55a84e2601c684f17a4ade7453ea49591d0b59c8d9a765052f62219cf6ef4a5dd9539f0617d6ebbebce7c000455475d18449e25c49ef9a1e3efe18c09082ebe2058d7c347defaa92f0664553b805c7d76bbfce5f330aca220ac90a789380fc479ea0d8793205813cca590a912f699ad52f991a1bc0a503c3ec4b2a696719e3c26591a87127f7305cc7e72f4c8e39355ebb06a5b1042990f38710ee7aa612ee4374bb82e878585a70a96c2a6b47f101a4ff154be4fd76a3167577a5cc54d9167c154c69ac35485e44cc898b719e1be3cc9c0fb5624b8f8a0dae10947a41bf848b6c1bb33d1006ec077d7e286e3f2a7b4843716390119449fe2721e81a5ed2333d331c7120765da58fadae73c19d9a8c4509cf8ac1e9d98b799a5274509069739b5823f3fb496663820033426988eefca53e580e0f9e0dfe0992fc2e53a97e053639f98577058f995bdbd41cefdb'
認証:
challenge = h'ef1deba56dce48f674a447ccf63b9599258ce87648e5c396f2ef0ca1da460e3b' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='none.ES256.long-credential-id', L=32) client_data_gen_flags = h'80' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='none.ES256.long-credential-id', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます ; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します auth_data_UV_BS = h'e5' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='none.ES256.long-credential-id', L=1) authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50d00000000' clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a22377833727057334f53505a307045664d396a75566d53574d36485a4935634f573875384d6f647047446a73222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d' signature = h'304502203ecef83fb12a0cae7841055f9f87103a99fd14b424194bbf06c4623d3ee6e3fd022100d2ace346db262b1374a6b70faa51f518a42ddca13a4125ce6f5052a75bac9fb6'
16.7. ES256 資格情報の Packed アテステーション
登録:
challenge = h'c1184a5fddf8045e13dc47f54b61f5a656b666b59018f16d870e9256e9952012' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='packed.ES256', L=32) credential_private_key = h'36ed7bea2357cefa8c4ec7e134f3312d2e6ca3058519d0bcb4c1424272010432' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='packed.ES256', L=32) >client_data_gen_flags = h'8d' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='packed.ES256', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます extraData_random = h'f5af1b3588ca0a05ab05753e7c29756a' = b64'9a8bNYjKCgWrBXU-fCl1ag' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='packed.ES256', L=16) >aaguid = h'876ca4f52071c3e9b25509ef2cdf7ed6' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='packed.ES256', L=16) >credential_id = h'c9a6f5b3462d02873fea0c56862234f99f081728084e511bb7760201a89054a5' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='packed.ES256', L=32) >; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます auth_data_UV_BE_BS = h'4f' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='packed.ES256', L=1) >attestation_private_key = h'ec2804b222552b4b277d1f58f8c4343c0b0b0db5474eb55365c89d66a2bc96be' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='packed.ES256', L=32) >attestation_cert_serial_number = h'88c220f83c8ef1feafe94deae45faad0' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='packed.ES256', L=16) clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a227752684b58393334424634543345663153324831706c61325a725751475046746877365356756d56494249222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a20396138624e596a4b436757724258552d66436c316167227d' attestationObject = h'a363666d74667061636b65646761747453746d74a363616c6726637369675847304502203f19ec4b229f46ab8c45eff29b904ff10c0390dc40bf1216f04a78f4ceba3425022100fe7041a32759aff05a0f9f26c70a999c7a284451ba89234a1d3483c25e21925b637835638159022530820221308201c8a00302010202110088c220f83c8ef1feafe94deae45faad0300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d03010703420004a91ba4389409dd38a428141940ca8feb1ac0d7b4350558104a3777a49322f3798440f378b3398ab2d3bb7bf91322c92eb23556f59ad0a836fec4c7663b0e4dc3a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e04160414a589ba72d060842ab11f74fb246bdedab16f9b9b301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d040302034700304402201726b9d85ecd8a5ed51163722ca3a20886fd9b242a0aa0453d442116075defd502207ef471e530ac87961a88a7f0d0c17b091ffc6b9238d30f79f635b417be5910e768617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b54d00000000876ca4f52071c3e9b25509ef2cdf7ed60020c9a6f5b3462d02873fea0c56862234f99f081728084e511bb7760201a89054a5a50102032620012158201cf27f25da591208a4239c2e324f104f585525479a29edeedd830f48e77aeae522582059e4b7da6c0106e206ce390c93ab98a15a5ec3887e57f0cc2bece803b920c423'
認証:
challenge = h'b1106fa46a57bef1781511c0557dc898a03413d5f0f17d244630c194c7e1adb5' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='packed.ES256', L=32) client_data_gen_flags = h'75' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='packed.ES256', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます extraData_random = h'019330c8cc486c3f3eba0b85369eabf1' = b64'AZMwyMxIbD8-uguFNp6r8Q' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0b', info='packed.ES256', L=16) >; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します auth_data_UV_BS = h'46' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0c', info='packed.ES256', L=1) authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50d00000000' clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2273524276704770587676463446524841565833496d4b4130453958773858306b526a44426c4d6668726255222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a20415a4d77794d78496244382d756775464e7036723851227d' signature = h'30450220694969d3ee928de6f02ef23a9c644d7d779916451734a94b432542f498a1ebe90221008b0819c824218a97152cd099c55bfb1477b29d900a49a64018314f9bfccda163'
16.8. ES384 資格情報の Packed アテステーション
登録:
challenge = h'567b030b3e186bc1d169dd45b79f9e0d86f1fd63474da3eade5bdb8db379a0c3' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='packed.ES384', L=32) credential_private_key = h'271e37d309c558c0f35222b37abba7500377d68e179e4c74b0cb558551b2e5276b47b90a317ca8ebbe1a12c93c2d5dd9' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='packed.ES384', L=48) >client_data_gen_flags = h'32' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='packed.ES384', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます aaguid = h'e950dcda3bdae1d087cda380a897848b' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='packed.ES384', L=16) >credential_id = h'953ae2dd9f28b1a1d5802c83e1f65833bb9769a08de82d812bc27c13fc6f06a9' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='packed.ES384', L=32) >; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます auth_data_UV_BE_BS = h'db' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='packed.ES384', L=1) >attestation_private_key = h'8d979fbb6e49c4eeb5925a2bca0fcdb023d3fb90bcadce8391da9da4ed2aee9a' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='packed.ES384', L=32) >attestation_cert_serial_number = h'3d0a5588bb87ebb1d4cee4a1807c1b7c' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='packed.ES384', L=16) clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a22566e7344437a3459613848526164314674352d65445962785f574e4854615071336c76626a624e356f4d4d222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d' attestationObject = h'a363666d74667061636b65646761747453746d74a363616c67266373696758473045022100c56ecc970b7843833e0f461fde26233f61eb395161d481558c08b9c6ed61675b022029f5e05033705cd0f9b0a07e149468ec308a4f84906409efdceb1da20a7518d6637835638159022530820221308201c7a00302010202103d0a5588bb87ebb1d4cee4a1807c1b7c300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d0301070342000417e5cc91d676d370e36aa7de40c25aacb45a3845f13d2932088ece2270b9b431241c219c22d0c256c9438ade00f2c05e62f8ef906b9b997ae9f3c460c2db66f5a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e04160414c7c8dd95382a2230e4c0dd3664338fa908169a9c301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d0403020349003046022100c56ecc970b7843833e0f461fde26233f61eb395161d481558c08b9c6ed61675b022029f5e05033705cd0f9b0a07e149468ec308a4f84906409efdceb1da20a7518d6637835638159022530820221308201c7a00302010202103d0a5588bb87ebb1d4cee4a1807c1b7c300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d0301070342000417e5cc91d676d370e36aa7de40c25aacb45a3845f13d2932088ece2270b9b431241c219c22d0c256c9438ade00f2c05e62f8ef906b9b997ae9f3c460c2db66f5a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e04160414c7c8dd95382a2230e4c0dd3664338fa908169a9c301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d040302034700304402201726b9d85ecd8a5ed51163722ca3a20886fd9b242a0aa0453d442116075defd502207ef471e530ac87961a88a7f0d0c17b091ffc6b9238d30f79f635b417be5910e768617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b55900000000e950dcda3bdae1d087cda380a897848b0020953ae2dd9f28b1a1d5802c83e1f65833bb9769a08de82d812bc27c13fc6f06a9a5010203382220022158304866bd8b01da789e9eb806e5eab05ae5a638542296ab057a2f1bbce9b58f8a08b9171390b58a37ac7fffc2c5f45857da2258302a0b024c7f4b72072a1f96bd30a7261aae9571dd39870eb29e55c0941c6b08e89629a1ea1216aa64ce57c2807bf3901a'
認証:
challenge = h'ff41c3d25dbd8966fb61e28ef5e47041e137ed268520412d76202ba0ad2d1453' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='packed.ES384', L=32) client_data_gen_flags = h'0c' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='packed.ES384', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます ; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します auth_data_UV_BS = h'af' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='packed.ES384', L=1) authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50d00000000' clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2273524276704770587676463446524841565833496d4b4130453958773858306b526a44426c4d6668726255222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a20415a4d77794d78496244382d756775464e7036723851227d' signature = h'30650220694969d3ee928de6f02ef23a9c644d7d779916451734a94b432542f498a1ebe90221008b0819c824218a97152cd099c55bfb1477b29d900a49a64018314f9bfccda163'
16.9. ES512 資格情報の Packed アテステーション
登録:
challenge = h'4ee220cd92b07e11451cb4c201c5755bd879848e492a9b12d79135c62764dc2fd28ead4808cafe5ad1de8fa9e08d4a8eeafea4dfb333877b02bc503f475d3b0c1394a7683baaf4f2477829f7b8cf750948985558748c073068396fcfdcd3f245bf2038e6bb38d7532768aad13be8c118f727722e7426139041e9caca503884c5' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='packed.ES512', L=128) credential_private_key = h'f11120594f6a4944ac3ba59adbbc5b85016895b649f4cc949a610f4b48be47b318850bacb105f747647bba8852b6b8e52a0b3679f1bbbdfe18c99409bcb644fa45' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='packed.ES512', L=65) >client_data_gen_flags = h'6d' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='packed.ES512', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます extraData_random = h'a37a958ce2f6b535a6e06c64cc8fd082' = b64'o3qVjOL2tTWm4GxkzI_Qgg' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='packed.ES512', L=16) >aaguid = h'39d8ce6a3cf61025775083a738e5c254' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='packed.ES512', L=16) >credential_id = h'd17d5af7e3f37c56622a67c8462c9e1c6336dfccb8b61d359dc47378dba58ce4' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='packed.ES512', L=32) >; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます auth_data_UV_BE_BS = h'cf' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='packed.ES512', L=1) >attestation_private_key = h'ffbc89d5f75994f52dc5e7538ee269402d26995d40c16fb713473e34fca98be4' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='packed.ES512', L=32) >attestation_cert_serial_number = h'8a128b7ebe52b993835779e6d9b81355' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='packed.ES512', L=16) clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a22547549677a5a4b7766684646484c544341635631573968356849354a4b707353313545317869646b33435f536a713149434d722d577448656a366e676a55714f3676366b33374d7a683373437646415f5231303744424f5570326737717654795233677039376a5064516c496d465659644977484d47673562385f63305f4a46767941343572733431314d6e614b72524f2d6a424750636e636935304a684f5151656e4b796c4134684d55222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a206f3371566a4f4c327454576d3447786b7a495f516767227d' attestationObject = h'a363666d74667061636b65646761747453746d74a363616c67266373696758473045022100ce158f6c04aa5c14c0dd3e1103cf93664896fb5c337a66dbd7dba31546ff0d41022071cbcd0d3b8e218a6d05374e0ef8031329d25059002ac1603d02d5fd8a0a29cb637835638159022730820223308201c8a0030201020211008a128b7ebe52b993835779e6d9b81355300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d03010703420004940b68885291536e2f7c60c05acfb252e7eebcf4304425dd93ab7b1962f20492bf18dc0f12862599e81fb764ac92151f9a78fcbb35d7a26c8c52949b18133c06a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e041604143ffad863abcd3dc5717b8a252189f41af97e7f31301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d0403020349003046022100ce158f6c04aa5c14c0dd3e1103cf93664896fb5c337a66dbd7dba31546ff0d41022071cbcd0d3b8e218a6d05374e0ef8031329d25059002ac1603d02d5fd8a0a29cb637835638159022730820223308201c8a0030201020211008a128b7ebe52b993835779e6d9b81355300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d0301070342000417e5cc91d676d370e36aa7de40c25aacb45a3845f13d2932088ece2270b9b431241c219c22d0c256c9438ade00f2c05e62f8ef906b9b997ae9f3c460c2db66f5a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e04160414c7c8dd95382a2230e4c0dd3664338fa908169a9c301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d040302034700304402201726b9d85ecd8a5ed51163722ca3a20886fd9b242a0aa0453d442116075defd502207ef471e530ac87961a88a7f0d0c17b091ffc6b9238d30f79f635b417be5910e768617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b55900000000e950dcda3bdae1d087cda380a897848b0020953ae2dd9f28b1a1d5802c83e1f65833bb9769a08de82d812bc27c13fc6f06a9a5010203382220022158304866bd8b01da789e9eb806e5eab05ae5a638542296ab057a2f1bbce9b58f8a08b9171390b58a37ac7fffc2c5f45857da2258302a0b024c7f4b72072a1f96bd30a7261aae9571dd39870eb29e55c0941c6b08e89629a1ea1216aa64ce57c2807bf3901a'
認証:
challenge = h'08d3190c6dcb3d4f0cb659a0333bf5ea124ddf36a0cd33d5204b0d7a22a8cc26f2e4f169d200285c77b3fb22e0f1c7f49a87d4be2d25e92d797808ddaaa9b5715efd3a6ada9339d3052a687dbc5d2f8c871b0451e0691f57ad138541b7b72e7aa8933729ec1c664bf2e4dedae1616d08ecefa80a2a53b103663ce5a881048829' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='packed.ES512', L=128) client_data_gen_flags = h'ac' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='packed.ES512', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます ; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します auth_data_UV_BS = h'52' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0b', info='packed.ES512', L=1) authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b51900000000' clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a22434e4d5a4447334c5055384d746c6d674d7a763136684a4e337a61677a5450564945734e65694b6f7a436279355046703067416f5848657a2d794c67386366306d6f66557669306c3653313565416a6471716d31635637394f6d72616b7a6e544253706f666278644c3479484777525234476b66563630546855473374793536714a4d334b6577635a6b7679354e376134574674434f7a7671416f71553745445a6a7a6c7149454569436b222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d' signature = h'3081870242009bda02fe384e77bcb9fb42b07c395b7a53ec9d9616dd0308ab8495c2141c8364c7d16e212a4a4fb8e3987ff6c99eafd64d8484fd28c3fc7968f658a9033d1bb1b802416383e9f3ee20c691b66620299fef36bea2df4d39c92b2ead92f58e7b79ab0d9864d2ebf3b0dcc66ea13234492ccee6e9d421db43c959bcb94c162dc9494136c9f6'
16.10. RS256 資格情報の Packed アテステーション
登録:
challenge = h'bea8f0770009bd57f2c0df6fea9f743a27e4b61bbe923c862c7aad7a9fc8e4a6' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='packed.RS256', L=32) ; 2 個の最小のメルセンヌ素数 2^p - 1(p ≥ 1024)を使用 private_key_p = 2 ^ 1279 -1 = h'7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' private_key_q = 2 ^ 2203 -1 = h'07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' client_data_gen_flags = h'1c' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='packed.RS256', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます aaguid = h'428f8878298b9862a36ad8c7527bfef2' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='packed.RS256', L=16) >credential_id = h'992a18acc83f67533600c1138a4b4c4bd236de13629cf025ed17cb00b00b74df' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='packed.RS256', L=32) >; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます auth_data_UV_BE_BS = h'7e' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='packed.RS256', L=1) >attestation_private_key = h'08a1322d5aa5b5b40cd67c2cc30b038e7921d7888c84c342d50d79f0c5fc3464' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='packed.RS256', L=32) >attestation_cert_serial_number = h'1f6fb7a5ece81b45896b983a995da5f3' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='packed.RS256', L=16) clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a2276716a776477414a76566679774e3976367039304f69666b7468752d6b6a79474c48717465705f49354b59222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d' attestationObject = h'a363666d74667061636b65646761747453746d74a363616c672663736967584730450221008b8c5c6ea8c142c032e0be69e1353d44461c5c9109941cdda951b976eb95b6b302204d52f406c19e254b3ff9589bd18070fb055ac8db12fdd0a6734bea9d7168e900637835638159022630820222308201c7a00302010202101f6fb7a5ece81b45896b983a995da5f3300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d03010703420004b7b36b7542a11120b443c794d0c99fdc25a06b76586413d81e086163ef6fe147a557afc34e2861d9057d6d465d4705a0310550bdeeb5f35ee35b9425ab859981a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e04160414fb37b647bccfb9e54d989eaaacc1633868703fb3301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d0403020349003046022100b86bc129d92afca7d9869a39f70f139a305b4073a39eb654d81424bed5757d91022100cf9f7c60cab7c4a7d3e7f0020f281a93d4fd0a9f95121b989f56932a68885fba68617574684461746159021bbfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b55d00000000428f8878298b9862a36ad8c7527bfef20020992a18acc83f67533600c1138a4b4c4bd236de13629cf025ed17cb00b00b74dfa4010303390100205901b403fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012143010001'
認証:
challenge = h'295f59f5fa8fe62c5aca9e27626c78c8da376ae6d8cd2dd29aebad601e1bc4c5' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='packed.RS256', L=32) client_data_gen_flags = h'0e' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='packed.RS256', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます ; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します auth_data_UV_BS = h'ba' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='packed.RS256', L=1) authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b51900000000' clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a224b56395a39667150356978617970346e596d7834794e6f33617562597a5333536d75757459423462784d55222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d' signature = h'01063d52d7c39b4d432fc7063c5d93e582bdcb16889cd71f888d67d880ea730a428498d3bc8e1ee11f2b1ecbe6c292b118c55ffaaddefa8cad0a54dd137c51f1eec673f1bb6c4d1789d6826a222b22d0f585fc901fdc933212e579d199b89d672aa44891333e6a1355536025e82b25590256c3538229b55737083b2f6b9377e49e2472f11952f79fdd0da180b5ffd901b4049a8f081bb40711bef76c62aed943571f2d0575304cb549d68d8892f95086a30f93716aee818f8dc06e96c0d5e0ed4cfa9fd8773d90464b68cf140f7986666ff9c9e3302acd0535d60d769f465e2ab57ef8aabc89fccfef7ba32a64154a8b3d26be2298f470b8cc5377dbe3dfd4b0b45f8f01e63bde6cfc76b62771f9b70aa27cf40152cad93aa5acd784fd4b90f676e2ea828d0bf2400aebbaae4153e5838f537f88b6228346782a93a899be66ec77de45b3efcf311da6321c92e6b0cd11bfe653bf3e98cee8e341f02d67dbb6f9c98d9e8178090cfb5b70fbc6d541599ac794ae2f1d4de1286ec8de8c2daf7b1d15c8438e90d924df5c19045220a4c8438c1b979bbe016cf3d0eeec23c3999d4882cc645b776de930756612cdc6dd398160ff02a6'
16.11. Ed25519 資格情報の Packed アテステーション
登録:
challenge = h'a8abf9dabdc6b0df63466b39bda9e8a34a34e185337a59f1c579990676d3b3bd' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='packed.EdDSA', L=32) private_key = h'971f38c0f73aaf0c5a614eb5e26430ae1ea0ed13e4f425d96e9662349340b0b3' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='packed.EdDSA', L=32) >client_data_gen_flags = h'bd' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='packed.EdDSA', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます extraData_random = h'07f0d3e60ed90fffbd3932d85f922f11' = b64'B_DT5g7ZD_-9OTLYX5IvEQ' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='packed.EdDSA', L=16) >aaguid = h'd5aa33581e8ca478e20fe713f5d32ff2' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='packed.EdDSA', L=16) >credential_id = h'ce9f840ed96599580cd140fbc7bb3230633f50f61041aff73308ae71caa8a2bd' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='packed.EdDSA', L=32) >; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます auth_data_UV_BE_BS = h'32' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='packed.EdDSA', L=1) >attestation_private_key = h'fbe7f950684f23afd045072a8b287ad29528707c662672850ac69733ffe0db85' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='packed.EdDSA', L=32) >attestation_cert_serial_number = h'b2cfc9ea33c8643b0e1a760463eaf164' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='packed.EdDSA', L=16) clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a22714b763532723347734e396a526d733576616e6f6f306f303459557a656c6e7878586d5a426e6254733730222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a20425f44543567375a445f2d394f544c59583549764551227d' attestationObject = h'a363666d74667061636b65646761747453746d74a363616c67266373696758483046022100d83f60bd80269537583218858aefb03ac57d45fa06e42feaae332d187f62da9f022100a02bd3cb6f7e1d283c93bad1f3f4b5a4c0494463da7fdbf256949116754d1f17637835638159022730820223308201c8a003020102021100b2cfc9ea33c8643b0e1a760463eaf164300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d03010703420004dd2b7a564b73b8c0b81c4c62e521925c4d1198ec9f583dbf1eebe364b65cd9c29a9bdf346aaa81fb6b9507e5249a52fdaf8e39e26b0b7dc45992a7e233b70f70a360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e041604140ae27546bc7eccb1b4b597bd354f0c0b1f1f8f8e301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d0403020349003046022100a0d434ecb5fc3bfd7da5f41904517ad2836249f561bd834ba7a438a8ab7a4ce8022100fac845bb7a02513b58e9f319654dbe49b0f02b95835bac568c71f8a18cdde9ab6861757468446174615881bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b54100000000d5aa33581e8ca478e20fe713f5d32ff20020ce9f840ed96599580cd140fbc7bb3230633f50f61041aff73308ae71caa8a2bda401010327200621582044e06ddd331c36a8dc667bab52bcae63486c916aa5e339e6acebaa84934bf832'
認証:
challenge = h'895957e01c633a698348a2d8a31a54b7db27e8c1c43b2080d79ae2190267bfd2' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='packed.EdDSA', L=32) client_data_gen_flags = h'8c' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='packed.EdDSA', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます ; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します auth_data_UV_BS = h'ab' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0b', info='packed.EdDSA', L=1) authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50100000000' clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2269566c583442786a4f6d6d44534b4c596f7870557439736e364d48454f7943413135726947514a6e763949222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d' signature = h'f5c59c7e46c34f6f8cc197101ddf9934fa2595f68eb1913a637e8419eb9ba4cfdfc48f85393bc0d40b011f0d6fecb097d6607525713223a0dc0d453993dae00b'
16.12. Ed448 資格情報の Packed アテステーション
登録:
challenge = h'2578d0801b5a005b5451e540121788cb01949e187b91db13f58755403efbf337' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='packed.Ed448', L=32) private_key = h'ed479eecf63bd89e3898434798bb3c417bfc8284f6f011958bc0e78edbf6a2a640c0e358b1b1452a1f3782c400dabb4134192dee3031869a45' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='packed.Ed448', L=57) >client_data_gen_flags = h'e3' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='packed.Ed448', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます extraData_random = h'050a80de27875521cc4c3316c06da42b' = b64'BQqA3ieHVSHMTDMWwG2kKw' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='packed.Ed448', L=16) >aaguid = h'41c913aeda925fe02273322e34c2ae67' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='packed.Ed448', L=16) >credential_id = h'224fcde324e6b075ede55098a24b9ddce5f5a7c71d23703efd528a38f8a5f33c' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='packed.Ed448', L=32) >; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます auth_data_UV_BE_BS = h'3b' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='packed.Ed448', L=1) >attestation_private_key = h'd90faf5cc3f7853456b09124dd870250347f9c9ff66dba363aecd9194c665715' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='packed.Ed448', L=32) >attestation_cert_serial_number = h'cff4228697d6e5ac47480b2390677f05' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='packed.Ed448', L=16) clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a224a586a5167427461414674555565564145686549797747556e6868376b6473543959645651443737387a63222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a2042517141336965485653484d54444d577747326b4b77227d' attestationObject = h'a363666d74667061636b65646761747453746d74a363616c67266373696758473045022100c5430b6b53f6b8fd1e5fa46ae7ebb8f9e9ae0d10ebc748e876e2d979b39b1382022008c5cda8af174f2d3c050d5d14eec0721031364cb12924a06633d4924c6bcad3637835638159022730820223308201c8a003020102021100cff4228697d6e5ac47480b2390677f05300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d03010703420004b85aaf790c824037cfe9fc56ab8d7ce6fbfaff2e3fe7c8d745734c3c6e3c6ce880d505ccdb1e2c3738680e6f49f475e4d8d0b6c29060e6e0d7a6392fb69094cea360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e04160414fa8f81c2dcc0e194ae5034c7e79dcf6d9d8593e2301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d0403020349003046022100e761f54215ad92f27c2c14b9eea3e39e8c22429e833ecba5be918987aa72e0e6022100d5a714df479c238586b7d9e6684ea84991087038b0fef6a29b57b66b74df05fd686175746844617461589bbfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b5590000000041c913aeda925fe02273322e34c2ae670020224fcde324e6b075ede55098a24b9ddce5f5a7c71d23703efd528a38f8a5f33ca4010103383420072158398051ef4f94670b5abf17da2e9558ba6eba94eb8704363915b4d666de287ad329de9f1f075211aba602dc6e7a5e52b15a8ee1c984a9f8887380'
認証:
challenge = h'1a942f401d8d8e36fe888c35c22b718217802fc6685bf139c47b311408128693' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='packed.Ed448', L=32) client_data_gen_flags = h'2d' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='packed.Ed448', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます extraData_random = h'5ca1e381b5e009e01760db2eb632316f' = b64'XKHjgbXgCeAXYNsutjIxbw' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0b', info='packed.Ed448', L=16) >; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します auth_data_UV_BS = h'fc' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0c', info='packed.Ed448', L=1) authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b51d00000000' clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a22477051765142324e6a6a622d6949773177697478676865414c385a6f575f4535784873784641675368704d222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a20584b486a6762586743654158594e7375746a49786277227d' signature = h'071db921430e13ca1a607eedb96cbd30fd63946a06e731217cad6fd82ba3b930d482308a2c101752a2518cff70918d4a20f29bd2eda4f45a80bba6c4ad85b10fb721b1849725b7dbef315d5fb101c6dab890b06d94a8b52a74b5848f68e6152af24867b7555d2b22b8955cbff5c87de73b00'
16.13. ES256 資格情報の TPM アテステーション
登録:
challenge = h'cfc82cdf1ceee876120aa88f0364f0910193460cfb97a317b2fe090694f9a299' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='tpm.ES256', L=32) credential_private_key = h'80c60805e564f6d33e7abdff9d32e3db09a6219fe378a268d23107191b18e39f' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='tpm.ES256', L=32) >client_data_gen_flags = h'84' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='tpm.ES256', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます aaguid = h'4b92a377fc5f6107c4c85c190adbfd99' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='tpm.ES256', L=16) >credential_id = h'ec27bec7521c894bbb821105ea3724c90e770cf1fa354157ef18d0f18f78bea9' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='tpm.ES256', L=32) >; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます auth_data_UV_BE_BS = h'af' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='tpm.ES256', L=1) >attestation_private_key = h'6210f09e0ce7593e851a880a4bdde2d2192afeac46104abce1a890a5a71cf0c6' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='tpm.ES256', L=32) >attestation_cert_serial_number = h'311fc42da0ab10c43a9b1bf3a75e34e2' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='tpm.ES256', L=16) clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a227a38677333787a753648595343716950413254776b51475452677a376c364d587376344a427054356f706b222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d' attestationObject = h'a363666d746374706d6761747453746d74a663616c67266373696758463044022066e5826a652091030fd444e33c3eca2bc6dc548cf3045013addb38aa6457a21002203f3a5c95c9e707d0e555041bcc8698ee4ebc04e26cc8bae459705471789851766376657263322e30637835638159023a30820236308201dca0030201020210311fc42da0ab10c43a9b1bf3a75e34e2300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a30003059301306072a8648ce3d020106082a8648ce3d03010703420004c54e3f109094f60d7699b7db5d838569ffd1f3e1c9e897cd9eb40063f9402e3e9937e936cf1fcd5eb743ff443c97ab2edcd7c8e0e6cf6cfd413b8ab19fffa769a381d33081d0300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e041604145f546cb6973d4981e80fcdc7463859f5879680e4301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e30100603551d250409300706056781050803305e0603551d110101ff04543052a450304e314c3014060567810502010c0b69643a30303030303030303014060567810502030c0b69643a3030303030303030301e060567810502020c15576562417574686e207465737420766563746f7273300a06082a8648ce3d0403020348003045022063c9a2797b8066f1db34dd609f1ab6695607e7a98e9ff8090a68853c9a9fc949022100a55831a39f5b8a2aa9a68837829cabf43fea2a5cea4859ae851cac78e6ac3e97677075624172656158560023000b0004000000000010001000030010002041202698c9d9753fb4bb3f27cd09fe6b8afdb76438ee2ae54d7c9dade10d864b0020d8735115cdb330a63ea1d6e43d5000f4bd56f99bce83ee1d73301fc270116d076863657274496e666f5869ff544347801700000020277d0e05579dd013215a62273f7f3a3e7e191ead2654a3036d75a5a3ee37a6b0000000000000000011111111222222223300000000000000000022000b9c42d8aad5939331b9af3711af179f17123178098c9a7d0ca89fcd1fc800f3c7000068617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b54d000000004b92a377fc5f6107c4c85c190adbfd990020ec27bec7521c894bbb821105ea3724c90e770cf1fa354157ef18d0f18f78bea9a501020326200121582041202698c9d9753fb4bb3f27cd09fe6b8afdb76438ee2ae54d7c9dade10d864b225820d8735115cdb330a63ea1d6e43d5000f4bd56f99bce83ee1d73301fc270116d07'
認証:
challenge = h'00093b66c21d5b5e89f7a07082118907ea3e502d343b314b8c5a54d62db202fb' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='tpm.ES256', L=32) client_data_gen_flags = h'86' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='tpm.ES256', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます ; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します auth_data_UV_BS = h'87' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='tpm.ES256', L=1) authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50d00000000' clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a2241416b375a7349645731364a393642776768474a422d6f2d554330304f7a464c6a46705531693279417673222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d' signature = h'3045022060dc76b1607ec716c6e5eba8d056695ed6bc47b2e3d7a729c34e759e3ab66aa0022100d010a9e8fddcb64c439dfdca628ddb33cf245d567d157d9f66f942601bed9b38'
16.14. ES256 資格情報の Android Key アテステーション
登録:
challenge = h'3de1f0b7365dccde3ff0cbf25e26ffa7baff87ef106c80fc865dc402d9960050' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='android-key.ES256', L=32) credential_private_key = h'd4328d911acb0ebcc42aad29b29ffb55d5bc31d8af7ca9a16703d56c21abc7b4' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='android-key.ES256', L=32) >client_data_gen_flags = h'73' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='android-key.ES256', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます extraData_random = h'555d5c42e476a8b33f6a63dfa07ccbd2' = b64'VV1cQuR2qLM_amPfoHzL0g' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='android-key.ES256', L=16) >aaguid = h'ade9705e1ce7085b899a540d02199bf8' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='android-key.ES256', L=16) >credential_id = h'0a4729519788b6ed8a2d772b494e186244d8c798c052960dbc8c10c915176795' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='android-key.ES256', L=32) >; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます auth_data_UV_BE_BS = h'1e' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='android-key.ES256', L=1) >attestation_cert_serial_number = h'1ff91f76b63f44812f998b250b0286bf' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='android-key.ES256', L=16) clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a2250654877747a5a647a4e345f384d76795869625f7037725f682d385162494438686c334541746d57414641222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a205656316351755232714c4d5f616d50666f487a4c3067227d' attestationObject = h'a363666d746b616e64726f69642d6b65796761747453746d74a363616c67266373696758483046022100e95512982aa3f216cff2e87c8ec57057b8529f674eaabeccaa27fd03d8779f19022100afb6bf459da4a826f00d01fc6b60712ff31dc4eb331619c8f874bb17e4314e94637835638159026f3082026b30820210a00302010202101ff91f76b63f44812f998b250b0286bf300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d0301070342000499169657036d089a2a9821a7d0063d341f1a4613389359636efab5f3cbf1accfdd91c55543176ea99b644406dd1dd63774b6af65ac759e06ff40b1c8ab02df6ba381a83081a5300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e041604141ac81e50641e8d1339ab9f7eb25f0cd5aac054b0301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e3045060a2b06010401d679020111043730350202012c0201000201000201000420b435028d7b6a8f83bb461d41c19b053a9d3cdb30351a4f374cd4cde8dbefb606040030003000300a06082a8648ce3d040302034900304602210081671f2474f336e6b5a868d28b47cd054c0ed4261f531fcdf1a1ceed19f600ad022100e7ac683848c34842a432ff4a26e9dbc537b88e83fc4cb59138de3ca3a3e1081468617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b55d00000000ade9705e1ce7085b899a540d02199bf800200a4729519788b6ed8a2d772b494e186244d8c798c052960dbc8c10c915176795a501020326200121582099169657036d089a2a9821a7d0063d341f1a4613389359636efab5f3cbf1accf225820dd91c55543176ea99b644406dd1dd63774b6af65ac759e06ff40b1c8ab02df6b'
認証:
challenge = h'e4ee05ca9dbced74116540f24ed9adc62aae8507560522844ffa7eea14f7af86' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='android-key.ES256', L=32) client_data_gen_flags = h'43' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='android-key.ES256', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます extraData_random = h'ab127107eff182bc3230beb5f1dad29c' = b64'qxJxB-_xgrwyML618drSnA' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='android-key.ES256', L=16) >; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します auth_data_UV_BS = h'4a' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0b', info='android-key.ES256', L=1) authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50900000000' clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a22354f344679703238375851525a55447954746d74786971756851645742534b45545f702d36685433723459222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a2071784a78422d5f78677277794d4c3631386472536e41227d' signature = h'3045022100a2b5e37da43ceb63566f6e2817c6cbef261073d0cadfd213ff6229bd33ddea6c02203d77eb3202fc92b9b5bb843ef082c7766f8c7f23194c92708ff2f3d1de765a8f'
16.15. ES256 資格情報の Apple 匿名アテステーション
登録:
challenge = h'f7f688213852007775009cf8c096fda89d60b9a9fb5a50dd81dd9898af5a0609' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='apple.ES256', L=32) credential_private_key = h'de987bd9d43eeb44728ce0b14df11209dff931fb56b5b1948de4c0da1144ded0' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='apple.ES256', L=32) >client_data_gen_flags = h'5f' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='apple.ES256', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます extraData_random = h'4e32cf9e939a5d052b14d71b1f6b5364' = b64'TjLPnpOaXQUrFNcbH2tTZA' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='apple.ES256', L=16) >aaguid = h'748210a20076616a733b2114336fc384' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='apple.ES256', L=16) >credential_id = h'9c4a5886af9283d9be3e9ec55978dedfdce2e3b365cab193ae850c16238fafb8' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='apple.ES256', L=32) >; auth_data_UV_BE_BS は認証器データフラグの UV、BE、BS ビットを決定しますが、BS は BE が設定されている場合にのみ設定されます auth_data_UV_BE_BS = h'2a' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='apple.ES256', L=1) >attestation_cert_serial_number = h'394275613d5310b81a29ce90f48b61c1' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='apple.ES256', L=16) clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a22395f61494954685341486431414a7a34774a6239714a316775616e37576c4464676432596d4b396142676b222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73652c22657874726144617461223a22636c69656e74446174614a534f4e206d617920626520657874656e6465642077697468206164646974696f6e616c206669656c647320696e20746865206675747572652c207375636820617320746869733a20546a4c506e704f6158515572464e6362483274545a41227d' attestationObject = h'a363666d74656170706c656761747453746d74a1637835638159025c30820258308201fea0030201020210394275613d5310b81a29ce90f48b61c1300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d030107034200048a3d5b1b4c543a706bf6e4b00afedb3c930b690dd286934fe2911f779cc7761af728e1aa3b0ff66692192daa776b83ddf8e3340d2d9a0eabdfc324eb3e2f136ca38196308193300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e0416041412f1ce6c0ae39b403bfc9200317bc183a4e4d766301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e303306092a864886f76364080204263024a1220420d7a86e7233fb843eb0eeb407d8b76ff7e4f82d218cf5dbb461d752073f5cb29a300a06082a8648ce3d0403020348003045022070f5c2ede3000e9dae358d412b26a4acbf18f4cdeb80f5b13fcd564d090c39ec022100f672e2c3dbe117c9b1490b3c660abf5dcd74398187082dacb58b6744de4aca6068617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b54900000000748210a20076616a733b2114336fc38400209c4a5886af9283d9be3e9ec55978dedfdce2e3b365cab193ae850c16238fafb8a50102032620012158208a3d5b1b4c543a706bf6e4b00afedb3c930b690dd286934fe2911f779cc7761a225820f728e1aa3b0ff66692192daa776b83ddf8e3340d2d9a0eabdfc324eb3e2f136c'
認証:
challenge = h'd3eb2964641e26fed023403a72dde093b19c4ba9008c3f9dd83fcfd347a66d05' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='apple.ES256', L=32) client_data_gen_flags = h'c2' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='apple.ES256', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます ; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します auth_data_UV_BS = h'e2' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'0a', info='apple.ES256', L=1) authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50900000000' clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a22302d73705a4751654a76375149304136637433676b37476353366b416a442d6432445f503030656d625155222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d' signature = h'3046022100ee35db795ce28044e1f8231d68b3d79a9882f7415aa35c1b5ac74d24251073c8022100dcc65691650a412d0ceef843710c09827acf26c7845bddac07eec95863e7fc4c'
16.16. ES256 資格情報の FIDO U2F アテステーション
登録:
challenge = h'e074372990b9caa507a227dfc67b003780c45325380d1a90c20f81ed7d080c06' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'00', info='fido-u2f.ES256', L=32) credential_private_key = h'51bd002938fa10b83683ac2a2032d0a7338c7f65a90228cfd1f61b81ec7288d0' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'01', info='fido-u2f.ES256', L=32) >client_data_gen_flags = h'00' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'02', info='fido-u2f.ES256', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます aaguid = h'afb3c2efc054df425013d5c88e79c3c1' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'03', info='fido-u2f.ES256', L=16) >credential_id = h'a4ba6e2d2cfec43648d7d25c5ed5659bc18f2b781538527ebd492de03256bdf4' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'04', info='fido-u2f.ES256', L=32) >attestation_private_key = h'66fda477a2a99d14c5edd7c1041a297ba5f3375108b1d032b79429f42349ce33' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'05', info='fido-u2f.ES256', L=32) >attestation_cert_serial_number = h'04f66dc6542ea7719dea416d325a2401' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'06', info='fido-u2f.ES256', L=16) clientDataJSON = h'7b2274797065223a22776562617574686e2e637265617465222c226368616c6c656e6765223a22344851334b5a4335797155486f696666786e73414e344445557955344452715177672d4237583049444159222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d' attestationObject = h'a363666d74686669646f2d7532666761747453746d74a26373696758473045022100f41887a20063bb26867cb9751978accea5b81791a68f4f4dd6ea1fb6a5c086c302204e5e00aa3895777e6608f1f375f95450045da3da57a0e4fd451df35a31d2d98a637835638159022530820221308201c7a003020102021004f66dc6542ea7719dea416d325a2401300a06082a8648ce3d0403023062311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331253023060355040b0c1c41757468656e74696361746f72204174746573746174696f6e204341310b30090603550406130241413020170d3234303130313030303030305a180f33303234303130313030303030305a305f311e301c06035504030c15576562417574686e207465737420766563746f7273310c300a060355040a0c0357334331223020060355040b0c1941757468656e74696361746f72204174746573746174696f6e310b30090603550406130241413059301306072a8648ce3d020106082a8648ce3d0301070342000456fffa7093dede46aefeefb6e520c7ccc78967636e2f92582ba71455f64e93932dff3be4e0d4ef68e3e3b73aa087e26a0a0a30b02dc2aa2309db4c3a2fc936dea360305e300c0603551d130101ff04023000300e0603551d0f0101ff040403020780301d0603551d0e04160414420822eb1908b5cd3911017fbcad4641c05e05a3301f0603551d2304183016801445aff715b0dd786741fee996ebc16547a3931b1e300a06082a8648ce3d040302034800304502200d0b777f0a0b181ad2830275acc3150fd6092430bcd034fd77beb7bdf8c2d546022100d4864edd95daa3927080855df199f1717299b24a5eecefbd017455a9b934d8f668617574684461746158a4bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b54100000000afb3c2efc054df425013d5c88e79c3c10020a4ba6e2d2cfec43648d7d25c5ed5659bc18f2b781538527ebd492de03256bdf4a5010203262001215820b0d62de6b30f86f0bac7a9016951391c2e31849e2e64661cbd2b13cd7d5508ad225820503b0bda2a357a9a4b34475a28e65b660b4898a9e3e9bbf0820d43494297edd0'
認証:
challenge = h'f90c612981d84f599438de1a500f76926e92cc84bef8e02c6e23553f00485435' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'07', info='fido-u2f.ES256', L=32) client_data_gen_flags = h'2c' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'08', info='fido-u2f.ES256', L=1) >; client_data_gen_flags のビット 0x01 が 1 の場合に限り extraData が clientDataJSON に追加されます ; auth_data_UV_BS は登録時に BE が設定されていた場合にのみ BS を設定します auth_data_UV_BS = h'd1' ; 派生元: HKDF-SHA-256(IKM='WebAuthn test vectors', salt=h'09', info='fido-u2f.ES256', L=1) authenticatorData = h'bfabc37432958b063360d3ad6461c9c4735ae7f8edd46592a5e0f01452b2e4b50100000000' clientDataJSON = h'7b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a222d5178684b59485954316d554f4e3461554139326b6d36537a49532d2d4f417362694e5650774249564455222c226f726967696e223a2268747470733a2f2f6578616d706c652e6f7267222c2263726f73734f726967696e223a66616c73657d' signature = h'304402206172459958fea907b7292b92f555034bfd884895f287a76200c1ba287239137002204727b166147e26a21bbc2921d192ebfed569b79438538e5c128b5e28e6926dd7'
16.17. WebAuthn 拡張のテストベクター (WebAuthn Extensions)
このセクションでは、WebAuthn 拡張の例示値を示します。
16.17.1. 疑似乱数関数拡張 (prf)
このセクションでは、疑似乱数関数(prf)拡張の例示値を示します。
prf拡張は CTAP2 の
hmac-secret 拡張 [FIDO-CTAP] と統合するため、
例は 2 つの部分に分かれています:
WebAuthn クライアントおよび WebAuthn Relying Party に関連する WebAuthn の prf
拡張の入力と出力の例、および WebAuthn の prf
拡張と CTAP2 の hmac-secret 拡張間の対応例(WebAuthn クライアントと WebAuthn 認証器に関連)です。
16.17.1.1. Web 認証 API
以下の例は、WebAuthn クライアント 実装および WebAuthn Relying Party における prf 拡張のテストに使用できます。 例は網羅的ではありません。
-
enabled出力は登録セレモニーの間は常に存在し、 認証セレモニーの間は決して存在しません:// Example extension inputs: { prf: { } // Example client extension outputs from navigator.credentials.create(): { prf: { enabled: true } } { prf: { enabled: false } } // Example client extension outputs from navigator.credentials.get(): { prf: { } } -
results出力は、登録セレモニーまたは 認証セレモニー の間に、evalまたはevalByCredential入力が存在する場合に現れることがあります:// Example extension inputs: { prf: { eval: { first: new Uint8Array([ 1 , 2 , 3 , 4 ]) } } } // Example client extension outputs from navigator.credentials.create(): { prf: { enabled: true } } { prf: { enabled: false } } { prf: { enabled: true , results: { first: ArrayBuffer} } } // Example client extension outputs from navigator.credentials.get(): { prf: { } } { prf: { results: { first: ArrayBuffer} } } -
出力は、results.secondresults出力が存在し、かつ選択された PRF 入力に入力が存在した場合に限り現れます:second// Example extension inputs: { 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 ]), } } } } // Example client extension outputs from navigator.credentials.get() if credential "e02eZ9lP..." was used: { prf: { results: { first: ArrayBuffer} } } // Example client extension outputs from navigator.credentials.get() if a different credential was used: { prf: { } } { prf: { results: { first: ArrayBuffer, second: ArrayBuffer} } } -
firstおよびsecond出力は任意のBufferSource型になり得ます。 同一のfirstおよびsecond入力は同一の対応する出力をもたらします:// Example extension inputs: { prf: { evalByCredential: { "e02eZ9lPp0UdkF4vGRO4-NxlhWBkL1FCmsmb1tTfRyE" : { first: new Uint8Array([ 9 , 10 , 11 , 12 ]), second: new Uint8Array([ 9 , 10 , 11 , 12 ]) } } } } // Example client extension outputs from 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.17.1.2. CTAP2 の hmac-secret 拡張
以下の例は、WebAuthn クライアント 実装が
prf
拡張で CTAP2 の hmac-secret 拡張をどのように使用するかをテストするために使用できます。
例は CDDL 表記 [RFC8610]
で示します。
例は網羅的ではありません。
-
以下の共有定義は以降のすべての例で使用されます:
; Given input parameters: 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 を用いた単一入力の場合:
; Inputs from Relying Party: prf_eval_first = h'576562417574686e20505246207465737420766563746f727302' ; Client computes: shared_secret = h'0c63083de8170101d38bcf8bd72309568ddb4550867e23404b35d85712f7c20d8bc911ee23c06034cbc14290b9669bec07739053c5a416e313ef905c79955876' salt1 = h'527413ebb48293772df30f031c5ac4650c7de14bf9498671ae163447b6a772b3' salt_enc = h'23dde5e3462daf36559b85c4ac5f9656aa9bfd81c1dc2bf8533c8b9f3882854786b4f500e25b4e3d81f7fc7c74236229' ; Authenticator computes: output1 = h'3c33e07d202c3b029cc21f1722767021bf27d595933b3d2b6a1b9d5dddc77fae' output_enc = h'3bfaa48f7952330d63e35ff8cd5bca48d2a12823828915749287256ab146272f9fb437bf65691243c3f504bd7ea6d5e6' ; Client decrypts: prf_results_first = h'3c33e07d202c3b029cc21f1722767021bf27d595933b3d2b6a1b9d5dddc77fae' -
PIN プロトコル 2 を用いた二入力の場合:
; Inputs from Relying Party: prf_eval_first = h'576562417574686e20505246207465737420766563746f727302' prf_eval_second = h'576562417574686e20505246207465737420766563746f727303' ; Client computes: shared_secret = h'0c63083de8170101d38bcf8bd72309568ddb4550867e23404b35d85712f7c20d8bc911ee23c06034cbc14290b9669bec07739053c5a416e313ef905c79955876' salt1 = h'527413ebb48293772df30f031c5ac4650c7de14bf9498671ae163447b6a772b3' salt2 = h'd68ac03329a10ee5e0ec834492bb9a96a0e547baf563bf78ccbe8789b22e776b' salt_enc = h'd9f4236403e0fe843a8e4e5be764d120904c198ad6e77b089876a3391961f183b0008b4ca66b91cd72aa35b6151ff981f6e5649f3c040e6615ad7dd8ae96ef23b229a5c97c3f0dcd8605eee166ce163a' ; Authenticator computes: output1 = h'3c33e07d202c3b029cc21f1722767021bf27d595933b3d2b6a1b9d5dddc77fae' output2 = h'a62a8773b19cda90d7ed4ef72a80a804320dbd3997e2f663805ad1fd3293d50b' output_enc = h'90ee52f739043bc17b3488a74306d7801debb5b61f18662c648a25b5b5678ede482cdaff99a537a44f064fcb10ce6e04dfd27619dc96a0daff8507e499296b1eecf0981f7c8518b277a7a3018f5ec6fb' ; Client decrypts: prf_results_first = h'3c33e07d202c3b029cc21f1722767021bf27d595933b3d2b6a1b9d5dddc77fae' prf_results_second = h'a62a8773b19cda90d7ed4ef72a80a804320dbd3997e2f663805ad1fd3293d50b' -
PIN プロトコル 1 を用いた単一入力の場合:
; Inputs from Relying Party: prf_eval_first = h'576562417574686e20505246207465737420766563746f727302' ; Client computes: shared_secret = h'23e5ed7157c25892b77732fb9c8a107e3518800db2af4142f9f4adfacb771d39' salt1 = h'527413ebb48293772df30f031c5ac4650c7de14bf9498671ae163447b6a772b3' salt_enc = h'ab8c878bb05d04700f077ed91845ec9c503c925cb12b327ddbeb4243c397f913' ; Authenticator computes: output1 = h'3c33e07d202c3b029cc21f1722767021bf27d595933b3d2b6a1b9d5dddc77fae' output_enc = h'15d4e4f3f04109b492b575c1b38c28585b6719cf8d61304215108d939f37ccfb' ; Client decrypts: 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) -
PIN プロトコル 2 の単一入力
salt_encのiv: 切り詰めたSHA-256(seed || 0x07) -
PIN プロトコル 2 の二入力
salt_encのiv: 切り詰めたSHA-256(seed || 0x08) -
PIN プロトコル 2 の単一入力
output_encのiv: 切り詰めたSHA-256(seed || 0x09) -
PIN プロトコル 2 の二入力
output_encのiv: 切り詰めたSHA-256(seed || 0x0a)
17. 謝辞
We thank the following people for their reviews of, and contributions to, this specification: Yuriy Ackermann, James Barclay, Richard Barnes, Dominic Battré, Julien Cayzac, Domenic Denicola, Rahul Ghosh, Brad Hill, Nidhi Jaju, Jing Jin, Wally Jones, Ian Kilpatrick, Axel Nennker, Zack Newman, Yoshikazu Nojima, Kimberly Paulhamus, Adam Powers, Yaron Sheffer, Anne van Kesteren, Johan Verrept, and Boris Zbarsky.Thanks to Adam Powers for creating the overall registration and authentication flow diagrams (Figure 1 and Figure 2).
We thank Anthony Nadalin, John Fontana, and Richard Barnes for their contributions as co-chairs of the Web Authentication Working Group.
We also thank Simone Onofri, Philippe Le Hégaret, Wendy Seltzer, Samuel Weiler, and Harry Halpin for their contributions as our W3C Team Contacts.
18. 改訂履歴
This section is not normative.
このセクションは、本仕様に対して時間をかけて加えられた重要な変更点の要約です。
18.1. Web Authentication Level 2 [webauthn-2-20210408] 以降の変更
18.1.1. 実質的な変更点
次の変更は、Web Authentication API とその動作方法に対して行われました。
変更点:
-
タイムアウトに関するガイダンスの更新: § 15.1 セレモニータイムアウトの推奨範囲
-
uvm拡張はもはや含まれません; 代わりに L2 を参照してください [webauthn-2-20210408]。 -
aaguid が attested credential data 内で、
attestation優先がnoneの場合にゼロ化されないようになりました: § 5.1.3 新しい資格情報を作成する - PublicKeyCredential の [[Create]](origin, options, sameOriginWithAncestors) 内部メソッド -
ESP256 (-9), ESP384 (-51) および ESP512 (-52) 公開鍵は非圧縮形式を使用する要件を追加しました: § 5.8.5 暗号アルゴリズム識別子 (typedef COSEAlgorithmIdentifier)
-
§ 5.6 Abort Operations with AbortSignal におけるドキュメントがフォーカスを失ったときに中止する推奨を削除しました。
廃止事項:
-
登録パラメータ
: § 5.4.1 Public Key Entity Description (dictionary PublicKeyCredentialEntity)publicKey.rp.name -
tokenBinding は [RESERVED] に変更されました。
-
フィールド内の言語および方向のメタデータはもはや推奨されません:
-
COSEAlgorithmIdentifier値 -9, -51, -52 および -19 をpubKeyCredParamsで使用することに対する推奨を追加しました。
新機能:
-
新しい JSON (逆)シリアライズ方法:
-
クロスオリジン iframe 内での作成操作:
-
create の条件付き仲介 (conditional mediation): § 5.1.3
-
get の条件付き仲介: § 5.1.4 既存の資格情報を使ってアサーションを作成する
-
§ 5.1.7 クライアント機能の可用性 - PublicKeyCredential の getClientCapabilities() メソッド
-
新しい列挙値
hybridを § 5.8.4 Authenticator Transport 列挙 (enum AuthenticatorTransport) に追加。 -
新しい client data 属性
topOrigin: § 5.8.1 WebAuthn 署名で用いるクライアントデータ (dictionary CollectedClientData) -
Authenticator data フラグの BE と BS の割り当て:
-
登録パラメータ
: § 5.4 Credential 作成オプション (dictionary PublicKeyCredentialCreationOptions)publicKey.attestationFormats
18.1.2. 編集上の変更
明確さ、可読性、ナビゲーション性などを改善するために、次の変更が行われました。
-
§ 1.2 ユースケース を展開して、展開状況の進展を反映しました。
-
保存すべきデータと登録と認証セレモニーの間でそれがどのように関連するかを形式化するために、credential record 概念を導入しました。
-
エラー条件の明確化:
-
§ 6.4 文字列処理 を、責任の分担を明確にするために § 6.4.1.1 クライアントによる文字列切り捨て と § 6.4.1.2 認証器による文字列切り捨て に分割しました。
-
§ 16 テストベクター を追加しました。
-
「注」ブロックの外に規範的言語を移動しました。
-
Web Authentication: An API for accessing Public Key Credentials - Level 3 § sctn-isUserVerifyingPlatformAuthenticatorAvailable および Web Authentication: An API for accessing Public Key Credentials - Level 3 § sctn-getClientCapabilities における、パーミッションポリシーに関する古い注記を削除しました。
-
Web Authentication: An API for accessing Public Key Credentials - Level 3 § sctn-sample-registration の例コードにアルゴリズム -8 (EdDSA) を追加しました。