Преобразование PEM (PKCS7) в DER - AKA Base64 C ++ Проблемы - PullRequest
0 голосов
/ 05 января 2011

Я только что закончил писать код цифровой подписи OpenSSL / PKCS7 и теперь у меня есть рабочий файл PKCS7 в кодировке PEM.Поэтому после небольшой битвы мне нужно преобразовать этот PEM в формат DER.Это оказалось сложнее, чем я ожидал.

В OpenSSL есть несколько удобных методов, таких как "PEM_write_bio_PKCS7_stream", для написания вашего объекта PKCS7.Но после продолжительного поиска в гугле и просмотра некоторых заголовочных файлов, я не могу найти что-либо, чтобы взять объект PKCS7 и записать его во что-либо (BIO, FILE, char *) в формате DER.

Так что чувство поражениятам я обратился к разбору верхнего и нижнего колонтитула в файле PEM и Base64, декодирующему содержимое.В качестве проверки я сделал это с Java & BouncyCastle и получил именно то, что хочу.

Вот мой код для этого.Почти с каждым декодером Base64 я пытаюсь превратить что-то вроде этого ...

MIIHmwYJKoZIhvcNAQcCoIIHjDCCB4gCAQExCzAJBgUrDgMCGgUAMIIBrQYJKoZI
hvcNAQc ... Lots More stuff
... +8L5ad45D/7ZGJWafaSw==

в ...

0\202\233   *\367\367
\240\202\2140\202\21010 +

Вот этот код ...

    string PKCS7String(starting_point);

    string PEM_PKCS7_HEADER("-----BEGIN PKCS7-----\n");
    string PEM_PKCS7_FOOTER("\n-----END PKCS7-----");

    string::size_type pos = 0;
    while ( (pos = PKCS7String.find(PEM_PKCS7_HEADER, pos)) != string::npos ) {
        PKCS7String.replace( pos, PEM_PKCS7_HEADER.length(), "" );
        pos++;
    }

    pos = 0;
    while ( (pos = PKCS7String.find(PEM_PKCS7_FOOTER, pos)) != string::npos ) {
        PKCS7String.replace( pos, PEM_PKCS7_FOOTER.length(), "" );
        pos++;
    }
    //Take your pick of decoders, they all do the same thing. Here's just the most recent
    auto_ptr< uint8_t > decoded = decode(PKCS7String);
    uint8_t* array = decoded.get();
    cout << array << endl;

Есть мысли?

Ответы [ 2 ]

3 голосов
/ 05 января 2011

Файл PEM является просто версией файла DER в кодировке Base64 с линиями верхнего и нижнего колонтитула -----BEGIN PKCS7----- & -----END PKCS7-----.
Так что не совсем уверен, что вы ожидаете увидеть после декодирования Base64 ...

В качестве теста просто:

  1. упаковка сертификата в формате PCS PKCS # 7: $ openssl crl2pkcs7 -nocrl -out outfile.pem.p7b -certfile server.crt -outform pem

  2. упаковать тот же сертификат в формате DER PKCS # 7: $ openssl crl2pkcs7 -nocrl -out outfile.der.p7b -certfile server.crt -outform der

  3. Base64 декодирует тело файла PEM (outfile.pem.p7b) с помощью выбранного вами декодера и сравнивает двоичный вывод с файлом DER (outfile.der.p7b)

Теперь, боюсь, это может быть то, что вы просили, но не то, что вы хотели ...

0 голосов
/ 05 января 2011

i2d_PKCS7_fp() и i2d_PKCS7_bio() из <openssl/pkcs7.h> запишут структуру PKCS7 в формате DER в файловый поток или BIO соответственно.

...