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

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

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

概要

この仕様は、Web Cryptography API 向けの、 耐量子安全性を備えた最新の暗号アルゴリズム、すなわち ML-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 の使用に対応するため、 この提案では鍵のカプセル化およびカプセル化解除のための関数、 SubtleCrypto.encapsulateKeySubtleCrypto.encapsulateBitsSubtleCrypto.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. encapsulationAlgorithmencapsulationKeysharedKeyAlgorithmextractable、および usages を、それぞれ encapsulateKey() メソッドに渡された encapsulationAlgorithmencapsulationKeysharedKeyAlgorithmextractable、および keyUsages パラメーターとします。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  19. promiseresult で解決します。

3.2.2 encapsulateBits メソッド

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

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

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

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

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

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

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

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

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

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

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

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

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

  13. promiseresult で解決します。

3.2.3 decapsulateKey メソッド

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  19. promiseresult で解決します。

3.2.4 decapsulateBits メソッド

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  14. promiseresult で解決します。

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] で定義されるとおり、 publicKeyrealm 内の ECMAScript オブジェクトに変換した結果とします。

  18. promiseresult で解決します。

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. アルゴリズムのサポートを 確認した結果を返す。 このとき、opoperation に、algalgorithm に、 lengthlength に設定する。

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" に設定し、 algadditionalAlgorithm に設定して アルゴリズムの サポートを確認した結果 が false の場合、 false を返す。

    operation が "wrapKey" の場合:

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

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

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

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

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

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

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

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

  4. length を null とする。

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

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

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

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

  6. アルゴリズムのサポートを 確認した結果を返す。 このとき、opoperation に、algalgorithm に、 lengthlength に設定する。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4. カプセル化辞書

WebIDLdictionary EncapsulatedKey {
  CryptoKey sharedKey;
  ArrayBuffer ciphertext;
};

dictionary EncapsulatedBits {
  ArrayBuffer sharedKey;
  ArrayBuffer ciphertext;
};

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

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

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 なし object

6.3 操作

6.3.1 カプセル化

  1. key[[type]] 内部スロットが "public" でない場合、スローする InvalidAccessError

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

    注記

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

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

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

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

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

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

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

  9. result を返す。

6.3.2 デカプセル化

  1. key[[type]] 内部スロットが "private" でない場合、スローする InvalidAccessError

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

    注記

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

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

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

  5. sharedKey を返す。

6.3.3 共有鍵の長さを取得

  1. 256 を返す。

6.3.4 鍵を生成

  1. usages に "encapsulateKey", "encapsulateBits", "decapsulateKey" または "decapsulateBits" のいずれでもないエントリが含まれている場合、スローする SyntaxError

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

    注記

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

  3. 鍵生成手順が失敗した場合、 スローする OperationError

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

  5. algorithmname 属性を、 normalizedAlgorithmname 属性に設定する。

  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. resultpublicKey 属性を publicKey に設定する。

  18. resultprivateKey 属性を privateKey に設定する。

  19. result を返す。

6.3.5 鍵をインポート

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

  2. format が "spki" の場合:
    1. usages に "encapsulateKey" または "encapsulateBits" ではないエントリが含まれている場合、スローする SyntaxError

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

    3. 解析中にエラーが発生した場合、 スローする DataError

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

      expectedOidid-alg-ml-kem-512 (2.16.840.1.101.3.4.4.1) とする。

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

      expectedOidid-alg-ml-kem-768 (2.16.840.1.101.3.4.4.2) とする。

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

      expectedOidid-alg-ml-kem-1024 (2.16.840.1.101.3.4.4.3) とする。

      それ以外の場合:

      スローする NotSupportedError

    5. spkialgorithm AlgorithmIdentifier フィールドの algorithm オブジェクト識別子フィールドが expectedOid と等しくない場合、 スローする DataError

    6. spkialgorithm AlgorithmIdentifier フィールドに parameters フィールドが存在する場合、 スローする DataError

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

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

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

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

    11. algorithmname 属性を、 normalizedAlgorithmname 属性に設定する。

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

    format が "pkcs8" の場合:
    1. usages に "decapsulateKey" または "decapsulateBits" ではないエントリが含まれている場合、スローする SyntaxError

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

    3. 解析中にエラーが発生した場合、 スローする DataError

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

      expectedOidid-alg-ml-kem-512 (2.16.840.1.101.3.4.4.1) とする。

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

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

      expectedOidid-alg-ml-kem-768 (2.16.840.1.101.3.4.4.2) とする。

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

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

      expectedOidid-alg-ml-kem-1024 (2.16.840.1.101.3.4.4.3) とする。

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

      それ以外の場合:

      スローする NotSupportedError

    5. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithm フィールドの algorithm オブジェクト識別子フィールドが expectedOid と等しくない場合、 スローする DataError

    6. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifier フィールドに parameters フィールドが存在する場合、 スローする DataError

    7. mlKemPrivateKey を、 dataprivateKeyInfoprivateKey フィールド、 structureasn1StructureexactData を true に設定して ASN.1 構造を 解析する アルゴリズムを実行した結果とする。

    8. 解析中にエラーが発生した場合、 スローする DataError

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

    10. mlKemPrivateKeyboth 形式の ML-KEM 鍵を表しており、 seed フィールドが expandedKey フィールドに対応していない場合、 DataError をスローする。

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

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

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

    14. algorithmname 属性を、 normalizedAlgorithmname 属性に設定する。

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

    format が "raw-public" の場合:
    1. usages に "encapsulateKey" または "encapsulateBits" ではないエントリが含まれている場合、スローする SyntaxError

    2. datakeyData とする。

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

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

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

    6. algorithmname 属性を、 normalizedAlgorithmname 属性に設定する。

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

    format が "raw-seed" の場合:
    1. usages に "decapsulateKey" または "decapsulateBits" ではないエントリが含まれている場合、スローする SyntaxError

    2. datakeyData とする。

    3. data のビット単位の長さが 512 でない場合、 スローする DataError

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

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

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

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

    8. algorithmname 属性を、 normalizedAlgorithmname 属性に設定する。

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

    format が "jwk" の場合:
    課題 1

    ML-KEM の JWK 形式はまだ標準化されていないため、変更される可能性がある。

    1. keyDataJsonWebKey 辞書である場合:

      jwkkeyData と等しくする。

      それ以外の場合:

      スローする DataError

    2. jwkpriv フィールドが存在し、 かつ usages に "decapsulateKey" または "decapsulateBits" ではないエントリが含まれている場合、スローする SyntaxError

    3. jwkpriv フィールドが存在せず、 かつ usages に "encapsulateKey" または "encapsulateBits" ではないエントリが含まれている場合、スローする SyntaxError

    4. jwkkty フィールドが "AKP" でない場合、 スローする DataError

    5. jwkalg フィールドが、 [draft-ietf-jose-pqc-kem-05] のセクション 8(図 1 または 2)に示されている、 normalizedAlgorithmname メンバーに対応する alg 値のいずれでもない場合、 スローする DataError

      たとえば、ML-KEM-512 および ML-KEM-512+A128KW は ML-KEM-512 に対する有効な "alg" 値である。

    6. usages が空でなく、jwkuse フィールドが存在し、 "enc" と等しくない場合、スローする DataError

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

    8. jwkext フィールドが存在して値が false であり、extractable が true の場合、 スローする DataError

    9. jwkpriv フィールドが 存在する場合:
      1. jwkpriv 属性が、ML-KEM 秘密鍵を表す有効な base64url エンコード済みシードを 含んでいない場合、 スローする DataError

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

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

      4. jwkpub 属性が、key に対応する ML-KEM 公開鍵を表す base64url エンコード済み公開鍵を含んでいない場合、 スローする DataError

      それ以外の場合:
      1. jwkpub 属性が、ML-KEM 公開鍵を表す有効な base64url エンコード済み公開鍵を 含んでいない場合、 スローする DataError

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

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

    10. algorithmKeyAlgorithm オブジェクトの新しいインスタンスとする。

    11. algorithmname 属性を、 normalizedAlgorithmname メンバーに設定する。

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

    それ以外の場合:
    スローする NotSupportedError
  3. key を返す。

