]> git.ipfire.org Git - thirdparty/git.git/blame - compat/apple-common-crypto.h
Merge branch 'jk/more-push-completion'
[thirdparty/git.git] / compat / apple-common-crypto.h
CommitLineData
3ef2bcad
JH
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#ifdef APPLE_LION_OR_NEWER
20#define git_CC_error_check(pattern, err) \
21 do { \
22 if (err) { \
23 die(pattern, (long)CFErrorGetCode(err)); \
24 } \
25 } while(0)
26
27#define EVP_EncodeBlock git_CC_EVP_EncodeBlock
28static inline int git_CC_EVP_EncodeBlock(unsigned char *out,
29 const unsigned char *in, int inlen)
30{
31 CFErrorRef err;
32 SecTransformRef encoder;
33 CFDataRef input, output;
34 CFIndex length;
35
36 encoder = SecEncodeTransformCreate(kSecBase64Encoding, &err);
37 git_CC_error_check("SecEncodeTransformCreate failed: %ld", err);
38
39 input = CFDataCreate(kCFAllocatorDefault, in, inlen);
40 SecTransformSetAttribute(encoder, kSecTransformInputAttributeName,
41 input, &err);
42 git_CC_error_check("SecTransformSetAttribute failed: %ld", err);
43
44 output = SecTransformExecute(encoder, &err);
45 git_CC_error_check("SecTransformExecute failed: %ld", err);
46
47 length = CFDataGetLength(output);
48 CFDataGetBytes(output, CFRangeMake(0, length), out);
49
50 CFRelease(output);
51 CFRelease(input);
52 CFRelease(encoder);
53
54 return (int)strlen((const char *)out);
55}
56
57#define EVP_DecodeBlock git_CC_EVP_DecodeBlock
58static int inline git_CC_EVP_DecodeBlock(unsigned char *out,
59 const unsigned char *in, int inlen)
60{
61 CFErrorRef err;
62 SecTransformRef decoder;
63 CFDataRef input, output;
64 CFIndex length;
65
66 decoder = SecDecodeTransformCreate(kSecBase64Encoding, &err);
67 git_CC_error_check("SecEncodeTransformCreate failed: %ld", err);
68
69 input = CFDataCreate(kCFAllocatorDefault, in, inlen);
70 SecTransformSetAttribute(decoder, kSecTransformInputAttributeName,
71 input, &err);
72 git_CC_error_check("SecTransformSetAttribute failed: %ld", err);
73
74 output = SecTransformExecute(decoder, &err);
75 git_CC_error_check("SecTransformExecute failed: %ld", err);
76
77 length = CFDataGetLength(output);
78 CFDataGetBytes(output, CFRangeMake(0, length), out);
79
80 CFRelease(output);
81 CFRelease(input);
82 CFRelease(decoder);
83
84 return (int)strlen((const char *)out);
85}
86#endif /* APPLE_LION_OR_NEWER */