OS X CommonCrypto是否为OpenSSL EVP_ *调用提供了兼容模式(就像OpenSSL MD5函数一样)?

时间:2012-08-29 01:00:05

标签: c macos openssl commoncrypto

在Mac OS X10.7上编译我的一个源文件并获取这些弃用警告:

xxx_evp.c:135:5: 'EVP_MD_CTX_init' is deprecated
xxx_evp.c:137:9: 'EVP_DigestInit_ex' is deprecated
xxx_evp.c:177:9: 'EVP_DigestUpdate' is deprecated
xxx_evp.c:227:13: 'EVP_DigestFinal_ex' is deprecated
xxx_evp.c:235:5: 'EVP_MD_CTX_cleanup' is deprecated

我有另一组OpenSSL弃用警告,其中我使用openssl/md5.h的MD5函数,并且能够切换到OpenSSL调用的CommonCrypto版本,如下所示:

#if defined(__APPLE__)
#  define COMMON_DIGEST_FOR_OPENSSL
#  include <CommonCrypto/CommonDigest.h>
#else
#  include <openssl/md5.h>
#endif

但我无法发现与这些EVP_*调用相关的任何类型的OpenSSL兼容性。是否有类似的东西可以在OS X 10.7上为这些OpenSSL EVP_*调用获得“免费”兼容性支持?

2 个答案:

答案 0 :(得分:1)

我查看了/usr/include/CommonCrypto/中的CommonCrypto头文件,唯一注意到任何OpenSSL兼容性的文件是CommonDigest.h。如果在此头文件包含在您的代码之前定义了#define符号COMMON_DIGEST_FOR_OPENSSL,则以下类的OpenSSL函数将映射到其CommonCrypto等效项:

  • MD2_xxxMD4_xxxMD5_xxx
  • SHA_xxxSHA1_xxxSHA224_xxxSHA256_xxxSHA384_xxxSHA512_xxx

OpenSSL EVP_xxx函数似乎没有任何此类映射,至少作为CommonCrypto的一部分提供。

答案 1 :(得分:0)

如果您使用任何MD或SHA哈希,则可以通过在包含CommonDigest.h之前定义COMMON_DIGEST_FOR_OPENSSL来实现OpenSSL兼容性。所以这一切都取决于EVP_DigestInit_ex()函数调用的第二个参数。例如,使用SHA1和6“EVP _...”调用的Mac App Store签名代码可以替换为以下代码:

#define COMMON_DIGEST_FOR_OPENSSL
#include <CommonCrypto/CommonDigest.h>

    unsigned char digest[CC_SHA1_DIGEST_LENGTH];
    if (CC_SHA1([input bytes], [input length], digest)) {
        NSData *newHash = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];
    }