| /* suppress inclusion of conflicting openssl functions */ |
| #define OPENSSL_NO_MD5 |
| #define HEADER_HMAC_H |
| #define HEADER_SHA_H |
| #include <CommonCrypto/CommonHMAC.h> |
| #define HMAC_CTX CCHmacContext |
| #define HMAC_Init(hmac, key, len, algo) CCHmacInit(hmac, algo, key, len) |
| #define HMAC_Update CCHmacUpdate |
| #define HMAC_Final(hmac, hash, ptr) CCHmacFinal(hmac, hash) |
| #define HMAC_CTX_cleanup(ignore) |
| #define EVP_md5(...) kCCHmacAlgMD5 |
| #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 |
| |
| #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 */ |