У меня есть файл CMS с кодировкой DER, который я хотел бы расшифровать с помощью API openssl.
Я нашел API для расшифровки:
CMS_decrypt(cms_content, pkey, cert, NULL, out, NULL);
Я нашел примеры для чтения файлов PEM pkey и cert и настройки вывода BIO, но я не могу понять, как читать файл cms.
Вопрос : как я могу прочитать файл в кодировке ASN.1 DER в переменную cms_content
, имеющую тип CMS_ContentInfo
?
РЕДАКТИРОВАТЬ: Благодаря ответу Камиллы мне удалось заставить его работать с:
#include <stdio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/cms.h>
int main (int argc, char **argv)
{
char pkeypath[] = "recipient_prvkey.pem";
char certpath[] = "sender_cert.pem";
char cmspath[] = "encrypted.der";
char decpath[] = "decrypted.zip";
BIO *in = NULL, *out = NULL, *tbio = NULL;
CMS_ContentInfo *cms = NULL;
EVP_PKEY *pkey;
X509 *cert;
OpenSSL_add_all_algorithms();
ERR_load_crypto_strings();
tbio = BIO_new_file(pkeypath, "r");
pkey = PEM_read_bio_PrivateKey(tbio, NULL, 0, NULL);
if (pkey == NULL) {
printf("error reading private key");
return EXIT_FAILURE;
}
BIO_free(tbio);
tbio = BIO_new_file(certpath, "r");
cert = PEM_read_bio_X509(tbio, NULL, 0, NULL);
if (cert == NULL) {
printf("error reading private key");
return EXIT_FAILURE;
}
in = BIO_new_file(cmspath, "r");
cms = d2i_CMS_bio(in, NULL);
BIO_free(in);
out = BIO_new_file(decpath, "w");
if (!CMS_decrypt_set1_pkey(cms, pkey, cert))
{
fprintf(stderr, "set1_pkey error\n");
return EXIT_FAILURE;
}
if (!CMS_decrypt(cms, NULL, NULL, NULL, out, CMS_BINARY))
{
int error = ERR_get_error();
fprintf(stderr, "error: %s :: %s :: %s\n",
ERR_reason_error_string(error),
ERR_func_error_string(error),
ERR_lib_error_string(error)
);
}
BIO_free(out);
return 0;
}
1 ответ
Я просто скопировал образец OpenSSL cms_dec, который работает с PEM, и адаптировал его для файла CMS с кодировкой DER.
BIO *in = NULL, *out = NULL, *tbio = NULL;
X509 *cert= NULL;
EVP_PKEY *rkey = NULL;
CMS_ContentInfo *cms = NULL;
int ret = 1;
OpenSSL_add_all_algorithms();
ERR_load_crypto_strings();
/* Read in recipient certificate and private key */
tbio = BIO_new_file("yourCMS.der", "r");
rcert = i2d_x509_bio(tbio, NULL);
BIO_reset(tbio);
i2d_PrivateKey_bio(tbio, rkey);
/* Open S/MIME message to decrypt */
in = BIO_new_file("smencr.txt", "r");
/* Parse message */
cms = SMIME_read_CMS(in, NULL);
out = BIO_new_file("decout.txt", "w");
/* Decrypt S/MIME message */
CMS_decrypt(cms, rkey, rcert, out, NULL, CMS_BINARY) //Edit : Added Flags for DER.
...
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
in = BIO_new_file("smencr.txt", "r");
с файлом в кодировке DER, openssl не смог его обработать. В документацииSMIME_read_CMS
указано следующее: Анализатор предполагает, что структура CMS_ContentInfo всегда закодирована в base64 и не будет обрабатывать случай, когда она находится в двоичном формате или использует цитируемый формат для печати.