Web Cryptography Level 2

W3C 最初の公開作業草案

この文書についての詳細
このバージョン:
https://www.w3.org/TR/2025/WD-webcrypto-2-20250422/
最新の公開バージョン:
https://www.w3.org/TR/webcrypto-2/
最新の編集者草案:
https://w3c.github.io/webcrypto/
履歴:
https://www.w3.org/standards/history/webcrypto-2/
コミット履歴
編集者:
(Proton AG)
以前の編集者:
Mark Watson - まで
Ryan Sleevi - まで
フィードバック:
GitHub w3c/webcrypto (プルリクエスト, 新しい課題, 未解決の課題)

概要

この仕様は、ハッシュ化、 署名の生成と検証、暗号化と復号などの、 Webアプリケーションにおける基本的な暗号操作を実行するためのJavaScript APIについて記述します。 さらに、この仕様は、アプリケーションがこれらの操作を実行するために必要な 鍵材料を生成および/または管理するためのAPIについて記述します。 このAPIの用途は、ユーザーまたはサービスの認証、文書または コードの署名、ならびに通信の機密性と完全性に 及びます。

この文書のステータス

このセクションは、この 文書の公開時点におけるステータスを説明します。現在のW3C 公開物およびこの技術報告書の最新改訂版の一覧は、 https://www.w3.org/TR/ の W3C 標準および草案 インデックスで確認できます。

この文書は、Web Application Security Working Groupにより、 勧告トラックを使用して 最初の公開作業草案として公開されました。

最初の公開作業草案としての公開は、 W3Cおよびそのメンバーによる承認を意味するものではありません。

これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される可能性があります。 この文書を作業中のもの以外として引用することは不適切です。

この文書は、 W3C 特許 ポリシーの下で運営される グループによって作成されました。 W3Cは、 グループの成果物に関連して行われた 特許開示の公開一覧を維持しています。 そのページには、 特許を開示するための手順も含まれています。ある個人が、 その個人が Essential Claim(s)を含むと考える特許について 実際の知識を有している場合、 W3C 特許ポリシーのセクション6に従って その情報を開示しなければなりません。

この文書は、 2023年11月3日版W3C プロセス文書に準拠します。

1. はじめに

このセクションは非規範的です。

Web Cryptography APIは、ユーザーエージェントによって管理または公開される暗号用 鍵材料とやり取りするための低水準インターフェイスを定義します。このAPI自体は 鍵ストレージの基盤実装に依存しませんが、リッチWebアプリケーションが 生の鍵材料へのアクセスを必要とせずに、署名の生成と検証、 ハッシュ化と検証、暗号化と復号などの操作を実行できる 共通のインターフェイス群を提供します。

暗号変換は、 SubtleCryptoインターフェイスを介して公開されます。このインターフェイスは、一般的な 暗号操作を実行するための一連のメソッドを定義します。署名の生成と 検証、ハッシュ化と検証、暗号化と復号などの操作に加えて、 このAPIは、鍵生成、鍵導出、鍵のインポートとエクスポートのためのインターフェイスを提供します。

2. ユースケース

このセクションは非規範的です。

2.1 多要素認証

Webアプリケーションは、既存のユーザー名/パスワードベースの 認証方式を、ユーザーが何らかの秘密鍵材料へアクセスできることの証明に基づく 認証方法で拡張または置換したい場合があります。TLSクライアント証明書などの トランスポート層認証を使用する代わりに、 Webアプリケーションは、アプリケーション自体の内部で認証することによって提供される、より豊かなユーザー 体験を選好する場合があります。

Web Cryptography APIを使用すると、アプリケーションは適切なクライアント鍵を見つけることができます。その鍵は、 ユーザーエージェントを介して以前に生成されたもの、または Webアプリケーションによって帯域外で事前にプロビジョニングされたものかもしれません。次に、認証 チャレンジを復号し、その後に認証レスポンスへ署名するなどの暗号操作を実行できます。

この交換は、基盤となるトランスポートのプロパティに基づいて鍵を導出することにより、 クライアントが認証を行っているTLS セッションに認証を結び付けることで、さらに強化できます。

ユーザーがまだ自分のアカウントに関連付けられた鍵を持っていない場合、 Webアプリケーションは、ユーザーエージェントに新しい鍵を生成させるか、 ユーザーが選択した既存の鍵を再利用させることができます。

2.2 保護された文書交換

Webアプリケーションは、機密情報または個人情報を含む文書について、 TLS越しなどでそれらの文書が安全に受信された場合であっても、閲覧者を制限したい場合があります。

Web Cryptography APIを使用すると、アプリケーションは、文書を 秘密鍵で暗号化し、その鍵を許可された閲覧者に関連付けられた 公開鍵でラップすることによって、これを行うことができます。ユーザーエージェントがそのようなWebアプリケーションへ移動すると、 アプリケーションは文書の暗号化形式を送信します。次に、ユーザーエージェントは、 ユーザーの秘密鍵を使用して暗号化鍵をアンラップし、そこから 文書を復号して表示するよう指示されます。

2.3 クラウドストレージ

Webアプリケーションは、アップロード前に、リモートサービスプロバイダーに保存されるデータおよび 文書の機密性をユーザーが保護できるようにしたい場合があります。

Web Cryptography APIを使用すると、アプリケーションはユーザーに秘密鍵または 私有鍵を選択させ、任意で選択された鍵から暗号化鍵を導出し、 文書を暗号化してから、既存のAPIを使用して暗号化されたデータをサービスプロバイダーへアップロードできます。

このユースケースは、保護された文書 交換ユースケースに似ていますが、文書の閲覧者がユーザー本人に限定されます。

2.4 文書署名

Webアプリケーションは、物理的な署名を要求する代わりに、 文書への電子署名を受け入れたい場合があります。

Web Cryptography APIを使用すると、アプリケーションはユーザーに鍵を選択させることができます。 その鍵は帯域外で事前にプロビジョニングされていたもの、またはWeb アプリケーション専用に生成されたものかもしれません。この鍵を使用して、アプリケーションは、 ユーザーが文書を承諾した証拠として、何らかの データに対して署名操作を実行できます。

2.5 データ完全性保護

Webアプリケーションは、データをローカルにキャッシュしつつ、このデータが オフライン攻撃で変更されないことを保証したい場合があります。

Web Cryptography APIを使用すると、アプリケーションは、アプリケーション内に含まれる 公開鍵を使用して、データキャッシュの内容を検証できます。以前にデータが キャッシュへ追加されたとき、そのデータは対応する秘密鍵でサーバーによって署名されていたことになります。 キャッシュからデータを復元するときに署名を検証することで、クライアントは、 キャッシュされたデータが改ざんされていないことを保証します。

2.6 セキュアメッセージング

Webアプリケーションは、これらのメッセージがTLS越しなどで 安全に受信された場合であっても、off-the-record (OTR) メッセージングなどの方式を使用して メッセージ層セキュリティを採用したい場合があります。

Web Cryptography APIは、鍵合意を実行できるようにすることで、OTRおよび同様のメッセージ署名方式を可能にします。 二者は、共有暗号化鍵および メッセージ認証コード (MAC) 鍵を交渉し、メッセージの暗号化と復号を可能にし、 改ざんを防止できます。

2.7 JavaScript Object Signing and Encryption (JOSE)

Webアプリケーションは、IETF JavaScript Object Signing and Encryption (JOSE) Working Groupによって 定義された構造およびメッセージ形式とやり取りしたい場合があります。

Web Cryptography APIを使用すると、アプリケーションはJSON鍵形式 (JWK) で符号化された 鍵を読み取りおよびインポートし、デジタル署名またはMAC (JWS) を使用して 完全性が保護されたメッセージを検証したり、暗号化されたメッセージ (JWE) を復号したりできます。

3. 適合性

非規範的とマークされたセクションと同様に、この 仕様内のすべての作成ガイドライン、図、例、注記は非規範的です。この仕様内のそれ以外のすべては規範的です。

この文書内のキーワード MUSTREQUIRED、およびSHALL は、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] で説明されるように解釈されます。

次の適合性クラスは、この仕様によって定義されます:

適合ユーザーエージェント

ユーザーエージェントは、 実装に適用されるこの仕様内のすべてのMUSTレベル、 REQUIREDレベル、およびSHALLレベルの 基準を満たす場合、 適合ユーザーエージェント であると見なされます。この仕様は、この 製品クラスを指すために、「適合ユーザーエージェント」と「ユーザーエージェント」の両方の用語を使用します。

アルゴリズムまたは特定のステップとして表現された適合性要件は、 最終結果が同等である限り、任意の方法で実装できます。(特に、この 仕様で定義されるアルゴリズムは、従いやすいことを意図しており、高性能であることを意図していません。)

ECMAScriptを使用してこの仕様で定義されるAPIを実装するユーザーエージェントは、 この仕様がその仕様および用語を使用しているため、 Web IDL仕様 [WebIDL] で定義される ECMAScriptバインディングと整合する方法でそれらを実装しなければなりません。

特に明記されない限り、文字列比較は 大文字小文字を区別する方法で行われます。この仕様内で 「this」のように等幅フォントで書かれる文字列リテラルには、囲み引用符は含まれません。

3.1 拡張性

この仕様に対するベンダー固有の独自拡張は、強く非推奨です。 作者はそのような拡張を使用してはなりません。そうすることは相互運用性を低下させ、 ユーザーベースを断片化し、特定のユーザーエージェントのユーザーだけが 対象のコンテンツへアクセスできるようにするためです。

ベンダー固有の拡張が必要な場合、メンバーには、この仕様の将来バージョンとの 衝突を防ぐために、ベンダー固有の文字列を接頭辞として付けるべきです。 拡張は、拡張の使用が仕様内で定義された機能に矛盾せず、 その機能を非適合にしないように定義されなければなりません。

この仕様に対するベンダー中立の拡張が必要な場合、この 仕様をそれに応じて更新するか、この仕様内の要件を上書きする 拡張仕様を書くことができます。この仕様を自らの活動に適用する者が、 そのような拡張仕様の要件を認識すると決定した場合、それはこの仕様内の 適合性要件の目的における 適用可能仕様になります。 W3C Web Cryptography Working Groupによって定義された適用可能仕様は、 下の表に列挙されています。

仕様 参照
注記
読者は、上の表に対する更新について、この仕様の正誤表を参照することを勧められます。

4. 範囲

このセクションは非規範的です。

4.1 抽象化のレベル

この仕様は、さまざまなプラットフォーム固有または標準化された 暗号API間で共通する機能と特徴に焦点を当て、 1つまたは2つの実装に固有の特徴や機能を避けるよう試みています。そのため、このAPIは、 開発者が基盤となる鍵ストレージの実装を意識する必要を避ける抽象化レベルで、 鍵の生成、管理、および交換を可能にします。 このAPIは、基盤となる生の暗号用鍵材料に対する抽象化として、 CryptoKeyオブジェクトを中心に具体的に焦点を当てています。この背後にある意図は、 適合ユーザーエージェントが、ユーザーエージェントによって直接保存および 管理される鍵、一部のオペレーティングシステムが提供するユーザーごとの鍵ストアなどの 分離ストレージAPIを使用して保存または管理される可能性がある鍵、 またはセキュア要素などの鍵ストレージデバイス内にある鍵を公開できるほど十分に汎用的なAPIを可能にしつつ、 リッチWebアプリケーションが鍵を操作でき、 Webアプリケーションが基盤となる鍵ストレージの性質を認識する必要がないようにすることです。

4.2 暗号アルゴリズム

基盤となる暗号実装は適合ユーザーエージェント間で異なり、 政府または業界の規制、セキュリティのベストプラクティス、知的財産に関する 懸念、制約された運用環境などを含むがこれらに限定されないローカルポリシーの対象となる可能性があるため、 この仕様は、実装されなければならないアルゴリズムの必須セットを 指定しません。代わりに、アルゴリズムに依存しない方法で使用できる 共通のバインディング群、ユーザーエージェントまたは鍵ハンドルが基盤となるアルゴリズムを サポートしているかどうかを発見するための共通フレームワーク、および個々のアルゴリズムが 実装される場合におけるその動作の適合性要件群を定義します。

4.3 範囲外

このAPIは、アプリケーションが鍵材料を生成、取得、および操作できるようにしますが、 セキュア要素やスマートカードなど、特定の種類の 鍵ストレージにおける鍵のプロビジョニングを具体的に扱うものではありません。これは、そのようなプロビジョニング 操作には、ベンダーに依存しないインターフェイスの定義を不適切に際限のない作業にする ベンダー固有の詳細が伴うことが多いためです。さらに、このAPIは 暗号モジュールの発見を扱わず、また対処もしません。そのような概念は 基盤となるユーザーエージェントに依存し、一般的なオペレーティングシステム、 暗号ライブラリ、および実装間で移植可能な概念ではないためです。

5. 概念

このセクションは非規範的です。

5.1 基盤となる 暗号実装

この仕様は、適合ユーザーエージェントがユーザーエージェント 自体の内部で暗号操作を直接実装しておらず、 今後もそうしないことを仮定しますが、要求はしません。歴史的に、多くのユーザーエージェントは、 TLS内で使用されるものなどの暗号操作を、基盤となる オペレーティングシステムの一部として利用可能な既存のAPI、またはユーザー エージェントとは独立して管理される第三者モジュールへ委ねてきました。

CryptoKeyオブジェクトは、 [[handle]]という名前の内部スロットの使用を通じて、 JavaScript実行環境とこれらの基盤ライブラリとの間の橋渡しを表します。ハンドルは、 実装固有の不透明な型を表し、JavaScript型内では表現されない可能性があり、 スクリプト作者へ公開されることもありません。このように、 CryptoKeyオブジェクトは、JavaScript 実行環境にとって、基盤となる暗号 実装にとっての [[handle]]と概念的に等価です。

これらのAPIは、伝統的に、暗号プロバイダーという概念を中心に構築されています。これは、 一連のアルゴリズムの特定の実装に対する抽象化です。オペレーティングシステム またはライブラリには既定のプロバイダーが付属している場合があり、ユーザーはしばしば 追加のプロバイダーを追加したり、有効なアルゴリズムのセットを再構成したり、 暗号サービスの提供方法をその他の形でカスタマイズしたりすることができます。

ほとんどのユーザーエージェントは純粋にソフトウェアで実装された暗号 プロバイダーとやり取りするものと仮定されますが、この 仕様ではそれを要求しません。その結果、一部の実装の能力は 基盤となるハードウェアの能力によって制限される可能性があり、また、ユーザーが 基盤となる暗号ライブラリをどのように構成したかによっては、これは ユーザーエージェントにとって完全に不透明である可能性があります。

5.2 鍵ストレージ

この仕様は、 CryptoKeyオブジェクト用の新しいストレージ機構を明示的に提供しません。代わりに、 シリアル化および逆シリアル化手順CryptoKeyオブジェクトについて定義することにより、 シリアル化可能オブジェクトの保存をサポートする任意の既存または将来のWebストレージ 機構を使用して、CryptoKeyオブジェクトを保存できます。

実際には、ほとんどの作者は Indexed Database API [INDEXEDDB] を利用することが想定されます。これは、 キーがアプリケーションにとって意味のある何らかの文字列識別子であり、 値がCryptoKeyオブジェクトである、キー/値ペアの連想ストレージを可能にします。これにより、 鍵材料をアプリケーションまたはJavaScript環境へ公開することなく、 鍵材料の保存と取得が可能になります。さらに、これにより作者は、 任意の追加メタデータを CryptoKey自体とともに保存する完全な柔軟性を得られます。

6. セキュリティに関する考慮事項

このセクションは非規範的です。

6.1 実装者のための セキュリティに関する考慮事項

明示的なストレージ機構を提供しないことにより、この仕様は、 CryptoKeyオブジェクトが現在の実行 環境、およびその環境で利用可能な任意のストレージ機構(例: Indexed Database API)にスコープされることを想定しています。アプリケーション作者は、 自身のアプリケーションのセキュリティについてこれに依存します。同じ CryptoKeyオブジェクトを持つ2つのオリジンは、基盤となる 鍵への完全なアクセスを持ちます。 そのため、これらのアプリケーションからのメッセージは区別できず、これらのアプリケーションへ送信された メッセージは完全に復元できます。実装者は、作者が明示的に共有を選択していない限り (例: postMessageの使用を通じて)、 CryptoKeyオブジェクトが2つのオリジン間で共有されないことを 確実にすべきです

この仕様内で指定される多数のアルゴリズムは、かなり大きな素数の生成や、 特定の操作の反復実行など、計算量の多い処理を実行します。そのため、 悪意あるアプリケーションは、このAPIを誤用し、実装に大量の処理を 実行させようとして、実行中の他のアプリケーションへのアクセスまたはサービスを拒否する可能性があります。 実装は、実装が同時に実行する操作数を制限する、 実行環境に対して破壊的であることが知られている操作についてユーザーの同意を要求する、 または鍵サイズや反復回数などの属性に対してデバイス固有の制限を定義するなど、 これらのリスクを軽減する手段を講じるべきです。

6.2 作者のための セキュリティに関する考慮事項

この仕様には、さまざまな暗号操作についての説明が含まれており、その一部には 不適切に使用された場合に既知の弱点があります。アプリケーション開発者は注意を払い、 そのような問題を理解して軽減するために、適切かつ最新の暗号関連文献を確認しなければなりません。 一般に、アプリケーション開発者が新しい暗号プロトコルを発明することは 強く推奨されません。すべてのアプリケーションと同様に、この仕様の 利用者は、既存のプロトコルを使用することで最もよく支援されます。この仕様は、それらを 実装するために必要な構成要素を提供します。

この仕様で定義されるAPIを使用して意味のある暗号上の保証を提供するためには、 作者は、Webアプリケーションに対する既存の脅威、および採用されている基盤となる セキュリティモデルに精通していなければなりません。概念的には、スクリプトインジェクションなどの 問題は、他の運用環境におけるリモートコード実行と同等であり、悪意ある スクリプトの注入を許可すると、鍵またはデータの流出を可能にすることがあります。 スクリプトインジェクションは他のアプリケーションから発生する場合があり、その場合は Content Security Policyの慎重な使用によって軽減できることがあります。また、 悪意あるネットワーク仲介者から発生する場合があり、その場合はTransport Layer Securityの使用によって軽減できることがあります。

この仕様は、暗号鍵の保存のための特定の機構を定義しません。 既定では、Indexed Database APIの使用など、作者が鍵を永続化するための 特別な努力をしない限り、このAPIで作成された鍵は現在のページの存続期間 (例: ナビゲーションイベントまで)のみ有効です。異なるページ間または 複数の閲覧セッション間で同じ鍵を使用したい作者は、既存のWebストレージ技術を 採用しなければなりません。作者は、これらの技術のセキュリティ上の前提、 たとえば同一オリジンセキュリティモデルに注意すべきです。すなわち、同じスキーム、ホスト、 およびポートを共有する任意のアプリケーションは、パスなどの他の情報が異なっていても、 同じストレージパーティションへアクセスできます。作者は、postMessageなどの オリジン間共有の使用を通じて、このセキュリティを明示的に緩和することを選択できます。

作者は、この仕様が、基盤となる暗号鍵材料がどのように保存されるかについて、 実装に規範的な要件を課していないことに注意すべきです。唯一の 要件は、鍵材料が exportKeyおよびwrapKey操作の使用を通じる場合を除き、スクリプトへ公開されないことです。特に、 基盤となる暗号鍵材料がディスクへ永続化されないこと、場合によっては暗号化されずに 永続化されないこと、またユーザーまたはユーザーエージェントと同じ権限で実行される他の アプリケーションからアクセス不能であることは保証されません。デバイスストレージへアクセスできる 任意のアプリケーションまたはユーザーは、スクリプトでは禁止されている場合であっても、 鍵材料を復元できる可能性があります。

この仕様は、すべての参照がなくなった後に実装が鍵材料をどのように扱うかについて、 規範的な要件を課していません。すなわち、適合ユーザーエージェントは 鍵材料をゼロ化することを要求されず、CryptoKeyへのすべての 参照がなくなった後であっても、デバイスストレージまたは デバイスメモリ上で依然としてアクセス可能である可能性があります。

アプリケーションは、構造化複製アルゴリズムおよび postMessageなどのAPIの使用を通じて、オリジンなどのセキュリティ 境界を越えてCryptoKeyオブジェクトを共有できます。 基盤となる暗号鍵 材料へのアクセスは、extractable 属性に基づいて制限される場合がありますが、いったん鍵が宛先オリジンと共有されると、 送信元オリジンは後からその鍵へのアクセスを制限または取り消すことはできません。 そのため、作者は、宛先オリジンが、送信元オリジンが採用しているものと同じ 悪意あるスクリプトに対する軽減策を講じると信頼できることを慎重に確認しなければなりません。 さらに、送信元オリジンでスクリプトインジェクションが発生した場合、攻撃者は 攻撃者が制御するオリジンへ鍵を投稿する可能性があります。ユーザーエージェントが攻撃者の オリジンを訪問するたびに、ユーザーエージェントは、その鍵を使用して既存のメッセージの復号や 新しい不正なメッセージの作成などの暗号操作を実行するよう指示される可能性があります。

作者は、ユーザーがいつでもオリジンに関連付けられたストレージを消去することを選択でき、 その結果として鍵が破棄される可能性があることに注意すべきです。サーバー上などで 長期保存を提供することを意図したアプリケーションは、そのようなデータがアクセス不能になることを 防ぐために、鍵エスクローなどの技法を検討すべきです。作者は、鍵が 無期限に利用可能であると推定すべきではありません。

6.3 ユーザーのための セキュリティに関する考慮事項

この仕様で定義されるAPIを使用するアプリケーションのユーザーは、 採用されている暗号にかかわらず、これらのアプリケーションが交換されるすべてのメッセージへ 完全にアクセスできることに注意すべきです。すなわち、暗号化されたメッセージについても、 これらのAPIを使用するアプリケーションは復号されたメッセージにも完全にアクセスできます。

7. プライバシーに関する考慮事項

このセクションは非規範的です。

フィンガープリンティング
基盤となるプラットフォームの能力を反映する追加のAPIを公開することにより、この 仕様は、悪意あるアプリケーションが異なるユーザーエージェントまたはデバイスを 判定または区別することを可能にする場合があります。
スーパーCookie
この仕様は、悪意あるアプリケーションが既存のWebストレージ技術より長く存続する 識別子を作成する手段を提供しません。しかし、このAPIの将来の改訂または 追加の暗号能力、たとえばハードウェアに裏付けられたもの(例: スマートカードまたはTrusted Platform Modules)を 導入する際には注意が必要です。そのようなストレージは、任意の2人のユーザーが同じ 基盤鍵データを持たないように設計されていることを考えると、そのようなAPIは、ユーザーの意思に反して 永続的な識別子として使用される現実的なリスクを表す可能性があります。
ユーザーIDとしてのrandomUUIDの使用
randomUUIDユーザー IDの生成に有用ですが、グローバル 識別子を生成する能力を直接与えるものではありません。

8. 依存関係

この仕様は基盤となる仕様に依存します。

DOM

適合ユーザーエージェントは、 少なくともこの仕様が依存するDOMで定義された機能の部分集合をサポート しなければなりません。特に、Promiseおよび DOMExceptionをサポート しなければなりません。 [DOM]

HTML

適合ユーザーエージェントは、 少なくともこの仕様が依存するHTMLで定義された機能の部分集合をサポート しなければなりません。特に、 ArrayBufferView typedef およびシリアル化可能オブジェクトをサポートしなければなりません。 [HTML]

Web IDL

適合ユーザーエージェントは、 Web IDL仕様で説明されるように、この仕様内のIDL断片の 適合実装でなければなりません。[WebIDL]

9. 用語

用語 ArrayBufferArrayBufferView、および シリアル化可能 オブジェクトは、 HTML仕様 [HTML] によって定義されます。

用語DOMStringおよび BufferSourceは、 [WEBIDL] で定義されます。

用語バイトシーケンスは、 [Infra] で定義されます。

バイトシーケンスビット長は、その 長さに 8を乗じたものです。

ビットシーケンスbを含むバイトシーケンスとは、 結果として得られるビットシーケンスの長さが最小で、かつ8の整数倍になるように、 まず値0のビットを0個以上bへ追加し、 その文字列内の連続する8ビットの各シーケンスを1バイトとして考えることによって得られる バイトシーケンスです。

この仕様が、n * 8 がiの2を底とする対数より大きい場合に、 非負 整数iを長さnのバイトシーケンスへ変換すると言うとき、ユーザーエージェントは まずiの二進表現を最上位ビットから計算し、 長さn * 8 のビットシーケンスを形成するのに十分な0ビットを先頭に付加し、 その後、そのビットシーケンス内の連続する 8ビットの各シーケンスを1バイトとして考えることによって形成されるバイト シーケンスを返さなければなりません。

2つの文字列を大文字小文字を区別する 方法で比較するとは、コードポイントごとに正確に比較することを意味します。

2つの文字列をASCII大文字小文字を区別しない方法で 比較するとは、コードポイントごとに正確に比較することを意味します。ただし、 範囲U+0041 .. U+005A(すなわちLATIN CAPITAL LETTER AからLATIN CAPITAL LETTER Z)内の コードポイントと、範囲U+0061 .. U+007A内の対応するコードポイント (すなわちLATIN SMALL LETTER AからLATIN SMALL LETTER Z)も一致すると見なされます。

この仕様が、アルゴリズムを 終了すると言うとき、ユーザーエージェントは、現在のステップを完了した後に アルゴリズムを終了しなければなりません。参照されるアルゴリズムとは、処理中である可能性がある 基盤となる暗号アルゴリズムではなく、仕様で定義された処理ステップの集合です。

この仕様が、ASN.1 構造を解析すると言うとき、ユーザーエージェントは次のステップを実行しなければなりません:

  1. dataを、解析されるバイト列とします。

  2. structureを、解析されるASN.1構造とします。

  3. exactDataを任意のブール値とします。指定されていない場合、 trueに初期化されるものとします。

  4. [X690] の Distinguished Encoding Rulesに従って、structureを復号される ASN.1構造として使用し、dataを解析します。

  5. exactDataが指定されていて、dataのすべてのバイトが 解析フェーズ中に消費されなかった場合、 throw a DataError.

  6. 解析されたASN.1構造を返します。

この仕様が、subjectPublicKeyInfoを 解析すると言うとき、ユーザーエージェントは ASN.1構造を解析する必要があり、 dataを解析されるバイト列に設定し、structureを [RFC5280] で指定される subjectPublicKeyInfoのASN.1構造とし、 exactDatatrueに設定します。

この仕様が、PrivateKeyInfoを 解析すると言うとき、ユーザーエージェントは、dataを 解析されるバイト列に設定し、 structureを [RFC5208] で指定されるPrivateKeyInfoのASN.1構造とし、 exactDatatrueに設定して、ASN.1構造を解析する必要があります。

この仕様が、JWKを解析すると言うとき、ユーザー エージェントは次のステップを実行しなければなりません:

  1. dataを、解析されるバイト列とします。

  2. jsonを、dataをUTF-8に従って解釈した結果である Unicode文字列とします。

  3. jsonをUTF-16へ変換します。

  4. resultを、新しいグローバルオブジェクトのコンテキストで JSON.parse内部関数を実行した結果のオブジェクトリテラルとし、 text引数にはjsonを含むJavaScript Stringを設定します。

  5. keyを、resultJsonWebKeyのIDL辞書型へ変換した結果とします。

  6. keyktyフィールドが定義されていない場合、 throw a DataError.

  7. keyを返します。

この仕様が、2つのシーケンスaおよびb用途の 積集合を計算すると言うとき、その結果は、 abの両方に現れる各認識される鍵用途値を、 認識される鍵用途値のリストに列挙された順序で含む シーケンスでなければなりません。ここで、ある値がシーケンス内に現れるとは、その値に対して 大文字小文字を区別する文字列一致となる要素がシーケンス内に存在することを意味します。

この仕様が、usagesという 用途リストの正規化値を計算すると言うとき、その結果は、 usagesと、すべての認識される鍵用途値を含むシーケンスとの 用途の積集合でなければなりません。

この仕様が、objectの内部スロット[[slot]]に関連付けられた キャッシュされたECMAScript オブジェクトを参照するとき、 ユーザーエージェントは次のステップを実行しなければなりません:

  1. objectの[[slot_cached]]内部スロットがundefinedである場合:
    objectの[[slot_cached]]内部スロットを、 [WebIDL] で定義されるECMAScriptオブジェクトへの型変換を objectの[[slot]] 内部スロットの内容に対して実行した結果に設定します。
  2. objectの[[slot_cached]]内部スロットの内容を返します。

10. Cryptoインターフェイス

Cryptoインターフェイスは、 真にランダムな値でシードされた暗号的に強い擬似乱数生成器を含む、 汎用の暗号機能へのインターフェイスを表します。

WebIDLpartial interface mixin WindowOrWorkerGlobalScope {
  [SameObject] readonly attribute Crypto crypto;
};

[Exposed=(Window,Worker)]
interface Crypto {
  [SecureContext] readonly attribute SubtleCrypto subtle;
  ArrayBufferView getRandomValues(ArrayBufferView array);
  [SecureContext] DOMString randomUUID();
};
注記
実装は、オペレーティングシステムのエントロピー源(例: "/dev/urandom")などの 高品質なエントロピーでシードされた、十分に確立された暗号用擬似乱数生成器を使用して、 暗号的に強いランダム値を生成すべきです。この 仕様は、暗号的に強いランダム値に存在する情報理論的エントロピーについて 下限を定めませんが、実装は実用上可能な限り多くの エントロピーを提供するよう最善を尽くすべきです。
注記
このインターフェイスは、暗号的に強いランダム 値を取得するための同期メソッドを定義します。一部のデバイスおよび実装は、真にランダムな暗号用 数値生成器をサポートする場合、またはエントロピーが不足しているときにブロックするインターフェイスを 提供する場合がありますが、実装は、性能上の理由およびシステムのエントロピーを枯渇させることを避けるため、 getRandomValuesの実装時にこれらのソースを使用することを推奨されません。 代わりに、これらのソースは暗号用擬似乱数 生成器をシードするために使用されるべきであり、その生成器が効率的に適切な値を返せます。

10.1 メソッドとパラメーター

10.1.1 getRandomValues メソッド

getRandomValues メソッドは、暗号的に強いランダム値を生成します。これは次のように動作しなければなりません:

  1. arrayInt8ArrayUint8ArrayUint8ClampedArrayInt16ArrayUint16ArrayInt32ArrayUint32ArrayBigInt64Array、 またはBigUint64Arrayでない場合、 throw a TypeMismatchError し、 アルゴリズムを終了する

  2. byteLengthを、arrayバイト長とします。

  3. byteLengthが65536より大きい場合、throw a QuotaExceededError し、 アルゴリズムを終了する

  4. bytesを、長さ byteLengthバイトシーケンスとします。

  5. bytesを暗号的に安全なランダムバイトで埋めます。

  6. bytesarray書き込みます。

  7. arrayを返します。

注記

getRandomValuesメソッドを使用して鍵を生成してはなりません。代わりに generateKeyメソッドを 使用してください。

10.1.2 randomUUIDメソッド

randomUUID メソッドは、新しいバージョン4 UUIDを生成し、 [RFC4122] の セクション3で説明される 名前空間固有の 文字列表現を返します。 ランダムUUIDを生成するには:

  1. bytesを、長さ16のバイトシーケンスとします。
  2. bytesを暗号的に安全なランダムバイトで埋めます。
  3. UUIDバージョンを表す bytes[6]の上位4ビットを 0100に設定します。
  4. UUIDバリアントを表す bytes[8]の上位2ビットを 10に設定します。
  5. « の文字列連結を返します

    1. bytes[0]の16進 表現bytes[1]の16進表現bytes[2]の16進表現bytes[3]の16進表現
    2. "-",
    3. bytes[4]の16進 表現bytes[5]の16進表現
    4. "-",
    5. bytes[6]の16進 表現bytes[7]の16進表現
    6. "-",
    7. bytes[8]の16進 表現bytes[9]の16進表現
    8. "-",
    9. bytes[10]の16進 表現bytes[11]の16進表現bytes[12]の16進表現bytes[13]の16進表現bytes[14]の16進 表現bytes[15]の16進表現

    »。

ランダムUUIDを生成するアルゴリズムで説明されるステップについて、 バイトvalue16進表現とは、 valueASCII小文字16進 数字を使用して16進で表し、 2つのASCII小文字16進 数字に達するように左側を"0"で埋めて作成される2文字の文字列です。

10.2 属性

10.2.1 subtle属性

subtle属性は、 低水準の暗号プリミティブおよびアルゴリズムを提供する SubtleCryptoインターフェイスの インスタンスを提供します。

11. Algorithm辞書

Algorithm オブジェクトは、アルゴリズムおよび目的の操作を完全に指定するために必要な 任意の追加パラメーターを指定するために使用される辞書オブジェクト [WEBIDL] です。

WebIDLtypedef (object or DOMString) AlgorithmIdentifier;

typedef AlgorithmIdentifier HashAlgorithmIdentifier;

