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