2014-01-22 37 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

因此,没有人知道要检测哪些受体键已被使用,如果有不止一个解密接收到的消息的最佳方式?