dictionary Algorithm {
  required DOMString name;
};

11.1 Algorithm辞書メンバー

name
使用する登録済みアルゴリズムの名前。

12. KeyAlgorithm辞書

KeyAlgorithm辞書は、与えられた CryptoKeyオブジェクトの内容に関する情報を表します。

WebIDLdictionary KeyAlgorithm {
  required DOMString name;
};

12.1 説明

このセクションは非規範的です。

KeyAlgorithm辞書は、 CryptoKeyの 固定された公開プロパティがどのようにアプリケーションへ反映されるかを文書化するのを助けるために提供されます。 実際の辞書型がアプリケーションへ公開されることはありません。

12.2 KeyAlgorithm辞書 メンバー

name
CryptoKeyを生成するために使用されたアルゴリズムの名前

13. CryptoKeyインターフェイス

CryptoKey オブジェクトは、ユーザーエージェントによって管理される鍵材料への不透明な参照を表します。

WebIDLenum KeyType { "public", "private", "secret" };

enum KeyUsage { "encrypt", "decrypt", "sign", "verify", "deriveKey", "deriveBits", "wrapKey", "unwrapKey" };

[SecureContext,Exposed=(Window,Worker),Serializable]
interface CryptoKey {
  readonly attribute KeyType type;
  readonly attribute boolean extractable;
  readonly attribute object algorithm;
  readonly attribute object usages;
};

13.1 説明

このセクションは非規範的です。

この仕様は、ユーザーエージェントによって管理される多くの異なる種類の鍵材料に対して 統一されたインターフェイスを提供します。これには、ユーザーエージェントによって生成された鍵、 ユーザーエージェントによって他の鍵から導出された鍵、ユーザー操作またはこのAPIの使用を通じて ユーザーエージェントへインポートされた鍵、ユーザーエージェントがアクセスできるソフトウェアまたはハードウェア内に 事前にプロビジョニングされた鍵、またはその他の方法でユーザーエージェントに利用可能にされた鍵が含まれる場合があります。 鍵という用語は、暗号操作のための実際の鍵、および鍵導出または交換操作内で得られる秘密値を含む、 任意の鍵材料を広く指します。

CryptoKeyオブジェクトは、基盤となる鍵ストレージ機構と直接インターフェイスすることを 要求されず、代わりに、暗号操作を実行するときなど、必要なときに 鍵材料を取得する方法をユーザーエージェントが理解するための参照であるだけの場合があります。

13.2 鍵インターフェイスのデータ型

KeyType
鍵の型。認識される 鍵型値は、 "public"、"private"、および"secret"です。 対称アルゴリズムに使用されるものを含む不透明な鍵材料は secretで表され、一方、 public/private鍵ペアから構成される非対称アルゴリズムの一部として使用される鍵は、 publicまたはprivateのいずれかになります。
KeyUsage
鍵を使用して実行できる操作の型。 認識される鍵用途値は、 encryptdecryptsignverifyderiveKeyderiveBitswrapKey、および unwrapKeyです。

13.3 CryptoKey内部スロット

すべてのCryptoKeyオブジェクトは、 鍵に関する情報を格納する一連の内部スロットを持ちます。 これらのスロットは、この仕様の一部として公開されません。これらは、実装がこの仕様を 実装するために使用する内部状態を表します。 [ECMA-262] で使用される表記規約がここでも再利用されます。 内部スロットは、二重角括弧[[ ]]で囲まれた名前によって識別されます。

すべてのCryptoKeyオブジェクトは、 [[type]][[extractable]][[algorithm]][[algorithm_cached]][[usages]][[usages_cached]]、 および [[handle]]という名前の内部スロットを持ちます。

[[algorithm]]内部 スロットの内容は、KeyAlgorithmであるか、またはそれから導出されたものでなければなりません。 [[usages]]内部 スロットの内容は、Sequence<KeyUsage>型でなければなりません。

注記

[[handle]]スロットは、 基盤となる暗号実装が論理鍵を表すために使用する任意のデータを含む不透明な型です。 異なる暗号実装は、整数として表される不透明識別子、ポインター型、または 識別情報を提供する構造体に至るまで、異なる型を使用する場合があります。 これらのハンドルがアプリケーションへ公開されることはありません。

13.4 CryptoKeyインターフェイスメンバー

type
基盤となる鍵の型を含む [[type]]内部 スロットを反映します。
extractable
生の鍵材料をアプリケーションによってエクスポートできるかどうかを示す [[extractable]]内部 スロットを反映します。
algorithm
[[algorithm]]内部スロットに関連付けられた キャッシュされたECMAScriptオブジェクトを返します。
usages
この鍵で使用することが許可される暗号操作を示す [[usages]]内部スロットに関連付けられた キャッシュされたECMAScriptオブジェクトを返します。

13.5 シリアル化および 逆シリアル化手順

CryptoKeyオブジェクトは、 シリアル化可能オブジェクトです。 valueおよびserializedが与えられたとき、その シリアル化 手順は次のとおりです:

  1. serialized.[[Type]]を、 value[[type]]内部スロットに設定します。
  2. serialized.[[Extractable]]を、 value[[extractable]]内部スロットに設定します。
  3. serialized.[[Algorithm]]を、 value[[algorithm]] 内部スロットの 部分シリアル化に 設定します。
  4. serialized.[[Usages]]を、 value[[usages]] 内部スロットの 部分シリアル化に 設定します。
  5. serialized.[[Handle]]を、 value[[handle]]内部スロットに設定します。

serializedおよびvalueが与えられたとき、その 逆シリアル化 手順は次のとおりです:

  1. value[[type]]内部 スロットをserialized.[[Type]]に初期化します。
  2. value[[extractable]]内部スロットを serialized.[[Extractable]]に初期化します。
  3. value[[algorithm]]内部スロットを、 serialized.[[Algorithm]]の 部分逆シリアル化に 初期化します。
  4. value[[usages]] 内部スロットを、 serialized.[[Usages]]の 部分逆シリアル化に 初期化します。
  5. value[[handle]] 内部スロットをserialized.[[Handle]]に初期化します。
注記
シリアル化されたCryptoKeyオブジェクトを 逆シリアル化するとき、そのオブジェクトが異なる型として逆シリアル化されないことが 重要です。これは 逆シリアル化 手順の定義によって規範的に要求されていますが、 そのような逆シリアル化は鍵材料の内容を公開する可能性があるため、特別な注意に値します。 その鍵材料は、場合によっては([[extractable]]内部スロットが falseである場合など)アプリケーションへ公開されるべきではありません。

14. SubtleCryptoインターフェイス

SubtleCryptoインターフェイスは、低水準の暗号プリミティブおよび アルゴリズムを扱うための一連のメソッドを提供します。

WebIDLenum KeyFormat { "raw", "spki", "pkcs8", "jwk" };

[SecureContext,Exposed=(Window,Worker)]
interface SubtleCrypto {
  Promise<ArrayBuffer> encrypt(
    AlgorithmIdentifier algorithm,
    CryptoKey key,
    BufferSource data
  );
  Promise<ArrayBuffer> decrypt(
    AlgorithmIdentifier algorithm,
    CryptoKey key,
    BufferSource data
  );
  Promise<ArrayBuffer> sign(
    AlgorithmIdentifier algorithm,
    CryptoKey key,
    BufferSource data
  );
  Promise<boolean> verify(
    AlgorithmIdentifier algorithm,
    CryptoKey key,
    BufferSource signature,
    BufferSource data
  );
  Promise<ArrayBuffer> digest(
    AlgorithmIdentifier algorithm,
    BufferSource data
  );

  Promise<(CryptoKey or CryptoKeyPair)> generateKey(
    AlgorithmIdentifier algorithm,
    boolean extractable,
    sequence<KeyUsage> keyUsages
  );
  Promise<CryptoKey> deriveKey(
    AlgorithmIdentifier algorithm,
    CryptoKey baseKey,
    AlgorithmIdentifier derivedKeyType,
    boolean extractable,
    sequence<KeyUsage> keyUsages
  );
  Promise<ArrayBuffer> deriveBits(
    AlgorithmIdentifier algorithm,
    CryptoKey baseKey,
    optional unsigned long? length = null
  );

  Promise<CryptoKey> importKey(
    KeyFormat format,
    (BufferSource or JsonWebKey) keyData,
    AlgorithmIdentifier algorithm,
    boolean extractable,
    sequence<KeyUsage> keyUsages
  );
  Promise<(ArrayBuffer or JsonWebKey)> exportKey(
    KeyFormat format,
    CryptoKey key
  );

  Promise<ArrayBuffer> wrapKey(
    KeyFormat format,
    CryptoKey key,
    CryptoKey wrappingKey,
    AlgorithmIdentifier wrapAlgorithm
  );
  Promise<CryptoKey> unwrapKey(
    KeyFormat format,
    BufferSource wrappedKey,
    CryptoKey unwrappingKey,
    AlgorithmIdentifier unwrapAlgorithm,
    AlgorithmIdentifier unwrappedKeyAlgorithm,
    boolean extractable,
    sequence<KeyUsage> keyUsages
  );
};
注記

SubtleCryptoインターフェイスは、必要な アルゴリズム上のセキュリティ保証を提供するために、これらのアルゴリズムの多くが 微妙な使用要件を持つという事実を反映して、「SubtleCrypto」と名付けられています。

たとえば、 カウンターモードのAESなどの認証されていない暗号化方式を直接使用すると、 入力内のビットを操作することによって出力内のビットを操作する能力を潜在的な攻撃者に与え、 メッセージの完全性を損ないます。しかし、AES-CTRは、メッセージ認証コードなどの 他の暗号プリミティブと組み合わせて、保護されたメッセージの完全性を保証するために 安全に使用できますが、それはメッセージ認証コードが暗号化されたメッセージおよびIVに対して構築される場合に限られます。

SubtleCryptoインターフェイスを利用する開発者は、提供されるさまざまな アルゴリズムの設計および実装の両方に関連するセキュリティ上の懸念を 認識していることが期待されます。生のアルゴリズムは、開発者がさまざまな プロトコルおよびアプリケーションを実装する際に最大限の柔軟性を得られるように提供されます。 それらの各々は、生のアルゴリズムの使用を必要とする独自の方法で、 合成およびセキュリティパラメーターを表す可能性があります。

14.1 データ型

KeyFormat
鍵のシリアル化形式を指定します。認識される 鍵形式値は次のとおりです:
raw
書式化されていないバイトシーケンス。秘密鍵用です。
pkcs8
[RFC5208] のPrivateKeyInfo構造のDERエンコーディング。
spki
[RFC5280] のSubjectPublicKeyInfo構造のDERエンコーディング。
jwk
鍵は、JavaScriptオブジェクトとしてエンコードされたJsonWebKey辞書です

14.2 タスクソース

cryptoタスクソース
このタスクソースは、 SubtleCryptoのメソッド呼び出しに応答して作成された promiseを解決または拒否するためのタスクをキューに入れるために使用されます。
注記
この仕様は、 SubtleCryptoのメソッド呼び出しに対する応答の 順序について、複数の呼び出し間でも、呼び出しと他の タスクソースからのタスクとの間でも、 特定の要件を課しません。このタスクソースは、暗号操作が完了したときにいつでも、 関連するpromiseを解決または拒否するためのタスクをキューに入れるためだけに使用され、 それによって 競合状態を 防止します。

14.3 メソッドとパラメーター

注記

すべてのエラーは、返された Promiseを拒否することによって非同期的に報告されます。これにはWeb IDLの型マッピングエラーも含まれます。

14.3.1 encryptメソッド

encrypt メソッドは、指定された AlgorithmIdentifier を、供給されたCryptoKeyとともに使用してデータを暗号化する 新しいPromiseオブジェクトを返します。これは次のように動作しなければなりません:

  1. algorithmおよびkeyを、 encrypt() メソッドへ渡された algorithmおよびkeyパラメーターとします。

  2. dataを、 保持されているバイトのコピーを取得することの結果とします。対象は、 encrypt() メソッドへ渡されたdataパラメーターです。

  3. normalizedAlgorithmを、 algalgorithmに設定し、opを "encrypt"に設定して、 アルゴリズムを 正規化することの結果とします。

  4. エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。

  5. realmを、関連 realm of thisとします。

  6. promiseを新しいPromiseとします。

  7. promiseを返し、残りのステップを並列に実行します。

  8. 次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します

  9. normalizedAlgorithmnameメンバーが、 key[[algorithm]]内部スロットの name属性と等しくない場合、 InvalidAccessErrorthrowします。

  10. key[[usages]] 内部スロットに、"encrypt"であるエントリが含まれていない場合、 InvalidAccessErrorthrowします。

  11. ciphertextを、normalizedAlgorithmによって指定されるencrypt 操作を、algorithmおよびkeyを使用し、 dataplaintextとして実行した結果とします。

  12. 残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます

  13. resultを、ciphertextを含む ArrayBufferrealm内で作成することの結果とします。

  14. promiseresultで解決します。

14.3.2 decryptメソッド

decrypt メソッドは、指定された AlgorithmIdentifier を、供給されたCryptoKeyとともに使用してデータを復号する 新しいPromiseオブジェクトを返します。これは次のように動作しなければなりません:

  1. algorithmおよびkeyを、 decrypt() メソッドへ渡された algorithmおよびkeyパラメーターとします。

  2. dataを、 保持されているバイトのコピーを取得することの結果とします。対象は、 decrypt() メソッドへ渡されたdataパラメーターです。

  3. normalizedAlgorithmを、 algalgorithmに設定し、opを "decrypt"に設定して、 アルゴリズムを 正規化することの結果とします。

  4. エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。

  5. realmを、関連 realm of thisとします。

  6. promiseを新しいPromiseとします。

  7. promiseを返し、残りのステップを並列に実行します。

  8. 次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します

  9. normalizedAlgorithmnameメンバーが、 key[[algorithm]]内部スロットの name属性と等しくない場合、 InvalidAccessErrorthrowします。

  10. key[[usages]] 内部スロットに、"decrypt"であるエントリが含まれていない場合、 InvalidAccessErrorthrowします。

  11. plaintextを、normalizedAlgorithmによって指定されるdecrypt 操作を、keyおよびalgorithmを使用し、 dataciphertextとして実行した結果とします。

  12. 残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます

  13. resultを、plaintextを含む ArrayBufferrealm内で作成することの結果とします。

  14. promiseresultで解決します。

14.3.3 signメソッド

signメソッドは、 指定されたAlgorithmIdentifierを、供給された CryptoKeyとともに使用してデータに署名する 新しいPromiseオブジェクトを返します。これは次のように動作しなければなりません:

  1. algorithmおよびkeyを、 sign()メソッドへ渡された algorithmおよびkeyパラメーターとします。

  2. dataを、 保持されているバイトのコピーを取得することの結果とします。対象は、 sign()メソッドへ渡された dataパラメーターです。

  3. normalizedAlgorithmを、 algalgorithmに設定し、opを "sign"に設定して、 アルゴリズムを 正規化することの結果とします。

  4. エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。

  5. realmを、関連 realm of thisとします。

  6. promiseを新しいPromiseとします。

  7. promiseを返し、残りのステップを並列に実行します。

  8. 次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します

  9. normalizedAlgorithmnameメンバーが、 key[[algorithm]]内部スロットの name属性と等しくない場合、 InvalidAccessErrorthrowします。

  10. key[[usages]] 内部スロットに、"sign"であるエントリが含まれていない場合、 InvalidAccessErrorthrowします。

  11. signatureを、normalizedAlgorithmによって指定されるsign操作を、 keyおよび algorithmを使用し、datamessageとして実行した結果とします。

  12. 残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます

  13. resultを、signatureを含む ArrayBufferrealm内で作成することの結果とします。

  14. promiseresultで解決します。

14.3.4 verifyメソッド

verifyメソッドは、 指定されたAlgorithmIdentifierを、供給された CryptoKeyとともに使用してデータを検証する 新しいPromiseオブジェクトを返します。これは次のように動作しなければなりません:

  1. algorithmおよびkeyを、 verify() メソッドへ渡されたalgorithmおよびkeyパラメーターとします。

  2. signatureを、 保持されているバイトのコピーを取得することの結果とします。対象は、 verify() メソッドへ渡されたsignatureパラメーターです。

  3. dataを、 保持されているバイトのコピーを取得することの結果とします。対象は、 verify() メソッドへ渡されたdataパラメーターです。

  4. normalizedAlgorithmを、 algalgorithmに設定し、opを "verify"に設定して、 アルゴリズムを 正規化することの結果とします。

  5. エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。

  6. realmを、関連 realm of thisとします。

  7. promiseを新しいPromiseとします。

  8. promiseを返し、残りのステップを並列に実行します。

  9. 次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します

  10. normalizedAlgorithmnameメンバーが、 key[[algorithm]]内部スロットの name属性と等しくない場合、 InvalidAccessErrorthrowします。

  11. key[[usages]] 内部スロットに、"verify"であるエントリが含まれていない場合、 InvalidAccessErrorthrowします。

  12. resultを、normalizedAlgorithmによって指定されるverify操作を、 keyalgorithmおよび signatureを使用し、datamessageとして実行した結果とします。

  13. 残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます

  14. promiseresultで解決します。

14.3.5 digestメソッド

digestメソッドは、 指定された AlgorithmIdentifierを使用して データをダイジェストする新しいPromiseオブジェクトを返します。 これは次のように動作しなければなりません:

  1. algorithmを、 digest() メソッドへ渡されたalgorithmパラメーターとします。

  2. dataを、 保持されているバイトのコピーを取得することの結果とします。対象は、 digest() メソッドへ渡されたdataパラメーターです。

  3. normalizedAlgorithmを、 algalgorithmに設定し、opを "digest"に設定して、 アルゴリズムを 正規化することの結果とします。

  4. エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。

  5. realmを、関連 realm of thisとします。

  6. promiseを新しいPromiseとします。

  7. promiseを返し、残りのステップを並列に実行します。

  8. 次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します

  9. digestを、normalizedAlgorithmによって指定されるdigest 操作を、algorithmを使用し、datamessageとして実行した結果とします。

  10. 残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます

  11. resultを、digestを含む ArrayBufferrealm内で作成することの結果とします。

  12. promiseresultで解決します。

14.3.6 generateKeyメソッド

呼び出されたとき、generateKeyは、次のステップを実行 しなければなりません:

  1. algorithmextractableおよびusagesを、 generateKey() メソッドへ渡された algorithmextractableおよびkeyUsages パラメーターとします。

  2. normalizedAlgorithmを、 algalgorithmに設定し、opを "generateKey"に設定して、 アルゴリズムを 正規化することの結果とします。

  3. エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。

  4. realmを、関連 realm of thisとします。

  5. promiseを新しいPromiseとします。

  6. promiseを返し、残りのステップを並列に実行します。

  7. 次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します

  8. resultを、normalizedAlgorithmによって指定されるgenerate key操作を、 algorithmextractableおよびusagesを使用して実行した結果とします。

  9. resultCryptoKeyオブジェクトである場合:

    result[[type]]内部スロットが "secret" または"private"であり、かつ usagesが空である場合、 SyntaxErrorthrowします。

    resultCryptoKeyPairオブジェクトである場合:

    resultprivateKey 属性の [[usages]]内部 スロットが空シーケンスである場合、 SyntaxErrorthrowします。

  10. 残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます

  11. resultを、 [WebIDL]で定義されるように、 realm内のECMAScript Objectへresultを変換した結果とします。

  12. promiseresultで解決します。

14.3.7 deriveKeyメソッド

呼び出されたとき、deriveKeyは、 次のステップを実行しなければなりません:

  1. algorithmbaseKeyderivedKeyTypeextractableおよびusagesを、 deriveKey() メソッドへ渡されたalgorithmbaseKeyderivedKeyTypeextractableおよび keyUsagesパラメーターとします。

  2. normalizedAlgorithmを、 algalgorithmに設定し、opを "deriveBits"に設定して、 アルゴリズムを 正規化することの結果とします。

  3. エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。

  4. normalizedDerivedKeyAlgorithmImportを、 algderivedKeyTypeに設定し、opを "importKey"に設定して、 アルゴリズムを 正規化することの結果とします。

  5. エラーが発生した場合、normalizedDerivedKeyAlgorithmImportで拒否された Promiseを返します。

  6. normalizedDerivedKeyAlgorithmLengthを、 algderivedKeyTypeに設定し、opを "get key length"に設定して、 アルゴリズムを 正規化することの結果とします。

  7. エラーが発生した場合、normalizedDerivedKeyAlgorithmLengthで拒否された Promiseを返します。

  8. realmを、関連 realm of thisとします。

  9. promiseを新しいPromiseとします。

  10. promiseを返し、残りのステップを並列に実行します。

  11. 次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します

  12. normalizedAlgorithmnameメンバーが、 baseKey[[algorithm]]内部スロットの name属性と等しくない場合、 InvalidAccessErrorthrowします。

  13. baseKey[[usages]]内部スロットに、 "deriveKey"であるエントリが含まれていない場合、 InvalidAccessErrorthrowします。

  14. lengthを、normalizedDerivedKeyAlgorithmLengthによって指定される get key lengthアルゴリズムを、derivedKeyTypeを使用して実行した結果とします。

  15. secretを、normalizedAlgorithmによって指定されるderive bits操作を、 keyalgorithmおよびlengthを使用して実行した結果とします。

  16. resultを、normalizedDerivedKeyAlgorithmImportによって指定される import key操作を、"raw"を formatとして、secretkeyDataとして、 derivedKeyTypealgorithmとして使用し、 extractableおよびusagesを使用して実行した結果とします。

  17. result[[type]] 内部スロットが "secret"または"private"であり、かつ usagesが空である場合、 SyntaxErrorthrowします。

  18. result[[extractable]]内部 スロットをextractableに設定します。

  19. result[[usages]]内部 スロットを、usages正規化値に設定します。

  20. 残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます

  21. resultを、 [WebIDL]で定義されるように、 realm内のECMAScript Objectへresultを変換した結果とします。

  22. promiseresultで解決します。

14.3.8 deriveBitsメソッド

呼び出されたとき、deriveBitsは、 次のステップを実行しなければなりません:

  1. algorithmbaseKeyおよびlengthを、 deriveBits() メソッドへ渡された algorithmbaseKeyおよびlength パラメーターとします。

  2. normalizedAlgorithmを、 algalgorithmに設定し、opを "deriveBits"に設定して、 アルゴリズムを 正規化することの結果とします。

  3. エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。

  4. realmを、関連 realm of thisとします。

  5. promiseを新しいPromiseとします。

  6. promiseを返し、残りのステップを並列に実行します。

  7. 次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します

  8. normalizedAlgorithmnameメンバーが、 baseKey[[algorithm]]内部 スロットの name属性と等しくない場合、 InvalidAccessErrorthrowします。

  9. baseKey[[usages]]内部スロットに、 "deriveBits"であるエントリが含まれていない場合、 InvalidAccessErrorthrowします。

  10. bitsを、normalizedAlgorithmによって指定されるderive bits操作を、 baseKeyalgorithmおよびlengthを使用して実行した結果とします。

  11. 残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます

  12. resultを、bitsを含む ArrayBufferrealm内で作成することの結果とします。

  13. promiseresultで解決します。

14.3.9 importKeyメソッド

呼び出されたとき、importKeyメソッドは、次のステップを実行 しなければなりません:

  1. formatalgorithmextractableおよび usagesを、 importKey() メソッドへ渡されたformatalgorithmextractableおよびkeyUsagesパラメーターとします。

  2. formatが文字列"raw"、 "pkcs8"、または"spki"と等しい場合:
    1. importKey() メソッドへ渡されたkeyDataパラメーターが JsonWebKey辞書である場合、 TypeErrorthrowします。

    2. keyDataを、 保持されているバイトのコピーを取得することの結果とします。対象は、 importKey() メソッドへ渡された keyDataパラメーターです。

    formatが文字列"jwk"と等しい場合:
    1. importKey() メソッドへ渡されたkeyDataパラメーターが JsonWebKey辞書でない場合、 TypeErrorthrowします。

    2. keyDataを、 importKey() メソッドへ渡されたkeyDataパラメーターとします。

  3. normalizedAlgorithmを、 algalgorithmに設定し、opを "importKey"に設定して、 アルゴリズムを 正規化することの結果とします。

  4. エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。

  5. realmを、関連 realm of thisとします。

  6. promiseを新しいPromiseとします。

  7. promiseを返し、残りのステップを並列に実行します。

  8. 次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します

  9. resultを、normalizedAlgorithmによって指定される import key操作を、keyDataalgorithmformatextractableおよびusagesを使用して実行した結果である CryptoKeyオブジェクトとします。

  10. result[[type]] 内部スロットが "secret"または"private"であり、かつ usagesが空である場合、 SyntaxErrorthrowします。

  11. result[[extractable]]内部 スロットをextractableに設定します。

  12. result[[usages]]内部 スロットを、usages正規化値に設定します。

  13. 残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます

  14. resultを、 [WebIDL]で定義されるように、 realm内のECMAScript Objectへresultを変換した結果とします。

  15. promiseresultで解決します。

注記

相互運用性のために、"raw"鍵形式のサポートが推奨されます。 Web開発者は、他の鍵形式に対する実装サポートの詳細情報について テストスイートを参照すべきです。

注記

構造化された鍵形式である"spki"、"pkcs8" および"jwk"については、アルゴリズムの鍵 インポート手続きで明示的に参照されないフィールドは無視されます。

14.3.10 exportKeyメソッド

呼び出されたとき、exportKeyメソッドは、次のステップを実行 しなければなりません:

  1. formatおよびkeyを、 exportKey() メソッドへ渡されたformatおよび keyパラメーターとします。

  2. realmを、関連 realm of thisとします。

  3. promiseを新しいPromiseとします。

  4. promiseを返し、残りのステップを並列に実行します。

  5. 次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します

  6. key[[algorithm]]内部 スロットのnameメンバーが、 export key操作をサポートする登録済みアルゴリズムを 識別しない場合、 NotSupportedErrorthrowします。

  7. key[[extractable]]内部 スロットがfalseである場合、 InvalidAccessErrorthrowします。

  8. resultを、key[[algorithm]] 内部スロットによって指定されるexport key操作を、keyおよびformatを使用して実行した結果とします。

  9. 残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます

  10. formatが文字列"raw"、 "pkcs8"、または"spki"と等しい場合:
    resultを、resultを含む ArrayBufferrealm内で作成することの結果とします。
    formatが文字列"jwk"と等しい場合:
    resultを、 [WebIDL]で定義されるように、 realm内のECMAScript Objectへresultを変換した結果とします。
  11. promiseresultで解決します。

注記

相互運用性のために、"raw"鍵形式のサポートが推奨されます。 Web開発者は、他の鍵形式に対する実装サポートの詳細情報について テストスイートを参照すべきです。

14.3.11 wrapKeyメソッド

呼び出されたとき、wrapKeyメソッドは、次のステップを実行 しなければなりません:

  1. formatkeywrappingKeyおよび algorithmを、 wrapKey() メソッドへ渡されたformatkeywrappingKeyおよびwrapAlgorithmパラメーターとします。

  2. normalizedAlgorithmを、 algalgorithmに設定し、opを "wrapKey"に設定して、 アルゴリズムを 正規化することの結果とします。

  3. エラーが発生した場合、normalizedAlgorithmを、 algalgorithmに設定し、opを "encrypt"に設定して、 アルゴリズムを 正規化することの結果とします。

  4. エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。

  5. realmを、関連 realm of thisとします。

  6. promiseを新しいPromiseとします。

  7. promiseを返し、残りのステップを並列に実行します。

  8. 次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します

  9. normalizedAlgorithmnameメンバーが、 wrappingKey[[algorithm]]内部 スロットの name属性と等しくない場合、 InvalidAccessErrorthrowします。

  10. wrappingKey[[usages]]内部スロットに、 "wrapKey"であるエントリが含まれていない場合、 InvalidAccessErrorthrowします。

  11. key[[algorithm]]内部 スロットによって識別されるアルゴリズムがexport key操作をサポートしない場合、 NotSupportedErrorthrowします。

  12. key[[extractable]]内部 スロットがfalseである場合、 InvalidAccessErrorthrowします。

    注記

    wrapKeyメソッドは実質的に鍵をエクスポートするため、extractableとしてマークされた鍵のみを ラップできます。特に、これは、このAPIが ext JWKメンバーを使用して、 non-extractableとしてマークされたラップ済みJWK鍵を作成できないことを意味します。

    ただし、unwrapKeyメソッドはext JWKメンバーを サポートします。そのため、たとえばサーバーによって別の場所で作成された ラップ済みnon-extractable鍵を、このAPIを使用してアンラップできます。

  13. exportedKeyを、 key[[algorithm]]内部 スロットによって指定されるexport key操作を、keyおよびformatを使用して実行した結果とします。

  14. formatが文字列"raw"、 "pkcs8"、または"spki"と等しい場合:
    bytesexportedKeyとします。
    formatが文字列"jwk"と等しい場合:
    1. jsonを、exportedKeyをJSON文法に適合する UTF-16文字列として表現した結果とします。たとえば、 新しいグローバルオブジェクトのコンテキストで、 [ECMA-262]で指定される JSON.stringifyアルゴリズムを実行することによります。

    2. bytesを、 jsonUTF-8エンコードする ことの結果とします。

    注記

    一部のアルゴリズムの鍵ラップ操作は、ペイロード サイズに制約を課します。たとえばAES-KWは、ペイロードの長さが 8バイトの倍数であることを要求し、RSA-OAEPは長さに制限を課します。 与えられた鍵のシリアル化に柔軟性を提供する鍵形式(たとえばJWK)については、 実装は、ラップアルゴリズムの制約に合わせてシリアル化を調整することを選択できます。 これが、JSON.stringifyが規範的に要求されない理由です。そうでなければ、 実装が追加のパディングを導入することを禁止してしまうためです。

  15. normalizedAlgorithmがwrap key操作をサポートする場合:

    resultを、normalizedAlgorithmによって指定されるwrap key操作を、 algorithmを使用し、 wrappingKeykeyとして、bytesplaintextとして実行した結果とします。

    それ以外で、normalizedAlgorithmがencrypt操作をサポートする場合:

    resultを、normalizedAlgorithmによって指定されるencrypt操作を、 algorithmを使用し、 wrappingKeykeyとして、bytesplaintextとして実行した結果とします。

    それ以外の場合:
    NotSupportedErrorthrowします。
  16. 残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます

  17. resultを、resultを含む ArrayBufferrealm内で作成することの結果とします。

  18. promiseresultで解決します。

注記

相互運用性のために、"raw"鍵形式のサポートが推奨されます。 Web開発者は、他の鍵形式に対する実装サポートの詳細情報について テストスイートを参照すべきです。

14.3.12 unwrapKeyメソッド

呼び出されたとき、unwrapKeyメソッドは、 次のステップを実行しなければなりません:

  1. formatunwrappingKeyalgorithmunwrappedKeyAlgorithmextractableおよびusagesを、 unwrapKey() メソッドへ渡された formatunwrappingKeyunwrapAlgorithmunwrappedKeyAlgorithmextractableおよびkeyUsages パラメーターとします。

  2. wrappedKeyを、 保持されているバイトのコピーを取得することの結果とします。対象は、 unwrapKey() メソッドへ渡された wrappedKeyパラメーターです。

  3. normalizedAlgorithmを、 algalgorithmに設定し、opを "unwrapKey"に設定して、 アルゴリズムを 正規化することの結果とします。

  4. エラーが発生した場合、normalizedAlgorithmを、 algalgorithmに設定し、opを "decrypt"に設定して、 アルゴリズムを 正規化することの結果とします。

  5. エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。

  6. normalizedKeyAlgorithmを、 algunwrappedKeyAlgorithmに設定し、opを "importKey"に設定して、アルゴリズムを正規化することの結果とします。

  7. エラーが発生した場合、normalizedKeyAlgorithmで拒否された Promiseを返します。

  8. realmを、関連 realm of thisとします。

  9. promiseを新しいPromiseとします。

  10. promiseを返し、残りのステップを並列に実行します。

  11. 次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します

  12. normalizedAlgorithmnameメンバーが、 unwrappingKey[[algorithm]]内部 スロットの name属性と等しくない場合、 InvalidAccessErrorthrowします。

  13. unwrappingKey[[usages]]内部スロットに、 "unwrapKey"であるエントリが含まれていない場合、 InvalidAccessErrorthrowします。

  14. normalizedAlgorithmがunwrap key操作をサポートする場合:
    bytesを、normalizedAlgorithmによって指定されるunwrap key操作を、 algorithmを使用し、 unwrappingKeykeyとして、wrappedKeyciphertextとして実行した結果とします。
    それ以外で、normalizedAlgorithmがdecrypt 操作をサポートする場合:
    bytesを、normalizedAlgorithmによって指定されるdecrypt操作を、 algorithmを使用し、 unwrappingKeykeyとして、wrappedKeyciphertextとして実行した結果とします。
    それ以外の場合:
    NotSupportedErrorthrowします。
  15. formatが文字列"raw"、 "pkcs8"、または"spki"と等しい場合:
    keybytesとします。
    formatが文字列"jwk"と等しい場合:
    keyを、 bytesを解析されるdataとして、 JWKを解析するアルゴリズムを実行した結果とします。
  16. resultを、normalizedKeyAlgorithmによって指定される import key操作を、 unwrappedKeyAlgorithmalgorithmとして、formatusages およびextractableを使用し、 keykeyDataとして実行した結果とします。

  17. result[[type]] 内部スロットが "secret"または"private"であり、かつ usagesが空である場合、 SyntaxErrorthrowします。

  18. result[[extractable]]内部 スロットをextractableに設定します。

  19. result[[usages]]内部 スロットを、usages正規化値に設定します。

  20. 残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます

  21. resultを、 [WebIDL]で定義されるように、 realm内のECMAScript Objectへresultを変換した結果とします。

  22. promiseresultで解決します。

