我實際上正在研究一個函數,該函數應該從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,如果消息非常大,則循環遍歷所有密鑰可能需要一些時間。
最好的問候, 最大