PKCS#7 استخراج صورة رمز موقعة
-
26-09-2019 - |
سؤال
كنت أرغب في استخراج معلومات الموقع من صورة رمز موقعة من PKCS#7 باستخدام C/CPP. أردت أن أعرف واجهة برمجة تطبيقات OpenSSL. أنا قادر على الاستخراج باستخدام قلعة نطاط (CMSSIGNEDDATA).
واسمحوا لي أن أعرف واجهة برمجة تطبيقات OpenSSL التي يمكنني استخدامها في C/CPP لاستخراج كل من Signers و Signer Signer والتحقق من الموقعين.
هل هناك أي واجهة برمجة تطبيقات مثل x509_lookup_buffer () بدلاً من x509_lookup_file () ؟؟؟
شكرا مقدما opensid
المحلول
واجهت مشكلة مماثلة. اضطررت إلى استخراج سمة وقت التوقيع من توقيع 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;
}