我有一个类似的问题。我必须从PKCS#7签名提取签名时间属性。我无法在互联网上找到最终的解决方案,但我可以从各个地方拿起零件和零件,并提出这个问题。也许有更好/更好/更安全的方式,这是我第一次这样做,但它似乎工作。
在函数中,我通过const void * p_pkcs7Sig指向缓冲区中的PKCS#7签名的p_pkcs7SigSize个字节。我通过这次签约。我已经删除了错误处理,请不要使用此代码冗长!
BIO *v_in = NULL;
PKCS7 *v_p7 = NULL;
STACK_OF(PKCS7_SIGNER_INFO) *v_signerInfos = NULL;
PKCS7_SIGNER_INFO *v_signerInfo = NULL;
ASN1_TYPE *v_asn1SigningTime = NULL;
/* make BIO for input buffer */
v_in = BIO_new_mem_buf((void*)(uintptr_t) p_pkcs7Sig, p_pkcs7SigSize);
/* make a PKCS7 object of it */
v_p7 = d2i_PKCS7_bio(v_in, NULL);
/* get all signer infos */
v_signerInfos = PKCS7_get_signer_info(v_p7);
/* if you need all signer infos then loop through all,
* count you get by k_PKCS7_SIGNER_INFO_num(v_signerInfos)
*/
/* get the first signer info */
v_signerInfo = sk_PKCS7_SIGNER_INFO_value(v_signerInfos,0);
/* get signing time */
v_asn1SigningTime = PKCS7_get_signed_attribute(v_signerInfo, NID_pkcs9_signingTime);
/* You should got a v_asn1SigningTime->type == V_ASN1_UTCTIME,
* if yes then the actual value is in the string buffer at
* v_asn1SigningTime->value.utctime->data
*/
if (v_in)
{
BIO_free_all(v_in);
v_in = NULL;
}
感谢Fudaraku,它的工作。 – openssid 2010-05-21 06:16:11
Fudaraku,是否可以从PKCS7签名代码图像获取签名内容? – openssid 2010-06-01 06:18:39
嗨,我得到了答案,感谢您的支持。 “aaa = PKCS7_verify(p7,certs,NULL,in,NULL,PKCS7_NOVERIFY);”为验证工作。对于复制签名内容“aaa = PKCS7_verify(p7,certs,NULL,in,out,PKCS7_NOVERIFY);”作品。 char * p; long lSize; lSize = BIO_get_mem_data(输出,&p); p包含签名的内容。 谢谢 – openssid 2010-06-03 03:59:27