2012-05-16 34 views
3

我有一个RSA公钥密码包装器,它在桌面Windows和Windows Embedded/POSReady中运行得非常好。我需要将此系统移植到Windows CE 5和Windows CE 3.在该系统的一部分中,我允许开发人员以多种编码导入各种加密对象,如证书和密钥。最常用的编码是Base64编码的PEM。在大多数Windows版本,很容易编码转换为Windows需要为CryptDecodeObjectEx调用二进制(DER)格式:在Windows CE 3上将PEM转换为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的存在。虽然我可以取消对不太受欢迎的编码(如十六进制)的支持,但我真的不想在CE 3版本的API中删除对PEM编码的支持。

有没有人有CryptStringToBinary替代方案可以在Windows CE 3上工作?使用此API的开发人员目前不具有OpenSSL作为依赖项,所以我不希望仅为此添加它。

回答

0

嗯 - PEM只是base64编码DER。所以如果这是你唯一需要转换的地方;我只是放弃了API的细微处理;剥离以' - '开头的空行或行;和base64解码之间的任何东西。结果是你后面的DER。 WindowsCE3具有Base64的Encode/Decodeter类型;如果由于某种原因,你不想/不想使用它 - How do I base64 encode (decode) in C?http://www.adp-gmbh.ch/cpp/common/base64.html是相当平凡的“原始”版本。