注記

相互運用性のために、"raw"鍵形式のサポートが推奨されます。 Web開発者は、他の鍵形式に対する実装サポートの詳細情報について テストスイートを参照すべきです。

14.4 例外

SubtleCryptoインターフェイスのメソッドは、 ECMAScript [ECMA-262] または DOMExceptionで定義される事前定義済み例外で返されたpromiseを拒否することにより、 エラーを返します。次の 事前定義済み例外が使用されます: TypeError。次の [DOM] のDOMException型が 使用されます:

名前 説明
NotSupportedError アルゴリズムはサポートされていません
SyntaxError 必須パラメーターが欠けているか、範囲外です
InvalidAccessError 要求された操作は、提供された鍵に対して有効ではありません
DataError 操作に提供されたデータが要件を満たしていません
OperationError 操作固有の理由により操作が失敗しました

この仕様がエラーを throwすると言う場合、ユーザー エージェントは [WebIDL] で説明されるようにエラーを throwしなければなりません。これがサブアルゴリズム内で発生した場合、 例外を捕捉する手続きを明示的に説明するものに到達するまで、そのサブアルゴリズムおよび すべての祖先アルゴリズムの実行を終了する結果になります。 throwされるエラーオブジェクトは、 関連 realm of thisに 関連付けられなければなりません。

15. JsonWebKey辞書

WebIDLdictionary RsaOtherPrimesInfo {
  // The following fields are defined in Section 6.3.2.7 of JSON Web Algorithms
  DOMString r;
  DOMString d;
  DOMString t;
};

dictionary JsonWebKey {
  // The following fields are defined in Section 3.1 of JSON Web Key
  DOMString kty;
  DOMString use;
  sequence<DOMString> key_ops;
  DOMString alg;

  // The following fields are defined in JSON Web Key Parameters Registration
  boolean ext;

  // The following fields are defined in Section 6 of JSON Web Algorithms
  DOMString crv;
  DOMString x;
  DOMString y;
  DOMString d;
  DOMString n;
  DOMString e;
  DOMString p;
  DOMString q;
  DOMString dp;
  DOMString dq;
  DOMString qi;
  sequence<RsaOtherPrimesInfo> oth;
  DOMString k;
};

JsonWebKey辞書は、Web Cryptography API アプリケーション内でネイティブかつ効率的な利用を可能にしつつ、JSON Web Key [JWK] 構造によって表される暗号鍵を表現および交換する方法を提供します。

RsaOtherPrimesInfoのメンバーは、JSON Web Algorithmsのセクション6.3.2.7で定義されます。

16. BigInteger

WebIDLtypedef Uint8Array BigInteger;

BigInteger typedefは、ビッグエンディアン順で任意の大きさの 符号なし整数を保持するUint8Array です。APIから読み取られる値は、最小の型付き配列長を持つ ものとします(すなわち、先頭のゼロビットは最大7個。ただし値0は長さ8ビットであるものとします)。 APIは、ゼロを表す空配列を含め、任意の数の先頭ゼロビットを持つ値を受け入れる ものとします

注記
整数は符号なしであるため、最上位ビットは符号ビットではありません。 実装者は、符号付き整数を期待するbig integer実装へマッピングするときに注意すべきです。

17. CryptoKeyPair辞書

WebIDLdictionary CryptoKeyPair {
  CryptoKey publicKey;
  CryptoKey privateKey;
};

CryptoKeyPair辞書は、public(publicKey)鍵とprivate (privateKey)鍵の両方で構成される非対称鍵ペアを表します。

18. アルゴリズム

18.1 概要

このセクションは非規範的です。

この仕様は、SubtleCryptoインターフェイスを通じて 暗号操作を実行するための共通インターフェイスを提供することに加えて、 作者が使用したいと望む可能性があり、かつユーザーエージェントが実装を選択できる さまざまなアルゴリズムの説明も提供します。これには、一般的に配備されている 対称アルゴリズムおよび非対称アルゴリズム、鍵導出機構、ならびに鍵をラップおよび アンラップするための方法の選択が含まれます。さらに、この仕様は、追加の 仕様が追加の暗号アルゴリズムを導入できるようにするプロセスを定義します。

18.2 概念

18.2.1 命名

Web Cryptography APIで使用するために定義されるすべての暗号アルゴリズムは、 認識されるアルゴリズム名と呼ばれる一意な名前を持た なければなりません。これは、Web Cryptography APIで使用するために、 他の仕様が同じ大文字小文字を区別しない文字列を定義しないような名前です。

18.2.2 サポートされる操作

Web Cryptography APIで使用するために定義されるすべての暗号アルゴリズムは、 サポートされる操作のリストを持ちます。これは、 目的の暗号操作を実行するためにSubtleCrypto インターフェイスによって呼び出されるサブアルゴリズムの集合です。この仕様では、 次の操作を使用します:

  • encrypt
  • decrypt
  • sign
  • verify
  • digest
  • deriveBits
  • wrapKey
  • unwrapKey
  • generateKey
  • importKey
  • exportKey
  • get key length

与えられたアルゴリズム仕様が特定の操作をサポート対象として列挙していない場合、 または操作を非サポートとして明示的に列挙している場合、ユーザーエージェントは、 そのサブアルゴリズムの呼び出しがNotSupportedErrorをthrowしたかのように振る舞わ なければなりません

18.2.3 正規化

Web Cryptography APIで使用するために定義されるすべての暗号アルゴリズムは、 各サポートされる 操作について、アルゴリズム正規化に使用するIDL型、および サブアルゴリズムの返値のIDL型または型群を定義 しなければなりません

18.3 仕様の規約

この仕様内のすべての暗号アルゴリズム定義は、次の仕様規約を採用します。 "Registration"というタイトルのセクションには、 認識されるアルゴリズム名が含まれます。さらに、 そのセクションには表が含まれ、その表はサポートされる 操作の各々を行として列挙し、Operation 列によって識別します。与えられた行のParameters列の内容は、その操作のアルゴリズム正規化に使用するIDL型を含み、 その行のResult列の内容は、サポートされる操作を実行した結果となる IDL型を示します。

適合ユーザーエージェントがあるアルゴリズムを実装する場合、そのユーザーエージェントは すべての サポートされる操作を実装 しなければならず、指定されたIDL型を返さ なければなりません

さらに、初期化時に、適合ユーザーエージェントは、サポートされる各操作について、 示されたIDLパラメーター型を登録して、アルゴリズムを定義する手順を実行しなければなりません。

特に明記されていない限り、この仕様で定義される操作によって作成されるオブジェクトは、 関連 realm of thisに関連付けられるものとします。

18.4 アルゴリズム正規化

18.4.1 説明

このセクションは非規範的です。

AlgorithmIdentifier typedefは、アルゴリズムをDOMStringまたは オブジェクトとして指定することを許可します。DOMStringの使用は、 パラメーターを持たないアルゴリズム(例: SHA-1)を記述するための短縮表記を作者に許可するためです。 オブジェクトの使用は、オブジェクトに関連するすべてのパラメーターを含む Algorithm(または適切な サブクラス)を指定できるようにするためです。

このため、AlgorithmIdentifierをこのAPIで使用可能な適切な 辞書へ変換するためのアルゴリズムを定義する必要があります。このアルゴリズムは、新しい 暗号アルゴリズムを追加できるように拡張可能であり、かつWeb IDL型マッピングが 呼び出し元スクリプトへ制御が返される前に発生できるように一貫していなければなりません。 そうでなければ、パラメーターまたはスクリプト環境の変更が潜在的に許される可能性があります。

18.4.2 内部状態オブジェクト

この仕様は内部オブジェクト supportedAlgorithmsを使用します。この内部オブジェクトは アプリケーションへ公開されません。

この値はアプリケーションへ公開されないため、正確な型は指定されません。 これは、キーの比較が大文字小文字を区別する方法で実行される、キー/値ペアの連想コンテナーとして 振る舞うことだけが要求されます。

この内部オブジェクトの初期内容は次のとおりです:

  1. サポートされる操作のリスト内の各値vについて、 内部オブジェクトsupportedAlgorithmsvキーを新しい連想コンテナーに設定します。

18.4.3 アルゴリズムの定義

アルゴリズムを定義するアルゴリズムは、 特定のアルゴリズムについてユーザーエージェントがどのように引数を正規化すべきかを 仕様作者が示すために使用されます。その入力は、DOMStringとして表されるアルゴリズム名 alg、DOMStringとして表される操作名op、および目的のIDL 辞書型typeです。このアルゴリズムは次のように動作します:

  1. registeredAlgorithmsを、 supportedAlgorithmsopキーに格納された連想コンテナーとします。
  2. registeredAlgorithmsalgキーをIDL辞書型 typeに設定します。

18.4.4 アルゴリズムの正規化

アルゴリズムを正規化するアルゴリズムは、 Web IDL変換が行われた後で、入力を対象のIDL辞書型へ強制変換するための プロセスを定義します。これは、将来の仕様が追加のアルゴリズムを定義できるように 拡張可能であり、かつPromisesとともに安全に使用できるよう設計されています。その入力は、 操作名opおよびAlgorithmIdentifier algです。 その出力はIDL辞書型またはエラーのいずれかです。これは次のように動作します:

algがDOMStringのインスタンスである場合:

algを、Algorithmの新しい辞書であって、 そのname属性が algであるものに設定し、opopに設定して、 アルゴリズムを正規化するアルゴリズムを実行した結果を返します。

algがオブジェクトである場合:
  1. registeredAlgorithmsを、 supportedAlgorithmsopキーに格納された連想コンテナーとします。
  2. initialAlgを、 [WebIDL]で定義されるように、 algで表されるECMAScriptオブジェクトをIDL辞書型 Algorithmへ変換した結果とします。
  3. エラーが発生した場合、そのエラーを返し、このアルゴリズムを終了します。
  4. algNameを、initialAlgname 属性の値とします。
  5. registeredAlgorithmsが、 algNameに対して大文字小文字を区別しない文字列一致となるキーを含む場合:
    1. algNameを一致したキーの値に設定します。

    2. desiredTypeを、registeredAlgorithms内の algNameに格納されたIDL辞書型とします。

    それ以外の場合:
    新しいNotSupportedErrorを返し、このアルゴリズムを終了します。
  6. normalizedAlgorithmを、 [WebIDL]で定義されるように、 algで表されるECMAScript オブジェクトをIDL辞書型desiredTypeへ変換した結果とします。
  7. normalizedAlgorithmname属性を algNameに設定します。
  8. エラーが発生した場合、そのエラーを返し、このアルゴリズムを終了します。
  9. dictionariesを、IDL辞書型desiredTypeおよび desiredTypeが継承するすべての辞書からなるリストとし、 最も派生していないものから最も派生したものへの順序にします。
  10. dictionaries内の各辞書dictionaryについて:

    1. dictionary上で宣言された各辞書メンバーmemberについて、順に:

      1. keymemberの識別子とします。
      2. idlValueを、normalizedAlgorithm上の keyというキー名を持つ辞書メンバーの値とします。
      3. memberBufferSource 型であり、かつ存在する場合:
        normalizedAlgorithm上のキー名keyを持つ 辞書メンバーを、idlValue保持されているバイトのコピーを取得する ことの結果に設定し、現在の値を置き換えます。
        memberHashAlgorithmIdentifier型である場合:
        normalizedAlgorithm上のキー名keyを持つ 辞書メンバーを、 algidlValueに設定し、 opを"digest"に設定して、 アルゴリズムを 正規化することの結果に設定します。
        memberAlgorithmIdentifier型である場合:
        normalizedAlgorithm上のキー名keyを持つ 辞書メンバーを、 algidlValueに設定し、 opalgNameによって識別されるアルゴリズムを定義する仕様で 定義された操作に設定して、 アルゴリズムを 正規化することの結果に設定します。
      4. エラーが発生した場合、そのエラーを返し、このアルゴリズムを終了します。
  11. normalizedAlgorithmを返します。

18.5 推奨事項

このセクションは非規範的です。

18.5.1 作者向け

このAPIは、暗号の将来の発展に追随するために拡張可能であることを意図しているため、 適合ユーザーエージェントが実装を要求されるアルゴリズムはありません。 したがって、作者は、現在どのアルゴリズムが推奨され、実装によってサポートされているかを 確認すべきです。

セキュリティに関する考慮事項で強調されているように、 ある目的に対して強力であると考えられる暗号アルゴリズムであっても、 別の目的で使用すると不十分な場合があります。したがって、作者は新しい暗号プロトコルを発明する前に 細心の注意を払って進めるべきです。

さらに、この仕様には、既定の使用方法において暗号上の脆弱性を生じさせる可能性がある いくつかのアルゴリズムが含まれています。これらの懸念は、この仕様によって提供される 追加のアルゴリズムとの組み合わせおよび合成などによって軽減される場合がありますが、 作者は慎重に進め、与えられたアルゴリズムを使用する前に関連する暗号文献を 確認すべきです。この仕様内にアルゴリズムが含まれていることは、そのアルゴリズムが いずれかまたはすべての目的に適していることを示すものではなく、単に、適合ユーザーエージェントが そのアルゴリズムを実装することを選択した場合に、与えられたアルゴリズムをどのように 実装しなければならないかについての仕様を提供するものにすぎません。

18.5.2 実装者向け

開発者の相互運用性を促進するために、この仕様には推奨アルゴリズムの リストが含まれています。これらは、執筆時点で実際に最も広く使用されている アルゴリズムと考えられるため、この仕様の初期実装にとって良い出発点を提供します。 推奨アルゴリズムは次のとおりです:

19. アルゴリズム概要

このセクションは非規範的です。

下の表は、この仕様内で説明されるアルゴリズムの概要、およびその アルゴリズムを使用できるSubtleCrypto メソッドの集合を含みます。アルゴリズムを あるメソッドで使用するには、そのメソッドの手続きで定義される対応する 操作または操作群が、アルゴリズム仕様内で定義されていなければなりません。 メソッドから基盤となる操作へのこの対応関係は 1対1ではないことに注意してください:

注記

アプリケーション開発者およびスクリプト作者は、この表を特定のアルゴリズムの使用に関する 推奨として解釈すべきではありません。代わりに、これは単にどの メソッドがサポートされるかを文書化するものです。作者は、特定の アルゴリズムを使用するときに生じ得るリスクおよび懸念をよりよく理解するために、この 文書の作者向けのセキュリティに関する 考慮事項セクションを参照すべきです。

アルゴリズム名 encrypt decrypt sign verify digest generateKey deriveKey deriveBits importKey exportKey wrapKey unwrapKey
RSASSA-PKCS1-v1_5
RSA-PSS
RSA-OAEP
ECDSA
ECDH
Ed25519
X25519
AES-CTR
AES-CBC
AES-GCM
AES-KW
HMAC
SHA-1
SHA-256
SHA-384
SHA-512
HKDF
PBKDF2

20. RSASSA-PKCS1-v1_5

20.1 説明

このセクションは非規範的です。

"RSASSA-PKCS1-v1_5"アルゴリズム識別子は、 [RFC3447] で指定されるRSASSA-PKCS1-v1_5アルゴリズムを用い、 この仕様で定義されるSHAハッシュ関数を使用して、 署名および検証を実行するために使用されます。

他の 仕様は、RSASSA-PKCS1-v1_5で追加のハッシュアルゴリズムを使用することを指定できます。 そのような仕様は、追加のハッシュアルゴリズムのdigest操作、 およびRSASSA-PKCS1-v1_5の鍵インポート手順 および 鍵 エクスポート手順を定義しなければなりません。

20.2 登録

このアルゴリズムの認識されるアルゴリズム名は "RSASSA-PKCS1-v1_5"です。

操作 パラメーター 結果
sign なし バイト シーケンス
verify なし boolean
generateKey RsaHashedKeyGenParams CryptoKeyPair
importKey RsaHashedImportParams CryptoKey
exportKey なし object

20.3 RsaKeyGenParams 辞書

WebIDLdictionary RsaKeyGenParams : Algorithm {
  required [EnforceRange] unsigned long modulusLength;
  required BigInteger publicExponent;
};

modulusLengthメンバーは、RSAモジュラスの長さを ビット単位で含みます。

publicExponentメンバーは、RSA公開 指数を含みます。

20.4 RsaHashedKeyGenParams辞書

WebIDLdictionary RsaHashedKeyGenParams : RsaKeyGenParams {
  required HashAlgorithmIdentifier hash;
};

hashメンバーは、使用するハッシュアルゴリズムを 表します。

20.5 RsaKeyAlgorithm 辞書

WebIDLdictionary RsaKeyAlgorithm : KeyAlgorithm {
  required unsigned long modulusLength;
  required BigInteger publicExponent;
};

modulusLengthメンバーは、RSAモジュラスの長さを ビット単位で含みます。

publicExponentメンバーは、RSA公開 指数を含みます。

20.6 RsaHashedKeyAlgorithm辞書

WebIDLdictionary RsaHashedKeyAlgorithm : RsaKeyAlgorithm {
  required KeyAlgorithm hash;
};

hashメンバーは、この鍵とともに使用されるハッシュアルゴリズムを 記述します。

20.7 RsaHashedImportParams辞書

WebIDLdictionary RsaHashedImportParams : Algorithm {
  required HashAlgorithmIdentifier hash;
};

hashメンバーは、使用するハッシュアルゴリズムを 記述します。

20.8 操作

20.8.1 署名

  1. key[[type]] 内部スロットが "private"でない場合、 InvalidAccessErrorthrowします。

  2. [RFC3447] のセクション8.2で定義される署名生成操作を実行します。 key[[handle]]内部スロットによって表される鍵を 署名者のprivate鍵として、messageMとして使用し、key[[algorithm]]内部 スロットのhash属性で指定されるハッシュ関数を、 EMSA-PKCS1-v1_5エンコーディングメソッドのHashオプションとして使用します。

  3. 操作の実行がエラーになる場合、 OperationErrorthrowします。

  4. signatureを、操作の実行から得られる値Sとします。

  5. signatureを返します。

20.8.2 検証

  1. key[[type]] 内部スロットが "public"でない場合、InvalidAccessErrorthrowします。

  2. [RFC3447] のセクション8.2で定義される署名検証操作を実行します。 key[[handle]] 内部スロットによって表される鍵を 署名者のRSA公開鍵として、messageMとして、 signatureSとして使用し、key[[algorithm]]内部 スロットの hash属性で指定されるハッシュ関数を、 EMSA-PKCS1-v1_5エンコーディングメソッドのHashオプションとして使用します。

  3. resultを、操作の結果が"valid signature"であれば値true、 それ以外であれば値falseを持つbooleanとします。

  4. resultを返します。

20.8.3 鍵の生成

  1. usagesが"sign"または"verify"でないエントリを 含む場合、 SyntaxErrorthrowします。

  2. [RFC3447] で定義されるように、RSA鍵ペアを生成します。RSAモジュラス長は normalizedAlgorithmmodulusLength 属性と等しく、RSA公開指数は normalizedAlgorithmpublicExponent 属性と等しいものとします。

  3. 鍵ペアの生成に失敗した場合、 OperationErrorthrowします。

  4. algorithmを新しい RsaHashedKeyAlgorithm 辞書とします。

  5. algorithmname属性を "RSASSA-PKCS1-v1_5"に設定します。

  6. algorithmmodulusLength 属性を、normalizedAlgorithmmodulusLength 属性と等しく設定します。

  7. algorithmpublicExponent 属性を、normalizedAlgorithmpublicExponent 属性と等しく設定します。

  8. algorithmhash属性を、 normalizedAlgorithmhashメンバーと等しく 設定します。

  9. publicKeyを、生成された鍵ペアの公開鍵を表す新しい CryptoKeyとします。

  10. publicKey[[type]] 内部スロットを"public"に設定します。

  11. publicKey[[algorithm]]内部 スロットをalgorithmに設定します。

  12. publicKey[[extractable]]内部 スロットをtrueに設定します。

  13. publicKey[[usages]]内部スロットを、 usages[ "verify" ]用途の共通部分に設定します。

  14. privateKeyを、生成された鍵ペアのprivate鍵を表す新しい CryptoKeyとします。

  15. privateKey[[type]] 内部スロットを"private"に設定します。

  16. privateKey[[algorithm]]内部 スロットをalgorithmに設定します。

  17. privateKey[[extractable]]内部 スロットをextractableに設定します。

  18. privateKey[[usages]]内部スロットを、 usages[ "sign" ]用途の共通部分に設定します。

  19. resultを新しいCryptoKeyPair 辞書とします。

  20. resultpublicKey属性を publicKeyに設定します。

  21. resultprivateKey属性を privateKeyに設定します。

  22. resultを返します。

20.8.4 鍵のインポート

  1. keyDataを、インポートされる鍵データとします。

  2. formatが"spki"である場合:
    1. usagesが"verify"でないエントリを 含む場合、 SyntaxErrorthrowします。

    2. spkiを、keyDataに対して subjectPublicKeyInfoを 解析する アルゴリズムを実行した結果とします。

    3. 解析中にエラーが発生した場合、 DataErrorthrowします。

    4. spkialgorithm AlgorithmIdentifierフィールドの algorithmオブジェクト識別子フィールドが、 [RFC3447] で定義されるrsaEncryption オブジェクト識別子と等しくない場合、 DataErrorthrowします。

    5. publicKeyを、ASN.1構造を 解析する アルゴリズムを実行した結果とします。dataspkisubjectPublicKeyInfoフィールドとして、 structureを[RFC3447] のセクションA.1.1で指定されるRSAPublicKey構造として、 exactDataをtrueに設定します。

    6. 解析中にエラーが発生した場合、または publicKeyが[RFC3447]に従って 有効な公開鍵ではないと判断できる場合、 DataErrorthrowします。

    7. keyを、 publicKeyによって識別されるRSA公開鍵を表す新しい CryptoKey とします。

    8. key[[type]] 内部スロットを"public"に設定します。

    formatが"pkcs8"である場合:
    1. usagesが"sign"でないエントリを含む場合、 SyntaxErrorthrowします。

    2. privateKeyInfoを、keyDataに対して privateKeyInfoを 解析する アルゴリズムを実行した結果とします。

    3. 解析中にエラーが発生した場合、 DataErrorthrowします。

    4. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmフィールドの algorithmオブジェクト識別子フィールドが、 [RFC3447] で定義されるrsaEncryptionオブジェクト識別子と等しくない場合、 DataErrorthrowします。

    5. rsaPrivateKeyを、ASN.1構造を 解析する アルゴリズムを実行した結果とします。dataprivateKeyInfoprivateKeyフィールドとして、 structureを[RFC3447] のセクションA.1.2で指定されるRSAPrivateKey構造として、 exactDataをtrueに設定します。

    6. 解析中にエラーが発生した場合、またはrsaPrivateKeyが [RFC3447]に従って 有効なRSA private鍵でない場合、 DataErrorthrowします。

    7. keyを、 rsaPrivateKeyによって識別されるRSA private鍵を表す新しい CryptoKey とします。

    8. key[[type]] 内部スロットを"private"に設定します。

    formatが"jwk"である場合:
    1. keyDataJsonWebKey 辞書である場合:

      jwkkeyDataと等しくします。

      それ以外の場合:

      DataErrorthrowします。

    2. jwkdフィールドが存在し、かつ usagesが"sign"でないエントリを含む場合、または jwkdフィールドが 存在せず、かつ usagesが"verify"でないエントリを含む場合、 SyntaxErrorthrowします。

    3. jwkktyフィールドが、 "RSA"に対する大文字小文字を区別する文字列一致でない場合、 DataErrorthrowします。

    4. usagesが空でなく、かつjwkuseフィールドが 存在し、"sig"に対する大文字小文字を区別する文字列一致でない場合、 DataErrorthrowします。

    5. jwkkey_opsフィールドが 存在し、JSON Web Key [JWK]の要件に従って 無効である場合、または指定されたすべてのusages値を含まない場合、 DataErrorthrowします。

    6. jwkextフィールドが 存在し、値がfalseであり、かつextractableがtrueである場合、 DataErrorthrowします。

    7. hashを、初期値がundefinedである文字列とします。

    8. jwkalgフィールドが 存在しない場合:

      hashをundefinedとします。

      algフィールドが 文字列"RS1"と等しい場合:

      hashを文字列"SHA-1"とします。

      algフィールドが 文字列"RS256"と等しい場合:

      hashを文字列"SHA-256"とします。

      algフィールドが 文字列"RS384"と等しい場合:

      hashを文字列"SHA-384"とします。

      algフィールドが 文字列"RS512"と等しい場合:

      hashを文字列"SHA-512"とします。

      それ以外の場合:
      1. 他の 適用可能な 仕様によって定義される任意の鍵 インポート手順を実行し、formatjwkを渡してhashを取得します。

      2. エラーが発生した場合、または 適用可能な 仕様が存在しない場合、 DataErrorthrowします。

    9. hashがundefinedでない場合:
      1. normalizedHashを、 alghashに設定し、 opdigestに設定して アルゴリズムを 正規化することの結果とします。

      2. normalizedHashnormalizedAlgorithmhash メンバーと等しくない場合、DataErrorthrowします。

    10. jwkdフィールドが存在する場合:
      1. jwkがJSON Web Algorithms [JWA] のセクション6.3.2の要件を満たさない場合、 DataErrorthrowします。

      2. privateKeyを、JSON Web Algorithms [JWA] のセクション6.3.2に従ってjwkを解釈することによって識別される RSA private鍵を表すものとします。

      3. privateKeyが[RFC3447]に従って 有効なRSA private鍵でない場合、 DataErrorthrowします。

      4. keyを、 privateKeyを表す新しいCryptoKey オブジェクトとします。

      5. key[[type]] 内部スロットを"private"に設定します。

      それ以外の場合:
      1. jwkがJSON Web Algorithms [JWA]のセクション 6.3.1の要件を満たさない場合、 DataErrorthrowします。

      2. publicKeyを、JSON Web Algorithms [JWA] のセクション6.3.1に従ってjwkを解釈することによって識別される RSA公開鍵を表すものとします。

      3. publicKeyが[RFC3447]に従って 有効なRSA公開鍵ではないと判断できる場合、 DataErrorthrowします。

      4. keyを、publicKeyを表す新しいCryptoKey とします。

      5. key[[type]] 内部スロットを"public"に設定します。

    それ以外の場合:
    NotSupportedErrorthrowします。
  3. algorithmを新しい RsaHashedKeyAlgorithm 辞書とします。

  4. algorithmname属性を "RSASSA-PKCS1-v1_5"に設定します。

  5. algorithmmodulusLength 属性を、RSA公開モジュラスの長さ(ビット単位)に設定します。

  6. algorithmpublicExponent 属性を、RSA公開指数のBigInteger 表現に設定します。

  7. algorithmhash属性を、 normalizedAlgorithmhash メンバーに設定します。

  8. key[[algorithm]]内部 スロットをalgorithmに設定します。

  9. keyを返します。

20.8.5 鍵のエクスポート

  1. keyを、エクスポートされる鍵とします。

  2. key[[handle]] 内部スロットによって表される基盤となる暗号鍵素材にアクセスできない場合、 OperationErrorthrowします。

  3. formatが"spki"である場合
    1. key[[type]] 内部スロットが"public"でない場合、InvalidAccessErrorthrowします。

    2. dataを、[RFC5280] で定義されるSubjectPublicKeyInfo ASN.1構造のインスタンスとし、次のプロパティを持つものとします:

      • algorithmフィールドを、次のプロパティを持つ AlgorithmIdentifier ASN.1型に設定します:

        • algorithmフィールドを、 [RFC3447] で定義されるOID rsaEncryptionに設定します。

        • paramsフィールドをASN.1型NULLに設定します。

      • subjectPublicKeyフィールドを、 [RFC3447] の付録A.1.1で定義されるRSAPublicKey ASN.1型をDERエンコードした結果に 設定します。これは、key[[handle]] 内部スロットによって表されるRSA公開鍵を表します。

    3. resultを、dataをDERエンコードした結果とします。

    formatが"pkcs8"である場合:
    1. key[[type]] 内部スロットが"private"でない場合、 InvalidAccessErrorthrowします。

    2. dataを、[RFC5208] で定義されるPrivateKeyInfo ASN.1構造のインスタンスとし、次のプロパティを持つものとします:

      • versionフィールドを0に設定します。

      • privateKeyAlgorithmフィールドを、次のプロパティを持つ PrivateKeyAlgorithmIdentifier ASN.1型に設定します:

        • algorithmフィールドを、 [RFC3447] で定義されるOID rsaEncryptionに設定します。

        • paramsフィールドをASN.1型NULLに設定します。

      • privateKeyフィールドを、 [RFC3447] の付録A.1.2で定義されるRSAPrivateKey ASN.1型をDERエンコードした結果に設定します。 これは、key[[handle]] 内部スロットによって表されるRSA private鍵を表します。

        注記
        [RFC5208] は、このフィールドのエンコーディングがセクション5でBERエンコードされるべきであると 指定しています("for example"として)。しかし、WebCrypto実装にBERエンコードおよびBERデコードの サポートを要求することを避けるため、DER エンコーディングのみが生成または受け入れられます。
    3. resultを、dataをDERエンコードした結果とします。

    formatが"jwk"である場合:
    1. jwkを新しいJsonWebKey 辞書とします。

    2. jwkkty属性を文字列 "RSA"に設定します。

    3. hashを、key[[algorithm]] 内部スロットのhash 属性のname 属性とします。

    4. hashが"SHA-1"である場合:

      jwkalg属性を文字列 "RS1"に設定します。

      hashが"SHA-256"である場合:

      jwkalg属性を文字列 "RS256"に設定します。

      hashが"SHA-384"である場合:

      jwkalg属性を文字列 "RS384"に設定します。

      hashが"SHA-512"である場合:

      jwkalg属性を文字列 "RS512"に設定します。

      それ以外の場合:
      1. 他の 適用可能な 仕様によって定義される任意の鍵 エクスポート手順を実行し、formatkeyを渡してalgを取得します。

      2. エラーが発生した場合、または 適用可能な 仕様が存在しない場合、 NotSupportedErrorthrowします。

      3. jwkalg属性を algに設定します。

    5. jwkの属性n およびeを、 JSON Web Algorithms [JWA] のセクション6.3.1における 対応する定義に従って設定します。

    6. key[[type]] 内部スロットが"private"である場合:
      1. jwkdpqdpdq、 および qiという名前の属性を、 JSON Web Algorithms [JWA] のセクション6.3.2における対応する定義に従って設定します。

      2. key[[handle]] 内部スロットによって表される基盤となるRSA private鍵が 2つを超える素数で表される場合、 jwkothという名前の属性を、 JSON Web Algorithms [JWA] のセクション6.3.2.7における対応する定義に従って設定します。

    7. jwkkey_ops属性を、keyusages属性に設定します。

    8. jwkext属性を、key[[extractable]] 内部スロットに設定します。

    9. resultjwkとします。

    それ以外の場合

    NotSupportedErrorthrowします。

  4. resultを返します。

21. RSA-PSS

21.1 説明

このセクションは非規範的です。

"RSA-PSS"アルゴリズム識別子は、 [RFC3447] で指定されるRSASSA-PSSアルゴリズムを使用し、 この仕様で定義されるSHAハッシュ関数およびマスク生成式 MGF1を使用して、署名および検証を実行するために使用されます。

他の 仕様は、RSASSA-PSSで追加のハッシュアルゴリズムを使用することを指定できます。そのような仕様は、 追加のハッシュアルゴリズムのdigest操作、およびRSASSA-PSSの 鍵インポート手順および 鍵エクスポート手順を定義 しなければなりません。

21.2 登録

このアルゴリズムの認識されるアルゴリズム名は "RSA-PSS"です。

操作 パラメーター 結果
sign RsaPssParams バイト シーケンス
verify RsaPssParams boolean
generateKey RsaHashedKeyGenParams CryptoKeyPair
importKey RsaHashedImportParams CryptoKey
exportKey なし object

21.3 RsaPssParams辞書

WebIDLdictionary RsaPssParams : Algorithm {
  required [EnforceRange] unsigned long saltLength;
};

saltLengthメンバーは、ランダムソルトの望ましい長さを バイト単位で表します。

21.4 操作

