带有 PKCS1-PSS 填充的 RSA 签名的 maskGenAlgorithm

maskGenAlgorithm for RSA signature with PKCS1-PSS padding

我正在使用 RSA_PKCS1_PSS_PADDING 生成 RSA 签名。我使用 EVP_get_digestbyname() 和 EVP_DigestSignInit() 将摘要算法设置为 SHA256。使用 EVP_PKEY_CTX_set_rsa_pss_saltlen() 将 salt 长度参数设置为 -1。

我有 EVP_MD_CTX、EVP_MD 和 EVP_PKEY_CTX 结构用于签名生成。

如何获取OpenSSL默认使用的Mask生成算法名称?有没有提供API获取方式?

编辑:使用的 OpenSSL 版本:1.1.0g。

RSASSA-PSS 实际上总是与 MGF1 一起用作掩码生成函数。唯一的变化是 MGF1 在内部使用哪个消息摘要。

有时,消息摘要与用于散列消息和在 PSS 中构建标签的消息摘要相同,因为这最有意义。其他时候它是 SHA-1,因为它曾经是早期 RSASSA-PSS API 的默认 MD,因此对于关联的 MGF1。

在理想世界中,一些属性(在签名中,or/and 在用于检查签名的 public 密钥证书中)会告诉 MGF1-with-such-MD,也许通过方式一些对象标识符,比如我们必须指定 PSS。但是加密 API 是地狱。


为了控制 MGF1 使用的消息摘要,我们需要一些与 -sigopt rsa_mgf1_md:sha256openssl dgst 命令中所做的一致的东西。

我最好的猜测是使用

设置 MGF1 摘要
assert(EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, EVP_sha256)>=0);

或使用 EVP_PKEY_CTX_get_rsa_mgf1_md() 作为 documented:

The EVP_PKEY_CTX_get_rsa_mgf1_md() macro gets the MGF1 digest for ctx. If not explicitly set the signing digest is used. The padding mode must have been set to RSA_PKCS1_OAEP_PADDING or RSA_PKCS1_PSS_PADDING.