我想使用 C/CPP 从 PKCS#7 签名代码图像中提取签名者信息。我想知道openssl API。我能够使用充气城堡 (CMSSignedData) 提取。
请让我知道我可以在 C/CPP 中使用的 openssl API 来提取每个签名者和签名者信息并验证签名者。
有没有像 X509_LOOKUP_buffer() 而不是 X509_LOOKUP_file() 的 API ???
在此先感谢 opensid
我想使用 C/CPP 从 PKCS#7 签名代码图像中提取签名者信息。我想知道openssl API。我能够使用充气城堡 (CMSSignedData) 提取。
请让我知道我可以在 C/CPP 中使用的 openssl API 来提取每个签名者和签名者信息并验证签名者。
有没有像 X509_LOOKUP_buffer() 而不是 X509_LOOKUP_file() 的 API ???
在此先感谢 opensid
我有一个类似的问题。我必须从 PKCS#7 签名中提取signingTime 属性。我在 Internet 上找不到最终的解决方案,但我可以从各个地方挑选一些零碎的东西并提出这个问题。也许有更好/更好/更安全的方式,这是我第一次这样做,但它似乎有效。
在一个函数中,我在 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;
}