我实际上正在研究一个函数,该函数应该从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,如果消息非常大,则循环遍历所有密钥可能需要一些时间。
最好的问候, 最大