You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.7 KiB
96 lines
2.7 KiB
/* 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 */
|
|
|