Я только что закончил писать код цифровой подписи 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;
Любые мысли?