21.4.1 署名

  1. key[[type]] 内部スロットが "private"でない場合、 InvalidAccessErrorthrowします。

  2. [RFC3447] のセクション8.1で定義される署名生成操作を実行します。 key[[handle]]内部スロットによって表される鍵を 署名者のprivate鍵Kとして、messageを 署名されるメッセージMとして使用し、 key[[algorithm]]内部 スロットのhash属性で指定されるハッシュ関数を Hashオプションとして、MGF1([RFC3447]のセクションB.2.1で定義)を MGFオプションとして、そして normalizedAlgorithmsaltLengthメンバーを EMSA-PSS-ENCODE操作のソルト長オプションとして使用します。

  3. 操作の実行がエラーになる場合、 OperationErrorthrowします。

  4. signatureを、操作の実行から得られる署名Sとします。

  5. signatureを返します。

21.4.2 検証

  1. key[[type]] 内部スロットが"public"でない場合、InvalidAccessErrorthrowします。

  2. [RFC3447] のセクション8.1で定義される署名検証操作を実行します。 key[[handle]]内部スロットによって表される鍵を 署名者のRSA公開鍵として、messageMとして、 signatureSとして使用し、 key[[algorithm]]内部 スロットのhash属性で指定されるハッシュ関数を Hashオプションとして、MGF1([RFC3447]のセクションB.2.1で定義)を MGFオプションとして、そして normalizedAlgorithmsaltLengthメンバーを EMSA-PSS-VERIFY操作のソルト長オプションとして使用します。

  3. resultを、操作の結果が"valid signature"であれば値true、 それ以外であれば値falseを持つbooleanとします。

21.4.3 鍵の生成

  1. usagesが"sign"または"verify"でないエントリを 含む場合、 SyntaxErrorthrowします。

  2. [RFC3447] で定義されるように、RSA鍵ペアを生成します。RSAモジュラス長は normalizedAlgorithmmodulusLengthメンバーと等しく、 RSA公開指数は normalizedAlgorithmpublicExponentメンバーと等しいものとします。

  3. 操作の実行がエラーになる場合、 OperationErrorthrowします。

  4. algorithmを新しい RsaHashedKeyAlgorithm 辞書とします。

  5. algorithmname属性を "RSA-PSS"に設定します。

  6. algorithmmodulusLength 属性を、normalizedAlgorithmmodulusLength メンバーと等しく設定します。

  7. algorithmpublicExponent 属性を、normalizedAlgorithmpublicExponent メンバーと等しく設定します。

  8. algorithmhash属性を、 normalizedAlgorithmhashメンバーと等しく 設定します。

  9. publicKeyを、生成された鍵ペアの公開鍵を表す新しい CryptoKey とします。

  10. publicKey[[type]] 内部スロットを"public"に設定します。

  11. publicKey[[algorithm]]内部 スロットをalgorithmに設定します。

  12. publicKey[[extractable]]内部 スロットをtrueに設定します。

  13. publicKey[[usages]]内部スロットを、 usages[ "verify" ]用途の共通部分に設定します。

  14. privateKeyを、生成された鍵ペアのprivate鍵を表す新しい CryptoKey とします。

  15. privateKey[[type]] 内部スロットを"private"に設定します。

  16. privateKey[[algorithm]]内部 スロットをalgorithmに設定します。

  17. privateKey[[extractable]]内部 スロットをextractableに設定します。

  18. privateKey[[usages]]内部スロットを、 usages[ "sign" ]用途の共通部分に設定します。

  19. resultを新しいCryptoKeyPair 辞書とします。

  20. resultpublicKey属性を publicKeyに設定します。

  21. resultprivateKey属性を privateKeyに設定します。

  22. resultを返します。

21.4.4 鍵のインポート

  1. keyDataを、インポートされる鍵データとします。

  2. formatが"spki"である場合:
    1. usagesが"verify"でないエントリを含む場合、 SyntaxErrorthrowします。

    2. spkiを、keyDataに対して subjectPublicKeyInfoを 解析する アルゴリズムを実行した結果とします。

    3. 解析中にエラーが発生した場合、 DataErrorthrowします。

    4. spkialgorithm AlgorithmIdentifierフィールドの algorithmオブジェクト識別子フィールドが、 [RFC3447] で定義されるrsaEncryption オブジェクト識別子と等しくない場合、 DataErrorthrowします。

    5. publicKeyを、ASN.1構造を 解析する アルゴリズムを実行した結果とします。dataspkisubjectPublicKeyInfoフィールドとして、 structureを[RFC3447] のセクションA.1.1で指定されるRSAPublicKey構造として、 exactDataをtrueに設定します。

    6. 解析中にエラーが発生した場合、または publicKeyが[RFC3447]に従って 有効な公開鍵ではないと判断できる場合、 DataErrorthrowします。

    7. keyを、 publicKeyによって識別されるRSA公開鍵を表す新しい CryptoKey とします。

    8. key[[type]] 内部スロットを"public"に設定します。

    formatが"pkcs8"である場合:
    1. usagesが"sign"でないエントリを含む場合、 SyntaxErrorthrowします。

    2. privateKeyInfoを、keyDataに対して privateKeyInfoを 解析する アルゴリズムを実行した結果とします。

    3. 解析中にエラーが発生した場合、DataErrorthrowします。

    4. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmフィールドの algorithmオブジェクト識別子フィールドが、 [RFC3447] で定義されるrsaEncryptionオブジェクト識別子と等しくない場合、 DataErrorthrowします。

    5. rsaPrivateKeyを、ASN.1構造を 解析する アルゴリズムを実行した結果とします。dataprivateKeyInfoprivateKeyフィールドとして、 structureを[RFC3447] のセクションA.1.2で指定されるRSAPrivateKey構造として、 exactDataをtrueに設定します。

    6. 解析中にエラーが発生した場合、またはrsaPrivateKeyが [RFC3447]に従って 有効なRSA private鍵でない場合、 DataErrorthrowします。

    7. keyを、 rsaPrivateKeyによって識別されるRSA private鍵を表す新しい CryptoKey とします。

    8. key[[type]] 内部スロットを"private"に設定します。

    formatが"jwk"である場合:
    1. keyDataJsonWebKey 辞書である場合:

      jwkkeyDataと等しくします。

      それ以外の場合:

      DataErrorthrowします。

    2. jwkdフィールドが存在し、かつ usagesが"sign"でないエントリを含む場合、または jwkdフィールドが 存在せず、かつ usagesが"verify"でないエントリを含む場合、 SyntaxErrorthrowします。

    3. jwkktyフィールドが、 "RSA"に対する大文字小文字を区別する文字列一致でない場合、 DataErrorthrowします。

    4. usagesが空でなく、かつjwkuseフィールドが 存在し、"sig"に対する大文字小文字を区別する文字列一致でない場合、 DataErrorthrowします。

    5. jwkkey_opsフィールドが 存在し、JSON Web Key [JWK]の要件に従って 無効である場合、または指定されたすべてのusages値を含まない場合、 DataErrorthrowします。

    6. jwkextフィールドが 存在し、値がfalseであり、かつextractableがtrueである場合、 DataErrorthrowします。

    7. jwkalgフィールドが 存在しない場合:

      hashをundefinedとします。

      algフィールドが 文字列"PS1"と等しい場合:

      hashを文字列"SHA-1"とします。

      algフィールドが 文字列"PS256"と等しい場合:

      hashを文字列"SHA-256"とします。

      algフィールドが 文字列"PS384"と等しい場合:

      hashを文字列"SHA-384"とします。

      algフィールドが 文字列"PS512"と等しい場合:

      hashを文字列"SHA-512"とします。

      それ以外の場合:
      1. 他の 適用可能な 仕様によって定義される任意の鍵 インポート手順を実行し、formatjwkを渡してhashを取得します。

      2. エラーが発生した場合、または 適用可能な 仕様が存在しない場合、 DataErrorthrowします。

    8. hashがundefinedでない場合:
      1. normalizedHashを、 alghashに設定し、 opdigestに設定して アルゴリズムを 正規化することの結果とします。

      2. normalizedHashnormalizedAlgorithmhash メンバーと等しくない場合、DataErrorthrowします。

    9. jwkdフィールドが存在する場合:
      1. jwkがJSON Web Algorithms [JWA] のセクション6.3.2の要件を満たさない場合、 DataErrorthrowします。

      2. privateKeyを、JSON Web Algorithms [JWA] のセクション6.3.2に従ってjwkを解釈することによって識別される RSA private鍵を表すものとします。

      3. privateKeyが[RFC3447]に従って 有効なRSA private鍵ではないと判断できる場合、 DataErrorthrowします。

      4. keyを、privateKeyを表す新しい CryptoKey とします。

      5. key[[type]] 内部スロットを"private"に設定します。

      それ以外の場合:
      1. jwkがJSON Web Algorithms [JWA]のセクション 6.3.1の要件を満たさない場合、 DataErrorthrowします。

      2. publicKeyを、JSON Web Algorithms [JWA] のセクション6.3.1に従ってjwkを解釈することによって識別される RSA公開鍵を表すものとします。

      3. publicKeyが[RFC3447]に従って 有効なRSA公開鍵ではないと判断できる場合、 DataErrorthrowします。

      4. keyを、publicKeyを表す新しい CryptoKey とします。

      5. key[[type]] 内部スロットを"public"に設定します。

    それ以外の場合:
    NotSupportedErrorthrowします。
  3. algorithmを新しい RsaHashedKeyAlgorithm 辞書とします。

  4. algorithmname属性を "RSA-PSS"に設定します。

  5. algorithmmodulusLength 属性を、RSA公開モジュラスの長さ(ビット単位)に設定します。

  6. algorithmpublicExponent 属性を、RSA公開指数のBigInteger 表現に設定します。

  7. algorithmhash属性を、 normalizedAlgorithmhash メンバーに設定します。

  8. key[[algorithm]]内部 スロットをalgorithmに設定します。

  9. keyを返します。

21.4.5 鍵のエクスポート

  1. keyを、エクスポートされる鍵とします。

  2. key[[handle]]内部スロットによって表される 基盤となる暗号鍵素材にアクセスできない場合、OperationErrorthrowします。

  3. formatが"spki"である場合
    1. key[[type]] 内部スロットが"public"でない場合、InvalidAccessErrorthrowします。

    2. dataを、[RFC5280] で定義されるSubjectPublicKeyInfo ASN.1構造のインスタンスとし、次のプロパティを持つものとします:

      • algorithmフィールドを、次のプロパティを持つ AlgorithmIdentifier ASN.1型に設定します:

        • algorithmフィールドを、 [RFC3447] で定義されるOID rsaEncryptionに設定します。

        • paramsフィールドをASN.1型NULLに設定します。

      • subjectPublicKeyフィールドを、 [RFC3447] の付録A.1.1で定義されるRSAPublicKey ASN.1型をDERエンコードした結果に 設定します。これは、key[[handle]] 内部スロットによって表されるRSA公開鍵を表します。

    3. resultを、dataをDERエンコードした結果とします。

    formatが"pkcs8"である場合:
    1. key[[type]] 内部スロットが"private"でない場合、InvalidAccessErrorthrowします。

    2. dataを、[RFC5208] で定義されるPrivateKeyInfo ASN.1構造のインスタンスとし、次のプロパティを持つものとします:

      • versionフィールドを0に設定します。

      • privateKeyAlgorithmフィールドを、次のプロパティを持つ PrivateKeyAlgorithmIdentifier ASN.1型に設定します:

        • algorithmフィールドを、 [RFC3447] で定義されるOID rsaEncryptionに設定します。

        • paramsフィールドをASN.1型NULLに設定します。

      • privateKeyフィールドを、 [RFC3447] の付録A.1.2で定義されるRSAPrivateKey ASN.1型をDERエンコードした結果に設定します。 これは、key[[handle]] 内部スロットによって表されるRSA private鍵を表します。

        注記
        [RFC5208] は、このフィールドのエンコーディングがセクション5でBERエンコードされるべきであると 指定しています("for example"として)。しかし、WebCrypto実装にBERエンコードおよびBERデコードの サポートを要求することを避けるため、DER エンコーディングのみが生成または受け入れられます。
    3. resultを、dataをDERエンコードした結果とします。

    formatが"jwk"である場合:
    1. jwkを新しいJsonWebKey辞書とします。

    2. jwkkty属性を文字列 "RSA"に設定します。

    3. hashを、key[[algorithm]] 内部スロットのhash 属性のname 属性とします。

    4. hashが"SHA-1"である場合:

      jwkalg属性を文字列 "PS1"に設定します。

      hashが"SHA-256"である場合:

      jwkalg属性を文字列 "PS256"に設定します。

      hashが"SHA-384"である場合:

      jwkalg属性を文字列 "PS384"に設定します。

      hashが"SHA-512"である場合:

      jwkalg属性を文字列 "PS512"に設定します。

      それ以外の場合:
      1. 他の 適用可能な 仕様によって定義される任意の鍵 エクスポート手順を実行し、formatkey[[algorithm]] 内部スロットのhash 属性を渡してalgを取得します。

      2. jwkalg属性を algに設定します。

    5. jwkの属性n およびeを、 JSON Web Algorithms [JWA] のセクション6.3.1における 対応する定義に従って設定します。

    6. key[[type]] 内部スロットが"private"である場合:
      1. jwkdpqdpdq、 および qiという名前の属性を、 JSON Web Algorithms [JWA] のセクション6.3.2における対応する定義に従って設定します。

      2. key[[handle]] 内部スロットによって表される基盤となるRSA private鍵が 2つを超える素数で表される場合、 jwkothという名前の属性を、 JSON Web Algorithms [JWA] のセクション6.3.2.7における対応する定義に従って設定します。

    7. jwkkey_ops属性を、keyusages属性に設定します。

    8. jwkext属性を、key[[extractable]] 内部スロットに設定します。

    9. resultjwkとします。

    それ以外の場合

    NotSupportedErrorthrowします。

  4. resultを返します。

22. RSA-OAEP

22.1 説明

このセクションは非規範的です。

"RSA-OAEP"アルゴリズム識別子は、 [RFC3447] で指定されるRSAES-OAEPアルゴリズムに従って暗号化 および復号を実行するために使用されます。その際、 この仕様で定義されるSHAハッシュ関数およびマスク 生成関数MGF1を使用します。

他の 仕様は、RSAES-OAEPで追加のハッシュアルゴリズムを使用することを指定できます。そのような仕様は、 追加のハッシュアルゴリズムのdigest操作、およびRSAES-OAEPの 鍵インポート手順および 鍵エクスポート手順をRSAES-OAEPについて定義 しなければなりません。

22.2 登録

このアルゴリズムの認識されるアルゴリズム名は "RSA-OAEP"です。

操作 パラメーター 結果
encrypt RsaOaepParams バイト シーケンス
decrypt RsaOaepParams バイト シーケンス
generateKey RsaHashedKeyGenParams CryptoKeyPair
importKey RsaHashedImportParams CryptoKey
exportKey なし object

22.3 RsaOaepParams辞書

WebIDLdictionary RsaOaepParams : Algorithm {
  BufferSource label;
};

labelメンバーは、メッセージに関連付ける任意のラベル/アプリケーション データを表します。

22.4 操作

22.4.1 暗号化

  1. key[[type]] 内部スロットが"public"でない場合、 InvalidAccessErrorthrowします。

  2. labelを、normalizedAlgorithmlabelメンバー、 またはnormalizedAlgorithmlabelメンバーが 存在しない場合は空のバイトシーケンスとします。

  3. [RFC3447] のセクション7.1で定義される暗号化操作を実行します。 keyによって表される鍵を受信者のRSA公開鍵として、 plaintextを暗号化されるメッセージMとして、 labelをラベルLとして使用し、かつ key[[algorithm]]内部 スロットのhash 属性で指定されるハッシュ関数をHashオプションとして、MGF1( [RFC3447]のセクションB.2.1で定義)を MGFオプションとして使用します。

  4. 操作の実行がエラーになる場合、 OperationErrorthrowします。

  5. ciphertextを、操作の実行から得られる値Cとします。

  6. ciphertextを返します。

22.4.2 復号

  1. key[[type]] 内部スロットが"private"でない場合、 InvalidAccessErrorthrowします。

  2. labelを、normalizedAlgorithmlabelメンバー、 またはnormalizedAlgorithmlabelメンバーが 存在しない場合は空のバイトシーケンスとします。

  3. [RFC3447] のセクション7.1で定義される復号操作を実行します。 keyによって表される鍵を受信者のRSA private鍵として、 ciphertextを復号される暗号文Cとして、 labelをラベルLとして使用し、かつ key[[algorithm]]内部 スロットのhash 属性で指定されるハッシュ関数をHashオプションとして、MGF1( [RFC3447]のセクションB.2.1で定義)を MGFオプションとして使用します。

  4. 操作の実行がエラーになる場合、 OperationErrorthrowします。

  5. plaintextを、操作の実行から得られる値Mとします。

  6. plaintextを返します。

22.4.3 鍵の生成

  1. usagesが"encrypt"、"decrypt"、 "wrapKey"または"unwrapKey"でないエントリを含む場合、 SyntaxErrorthrowします。

  2. [RFC3447] で定義されるように、RSA鍵ペアを生成します。RSAモジュラス長は normalizedAlgorithmmodulusLengthメンバーと等しく、 RSA公開指数は normalizedAlgorithmpublicExponentメンバーと等しいものとします。

  3. 操作の実行がエラーになる場合、 OperationErrorthrowします。

  4. algorithmを新しい RsaHashedKeyAlgorithm オブジェクトとします。

  5. algorithmname属性を "RSA-OAEP"に設定します。

  6. algorithmmodulusLength 属性を、normalizedAlgorithmmodulusLength メンバーと等しく設定します。

  7. algorithmpublicExponent 属性を、normalizedAlgorithmpublicExponent メンバーと等しく設定します。

  8. algorithmhash属性を、 normalizedAlgorithmhashメンバーと等しく 設定します。

  9. publicKeyを、生成された鍵ペアの公開鍵を表す新しい CryptoKey とします。

  10. publicKey[[type]] 内部スロットを"public"に設定します。

  11. publicKey[[algorithm]]内部 スロットをalgorithmに設定します。

  12. publicKey[[extractable]]内部 スロットをtrueに設定します。

  13. publicKey[[usages]]内部スロットを、 usages[ "encrypt", "wrapKey" ]用途の共通部分に設定します。

  14. privateKeyを、生成された鍵ペアのprivate鍵を表す新しい CryptoKey とします。

  15. privateKey[[type]] 内部スロットを"private"に設定します。

  16. privateKey[[algorithm]]内部 スロットをalgorithmに設定します。

  17. privateKey[[extractable]]内部 スロットをextractableに設定します。

  18. privateKey[[usages]]内部スロットを、 usages[ "decrypt", "unwrapKey" ]用途の共通部分に設定します。

  19. resultを新しいCryptoKeyPair 辞書とします。

  20. resultpublicKey属性を publicKeyに設定します。

  21. resultprivateKey属性を privateKeyに設定します。

  22. resultを返します。

22.4.4 鍵のインポート

  1. keyDataを、インポートされる鍵データとします。

  2. formatが"spki"である場合:
    1. usagesが"encrypt"または "wrapKey"でないエントリを含む場合、 SyntaxErrorthrowします。

    2. spkiを、keyDataに対して subjectPublicKeyInfoを 解析する アルゴリズムを実行した結果とします。

    3. 解析中にエラーが発生した場合、 DataErrorthrowします。

    4. spkialgorithm AlgorithmIdentifierフィールドの algorithmオブジェクト識別子フィールドが、 [RFC3447] で定義されるrsaEncryption オブジェクト識別子と等しくない場合、 DataErrorthrowします。

    5. publicKeyを、ASN.1構造を 解析する アルゴリズムを実行した結果とします。dataspkisubjectPublicKeyInfoフィールドとして、 structureを[RFC3447] のセクションA.1.1で指定されるRSAPublicKey構造として、 exactDataをtrueに設定します。

    6. 解析中にエラーが発生した場合、または publicKeyが[RFC3447]に従って 有効な公開鍵ではないと判断できる場合、 DataErrorthrowします。

    7. keyを、 publicKeyによって識別されるRSA公開鍵を表す新しい CryptoKey とします。

    8. key[[type]] 内部スロットを"public"に設定します。

    formatが"pkcs8"である場合:
    1. usagesが"decrypt"または"unwrapKey"でないエントリを 含む場合、 SyntaxErrorthrowします。

    2. privateKeyInfoを、keyDataに対して privateKeyInfoを 解析する アルゴリズムを実行した結果とします。

    3. 解析中にエラーが発生した場合、DataErrorthrowします。

    4. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmフィールドの algorithmオブジェクト識別子フィールドが、 [RFC3447] で定義されるrsaEncryptionオブジェクト識別子と等しくない場合、 DataErrorthrowします。

    5. rsaPrivateKeyを、ASN.1構造を 解析する アルゴリズムを実行した結果とします。dataprivateKeyInfoprivateKeyフィールドとして、 structureを[RFC3447] のセクションA.1.2で指定されるRSAPrivateKey構造として、 exactDataをtrueに設定します。

    6. 解析中にエラーが発生した場合、またはrsaPrivateKeyが [RFC3447]に従って 有効なRSA private鍵でない場合、 DataErrorthrowします。

    7. keyを、 rsaPrivateKeyによって識別されるRSA private鍵を表す新しい CryptoKey とします。

    8. key[[type]] 内部スロットを"private"に設定します。

    formatが"jwk"である場合:
    1. keyDataJsonWebKey 辞書である場合:

      jwkkeyDataと等しくします。

      それ以外の場合:

      DataErrorthrowします。

    2. jwkdフィールドが存在し、かつ usagesが"decrypt"または"unwrapKey"でないエントリを 含む場合、 SyntaxErrorthrowします。

    3. jwkdフィールドが存在せず、かつ usagesが"encrypt"または"wrapKey"でないエントリを 含む場合、 SyntaxErrorthrowします。

    4. jwkktyフィールドが、 "RSA"に対する大文字小文字を区別する文字列一致でない場合、 DataErrorthrowします。

    5. usagesが空でなく、かつjwkuseフィールドが 存在し、"enc"に対する大文字小文字を区別する文字列一致でない場合、 DataErrorthrowします。

    6. jwkkey_opsフィールドが 存在し、JSON Web Key [JWK]の要件に従って 無効である場合、または指定されたすべてのusages値を含まない場合、 DataErrorthrowします。

    7. jwkextフィールドが 存在し、値がfalseであり、かつextractableがtrueである場合、 DataErrorthrowします。

    8. jwkalgフィールドが存在しない場合:
      hashをundefinedとします。
      jwkalgフィールドが "RSA-OAEP"と等しい場合:
      hashを文字列"SHA-1"とします。
      jwkalgフィールドが "RSA-OAEP-256"と等しい場合:
      hashを文字列"SHA-256"とします。
      jwkalgフィールドが "RSA-OAEP-384"と等しい場合:
      hashを文字列"SHA-384"とします。
      jwkalgフィールドが "RSA-OAEP-512"と等しい場合:
      hashを文字列"SHA-512"とします。
      それ以外の場合:
      1. 他の 適用可能な 仕様によって定義される任意の鍵 インポート手順を実行し、formatjwkを渡してhashを取得します。

      2. エラーが発生した場合、または 適用可能な 仕様が存在しない場合、 DataErrorthrowします。

    9. hashがundefinedでない場合:
      1. normalizedHashを、 alghashに設定し、 opdigestに設定して、 アルゴリズムを 正規化することの結果とします。

      2. normalizedHashnormalizedAlgorithmhash メンバーと等しくない場合、DataErrorthrowします。

    10. jwkdフィールドが存在する場合:
      1. jwkがJSON Web Algorithms [JWA]のセクション 6.3.2の要件を満たさない場合、 DataErrorthrowします。

      2. privateKeyを、JSON Web Algorithms [JWA] のセクション6.3.2に従ってjwkを解釈することによって識別される RSA private鍵を表すものとします。

      3. privateKeyが[RFC3447]に従って 有効なRSA private鍵ではないと判断できる場合、 DataErrorthrowします。

      4. keyを、privateKeyを表す新しい CryptoKey とします。

      5. key[[type]] 内部スロットを"private"に設定します。

      それ以外の場合:
      1. jwkがJSON Web Algorithms [JWA]のセクション 6.3.1の要件を満たさない場合、 DataErrorthrowします。

      2. publicKeyを、JSON Web Algorithms [JWA] のセクション6.3.1に従ってjwkを解釈することによって識別される RSA公開鍵を表すものとします。

      3. publicKeyが[RFC3447]に従って 有効なRSA公開鍵ではないと判断できる場合、 DataErrorthrowします。

      4. keyを、publicKeyを表す新しい CryptoKey とします。

      5. key[[type]] 内部スロットを"public"に設定します。

    それ以外の場合:
    NotSupportedErrorthrowします。
  3. algorithmを新しい RsaHashedKeyAlgorithmとします。

  4. algorithmname属性を "RSA-OAEP"に設定します。

  5. algorithmmodulusLength 属性を、RSA公開モジュラスの長さ(ビット単位)に設定します。

  6. algorithmpublicExponent 属性を、RSA公開指数のBigInteger 表現に設定します。

  7. algorithmhash属性を、 normalizedAlgorithmhash メンバーに設定します。

  8. key[[algorithm]]内部 スロットをalgorithmに設定します。

  9. keyを返します。

22.4.5 鍵のエクスポート

  1. keyを、エクスポートされる鍵とします。

  2. key[[handle]]内部スロットによって表される 基盤となる暗号鍵素材にアクセスできない場合、OperationErrorthrowします。

  3. formatが"spki"である場合
    1. key[[type]] 内部スロットが"public"でない場合、InvalidAccessErrorthrowします。

    2. dataを、[RFC5280] で定義されるSubjectPublicKeyInfo ASN.1構造のインスタンスとし、次のプロパティを持つものとします:

      • algorithmフィールドを、次のプロパティを持つ AlgorithmIdentifier ASN.1型に設定します:

        • algorithmフィールドを、 [RFC3447] で定義されるOID rsaEncryptionに設定します。

        • paramsフィールドをASN.1型NULLに設定します。

      • subjectPublicKeyフィールドを、 [RFC3447] の付録A.1.1で定義されるRSAPublicKey ASN.1型をDERエンコードした結果に 設定します。これは、key[[handle]] 内部スロットによって表されるRSA公開鍵を表します。

    3. resultを、dataをDERエンコードした結果とします。

    formatが"pkcs8"である場合:
    1. key[[type]] 内部スロットが"private"でない場合、InvalidAccessErrorthrowします。

    2. dataを、[RFC5208] で定義されるPrivateKeyInfo ASN.1構造のインスタンスとし、次のプロパティを持つものとします:

      • versionフィールドを0に設定します。

      • privateKeyAlgorithmフィールドを、次のプロパティを持つ PrivateKeyAlgorithmIdentifier ASN.1型に設定します:

        • algorithmフィールドを、 [RFC3447] で定義されるOID rsaEncryptionに設定します。

        • paramsフィールドをASN.1型NULLに設定します。

      • privateKeyフィールドを、 [RFC3447] の付録A.1.2で定義されるRSAPrivateKey ASN.1型をDERエンコードした結果に設定します。 これは、key[[handle]] 内部スロットによって表されるRSA private鍵を表します。

        注記
        [RFC5208] は、このフィールドのエンコーディングがセクション5でBERエンコードされるべきであると 指定しています("for example"として)。しかし、WebCrypto実装にBERエンコードおよびBERデコードの サポートを要求することを避けるため、DER エンコーディングのみが生成または受け入れられます。
    3. resultを、dataをDERエンコードした結果とします。

    formatが"jwk"である場合:
    1. jwkを新しいJsonWebKey 辞書とします。

    2. jwkkty属性を文字列 "RSA"に設定します。

    3. hashを、key[[algorithm]] 内部スロットのhash 属性のname 属性とします。

    4. hashが"SHA-1"である場合:

      jwkalg属性を文字列 "RSA-OAEP"に設定します。

      hashが"SHA-256"である場合:

      jwkalg属性を文字列 "RSA-OAEP-256"に設定します。

      hashが"SHA-384"である場合:

      jwkalg属性を文字列 "RSA-OAEP-384"に設定します。

      hashが"SHA-512"である場合:

      jwkalg属性を文字列 "RSA-OAEP-512"に設定します。

      それ以外の場合:
      1. 他の 適用可能な 仕様によって定義される任意の鍵 エクスポート手順を実行し、formatkey[[algorithm]] 内部スロットのhash 属性を渡してalgを取得します。

      2. jwkalg属性を algに設定します。

    5. jwkの属性n およびeを、 JSON Web Algorithms [JWA] のセクション6.3.1における 対応する定義に従って設定します。

    6. key[[type]] 内部スロットが"private"である場合:
      1. jwkdpqdpdq、 および qiという名前の属性を、 JSON Web Algorithms [JWA] のセクション6.3.2における対応する定義に従って設定します。

      2. key[[handle]] 内部スロットによって表される基盤となるRSA private鍵が 2つを超える素数で表される場合、 jwkothという名前の属性を、 JSON Web Algorithms [JWA] のセクション6.3.2.7における対応する定義に従って設定します。

    7. jwkkey_ops属性を、keyusages属性に設定します。

    8. jwkext属性を、key[[extractable]] 内部スロットに設定します。

    9. resultjwkとします。

    それ以外の場合

    NotSupportedErrorthrowします。

  4. resultを返します。

23. ECDSA

23.1 説明

このセクションは非規範的です。

"ECDSA"アルゴリズム識別子は、署名および検証を実行するために使用されます。 これは、[RFC6090]で指定されるECDSA アルゴリズムを使用し、この仕様で定義されるSHA ハッシュ関数および楕円 曲線を使用します。

他の 仕様は、 ECDSAで追加の楕円曲線およびハッシュアルゴリズムを使用することを指定できます。ECDSAで使用する 追加のハッシュアルゴリズムを指定するには、仕様はdigest操作をサポートする 登録済みアルゴリズムを定義しなければなりません。 追加の楕円曲線を指定するには、仕様は 曲線名ECDSA署名手順ECDSA検証手順ECDSA生成手順ECDSA 鍵インポート手順および ECDSA 鍵エクスポート手順を定義しなければなりません。

23.2 登録

このアルゴリズムの認識されるアルゴリズム名は "ECDSA"です。

操作 パラメーター 結果
sign EcdsaParams バイト シーケンス
verify EcdsaParams boolean
generateKey EcKeyGenParams CryptoKeyPair
importKey EcKeyImportParams CryptoKey
exportKey なし object

23.3 EcdsaParams辞書

WebIDLdictionary EcdsaParams : Algorithm {
  required HashAlgorithmIdentifier hash;
};

hashメンバーは、使用するハッシュアルゴリズムを表します。

23.4 EcKeyGenParams辞書

WebIDLtypedef DOMString NamedCurve;

dictionary EcKeyGenParams : Algorithm {
  required NamedCurve namedCurve;
};

NamedCurve型は名前付き楕円曲線を表します。 これは、よく知られた楕円 曲線のドメインパラメーターを指定するための便利な方法です。この仕様で定義される値は次のとおりです:

"P-256"
NIST推奨曲線P-256。secp256r1としても知られます。
"P-384"
NIST推奨曲線P-384。secp384r1としても知られます。
"P-521"
NIST推奨曲線P-521。secp521r1としても知られます。

他の 仕様は、 追加の値を定義できます。

EcKeyGenParams辞書のnamedCurveメンバーは、名前付き 曲線を表します。

23.5 EcKeyAlgorithm辞書

WebIDLdictionary EcKeyAlgorithm : KeyAlgorithm {
  required NamedCurve namedCurve;
};

namedCurveメンバーは、この鍵が使用する名前付き曲線を 表します。

23.6 EcKeyImportParams辞書

WebIDLdictionary EcKeyImportParams : Algorithm {
  required NamedCurve namedCurve;
};

namedCurveメンバーは名前付き曲線を表します。

23.7 操作

23.7.1 署名

  1. key[[type]] 内部スロットが"private"でない場合、 InvalidAccessErrorthrowします。

  2. hashAlgorithmを、normalizedAlgorithmhash メンバーとします。

  3. Mを、hashAlgorithmによって指定されるdigest操作を messageを使用して実行した結果とします。

  4. dを、keyに関連付けられたECDSA private鍵とします。

  5. paramsを、 keyに関連付けられたECドメインパラメーターとします。

  6. key[[algorithm]]内部 スロットのnamedCurve属性が "P-256"、"P-384"または"P-521"である場合:
    1. [RFC6090] のセクション5.4で指定されるECDSA署名プロセスを実行します。 Mをメッセージとして、paramsを ECドメインパラメーターとして使用し、dをprivate鍵として使用します。

    2. rおよびsを、ECDSA署名プロセスの実行から 得られる整数のペアとします。

    3. resultを空のバイトシーケンスとします。

    4. nを、n * 8がparamsによって 識別される楕円曲線の基点の位数の底2の対数より大きいような 最小の整数とします。

    5. rを 長さnのバイトシーケンスに変換し、それをresultに追加します。

    6. sを 長さnのバイトシーケンスに変換し、それをresultに追加します。

    それ以外の場合、key[[algorithm]]内部 スロットのnamedCurve属性が、 適用可能な仕様で指定される値である場合:

    その仕様で指定されるECDSA署名手順を 実行し、Mparams およびdを渡して、resultを生成します。

  7. resultを返します。

