我想使用C/CPP从PKCS#7签名的代码图像中提取签名信息。我想知道OpenSSL API。 我可以使用弹性城堡(CMSSignedData)提取.

请让我知道我可以在C/CPP中使用的OpenSSL API来提取每个签名者和签名者信息并验证签名者。

是否有任何API,例如x509_lookup_buffer()而不是x509_lookup_file()???

预先感谢OpenSID

有帮助吗?

解决方案

我也有类似的问题。我必须从PKCS#7签名中提取签名时间属性。我找不到互联网上的最终解决方案,但是我可以从各个地方捡起零件和零件,并为此做到这一点。也许有一种更好/更好/更安全的方式,这是我第一次这样做,但它似乎有效。

在一个函数中,i具有p_pkcs7sigsizizizizizizizizize#7签名的字节,在const void *p_pkcs7sig指向的缓冲区中。我得到了签名时间。我删除了错误处理,请勿使用此代码冗长!

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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top