2011-01-05 2 views
0

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

В 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; 

Любые мысли?

ответ

0

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

3

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

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

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

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

  3. Base64 декодирует тело файла PEM (outfile.pem.p7b) с декодером o е ваш выбор & сравнить двоичный выход с файлом МЭД (outfile.der.p7b)

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