/* suppress inclusion of conflicting openssl functions */ #define OPENSSL_NO_MD5 #define HEADER_HMAC_H #define HEADER_SHA_H #include <CommonCrypto/CommonHMAC.h> #define EVP_md5(...) kCCHmacAlgMD5 /* CCHmac doesn't take md_len and the return type is void */ #define HMAC git_CC_HMAC static inline unsigned char *git_CC_HMAC(CCHmacAlgorithm alg, const void *key, int key_len, const unsigned char *data, size_t data_len, unsigned char *md, unsigned int *md_len) { CCHmac(alg, key, key_len, data, data_len, md); return md; } #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070 #define APPLE_LION_OR_NEWER #include <Security/Security.h> /* Apple's TYPE_BOOL conflicts with config.c */ #undef TYPE_BOOL #endif #ifndef SHA1_MAX_BLOCK_SIZE #error Using Apple Common Crypto library requires setting SHA1_MAX_BLOCK_SIZE #endif #ifdef APPLE_LION_OR_NEWER #define git_CC_error_check(pattern, err) \ do { \ if (err) { \ die(pattern, (long)CFErrorGetCode(err)); \ } \ } while(0) #define EVP_EncodeBlock git_CC_EVP_EncodeBlock static inline int git_CC_EVP_EncodeBlock(unsigned char *out, const unsigned char *in, int inlen) { CFErrorRef err; SecTransformRef encoder; CFDataRef input, output; CFIndex length; encoder = SecEncodeTransformCreate(kSecBase64Encoding, &err); git_CC_error_check("SecEncodeTransformCreate failed: %ld", err); input = CFDataCreate(kCFAllocatorDefault, in, inlen); SecTransformSetAttribute(encoder, kSecTransformInputAttributeName, input, &err); git_CC_error_check("SecTransformSetAttribute failed: %ld", err); output = SecTransformExecute(encoder, &err); git_CC_error_check("SecTransformExecute failed: %ld", err); length = CFDataGetLength(output); CFDataGetBytes(output, CFRangeMake(0, length), out); CFRelease(output); CFRelease(input); CFRelease(encoder); return (int)strlen((const char *)out); } #define EVP_DecodeBlock git_CC_EVP_DecodeBlock static int inline git_CC_EVP_DecodeBlock(unsigned char *out, const unsigned char *in, int inlen) { CFErrorRef err; SecTransformRef decoder; CFDataRef input, output; CFIndex length; decoder = SecDecodeTransformCreate(kSecBase64Encoding, &err); git_CC_error_check("SecEncodeTransformCreate failed: %ld", err); input = CFDataCreate(kCFAllocatorDefault, in, inlen); SecTransformSetAttribute(decoder, kSecTransformInputAttributeName, input, &err); git_CC_error_check("SecTransformSetAttribute failed: %ld", err); output = SecTransformExecute(decoder, &err); git_CC_error_check("SecTransformExecute failed: %ld", err); length = CFDataGetLength(output); CFDataGetBytes(output, CFRangeMake(0, length), out); CFRelease(output); CFRelease(input); CFRelease(decoder); return (int)strlen((const char *)out); } #endif /* APPLE_LION_OR_NEWER */