1

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

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

如果我使用 ASN.1 编辑器添加 SHA-512,将添加签名者信息:插入后的 ASN.1

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

4

1 回答 1

0

我找到了一种解决方法来做到这一点。

我创建了一个包含算法但不包含签名者信息和证书的模板。可以使用 asn1 编辑器或 CryptoApi 完成(使用CryptMsgOpenToDecodeand CryptMsgControl(..., 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);

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

于 2018-07-03T09:29:23.910 回答