compat / apple-common-crypto.hon commit Merge branch 'ky/branch-m-worktree' (741a694)
   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 HMAC_CTX CCHmacContext
   7#define HMAC_Init(hmac, key, len, algo) CCHmacInit(hmac, algo, key, len)
   8#define HMAC_Update CCHmacUpdate
   9#define HMAC_Final(hmac, hash, ptr) CCHmacFinal(hmac, hash)
  10#define HMAC_CTX_cleanup(ignore)
  11#define EVP_md5(...) kCCHmacAlgMD5
  12#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
  13#define APPLE_LION_OR_NEWER
  14#include <Security/Security.h>
  15/* Apple's TYPE_BOOL conflicts with config.c */
  16#undef TYPE_BOOL
  17#endif
  18
  19#ifndef SHA1_MAX_BLOCK_SIZE
  20#error Using Apple Common Crypto library requires setting SHA1_MAX_BLOCK_SIZE
  21#endif
  22
  23#ifdef APPLE_LION_OR_NEWER
  24#define git_CC_error_check(pattern, err) \
  25        do { \
  26                if (err) { \
  27                        die(pattern, (long)CFErrorGetCode(err)); \
  28                } \
  29        } while(0)
  30
  31#define EVP_EncodeBlock git_CC_EVP_EncodeBlock
  32static inline int git_CC_EVP_EncodeBlock(unsigned char *out,
  33                const unsigned char *in, int inlen)
  34{
  35        CFErrorRef err;
  36        SecTransformRef encoder;
  37        CFDataRef input, output;
  38        CFIndex length;
  39
  40        encoder = SecEncodeTransformCreate(kSecBase64Encoding, &err);
  41        git_CC_error_check("SecEncodeTransformCreate failed: %ld", err);
  42
  43        input = CFDataCreate(kCFAllocatorDefault, in, inlen);
  44        SecTransformSetAttribute(encoder, kSecTransformInputAttributeName,
  45                        input, &err);
  46        git_CC_error_check("SecTransformSetAttribute failed: %ld", err);
  47
  48        output = SecTransformExecute(encoder, &err);
  49        git_CC_error_check("SecTransformExecute failed: %ld", err);
  50
  51        length = CFDataGetLength(output);
  52        CFDataGetBytes(output, CFRangeMake(0, length), out);
  53
  54        CFRelease(output);
  55        CFRelease(input);
  56        CFRelease(encoder);
  57
  58        return (int)strlen((const char *)out);
  59}
  60
  61#define EVP_DecodeBlock git_CC_EVP_DecodeBlock
  62static int inline git_CC_EVP_DecodeBlock(unsigned char *out,
  63                const unsigned char *in, int inlen)
  64{
  65        CFErrorRef err;
  66        SecTransformRef decoder;
  67        CFDataRef input, output;
  68        CFIndex length;
  69
  70        decoder = SecDecodeTransformCreate(kSecBase64Encoding, &err);
  71        git_CC_error_check("SecEncodeTransformCreate failed: %ld", err);
  72
  73        input = CFDataCreate(kCFAllocatorDefault, in, inlen);
  74        SecTransformSetAttribute(decoder, kSecTransformInputAttributeName,
  75                        input, &err);
  76        git_CC_error_check("SecTransformSetAttribute failed: %ld", err);
  77
  78        output = SecTransformExecute(decoder, &err);
  79        git_CC_error_check("SecTransformExecute failed: %ld", err);
  80
  81        length = CFDataGetLength(output);
  82        CFDataGetBytes(output, CFRangeMake(0, length), out);
  83
  84        CFRelease(output);
  85        CFRelease(input);
  86        CFRelease(decoder);
  87
  88        return (int)strlen((const char *)out);
  89}
  90#endif /* APPLE_LION_OR_NEWER */