2010-05-12 107 views

回答

0

我有一個類似的問題。我必須從PKCS#7簽名提取簽名時間屬性。我無法在互聯網上找到最終的解決方案,但我可以從各個地方拿起零件和零件,並提出這個問題。也許有更好/更好/更安全的方式,這是我第一次這樣做,但它似乎工作。

在函數中,我通過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; 
} 
+0

感謝Fudaraku,它的工作。 – openssid 2010-05-21 06:16:11

+0

Fudaraku,是否可以從PKCS7簽名代碼圖像獲取簽名內容? – openssid 2010-06-01 06:18:39

+0

嗨,我得到了答案,感謝您的支持。 「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(輸出,&p); p包含簽名的內容。 謝謝 – openssid 2010-06-03 03:59:27