6.3.6 鍵をエクスポート

  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 型に設定する:

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

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

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

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

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

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

          それ以外の場合:

          スローする NotSupportedError

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

    4. resultdata を DER エンコードした結果とする。

    format が "pkcs8" の場合:
    1. key[[type]] 内部スロットが "private" でない場合、スローする InvalidAccessError

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

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

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

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

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

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

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

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

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

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

          それ以外の場合:

          スローする NotSupportedError

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

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

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

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

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

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

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

          それ以外の場合:

          スローする NotSupportedError

    4. resultdata を DER エンコードした結果とする。

    format が "raw-public" の場合:
    1. key[[type]] 内部スロットが "public" でない場合、スローする InvalidAccessError

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

    3. resultdata とする。

    format が "raw-seed" の場合:
    1. key[[type]] 内部スロットが "private" でない場合、スローする InvalidAccessError

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

      注記

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

    3. resultdata とする。

    format が "jwk" の場合:
    課題 2

    ML-KEM の JWK 形式はまだ標準化されていないため、変更される可能性がある。

    1. jwk を新しい JsonWebKey 辞書とする。

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

    3. jwkkty 属性を "AKP" に設定する。

    4. jwkalg 属性を、 [draft-ietf-jose-pqc-kem-05] のセクション 8(図 1)に示されている、 keyAlgorithmname メンバーに対応する alg 値に設定する。

      たとえば、ML-KEM-512 は ML-KEM-512 に使用される "alg" 値である。

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

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

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

    9. resultjwk とする。

    それ以外の場合:

    スローする NotSupportedError

  4. result を返す。

7. ML-DSA

7.1 説明

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

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

7.2 登録

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

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

7.3 ContextParams 辞書

WebIDLdictionary ContextParams : Algorithm {
  BufferSource context;
};

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

注記

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

7.4 操作

7.4.1 署名

  1. normalizedAlgorithmcontext メンバーが 存在し、その長さが 255 バイトを超える場合、スローする OperationError

  2. key[[type]] 内部スロットが "private" でない場合、スローする InvalidAccessError

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

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

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

  6. result を返す。

7.4.2 検証

  1. normalizedAlgorithmcontext メンバーが 存在し、その 長さが 255 バイトを超える場合、スローする OperationError

  2. key[[type]] 内部スロットが "public" でない場合、 スローする InvalidAccessError

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

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

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

  6. result を返す。

7.4.3 鍵の生成

  1. usages に、"sign" または "verify" のいずれでもないエントリーが含まれる場合、SyntaxErrorスローします。

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

    注記

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

  3. 鍵生成手順が失敗した場合、OperationErrorスローします。

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

  5. algorithmname 属性を、normalizedAlgorithmname 属性に設定します。

  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. resultpublicKey 属性を publicKey に設定します。

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

  19. result を返します。

7.4.4 鍵のインポート

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

  2. format が "spki" の場合:
    1. usages に "verify" でないエントリーが含まれる場合、 SyntaxErrorスローします。

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

    3. 構文解析中にエラーが発生した場合、 DataErrorスローします。

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

      expectedOidid-ml-dsa-44 (2.16.840.1.101.3.4.3.17) とします。

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

      expectedOidid-ml-dsa-65 (2.16.840.1.101.3.4.3.18) とします。

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

      expectedOidid-ml-dsa-87 (2.16.840.1.101.3.4.3.19) とします。

      それ以外の場合:

      NotSupportedErrorスローします。

    5. spkialgorithm AlgorithmIdentifier フィールドの algorithm オブジェクト識別子フィールドが expectedOid と等しくない場合、 DataErrorスローします。

    6. spkialgorithm AlgorithmIdentifier フィールドに parameters フィールドが存在する場合、 DataErrorスローします。

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

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

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

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

    11. algorithmname 属性を、normalizedAlgorithmname 属性に設定します。

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

    format が "pkcs8" の場合:
    1. usages に "sign" でないエントリーが含まれる場合、 SyntaxErrorスローします。

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

    3. 構文解析中にエラーが発生した場合、 DataErrorスローします。

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

      expectedOidid-ml-dsa-44 (2.16.840.1.101.3.4.3.17) とします。

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

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

      expectedOidid-ml-dsa-65 (2.16.840.1.101.3.4.3.18) とします。

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

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

      expectedOidid-ml-dsa-87 (2.16.840.1.101.3.4.3.19) とします。

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

      それ以外の場合:

      NotSupportedErrorスローします。

    5. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithm フィールドの algorithm オブジェクト識別子フィールドが expectedOid と等しくない場合、 DataErrorスローします。

    6. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifier フィールドに parameters フィールドが存在する場合、 DataErrorスローします。

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

    8. 構文解析中にエラーが発生した場合、 DataErrorスローします。

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

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

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

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

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

    14. algorithmname 属性を、normalizedAlgorithmname 属性に設定します。

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

    format が "raw-public" の場合:
    1. usages に "verify" でないエントリーが含まれる場合、 SyntaxErrorスローします。

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

    3. algorithmname 属性を、normalizedAlgorithmname 属性に設定します。

    4. key を、keyData で与えられた鍵データを表す新しい CryptoKey とします。

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

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

    format が "raw-seed" の場合:
    1. usages に "sign" でないエントリーが含まれる場合、 SyntaxErrorスローします。

    2. datakeyData とします。

    3. data のビット単位の長さが 256 でない場合、 DataErrorスローします。

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

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

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

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

    8. algorithmname 属性を、normalizedAlgorithmname 属性に設定します。

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

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

      jwkkeyData と等しくします。

      それ以外の場合:

      DataErrorスローします。

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

    3. jwkkty フィールドが "AKP" でない場合、 DataErrorスローします。

    4. jwkalg フィールドが、normalizedAlgorithmname メンバーと等しくない場合、 DataErrorスローします。

    5. usages が空でなく、jwkuse フィールドが存在し、"sig" と等しくない場合、 DataErrorスローします。

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

    7. jwkext フィールドが存在して値が false であり、extractable が true の場合、 DataErrorスローします。

    8. jwkpriv フィールドが存在する場合:
      1. jwkpriv 属性に、ML-DSA 秘密鍵を表す有効な base64url エンコードされた シードが含まれていない場合、 DataErrorスローします。

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

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

      4. jwkpub 属性に、key に対応する ML-DSA 公開鍵を表す base64url エンコードされた公開鍵が含まれていない場合、 DataErrorスローします。

      それ以外の場合:
      1. jwkpub 属性に、ML-DSA 公開鍵を表す有効な base64url エンコードされた 公開鍵が含まれていない場合、 DataErrorスローします。

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

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

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

    10. algorithmname 属性を、normalizedAlgorithmname メンバーに設定します。

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

    それ以外の場合:

    NotSupportedErrorスローします。

  3. key を返します。

