OpenSSL / PKCS7デジタル署名コードの記述が完了し、PEMでエンコードされたPKCS7ファイルが機能するようになりました。少しの戦いの後、私はそのPEMをDER形式に変換する必要があります。これは私が思っていたよりも難しいことを証明しています。
OpenSSLには、PKCS7オブジェクトを書き込むための「PEM_write_bio_PKCS7_stream」などの便利なメソッドがいくつかあります。しかし、いくつかの大規模なグーグルといくつかのヘッダーファイルを参照した後、PKCS7オブジェクトを取得してDER形式で何か(BIO、FILE、char *)に書き込むものが見つからないようです。
そこで敗北したと感じたので、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;
何かご意見は?