私は実際に、PKCS7 mime 暗号化メッセージから RecipientInfo を抽出する関数に取り組んでいます。これを行う理由は、メッセージが暗号化されているすべてのメールアドレス (または少なくともキー ID/フィンガープリント) を取得したいからです。
まあ-私は何かを試してみて、次のようなものを作成しました(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、issuer、および sno は「null」のままです。上記のコードの出力は次のとおりです。
キー: (ヌル)
だから私の質問は、暗号化されたメッセージのその情報を取得することさえ可能ですか、それとも私の側の推論に誤りがあるだけですか?
そのデータを取得できる場合、誰かヒントを教えてもらえますか? それが不可能な場合、復号化に使用する秘密鍵を確認するデフォルトの (最善の) 方法は何ですか。1 人のユーザーに対して複数の S/Mime 証明書/キーが存在する可能性があるためです。たとえば、古いキーが失われたために新しいキーを作成するか、プロバイダーから新しい証明書とキーの組み合わせを取得するだけです... Imho、メッセージが本当に大きい場合、すべてのキーをループすると時間がかかる場合があります。
よろしく、マックス