デスクトップWindowsおよびWindowsEmbedded/POSReadyで非常にうまく機能するRSA公開鍵暗号ラッパーがあります。このシステムをWindowsCE5とWindowsCE3の両方に移植する必要があります。このシステムの一部では、開発者が証明書やキーなどのさまざまな暗号オブジェクトをいくつかのエンコーディングでインポートできるようにします。最も一般的に使用されるエンコーディングは、Base64でエンコードされたPEMです。Windowsのほとんどのバージョンでは、WindowsがCryptDecodeObjectEx
呼び出しに必要なバイナリ(DER)形式にエンコーディングを簡単に変換できます。
bool MyClass::externalToBinary( const DATA_BLOB &in, DATA_BLOB &outDER )
{
DWORD flags;
// This call determines the format and how much memory is needed in outDER
if ( ::CryptStringToBinaryA( reinterpret_cast<char *>(in.pbData), in.cbData, CRYPT_STRING_ANY, NULL, &outDER.cbData, NULL, &flags ) == false &&
::CryptStringToBinaryA( reinterpret_cast<char *>(in.pbData), in.cbData, CRYPT_STRING_HEX_ANY, NULL, &outDER.cbData, NULL, &flags ) == false )
{
// Log errors here using ::GetLastError();
return false;
}
if ( ( outDER.pbData = new unsigned char[outDER.cbData] ) == NULL )
{
// Log errors here using ::GetLastError();
return false;
}
return ( ::CryptStringToBinaryA( reinterpret_cast<char *>(in.pbData), in.cbData, flags, outDER.pbData, &outDER.cbData, NULL, NULL ) != FALSE );
} // end externalToBinary
残念ながら、CryptStringToBinary
WindowsCE3のバージョンのCryptoAPIには存在しません。あまり人気のないエンコーディング(16進数など)のサポートを廃止することはできますが、CE3バージョンのAPIでのPEMエンコーディングのサポートを削除したくありません。
誰かがCryptStringToBinary
WindowsCE3で動作する代替手段を持っていますか?このAPIを使用している開発者は、現在OpenSSLを依存関係として持っていないため、これだけのために追加したくありません。