2014-01-22 72 views
1

我實際上正在研究一個函數,該函數應該從PKCS7 MIME加密消息中提取RecipientInfo。我想這樣做的原因是,我想要獲取郵件加密的所有郵件地址(或至少是keyids/fingerprints)。CMS(PKCS#7)RecipientInfo

嗯 - 我想出來的東西,創造了這樣的事情(INDATA是* .p7m附件內容,indata_len INDATA的strlen的):

char *indata; 
int indata_len, i; 
PKCS7 *p7 = NULL; 
BIO *bcont = NULL; 
CMS_ContentInfo *cms = NULL; 
STACK_OF(CMS_RecipientInfo) *recipients = NULL; 
CMS_RecipientInfo *recip = NULL; 
BIO *encMessage = BIO_new(BIO_s_mem()); 
if (encMessage == NULL) { 
    goto clean_exit; 
} 

if(!BIO_write(encMessage, indata, indata_len)) { 
    goto clean_exit; 
} 

cms = SMIME_read_CMS(encMessage,NULL); 
if (cms == NULL) { 
    goto clean_exit; 
} 

recipients = CMS_get0_RecipientInfos(cms); 
if (recipients == NULL) { 
    goto clean_exit; 
} 

for (i=0; i< sk_CMS_RecipientInfo_num(recipients); i++) { 
    recip = sk_CMS_RecipientInfo_value(recipients, i); 
    if(recip == NULL || CMS_RecipientInfo_type(recip) != CMS_RECIPINFO_TRANS) { 
     continue; 
    } 

    int r; 
    ASN1_OCTET_STRING **keyid; 
    X509_NAME **issuer; 
    ASN1_INTEGER **sno; 

    r = CMS_RecipientInfo_ktri_get0_signer_id(recip, keyid, issuer, sno); 
    if (!r) { 
     continue; 
    } 

    printf("Key: %s\n", keyid); 
} 

我沒有得到任何錯誤(與ERR_get_error檢查())但keyid的,發行人與SNO留「空」,以上代碼的輸出是:

要點:(空)

所以我的問題是,它甚至有可能獲得THA t加密消息的信息,還是在我身邊的推理中存在錯誤?

如果有可能獲得該數據,有人可以給我一個提示嗎? 如果這是不可能的,什麼是默認(最好)的方法來檢查哪個私鑰用於解密。由於單個用戶可以有多個S/Mime證書/密鑰。例如。創建新的密鑰,因爲舊的密鑰丟失或只是從提供商那裏獲得新的證書/密鑰組合... Imho,如果消息非常大,則循環遍歷所有密鑰可能需要一些時間。

最好的問候, 最大

回答

0

因此,沒有人知道要檢測哪些受體鍵已被使用,如果有不止一個解密接收到的消息的最佳方式?