mirror of
https://github.com/git/git.git
synced 2024-11-29 04:54:56 +08:00
imap-send: use Apple's Security framework for base64 encoding
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>
This commit is contained in:
parent
be4c828b76
commit
3ef2bcad02
1
Makefile
1
Makefile
@ -1398,6 +1398,7 @@ ifdef PPC_SHA1
|
||||
LIB_H += ppc/sha1.h
|
||||
else
|
||||
ifdef APPLE_COMMON_CRYPTO
|
||||
LIB_4_CRYPTO += -framework Security -framework CoreFoundation
|
||||
COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL
|
||||
SHA1_HEADER = <CommonCrypto/CommonDigest.h>
|
||||
else
|
||||
|
86
compat/apple-common-crypto.h
Normal file
86
compat/apple-common-crypto.h
Normal file
@ -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 */
|
@ -127,6 +127,17 @@
|
||||
#else
|
||||
#include <poll.h>
|
||||
#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__)
|
||||
/* pull in Windows compatibility stuff */
|
||||
#include "compat/mingw.h"
|
||||
|
14
imap-send.c
14
imap-send.c
@ -28,20 +28,6 @@
|
||||
#include "prompt.h"
|
||||
#ifdef NO_OPENSSL
|
||||
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
|
||||
|
||||
static const char imap_send_usage[] = "git imap-send < <mbox>";
|
||||
|
Loading…
Reference in New Issue
Block a user