Web Cryptography API における最新のアルゴリズム

コミュニティグループ報告書草案

最新の公開版:
なし
最新の編集者草案:
https://wicg.github.io/webcrypto-modern-algos/
編集者:
(Proton AG)
(Okta)
フィードバック:
GitHub WICG/webcrypto-modern-algos (プルリクエスト, 新しい課題, 未解決の課題)

概要

この仕様は、耐量子安全性を備えた多数の 最新の暗号アルゴリズムを Web Cryptography API のために定義するものであり、 具体的には ML-KEM、ハイブリッド KEM、 ML-DSA、SLH-DSA、 AES-OCB、ChaCha20-Poly1305、 SHA-3、cSHAKE、 TurboSHAKE、KangarooTwelve、 KMAC、および Argon2 である。

この文書の位置付け

この仕様は、 Web Platform Incubator Community Group によって公開されました。これは W3C 標準ではなく、 W3C 標準化過程にも含まれていません。 以下の W3C コミュニティ貢献者ライセンス契約 (CLA) では、限定的なオプトアウトが認められており、その他の条件も適用されることに注意してください。 W3C コミュニティグループおよびビジネスグループの詳細をご覧ください。

これは非公式な提案です。

この仕様に関する議論には、 GitHub の課題を使用することが推奨されます。

1. はじめに

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

この提案は、Web Cryptography API で利用可能な暗号アルゴリズムの セットを最新化し、 Web アプリケーションが耐量子安全性を備えた 高性能な暗号アルゴリズムを利用できるようにすることを目的としています。 この目的のため、次の暗号アルゴリズムが追加されます:

ML-KEM、ハイブリッド KEM、および将来追加される可能性のあるその他の KEM の使用に対応するため、 この提案では鍵のカプセル化およびカプセル化解除のための関数、 SubtleCrypto.encapsulateKey、 SubtleCrypto.encapsulateBits、 SubtleCrypto.decapsulateKey および SubtleCrypto.decapsulateBits を導入します。

さらに、この提案では SubtleCrypto.getPublicKey 関数を導入します。 この関数は、非対称秘密鍵から公開鍵を導出するための便利な方法を提供し、 秘密鍵のみが必要な場合に公開鍵と秘密鍵の両方を個別に保存する必要を なくします。

最後に、この提案は機能検出を容易にすることを目的として、 SubtleCrypto.supports 関数を追加します。 この関数は、指定されたアルゴリズム識別子 (すべてのパラメーターを含む)が指定された操作でサポートされているかどうかを検出するために使用できます。

2. 仕様の表記規則

この仕様は、[webcrypto] のセクション 18.3 で定められた 表記規則 に従います。ここで定義されるアルゴリズムはいずれも実装を必須とはしませんが、適合するユーザーエージェントが あるアルゴリズムを実装する場合、この文書で指定されているサポート対象の操作をすべて実装 しなければならず、さらにサポート対象の各操作について、 [webcrypto] のセクション 18.4.3 で指定される アルゴリズムを定義する 手順を実行しなければなりません。

[webcrypto] で定義されているサポートされる操作に加えて、 この仕様では、以下の操作を使用する:

3. SubtleCrypto 部分インターフェイス

このセクションは、[webcrypto] の SubtleCrypto インターフェイスを 拡張します。

WebIDL[SecureContext,Exposed=(Window,Worker)]
partial interface SubtleCrypto {
  Promise<EncapsulatedKey> encapsulateKey(
    AlgorithmIdentifier encapsulationAlgorithm,
    CryptoKey encapsulationKey,
    AlgorithmIdentifier sharedKeyAlgorithm,
    boolean extractable,
    sequence<KeyUsage> keyUsages
  );
  Promise<EncapsulatedBits> encapsulateBits(
    AlgorithmIdentifier encapsulationAlgorithm,
    CryptoKey encapsulationKey
  );

  Promise<CryptoKey> decapsulateKey(
    AlgorithmIdentifier decapsulationAlgorithm,
    CryptoKey decapsulationKey,
    BufferSource ciphertext,
    AlgorithmIdentifier sharedKeyAlgorithm,
    boolean extractable,
    sequence<KeyUsage> keyUsages
  );
  Promise<ArrayBuffer> decapsulateBits(
    AlgorithmIdentifier decapsulationAlgorithm,
    CryptoKey decapsulationKey,
    BufferSource ciphertext
  );

  Promise<CryptoKey> getPublicKey(
    CryptoKey key,
    sequence<KeyUsage> keyUsages
  );

  static boolean supports(DOMString operation,
                   AlgorithmIdentifier algorithm,
                   optional [EnforceRange] unsigned long? length = null);
  static boolean supports(DOMString operation,
                   AlgorithmIdentifier algorithm,
                   AlgorithmIdentifier additionalAlgorithm);
};

3.1 データ型

3.1.1 鍵形式

この仕様は、[webcrypto] における KeyFormat の定義を次のものに置き換えます:

WebIDLenum KeyFormat { "raw-public", "raw-private", "raw-seed", "raw-secret", "raw", "spki", "pkcs8", "jwk" };

この仕様は、いくつかの新しい認識される鍵形式の 値を指定します:

raw-public
形式付けされていない公開鍵バイト列。
raw-private
形式付けされていない秘密鍵バイト列。
raw-seed
形式付けされていない秘密鍵シードのバイト列。
raw-secret
形式付けされていない秘密鍵バイト列。

[webcrypto] に存在する すべての対称アルゴリズムについて、 "raw-secret" は "raw" の別名として機能します。

[webcrypto] に存在する すべての非対称アルゴリズムについて、 "raw-public" は "raw" の別名として機能します。

deriveKey() メソッドでは、鍵をインポートする手順において、 "raw-secret" を "raw" の代わりに形式として使用しなければなりません。

3.1.2 鍵用途

この仕様は、[webcrypto] における KeyUsage の定義を次のものに置き換えます:

WebIDLenum KeyUsage { "encrypt", "decrypt", "sign", "verify", "deriveKey", "deriveBits", "wrapKey", "unwrapKey", "encapsulateKey", "encapsulateBits", "decapsulateKey", "decapsulateBits" };

この仕様は、いくつかの新しい認識される鍵用途の 値を指定します:

encapsulateKey
鍵を SubtleCrypto.encapsulateKey で使用できるようにします。
encapsulateBits
鍵を SubtleCrypto.encapsulateBits で使用できるようにします。
decapsulateKey
鍵を SubtleCrypto.decapsulateKey で使用できるようにします。
decapsulateBits
鍵を SubtleCrypto.decapsulateBits で使用できるようにします。

3.2 メソッドおよびパラメーター

3.2.1 encapsulateKey メソッド

encapsulateKey(encapsulationAlgorithm, encapsulationKey, sharedKeyAlgorithm, extractable, usages) メソッドは鍵をカプセル化し、EncapsulatedKey オブジェクトを返します。 このメソッドは次のように動作します:

  1. encapsulationAlgorithm、encapsulationKey、 sharedKeyAlgorithm、 extractable、および usages を、それぞれ encapsulateKey() メソッドに渡された encapsulationAlgorithm、 encapsulationKey、 sharedKeyAlgorithm、extractable、および keyUsages パラメーターとします。

  2. normalizedEncapsulationAlgorithm を、 alg を encapsulationAlgorithm に、op を "encapsulate" に設定して アルゴリズムを 正規化した結果とします。

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

  4. normalizedSharedKeyAlgorithm を、 alg を sharedKeyAlgorithm に、op を "importKey" に設定して アルゴリズムを 正規化した結果とします。

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

  6. realm を、this に関連する レルム とします。

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

  8. promise を返し、残りの手順を並行して 実行します。

  9. 以下の手順または参照先の手続きがエラーを スローするよう指示した場合、 realm のグローバルオブジェクトを指定して、 暗号タスクソース上に グローバルタスクを キューに入れ、返されたエラーで promise を拒否します。 その後、アルゴリズムを 終了します。

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

  11. encapsulationKey の [[usages]] 内部スロットに "encapsulateKey" であるエントリーが含まれていない場合、 InvalidAccessError を スローします。

  12. encapsulatedBits を、encapsulationKey を使用して、 encapsulationKey の [[algorithm]] 内部スロットで指定されるカプセル化操作を実行した結果とします。

  13. sharedKey を、normalizedSharedKeyAlgorithm で指定される 鍵のインポート操作を、format として "raw-secret"、 keyData として encapsulatedBits の sharedKey フィールド、 algorithm として sharedKeyAlgorithm を使用し、 extractable および usages を使用して実行した結果とします。

  14. sharedKey の [[extractable]] 内部スロットを extractable に設定します。

  15. sharedKey の [[usages]] 内部スロットを、usages の 正規化された値 に設定します。

  16. encapsulatedKey を、 sharedKey を sharedKey に設定し、 ciphertext を encapsulatedBits の ciphertext フィールドに設定した、 新しい EncapsulatedKey 辞書とします。

  17. realm のグローバルオブジェクトを指定して、 暗号タスクソース上に グローバルタスクを キューに入れ、残りの手順を実行します。

  18. result を、[WebIDL] で定義されるとおり、 encapsulatedKey を realm 内の ECMAScript オブジェクトに 変換した結果とします。

  19. promise を result で解決します。

3.2.2 encapsulateBits メソッド

encapsulateBits(encapsulationAlgorithm, encapsulationKey) メソッドは鍵をカプセル化し、EncapsulatedBits オブジェクトを返します。 このメソッドは次のように動作します:

  1. encapsulationAlgorithm および encapsulationKey を、それぞれ encapsulateBits() メソッドに渡された encapsulationAlgorithm および encapsulationKey パラメーターとします。

  2. normalizedEncapsulationAlgorithm を、 alg を encapsulationAlgorithm に、op を "encapsulate" に設定して アルゴリズムを 正規化した結果とします。

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

  4. realm を、this に関連する レルム とします。

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

  6. promise を返し、残りの手順を並行して 実行します。

  7. 以下の手順または参照先の手続きがエラーを スローするよう指示した場合、 realm のグローバルオブジェクトを指定して、 暗号タスクソース上に グローバルタスクを キューに入れ、返されたエラーで promise を拒否します。 その後、アルゴリズムを 終了します。

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

  9. encapsulationKey の [[usages]] 内部スロットに "encapsulateBits" であるエントリーが含まれていない場合、 InvalidAccessError を スローします。

  10. encapsulatedBits を、encapsulationKey を使用して、 encapsulationKey の [[algorithm]] 内部スロットで指定されるカプセル化操作を実行した結果とします。

  11. realm のグローバルオブジェクトを指定して、 暗号タスクソース上に グローバルタスクを キューに入れ、残りの手順を実行します。

  12. result を、[WebIDL] で定義されるとおり、 encapsulatedBits を realm 内の ECMAScript オブジェクトに 変換した結果とします。

  13. promise を result で解決します。

3.2.3 decapsulateKey メソッド

decapsulateKey(decapsulationAlgorithm, decapsulationKey, ciphertext, sharedKeyAlgorithm, extractable, usages) メソッドは鍵のカプセル化を解除し、CryptoKey オブジェクトを返します。 このメソッドは次のように動作します:

  1. decapsulationAlgorithm、decapsulationKey、 sharedKeyAlgorithm、 extractable、および usages を、それぞれ decapsulateKey() メソッドに渡された decapsulationAlgorithm、 decapsulationKey、sharedKeyAlgorithm、extractable、および keyUsages パラメーターとします。

  2. normalizedDecapsulationAlgorithm を、 alg を decapsulationAlgorithm に、op を "decapsulate" に設定して アルゴリズムを 正規化した結果とします。

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

  4. normalizedSharedKeyAlgorithm を、 alg を sharedKeyAlgorithm に、op を "importKey" に設定して アルゴリズムを 正規化した結果とします。

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

  6. ciphertext を、 decapsulateKey() メソッドに渡された ciphertext パラメーターが保持する バイトのコピーを取得した 結果とします。

  7. realm を、this に関連する レルム とします。

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

  9. promise を返し、残りの手順を並行して 実行します。

  10. 以下の手順または参照先の手続きがエラーを スローするよう指示した場合、 realm のグローバルオブジェクトを指定して、 暗号タスクソース上に グローバルタスクを キューに入れ、返されたエラーで promise を拒否します。 その後、アルゴリズムを 終了します。

  11. normalizedDecapsulationAlgorithm の name メンバーが、 decapsulationKey の [[algorithm]] 内部スロットの name 属性と等しくない場合、InvalidAccessError を スローします。

  12. decapsulationKey の [[usages]] 内部スロットに "decapsulateKey" であるエントリーが含まれていない場合、 InvalidAccessError を スローします。

  13. decapsulatedBits を、decapsulationKey および ciphertext を使用して、decapsulationKey の [[algorithm]] 内部スロットで指定されるカプセル化解除操作を実行した結果とします。

  14. sharedKey を、normalizedSharedKeyAlgorithm で指定される 鍵のインポート操作を、format として "raw-secret"、 keyData として decapsulatedBits、 algorithm として sharedKeyAlgorithm を使用し、 extractable および usages を使用して実行した結果とします。

  15. sharedKey の [[extractable]] 内部スロットを extractable に設定します。

  16. sharedKey の [[usages]] 内部スロットを、usages の 正規化された値 に設定します。

  17. realm のグローバルオブジェクトを指定して、 暗号タスクソース上に グローバルタスクを キューに入れ、残りの手順を実行します。

  18. result を、[WebIDL] で定義されるとおり、 sharedKey を realm 内の ECMAScript オブジェクトに変換した結果とします。

  19. promise を result で解決します。

3.2.4 decapsulateBits メソッド

decapsulateBits(decapsulationAlgorithm, decapsulationKey, ciphertext) メソッドは鍵のカプセル化を解除し、ArrayBuffer オブジェクトを返します。 このメソッドは次のように動作します:

  1. decapsulationAlgorithm および decapsulationKey を、それぞれ decapsulateBits() メソッドに渡された decapsulationAlgorithm および decapsulationKey パラメーターとします。

  2. normalizedDecapsulationAlgorithm を、 alg を decapsulationAlgorithm に、op を "decapsulate" に設定して アルゴリズムを 正規化した結果とします。

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

  4. ciphertext を、 decapsulateBits() メソッドに渡された ciphertext パラメーターが保持する バイトのコピーを取得した 結果とします。

  5. realm を、this に関連する レルム とします。

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

  7. promise を返し、残りの手順を並行して 実行します。

  8. 以下の手順または参照先の手続きがエラーを スローするよう指示した場合、 realm のグローバルオブジェクトを指定して、 暗号タスクソース上に グローバルタスクを キューに入れ、返されたエラーで promise を拒否します。 その後、アルゴリズムを 終了します。

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

  10. decapsulationKey の [[usages]] 内部スロットに "decapsulateBits" であるエントリーが含まれていない場合、 InvalidAccessError を スローします。

  11. decapsulatedBits を、decapsulationKey および ciphertext を使用して、decapsulationKey の [[algorithm]] 内部スロットで指定されるカプセル化解除操作を実行した結果とします。

  12. realm のグローバルオブジェクトを指定して、 暗号タスクソース上に グローバルタスクを キューに入れ、残りの手順を実行します。

  13. result を、decapsulatedBits を含む ArrayBuffer を realm 内に作成した結果とします。

  14. promise を result で解決します。

3.2.5 getPublicKey メソッド

getPublicKey(key, usages) メソッドは、指定された秘密鍵に対応する公開鍵を返します。 このメソッドは次のように動作します:

  1. key および usages を、それぞれ getPublicKey() メソッドに渡された key および keyUsages パラメーターとします。

  2. algorithm を、key の [[algorithm]] 内部スロットとします。

  3. algorithm で識別される暗号アルゴリズムが 秘密鍵から公開鍵を導出することをサポートしていない場合、 NotSupportedError で 拒否された Promise を返します。

  4. realm を、this に関連する レルム とします。

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

  6. promise を返し、残りの手順を並行して 実行します。

  7. 以下の手順または参照先の手続きがエラーを スローするよう指示した場合、 realm のグローバルオブジェクトを指定して、 暗号タスクソース上に グローバルタスクを キューに入れ、返されたエラーで promise を拒否します。 その後、アルゴリズムを 終了します。

  8. key の [[type]] 内部スロットが "private" でない場合、InvalidAccessError を スローします。

  9. usages に、algorithm で識別されるアルゴリズムによって 公開鍵でサポートされていないエントリーが含まれる場合、 SyntaxError を スローします。

  10. publicKey を、key の [[handle]] 内部スロットによって表される秘密鍵に対応する公開鍵を表す、新しい CryptoKey とします。

  11. エラーが発生した場合、OperationError を スローします。

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

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

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

  15. publicKey の [[usages]] 内部スロットを usages に設定します。

  16. realm のグローバルオブジェクトを指定して、 暗号タスクソース上に グローバルタスクを キューに入れ、残りの手順を実行します。

  17. result を、[WebIDL] で定義されるとおり、 publicKey を realm 内の ECMAScript オブジェクトに変換した結果とします。

  18. promise を result で解決します。

3.2.6 supports メソッド

supports(operation, algorithm, length) メソッドは、指定されたAlgorithmIdentifierを使用して、指定された操作を実装が サポートしているかどうかを示す真偽値を返す。 operation が "deriveBits" の場合に導出するビット数を示すための、 オプションの length パラメーターを持つ。 このメソッドは次のように動作する:

  1. operation が "encrypt", "decrypt", "sign", "verify", "digest", "generateKey", "deriveKey", "deriveBits", "importKey", "exportKey", "wrapKey", "unwrapKey", "encapsulateKey", "encapsulateBits", "decapsulateKey", "decapsulateBits" または "getPublicKey" のいずれでもない場合、false を返す。

  2. アルゴリズムのサポートを 確認した結果を返す。 このとき、op を operation に、alg を algorithm に、 length を length に設定する。