7.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 型に設定します:

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

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

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

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

          keyAlgorithmname メンバーが "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 型に設定します:

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

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

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

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

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

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

          それ以外の場合:

          NotSupportedErrorスローします。

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

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

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

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

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

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

          privateKey フィールドを、 key[[handle]] 内部スロットによって表される ML-DSA 秘密鍵シードを、 シードのみの形式(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. resultdata とします。

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

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

      注記

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

    3. resultdata とします。

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

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

    3. jwkkty 属性を "AKP" に設定します。

    4. jwkalg 属性を、 keyAlgorithmname メンバーに設定します。

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

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

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

    9. resultjwk とします。

    それ以外の場合:

    NotSupportedErrorスローします。

  4. result を返します。

8. SLH-DSA

8.1 説明

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

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

8.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" です。

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

8.3 JSON Web Key 表現

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

8.4 操作

8.4.1 署名

  1. normalizedAlgorithmcontext メンバーが 存在し、その 長さが 255 バイトを超える場合、スローする OperationError

  2. key[[type]] 内部スロットが "private" でない場合、スローする InvalidAccessError

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

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

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

  6. result を返す。

8.4.2 検証

  1. key[[type]] 内部スロットが "public" でない場合、スローする InvalidAccessError

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

  3. result を、[FIPS-205] のセクション 10.3 で指定されている slh\_verify 検証アルゴリズムを、 normalizedAlgorithmname メンバーによって示されるパラメーターセットを使用し、 key に関連付けられた SLH-DSA 公開鍵を PKmessageMsignatureSIGcontextctx として使用して実行した結果とする。

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

  5. result を返す。

8.4.3 鍵の生成

  1. usages に、"sign" または "verify" のいずれでもないエントリーが含まれる場合、SyntaxErrorスローします。

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

  3. 鍵生成手順が失敗した場合、OperationErrorスローします。

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

  5. algorithmname 属性を、normalizedAlgorithmname 属性に設定します。

  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. resultpublicKey 属性を publicKey に設定します。

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

  19. result を返します。

8.4.4 鍵のインポート

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

  2. format が "spki" の場合:
    1. usages に "verify" でないエントリーが含まれる場合、 SyntaxErrorスローします。

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

    3. 構文解析中にエラーが発生した場合、 DataErrorスローします。

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

      expectedOidid-slh-dsa-sha2-128s (2.16.840.1.101.3.4.3.20) とします。

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

      expectedOidid-slh-dsa-sha2-128f (2.16.840.1.101.3.4.3.21) とします。

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

      expectedOidid-slh-dsa-sha2-192s (2.16.840.1.101.3.4.3.22) とします。

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

      expectedOidid-slh-dsa-sha2-192f (2.16.840.1.101.3.4.3.23) とします。

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

      expectedOidid-slh-dsa-sha2-256s (2.16.840.1.101.3.4.3.24) とします。

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

      expectedOidid-slh-dsa-sha2-256f (2.16.840.1.101.3.4.3.25) とします。

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

      expectedOidid-slh-dsa-shake-128s (2.16.840.1.101.3.4.3.26) とします。

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

      expectedOidid-slh-dsa-shake-128f (2.16.840.1.101.3.4.3.27) とします。

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

      expectedOidid-slh-dsa-shake-192s (2.16.840.1.101.3.4.3.28) とします。

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

      expectedOidid-slh-dsa-shake-192f (2.16.840.1.101.3.4.3.29) とします。

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

      expectedOidid-slh-dsa-shake-256s (2.16.840.1.101.3.4.3.30) とします。

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

      expectedOidid-slh-dsa-shake-256f (2.16.840.1.101.3.4.3.31) とします。

      それ以外の場合:

      NotSupportedErrorスローします。

    5. spkialgorithm AlgorithmIdentifier フィールドの algorithm オブジェクト識別子フィールドが expectedOid と等しくない場合、 DataErrorスローします。

    6. spkialgorithm AlgorithmIdentifier フィールドに parameters フィールドが存在する場合、 DataErrorスローします。

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

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

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

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

    11. algorithmname 属性を、normalizedAlgorithmname 属性に設定します。

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

    format が "pkcs8" の場合:
    1. usages に "sign" でないエントリーが含まれる場合、 SyntaxErrorスローします。

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

    3. 構文解析中にエラーが発生した場合、 DataErrorスローします。

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

      expectedOidid-slh-dsa-sha2-128s (2.16.840.1.101.3.4.3.20) とします。

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

      expectedOidid-slh-dsa-sha2-128f (2.16.840.1.101.3.4.3.21) とします。

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

      expectedOidid-slh-dsa-sha2-192s (2.16.840.1.101.3.4.3.22) とします。

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

      expectedOidid-slh-dsa-sha2-192f (2.16.840.1.101.3.4.3.23) とします。

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

      expectedOidid-slh-dsa-sha2-256s (2.16.840.1.101.3.4.3.24) とします。

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

      expectedOidid-slh-dsa-sha2-256f (2.16.840.1.101.3.4.3.25) とします。

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

      expectedOidid-slh-dsa-shake-128s (2.16.840.1.101.3.4.3.26) とします。

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

      expectedOidid-slh-dsa-shake-128f (2.16.840.1.101.3.4.3.27) とします。

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

      expectedOidid-slh-dsa-shake-192s (2.16.840.1.101.3.4.3.28) とします。

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

      expectedOidid-slh-dsa-shake-192f (2.16.840.1.101.3.4.3.29) とします。

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

      expectedOidid-slh-dsa-shake-256s (2.16.840.1.101.3.4.3.30) とします。

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

      expectedOidid-slh-dsa-shake-256f (2.16.840.1.101.3.4.3.31) とします。

      それ以外の場合:

      NotSupportedErrorスローします。

    5. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithm フィールドの algorithm オブジェクト識別子フィールドが expectedOid と等しくない場合、 DataErrorスローします。

    6. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifier フィールドに parameters フィールドが存在する場合、 DataErrorスローします。

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

    8. 構文解析中にエラーが発生した場合、 DataErrorスローします。

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

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

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

    12. algorithmname 属性を、normalizedAlgorithmname 属性に設定します。

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

    format が "raw-public" の場合:
    1. usages に "verify" でないエントリーが含まれる場合、 SyntaxErrorスローします。

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

    3. algorithmname 属性を、normalizedAlgorithmname 属性に設定します。

    4. keyData長さが、 normalizedAlgorithmname メンバーによって示されるパラメーターセットについて、 [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長さが、 normalizedAlgorithmname メンバーによって示されるパラメーターセットについて、 [FIPS-205] の表 2 で指定される pk length の 2 倍でない場合、 DataErrorスローします。

    3. key を、keyData で与えられた鍵データを表す新しい CryptoKey とします。

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

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

    6. algorithmname 属性を、normalizedAlgorithmname 属性に設定します。

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

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

      jwkkeyData と等しくします。

      それ以外の場合:

      DataErrorスローします。

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

    3. jwkkty フィールドが "AKP" でない場合、 DataErrorスローします。

    4. jwkalg フィールドが、normalizedAlgorithmname メンバーと等しくない場合、 DataErrorスローします。

    5. usages が空でなく、jwkuse フィールドが存在し、"sig" と等しくない場合、 DataErrorスローします。

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

    7. jwkext フィールドが存在して値が false であり、extractable が true の場合、 DataErrorスローします。

    8. jwkpriv フィールドが存在する場合:
      1. jwkpriv 属性に、SLH-DSA 秘密鍵を表す有効な base64url エンコードされた値が 含まれていない場合、 DataErrorスローします。

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

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

      4. jwkpub 属性に、key に対応する SLH-DSA 公開鍵を表す base64url エンコードされた公開鍵が含まれていない場合、 DataErrorスローします。

      それ以外の場合:
      1. jwkpub 属性に、SLH-DSA 公開鍵を表す有効な base64url エンコードされた 公開鍵が含まれていない場合、 DataErrorスローします。

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

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

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

    10. algorithmname 属性を、normalizedAlgorithmname メンバーに設定します。

    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 型に設定します:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          keyAlgorithmname メンバーが "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 型に設定します:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          keyAlgorithmname メンバーが "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. resultdata とします。

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

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

    3. resultdata とします。

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

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

    3. jwkkty 属性を "AKP" に設定します。

    4. jwkalg 属性を、 keyAlgorithmname メンバーに設定します。

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

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

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

    9. resultjwk とします。

    それ以外の場合:

    NotSupportedErrorスローします。

  4. result を返します。

9. AES-OCB

9.1 説明

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

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

9.2 登録

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

操作 パラメーター 結果
encrypt AeadParams バイト シーケンス
decrypt AeadParams バイト シーケンス
generateKey AesKeyGenParams CryptoKey
importKey なし CryptoKey
exportKey なし オブジェクト
get key length AesDerivedKeyParams 整数

9.3 AeadParams 辞書

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

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

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

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

注記

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

9.4 操作

9.4.1 暗号化

  1. normalizedAlgorithmiv メンバーの長さが 15 バイトを超える場合、 OperationErrorスローします。

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

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

  5. C を返します。

9.4.2 復号

  1. normalizedAlgorithmiv メンバーの長さが 15 バイトを超える場合、 OperationErrorスローします。

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

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

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

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

9.4.3 鍵の生成

  1. usages に、"encrypt"、"decrypt"、 "wrapKey"、または "unwrapKey" のいずれでもないエントリーが含まれる場合、 SyntaxErrorスローします。

  2. normalizedAlgorithmlength メンバーが 128、192、または 256 のいずれとも等しくない場合、 OperationErrorスローします。

  3. normalizedAlgorithmlength メンバーと等しい長さの AES 鍵を生成します。

  4. 鍵生成手順が失敗した場合、 OperationErrorスローします。

  5. key を、生成された AES 鍵を表す新しい CryptoKey オブジェクトとします。

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

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

  8. algorithmname 属性を "AES-OCB" に設定します。

  9. algorithmlength 属性を、 normalizedAlgorithmlength メンバーと等しくなるように設定します。

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

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

  12. key[[usages]] 内部スロットを、 正規化された値 である usages に設定する。

  13. key を返します。

9.4.4 鍵のインポート

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

  2. usages に、"encrypt"、"decrypt"、 "wrapKey"、または "unwrapKey" のいずれでもないエントリーが含まれる場合、 SyntaxErrorスローします。

  3. format が "raw-secret" の場合:
    1. datakeyData とします。

    2. data のビット単位の長さが 128、192、または 256 でない場合、 DataErrorスローします。

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

      jwkkeyData と等しくします。

      それ以外の場合:

      DataErrorスローします。

    2. jwkkty フィールドが "oct" でない場合、 DataErrorスローします。

    3. jwk が JSON Web Algorithms [JWA] のセクション 6.4 の要件を満たさない場合、 DataErrorスローします。

    4. data を、jwkk フィールドをデコードして得られる バイトシーケンス とします。

    5. data の長さが 128 ビットである場合:
      jwkalg フィールドが存在し、かつ "A128OCB" でない場合、 DataErrorスローします。
      data の長さが 192 ビットである場合:
      jwkalg フィールドが存在し、かつ "A192OCB" でない場合、 DataErrorスローします。
      data の長さが 256 ビットである場合:
      jwkalg フィールドが存在し、かつ "A256OCB" でない場合、 DataErrorスローします。
      それ以外の場合:
      DataErrorスローします。
    6. usages が空でなく、jwkuse フィールドが存在し、かつ "enc" でない場合、 DataErrorスローします。

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

    8. jwkext フィールドが存在して値が false であり、extractable が true の場合、 DataErrorスローします。

    それ以外の場合:
    NotSupportedErrorスローします。
  4. key を、値が data である AES 鍵を表す新しい CryptoKey オブジェクトとします。

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

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

  7. algorithmname 属性を "AES-OCB" に設定します。

  8. algorithmlength 属性を、data のビット単位の長さに設定します。

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

  10. key を返します。

9.4.5 鍵のエクスポート

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

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

    2. resultdata とします。

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

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

    3. jwkk 属性を、key[[handle]] 内部スロットによって表される鍵の生のオクテットを含み、 JSON Web Algorithms [JWA] のセクション 6.4 に従ってエンコードされた文字列に設定します。

    4. keylength 属性が 128 である場合:
      jwkalg 属性を 文字列 "A128OCB" に設定します。
      keylength 属性が 192 である場合:
      jwkalg 属性を 文字列 "A192OCB" に設定します。
      keylength 属性が 256 である場合:
      jwkalg 属性を 文字列 "A256OCB" に設定します。
    5. jwkkey_ops 属性を、 keyusages 属性と等しくなるように設定します。

    6. jwkext 属性を、key[[extractable]] 内部スロットと等しくなるように設定します。

    7. resultjwk とします。

    それ以外の場合:

    NotSupportedErrorスローします。

  3. result を返します。

9.4.6 鍵長の取得

  1. normalizedDerivedKeyAlgorithmlength メンバーが 128、192、または 256 でない場合、 OperationErrorスローします。

  2. normalizedDerivedKeyAlgorithmlength メンバーを返します。

10. ChaCha20-Poly1305

10.1 説明

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

"ChaCha20-Poly1305" アルゴリズム識別子は、 [RFC8439] で説明されるように、 AEAD_CHACHA20_POLY1305 を使用して認証付き暗号化および復号を実行するために使用されます。

10.2 登録

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

操作 パラメーター 結果
encrypt AeadParams バイト シーケンス
decrypt AeadParams バイト シーケンス
generateKey なし CryptoKey
importKey なし CryptoKey
exportKey なし オブジェクト
get key length なし 整数

10.3 操作

10.3.1 暗号化

  1. normalizedAlgorithmiv メンバーの長さが 12 バイトでない場合、 OperationErrorスローします。

  2. normalizedAlgorithmtagLength メンバーが 存在し、かつ 128 でない場合、 OperationErrorスローします。

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

  4. ciphertext を、[RFC8439] のセクション 2.8 で説明される AEAD_CHACHA20_POLY1305 暗号化アルゴリズムを、 key[[handle]] 内部スロットによって表される鍵を鍵入力パラメーターとして、 normalizedAlgorithmiv メンバーを nonce 入力パラメーターとして、 plaintext を平文入力パラメーターとして、 additionalData を追加認証データ(AAD)入力パラメーターとして 実行した結果の出力とします。

  5. ciphertext を返します。

10.3.2 復号

  1. normalizedAlgorithmiv メンバーの長さが 12 バイトでない場合、 OperationErrorスローします。

  2. normalizedAlgorithmtagLength メンバーが 存在し、かつ 128 でない場合、 OperationErrorスローします。

  3. ciphertext の長さが 128 ビット未満である場合、 OperationErrorスローします。

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

  5. [RFC8439] のセクション 2.8 で説明される AEAD_CHACHA20_POLY1305 復号アルゴリズムを、 key[[handle]] 内部スロットによって表される鍵を鍵入力パラメーターとして、 normalizedAlgorithmiv メンバーを nonce 入力パラメーターとして、 ciphertext を暗号文入力パラメーターとして、 additionalData を追加認証データ(AAD)入力パラメーターとして実行します。

    アルゴリズムの結果が認証失敗を示す場合:
    OperationErrorスローします
    それ以外の場合:
    plaintext を結果として得られた平文とします。
  6. plaintext を返します。

10.3.3 鍵の生成

  1. usages に、"encrypt"、"decrypt"、 "wrapKey"、または "unwrapKey" のいずれでもないエントリーが含まれる場合、 SyntaxErrorスローします。

  2. 256 ビットの鍵を生成します。

  3. 鍵生成手順が失敗した場合、 OperationErrorスローします。

  4. key を、生成された鍵を表す新しい CryptoKey オブジェクトとします。

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

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

  7. algorithmname 属性を "ChaCha20-Poly1305" に設定します。

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

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

  10. [[usages]] 内部スロット( key のもの)を、正規化された値usages のもの)に設定する。

  11. key を返します。

10.3.4 鍵のインポート

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

  2. usages に、"encrypt"、"decrypt"、 "wrapKey"、または "unwrapKey" のいずれでもないエントリーが含まれる場合、 SyntaxErrorスローします。

  3. format が "raw-secret" の場合:
    1. datakeyData とします。

    2. data のビット単位の長さが 256 でない場合、 DataErrorスローします。

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

      jwkkeyData と等しくします。

      それ以外の場合:

      DataErrorスローします。

    2. jwkkty フィールドが "oct" でない場合、 DataErrorスローします。

    3. jwk が JSON Web Algorithms [JWA] のセクション 6.4 の要件を満たさない場合、 DataErrorスローします。

    4. data を、jwkk フィールドをデコードして得られる バイトシーケンス とします。

    5. jwkalg フィールドが存在し、かつ "C20P" でない場合、 DataErrorスローします。

    6. usages が空でなく、jwkuse フィールドが存在し、かつ "enc" でない場合、 DataErrorスローします。

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

    8. jwkext フィールドが存在して値が false であり、extractable が true の場合、 DataErrorスローします。

    それ以外の場合:
    NotSupportedErrorスローします。
  4. key を、値が data である鍵を表す新しい CryptoKey オブジェクトとします。

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

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

  7. algorithmname 属性を "ChaCha20-Poly1305" に設定します。

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

  9. key を返します。

10.3.5 鍵のエクスポート

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

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

    2. resultdata とします。

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

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

    3. jwkk 属性を、key[[handle]] 内部スロットによって表される鍵の生のオクテットを含み、 JSON Web Algorithms [JWA] のセクション 6.4 に従ってエンコードされた文字列に設定します。

    4. jwkalg 属性を 文字列 "C20P" に設定します。

    5. jwkkey_ops 属性を、 keyusages 属性と等しくなるように設定します。

    6. jwkext 属性を、key[[extractable]] 内部スロットと等しくなるように設定します。

    7. resultjwk とします。

    それ以外の場合:

    NotSupportedErrorスローします。

  3. result を返します。

10.3.6 鍵長の取得

  1. 256 を返します。

11. SHA-3

11.1 説明

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

これは、[FIPS-202] で指定される SHA-3 ハッシュ関数ファミリーを説明します。

11.2 登録

各 SHA-3 アルゴリズムの認識されるアルゴリズム名は、 それぞれ "SHA3-256"、 "SHA3-384"、および "SHA3-512" です。

操作 パラメーター 結果
digest なし バイト シーケンス

11.3 操作

11.3.1 ダイジェスト

  1. normalizedAlgorithmname メンバーが "SHA3-256" と大文字小文字を区別して文字列一致する場合:
    result を、[FIPS-202] のセクション 6.1 で定義される SHA3-256 ハッシュ関数を、 message を入力メッセージ M として使用して 実行した結果とします。
    normalizedAlgorithmname メンバーが "SHA3-384" と大文字小文字を区別して文字列一致する場合:
    result を、[FIPS-202] のセクション 6.1 で定義される SHA3-384 ハッシュ関数を、 message を入力メッセージ M として使用して 実行した結果とします。
    normalizedAlgorithmname メンバーが "SHA3-512" と大文字小文字を区別して文字列一致する場合:
    result を、[FIPS-202] のセクション 6.1 で定義される SHA3-512 ハッシュ関数を、 message を入力メッセージ M として使用して 実行した結果とします。
  2. 操作の実行によってエラーが発生した場合、 OperationErrorスローします。

  3. result を返します。

12. cSHAKE

12.1 説明

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

これは、[NIST-SP800-185] で指定される cSHAKE128 および cSHAKE256 を説明します。

functionNamecustomization の両方のパラメーターが空である(または指定されていない)場合、cSHAKE は、 [FIPS-202] のセクション 6.2 で定義される SHAKE と機能的に同等です。

注記

技術的には実装可能ではあるものの、digest() の外部で、他のアルゴリズムの一部として cSHAKE を使用すること (HMAC の hash パラメーターで使用する場合など)は、 有用である可能性が低く、サポートされることも想定されていない。 supports() の結果は、 このような使用法がサポートされているかどうかを反映すべきである。

12.2 登録

認識されるアルゴリズム名は、 "cSHAKE128" および "cSHAKE256" です。

操作 パラメーター 結果
digest CShakeParams バイト シーケンス

12.3 CShakeParams 辞書

WebIDLdictionary CShakeParams : Algorithm {
  required [EnforceRange] unsigned long outputLength;
  BufferSource functionName;
  BufferSource customization;
};

outputLength メンバーは、要求される ビット単位の出力長を表します。

functionName メンバーは、NIST が cSHAKE に基づく関数を定義するために使用する関数名を表します。使用する場合、NIST によって定義された値にのみ設定するべきです。

customization メンバーは、 カスタマイズ文字列を表します。アプリケーションは、関数の変種を定義するためにこの文字列を選択します。

12.4 操作

12.4.1 ダイジェスト

  1. outputLength を、normalizedAlgorithmoutputLength メンバーとします。

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

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

  4. normalizedAlgorithmname メンバーが "cSHAKE128" と大文字小文字を区別して文字列一致する場合:
    result を、[NIST-SP800-185] のセクション 3 で定義される cSHAKE128 関数を、 messageX 入力パラメーターとして、 outputLengthL 入力パラメーターとして、 functionNameN 入力パラメーターとして、 customizationS 入力パラメーターとして 実行した結果とします。
    normalizedAlgorithmname メンバーが "cSHAKE256" と大文字小文字を区別して文字列一致する場合:
    result を、[NIST-SP800-185] のセクション 3 で定義される cSHAKE256 関数を、 messageX 入力パラメーターとして、 outputLengthL 入力パラメーターとして、 functionNameN 入力パラメーターとして、 customizationS 入力パラメーターとして 実行した結果とします。
  5. 操作の実行によってエラーが発生した場合、 OperationErrorスローします。

  6. result含むバイト シーケンスを返します。

13. TurboSHAKE

13.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() の結果は、 このような使用法がサポートされているかどうかを反映すべきである。

13.2 登録

認識されるアルゴリズム名は、 "TurboSHAKE128" および "TurboSHAKE256" です。

操作 パラメーター 結果
digest TurboShakeParams バイト シーケンス

13.3 TurboShakeParams 辞書

WebIDLdictionary TurboShakeParams : Algorithm {
  required [EnforceRange] unsigned long outputLength;
  [EnforceRange] octet domainSeparation;
};

outputLength メンバーは、要求される ビット単位の出力長を表します。

domainSeparation メンバーは、ドメイン 分離バイトを表します。指定されない場合、既定値は 0x1F です。有効な値は 0x01 から 0x7F の範囲です。

注記

KangarooTwelve と TurboSHAKE の両方を使用するプロトコルでは、ドメイン分離に 0x060x07、および 0x0B の値を使用することを避けるべきです。 これらは KangarooTwelve によって内部的に使用されるためです。

13.4 操作

13.4.1 ダイジェスト

  1. outputLength を、normalizedAlgorithmoutputLength メンバーとします。

  2. outputLength が 0 であるか、8 の倍数でない場合、 OperationErrorスローします。

  3. domainSeparation を、存在する場合は normalizedAlgorithmdomainSeparation メンバーとし、 それ以外の場合は 0x1F とします。

  4. domainSeparation0x01 未満または 0x7F より大きい場合、 OperationErrorスローします。

  5. normalizedAlgorithmname メンバーが "TurboSHAKE128" と大文字小文字を区別して文字列一致する場合:
    result を、[RFC9861] のセクション 2 で定義される TurboSHAKE128 関数を、 messageM 入力パラメーターとして、 domainSeparationD 入力パラメーターとして、 outputLength を 8 で割った値を L 入力パラメーターとして 実行した結果とします。
    normalizedAlgorithmname メンバーが "TurboSHAKE256" と大文字小文字を区別して文字列一致する場合:
    result を、[RFC9861] のセクション 2 で定義される TurboSHAKE256 関数を、 messageM 入力パラメーターとして、 domainSeparationD 入力パラメーターとして、 outputLength を 8 で割った値を L 入力パラメーターとして 実行した結果とします。
  6. 操作の実行によってエラーが発生した場合、 OperationErrorスローします。

  7. result を返します。

14. KangarooTwelve

14.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() の結果は、 このような使用法がサポートされているかどうかを反映すべきである。

14.2 登録

認識されるアルゴリズム名は、 "KT128" および "KT256" です。

操作 パラメーター 結果
digest KangarooTwelveParams バイト シーケンス

14.3 KangarooTwelveParams 辞書

WebIDLdictionary KangarooTwelveParams : Algorithm {
  required [EnforceRange] unsigned long outputLength;
  BufferSource customization;
};

outputLength メンバーは、要求される ビット単位の出力長を表します。

customization メンバーは、 カスタマイズ文字列を表します。アプリケーションは、関数の変種を定義するためにこの文字列を選択します。指定されない 場合、既定値は空文字列です。

14.4 操作

14.4.1 ダイジェスト

  1. outputLength を、normalizedAlgorithmoutputLength メンバーとします。

  2. outputLength が 0 であるか、8 の倍数でない場合、 OperationErrorスローします。

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

  4. normalizedAlgorithmname メンバーが "KT128" と大文字小文字を区別して文字列一致する場合:
    result を、[RFC9861] のセクション 3 で定義される KT128 関数を、 messageM 入力パラメーターとして、 customizationC 入力パラメーターとして、 outputLength を 8 で割った値を L 入力パラメーターとして 実行した結果とします。
    normalizedAlgorithmname メンバーが "KT256" と大文字小文字を区別して文字列一致する場合:
    result を、[RFC9861] のセクション 3 で定義される KT256 関数を、 messageM 入力パラメーターとして、 customizationC 入力パラメーターとして、 outputLength を 8 で割った値を L 入力パラメーターとして 実行した結果とします。
  5. 操作の実行によってエラーが発生した場合、 OperationErrorスローします。

  6. result を返します。

15. KMAC

15.1 説明

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

これは、[NIST-SP800-185] で指定される KMAC128 および KMAC256 を説明します。

15.2 登録

認識されるアルゴリズム名は、 "KMAC128" および "KMAC256" です。

操作 パラメーター 結果
sign KmacParams バイト シーケンス
verify KmacParams 真偽値
generateKey KmacKeyGenParams CryptoKey
importKey KmacImportParams CryptoKey
exportKey なし オブジェクト
get key length KmacImportParams 整数

15.3 KmacKeyGenParams 辞書

WebIDLdictionary KmacKeyGenParams : Algorithm {
  [EnforceRange] unsigned long length;
};

length メンバーは、生成する鍵の長さ (ビット単位)を表します。指定されない場合、推奨される長さが使用されます。KMAC128 では 128、 KMAC256 では 256 です。

15.4 KmacImportParams 辞書

WebIDLdictionary KmacImportParams : Algorithm {
  [EnforceRange] unsigned long length;
};

length メンバーは、鍵の長さ (ビット単位)を表します。

15.5 KmacKeyAlgorithm 辞書

WebIDLdictionary KmacKeyAlgorithm : KeyAlgorithm {
  required [EnforceRange] unsigned long length;
};

length メンバーは、鍵の長さ (ビット単位)を表します。

15.6 KmacParams 辞書

WebIDLdictionary KmacParams : Algorithm {
  required [EnforceRange] unsigned long outputLength;
  BufferSource customization;
};

outputLength メンバーは、要求される ビット単位の出力長を表します。

customization メンバーは、 カスタマイズ文字列を表します。アプリケーションは、関数の変種を定義するためにこの文字列を選択します。

15.7 操作

15.7.1 署名

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

  2. normalizedAlgorithmname メンバーが "KMAC128" と大文字小文字を区別して文字列一致する場合:
    mac を、[NIST-SP800-185] のセクション 4 で定義される KMAC128 関数を、 key[[handle]] 内部スロットによって表される鍵を K 入力パラメーターとして、 messageX 入力パラメーターとして、 normalizedAlgorithmoutputLength メンバーを L 入力パラメーターとして、 customizationS 入力パラメーターとして実行した結果とします。
    normalizedAlgorithmname メンバーが "KMAC256" と大文字小文字を区別して文字列一致する場合:
    mac を、[NIST-SP800-185] のセクション 4 で定義される KMAC256 関数を、 key[[handle]] 内部スロットによって表される鍵を K 入力パラメーターとして、 messageX 入力パラメーターとして、 normalizedAlgorithmoutputLength メンバーを L 入力パラメーターとして、 customizationS 入力パラメーターとして実行した結果とします。
  3. mac含むバイト シーケンスを返します。

15.7.2 検証

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

  2. normalizedAlgorithmname メンバーが "KMAC128" と大文字小文字を区別して文字列一致する場合:
    mac を、[NIST-SP800-185] のセクション 4 で定義される KMAC128 関数を、 key[[handle]] 内部スロットによって表される鍵を K 入力パラメーターとして、 messageX 入力パラメーターとして、 normalizedAlgorithmoutputLength メンバーを L 入力パラメーターとして、 customizationS 入力パラメーターとして実行した結果とします。
    normalizedAlgorithmname メンバーが "KMAC256" と大文字小文字を区別して文字列一致する場合:
    mac を、[NIST-SP800-185] のセクション 4 で定義される KMAC256 関数を、 key[[handle]] 内部スロットによって表される鍵を K 入力パラメーターとして、 messageX 入力パラメーターとして、 normalizedAlgorithmoutputLength メンバーを L 入力パラメーターとして、 customizationS 入力パラメーターとして実行した結果とします。
  3. computedMac を、mac含むバイト シーケンスとします。

  4. computedMacsignature と等しい場合は true を返し、 それ以外の場合は false を返します。 この比較は定数時間で実行しなければなりません。

15.7.3 鍵の生成

  1. usages に "sign" または "verify" でないエントリーが含まれる場合、 SyntaxErrorスローします。

  2. normalizedAlgorithmlength メンバーが存在する場合:
    length を、normalizedAlgorithmlength メンバーと等しくします。
    それ以外で、normalizedAlgorithmname メンバーが "KMAC128" と大文字小文字を区別して文字列一致する場合:
    length を 128 とします。
    それ以外で、normalizedAlgorithmname メンバーが "KMAC256" と大文字小文字を区別して文字列一致する場合:
    length を 256 とします。
  3. 長さが length ビットの鍵を生成します。

  4. 鍵生成手順が失敗した場合、 OperationErrorスローします。

  5. key を、生成された鍵を表す新しい CryptoKey オブジェクトとします。

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

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

  8. algorithmname 属性を、normalizedAlgorithmname メンバーに設定します。

  9. algorithmlength 属性を length に設定します。

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

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

  12. [[usages]] 内部スロット( key のもの)を、正規化された値usages のもの)に設定する。

  13. key を返します。

