我有一个 RSA 公钥加密包装器,它在桌面 Windows 和 Windows Embedded/POSReady 中运行良好。我需要将此系统移植到 Windows CE 5 和 Windows CE 3。在此系统的一部分中,我允许开发人员以多种编码导入各种加密对象,例如证书和密钥。最常用的编码是 Base64 编码的 PEM。在大多数版本的 Windows 上,很容易将编码转换为 WindowsCryptDecodeObjectEx
调用所需的二进制 (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
在 Windows CE 3 的 CryptoAPI 版本中不存在。虽然我可以取消对不太流行的编码(例如十六进制)的支持,但我真的不想在 API 的 CE 3 版本中取消对 PEM 编码的支持。
有没有人可以CryptStringToBinary
在 Windows CE 3 上运行的替代方案?使用此 API 的开发人员目前没有将 OpenSSL 作为依赖项,因此我不希望仅为此添加它。