23.7.2 検証

  1. key[[type]] 内部スロットが"public"でない場合、InvalidAccessErrorthrowします。

  2. hashAlgorithmを、normalizedAlgorithmhash メンバーとします。

  3. Mを、hashAlgorithmによって指定されるdigest操作を messageを使用して実行した結果とします。

  4. Qを、keyに関連付けられたECDSA公開鍵とします。

  5. paramsを、 keyに関連付けられたECドメインパラメーターとします。

  6. key[[algorithm]]内部 スロットのnamedCurve属性が "P-256"、"P-384"または"P-521"である場合:

    [RFC6090] のセクション5.3で指定されるECDSA検証プロセスを実行します。 Mを受信したメッセージとして、signatureを受信した署名として使用し、 paramsをECドメインパラメーターとして使用し、 Qを公開鍵として使用します。

    それ以外の場合、key[[algorithm]]内部 スロットのnamedCurve属性が、 適用可能な仕様で指定される値である場合:

    その仕様で指定されるECDSA検証 手順を実行し、MsignatureparamsおよびQを渡して、主張された署名が有効かどうかの 指示を生成します。

  7. resultを、署名が有効であれば値true、 それ以外であれば値falseを持つbooleanとします。

  8. resultを返します。

23.7.3 鍵の生成

  1. usagesが"sign"または"verify"のいずれでもない値を 含む場合、 SyntaxErrorthrowします。

  2. normalizedAlgorithmnamedCurveメンバーが "P-256"、"P-384" または"P-521"である場合:

    [RFC6090] で定義されるように、楕円曲線鍵ペアを生成します。 normalizedAlgorithmnamedCurveメンバーによって 識別される曲線のドメインパラメーターを使用します。

    normalizedAlgorithmnamedCurveメンバーが 適用可能な仕様で指定される値である場合:

    その仕様で指定されるECDSA生成手順を 実行し、 normalizedAlgorithmを渡して、楕円曲線鍵ペアを生成します。

    それ以外の場合:

    NotSupportedErrorthrowします。

  3. 鍵生成操作の実行がエラーになる場合、 OperationErrorthrowします。

  4. algorithmを新しい EcKeyAlgorithm オブジェクトとします。

  5. algorithmname属性を "ECDSA"に設定します。

  6. algorithmnamedCurve 属性を、normalizedAlgorithmnamedCurveメンバーと等しく設定します。

  7. publicKeyを、生成された鍵ペアの公開鍵を表す新しいCryptoKey とします。

  8. publicKey[[type]] 内部スロットを"public"に設定します。

  9. publicKey[[algorithm]]内部 スロットをalgorithmに設定します。

  10. publicKey[[extractable]]内部 スロットをtrueに設定します。

  11. publicKey[[usages]]内部スロットを、 usages[ "verify" ]用途の共通部分に設定します。

  12. privateKeyを、生成された鍵ペアのprivate鍵を表す新しいCryptoKey とします。

  13. privateKey[[type]] 内部スロットを"private"に設定します。

  14. privateKey[[algorithm]]内部 スロットをalgorithmに設定します。

  15. privateKey[[extractable]]内部 スロットをextractableに設定します。

  16. privateKey[[usages]]内部スロットを、 usages[ "sign" ]用途の共通部分に設定します。

  17. resultを新しいCryptoKeyPair 辞書とします。

  18. resultpublicKey属性を publicKeyに設定します。

  19. resultprivateKey属性を privateKeyに設定します。

  20. resultを返します。

23.7.4 鍵のインポート

  1. keyDataを、インポートされる鍵データとします。

  2. formatが"spki"である場合:
    1. usagesが"verify"でない値を 含む場合、 SyntaxErrorthrowします。

    2. spkiを、keyDataに対して subjectPublicKeyInfoを 解析する アルゴリズムを実行した結果とします。

    3. 解析中にエラーが発生した場合、 DataErrorthrowします。

    4. spkialgorithm AlgorithmIdentifierフィールドの algorithmオブジェクト識別子フィールドが、 [RFC5480] で定義されるid-ecPublicKey オブジェクト識別子と等しくない場合、 DataErrorthrowします。

    5. spkialgorithm AlgorithmIdentifierフィールドのparametersフィールドが存在しない場合、 DataErrorthrowします。

    6. paramsを、spkialgorithm AlgorithmIdentifierフィールドのparametersフィールドとします。

    7. paramsが [RFC5480] で定義されるECParameters ASN.1型のインスタンスでなく、 namedCurveを指定していない場合、 DataErrorthrowします。

    8. namedCurveを、初期値が undefinedである文字列とします。

    9. paramsが、[RFC5480]で定義される secp256r1オブジェクト識別子と等価である場合:

      namedCurveを"P-256"に設定します。

      paramsが、[RFC5480]で定義される secp384r1オブジェクト識別子と等価である場合:

      namedCurveを"P-384"に設定します。

      paramsが、[RFC5480]で定義される secp521r1オブジェクト識別子と等価である場合:

      namedCurveを"P-521"に設定します。

    10. namedCurveがundefinedでない場合:
      1. publicKeyを、 [SEC1] のセクション2.3.4で定義される変換手順を、 spkisubjectPublicKey フィールドを使用して実行することによって識別される楕円曲線公開鍵とします。

        非圧縮点形式はMUST サポートされます。

      2. 実装が圧縮点形式をサポートせず、 圧縮点が提供された場合、 DataErrorthrowします。

      3. デコードエラーが発生するか、単位元が見つかった場合、 DataErrorthrowします。

      4. keyを、publicKeyを表す新しい CryptoKey とします。

      それ以外の場合:
      1. 他の 適用可能な 仕様によって定義される任意の鍵 インポート手順を実行し、formatspki を渡して、namedCurveおよびkeyを取得します。

      2. エラーが発生した場合、または 適用可能な 仕様が存在しない場合、 DataErrorthrowします。

    11. namedCurveが定義されており、かつnormalizedAlgorithmnamedCurve メンバーと等しくない場合、DataErrorthrowします。

    12. 公開鍵値が、normalizedAlgorithmnamedCurve メンバーによって識別される楕円曲線上の有効な点でない場合、DataErrorthrowします。

    13. key[[type]] 内部スロットを"public"に設定します。

    14. algorithmを新しいEcKeyAlgorithmとします。

    15. algorithmname属性を "ECDSA"に設定します。

    16. algorithmnamedCurve 属性をnamedCurveに設定します。

    17. key[[algorithm]] 内部スロットをalgorithmに設定します。

    formatが"pkcs8"である場合:
    1. usagesが"sign"でない値を 含む場合、 SyntaxErrorthrowします。

    2. privateKeyInfoを、keyDataに対して privateKeyInfoを 解析する アルゴリズムを実行した結果とします。

    3. 解析中にエラーが発生した場合、 DataErrorthrowします。

    4. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmフィールドの algorithmオブジェクト識別子フィールドが、 [RFC5480] で定義されるid-ecPublicKeyオブジェクト識別子と等しくない場合、 DataErrorthrowします。

    5. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifierフィールドの parametersフィールドが存在しない場合、 DataErrorthrowします。

    6. paramsを、privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifierフィールドの parametersフィールドとします。

    7. paramsが [RFC5480] で定義されるECParameters ASN.1型のインスタンスでなく、 namedCurveを指定していない場合、 DataErrorthrowします。

    8. namedCurveを、初期値が undefinedである文字列とします。

    9. paramsが、[RFC5480]で定義される secp256r1オブジェクト識別子と等価である場合:

      namedCurveを"P-256"に設定します。

      paramsが、[RFC5480]で定義される secp384r1オブジェクト識別子と等価である場合:

      namedCurveを"P-384"に設定します。

      paramsが、[RFC5480]で定義される secp521r1オブジェクト識別子と等価である場合:

      namedCurveを"P-521"に設定します。

    10. namedCurveがundefinedでない場合:
      1. ecPrivateKeyを、 ASN.1構造を 解析する アルゴリズムを実行した結果とします。dataprivateKeyInfoprivateKeyフィールドとして、 structureを[RFC5915]の セクション3で指定されるASN.1 ECPrivateKey構造として、 exactDataをtrueに設定します。

      2. 解析中にエラーが発生した場合、 DataErrorthrowします。

      3. ecPrivateKeyparametersフィールドが 存在し、かつ [RFC5480] で定義されるnamedCurve ASN.1 型のインスタンスでない場合、または privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifierフィールドの parametersフィールドと同じオブジェクト識別子を 含まない場合、 DataErrorthrowします。

      4. keyを、 [RFC5915] のセクション3で定義される変換手順を ecPrivateKeyを使用して実行することによって識別される楕円曲線private鍵を 表す新しいCryptoKey とします。

      それ以外の場合:
      1. 他の 適用可能な 仕様によって定義される任意の鍵 インポート手順を実行し、formatprivateKeyInfo を渡して、namedCurveおよびkeyを取得します。

      2. エラーが発生した場合、または 適用可能な 仕様が存在しない場合、 DataErrorthrowします。

    11. namedCurveが定義されており、かつnormalizedAlgorithmnamedCurve メンバーと等しくない場合、DataErrorthrowします。

    12. private鍵値が、normalizedAlgorithmnamedCurve メンバーによって識別される楕円曲線上の有効な点でない場合、DataErrorthrowします。

    13. key[[type]] 内部スロットを"private"に設定します。

    14. algorithmを新しいEcKeyAlgorithmとします。

    15. algorithmname属性を "ECDSA"に設定します。

    16. algorithmnamedCurve 属性をnamedCurveに設定します。

    17. key[[algorithm]] 内部スロットをalgorithmに設定します。

    formatが"jwk"である場合:
    1. keyDataJsonWebKey 辞書である場合:

      jwkkeyDataと等しくします。

      それ以外の場合:

      DataErrorthrowします。

    2. dフィールドが存在し、 usagesが "sign"でない値を含む場合、または、 dフィールドが存在せず、 usagesが "verify"でない値を含む場合、 SyntaxErrorthrowします。

    3. jwkktyフィールドが "EC"でない場合、 DataErrorthrowします。

    4. usagesが空でなく、かつjwkuseフィールドが 存在し、"sig"でない場合、 DataErrorthrowします。

    5. jwkkey_opsフィールドが 存在し、JSON Web Key [JWK]の要件に従って無効である場合、または 指定されたすべてのusages 値を含まない場合、 DataErrorthrowします。

    6. jwkextフィールドが 存在し、値がfalseであり、かつextractableがtrueである場合、 DataErrorthrowします。

    7. namedCurveを、jwkcrvフィールドと等しい値を持つ 文字列とします。

    8. namedCurvenormalizedAlgorithmnamedCurve メンバーと等しくない場合、DataErrorthrowします。

    9. namedCurveが"P-256"、 "P-384"または"P-521"と等しい場合:
      1. algNamedCurveを、初期値が undefinedである文字列とします。

      2. alg フィールドが存在しない場合:
        algNamedCurveをundefinedとします。
        alg フィールドが文字列"ES256"と等しい場合:
        algNamedCurveを文字列 "P-256"とします。
        alg フィールドが文字列"ES384"と等しい場合:
        algNamedCurveを文字列 "P-384"とします。
        alg フィールドが文字列"ES512"と等しい場合:
        algNamedCurveを文字列 "P-521"とします。
        それ以外の場合:
        DataErrorthrowします。
      3. algNamedCurveが定義されており、かつ namedCurveと等しくない場合、DataErrorthrowします。

      4. d フィールドが存在する場合:
        1. jwkがJSON Web Algorithms [JWA]の セクション6.2.2の要件を満たさない場合、 DataErrorthrowします。

        2. keyを、JSON Web Algorithms [JWA]のセクション6.2.2に 従ってjwkを解釈することによって識別される 楕円曲線private鍵を表す新しいCryptoKey オブジェクトとします。

        3. Key[[type]] 内部スロットを"private"に設定します。

        それ以外の場合:
        1. jwkがJSON Web Algorithms [JWA]の セクション6.2.1の要件を満たさない場合、 DataErrorthrowします。

        2. keyを、JSON Web Algorithms [JWA]のセクション6.2.1に 従ってjwkを解釈することによって識別される 楕円曲線公開鍵を表す新しいCryptoKey オブジェクトとします。

        3. Key[[type]] 内部スロットを "public"に設定します。

      それ以外の場合:
      1. 他の 適用可能な 仕様によって定義される任意の鍵 インポート手順を実行し、formatjwk を渡して、keyを取得します。

      2. エラーが発生した場合、または 適用可能な 仕様が存在しない場合、 DataErrorthrowします。

    10. 鍵値が、normalizedAlgorithmnamedCurve メンバーによって識別される楕円曲線上の有効な点でない場合、DataErrorthrowします。

    11. algorithmを新しいEcKeyAlgorithm オブジェクトのインスタンスとします。

    12. algorithmname属性を "ECDSA"に設定します。

    13. algorithmnamedCurve 属性をnamedCurveに設定します。

    14. key[[algorithm]] 内部スロットをalgorithmに設定します。

    formatが"raw"である場合:
    1. normalizedAlgorithmnamedCurve メンバーが 名前付き曲線でない場合、 DataErrorthrowします。

    2. usagesが"verify"でない値を 含む場合、 SyntaxErrorthrowします。

    3. namedCurveが"P-256"、 "P-384"または"P-521"である場合:
      1. Qを、normalizedAlgorithmnamedCurve メンバーによって識別される曲線上の楕円曲線点であって、 [SEC1] のセクション2.3.4で定義される変換手順をkeyDataに対して実行することによって識別されるものとします。

        非圧縮点形式はMUST サポートされます。

      2. 実装が圧縮点形式をサポートせず、 圧縮点が提供された場合、 DataErrorthrowします。

      3. デコードエラーが発生するか、単位元が見つかった場合、 DataErrorthrowします。

      4. keyを、Qを表す新しい CryptoKey とします。

      それ以外の場合:
      1. 他の 適用可能な 仕様によって定義される任意の鍵インポート 手順を実行し、formatkeyData を渡して、keyを取得します。

      2. エラーが発生した場合、または 適用可能な 仕様が存在しない場合、 DataErrorthrowします。

    4. algorithmを新しいEcKeyAlgorithm オブジェクトとします。

    5. algorithmname属性を "ECDSA"に設定します。

    6. algorithmnamedCurve 属性を、normalizedAlgorithmnamedCurve メンバーと等しく設定します。

    7. key[[type]] 内部スロットを"public"に設定します。

    8. key[[algorithm]] 内部スロットをalgorithmに設定します。

    それ以外の場合:

    NotSupportedErrorthrowします。

  3. keyを返します。

23.7.5 鍵のエクスポート

  1. keyを、エクスポートされるCryptoKeyとします。

  2. key[[handle]]内部スロットによって表される 基盤となる暗号鍵素材にアクセスできない場合、 OperationErrorthrowします。

  3. formatが"spki"である場合:
    1. key[[type]] 内部スロットが"public"でない場合、 InvalidAccessErrorthrowします。

    2. dataを、[RFC5280] で定義されるSubjectPublicKeyInfo ASN.1構造のインスタンスとし、次のプロパティを持つものとします:

      • algorithmフィールドを、次のプロパティを持つ AlgorithmIdentifier ASN.1型に設定します:

        • algorithmフィールドを、 [RFC5480] で定義されるOID id-ecPublicKeyに設定します。

        • parametersフィールドを、 [RFC5480] で定義されるECParameters ASN.1型のインスタンスに、次のように設定します:

          key[[algorithm]] 内部スロットのnamedCurve 属性が"P-256"、 "P-384"または"P-521"である場合:

          keyDataを、 key[[handle]] 内部スロットによって表される楕円曲線公開鍵を、 [RFC5480] のセクション2.2で指定されるエンコーディング規則に従い、 非圧縮形式を使用して表す バイト シーケンスとします。およびkeyData

          key[[algorithm]] 内部スロットのnamedCurve 属性が "P-256"である場合:

          parametersを、 [RFC5480] で定義されるオブジェクト識別子 secp256r1と等しい値を持つ namedCurve choiceに設定します。

          key[[algorithm]] 内部スロットのnamedCurve 属性が "P-384"である場合:

          parametersを、 [RFC5480] で定義されるオブジェクト識別子 secp384r1と等しい値を持つ namedCurve choiceに設定します。

          key[[algorithm]] 内部スロットのnamedCurve 属性が "P-521"である場合:

          parametersを、 [RFC5480] で定義されるオブジェクト識別子 secp521r1と等しい値を持つ namedCurve choiceに設定します。

          それ以外の場合:
          1. 他の 適用可能な 仕様によって定義される任意の鍵 エクスポート手順を実行し、 formatkey[[algorithm]] 内部スロットのnamedCurve 属性を渡して、namedCurveOidおよび keyDataを取得します。

          2. parametersを、 namedCurveOidというオブジェクト識別子と等しい値を持つ namedCurve choiceに設定します。

      • subjectPublicKeyフィールドをkeyDataに設定します。

    3. resultを、dataをDERエンコードした結果とします。

    formatが"pkcs8"である場合:
    1. key[[type]] 内部スロットが"private"でない場合、 InvalidAccessErrorthrowします。

    2. dataを、[RFC5208] で定義されるPrivateKeyInfo ASN.1構造のインスタンスとし、次のプロパティを持つものとします:

      • versionフィールドを0に設定します。

      • privateKeyAlgorithmフィールドを、次のプロパティを持つ PrivateKeyAlgorithmIdentifier ASN.1型に設定します:

        • algorithmフィールドを、 [RFC5480] で定義されるOID id-ecPublicKeyに設定します。

        • parametersフィールドを、 [RFC5480] で定義されるECParameters ASN.1型のインスタンスに、次のように設定します:

          key[[algorithm]] 内部スロットのnamedCurve 属性が"P-256"、 "P-384"または"P-521"である場合:

          keyDataを、key[[handle]] 内部スロットによって表される楕円曲線private鍵について、 [RFC5915] のセクション3で定義されるECPrivateKey 構造のインスタンスをDERエンコードした結果とし、 次に適合するものとします:

          • parametersフィールドは存在し、 このPrivateKeyInfo ASN.1構造の privateKeyAlgorithmフィールドの parametersフィールドと等価です。

          • publicKeyフィールドは存在し、 key[[handle]] 内部スロットによって表される楕円曲線private鍵に関連付けられた 楕円曲線公開鍵を表します。

          key[[algorithm]] 内部スロットのnamedCurve 属性が "P-256"である場合:

          parametersを、 [RFC5480] で定義されるオブジェクト識別子 secp256r1と等しい値を持つ namedCurve choiceに設定します。

          key[[algorithm]] 内部スロットのnamedCurve 属性が "P-384"である場合:

          parametersを、 [RFC5480] で定義されるオブジェクト識別子 secp384r1と等しい値を持つ namedCurve choiceに設定します。

          key[[algorithm]] 内部スロットのnamedCurve 属性が "P-521"である場合:

          parametersを、 [RFC5480] で定義されるオブジェクト識別子 secp521r1と等しい値を持つ namedCurve choiceに設定します。

          それ以外の場合:
          1. 他の 適用可能な 仕様によって定義される任意の鍵 エクスポート手順を実行し、 formatkey[[algorithm]] 内部スロットのnamedCurve 属性を渡して、namedCurveOidおよび keyDataを取得します。

          2. parametersを、 namedCurveOidというオブジェクト識別子と等しい値を持つ namedCurve choiceに設定します。

      • privateKeyフィールドをkeyDataに設定します。

    3. resultを、dataをDERエンコードした結果とします。

    formatが"jwk"である場合:
    1. jwkを新しいJsonWebKey 辞書とします。

    2. jwkkty属性を "EC"に設定します。

    3. key[[algorithm]] 内部スロットのnamedCurve 属性が"P-256"、"P-384"または "P-521"である場合:
      1. key[[algorithm]] 内部スロットのnamedCurve 属性が"P-256"である場合:
        jwkcrv 属性を"P-256"に設定します。
        key[[algorithm]] 内部スロットのnamedCurve 属性が"P-384"である場合:
        jwkcrv 属性を"P-384"に設定します。
        key[[algorithm]] 内部スロットのnamedCurve 属性が"P-521"である場合:
        jwkcrv 属性を"P-521"に設定します。
      2. jwkx 属性を、JSON Web Algorithms [JWA] のセクション6.2.1.2の定義に従って設定します。

      3. jwky 属性を、JSON Web Algorithms [JWA] のセクション6.2.1.3の定義に従って設定します。

      4. key[[type]] 内部スロットが"private"である場合

        jwkd 属性を、JSON Web Algorithms [JWA] のセクション6.2.2.1の定義に従って設定します。

      それ以外の場合:
      1. 他の 適用可能な 仕様によって定義される任意の鍵 エクスポート手順を実行し、formatkey[[algorithm]] 内部スロットのnamedCurve 属性を渡して、 namedCurveおよびjwkの新しい値を取得します。

      2. jwkcrv 属性を namedCurveに設定します。

    4. jwkkey_ops属性を、keyusages属性に設定します。

    5. jwkext属性を、key[[extractable]] 内部スロットに設定します。

    6. resultjwkとします。

    formatが"raw"である場合:
    1. key[[type]] 内部スロットが"public"でない場合、 InvalidAccessErrorthrowします。

    2. key[[algorithm]] 内部スロットのnamedCurve 属性が"P-256"、"P-384" または"P-521"である場合:

      dataを、key[[handle]] 内部スロットによって表される楕円曲線点Qを、 [SEC1] 2.3.3に従い非圧縮形式を使用して表す バイト シーケンスとします。

      それ以外の場合:

      他の適用可能な 仕様によって定義される任意の鍵エクスポート 手順を実行し、formatkey[[algorithm]] 内部スロットのnamedCurve 属性を渡して、 namedCurveおよびdataを取得します。

    3. resultdataとします。

    それ以外の場合:

    NotSupportedErrorthrowします。

  4. resultを返します。

24. ECDH

24.1 説明

このセクションは非規範的です。

これは、[RFC6090]で指定される、 鍵生成および鍵合意のためのElliptic Curve Diffie-Hellman (ECDH)の使用について説明します。

他の 仕様は、 ECDHで追加の楕円曲線を使用することを指定できます。 追加の楕円曲線を指定するには、仕様は 曲線名ECDH生成手順ECDH導出手順ECDH 鍵インポート手順および ECDH 鍵エクスポート手順を定義しなければなりません。

24.2 登録

このアルゴリズムの認識されるアルゴリズム名は "ECDH"です。

操作 パラメーター 結果
generateKey EcKeyGenParams CryptoKeyPair
deriveBits EcdhKeyDeriveParams バイト シーケンス
importKey EcKeyImportParams CryptoKey
exportKey なし object

24.3 EcdhKeyDeriveParams辞書

WebIDLdictionary EcdhKeyDeriveParams : Algorithm {
  required CryptoKey public;
};

publicメンバーは、ピアのEC公開鍵を表します。

24.4 操作

24.4.1 鍵の生成

  1. usagesが"deriveKey"または"deriveBits"でないエントリを 含む場合、throw a SyntaxErrorします。

  2. normalizedAlgorithmnamedCurveメンバーが "P-256"、"P-384" または"P-521"である場合:

    [RFC6090] で定義されるように、楕円曲線鍵ペアを生成します。 normalizedAlgorithmnamedCurveメンバーによって 識別される曲線のドメインパラメーターを使用します。

    normalizedAlgorithmnamedCurveメンバーが、 ECDHでその値を使用することを指定する 適用可能な仕様で 指定される値である場合:

    その仕様で指定されるECDH生成手順を 実行し、normalizedAlgorithmを渡して、楕円曲線鍵ペアを生成します。

    それ以外の場合:

    throw a NotSupportedErrorします。

  3. 操作の実行がエラーになる場合、 throw a OperationErrorします。

  4. algorithmを新しい EcKeyAlgorithm オブジェクトとします。

  5. algorithmnameメンバーを "ECDH"に設定します。

  6. algorithmnamedCurve 属性を、normalizedAlgorithmnamedCurveメンバーと等しく設定します。

  7. publicKeyを、生成された鍵ペアの公開鍵を表す新しいCryptoKey とします。

  8. publicKey[[type]] 内部スロットを"public"に設定します。

  9. publicKey[[algorithm]]内部 スロットをalgorithmに設定します。

  10. publicKey[[extractable]]内部 スロットをtrueに設定します。

  11. publicKey[[usages]]内部スロットを 空リストに設定します。

  12. privateKeyを、生成された鍵ペアのprivate鍵を表す新しいCryptoKey とします。

  13. privateKey[[type]] 内部スロットを"private"に設定します。

  14. privateKey[[algorithm]]内部 スロットをalgorithmに設定します。

  15. privateKey[[extractable]]内部 スロットをextractableに設定します。

  16. privateKey[[usages]]内部スロットを、 usages[ "deriveKey", "deriveBits" ]用途の共通部分に設定します。

  17. resultを新しいCryptoKeyPair 辞書とします。

  18. resultpublicKey属性を publicKeyに設定します。

  19. resultprivateKey属性を privateKeyに設定します。

  20. resultを返します。

24.4.2 ビットの導出

  1. key[[type]] 内部スロットが"private"でない場合、 InvalidAccessErrorthrowします。

  2. publicKeyを、 normalizedAlgorithmpublicメンバーとします。

  3. publicKey[[type]] 内部スロットが"public"でない場合、 InvalidAccessErrorthrowします。

  4. publicKey[[algorithm]]内部 スロットのname属性が、 key[[algorithm]]内部 スロットのnameプロパティと 等しくない場合、InvalidAccessErrorthrowします。

  5. publicKey[[algorithm]]内部 スロットのnamedCurve属性が、 key[[algorithm]]内部 スロットのnamedCurveプロパティと 等しくない場合、InvalidAccessErrorthrowします。

  6. key[[algorithm]]内部 スロットのnamedCurveプロパティが "P-256"、"P-384" または"P-521"である場合:
    1. [RFC6090] セクション4で指定されるECDHプリミティブを実行します。 keyをEC private鍵dとして使用し、 publicKey[[handle]] 内部スロットによって表されるEC公開鍵をEC公開鍵として使用します。

    2. secretを、 [RFC6090] のセクション6.2で定義される体要素から オクテット文字列への変換をECDHプリミティブの出力に適用した結果を含む バイトシーケンス とします。

    key[[algorithm]]内部 スロットのnamedCurveプロパティが、 ECDHでその値を使用することを指定する 適用可能な仕様で 指定される値である場合:

    その仕様で指定されるECDH導出手順を 実行し、keyおよびpublicKeyを渡して、 secretを生成します。

    それ以外の場合:

    throw a NotSupportedErrorします。

  7. 操作の実行がエラーになる場合、 throw a OperationErrorします。

  8. lengthがnullである場合:
    secretを返します。
    それ以外の場合:
    secretビット単位の長さlength未満である場合:
    OperationErrorthrowします。
    それ以外の場合:
    secretの最初のlengthビットを 含むバイトシーケンスを 返します。

24.4.3 鍵のインポート

  1. keyDataを、インポートされる鍵データとします。

  2. formatが"spki"である場合:
    1. usagesが空でない場合、 SyntaxErrorthrowします。

    2. spkiを、keyDataに対して subjectPublicKeyInfoを 解析する アルゴリズムを実行した結果とします。

    3. 解析中にエラーが発生した場合、 DataErrorthrowします。

    4. spkialgorithm AlgorithmIdentifierフィールドの algorithmオブジェクト識別子フィールドが、 [RFC5480] で定義されるid-ecPublicKey オブジェクト識別子と等しくない場合、 DataErrorthrowします。

    5. spkialgorithm AlgorithmIdentifierフィールドのparametersフィールドが存在しない場合、 DataErrorthrowします。

    6. paramsを、spkialgorithm AlgorithmIdentifierフィールドのparametersフィールドとします。

    7. paramsが [RFC5480] で定義されるECParameters ASN.1型のインスタンスでなく、 namedCurveを指定していない場合、DataErrorthrowします。

    8. namedCurveを、初期値が undefinedである文字列とします。

    9. paramsが、[RFC5480]で定義される secp256r1オブジェクト識別子と等価である場合:

      namedCurveを"P-256"に設定します。

      paramsが、[RFC5480]で定義される secp384r1オブジェクト識別子と等価である場合:

      namedCurveを"P-384"に設定します。

      paramsが、[RFC5480]で定義される secp521r1オブジェクト識別子と等価である場合:

      namedCurveを"P-521"に設定します。

    10. namedCurveがundefinedでない場合:
      1. publicKeyを、 [SEC1] のセクション2.3.4で定義される変換手順を、 spkisubjectPublicKeyフィールドに対して 実行することによって識別される楕円曲線公開鍵とします。

        非圧縮点形式はMUST サポートされます。

      2. 実装が圧縮点形式をサポートせず、 圧縮点が提供された場合、 DataErrorthrowします。

      3. デコードエラーが発生するか、単位元が見つかった場合、 DataErrorthrowします。

      4. keyを、publicKeyを表す新しい CryptoKey とします。

      それ以外の場合:
      1. 他の 適用可能な 仕様によって定義される任意の鍵インポート 手順を実行し、formatspki を渡して、namedCurveおよびkeyを取得します。

      2. エラーが発生した場合、または 適用可能な 仕様が存在しない場合、 DataErrorthrowします。

    11. namedCurveが定義されており、かつnormalizedAlgorithmnamedCurve メンバーと等しくない場合、DataErrorthrowします。

    12. 鍵値が、normalizedAlgorithmnamedCurve メンバーによって識別される楕円曲線上の有効な点でない場合、 DataErrorthrowします。

    13. key[[type]] 内部スロットを"public"に設定します。

    14. algorithmを新しいEcKeyAlgorithmとします。

    15. algorithmname属性を "ECDH"に設定します。

    16. algorithmnamedCurve 属性をnamedCurveに設定します。

    17. key[[algorithm]] 内部スロットをalgorithmに設定します。

    formatが"pkcs8"である場合:
    1. usagesが"deriveKey"または"deriveBits"でない エントリを含む場合、 SyntaxErrorthrowします。

    2. privateKeyInfoを、keyDataに対して privateKeyInfoを 解析する アルゴリズムを実行した結果とします。

    3. 解析中にエラーが発生した場合、 DataErrorthrowします。

    4. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmフィールドの algorithmオブジェクト識別子フィールドが、 [RFC5480] で定義されるid-ecPublicKeyオブジェクト識別子と 等しくない場合、 DataErrorthrowします。

    5. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifierフィールドの parametersフィールドが存在しない場合、 DataErrorthrowします。

    6. paramsを、privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifierフィールドの parametersフィールドとします。

    7. paramsが [RFC5480] で定義されるECParameters ASN.1型のインスタンスでなく、 namedCurveを指定していない場合、DataErrorthrowします。

    8. namedCurveを、初期値が undefinedである文字列とします。

    9. paramsが、[RFC5480]で定義される secp256r1オブジェクト識別子と等価である場合:

      namedCurveを"P-256"に設定します。

      paramsが、[RFC5480]で定義される secp384r1オブジェクト識別子と等価である場合:

      namedCurveを"P-384"に設定します。

      paramsが、[RFC5480]で定義される secp521r1オブジェクト識別子と等価である場合:

      namedCurveを"P-521"に設定します。

    10. namedCurveがundefinedでない場合:
      1. ecPrivateKeyを、 ASN.1構造を 解析する アルゴリズムを実行した結果とします。dataprivateKeyInfoprivateKeyフィールドとして、 structureを[RFC5915]の セクション3で指定されるASN.1 ECPrivateKey構造として、 exactDataをtrueに設定します。

      2. 解析中にエラーが発生した場合、 DataErrorthrowします。

      3. ecPrivateKeyparametersフィールドが 存在し、かつ [RFC5480] で定義されるnamedCurve ASN.1 型のインスタンスでない場合、または privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifierフィールドの parametersフィールドと同じオブジェクト識別子を 含まない場合、 DataErrorthrowします。

      4. keyを、 [RFC5915] のセクション3で定義される変換手順を ecPrivateKeyを使用して実行することによって識別される 楕円曲線private鍵を表す新しいCryptoKey とします。

      それ以外の場合:
      1. 他の 適用可能な 仕様によって定義される任意の鍵インポート 手順を実行し、formatprivateKeyInfo を渡して、namedCurveおよびkeyを取得します。

      2. エラーが発生した場合、または 適用可能な 仕様が存在しない場合、 DataErrorthrowします。

    11. namedCurveが定義されており、かつnormalizedAlgorithmnamedCurve メンバーと等しくない場合、DataErrorthrowします。

    12. 鍵値が、normalizedAlgorithmnamedCurve メンバーによって識別される楕円曲線上の有効な点でない場合、 DataErrorthrowします。

    13. key[[type]] 内部スロットを"private"に設定します。

    14. algorithmを新しいEcKeyAlgorithmとします。

    15. algorithmname属性を "ECDH"に設定します。

    16. algorithmnamedCurve 属性をnamedCurveに設定します。

    17. key[[algorithm]] 内部スロットをalgorithmに設定します。

    formatが"jwk"である場合:
    1. keyDataJsonWebKey 辞書である場合:

      jwkkeyDataと等しくします。

      それ以外の場合:

      DataErrorThrowします。

    2. dフィールドが存在し、 usagesが"deriveKey"または "deriveBits"でないエントリを含む場合、 SyntaxErrorthrowします。

    3. dフィールドが存在せず、 usagesが空でない場合、 SyntaxErrorthrowします。

    4. jwkktyフィールドが "EC"でない場合、 DataErrorthrowします。

    5. usagesが空でなく、かつjwkuseフィールドが 存在し、"enc"と等しくない場合、 DataErrorthrowします。

    6. jwkkey_opsフィールドが 存在し、JSON Web Key [JWK]の要件に従って無効である場合、または 指定されたすべてのusages 値を含まない場合、DataErrorthrowします。

    7. jwkextフィールドが 存在し、値がfalseであり、かつextractableがtrueである場合、 DataErrorthrowします。

    8. namedCurveを、jwkcrvフィールドと等しい値を持つ 文字列とします。

    9. namedCurvenormalizedAlgorithmnamedCurve メンバーと等しくない場合、DataErrorthrowします。

    10. namedCurveが"P-256"、 "P-384"または"P-521"である場合:
      dフィールドが 存在する場合:
      1. jwkがJSON Web Algorithms [JWA]の セクション6.2.2の要件を満たさない場合、 DataErrorthrowします。

      2. keyを、JSON Web Algorithms [JWA]の セクション6.2.2に従ってjwkを解釈することによって識別される 楕円曲線private鍵を表す新しいCryptoKey オブジェクトとします。

      3. Key[[type]] 内部スロットを"private"に設定します。

      それ以外の場合:
      1. jwkがJSON Web Algorithms [JWA]の セクション6.2.1の要件を満たさない場合、 DataErrorthrowします。

      2. keyを、JSON Web Algorithms [JWA]の セクション6.2.1に従ってjwkを解釈することによって識別される 楕円曲線公開鍵を表す新しいCryptoKey オブジェクトとします。

      3. Key[[type]] 内部スロットを "public"に設定します。

      それ以外の場合
      1. 他の 適用可能な 仕様によって定義される任意の鍵インポート 手順を実行し、formatjwk を渡して、keyを取得します。

      2. エラーが発生した場合、または 適用可能な 仕様が存在しない場合、 DataErrorthrowします。

    11. 鍵値が、normalizedAlgorithmnamedCurve メンバーによって識別される楕円曲線上の有効な点でない場合、 DataErrorthrowします。

    12. algorithmを新しいEcKeyAlgorithm オブジェクトのインスタンスとします。

    13. algorithmname属性を "ECDH"に設定します。

    14. algorithmnamedCurve 属性をnamedCurveに設定します。

    15. key[[algorithm]] 内部スロットをalgorithmに設定します。

    formatが"raw"である場合:
    1. normalizedAlgorithmnamedCurve メンバーが 名前付き曲線でない場合、 DataErrorthrowします。

    2. usagesが空リストでない場合、 SyntaxErrorthrowします。

    3. namedCurveが"P-256"、 "P-384"または"P-521"である場合:
      1. Qを、normalizedAlgorithmnamedCurve メンバーによって識別される曲線上の楕円曲線公開鍵であって、 [SEC1] のセクション2.3.4で定義される変換手順を keyDataに対して実行することによって識別されるものとします。

        非圧縮点形式はMUST サポートされます。

      2. 実装が圧縮点形式をサポートせず、 圧縮点が提供された場合、 DataErrorthrowします。

      3. デコードエラーが発生するか、単位元が見つかった場合、 DataErrorthrowします。

      4. keyを、Qを表す新しい CryptoKey とします。

      それ以外の場合:
      1. 他の 適用可能な 仕様によって定義される任意の鍵インポート 手順を実行し、formatkeyData を渡して、keyを取得します。

      2. エラーが発生した場合、または 適用可能な 仕様が存在しない場合、 DataErrorthrowします。

    4. algorithmを新しいEcKeyAlgorithm オブジェクトとします。

    5. algorithmname属性を "ECDH"に設定します。

    6. algorithmnamedCurve 属性を、normalizedAlgorithmnamedCurve メンバーと等しく設定します。

    7. key[[type]] 内部スロットを"public"に設定します。

    8. key[[algorithm]] 内部スロットをalgorithmに設定します。

  3. keyを返します。