15.7.4 鍵のインポート

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

  2. usages に "sign" または "verify" でないエントリーが含まれる場合、 SyntaxErrorスローします。

  3. format が "raw-secret" の場合:
    1. datakeyData とします。

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

      jwkkeyData と等しくします。

      それ以外の場合:

      DataErrorスローします。

    2. jwkkty フィールドが "oct" でない場合、 DataErrorスローします。

    3. jwk が JSON Web Algorithms [JWA] のセクション 6.4 の要件を満たさない場合、 DataErrorスローします。

    4. data を、jwkk フィールドをデコードして得られる バイトシーケンス とします。

    5. normalizedAlgorithmname メンバーが "KMAC128" と大文字小文字を区別して文字列一致する場合:
      jwkalg フィールドが存在し、 かつ "K128" でない場合、 DataErrorスローします。
      normalizedAlgorithmname メンバーが "KMAC256" と大文字小文字を区別して文字列一致する場合:
      jwkalg フィールドが存在し、 かつ "K256" でない場合、 DataErrorスローします。
    6. usages が空でなく、jwkuse フィールドが存在し、かつ "sig" でない場合、 DataErrorスローします。

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

    8. jwkext フィールドが存在して値が false であり、extractable が true の場合、 DataErrorスローします。

    それ以外の場合:
    NotSupportedErrorスローします。
  4. lengthdata のビット単位の長さとします。

  5. normalizedAlgorithmlength メンバーが存在する場合:
    normalizedAlgorithmlength メンバーが length より大きい場合:
    DataErrorスローします。
    normalizedAlgorithmlength メンバーが、 length から 8 を引いた値以下である場合:
    DataErrorスローします。
    それ以外の場合:
    lengthnormalizedAlgorithmlength メンバーと等しくなるように設定します。
  6. key を、data の先頭 length ビットを持つ KMAC 鍵を表す新しい CryptoKey オブジェクトとします。

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

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

  9. algorithmname 属性を、normalizedAlgorithmname メンバーに設定します。

  10. algorithmlength 属性を length に設定します。

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

  12. key を返します。

