Conversão do PEM (PKCS7) para DER - AKA BASE64 C ++ Problemas
Pergunta
Acabei de escrever um código de assinatura digital OpenSSL/PKCS7 e agora tenho um arquivo PKCS7 codificado por PEM funcionando. Então, depois de pouca batalha, preciso converter esse PEM para o formato Der. Isso está se mostrando mais difícil do que eu esperava.
Existem alguns métodos de conveniência no OpenSSL, como "PEM_WRITE_BIO_PKCS7_STREAM" para escrever seu objeto PKCS7. Mas, depois de alguns pesquisando e navegando em alguns arquivos de cabeçalho, não consigo encontrar nada para pegar um objeto PKCS7 e escrevê -lo em qualquer coisa (bio, arquivo, char*) no formato.
Então, sentindo -me derrotado por lá, voltei -me para analisar o cabeçalho e o rodapé do arquivo PEM e a Base64 decodificando o conteúdo. Como cheque, fiz isso com Java & Bouncycastle e consegui exatamente o que quero.
Aqui está o meu código para isso. Com quase todos os decodificadores Base64, eu tento, viro algo assim ...
MIIHmwYJKoZIhvcNAQcCoIIHjDCCB4gCAQExCzAJBgUrDgMCGgUAMIIBrQYJKoZI
hvcNAQc ... Lots More stuff
... +8L5ad45D/7ZGJWafaSw==
em...
0\202\233 *\367\367
\240\202\2140\202\21010 +
Aqui está esse código ...
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;
Alguma ideia?
Solução
i2d_PKCS7_fp()
e i2d_PKCS7_bio()
a partir de <openssl/pkcs7.h>
vai escrever um PKCS7
estrutura no formato Der para um fluxo de arquivos ou bio, respectivamente.
Outras dicas
Um arquivo PEM é apenas uma versão codificada base64 do arquivo Der com o -----BEGIN PKCS7-----
& -----END PKCS7-----
Linhas de cabeçalho e rodapé.
Portanto, não exatamente ao certo o que você espera ver após a base64 decodificando ...
Como um teste apenas:
Pacote um certificado no formato PKCS#7 PEM:
$ openssl crl2pkcs7 -nocrl -out outfile.pem.p7b -certfile server.crt -outform pem
Pacote o mesmo certificado no formato PKCS#7 Der:
$ openssl crl2pkcs7 -nocrl -out outfile.der.p7b -certfile server.crt -outform der
Base64 decodifique o corpo do arquivo PEM (
outfile.pem.p7b
) com o decodificador de sua escolha e compare a saída binária com o arquivo DER (outfile.der.p7b
)
Agora, receio que seja isso que você pediu, mas não o que você queria ...