supports(operation, algorithm, additionalAlgorithm) メソッドは、指定されたAlgorithmIdentifierを使用して、指定された操作を実装が サポートしているかどうかを示す真偽値を返す。 追加のアルゴリズムは、operation が "deriveKey" の場合に導出する鍵の種類、 operation が "wrapKey" の場合にラップ前にエクスポートする鍵の種類、 および operation が "unwrapKey" の場合にアンラップ後にインポートする鍵の種類を示す。 このメソッドは次のように動作する:

  1. operation が "encrypt", "decrypt", "sign", "verify", "digest", "generateKey", "deriveKey", "deriveBits", "importKey", "exportKey", "wrapKey", "unwrapKey", "encapsulateKey", "encapsulateBits", "decapsulateKey", "decapsulateBits" または "getPublicKey" のいずれでもない場合、false を返す。

  2. operation が "deriveKey" または "unwrapKey" の場合:

    op を "importKey" に設定し、 alg を additionalAlgorithm に設定して アルゴリズムの サポートを確認した結果 が false の場合、 false を返す。

    operation が "wrapKey" の場合:

    op を "exportKey" に設定し、 alg を additionalAlgorithm に設定して アルゴリズムの サポートを確認した結果 が false の場合、 false を返す。

  3. operation が "encapsulateKey" または "decapsulateKey" の場合:
    1. normalizedAlgorithm を、 alg を algorithm に、op を "get shared key length" に設定して アルゴリズムを 正規化した結果とする。

    2. エラーが発生した場合、false を返す。

    3. sharedKeyLength を、algorithm を使用して normalizedAlgorithm によって指定された共有鍵の長さを取得する アルゴリズムを実行した結果とする。

    4. normalizedAdditionalAlgorithm を、 alg を additionalAlgorithm に、op を "importKey" に設定して アルゴリズムを 正規化した結果とする。

    5. エラーが発生した場合、false を返す。

    6. op を "importKey" に、 normalizedAlgorithm を normalizedAdditionalAlgorithm に、length を null に設定して 操作手順から サポートを判定した結果 が false の場合、 false を返す。

    7. normalizedAdditionalAlgorithm によって指定された鍵をインポートする操作が、 format が "raw-secret" の場合に、 ビット単位の長さが sharedKeyLength である バイト列 であるすべての keyData の値に対してエラーを スローするなら、 false を返す。

  4. length を null とする。

  5. operation が "deriveKey" の場合:
    1. op を "get key length" に設定し、 alg を additionalAlgorithm に設定して アルゴリズムの サポートを確認した結果 が false の場合、 false を返す。

    2. normalizedAdditionalAlgorithm を、 alg を additionalAlgorithm に、op を "get key length" に設定して アルゴリズムを 正規化した結果とする。

    3. length を、normalizedAdditionalAlgorithm を使用して additionalAlgorithm によって指定された鍵の長さを取得する アルゴリズムを実行した結果とする。

    4. operation を "deriveBits" に設定する。

  6. アルゴリズムのサポートを 確認した結果を返す。 このとき、op を operation に、alg を algorithm に、 length を length に設定する。

3.3 アルゴリズムのサポートの 確認

アルゴリズムのサポートを確認するアルゴリズムは、 指定された操作について、指定されたアルゴリズムがサポートされているかどうかを確認するプロセスを定義する。 その入力は、操作名 op、AlgorithmIdentifier alg、 および length パラメーターである。その出力は真偽値である。 これは次のように動作する:

  1. op が "encapsulateKey" または "encapsulateBits" の場合、 op を "encapsulate" に設定する。

  2. op が "decapsulateKey" または "decapsulateBits" の場合、 op を "decapsulate" に設定する。

  3. op が "getPublicKey" の場合:
    1. normalizedAlgorithm を、 alg を alg に、op を "exportKey" に設定して アルゴリズムを 正規化した結果とする。

    2. エラーが発生した場合、false を返す。

    3. normalizedAlgorithm によって識別される暗号アルゴリズムが、 秘密鍵から公開鍵を導出することをサポートしていない場合、 false を返す。

    4. それ以外の場合、true を返す。

  4. normalizedAlgorithm を、 alg を alg に、op を op に設定して アルゴリズムを 正規化した結果とする。

  5. エラーが発生した場合:
    1. op が "wrapKey" の場合、 op を "encrypt" に、 alg を alg に設定して アルゴリズムのサポートを 確認した結果を返す。

    2. op が "unwrapKey" の場合、 op を "decrypt" に、 alg を alg に設定して アルゴリズムのサポートを 確認した結果を返す。

    3. それ以外の場合、false を返す。

  6. 操作手順からサポートを 判定した結果を返す。 このとき、op を op に、normalizedAlgorithm を normalizedAlgorithm に、 length を length に設定する。

操作手順からサポートを判定するアルゴリズムは、 正規化されたアルゴリズムの操作手順がサポートを示しているかどうかを判定する。 その入力は、操作名 op、Algorithm normalizedAlgorithm、 および length パラメーターである。その出力は真偽値である。 これは次のように動作する:

  1. 指定された操作または正規化されたアルゴリズム(またはそのパラメーター値のいずれか)が、 実装固有の理由(例: 仕様に適合しないことが既知である場合)により、 (任意の鍵および/またはデータについて)失敗すると予想される場合、false を返す。

  2. op が "generateKey" または "importKey" の場合、 usages を空のリストとする。

  3. normalizedAlgorithm によって指定されたアルゴリズムの、 op によって指定された操作の各手順について:

    手順がエラーをスローするよう指示している場合:
    false を返す。
    手順が鍵を生成するよう指示している場合:
    true を返す。
    手順が key、 plaintext または ciphertext などの利用できないパラメーターに依存している場合:
    true を返す。
    手順が値を返すよう指示している場合:
    true を返す。
    それ以外の場合:
    その手順を実行する。
    注記

    参照されるアルゴリズム内の手順は、このコンテキストの normalizedAlgorithm、 length、および usages 変数にアクセスできる。

  4. 表明: この手順には 決して到達しない。 操作のいずれかの手順が値を返すかエラーをスローするよう指示しており、 それによってそれぞれ true または false を返すことになるためである。

4. カプセル化辞書

WebIDLdictionary EncapsulatedKey {
  CryptoKey sharedKey;
  ArrayBuffer ciphertext;
};

dictionary EncapsulatedBits {
  ArrayBuffer sharedKey;
  ArrayBuffer ciphertext;
};

EncapsulatedKey 辞書は、sharedKey と ciphertext から構成されるカプセル化された鍵を表します。

EncapsulatedBits 辞書は、sharedKey と ciphertext から構成されるカプセル化された鍵ビットを表します。

5. JsonWebKey 部分辞書

WebIDLpartial dictionary JsonWebKey {
  // 次のフィールドは RFC 9964 で定義されています
  DOMString pub;
  DOMString priv;
};

[webcrypto] で定義される JsonWebKey 辞書のこの拡張は、 [RFC9964] で定義される「AKP」鍵型の鍵を表現する方法を提供します。

6. ML-KEM

6.1 説明

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

これは、[FIPS-203] で規定されている、 鍵のカプセル化およびカプセル解除に ML-KEM を使用する方法について説明します。

6.2 登録

このアルゴリズムの認識されるアルゴリズム 名は "ML-KEM-512"、"ML-KEM-768"、および "ML-KEM-1024" です。

操作 パラメーター 結果
カプセル化 なし EncapsulatedBits
カプセル解除 なし バイト シーケンス
共有鍵の長さを取得 なし 整数
generateKey なし CryptoKeyPair
importKey なし CryptoKey
exportKey なし オブジェクト

6.3 JSON Web Key 表現

ML-KEM 鍵は、JWK 表現に [RFC9964] で定義されている "AKP" (Algorithm Key Pair) 鍵タイプを使用します。"alg" (algorithm) パラメーターは、特定の ML-KEM パラメーターセットを識別します。 公開鍵は "pub" パラメーターに格納されます。秘密鍵が含まれる場合、それは "priv" パラメーターを使用して表現されます。JWK で表現される場合、すべての鍵パラメーターは base64url エンコードされます。

6.4 操作

6.4.1 カプセル化

  1. key の [[type]] 内部スロットが "public" でない場合、 throw して InvalidAccessError を送出します。

  2. [FIPS-203] のセクション 7.2 で説明されているカプセル化鍵チェックを、 algorithm の name メンバーによって示されるパラメーターセットで実行し、 key の [[handle]] 内部スロットによって表される鍵を ek 入力パラメーターとして使用します。

    注記

    パフォーマンス上望ましい場合、このチェックの結果は CryptoKey オブジェクトについてキャッシュまたは事前計算できます。

  3. カプセル化鍵チェックが失敗した場合、OperationError を返します。

  4. sharedKey と ciphertext を、 [FIPS-203] のセクション 7.2 で説明されている ML-KEM.Encaps 関数を、 algorithm の name メンバーによって示されるパラメーターセットで実行した結果の出力とし、 key の [[handle]] 内部スロットによって表される鍵を ek 入力パラメーターとして使用します。

  5. ML-KEM.Encaps 関数がエラーを返した場合、OperationError を返します。

  6. result を新しい EncapsulatedBits 辞書とします。

  7. result の sharedKey 属性を、 sharedKey を含む ArrayBuffer を 作成した結果に設定します。

  8. result の ciphertext 属性を、 ciphertext を含む ArrayBuffer を 作成した結果に設定します。

  9. result を返します。

6.4.2 カプセル解除

  1. key の [[type]] 内部スロットが "private" でない場合、 throw して InvalidAccessError を送出します。

  2. [FIPS-203] のセクション 7.3 で説明されているカプセル解除入力チェックを、 algorithm の name メンバーによって示されるパラメーターセットで実行し、 key の [[handle]] 内部スロットによって表される鍵を dk 入力パラメーターとして、また ciphertext を c 入力パラメーターとして使用します。

    注記

    カプセル解除鍵タイプチェックおよびハッシュチェックの結果は、 パフォーマンス上望ましい場合、CryptoKey オブジェクトについて キャッシュまたは事前計算できます。

  3. カプセル解除鍵チェックが失敗した場合、OperationError を返します。

  4. sharedKey を、 [FIPS-203] のセクション 7.3 で説明されている ML-KEM.Decaps 関数を、 algorithm の name メンバーによって示されるパラメーターセットで実行した結果の出力とし、 key の [[handle]] 内部スロットによって表される鍵を dk 入力パラメーターとして、また ciphertext を c 入力パラメーターとして使用します。

  5. sharedKey を返します。

6.4.3 共有鍵の長さを取得

  1. 256 を返します。

6.4.4 鍵を生成

  1. usages に "encapsulateKey"、"encapsulateBits"、 "decapsulateKey"、または "decapsulateBits" のいずれでもない エントリが含まれている場合、throw して SyntaxError を送出します。

  2. [FIPS-203] のセクション 7.1 で説明されているように、 normalizedAlgorithm の name メンバーによって示されるパラメーターセットで ML-KEM 鍵ペアを生成します。

    注記

    シード (d, z) をエクスポートできるようにするため、 d および z は生成された 鍵素材の一部として保存する必要があります。

  3. 鍵生成ステップが失敗した場合、 throw して OperationError を送出します。

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

  5. algorithm の name 属性を、 normalizedAlgorithm の name 属性に設定します。

  6. publicKey を、生成された鍵ペアのカプセル化鍵を表す新しい CryptoKey とします。

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

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

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

  10. publicKey の [[usages]] 内部スロットを、 usages と [ "encapsulateKey", "encapsulateBits" ] の 使用法の 共通部分に設定します。

  11. privateKey を、生成された鍵ペアのカプセル解除鍵を表す新しい CryptoKey とします。

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

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

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

  15. privateKey の [[usages]] 内部スロットを、 usages と [ "decapsulateKey", "decapsulateBits" ] の 使用法の 共通部分に設定します。

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

  17. result の publicKey 属性を publicKey に設定します。

  18. result の privateKey 属性を privateKey に設定します。

  19. result を返します。

6.4.5 鍵をインポート

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

  2. format が "spki" の場合:
    1. usages に "encapsulateKey" または "encapsulateBits" でないエントリが含まれている場合、 throw して SyntaxError を送出します。

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

    3. 解析中にエラーが発生した場合、 throw して DataError を送出します。

    4. normalizedAlgorithm の name メンバーが "ML-KEM-512" の場合:

      expectedOid を id-alg-ml-kem-512 (2.16.840.1.101.3.4.4.1) とします。

      normalizedAlgorithm の name メンバーが "ML-KEM-768" の場合:

      expectedOid を id-alg-ml-kem-768 (2.16.840.1.101.3.4.4.2) とします。

      normalizedAlgorithm の name メンバーが "ML-KEM-1024" の場合:

      expectedOid を id-alg-ml-kem-1024 (2.16.840.1.101.3.4.4.3) とします。

      それ以外の場合:

      throw して NotSupportedError を送出します。

    5. spki の algorithm AlgorithmIdentifier フィールドの algorithm オブジェクト識別子フィールドが expectedOid と等しくない場合、 throw して DataError を送出します。

    6. spki の algorithm AlgorithmIdentifier フィールドの parameters フィールドが存在する場合、 throw して DataError を送出します。

    7. publicKey を、 spki の subjectPublicKey フィールドによって識別される ML-KEM 公開鍵とします。

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

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

    10. algorithm を新しい KeyAlgorithm とします。

    11. algorithm の name 属性を、 normalizedAlgorithm の name 属性に設定します。

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

    format が "pkcs8" の場合:
    1. usages に "decapsulateKey" または "decapsulateBits" でないエントリが含まれている場合、 throw して SyntaxError を送出します。

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

    3. 解析中にエラーが発生した場合、 throw して DataError を送出します。

    4. normalizedAlgorithm の name メンバーが "ML-KEM-512" の場合:

      expectedOid を id-alg-ml-kem-512 (2.16.840.1.101.3.4.4.1) とします。

      asn1Structure を ASN.1 ML-KEM-512-PrivateKey 構造とします。

      normalizedAlgorithm の name メンバーが "ML-KEM-768" の場合:

      expectedOid を id-alg-ml-kem-768 (2.16.840.1.101.3.4.4.2) とします。

      asn1Structure を ASN.1 ML-KEM-768-PrivateKey 構造とします。

      normalizedAlgorithm の name メンバーが "ML-KEM-1024" の場合:

      expectedOid を id-alg-ml-kem-1024 (2.16.840.1.101.3.4.4.3) とします。

      asn1Structure を ASN.1 ML-KEM-1024-PrivateKey 構造とします。

      それ以外の場合:

      throw して NotSupportedError を送出します。

    5. privateKeyInfo の privateKeyAlgorithm PrivateKeyAlgorithm フィールドの algorithm オブジェクト識別子フィールドが expectedOid と等しくない場合、 throw して DataError を送出します。

    6. privateKeyInfo の privateKeyAlgorithm PrivateKeyAlgorithmIdentifier フィールドの parameters フィールドが存在する場合、 throw して DataError を送出します。

    7. mlKemPrivateKey を、 data に privateKeyInfo の privateKey フィールド、 structure に asn1Structure、 exactData を true に設定して ASN.1 構造を 解析する アルゴリズムを実行した結果とします。

    8. 解析中にエラーが発生した場合、 throw して DataError を送出します。

    9. mlKemPrivateKey が expandedKey 形式の ML-KEM 鍵を表している場合、 または mlKemPrivateKey が both 形式の ML-KEM 鍵を表しており、 both 形式がサポートされていない場合、NotSupportedError を送出します。

    10. mlKemPrivateKey が both 形式の ML-KEM 鍵を表しており、 seed フィールドが expandedKey フィールドに対応しない場合、 DataError を送出します。

    11. key を、 mlKemPrivateKey によって識別される ML-KEM 秘密鍵を表す新しい CryptoKey とします。

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

    13. algorithm を新しい KeyAlgorithm とします。

    14. algorithm の name 属性を、 normalizedAlgorithm の name 属性に設定します。

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

    format が "raw-public" の場合:
    1. usages に "encapsulateKey" または "encapsulateBits" でないエントリが含まれている場合、 throw して SyntaxError を送出します。

    2. data を keyData とします。

    3. key を、data 内の ML-KEM 公開鍵データを表す新しい CryptoKey とします。

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

    5. algorithm を新しい KeyAlgorithm とします。

    6. algorithm の name 属性を、 normalizedAlgorithm の name 属性に設定します。

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

    format が "raw-seed" の場合:
    1. usages に "decapsulateKey" または "decapsulateBits" でないエントリが含まれている場合、 throw して SyntaxError を送出します。

    2. data を keyData とします。

    3. data のビット単位の長さが 512 でない場合、 throw して DataError を送出します。

    4. privateKey を、 [FIPS-203] のセクション 6.1 で説明されている ML-KEM.KeyGen_internal 関数を、 normalizedAlgorithm の name メンバーによって示されるパラメーターセットで、 data の最初の 256 ビットを d として、 最後の 256 ビットを z として使用して実行した結果とします。

    5. key を、privateKey によって識別される ML-KEM 秘密鍵を表す新しい CryptoKey とします。

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

    7. algorithm を新しい KeyAlgorithm とします。

    8. algorithm の name 属性を、 normalizedAlgorithm の name 属性に設定します。

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

    format が "jwk" の場合:
    1. keyData が JsonWebKey 辞書の場合:

      jwk を keyData と等しくします。

      それ以外の場合:

      Throw して DataError を送出します。

    2. jwk の priv フィールドが存在し、 かつ usages に "decapsulateKey" または "decapsulateBits" でないエントリが含まれている場合、 throw して SyntaxError を送出します。

    3. jwk の priv フィールドが存在せず、 かつ usages に "encapsulateKey" または "encapsulateBits" でないエントリが含まれている場合、 throw して SyntaxError を送出します。

    4. jwk の kty フィールドが "AKP" でない場合、 throw して DataError を送出します。

    5. jwk の alg フィールドが存在しないか、その値が normalizedAlgorithm の name メンバーによって示される ML-KEM パラメーターセットを識別しない場合、 throw して DataError を送出します。

      注記

      この仕様で定義される ML-KEM パラメーターセットについて IANA JSON Web Signature and Encryption Algorithms レジストリに 登録されている "alg" 値は、 ML-KEM-512、ML-KEM-768、および ML-KEM-1024 です。 実装は、同じ ML-KEM パラメーターセットを使用する JWE アルゴリズムを識別する、 このレジストリの他の値も受け入れるべきです。ただし、その JWE アルゴリズムの JWK 表現が、"alg" 値を除いて、ここで 定義される表現と互換性があることを条件とします。 例として、登録された後の [draft-ietf-jose-hpke-pq-pqt] で提案されている値があります。

    6. usages が空でなく、jwk の use フィールドが存在し、 "enc" と等しくない場合、throw して DataError を送出します。

    7. jwk の key_ops フィールドが存在し、JSON Web Key [JWK] の要件に従って無効であるか、 指定されたすべての usages 値を含んでいない場合、 throw して DataError を送出します。

    8. jwk の ext フィールドが存在して値が false であり、extractable が true の場合、 throw して DataError を送出します。

    9. jwk の priv フィールドが 存在する場合:
      1. jwk の priv 属性が、ML-KEM 秘密鍵を表す 有効な base64url エンコードされたシードを含まない場合、 throw して DataError を送出します。

      2. key を、 jwk の priv 属性を base64url エンコードされたシードとして解釈することによって 識別される ML-KEM 秘密鍵を表す新しい CryptoKey オブジェクトとします。

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

      4. jwk の pub 属性が、key に対応する ML-KEM 公開鍵を表す base64url エンコードされた公開鍵を含まない場合、 throw して DataError を送出します。

      それ以外の場合:
      1. jwk の pub 属性が、ML-KEM 公開鍵を表す 有効な base64url エンコードされた公開鍵を含まない場合、 throw して DataError を送出します。

      2. key を、 jwk の pub 属性を base64url エンコードされた公開鍵として解釈することによって 識別される ML-KEM 公開鍵を表す新しい CryptoKey オブジェクトとします。

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

    10. algorithm を新しい KeyAlgorithm オブジェクトのインスタンスとします。

    11. algorithm の name 属性を、 normalizedAlgorithm の name メンバーに設定します。

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

    それ以外の場合:
    throw して NotSupportedError を送出します。
  3. key を返します。