15.7.5 鍵のエクスポート

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

  2. bits を、key[[handle]] 内部スロットによって表される鍵の生のビットとします。

  3. data を、bits含むバイトシーケンス とします。

  4. format が "raw-secret" の場合:
    1. resultdata とします。

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

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

    3. jwkk 属性を、data を含み、 JSON Web Algorithms [JWA] のセクション 6.4 に従ってエンコードされた文字列に設定します。

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

    5. keyAlgorithmname メンバーが "KMAC128" である場合:
      jwkalg 属性を 文字列 "K128" に設定します。
      keyAlgorithmname メンバーが "KMAC256" である場合:
      jwkalg 属性を 文字列 "K256" に設定します。
    6. jwkkey_ops 属性を、 keyusages 属性と等しくなるように設定します。

    7. jwkext 属性を、key[[extractable]] 内部スロットと等しくなるように設定します。

    8. resultjwk とします。

    それ以外の場合:

    NotSupportedErrorスローします。

  5. result を返します。

15.7.6 鍵長の取得

  1. normalizedAlgorithmlength メンバーが存在する場合:
    length を、normalizedAlgorithmlength メンバーと等しくします。
    それ以外で、normalizedAlgorithmname メンバーが "KMAC128" と大文字小文字を区別して文字列一致する場合:
    length を 128 とします。
    それ以外で、normalizedAlgorithmname メンバーが "KMAC256" と大文字小文字を区別して文字列一致する場合:
    length を 256 とします。
  2. length を返します。