24.4.4 鍵のエクスポート

  1. keyを、エクスポートされるCryptoKeyとします。

  2. key[[handle]]内部スロットによって表される 基盤となる暗号鍵素材にアクセスできない場合、OperationErrorthrowします。

  3. formatが"spki"である場合:
    1. key[[type]] 内部スロットが"public"でない場合、InvalidAccessErrorthrowします。

    2. dataを、[RFC5280] で定義されるSubjectPublicKeyInfo ASN.1構造のインスタンスとし、次のプロパティを持つものとします:

      • algorithmフィールドを、次のプロパティを持つ AlgorithmIdentifier ASN.1型に設定します:

        • algorithmフィールドを、 [RFC5480] で定義されるOID id-ecPublicKeyに設定します。

        • parametersフィールドを、 [RFC5480] で定義されるECParameters ASN.1型のインスタンスに、次のように設定します:

          key[[algorithm]] 内部スロットのnamedCurve 属性が"P-256"、 "P-384"または"P-521"である場合:

          keyDataを、key[[handle]] 内部スロットによって表される楕円曲線公開鍵を、 [SEC1] のセクション2.3.3で指定されるエンコーディング規則に従い、非圧縮形式を使用して表す バイト シーケンスとします。

          key[[algorithm]] 内部スロットのnamedCurve 属性が "P-256"である場合:

          parametersを、 [RFC5480] で定義されるオブジェクト識別子 secp256r1と等しい値を持つ namedCurve choiceに設定します。

          key[[algorithm]] 内部スロットのnamedCurve 属性が "P-384"である場合:

          parametersを、 [RFC5480] で定義されるオブジェクト識別子 secp384r1と等しい値を持つ namedCurve choiceに設定します。

          key[[algorithm]] 内部スロットのnamedCurve 属性が "P-521"である場合:

          parametersを、 [RFC5480] で定義されるオブジェクト識別子 secp521r1と等しい値を持つ namedCurve choiceに設定します。

          それ以外の場合:
          1. 他の 適用可能な 仕様によって定義される任意の鍵 エクスポート手順を実行し、 formatkey[[algorithm]] 内部スロットのnamedCurve 属性を渡して、namedCurveOidおよび keyDataを取得します。

          2. parametersを、 namedCurveOidというオブジェクト識別子と等しい値を持つ namedCurve choiceに設定します。

      • subjectPublicKeyフィールドをkeyDataに設定します。

    formatが"pkcs8"である場合:
    1. key[[type]] 内部スロットが"private"でない場合、InvalidAccessErrorthrowします。

    2. dataを、[RFC5208] で定義されるPrivateKeyInfo ASN.1構造のインスタンスとし、次のプロパティを持つものとします:

      • versionフィールドを0に設定します。

      • privateKeyAlgorithmフィールドを、次のプロパティを持つ PrivateKeyAlgorithmIdentifier ASN.1型に設定します:

        • algorithmフィールドを、 [RFC5480] で定義されるOID id-ecPublicKeyに設定します。

        • parametersフィールドを、 [RFC5480] で定義されるECParameters ASN.1型のインスタンスに、次のように設定します:

          key[[algorithm]] 内部スロットのnamedCurve 属性が"P-256"、 "P-384"または"P-521"である場合:

          keyDataを、key[[handle]] 内部スロットによって表される楕円曲線private鍵について、 [RFC5915] のセクション3で定義されるECPrivateKey 構造のインスタンスをDERエンコードした結果とし、 次に適合するものとします:

          • parametersフィールドは存在し、 このPrivateKeyInfo ASN.1構造の privateKeyAlgorithmフィールドの parametersフィールドと等価です。

          • publicKeyフィールドは存在し、 key[[handle]] 内部スロットによって表される楕円曲線private鍵に関連付けられた 楕円曲線公開鍵を表します。

          key[[algorithm]] 内部スロットのnamedCurve 属性が "P-256"である場合:

          parametersを、 [RFC5480] で定義されるオブジェクト識別子 secp256r1と等しい値を持つ namedCurve choiceに設定します。

          key[[algorithm]] 内部スロットのnamedCurve 属性が "P-384"である場合:

          parametersを、 [RFC5480] で定義されるオブジェクト識別子 secp384r1と等しい値を持つ namedCurve choiceに設定します。

          key[[algorithm]] 内部スロットのnamedCurve 属性が "P-521"である場合:

          parametersを、 [RFC5480] で定義されるオブジェクト識別子 secp521r1と等しい値を持つ namedCurve choiceに設定します。

          それ以外の場合:
          1. 他の 適用可能な 仕様によって定義される任意の鍵 エクスポート手順を実行し、 formatkey[[algorithm]] 内部スロットのnamedCurve 属性を渡して、namedCurveOidおよび keyDataを取得します。

          2. parametersを、 namedCurveOidというオブジェクト識別子と等しい値を持つ namedCurve choiceに設定します。

      • privateKeyフィールドをkeyDataに設定します。

    formatが"jwk"である場合:
    1. jwkを新しいJsonWebKey 辞書とします。

    2. jwkkty属性を "EC"に設定します。

    3. key[[algorithm]] 内部スロットのnamedCurve 属性が"P-256"、"P-384" または"P-521"である場合:
      1. key[[algorithm]] 内部スロットのnamedCurve 属性が"P-256"である場合:
        jwkcrv 属性を "P-256"に設定します。
        key[[algorithm]] 内部スロットのnamedCurve 属性が"P-384"である場合:
        jwkcrv 属性を "P-384"に設定します。
        key[[algorithm]] 内部スロットのnamedCurve 属性が"P-521"である場合:
        jwkcrv 属性を "P-521"に設定します。
      2. jwkx 属性を、JSON Web Algorithms [JWA] のセクション6.2.1.2の定義に従って設定します。

      3. jwky 属性を、JSON Web Algorithms [JWA] のセクション6.2.1.3の定義に従って設定します。

      4. key[[type]] 内部スロットが"private"である場合

        jwkd 属性を、JSON Web Algorithms [JWA] のセクション6.2.2.1の定義に従って設定します。

      それ以外の場合:
      1. 他の 適用可能な 仕様によって定義される任意の鍵エクスポート 手順を実行し、formatkey[[algorithm]] 内部スロットのnamedCurve 属性を渡して、 namedCurveおよびjwkの新しい値を取得します。

      2. jwkcrv 属性を namedCurveに設定します。

    4. jwkkey_ops属性を、keyusages属性に設定します。

    5. jwkext属性を、key[[extractable]] 内部スロットに設定します。

    6. resultjwkとします。

    formatが"raw"である場合:
    1. key[[type]] 内部スロットが"public"でない場合、InvalidAccessErrorthrowします。

    2. key[[algorithm]] 内部スロットのnamedCurve 属性が"P-256"、"P-384" または"P-521"である場合:

      dataを、key[[handle]] 内部スロットによって表される楕円曲線公開鍵を、 [SEC1] のセクション2.3.3で指定されるエンコーディング規則に従い、非圧縮形式を使用して表す バイト シーケンスとします。

      それ以外の場合:

      他の適用可能な 仕様によって定義される任意の鍵エクスポート 手順を実行し、formatkey[[algorithm]] 内部スロットのnamedCurve 属性を渡して、 namedCurveおよびdataを取得します。

    3. resultdataとします。

  4. resultを返します。

25. Ed25519

25.1 説明

このセクションは非規範的です。

"Ed25519"アルゴリズム識別子は、[RFC8032]で指定される Ed25519アルゴリズムを使用して、署名および検証を実行するために使用されます。

25.2 登録

このアルゴリズムの認識されるアルゴリズム名は "Ed25519"です。

操作 パラメーター 結果
sign なし バイト シーケンス
verify なし boolean
generateKey なし CryptoKeyPair
importKey なし CryptoKey
exportKey なし object

25.3 操作

25.3.1 署名

  1. key[[type]] 内部スロットが"private"でない場合、 InvalidAccessErrorthrowします。

  2. resultを、[RFC8032] のセクション5.1.6で指定されるEd25519署名プロセスを実行した結果とします。 messageMとして、keyに関連付けられた Ed25519 private鍵を使用します。

    課題 1

    一部の実装は、[RFC8032]に従う 決定論的署名ではなく、draft-irtf-cfrg-det-sigs-with-noise に従ってランダム化署名を生成する場合があります(または生成したい場合があります)。

    WICG/webcrypto-secure-curves issue 28を参照してください。

  3. resultを返します。

25.3.2 検証

  1. key[[type]] 内部スロットが"public"でない場合、InvalidAccessErrorthrowします。

  2. keyの鍵データがEd25519の楕円曲線上の無効な点または小位数要素を表す場合、 falseを返します。

    課題 2

    すべての実装がこのチェックを実行するわけではありません。

    WICG/webcrypto-secure-curves issue 27を参照してください。

  3. signatureの前半にエンコードされた点Rが、Ed25519の楕円曲線上の 無効な点または小位数要素を表す場合、falseを返します。

    課題 3

    すべての実装がこのチェックを実行するわけではありません。

    WICG/webcrypto-secure-curves issue 27を参照してください。

  4. [RFC8032] のセクション5.1.7で指定されるEd25519検証手順を実行します。 余因子なし(バッチ化なし)の等式 [S]B = R + [k]A'を使用し、signatureに対して、messageMとして、 keyに関連付けられたEd25519公開鍵を使用します。

  5. resultを、署名が有効であれば値true、 それ以外であれば値falseを持つbooleanとします。

  6. resultを返します。

25.3.3 鍵の生成

  1. usagesが"sign"または"verify"のいずれでもない値を 含む場合、 SyntaxErrorthrowします。

  2. [RFC8032]の セクション5.1.5で定義されるように、Ed25519鍵ペアを生成します。

  3. algorithmを新しいKeyAlgorithmオブジェクトとします。

  4. algorithmname属性を "Ed25519"に設定します。

  5. publicKeyを、生成された鍵ペアの公開鍵を表す新しいCryptoKey とします。

  6. publicKey[[type]] 内部スロットを"public"に設定します。

  7. publicKey[[algorithm]]内部 スロットをalgorithmに設定します。

  8. publicKey[[extractable]]内部 スロットをtrueに設定します。

  9. publicKey[[usages]]内部スロットを、 usages[ "verify" ]用途の共通部分に設定します。

  10. privateKeyを、生成された鍵ペアのprivate鍵を表す新しいCryptoKey とします。

  11. privateKey[[type]] 内部スロットを"private"に設定します。

  12. privateKey[[algorithm]]内部 スロットをalgorithmに設定します。

  13. privateKey[[extractable]]内部 スロットをextractableに設定します。

  14. privateKey[[usages]]内部スロットを、 usages[ "sign" ]用途の共通部分に設定します。

  15. resultを新しいCryptoKeyPair 辞書とします。

  16. resultpublicKey属性を publicKeyに設定します。

  17. resultprivateKey属性を privateKeyに設定します。

  18. resultを返します。

25.3.4 鍵のインポート

  1. keyDataを、インポートされる鍵データとします。

  2. formatが"spki"である場合:
    1. usagesが"verify"でない値を含む場合、 SyntaxErrorthrowします。

    2. spkiを、keyDataに対して subjectPublicKeyInfoを 解析する アルゴリズムを実行した結果とします。

    3. 解析中にエラーが発生した場合、 DataErrorthrowします。

    4. spkialgorithm AlgorithmIdentifierフィールドの algorithmオブジェクト識別子フィールドが、 [RFC8410] で定義されるid-Ed25519 オブジェクト識別子と等しくない場合、 DataErrorthrowします。

    5. spkialgorithm AlgorithmIdentifierフィールドのparametersフィールドが存在する場合、 DataErrorthrowします。

    6. publicKeyを、spkisubjectPublicKeyフィールドによって 識別されるEd25519公開鍵とします。

    7. keyを、publicKeyを表す新しいCryptoKey とします。

    8. key[[type]] 内部スロットを"public"に設定します。

    9. algorithmを新しいKeyAlgorithmとします。

    10. algorithmname属性を "Ed25519"に設定します。

    11. key[[algorithm]] 内部スロットをalgorithmに設定します。

    formatが"pkcs8"である場合:
    1. usagesが"sign"でない値を含む場合、 SyntaxErrorthrowします。

    2. privateKeyInfoを、keyDataに対して privateKeyInfoを 解析する アルゴリズムを実行した結果とします。

    3. 解析中にエラーが発生した場合、 DataErrorthrowします。

    4. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmフィールドの algorithmオブジェクト識別子フィールドが、 [RFC8410] で定義されるid-Ed25519オブジェクト識別子と等しくない場合、 DataErrorthrowします。

    5. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifierフィールドの parametersフィールドが存在する場合、 DataErrorthrowします。

    6. curvePrivateKeyを、 ASN.1構造を解析する アルゴリズムを実行した結果とします。dataprivateKeyInfoprivateKeyフィールドとして、 structureを[RFC8410]の セクション7で指定されるASN.1 CurvePrivateKey構造として、 exactDataをtrueに設定します。

    7. 解析中にエラーが発生した場合、 DataErrorthrowします。

    8. keyを、 curvePrivateKeyによって識別されるEd25519 private鍵を表す新しい CryptoKey とします。

    9. key[[type]] 内部スロットを"private"に設定します。

    10. algorithmを新しいKeyAlgorithmとします。

    11. algorithmname属性を "Ed25519"に設定します。

    12. key[[algorithm]] 内部スロットをalgorithmに設定します。

    formatが"jwk"である場合:
    1. keyDataJsonWebKey 辞書である場合:

      jwkkeyDataと等しくします。

      それ以外の場合:

      DataErrorThrowします。

    2. dフィールドが存在し、 usagesが"sign"でない値を含む場合、または、 dフィールドが存在せず、 usagesが"verify"でない値を含む場合、 SyntaxErrorthrowします。

    3. jwkktyフィールドが "OKP"でない場合、 DataErrorthrowします。

    4. jwkcrvフィールドが "Ed25519"でない場合、 DataErrorthrowします。

    5. jwkalgフィールドが存在し、 "Ed25519"または"EdDSA"でない場合、 DataErrorthrowします。

    6. usagesが空でなく、かつjwkuseフィールドが存在し、 "sig"でない場合、 DataErrorthrowします。

    7. jwkkey_opsフィールドが 存在し、JSON Web Key [JWK]の要件に従って無効である場合、または 指定されたすべてのusages 値を含まない場合、 DataErrorthrowします。

    8. jwkextフィールドが存在し、 値がfalseであり、かつextractableがtrueである場合、 DataErrorthrowします。

    9. dフィールドが 存在する場合:
      1. jwkが[RFC8037]の セクション2で説明されるJWK private鍵形式の要件を満たさない場合、 DataErrorthrowします。

      2. keyを、[RFC8037]の セクション2に従ってjwkを解釈することによって識別される Ed25519 private鍵を表す新しいCryptoKey オブジェクトとします。

      3. Key[[type]] 内部スロットを"private"に設定します。

      それ以外の場合:
      1. jwkが[RFC8037]の セクション2で説明されるJWK公開鍵形式の要件を満たさない場合、 DataErrorthrowします。

      2. keyを、[RFC8037]の セクション2に従ってjwkを解釈することによって識別される Ed25519公開鍵を表す新しいCryptoKey オブジェクトとします。

      3. Key[[type]] 内部スロットを"public"に設定します。

    10. algorithmを新しいKeyAlgorithm オブジェクトのインスタンスとします。

    11. algorithmname属性を "Ed25519"に設定します。

    12. key[[algorithm]] 内部スロットをalgorithmに設定します。

    formatが"raw"である場合:
    1. usagesが"verify"でない値を含む場合、 SyntaxErrorthrowします。

    2. algorithmを新しいKeyAlgorithmオブジェクトとします。

    3. algorithmname属性を "Ed25519"に設定します。

    4. keyを、keyDataで提供される鍵データを表す新しいCryptoKey とします。

    5. key[[type]] 内部スロットを"public"に設定します。

    6. key[[algorithm]] 内部スロットをalgorithmに設定します。

    それ以外の場合:

    NotSupportedErrorthrowします。

  3. keyを返します。

25.3.5 鍵のエクスポート

  1. keyを、エクスポートされるCryptoKeyとします。

  2. key[[handle]]内部スロットによって表される 基盤となる暗号鍵素材にアクセスできない場合、 OperationErrorthrowします。

  3. formatが"spki"である場合:
    1. key[[type]] 内部スロットが"public"でない場合、InvalidAccessErrorthrowします。

    2. dataを、[RFC5280] で定義されるSubjectPublicKeyInfo ASN.1構造のインスタンスとし、次のプロパティを持つものとします:

      • algorithmフィールドを、次のプロパティを持つ AlgorithmIdentifier ASN.1型に設定します:

        • algorithmオブジェクト識別子を、 [RFC8410] で定義されるid-Ed25519 OIDに設定します。

      • subjectPublicKeyフィールドをkeyDataに設定します。

    3. resultを、dataをDERエンコードした結果とします。

    formatが"pkcs8"である場合:
    1. key[[type]] 内部スロットが"private"でない場合、InvalidAccessErrorthrowします。

    2. dataを、[RFC5208] で定義されるPrivateKeyInfo ASN.1構造のインスタンスとし、次のプロパティを持つものとします:

      • versionフィールドを0に設定します。

      • privateKeyAlgorithmフィールドを、次のプロパティを持つ PrivateKeyAlgorithmIdentifier ASN.1型に設定します:

        • algorithmオブジェクト識別子を、 [RFC8410] で定義されるid-Ed25519 OIDに設定します。

      • privateKeyフィールドを、[RFC8410]の セクション7で定義されるCurvePrivateKey ASN.1型を DERエンコードした結果に設定します。これは、key[[handle]] 内部スロットによって表されるEd25519 private鍵を表します。

    3. resultを、dataをDERエンコードした結果とします。

    formatが"jwk"である場合:
    1. jwkを新しいJsonWebKey 辞書とします。

    2. jwkkty属性を "OKP"に設定します。

    3. jwkalg属性を "Ed25519"に設定します。

    4. jwkcrv属性を "Ed25519"に設定します。

    5. jwkx属性を、 [RFC8037]の セクション2の定義に従って設定します。

    6. key[[type]] 内部スロットが"private"である場合
      jwkd属性を、 [RFC8037]の セクション2の定義に従って設定します。
    7. jwkkey_ops属性を、keyusages属性に設定します。

    8. jwkext属性を、key[[extractable]] 内部スロットに設定します。

    9. resultjwkとします。

    formatが"raw"である場合:
    1. key[[type]] 内部スロットが"public"でない場合、InvalidAccessErrorthrowします。

    2. dataを、key[[handle]] 内部スロットによって表されるEd25519公開鍵を表す バイトシーケンス とします。

    3. resultdataとします。

    それ以外の場合:

    NotSupportedErrorthrowします。

  4. resultを返します。

26. X25519

26.1 説明

このセクションは非規範的です。

"X25519"アルゴリズム識別子は、 [RFC7748]で指定されるX25519アルゴリズムを使用して、 鍵合意を実行するために使用されます。

26.2 登録

このアルゴリズムの認識されるアルゴリズム名は "X25519"です。

操作 パラメーター 結果
deriveBits EcdhKeyDeriveParams バイト シーケンス
generateKey なし CryptoKeyPair
importKey なし CryptoKey
exportKey なし object

26.3 操作

26.3.1 ビットの導出

  1. key[[type]] 内部スロットが"private"でない場合、 InvalidAccessErrorthrowします。

  2. publicKeyを、 normalizedAlgorithmpublicメンバーとします。

  3. publicKey[[type]] 内部スロットが"public"でない場合、InvalidAccessErrorthrowします。

  4. publicKey[[algorithm]]内部 スロットのname属性が、 key[[algorithm]]内部 スロットのnameプロパティと 等しくない場合、InvalidAccessErrorthrowします。

  5. secretを、[RFC7748]のセクション5で指定される X25519関数を実行した結果とします。 keyをX25519 private鍵kとして使用し、 publicKey[[handle]] 内部スロットによって表されるX25519公開鍵をX25519公開鍵uとして使用します。

  6. secretが全ゼロ値である場合、 OperationErrorthrowします。 このチェックは、[RFC7748]のセクション6.1に従い、 定数時間で実行しなければなりません。

  7. lengthがnullである場合:
    secretを返します。
    それ以外の場合:
    secretのビット単位の長さが length未満である場合:
    OperationErrorthrowします。
    それ以外の場合:
    secretの最初のlengthビットを 含むバイトシーケンスを返します。

26.3.2 鍵の生成

  1. usagesが"deriveKey"または"deriveBits"でないエントリを 含む場合、 SyntaxErrorthrowします。

  2. [RFC7748]のセクション6.1で定義されるように、 private鍵を32個のランダムバイトとし、 公開鍵をX25519(a, 9)として、X25519鍵ペアを生成します。

  3. algorithmを新しいKeyAlgorithmオブジェクトとします。

  4. algorithmname属性を "X25519"に設定します。

  5. publicKeyを、生成された鍵ペアの公開鍵を表す新しいCryptoKey とします。

  6. publicKey[[type]] 内部スロットを"public"に設定します。

  7. publicKey[[algorithm]]内部 スロットをalgorithmに設定します。

  8. publicKey[[extractable]]内部 スロットをtrueに設定します。

  9. publicKey[[usages]]内部スロットを 空リストに設定します。

  10. privateKeyを、生成された鍵ペアのprivate鍵を表す新しいCryptoKey とします。

  11. privateKey[[type]] 内部スロットを"private"に設定します。

  12. privateKey[[algorithm]]内部 スロットをalgorithmに設定します。

  13. privateKey[[extractable]]内部 スロットをextractableに設定します。

  14. privateKey[[usages]]内部スロットを、 usages[ "deriveKey", "deriveBits" ]用途の共通部分に設定します。

  15. resultを新しいCryptoKeyPair 辞書とします。

  16. resultpublicKey属性を publicKeyに設定します。

  17. resultprivateKey属性を privateKeyに設定します。

  18. resultを返します。

26.3.3 鍵のインポート

  1. keyDataを、インポートされる鍵データとします。

  2. formatが"spki"である場合:
    1. usagesが空でない場合、 SyntaxErrorthrowします。

    2. spkiを、keyDataに対して subjectPublicKeyInfoを 解析する アルゴリズムを実行した結果とします。

    3. 解析中にエラーが発生した場合、 DataErrorthrowします。

    4. spkialgorithm AlgorithmIdentifierフィールドの algorithmオブジェクト識別子フィールドが、 [RFC8410] で定義されるid-X25519 オブジェクト識別子と等しくない場合、 DataErrorthrowします。

    5. spkialgorithm AlgorithmIdentifierフィールドのparametersフィールドが存在する場合、 DataErrorthrowします。

    6. publicKeyを、spkisubjectPublicKeyフィールドによって 識別されるX25519公開鍵とします。

    7. keyを、publicKeyを表す新しいCryptoKey とします。

    8. key[[type]] 内部スロットを"public"に設定します。

    9. algorithmを新しいKeyAlgorithmとします。

    10. algorithmname属性を "X25519"に設定します。

    11. key[[algorithm]] 内部スロットをalgorithmに設定します。

    formatが"pkcs8"である場合:
    1. usagesが"deriveKey"または"deriveBits"でない エントリを含む場合、 SyntaxErrorthrowします。

    2. privateKeyInfoを、keyDataに対して privateKeyInfoを 解析する アルゴリズムを実行した結果とします。

    3. 解析中にエラーが発生した場合、 DataErrorthrowします。

    4. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmフィールドの algorithmオブジェクト識別子フィールドが、 [RFC8410] で定義されるid-X25519オブジェクト識別子と等しくない場合、 DataErrorthrowします。

    5. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifierフィールドの parametersフィールドが存在する場合、 DataErrorthrowします。

    6. curvePrivateKeyを、 ASN.1構造を解析する アルゴリズムを実行した結果とします。dataprivateKeyInfoprivateKeyフィールドとして、 structureを[RFC8410]の セクション7で指定されるASN.1 CurvePrivateKey構造として、 exactDataをtrueに設定します。

    7. 解析中にエラーが発生した場合、 DataErrorthrowします。

    8. keyを、 curvePrivateKeyによって識別されるX25519 private鍵を表す新しい CryptoKey とします。

    9. key[[type]] 内部スロットを"private"に設定します。

    10. algorithmを新しいKeyAlgorithmとします。

    11. algorithmname属性を "X25519"に設定します。

    12. key[[algorithm]] 内部スロットをalgorithmに設定します。

    formatが"jwk"である場合:
    1. keyDataJsonWebKey 辞書である場合:

      jwkkeyDataと等しくします。

      それ以外の場合:

      DataErrorThrowします。

    2. dフィールドが存在し、 usagesが"deriveKey"または "deriveBits"でないエントリを含む場合、 SyntaxErrorthrowします。

    3. dフィールドが存在せず、 usagesが空でない場合、 SyntaxErrorthrowします。

    4. jwkktyフィールドが "OKP"でない場合、 DataErrorthrowします。

    5. jwkcrvフィールドが "X25519"でない場合、 DataErrorthrowします。

    6. usagesが空でなく、かつjwkuseフィールドが 存在し、"enc"と等しくない場合、DataErrorthrowします。

    7. jwkkey_opsフィールドが 存在し、JSON Web Key [JWK]の要件に従って無効である場合、または 指定されたすべてのusages 値を含まない場合、 DataErrorthrowします。

    8. jwkextフィールドが存在し、 値がfalseであり、かつextractableがtrueである場合、 DataErrorthrowします。

    9. dフィールドが 存在する場合:
      1. jwkが[RFC8037]の セクション2で説明されるJWK private鍵形式の要件を満たさない場合、 DataErrorthrowします。

      2. keyを、[RFC8037]の セクション2に従ってjwkを解釈することによって識別される X25519 private鍵を表す新しいCryptoKey オブジェクトとします。

      3. Key[[type]] 内部スロットを"private"に設定します。

      それ以外の場合:
      1. jwkが[RFC8037]の セクション2で説明されるJWK公開鍵形式の要件を満たさない場合、 DataErrorthrowします。

      2. keyを、[RFC8037]の セクション2に従ってjwkを解釈することによって識別される X25519公開鍵を表す新しいCryptoKey オブジェクトとします。

      3. Key[[type]] 内部スロットを"public"に設定します。

    10. algorithmを新しいKeyAlgorithm オブジェクトのインスタンスとします。

    11. algorithmname属性を "X25519"に設定します。

    12. key[[algorithm]] 内部スロットをalgorithmに設定します。

    formatが"raw"である場合:
    1. usagesが空でない場合、 SyntaxErrorthrowします。

    2. algorithmを新しいKeyAlgorithmオブジェクトとします。

    3. algorithmname属性を "X25519"に設定します。

    4. keyを、keyDataで提供される鍵データを表す新しいCryptoKey とします。

    5. key[[type]] 内部スロットを"public"に設定します。

    6. key[[algorithm]] 内部スロットをalgorithmに設定します。

    それ以外の場合:

    NotSupportedErrorthrowします。

  3. keyを返します。

26.3.4 鍵のエクスポート

  1. keyを、エクスポートされるCryptoKeyとします。

  2. key[[handle]]内部スロットによって表される 基盤となる暗号鍵素材にアクセスできない場合、 OperationErrorthrowします。

  3. formatが"spki"である場合:
    1. key[[type]] 内部スロットが"public"でない場合、InvalidAccessErrorthrowします。

    2. dataを、[RFC5280] で定義されるSubjectPublicKeyInfo ASN.1構造のインスタンスとし、次のプロパティを持つものとします:

      • algorithmフィールドを、次のプロパティを持つ AlgorithmIdentifier ASN.1型に設定します:

        • algorithmオブジェクト識別子を、 [RFC8410] で定義されるid-X25519 OIDに設定します。

      • subjectPublicKeyフィールドをkeyDataに設定します。

    3. resultを、dataをDERエンコードした結果とします。

    formatが"pkcs8"である場合:
    1. key[[type]] 内部スロットが"private"でない場合、InvalidAccessErrorthrowします。

    2. dataを、[RFC5208] で定義されるPrivateKeyInfo ASN.1構造のインスタンスとし、次のプロパティを持つものとします:

      • versionフィールドを0に設定します。

      • privateKeyAlgorithmフィールドを、次のプロパティを持つ PrivateKeyAlgorithmIdentifier ASN.1型に設定します:

        • algorithmオブジェクト識別子を、 [RFC8410] で定義されるid-X25519 OIDに設定します。

      • privateKeyフィールドを、[RFC8410]の セクション7で定義されるCurvePrivateKey ASN.1型を DERエンコードした結果に設定します。これは、key[[handle]] 内部スロットによって表されるX25519 private鍵を表します。

    3. resultを、dataをDERエンコードした結果とします。

    formatが"jwk"である場合:
    1. jwkを新しいJsonWebKey 辞書とします。

    2. jwkkty属性を "OKP"に設定します。

    3. jwkcrv属性を "X25519"に設定します。

    4. jwkx属性を、 [RFC8037]の セクション2の定義に従って設定します。

    5. key[[type]] 内部スロットが"private"である場合
      jwkd属性を、 [RFC8037]の セクション2の定義に従って設定します。
    6. jwkkey_ops属性を、keyusages属性に設定します。

    7. jwkext属性を、key[[extractable]] 内部スロットに設定します。

    8. resultjwkとします。

    formatが"raw"である場合:
    1. key[[type]] 内部スロットが"public"でない場合、InvalidAccessErrorthrowします。

    2. dataを、key[[handle]] 内部スロットによって表されるX25519公開鍵を表す バイトシーケンス とします。

    3. resultdataとします。

    それ以外の場合:

    NotSupportedErrorthrowします。

  4. resultを返します。