6.4.6 鍵をエクスポート

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

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

  3. format が "spki" の場合:
    1. key の [[type]] 内部スロットが "public" でない場合、 throw して InvalidAccessError を送出します。

    2. keyAlgorithm を、key の [[algorithm]] 内部スロットとします。

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

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

        • keyAlgorithm の name メンバーが "ML-KEM-512" の場合:

          algorithm オブジェクト識別子を id-alg-ml-kem-512 (2.16.840.1.101.3.4.4.1) OID に設定します。

          keyAlgorithm の name メンバーが "ML-KEM-768" の場合:

          algorithm オブジェクト識別子を id-alg-ml-kem-768 (2.16.840.1.101.3.4.4.2) OID に設定します。

          keyAlgorithm の name メンバーが "ML-KEM-1024" の場合:

          algorithm オブジェクト識別子を id-alg-ml-kem-1024 (2.16.840.1.101.3.4.4.3) OID に設定します。

          それ以外の場合:

          throw して NotSupportedError を送出します。

      • subjectPublicKey フィールドを keyData に設定します。

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

    format が "pkcs8" の場合:
    1. key の [[type]] 内部スロットが "private" でない場合、 throw して InvalidAccessError を送出します。

    2. keyAlgorithm を、key の [[algorithm]] 内部スロットとします。

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

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

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

        • keyAlgorithm の name メンバーが "ML-KEM-512" の場合:

          algorithm オブジェクト識別子を id-alg-ml-kem-512 (2.16.840.1.101.3.4.4.1) OID に設定します。

          keyAlgorithm の name メンバーが "ML-KEM-768" の場合:

          algorithm オブジェクト識別子を id-alg-ml-kem-768 (2.16.840.1.101.3.4.4.2) OID に設定します。

          keyAlgorithm の name メンバーが "ML-KEM-1024" の場合:

          algorithm オブジェクト識別子を id-alg-ml-kem-1024 (2.16.840.1.101.3.4.4.3) OID に設定します。

          それ以外の場合:

          throw して NotSupportedError を送出します。

      • privateKey フィールドを次のように設定します:

        • keyAlgorithm の name メンバーが "ML-KEM-512" の場合:

          privateKey フィールドを、 key の [[handle]] 内部スロットによって表される ML-KEM 秘密鍵シードを seed-only 形式(OCTET STRING の暗黙的エンコーディングを持つ コンテキスト固有の [0] プリミティブタグを使用)で表す ML-KEM-512-PrivateKey ASN.1 型を DER エンコードした結果に設定します。

          keyAlgorithm の name メンバーが "ML-KEM-768" の場合:

          privateKey フィールドを、 key の [[handle]] 内部スロットによって表される ML-KEM 秘密鍵シードを seed-only 形式(OCTET STRING の暗黙的エンコーディングを持つ コンテキスト固有の [0] プリミティブタグを使用)で表す ML-KEM-768-PrivateKey ASN.1 型を DER エンコードした結果に設定します。

          keyAlgorithm の name メンバーが "ML-KEM-1024" の場合:

          privateKey フィールドを、 key の [[handle]] 内部スロットによって表される ML-KEM 秘密鍵シードを seed-only 形式(OCTET STRING の暗黙的エンコーディングを持つ コンテキスト固有の [0] プリミティブタグを使用)で表す ML-KEM-1024-PrivateKey ASN.1 型を DER エンコードした結果に設定します。

          それ以外の場合:

          throw して NotSupportedError を送出します。

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

    format が "raw-public" の場合:
    1. key の [[type]] 内部スロットが "public" でない場合、 throw して InvalidAccessError を送出します。

    2. data を、 key の [[handle]] 内部スロットによって表される鍵の 生のオクテットを含む バイトシーケンス とします。

    3. result を data とします。

    format が "raw-seed" の場合:
    1. key の [[type]] 内部スロットが "private" でない場合、 throw して InvalidAccessError を送出します。

    2. data を、key の [[handle]] 内部スロットによって表される鍵の d および z シード変数を連結したものを含む バイトシーケンス とします。

      注記

      d および z シード変数は、 [FIPS-203] のセクション 7.1 で説明されているように ML-KEM.KeyGen 関数でサンプリングされました。

    3. result を data とします。

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

    2. keyAlgorithm を、key の [[algorithm]] 内部スロットとします。

    3. jwk の kty 属性を "AKP" に設定します。

    4. jwk の alg 属性を keyAlgorithm の name メンバーに設定します。

    5. jwk の pub 属性を、 key の [[handle]] 内部スロットに対応する base64url エンコードされた公開鍵に設定します。

    6. key の [[type]] 内部スロットが "private" の場合:
      jwk の priv 属性を、 key の [[handle]] 内部スロットによって表される base64url エンコードされたシードに設定します。
    7. jwk の key_ops 属性を、key の usages 属性に設定します。

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

    9. result を jwk とします。

    それ以外の場合:

    throw して NotSupportedError を送出します。

  4. result を返します。

7. ハイブリッド KEM

7.1 説明

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

これは、[draft-irtf-cfrg-concrete-hybrid-kems-04] で規定されているように、 鍵のカプセル化およびカプセル化解除のために、ハイブリッド耐量子/従来型鍵 カプセル化メカニズムを使用する方法について説明します。

7.2 登録

このアルゴリズムの 認識されるアルゴリズム 名は "MLKEM768-P256"、"MLKEM768-X25519"、および "MLKEM1024-P384" です。

操作 パラメーター 結果
カプセル化 なし EncapsulatedBits
カプセル化解除 なし バイト シーケンス
共有鍵長を取得 なし 整数
generateKey なし CryptoKeyPair
importKey なし CryptoKey
exportKey なし オブジェクト

7.3 JSON Web Key 表現

ハイブリッド KEM 鍵は、JWK 表現に [RFC9964] で定義されている "AKP" (Algorithm Key Pair) 鍵タイプを使用します。"alg" (algorithm) パラメーターは、特定のハイブリッド KEM インスタンスを識別します。 公開鍵は "pub" パラメーターに格納されます。秘密鍵が含まれる場合、それは "priv" パラメーターを使用して表現されます。JWK で表現する場合、すべての鍵パラメーターは base64url でエンコードされます。

7.4 操作

7.4.1 カプセル化

  1. key の [[type]] 内部スロットが "public" でない場合、 例外を投げます。 例外は InvalidAccessError です。

  2. sharedKey および ciphertext を、 [draft-irtf-cfrg-concrete-hybrid-kems-04] の セクション 4 において algorithm の name メンバーによって示されるハイブリッド KEM インスタンスについて Encaps 関数を実行し、 key の [[handle]] 内部スロットによって表される鍵を ek 入力パラメーターとして使用した結果の出力とします。

  3. Encaps 関数がエラーを返した場合、OperationError を返します。

  4. result を新しい EncapsulatedBits 辞書とします。

  5. result の sharedKey 属性を、 sharedKey を含む ArrayBuffer を 作成した結果に設定します。

  6. result の ciphertext 属性を、 ciphertext を含む ArrayBuffer を 作成した結果に設定します。

  7. result を返します。

7.4.2 カプセル化解除

  1. key の [[type]] 内部スロットが "private" でない場合、 例外を投げます。 例外は InvalidAccessError です。

  2. sharedKey を、[draft-irtf-cfrg-concrete-hybrid-kems-04] の セクション 4 において algorithm の name メンバーによって示されるハイブリッド KEM インスタンスについて Decaps 関数を実行し、 key の [[handle]] 内部スロットによって表される鍵を dk 入力パラメーターとして、 ciphertext を ct 入力パラメーターとして使用した結果の出力とします。

  3. Decaps 関数がエラーを返した場合、OperationError を返します。

  4. sharedKey を返します。

7.4.3 共有鍵長を取得

  1. 256 を返します。

7.4.4 鍵を生成

  1. usages に "encapsulateKey"、"encapsulateBits"、 "decapsulateKey"、または "decapsulateBits" の いずれでもないエントリが含まれている場合、 例外を投げます。 例外は SyntaxError です。

  2. [draft-irtf-cfrg-hybrid-kems-12] の セクション 5.2 で説明されている GenerateKeyPair 関数を、 normalizedAlgorithm の name メンバーによって示されるハイブリッド KEM インスタンスで実行することにより、ハイブリッド KEM 鍵ペアを生成します。

  3. 鍵生成ステップが失敗した場合、 例外を投げます。 例外は OperationError です。

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

  5. algorithm の name 属性を、 normalizedAlgorithm の name 属性に設定します。

  6. publicKey を、生成された鍵ペアのカプセル化鍵を表す新しい CryptoKey とします。

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

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

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

  10. publicKey の [[usages]] 内部スロットを、 usages と [ "encapsulateKey", "encapsulateBits" ] の 使用法の 共通部分に設定します。

  11. privateKey を、生成された鍵ペアのカプセル化解除鍵を表す新しい CryptoKey とします。

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

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

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

  15. privateKey の [[usages]] 内部スロットを、 usages と [ "decapsulateKey", "decapsulateBits" ] の 使用法の 共通部分に設定します。

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

  17. result の publicKey 属性 を publicKey に設定します。

  18. result の privateKey 属性 を privateKey に設定します。

  19. result を返します。

7.4.5 鍵をインポート

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

  2. format が "raw-public" の場合:
    1. usages に "encapsulateKey" または "encapsulateBits" の いずれでもないエントリが含まれている場合、 例外を投げます。 例外は SyntaxError です。

    2. data を keyData とします。

    3. data のバイト単位の長さが、[draft-irtf-cfrg-concrete-hybrid-kems-04] の セクション 4 において normalizedAlgorithm の name メンバーによって示されるハイブリッド KEM インスタンスの生の公開鍵の 長さ Nek でない場合、 例外を投げます。 例外は DataError です。

    4. key を、data 内のハイブリッド KEM 公開鍵データを表す 新しい CryptoKey とします。

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

    6. algorithm を新しい KeyAlgorithm とします。

    7. algorithm の name 属性を、 normalizedAlgorithm の name 属性に設定します。

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

    format が "raw-seed" の場合:
    1. usages に "decapsulateKey" または "decapsulateBits" の いずれでもないエントリが含まれている場合、 例外を投げます。 例外は SyntaxError です。

    2. data を keyData とします。

    3. data のビット単位の長さが 256 でない場合、 例外を投げます。 例外は DataError です。

    4. keyPair を、[draft-irtf-cfrg-hybrid-kems-12] の セクション 5.5 で説明されている DeriveKeyPair 関数を、 normalizedAlgorithm の name メンバーによって示されるハイブリッド KEM インスタンスで、data を seed 入力パラメーターとして使用して実行した結果とします。

    5. DeriveKeyPair 関数がエラーを返した場合、 例外を投げます。 例外は OperationError です。

    6. key を、keyPair のカプセル化解除鍵によって識別される ハイブリッド KEM 秘密鍵を表す新しい CryptoKey とします。

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

    8. algorithm を新しい KeyAlgorithm とします。

    9. algorithm の name 属性を、 normalizedAlgorithm の name 属性に設定します。

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

    format が "jwk" の場合:
    1. keyData が JsonWebKey 辞書である場合:

      jwk を keyData と等しくします。

      それ以外の場合:

      例外を投げます。 例外は DataError です。

    2. jwk の priv フィールドが存在し、 かつ usages に "decapsulateKey" または "decapsulateBits" の いずれでもないエントリが含まれている場合、 例外を投げます。 例外は SyntaxError です。

    3. jwk の priv フィールドが存在せず、 かつ usages に "encapsulateKey" または "encapsulateBits" の いずれでもないエントリが含まれている場合、 例外を投げます。 例外は SyntaxError です。

    4. jwk の kty フィールドが "AKP" でない場合、 例外を投げます。 例外は DataError です。

    5. jwk の alg フィールドが存在しないか、 その値が normalizedAlgorithm の name メンバーによって示されるハイブリッド KEM インスタンスを 識別しない場合、 例外を投げます。 例外は DataError です。

      注記

      この仕様で定義されているハイブリッド KEM インスタンスについて、 IANA JSON Web 署名および暗号化アルゴリズムレジストリに 登録されている "alg" 値は、 MLKEM768-P256、MLKEM768-X25519、および MLKEM1024-P384 です。実装は、同じハイブリッド KEM インスタンスを使用する JWE アルゴリズムを識別する、このレジストリの その他の値も受け入れるべきです。ただし、その JWE アルゴリズムの JWK 表現が、"alg" 値を除いて、ここで定義されている 表現と互換性があることを条件とします。 例として、登録された後の [draft-ietf-jose-hpke-pq-pqt] で提案されている値があります。

    6. usages が空でなく、jwk の use フィールドが存在し、 "enc" と等しくない場合、 例外を投げます。 例外は DataError です。

    7. jwk の key_ops フィールドが存在し、JSON Web Key [JWK] の要件に従って無効であるか、 指定されたすべての usages 値を含まない場合、 例外を投げます。 例外は DataError です。

    8. jwk の ext フィールドが存在し、その値が false で、extractable が true の場合、 例外を投げます。 例外は DataError です。

    9. jwk の priv フィールドが 存在する場合:
      1. jwk の priv 属性に、ハイブリッド KEM 秘密鍵を表す有効な base64url エンコード済み 32 バイトのシードが含まれていない場合、 例外を投げます。 例外は DataError です。

      2. key を、 jwk の priv 属性を base64url エンコード済みシードとして解釈することで識別される ハイブリッド KEM 秘密鍵を表す 新しい CryptoKey オブジェクトとします。

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

      4. jwk の pub 属性に、key に対応するハイブリッド KEM 公開鍵を 表す base64url エンコード済み公開鍵が 含まれていない場合、 例外を投げます。 例外は DataError です。

      それ以外の場合:
      1. jwk の pub 属性に、[draft-irtf-cfrg-concrete-hybrid-kems-04] の セクション 4 において normalizedAlgorithm の name メンバーによって示されるハイブリッド KEM インスタンスについて、 長さが Nek である有効な base64url エンコード済みの生の 公開鍵が含まれていない場合、 例外を投げます。 例外は DataError です。

      2. key を、 jwk の pub 属性を base64url エンコード済み公開鍵として解釈することで識別される ハイブリッド KEM 公開鍵を表す 新しい CryptoKey オブジェクトとします。

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

    10. algorithm を KeyAlgorithm オブジェクトの新しいインスタンスとします。

    11. algorithm の name 属性を、 normalizedAlgorithm の name メンバーに設定します。

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

    それ以外の場合:
    例外を投げます。 例外は NotSupportedError です。
  3. key を返します。

7.4.6 鍵をエクスポート

  1. key をエクスポートする CryptoKey と します。

  2. key の [[handle]] 内部スロットによって表される基礎となる暗号鍵素材に アクセスできない場合、例外を投げます。 例外は OperationError です。

  3. format が "raw-public" の場合:
    1. key の [[type]] 内部スロット が "public" でない場合、 例外を投げます。 例外は InvalidAccessError です。

    2. data を、key の [[handle]] 内部スロットによって表される鍵の生のオクテットを 含む バイトシーケンス とします。

    3. result を data とします。

    format が "raw-seed" の場合:
    1. key の [[type]] 内部スロット が "private" でない場合、 例外を投げます。 例外は InvalidAccessError です。

    2. data を、key の [[handle]] 内部スロットによって表される 32 バイトのシードを含む バイトシーケンス とします。

    3. result を data とします。

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

    2. keyAlgorithm を key の [[algorithm]] 内部スロットとします。

    3. jwk の kty 属性を "AKP" に設定します。

    4. jwk の alg 属性を、 keyAlgorithm の name メンバーに設定します。

    5. jwk の pub 属性を、 key の [[handle]] 内部スロットに対応する base64url エンコード済み公開鍵に 設定します。

    6. key の [[type]] 内部スロット が "private" の場合:
      jwk の priv 属性 を、key の [[handle]] 内部スロットによって表される base64url エンコード済み 32 バイトのシードに 設定します。
    7. jwk の key_ops 属性を、key の usages 属性に設定します。

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

    9. result を jwk とします。

    それ以外の場合:

    例外を投げます。 例外は NotSupportedError です。

  4. result を返します。

8. ML-DSA

8.1 説明

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

これは、[FIPS-204] で規定されているように、 署名および検証に ML-DSA を使用する方法について説明します。

8.2 登録

このアルゴリズムの 認識されるアルゴリズム 名は "ML-DSA-44"、"ML-DSA-65"、および "ML-DSA-87" です。

操作 パラメーター 結果
署名 ContextParams バイト シーケンス
検証 ContextParams 真偽値
generateKey なし CryptoKeyPair
importKey なし CryptoKey
exportKey なし オブジェクト

8.3 ContextParams 辞書

WebIDLdictionary ContextParams : Algorithm {
  BufferSource context;
};

context メンバーは、メッセージに関連付けるオプションのコンテキストデータを 表します。

注記

ContextParams 辞書は、[webcrypto-secure-curves] の Ed448Params 辞書と同一であり、 この提案を統合する際には後者を前者で置き換えることができます。

8.4 操作

8.4.1 署名

  1. normalizedAlgorithm の context メンバーが 存在し、その 長さが 255 バイトを超える場合、例外を投げます。例外は OperationError です。

  2. key の [[type]] 内部スロットが "private" でない場合、 例外を投げます。例外は InvalidAccessError です。

  3. context を、normalizedAlgorithm の context メンバーとします。normalizedAlgorithm の context メンバーが 存在しない場合は、空のオクテット文字列とします。

  4. result を、[FIPS-204] のセクション 5.2 で規定されている ML-DSA.Sign 署名アルゴリズムを、 normalizedAlgorithm の name メンバーによって示されるパラメーターセットで、 key に関連付けられた ML-DSA 秘密鍵を sk、 message を M、context を ctx として使用して実行した結果とします。

  5. ML-DSA.Sign アルゴリズムがエラーを返した場合、OperationError を返します。

  6. result を返します。

