Skip to content

Commit

Permalink
imap-send: use Apple's Security framework for base64 encoding
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
jeremyhu authored and gitster committed Jul 30, 2013
1 parent be4c828 commit 3ef2bca
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 14 deletions.
1 change: 1 addition & 0 deletions Makefile
Expand Up @@ -1398,6 +1398,7 @@ ifdef PPC_SHA1
LIB_H += ppc/sha1.h LIB_H += ppc/sha1.h
else else
ifdef APPLE_COMMON_CRYPTO ifdef APPLE_COMMON_CRYPTO
LIB_4_CRYPTO += -framework Security -framework CoreFoundation
COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL
SHA1_HEADER = <CommonCrypto/CommonDigest.h> SHA1_HEADER = <CommonCrypto/CommonDigest.h>
else else
Expand Down
86 changes: 86 additions & 0 deletions compat/apple-common-crypto.h
@@ -0,0 +1,86 @@
/* 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 */
11 changes: 11 additions & 0 deletions git-compat-util.h
Expand Up @@ -127,6 +127,17 @@
#else #else
#include <poll.h> #include <poll.h>
#endif #endif

#ifndef NO_OPENSSL
#ifdef APPLE_COMMON_CRYPTO
#include "compat/apple-common-crypto.h"
#else
#include <openssl/evp.h>
#include <openssl/hmac.h>
#endif /* APPLE_COMMON_CRYPTO */
#include <openssl/x509v3.h>
#endif /* NO_OPENSSL */

#if defined(__MINGW32__) #if defined(__MINGW32__)
/* pull in Windows compatibility stuff */ /* pull in Windows compatibility stuff */
#include "compat/mingw.h" #include "compat/mingw.h"
Expand Down
14 changes: 0 additions & 14 deletions imap-send.c
Expand Up @@ -28,20 +28,6 @@
#include "prompt.h" #include "prompt.h"
#ifdef NO_OPENSSL #ifdef NO_OPENSSL
typedef void *SSL; typedef void *SSL;
#else
#ifdef APPLE_COMMON_CRYPTO
#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
#else
#include <openssl/evp.h>
#include <openssl/hmac.h>
#endif
#include <openssl/x509v3.h>
#endif #endif


static const char imap_send_usage[] = "git imap-send < <mbox>"; static const char imap_send_usage[] = "git imap-send < <mbox>";
Expand Down

0 comments on commit 3ef2bca

Please sign in to comment.