2. 在 CMS 中使用 ML-KEM 算法 (Use of the ML-KEM Algorithm in the CMS)
ML-KEM 算法 MAY 用于 CMS enveloped-data 内容类型 [RFC5652], CMS authenticated-data 内容类型 [RFC5652] 或 CMS authenticated-enveloped-data 内容类型 [RFC5083] 中的一个或多个接收者. 在每种情况下, KEMRecipientInfo [RFC9629] 都与 ML-KEM 算法一起使用, 以便从发起者向接收者安全传输内容加密密钥.
使用 KEMRecipientInfo 处理 ML-KEM 时, 遵循 [RFC9629] 第 2 节相同的步骤. 为支持 ML-KEM 算法, CMS 发起者 MUST 实现 Encapsulate() 函数, CMS 接收者 MUST 实现 Decapsulate() 函数.
2.1. RecipientInfo 约定 (RecipientInfo Conventions)
当 ML-KEM 算法用于某个接收者时, 该接收者的 RecipientInfo 替代项 MUST 是 OtherRecipientInfo, 并使用 [RFC9629] 中定义的 KEMRecipientInfo 结构.
KEMRecipientInfo 各字段含义如下:
version : 语法版本号. 它 MUST 为 0.
rid : 标识接收者的证书或公钥.
kem : 标识 KEM 算法. 它 MUST 包含 id-alg-ml-kem-512, id-alg-ml-kem-768 或 id-alg-ml-kem-1024 之一. 第 3 节重列了这些标识符.
kemct : 为此接收者生成的密文.
kdf : 标识密钥派生算法. 注意, 用于 CMS RecipientInfo 处理的密钥派生函数 (Key Derivation Function, KDF) MAY 不同于 ML-KEM 算法内部使用的 KDF. 实现 MUST 支持基于 HMAC 的密钥派生函数 (HMAC-based Key Derivation Function, HKDF) [RFC5869], 与 SHA-256 [FIPS180] 配合使用 id-alg-hkdf-with-sha256 KDF 对象标识符 (Object Identifier, OID) [RFC8619]. 如 [RFC8619] 所规定, 当该 OID 出现在 ASN.1 类型 AlgorithmIdentifier 中时, parameter 字段 MUST 缺省. 实现 MAY 也支持其他 KDF.
kekLength : 密钥加密密钥的大小, 单位为八位字节.
ukm : KDF 的可选输入. 在 CMS 中安全使用 ML-KEM 不依赖 ukm 值, 因此本文档不对此值提出任何要求. 关于 ukm 参数的更多信息见 [RFC9629] 第 3 节.
wrap : 标识用于加密内容加密密钥的密钥加密算法. 支持 ML-KEM-512 的实现 MUST 支持 AES-Wrap-128 [RFC3394] 密钥加密算法, 并使用 id-aes128-wrap 密钥加密算法 OID [RFC3565]. 支持 ML-KEM-768 或 ML-KEM-1024 的实现 MUST 支持 AES-Wrap-256 [RFC3394] 密钥加密算法, 并使用 id-aes256-wrap 密钥加密算法 OID [RFC3565]. 实现 MAY 也支持其他密钥加密算法.
附录 C 包含一个示例, 展示如何在 KEMRecipientInfo 类型中使用 ML-KEM 建立内容加密密钥.
2.2. 底层组件 (Underlying Components)
当 ML-KEM 在 CMS 中使用时, KEMRecipientInfo 结构内使用的底层组件 SHOULD 与期望的最低安全级别保持一致. [NIST.SP.800-57pt1r5] 已识别出若干安全级别.
如果使用不同于第 2.1 节所指定的底层组件, 则为满足 [RFC9629] 第 7 节中 KDF 和密钥包装算法的要求, 下表给出了与 KEMRecipientInfo 类型中的 ML-KEM 一起使用的组件最低要求:
+==========+=============+==============+=====================+
| Security | Algorithm | KDF Preimage | Symmetric Key- |
| Strength | | Strength | Encryption Strength |
+==========+=============+==============+=====================+
| 128-bit | ML-KEM-512 | 128-bit | 128-bit |
+----------+-------------+--------------+---------------------+
| 192-bit | ML-KEM-768 | 192-bit | 192-bit (*) |
+----------+-------------+--------------+---------------------+
| 256-bit | ML-KEM-1024 | 256-bit | 256-bit |
+----------+-------------+--------------+---------------------+
Table 1: ML-KEM KEMRecipientInfo Component Security Levels
(*) 对于 AES Key Wrap, 通常使用 256-bit 密钥, 因为 AES-192 的部署不那么普遍.
2.2.1. 使用基于 HKDF 的密钥派生函数 (Use of the HKDF-Based Key Derivation Function)
HKDF 函数由 HKDF-Extract 和 HKDF-Expand 函数组合而成.
HKDF(salt, IKM, info, L)
= HKDF-Expand(HKDF-Extract(salt, IKM), info, L)
与 KEMRecipientInfo 一起使用时, salt 参数不使用, 即它是零长度字符串 "". IKM, info 和 L 参数对应 [RFC9629] 第 5 节中的相同 KDF 输入. info 参数由发起者和接收者独立生成. 实现 MUST 确认 L 与密钥加密算法的密钥大小一致.
2.3. 证书约定 (Certificate Conventions)
[RFC5280] 规定了在互联网应用中使用 X.509 证书的配置文件. ML-KEM 需要接收者静态公钥, 发起者从接收者证书中获得该公钥. 携带 ML-KEM 公钥的约定在 [RFC9935] 中规定.
2.4. SMIME Capabilities 属性约定 (SMIME Capabilities Attribute Conventions)
[RFC8551] 第 2.5.2 节定义了 SMIMECapabilities 属性, 用于宣告 S/MIME 实现可以支持的算法部分列表. 构造 CMS signed-data 内容类型 [RFC5652] 时, 合规实现 MAY 包含 SMIMECapabilities 属性, 用于宣告支持一个或多个 ML-KEM 算法标识符.
表示 ML-KEM 算法的 SMIMECapability SEQUENCE MUST 在 capabilityID 字段中包含 ML-KEM OID 之一. 当 ML-KEM OID 之一出现在 capabilityID 字段中时, parameters MUST NOT 出现.