【问题标题】:Creation of a detached signature in CMS using SHA-512 for the hash在 CMS 中使用 SHA-512 为哈希创建分离签名
【发布时间】:2018-06-08 08:50:24
【问题描述】:

我的内容和 CMS 带有分离的签名(密钥算法 - SHA-256)和 我使用密钥算法 SHA-512 向 CMS 添加了一个签名。但是使用 CryptoApi 添加时,函数CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_SIGNER, &SignerEncodeInfo) 返回CRYPT_E_UNKNOWN_ALGO

原因是在CMS中digestAlgoritm: ASN.1 structure中不存在SHA-512

如果我使用 ASN.1 编辑器添加 SHA-512,则会添加签名者信息:ASN.1 after insert

是否可以直接使用 CryptoApi 添加此块或 SignerInfo,还是只能通过编辑 ASN.1 来添加?

【问题讨论】:

  • 请注意,您的问题不会得到尽可能多的关注,因为您没有使用语言标签指定语言。在 StackOverflow 上,始终指定语言标签,除非您提出 language-agnostic 的少数主题问题之一。

标签: c++ cryptography digital-signature cryptoapi asn.1


【解决方案1】:

我找到了解决方法。

我创建了一个包含算法但不包含签名者信息和证书的模板。可以使用 asn1 编辑器或 CryptoApi(使用 CryptMsgOpenToDecodeCryptMsgControl(..., CMSG_CTRL_DEL_SIGNER, ...))来完成 然后需要将签名者信息和证书从当前签名转移到上面创建的模板中

PCMSG_CMS_SIGNER_INFO pSignerInfo;
DWORD cbSignerInfo;
CryptMsgGetParam(hMsg2, CMSG_CMS_SIGNER_INFO_PARAM, 0, NULL, &cbSignerInfo);
pSignerInfo = (PCMSG_CMS_SIGNER_INFO)LocalAlloc(LPTR, cbSignerInfo);
CryptMsgGetParam(hMsg2, CMSG_CMS_SIGNER_INFO_PARAM, 0, (PVOID)pSignerInfo, &cbSignerInfo);

CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_CMS_SIGNER_INFO, pSignerInfo);

DWORD cbCertInfo;
CryptMsgGetParam(hMsg2, CMSG_CERT_PARAM, 0, NULL, &cbCertInfo);
std::vector<BYTE> pCertInfo(cbCertInfo);
CryptMsgGetParam(hMsg2, CMSG_CERT_PARAM, 0, &pCertInfo[0], &cbCertInfo);

CRYPT_INTEGER_BLOB certBlob;
memset(&certBlob, 0, sizeof(CRYPT_INTEGER_BLOB));
certBlob.cbData = cbCertInfo;
certBlob.pbData = &pCertInfo[0];
CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_CERT, &certBlob);

之后,您可以添加新签名。

【讨论】:

  • 不过,不要使用此解决方案。带有CMSG_CTRL_ADD_CMS_SIGNER_INFO参数的函数可以改变签名属性的顺序。
猜你喜欢
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多