8.4.2 検証

  1. normalizedAlgorithm の context メンバーが 存在し、その 長さが 255 バイトを超える場合、例外を投げます。例外は OperationError です。

  2. key の [[type]] 内部スロットが "public" でない場合、 例外を投げます。例外は InvalidAccessError です。

  3. context を、normalizedAlgorithm の context メンバーとします。normalizedAlgorithm の context メンバーが 存在しない場合は、空のオクテット文字列とします。

  4. result を、[FIPS-204] のセクション 5.3 で規定されている ML-DSA.Verify 検証アルゴリズムを、 normalizedAlgorithm の name メンバーによって示されるパラメーターセットで、 key に関連付けられた ML-DSA 公開鍵を pk、 message を M、signature を σ、 context を ctx として使用して実行した結果とします。

  5. ML-DSA.Verify アルゴリズムがエラーを返した場合、OperationError を返します。

  6. result を返します。

8.4.3 鍵を生成

  1. usages に "sign" または "verify" のいずれでもない エントリが含まれている場合、例外を投げます。 例外は SyntaxError です。

  2. [FIPS-204] の セクション 5.1 で説明されているように、normalizedAlgorithm の name メンバーによって示される パラメーターセットで ML-DSA 鍵ペアを生成します。

    注記

    シード ξ をエクスポートできるようにするには、 生成される 鍵素材の一部として保存する必要があります。

  3. 鍵生成ステップが失敗した場合、 例外を投げます。例外は OperationError です。

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

  5. algorithm の name 属性を、 normalizedAlgorithm の name 属性に 設定します。

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

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

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

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

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

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

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

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

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

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

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

  17. result の publicKey 属性 を publicKey に設定します。

  18. result の privateKey 属性 を privateKey に設定します。

  19. result を返します。

8.4.4 鍵をインポート

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

  2. format が "spki" の場合:
    1. usages に "verify" でないエントリが含まれている場合、 例外を投げます。例外は SyntaxError です。

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

    3. 解析中にエラーが発生した場合、 例外を投げます。例外は DataError です。

    4. normalizedAlgorithm の name メンバーが "ML-DSA-44" の場合:

      expectedOid を id-ml-dsa-44 (2.16.840.1.101.3.4.3.17) とします。

      normalizedAlgorithm の name メンバーが "ML-DSA-65" の場合:

      expectedOid を id-ml-dsa-65 (2.16.840.1.101.3.4.3.18) とします。

      normalizedAlgorithm の name メンバーが "ML-DSA-87" の場合:

      expectedOid を id-ml-dsa-87 (2.16.840.1.101.3.4.3.19) とします。

      それ以外の場合:

      例外を投げます。例外は NotSupportedError です。

    5. spki の algorithm AlgorithmIdentifier フィールドの algorithm オブジェクト識別子フィールドが expectedOid と等しくない場合、 例外を投げます。例外は DataError です。

    6. spki の algorithm AlgorithmIdentifier フィールドの parameters フィールドが存在する場合、 例外を投げます。例外は DataError です。

    7. publicKey を、spki の subjectPublicKey フィールドによって識別される ML-DSA 公開鍵とします。

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

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

    10. algorithm を新しい KeyAlgorithm とします。

    11. algorithm の name 属性を、 normalizedAlgorithm の name 属性に 設定します。

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

    format が "pkcs8" の場合:
    1. usages に "sign" でないエントリが含まれている場合、 例外を投げます。例外は SyntaxError です。

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

    3. 解析中にエラーが発生した場合、 例外を投げます。例外は DataError です。

    4. normalizedAlgorithm の name メンバーが "ML-DSA-44" の場合:

      expectedOid を id-ml-dsa-44 (2.16.840.1.101.3.4.3.17) とします。

      asn1Structure を ASN.1 ML-DSA-44-PrivateKey 構造とします。

      normalizedAlgorithm の name メンバーが "ML-DSA-65" の場合:

      expectedOid を id-ml-dsa-65 (2.16.840.1.101.3.4.3.18) とします。

      asn1Structure を ASN.1 ML-DSA-65-PrivateKey 構造とします。

      normalizedAlgorithm の name メンバーが "ML-DSA-87" の場合:

      expectedOid を id-ml-dsa-87 (2.16.840.1.101.3.4.3.19) とします。

      asn1Structure を ASN.1 ML-DSA-87-PrivateKey 構造とします。

      それ以外の場合:

      例外を投げます。例外は NotSupportedError です。

    5. privateKeyInfo の privateKeyAlgorithm PrivateKeyAlgorithm フィールドの algorithm オブジェクト識別子フィールドが expectedOid と等しくない場合、 例外を投げます。例外は DataError です。

    6. privateKeyInfo の privateKeyAlgorithm PrivateKeyAlgorithmIdentifier フィールドの parameters フィールドが存在する場合、 例外を投げます。例外は DataError です。

    7. mlDsaPrivateKey を、 ASN.1 構造を 解析する アルゴリズムを、data に privateKeyInfo の privateKey フィールドを、 structure に asn1Structure を指定し、exactData を true に設定して実行した結果とします。

    8. 解析中にエラーが発生した場合、 例外を投げます。例外は DataError です。

    9. mlDsaPrivateKey が expandedKey 形式の ML-DSA 鍵を表す場合、 または mlDsaPrivateKey が both 形式の ML-DSA 鍵を表し、 both 形式がサポートされていない場合、NotSupportedError を投げます。

    10. mlDsaPrivateKey が both 形式の ML-DSA 鍵を表し、 seed フィールドが expandedKey フィールドに対応しない場合、 DataError を投げます。

    11. key を、mlDsaPrivateKey によって識別される ML-DSA 秘密鍵を表す新しい CryptoKey とします。

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

    13. algorithm を新しい KeyAlgorithm とします。

    14. algorithm の name 属性を、 normalizedAlgorithm の name 属性に 設定します。

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

    format が "raw-public" の場合:
    1. usages に "verify" でないエントリが含まれている場合、 例外を投げます。例外は SyntaxError です。

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

    3. algorithm の name 属性を、 normalizedAlgorithm の name 属性に 設定します。

    4. key を、keyData で提供された鍵データを表す新しい CryptoKey とします。

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

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

    format が "raw-seed" の場合:
    1. usages に "sign" でないエントリが含まれている場合、 例外を投げます。例外は SyntaxError です。

    2. data を keyData とします。

    3. data のビット単位の長さが 256 でない場合、 例外を投げます。例外は DataError です。

    4. privateKey を、[FIPS-204] の セクション 6.1 で説明されている ML-DSA.KeyGen_internal 関数を、 normalizedAlgorithm の name メンバーによって示される パラメーターセットで、 data を ξ として使用して実行した結果とします。

    5. key を、privateKey によって識別される ML-DSA 秘密鍵を表す新しい CryptoKey とします。

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

    7. algorithm を新しい KeyAlgorithm とします。

    8. algorithm の name 属性を、 normalizedAlgorithm の name 属性に 設定します。

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

    format が "jwk" の場合:
    1. keyData が JsonWebKey 辞書である場合:

      jwk を keyData と等しくします。

      それ以外の場合:

      例外を投げます。例外は DataError です。

    2. priv フィールドが 存在し、 usages に "sign" でないエントリが含まれている場合、または、 priv フィールドが 存在せず、 usages に "verify" でないエントリが含まれている場合、 例外を投げます。例外は SyntaxError です。

    3. jwk の kty フィールドが "AKP" でない場合、 例外を投げます。例外は DataError です。

    4. jwk の alg フィールドが normalizedAlgorithm の name メンバーと等しくない場合、 例外を投げます。例外は DataError です。

    5. usages が空でなく、jwk の use フィールドが存在し、 "sig" と等しくない場合、例外を投げます。例外は DataError です。

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

    7. jwk の ext フィールドが存在し、 値が false で、extractable が true の場合、 例外を投げます。例外は DataError です。

    8. jwk の priv フィールドが 存在する場合:
      1. jwk の priv 属性に、 ML-DSA 秘密鍵を表す有効な base64url エンコード済みシードが 含まれていない場合、 例外を投げます。例外は DataError です。

      2. key を、 jwk の priv 属性を base64url エンコード済みシードとして解釈することで識別される ML-DSA 秘密鍵を表す新しい CryptoKey オブジェクトとします。

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

      4. jwk の pub 属性に、 key に対応する ML-DSA 公開鍵を 表す base64url エンコード済み公開鍵が 含まれていない場合、 例外を投げます。例外は DataError です。

      それ以外の場合:
      1. jwk の pub 属性に、 ML-DSA 公開鍵を表す有効な base64url エンコード済み公開鍵が 含まれていない場合、 例外を投げます。例外は DataError です。

      2. key を、 jwk の pub 属性を base64url エンコード済み公開鍵として解釈することで識別される ML-DSA 公開鍵を表す新しい CryptoKey オブジェクトとします。

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

    9. algorithm を新しい KeyAlgorithm オブジェクトのインスタンスとします。

    10. algorithm の name 属性を、 normalizedAlgorithm の name メンバーに設定します。

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

    それ以外の場合:

    例外を投げます。例外は NotSupportedError です。

  3. key を返します。

8.4.5 鍵をエクスポート

  1. key をエクスポートする CryptoKey と します。

  2. key の [[handle]] 内部スロットによって表される基礎となる暗号鍵素材に アクセスできない場合、例外を投げます。例外は OperationError です。

  3. format が "spki" の場合:
    1. key の [[type]] 内部スロット が "public" でない場合、 例外を投げます。例外は InvalidAccessError です。

    2. keyAlgorithm を key の [[algorithm]] 内部スロットとします。

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

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

        • keyAlgorithm の name メンバーが "ML-DSA-44" の場合:

          algorithm オブジェクト識別子を id-ml-dsa-44 (2.16.840.1.101.3.4.3.17) OID に設定します。

          keyAlgorithm の name メンバーが "ML-DSA-65" の場合:

          algorithm オブジェクト識別子を id-ml-dsa-65 (2.16.840.1.101.3.4.3.18) OID に設定します。

          keyAlgorithm の name メンバーが "ML-DSA-87" の場合:

          algorithm オブジェクト識別子を id-ml-dsa-87 (2.16.840.1.101.3.4.3.19) OID に設定します。

          それ以外の場合:

          例外を投げます。例外は NotSupportedError です。

      • subjectPublicKey フィールドを keyData に設定します。

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

    format が "pkcs8" の場合:
    1. key の [[type]] 内部スロット が "private" でない場合、 例外を投げます。例外は InvalidAccessError です。

    2. keyAlgorithm を key の [[algorithm]] 内部スロットとします。

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

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

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

        • keyAlgorithm の name メンバーが "ML-DSA-44" の場合:

          algorithm オブジェクト識別子を id-ml-dsa-44 (2.16.840.1.101.3.4.3.17) OID に設定します。

          keyAlgorithm の name メンバーが "ML-DSA-65" の場合:

          algorithm オブジェクト識別子を id-ml-dsa-65 (2.16.840.1.101.3.4.3.18) OID に設定します。

          keyAlgorithm の name メンバーが "ML-DSA-87" の場合:

          algorithm オブジェクト識別子を id-ml-dsa-87 (2.16.840.1.101.3.4.3.19) OID に設定します。

          それ以外の場合:

          例外を投げます。例外は NotSupportedError です。

      • privateKey フィールドを次のように設定します:

        • keyAlgorithm の name メンバーが "ML-DSA-44" の場合:

          privateKey フィールドを、 key の [[handle]] 内部スロットによって表される ML-DSA 秘密鍵シードを seed-only 形式(OCTET STRING の暗黙的エンコーディングを持つ コンテキスト固有の [0] プリミティブタグを使用)で表す ML-DSA-44-PrivateKey ASN.1 型を DER エンコードした結果に設定します。

          keyAlgorithm の name メンバーが "ML-DSA-65" の場合:

          privateKey フィールドを、 key の [[handle]] 内部スロットによって表される ML-DSA 秘密鍵シードを seed-only 形式(OCTET STRING の暗黙的エンコーディングを持つ コンテキスト固有の [0] プリミティブタグを使用)で表す ML-DSA-65-PrivateKey ASN.1 型を DER エンコードした結果に設定します。

          keyAlgorithm の name メンバーが "ML-DSA-87" の場合:

          privateKey フィールドを、 key の [[handle]] 内部スロットによって表される ML-DSA 秘密鍵シードを seed-only 形式(OCTET STRING の暗黙的エンコーディングを持つ コンテキスト固有の [0] プリミティブタグを使用)で表す ML-DSA-87-PrivateKey ASN.1 型を DER エンコードした結果に設定します。

          それ以外の場合:

          例外を投げます。例外は NotSupportedError です。

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

    format が "raw-public" の場合:
    1. key の [[type]] 内部スロット が "public" でない場合、 例外を投げます。例外は InvalidAccessError です。

    2. data を、key の [[handle]] 内部スロットによって表される ML-DSA 公開鍵を含む バイトシーケンス とします。

    3. result を data とします。

    format が "raw-seed" の場合:
    1. key の [[type]] 内部スロット が "private" でない場合、 例外を投げます。例外は InvalidAccessError です。

    2. data を、key の [[handle]] 内部スロットによって表される鍵の ξ シード変数を 含む バイトシーケンス とします。

      注記

      ξ シード変数は、[FIPS-204] のセクション 5.1 で説明されているように、 ML-DSA.KeyGen 関数で サンプリングされました。

    3. result を data とします。

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

    2. keyAlgorithm を key の [[algorithm]] 内部スロットとします。

    3. jwk の kty 属性を "AKP" に設定します。

    4. jwk の alg 属性を、 keyAlgorithm の name メンバーに設定します。

    5. jwk の pub 属性を、 key の [[handle]] 内部スロットに対応する base64url エンコード済み公開鍵に 設定します。

    6. key の [[type]] 内部スロット が "private" の場合:
      jwk の priv 属性 を、key の [[handle]] 内部スロットによって表される base64url エンコード済みシードに 設定します。
    7. jwk の key_ops 属性を、key の usages 属性に設定します。

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

    9. result を jwk とします。

    それ以外の場合:

    例外を投げます。例外は NotSupportedError です。

  4. result を返します。

9. SLH-DSA

9.1 説明

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

これは、[FIPS-205] で規定されているように、 署名および検証に SLH-DSA を使用する方法について説明します。

9.2 登録

このアルゴリズムの 認識されるアルゴリズム 名は "SLH-DSA-SHA2-128s"、"SLH-DSA-SHAKE-128s"、 "SLH-DSA-SHA2-128f"、"SLH-DSA-SHAKE-128f"、 "SLH-DSA-SHA2-192s"、"SLH-DSA-SHAKE-192s"、 "SLH-DSA-SHA2-192f"、"SLH-DSA-SHAKE-192f"、 "SLH-DSA-SHA2-256s"、"SLH-DSA-SHAKE-256s"、 "SLH-DSA-SHA2-256f"、および "SLH-DSA-SHAKE-256f" です。

操作 パラメーター 結果
署名 ContextParams バイト シーケンス
検証 ContextParams 真偽値
generateKey なし CryptoKeyPair
importKey なし CryptoKey
exportKey なし オブジェクト

9.3 JSON Web Key 表現

SLH-DSA 鍵は、JWK 表現に [RFC9964] で定義されている "AKP" (Algorithm Key Pair) 鍵タイプを使用します。"alg" (algorithm) パラメーターは、特定の SLH-DSA パラメーターセットを識別します。 公開鍵は "pub" パラメーターに格納されます。秘密鍵が含まれる場合、それは "priv" パラメーターを使用して表現されます。JWK で表現する場合、すべての鍵パラメーターは base64url でエンコードされます。

9.4 操作

9.4.1 署名

  1. normalizedAlgorithm の context メンバーが 存在し、その 長さが 255 バイトを超える場合、例外を投げます。例外は OperationError です。

  2. key の [[type]] 内部スロットが "private" でない場合、 例外を投げます。例外は InvalidAccessError です。

  3. context を、normalizedAlgorithm の context メンバーとします。normalizedAlgorithm の context メンバーが 存在しない場合は、空のオクテット文字列とします。

  4. result を、[FIPS-205] のセクション 10.2.1 で規定されている slh_sign 署名アルゴリズムを、 normalizedAlgorithm の name メンバーによって示されるパラメーターセットで、 key に関連付けられた SLH-DSA 秘密鍵を SK、 message を M、context を ctx として使用して実行した結果とします。

  5. slh_sign アルゴリズムがエラーを返した場合、OperationError を返します。

  6. result を返します。

9.4.2 検証

  1. key の [[type]] 内部スロットが "public" でない場合、 例外を投げます。例外は InvalidAccessError です。

  2. context を、normalizedAlgorithm の context メンバーとします。normalizedAlgorithm の context メンバーが 存在しない場合は、空のオクテット文字列とします。

  3. result を、[FIPS-205] のセクション 10.3 で規定されている slh_verify 検証アルゴリズムを、 normalizedAlgorithm の name メンバーによって示されるパラメーターセットで、 key に関連付けられた SLH-DSA 公開鍵を PK、 message を M、signature を SIG、 context を ctx として使用して実行した結果とします。

  4. slh_verify アルゴリズムがエラーを返した場合、OperationError を返します。

  5. result を返します。

9.4.3 鍵を生成

  1. usages に "sign" または "verify" のいずれでもない エントリが含まれている場合、例外を投げます。 例外は SyntaxError です。

  2. [FIPS-205] の セクション 10.1 で説明されているように、 normalizedAlgorithm の name メンバーによって示される パラメーターセットで SLH-DSA 鍵ペアを生成します。

  3. 鍵生成ステップが失敗した場合、 例外を投げます。例外は OperationError です。

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

  5. algorithm の name 属性を、 normalizedAlgorithm の name 属性に 設定します。

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

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

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

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

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

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

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

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

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

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

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

  17. result の publicKey 属性 を publicKey に設定します。

  18. result の privateKey 属性 を privateKey に設定します。

  19. result を返します。