16. Argon2

16.1 説明

この節は非規範的です。

これは、[RFC9106] で定義されている、パスワードハッシュおよび鍵導出のための Argon2 関数について説明します。

16.2 登録

認識されるアルゴリズム名は、 それぞれの Argon2 の型について "Argon2d"、 "Argon2i"、および "Argon2id" です。

操作 パラメーター 結果
deriveBits Argon2Params バイト 列
importKey なし CryptoKey
鍵長を取得 なし null

16.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 節を参照してください。

16.4 操作

16.4.1 ビットを導出する

  1. length が null であるか、32 (4*8) 未満であるか、8 の倍数でない場合、 OperationErrorスローします。

  2. normalizedAlgorithmversion メンバーが 存在し、かつ 19 (0x13) でない場合、 OperationErrorスローします。

  3. normalizedAlgorithmparallelism メンバーが 0、 または 16777215 (2^24-1) より大きい場合、 OperationErrorスローします。

  4. normalizedAlgorithmmemory メンバーが、 normalizedAlgorithmparallelism メンバーの 8 倍未満である場合、 OperationErrorスローします。

  5. normalizedAlgorithmpasses メンバーが 0 である場合、 OperationErrorスローします。

  6. normalizedAlgorithmname メンバーが、大文字小文字を区別して "Argon2d" と文字列一致する場合:
    type を 0 とします。
    normalizedAlgorithmname メンバーが、大文字小文字を区別して "Argon2i" と文字列一致する場合:
    type を 1 とします。
    normalizedAlgorithmname メンバーが、大文字小文字を区別して "Argon2id" と文字列一致する場合:
    type を 2 とします。
  7. 存在する場合、secretValuenormalizedAlgorithmsecretValue メンバーとします。

  8. 存在する場合、associatedDatanormalizedAlgorithmassociatedData メンバーとします。

  9. result を、[RFC9106] の第 3 節で定義されている Argon2 関数を、 key[[handle]] 内部スロットによって表されるパスワードをメッセージ P として、 normalizedAlgorithmnonce 属性を nonce S として、 normalizedAlgorithmparallelism 属性の値を 並列度 p として、 normalizedAlgorithmmemory 属性の値を メモリサイズ m として、 normalizedAlgorithmpasses 属性の値を パス数 t として、 0x13 をバージョン番号 v として、 secretValue(存在する場合)を秘密値 K として、 associatedData(存在する場合)を関連データ X として、 type を型 y として、および length を 8 で割った値をタグ長 T として使用して 実行した結果とします。

  10. 鍵導出操作が失敗した場合、 OperationErrorスローします。

  11. result を返します。

