|  | /* 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 */ |