compat / apple-common-crypto.hon commit Merge branch 'rs/fsck-obj-leakfix' into maint (c3b931e)
   1/* suppress inclusion of conflicting openssl functions */
   2#define OPENSSL_NO_MD5
   3#define HEADER_HMAC_H
   4#define HEADER_SHA_H
   5#include <CommonCrypto/CommonHMAC.h>
   6#define EVP_md5(...) kCCHmacAlgMD5
   7/* CCHmac doesn't take md_len and the return type is void */
   8#define HMAC git_CC_HMAC
   9static inline unsigned char *git_CC_HMAC(CCHmacAlgorithm alg,
  10                const void *key, int key_len,
  11                const unsigned char *data, size_t data_len,
  12                unsigned char *md, unsigned int *md_len)
  13{
  14        CCHmac(alg, key, key_len, data, data_len, md);
  15        return md;
  16}
  17
  18#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
  19#define APPLE_LION_OR_NEWER
  20#include <Security/Security.h>
  21/* Apple's TYPE_BOOL conflicts with config.c */
  22#undef TYPE_BOOL
  23#endif
  24
  25#ifndef SHA1_MAX_BLOCK_SIZE
  26#error Using Apple Common Crypto library requires setting SHA1_MAX_BLOCK_SIZE
  27#endif
  28
  29#ifdef APPLE_LION_OR_NEWER
  30#define git_CC_error_check(pattern, err) \
  31        do { \
  32                if (err) { \
  33                        die(pattern, (long)CFErrorGetCode(err)); \
  34                } \
  35        } while(0)
  36
  37#define EVP_EncodeBlock git_CC_EVP_EncodeBlock
  38static inline int git_CC_EVP_EncodeBlock(unsigned char *out,
  39                const unsigned char *in, int inlen)
  40{
  41        CFErrorRef err;
  42        SecTransformRef encoder;
  43        CFDataRef input, output;
  44        CFIndex length;
  45
  46        encoder = SecEncodeTransformCreate(kSecBase64Encoding, &err);
  47        git_CC_error_check("SecEncodeTransformCreate failed: %ld", err);
  48
  49        input = CFDataCreate(kCFAllocatorDefault, in, inlen);
  50        SecTransformSetAttribute(encoder, kSecTransformInputAttributeName,
  51                        input, &err);
  52        git_CC_error_check("SecTransformSetAttribute failed: %ld", err);
  53
  54        output = SecTransformExecute(encoder, &err);
  55        git_CC_error_check("SecTransformExecute failed: %ld", err);
  56
  57        length = CFDataGetLength(output);
  58        CFDataGetBytes(output, CFRangeMake(0, length), out);
  59
  60        CFRelease(output);
  61        CFRelease(input);
  62        CFRelease(encoder);
  63
  64        return (int)strlen((const char *)out);
  65}
  66
  67#define EVP_DecodeBlock git_CC_EVP_DecodeBlock
  68static int inline git_CC_EVP_DecodeBlock(unsigned char *out,
  69                const unsigned char *in, int inlen)
  70{
  71        CFErrorRef err;
  72        SecTransformRef decoder;
  73        CFDataRef input, output;
  74        CFIndex length;
  75
  76        decoder = SecDecodeTransformCreate(kSecBase64Encoding, &err);
  77        git_CC_error_check("SecEncodeTransformCreate failed: %ld", err);
  78
  79        input = CFDataCreate(kCFAllocatorDefault, in, inlen);
  80        SecTransformSetAttribute(decoder, kSecTransformInputAttributeName,
  81                        input, &err);
  82        git_CC_error_check("SecTransformSetAttribute failed: %ld", err);
  83
  84        output = SecTransformExecute(decoder, &err);
  85        git_CC_error_check("SecTransformExecute failed: %ld", err);
  86
  87        length = CFDataGetLength(output);
  88        CFDataGetBytes(output, CFRangeMake(0, length), out);
  89
  90        CFRelease(output);
  91        CFRelease(input);
  92        CFRelease(decoder);
  93
  94        return (int)strlen((const char *)out);
  95}
  96#endif /* APPLE_LION_OR_NEWER */