16.4.2 鍵をインポートする

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

  2. format が "raw-secret" でない場合、NotSupportedErrorスローします。

  3. usages に "deriveKey" または "deriveBits" でない値が含まれている場合、 SyntaxErrorスローします。

  4. extractablefalse でない場合、 SyntaxErrorスローします。

  5. key を、keyData を表す新しい CryptoKey とします。

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

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

  8. algorithmname 属性を、normalizedAlgorithmname メンバーに設定します。

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

  10. key を返します。

16.4.3 鍵長を取得する

  1. null を返します。

17. IANA に関する考慮事項

17.1 JSON Web 署名および暗号化アルゴリズムの登録

この節では、JSON Web Key で使用するために、次のアルゴリズム識別子を IANA JSON Web Signature and Encryption Algorithms Registry に登録します。

17.2 JSON Web Key 操作

この節では、JSON Web Key で使用するために、次の鍵操作を IANA JSON Web Key Operations Registry に登録します。

18. 導入ガイダンス

この節は非規範的です。

この仕様では、多数のアルゴリズムおよび操作を定義しています。実装者に ガイダンスを提供し、ウェブプラットフォームの耐量子移行を 加速するため、この節では、実装において優先すべきアルゴリズムおよび 操作を推奨します。

SubtleCrypto.supports メソッドは、機能検出、適切なフォールバック、およびプログレッシブ エンハンスメントを可能にすることで、この仕様の他のすべてのアルゴリズムおよび 操作の迅速な導入を容易にします。

SubtleCrypto.getPublicKey メソッドは、この仕様および [webcrypto] で定義されている非対称アルゴリズムを 実用的に使用するために重要です。このメソッドにより、アプリケーションは対応する公開鍵を保存せずに 秘密鍵のみを保存でき、秘密鍵と公開鍵が実際に対応していることを 検証する必要もなくなるため、鍵管理が簡単になります。さらに、これによりライブラリ 作者は、出力に公開鍵値をコミットするプロトコルへの入力として 抽出不可能な秘密鍵を受け入れることができます。