27. AES-CTR

27.1 説明

このセクションは非規範的です。

"AES-CTR"アルゴリズム識別子は、 [NIST-SP800-38A]で説明されるように、 CounterモードのAESを使用して暗号化および復号を実行するために使用されます。

27.2 登録

このアルゴリズムの認識されるアルゴリズム名は "AES-CTR"です。

操作 パラメーター 結果
encrypt AesCtrParams バイト シーケンス
decrypt AesCtrParams バイト シーケンス
generateKey AesKeyGenParams CryptoKey
importKey なし CryptoKey
exportKey なし object
get key length AesDerivedKeyParams 整数

27.3 AesCtrParams辞書

WebIDLdictionary AesCtrParams : Algorithm {
  required BufferSource counter;
  required [EnforceRange] octet length;
};

counterメンバーは、カウンターブロックの初期値を含みます。 counterは16 バイト(AESブロックサイズ)でMUSTあります。 カウンタービットは、カウンターブロックの右端のlengthビットです。 カウンターブロックの残りはnonce用です。カウンタービットは、 NIST SP 800-38A Appendix B.1で指定される標準インクリメント関数を使用して インクリメントされます: カウンタービットはビッグエンディアン整数として解釈され、 1だけインクリメントされます。

lengthメンバーは、インクリメントされる カウンターブロックの右端部分のビット単位の長さを含みます。

27.4 AesKeyAlgorithm 辞書

WebIDLdictionary AesKeyAlgorithm : KeyAlgorithm {
  required unsigned short length;
};

lengthメンバーは、鍵のビット単位の 長さを表します。

27.5 AesKeyGenParams 辞書

WebIDLdictionary AesKeyGenParams : Algorithm {
  required [EnforceRange] unsigned short length;
};

lengthメンバーは、鍵のビット単位の 長さを表します。

27.6 AesDerivedKeyParams辞書

WebIDLdictionary AesDerivedKeyParams : Algorithm {
  required [EnforceRange] unsigned short length;
};

lengthメンバーは、鍵のビット単位の 長さを表します。

27.7 操作

27.7.1 暗号化

  1. normalizedAlgorithmcounterメンバーが 16バイトの長さを持たない場合、 OperationErrorthrowします。

  2. normalizedAlgorithmlengthメンバーがゼロであるか、 128を超える場合、 OperationErrorthrowします。

  3. ciphertextを、[NIST-SP800-38A]の セクション6.5で説明されるCTR暗号化操作を実行した結果とします。 ブロック暗号としてAESを使用し、normalizedAlgorithmcounter メンバーをカウンターブロックの初期値として、 normalizedAlgorithmlengthメンバーを [NIST-SP800-38A] のAppendix B.1で定義される標準カウンターブロックインクリメント関数への入力パラメーターmとして、 plaintextを入力平文として使用します。

  4. ciphertextを返します。

27.7.2 復号

  1. normalizedAlgorithmcounterメンバーが 16バイトの長さを持たない場合、 OperationErrorthrowします。

  2. normalizedAlgorithmlengthメンバーがゼロであるか、 128を超える場合、 OperationErrorthrowします。

  3. plaintextを、[NIST-SP800-38A]の セクション6.5で説明されるCTR復号操作を実行した結果とします。 ブロック暗号としてAESを使用し、normalizedAlgorithmcounter メンバーをカウンターブロックの初期値として、 normalizedAlgorithmlengthメンバーを [NIST-SP800-38A] のAppendix B.1で定義される標準カウンターブロックインクリメント関数への入力パラメーターmとして、 ciphertextを入力暗号文として使用します。

  4. plaintextを返します。

27.7.3 鍵の生成

  1. usagesが"encrypt"、"decrypt"、 "wrapKey"または"unwrapKey"のいずれでもない エントリを含む場合、 SyntaxErrorthrowします。

  2. normalizedAlgorithmlengthメンバーが 128、192または256のいずれとも等しくない場合、 OperationErrorthrowします。

  3. normalizedAlgorithmlengthメンバーと等しい長さの AES鍵を生成します。

  4. 鍵生成手順が失敗した場合、 OperationErrorthrowします。

  5. keyを、生成されたAES鍵を表す新しい CryptoKeyオブジェクトとします。

  6. algorithmを新しい AesKeyAlgorithm とします。

  7. algorithmname属性を "AES-CTR"に設定します。

  8. algorithmlength属性を、 normalizedAlgorithmlengthメンバーと等しく設定します。

  9. key[[type]] 内部スロットを"secret"に設定します。

  10. key[[algorithm]]内部 スロットをalgorithmに設定します。

  11. key[[extractable]]内部 スロットをextractableに設定します。

  12. key[[usages]]内部スロットを usagesに設定します。

  13. keyを返します。

27.7.4 鍵のインポート

  1. usagesが"encrypt"、"decrypt"、 "wrapKey"または"unwrapKey"のいずれでもない エントリを含む場合、 SyntaxErrorthrowします。

  2. formatが"raw"である場合:
    1. datakeyDataとします。

    2. dataビット単位の長さが 128、192または256でない場合、 DataErrorthrowします。

    formatが"jwk"である場合:
    1. keyDataJsonWebKey 辞書である場合:

      jwkkeyDataと等しくします。

      それ以外の場合:

      DataErrorThrowします。

    2. jwkktyフィールドが "oct"でない場合、 DataErrorthrowします。

    3. jwkがJSON Web Algorithms [JWA]のセクション6.4の要件を 満たさない場合、 DataErrorthrowします。

    4. dataを、 jwkkフィールドを デコードすることによって得られるバイトシーケンス とします。

    5. dataビット単位の 長さが128である場合:
      jwkalgフィールドが 存在し、"A128CTR"でない場合、DataErrorthrowします。
      dataビット単位の 長さが192である場合:
      jwkalgフィールドが 存在し、"A192CTR"でない場合、DataErrorthrowします。
      dataビット単位の 長さが256である場合:
      jwkalgフィールドが 存在し、"A256CTR"でない場合、DataErrorthrowします。
      それ以外の場合:
      DataErrorthrowします。
    6. usagesが空でなく、かつjwkuseフィールドが存在し、 "enc"でない場合、 DataErrorthrowします。

    7. jwkkey_opsフィールドが 存在し、JSON Web Key [JWK]の要件に従って 無効である場合、または指定されたすべてのusages値を含まない場合、 DataErrorthrowします。

    8. jwkextフィールドが存在し、 値がfalseであり、かつextractableがtrueである場合、 DataErrorthrowします。

    それ以外の場合:
    NotSupportedErrorthrowします。
  3. keyを、値dataを持つAES鍵を表す新しいCryptoKeyオブジェクトとします。

  4. key[[type]] 内部スロットを"secret"に設定します。

  5. algorithmを新しい AesKeyAlgorithm とします。

  6. algorithmname属性を "AES-CTR"に設定します。

  7. algorithmlength属性を dataのビット単位の長さに設定します。

  8. key[[algorithm]]内部 スロットをalgorithmに設定します。

  9. keyを返します。

27.7.5 鍵のエクスポート

  1. key[[handle]]内部スロットによって表される 基盤となる暗号鍵素材にアクセスできない場合、 OperationErrorthrowします。

  2. formatが"raw"である場合:
    1. dataを、key[[handle]] 内部スロットによって表される鍵の生オクテットを含む バイトシーケンス とします。

    2. resultdataとします。

    formatが"jwk"である場合:
    1. jwkを新しいJsonWebKey 辞書とします。

    2. jwkkty属性を文字列 "oct"に設定します。

    3. jwkk属性を、 key[[handle]] 内部スロットによって表される鍵の生オクテットを含む文字列に設定します。 JSON Web Algorithms [JWA]のセクション6.4に従ってエンコードされます。

    4. keylength 属性が128である場合:
      jwkalg属性を 文字列"A128CTR"に設定します。
      keylength 属性が192である場合:
      jwkalg属性を 文字列"A192CTR"に設定します。
      keylength 属性が256である場合:
      jwkalg属性を 文字列"A256CTR"に設定します。
    5. jwkkey_ops属性を、key[[usages]] 内部スロットと等しく設定します。

    6. jwkext属性を、key[[extractable]] 内部スロットと等しく設定します。

    7. resultjwkとします。

    それ以外の場合:

    NotSupportedErrorthrowします。

  3. resultを返します。

27.7.6 鍵の長さの取得

  1. normalizedDerivedKeyAlgorithmlengthメンバーが 128、192または256でない場合、 OperationErrorthrowします。

  2. normalizedDerivedKeyAlgorithmlengthメンバーを返します。

28. AES-CBC

28.1 説明

このセクションは非規範的です。

"AES-CBC"アルゴリズム識別子は、 [NIST-SP800-38A]で説明されるように、 Cipher Block ChainingモードのAESを使用して暗号化および復号を実行するために使用されます。

CBCモードで動作する場合、AESブロックサイズ(16バイト)の正確な倍数でないメッセージは、 さまざまなパディング方式でパディングできます。 Web Crypto APIでサポートされる唯一のパディングモードは、 [RFC2315]の セクション10.3、ステップ2で説明されるPKCS#7のものです。

28.2 登録

このアルゴリズムの認識されるアルゴリズム名は "AES-CBC"です。

操作 パラメーター 結果
encrypt AesCbcParams バイト シーケンス
decrypt AesCbcParams バイト シーケンス
generateKey AesKeyGenParams CryptoKey
importKey なし CryptoKey
exportKey なし object
get key length AesDerivedKeyParams 整数

28.3 AesCbcParams辞書

WebIDLdictionary AesCbcParams : Algorithm {
  required BufferSource iv;
};

ivメンバーは初期化ベクトルを表します。これは16バイトで MUSTあります。

28.4 操作

28.4.1 暗号化

  1. normalizedAlgorithmivメンバーが 16バイトの長さを持たない場合、 OperationErrorthrowします。

  2. paddedPlaintextを、kの値を16として、 [RFC2315]の セクション10.3、ステップ2で定義される手順に従って、 plaintextにパディングオクテットを追加した結果とします。

  3. ciphertextを、[NIST-SP800-38A]の セクション6.2で説明されるCBC暗号化操作を実行した結果とします。 ブロック暗号としてAESを使用し、normalizedAlgorithmivメンバーを IV入力パラメーターとして、 paddedPlaintextを入力平文として使用します。

  4. ciphertextを返します。

28.4.2 復号

  1. normalizedAlgorithmivメンバーが 16バイトの長さを持たない場合、 OperationErrorthrowします。

  2. ciphertextの長さがゼロであるか、16バイトの倍数でない場合、 OperationErrorthrowします。

  3. paddedPlaintextを、[NIST-SP800-38A]の セクション6.2で説明されるCBC復号操作を実行した結果とします。 ブロック暗号としてAESを使用し、normalizedAlgorithmivメンバーを IV入力パラメーターとして、 ciphertextを入力暗号文として使用します。

  4. pを、paddedPlaintextの最後のオクテットの値とします。

  5. pがゼロまたは16より大きい場合、またはpaddedPlaintextの 最後のp個のオクテットのいずれかがpでない値を持つ場合、 OperationErrorthrowします。

  6. plaintextを、paddedPlaintextの末尾から p個のオクテットを除去した結果とします。

  7. plaintextを返します。

28.4.3 鍵の生成

  1. usagesが"encrypt"、"decrypt"、 "wrapKey"または"unwrapKey"のいずれでもない エントリを含む場合、 SyntaxErrorthrowします。

  2. normalizedAlgorithmlengthメンバーが 128、192または256のいずれとも等しくない場合、 OperationErrorthrowします。

  3. normalizedAlgorithmlengthメンバーと等しい長さの AES鍵を生成します。

  4. 鍵生成手順が失敗した場合、 OperationErrorthrowします。

  5. keyを、生成されたAES鍵を表す新しい CryptoKeyオブジェクトとします。

  6. algorithmを新しい AesKeyAlgorithm とします。

  7. algorithmname属性を "AES-CBC"に設定します。

  8. algorithmlength属性を、 normalizedAlgorithmlengthメンバーと等しく設定します。

  9. key[[type]] 内部スロットを"secret"に設定します。

  10. key[[algorithm]]内部 スロットをalgorithmに設定します。

  11. key[[extractable]]内部 スロットをextractableに設定します。

  12. key[[usages]]内部スロットを usagesに設定します。

  13. keyを返します。

28.4.4 鍵のインポート

  1. usagesが"encrypt"、"decrypt"、 "wrapKey"または"unwrapKey"のいずれでもない エントリを含む場合、 SyntaxErrorthrowします。

  2. formatが"raw"である場合:
    1. datakeyDataとします。

    2. dataビット単位の長さが 128、192または256でない場合、 DataErrorthrowします。

    formatが"jwk"である場合:
    1. keyDataJsonWebKey 辞書である場合:

      jwkkeyDataと等しくします。

      それ以外の場合:

      DataErrorthrowします。

    2. jwkktyフィールドが "oct"でない場合、 DataErrorthrowします。

    3. jwkがJSON Web Algorithms [JWA]のセクション6.4の要件を 満たさない場合、 DataErrorthrowします。

    4. dataを、 jwkkフィールドを デコードすることによって得られるバイトシーケンス とします。

    5. dataビット単位の 長さが128である場合:
      jwkalgフィールドが 存在し、"A128CBC"でない場合、 DataErrorthrowします。
      dataビット単位の 長さが192である場合:
      jwkalgフィールドが 存在し、"A192CBC"でない場合、 DataErrorthrowします。
      dataビット単位の 長さが256である場合:
      jwkalgフィールドが 存在し、"A256CBC"でない場合、 DataErrorthrowします。
      それ以外の場合:
      DataErrorthrowします。
    6. usagesが空でなく、かつjwkuseフィールドが存在し、 "enc"でない場合、 DataErrorthrowします。

    7. jwkkey_opsフィールドが 存在し、JSON Web Key [JWK]の要件に従って 無効である場合、または指定されたすべてのusages値を含まない場合、 DataErrorthrowします。

    8. jwkextフィールドが存在し、 値がfalseであり、かつextractableがtrueである場合、 DataErrorthrowします。

    それ以外の場合:
    NotSupportedErrorthrowします。
  3. keyを、値dataを持つAES鍵を表す新しいCryptoKey オブジェクトとします。

  4. key[[type]] 内部スロットを"secret"に設定します。

  5. algorithmを新しい AesKeyAlgorithm とします。

  6. algorithmname属性を "AES-CBC"に設定します。

  7. algorithmlength属性を dataのビット単位の長さに設定します。

  8. key[[algorithm]]内部 スロットをalgorithmに設定します。

  9. keyを返します。

28.4.5 鍵のエクスポート

  1. key[[handle]]内部スロットによって表される 基盤となる暗号鍵素材にアクセスできない場合、 OperationErrorthrowします。

  2. formatが"raw"である場合:
    1. dataを、key[[handle]] 内部スロットによって表される鍵の生オクテットを含む バイトシーケンス とします。

    2. resultdataとします。

    formatが"jwk"である場合:
    1. jwkを新しいJsonWebKey辞書とします。

    2. jwkkty属性を文字列 "oct"に設定します。

    3. jwkk属性を、 key[[handle]] 内部スロットによって表される鍵の生オクテットを含む文字列に設定します。 JSON Web Algorithms [JWA]のセクション6.4に従ってエンコードされます。

    4. keylength 属性が128である場合:
      jwkalg属性を 文字列"A128CBC"に設定します。
      keylength 属性が192である場合:
      jwkalg属性を 文字列"A192CBC"に設定します。
      keylength 属性が256である場合:
      jwkalg属性を 文字列"A256CBC"に設定します。
    5. jwkkey_ops属性を、keyusages属性と 等しく設定します。

    6. jwkext属性を、key[[extractable]] 内部スロットと等しく設定します。

    7. resultjwkとします。

    それ以外の場合:

    NotSupportedErrorthrowします。

  3. resultを返します。

28.4.6 鍵の長さの取得

  1. normalizedDerivedKeyAlgorithmlengthメンバーが 128、192または256でない場合、 OperationErrorthrowします。

  2. normalizedDerivedKeyAlgorithmlengthメンバーを返します。

29. AES-GCM

29.1 説明

このセクションは非規範的です。

"AES-GCM"アルゴリズム識別子は、 [NIST-SP800-38D]で説明されるように、 Galois/Counter ModeモードのAESを使用して認証付き暗号化および復号を実行するために使用されます。

29.2 登録

このアルゴリズムの認識されるアルゴリズム名は "AES-GCM"です。

操作 パラメーター 結果
encrypt AesGcmParams バイト シーケンス
decrypt AesGcmParams バイト シーケンス
generateKey AesKeyGenParams CryptoKey
importKey なし CryptoKey
exportKey なし object
get key length AesDerivedKeyParams 整数

29.3 AesGcmParams辞書

WebIDLdictionary AesGcmParams : Algorithm {
  required BufferSource iv;
  BufferSource additionalData;
  [EnforceRange] octet tagLength;
};

ivメンバーは、使用する初期化ベクトルを表します。長さは 最大2^64-1バイトまでにできます。

additionalDataメンバーは、含める 追加認証データを表します。

tagLengthメンバーは、認証タグの望ましい長さを 表します。0 - 128にできます。

29.4 操作

29.4.1 暗号化

  1. plaintextが2^39 - 256バイトを超える長さを持つ場合、 OperationErrorthrowします。

  2. normalizedAlgorithmivメンバーが 2^64 - 1バイトを超える長さを持つ場合、 OperationErrorthrowします。

  3. normalizedAlgorithmadditionalDataメンバーが 存在し、2^64 - 1バイトを超える 長さを持つ場合、 OperationErrorthrowします。

  4. normalizedAlgorithmtagLengthメンバーが 存在しない場合:
    tagLengthを128とします。
    normalizedAlgorithmtagLengthメンバーが 32、64、96、104、112、120または128のいずれかである場合:
    tagLengthを、 normalizedAlgorithmtagLengthメンバーと等しくします。
    それ以外の場合:
    OperationErrorthrowします。
  5. additionalDataを、 normalizedAlgorithmadditionalDataメンバーが 存在する場合はそれとし、それ以外の場合は空のバイトシーケンス とします。

  6. CおよびTを、 [NIST-SP800-38D]の セクション7.1で説明されるAuthenticated Encryption Functionを実行した結果の出力とします。 ブロック暗号としてAESを使用し、normalizedAlgorithmivメンバーを IV入力パラメーターとして、 additionalDataA入力パラメーターとして、 tagLengtht前提条件として、 plaintextを入力平文として使用します。

  7. ciphertextC | Tと等しくします。 ここで'|'は連結を表します。

  8. ciphertextを返します。

29.4.2 復号

  1. normalizedAlgorithmtagLengthメンバーが 存在しない場合:
    tagLengthを128とします。
    normalizedAlgorithmtagLengthメンバーが 32、64、96、104、112、120または128のいずれかである場合:
    tagLengthを、 normalizedAlgorithmtagLengthメンバーと等しくします。
    それ以外の場合:
    OperationErrorthrowします。
  2. ciphertextビット単位の長さtagLength未満である場合、 OperationErrorthrowします。

  3. normalizedAlgorithmivメンバーが 2^64 - 1バイトを超える長さを持つ場合、 OperationErrorthrowします。

  4. normalizedAlgorithmadditionalDataメンバーが 存在し、2^64 - 1バイトを超える 長さを持つ場合、 OperationErrorthrowします。

  5. tagを、ciphertextの最後のtagLengthビットとします。

  6. actualCiphertextを、ciphertextから最後のtagLengthビットを 除去した結果とします。

  7. additionalDataを、 normalizedAlgorithmadditionalDataメンバーが 存在する場合はそれとし、それ以外の場合は空のバイトシーケンス とします。

  8. [NIST-SP800-38D]の セクション7.2で説明されるAuthenticated Decryption Functionを実行します。 ブロック暗号としてAESを使用し、 normalizedAlgorithmivメンバーを IV入力パラメーターとして、 additionalDataA入力パラメーターとして、 tagLengtht前提条件として、 actualCiphertextを入力暗号文、Cとして使用し、 tagを認証タグ、Tとして使用します。

    アルゴリズムの結果が非真正性の表示 "FAIL"である場合:
    OperationErrorthrowします。
    それ以外の場合:
    plaintextをAuthenticated Decryption Functionの出力 Pとします。
  9. plaintextを返します。

29.4.3 鍵の生成

  1. usagesが"encrypt"、"decrypt"、 "wrapKey"または"unwrapKey"のいずれでもない エントリを含む場合、 SyntaxErrorthrowします。

  2. normalizedAlgorithmlengthメンバーが 128、192または256のいずれとも等しくない場合、 OperationErrorthrowします。

  3. normalizedAlgorithmlengthメンバーと等しい長さの AES鍵を生成します。

  4. 鍵生成手順が失敗した場合、 OperationErrorthrowします。

  5. keyを、生成されたAES鍵を表す新しい CryptoKeyオブジェクトとします。

  6. algorithmを新しい AesKeyAlgorithm とします。

  7. algorithmname属性を "AES-GCM"に設定します。

  8. algorithmlength属性を、 normalizedAlgorithmlengthメンバーと等しく設定します。

  9. key[[type]] 内部スロットを"secret"に設定します。

  10. key[[algorithm]]内部 スロットをalgorithmに設定します。

  11. key[[extractable]]内部 スロットをextractableに設定します。

  12. key[[usages]]内部スロットを usagesに設定します。

  13. keyを返します。

29.4.4 鍵のインポート

  1. usagesが"encrypt"、"decrypt"、 "wrapKey"または"unwrapKey"のいずれでもない エントリを含む場合、 SyntaxErrorthrowします。

  2. formatが"raw"である場合:
    1. datakeyDataとします。

    2. dataビット単位の長さが 128、192または256でない場合、 DataErrorthrowします。

    formatが"jwk"である場合:
    1. keyDataJsonWebKey 辞書である場合:

      jwkkeyDataと等しくします。

      それ以外の場合:

      DataErrorThrowします。

    2. jwkktyフィールドが "oct"でない場合、 DataErrorthrowします。

    3. jwkがJSON Web Algorithms [JWA]のセクション6.4の要件を 満たさない場合、 DataErrorthrowします。

    4. dataを、 jwkkフィールドを デコードすることによって得られるバイトシーケンス とします。

    5. dataビット単位の 長さが128である場合:
      jwkalgフィールドが 存在し、"A128GCM"でない場合、 DataErrorthrowします。
      dataビット単位の 長さが192である場合:
      jwkalgフィールドが 存在し、"A192GCM"でない場合、 DataErrorthrowします。
      dataビット単位の 長さが256である場合:
      jwkalgフィールドが 存在し、"A256GCM"でない場合、 DataErrorthrowします。
      それ以外の場合:
      DataErrorthrowします。
    6. usagesが空でなく、かつjwkuseフィールドが存在し、 "enc"でない場合、 DataErrorthrowします。

    7. jwkkey_opsフィールドが 存在し、JSON Web Key [JWK]の要件に従って 無効である場合、または指定されたすべてのusages値を含まない場合、 DataErrorthrowします。

    8. jwkextフィールドが存在し、 値がfalseであり、かつextractableがtrueである場合、 DataErrorthrowします。

    それ以外の場合:
    NotSupportedErrorthrowします。
  3. keyを、値dataを持つAES鍵を表す新しいCryptoKey オブジェクトとします。

  4. key[[type]] 内部スロットを"secret"に設定します。

  5. algorithmを新しい AesKeyAlgorithm とします。

  6. algorithmname属性を "AES-GCM"に設定します。

  7. algorithmlength属性を dataのビット単位の長さに設定します。

  8. key[[algorithm]]内部 スロットをalgorithmに設定します。

  9. keyを返します。

29.4.5 鍵のエクスポート

  1. key[[handle]]内部スロットによって表される 基盤となる暗号鍵素材にアクセスできない場合、 OperationErrorthrowします。

  2. formatが"raw"である場合:
    1. dataを、key[[handle]] 内部スロットによって表される鍵の生オクテットを含む バイトシーケンス とします。

    2. resultdataとします。

    formatが"jwk"である場合:
    1. jwkを新しいJsonWebKey 辞書とします。

    2. jwkkty属性を文字列 "oct"に設定します。

    3. jwkk属性を、 key[[handle]] 内部スロットによって表される鍵の生オクテットを含む文字列に設定します。 JSON Web Algorithms [JWA]のセクション6.4に従ってエンコードされます。

    4. keylength 属性が128である場合:
      jwkalg属性を 文字列"A128GCM"に設定します。
      keylength 属性が192である場合:
      jwkalg属性を 文字列"A192GCM"に設定します。
      keylength 属性が256である場合:
      jwkalg属性を 文字列"A256GCM"に設定します。
    5. jwkkey_ops属性を、keyusages属性と 等しく設定します。

    6. jwkext属性を、key[[extractable]] 内部スロットと等しく設定します。

    7. resultjwkとします。

    それ以外の場合:

    NotSupportedErrorthrowします。

  3. resultを返します。

29.4.6 鍵の長さの取得

  1. normalizedDerivedKeyAlgorithmlengthメンバーが 128、192または256でない場合、 OperationErrorthrowします。

  2. normalizedDerivedKeyAlgorithmlengthメンバーを返します。

30. AES-KW

30.1 説明

このセクションは非規範的です。

"AES-KW"アルゴリズム識別子は、 [RFC3394]で説明されるように、 AESを使用して鍵ラップを実行するために使用されます。

30.2 登録

このアルゴリズムの認識されるアルゴリズム名は "AES-KW"です。

操作 パラメーター 結果
wrapKey なし バイト シーケンス
unwrapKey なし バイト シーケンス
generateKey AesKeyGenParams CryptoKey
importKey なし CryptoKey
exportKey なし object
get key length AesDerivedKeyParams 整数

30.3 操作

30.3.1 鍵のラップ

  1. plaintextの長さが64ビットの倍数でない場合、 OperationErrorthrowします。

  2. ciphertextを、[RFC3394]の セクション2.2.1で説明されるKey Wrap操作を実行した結果とします。 plaintextをラップされる平文として使用し、同じ文書の セクション2.2.3.1で定義されるデフォルトのInitial Valueを使用します。

  3. ciphertextを返します。

30.3.2 鍵のアンラップ

  1. plaintextを、[RFC3394]の セクション2.2.2で説明されるKey Unwrap操作を実行した結果とします。 ciphertextを入力暗号文として使用し、同じ文書の セクション2.2.3.1で定義されるデフォルトのInitial Valueを使用します。

  2. Key Unwrap操作がエラーを返す場合、 OperationErrorthrowします。

  3. plaintextを返します。

30.3.3 鍵の生成

  1. usagesが"wrapKey"または"unwrapKey"のいずれでもない エントリを含む場合、SyntaxErrorthrowします。

  2. normalizedAlgorithmlengthプロパティが 128、192または256のいずれとも等しくない場合、OperationErrorthrowします。

  3. normalizedAlgorithmlengthメンバーと等しい長さの AES鍵を生成します。

  4. 鍵生成手順が失敗した場合、 OperationErrorthrowします。

  5. keyを、生成されたAES鍵を表す新しい CryptoKeyオブジェクトとします。

  6. algorithmを新しい AesKeyAlgorithm とします。

  7. algorithmname属性を "AES-KW"に設定します。

  8. algorithmlength属性を、 normalizedAlgorithmlengthプロパティと 等しく設定します。

  9. key[[type]] 内部スロットを"secret"に設定します。

  10. key[[algorithm]]内部 スロットをalgorithmに設定します。

  11. key[[extractable]]内部 スロットをextractableに設定します。

  12. key[[usages]]内部スロットを usagesに設定します。

  13. keyを返します。

30.3.4 鍵のインポート

  1. usagesが"wrapKey"または"unwrapKey"のいずれでもない エントリを含む場合、 SyntaxErrorthrowします。

  2. formatが"raw"である場合:
    1. datakeyDataとします。

    2. dataビット単位の 長さが128、192または256でない場合、 DataErrorthrowします。

    formatが"jwk"である場合:
    1. keyDataJsonWebKey 辞書である場合:

      jwkkeyDataと等しくします。

      それ以外の場合:

      DataErrorThrowします。

    2. jwkktyフィールドが "oct"でない場合、 DataErrorthrowします。

    3. jwkがJSON Web Algorithms [JWA]のセクション6.4の要件を 満たさない場合、 DataErrorthrowします。

    4. dataを、 jwkkフィールドを デコードすることによって得られるバイトシーケンス とします。

    5. dataビット単位の 長さが128である場合:
      jwkalgフィールドが 存在し、"A128KW"でない場合、 DataErrorthrowします。
      dataビット単位の 長さが192である場合:
      jwkalgフィールドが 存在し、"A192KW"でない場合、 DataErrorthrowします。
      dataビット単位の 長さが256である場合:
      jwkalgフィールドが 存在し、"A256KW"でない場合、 DataErrorthrowします。
      それ以外の場合:
      DataErrorthrowします。
    6. usagesが空でなく、かつjwkuseフィールドが存在し、 "enc"でない場合、 DataErrorthrowします。

    7. jwkkey_opsフィールドが 存在し、JSON Web Key [JWK]の要件に従って 無効である場合、または指定されたすべてのusages値を含まない場合、 DataErrorthrowします。

    8. jwkextフィールドが存在し、 値がfalseであり、かつextractableがtrueである場合、 DataErrorthrowします。

    それ以外の場合:
    NotSupportedErrorthrowします。
  3. keyを、値dataを持つAES鍵を表す新しいCryptoKey とします。

  4. key[[type]] 内部スロットを"secret"に設定します。

  5. algorithmを新しい AesKeyAlgorithm とします。

  6. algorithmname属性を "AES-KW"に設定します。

  7. algorithmlength属性を dataのビット単位の長さに設定します。

  8. key[[algorithm]]内部 スロットをalgorithmに設定します。

  9. keyを返します。

30.3.5 鍵のエクスポート

  1. key[[handle]]内部スロットによって表される 基盤となる暗号鍵素材にアクセスできない場合、 OperationErrorthrowします。

  2. formatが"raw"である場合:
    1. dataを、key[[handle]] 内部スロットによって表される鍵の生オクテットを含む バイトシーケンス とします。

    2. resultdataとします。

    formatが"jwk"である場合:
    1. jwkを新しいJsonWebKey 辞書とします。

    2. jwkkty属性を文字列 "oct"に設定します。

    3. jwkk属性を、 key[[handle]] 内部スロットによって表される鍵の生オクテットを含む文字列に設定します。 JSON Web Algorithms [JWA]のセクション6.4に従ってエンコードされます。

    4. keylength 属性が128である場合:
      jwkalg属性を 文字列"A128KW"に設定します。
      keylength 属性が192である場合:
      jwkalg属性を 文字列"A192KW"に設定します。
      keylength 属性が256である場合:
      jwkalg属性を 文字列"A256KW"に設定します。
    5. jwkkey_ops属性を、keyusages属性と 等しく設定します。

    6. jwkext属性を、key[[extractable]] 内部スロットと等しく設定します。

    7. resultjwkとします。

    それ以外の場合:

    NotSupportedErrorthrowします。

  3. resultを返します。

30.3.6 鍵の長さの取得

  1. normalizedDerivedKeyAlgorithmlengthメンバーが 128、192または256でない場合、OperationErrorthrowします。

  2. normalizedDerivedKeyAlgorithmlengthメンバーを返します。

31. HMAC

31.1 説明

このセクションは非規範的です。

HMACアルゴリズムは、この仕様で定義されるSHAハッシュ関数を使用して、 [FIPS-198-1]に従って、 ハッシュベースのメッセージ認証コードを計算および検証します。

他の 仕様は、 HMACで追加のハッシュアルゴリズムを使用することを指定できます。そのような仕様は、 追加のハッシュアルゴリズムのdigest操作、ならびにHMAC用の 鍵インポート手順および 鍵エクスポート手順を 定義しなければなりません。

31.2 登録

このアルゴリズムの認識されるアルゴリズム名は "HMAC"です。

操作 パラメーター 結果
sign なし バイト シーケンス
verify なし boolean
generateKey HmacKeyGenParams CryptoKey
importKey HmacImportParams CryptoKey
exportKey なし object
get key length HmacImportParams 整数

31.3 HmacImportParams辞書

