преобразование из непрозрачного pkcs7 p7m в отдельный смайм - PullRequest
6 голосов
/ 19 сентября 2011

Привет, я не смог найти способ конвертировать непрозрачный pkcs # 7 (p7m) в открытый текст с удаленным шрифтом, чтобы подписанный контент мог обрабатываться обычными библиотеками mime.

Мне бы хотелосьвзять файл p7m и преобразовать его в smime-сообщение с сохранением действительной подписи.

Шаги должны быть следующими:

  • извлечь подписанный контент из p7m

  • извлечение структуры cms из p7m

  • упаковка всего в новую структуру smime с отдельной подписью

Возможна ли эта операция?

Я искал руководства openssl, но не смог найти способ сделать это.

1 Ответ

1 голос
/ 04 декабря 2013

Мне удалось преобразовать непрозрачные подписанные сообщения в отдельные сообщения с помощью следующего кода:

#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/pkcs7.h>

int main(int argc, char **argv)
{
    BIO *data = NULL, *bin = NULL, *bout = NULL;
    PKCS7 *p7, *p7b;

    OpenSSL_add_all_algorithms();

    bin = BIO_new_file("opaque.p7m", "rb");
    p7 = SMIME_read_PKCS7(bin, &data);
    p7b = PKCS7_dup(p7);

    data = PKCS7_dataInit(p7, NULL);

    PKCS7_set_detached(p7b, 1);

    bout = BIO_new_file("detached.p7m", "wb");
    SMIME_write_PKCS7(bout, p7b, data, PKCS7_BINARY | SMIME_DETACHED);
}

Для тестирования программы я создаю opaque.p7m с помощью следующей команды:

$ openssl smime -sign -in foo.txt -signer my.crt -inkey my.key -nodetach -out opaque.p7m

Если говорить кратко, код выше не имеет проверок. Чтобы принять разные форматы ввода, вы можете изменить SMIME_read_PKCS7 на PEM_read_bio_PKCS7 (PEM) или d2i_PKCS7_bio (DER).

...