9.6. Domain Separation (域分离)
9.6. 域分离
HPKE 允许组合 DHKEM 变体 DHKEM(Group, KDF') 和 KDF, 使得两个 KDF 由同一个 KDF 实例化。按照设计, DHKEM 内部和 HPKE 其余部分对 Extract() 和 Expand() 的调用使用单独的输入域。这证明即使由同一个 KDF 实例化, 将它们建模为独立函数是合理的。DHKEM 和 HPKE 其余部分之间的这种域分离是通过在 LabeledExtract() 和 LabeledExpand() 中使用前缀无关的 suite_id 值集来实现的 (DHKEM 中的 KEM..., HPKE 其余部分中的 HPKE...)。回想一下, 如果集合中没有元素是另一个元素的前缀, 则该集合是前缀无关的。
未来的 KEM 实例化必须确保, 如果内部使用 Extract() 和 Expand(), 它们可以被建模为独立于 HPKE 其余部分中 Extract() 和 Expand() 调用的函数。确保这一点的一种方法是使用带有 suite_id 的 LabeledExtract() 和 LabeledExpand(), 如第 4 节中定义的, 这将确保输入域分离, 如上所述。如果 KEM 直接调用 HPKE 的 Extract() 或 Expand() 内部使用的函数, 如 HKDF 情况下的 Hash() 和 HMAC(), 则需要特别注意。必须确保对这些调用的输入不能与 Extract() 或 Expand() 内部这些函数的内部调用的输入冲突。在 HPKE 的 KeySchedule() 中, 这是通过在任意长度输入 info 和 psk_id 上使用 Extract() 而不是 Hash() 来避免的。
LabeledExtract() 和 LabeledExpand() 中使用的字符串字面量 "HPKE-v1" 确保 HPKE 中派生的任何秘密都绑定到方案的名称和版本, 即使可能从与另一个方案或版本中相同的 Diffie-Hellman 或 KEM 共享秘密派生。