9.4.4 鍵をインポート

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

  2. format が "spki" の場合:
    1. usages に "verify" でないエントリが含まれている場合、 例外を投げます。例外は SyntaxError です。

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

    3. 解析中にエラーが発生した場合、 例外を投げます。例外は DataError です。

    4. normalizedAlgorithm の name メンバーが "SLH-DSA-SHA2-128s" の場合:

      expectedOid を id-slh-dsa-sha2-128s (2.16.840.1.101.3.4.3.20) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHA2-128f" の場合:

      expectedOid を id-slh-dsa-sha2-128f (2.16.840.1.101.3.4.3.21) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHA2-192s" の場合:

      expectedOid を id-slh-dsa-sha2-192s (2.16.840.1.101.3.4.3.22) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHA2-192f" の場合:

      expectedOid を id-slh-dsa-sha2-192f (2.16.840.1.101.3.4.3.23) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHA2-256s" の場合:

      expectedOid を id-slh-dsa-sha2-256s (2.16.840.1.101.3.4.3.24) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHA2-256f" の場合:

      expectedOid を id-slh-dsa-sha2-256f (2.16.840.1.101.3.4.3.25) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHAKE-128s" の場合:

      expectedOid を id-slh-dsa-shake-128s (2.16.840.1.101.3.4.3.26) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHAKE-128f" の場合:

      expectedOid を id-slh-dsa-shake-128f (2.16.840.1.101.3.4.3.27) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHAKE-192s" の場合:

      expectedOid を id-slh-dsa-shake-192s (2.16.840.1.101.3.4.3.28) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHAKE-192f" の場合:

      expectedOid を id-slh-dsa-shake-192f (2.16.840.1.101.3.4.3.29) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHAKE-256s" の場合:

      expectedOid を id-slh-dsa-shake-256s (2.16.840.1.101.3.4.3.30) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHAKE-256f" の場合:

      expectedOid を id-slh-dsa-shake-256f (2.16.840.1.101.3.4.3.31) とします。

      それ以外の場合:

      例外を投げます。例外は NotSupportedError です。

    5. spki の algorithm AlgorithmIdentifier フィールドの algorithm オブジェクト識別子フィールドが expectedOid と等しくない場合、 例外を投げます。例外は DataError です。

    6. spki の algorithm AlgorithmIdentifier フィールドの parameters フィールドが存在する場合、 例外を投げます。例外は DataError です。

    7. publicKey を、spki の subjectPublicKey フィールドによって識別される SLH-DSA 公開鍵とします。

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

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

    10. algorithm を新しい KeyAlgorithm とします。

    11. algorithm の name 属性を、 normalizedAlgorithm の name 属性に 設定します。

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

    format が "pkcs8" の場合:
    1. usages に "sign" でないエントリが含まれている場合、 例外を投げます。例外は SyntaxError です。

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

    3. 解析中にエラーが発生した場合、 例外を投げます。例外は DataError です。

    4. normalizedAlgorithm の name メンバーが "SLH-DSA-SHA2-128s" の場合:

      expectedOid を id-slh-dsa-sha2-128s (2.16.840.1.101.3.4.3.20) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHA2-128f" の場合:

      expectedOid を id-slh-dsa-sha2-128f (2.16.840.1.101.3.4.3.21) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHA2-192s" の場合:

      expectedOid を id-slh-dsa-sha2-192s (2.16.840.1.101.3.4.3.22) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHA2-192f" の場合:

      expectedOid を id-slh-dsa-sha2-192f (2.16.840.1.101.3.4.3.23) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHA2-256s" の場合:

      expectedOid を id-slh-dsa-sha2-256s (2.16.840.1.101.3.4.3.24) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHA2-256f" の場合:

      expectedOid を id-slh-dsa-sha2-256f (2.16.840.1.101.3.4.3.25) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHAKE-128s" の場合:

      expectedOid を id-slh-dsa-shake-128s (2.16.840.1.101.3.4.3.26) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHAKE-128f" の場合:

      expectedOid を id-slh-dsa-shake-128f (2.16.840.1.101.3.4.3.27) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHAKE-192s" の場合:

      expectedOid を id-slh-dsa-shake-192s (2.16.840.1.101.3.4.3.28) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHAKE-192f" の場合:

      expectedOid を id-slh-dsa-shake-192f (2.16.840.1.101.3.4.3.29) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHAKE-256s" の場合:

      expectedOid を id-slh-dsa-shake-256s (2.16.840.1.101.3.4.3.30) とします。

      normalizedAlgorithm の name メンバーが "SLH-DSA-SHAKE-256f" の場合:

      expectedOid を id-slh-dsa-shake-256f (2.16.840.1.101.3.4.3.31) とします。

      それ以外の場合:

      例外を投げます。例外は NotSupportedError です。

    5. privateKeyInfo の privateKeyAlgorithm PrivateKeyAlgorithm フィールドの algorithm オブジェクト識別子フィールドが expectedOid と等しくない場合、 例外を投げます。例外は DataError です。

    6. privateKeyInfo の privateKeyAlgorithm PrivateKeyAlgorithmIdentifier フィールドの parameters フィールドが存在する場合、 例外を投げます。例外は DataError です。

    7. slhDsaPrivateKey を、 ASN.1 構造を 解析する アルゴリズムを、data に privateKeyInfo の privateKey フィールドを、 structure に OCTET STRING を指定し、 exactData を true に設定して実行した結果とします。

    8. 解析中にエラーが発生した場合、 例外を投げます。例外は DataError です。

    9. key を、slhDsaPrivateKey によって識別される SLH-DSA 秘密鍵を表す新しい CryptoKey とします。

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

    11. algorithm を新しい KeyAlgorithm とします。

    12. algorithm の name 属性を、 normalizedAlgorithm の name 属性に 設定します。

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

    format が "raw-public" の場合:
    1. usages に "verify" でないエントリが含まれている場合、 例外を投げます。例外は SyntaxError です。

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

    3. algorithm の name 属性を、 normalizedAlgorithm の name 属性に 設定します。

    4. keyData の 長さが、 normalizedAlgorithm の name メンバーによって示されるパラメーターセットについて [FIPS-205] の表 2 で規定される pk length でない場合、 例外を投げます。例外は DataError です。

    5. key を、keyData で提供された鍵データを表す新しい CryptoKey とします。

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

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

    format が "raw-private" の場合:
    1. usages に "sign" でないエントリが含まれている場合、 例外を投げます。例外は SyntaxError です。

    2. keyData の 長さが、 normalizedAlgorithm の name メンバーによって示されるパラメーターセットについて [FIPS-205] の表 2 で規定される pk length の 2 倍でない場合、 例外を投げます。例外は DataError です。

    3. key を、keyData で提供された鍵データを表す新しい CryptoKey とします。

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

    5. algorithm を新しい KeyAlgorithm とします。

    6. algorithm の name 属性を、 normalizedAlgorithm の name 属性に 設定します。

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

    format が "jwk" の場合:
    1. keyData が JsonWebKey 辞書である場合:

      jwk を keyData と等しくします。

      それ以外の場合:

      例外を投げます。例外は DataError です。

    2. priv フィールドが 存在し、 usages に "sign" でないエントリが含まれている場合、または、 priv フィールドが 存在せず、 usages に "verify" でないエントリが含まれている場合、 例外を投げます。例外は SyntaxError です。

    3. jwk の kty フィールドが "AKP" でない場合、 例外を投げます。例外は DataError です。

    4. jwk の alg フィールドが normalizedAlgorithm の name メンバーと等しくない場合、 例外を投げます。例外は DataError です。

    5. usages が空でなく、jwk の use フィールドが存在し、 "sig" と等しくない場合、例外を投げます。例外は DataError です。

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

    7. jwk の ext フィールドが存在し、 値が false で、extractable が true の場合、 例外を投げます。例外は DataError です。

    8. jwk の priv フィールドが 存在する場合:
      1. jwk の priv 属性に、 SLH-DSA 秘密鍵を表す有効な base64url エンコード済み値が 含まれていない場合、 例外を投げます。例外は DataError です。

      2. key を、 jwk の priv 属性を base64url エンコード済み秘密鍵として解釈することで識別される SLH-DSA 秘密鍵を表す新しい CryptoKey オブジェクトとします。

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

      4. jwk の pub 属性に、 key に対応する SLH-DSA 公開鍵を 表す base64url エンコード済み公開鍵が 含まれていない場合、 例外を投げます。例外は DataError です。

      それ以外の場合:
      1. jwk の pub 属性に、 SLH-DSA 公開鍵を表す有効な base64url エンコード済み公開鍵が 含まれていない場合、 例外を投げます。例外は DataError です。

      2. key を、 jwk の pub 属性を base64url エンコード済み公開鍵として解釈することで識別される SLH-DSA 公開鍵を表す新しい CryptoKey オブジェクトとします。

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

    9. algorithm を新しい KeyAlgorithm オブジェクトのインスタンスとします。

    10. algorithm の name 属性を、 normalizedAlgorithm の name メンバーに設定します。

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

    それ以外の場合:

    例外を投げます。例外は NotSupportedError です。

  3. key を返します。

9.4.5 鍵をエクスポート

  1. key をエクスポートする CryptoKey と します。

  2. key の [[handle]] 内部スロットによって表される基礎となる暗号鍵素材に アクセスできない場合、例外を投げます。例外は OperationError です。

  3. format が "spki" の場合:
    1. key の [[type]] 内部スロット が "public" でない場合、 例外を投げます。例外は InvalidAccessError です。

    2. keyAlgorithm を key の [[algorithm]] 内部スロットとします。

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

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

        • keyAlgorithm の name メンバーが "SLH-DSA-SHA2-128s" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-sha2-128s (2.16.840.1.101.3.4.3.20) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHA2-128f" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-sha2-128f (2.16.840.1.101.3.4.3.21) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHA2-192s" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-sha2-192s (2.16.840.1.101.3.4.3.22) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHA2-192f" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-sha2-192f (2.16.840.1.101.3.4.3.23) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHA2-256s" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-sha2-256s (2.16.840.1.101.3.4.3.24) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHA2-256f" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-sha2-256f (2.16.840.1.101.3.4.3.25) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHAKE-128s" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-shake-128s (2.16.840.1.101.3.4.3.26) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHAKE-128f" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-shake-128f (2.16.840.1.101.3.4.3.27) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHAKE-192s" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-shake-192s (2.16.840.1.101.3.4.3.28) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHAKE-192f" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-shake-192f (2.16.840.1.101.3.4.3.29) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHAKE-256s" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-shake-256s (2.16.840.1.101.3.4.3.30) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHAKE-256f" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-shake-256f (2.16.840.1.101.3.4.3.31) OID に設定します。

          それ以外の場合:

          例外を投げます。例外は NotSupportedError です。

      • subjectPublicKey フィールドを keyData に設定します。

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

    format が "pkcs8" の場合:
    1. key の [[type]] 内部スロット が "private" でない場合、 例外を投げます。例外は InvalidAccessError です。

    2. keyAlgorithm を key の [[algorithm]] 内部スロットとします。

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

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

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

        • keyAlgorithm の name メンバーが "SLH-DSA-SHA2-128s" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-sha2-128s (2.16.840.1.101.3.4.3.20) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHA2-128f" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-sha2-128f (2.16.840.1.101.3.4.3.21) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHA2-192s" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-sha2-192s (2.16.840.1.101.3.4.3.22) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHA2-192f" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-sha2-192f (2.16.840.1.101.3.4.3.23) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHA2-256s" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-sha2-256s (2.16.840.1.101.3.4.3.24) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHA2-256f" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-sha2-256f (2.16.840.1.101.3.4.3.25) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHAKE-128s" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-shake-128s (2.16.840.1.101.3.4.3.26) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHAKE-128f" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-shake-128f (2.16.840.1.101.3.4.3.27) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHAKE-192s" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-shake-192s (2.16.840.1.101.3.4.3.28) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHAKE-192f" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-shake-192f (2.16.840.1.101.3.4.3.29) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHAKE-256s" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-shake-256s (2.16.840.1.101.3.4.3.30) OID に設定します。

          keyAlgorithm の name メンバーが "SLH-DSA-SHAKE-256f" の場合:

          algorithm オブジェクト識別子を id-slh-dsa-shake-256f (2.16.840.1.101.3.4.3.31) OID に設定します。

          それ以外の場合:

          例外を投げます。例外は NotSupportedError です。

      • privateKey フィールドを、 key の [[handle]] 内部スロットによって表される SLH-DSA 秘密鍵を表す OCTET STRING ASN.1 型を DER エンコードした 結果に設定します。

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

    format が "raw-public" の場合:
    1. key の [[type]] 内部スロット が "public" でない場合、 例外を投げます。例外は InvalidAccessError です。

    2. data を、key の [[handle]] 内部スロットによって表される SLH-DSA 公開鍵を含む バイトシーケンス とします。

    3. result を data とします。

    format が "raw-private" の場合:
    1. key の [[type]] 内部スロット が "private" でない場合、 例外を投げます。例外は InvalidAccessError です。

    2. data を、key の [[handle]] 内部スロットによって表される SLH-DSA 秘密鍵を含む バイトシーケンス とします。

    3. result を data とします。

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

    2. keyAlgorithm を key の [[algorithm]] 内部スロットとします。

    3. jwk の kty 属性を "AKP" に設定します。

    4. jwk の alg 属性を、 keyAlgorithm の name メンバーに設定します。

    5. jwk の pub 属性を、 key の [[handle]] 内部スロットに対応する base64url エンコード済み公開鍵に 設定します。

    6. key の [[type]] 内部スロット が "private" の場合:
      jwk の priv 属性 を、key の [[handle]] 内部スロットによって表される base64url エンコード済み秘密鍵に 設定します。
    7. jwk の key_ops 属性を、key の usages 属性に設定します。

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

    9. result を jwk とします。

    それ以外の場合:

    例外を投げます。例外は NotSupportedError です。

  4. result を返します。

10. AES-OCB

10.1 説明

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

"AES-OCB" アルゴリズム識別子は、 [RFC7253] で説明されているように、 OCB モードの AES を使用して認証付き暗号化および復号を実行するために使用されます。

10.2 登録

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

操作 パラメーター 結果
暗号化 AeadParams バイト シーケンス
復号 AeadParams バイト シーケンス
generateKey AesKeyGenParams CryptoKey
importKey なし CryptoKey
exportKey なし オブジェクト
鍵の長さを取得 AesDerivedKeyParams 整数

10.3 AeadParams 辞書

WebIDLdictionary AeadParams : Algorithm {
  required BufferSource iv;
  BufferSource additionalData;
  [EnforceRange] octet tagLength;
};

iv メンバーは、使用する初期化ベクトルを表します。

additionalData メンバーは、 含める追加認証データを表します。

tagLength メンバーは、希望する 認証タグの長さを表します。

注記

AeadParams 辞書は、[webcrypto] の AesGcmParams 辞書と同一であり、 この提案を統合する際には後者を前者で置き換えることができます。

10.4 操作

10.4.1 暗号化

  1. normalizedAlgorithm の iv メンバーの長さが 15 バイトを超える場合、 例外を投げます。例外は OperationError です。

  2. normalizedAlgorithm の tagLength メンバーが 存在しない場合:
    tagLength を 128 とします。
    normalizedAlgorithm の tagLength メンバーが 64、96、または 128 のいずれかである場合:
    tagLength を、 normalizedAlgorithm の tagLength メンバーと 等しくします
    それ以外の場合:
    例外を投げます。例外は OperationError です。
  3. additionalData を、存在する場合は normalizedAlgorithm の additionalData メンバーとし、 それ以外の場合は空のオクテット 文字列とします。

  4. C を、[RFC7253] のセクション 4.2 で説明されている OCB-ENCRYPT 関数を、ブロック暗号として AES を使用し、 key の [[handle]] 内部スロットによって表される鍵を K 入力パラメーターとして、 normalizedAlgorithm の iv メンバーを N 入力パラメーターとして、 additionalData を A 入力パラメーターとして、 plaintext を P 入力パラメーターとして、また tagLength を TAGLEN グローバルパラメーターとして使用して実行した結果の出力とします。

  5. C を返します。

10.4.2 復号

  1. normalizedAlgorithm の iv メンバーの長さが 15 バイトを超える場合、 例外を投げます。例外は OperationError です。

  2. normalizedAlgorithm の tagLength メンバーが 存在しない場合:
    tagLength を 128 とします。
    normalizedAlgorithm の tagLength メンバーが 64、96、または 128 のいずれかである場合:
    tagLength を、 normalizedAlgorithm の tagLength メンバーと 等しくします
    それ以外の場合:
    例外を投げます。例外は OperationError です。
  3. ciphertext の長さが tagLength ビット未満である場合、 例外を投げます。例外は OperationError です。

  4. additionalData を、存在する場合は normalizedAlgorithm の additionalData メンバーとし、 それ以外の場合は空のオクテット 文字列とします。

  5. [RFC7253] のセクション 4.3 で説明されている OCB-DECRYPT 関数を、ブロック暗号として AES を使用し、 key の [[handle]] 内部スロットによって表される鍵を K 入力パラメーターとして、 normalizedAlgorithm の iv メンバーを N 入力パラメーターとして、 additionalData を A 入力パラメーターとして、 ciphertext を C 入力パラメーターとして、また tagLength を TAGLEN グローバルパラメーターとして使用して実行します。

    アルゴリズムの結果が認証失敗を示す "INVALID" である場合:
    例外を投げます。例外は OperationError です
    それ以外の場合:
    plaintext を OCB-DECRYPT の出力 P とします。
  6. plaintext を返します。

10.4.3 鍵を生成

  1. usages に "encrypt"、"decrypt"、 "wrapKey"、または "unwrapKey" の いずれでもないエントリが含まれている場合、 例外を投げます。例外は SyntaxError です。

  2. normalizedAlgorithm の length メンバーが 128、192、または 256 のいずれにも等しくない場合、 例外を投げます。例外は OperationError です。

  3. normalizedAlgorithm の length メンバーと等しい長さの AES 鍵を生成します。

  4. 鍵生成ステップが失敗した場合、 例外を投げます。例外は OperationError です。

  5. key を、 生成された AES 鍵を表す新しい CryptoKey オブジェクトとします。

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

  7. algorithm を新しい AesKeyAlgorithm とします。

  8. algorithm の name 属性を "AES-OCB" に設定します。

  9. algorithm の length 属性を normalizedAlgorithm の length メンバーと 等しくなるように設定します。

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

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

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

  13. key を返します。