アルゴリズムに関しては、次のものが耐量子移行およびウェブ上で 最新の暗号プロトコルを利用可能にするために最も優先度が高いと考えられ、 優先順位順に示します。

  1. ML-KEM は、NIST [FIPS-203] によって標準化された主要な耐量子鍵 カプセル化メカニズムです。従来の鍵合意と組み合わせることで、 [draft-ietf-hpke-hpke] や、その PQ および PQ/T アルゴリズム [draft-ietf-hpke-pq] などの プロトコルで使用されるハイブリッド 耐量子/従来型(PQ/T)鍵確立を可能にします。
  2. ML-DSA は、NIST [FIPS-204] によって標準化された主要な耐量子デジタル 署名アルゴリズムです。
  3. ChaCha20-Poly1305 は、多くのプロトコル (TLS、SSH、WireGuard、HPKE)で使用されている、広く 導入された AEAD 暗号 [RFC8439] です。
  4. SHA-3 および cSHAKE (特に SHA3-256 および cSHAKE256)は、ML-KEM 鍵導出やハイブリッド KEM コンバイナーを含む多くの耐量子 構成で使用されています。特に、カスタマイズ パラメーターを指定せずに呼び出した cSHAKE256 は SHAKE256 と同一の出力を 生成するため、単一の実装でカスタマイズあり(cSHAKE256)と カスタマイズなし(SHAKE256)の両方のユースケースに対応できます。 ただし、cSHAKE の実装を利用できない場合でも、 SHAKE の実装は有用である可能性があります。その場合、 customization パラメーターが存在し、 空でないときには必ず NotSupportedError をスローし (かつ SubtleCrypto.supports から false を返す)ようにする必要があります。
  5. Argon2 は、メモリハードなパスワードベースの 鍵導出関数 [RFC9106] であり、 高度に並列化された環境 (GPU や FPGA など)におけるブルートフォース攻撃への 耐性を向上させます。

SLH-DSA は、NIST [FIPS-204] によって標準化されたステートレスなハッシュベースのデジタル 署名アルゴリズムです。これまでのところ ML-DSA より導入例は少ないものの、ML-DSA の代替が必要になった場合には 実装する価値が生じる可能性があります。

これら以外にも、AES-OCBTurboSHAKEKangarooTwelve、および KMAC はいずれも有用な追加機能ですが、 耐量子移行にとって直ちに重要というわけではありません。

19. 使用例

この例では、利用可能な場合は Argon2、そうでない場合は PBKDF2 を使用してパスワードから鍵を導出し、 次に、利用可能な場合は AES-OCB、そうでない場合は AES-GCM を使用して、その鍵でテキストを暗号化および復号します。

1: パスワードから導出した鍵を使用してデータを暗号化する
const password = 'correct horse battery staple';
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 = 'Hello, world!';
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: "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-ietf-jose-pqc-kem-05]
JOSE および COSE 向けの耐量子鍵カプセル化メカニズム(PQ KEM). IETF. 2025年12月. URL: https://www.ietf.org/archive/id/draft-ietf-jose-pqc-kem-05.html
[FIPS-202]
SHA-3 標準: 置換ベースのハッシュ関数および拡張可能出力関数. NIST. 2015年8月. URL: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf
[FIPS-203]
モジュール格子ベースの 鍵カプセル化メカニズム標準. NIST. 2024年8月. URL: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.203.pdf
[FIPS-204]
モジュール格子ベースの デジタル署名標準. NIST. 2024年8月. URL: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf
[FIPS-205]
ステートレスハッシュベースの デジタル署名標準. NIST. 2024年8月. 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/
[infra]
Infra 標準. Anne van Kesteren; Domenic Denicola. WHATWG. 現行標準. URL: https://infra.spec.whatwg.org/
[JWA]
JSON Web Algorithms (JWA). M. Jones. IETF. 2015年5月. 標準案. URL: https://www.rfc-editor.org/info/rfc7518/
[JWK]
JSON Web Key (JWK). M. Jones. IETF. 2015年5月. 標準案. URL: https://www.rfc-editor.org/info/rfc7517/
[NIST-SP800-185]
NIST 特別刊行物 800-185: SHA-3 派生関数: cSHAKE、KMAC、TupleHash、および ParallelHash. NIST. 2016年12月. URL: https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-185.pdf
[RFC2119]
要件レベルを示すために RFC で使用する キーワード. S. Bradner. IETF. 1997年3月. 現行のベストプラクティス. URL: https://www.rfc-editor.org/info/rfc2119/
[RFC5208]
公開鍵暗号標準(PKCS) #8: 秘密鍵情報構文仕様バージョン 1.2. B. Kaliski. IETF. 2008年5月. 情報提供. URL: https://www.rfc-editor.org/info/rfc5208/
[RFC5280]
インターネット X.509 公開鍵基盤 証明書および証明書失効リスト(CRL)プロファイル. D. Cooper; S. Santesson; S. Farrell; S. Boeyen; R. Housley; W. Polk. IETF. 2008年5月. 標準案. URL: https://www.rfc-editor.org/info/rfc5280/
[RFC7253]
OCB 認証付き暗号化 アルゴリズム. T. Krovetz; P. Rogaway. IETF. 2014年5月. 情報提供. URL: https://www.rfc-editor.org/info/rfc7253/
[RFC8174]
RFC 2119 のキーワードにおける大文字と小文字の曖昧さ. B. Leiba. IETF. 2017年5月. 現行のベストプラクティス. URL: https://www.rfc-editor.org/info/rfc8174/
[RFC8439]
IETF プロトコル向けの ChaCha20 および Poly1305. Y. Nir; A. Langley. IETF. 2018年6月. 情報提供. URL: https://www.rfc-editor.org/info/rfc8439/
[RFC9106]
パスワード ハッシュおよびプルーフ・オブ・ワーク用途向けの Argon2 メモリハード関数. A. Biryukov; D. Dinu; D. Khovratovich; S. Josefsson. IETF. 2021年9月. 情報提供. URL: https://www.rfc-editor.org/info/rfc9106/
[RFC9861]
KangarooTwelve および TurboSHAKE. IETF. 2025年10月. 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. 2026年5月. 標準案. URL: https://www.rfc-editor.org/info/rfc9964/
[webcrypto]
Web Cryptography レベル 2. Daniel Huigens. W3C. 2025年4月22日. 最初の公開作業草案. 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/
[RFC9814]
暗号メッセージ構文(CMS)における SLH-DSA 署名アルゴリズムの使用. R. Housley; S. Fluhrer; P. Kampanakis; B. Westerbaan. IETF. 2025年7月. 標準案. URL: https://www.rfc-editor.org/info/rfc9814/
[RFC9881]
インターネット X.509 公開鍵基盤 -- モジュール格子ベースのデジタル署名アルゴリズム (ML-DSA)のアルゴリズム識別子. J. Massimo; P. Kampanakis; S. Turner; B. E. Westerbaan. IETF. 2025年10月. 標準案. URL: https://www.rfc-editor.org/info/rfc9881/
[RFC9935]
インターネット X.509 公開鍵基盤 - モジュール格子ベースの鍵カプセル化メカニズム (ML-KEM)のアルゴリズム識別子. S. Turner; P. Kampanakis; J. Massimo; B. E. Westerbaan. IETF. 2026年3月. 標準案. URL: https://www.rfc-editor.org/info/rfc9935/
[webcrypto-secure-curves]
Web Cryptography API における安全な曲線. W3C. コミュニティグループ報告書草案. URL: https://wicg.github.io/webcrypto-secure-curves/