Use Apple's supported functions for base64 encoding instead of the deprecated OpenSSL functions. Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com> Signed-off-by: David Aguilar <davvid@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
		
			
				
	
	
		
			87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.5 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 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 */
 |