10.4.4 鍵をインポート

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

  2. usages に "encrypt"、"decrypt"、 "wrapKey"、または "unwrapKey" の いずれでもないエントリが含まれている場合、 例外を投げます。例外は SyntaxError です。

  3. format が "raw-secret" の場合:
    1. data を keyData とします。

    2. data のビット単位の長さが 128、192、または 256 でない場合、 例外を投げます。例外は DataError です。

    format が "jwk" の場合:
    1. keyData が JsonWebKey 辞書である場合:

      jwk を keyData と等しくします。

      それ以外の場合:

      例外を投げます。例外は DataError です。

    2. jwk の kty フィールドが "oct" でない場合、 例外を投げます。例外は DataError です。

    3. jwk が JSON Web Algorithms [JWA] の セクション 6.4 の要件を満たさない場合、 例外を投げます。例外は DataError です。

    4. data を、jwk の k フィールドを復号して得られる バイトシーケンス とします。

    5. data の長さが 128 ビットの場合:
      jwk の alg フィールドが存在し、その値が "A128OCB" でない場合、 例外を投げます。例外は DataError です。
      data の長さが 192 ビットの場合:
      jwk の alg フィールドが存在し、その値が "A192OCB" でない場合、 例外を投げます。例外は DataError です。
      data の長さが 256 ビットの場合:
      jwk の alg フィールドが存在し、その値が "A256OCB" でない場合、 例外を投げます。例外は DataError です。
      それ以外の場合:
      例外を投げます。例外は DataError です。
    6. usages が空でなく、jwk の use フィールドが存在し、その値が "enc" でない場合、 例外を投げます。例外は DataError です。

    7. jwk の key_ops フィールドが存在し、 JSON Web Key [JWK] の要件に従って 無効であるか、指定されたすべての usages 値を含まない場合、 例外を投げます。例外は DataError です。

    8. jwk の ext フィールドが存在し、 値が false で、extractable が true の場合、 例外を投げます。例外は DataError です。

    それ以外の場合:
    例外を投げます。例外は NotSupportedError です。
  4. key を、値 data を持つ AES 鍵を表す新しい CryptoKey オブジェクトとします。

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

  6. algorithm を新しい AesKeyAlgorithm とします。

  7. algorithm の name 属性を "AES-OCB" に設定します。

  8. algorithm の length 属性を、 data のビット単位の長さに設定します。

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

  10. key を返します。

10.4.5 鍵をエクスポート

  1. key の [[handle]] 内部スロットによって表される基礎となる暗号鍵素材に アクセスできない場合、例外を投げます。例外は OperationError です。

  2. format が "raw-secret" の場合:
    1. data を、 key の [[handle]] 内部スロットによって表される鍵の生のオクテットを 含む バイトシーケンス とします。

    2. result を data とします。

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

    2. jwk の kty 属性を 文字列 "oct" に設定します。

    3. jwk の k 属性を、key の [[handle]] 内部スロットによって表される鍵の生のオクテットを、 JSON Web Algorithms [JWA] のセクション 6.4 に従って エンコードした文字列に設定します。

    4. key の length 属性が 128 の場合:
      jwk の alg 属性を 文字列 "A128OCB" に設定します。
      key の length 属性が 192 の場合:
      jwk の alg 属性を 文字列 "A192OCB" に設定します。
      key の length 属性が 256 の場合:
      jwk の alg 属性を 文字列 "A256OCB" に設定します。
    5. jwk の key_ops 属性を、 key の usages 属性と等しくなるように 設定します。

    6. jwk の ext 属性を、key の [[extractable]] 内部スロットと等しくなるように 設定します。

    7. result を jwk とします。

    それ以外の場合:

    例外を投げます。例外は NotSupportedError です。

  3. result を返します。

10.4.6 鍵の長さを取得

  1. normalizedDerivedKeyAlgorithm の length メンバーが 128、192、または 256 でない場合、例外を投げます。例外は OperationError です。

  2. normalizedDerivedKeyAlgorithm の length メンバーを 返します。

11. ChaCha20-Poly1305

11.1 説明

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

"ChaCha20-Poly1305" アルゴリズム識別子は、 [RFC8439] で説明されているように、 AEAD_CHACHA20_POLY1305 を使用して認証付き暗号化および復号を実行するために使用されます。

11.2 登録

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

操作 パラメーター 結果
暗号化 AeadParams バイト シーケンス
復号 AeadParams バイト シーケンス
generateKey なし CryptoKey
importKey なし CryptoKey
exportKey なし オブジェクト
鍵の長さを取得 なし 整数

11.3 操作

11.3.1 暗号化

  1. normalizedAlgorithm の iv メンバーの長さが 12 バイトでない場合、 例外を投げます。例外は OperationError です。

  2. normalizedAlgorithm の tagLength メンバー が存在し、その値が 128 でない場合、 例外を投げます。例外は OperationError です。

  3. additionalData を、存在する場合は normalizedAlgorithm の additionalData メンバーとし、 それ以外の場合は空のオクテット 文字列とします。

  4. ciphertext を、[RFC8439] のセクション 2.8 で説明されている AEAD_CHACHA20_POLY1305 暗号化アルゴリズムを実行し、 key の [[handle]] 内部スロットによって表される鍵を鍵入力パラメーターとして、 normalizedAlgorithm の iv メンバーを nonce 入力パラメーターとして、 plaintext を平文入力パラメーターとして、また additionalData を追加認証データ (AAD) 入力パラメーターとして使用した結果の出力とします。

  5. ciphertext を返します。

11.3.2 復号

  1. normalizedAlgorithm の iv メンバーの長さが 12 バイトでない場合、 例外を投げます。例外は OperationError です。

  2. normalizedAlgorithm の tagLength メンバー が存在し、その値が 128 でない場合、 例外を投げます。例外は OperationError です。

  3. ciphertext の長さが 128 ビット未満である場合、 例外を投げます。例外は OperationError です。

  4. additionalData を、存在する場合は normalizedAlgorithm の additionalData メンバーとし、 それ以外の場合は空のオクテット 文字列とします。

  5. [RFC8439] のセクション 2.8 で説明されている AEAD_CHACHA20_POLY1305 復号アルゴリズムを実行し、 key の [[handle]] 内部スロットによって表される鍵を鍵入力パラメーターとして、 normalizedAlgorithm の iv メンバーを nonce 入力パラメーターとして、 ciphertext を暗号文入力パラメーターとして、また additionalData を追加認証データ (AAD) 入力パラメーターとして使用します。

    アルゴリズムの結果が認証失敗を示す場合:
    例外を投げます。例外は OperationError です
    それ以外の場合:
    plaintext を結果として得られた平文とします。
  6. plaintext を返します。

11.3.3 鍵を生成

  1. usages に "encrypt"、"decrypt"、 "wrapKey"、または "unwrapKey" の いずれでもないエントリが含まれている場合、 例外を投げます。例外は SyntaxError です。

  2. 256 ビットの鍵を生成します。

  3. 鍵生成ステップが失敗した場合、 例外を投げます。例外は OperationError です。

  4. key を、 生成された鍵を表す新しい CryptoKey オブジェクトとします。

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

  6. algorithm を新しい KeyAlgorithm とします。

  7. algorithm の name 属性を "ChaCha20-Poly1305" に設定します。

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

  9. key の [[extractable]] 内部 スロットを extractable に設定します。

  10. key の [[usages]] 内部スロットを、 usages の 正規化された値 に設定します。

  11. key を返します。

11.3.4 鍵をインポート

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

  2. usages に "encrypt"、"decrypt"、 "wrapKey"、または "unwrapKey" の いずれでもないエントリが含まれている場合、 例外を投げます。例外は SyntaxError です。

  3. format が "raw-secret" の場合:
    1. data を keyData とします。

    2. data のビット単位の長さが 256 でない場合、 例外を投げます。例外は DataError です。

    format が "jwk" の場合:
    1. keyData が JsonWebKey 辞書である場合:

      jwk を keyData と等しくします。

      それ以外の場合:

      例外を投げます。例外は DataError です。

    2. jwk の kty フィールドが "oct" でない場合、 例外を投げます。例外は DataError です。

    3. jwk が JSON Web Algorithms [JWA] の セクション 6.4 の要件を満たさない場合、 例外を投げます。例外は DataError です。

    4. data を、jwk の k フィールドを復号して得られる バイトシーケンス とします。

    5. jwk の alg フィールドが存在し、その値が "C20P" でない場合、 例外を投げます。例外は DataError です。

    6. usages が空でなく、jwk の use フィールドが存在し、その値が "enc" でない場合、 例外を投げます。例外は DataError です。

    7. jwk の key_ops フィールドが存在し、 JSON Web Key [JWK] の要件に従って 無効であるか、指定されたすべての usages 値を含まない場合、 例外を投げます。例外は DataError です。

    8. jwk の ext フィールドが存在し、 値が false で、extractable が true の場合、 例外を投げます。例外は DataError です。

    それ以外の場合:
    例外を投げます。例外は NotSupportedError です。
  4. key を、値 data を持つ鍵を表す新しい CryptoKey オブジェクトとします。

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

  6. algorithm を新しい KeyAlgorithm とします。

  7. algorithm の name 属性を "ChaCha20-Poly1305" に設定します。

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

  9. key を返します。

11.3.5 鍵をエクスポート

  1. key の [[handle]] 内部スロットによって表される基礎となる暗号鍵素材に アクセスできない場合、例外を投げます。例外は OperationError です。

  2. format が "raw-secret" の場合:
    1. data を、 key の [[handle]] 内部スロットによって表される鍵の生のオクテットを 含む バイトシーケンス とします。

    2. result を data とします。

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

    2. jwk の kty 属性を 文字列 "oct" に設定します。

    3. jwk の k 属性を、key の [[handle]] 内部スロットによって表される鍵の生のオクテットを、 JSON Web Algorithms [JWA] のセクション 6.4 に従って エンコードした文字列に設定します。

    4. jwk の alg 属性を 文字列 "C20P" に設定します。

    5. jwk の key_ops 属性を、 key の usages 属性と等しくなるように 設定します。

    6. jwk の ext 属性を、key の [[extractable]] 内部スロットと等しくなるように 設定します。

    7. result を jwk とします。

    それ以外の場合:

    例外を投げます。例外は NotSupportedError です。

  3. result を返します。

11.3.6 鍵の長さを取得

  1. 256 を返します。

12. SHA-3

12.1 説明

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

これは、[FIPS-202] で規定されている SHA-3 ファミリーのハッシュ関数について説明します。

12.2 登録

認識されるアルゴリズム 名は、それぞれの SHA-3 アルゴリズムについて "SHA3-256"、 "SHA3-384"、および "SHA3-512" です。

操作 パラメーター 結果
ダイジェスト なし バイト シーケンス

12.3 操作

12.3.1 ダイジェスト

  1. normalizedAlgorithm の name メンバーが、 "SHA3-256" と大文字小文字を区別して文字列一致する 場合:
    result を、[FIPS-202] のセクション 6.1 で定義される SHA3-256 ハッシュ関数を、 message を入力メッセージ M として使用して 実行した結果とします。
    normalizedAlgorithm の name メンバーが、 "SHA3-384" と大文字小文字を区別して文字列一致する 場合:
    result を、[FIPS-202] のセクション 6.1 で定義される SHA3-384 ハッシュ関数を、 message を入力メッセージ M として使用して 実行した結果とします。
    normalizedAlgorithm の name メンバーが、 "SHA3-512" と大文字小文字を区別して文字列一致する 場合:
    result を、[FIPS-202] のセクション 6.1 で定義される SHA3-512 ハッシュ関数を、 message を入力メッセージ M として使用して 実行した結果とします。
  2. 操作の実行によってエラーが発生した場合、例外を投げます。例外は OperationError です。

  3. result を返します。

13. cSHAKE

13.1 説明

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

これは、[NIST-SP800-185] で規定されている cSHAKE128 および cSHAKE256 について説明します。

functionName および customization パラメーターの両方が空である(または指定されていない)場合、cSHAKE は、 [FIPS-202] のセクション 6.2 で定義される SHAKE と機能的に同等です。

注記

技術的には実装可能ですが、digest() 以外の他のアルゴリズムの一部として cSHAKE を使用すること (たとえば HMAC の hash パラメーターで使用すること)は、 有用である可能性が低く、サポートされることも想定されていません。 supports() の結果は、 そのような使用法がサポートされているかどうかを反映するべきです。

13.2 登録

認識されるアルゴリズム 名は "cSHAKE128" および "cSHAKE256" です。

操作 パラメーター 結果
ダイジェスト CShakeParams バイト シーケンス

13.3 CShakeParams 辞書

WebIDLdictionary CShakeParams : Algorithm {
  required [EnforceRange] unsigned long outputLength;
  BufferSource functionName;
  BufferSource customization;
};

outputLength メンバーは、要求される ビット単位の出力長を表します。

functionName メンバーは関数 名を表し、NIST が cSHAKE に基づく関数を定義するために使用します。使用する場合、NIST によって 定義された値のみを設定するべきです。

customization メンバーは カスタマイズ文字列を表します。アプリケーションは、関数の変種を定義するためにこの文字列を選択します。

13.4 操作

13.4.1 ダイジェスト

  1. outputLength を normalizedAlgorithm の outputLength メンバーと します。

  2. functionName を、存在する場合は normalizedAlgorithm の functionName メンバーとし、 それ以外の場合は空のオクテット 文字列とします。

  3. customization を、存在する場合は normalizedAlgorithm の customization メンバーとし、 それ以外の場合は空のオクテット 文字列とします。

  4. normalizedAlgorithm の name メンバーが、 "cSHAKE128" と大文字小文字を区別して文字列一致する 場合:
    result を、[NIST-SP800-185] のセクション 3 で定義される cSHAKE128 関数を、 message を X 入力パラメーターとして、 outputLength を L 入力パラメーターとして、 functionName を N 入力パラメーターとして、また customization を S 入力パラメーターとして使用して 実行した結果とします。
    normalizedAlgorithm の name メンバーが、 "cSHAKE256" と大文字小文字を区別して文字列一致する 場合:
    result を、[NIST-SP800-185] のセクション 3 で定義される cSHAKE256 関数を、 message を X 入力パラメーターとして、 outputLength を L 入力パラメーターとして、 functionName を N 入力パラメーターとして、また customization を S 入力パラメーターとして使用して 実行した結果とします。
  5. 操作の実行によってエラーが発生した場合、例外を投げます。例外は OperationError です。

  6. result を含むバイト シーケンスを返します。

14. TurboSHAKE

14.1 説明

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

これは、[RFC9861] で規定されている TurboSHAKE128 および TurboSHAKE256 について説明します。

TurboSHAKE は、SHA-3 で使用される Keccak 置換の ラウンド数を削減したバージョンに基づく拡張可能出力関数 (XOF) のファミリーであり、 同じセキュリティ強度を維持しながら SHAKE 関数の およそ 2 倍の速度を実現します。

注記

128 ビットの衝突安全性を得るには、TurboSHAKE128 の出力は少なくとも 256 ビットであるべきです。 256 ビットの衝突安全性を得るには、TurboSHAKE256 の出力は少なくとも 512 ビットであるべきです。 これらの出力長は、対応する原像および第二原像の安全性 要件(対象とするセキュリティレベルと等しい出力長のみを必要とする)も上回ります。 出力長がこれらのしきい値を満たす場合、TurboSHAKE128 は NIST の耐量子 セキュリティレベル 2 を達成し、TurboSHAKE256 はレベル 5 を達成します。 [RFC9861] のセクション 7 を参照してください。

注記

技術的には実装可能ですが、digest() 以外の他のアルゴリズムの一部として TurboSHAKE を使用すること (たとえば HMAC の hash パラメーターで使用すること)は、 有用である可能性が低く、サポートされることも想定されていません。 supports() の結果は、 そのような使用法がサポートされているかどうかを反映するべきです。

14.2 登録

認識されるアルゴリズム 名は "TurboSHAKE128" および "TurboSHAKE256" です。

操作 パラメーター 結果
ダイジェスト TurboShakeParams バイト シーケンス

14.3 TurboShakeParams 辞書

WebIDLdictionary TurboShakeParams : Algorithm {
  required [EnforceRange] unsigned long outputLength;
  [EnforceRange] octet domainSeparation;
};

outputLength メンバーは、要求される ビット単位の出力長を表します。

domainSeparation メンバーはドメイン 分離バイトを表します。指定されていない場合、デフォルトは 0x1F です。有効な値の範囲は 0x01 から 0x7F です。

注記

KangarooTwelve と TurboSHAKE の両方を使用するプロトコルでは、ドメイン分離に 0x06、0x07、および 0x0B の値を使用することを避けるべきです。 これらは KangarooTwelve によって内部的に使用されるためです。

14.4 操作

14.4.1 ダイジェスト

  1. outputLength を normalizedAlgorithm の outputLength メンバーと します。

  2. outputLength が 0、または 8 の倍数でない場合、 例外を投げます。例外は OperationError です。

  3. domainSeparation を、存在する場合は normalizedAlgorithm の domainSeparation メンバーとし、 それ以外の場合は 0x1F とします。

  4. domainSeparation が 0x01 未満、または 0x7F を超える場合、 例外を投げます。例外は OperationError です。

  5. normalizedAlgorithm の name メンバーが、 "TurboSHAKE128" と大文字小文字を区別して文字列一致する 場合:
    result を、[RFC9861] のセクション 2 で定義される TurboSHAKE128 関数を、 message を M 入力パラメーターとして、 domainSeparation を D 入力パラメーターとして、また outputLength を 8 で割った値を L 入力パラメーターとして使用して 実行した結果とします。
    normalizedAlgorithm の name メンバーが、 "TurboSHAKE256" と大文字小文字を区別して文字列一致する 場合:
    result を、[RFC9861] のセクション 2 で定義される TurboSHAKE256 関数を、 message を M 入力パラメーターとして、 domainSeparation を D 入力パラメーターとして、また outputLength を 8 で割った値を L 入力パラメーターとして使用して 実行した結果とします。
  6. 操作の実行によってエラーが発生した場合、例外を投げます。例外は OperationError です。

  7. result を返します。

15. KangarooTwelve

15.1 説明

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

これは、[RFC9861] で規定されている KT128 および KT256 について説明します。

KangarooTwelve は、TurboSHAKE の上に ツリーハッシュを適用し、入力データの並列処理を可能にする拡張可能出力関数 (XOF) のファミリーです。 KT128 は内部で TurboSHAKE128 を使用し、KT256 は TurboSHAKE256 を使用します。

注記

128 ビットの衝突安全性を得るには、KT128 の出力は少なくとも 256 ビットであるべきです。 256 ビットの衝突安全性を得るには、KT256 の出力は少なくとも 512 ビットであるべきです。 これらの出力長は、対応する原像および第二原像の安全性 要件(対象とするセキュリティレベルと等しい出力長のみを必要とする)も上回ります。 出力長がこれらのしきい値を満たす場合、KT128 は NIST の耐量子 セキュリティレベル 2 を達成し、KT256 はレベル 5 を達成します。 [RFC9861] のセクション 7 を参照してください。

注記

技術的には実装可能ですが、digest() 以外の他のアルゴリズムの一部として KangarooTwelve を使用すること (たとえば HMAC の hash パラメーターで使用すること)は、 有用である可能性が低く、サポートされることも想定されていません。 supports() の結果は、 そのような使用法がサポートされているかどうかを反映するべきです。

