Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
この仕様は、ハッシュ化、 署名の生成と検証、暗号化と復号などの、 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 プロセス文書に準拠します。
このセクションは非規範的です。
Web Cryptography APIは、ユーザーエージェントによって管理または公開される暗号用 鍵材料とやり取りするための低水準インターフェイスを定義します。このAPI自体は 鍵ストレージの基盤実装に依存しませんが、リッチWebアプリケーションが 生の鍵材料へのアクセスを必要とせずに、署名の生成と検証、 ハッシュ化と検証、暗号化と復号などの操作を実行できる 共通のインターフェイス群を提供します。
暗号変換は、
SubtleCryptoインターフェイスを介して公開されます。このインターフェイスは、一般的な
暗号操作を実行するための一連のメソッドを定義します。署名の生成と
検証、ハッシュ化と検証、暗号化と復号などの操作に加えて、
このAPIは、鍵生成、鍵導出、鍵のインポートとエクスポートのためのインターフェイスを提供します。
このセクションは非規範的です。
Webアプリケーションは、既存のユーザー名/パスワードベースの 認証方式を、ユーザーが何らかの秘密鍵材料へアクセスできることの証明に基づく 認証方法で拡張または置換したい場合があります。TLSクライアント証明書などの トランスポート層認証を使用する代わりに、 Webアプリケーションは、アプリケーション自体の内部で認証することによって提供される、より豊かなユーザー 体験を選好する場合があります。
Web Cryptography APIを使用すると、アプリケーションは適切なクライアント鍵を見つけることができます。その鍵は、 ユーザーエージェントを介して以前に生成されたもの、または Webアプリケーションによって帯域外で事前にプロビジョニングされたものかもしれません。次に、認証 チャレンジを復号し、その後に認証レスポンスへ署名するなどの暗号操作を実行できます。
この交換は、基盤となるトランスポートのプロパティに基づいて鍵を導出することにより、 クライアントが認証を行っているTLS セッションに認証を結び付けることで、さらに強化できます。
ユーザーがまだ自分のアカウントに関連付けられた鍵を持っていない場合、 Webアプリケーションは、ユーザーエージェントに新しい鍵を生成させるか、 ユーザーが選択した既存の鍵を再利用させることができます。
Webアプリケーションは、機密情報または個人情報を含む文書について、 TLS越しなどでそれらの文書が安全に受信された場合であっても、閲覧者を制限したい場合があります。
Web Cryptography APIを使用すると、アプリケーションは、文書を 秘密鍵で暗号化し、その鍵を許可された閲覧者に関連付けられた 公開鍵でラップすることによって、これを行うことができます。ユーザーエージェントがそのようなWebアプリケーションへ移動すると、 アプリケーションは文書の暗号化形式を送信します。次に、ユーザーエージェントは、 ユーザーの秘密鍵を使用して暗号化鍵をアンラップし、そこから 文書を復号して表示するよう指示されます。
Webアプリケーションは、アップロード前に、リモートサービスプロバイダーに保存されるデータおよび 文書の機密性をユーザーが保護できるようにしたい場合があります。
Web Cryptography APIを使用すると、アプリケーションはユーザーに秘密鍵または 私有鍵を選択させ、任意で選択された鍵から暗号化鍵を導出し、 文書を暗号化してから、既存のAPIを使用して暗号化されたデータをサービスプロバイダーへアップロードできます。
このユースケースは、保護された文書 交換ユースケースに似ていますが、文書の閲覧者がユーザー本人に限定されます。
Webアプリケーションは、物理的な署名を要求する代わりに、 文書への電子署名を受け入れたい場合があります。
Web Cryptography APIを使用すると、アプリケーションはユーザーに鍵を選択させることができます。 その鍵は帯域外で事前にプロビジョニングされていたもの、またはWeb アプリケーション専用に生成されたものかもしれません。この鍵を使用して、アプリケーションは、 ユーザーが文書を承諾した証拠として、何らかの データに対して署名操作を実行できます。
Webアプリケーションは、データをローカルにキャッシュしつつ、このデータが オフライン攻撃で変更されないことを保証したい場合があります。
Web Cryptography APIを使用すると、アプリケーションは、アプリケーション内に含まれる 公開鍵を使用して、データキャッシュの内容を検証できます。以前にデータが キャッシュへ追加されたとき、そのデータは対応する秘密鍵でサーバーによって署名されていたことになります。 キャッシュからデータを復元するときに署名を検証することで、クライアントは、 キャッシュされたデータが改ざんされていないことを保証します。
Webアプリケーションは、これらのメッセージがTLS越しなどで 安全に受信された場合であっても、off-the-record (OTR) メッセージングなどの方式を使用して メッセージ層セキュリティを採用したい場合があります。
Web Cryptography APIは、鍵合意を実行できるようにすることで、OTRおよび同様のメッセージ署名方式を可能にします。 二者は、共有暗号化鍵および メッセージ認証コード (MAC) 鍵を交渉し、メッセージの暗号化と復号を可能にし、 改ざんを防止できます。
Webアプリケーションは、IETF JavaScript Object Signing and Encryption (JOSE) Working Groupによって 定義された構造およびメッセージ形式とやり取りしたい場合があります。
Web Cryptography APIを使用すると、アプリケーションはJSON鍵形式 (JWK) で符号化された 鍵を読み取りおよびインポートし、デジタル署名またはMAC (JWS) を使用して 完全性が保護されたメッセージを検証したり、暗号化されたメッセージ (JWE) を復号したりできます。
非規範的とマークされたセクションと同様に、この 仕様内のすべての作成ガイドライン、図、例、注記は非規範的です。この仕様内のそれ以外のすべては規範的です。
この文書内のキーワード MUST、REQUIRED、およびSHALL は、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] で説明されるように解釈されます。
次の適合性クラスは、この仕様によって定義されます:
ユーザーエージェントは、 実装に適用されるこの仕様内のすべてのMUSTレベル、 REQUIREDレベル、およびSHALLレベルの 基準を満たす場合、 適合ユーザーエージェント であると見なされます。この仕様は、この 製品クラスを指すために、「適合ユーザーエージェント」と「ユーザーエージェント」の両方の用語を使用します。
アルゴリズムまたは特定のステップとして表現された適合性要件は、 最終結果が同等である限り、任意の方法で実装できます。(特に、この 仕様で定義されるアルゴリズムは、従いやすいことを意図しており、高性能であることを意図していません。)
ECMAScriptを使用してこの仕様で定義されるAPIを実装するユーザーエージェントは、 この仕様がその仕様および用語を使用しているため、 Web IDL仕様 [WebIDL] で定義される ECMAScriptバインディングと整合する方法でそれらを実装しなければなりません。
特に明記されない限り、文字列比較は
大文字小文字を区別する方法で行われます。この仕様内で
「this」のように等幅フォントで書かれる文字列リテラルには、囲み引用符は含まれません。
この仕様に対するベンダー固有の独自拡張は、強く非推奨です。 作者はそのような拡張を使用してはなりません。そうすることは相互運用性を低下させ、 ユーザーベースを断片化し、特定のユーザーエージェントのユーザーだけが 対象のコンテンツへアクセスできるようにするためです。
ベンダー固有の拡張が必要な場合、メンバーには、この仕様の将来バージョンとの 衝突を防ぐために、ベンダー固有の文字列を接頭辞として付けるべきです。 拡張は、拡張の使用が仕様内で定義された機能に矛盾せず、 その機能を非適合にしないように定義されなければなりません。
この仕様に対するベンダー中立の拡張が必要な場合、この 仕様をそれに応じて更新するか、この仕様内の要件を上書きする 拡張仕様を書くことができます。この仕様を自らの活動に適用する者が、 そのような拡張仕様の要件を認識すると決定した場合、それはこの仕様内の 適合性要件の目的における 適用可能仕様になります。 W3C Web Cryptography Working Groupによって定義された適用可能仕様は、 下の表に列挙されています。
| 仕様 | 参照 |
このセクションは非規範的です。
この仕様は、さまざまなプラットフォーム固有または標準化された 暗号API間で共通する機能と特徴に焦点を当て、 1つまたは2つの実装に固有の特徴や機能を避けるよう試みています。そのため、このAPIは、 開発者が基盤となる鍵ストレージの実装を意識する必要を避ける抽象化レベルで、 鍵の生成、管理、および交換を可能にします。 このAPIは、基盤となる生の暗号用鍵材料に対する抽象化として、 CryptoKeyオブジェクトを中心に具体的に焦点を当てています。この背後にある意図は、 適合ユーザーエージェントが、ユーザーエージェントによって直接保存および 管理される鍵、一部のオペレーティングシステムが提供するユーザーごとの鍵ストアなどの 分離ストレージAPIを使用して保存または管理される可能性がある鍵、 またはセキュア要素などの鍵ストレージデバイス内にある鍵を公開できるほど十分に汎用的なAPIを可能にしつつ、 リッチWebアプリケーションが鍵を操作でき、 Webアプリケーションが基盤となる鍵ストレージの性質を認識する必要がないようにすることです。
基盤となる暗号実装は適合ユーザーエージェント間で異なり、 政府または業界の規制、セキュリティのベストプラクティス、知的財産に関する 懸念、制約された運用環境などを含むがこれらに限定されないローカルポリシーの対象となる可能性があるため、 この仕様は、実装されなければならないアルゴリズムの必須セットを 指定しません。代わりに、アルゴリズムに依存しない方法で使用できる 共通のバインディング群、ユーザーエージェントまたは鍵ハンドルが基盤となるアルゴリズムを サポートしているかどうかを発見するための共通フレームワーク、および個々のアルゴリズムが 実装される場合におけるその動作の適合性要件群を定義します。
このAPIは、アプリケーションが鍵材料を生成、取得、および操作できるようにしますが、 セキュア要素やスマートカードなど、特定の種類の 鍵ストレージにおける鍵のプロビジョニングを具体的に扱うものではありません。これは、そのようなプロビジョニング 操作には、ベンダーに依存しないインターフェイスの定義を不適切に際限のない作業にする ベンダー固有の詳細が伴うことが多いためです。さらに、このAPIは 暗号モジュールの発見を扱わず、また対処もしません。そのような概念は 基盤となるユーザーエージェントに依存し、一般的なオペレーティングシステム、 暗号ライブラリ、および実装間で移植可能な概念ではないためです。
このセクションは非規範的です。
この仕様は、適合ユーザーエージェントがユーザーエージェント 自体の内部で暗号操作を直接実装しておらず、 今後もそうしないことを仮定しますが、要求はしません。歴史的に、多くのユーザーエージェントは、 TLS内で使用されるものなどの暗号操作を、基盤となる オペレーティングシステムの一部として利用可能な既存のAPI、またはユーザー エージェントとは独立して管理される第三者モジュールへ委ねてきました。
CryptoKeyオブジェクトは、
[[handle]]という名前の内部スロットの使用を通じて、
JavaScript実行環境とこれらの基盤ライブラリとの間の橋渡しを表します。ハンドルは、
実装固有の不透明な型を表し、JavaScript型内では表現されない可能性があり、
スクリプト作者へ公開されることもありません。このように、
CryptoKeyオブジェクトは、JavaScript
実行環境にとって、基盤となる暗号
実装にとっての
[[handle]]と概念的に等価です。
これらのAPIは、伝統的に、暗号プロバイダーという概念を中心に構築されています。これは、 一連のアルゴリズムの特定の実装に対する抽象化です。オペレーティングシステム またはライブラリには既定のプロバイダーが付属している場合があり、ユーザーはしばしば 追加のプロバイダーを追加したり、有効なアルゴリズムのセットを再構成したり、 暗号サービスの提供方法をその他の形でカスタマイズしたりすることができます。
ほとんどのユーザーエージェントは純粋にソフトウェアで実装された暗号 プロバイダーとやり取りするものと仮定されますが、この 仕様ではそれを要求しません。その結果、一部の実装の能力は 基盤となるハードウェアの能力によって制限される可能性があり、また、ユーザーが 基盤となる暗号ライブラリをどのように構成したかによっては、これは ユーザーエージェントにとって完全に不透明である可能性があります。
この仕様は、
CryptoKeyオブジェクト用の新しいストレージ機構を明示的に提供しません。代わりに、
シリアル化および逆シリアル化手順を
CryptoKeyオブジェクトについて定義することにより、
シリアル化可能オブジェクトの保存をサポートする任意の既存または将来のWebストレージ
機構を使用して、CryptoKeyオブジェクトを保存できます。
実際には、ほとんどの作者は
Indexed Database API [INDEXEDDB] を利用することが想定されます。これは、
キーがアプリケーションにとって意味のある何らかの文字列識別子であり、
値がCryptoKeyオブジェクトである、キー/値ペアの連想ストレージを可能にします。これにより、
鍵材料をアプリケーションまたはJavaScript環境へ公開することなく、
鍵材料の保存と取得が可能になります。さらに、これにより作者は、
任意の追加メタデータを
CryptoKey自体とともに保存する完全な柔軟性を得られます。
このセクションは非規範的です。
明示的なストレージ機構を提供しないことにより、この仕様は、
CryptoKeyオブジェクトが現在の実行
環境、およびその環境で利用可能な任意のストレージ機構(例:
Indexed Database API)にスコープされることを想定しています。アプリケーション作者は、
自身のアプリケーションのセキュリティについてこれに依存します。同じ
CryptoKeyオブジェクトを持つ2つのオリジンは、基盤となる
鍵への完全なアクセスを持ちます。
そのため、これらのアプリケーションからのメッセージは区別できず、これらのアプリケーションへ送信された
メッセージは完全に復元できます。実装者は、作者が明示的に共有を選択していない限り
(例: postMessageの使用を通じて)、
CryptoKeyオブジェクトが2つのオリジン間で共有されないことを
確実にすべきです
この仕様内で指定される多数のアルゴリズムは、かなり大きな素数の生成や、 特定の操作の反復実行など、計算量の多い処理を実行します。そのため、 悪意あるアプリケーションは、このAPIを誤用し、実装に大量の処理を 実行させようとして、実行中の他のアプリケーションへのアクセスまたはサービスを拒否する可能性があります。 実装は、実装が同時に実行する操作数を制限する、 実行環境に対して破壊的であることが知られている操作についてユーザーの同意を要求する、 または鍵サイズや反復回数などの属性に対してデバイス固有の制限を定義するなど、 これらのリスクを軽減する手段を講じるべきです。
この仕様には、さまざまな暗号操作についての説明が含まれており、その一部には 不適切に使用された場合に既知の弱点があります。アプリケーション開発者は注意を払い、 そのような問題を理解して軽減するために、適切かつ最新の暗号関連文献を確認しなければなりません。 一般に、アプリケーション開発者が新しい暗号プロトコルを発明することは 強く推奨されません。すべてのアプリケーションと同様に、この仕様の 利用者は、既存のプロトコルを使用することで最もよく支援されます。この仕様は、それらを 実装するために必要な構成要素を提供します。
この仕様で定義されるAPIを使用して意味のある暗号上の保証を提供するためには、 作者は、Webアプリケーションに対する既存の脅威、および採用されている基盤となる セキュリティモデルに精通していなければなりません。概念的には、スクリプトインジェクションなどの 問題は、他の運用環境におけるリモートコード実行と同等であり、悪意ある スクリプトの注入を許可すると、鍵またはデータの流出を可能にすることがあります。 スクリプトインジェクションは他のアプリケーションから発生する場合があり、その場合は Content Security Policyの慎重な使用によって軽減できることがあります。また、 悪意あるネットワーク仲介者から発生する場合があり、その場合はTransport Layer Securityの使用によって軽減できることがあります。
この仕様は、暗号鍵の保存のための特定の機構を定義しません。
既定では、Indexed Database APIの使用など、作者が鍵を永続化するための
特別な努力をしない限り、このAPIで作成された鍵は現在のページの存続期間
(例: ナビゲーションイベントまで)のみ有効です。異なるページ間または
複数の閲覧セッション間で同じ鍵を使用したい作者は、既存のWebストレージ技術を
採用しなければなりません。作者は、これらの技術のセキュリティ上の前提、
たとえば同一オリジンセキュリティモデルに注意すべきです。すなわち、同じスキーム、ホスト、
およびポートを共有する任意のアプリケーションは、パスなどの他の情報が異なっていても、
同じストレージパーティションへアクセスできます。作者は、postMessageなどの
オリジン間共有の使用を通じて、このセキュリティを明示的に緩和することを選択できます。
作者は、この仕様が、基盤となる暗号鍵材料がどのように保存されるかについて、
実装に規範的な要件を課していないことに注意すべきです。唯一の
要件は、鍵材料が
exportKeyおよびwrapKey操作の使用を通じる場合を除き、スクリプトへ公開されないことです。特に、
基盤となる暗号鍵材料がディスクへ永続化されないこと、場合によっては暗号化されずに
永続化されないこと、またユーザーまたはユーザーエージェントと同じ権限で実行される他の
アプリケーションからアクセス不能であることは保証されません。デバイスストレージへアクセスできる
任意のアプリケーションまたはユーザーは、スクリプトでは禁止されている場合であっても、
鍵材料を復元できる可能性があります。
この仕様は、すべての参照がなくなった後に実装が鍵材料をどのように扱うかについて、
規範的な要件を課していません。すなわち、適合ユーザーエージェントは
鍵材料をゼロ化することを要求されず、CryptoKeyへのすべての
参照がなくなった後であっても、デバイスストレージまたは
デバイスメモリ上で依然としてアクセス可能である可能性があります。
アプリケーションは、構造化複製アルゴリズムおよび
postMessageなどのAPIの使用を通じて、オリジンなどのセキュリティ
境界を越えてCryptoKeyオブジェクトを共有できます。
基盤となる暗号鍵
材料へのアクセスは、extractable
属性に基づいて制限される場合がありますが、いったん鍵が宛先オリジンと共有されると、
送信元オリジンは後からその鍵へのアクセスを制限または取り消すことはできません。
そのため、作者は、宛先オリジンが、送信元オリジンが採用しているものと同じ
悪意あるスクリプトに対する軽減策を講じると信頼できることを慎重に確認しなければなりません。
さらに、送信元オリジンでスクリプトインジェクションが発生した場合、攻撃者は
攻撃者が制御するオリジンへ鍵を投稿する可能性があります。ユーザーエージェントが攻撃者の
オリジンを訪問するたびに、ユーザーエージェントは、その鍵を使用して既存のメッセージの復号や
新しい不正なメッセージの作成などの暗号操作を実行するよう指示される可能性があります。
作者は、ユーザーがいつでもオリジンに関連付けられたストレージを消去することを選択でき、 その結果として鍵が破棄される可能性があることに注意すべきです。サーバー上などで 長期保存を提供することを意図したアプリケーションは、そのようなデータがアクセス不能になることを 防ぐために、鍵エスクローなどの技法を検討すべきです。作者は、鍵が 無期限に利用可能であると推定すべきではありません。
この仕様で定義されるAPIを使用するアプリケーションのユーザーは、 採用されている暗号にかかわらず、これらのアプリケーションが交換されるすべてのメッセージへ 完全にアクセスできることに注意すべきです。すなわち、暗号化されたメッセージについても、 これらのAPIを使用するアプリケーションは復号されたメッセージにも完全にアクセスできます。
このセクションは非規範的です。
randomUUIDの使用
randomUUIDはユーザー
IDの生成に有用ですが、グローバル
識別子を生成する能力を直接与えるものではありません。
この仕様は基盤となる仕様に依存します。
適合ユーザーエージェントは、
少なくともこの仕様が依存するDOMで定義された機能の部分集合をサポート
しなければなりません。特に、Promiseおよび
DOMExceptionをサポート
しなければなりません。
[DOM]
適合ユーザーエージェントは、
少なくともこの仕様が依存するHTMLで定義された機能の部分集合をサポート
しなければなりません。特に、
ArrayBufferView typedef
およびシリアル化可能オブジェクトをサポートしなければなりません。
[HTML]
適合ユーザーエージェントは、 Web IDL仕様で説明されるように、この仕様内のIDL断片の 適合実装でなければなりません。[WebIDL]
用語
ArrayBuffer、
ArrayBufferView、および
シリアル化可能
オブジェクトは、
HTML仕様 [HTML] によって定義されます。
用語DOMStringおよび
BufferSourceは、
[WEBIDL] で定義されます。
バイトシーケンスのビット長は、その 長さに 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 構造を解析すると言うとき、ユーザーエージェントは次のステップを実行しなければなりません:
dataを、解析されるバイト列とします。
structureを、解析されるASN.1構造とします。
exactDataを任意のブール値とします。指定されていない場合、
trueに初期化されるものとします。
[X690] の Distinguished Encoding Rulesに従って、structureを復号される ASN.1構造として使用し、dataを解析します。
exactDataが指定されていて、dataのすべてのバイトが
解析フェーズ中に消費されなかった場合、
throw a
DataError.
解析されたASN.1構造を返します。
この仕様が、subjectPublicKeyInfoを
解析すると言うとき、ユーザーエージェントは
ASN.1構造を解析する必要があり、
dataを解析されるバイト列に設定し、structureを
[RFC5280]
で指定される
subjectPublicKeyInfoのASN.1構造とし、
exactDataをtrueに設定します。
この仕様が、PrivateKeyInfoを
解析すると言うとき、ユーザーエージェントは、dataを
解析されるバイト列に設定し、
structureを
[RFC5208]
で指定されるPrivateKeyInfoのASN.1構造とし、
exactDataをtrueに設定して、ASN.1構造を解析する必要があります。
この仕様が、JWKを解析すると言うとき、ユーザー エージェントは次のステップを実行しなければなりません:
dataを、解析されるバイト列とします。
jsonを、dataをUTF-8に従って解釈した結果である Unicode文字列とします。
jsonをUTF-16へ変換します。
resultを、新しいグローバルオブジェクトのコンテキストで
JSON.parse内部関数を実行した結果のオブジェクトリテラルとし、
text引数にはjsonを含むJavaScript Stringを設定します。
keyを、resultを
JsonWebKeyのIDL辞書型へ変換した結果とします。
keyを返します。
この仕様が、2つのシーケンスaおよびbの用途の 積集合を計算すると言うとき、その結果は、 aとbの両方に現れる各認識される鍵用途値を、 認識される鍵用途値のリストに列挙された順序で含む シーケンスでなければなりません。ここで、ある値がシーケンス内に現れるとは、その値に対して 大文字小文字を区別する文字列一致となる要素がシーケンス内に存在することを意味します。
この仕様が、usagesという 用途リストの正規化値を計算すると言うとき、その結果は、 usagesと、すべての認識される鍵用途値を含むシーケンスとの 用途の積集合でなければなりません。
この仕様が、objectの内部スロット[[slot]]に関連付けられた キャッシュされたECMAScript オブジェクトを参照するとき、 ユーザーエージェントは次のステップを実行しなければなりません:
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();
};
getRandomValues
メソッドは、暗号的に強いランダム値を生成します。これは次のように動作しなければなりません:
arrayがInt8Array、Uint8Array、Uint8ClampedArray、
Int16Array、Uint16Array、Int32Array、Uint32Array、
BigInt64Array、
またはBigUint64Arrayでない場合、
throw a
TypeMismatchError
し、
アルゴリズムを終了する。
byteLengthを、arrayの バイト長とします。
byteLengthが65536より大きい場合、throw a
QuotaExceededError
し、
アルゴリズムを終了する。
bytesを、長さ byteLengthのバイトシーケンスとします。
bytesを暗号的に安全なランダムバイトで埋めます。
bytesを arrayへ書き込みます。
arrayを返します。
getRandomValuesメソッドを使用して鍵を生成してはなりません。代わりに
generateKeyメソッドを
使用してください。
randomUUID
メソッドは、新しいバージョン4
UUIDを生成し、
[RFC4122] の
セクション3で説明される
名前空間固有の
文字列表現を返します。
ランダムUUIDを生成するには:
0100に設定します。
10に設定します。
« の文字列連結を返します
-",
-",
-",
-",
»。
ランダムUUIDを生成するアルゴリズムで説明されるステップについて、
バイトvalueの16進表現とは、
valueをASCII小文字16進
数字を使用して16進で表し、
2つのASCII小文字16進
数字に達するように左側を"0"で埋めて作成される2文字の文字列です。
subtle属性は、
低水準の暗号プリミティブおよびアルゴリズムを提供する
SubtleCryptoインターフェイスの
インスタンスを提供します。
Algorithm
オブジェクトは、アルゴリズムおよび目的の操作を完全に指定するために必要な
任意の追加パラメーターを指定するために使用される辞書オブジェクト
[WEBIDL] です。
WebIDLtypedef (object or DOMString) AlgorithmIdentifier;
typedef AlgorithmIdentifier HashAlgorithmIdentifier;
dictionary Algorithm {
required DOMString name;
};
Algorithm辞書メンバーname
KeyAlgorithm辞書は、与えられた
CryptoKeyオブジェクトの内容に関する情報を表します。
WebIDLdictionary KeyAlgorithm {
required DOMString name;
};
このセクションは非規範的です。
KeyAlgorithm辞書は、
CryptoKeyの
固定された公開プロパティがどのようにアプリケーションへ反映されるかを文書化するのを助けるために提供されます。
実際の辞書型がアプリケーションへ公開されることはありません。
nameCryptoKeyを生成するために使用されたアルゴリズムの名前
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;
};
このセクションは非規範的です。
この仕様は、ユーザーエージェントによって管理される多くの異なる種類の鍵材料に対して 統一されたインターフェイスを提供します。これには、ユーザーエージェントによって生成された鍵、 ユーザーエージェントによって他の鍵から導出された鍵、ユーザー操作またはこのAPIの使用を通じて ユーザーエージェントへインポートされた鍵、ユーザーエージェントがアクセスできるソフトウェアまたはハードウェア内に 事前にプロビジョニングされた鍵、またはその他の方法でユーザーエージェントに利用可能にされた鍵が含まれる場合があります。 鍵という用語は、暗号操作のための実際の鍵、および鍵導出または交換操作内で得られる秘密値を含む、 任意の鍵材料を広く指します。
CryptoKeyオブジェクトは、基盤となる鍵ストレージ機構と直接インターフェイスすることを 要求されず、代わりに、暗号操作を実行するときなど、必要なときに 鍵材料を取得する方法をユーザーエージェントが理解するための参照であるだけの場合があります。
KeyTypepublic"、"private"、および"secret"です。
対称アルゴリズムに使用されるものを含む不透明な鍵材料は
secretで表され、一方、
public/private鍵ペアから構成される非対称アルゴリズムの一部として使用される鍵は、
publicまたはprivateのいずれかになります。
KeyUsageencrypt、
decrypt、
sign、
verify、
deriveKey、
deriveBits、
wrapKey、および
unwrapKeyです。
すべてのCryptoKeyオブジェクトは、
鍵に関する情報を格納する一連の内部スロットを持ちます。
これらのスロットは、この仕様の一部として公開されません。これらは、実装がこの仕様を
実装するために使用する内部状態を表します。
[ECMA-262] で使用される表記規約がここでも再利用されます。
内部スロットは、二重角括弧[[ ]]で囲まれた名前によって識別されます。
すべてのCryptoKeyオブジェクトは、
[[type]]、
[[extractable]]、
[[algorithm]]、
[[algorithm_cached]]、
[[usages]]、
[[usages_cached]]、
および
[[handle]]という名前の内部スロットを持ちます。
[[algorithm]]内部
スロットの内容は、KeyAlgorithmであるか、またはそれから導出されたものでなければなりません。
[[usages]]内部
スロットの内容は、Sequence<KeyUsage>型でなければなりません。
[[handle]]スロットは、
基盤となる暗号実装が論理鍵を表すために使用する任意のデータを含む不透明な型です。
異なる暗号実装は、整数として表される不透明識別子、ポインター型、または
識別情報を提供する構造体に至るまで、異なる型を使用する場合があります。
これらのハンドルがアプリケーションへ公開されることはありません。
type[[type]]内部
スロットを反映します。
extractable[[extractable]]内部
スロットを反映します。
algorithm[[algorithm]]内部スロットに関連付けられた
キャッシュされたECMAScriptオブジェクトを返します。
usages[[usages]]内部スロットに関連付けられた
キャッシュされたECMAScriptオブジェクトを返します。
CryptoKeyオブジェクトは、
シリアル化可能オブジェクトです。
valueおよびserializedが与えられたとき、その
シリアル化
手順は次のとおりです:
[[type]]内部スロットに設定します。
[[extractable]]内部スロットに設定します。
[[algorithm]]
内部スロットの
部分シリアル化に
設定します。
[[usages]]
内部スロットの
部分シリアル化に
設定します。
[[handle]]内部スロットに設定します。
serializedおよびvalueが与えられたとき、その 逆シリアル化 手順は次のとおりです:
[[type]]内部
スロットをserialized.[[Type]]に初期化します。
[[extractable]]内部スロットを
serialized.[[Extractable]]に初期化します。
[[algorithm]]内部スロットを、
serialized.[[Algorithm]]の
部分逆シリアル化に
初期化します。
[[usages]]
内部スロットを、
serialized.[[Usages]]の
部分逆シリアル化に
初期化します。
[[handle]]
内部スロットをserialized.[[Handle]]に初期化します。
CryptoKeyオブジェクトを
逆シリアル化するとき、そのオブジェクトが異なる型として逆シリアル化されないことが
重要です。これは
逆シリアル化
手順の定義によって規範的に要求されていますが、
そのような逆シリアル化は鍵材料の内容を公開する可能性があるため、特別な注意に値します。
その鍵材料は、場合によっては([[extractable]]内部スロットが
falseである場合など)アプリケーションへ公開されるべきではありません。
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インターフェイスを利用する開発者は、提供されるさまざまな アルゴリズムの設計および実装の両方に関連するセキュリティ上の懸念を 認識していることが期待されます。生のアルゴリズムは、開発者がさまざまな プロトコルおよびアプリケーションを実装する際に最大限の柔軟性を得られるように提供されます。 それらの各々は、生のアルゴリズムの使用を必要とする独自の方法で、 合成およびセキュリティパラメーターを表す可能性があります。
KeyFormatrawpkcs8spkijwkJsonWebKey辞書ですSubtleCryptoのメソッド呼び出しに応答して作成された
promiseを解決または拒否するためのタスクをキューに入れるために使用されます。
SubtleCryptoのメソッド呼び出しに対する応答の
順序について、複数の呼び出し間でも、呼び出しと他の
タスクソースからのタスクとの間でも、
特定の要件を課しません。このタスクソースは、暗号操作が完了したときにいつでも、
関連するpromiseを解決または拒否するためのタスクをキューに入れるためだけに使用され、
それによって
競合状態を
防止します。
すべてのエラーは、返された Promiseを拒否することによって非同期的に報告されます。これにはWeb IDLの型マッピングエラーも含まれます。
encrypt
メソッドは、指定された
AlgorithmIdentifier
を、供給されたCryptoKeyとともに使用してデータを暗号化する
新しいPromiseオブジェクトを返します。これは次のように動作しなければなりません:
algorithmおよびkeyを、
encrypt()
メソッドへ渡された
algorithmおよびkeyパラメーターとします。
dataを、
保持されているバイトのコピーを取得することの結果とします。対象は、
encrypt()
メソッドへ渡されたdataパラメーターです。
normalizedAlgorithmを、
algをalgorithmに設定し、opを
"encrypt"に設定して、
アルゴリズムを
正規化することの結果とします。
エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。
promiseを新しいPromiseとします。
promiseを返し、残りのステップを並列に実行します。
次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します。
normalizedAlgorithmの
nameメンバーが、
keyの
[[algorithm]]内部スロットの
name属性と等しくない場合、
InvalidAccessErrorを
throwします。
keyの
[[usages]]
内部スロットに、"encrypt"であるエントリが含まれていない場合、
InvalidAccessErrorを
throwします。
ciphertextを、normalizedAlgorithmによって指定されるencrypt 操作を、algorithmおよびkeyを使用し、 dataをplaintextとして実行した結果とします。
残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます。
resultを、ciphertextを含む
ArrayBufferを
realm内で作成することの結果とします。
promiseをresultで解決します。
decrypt
メソッドは、指定された
AlgorithmIdentifier
を、供給されたCryptoKeyとともに使用してデータを復号する
新しいPromiseオブジェクトを返します。これは次のように動作しなければなりません:
algorithmおよびkeyを、
decrypt()
メソッドへ渡された
algorithmおよびkeyパラメーターとします。
dataを、
保持されているバイトのコピーを取得することの結果とします。対象は、
decrypt()
メソッドへ渡されたdataパラメーターです。
normalizedAlgorithmを、
algをalgorithmに設定し、opを
"decrypt"に設定して、
アルゴリズムを
正規化することの結果とします。
エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。
promiseを新しいPromiseとします。
promiseを返し、残りのステップを並列に実行します。
次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します。
normalizedAlgorithmの
nameメンバーが、
keyの
[[algorithm]]内部スロットの
name属性と等しくない場合、
InvalidAccessErrorを
throwします。
keyの
[[usages]]
内部スロットに、"decrypt"であるエントリが含まれていない場合、
InvalidAccessErrorを
throwします。
plaintextを、normalizedAlgorithmによって指定されるdecrypt 操作を、keyおよびalgorithmを使用し、 dataをciphertextとして実行した結果とします。
残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます。
resultを、plaintextを含む
ArrayBufferを
realm内で作成することの結果とします。
promiseを resultで解決します。
signメソッドは、
指定されたAlgorithmIdentifierを、供給された
CryptoKeyとともに使用してデータに署名する
新しいPromiseオブジェクトを返します。これは次のように動作しなければなりません:
algorithmおよびkeyを、
sign()メソッドへ渡された
algorithmおよびkeyパラメーターとします。
dataを、
保持されているバイトのコピーを取得することの結果とします。対象は、
sign()メソッドへ渡された
dataパラメーターです。
normalizedAlgorithmを、
algをalgorithmに設定し、opを
"sign"に設定して、
アルゴリズムを
正規化することの結果とします。
エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。
promiseを新しいPromiseとします。
promiseを返し、残りのステップを並列に実行します。
次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します。
normalizedAlgorithmの
nameメンバーが、
keyの
[[algorithm]]内部スロットの
name属性と等しくない場合、
InvalidAccessErrorを
throwします。
keyの
[[usages]]
内部スロットに、"sign"であるエントリが含まれていない場合、
InvalidAccessErrorを
throwします。
signatureを、normalizedAlgorithmによって指定されるsign操作を、 keyおよび algorithmを使用し、dataをmessageとして実行した結果とします。
残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます。
resultを、signatureを含む
ArrayBufferを
realm内で作成することの結果とします。
promiseを resultで解決します。
verifyメソッドは、
指定されたAlgorithmIdentifierを、供給された
CryptoKeyとともに使用してデータを検証する
新しいPromiseオブジェクトを返します。これは次のように動作しなければなりません:
algorithmおよびkeyを、
verify()
メソッドへ渡されたalgorithmおよびkeyパラメーターとします。
signatureを、
保持されているバイトのコピーを取得することの結果とします。対象は、
verify()
メソッドへ渡されたsignatureパラメーターです。
dataを、
保持されているバイトのコピーを取得することの結果とします。対象は、
verify()
メソッドへ渡されたdataパラメーターです。
normalizedAlgorithmを、
algをalgorithmに設定し、opを
"verify"に設定して、
アルゴリズムを
正規化することの結果とします。
エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。
promiseを新しいPromiseとします。
promiseを返し、残りのステップを並列に実行します。
次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します。
normalizedAlgorithmの
nameメンバーが、
keyの
[[algorithm]]内部スロットの
name属性と等しくない場合、
InvalidAccessErrorを
throwします。
keyの
[[usages]]
内部スロットに、"verify"であるエントリが含まれていない場合、
InvalidAccessErrorを
throwします。
resultを、normalizedAlgorithmによって指定されるverify操作を、 key、 algorithmおよび signatureを使用し、dataをmessageとして実行した結果とします。
残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます。
promiseを resultで解決します。
digestメソッドは、
指定された
AlgorithmIdentifierを使用して
データをダイジェストする新しいPromiseオブジェクトを返します。
これは次のように動作しなければなりません:
algorithmを、
digest()
メソッドへ渡されたalgorithmパラメーターとします。
dataを、
保持されているバイトのコピーを取得することの結果とします。対象は、
digest()
メソッドへ渡されたdataパラメーターです。
normalizedAlgorithmを、
algをalgorithmに設定し、opを
"digest"に設定して、
アルゴリズムを
正規化することの結果とします。
エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。
promiseを新しいPromiseとします。
promiseを返し、残りのステップを並列に実行します。
次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します。
digestを、normalizedAlgorithmによって指定されるdigest 操作を、algorithmを使用し、dataを messageとして実行した結果とします。
残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます。
resultを、digestを含む
ArrayBufferを
realm内で作成することの結果とします。
promiseを resultで解決します。
呼び出されたとき、generateKeyは、次のステップを実行
しなければなりません:
algorithm、extractableおよびusagesを、
generateKey()
メソッドへ渡された
algorithm、extractableおよびkeyUsages
パラメーターとします。
normalizedAlgorithmを、
algをalgorithmに設定し、opを
"generateKey"に設定して、
アルゴリズムを
正規化することの結果とします。
エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。
promiseを新しいPromiseとします。
promiseを返し、残りのステップを並列に実行します。
次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します。
resultを、normalizedAlgorithmによって指定されるgenerate key操作を、 algorithm、extractableおよびusagesを使用して実行した結果とします。
CryptoKeyオブジェクトである場合:
resultの
[[type]]内部スロットが
"secret"
または"private"であり、かつ
usagesが空である場合、
SyntaxErrorを
throwします。
CryptoKeyPairオブジェクトである場合:
resultの
privateKey
属性の
[[usages]]内部
スロットが空シーケンスである場合、
SyntaxErrorを
throwします。
残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます。
resultを、 [WebIDL]で定義されるように、 realm内のECMAScript Objectへresultを変換した結果とします。
promiseを resultで解決します。
呼び出されたとき、deriveKeyは、
次のステップを実行しなければなりません:
algorithm、baseKey、derivedKeyType、
extractableおよびusagesを、
deriveKey()
メソッドへ渡されたalgorithm、
baseKey、derivedKeyType、extractableおよび
keyUsagesパラメーターとします。
normalizedAlgorithmを、
algをalgorithmに設定し、opを
"deriveBits"に設定して、
アルゴリズムを
正規化することの結果とします。
エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。
normalizedDerivedKeyAlgorithmImportを、
algをderivedKeyTypeに設定し、opを
"importKey"に設定して、
アルゴリズムを
正規化することの結果とします。
エラーが発生した場合、normalizedDerivedKeyAlgorithmImportで拒否された Promiseを返します。
normalizedDerivedKeyAlgorithmLengthを、
algをderivedKeyTypeに設定し、opを
"get key length"に設定して、
アルゴリズムを
正規化することの結果とします。
エラーが発生した場合、normalizedDerivedKeyAlgorithmLengthで拒否された Promiseを返します。
promiseを新しいPromiseとします。
promiseを返し、残りのステップを並列に実行します。
次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します。
normalizedAlgorithmの
nameメンバーが、
baseKeyの
[[algorithm]]内部スロットの
name属性と等しくない場合、
InvalidAccessErrorを
throwします。
baseKeyの
[[usages]]内部スロットに、
"deriveKey"であるエントリが含まれていない場合、
InvalidAccessErrorを
throwします。
lengthを、normalizedDerivedKeyAlgorithmLengthによって指定される get key lengthアルゴリズムを、derivedKeyTypeを使用して実行した結果とします。
secretを、normalizedAlgorithmによって指定されるderive bits操作を、 key、algorithmおよびlengthを使用して実行した結果とします。
resultを、normalizedDerivedKeyAlgorithmImportによって指定される
import key操作を、"raw"を
formatとして、secretをkeyDataとして、
derivedKeyTypeをalgorithmとして使用し、
extractableおよびusagesを使用して実行した結果とします。
resultの
[[type]]
内部スロットが
"secret"または"private"であり、かつ
usagesが空である場合、
SyntaxErrorを
throwします。
resultの
[[extractable]]内部
スロットをextractableに設定します。
resultの
[[usages]]内部
スロットを、usagesの正規化値に設定します。
残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます。
resultを、 [WebIDL]で定義されるように、 realm内のECMAScript Objectへresultを変換した結果とします。
promiseを resultで解決します。
呼び出されたとき、deriveBitsは、
次のステップを実行しなければなりません:
algorithm、baseKeyおよびlengthを、
deriveBits()
メソッドへ渡された
algorithm、
baseKeyおよびlength
パラメーターとします。
normalizedAlgorithmを、
algをalgorithmに設定し、opを
"deriveBits"に設定して、
アルゴリズムを
正規化することの結果とします。
エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。
promiseを新しいPromiseとします。
promiseを返し、残りのステップを並列に実行します。
次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します。
normalizedAlgorithmの
nameメンバーが、
baseKeyの
[[algorithm]]内部
スロットの
name属性と等しくない場合、
InvalidAccessErrorを
throwします。
baseKeyの
[[usages]]内部スロットに、
"deriveBits"であるエントリが含まれていない場合、
InvalidAccessErrorを
throwします。
bitsを、normalizedAlgorithmによって指定されるderive bits操作を、 baseKey、algorithmおよびlengthを使用して実行した結果とします。
残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます。
resultを、bitsを含む
ArrayBufferを
realm内で作成することの結果とします。
promiseを resultで解決します。
呼び出されたとき、importKeyメソッドは、次のステップを実行
しなければなりません:
format、algorithm、extractableおよび
usagesを、
importKey()
メソッドへ渡されたformat、algorithm、
extractableおよびkeyUsagesパラメーターとします。
raw"、
"pkcs8"、または"spki"と等しい場合:
importKey()
メソッドへ渡されたkeyDataパラメーターが
JsonWebKey辞書である場合、
TypeErrorを
throwします。
keyDataを、
保持されているバイトのコピーを取得することの結果とします。対象は、
importKey()
メソッドへ渡された
keyDataパラメーターです。
jwk"と等しい場合:
importKey()
メソッドへ渡されたkeyDataパラメーターが
JsonWebKey辞書でない場合、
TypeErrorを
throwします。
keyDataを、
importKey()
メソッドへ渡されたkeyDataパラメーターとします。
normalizedAlgorithmを、
algをalgorithmに設定し、opを
"importKey"に設定して、
アルゴリズムを
正規化することの結果とします。
エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。
promiseを新しいPromiseとします。
promiseを返し、残りのステップを並列に実行します。
次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します。
resultを、normalizedAlgorithmによって指定される
import key操作を、keyData、
algorithm、
format、extractableおよびusagesを使用して実行した結果である
CryptoKeyオブジェクトとします。
resultの
[[type]]
内部スロットが
"secret"または"private"であり、かつ
usagesが空である場合、
SyntaxErrorを
throwします。
resultの
[[extractable]]内部
スロットをextractableに設定します。
resultの
[[usages]]内部
スロットを、usagesの正規化値に設定します。
残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます。
resultを、 [WebIDL]で定義されるように、 realm内のECMAScript Objectへresultを変換した結果とします。
promiseを resultで解決します。
相互運用性のために、"raw"鍵形式のサポートが推奨されます。
Web開発者は、他の鍵形式に対する実装サポートの詳細情報について
テストスイートを参照すべきです。
呼び出されたとき、exportKeyメソッドは、次のステップを実行
しなければなりません:
formatおよびkeyを、
exportKey()
メソッドへ渡されたformatおよび
keyパラメーターとします。
promiseを新しいPromiseとします。
promiseを返し、残りのステップを並列に実行します。
次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します。
keyの
[[algorithm]]内部
スロットのnameメンバーが、
export key操作をサポートする登録済みアルゴリズムを
識別しない場合、
NotSupportedErrorを
throwします。
keyの
[[extractable]]内部
スロットがfalseである場合、
InvalidAccessErrorを
throwします。
resultを、keyの
[[algorithm]]
内部スロットによって指定されるexport key操作を、keyおよびformatを使用して実行した結果とします。
残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます。
promiseを resultで解決します。
相互運用性のために、"raw"鍵形式のサポートが推奨されます。
Web開発者は、他の鍵形式に対する実装サポートの詳細情報について
テストスイートを参照すべきです。
呼び出されたとき、wrapKeyメソッドは、次のステップを実行
しなければなりません:
format、key、wrappingKeyおよび
algorithmを、
wrapKey()
メソッドへ渡されたformat、key、
wrappingKeyおよびwrapAlgorithmパラメーターとします。
normalizedAlgorithmを、
algをalgorithmに設定し、opを
"wrapKey"に設定して、
アルゴリズムを
正規化することの結果とします。
エラーが発生した場合、normalizedAlgorithmを、
algをalgorithmに設定し、opを
"encrypt"に設定して、
アルゴリズムを
正規化することの結果とします。
エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。
promiseを新しいPromiseとします。
promiseを返し、残りのステップを並列に実行します。
次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します。
normalizedAlgorithmの
nameメンバーが、
wrappingKeyの
[[algorithm]]内部
スロットの
name属性と等しくない場合、
InvalidAccessErrorを
throwします。
wrappingKeyの
[[usages]]内部スロットに、
"wrapKey"であるエントリが含まれていない場合、
InvalidAccessErrorを
throwします。
keyの
[[algorithm]]内部
スロットによって識別されるアルゴリズムがexport key操作をサポートしない場合、
NotSupportedErrorを
throwします。
keyの
[[extractable]]内部
スロットがfalseである場合、
InvalidAccessErrorを
throwします。
exportedKeyを、
keyの
[[algorithm]]内部
スロットによって指定されるexport key操作を、keyおよびformatを使用して実行した結果とします。
raw"、
"pkcs8"、または"spki"と等しい場合:
jwk"と等しい場合:
jsonを、exportedKeyをJSON文法に適合する
UTF-16文字列として表現した結果とします。たとえば、
新しいグローバルオブジェクトのコンテキストで、
[ECMA-262]で指定される
JSON.stringifyアルゴリズムを実行することによります。
bytesを、 jsonをUTF-8エンコードする ことの結果とします。
一部のアルゴリズムの鍵ラップ操作は、ペイロード サイズに制約を課します。たとえばAES-KWは、ペイロードの長さが 8バイトの倍数であることを要求し、RSA-OAEPは長さに制限を課します。 与えられた鍵のシリアル化に柔軟性を提供する鍵形式(たとえばJWK)については、 実装は、ラップアルゴリズムの制約に合わせてシリアル化を調整することを選択できます。 これが、JSON.stringifyが規範的に要求されない理由です。そうでなければ、 実装が追加のパディングを導入することを禁止してしまうためです。
resultを、normalizedAlgorithmによって指定されるwrap key操作を、 algorithmを使用し、 wrappingKeyをkeyとして、bytesを plaintextとして実行した結果とします。
resultを、normalizedAlgorithmによって指定されるencrypt操作を、 algorithmを使用し、 wrappingKeyをkeyとして、bytesを plaintextとして実行した結果とします。
NotSupportedErrorを
throwします。
残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます。
resultを、resultを含む
ArrayBufferを
realm内で作成することの結果とします。
promiseを resultで解決します。
相互運用性のために、"raw"鍵形式のサポートが推奨されます。
Web開発者は、他の鍵形式に対する実装サポートの詳細情報について
テストスイートを参照すべきです。
呼び出されたとき、unwrapKeyメソッドは、
次のステップを実行しなければなりません:
format、unwrappingKey、
algorithm、unwrappedKeyAlgorithm、
extractableおよびusagesを、
unwrapKey()
メソッドへ渡された
format、unwrappingKey、
unwrapAlgorithm、unwrappedKeyAlgorithm、
extractableおよびkeyUsages
パラメーターとします。
wrappedKeyを、
保持されているバイトのコピーを取得することの結果とします。対象は、
unwrapKey()
メソッドへ渡された
wrappedKeyパラメーターです。
normalizedAlgorithmを、
algをalgorithmに設定し、opを
"unwrapKey"に設定して、
アルゴリズムを
正規化することの結果とします。
エラーが発生した場合、normalizedAlgorithmを、
algをalgorithmに設定し、opを
"decrypt"に設定して、
アルゴリズムを
正規化することの結果とします。
エラーが発生した場合、normalizedAlgorithmで拒否された Promiseを返します。
normalizedKeyAlgorithmを、
algをunwrappedKeyAlgorithmに設定し、opを
"importKey"に設定して、アルゴリズムを正規化することの結果とします。
エラーが発生した場合、normalizedKeyAlgorithmで拒否された Promiseを返します。
promiseを新しいPromiseとします。
promiseを返し、残りのステップを並列に実行します。
次のステップまたは参照される手続きが、エラーを throwすると言う場合、 realmのグローバルオブジェクトが与えられた状態で、 返されたエラーによってpromiseを拒否するために、 cryptoタスクソース上で グローバルタスクをキューに入れ、 その後アルゴリズムを終了します。
normalizedAlgorithmの
nameメンバーが、
unwrappingKeyの
[[algorithm]]内部
スロットの
name属性と等しくない場合、
InvalidAccessErrorを
throwします。
unwrappingKeyの
[[usages]]内部スロットに、
"unwrapKey"であるエントリが含まれていない場合、
InvalidAccessErrorを
throwします。
NotSupportedErrorを
throwします。
resultを、normalizedKeyAlgorithmによって指定される import key操作を、 unwrappedKeyAlgorithmをalgorithmとして、format、 usages およびextractableを使用し、 keyをkeyDataとして実行した結果とします。
resultの
[[type]]
内部スロットが
"secret"または"private"であり、かつ
usagesが空である場合、
SyntaxErrorを
throwします。
resultの
[[extractable]]内部
スロットをextractableに設定します。
resultの
[[usages]]内部
スロットを、usagesの正規化値に設定します。
残りのステップを実行するために、realmのグローバルオブジェクトが与えられた状態で、 cryptoタスクソース上で グローバルタスクをキューに入れます。
resultを、 [WebIDL]で定義されるように、 realm内のECMAScript Objectへresultを変換した結果とします。
promiseを resultで解決します。
相互運用性のために、"raw"鍵形式のサポートが推奨されます。
Web開発者は、他の鍵形式に対する実装サポートの詳細情報について
テストスイートを参照すべきです。
SubtleCryptoインターフェイスのメソッドは、
ECMAScript
[ECMA-262] または
DOMExceptionで定義される事前定義済み例外で返されたpromiseを拒否することにより、
エラーを返します。次の
事前定義済み例外が使用されます: TypeError。次の
[DOM]
のDOMException型が
使用されます:
| 名前 | 説明 |
|---|---|
NotSupportedError
|
アルゴリズムはサポートされていません |
SyntaxError |
必須パラメーターが欠けているか、範囲外です |
InvalidAccessError
|
要求された操作は、提供された鍵に対して有効ではありません |
DataError |
操作に提供されたデータが要件を満たしていません |
OperationError
|
操作固有の理由により操作が失敗しました |
この仕様がエラーを throwすると言う場合、ユーザー エージェントは [WebIDL] で説明されるようにエラーを throwしなければなりません。これがサブアルゴリズム内で発生した場合、 例外を捕捉する手続きを明示的に説明するものに到達するまで、そのサブアルゴリズムおよび すべての祖先アルゴリズムの実行を終了する結果になります。 throwされるエラーオブジェクトは、 関連 realm of thisに 関連付けられなければなりません。
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で定義されます。
WebIDLtypedef Uint8Array BigInteger;
BigInteger
typedefは、ビッグエンディアン順で任意の大きさの
符号なし整数を保持するUint8Array
です。APIから読み取られる値は、最小の型付き配列長を持つ
ものとします(すなわち、先頭のゼロビットは最大7個。ただし値0は長さ8ビットであるものとします)。
APIは、ゼロを表す空配列を含め、任意の数の先頭ゼロビットを持つ値を受け入れる
ものとします。
WebIDLdictionary CryptoKeyPair {
CryptoKey publicKey;
CryptoKey privateKey;
};
CryptoKeyPair辞書は、public(publicKey)鍵とprivate
(privateKey)鍵の両方で構成される非対称鍵ペアを表します。
このセクションは非規範的です。
この仕様は、SubtleCryptoインターフェイスを通じて
暗号操作を実行するための共通インターフェイスを提供することに加えて、
作者が使用したいと望む可能性があり、かつユーザーエージェントが実装を選択できる
さまざまなアルゴリズムの説明も提供します。これには、一般的に配備されている
対称アルゴリズムおよび非対称アルゴリズム、鍵導出機構、ならびに鍵をラップおよび
アンラップするための方法の選択が含まれます。さらに、この仕様は、追加の
仕様が追加の暗号アルゴリズムを導入できるようにするプロセスを定義します。
Web Cryptography APIで使用するために定義されるすべての暗号アルゴリズムは、 認識されるアルゴリズム名と呼ばれる一意な名前を持た なければなりません。これは、Web Cryptography APIで使用するために、 他の仕様が同じ大文字小文字を区別しない文字列を定義しないような名前です。
Web Cryptography APIで使用するために定義されるすべての暗号アルゴリズムは、
サポートされる操作のリストを持ちます。これは、
目的の暗号操作を実行するためにSubtleCrypto
インターフェイスによって呼び出されるサブアルゴリズムの集合です。この仕様では、
次の操作を使用します:
与えられたアルゴリズム仕様が特定の操作をサポート対象として列挙していない場合、 または操作を非サポートとして明示的に列挙している場合、ユーザーエージェントは、 そのサブアルゴリズムの呼び出しがNotSupportedErrorをthrowしたかのように振る舞わ なければなりません。
Web Cryptography APIで使用するために定義されるすべての暗号アルゴリズムは、 各サポートされる 操作について、アルゴリズム正規化に使用するIDL型、および サブアルゴリズムの返値のIDL型または型群を定義 しなければなりません。
この仕様内のすべての暗号アルゴリズム定義は、次の仕様規約を採用します。 "Registration"というタイトルのセクションには、 認識されるアルゴリズム名が含まれます。さらに、 そのセクションには表が含まれ、その表はサポートされる 操作の各々を行として列挙し、Operation 列によって識別します。与えられた行のParameters列の内容は、その操作のアルゴリズム正規化に使用するIDL型を含み、 その行のResult列の内容は、サポートされる操作を実行した結果となる IDL型を示します。
適合ユーザーエージェントがあるアルゴリズムを実装する場合、そのユーザーエージェントは すべての サポートされる操作を実装 しなければならず、指定されたIDL型を返さ なければなりません。
さらに、初期化時に、適合ユーザーエージェントは、サポートされる各操作について、 示されたIDLパラメーター型を登録して、アルゴリズムを定義する手順を実行しなければなりません。
特に明記されていない限り、この仕様で定義される操作によって作成されるオブジェクトは、 関連 realm of thisに関連付けられるものとします。
このセクションは非規範的です。
AlgorithmIdentifier
typedefは、アルゴリズムをDOMStringまたは
オブジェクトとして指定することを許可します。DOMStringの使用は、
パラメーターを持たないアルゴリズム(例: SHA-1)を記述するための短縮表記を作者に許可するためです。
オブジェクトの使用は、オブジェクトに関連するすべてのパラメーターを含む
Algorithm(または適切な
サブクラス)を指定できるようにするためです。
このため、AlgorithmIdentifierをこのAPIで使用可能な適切な
辞書へ変換するためのアルゴリズムを定義する必要があります。このアルゴリズムは、新しい
暗号アルゴリズムを追加できるように拡張可能であり、かつWeb IDL型マッピングが
呼び出し元スクリプトへ制御が返される前に発生できるように一貫していなければなりません。
そうでなければ、パラメーターまたはスクリプト環境の変更が潜在的に許される可能性があります。
この仕様は内部オブジェクト supportedAlgorithmsを使用します。この内部オブジェクトは アプリケーションへ公開されません。
この値はアプリケーションへ公開されないため、正確な型は指定されません。 これは、キーの比較が大文字小文字を区別する方法で実行される、キー/値ペアの連想コンテナーとして 振る舞うことだけが要求されます。
この内部オブジェクトの初期内容は次のとおりです:
サポートされる操作のリスト内の各値vについて、
内部オブジェクトsupportedAlgorithmsの
vキーを新しい連想コンテナーに設定します。
アルゴリズムを定義するアルゴリズムは、 特定のアルゴリズムについてユーザーエージェントがどのように引数を正規化すべきかを 仕様作者が示すために使用されます。その入力は、DOMStringとして表されるアルゴリズム名 alg、DOMStringとして表される操作名op、および目的のIDL 辞書型typeです。このアルゴリズムは次のように動作します:
supportedAlgorithmsの
opキーに格納された連想コンテナーとします。
アルゴリズムを正規化するアルゴリズムは、
Web IDL変換が行われた後で、入力を対象のIDL辞書型へ強制変換するための
プロセスを定義します。これは、将来の仕様が追加のアルゴリズムを定義できるように
拡張可能であり、かつPromisesとともに安全に使用できるよう設計されています。その入力は、
操作名opおよびAlgorithmIdentifier algです。
その出力はIDL辞書型またはエラーのいずれかです。これは次のように動作します:
algを、Algorithmの新しい辞書であって、
そのname属性が
algであるものに設定し、opをopに設定して、
アルゴリズムを正規化するアルゴリズムを実行した結果を返します。
supportedAlgorithmsの
opキーに格納された連想コンテナーとします。
Algorithmへ変換した結果とします。
name
属性の値とします。
algNameを一致したキーの値に設定します。
desiredTypeを、registeredAlgorithms内の algNameに格納されたIDL辞書型とします。
NotSupportedErrorを返し、このアルゴリズムを終了します。
name属性を
algNameに設定します。
dictionaries内の各辞書dictionaryについて:
dictionary上で宣言された各辞書メンバーmemberについて、順に:
BufferSource
型であり、かつ存在する場合:
HashAlgorithmIdentifier型である場合:
algをidlValueに設定し、
opを"digest"に設定して、
アルゴリズムを
正規化することの結果に設定します。
AlgorithmIdentifier型である場合:
algをidlValueに設定し、
opをalgNameによって識別されるアルゴリズムを定義する仕様で
定義された操作に設定して、
アルゴリズムを
正規化することの結果に設定します。
このセクションは非規範的です。
開発者の相互運用性を促進するために、この仕様には推奨アルゴリズムの リストが含まれています。これらは、執筆時点で実際に最も広く使用されている アルゴリズムと考えられるため、この仕様の初期実装にとって良い出発点を提供します。 推奨アルゴリズムは次のとおりです:
このセクションは非規範的です。
下の表は、この仕様内で説明されるアルゴリズムの概要、およびその アルゴリズムを使用できるSubtleCrypto メソッドの集合を含みます。アルゴリズムを あるメソッドで使用するには、そのメソッドの手続きで定義される対応する 操作または操作群が、アルゴリズム仕様内で定義されていなければなりません。 メソッドから基盤となる操作へのこの対応関係は 1対1ではないことに注意してください:
encryptメソッドには
encrypt操作が必要です。
decryptメソッドには
decrypt操作が必要です。
signメソッドにはsign
操作が必要です。
verifyメソッドにはverify
操作が必要です。
generateKeyメソッドには
generateKey操作が必要です。
importKeyメソッドには
importKey操作が必要です。
exportKeyメソッドには
exportKey操作が必要です。
deriveKeyメソッドには、
鍵導出アルゴリズムのderiveBits操作、および導出される鍵アルゴリズムのget key lengthとimportKey
操作が
必要です。
deriveBitsメソッドには、
鍵導出アルゴリズムのderiveBits操作が必要です。
digestメソッドにはdigest
操作が必要です。
wrapKeyメソッドには、ラップ
アルゴリズムのencryptまたはwrapKey操作、およびラップされる鍵アルゴリズムのexportKey操作が
必要です。
unwrapKeyメソッドには、
アンラップアルゴリズムのdecryptまたはunwrapKey操作、およびアンラップされる鍵アルゴリズムのimportKey操作が
必要です。
アプリケーション開発者およびスクリプト作者は、この表を特定のアルゴリズムの使用に関する 推奨として解釈すべきではありません。代わりに、これは単にどの メソッドがサポートされるかを文書化するものです。作者は、特定の アルゴリズムを使用するときに生じ得るリスクおよび懸念をよりよく理解するために、この 文書の作者向けのセキュリティに関する 考慮事項セクションを参照すべきです。
| アルゴリズム名 | 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 | ✔ | ✔ | ✔ |
このセクションは非規範的です。
"RSASSA-PKCS1-v1_5"アルゴリズム識別子は、
[RFC3447]
で指定されるRSASSA-PKCS1-v1_5アルゴリズムを用い、
この仕様で定義されるSHAハッシュ関数を使用して、
署名および検証を実行するために使用されます。
他の 仕様は、RSASSA-PKCS1-v1_5で追加のハッシュアルゴリズムを使用することを指定できます。 そのような仕様は、追加のハッシュアルゴリズムのdigest操作、 およびRSASSA-PKCS1-v1_5の鍵インポート手順 および 鍵 エクスポート手順を定義しなければなりません。
このアルゴリズムの認識されるアルゴリズム名は
"RSASSA-PKCS1-v1_5"です。
| 操作 | パラメーター | 結果 |
|---|---|---|
| sign | なし | バイト シーケンス |
| verify | なし | boolean |
| generateKey | RsaHashedKeyGenParams |
CryptoKeyPair |
| importKey | RsaHashedImportParams |
CryptoKey |
| exportKey | なし | object |
WebIDLdictionary RsaKeyGenParams : Algorithm {
required [EnforceRange] unsigned long modulusLength;
required BigInteger publicExponent;
};
modulusLengthメンバーは、RSAモジュラスの長さを
ビット単位で含みます。
publicExponentメンバーは、RSA公開
指数を含みます。
WebIDLdictionary RsaHashedKeyGenParams : RsaKeyGenParams {
required HashAlgorithmIdentifier hash;
};
hashメンバーは、使用するハッシュアルゴリズムを
表します。
WebIDLdictionary RsaKeyAlgorithm : KeyAlgorithm {
required unsigned long modulusLength;
required BigInteger publicExponent;
};
modulusLengthメンバーは、RSAモジュラスの長さを
ビット単位で含みます。
publicExponentメンバーは、RSA公開
指数を含みます。
WebIDLdictionary RsaHashedKeyAlgorithm : RsaKeyAlgorithm {
required KeyAlgorithm hash;
};
hashメンバーは、この鍵とともに使用されるハッシュアルゴリズムを
記述します。
WebIDLdictionary RsaHashedImportParams : Algorithm {
required HashAlgorithmIdentifier hash;
};
hashメンバーは、使用するハッシュアルゴリズムを
記述します。
keyの[[type]]
内部スロットが
"private"でない場合、
InvalidAccessErrorをthrowします。
[RFC3447]
のセクション8.2で定義される署名生成操作を実行します。
keyの
[[handle]]内部スロットによって表される鍵を
署名者のprivate鍵として、messageを
Mとして使用し、keyの
[[algorithm]]内部
スロットのhash属性で指定されるハッシュ関数を、
EMSA-PKCS1-v1_5エンコーディングメソッドのHashオプションとして使用します。
操作の実行がエラーになる場合、
OperationErrorをthrowします。
signatureを、操作の実行から得られる値Sとします。
signatureを返します。
keyの[[type]]
内部スロットが
"public"でない場合、InvalidAccessErrorをthrowします。
[RFC3447]
のセクション8.2で定義される署名検証操作を実行します。
keyの
[[handle]]
内部スロットによって表される鍵を
署名者のRSA公開鍵として、messageを
Mとして、
signatureをSとして使用し、keyの
[[algorithm]]内部
スロットの
hash属性で指定されるハッシュ関数を、
EMSA-PKCS1-v1_5エンコーディングメソッドのHashオプションとして使用します。
resultを、操作の結果が"valid signature"であれば値true、 それ以外であれば値falseを持つbooleanとします。
resultを返します。
usagesが"sign"または"verify"でないエントリを
含む場合、
SyntaxErrorをthrowします。
[RFC3447]
で定義されるように、RSA鍵ペアを生成します。RSAモジュラス長は
normalizedAlgorithmの
modulusLength
属性と等しく、RSA公開指数は
normalizedAlgorithmの
publicExponent
属性と等しいものとします。
鍵ペアの生成に失敗した場合、
OperationErrorをthrowします。
algorithmを新しい
RsaHashedKeyAlgorithm
辞書とします。
algorithmのname属性を
"RSASSA-PKCS1-v1_5"に設定します。
algorithmの
modulusLength
属性を、normalizedAlgorithmの
modulusLength
属性と等しく設定します。
algorithmの
publicExponent
属性を、normalizedAlgorithmの
publicExponent
属性と等しく設定します。
publicKeyを、生成された鍵ペアの公開鍵を表す新しい
CryptoKeyとします。
publicKeyの[[type]]
内部スロットを"public"に設定します。
publicKeyの[[algorithm]]内部
スロットをalgorithmに設定します。
publicKeyの[[extractable]]内部
スロットをtrueに設定します。
publicKeyの[[usages]]内部スロットを、
usagesと[ "verify" ]の用途の共通部分に設定します。
privateKeyを、生成された鍵ペアのprivate鍵を表す新しい
CryptoKeyとします。
privateKeyの[[algorithm]]内部
スロットをalgorithmに設定します。
privateKeyの[[extractable]]内部
スロットをextractableに設定します。
privateKeyの[[usages]]内部スロットを、
usagesと[ "sign" ]の用途の共通部分に設定します。
resultを新しいCryptoKeyPair
辞書とします。
resultのpublicKey属性を
publicKeyに設定します。
resultのprivateKey属性を
privateKeyに設定します。
resultを返します。
keyDataを、インポートされる鍵データとします。
spki"である場合:
usagesが"verify"でないエントリを
含む場合、
SyntaxErrorをthrowします。
spkiを、keyDataに対して subjectPublicKeyInfoを 解析する アルゴリズムを実行した結果とします。
spkiのalgorithm AlgorithmIdentifierフィールドの
algorithmオブジェクト識別子フィールドが、
[RFC3447]
で定義されるrsaEncryption
オブジェクト識別子と等しくない場合、
DataErrorをthrowします。
publicKeyを、ASN.1構造を
解析する
アルゴリズムを実行した結果とします。dataを
spkiのsubjectPublicKeyInfoフィールドとして、
structureを[RFC3447]
のセクションA.1.1で指定されるRSAPublicKey構造として、
exactDataをtrueに設定します。
解析中にエラーが発生した場合、または
publicKeyが[RFC3447]に従って
有効な公開鍵ではないと判断できる場合、
DataErrorをthrowします。
keyを、
publicKeyによって識別されるRSA公開鍵を表す新しい
CryptoKey
とします。
keyの[[type]]
内部スロットを"public"に設定します。
pkcs8"である場合:
usagesが"sign"でないエントリを含む場合、
SyntaxErrorをthrowします。
privateKeyInfoを、keyDataに対して privateKeyInfoを 解析する アルゴリズムを実行した結果とします。
privateKeyInfoの
privateKeyAlgorithm PrivateKeyAlgorithmフィールドの
algorithmオブジェクト識別子フィールドが、
[RFC3447]
で定義されるrsaEncryptionオブジェクト識別子と等しくない場合、
DataErrorをthrowします。
rsaPrivateKeyを、ASN.1構造を
解析する
アルゴリズムを実行した結果とします。dataを
privateKeyInfoのprivateKeyフィールドとして、
structureを[RFC3447]
のセクションA.1.2で指定されるRSAPrivateKey構造として、
exactDataをtrueに設定します。
解析中にエラーが発生した場合、またはrsaPrivateKeyが
[RFC3447]に従って
有効なRSA private鍵でない場合、
DataErrorをthrowします。
keyを、
rsaPrivateKeyによって識別されるRSA private鍵を表す新しい
CryptoKey
とします。
jwk"である場合:JsonWebKey
辞書である場合:jwkをkeyDataと等しくします。
jwkのdフィールドが存在し、かつ
usagesが"sign"でないエントリを含む場合、または
jwkのdフィールドが
存在せず、かつ
usagesが"verify"でないエントリを含む場合、
SyntaxErrorをthrowします。
jwkのktyフィールドが、
"RSA"に対する大文字小文字を区別する文字列一致でない場合、
DataErrorをthrowします。
usagesが空でなく、かつjwkのuseフィールドが
存在し、"sig"に対する大文字小文字を区別する文字列一致でない場合、
DataErrorをthrowします。
jwkのkey_opsフィールドが
存在し、JSON Web Key [JWK]の要件に従って
無効である場合、または指定されたすべてのusages値を含まない場合、
DataErrorをthrowします。
jwkのextフィールドが
存在し、値がfalseであり、かつextractableがtrueである場合、
DataErrorをthrowします。
hashを、初期値がundefinedである文字列とします。
algフィールドが
存在しない場合:
hashをundefinedとします。
algフィールドが
文字列"RS1"と等しい場合:
hashを文字列"SHA-1"とします。
algフィールドが
文字列"RS256"と等しい場合:
hashを文字列"SHA-256"とします。
algフィールドが
文字列"RS384"と等しい場合:
hashを文字列"SHA-384"とします。
algフィールドが
文字列"RS512"と等しい場合:
hashを文字列"SHA-512"とします。
他の 適用可能な 仕様によって定義される任意の鍵 インポート手順を実行し、format、 jwkを渡してhashを取得します。
normalizedHashを、
algをhashに設定し、
opをdigestに設定して
アルゴリズムを
正規化することの結果とします。
normalizedHashがnormalizedAlgorithmの
hash
メンバーと等しくない場合、DataErrorをthrowします。
dフィールドが存在する場合:
jwkがJSON Web Algorithms [JWA]のセクション
6.3.1の要件を満たさない場合、
DataErrorをthrowします。
publicKeyを、JSON Web Algorithms [JWA] のセクション6.3.1に従ってjwkを解釈することによって識別される RSA公開鍵を表すものとします。
publicKeyが[RFC3447]に従って
有効なRSA公開鍵ではないと判断できる場合、
DataErrorを
throwします。
keyを、publicKeyを表す新しいCryptoKey
とします。
keyの[[type]]
内部スロットを"public"に設定します。
NotSupportedErrorをthrowします。
algorithmを新しい
RsaHashedKeyAlgorithm
辞書とします。
algorithmのname属性を
"RSASSA-PKCS1-v1_5"に設定します。
algorithmのmodulusLength
属性を、RSA公開モジュラスの長さ(ビット単位)に設定します。
algorithmのpublicExponent 属性を、RSA公開指数のBigInteger 表現に設定します。
keyの[[algorithm]]内部
スロットをalgorithmに設定します。
keyを返します。
keyを、エクスポートされる鍵とします。
keyの[[handle]]
内部スロットによって表される基盤となる暗号鍵素材にアクセスできない場合、
OperationErrorをthrowします。
spki"である場合
keyの[[type]]
内部スロットが"public"でない場合、InvalidAccessErrorをthrowします。
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公開鍵を表します。
resultを、dataをDERエンコードした結果とします。
pkcs8"である場合:
keyの[[type]]
内部スロットが"private"でない場合、
InvalidAccessErrorをthrowします。
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鍵を表します。
resultを、dataをDERエンコードした結果とします。
jwk"である場合:jwkを新しいJsonWebKey
辞書とします。
jwkのkty属性を文字列
"RSA"に設定します。
hashを、keyの
[[algorithm]]
内部スロットのhash
属性のname
属性とします。
SHA-1"である場合:
jwkのalg属性を文字列
"RS1"に設定します。
SHA-256"である場合:
jwkのalg属性を文字列
"RS256"に設定します。
SHA-384"である場合:
jwkのalg属性を文字列
"RS384"に設定します。
SHA-512"である場合:
jwkのalg属性を文字列
"RS512"に設定します。
他の 適用可能な 仕様によって定義される任意の鍵 エクスポート手順を実行し、format、 keyを渡してalgを取得します。
エラーが発生した場合、または
適用可能な
仕様が存在しない場合、
NotSupportedErrorを
throwします。
jwkのalg属性を
algに設定します。
jwkの属性n
およびeを、
JSON Web Algorithms [JWA]
のセクション6.3.1における
対応する定義に従って設定します。
jwkのkey_ops属性を、keyのusages属性に設定します。
jwkのext属性を、keyの[[extractable]]
内部スロットに設定します。
resultをjwkとします。
resultを返します。
このセクションは非規範的です。
"RSA-PSS"アルゴリズム識別子は、
[RFC3447]
で指定されるRSASSA-PSSアルゴリズムを使用し、
この仕様で定義されるSHAハッシュ関数およびマスク生成式
MGF1を使用して、署名および検証を実行するために使用されます。
他の 仕様は、RSASSA-PSSで追加のハッシュアルゴリズムを使用することを指定できます。そのような仕様は、 追加のハッシュアルゴリズムのdigest操作、およびRSASSA-PSSの 鍵インポート手順および 鍵エクスポート手順を定義 しなければなりません。
このアルゴリズムの認識されるアルゴリズム名は
"RSA-PSS"です。
| 操作 | パラメーター | 結果 |
|---|---|---|
| sign | RsaPssParams |
バイト シーケンス |
| verify | RsaPssParams |
boolean |
| generateKey | RsaHashedKeyGenParams |
CryptoKeyPair |
| importKey | RsaHashedImportParams |
CryptoKey |
| exportKey | なし | object |
WebIDLdictionary RsaPssParams : Algorithm {
required [EnforceRange] unsigned long saltLength;
};
saltLengthメンバーは、ランダムソルトの望ましい長さを
バイト単位で表します。
keyの[[type]]
内部スロットが
"private"でない場合、
InvalidAccessErrorをthrowします。
[RFC3447]
のセクション8.1で定義される署名生成操作を実行します。
keyの[[handle]]内部スロットによって表される鍵を
署名者のprivate鍵Kとして、messageを
署名されるメッセージMとして使用し、
keyの
[[algorithm]]内部
スロットのhash属性で指定されるハッシュ関数を
Hashオプションとして、MGF1([RFC3447]のセクションB.2.1で定義)を
MGFオプションとして、そして
normalizedAlgorithmのsaltLengthメンバーを
EMSA-PSS-ENCODE操作のソルト長オプションとして使用します。
操作の実行がエラーになる場合、
OperationErrorをthrowします。
signatureを、操作の実行から得られる署名Sとします。
signatureを返します。
keyの[[type]]
内部スロットが"public"でない場合、InvalidAccessErrorをthrowします。
[RFC3447]
のセクション8.1で定義される署名検証操作を実行します。
keyの
[[handle]]内部スロットによって表される鍵を
署名者のRSA公開鍵として、messageを
Mとして、
signatureをSとして使用し、
keyの
[[algorithm]]内部
スロットのhash属性で指定されるハッシュ関数を
Hashオプションとして、MGF1([RFC3447]のセクションB.2.1で定義)を
MGFオプションとして、そして
normalizedAlgorithmのsaltLengthメンバーを
EMSA-PSS-VERIFY操作のソルト長オプションとして使用します。
resultを、操作の結果が"valid signature"であれば値true、 それ以外であれば値falseを持つbooleanとします。
usagesが"sign"または"verify"でないエントリを
含む場合、
SyntaxErrorをthrowします。
[RFC3447]
で定義されるように、RSA鍵ペアを生成します。RSAモジュラス長は
normalizedAlgorithmの
modulusLengthメンバーと等しく、
RSA公開指数は
normalizedAlgorithmの
publicExponentメンバーと等しいものとします。
操作の実行がエラーになる場合、
OperationErrorをthrowします。
algorithmを新しい
RsaHashedKeyAlgorithm
辞書とします。
algorithmのname属性を
"RSA-PSS"に設定します。
algorithmの
modulusLength
属性を、normalizedAlgorithmの
modulusLength
メンバーと等しく設定します。
algorithmの
publicExponent
属性を、normalizedAlgorithmの
publicExponent
メンバーと等しく設定します。
publicKeyを、生成された鍵ペアの公開鍵を表す新しい
CryptoKey
とします。
publicKeyの[[type]]
内部スロットを"public"に設定します。
publicKeyの[[algorithm]]内部
スロットをalgorithmに設定します。
publicKeyの[[extractable]]内部
スロットをtrueに設定します。
publicKeyの[[usages]]内部スロットを、
usagesと[ "verify" ]の用途の共通部分に設定します。
privateKeyを、生成された鍵ペアのprivate鍵を表す新しい
CryptoKey
とします。
privateKeyの[[algorithm]]内部
スロットをalgorithmに設定します。
privateKeyの[[extractable]]内部
スロットをextractableに設定します。
privateKeyの[[usages]]内部スロットを、
usagesと[ "sign" ]の用途の共通部分に設定します。
resultを新しいCryptoKeyPair
辞書とします。
resultのpublicKey属性を
publicKeyに設定します。
resultのprivateKey属性を
privateKeyに設定します。
resultを返します。
keyDataを、インポートされる鍵データとします。
spki"である場合:
usagesが"verify"でないエントリを含む場合、
SyntaxErrorをthrowします。
spkiを、keyDataに対して subjectPublicKeyInfoを 解析する アルゴリズムを実行した結果とします。
spkiのalgorithm AlgorithmIdentifierフィールドの
algorithmオブジェクト識別子フィールドが、
[RFC3447]
で定義されるrsaEncryption
オブジェクト識別子と等しくない場合、
DataErrorをthrowします。
publicKeyを、ASN.1構造を
解析する
アルゴリズムを実行した結果とします。dataを
spkiのsubjectPublicKeyInfoフィールドとして、
structureを[RFC3447]
のセクションA.1.1で指定されるRSAPublicKey構造として、
exactDataをtrueに設定します。
解析中にエラーが発生した場合、または
publicKeyが[RFC3447]に従って
有効な公開鍵ではないと判断できる場合、
DataErrorをthrowします。
keyを、
publicKeyによって識別されるRSA公開鍵を表す新しい
CryptoKey
とします。
keyの[[type]]
内部スロットを"public"に設定します。
pkcs8"である場合:
usagesが"sign"でないエントリを含む場合、
SyntaxErrorをthrowします。
privateKeyInfoを、keyDataに対して privateKeyInfoを 解析する アルゴリズムを実行した結果とします。
privateKeyInfoの
privateKeyAlgorithm PrivateKeyAlgorithmフィールドの
algorithmオブジェクト識別子フィールドが、
[RFC3447]
で定義されるrsaEncryptionオブジェクト識別子と等しくない場合、
DataErrorをthrowします。
rsaPrivateKeyを、ASN.1構造を
解析する
アルゴリズムを実行した結果とします。dataを
privateKeyInfoのprivateKeyフィールドとして、
structureを[RFC3447]
のセクションA.1.2で指定されるRSAPrivateKey構造として、
exactDataをtrueに設定します。
解析中にエラーが発生した場合、またはrsaPrivateKeyが
[RFC3447]に従って
有効なRSA private鍵でない場合、
DataErrorをthrowします。
keyを、
rsaPrivateKeyによって識別されるRSA private鍵を表す新しい
CryptoKey
とします。
jwk"である場合:JsonWebKey
辞書である場合:jwkをkeyDataと等しくします。
jwkのdフィールドが存在し、かつ
usagesが"sign"でないエントリを含む場合、または
jwkのdフィールドが
存在せず、かつ
usagesが"verify"でないエントリを含む場合、
SyntaxErrorをthrowします。
jwkのktyフィールドが、
"RSA"に対する大文字小文字を区別する文字列一致でない場合、
DataErrorをthrowします。
usagesが空でなく、かつjwkのuseフィールドが
存在し、"sig"に対する大文字小文字を区別する文字列一致でない場合、
DataErrorをthrowします。
jwkのkey_opsフィールドが
存在し、JSON Web Key [JWK]の要件に従って
無効である場合、または指定されたすべてのusages値を含まない場合、
DataErrorをthrowします。
jwkのextフィールドが
存在し、値がfalseであり、かつextractableがtrueである場合、
DataErrorをthrowします。
algフィールドが
存在しない場合:
hashをundefinedとします。
algフィールドが
文字列"PS1"と等しい場合:
hashを文字列"SHA-1"とします。
algフィールドが
文字列"PS256"と等しい場合:
hashを文字列"SHA-256"とします。
algフィールドが
文字列"PS384"と等しい場合:
hashを文字列"SHA-384"とします。
algフィールドが
文字列"PS512"と等しい場合:
hashを文字列"SHA-512"とします。
他の 適用可能な 仕様によって定義される任意の鍵 インポート手順を実行し、format、 jwkを渡してhashを取得します。
normalizedHashを、
algをhashに設定し、
opをdigestに設定して
アルゴリズムを
正規化することの結果とします。
normalizedHashがnormalizedAlgorithmの
hash
メンバーと等しくない場合、DataErrorをthrowします。
dフィールドが存在する場合:
jwkがJSON Web Algorithms [JWA]のセクション
6.3.1の要件を満たさない場合、
DataErrorをthrowします。
publicKeyを、JSON Web Algorithms [JWA] のセクション6.3.1に従ってjwkを解釈することによって識別される RSA公開鍵を表すものとします。
publicKeyが[RFC3447]に従って
有効なRSA公開鍵ではないと判断できる場合、
DataErrorを
throwします。
keyを、publicKeyを表す新しい
CryptoKey
とします。
keyの[[type]]
内部スロットを"public"に設定します。
NotSupportedErrorをthrowします。
algorithmを新しい
RsaHashedKeyAlgorithm
辞書とします。
algorithmのname属性を
"RSA-PSS"に設定します。
algorithmのmodulusLength
属性を、RSA公開モジュラスの長さ(ビット単位)に設定します。
algorithmのpublicExponent
属性を、RSA公開指数のBigInteger
表現に設定します。
keyの[[algorithm]]内部
スロットをalgorithmに設定します。
keyを返します。
keyを、エクスポートされる鍵とします。
keyの[[handle]]内部スロットによって表される
基盤となる暗号鍵素材にアクセスできない場合、OperationErrorをthrowします。
spki"である場合
keyの[[type]]
内部スロットが"public"でない場合、InvalidAccessErrorをthrowします。
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公開鍵を表します。
resultを、dataをDERエンコードした結果とします。
pkcs8"である場合:
keyの[[type]]
内部スロットが"private"でない場合、InvalidAccessErrorをthrowします。
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鍵を表します。
resultを、dataをDERエンコードした結果とします。
jwk"である場合:jwkを新しいJsonWebKey辞書とします。
jwkのkty属性を文字列
"RSA"に設定します。
hashを、keyの
[[algorithm]]
内部スロットのhash
属性のname
属性とします。
SHA-1"である場合:
jwkのalg属性を文字列
"PS1"に設定します。
SHA-256"である場合:
jwkのalg属性を文字列
"PS256"に設定します。
SHA-384"である場合:
jwkのalg属性を文字列
"PS384"に設定します。
SHA-512"である場合:
jwkのalg属性を文字列
"PS512"に設定します。
他の
適用可能な
仕様によって定義される任意の鍵
エクスポート手順を実行し、formatと
keyの[[algorithm]]
内部スロットのhash
属性を渡してalgを取得します。
jwkのalg属性を
algに設定します。
jwkの属性n
およびeを、
JSON Web Algorithms [JWA]
のセクション6.3.1における
対応する定義に従って設定します。
jwkのkey_ops属性を、keyのusages属性に設定します。
jwkのext属性を、keyの[[extractable]]
内部スロットに設定します。
resultをjwkとします。
resultを返します。
このセクションは非規範的です。
"RSA-OAEP"アルゴリズム識別子は、
[RFC3447]
で指定されるRSAES-OAEPアルゴリズムに従って暗号化
および復号を実行するために使用されます。その際、
この仕様で定義されるSHAハッシュ関数およびマスク
生成関数MGF1を使用します。
他の 仕様は、RSAES-OAEPで追加のハッシュアルゴリズムを使用することを指定できます。そのような仕様は、 追加のハッシュアルゴリズムのdigest操作、およびRSAES-OAEPの 鍵インポート手順および 鍵エクスポート手順をRSAES-OAEPについて定義 しなければなりません。
このアルゴリズムの認識されるアルゴリズム名は
"RSA-OAEP"です。
| 操作 | パラメーター | 結果 |
|---|---|---|
| encrypt | RsaOaepParams |
バイト シーケンス |
| decrypt | RsaOaepParams |
バイト シーケンス |
| generateKey | RsaHashedKeyGenParams |
CryptoKeyPair |
| importKey | RsaHashedImportParams |
CryptoKey |
| exportKey | なし | object |
WebIDLdictionary RsaOaepParams : Algorithm {
BufferSource label;
};
labelメンバーは、メッセージに関連付ける任意のラベル/アプリケーション
データを表します。
keyの[[type]]
内部スロットが"public"でない場合、
InvalidAccessErrorを
throwします。
labelを、normalizedAlgorithmの
labelメンバー、
またはnormalizedAlgorithmの
labelメンバーが
存在しない場合は空のバイトシーケンスとします。
[RFC3447]
のセクション7.1で定義される暗号化操作を実行します。
keyによって表される鍵を受信者のRSA公開鍵として、
plaintextを暗号化されるメッセージMとして、
labelをラベルLとして使用し、かつ
keyの
[[algorithm]]内部
スロットのhash
属性で指定されるハッシュ関数をHashオプションとして、MGF1(
[RFC3447]のセクションB.2.1で定義)を
MGFオプションとして使用します。
操作の実行がエラーになる場合、
OperationErrorを
throwします。
ciphertextを、操作の実行から得られる値Cとします。
ciphertextを返します。
keyの[[type]]
内部スロットが"private"でない場合、
InvalidAccessErrorを
throwします。
labelを、normalizedAlgorithmの
labelメンバー、
またはnormalizedAlgorithmの
labelメンバーが
存在しない場合は空のバイトシーケンスとします。
[RFC3447]
のセクション7.1で定義される復号操作を実行します。
keyによって表される鍵を受信者のRSA private鍵として、
ciphertextを復号される暗号文Cとして、
labelをラベルLとして使用し、かつ
keyの
[[algorithm]]内部
スロットのhash
属性で指定されるハッシュ関数をHashオプションとして、MGF1(
[RFC3447]のセクションB.2.1で定義)を
MGFオプションとして使用します。
操作の実行がエラーになる場合、
OperationErrorを
throwします。
plaintextを、操作の実行から得られる値Mとします。
plaintextを返します。
usagesが"encrypt"、"decrypt"、
"wrapKey"または"unwrapKey"でないエントリを含む場合、
SyntaxErrorを
throwします。
[RFC3447]
で定義されるように、RSA鍵ペアを生成します。RSAモジュラス長は
normalizedAlgorithmの
modulusLengthメンバーと等しく、
RSA公開指数は
normalizedAlgorithmの
publicExponentメンバーと等しいものとします。
操作の実行がエラーになる場合、
OperationErrorを
throwします。
algorithmを新しい
RsaHashedKeyAlgorithm
オブジェクトとします。
algorithmのname属性を
"RSA-OAEP"に設定します。
algorithmの
modulusLength
属性を、normalizedAlgorithmの
modulusLength
メンバーと等しく設定します。
algorithmの
publicExponent
属性を、normalizedAlgorithmの
publicExponent
メンバーと等しく設定します。
publicKeyを、生成された鍵ペアの公開鍵を表す新しい
CryptoKey
とします。
publicKeyの[[type]]
内部スロットを"public"に設定します。
publicKeyの[[algorithm]]内部
スロットをalgorithmに設定します。
publicKeyの[[extractable]]内部
スロットをtrueに設定します。
publicKeyの[[usages]]内部スロットを、
usagesと[ "encrypt", "wrapKey" ]の
用途の共通部分に設定します。
privateKeyを、生成された鍵ペアのprivate鍵を表す新しい
CryptoKey
とします。
privateKeyの[[algorithm]]内部
スロットをalgorithmに設定します。
privateKeyの[[extractable]]内部
スロットをextractableに設定します。
privateKeyの[[usages]]内部スロットを、
usagesと[ "decrypt", "unwrapKey" ]の
用途の共通部分に設定します。
resultを新しいCryptoKeyPair
辞書とします。
resultのpublicKey属性を
publicKeyに設定します。
resultのprivateKey属性を
privateKeyに設定します。
resultを返します。
keyDataを、インポートされる鍵データとします。
spki"である場合:
usagesが"encrypt"または
"wrapKey"でないエントリを含む場合、
SyntaxErrorを
throwします。
spkiを、keyDataに対して subjectPublicKeyInfoを 解析する アルゴリズムを実行した結果とします。
spkiのalgorithm AlgorithmIdentifierフィールドの
algorithmオブジェクト識別子フィールドが、
[RFC3447]
で定義されるrsaEncryption
オブジェクト識別子と等しくない場合、
DataErrorを
throwします。
publicKeyを、ASN.1構造を
解析する
アルゴリズムを実行した結果とします。dataを
spkiのsubjectPublicKeyInfoフィールドとして、
structureを[RFC3447]
のセクションA.1.1で指定されるRSAPublicKey構造として、
exactDataをtrueに設定します。
解析中にエラーが発生した場合、または
publicKeyが[RFC3447]に従って
有効な公開鍵ではないと判断できる場合、
DataErrorを
throwします。
keyを、
publicKeyによって識別されるRSA公開鍵を表す新しい
CryptoKey
とします。
keyの[[type]]
内部スロットを"public"に設定します。
pkcs8"である場合:
usagesが"decrypt"または"unwrapKey"でないエントリを
含む場合、
SyntaxErrorを
throwします。
privateKeyInfoを、keyDataに対して privateKeyInfoを 解析する アルゴリズムを実行した結果とします。
privateKeyInfoの
privateKeyAlgorithm PrivateKeyAlgorithmフィールドの
algorithmオブジェクト識別子フィールドが、
[RFC3447]
で定義されるrsaEncryptionオブジェクト識別子と等しくない場合、
DataErrorを
throwします。
rsaPrivateKeyを、ASN.1構造を
解析する
アルゴリズムを実行した結果とします。dataを
privateKeyInfoのprivateKeyフィールドとして、
structureを[RFC3447]
のセクションA.1.2で指定されるRSAPrivateKey構造として、
exactDataをtrueに設定します。
解析中にエラーが発生した場合、またはrsaPrivateKeyが
[RFC3447]に従って
有効なRSA private鍵でない場合、
DataErrorを
throwします。
keyを、
rsaPrivateKeyによって識別されるRSA private鍵を表す新しい
CryptoKey
とします。
jwk"である場合:JsonWebKey
辞書である場合:jwkをkeyDataと等しくします。
jwkのdフィールドが存在し、かつ
usagesが"decrypt"または"unwrapKey"でないエントリを
含む場合、
SyntaxErrorを
throwします。
jwkのdフィールドが存在せず、かつ
usagesが"encrypt"または"wrapKey"でないエントリを
含む場合、
SyntaxErrorを
throwします。
jwkのktyフィールドが、
"RSA"に対する大文字小文字を区別する文字列一致でない場合、
DataErrorを
throwします。
usagesが空でなく、かつjwkのuseフィールドが
存在し、"enc"に対する大文字小文字を区別する文字列一致でない場合、
DataErrorを
throwします。
jwkのkey_opsフィールドが
存在し、JSON Web Key [JWK]の要件に従って
無効である場合、または指定されたすべてのusages値を含まない場合、
DataErrorを
throwします。
jwkのextフィールドが
存在し、値がfalseであり、かつextractableがtrueである場合、
DataErrorを
throwします。
algフィールドが存在しない場合:algフィールドが
"RSA-OAEP"と等しい場合:
SHA-1"とします。algフィールドが
"RSA-OAEP-256"と等しい場合:
SHA-256"とします。algフィールドが
"RSA-OAEP-384"と等しい場合:
SHA-384"とします。algフィールドが
"RSA-OAEP-512"と等しい場合:
SHA-512"とします。他の 適用可能な 仕様によって定義される任意の鍵 インポート手順を実行し、format、 jwkを渡してhashを取得します。
normalizedHashを、
algをhashに設定し、
opをdigestに設定して、
アルゴリズムを
正規化することの結果とします。
normalizedHashがnormalizedAlgorithmの
hash
メンバーと等しくない場合、DataErrorをthrowします。
dフィールドが存在する場合:
jwkがJSON Web Algorithms [JWA]のセクション
6.3.1の要件を満たさない場合、
DataErrorを
throwします。
publicKeyを、JSON Web Algorithms [JWA] のセクション6.3.1に従ってjwkを解釈することによって識別される RSA公開鍵を表すものとします。
publicKeyが[RFC3447]に従って
有効なRSA公開鍵ではないと判断できる場合、
DataErrorを
throwします。
keyを、publicKeyを表す新しい
CryptoKey
とします。
keyの[[type]]
内部スロットを"public"に設定します。
NotSupportedErrorを
throwします。
algorithmを新しい
RsaHashedKeyAlgorithmとします。
algorithmのname属性を
"RSA-OAEP"に設定します。
algorithmのmodulusLength
属性を、RSA公開モジュラスの長さ(ビット単位)に設定します。
algorithmのpublicExponent
属性を、RSA公開指数のBigInteger
表現に設定します。
keyの[[algorithm]]内部
スロットをalgorithmに設定します。
keyを返します。
keyを、エクスポートされる鍵とします。
keyの[[handle]]内部スロットによって表される
基盤となる暗号鍵素材にアクセスできない場合、OperationErrorを
throwします。
spki"である場合
keyの[[type]]
内部スロットが"public"でない場合、InvalidAccessErrorを
throwします。
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公開鍵を表します。
resultを、dataをDERエンコードした結果とします。
pkcs8"である場合:
keyの[[type]]
内部スロットが"private"でない場合、InvalidAccessErrorを
throwします。
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鍵を表します。
resultを、dataをDERエンコードした結果とします。
jwk"である場合:
jwkを新しいJsonWebKey
辞書とします。
jwkのkty属性を文字列
"RSA"に設定します。
hashを、keyの
[[algorithm]]
内部スロットのhash
属性のname
属性とします。
SHA-1"である場合:
jwkのalg属性を文字列
"RSA-OAEP"に設定します。
SHA-256"である場合:
jwkのalg属性を文字列
"RSA-OAEP-256"に設定します。
SHA-384"である場合:
jwkのalg属性を文字列
"RSA-OAEP-384"に設定します。
SHA-512"である場合:
jwkのalg属性を文字列
"RSA-OAEP-512"に設定します。
他の
適用可能な
仕様によって定義される任意の鍵
エクスポート手順を実行し、formatと
keyの[[algorithm]]
内部スロットのhash
属性を渡してalgを取得します。
jwkのalg属性を
algに設定します。
jwkの属性n
およびeを、
JSON Web Algorithms [JWA]
のセクション6.3.1における
対応する定義に従って設定します。
jwkのkey_ops属性を、keyのusages属性に設定します。
jwkのext属性を、keyの[[extractable]]
内部スロットに設定します。
resultをjwkとします。
NotSupportedErrorを
throwします。
resultを返します。
このセクションは非規範的です。
"ECDSA"アルゴリズム識別子は、署名および検証を実行するために使用されます。
これは、[RFC6090]で指定されるECDSA
アルゴリズムを使用し、この仕様で定義されるSHA
ハッシュ関数および楕円
曲線を使用します。
他の 仕様は、 ECDSAで追加の楕円曲線およびハッシュアルゴリズムを使用することを指定できます。ECDSAで使用する 追加のハッシュアルゴリズムを指定するには、仕様はdigest操作をサポートする 登録済みアルゴリズムを定義しなければなりません。 追加の楕円曲線を指定するには、仕様は 曲線名、 ECDSA署名手順、 ECDSA検証手順、 ECDSA生成手順、 ECDSA 鍵インポート手順および ECDSA 鍵エクスポート手順を定義しなければなりません。
このアルゴリズムの認識されるアルゴリズム名は
"ECDSA"です。
| 操作 | パラメーター | 結果 |
|---|---|---|
| sign | EcdsaParams |
バイト シーケンス |
| verify | EcdsaParams |
boolean |
| generateKey | EcKeyGenParams
|
CryptoKeyPair
|
| importKey | EcKeyImportParams |
CryptoKey |
| exportKey | なし | object |
WebIDLdictionary EcdsaParams : Algorithm {
required HashAlgorithmIdentifier hash;
};
hashメンバーは、使用するハッシュアルゴリズムを表します。
WebIDLtypedef DOMString NamedCurve;
dictionary EcKeyGenParams : Algorithm {
required NamedCurve namedCurve;
};
NamedCurve型は名前付き楕円曲線を表します。
これは、よく知られた楕円
曲線のドメインパラメーターを指定するための便利な方法です。この仕様で定義される値は次のとおりです:
P-256"secp256r1としても知られます。P-384"secp384r1としても知られます。P-521"secp521r1としても知られます。EcKeyGenParams辞書のnamedCurveメンバーは、名前付き
曲線を表します。
WebIDLdictionary EcKeyAlgorithm : KeyAlgorithm {
required NamedCurve namedCurve;
};
namedCurveメンバーは、この鍵が使用する名前付き曲線を
表します。
WebIDLdictionary EcKeyImportParams : Algorithm {
required NamedCurve namedCurve;
};
namedCurveメンバーは名前付き曲線を表します。
keyの[[type]]
内部スロットが"private"でない場合、
InvalidAccessErrorをthrowします。
hashAlgorithmを、normalizedAlgorithmの
hash
メンバーとします。
Mを、hashAlgorithmによって指定されるdigest操作を messageを使用して実行した結果とします。
dを、keyに関連付けられたECDSA private鍵とします。
paramsを、 keyに関連付けられたECドメインパラメーターとします。
[[algorithm]]内部
スロットのnamedCurve属性が
"P-256"、"P-384"または"P-521"である場合:
[RFC6090] のセクション5.4で指定されるECDSA署名プロセスを実行します。 Mをメッセージとして、paramsを ECドメインパラメーターとして使用し、dをprivate鍵として使用します。
rおよびsを、ECDSA署名プロセスの実行から 得られる整数のペアとします。
resultを空のバイトシーケンスとします。
nを、n * 8がparamsによって 識別される楕円曲線の基点の位数の底2の対数より大きいような 最小の整数とします。
rを 長さnのバイトシーケンスに変換し、それをresultに追加します。
sを 長さnのバイトシーケンスに変換し、それをresultに追加します。
[[algorithm]]内部
スロットのnamedCurve属性が、
適用可能な仕様で指定される値である場合:
その仕様で指定されるECDSA署名手順を 実行し、M、params およびdを渡して、resultを生成します。
resultを返します。
keyの[[type]]
内部スロットが"public"でない場合、InvalidAccessErrorをthrowします。
hashAlgorithmを、normalizedAlgorithmの
hash
メンバーとします。
Mを、hashAlgorithmによって指定されるdigest操作を messageを使用して実行した結果とします。
Qを、keyに関連付けられたECDSA公開鍵とします。
paramsを、 keyに関連付けられたECドメインパラメーターとします。
[[algorithm]]内部
スロットのnamedCurve属性が
"P-256"、"P-384"または"P-521"である場合:
[RFC6090] のセクション5.3で指定されるECDSA検証プロセスを実行します。 Mを受信したメッセージとして、signatureを受信した署名として使用し、 paramsをECドメインパラメーターとして使用し、 Qを公開鍵として使用します。
[[algorithm]]内部
スロットのnamedCurve属性が、
適用可能な仕様で指定される値である場合:
その仕様で指定されるECDSA検証 手順を実行し、M、signature、 paramsおよびQを渡して、主張された署名が有効かどうかの 指示を生成します。
resultを、署名が有効であれば値true、
それ以外であれば値falseを持つbooleanとします。
resultを返します。
usagesが"sign"または"verify"のいずれでもない値を
含む場合、
SyntaxErrorを
throwします。
namedCurveメンバーが
"P-256"、"P-384"
または"P-521"である場合:
[RFC6090]
で定義されるように、楕円曲線鍵ペアを生成します。
normalizedAlgorithmの
namedCurveメンバーによって
識別される曲線のドメインパラメーターを使用します。
namedCurveメンバーが
適用可能な仕様で指定される値である場合:
その仕様で指定されるECDSA生成手順を 実行し、 normalizedAlgorithmを渡して、楕円曲線鍵ペアを生成します。
NotSupportedErrorを
throwします。
鍵生成操作の実行がエラーになる場合、
OperationErrorを
throwします。
algorithmを新しい
EcKeyAlgorithm
オブジェクトとします。
algorithmのname属性を
"ECDSA"に設定します。
algorithmのnamedCurve
属性を、normalizedAlgorithmの
namedCurveメンバーと等しく設定します。
publicKeyを、生成された鍵ペアの公開鍵を表す新しいCryptoKey
とします。
publicKeyの[[type]]
内部スロットを"public"に設定します。
publicKeyの[[algorithm]]内部
スロットをalgorithmに設定します。
publicKeyの[[extractable]]内部
スロットをtrueに設定します。
publicKeyの[[usages]]内部スロットを、
usagesと[ "verify" ]の用途の共通部分に設定します。
privateKeyを、生成された鍵ペアのprivate鍵を表す新しいCryptoKey
とします。
privateKeyの[[algorithm]]内部
スロットをalgorithmに設定します。
privateKeyの[[extractable]]内部
スロットをextractableに設定します。
privateKeyの[[usages]]内部スロットを、
usagesと[ "sign" ]の用途の共通部分に設定します。
resultを新しいCryptoKeyPair
辞書とします。
resultのpublicKey属性を
publicKeyに設定します。
resultのprivateKey属性を
privateKeyに設定します。
resultを返します。
keyDataを、インポートされる鍵データとします。
spki"である場合:
usagesが"verify"でない値を
含む場合、
SyntaxErrorをthrowします。
spkiを、keyDataに対して subjectPublicKeyInfoを 解析する アルゴリズムを実行した結果とします。
spkiのalgorithm AlgorithmIdentifierフィールドの
algorithmオブジェクト識別子フィールドが、
[RFC5480]
で定義されるid-ecPublicKey
オブジェクト識別子と等しくない場合、
DataErrorをthrowします。
spkiのalgorithm
AlgorithmIdentifierフィールドのparametersフィールドが存在しない場合、
DataErrorをthrowします。
paramsを、spkiの
algorithm
AlgorithmIdentifierフィールドのparametersフィールドとします。
paramsが
[RFC5480]
で定義されるECParameters ASN.1型のインスタンスでなく、
namedCurveを指定していない場合、
DataErrorをthrowします。
namedCurveを、初期値が undefinedである文字列とします。
他の 適用可能な 仕様によって定義される任意の鍵 インポート手順を実行し、format、 spki を渡して、namedCurveおよびkeyを取得します。
namedCurveが定義されており、かつnormalizedAlgorithmの
namedCurve
メンバーと等しくない場合、DataErrorをthrowします。
公開鍵値が、normalizedAlgorithmの
namedCurve
メンバーによって識別される楕円曲線上の有効な点でない場合、DataErrorをthrowします。
keyの[[type]]
内部スロットを"public"に設定します。
algorithmを新しいEcKeyAlgorithmとします。
algorithmのname属性を
"ECDSA"に設定します。
algorithmのnamedCurve
属性をnamedCurveに設定します。
keyの[[algorithm]]
内部スロットをalgorithmに設定します。
pkcs8"である場合:
usagesが"sign"でない値を
含む場合、
SyntaxErrorを
throwします。
privateKeyInfoを、keyDataに対して privateKeyInfoを 解析する アルゴリズムを実行した結果とします。
privateKeyInfoの
privateKeyAlgorithm PrivateKeyAlgorithmフィールドの
algorithmオブジェクト識別子フィールドが、
[RFC5480]
で定義されるid-ecPublicKeyオブジェクト識別子と等しくない場合、
DataErrorを
throwします。
privateKeyInfoの
privateKeyAlgorithm PrivateKeyAlgorithmIdentifierフィールドの
parametersフィールドが存在しない場合、
DataErrorを
throwします。
paramsを、privateKeyInfoの
privateKeyAlgorithm PrivateKeyAlgorithmIdentifierフィールドの
parametersフィールドとします。
paramsが
[RFC5480]
で定義されるECParameters ASN.1型のインスタンスでなく、
namedCurveを指定していない場合、
DataErrorをthrowします。
namedCurveを、初期値が undefinedである文字列とします。
ecPrivateKeyを、
ASN.1構造を
解析する
アルゴリズムを実行した結果とします。dataを
privateKeyInfoのprivateKeyフィールドとして、
structureを[RFC5915]の
セクション3で指定されるASN.1
ECPrivateKey構造として、
exactDataをtrueに設定します。
ecPrivateKeyのparametersフィールドが
存在し、かつ
[RFC5480]
で定義されるnamedCurve ASN.1
型のインスタンスでない場合、または
privateKeyInfoの
privateKeyAlgorithm
PrivateKeyAlgorithmIdentifierフィールドの
parametersフィールドと同じオブジェクト識別子を
含まない場合、
DataErrorを
throwします。
keyを、
[RFC5915]
のセクション3で定義される変換手順を
ecPrivateKeyを使用して実行することによって識別される楕円曲線private鍵を
表す新しいCryptoKey
とします。
他の 適用可能な 仕様によって定義される任意の鍵 インポート手順を実行し、format、 privateKeyInfo を渡して、namedCurveおよびkeyを取得します。
namedCurveが定義されており、かつnormalizedAlgorithmの
namedCurve
メンバーと等しくない場合、DataErrorをthrowします。
private鍵値が、normalizedAlgorithmの
namedCurve
メンバーによって識別される楕円曲線上の有効な点でない場合、DataErrorをthrowします。
algorithmを新しいEcKeyAlgorithmとします。
algorithmのname属性を
"ECDSA"に設定します。
algorithmのnamedCurve
属性をnamedCurveに設定します。
keyの[[algorithm]]
内部スロットをalgorithmに設定します。
jwk"である場合:JsonWebKey
辞書である場合:jwkをkeyDataと等しくします。
dフィールドが存在し、
usagesが
"sign"でない値を含む場合、または、
dフィールドが存在せず、
usagesが
"verify"でない値を含む場合、
SyntaxErrorを
throwします。
usagesが空でなく、かつjwkのuseフィールドが
存在し、"sig"でない場合、
DataErrorを
throwします。
jwkのkey_opsフィールドが
存在し、JSON Web
Key [JWK]の要件に従って無効である場合、または
指定されたすべてのusages
値を含まない場合、
DataErrorを
throwします。
jwkのextフィールドが
存在し、値がfalseであり、かつextractableがtrueである場合、
DataErrorを
throwします。
namedCurveを、jwkの
crvフィールドと等しい値を持つ
文字列とします。
namedCurveがnormalizedAlgorithmのnamedCurve
メンバーと等しくない場合、DataErrorをthrowします。
P-256"、
"P-384"または"P-521"と等しい場合:
他の 適用可能な 仕様によって定義される任意の鍵 インポート手順を実行し、format、 jwk を渡して、keyを取得します。
鍵値が、normalizedAlgorithmの
namedCurve
メンバーによって識別される楕円曲線上の有効な点でない場合、DataErrorをthrowします。
algorithmを新しいEcKeyAlgorithm
オブジェクトのインスタンスとします。
algorithmのname属性を
"ECDSA"に設定します。
algorithmのnamedCurve
属性をnamedCurveに設定します。
keyの[[algorithm]]
内部スロットをalgorithmに設定します。
raw"である場合:
normalizedAlgorithmのnamedCurve
メンバーが
名前付き曲線でない場合、
DataErrorを
throwします。
usagesが"verify"でない値を
含む場合、
SyntaxErrorを
throwします。
P-256"、
"P-384"または"P-521"である場合:
他の 適用可能な 仕様によって定義される任意の鍵インポート 手順を実行し、format、 keyData を渡して、keyを取得します。
algorithmを新しいEcKeyAlgorithm
オブジェクトとします。
algorithmのname属性を
"ECDSA"に設定します。
algorithmのnamedCurve
属性を、normalizedAlgorithmのnamedCurve
メンバーと等しく設定します。
keyの[[type]]
内部スロットを"public"に設定します。
keyの[[algorithm]]
内部スロットをalgorithmに設定します。
NotSupportedErrorを
throwします。
keyを返します。
keyを、エクスポートされるCryptoKeyとします。
keyの[[handle]]内部スロットによって表される
基盤となる暗号鍵素材にアクセスできない場合、
OperationErrorをthrowします。
spki"である場合:
keyの[[type]]
内部スロットが"public"でない場合、
InvalidAccessErrorをthrowします。
dataを、[RFC5280]
で定義されるSubjectPublicKeyInfo
ASN.1構造のインスタンスとし、次のプロパティを持つものとします:
algorithmフィールドを、次のプロパティを持つ
AlgorithmIdentifier ASN.1型に設定します:
algorithmフィールドを、
[RFC5480]
で定義されるOID
id-ecPublicKeyに設定します。
parametersフィールドを、
[RFC5480]
で定義されるECParameters
ASN.1型のインスタンスに、次のように設定します:
[[algorithm]]
内部スロットのnamedCurve
属性が"P-256"、
"P-384"または"P-521"である場合:
keyDataを、
keyの[[handle]]
内部スロットによって表される楕円曲線公開鍵を、
[RFC5480]
のセクション2.2で指定されるエンコーディング規則に従い、
非圧縮形式を使用して表す
バイト
シーケンスとします。およびkeyData。
[[algorithm]]
内部スロットのnamedCurve
属性が
"P-256"である場合:
parametersを、
[RFC5480]
で定義されるオブジェクト識別子
secp256r1と等しい値を持つ
namedCurve choiceに設定します。
[[algorithm]]
内部スロットのnamedCurve
属性が
"P-384"である場合:
parametersを、
[RFC5480]
で定義されるオブジェクト識別子
secp384r1と等しい値を持つ
namedCurve choiceに設定します。
[[algorithm]]
内部スロットのnamedCurve
属性が
"P-521"である場合:
parametersを、
[RFC5480]
で定義されるオブジェクト識別子
secp521r1と等しい値を持つ
namedCurve choiceに設定します。
他の
適用可能な
仕様によって定義される任意の鍵
エクスポート手順を実行し、
formatと
keyの[[algorithm]]
内部スロットのnamedCurve
属性を渡して、namedCurveOidおよび
keyDataを取得します。
parametersを、
namedCurveOidというオブジェクト識別子と等しい値を持つ
namedCurve choiceに設定します。
subjectPublicKeyフィールドをkeyDataに設定します。
resultを、dataをDERエンコードした結果とします。
pkcs8"である場合:
keyの[[type]]
内部スロットが"private"でない場合、
InvalidAccessErrorをthrowします。
dataを、[RFC5208]
で定義されるPrivateKeyInfo
ASN.1構造のインスタンスとし、次のプロパティを持つものとします:
versionフィールドを0に設定します。
privateKeyAlgorithmフィールドを、次のプロパティを持つ
PrivateKeyAlgorithmIdentifier ASN.1型に設定します:
algorithmフィールドを、
[RFC5480]
で定義されるOID
id-ecPublicKeyに設定します。
parametersフィールドを、
[RFC5480]
で定義されるECParameters
ASN.1型のインスタンスに、次のように設定します:
[[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鍵に関連付けられた
楕円曲線公開鍵を表します。
[[algorithm]]
内部スロットのnamedCurve
属性が
"P-256"である場合:
parametersを、
[RFC5480]
で定義されるオブジェクト識別子
secp256r1と等しい値を持つ
namedCurve choiceに設定します。
[[algorithm]]
内部スロットのnamedCurve
属性が
"P-384"である場合:
parametersを、
[RFC5480]
で定義されるオブジェクト識別子
secp384r1と等しい値を持つ
namedCurve choiceに設定します。
[[algorithm]]
内部スロットのnamedCurve
属性が
"P-521"である場合:
parametersを、
[RFC5480]
で定義されるオブジェクト識別子
secp521r1と等しい値を持つ
namedCurve choiceに設定します。
他の
適用可能な
仕様によって定義される任意の鍵
エクスポート手順を実行し、
formatと
keyの[[algorithm]]
内部スロットのnamedCurve
属性を渡して、namedCurveOidおよび
keyDataを取得します。
parametersを、
namedCurveOidというオブジェクト識別子と等しい値を持つ
namedCurve choiceに設定します。
privateKeyフィールドをkeyDataに設定します。
resultを、dataをDERエンコードした結果とします。
jwk"である場合:
jwkを新しいJsonWebKey
辞書とします。
jwkのkty属性を
"EC"に設定します。
[[algorithm]]
内部スロットのnamedCurve
属性が"P-256"、"P-384"または
"P-521"である場合:
[[algorithm]]
内部スロットのnamedCurve
属性が"P-256"である場合:
crv
属性を"P-256"に設定します。
[[algorithm]]
内部スロットのnamedCurve
属性が"P-384"である場合:
crv
属性を"P-384"に設定します。
[[algorithm]]
内部スロットのnamedCurve
属性が"P-521"である場合:
crv
属性を"P-521"に設定します。
jwkのx
属性を、JSON Web Algorithms
[JWA]
のセクション6.2.1.2の定義に従って設定します。
jwkのy
属性を、JSON Web Algorithms
[JWA]
のセクション6.2.1.3の定義に従って設定します。
他の
適用可能な
仕様によって定義される任意の鍵
エクスポート手順を実行し、formatと
keyの[[algorithm]]
内部スロットのnamedCurve
属性を渡して、
namedCurveおよびjwkの新しい値を取得します。
jwkのcrv
属性を
namedCurveに設定します。
jwkのkey_ops属性を、keyのusages属性に設定します。
jwkのext属性を、keyの[[extractable]]
内部スロットに設定します。
resultをjwkとします。
raw"である場合:
keyの[[type]]
内部スロットが"public"でない場合、
InvalidAccessErrorをthrowします。
[[algorithm]]
内部スロットのnamedCurve
属性が"P-256"、"P-384"
または"P-521"である場合:
dataを、keyの[[handle]]
内部スロットによって表される楕円曲線点Qを、
[SEC1]
2.3.3に従い非圧縮形式を使用して表す
バイト
シーケンスとします。
他の適用可能な
仕様によって定義される任意の鍵エクスポート
手順を実行し、formatと
keyの[[algorithm]]
内部スロットのnamedCurve
属性を渡して、
namedCurveおよびdataを取得します。
resultをdataとします。
resultを返します。
このセクションは非規範的です。
これは、[RFC6090]で指定される、 鍵生成および鍵合意のためのElliptic Curve Diffie-Hellman (ECDH)の使用について説明します。
他の 仕様は、 ECDHで追加の楕円曲線を使用することを指定できます。 追加の楕円曲線を指定するには、仕様は 曲線名、 ECDH生成手順、 ECDH導出手順、 ECDH 鍵インポート手順および ECDH 鍵エクスポート手順を定義しなければなりません。
このアルゴリズムの認識されるアルゴリズム名は
"ECDH"です。
| 操作 | パラメーター | 結果 |
|---|---|---|
| generateKey | EcKeyGenParams
|
CryptoKeyPair
|
| deriveBits | EcdhKeyDeriveParams |
バイト シーケンス |
| importKey | EcKeyImportParams |
CryptoKey |
| exportKey | なし | object |
WebIDLdictionary EcdhKeyDeriveParams : Algorithm {
required CryptoKey public;
};
publicメンバーは、ピアのEC公開鍵を表します。
usagesが"deriveKey"または"deriveBits"でないエントリを
含む場合、throw a
SyntaxErrorします。
namedCurveメンバーが
"P-256"、"P-384"
または"P-521"である場合:
[RFC6090]
で定義されるように、楕円曲線鍵ペアを生成します。
normalizedAlgorithmの
namedCurveメンバーによって
識別される曲線のドメインパラメーターを使用します。
namedCurveメンバーが、
ECDHでその値を使用することを指定する
適用可能な仕様で
指定される値である場合:
その仕様で指定されるECDH生成手順を 実行し、normalizedAlgorithmを渡して、楕円曲線鍵ペアを生成します。
throw a
NotSupportedErrorします。
操作の実行がエラーになる場合、
throw a
OperationErrorします。
algorithmを新しい
EcKeyAlgorithm
オブジェクトとします。
algorithmのnameメンバーを
"ECDH"に設定します。
algorithmのnamedCurve
属性を、normalizedAlgorithmの
namedCurveメンバーと等しく設定します。
publicKeyを、生成された鍵ペアの公開鍵を表す新しいCryptoKey
とします。
publicKeyの[[type]]
内部スロットを"public"に設定します。
publicKeyの[[algorithm]]内部
スロットをalgorithmに設定します。
publicKeyの[[extractable]]内部
スロットをtrueに設定します。
publicKeyの[[usages]]内部スロットを
空リストに設定します。
privateKeyを、生成された鍵ペアのprivate鍵を表す新しいCryptoKey
とします。
privateKeyの[[algorithm]]内部
スロットをalgorithmに設定します。
privateKeyの[[extractable]]内部
スロットをextractableに設定します。
privateKeyの[[usages]]内部スロットを、
usagesと[ "deriveKey", "deriveBits" ]の
用途の共通部分に設定します。
resultを新しいCryptoKeyPair
辞書とします。
resultのpublicKey属性を
publicKeyに設定します。
resultのprivateKey属性を
privateKeyに設定します。
resultを返します。
keyの[[type]]
内部スロットが"private"でない場合、
InvalidAccessErrorをthrowします。
publicKeyを、
normalizedAlgorithmの
publicメンバーとします。
publicKeyの[[type]]
内部スロットが"public"でない場合、
InvalidAccessErrorをthrowします。
publicKeyの
[[algorithm]]内部
スロットのname属性が、
keyの
[[algorithm]]内部
スロットのnameプロパティと
等しくない場合、InvalidAccessErrorをthrowします。
publicKeyの
[[algorithm]]内部
スロットのnamedCurve属性が、
keyの
[[algorithm]]内部
スロットのnamedCurveプロパティと
等しくない場合、InvalidAccessErrorをthrowします。
[[algorithm]]内部
スロットのnamedCurveプロパティが
"P-256"、"P-384"
または"P-521"である場合:
[RFC6090]
セクション4で指定されるECDHプリミティブを実行します。
keyをEC private鍵dとして使用し、
publicKeyの[[handle]]
内部スロットによって表されるEC公開鍵をEC公開鍵として使用します。
secretを、 [RFC6090] のセクション6.2で定義される体要素から オクテット文字列への変換をECDHプリミティブの出力に適用した結果を含む バイトシーケンス とします。
[[algorithm]]内部
スロットのnamedCurveプロパティが、
ECDHでその値を使用することを指定する
適用可能な仕様で
指定される値である場合:
その仕様で指定されるECDH導出手順を 実行し、keyおよびpublicKeyを渡して、 secretを生成します。
throw a
NotSupportedErrorします。
操作の実行がエラーになる場合、
throw a
OperationErrorします。
OperationErrorを
throwします。
keyDataを、インポートされる鍵データとします。
spki"である場合:
usagesが空でない場合、
SyntaxErrorをthrowします。
spkiを、keyDataに対して subjectPublicKeyInfoを 解析する アルゴリズムを実行した結果とします。
spkiのalgorithm AlgorithmIdentifierフィールドの
algorithmオブジェクト識別子フィールドが、
[RFC5480]
で定義されるid-ecPublicKey
オブジェクト識別子と等しくない場合、
DataErrorをthrowします。
spkiのalgorithm
AlgorithmIdentifierフィールドのparametersフィールドが存在しない場合、
DataErrorをthrowします。
paramsを、spkiの
algorithm
AlgorithmIdentifierフィールドのparametersフィールドとします。
paramsが
[RFC5480]
で定義されるECParameters ASN.1型のインスタンスでなく、
namedCurveを指定していない場合、DataErrorをthrowします。
namedCurveを、初期値が undefinedである文字列とします。
他の 適用可能な 仕様によって定義される任意の鍵インポート 手順を実行し、format、 spki を渡して、namedCurveおよびkeyを取得します。
namedCurveが定義されており、かつnormalizedAlgorithmの
namedCurve
メンバーと等しくない場合、DataErrorをthrowします。
鍵値が、normalizedAlgorithmの
namedCurve
メンバーによって識別される楕円曲線上の有効な点でない場合、
DataErrorをthrowします。
keyの[[type]]
内部スロットを"public"に設定します。
algorithmを新しいEcKeyAlgorithmとします。
algorithmのname属性を
"ECDH"に設定します。
algorithmのnamedCurve
属性をnamedCurveに設定します。
keyの[[algorithm]]
内部スロットをalgorithmに設定します。
pkcs8"である場合:
usagesが"deriveKey"または"deriveBits"でない
エントリを含む場合、
SyntaxErrorをthrowします。
privateKeyInfoを、keyDataに対して privateKeyInfoを 解析する アルゴリズムを実行した結果とします。
privateKeyInfoの
privateKeyAlgorithm PrivateKeyAlgorithmフィールドの
algorithmオブジェクト識別子フィールドが、
[RFC5480]
で定義されるid-ecPublicKeyオブジェクト識別子と
等しくない場合、
DataErrorをthrowします。
privateKeyInfoの
privateKeyAlgorithm PrivateKeyAlgorithmIdentifierフィールドの
parametersフィールドが存在しない場合、
DataErrorをthrowします。
paramsを、privateKeyInfoの
privateKeyAlgorithm PrivateKeyAlgorithmIdentifierフィールドの
parametersフィールドとします。
paramsが
[RFC5480]
で定義されるECParameters ASN.1型のインスタンスでなく、
namedCurveを指定していない場合、DataErrorをthrowします。
namedCurveを、初期値が undefinedである文字列とします。
ecPrivateKeyを、
ASN.1構造を
解析する
アルゴリズムを実行した結果とします。dataを
privateKeyInfoのprivateKeyフィールドとして、
structureを[RFC5915]の
セクション3で指定されるASN.1
ECPrivateKey構造として、
exactDataをtrueに設定します。
ecPrivateKeyのparametersフィールドが
存在し、かつ
[RFC5480]
で定義されるnamedCurve ASN.1
型のインスタンスでない場合、または
privateKeyInfoの
privateKeyAlgorithm
PrivateKeyAlgorithmIdentifierフィールドの
parametersフィールドと同じオブジェクト識別子を
含まない場合、
DataErrorをthrowします。
keyを、
[RFC5915]
のセクション3で定義される変換手順を
ecPrivateKeyを使用して実行することによって識別される
楕円曲線private鍵を表す新しいCryptoKey
とします。
他の 適用可能な 仕様によって定義される任意の鍵インポート 手順を実行し、format、 privateKeyInfo を渡して、namedCurveおよびkeyを取得します。
namedCurveが定義されており、かつnormalizedAlgorithmの
namedCurve
メンバーと等しくない場合、DataErrorをthrowします。
鍵値が、normalizedAlgorithmの
namedCurve
メンバーによって識別される楕円曲線上の有効な点でない場合、
DataErrorをthrowします。
algorithmを新しいEcKeyAlgorithmとします。
algorithmのname属性を
"ECDH"に設定します。
algorithmのnamedCurve
属性をnamedCurveに設定します。
keyの[[algorithm]]
内部スロットをalgorithmに設定します。
jwk"である場合:JsonWebKey
辞書である場合:jwkをkeyDataと等しくします。
dフィールドが存在し、
usagesが"deriveKey"または
"deriveBits"でないエントリを含む場合、
SyntaxErrorをthrowします。
dフィールドが存在せず、
usagesが空でない場合、
SyntaxErrorをthrowします。
usagesが空でなく、かつjwkのuseフィールドが
存在し、"enc"と等しくない場合、
DataErrorをthrowします。
jwkのkey_opsフィールドが
存在し、JSON Web
Key [JWK]の要件に従って無効である場合、または
指定されたすべてのusages
値を含まない場合、DataErrorをthrowします。
jwkのextフィールドが
存在し、値がfalseであり、かつextractableがtrueである場合、
DataErrorをthrowします。
namedCurveを、jwkの
crvフィールドと等しい値を持つ
文字列とします。
namedCurveがnormalizedAlgorithmの
namedCurve
メンバーと等しくない場合、DataErrorをthrowします。
P-256"、
"P-384"または"P-521"である場合:
dフィールドが
存在する場合:他の 適用可能な 仕様によって定義される任意の鍵インポート 手順を実行し、format、 jwk を渡して、keyを取得します。
鍵値が、normalizedAlgorithmの
namedCurve
メンバーによって識別される楕円曲線上の有効な点でない場合、
DataErrorをthrowします。
algorithmを新しいEcKeyAlgorithm
オブジェクトのインスタンスとします。
algorithmのname属性を
"ECDH"に設定します。
algorithmのnamedCurve
属性をnamedCurveに設定します。
keyの[[algorithm]]
内部スロットをalgorithmに設定します。
raw"である場合:
normalizedAlgorithmのnamedCurve
メンバーが
名前付き曲線でない場合、
DataErrorをthrowします。
usagesが空リストでない場合、
SyntaxErrorをthrowします。
P-256"、
"P-384"または"P-521"である場合:
他の 適用可能な 仕様によって定義される任意の鍵インポート 手順を実行し、format、 keyData を渡して、keyを取得します。
algorithmを新しいEcKeyAlgorithm
オブジェクトとします。
algorithmのname属性を
"ECDH"に設定します。
algorithmのnamedCurve
属性を、normalizedAlgorithmの
namedCurve
メンバーと等しく設定します。
keyの[[type]]
内部スロットを"public"に設定します。
keyの[[algorithm]]
内部スロットをalgorithmに設定します。
keyを返します。
keyを、エクスポートされるCryptoKeyとします。
keyの[[handle]]内部スロットによって表される
基盤となる暗号鍵素材にアクセスできない場合、OperationErrorをthrowします。
spki"である場合:
keyの[[type]]
内部スロットが"public"でない場合、InvalidAccessErrorをthrowします。
dataを、[RFC5280]
で定義されるSubjectPublicKeyInfo
ASN.1構造のインスタンスとし、次のプロパティを持つものとします:
algorithmフィールドを、次のプロパティを持つ
AlgorithmIdentifier ASN.1型に設定します:
algorithmフィールドを、
[RFC5480]
で定義されるOID
id-ecPublicKeyに設定します。
parametersフィールドを、
[RFC5480]
で定義されるECParameters
ASN.1型のインスタンスに、次のように設定します:
[[algorithm]]
内部スロットのnamedCurve
属性が"P-256"、
"P-384"または"P-521"である場合:
keyDataを、keyの[[handle]]
内部スロットによって表される楕円曲線公開鍵を、
[SEC1]
のセクション2.3.3で指定されるエンコーディング規則に従い、非圧縮形式を使用して表す
バイト
シーケンスとします。
[[algorithm]]
内部スロットのnamedCurve
属性が
"P-256"である場合:
parametersを、
[RFC5480]
で定義されるオブジェクト識別子
secp256r1と等しい値を持つ
namedCurve choiceに設定します。
[[algorithm]]
内部スロットのnamedCurve
属性が
"P-384"である場合:
parametersを、
[RFC5480]
で定義されるオブジェクト識別子
secp384r1と等しい値を持つ
namedCurve choiceに設定します。
[[algorithm]]
内部スロットのnamedCurve
属性が
"P-521"である場合:
parametersを、
[RFC5480]
で定義されるオブジェクト識別子
secp521r1と等しい値を持つ
namedCurve choiceに設定します。
他の
適用可能な
仕様によって定義される任意の鍵
エクスポート手順を実行し、
formatと
keyの[[algorithm]]
内部スロットのnamedCurve
属性を渡して、namedCurveOidおよび
keyDataを取得します。
parametersを、
namedCurveOidというオブジェクト識別子と等しい値を持つ
namedCurve choiceに設定します。
subjectPublicKeyフィールドをkeyDataに設定します。
pkcs8"である場合:
keyの[[type]]
内部スロットが"private"でない場合、InvalidAccessErrorをthrowします。
dataを、[RFC5208]
で定義されるPrivateKeyInfo
ASN.1構造のインスタンスとし、次のプロパティを持つものとします:
versionフィールドを0に設定します。
privateKeyAlgorithmフィールドを、次のプロパティを持つ
PrivateKeyAlgorithmIdentifier ASN.1型に設定します:
algorithmフィールドを、
[RFC5480]
で定義されるOID
id-ecPublicKeyに設定します。
parametersフィールドを、
[RFC5480]
で定義されるECParameters
ASN.1型のインスタンスに、次のように設定します:
[[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鍵に関連付けられた
楕円曲線公開鍵を表します。
[[algorithm]]
内部スロットのnamedCurve
属性が
"P-256"である場合:
parametersを、
[RFC5480]
で定義されるオブジェクト識別子
secp256r1と等しい値を持つ
namedCurve choiceに設定します。
[[algorithm]]
内部スロットのnamedCurve
属性が
"P-384"である場合:
parametersを、
[RFC5480]
で定義されるオブジェクト識別子
secp384r1と等しい値を持つ
namedCurve choiceに設定します。
[[algorithm]]
内部スロットのnamedCurve
属性が
"P-521"である場合:
parametersを、
[RFC5480]
で定義されるオブジェクト識別子
secp521r1と等しい値を持つ
namedCurve choiceに設定します。
他の
適用可能な
仕様によって定義される任意の鍵
エクスポート手順を実行し、
formatと
keyの[[algorithm]]
内部スロットのnamedCurve
属性を渡して、namedCurveOidおよび
keyDataを取得します。
parametersを、
namedCurveOidというオブジェクト識別子と等しい値を持つ
namedCurve choiceに設定します。
privateKeyフィールドをkeyDataに設定します。
jwk"である場合:
jwkを新しいJsonWebKey
辞書とします。
jwkのkty属性を
"EC"に設定します。
[[algorithm]]
内部スロットのnamedCurve
属性が"P-256"、"P-384"
または"P-521"である場合:
[[algorithm]]
内部スロットのnamedCurve
属性が"P-256"である場合:
crv
属性を
"P-256"に設定します。
[[algorithm]]
内部スロットのnamedCurve
属性が"P-384"である場合:
crv
属性を
"P-384"に設定します。
[[algorithm]]
内部スロットのnamedCurve
属性が"P-521"である場合:
crv
属性を
"P-521"に設定します。
jwkのx
属性を、JSON Web Algorithms
[JWA]
のセクション6.2.1.2の定義に従って設定します。
jwkのy
属性を、JSON Web Algorithms
[JWA]
のセクション6.2.1.3の定義に従って設定します。
他の
適用可能な
仕様によって定義される任意の鍵エクスポート
手順を実行し、formatと
keyの[[algorithm]]
内部スロットのnamedCurve
属性を渡して、
namedCurveおよびjwkの新しい値を取得します。
jwkのcrv
属性を
namedCurveに設定します。
jwkのkey_ops属性を、keyの
usages属性に設定します。
jwkのext属性を、keyの[[extractable]]
内部スロットに設定します。
resultをjwkとします。
raw"である場合:
keyの[[type]]
内部スロットが"public"でない場合、InvalidAccessErrorをthrowします。
[[algorithm]]
内部スロットのnamedCurve
属性が"P-256"、"P-384"
または"P-521"である場合:
dataを、keyの[[handle]]
内部スロットによって表される楕円曲線公開鍵を、
[SEC1]
のセクション2.3.3で指定されるエンコーディング規則に従い、非圧縮形式を使用して表す
バイト
シーケンスとします。
他の適用可能な
仕様によって定義される任意の鍵エクスポート
手順を実行し、formatと
keyの[[algorithm]]
内部スロットのnamedCurve
属性を渡して、
namedCurveおよびdataを取得します。
resultをdataとします。
resultを返します。
このセクションは非規範的です。
"Ed25519"アルゴリズム識別子は、[RFC8032]で指定される
Ed25519アルゴリズムを使用して、署名および検証を実行するために使用されます。
このアルゴリズムの認識されるアルゴリズム名は
"Ed25519"です。
| 操作 | パラメーター | 結果 |
|---|---|---|
| sign | なし | バイト シーケンス |
| verify | なし | boolean |
| generateKey | なし | CryptoKeyPair
|
| importKey | なし | CryptoKey |
| exportKey | なし | object |
keyの[[type]]
内部スロットが"private"でない場合、
InvalidAccessErrorをthrowします。
resultを、[RFC8032] のセクション5.1.6で指定されるEd25519署名プロセスを実行した結果とします。 messageをMとして、keyに関連付けられた Ed25519 private鍵を使用します。
一部の実装は、[RFC8032]に従う 決定論的署名ではなく、draft-irtf-cfrg-det-sigs-with-noise に従ってランダム化署名を生成する場合があります(または生成したい場合があります)。
WICG/webcrypto-secure-curves issue 28を参照してください。
resultを返します。
keyの[[type]]
内部スロットが"public"でない場合、InvalidAccessErrorをthrowします。
keyの鍵データがEd25519の楕円曲線上の無効な点または小位数要素を表す場合、
falseを返します。
すべての実装がこのチェックを実行するわけではありません。
WICG/webcrypto-secure-curves issue 27を参照してください。
signatureの前半にエンコードされた点Rが、Ed25519の楕円曲線上の
無効な点または小位数要素を表す場合、falseを返します。
すべての実装がこのチェックを実行するわけではありません。
WICG/webcrypto-secure-curves issue 27を参照してください。
[RFC8032]
のセクション5.1.7で指定されるEd25519検証手順を実行します。
余因子なし(バッチ化なし)の等式
[S]B = R + [k]A'を使用し、signatureに対して、messageを
Mとして、
keyに関連付けられたEd25519公開鍵を使用します。
resultを、署名が有効であれば値true、
それ以外であれば値falseを持つbooleanとします。
resultを返します。
usagesが"sign"または"verify"のいずれでもない値を
含む場合、
SyntaxErrorを
throwします。
[RFC8032]の セクション5.1.5で定義されるように、Ed25519鍵ペアを生成します。
algorithmを新しいKeyAlgorithmオブジェクトとします。
algorithmのname属性を
"Ed25519"に設定します。
publicKeyを、生成された鍵ペアの公開鍵を表す新しいCryptoKey
とします。
publicKeyの[[type]]
内部スロットを"public"に設定します。
publicKeyの[[algorithm]]内部
スロットをalgorithmに設定します。
publicKeyの[[extractable]]内部
スロットをtrueに設定します。
publicKeyの[[usages]]内部スロットを、
usagesと[ "verify" ]の用途の共通部分に設定します。
privateKeyを、生成された鍵ペアのprivate鍵を表す新しいCryptoKey
とします。
privateKeyの[[algorithm]]内部
スロットをalgorithmに設定します。
privateKeyの[[extractable]]内部
スロットをextractableに設定します。
privateKeyの[[usages]]内部スロットを、
usagesと[ "sign" ]の用途の共通部分に設定します。
resultを新しいCryptoKeyPair
辞書とします。
resultのpublicKey属性を
publicKeyに設定します。
resultのprivateKey属性を
privateKeyに設定します。
resultを返します。
keyDataを、インポートされる鍵データとします。
spki"である場合:
usagesが"verify"でない値を含む場合、
SyntaxErrorを
throwします。
spkiを、keyDataに対して subjectPublicKeyInfoを 解析する アルゴリズムを実行した結果とします。
spkiのalgorithm AlgorithmIdentifierフィールドの
algorithmオブジェクト識別子フィールドが、
[RFC8410]
で定義されるid-Ed25519
オブジェクト識別子と等しくない場合、
DataErrorを
throwします。
spkiのalgorithm
AlgorithmIdentifierフィールドのparametersフィールドが存在する場合、
DataErrorを
throwします。
publicKeyを、spkiのsubjectPublicKeyフィールドによって
識別されるEd25519公開鍵とします。
keyを、publicKeyを表す新しいCryptoKey
とします。
keyの[[type]]
内部スロットを"public"に設定します。
algorithmを新しいKeyAlgorithmとします。
algorithmのname属性を
"Ed25519"に設定します。
keyの[[algorithm]]
内部スロットをalgorithmに設定します。
pkcs8"である場合:
usagesが"sign"でない値を含む場合、
SyntaxErrorを
throwします。
privateKeyInfoを、keyDataに対して privateKeyInfoを 解析する アルゴリズムを実行した結果とします。
privateKeyInfoの
privateKeyAlgorithm PrivateKeyAlgorithmフィールドの
algorithmオブジェクト識別子フィールドが、
[RFC8410]
で定義されるid-Ed25519オブジェクト識別子と等しくない場合、
DataErrorを
throwします。
privateKeyInfoの
privateKeyAlgorithm PrivateKeyAlgorithmIdentifierフィールドの
parametersフィールドが存在する場合、
DataErrorを
throwします。
curvePrivateKeyを、
ASN.1構造を解析する
アルゴリズムを実行した結果とします。dataを
privateKeyInfoのprivateKeyフィールドとして、
structureを[RFC8410]の
セクション7で指定されるASN.1
CurvePrivateKey構造として、
exactDataをtrueに設定します。
keyを、
curvePrivateKeyによって識別されるEd25519 private鍵を表す新しい
CryptoKey
とします。
algorithmを新しいKeyAlgorithmとします。
algorithmのname属性を
"Ed25519"に設定します。
keyの[[algorithm]]
内部スロットをalgorithmに設定します。
jwk"である場合:JsonWebKey
辞書である場合:jwkをkeyDataと等しくします。
dフィールドが存在し、
usagesが"sign"でない値を含む場合、または、
dフィールドが存在せず、
usagesが"verify"でない値を含む場合、
SyntaxErrorを
throwします。
jwkのalgフィールドが存在し、
"Ed25519"または"EdDSA"でない場合、
DataErrorを
throwします。
usagesが空でなく、かつjwkのuseフィールドが存在し、
"sig"でない場合、
DataErrorを
throwします。
jwkのkey_opsフィールドが
存在し、JSON Web
Key [JWK]の要件に従って無効である場合、または
指定されたすべてのusages
値を含まない場合、
DataErrorを
throwします。
jwkのextフィールドが存在し、
値がfalseであり、かつextractableがtrueである場合、
DataErrorを
throwします。
dフィールドが
存在する場合:
algorithmを新しいKeyAlgorithm
オブジェクトのインスタンスとします。
algorithmのname属性を
"Ed25519"に設定します。
keyの[[algorithm]]
内部スロットをalgorithmに設定します。
raw"である場合:
usagesが"verify"でない値を含む場合、
SyntaxErrorを
throwします。
algorithmを新しいKeyAlgorithmオブジェクトとします。
algorithmのname属性を
"Ed25519"に設定します。
keyを、keyDataで提供される鍵データを表す新しいCryptoKey
とします。
keyの[[type]]
内部スロットを"public"に設定します。
keyの[[algorithm]]
内部スロットをalgorithmに設定します。
NotSupportedErrorを
throwします。
keyを返します。
keyを、エクスポートされるCryptoKeyとします。
keyの[[handle]]内部スロットによって表される
基盤となる暗号鍵素材にアクセスできない場合、
OperationErrorをthrowします。
spki"である場合:
keyの[[type]]
内部スロットが"public"でない場合、InvalidAccessErrorをthrowします。
dataを、[RFC5280]
で定義されるSubjectPublicKeyInfo
ASN.1構造のインスタンスとし、次のプロパティを持つものとします:
algorithmフィールドを、次のプロパティを持つ
AlgorithmIdentifier ASN.1型に設定します:
algorithmオブジェクト識別子を、
[RFC8410]
で定義されるid-Ed25519 OIDに設定します。
subjectPublicKeyフィールドをkeyDataに設定します。
resultを、dataをDERエンコードした結果とします。
pkcs8"である場合:
keyの[[type]]
内部スロットが"private"でない場合、InvalidAccessErrorをthrowします。
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鍵を表します。
resultを、dataをDERエンコードした結果とします。
jwk"である場合:
jwkを新しいJsonWebKey
辞書とします。
jwkのkty属性を
"OKP"に設定します。
jwkのalg属性を
"Ed25519"に設定します。
jwkのcrv属性を
"Ed25519"に設定します。
jwkのkey_ops属性を、keyのusages属性に設定します。
jwkのext属性を、keyの[[extractable]]
内部スロットに設定します。
resultをjwkとします。
raw"である場合:
keyの[[type]]
内部スロットが"public"でない場合、InvalidAccessErrorをthrowします。
dataを、keyの[[handle]]
内部スロットによって表されるEd25519公開鍵を表す
バイトシーケンス
とします。
resultをdataとします。
NotSupportedErrorを
throwします。
resultを返します。
このセクションは非規範的です。
"X25519"アルゴリズム識別子は、
[RFC7748]で指定されるX25519アルゴリズムを使用して、
鍵合意を実行するために使用されます。
このアルゴリズムの認識されるアルゴリズム名は
"X25519"です。
| 操作 | パラメーター | 結果 |
|---|---|---|
| deriveBits | EcdhKeyDeriveParams |
バイト シーケンス |
| generateKey | なし | CryptoKeyPair
|
| importKey | なし | CryptoKey |
| exportKey | なし | object |
keyの[[type]]
内部スロットが"private"でない場合、
InvalidAccessErrorをthrowします。
publicKeyを、
normalizedAlgorithmの
publicメンバーとします。
publicKeyの[[type]]
内部スロットが"public"でない場合、InvalidAccessErrorをthrowします。
publicKeyの
[[algorithm]]内部
スロットのname属性が、
keyの
[[algorithm]]内部
スロットのnameプロパティと
等しくない場合、InvalidAccessErrorをthrowします。
secretを、[RFC7748]のセクション5で指定される
X25519関数を実行した結果とします。
keyをX25519 private鍵kとして使用し、
publicKeyの[[handle]]
内部スロットによって表されるX25519公開鍵をX25519公開鍵uとして使用します。
secretが全ゼロ値である場合、
OperationErrorをthrowします。
このチェックは、[RFC7748]のセクション6.1に従い、
定数時間で実行しなければなりません。
OperationErrorをthrowします。
usagesが"deriveKey"または"deriveBits"でないエントリを
含む場合、
SyntaxErrorをthrowします。
[RFC7748]のセクション6.1で定義されるように、
private鍵を32個のランダムバイトとし、
公開鍵をX25519(a, 9)として、X25519鍵ペアを生成します。
algorithmを新しいKeyAlgorithmオブジェクトとします。
algorithmのname属性を
"X25519"に設定します。
publicKeyを、生成された鍵ペアの公開鍵を表す新しいCryptoKey
とします。
publicKeyの[[type]]
内部スロットを"public"に設定します。
publicKeyの[[algorithm]]内部
スロットをalgorithmに設定します。
publicKeyの[[extractable]]内部
スロットをtrueに設定します。
publicKeyの[[usages]]内部スロットを
空リストに設定します。
privateKeyを、生成された鍵ペアのprivate鍵を表す新しいCryptoKey
とします。
privateKeyの[[algorithm]]内部
スロットをalgorithmに設定します。
privateKeyの[[extractable]]内部
スロットをextractableに設定します。
privateKeyの[[usages]]内部スロットを、
usagesと[ "deriveKey", "deriveBits" ]の
用途の共通部分に設定します。
resultを新しいCryptoKeyPair
辞書とします。
resultのpublicKey属性を
publicKeyに設定します。
resultのprivateKey属性を
privateKeyに設定します。
resultを返します。
keyDataを、インポートされる鍵データとします。
spki"である場合:
usagesが空でない場合、
SyntaxErrorを
throwします。
spkiを、keyDataに対して subjectPublicKeyInfoを 解析する アルゴリズムを実行した結果とします。
spkiのalgorithm AlgorithmIdentifierフィールドの
algorithmオブジェクト識別子フィールドが、
[RFC8410]
で定義されるid-X25519
オブジェクト識別子と等しくない場合、
DataErrorを
throwします。
spkiのalgorithm
AlgorithmIdentifierフィールドのparametersフィールドが存在する場合、
DataErrorを
throwします。
publicKeyを、spkiのsubjectPublicKeyフィールドによって
識別されるX25519公開鍵とします。
keyを、publicKeyを表す新しいCryptoKey
とします。
keyの[[type]]
内部スロットを"public"に設定します。
algorithmを新しいKeyAlgorithmとします。
algorithmのname属性を
"X25519"に設定します。
keyの[[algorithm]]
内部スロットをalgorithmに設定します。
pkcs8"である場合:
usagesが"deriveKey"または"deriveBits"でない
エントリを含む場合、
SyntaxErrorを
throwします。
privateKeyInfoを、keyDataに対して privateKeyInfoを 解析する アルゴリズムを実行した結果とします。
privateKeyInfoの
privateKeyAlgorithm PrivateKeyAlgorithmフィールドの
algorithmオブジェクト識別子フィールドが、
[RFC8410]
で定義されるid-X25519オブジェクト識別子と等しくない場合、
DataErrorを
throwします。
privateKeyInfoの
privateKeyAlgorithm PrivateKeyAlgorithmIdentifierフィールドの
parametersフィールドが存在する場合、
DataErrorを
throwします。
curvePrivateKeyを、
ASN.1構造を解析する
アルゴリズムを実行した結果とします。dataを
privateKeyInfoのprivateKeyフィールドとして、
structureを[RFC8410]の
セクション7で指定されるASN.1
CurvePrivateKey構造として、
exactDataをtrueに設定します。
keyを、
curvePrivateKeyによって識別されるX25519 private鍵を表す新しい
CryptoKey
とします。
algorithmを新しいKeyAlgorithmとします。
algorithmのname属性を
"X25519"に設定します。
keyの[[algorithm]]
内部スロットをalgorithmに設定します。
jwk"である場合:JsonWebKey
辞書である場合:jwkをkeyDataと等しくします。
dフィールドが存在し、
usagesが"deriveKey"または
"deriveBits"でないエントリを含む場合、
SyntaxErrorを
throwします。
dフィールドが存在せず、
usagesが空でない場合、
SyntaxErrorを
throwします。
usagesが空でなく、かつjwkのuseフィールドが
存在し、"enc"と等しくない場合、DataErrorを
throwします。
jwkのkey_opsフィールドが
存在し、JSON Web
Key [JWK]の要件に従って無効である場合、または
指定されたすべてのusages
値を含まない場合、
DataErrorを
throwします。
jwkのextフィールドが存在し、
値がfalseであり、かつextractableがtrueである場合、
DataErrorを
throwします。
dフィールドが
存在する場合:
algorithmを新しいKeyAlgorithm
オブジェクトのインスタンスとします。
algorithmのname属性を
"X25519"に設定します。
keyの[[algorithm]]
内部スロットをalgorithmに設定します。
raw"である場合:
usagesが空でない場合、
SyntaxErrorを
throwします。
algorithmを新しいKeyAlgorithmオブジェクトとします。
algorithmのname属性を
"X25519"に設定します。
keyを、keyDataで提供される鍵データを表す新しいCryptoKey
とします。
keyの[[type]]
内部スロットを"public"に設定します。
keyの[[algorithm]]
内部スロットをalgorithmに設定します。
NotSupportedErrorを
throwします。
keyを返します。
keyを、エクスポートされるCryptoKeyとします。
keyの[[handle]]内部スロットによって表される
基盤となる暗号鍵素材にアクセスできない場合、
OperationErrorをthrowします。
spki"である場合:
keyの[[type]]
内部スロットが"public"でない場合、InvalidAccessErrorをthrowします。
dataを、[RFC5280]
で定義されるSubjectPublicKeyInfo
ASN.1構造のインスタンスとし、次のプロパティを持つものとします:
algorithmフィールドを、次のプロパティを持つ
AlgorithmIdentifier ASN.1型に設定します:
algorithmオブジェクト識別子を、
[RFC8410]
で定義されるid-X25519 OIDに設定します。
subjectPublicKeyフィールドをkeyDataに設定します。
resultを、dataをDERエンコードした結果とします。
pkcs8"である場合:
keyの[[type]]
内部スロットが"private"でない場合、InvalidAccessErrorをthrowします。
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鍵を表します。
resultを、dataをDERエンコードした結果とします。
jwk"である場合:
jwkを新しいJsonWebKey
辞書とします。
jwkのkty属性を
"OKP"に設定します。
jwkのcrv属性を
"X25519"に設定します。
jwkのkey_ops属性を、keyのusages属性に設定します。
jwkのext属性を、keyの[[extractable]]
内部スロットに設定します。
resultをjwkとします。
raw"である場合:
keyの[[type]]
内部スロットが"public"でない場合、InvalidAccessErrorをthrowします。
dataを、keyの[[handle]]
内部スロットによって表されるX25519公開鍵を表す
バイトシーケンス
とします。
resultをdataとします。
NotSupportedErrorを
throwします。
resultを返します。
このセクションは非規範的です。
"AES-CTR"アルゴリズム識別子は、
[NIST-SP800-38A]で説明されるように、
CounterモードのAESを使用して暗号化および復号を実行するために使用されます。
このアルゴリズムの認識されるアルゴリズム名は
"AES-CTR"です。
| 操作 | パラメーター | 結果 |
|---|---|---|
| encrypt | AesCtrParams |
バイト シーケンス |
| decrypt | AesCtrParams |
バイト シーケンス |
| generateKey | AesKeyGenParams
|
CryptoKey |
| importKey | なし | CryptoKey |
| exportKey | なし | object |
| get key length | AesDerivedKeyParams |
整数 |
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メンバーは、インクリメントされる
カウンターブロックの右端部分のビット単位の長さを含みます。
WebIDLdictionary AesKeyAlgorithm : KeyAlgorithm {
required unsigned short length;
};
lengthメンバーは、鍵のビット単位の
長さを表します。
WebIDLdictionary AesKeyGenParams : Algorithm {
required [EnforceRange] unsigned short length;
};
lengthメンバーは、鍵のビット単位の
長さを表します。
WebIDLdictionary AesDerivedKeyParams : Algorithm {
required [EnforceRange] unsigned short length;
};
lengthメンバーは、鍵のビット単位の
長さを表します。
normalizedAlgorithmのcounterメンバーが
16バイトの長さを持たない場合、
OperationErrorをthrowします。
normalizedAlgorithmのlengthメンバーがゼロであるか、
128を超える場合、
OperationErrorをthrowします。
ciphertextを、[NIST-SP800-38A]の
セクション6.5で説明されるCTR暗号化操作を実行した結果とします。
ブロック暗号としてAESを使用し、normalizedAlgorithmのcounter
メンバーをカウンターブロックの初期値として、
normalizedAlgorithmの
lengthメンバーを
[NIST-SP800-38A]
のAppendix B.1で定義される標準カウンターブロックインクリメント関数への入力パラメーターmとして、
plaintextを入力平文として使用します。
ciphertextを返します。
normalizedAlgorithmのcounterメンバーが
16バイトの長さを持たない場合、
OperationErrorをthrowします。
normalizedAlgorithmのlengthメンバーがゼロであるか、
128を超える場合、
OperationErrorをthrowします。
plaintextを、[NIST-SP800-38A]の
セクション6.5で説明されるCTR復号操作を実行した結果とします。
ブロック暗号としてAESを使用し、normalizedAlgorithmのcounter
メンバーをカウンターブロックの初期値として、
normalizedAlgorithmの
lengthメンバーを
[NIST-SP800-38A]
のAppendix B.1で定義される標準カウンターブロックインクリメント関数への入力パラメーターmとして、
ciphertextを入力暗号文として使用します。
plaintextを返します。
usagesが"encrypt"、"decrypt"、
"wrapKey"または"unwrapKey"のいずれでもない
エントリを含む場合、
SyntaxErrorをthrowします。
normalizedAlgorithmのlengthメンバーが
128、192または256のいずれとも等しくない場合、
OperationErrorをthrowします。
normalizedAlgorithmのlengthメンバーと等しい長さの
AES鍵を生成します。
鍵生成手順が失敗した場合、
OperationErrorをthrowします。
keyを、生成されたAES鍵を表す新しい
CryptoKeyオブジェクトとします。
algorithmを新しい
AesKeyAlgorithm
とします。
algorithmのname属性を
"AES-CTR"に設定します。
algorithmのlength属性を、
normalizedAlgorithmの
lengthメンバーと等しく設定します。
keyの[[algorithm]]内部
スロットをalgorithmに設定します。
keyの[[extractable]]内部
スロットをextractableに設定します。
keyの[[usages]]内部スロットを
usagesに設定します。
keyを返します。
usagesが"encrypt"、"decrypt"、
"wrapKey"または"unwrapKey"のいずれでもない
エントリを含む場合、
SyntaxErrorをthrowします。
raw"である場合:jwk"である場合:JsonWebKey
辞書である場合:jwkをkeyDataと等しくします。
jwkがJSON Web Algorithms [JWA]のセクション6.4の要件を
満たさない場合、
DataErrorを
throwします。
usagesが空でなく、かつjwkのuseフィールドが存在し、
"enc"でない場合、
DataErrorを
throwします。
jwkのkey_opsフィールドが
存在し、JSON Web Key [JWK]の要件に従って
無効である場合、または指定されたすべてのusages値を含まない場合、
DataErrorを
throwします。
jwkのextフィールドが存在し、
値がfalseであり、かつextractableがtrueである場合、
DataErrorを
throwします。
NotSupportedErrorを
throwします。
keyを、値dataを持つAES鍵を表す新しいCryptoKeyオブジェクトとします。
algorithmを新しい
AesKeyAlgorithm
とします。
algorithmのname属性を
"AES-CTR"に設定します。
algorithmのlength属性を
dataのビット単位の長さに設定します。
keyの[[algorithm]]内部
スロットをalgorithmに設定します。
keyを返します。
keyの[[handle]]内部スロットによって表される
基盤となる暗号鍵素材にアクセスできない場合、
OperationErrorをthrowします。
raw"である場合:
dataを、keyの[[handle]]
内部スロットによって表される鍵の生オクテットを含む
バイトシーケンス
とします。
resultをdataとします。
jwk"である場合:
jwkを新しいJsonWebKey
辞書とします。
jwkのkty属性を文字列
"oct"に設定します。
jwkのk属性を、
keyの[[handle]]
内部スロットによって表される鍵の生オクテットを含む文字列に設定します。
JSON Web Algorithms
[JWA]のセクション6.4に従ってエンコードされます。
jwkのkey_ops属性を、keyの
[[usages]]
内部スロットと等しく設定します。
jwkのext属性を、keyの[[extractable]]
内部スロットと等しく設定します。
resultをjwkとします。
NotSupportedErrorを
throwします。
resultを返します。
normalizedDerivedKeyAlgorithmのlengthメンバーが
128、192または256でない場合、
OperationErrorをthrowします。
normalizedDerivedKeyAlgorithmのlengthメンバーを返します。
このセクションは非規範的です。
"AES-CBC"アルゴリズム識別子は、
[NIST-SP800-38A]で説明されるように、
Cipher Block ChainingモードのAESを使用して暗号化および復号を実行するために使用されます。
CBCモードで動作する場合、AESブロックサイズ(16バイト)の正確な倍数でないメッセージは、 さまざまなパディング方式でパディングできます。 Web Crypto APIでサポートされる唯一のパディングモードは、 [RFC2315]の セクション10.3、ステップ2で説明されるPKCS#7のものです。
このアルゴリズムの認識されるアルゴリズム名は
"AES-CBC"です。
| 操作 | パラメーター | 結果 |
|---|---|---|
| encrypt | AesCbcParams |
バイト シーケンス |
| decrypt | AesCbcParams |
バイト シーケンス |
| generateKey | AesKeyGenParams
|
CryptoKey |
| importKey | なし | CryptoKey |
| exportKey | なし | object |
| get key length | AesDerivedKeyParams |
整数 |
WebIDLdictionary AesCbcParams : Algorithm {
required BufferSource iv;
};
ivメンバーは初期化ベクトルを表します。これは16バイトで
MUSTあります。
normalizedAlgorithmのivメンバーが
16バイトの長さを持たない場合、
OperationErrorをthrowします。
paddedPlaintextを、kの値を16として、 [RFC2315]の セクション10.3、ステップ2で定義される手順に従って、 plaintextにパディングオクテットを追加した結果とします。
ciphertextを、[NIST-SP800-38A]の
セクション6.2で説明されるCBC暗号化操作を実行した結果とします。
ブロック暗号としてAESを使用し、normalizedAlgorithmのivメンバーを
IV入力パラメーターとして、
paddedPlaintextを入力平文として使用します。
ciphertextを返します。
normalizedAlgorithmのivメンバーが
16バイトの長さを持たない場合、
OperationErrorをthrowします。
ciphertextの長さがゼロであるか、16バイトの倍数でない場合、
OperationErrorをthrowします。
paddedPlaintextを、[NIST-SP800-38A]の
セクション6.2で説明されるCBC復号操作を実行した結果とします。
ブロック暗号としてAESを使用し、normalizedAlgorithmのivメンバーを
IV入力パラメーターとして、
ciphertextを入力暗号文として使用します。
pを、paddedPlaintextの最後のオクテットの値とします。
pがゼロまたは16より大きい場合、またはpaddedPlaintextの
最後のp個のオクテットのいずれかがpでない値を持つ場合、
OperationErrorをthrowします。
plaintextを、paddedPlaintextの末尾から p個のオクテットを除去した結果とします。
plaintextを返します。
usagesが"encrypt"、"decrypt"、
"wrapKey"または"unwrapKey"のいずれでもない
エントリを含む場合、
SyntaxErrorをthrowします。
normalizedAlgorithmのlengthメンバーが
128、192または256のいずれとも等しくない場合、
OperationErrorをthrowします。
normalizedAlgorithmのlengthメンバーと等しい長さの
AES鍵を生成します。
鍵生成手順が失敗した場合、
OperationErrorをthrowします。
keyを、生成されたAES鍵を表す新しい
CryptoKeyオブジェクトとします。
algorithmを新しい
AesKeyAlgorithm
とします。
algorithmのname属性を
"AES-CBC"に設定します。
algorithmのlength属性を、
normalizedAlgorithmの
lengthメンバーと等しく設定します。
keyの[[algorithm]]内部
スロットをalgorithmに設定します。
keyの[[extractable]]内部
スロットをextractableに設定します。
keyの[[usages]]内部スロットを
usagesに設定します。
keyを返します。
usagesが"encrypt"、"decrypt"、
"wrapKey"または"unwrapKey"のいずれでもない
エントリを含む場合、
SyntaxErrorをthrowします。
raw"である場合:jwk"である場合:JsonWebKey
辞書である場合:jwkをkeyDataと等しくします。
jwkがJSON Web Algorithms [JWA]のセクション6.4の要件を
満たさない場合、
DataErrorを
throwします。
usagesが空でなく、かつjwkのuseフィールドが存在し、
"enc"でない場合、
DataErrorを
throwします。
jwkのkey_opsフィールドが
存在し、JSON Web Key [JWK]の要件に従って
無効である場合、または指定されたすべてのusages値を含まない場合、
DataErrorを
throwします。
jwkのextフィールドが存在し、
値がfalseであり、かつextractableがtrueである場合、
DataErrorを
throwします。
NotSupportedErrorを
throwします。
keyを、値dataを持つAES鍵を表す新しいCryptoKey
オブジェクトとします。
algorithmを新しい
AesKeyAlgorithm
とします。
algorithmのname属性を
"AES-CBC"に設定します。
algorithmのlength属性を
dataのビット単位の長さに設定します。
keyの[[algorithm]]内部
スロットをalgorithmに設定します。
keyを返します。
keyの[[handle]]内部スロットによって表される
基盤となる暗号鍵素材にアクセスできない場合、
OperationErrorをthrowします。
raw"である場合:
dataを、keyの[[handle]]
内部スロットによって表される鍵の生オクテットを含む
バイトシーケンス
とします。
resultをdataとします。
jwk"である場合:jwkを新しいJsonWebKey辞書とします。
jwkのkty属性を文字列
"oct"に設定します。
jwkのk属性を、
keyの[[handle]]
内部スロットによって表される鍵の生オクテットを含む文字列に設定します。
JSON Web Algorithms
[JWA]のセクション6.4に従ってエンコードされます。
jwkのkey_ops属性を、keyの
usages属性と
等しく設定します。
jwkのext属性を、keyの[[extractable]]
内部スロットと等しく設定します。
resultをjwkとします。
NotSupportedErrorを
throwします。
resultを返します。
normalizedDerivedKeyAlgorithmのlengthメンバーが
128、192または256でない場合、
OperationErrorをthrowします。
normalizedDerivedKeyAlgorithmのlengthメンバーを返します。
このセクションは非規範的です。
"AES-GCM"アルゴリズム識別子は、
[NIST-SP800-38D]で説明されるように、
Galois/Counter ModeモードのAESを使用して認証付き暗号化および復号を実行するために使用されます。
このアルゴリズムの認識されるアルゴリズム名は
"AES-GCM"です。
| 操作 | パラメーター | 結果 |
|---|---|---|
| encrypt | AesGcmParams |
バイト シーケンス |
| decrypt | AesGcmParams |
バイト シーケンス |
| generateKey | AesKeyGenParams
|
CryptoKey |
| importKey | なし | CryptoKey |
| exportKey | なし | object |
| get key length | AesDerivedKeyParams |
整数 |
WebIDLdictionary AesGcmParams : Algorithm {
required BufferSource iv;
BufferSource additionalData;
[EnforceRange] octet tagLength;
};
ivメンバーは、使用する初期化ベクトルを表します。長さは
最大2^64-1バイトまでにできます。
additionalDataメンバーは、含める
追加認証データを表します。
tagLengthメンバーは、認証タグの望ましい長さを
表します。0 - 128にできます。
plaintextが2^39 - 256バイトを超える長さを持つ場合、
OperationErrorをthrowします。
normalizedAlgorithmのivメンバーが
2^64 - 1バイトを超える長さを持つ場合、
OperationErrorをthrowします。
normalizedAlgorithmのadditionalDataメンバーが
存在し、2^64 - 1バイトを超える
長さを持つ場合、
OperationErrorをthrowします。
tagLengthメンバーが
存在しない場合:
tagLengthメンバーが
32、64、96、104、112、120または128のいずれかである場合:
tagLengthメンバーと等しくします。
OperationErrorをthrowします。
additionalDataを、
normalizedAlgorithmのadditionalDataメンバーが
存在する場合はそれとし、それ以外の場合は空のバイトシーケンス
とします。
CおよびTを、
[NIST-SP800-38D]の
セクション7.1で説明されるAuthenticated Encryption Functionを実行した結果の出力とします。
ブロック暗号としてAESを使用し、normalizedAlgorithmのivメンバーを
IV入力パラメーターとして、
additionalDataをA入力パラメーターとして、
tagLengthをt前提条件として、
plaintextを入力平文として使用します。
ciphertextをC | Tと等しくします。 ここで'|'は連結を表します。
ciphertextを返します。
tagLengthメンバーが
存在しない場合:
tagLengthメンバーが
32、64、96、104、112、120または128のいずれかである場合:
tagLengthメンバーと等しくします。
OperationErrorをthrowします。
ciphertextのビット単位の長さが
tagLength未満である場合、
OperationErrorをthrowします。
normalizedAlgorithmのivメンバーが
2^64 - 1バイトを超える長さを持つ場合、
OperationErrorをthrowします。
normalizedAlgorithmのadditionalDataメンバーが
存在し、2^64 - 1バイトを超える
長さを持つ場合、
OperationErrorをthrowします。
tagを、ciphertextの最後のtagLengthビットとします。
actualCiphertextを、ciphertextから最後のtagLengthビットを 除去した結果とします。
additionalDataを、
normalizedAlgorithmのadditionalDataメンバーが
存在する場合はそれとし、それ以外の場合は空のバイトシーケンス
とします。
[NIST-SP800-38D]の
セクション7.2で説明されるAuthenticated Decryption Functionを実行します。
ブロック暗号としてAESを使用し、
normalizedAlgorithmのivメンバーを
IV入力パラメーターとして、
additionalDataをA入力パラメーターとして、
tagLengthをt前提条件として、
actualCiphertextを入力暗号文、Cとして使用し、
tagを認証タグ、Tとして使用します。
OperationErrorをthrowします。
plaintextを返します。
usagesが"encrypt"、"decrypt"、
"wrapKey"または"unwrapKey"のいずれでもない
エントリを含む場合、
SyntaxErrorをthrowします。
normalizedAlgorithmのlengthメンバーが
128、192または256のいずれとも等しくない場合、
OperationErrorをthrowします。
normalizedAlgorithmのlengthメンバーと等しい長さの
AES鍵を生成します。
鍵生成手順が失敗した場合、
OperationErrorをthrowします。
keyを、生成されたAES鍵を表す新しい
CryptoKeyオブジェクトとします。
algorithmを新しい
AesKeyAlgorithm
とします。
algorithmのname属性を
"AES-GCM"に設定します。
algorithmのlength属性を、
normalizedAlgorithmの
lengthメンバーと等しく設定します。
keyの[[algorithm]]内部
スロットをalgorithmに設定します。
keyの[[extractable]]内部
スロットをextractableに設定します。
keyの[[usages]]内部スロットを
usagesに設定します。
keyを返します。
usagesが"encrypt"、"decrypt"、
"wrapKey"または"unwrapKey"のいずれでもない
エントリを含む場合、
SyntaxErrorをthrowします。
raw"である場合:jwk"である場合:JsonWebKey
辞書である場合:jwkをkeyDataと等しくします。
jwkがJSON Web Algorithms [JWA]のセクション6.4の要件を
満たさない場合、
DataErrorを
throwします。
usagesが空でなく、かつjwkのuseフィールドが存在し、
"enc"でない場合、
DataErrorを
throwします。
jwkのkey_opsフィールドが
存在し、JSON Web Key [JWK]の要件に従って
無効である場合、または指定されたすべてのusages値を含まない場合、
DataErrorを
throwします。
jwkのextフィールドが存在し、
値がfalseであり、かつextractableがtrueである場合、
DataErrorを
throwします。
NotSupportedErrorを
throwします。
keyを、値dataを持つAES鍵を表す新しいCryptoKey
オブジェクトとします。
algorithmを新しい
AesKeyAlgorithm
とします。
algorithmのname属性を
"AES-GCM"に設定します。
algorithmのlength属性を
dataのビット単位の長さに設定します。
keyの[[algorithm]]内部
スロットをalgorithmに設定します。
keyを返します。
keyの[[handle]]内部スロットによって表される
基盤となる暗号鍵素材にアクセスできない場合、
OperationErrorをthrowします。
raw"である場合:
dataを、keyの[[handle]]
内部スロットによって表される鍵の生オクテットを含む
バイトシーケンス
とします。
resultをdataとします。
jwk"である場合:
jwkを新しいJsonWebKey
辞書とします。
jwkのkty属性を文字列
"oct"に設定します。
jwkのk属性を、
keyの[[handle]]
内部スロットによって表される鍵の生オクテットを含む文字列に設定します。
JSON Web Algorithms
[JWA]のセクション6.4に従ってエンコードされます。
jwkのkey_ops属性を、keyの
usages属性と
等しく設定します。
jwkのext属性を、keyの[[extractable]]
内部スロットと等しく設定します。
resultをjwkとします。
NotSupportedErrorを
throwします。
resultを返します。
normalizedDerivedKeyAlgorithmのlengthメンバーが
128、192または256でない場合、
OperationErrorをthrowします。
normalizedDerivedKeyAlgorithmのlengthメンバーを返します。
このセクションは非規範的です。
"AES-KW"アルゴリズム識別子は、
[RFC3394]で説明されるように、
AESを使用して鍵ラップを実行するために使用されます。
このアルゴリズムの認識されるアルゴリズム名は
"AES-KW"です。
| 操作 | パラメーター | 結果 |
|---|---|---|
| wrapKey | なし | バイト シーケンス |
| unwrapKey | なし | バイト シーケンス |
| generateKey | AesKeyGenParams
|
CryptoKey |
| importKey | なし | CryptoKey |
| exportKey | なし | object |
| get key length | AesDerivedKeyParams |
整数 |
plaintextの長さが64ビットの倍数でない場合、
OperationErrorをthrowします。
ciphertextを、[RFC3394]の セクション2.2.1で説明されるKey Wrap操作を実行した結果とします。 plaintextをラップされる平文として使用し、同じ文書の セクション2.2.3.1で定義されるデフォルトのInitial Valueを使用します。
ciphertextを返します。
plaintextを、[RFC3394]の セクション2.2.2で説明されるKey Unwrap操作を実行した結果とします。 ciphertextを入力暗号文として使用し、同じ文書の セクション2.2.3.1で定義されるデフォルトのInitial Valueを使用します。
Key Unwrap操作がエラーを返す場合、
OperationErrorをthrowします。
plaintextを返します。
usagesが"wrapKey"または"unwrapKey"のいずれでもない
エントリを含む場合、SyntaxErrorをthrowします。
normalizedAlgorithmのlengthプロパティが
128、192または256のいずれとも等しくない場合、OperationErrorをthrowします。
normalizedAlgorithmのlengthメンバーと等しい長さの
AES鍵を生成します。
鍵生成手順が失敗した場合、
OperationErrorをthrowします。
keyを、生成されたAES鍵を表す新しい
CryptoKeyオブジェクトとします。
algorithmを新しい
AesKeyAlgorithm
とします。
algorithmのname属性を
"AES-KW"に設定します。
algorithmのlength属性を、
normalizedAlgorithmの
lengthプロパティと
等しく設定します。
keyの[[algorithm]]内部
スロットをalgorithmに設定します。
keyの[[extractable]]内部
スロットをextractableに設定します。
keyの[[usages]]内部スロットを
usagesに設定します。
keyを返します。
usagesが"wrapKey"または"unwrapKey"のいずれでもない
エントリを含む場合、
SyntaxErrorをthrowします。
raw"である場合:jwk"である場合:JsonWebKey
辞書である場合:jwkをkeyDataと等しくします。
jwkがJSON Web Algorithms [JWA]のセクション6.4の要件を
満たさない場合、
DataErrorを
throwします。
usagesが空でなく、かつjwkのuseフィールドが存在し、
"enc"でない場合、
DataErrorを
throwします。
jwkのkey_opsフィールドが
存在し、JSON Web Key [JWK]の要件に従って
無効である場合、または指定されたすべてのusages値を含まない場合、
DataErrorを
throwします。
jwkのextフィールドが存在し、
値がfalseであり、かつextractableがtrueである場合、
DataErrorを
throwします。
NotSupportedErrorを
throwします。
keyを、値dataを持つAES鍵を表す新しいCryptoKey
とします。
algorithmを新しい
AesKeyAlgorithm
とします。
algorithmのname属性を
"AES-KW"に設定します。
algorithmのlength属性を
dataのビット単位の長さに設定します。
keyの[[algorithm]]内部
スロットをalgorithmに設定します。
keyを返します。
keyの[[handle]]内部スロットによって表される
基盤となる暗号鍵素材にアクセスできない場合、
OperationErrorをthrowします。
raw"である場合:
dataを、keyの[[handle]]
内部スロットによって表される鍵の生オクテットを含む
バイトシーケンス
とします。
resultをdataとします。
jwk"である場合:
jwkを新しいJsonWebKey
辞書とします。
jwkのkty属性を文字列
"oct"に設定します。
jwkのk属性を、
keyの[[handle]]
内部スロットによって表される鍵の生オクテットを含む文字列に設定します。
JSON Web Algorithms
[JWA]のセクション6.4に従ってエンコードされます。
jwkのkey_ops属性を、keyの
usages属性と
等しく設定します。
jwkのext属性を、keyの[[extractable]]
内部スロットと等しく設定します。
resultをjwkとします。
NotSupportedErrorを
throwします。
resultを返します。
normalizedDerivedKeyAlgorithmのlengthメンバーが
128、192または256でない場合、OperationErrorをthrowします。
normalizedDerivedKeyAlgorithmのlengthメンバーを返します。
このセクションは非規範的です。
HMACアルゴリズムは、この仕様で定義されるSHAハッシュ関数を使用して、
[FIPS-198-1]に従って、
ハッシュベースのメッセージ認証コードを計算および検証します。
他の 仕様は、 HMACで追加のハッシュアルゴリズムを使用することを指定できます。そのような仕様は、 追加のハッシュアルゴリズムのdigest操作、ならびにHMAC用の 鍵インポート手順および 鍵エクスポート手順を 定義しなければなりません。
このアルゴリズムの認識されるアルゴリズム名は
"HMAC"です。
| 操作 | パラメーター | 結果 |
|---|---|---|
| sign | なし | バイト シーケンス |
| verify | なし | boolean |
| generateKey | HmacKeyGenParams |
CryptoKey |
| importKey | HmacImportParams |
CryptoKey |
| exportKey | なし | object |
| get key length | HmacImportParams |
整数 |
WebIDLdictionary HmacImportParams : Algorithm {
required HashAlgorithmIdentifier hash;
[EnforceRange] unsigned long length;
};
hashメンバーは、使用する内部ハッシュ
関数を表します。
lengthメンバーは、鍵の長さ(ビット単位)を
表します。
WebIDLdictionary HmacKeyAlgorithm : KeyAlgorithm {
required KeyAlgorithm hash;
required unsigned long length;
};
hashメンバーは、使用する内部ハッシュ関数を表します。
lengthメンバーは、鍵の長さ(ビット単位)を
表します。
WebIDLdictionary HmacKeyGenParams : Algorithm {
required HashAlgorithmIdentifier hash;
[EnforceRange] unsigned long length;
};
hashメンバーは、使用する内部ハッシュ
関数を表します。
lengthメンバーは、生成する鍵の長さ
(ビット単位)を表します。指定されない場合は、推奨される長さが使用されます。これは、関連付けられた
ハッシュ関数のブロックサイズのサイズです。
macを、[FIPS-198-1]の
セクション4で説明されるMAC Generation操作を実行した結果とします。
keyの[[handle]]
内部スロットによって表される鍵、
keyの[[algorithm]]内部
スロットのhash属性によって識別される
ハッシュ関数、および入力データtextとしてmessageを使用します。
macを返します。
macを、[FIPS-198-1]の
セクション4で説明されるMAC Generation操作を実行した結果とします。
keyの[[handle]]
内部スロットによって表される鍵、
keyの[[algorithm]]内部
スロットのhash属性によって識別される
ハッシュ関数、および入力データtextとしてmessageを使用します。
macがsignatureと等しい場合はtrueを返し、 それ以外の場合はfalseを返します。
usagesが"sign"または
"verify"でないエントリを含む場合、
SyntaxErrorをthrowします。
長さlengthビットの鍵を生成します。
鍵生成手順が失敗した場合、
OperationErrorをthrowします。
keyを、生成された鍵を表す新しい
CryptoKeyオブジェクトとします。
algorithmを新しい
HmacKeyAlgorithmとします。
algorithmのname属性を
"HMAC"に設定します。
algorithmのlength属性を
lengthに設定します。
hashを新しい
KeyAlgorithmとします。
hashのname属性を、
normalizedAlgorithmのhash
メンバーのname
メンバーと等しく設定します。
algorithmのhash属性を
hashに設定します。
keyの[[algorithm]]内部
スロットをalgorithmに設定します。
keyの[[extractable]]内部
スロットをextractableに設定します。
keyの[[usages]]内部スロットを
usagesに設定します。
keyを返します。
keyDataを、インポートされる鍵データとします。
usagesが"sign"または"verify"でない
エントリを含む場合、
SyntaxErrorをthrowします。
hashを新しいKeyAlgorithmとします。
raw"である場合:dataをkeyDataとします。
hashをnormalizedAlgorithmのhash
メンバーと等しく設定します。
jwk"である場合:JsonWebKey
辞書である場合:jwkをkeyDataと等しくします。
jwkがJSON Web Algorithms [JWA]のセクション6.4の要件を
満たさない場合、
DataErrorをthrowします。
hashをnormalizedAlgorithmのhashメンバーと
等しく設定します。
name
属性が
"SHA-1"である場合:
algフィールドが
存在し、
"HS1"でない場合、
DataErrorをthrowします。
name
属性が
"SHA-256"である場合:
algフィールドが
存在し、
"HS256"でない場合、
DataErrorをthrowします。
name
属性が
"SHA-384"である場合:
algフィールドが
存在し、
"HS384"でない場合、
DataErrorをthrowします。
name
属性が
"SHA-512"である場合:
algフィールドが
存在し、
"HS512"でない場合、
DataErrorをthrowします。
name
属性が
他の適用可能な
仕様で定義される場合:
usagesが空でなく、かつjwkのuseフィールドが
存在し、
"sign"でない場合、
DataErrorをthrowします。
jwkのkey_opsフィールドが
存在し、JSON Web Key [JWK]の要件に従って
無効である場合、または指定されたすべてのusages値を含まない場合、
DataErrorをthrowします。
jwkのextフィールドが
存在し、
値がfalseであり、かつextractableがtrueである場合、
DataErrorをthrowします。
NotSupportedErrorを
throwします。
lengthをdataのビット単位の長さとします。
keyを、dataの最初のlengthビットを持つHMAC鍵を
表す新しいCryptoKey
オブジェクトとします。
algorithmを新しい
HmacKeyAlgorithmとします。
algorithmのname属性を
"HMAC"に設定します。
algorithmのlength属性を
lengthに設定します。
algorithmのhash属性を
hashに設定します。
keyの[[algorithm]]内部
スロットをalgorithmに設定します。
keyを返します。
keyの[[handle]]内部スロットによって表される
基盤となる暗号鍵素材にアクセスできない場合、OperationErrorをthrowします。
bitsを、keyの[[handle]]内部スロットによって
表される鍵の生ビットとします。
dataを、bitsを 含むバイトシーケンスとします。
raw"である場合:resultをdataとします。
jwk"である場合:
jwkを新しいJsonWebKey
辞書とします。
jwkのkty属性を文字列
"oct"に設定します。
jwkのk属性を、
dataを含む文字列に設定します。JSON Web
Algorithms [JWA]のセクション6.4に従って
エンコードされます。
algorithmを、keyの[[algorithm]]
内部スロットとします。
hashを、
algorithmのhash属性と
します。
name
属性が"SHA-1"である場合:
alg属性を
文字列"HS1"に設定します。name
属性が"SHA-256"である場合:
alg属性を
文字列"HS256"に設定します。name
属性が"SHA-384"である場合:
alg属性を
文字列"HS384"に設定します。name
属性が"SHA-512"である場合:
alg属性を
文字列"HS512"に設定します。name
属性が
他の適用可能な
仕様で定義される場合:
鍵エクスポート 手順のうち、 他の適用可能な 仕様によって定義されるものを実行し、formatおよび key を渡して、algを取得します。
jwkのalg属性を
algに設定します。
jwkのkey_ops属性を、keyの
usages属性と
等しく設定します。
jwkのext属性を、keyの[[extractable]]
内部スロットと等しく設定します。
resultをjwkとします。
NotSupportedErrorを
throwします。
resultを返します。
このセクションは非規範的です。
これは、 [FIPS-180-4]で指定される SHA-1およびSHA-2ファミリーについて説明します。
認識されるアルゴリズム
名は、それぞれのSHAアルゴリズムについて
"SHA-1"、
"SHA-256"、
"SHA-384"、および
"SHA-512"です。
| 操作 | パラメーター | 結果 |
|---|---|---|
| digest | なし | バイト シーケンス |
nameメンバーが、
"SHA-1"に対する大文字小文字を区別する文字列一致である場合:
nameメンバーが、
"SHA-256"に対する大文字小文字を区別する文字列一致である場合:
nameメンバーが、
"SHA-384"に対する大文字小文字を区別する文字列一致である場合:
nameメンバーが、
"SHA-512"に対する大文字小文字を区別する文字列一致である場合:
操作の実行でエラーが発生した場合、OperationErrorをthrowします。
resultを返します。
このセクションは非規範的です。
"HKDF"アルゴリズム識別子は、
[RFC5869]で説明される
抽出してから展開するアプローチを使用し、
この仕様で定義されるSHAハッシュ関数を使用して鍵導出を実行するために使用されます。
他の 仕様は、 HKDFで追加のハッシュアルゴリズムを使用することを指定できます。 そのような仕様は、追加のハッシュアルゴリズムのdigest操作を定義しなければなりません。
このアルゴリズムの認識されるアルゴリズム名は
"HKDF"です。
| 操作 | パラメーター | 結果 |
|---|---|---|
| deriveBits | HkdfParams |
バイト シーケンス |
| importKey | なし | CryptoKey |
| Get key length | なし | null |
WebIDLdictionary HkdfParams : Algorithm {
required HashAlgorithmIdentifier hash;
required BufferSource salt;
required BufferSource info;
};
hashメンバーは、HMACとともに使用するアルゴリズム
(例: SHA-256)を表します。
saltメンバーは、extractステップで使用されるsaltを表します。
infoメンバーは、導出された鍵素材のアプリケーション固有の
コンテキストを表します。
lengthがnullであるか、8の倍数でない場合、
OperationErrorをthrowします。
keyDerivationKeyを、keyの[[handle]]内部スロットによって
表されるsecretとします。
resultを、 [RFC5869]の セクション2で説明されるHKDF extractおよびその後のHKDF expandステップを 実行した結果とします。次を使用します:
鍵導出操作が失敗した場合、
OperationErrorをthrowします。
resultを返します。
keyDataを、インポートされる鍵データとします。
raw"である場合:
usagesが
"deriveKey"または"deriveBits"でない値を含む場合、
SyntaxErrorをthrowします。
extractableがfalseでない場合、
SyntaxErrorをthrowします。
keyを、keyDataで提供される鍵データを表す新しい
CryptoKey
とします。
algorithmを新しい
KeyAlgorithmオブジェクトとします。
algorithmのname属性を
"HKDF"に設定します。
keyの[[algorithm]]
内部スロットをalgorithmに設定します。
keyを返します。
NotSupportedErrorを
throwします。
nullを返します。
このセクションは非規範的です。
"PBKDF2"アルゴリズム識別子は、
[RFC8018]で定義される
PKCS#5パスワードベース鍵導出関数バージョン2を使用して鍵導出を実行するために使用されます。
擬似乱数関数としてHMACを使用し、
この仕様で定義されるSHAハッシュ関数を使用します。
他の 仕様は、 PBKDF2で追加のハッシュアルゴリズムを使用することを指定できます。そのような仕様は、 追加のハッシュアルゴリズムのdigest操作を定義しなければなりません。
このアルゴリズムの認識されるアルゴリズム名は
"PBKDF2"です。
| 操作 | パラメーター | 結果 |
|---|---|---|
| deriveBits | Pbkdf2Params |
バイト シーケンス |
| importKey | なし | CryptoKey |
| Get key length | なし | null |
WebIDLdictionary Pbkdf2Params : Algorithm {
required BufferSource salt;
required [EnforceRange] unsigned long iterations;
required HashAlgorithmIdentifier hash;
};
Pbkdf2Params辞書には、saltメンバー、iterationsメンバー、およびhashメンバーがあります。
lengthがnullであるか、8の倍数でない場合、
OperationErrorをthrowします。
normalizedAlgorithmのiterationsメンバーが
ゼロである場合、
OperationErrorをthrowします。
lengthがゼロである場合、空のバイトシーケンスを返します。
prfを、
[FIPS-198-1]の
セクション4で説明されるMAC Generation関数とします。
normalizedAlgorithmのhashメンバーによって
説明されるハッシュ関数を使用します。
resultを、
[RFC8018]の
セクション5.2で定義されるPBKDF2操作を実行した結果とします。
prfを擬似乱数関数PRFとして使用し、
keyの[[handle]]内部スロットによって
表されるパスワードをパスワードPとして、
normalizedAlgorithmのsalt属性をsaltSとして、
normalizedAlgorithmのiterations属性の値を
反復回数cとして、および
lengthを8で割った値を目的の鍵長dkLenとして使用します。
鍵導出操作が失敗した場合、
OperationErrorをthrowします。
resultを返します。
formatが"raw"でない場合、NotSupportedErrorをthrowします。
usagesが
"deriveKey"または"deriveBits"でない値を含む場合、
SyntaxErrorをthrowします。
extractableがfalseでない場合、
SyntaxErrorをthrowします。
keyを、keyDataを表す新しいCryptoKey
とします。
algorithmを新しいKeyAlgorithm
オブジェクトとします。
algorithmのname属性を
"PBKDF2"に設定します。
keyの[[algorithm]]内部
スロットをalgorithmに設定します。
keyを返します。
nullを返します。
この例は、Alice用とBob用に2つのX25519鍵ペアを生成し、それらの間で鍵合意を実行し、 SHA-256を用いるHKDFによってその結果から256ビットAES-GCM鍵を導出し、 それを使ってデータを暗号化および復号します。
// 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);
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);
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);
const filename = `${crypto.randomUUID()}.txt`;
このセクションは、JSON Web Keyで使用するために、次のアルゴリズム識別子をIANA JSON Web Signature and Encryption Algorithms Registryに登録します。テンプレート内の 'Implementation Requirements'フィールドは、JSON Web SignatureおよびJSON Web Encryptionでの 使用を具体的に指しており、その場合、認証されない暗号化の使用は禁止されることに注意してください。
特に、元の著者および編集者である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へ最初に提案されました。
このセクションは非規範的です。
JWKのインポートおよびエクスポートに関する 規範的要件については、アルゴリズム固有のセクションを参照してください。
| JSON Web Key | AlgorithmIdentifier |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
このセクションは非規範的です。
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"
鍵形式を使用することが推奨されます。
このセクションは非規範的です。
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] |
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: