PKCS # 7 Подписанный код Извлечение изображения - PullRequest
1 голос
/ 12 мая 2010

Я хотел извлечь информацию о подписывающем лице из образа подписанного кода PKCS # 7, используя C / CPP.Я хотел знать API openssl. Я в состоянии извлечь Используя надувной замок (CMSSignedData) .

Пожалуйста, дайте мне знать API openssl, которые я могу использовать в C / CPP для извлечения информации о каждом подписывающем и подписывающем лицах и проверкиПодписчики.

есть ли такой API, как X509_LOOKUP_buffer () вместо X509_LOOKUP_file () ???

Заранее спасибо opensid

1 Ответ

0 голосов
/ 20 мая 2010

У меня была похожая проблема. Мне пришлось извлечь атрибут signatureTime из подписи 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...