15.2 登録

認識されるアルゴリズム 名は "KT128" および "KT256" です。

操作 パラメーター 結果
ダイジェスト KangarooTwelveParams バイト シーケンス

15.3 KangarooTwelveParams 辞書

WebIDLdictionary KangarooTwelveParams : Algorithm {
  required [EnforceRange] unsigned long outputLength;
  BufferSource customization;
};

outputLength メンバーは、要求される ビット単位の出力長を表します。

customization メンバーは カスタマイズ文字列を表します。アプリケーションは、関数の変種を定義するためにこの文字列を選択します。指定されていない 場合、デフォルトは空文字列です。

15.4 操作

15.4.1 ダイジェスト

  1. outputLength を normalizedAlgorithm の outputLength メンバーと します。

  2. outputLength が 0、または 8 の倍数でない場合、 例外を投げます。例外は OperationError です。

  3. customization を、存在する場合は normalizedAlgorithm の customization メンバーとし、 それ以外の場合は空のオクテット 文字列とします。

  4. normalizedAlgorithm の name メンバーが、 "KT128" と大文字小文字を区別して文字列一致する 場合:
    result を、[RFC9861] のセクション 3 で定義される KT128 関数を、 message を M 入力パラメーターとして、 customization を C 入力パラメーターとして、また outputLength を 8 で割った値を L 入力パラメーターとして使用して 実行した結果とします。
    normalizedAlgorithm の name メンバーが、 "KT256" と大文字小文字を区別して文字列一致する 場合:
    result を、[RFC9861] のセクション 3 で定義される KT256 関数を、 message を M 入力パラメーターとして、 customization を C 入力パラメーターとして、また outputLength を 8 で割った値を L 入力パラメーターとして使用して 実行した結果とします。
  5. 操作の実行によってエラーが発生した場合、例外を投げます。例外は OperationError です。

  6. result を返します。

16. KMAC

16.1 説明

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

これは、[NIST-SP800-185] で規定されている KMAC128 および KMAC256 について説明します。

16.2 登録

認識されるアルゴリズム 名は "KMAC128" および "KMAC256" です。

操作 パラメーター 結果
署名 KmacParams バイト シーケンス
検証 KmacParams 真偽値
generateKey KmacKeyGenParams CryptoKey
importKey KmacImportParams CryptoKey
exportKey なし オブジェクト
鍵の長さを取得 KmacImportParams 整数

16.3 KmacKeyGenParams 辞書

WebIDLdictionary KmacKeyGenParams : Algorithm {
  [EnforceRange] unsigned long length;
};

length メンバーは、生成する鍵の長さ(ビット単位) を表します。指定されていない場合は推奨される長さが使用され、KMAC128 では 128、 KMAC256 では 256 です。

16.4 KmacImportParams 辞書

WebIDLdictionary KmacImportParams : Algorithm {
  [EnforceRange] unsigned long length;
};

length メンバーは、鍵の長さ(ビット単位) を表します。

16.5 KmacKeyAlgorithm 辞書

WebIDLdictionary KmacKeyAlgorithm : KeyAlgorithm {
  required [EnforceRange] unsigned long length;
};

length メンバーは、鍵の長さ(ビット単位) を表します。

16.6 KmacParams 辞書

WebIDLdictionary KmacParams : Algorithm {
  required [EnforceRange] unsigned long outputLength;
  BufferSource customization;
};

outputLength メンバーは、要求される ビット単位の出力長を表します。

customization メンバーは カスタマイズ文字列を表します。アプリケーションは、関数の変種を定義するためにこの文字列を選択します。

16.7 操作

16.7.1 署名

  1. customization を、存在する場合は normalizedAlgorithm の customization メンバーとし、 それ以外の場合は空のオクテット 文字列とします。

  2. normalizedAlgorithm の name メンバーが、 "KMAC128" と大文字小文字を区別して文字列一致する 場合:
    mac を、[NIST-SP800-185] のセクション 4 で定義される KMAC128 関数を、 key の [[handle]] 内部スロットによって表される鍵を K 入力パラメーターとして、 message を X 入力パラメーターとして、 normalizedAlgorithm の outputLength メンバーを L 入力パラメーターとして、また customization を S 入力パラメーターとして使用して実行した結果とします。
    normalizedAlgorithm の name メンバーが、 "KMAC256" と大文字小文字を区別して文字列一致する 場合:
    mac を、[NIST-SP800-185] のセクション 4 で定義される KMAC256 関数を、 key の [[handle]] 内部スロットによって表される鍵を K 入力パラメーターとして、 message を X 入力パラメーターとして、 normalizedAlgorithm の outputLength メンバーを L 入力パラメーターとして、また customization を S 入力パラメーターとして使用して実行した結果とします。
  3. mac を含むバイト シーケンスを返します。

16.7.2 検証

  1. customization を、存在する場合は normalizedAlgorithm の customization メンバーとし、 それ以外の場合は空のオクテット 文字列とします。

  2. normalizedAlgorithm の name メンバーが、 "KMAC128" と大文字小文字を区別して文字列一致する 場合:
    mac を、[NIST-SP800-185] のセクション 4 で定義される KMAC128 関数を、 key の [[handle]] 内部スロットによって表される鍵を K 入力パラメーターとして、 message を X 入力パラメーターとして、 normalizedAlgorithm の outputLength メンバーを L 入力パラメーターとして、また customization を S 入力パラメーターとして使用して実行した結果とします。
    normalizedAlgorithm の name メンバーが、 "KMAC256" と大文字小文字を区別して文字列一致する 場合:
    mac を、[NIST-SP800-185] のセクション 4 で定義される KMAC256 関数を、 key の [[handle]] 内部スロットによって表される鍵を K 入力パラメーターとして、 message を X 入力パラメーターとして、 normalizedAlgorithm の outputLength メンバーを L 入力パラメーターとして、また customization を S 入力パラメーターとして使用して実行した結果とします。
  3. computedMac を、mac を含むバイトシーケンス とします。

  4. computedMac が signature と等しい場合は true を、それ以外の場合は false を 返します。 この比較は定数時間で実行しなければなりません。

16.7.3 鍵を生成

  1. usages に "sign" または "verify" でないエントリが含まれている場合、例外を投げます。例外は SyntaxError です。

  2. normalizedAlgorithm の length メンバーが 存在する場合:
    length を、 normalizedAlgorithm の length メンバーと等しくします。
    それ以外で、normalizedAlgorithm の name メンバーが、 "KMAC128" と大文字小文字を区別して文字列一致する 場合:
    length を 128 とします。
    それ以外で、normalizedAlgorithm の name メンバーが、 "KMAC256" と大文字小文字を区別して文字列一致する 場合:
    length を 256 とします。
  3. 長さ length ビットの鍵を生成します。

  4. 鍵生成ステップが失敗した場合、 例外を投げます。例外は OperationError です。

  5. key を、 生成された鍵を表す新しい CryptoKey オブジェクトとします。

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

  7. algorithm を新しい KmacKeyAlgorithm とします。

  8. algorithm の name 属性を、 normalizedAlgorithm の name メンバーに設定します。

  9. algorithm の length 属性を length に設定します。

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

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

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

  13. key を返します。

16.7.4 鍵をインポート

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

  2. usages に "sign" または "verify" でないエントリが含まれている場合、 例外を投げます。例外は SyntaxError です。

  3. format が "raw-secret" の場合:
    1. data を keyData とします。

    format が "jwk" の場合:
    1. keyData が JsonWebKey 辞書である場合:

      jwk を keyData と等しくします。

      それ以外の場合:

      例外を投げます。例外は DataError です。

    2. jwk の kty フィールドが "oct" でない場合、 例外を投げます。例外は DataError です。

    3. jwk が JSON Web Algorithms [JWA] の セクション 6.4 の要件を満たさない場合、 例外を投げます。例外は DataError です。

    4. data を、jwk の k フィールドを復号して得られる バイトシーケンス とします。

    5. normalizedAlgorithm の name メンバーが、 "KMAC128" と大文字小文字を区別して文字列一致する 場合:
      jwk の alg フィールドが存在し、 "K128" でない場合、 例外を投げます。例外は DataError です。
      normalizedAlgorithm の name メンバーが、 "KMAC256" と大文字小文字を区別して文字列一致する 場合:
      jwk の alg フィールドが存在し、 "K256" でない場合、 例外を投げます。例外は DataError です。
    6. usages が空でなく、jwk の use フィールドが存在し、その値が "sig" でない場合、 例外を投げます。例外は DataError です。

    7. jwk の key_ops フィールドが存在し、 JSON Web Key [JWK] の要件に従って 無効であるか、指定されたすべての usages 値を含まない場合、 例外を投げます。例外は DataError です。

    8. jwk の ext フィールドが存在し、 値が false で、extractable が true の場合、 例外を投げます。例外は DataError です。

    それ以外の場合:
    例外を投げます。例外は NotSupportedError です。
  4. length を data のビット単位の長さとします。

  5. normalizedAlgorithm の length メンバーが 存在する場合:
    normalizedAlgorithm の length メンバーが length より大きい場合:
    例外を投げます。例外は DataError です。
    normalizedAlgorithm の length メンバーが、 length から 8 を引いた値以下である場合:
    例外を投げます。例外は DataError です。
    それ以外の場合:
    length を、normalizedAlgorithm の length メンバーと等しくなるように設定します。
  6. key を、data の先頭 length ビットを持つ KMAC 鍵を表す新しい CryptoKey オブジェクトとします。

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

  8. algorithm を新しい KmacKeyAlgorithm とします。

  9. algorithm の name 属性を、 normalizedAlgorithm の name メンバーに設定します。

  10. algorithm の length 属性を length に設定します。

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

  12. key を返します。

16.7.5 鍵をエクスポート

  1. key の [[handle]] 内部スロットによって表される基礎となる暗号鍵素材に アクセスできない場合、例外を投げます。例外は OperationError です。

  2. bits を、key の [[handle]] 内部スロットによって表される鍵の生のビットと します。

  3. data を、bits を含むバイトシーケンス とします。

  4. format が "raw-secret" の場合:
    1. result を data とします。

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

    2. jwk の kty 属性を 文字列 "oct" に設定します。

    3. jwk の k 属性を、data を含み、JSON Web Algorithms [JWA] のセクション 6.4 に従ってエンコードされた文字列に設定します。

    4. keyAlgorithm を key の [[algorithm]] 内部スロットとします。

    5. keyAlgorithm の name メンバーが "KMAC128" の場合:
      jwk の alg 属性を 文字列 "K128" に設定します。
      keyAlgorithm の name メンバーが "KMAC256" の場合:
      jwk の alg 属性を 文字列 "K256" に設定します。
    6. jwk の key_ops 属性を、 key の usages 属性と等しくなるように設定します。

    7. jwk の ext 属性を、key の [[extractable]] 内部スロットと等しくなるように 設定します。

    8. result を jwk とします。

    それ以外の場合:

    例外を投げます。例外は NotSupportedError です。

  5. result を返します。

16.7.6 鍵の長さを取得

  1. normalizedAlgorithm の length メンバーが 存在する場合:
    length を、 normalizedAlgorithm の length メンバーと等しくします。
    それ以外で、normalizedAlgorithm の name メンバーが、 "KMAC128" と大文字小文字を区別して文字列一致する 場合:
    length を 128 とします。
    それ以外で、normalizedAlgorithm の name メンバーが、 "KMAC256" と大文字小文字を区別して文字列一致する 場合:
    length を 256 とします。
  2. length を返します。

17. Argon2

17.1 説明

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

これは、[RFC9106] で定義されている、 パスワードハッシュおよび鍵導出のための Argon2 関数について説明します。

17.2 登録

認識されるアルゴリズム 名は、それぞれの Argon2 タイプについて "Argon2d"、 "Argon2i"、および "Argon2id" です。

操作 パラメーター 結果
deriveBits Argon2Params バイト シーケンス
importKey なし CryptoKey
鍵の長さを取得 なし null

17.3 Argon2Params 辞書

WebIDLdictionary Argon2Params : Algorithm {
  required BufferSource nonce;
  required [EnforceRange] unsigned long parallelism;
  required [EnforceRange] unsigned long memory;
  required [EnforceRange] unsigned long passes;
  [EnforceRange] octet version;
  BufferSource secretValue;
  BufferSource associatedData;
};

nonce メンバーは nonce を表し、これは パスワードハッシュアプリケーションにおけるソルトです。

parallelism メンバーは 並列度を表します。

memory メンバーは キビバイト単位のメモリサイズを表します。これは並列度の少なくとも 8 倍でなければなりません。

passes メンバーは パス数を表します。

version メンバーはバージョン番号を表します。デフォルトであり、 現在定義されている唯一のバージョンは 19 (0x13) です。

secretValue メンバーはオプションの 秘密値を表します。

associatedData メンバーはオプションの 関連データを表します。

注記

パラメーターの推奨値については、[RFC9106] のセクション 4 を参照してください。

17.4 操作

17.4.1 ビットを導出

  1. length が null、32 (4*8) 未満、または 8 の倍数でない場合、 例外を投げます。例外は OperationError です。

  2. normalizedAlgorithm の version メンバー が存在し、その値が 19 (0x13) でない場合、 例外を投げます。例外は OperationError です。

  3. normalizedAlgorithm の parallelism メンバーが 0、または 16777215 (2^24-1) より大きい場合、 例外を投げます。例外は OperationError です。

  4. normalizedAlgorithm の memory メンバーが、 normalizedAlgorithm の parallelism メンバーの 8 倍未満である場合、 例外を投げます。例外は OperationError です。

  5. normalizedAlgorithm の passes メンバーが 0 である場合、 例外を投げます。例外は OperationError です。

  6. normalizedAlgorithm の name メンバーが、 "Argon2d" と大文字小文字を区別して文字列一致する 場合:
    type を 0 とします。
    normalizedAlgorithm の name メンバーが、 "Argon2i" と大文字小文字を区別して文字列一致する 場合:
    type を 1 とします。
    normalizedAlgorithm の name メンバーが、 "Argon2id" と大文字小文字を区別して文字列一致する 場合:
    type を 2 とします。
  7. secretValue を、存在する場合は normalizedAlgorithm の secretValue メンバーとします。

  8. associatedData を、存在する場合は normalizedAlgorithm の associatedData メンバーとします。

  9. result を、[RFC9106] のセクション 3 で定義される Argon2 関数を、 key の [[handle]] 内部スロットによって表されるパスワードをメッセージ P として、 normalizedAlgorithm の nonce 属性を nonce S として、 normalizedAlgorithm の parallelism 属性の値 を並列度 p として、 normalizedAlgorithm の memory 属性の値 をメモリサイズ m として、 normalizedAlgorithm の passes 属性の値 をパス数 t として、 0x13 をバージョン番号 v として、 secretValue(存在する場合)を秘密値 K として、 associatedData(存在する場合)を関連データ X として、 type をタイプ y として、また length を 8 で割った値をタグ長 T として使用して実行した結果とします。

  10. 鍵導出操作が失敗した場合、 例外を投げます。例外は OperationError です。

  11. result を返します。

17.4.2 鍵をインポート

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

  2. format が "raw-secret" でない場合、例外を投げます。例外は NotSupportedError です

  3. usages に "deriveKey" または "deriveBits" でない値が含まれている場合、 例外を投げます。例外は SyntaxError です。

  4. extractable が false でない場合、 例外を投げます。例外は SyntaxError です。

  5. key を keyData を表す新しい CryptoKey とします。

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

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

  8. algorithm の name 属性を、 normalizedAlgorithm の name メンバーに設定します。

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

  10. key を返します。

17.4.3 鍵の長さを取得

  1. null を返します。

18. IANA に関する考慮事項

18.1 JSON Web 署名および暗号化アルゴリズムの登録

このセクションでは、JSON Web Key で使用するため、以下のアルゴリズム識別子を IANA JSON Web 署名および暗号化アルゴリズム レジストリに登録します。

これらの登録では、唯一のアルゴリズム使用場所として "JWK" を使用します。 これらは、この仕様で定義される JSON Web Key 表現に対して安定した alg 値を提供し、 Web Cryptography API 実装がこれらの鍵を exportKey() および importKey() で "jwk" を使用してシリアル化および解析できるようにします。この仕様では、 これらの 識別子を JSON Web Signature または JSON Web Encryption アルゴリズムとして使用することは定義しません。

18.2 JSON Web Key 操作

このセクションでは、JSON Web Key で使用するため、次の鍵操作を IANA JSON Web Key Operations レジストリに登録します。

19. 採用ガイダンス

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

この仕様は多くのアルゴリズムおよび操作を定義します。実装者に ガイダンスを提供し、Web プラットフォームの耐量子移行を 加速するため、このセクションでは実装時に優先するべきアルゴリズムおよび 操作を推奨します。

SubtleCrypto.supports メソッドは、機能検出、適切な フォールバック、およびプログレッシブエンハンスメントを可能にすることで、この仕様に含まれる他のすべてのアルゴリズムおよび 操作の迅速な採用を容易にします。

SubtleCrypto.getPublicKey メソッドは、この仕様および [webcrypto] で定義される非対称アルゴリズムを実用的に使用するために重要です。このメソッドは、 対応する公開鍵を保存せずに秘密鍵のみをアプリケーションが保存できるようにし、さらに秘密鍵 と公開鍵が実際に対応していることを検証する必要もなくすことで、鍵管理を簡素化します。さらに、これはライブラリ 作者が、公開鍵の値を出力にコミットするプロトコルへの入力として 抽出不可能な秘密鍵を受け入れられるようにします。

