У меня была аналогичная проблема. Мне пришлось извлечь атрибут signTime из подписи PKCS # 7. Я не мог найти окончательное решение в Интернете, но я мог забрать бит и части из разных мест и подошел к этому. Может быть, есть лучше/лучше/безопаснее, это первый раз, когда я делаю это, но, похоже, он работает.
В функции у меня есть байты p_pkcs7SigSize для сигнатуры PKCS # 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;
}
Спасибо Fudaraku, его работа. – openssid
Fudaraku, можно ли получить подписанный контент из подписанного кода PKCS7? – openssid
Привет, я получил ответы, Спасибо за поддержку. "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 (out, &p); p содержит подписанный контент. Спасибо – openssid