root/compat/apple-common-crypto.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. git_CC_EVP_EncodeBlock
  2. git_CC_EVP_DecodeBlock

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

/* [<][>][^][v][top][bottom][index][help] */