4. SLH-DSA 签名 (SLH-DSA Signatures)
SLH-DSA 是一种构建在哈希函数之上的数字签名方案. SLH-DSA 的安全性依赖底层哈希函数的安全属性, 例如寻找原像被认为困难.
签名可以放置在若干不同的 ASN.1 结构中. 下面给出证书的顶层结构, 用于说明签名通常如何与算法标识符以及签名位置一起编码.
Certificate ::= SIGNED{ TBSCertificate }
SIGNED{ToBeSigned} ::= SEQUENCE {
toBeSigned ToBeSigned,
algorithmIdentifier SEQUENCE {
algorithm SIGNATURE-ALGORITHM.
&id({SignatureAlgorithms}),
parameters SIGNATURE-ALGORITHM.
&Params({SignatureAlgorithms}
{@algorithmIdentifier.algorithm})
OPTIONAL
},
signature BIT STRING (CONTAINING SIGNATURE-ALGORITHM.&Value(
{SignatureAlgorithms}
{@algorithmIdentifier.algorithm}))
}
NOTE: 上述语法来自 [RFC5912], 并且与 2021 ASN.1 语法 [X680] 兼容. 关于 1988 ASN.1 语法, 见 [RFC5280].
用于签名的算法标识符与用于公钥的算法标识符相同. 当用于标识签名算法时, parameters 必须不存在.
要签名的数据会为 SLH-DSA 做准备. 然后执行私钥操作以生成原始签名值.
使用 Pure SLH-DSA 签名算法对数据签名时, 使用 [FIPS205] 第 10.2.1 节中的 Algorithm 22 (slh_sign). 验证 Pure SLH-DSA 签名数据时, 使用 [FIPS205] 第 10.3 节中的 Algorithm 24 (slh_verify). 使用 HashSLH-DSA 签名算法对数据签名时, 使用 [FIPS205] 第 10.2.2 节中的 Algorithm 23 (hash_slh_sign). 验证 HashSLH-DSA 签名数据时, 使用 [FIPS205] 第 10.3 节中的 Algorithm 25 (hash_slh_verify). 这四个算法都会从待签名消息以及其他数据创建消息 M', 并由内部 SLH-DSA 算法对 M' 进行操作. M' 可以在执行内部 SLH-DSA 算法的模块之外构造.
对于 HashSLH-DSA, M' 中有一个称为 PH_M 的 pre-hash 组件. PH_M 可以在签名/验证模块中计算; 在这种情况下, 待签名的完整消息会发送到该模块. 另一种方式是, PH_M 可以在另一个模块中计算. 在这种情况下, 要么将 PH_M 发送到创建 M' 的签名/验证模块, 要么在签名/验证模块之外创建 M' 并发送到该模块. HashSLH-DSA 允许这种实现灵活性, 以减少传输到签名/验证模块的数据量并使其保持一致. 使用 HashSLH-DSA 签名和验证时用于生成 pre-hash 的哈希算法或可扩展输出函数 (XOF), 由签名算法名称中 "-with-" 组件之后的部分指定. 例如, 使用 id-hash-slh-dsa-sha2-128s-with-sha256 签名时, SHA-256 用作 pre-hash 算法. 使用 SHAKE128 执行 pre-hash 时, 输出长度为 256 比特. 使用 SHAKE256 执行 pre-hash 时, 输出长度为 512 比特.
[FIPS205] 第 9.2 节将 SLH-DSA 签名定义为三个元素: R, SIG_FORS 和 SIG_HT. SLH-DSA 签名的原始八位字节串编码是这三个元素的拼接, 即 R || SIG_FORS || SIG_HT. 表示签名的原始八位字节串直接编码在 BIT STRING 中, 不添加任何额外的 ASN.1 包装. 例如, 在 Certificate 结构中, 原始签名值编码在 "signature" BIT STRING 字段中.