1

C/CPP を使用して PKCS#7 署名付きコード イメージから署名者情報を抽出したいと考えていました。openssl API について知りたかったのです。弾む城 (CMSSignedData) を使用して抽出できます。

各署名者と署名者情報を抽出し、署名者を検証するために C/CPP で使用できる openssl API を教えてください。

X509_LOOKUP_file() の代わりに X509_LOOKUP_buffer() のような API はありますか ???

よろしくお願いします

4

1 に答える 1

0

私も同様の問題を抱えていました。PKCS#7署名からsigningTime属性を抽出する必要がありました。インターネット上で究極の解決策を見つけることはできませんでしたが、さまざまな場所から断片を拾い上げて、これにたどり着きました。たぶん、より良い/より良い/より安全な方法があります。これを行うのは初めてですが、うまくいくようです。

関数では、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;
}
于 2010-05-20T07:40:16.543 に答える