git/compat/apple-common-crypto.h
Kazuki Yamaguchi 1ed2c7b115 imap-send: use HMAC() function provided by OpenSSL
Fix compile errors with OpenSSL 1.1.0.

HMAC_CTX is made opaque and HMAC_CTX_cleanup is removed in OpenSSL
1.1.0. But since we just want to calculate one HMAC, we can use HMAC()
here, which exists since OpenSSL 0.9.6 at least.

Signed-off-by: Kazuki Yamaguchi <k@rhe.jp>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-04-08 11:45:47 -07:00

97 lines
2.7 KiB
C

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