WebIDLdictionary HmacImportParams : Algorithm {
  required HashAlgorithmIdentifier hash;
  [EnforceRange] unsigned long length;
};

hashメンバーは、使用する内部ハッシュ 関数を表します。

lengthメンバーは、鍵の長さ(ビット単位)を 表します。

31.4 HmacKeyAlgorithm辞書

WebIDLdictionary HmacKeyAlgorithm : KeyAlgorithm {
  required KeyAlgorithm hash;
  required unsigned long length;
};

hashメンバーは、使用する内部ハッシュ関数を表します。

lengthメンバーは、鍵の長さ(ビット単位)を 表します。

31.5 HmacKeyGenParams辞書

WebIDLdictionary HmacKeyGenParams : Algorithm {
  required HashAlgorithmIdentifier hash;
  [EnforceRange] unsigned long length;
};

hashメンバーは、使用する内部ハッシュ 関数を表します。

lengthメンバーは、生成する鍵の長さ (ビット単位)を表します。指定されない場合は、推奨される長さが使用されます。これは、関連付けられた ハッシュ関数のブロックサイズのサイズです。

31.6 操作

31.6.1 署名

  1. macを、[FIPS-198-1]の セクション4で説明されるMAC Generation操作を実行した結果とします。 key[[handle]] 内部スロットによって表される鍵、 key[[algorithm]]内部 スロットのhash属性によって識別される ハッシュ関数、および入力データtextとしてmessageを使用します。

  2. macを返します。

31.6.2 検証

  1. macを、[FIPS-198-1]の セクション4で説明されるMAC Generation操作を実行した結果とします。 key[[handle]] 内部スロットによって表される鍵、 key[[algorithm]]内部 スロットのhash属性によって識別される ハッシュ関数、および入力データtextとしてmessageを使用します。

  2. macsignatureと等しい場合はtrueを返し、 それ以外の場合はfalseを返します。

31.6.3 鍵の生成

  1. usagesが"sign"または "verify"でないエントリを含む場合、 SyntaxErrorthrowします。

  2. normalizedAlgorithmlengthメンバーが 存在しない場合:
    lengthを、 normalizedAlgorithmhash メンバーによって識別されるハッシュ関数のビット単位のブロックサイズとします。
    それ以外の場合で、normalizedAlgorithmlength メンバーがゼロでない場合:
    lengthを、 normalizedAlgorithmlength メンバーと等しくします。
    それ以外の場合:
    OperationErrorthrowします。
  3. 長さlengthビットの鍵を生成します。

  4. 鍵生成手順が失敗した場合、 OperationErrorthrowします。

  5. keyを、生成された鍵を表す新しい CryptoKeyオブジェクトとします。

  6. algorithmを新しい HmacKeyAlgorithmとします。

  7. algorithmname属性を "HMAC"に設定します。

  8. algorithmlength属性を lengthに設定します。

  9. hashを新しい KeyAlgorithmとします。

  10. hashname属性を、 normalizedAlgorithmhash メンバーのname メンバーと等しく設定します。

  11. algorithmhash属性を hashに設定します。

  12. key[[type]] 内部スロットを"secret"に設定します。

  13. key[[algorithm]]内部 スロットをalgorithmに設定します。

  14. key[[extractable]]内部 スロットをextractableに設定します。

  15. key[[usages]]内部スロットを usagesに設定します。

  16. keyを返します。

31.6.4 鍵のインポート

  1. keyDataを、インポートされる鍵データとします。

  2. usagesが"sign"または"verify"でない エントリを含む場合、 SyntaxErrorthrowします。

  3. hashを新しいKeyAlgorithmとします。

  4. formatが"raw"である場合:
    1. datakeyDataとします。

    2. hashnormalizedAlgorithmhash メンバーと等しく設定します。

    formatが"jwk"である場合:
    1. keyDataJsonWebKey 辞書である場合:

      jwkkeyDataと等しくします。

      それ以外の場合:

      DataErrorThrowします。

    2. jwkktyフィールドが "oct"でない場合、 DataErrorthrowします。

    3. jwkがJSON Web Algorithms [JWA]のセクション6.4の要件を 満たさない場合、 DataErrorthrowします。

    4. dataを、 jwkkフィールドを デコードすることによって得られるバイトシーケンス とします。

    5. hashnormalizedAlgorithmhashメンバーと 等しく設定します。

    6. hashname 属性が "SHA-1"である場合:
      jwkalgフィールドが 存在し、 "HS1"でない場合、 DataErrorthrowします。
      hashname 属性が "SHA-256"である場合:
      jwkalgフィールドが 存在し、 "HS256"でない場合、 DataErrorthrowします。
      hashname 属性が "SHA-384"である場合:
      jwkalgフィールドが 存在し、 "HS384"でない場合、 DataErrorthrowします。
      hashname 属性が "SHA-512"である場合:
      jwkalgフィールドが 存在し、 "HS512"でない場合、 DataErrorthrowします。
      それ以外の場合で、hashname 属性が 他の適用可能な 仕様で定義される場合:
      鍵インポート手順のうち、 他の適用可能な 仕様によって定義されるものを実行し、formatjwk およびhashを渡して、hashを取得します。
    7. usagesが空でなく、かつjwkuseフィールドが 存在し、 "sign"でない場合、 DataErrorthrowします。

    8. jwkkey_opsフィールドが 存在し、JSON Web Key [JWK]の要件に従って 無効である場合、または指定されたすべてのusages値を含まない場合、 DataErrorthrowします。

    9. jwkextフィールドが 存在し、 値がfalseであり、かつextractableがtrueである場合、 DataErrorthrowします。

    それ以外の場合:
    NotSupportedErrorthrowします。
  5. lengthdataビット単位の長さとします。

  6. lengthがゼロである場合、 DataErrorthrowします。

  7. normalizedAlgorithmlengthメンバーが 存在する場合:
    normalizedAlgorithmlengthメンバーが lengthより大きい場合:
    DataErrorthrowします。
    normalizedAlgorithmlengthメンバーが、 lengthマイナス8以下である場合:
    DataErrorthrowします。
    それ以外の場合:
    lengthを、normalizedAlgorithmlength メンバーと等しく設定します。
  8. keyを、dataの最初のlengthビットを持つHMAC鍵を 表す新しいCryptoKey オブジェクトとします。

  9. key[[type]] 内部スロットを"secret"に設定します。

  10. algorithmを新しい HmacKeyAlgorithmとします。

  11. algorithmname属性を "HMAC"に設定します。

  12. algorithmlength属性を lengthに設定します。

  13. algorithmhash属性を hashに設定します。

  14. key[[algorithm]]内部 スロットをalgorithmに設定します。

  15. keyを返します。

31.6.5 鍵のエクスポート

  1. key[[handle]]内部スロットによって表される 基盤となる暗号鍵素材にアクセスできない場合、OperationErrorthrowします。

  2. bitsを、key[[handle]]内部スロットによって 表される鍵の生ビットとします。

  3. dataを、bits含むバイトシーケンスとします。

  4. formatが"raw"である場合:
    1. resultdataとします。

    formatが"jwk"である場合:
    1. jwkを新しいJsonWebKey 辞書とします。

    2. jwkkty属性を文字列 "oct"に設定します。

    3. jwkk属性を、 dataを含む文字列に設定します。JSON Web Algorithms [JWA]のセクション6.4に従って エンコードされます。

    4. algorithmを、key[[algorithm]] 内部スロットとします。

    5. hashを、 algorithmhash属性と します。

    6. hashname 属性が"SHA-1"である場合:
      jwkalg属性を 文字列"HS1"に設定します。
      hashname 属性が"SHA-256"である場合:
      jwkalg属性を 文字列"HS256"に設定します。
      hashname 属性が"SHA-384"である場合:
      jwkalg属性を 文字列"HS384"に設定します。
      hashname 属性が"SHA-512"である場合:
      jwkalg属性を 文字列"HS512"に設定します。
      それ以外の場合で、hashname 属性が 他の適用可能な 仕様で定義される場合:
      1. 鍵エクスポート 手順のうち、 他の適用可能な 仕様によって定義されるものを実行し、formatおよび key を渡して、algを取得します。

      2. jwkalg属性を algに設定します。

    7. jwkkey_ops属性を、keyusages属性と 等しく設定します。

    8. jwkext属性を、key[[extractable]] 内部スロットと等しく設定します。

    9. resultjwkとします。

    それ以外の場合:

    NotSupportedErrorthrowします。

  5. resultを返します。

31.6.6 鍵の長さの取得

  1. normalizedDerivedKeyAlgorithmlengthメンバーが 存在しない場合:

    lengthを、 normalizedDerivedKeyAlgorithmhashメンバーによって 識別されるハッシュ関数のビット単位のブロックサイズとします。

    それ以外の場合で、normalizedDerivedKeyAlgorithmlength メンバーがゼロでない場合:
    lengthを、 normalizedDerivedKeyAlgorithmlength メンバーと等しくします。
    それ以外の場合:
    TypeErrorthrowします。
  2. lengthを返します。

32. SHA

32.1 説明

このセクションは非規範的です。

これは、 [FIPS-180-4]で指定される SHA-1およびSHA-2ファミリーについて説明します。

32.2 登録

認識されるアルゴリズム 名は、それぞれのSHAアルゴリズムについて "SHA-1"、 "SHA-256"、 "SHA-384"、および "SHA-512"です。

操作 パラメーター 結果
digest なし バイト シーケンス

32.3 操作

32.3.1 Digest

  1. normalizedAlgorithmnameメンバーが、 "SHA-1"に対する大文字小文字を区別する文字列一致である場合:
    resultを、 [FIPS-180-4]の セクション6.1で定義されるSHA-1ハッシュ関数を実行した結果とします。 入力メッセージMとしてmessageを使用します。
    normalizedAlgorithmnameメンバーが、 "SHA-256"に対する大文字小文字を区別する文字列一致である場合:
    resultを、 [FIPS-180-4]の セクション6.2で定義されるSHA-256ハッシュ関数を実行した結果とします。 入力メッセージMとしてmessageを使用します。
    normalizedAlgorithmnameメンバーが、 "SHA-384"に対する大文字小文字を区別する文字列一致である場合:
    resultを、 [FIPS-180-4]の セクション6.5で定義されるSHA-384ハッシュ関数を実行した結果とします。 入力メッセージMとしてmessageを使用します。
    normalizedAlgorithmnameメンバーが、 "SHA-512"に対する大文字小文字を区別する文字列一致である場合:
    resultを、 [FIPS-180-4]の セクション6.4で定義されるSHA-512ハッシュ関数を実行した結果とします。 入力メッセージMとしてmessageを使用します。
  2. 操作の実行でエラーが発生した場合、OperationErrorthrowします。

  3. resultを返します。

33. HKDF

33.1 説明

このセクションは非規範的です。

"HKDF"アルゴリズム識別子は、 [RFC5869]で説明される 抽出してから展開するアプローチを使用し、 この仕様で定義されるSHAハッシュ関数を使用して鍵導出を実行するために使用されます。

他の 仕様は、 HKDFで追加のハッシュアルゴリズムを使用することを指定できます。 そのような仕様は、追加のハッシュアルゴリズムのdigest操作を定義しなければなりません。

33.2 登録

このアルゴリズムの認識されるアルゴリズム名は "HKDF"です。

操作 パラメーター 結果
deriveBits HkdfParams バイト シーケンス
importKey なし CryptoKey
Get key length なし null

33.3 HkdfParams辞書

WebIDLdictionary HkdfParams : Algorithm {
  required HashAlgorithmIdentifier hash;
  required BufferSource salt;
  required BufferSource info;
};

hashメンバーは、HMACとともに使用するアルゴリズム (例: SHA-256)を表します。

saltメンバーは、extractステップで使用されるsaltを表します。

infoメンバーは、導出された鍵素材のアプリケーション固有の コンテキストを表します。

33.4 操作

33.4.1 ビットの導出

  1. lengthがnullであるか、8の倍数でない場合、 OperationErrorthrowします。

  2. keyDerivationKeyを、key[[handle]]内部スロットによって 表されるsecretとします。

  3. resultを、 [RFC5869]の セクション2で説明されるHKDF extractおよびその後のHKDF expandステップを 実行した結果とします。次を使用します:

    • normalizedAlgorithmhashメンバーを Hashとして、

    • keyDerivationKeyを入力鍵素材 IKMとして、

    • normalizedAlgorithmsaltメンバーを saltとして、

    • normalizedAlgorithminfoメンバーを infoとして、

    • lengthを8で割った値をLの値として、

  4. 鍵導出操作が失敗した場合、 OperationErrorthrowします。

  5. resultを返します。

33.4.2 鍵のインポート

  1. keyDataを、インポートされる鍵データとします。

  2. formatが"raw"である場合:
    1. usagesが "deriveKey"または"deriveBits"でない値を含む場合、 SyntaxErrorthrowします。

    2. extractablefalseでない場合、 SyntaxErrorthrowします。

    3. keyを、keyDataで提供される鍵データを表す新しい CryptoKey とします。

    4. key[[type]] 内部スロットを "secret"に設定します。

    5. algorithmを新しい KeyAlgorithmオブジェクトとします。

    6. algorithmname属性を "HKDF"に設定します。

    7. key[[algorithm]] 内部スロットをalgorithmに設定します。

    8. keyを返します。

    それ以外の場合:
    NotSupportedErrorthrowします。

33.4.3 鍵の長さの取得

  1. nullを返します。

34. PBKDF2

34.1 説明

このセクションは非規範的です。

"PBKDF2"アルゴリズム識別子は、 [RFC8018]で定義される PKCS#5パスワードベース鍵導出関数バージョン2を使用して鍵導出を実行するために使用されます。 擬似乱数関数としてHMACを使用し、 この仕様で定義されるSHAハッシュ関数を使用します。

他の 仕様は、 PBKDF2で追加のハッシュアルゴリズムを使用することを指定できます。そのような仕様は、 追加のハッシュアルゴリズムのdigest操作を定義しなければなりません。

34.2 登録

このアルゴリズムの認識されるアルゴリズム名は "PBKDF2"です。

操作 パラメーター 結果
deriveBits Pbkdf2Params バイト シーケンス
importKey なし CryptoKey
Get key length なし null

34.3 Pbkdf2Params辞書

WebIDLdictionary Pbkdf2Params : Algorithm {
  required BufferSource salt;
  required [EnforceRange] unsigned long iterations;
  required HashAlgorithmIdentifier hash;
};

Pbkdf2Params辞書には、saltメンバー、iterationsメンバー、およびhashメンバーがあります。

34.4 操作

34.4.1 ビットの導出

  1. lengthがnullであるか、8の倍数でない場合、 OperationErrorthrowします。

  2. normalizedAlgorithmiterationsメンバーが ゼロである場合、 OperationErrorthrowします。

  3. lengthがゼロである場合、空のバイトシーケンスを返します。

  4. prfを、 [FIPS-198-1]の セクション4で説明されるMAC Generation関数とします。 normalizedAlgorithmhashメンバーによって 説明されるハッシュ関数を使用します。

  5. resultを、 [RFC8018]の セクション5.2で定義されるPBKDF2操作を実行した結果とします。 prfを擬似乱数関数PRFとして使用し、 key[[handle]]内部スロットによって 表されるパスワードをパスワードPとして、 normalizedAlgorithmsalt属性をsaltSとして、 normalizedAlgorithmiterations属性の値を 反復回数cとして、および lengthを8で割った値を目的の鍵長dkLenとして使用します。

  6. 鍵導出操作が失敗した場合、 OperationErrorthrowします。

  7. resultを返します。

34.4.2 鍵のインポート

  1. formatが"raw"でない場合、NotSupportedErrorthrowします。

  2. usagesが "deriveKey"または"deriveBits"でない値を含む場合、 SyntaxErrorthrowします。

  3. extractablefalseでない場合、 SyntaxErrorthrowします。

  4. keyを、keyDataを表す新しいCryptoKey とします。

  5. key[[type]] 内部スロットを "secret"に設定します。

  6. algorithmを新しいKeyAlgorithm オブジェクトとします。

  7. algorithmname属性を "PBKDF2"に設定します。

  8. key[[algorithm]]内部 スロットをalgorithmに設定します。

  9. keyを返します。

34.4.3 鍵の長さの取得

  1. nullを返します。

35. JavaScriptの例示コード

35.1 2つの鍵ペアを生成し、共有鍵を導出し、データを暗号化する

この例は、Alice用とBob用に2つのX25519鍵ペアを生成し、それらの間で鍵合意を実行し、 SHA-256を用いるHKDFによってその結果から256ビットAES-GCM鍵を導出し、 それを使ってデータを暗号化および復号します。

1: X25519鍵合意
// Alice用の鍵ペアを生成します。
const alice_x25519_key = await crypto.subtle.generateKey('X25519', false /* extractable */, ['deriveKey']);
const alice_private_key = alice_x25519_key.privateKey;

// 通常、公開鍵は何らかの認証済みチャネルを通じて、BobからAliceへ事前に送信されます。
// この例では、別の鍵ペアを生成し、その公開鍵を代わりに使用します。
const bob_x25519_key = await crypto.subtle.generateKey('X25519', false /* extractable */, ['deriveKey']);
const bob_public_key = bob_x25519_key.publicKey;

// 鍵合意を実行します。
const alice_x25519_params = { name: 'X25519', public: bob_public_key };
const alice_shared_key = await crypto.subtle.deriveKey(alice_x25519_params, alice_private_key, 'HKDF', false /* extractable */, ['deriveKey']);

// 結果から対称鍵を導出します。
const salt = crypto.getRandomValues(new Uint8Array(32));
const info = new TextEncoder().encode('X25519 key agreement for an AES-GCM-256 key');
const hkdf_params = { name: 'HKDF', hash: 'SHA-256', salt, info };
const gcm_params = { name: 'AES-GCM', length: 256 };
const alice_symmetric_key = await crypto.subtle.deriveKey(hkdf_params, alice_shared_key, gcm_params, false /* extractable */, ['encrypt', 'decrypt']);

// 対称鍵でデータを暗号化し、Bobへ送信します。IVも一緒に渡す必要があります。
const iv = crypto.getRandomValues(new Uint8Array(12));
const message = new TextEncoder().encode('Hi Bob!');
const encrypted = await crypto.subtle.encrypt({ ...gcm_params, iv }, alice_symmetric_key, message);

// Bob側では、代わりにAliceの公開鍵とBobのprivate鍵が使用されます。
// 同じ結果を得るには、AliceとBobが同じsaltとinfoを使用することに合意する必要があります。
const alice_public_key = alice_x25519_key.publicKey;
const bob_private_key = bob_x25519_key.privateKey;
const bob_x25519_params = { name: 'X25519', public: alice_public_key };
const bob_shared_key = await crypto.subtle.deriveKey(bob_x25519_params, bob_private_key, 'HKDF', false /* extractable */, ['deriveKey']);
const bob_symmetric_key = await crypto.subtle.deriveKey(hkdf_params, bob_shared_key, gcm_params, false /* extractable */, ['encrypt', 'decrypt']);

// Bob側では、データを復号できます。
const decrypted = await crypto.subtle.decrypt({ ...gcm_params, iv }, bob_symmetric_key, encrypted);
const decrypted_message = new TextDecoder().decode(decrypted);

35.2 署名用 鍵ペアを生成し、データに署名する

2: Ed25519署名
const data = new TextEncoder().encode('Hello, world!');
const key = await crypto.subtle.generateKey('Ed25519', false, ['sign']);
const signature = await crypto.subtle.sign('Ed25519', key.privateKey, data);

35.3 対称鍵を 生成し、データを暗号化する

3: AES-GCM暗号化
const data = new TextEncoder().encode('Hello, world!');
const aesAlgorithmKeyGen = {
  name: 'AES-GCM',
  // AesKeyGenParams
  length: 256
};
const aesAlgorithmEncrypt = {
  name: 'AES-GCM',
  // AesGcmParams
  iv: crypto.getRandomValues(new Uint8Array(16))
};
const key = await crypto.subtle.generateKey(aesAlgorithmKeyGen, false, ['encrypt']);
const encrypted = await crypto.subtle.encrypt(aesAlgorithmEncrypt, key, data);

35.4 ダウンロード用の一意な 名前を生成する

4: ランダムUUID生成
const filename = `${crypto.randomUUID()}.txt`;

36. IANAに関する考慮事項

36.1 JSON Web Signature and Encryption Algorithms登録

このセクションは、JSON Web Keyで使用するために、次のアルゴリズム識別子をIANA JSON Web Signature and Encryption Algorithms Registryに登録します。テンプレート内の 'Implementation Requirements'フィールドは、JSON Web SignatureおよびJSON Web Encryptionでの 使用を具体的に指しており、その場合、認証されない暗号化の使用は禁止されることに注意してください。

36.2 JSON Web Key Parameters登録

37. 謝辞

特に、元の著者および編集者であるRyan Sleeviと、 この文書の元編集者であるMark Watsonに感謝します。

技術的フィードバックおよび支援について、Adam Barth、Alex Russell、Ali Asad、Arun Ranganathan、 Brian Smith、Brian Warner、Channy Yun、Charles Engelke、Eric Roman、Glenn Adams、Jim Schaad、Kai Engert、 Michael Hutchinson、Michael B. Jones、Nick Van den Bleeken、Richard Barnes、Ryan Hurst、 Tim Taubert、Vijay Bharadwaj、Virginie Galindo、およびWan-Teh Changに感謝します。

W3C Web Cryptography WG、および public-webcrypto@w3.orgメーリングリストの参加者に感謝します。

W3Cは、W3C/MITを支援したNorthrop Grumman Cybersecurity Research Consortiumに感謝します。

getRandomValues メソッドは、Cryptoインターフェイスにおいて、Adam Barthによって WHATWGへ最初に提案されました。

A. JSON Web Key / JSON Web Algorithm間の対応付け

このセクションは非規範的です。

JWKのインポートおよびエクスポートに関する 規範的要件については、アルゴリズム固有のセクションを参照してください。

A.1 アルゴリズム対応付け

JSON Web Key AlgorithmIdentifier
{ kty: "RSA",
  alg: "RS1" }
{ name: "RSASSA-PKCS1-v1_5",
  hash: { name: "SHA-1" }
}
{ kty: "RSA",
  alg: "RS256" }
{ name: "RSASSA-PKCS1-v1_5",
  hash: { name: "SHA-256" }
}
{ kty: "RSA",
  alg: "RS384" }
{ name: "RSASSA-PKCS1-v1_5",
  hash: { name: "SHA-384" }
}
{ kty: "RSA",
  alg: "RS512" }
{ name: "RSASSA-PKCS1-v1_5",
  hash: { name: "SHA-512" }
}
{ kty: "RSA",
  alg: "PS256" }
{ name: "RSA-PSS",
  hash: { name: "SHA-256" }
}
{ kty: "RSA",
  alg: "PS384" }
{ name: "RSA-PSS",
  hash: { name: "SHA-384" }
}
{ kty: "RSA",
  alg: "PS512" }
{ name: "RSA-PSS",
  hash: { name: "SHA-512" }
}
{ kty: "RSA",
  alg: "RSA-OAEP" }
{ name: "RSA-OAEP",
  hash: { name: "SHA-1" }
}
{ kty: "RSA",
  alg: "RSA-OAEP-256" }
{ name: "RSA-OAEP",
  hash: { name: "SHA-256" }
}
{ kty: "RSA",
  alg: "RSA-OAEP-384" }
{ name: "RSA-OAEP",
  hash: { name: "SHA-384" }
}
{ kty: "RSA",
  alg: "RSA-OAEP-512" }
{ name: "RSA-OAEP",
  hash: { name: "SHA-512" }
}
{ kty: "EC",
  alg: "ES256" }
{ name: "ECDSA",
  namedCurve: "P-256",
  hash: { name: "SHA-256" }
}
{ kty: "EC",
  alg: "ES384" }
{ name: "ECDSA",
  namedCurve: "P-384",
  hash: { name: "SHA-384" }
}
{ kty: "EC",
  alg: "ES512" }
{ name: "ECDSA",
  namedCurve: "P-521",
  hash: { name: "SHA-512" }
}
{ kty: "OKP",
  crv: "Ed25519",
  alg: "Ed25519" }
{ name: "Ed25519" }
{ kty: "OKP",
  crv: "X25519" }
{ name: "X25519" }
{ kty: "oct",
  alg: "A128CTR" }
{ name: "AES-CTR",
  length: 128 }
{ kty: "oct",
  alg: "A192CTR" }
{ name: "AES-CTR",
  length: 192 }
{ kty: "oct",
  alg: "A256CTR" }
{ name: "AES-CTR",
  length: 256 }
{ kty: "oct",
  alg: "A128CBC" }
{ name: "AES-CBC",
  length: 128 }
{ kty: "oct",
  alg: "A192CBC" }
{ name: "AES-CBC",
  length: 192 }
{ kty: "oct",
  alg: "A256CBC" }
{ name: "AES-CBC",
  length: 256 }
{ kty: "oct",
  alg: "A128KW" }
{ name: "AES-KW",
  length: 128 }
{ kty: "oct",
  alg: "A192KW" }
{ name: "AES-KW",
  length: 192 }
{ kty: "oct",
  alg: "A256KW" }
{ name: "AES-KW",
  length: 256 }
{ kty: "oct",
  alg: "A128GCM" }
{ name: "AES-GCM",
  length: 128 }
{ kty: "oct",
  alg: "A192GCM" }
{ name: "AES-GCM",
  length: 192 }
{ kty: "oct",
  alg: "A256GCM" }
{ name: "AES-GCM",
  length: 256 }
{ kty: "oct",
  alg: "A128GCMKW" }
{ name: "AES-GCM",
  length: 128 }
{ kty: "oct",
  alg: "A192GCMKW" }
{ name: "AES-GCM",
  length: 192 }
{ kty: "oct",
  alg: "A256GCMKW" }
{ name: "AES-GCM",
  length: 256 }
{ kty: "oct",
  alg: "HS1" }
{ name: "HMAC",
  hash: { name: "SHA-1" }
}
{ kty: "oct",
  alg: "HS256" }
{ name: "HMAC",
  hash: { name: "SHA-256" }
}
{ kty: "oct",
  alg: "HS384" }
{ name: "HMAC",
  hash: { name: "SHA-384" }
}
{ kty: "oct",
  alg: "HS512" }
{ name: "HMAC",
  hash: "SHA-512" }

B. Algorithmと SubjectPublicKeyInfoの対応付け

このセクションは非規範的です。

SPKIのインポートおよびエクスポートに関する 規範的要件については、アルゴリズム固有のセクションを参照してください。

Algorithm OID subjectPublicKey ASN.1構造 AlgorithmIdentifier 参照
rsaEncryption (1.2.840.113549.1.1.1) RSAPublicKey "RSASSA-PKCS1-v1_5"、 "RSA-PSS"、または "RSA-OAEP" [RFC3447]
id-ecPublicKey (1.2.840.10045.2.1) ECPoint "ECDH"または"ECDSA" [RFC5480]
id-Ed25519 (1.3.101.112) BIT STRING "Ed25519" [RFC8410]
id-X25519 (1.3.101.110) BIT STRING "X25519" [RFC8410]
注記

この仕様で使用されるオブジェクト識別子には、 鍵がどの特定のアルゴリズムおよびハッシュとともに 使用されることを意図しているかに関する情報は含まれません。 これが必要な場合は、代わりに"jwk" 鍵形式を使用することが推奨されます。

C. Algorithmと PKCS#8 PrivateKeyInfoの対応付け

このセクションは非規範的です。

PKCS#8 PrivateKeyInfoのインポートおよびエクスポートに関する 規範的要件については、アルゴリズム固有のセクションを参照してください。

privateKeyAlgorithm privateKey形式 AlgorithmIdentifier 参照
rsaEncryption (1.2.840.113549.1.1.1) RSAPrivateKey "RSASSA-PKCS1-v1_5"、 "RSA-PSS"、または "RSA-OAEP" [RFC3447]
id-ecPublicKey (1.2.840.10045.2.1) ECPrivateKey "ECDH"または"ECDSA" [RFC5480]
id-Ed25519 (1.3.101.112) CurvePrivateKey "Ed25519" [RFC8410]
id-X25519 (1.3.101.110) CurvePrivateKey "X25519" [RFC8410]

D. 参考文献

D.1 規範的参考文献

[DOM]
DOM Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMA-262]
ECMAScript Language Specification. Ecma International. URL: https://tc39.es/ecma262/multipage/
[encoding]
Encoding Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://encoding.spec.whatwg.org/
[FIPS-180-4]
FIPS PUB 180-4: Secure Hash Standard (SHS). U.S. Department of Commerce/National Institute of Standards and Technology. August 2015. National Standard. URL: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf
[FIPS-198-1]
The Keyed-Hash Message Authentication Code (HMAC). NIST. July 2008. URL: http://csrc.nist.gov/publications/fips/fips198-1/FIPS-198-1_final.pdf
[HTML]
HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[Infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[JWA]
JSON Web Algorithms (JWA). M. Jones. IETF. May 2015. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7518
[JWK]
JSON Web Key (JWK). M. Jones. IETF. May 2015. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7517
[NIST-SP800-38A]
NIST Special Publication 800-38A: Recommendation for Block Cipher Modes of Operation, Methods and Techniques. NIST. December 2001. URL: http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
[NIST-SP800-38D]
NIST Special Publication 800-38D: Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC. NIST. November 2007. URL: http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC2141]
URN Syntax. R. Moats. IETF. May 1997. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc2141
[RFC2315]
PKCS #7: Cryptographic Message Syntax Version 1.5. B. Kaliski. IETF. March 1998. Informational. URL: https://www.rfc-editor.org/rfc/rfc2315
[RFC3394]
Advanced Encryption Standard (AES) Key Wrap Algorithm. J. Schaad; R. Housley. IETF. September 2002. Informational. URL: https://www.rfc-editor.org/rfc/rfc3394
[RFC3447]
Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1. J. Jonsson; B. Kaliski. IETF. February 2003. Informational. URL: https://www.rfc-editor.org/rfc/rfc3447
[RFC4122]
A Universally Unique IDentifier (UUID) URN Namespace. P. Leach; M. Mealling; R. Salz. IETF. July 2005. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc4122
[RFC5208]
Public-Key Cryptography Standards (PKCS) #8: Private-Key Information Syntax Specification Version 1.2. B. Kaliski. IETF. May 2008. Informational. URL: https://www.rfc-editor.org/rfc/rfc5208
[RFC5280]
Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile. D. Cooper; S. Santesson; S. Farrell; S. Boeyen; R. Housley; W. Polk. IETF. May 2008. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc5280
[RFC5480]
Elliptic Curve Cryptography Subject Public Key Information. S. Turner; D. Brown; K. Yiu; R. Housley; T. Polk. IETF. March 2009. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc5480
[RFC5869]
HMAC-based Extract-and-Expand Key Derivation Function (HKDF). H. Krawczyk; P. Eronen. IETF. May 2010. Informational. URL: https://www.rfc-editor.org/rfc/rfc5869
[RFC5915]
Elliptic Curve Private Key Structure. S. Turner; D. Brown. IETF. June 2010. Informational. URL: https://www.rfc-editor.org/rfc/rfc5915
[RFC6090]
Fundamental Elliptic Curve Cryptography Algorithms. D. McGrew; K. Igoe; M. Salter. IETF. February 2011. Informational. URL: https://www.rfc-editor.org/rfc/rfc6090
[RFC7748]
Elliptic Curves for Security. A. Langley; M. Hamburg; S. Turner. IETF. January 2016. Informational. URL: https://www.rfc-editor.org/rfc/rfc7748
[RFC8018]
PKCS #5: Password-Based Cryptography Specification Version 2.1. K. Moriarty, Ed.; B. Kaliski; A. Rusch. IETF. January 2017. Informational. URL: https://www.rfc-editor.org/rfc/rfc8018
[RFC8032]
Edwards-Curve Digital Signature Algorithm (EdDSA). S. Josefsson; I. Liusvaara. IETF. January 2017. Informational. URL: https://www.rfc-editor.org/rfc/rfc8032
[RFC8037]
CFRG Elliptic Curve Diffie-Hellman (ECDH) and Signatures in JSON Object Signing and Encryption (JOSE). I. Liusvaara. IETF. January 2017. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8037
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC8410]
Algorithm Identifiers for Ed25519, Ed448, X25519, and X448 for Use in the Internet X.509 Public Key Infrastructure. S. Josefsson; J. Schaad. IETF. August 2018. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8410
[SEC1]
SEC 1: Elliptic Curve Cryptography. Certicom Research. URL: http://www.secg.org/sec1-v2.pdf
[WebIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/
[X690]
Information technology - ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER). Justin Uberti; Cullen Jennings; Eric Rescorla. ITU-T. November 2008. ITU-T Recommendation. URL: https://tools.ietf.org/html/draft-ietf-rtcweb-jsep/

D.2 参考情報的参考文献

[INDEXEDDB]
Indexed Database API. Nikunj Mehta; Jonas Sicking; Eliot Graff; Andrei Popescu; Jeremy Orlow; Joshua Bell. W3C. 8 January 2015. W3C Recommendation. URL: https://www.w3.org/TR/IndexedDB/