アルゴリズムに関しては、次のものが耐量子移行および Web 上で最新の暗号プロトコルを可能にするうえで最優先と 見なされ、優先順位順に示します:

  1. ML-KEM は、NIST [FIPS-203] によって標準化された主要な耐量子鍵 カプセル化メカニズムです。 従来型の鍵共有と組み合わせることで、[draft-ietf-hpke-hpke] のようなプロトコル、およびその PQ および PQ/T アルゴリズム [draft-ietf-hpke-pq] で使用される、ハイブリッド 耐量子/従来型 (PQ/T) 鍵確立を可能にします。
  2. ハイブリッド KEM は、 ML-KEM と P-256、X25519、または P-384 を組み合わせる 耐量子/従来型 KEM インスタンスを提供します [draft-irtf-cfrg-concrete-hybrid-kems-04]。
  3. ML-DSA は、NIST [FIPS-204] によって標準化された主要な耐量子デジタル 署名アルゴリズムです。
  4. ChaCha20-Poly1305 は、広く 導入されている AEAD 暗号 [RFC8439] であり、多くのプロトコル (TLS、SSH、WireGuard、HPKE) で使用されています。
  5. SHA-3 および cSHAKE (特に SHA3-256 および cSHAKE256)は、ML-KEM 鍵導出やハイブリッド KEM 結合器を含む多くの耐量子 構成で使用されています。特に、カスタマイズ パラメーターなしで呼び出された cSHAKE256 は SHAKE256 と同一の出力を生成するため、単一の 実装でカスタマイズされた (cSHAKE256) 用途と カスタマイズされない (SHAKE256) 用途の両方に対応できます。 ただし、cSHAKE の実装が利用できない場合でも、 SHAKE の実装は有用である可能性があります。その場合、 customization パラメーターが存在し、 空でない場合には NotSupportedError を投げる(そして SubtleCrypto.supports から false を返す)ようにする必要があります。
  6. Argon2 は、メモリハードなパスワードベースの 鍵導出関数 [RFC9106] であり、 高度に並列化された環境 (GPU や FPGA など)における総当たり攻撃への耐性を向上させます。

SLH-DSA は、NIST [FIPS-204] によって標準化されたステートレスなハッシュベースのデジタル 署名アルゴリズムです。 現時点では ML-DSA より採用例が少ないものの、ML-DSA の代替が必要になった場合には 実装する価値が生じる可能性があります。

これらに加えて、AES-OCB、 TurboSHAKE、 KangarooTwelve、および KMAC はいずれも有用な追加機能ですが、 耐量子移行において直ちに重要というわけではありません。

20. 使用例

この例では、利用可能な場合は Argon2 を使用し、それ以外の場合は PBKDF2 を使用して、パスワードから鍵を導出します。 その後、利用可能な場合は AES-OCB を使用し、それ以外の場合は AES-GCM を使用して、その鍵でテキストを暗号化および復号します。

例 1: パスワードから導出した鍵を使用してデータを暗号化する
const password = '正しい 馬 バッテリー ホチキス';
const derivationAlg =
  SubtleCrypto.supports?.('importKey', 'Argon2id') ?
    'Argon2id' :
    'PBKDF2';
const encryptionAlg =
  SubtleCrypto.supports?.('importKey', 'AES-OCB') ?
    'AES-OCB' :
    'AES-GCM';
const passwordKey = await crypto.subtle.importKey(
  derivationAlg === 'Argon2id' ? 'raw-secret' : 'raw',
  new TextEncoder().encode(password),
  derivationAlg,
  /* 抽出可能: */ false,
  ['deriveKey']
);
const nonce = crypto.getRandomValues(new Uint8Array(16));
const derivationParams =
  derivationAlg === 'Argon2id' ?
    {
      nonce,
      parallelism: 4,
      memory: 2 ** 21,
      passes: 1
    } :
    {
      salt: nonce,
      iterations: 100_000,
      hash: 'SHA-256'
    };
const key = await crypto.subtle.deriveKey(
  {
    name: derivationAlg,
    ...derivationParams
  },
  passwordKey,
  {
    name: encryptionAlg,
    length: 256
  },
  /* 抽出可能: */ false,
  ['encrypt', 'decrypt']
);
const plaintext = 'こんにちは、世界!';
const iv = crypto.getRandomValues(new Uint8Array(16));
const encrypted = await crypto.subtle.encrypt(
  { name: encryptionAlg, iv },
  key,
  new TextEncoder().encode(plaintext)
);
// 導出および暗号化のアルゴリズムとパラメーター、
// および暗号文を保存します(例: IndexedDB やデータベースに)。
// そして後でそれらを取得します。その後、元のパラメーターと
// パスワードを使用して鍵を導出します。ここでは直ちに
// 同じ鍵オブジェクトを使用して再び復号します。
const decrypted = new TextDecoder().decode(await crypto.subtle.decrypt(
  { name: encryptionAlg, iv },
  key,
  encrypted
));

A. JSON Web Key と JSON Web Algorithm 間の対応付け

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

JWK のインポートおよびエクスポートに関する 規範要件については、各アルゴリズム固有のセクションを参照してください。

A.1 アルゴリズムの対応付け

JSON Web Key AlgorithmIdentifier
{ kty: "AKP",
alg: "MLKEM768-P256" }
{ name: "MLKEM768-P256" }
{ kty: "AKP",
alg: "MLKEM768-X25519" }
{ name: "MLKEM768-X25519" }
{ kty: "AKP",
alg: "MLKEM1024-P384" }
{ name: "MLKEM1024-P384" }
{ kty: "oct",
alg: "A128OCB" }
{ name: "AES-OCB",
length: 128 }
{ kty: "oct",
alg: "A192OCB" }
{ name: "AES-OCB",
length: 192 }
{ kty: "oct",
alg: "A256OCB" }
{ name: "AES-OCB",
length: 256 }
{ kty: "oct",
alg: "C20P" }
{ name: "ChaCha20-Poly1305" }
{ kty: "oct",
alg: "K128" }
{ name: "KMAC128" }
{ kty: "oct",
alg: "K256" }
{ name: "KMAC256" }

B. アルゴリズムと PKCS#8 PrivateKeyInfo 間の対応付け

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

PKCS#8 PrivateKeyInfo のインポートおよびエクスポートに関する 規範要件については、各アルゴリズム固有のセクションを参照してください。

privateKeyAlgorithm privateKey 形式 AlgorithmIdentifier 参考文献
id-ml-dsa-44 (2.16.840.1.101.3.4.3.17) ML-DSA-44-PrivateKey "ML-DSA-44" [CSOR], [RFC9881]
id-ml-dsa-65 (2.16.840.1.101.3.4.3.18) ML-DSA-65-PrivateKey "ML-DSA-65" [CSOR], [RFC9881]
id-ml-dsa-87 (2.16.840.1.101.3.4.3.19) ML-DSA-87-PrivateKey "ML-DSA-87" [CSOR], [RFC9881]
id-alg-ml-kem-512 (2.16.840.1.101.3.4.4.1) ML-KEM-512-PrivateKey "ML-KEM-512" [CSOR], [RFC9935]
id-alg-ml-kem-768 (2.16.840.1.101.3.4.4.2) ML-KEM-768-PrivateKey "ML-KEM-768" [CSOR], [RFC9935]
id-alg-ml-kem-1024 (2.16.840.1.101.3.4.4.3) ML-KEM-1024-PrivateKey "ML-KEM-1024" [CSOR], [RFC9935]
id-slh-dsa-sha2-128s (2.16.840.1.101.3.4.3.20) OCTET STRING "SLH-DSA-SHA2-128s" [CSOR], [RFC9814]
id-slh-dsa-sha2-128f (2.16.840.1.101.3.4.3.21) OCTET STRING "SLH-DSA-SHA2-128f" [CSOR], [RFC9814]
id-slh-dsa-sha2-192s (2.16.840.1.101.3.4.3.22) OCTET STRING "SLH-DSA-SHA2-192s" [CSOR], [RFC9814]
id-slh-dsa-sha2-192f (2.16.840.1.101.3.4.3.23) OCTET STRING "SLH-DSA-SHA2-192f" [CSOR], [RFC9814]
id-slh-dsa-sha2-256s (2.16.840.1.101.3.4.3.24) OCTET STRING "SLH-DSA-SHA2-256s" [CSOR], [RFC9814]
id-slh-dsa-sha2-256f (2.16.840.1.101.3.4.3.25) OCTET STRING "SLH-DSA-SHA2-256f" [CSOR], [RFC9814]
id-slh-dsa-shake-128s (2.16.840.1.101.3.4.3.26) OCTET STRING "SLH-DSA-SHAKE-128s" [CSOR], [RFC9814]
id-slh-dsa-shake-128f (2.16.840.1.101.3.4.3.27) OCTET STRING "SLH-DSA-SHAKE-128f" [CSOR], [RFC9814]
id-slh-dsa-shake-192s (2.16.840.1.101.3.4.3.28) OCTET STRING "SLH-DSA-SHAKE-192s" [CSOR], [RFC9814]
id-slh-dsa-shake-192f (2.16.840.1.101.3.4.3.29) OCTET STRING "SLH-DSA-SHAKE-192f" [CSOR], [RFC9814]
id-slh-dsa-shake-256s (2.16.840.1.101.3.4.3.30) OCTET STRING "SLH-DSA-SHAKE-256s" [CSOR], [RFC9814]
id-slh-dsa-shake-256f (2.16.840.1.101.3.4.3.31) OCTET STRING "SLH-DSA-SHAKE-256f" [CSOR], [RFC9814]

C. アルゴリズムと SubjectPublicKeyInfo 間の対応付け

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

SPKI のインポートおよびエクスポートに関する 規範要件については、各アルゴリズム固有のセクションを参照してください。

アルゴリズム OID subjectPublicKey ASN.1 構造 AlgorithmIdentifier 参考文献
id-ml-dsa-44 (2.16.840.1.101.3.4.3.17) BIT STRING "ML-DSA-44" [CSOR], [RFC9881]
id-ml-dsa-65 (2.16.840.1.101.3.4.3.18) BIT STRING "ML-DSA-65" [CSOR], [RFC9881]
id-ml-dsa-87 (2.16.840.1.101.3.4.3.19) BIT STRING "ML-DSA-87" [CSOR], [RFC9881]
id-alg-ml-kem-512 (2.16.840.1.101.3.4.4.1) BIT STRING "ML-KEM-512" [CSOR], [RFC9935]
id-alg-ml-kem-768 (2.16.840.1.101.3.4.4.2) BIT STRING "ML-KEM-768" [CSOR], [RFC9935]
id-alg-ml-kem-1024 (2.16.840.1.101.3.4.4.3) BIT STRING "ML-KEM-1024" [CSOR], [RFC9935]
id-slh-dsa-sha2-128s (2.16.840.1.101.3.4.3.20) BIT STRING "SLH-DSA-SHA2-128s" [CSOR], [RFC9814]
id-slh-dsa-sha2-128f (2.16.840.1.101.3.4.3.21) BIT STRING "SLH-DSA-SHA2-128f" [CSOR], [RFC9814]
id-slh-dsa-sha2-192s (2.16.840.1.101.3.4.3.22) BIT STRING "SLH-DSA-SHA2-192s" [CSOR], [RFC9814]
id-slh-dsa-sha2-192f (2.16.840.1.101.3.4.3.23) BIT STRING "SLH-DSA-SHA2-192f" [CSOR], [RFC9814]
id-slh-dsa-sha2-256s (2.16.840.1.101.3.4.3.24) BIT STRING "SLH-DSA-SHA2-256s" [CSOR], [RFC9814]
id-slh-dsa-sha2-256f (2.16.840.1.101.3.4.3.25) BIT STRING "SLH-DSA-SHA2-256f" [CSOR], [RFC9814]
id-slh-dsa-shake-128s (2.16.840.1.101.3.4.3.26) BIT STRING "SLH-DSA-SHAKE-128s" [CSOR], [RFC9814]
id-slh-dsa-shake-128f (2.16.840.1.101.3.4.3.27) BIT STRING "SLH-DSA-SHAKE-128f" [CSOR], [RFC9814]
id-slh-dsa-shake-192s (2.16.840.1.101.3.4.3.28) BIT STRING "SLH-DSA-SHAKE-192s" [CSOR], [RFC9814]
id-slh-dsa-shake-192f (2.16.840.1.101.3.4.3.29) BIT STRING "SLH-DSA-SHAKE-192f" [CSOR], [RFC9814]
id-slh-dsa-shake-256s (2.16.840.1.101.3.4.3.30) BIT STRING "SLH-DSA-SHAKE-256s" [CSOR], [RFC9814]
id-slh-dsa-shake-256f (2.16.840.1.101.3.4.3.31) BIT STRING "SLH-DSA-SHAKE-256f" [CSOR], [RFC9814]

D. 適合性

非規範的と明記されたセクションに加えて、この仕様のすべての作成者向けガイドライン、図、例、および注記は 非規範的です。この仕様のそれ以外のすべては規範的です。

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

E. 参考文献

E.1 規範参考文献

[draft-irtf-cfrg-concrete-hybrid-kems-04]
具体的な ハイブリッド PQ/T 鍵カプセル化メカニズム. IETF. 7月 2026. URL: https://www.ietf.org/archive/id/draft-irtf-cfrg-concrete-hybrid-kems-04.html
[draft-irtf-cfrg-hybrid-kems-12]
ハイブリッド PQ/T 鍵 カプセル化メカニズム. IETF. 7月 2026. URL: https://www.ietf.org/archive/id/draft-irtf-cfrg-hybrid-kems-12.html
[FIPS-202]
SHA-3 標準: 順列ベースのハッシュおよび拡張可能出力関数. NIST. 8月 2015. URL: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf
[FIPS-203]
モジュール格子ベースの 鍵カプセル化メカニズム標準. NIST. 8月 2024. URL: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.203.pdf
[FIPS-204]
モジュール格子ベースの デジタル署名標準. NIST. 8月 2024. URL: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf
[FIPS-205]
ステートレスハッシュベース デジタル署名標準. NIST. 8月 2024. URL: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.205.pdf
[html]
HTML 標準. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 現行 標準. URL: https://html.spec.whatwg.org/multipage/
[IANA-JOSE-Algorithms]
IANA JSON Web 署名および暗号化アルゴリズム. IANA. URL: https://www.iana.org/assignments/jose/jose.xhtml#web-signature-encryption-algorithms
[infra]
Infra 標準. Anne van Kesteren; Domenic Denicola. WHATWG. 現行標準. URL: https://infra.spec.whatwg.org/
[JWA]
JSON Web アルゴリズム (JWA). M. Jones. IETF. 5月 2015. 標準化提案. URL: https://www.rfc-editor.org/info/rfc7518/
[JWK]
JSON Web Key (JWK). M. Jones. IETF. 5月 2015. 標準化提案. URL: https://www.rfc-editor.org/info/rfc7517/
[NIST-SP800-185]
NIST 特別刊行物 800-185: SHA-3 派生関数: cSHAKE、KMAC、TupleHash および ParallelHash. NIST. 12月 2016. URL: https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-185.pdf
[RFC2119]
要求レベルを示すために RFC で使用する キーワード. S. Bradner. IETF. 3月 1997. 現行のベストプラクティス. URL: https://www.rfc-editor.org/info/rfc2119/
[RFC5208]
公開鍵暗号標準 (PKCS) #8: 秘密鍵情報構文仕様 バージョン 1.2. B. Kaliski. IETF. 5月 2008. 情報提供. URL: https://www.rfc-editor.org/info/rfc5208/
[RFC5280]
Internet X.509 公開鍵基盤 証明書および証明書失効リスト (CRL) プロファイル. D. Cooper; S. Santesson; S. Farrell; S. Boeyen; R. Housley; W. Polk. IETF. 5月 2008. 標準化提案. URL: https://www.rfc-editor.org/info/rfc5280/
[RFC7253]
OCB 認証付き暗号化 アルゴリズム. T. Krovetz; P. Rogaway. IETF. 5月 2014. 情報提供. URL: https://www.rfc-editor.org/info/rfc7253/
[RFC8174]
RFC 2119 キーワードにおける大文字と小文字の曖昧さ. B. Leiba. IETF. 5月 2017. 現行のベストプラクティス. URL: https://www.rfc-editor.org/info/rfc8174/
[RFC8439]
IETF プロトコル向け ChaCha20 および Poly1305. Y. Nir; A. Langley. IETF. 6月 2018. 情報提供. URL: https://www.rfc-editor.org/info/rfc8439/
[RFC9106]
パスワード ハッシュおよびプルーフ・オブ・ワーク用途向け Argon2 メモリハード関数. A. Biryukov; D. Dinu; D. Khovratovich; S. Josefsson. IETF. 9月 2021. 情報提供. URL: https://www.rfc-editor.org/info/rfc9106/
[RFC9861]
KangarooTwelve および TurboSHAKE. IETF. 10月 2025. URL: https://www.rfc-editor.org/rfc/rfc9861.html
[RFC9964]
JSON Object Signing and Encryption (JOSE) および CBOR Object Signing and Encryption (COSE) 向け ML-DSA. M. Prorock; O. Steele. IETF. 5月 2026. 標準化提案. URL: https://www.rfc-editor.org/info/rfc9964/
[webcrypto]
Web Cryptography Level 2. Daniel Huigens. W3C. 22 4月 2025. 初回公開作業草案. URL: https://www.w3.org/TR/webcrypto-2/
[WebIDL]
Web IDL 標準. Edgar Chen; Timothy Gu. WHATWG. 現行標準. URL: https://webidl.spec.whatwg.org/

E.2 参考参考文献

[CSOR]
コンピューター セキュリティオブジェクトレジスター. NIST. URL: https://csrc.nist.gov/projects/computer-security-objects-register/algorithm-registration
[draft-ietf-hpke-hpke]
ハイブリッド公開鍵 暗号化. IETF. URL: https://datatracker.ietf.org/doc/draft-ietf-hpke-hpke/
[draft-ietf-hpke-pq]
HPKE 向けポスト量子ハイブリッド鍵 カプセル化メカニズム. IETF. URL: https://datatracker.ietf.org/doc/draft-ietf-hpke-pq/
[draft-ietf-jose-hpke-pq-pqt]
JOSE HPKE PQ & PQ/T アルゴリズム登録. IETF. URL: https://datatracker.ietf.org/doc/draft-ietf-jose-hpke-pq-pqt/
[RFC9814]
暗号メッセージ構文 (CMS) における SLH-DSA 署名アルゴリズムの使用. R. Housley; S. Fluhrer; P. Kampanakis; B. Westerbaan. IETF. 7月 2025. 標準化提案. URL: https://www.rfc-editor.org/info/rfc9814/
[RFC9881]
Internet X.509 公開鍵基盤 -- モジュール格子ベースのデジタル署名アルゴリズム (ML-DSA) のアルゴリズム識別子. J. Massimo; P. Kampanakis; S. Turner; B. E. Westerbaan. IETF. 10月 2025. 標準化提案. URL: https://www.rfc-editor.org/info/rfc9881/
[RFC9935]
Internet X.509 公開鍵基盤 - モジュール格子ベースの鍵カプセル化メカニズム (ML-KEM) のアルゴリズム識別子. S. Turner; P. Kampanakis; J. Massimo; B. E. Westerbaan. IETF. 3月 2026. 標準化提案. URL: https://www.rfc-editor.org/info/rfc9935/
[webcrypto-secure-curves]
Web Cryptography API におけるセキュア曲線. W3C. コミュニティグループ報告書草案. URL: https://wicg.github.io/webcrypto-secure-curves/