使用MS CryptoApi添加经过身份验证的属性

时间:2014-02-27 08:47:49

标签: signing cryptoapi pkcs#7

我正在努力使用CryptoApi向我的邮件添加经过身份验证的属性(OCSP数据)。我首先使用了CryptoApi的简化消息函数,但现在切换到低级消息函数,认为我能够更好地控制消息结构。但我再次陷入困境。我的流程如下:

  • 初始化CMSG_SIGNER_ENCODE_INFO和CMSG_SIGNED_ENCODE_INFO结构
  • 我为ocsp日期创建一个CRYPT_ATTRIBUTE,并在CMSG_SIGNER_ENCODE_INFO结构中指定它
  • 然后我调用CryptMsgCalculateEncodedLength来获取大小
  • 使用CMSG_SIGNED作为消息类型的CryptMsgOpenToEncode
  • CryptMsgUpdate,将我的内容插入到消息中
  • CryptMsgGetParam与CMSG_CONTENT_PARAM获取编码的blob
  • CryptMsgClose,我现在已经完成了这条消息。

我再次打开邮件以获取CMSG_ENCRYPTED_DIGEST,它被发送到TSA并使用CryptMsgControl将结果添加为未经验证的属性。

我正在使用它在Adobe中签名签名标签。因此,当没有经过身份验证的属性时,我会收到Adobe的三张绿色支票:

  1. 该文件尚未修改......
  2. 文档由当前用户签名
  3. 签名包含嵌入式时间戳(时间戳有效)
  4. 但是,只要添加了authenticated属性,签名者的身份就会失效,并且时间戳数据不正确。添加经过身份验证的属性时的CMSG_COMPUTED_HASH_PARAM,如果不相同,则会有所不同。这应该不一样吗?由于文档摘要是文档的内容而不是经过身份验证的属性。

    是否有其他方法可以添加经过身份验证的属性?我曾尝试使用CryptMsgControl将其添加为签名者,但这也无济于事......

1 个答案:

答案 0 :(得分:0)

添加经过身份验证的签名属性,示例时间戳,

的步骤如何
CryptEncodeObject(PKCS_7_ASN_ENCODING, szOID_RSA_signingTime, &curtime, pTime, &szTime);
pTime = (BYTE *)LocalAlloc(GPTR, szTime);
CryptEncodeObject(PKCS_7_ASN_ENCODING, szOID_RSA_signingTime, &curtime, pTime, &szTime);
time_blob.cbData = szTime;
time_blob.pbData = pTime;
attrib[0].pszObjId = szOID_RSA_signingTime;
attrib[0].cValue = 1;
attrib[0].rgValue = &time_blob;
CosignerInfo.cAuthAttr = 1;
CosignerInfo.rgAuthAttr = attrib;

并且Cosigner params来自CMSG_SIGNER_ENCODE_INFO CosignerInfo;