#ifndef _SECURITY_SECBRIDGE_H_
#define _SECURITY_SECBRIDGE_H_
#include <security_keychain/Globals.h>
#include <security_keychain/SecCFTypes.h>
#include "SecBasePriv.h"
#include <Security/SecKeychainPriv.h>
#include <security_keychain/KCUtilities.h>
#include <security_cdsa_utilities/cssmbridge.h>
using namespace KeychainCore;
#define BEGIN_SECAPI \
OSStatus __secapiresult = errSecSuccess; \
try {
#define END_SECAPI }\
catch (const MacOSError &err) { __secapiresult=err.osStatus(); } \
catch (const CommonError &err) { __secapiresult=SecKeychainErrFromOSStatus(err.osStatus()); } \
catch (const std::bad_alloc &) { __secapiresult=errSecAllocate; } \
catch (...) { __secapiresult=errSecInternalComponent; } \
return __secapiresult;
#define END_SECAPI1(BAD_RETURN_VAL) \
} \
catch (...) \
{ \
__secapiresult=BAD_RETURN_VAL; \
} \
return __secapiresult;
#define END_SECAPI1(BAD_RETURN_VAL) }\
catch (...) { __secapiresult=BAD_RETURN_VAL; } \
return __secapiresult;
#define END_SECAPI0 }\
catch (...) { return; }
#define BEGIN_SECKCITEMAPI \
OSStatus __secapiresult=errSecSuccess; \
SecKeychainItemRef __itemImplRef=NULL; \
bool __is_certificate=(itemRef && (CFGetTypeID(itemRef) == SecCertificateGetTypeID())); \
if (__is_certificate) { \
if (SecCertificateIsItemImplInstance((SecCertificateRef)itemRef)) { \
__itemImplRef=(SecKeychainItemRef)CFRetain(itemRef); \
} else { \
__itemImplRef=(SecKeychainItemRef)SecCertificateCopyKeychainItem((SecCertificateRef)itemRef); \
if (!__itemImplRef) { \
__itemImplRef=(SecKeychainItemRef)SecCertificateCreateItemImplInstance((SecCertificateRef)itemRef); \
(void)SecCertificateSetKeychainItem((SecCertificateRef)itemRef,__itemImplRef); \
} \
} \
} else { \
__itemImplRef=(SecKeychainItemRef)((itemRef) ? CFRetain(itemRef) : NULL); \
} \
try {
#define END_SECKCITEMAPI } \
catch (const MacOSError &err) { __secapiresult=err.osStatus(); } \
catch (const CommonError &err) { __secapiresult=SecKeychainErrFromOSStatus(err.osStatus()); } \
catch (const std::bad_alloc &) { __secapiresult=errSecAllocate; } \
catch (...) { __secapiresult=errSecInternalComponent; } \
if (__itemImplRef) { CFRelease(__itemImplRef); } \
return __secapiresult;
#define BEGIN_SECCERTAPI \
OSStatus __secapiresult=errSecSuccess; \
SecCertificateRef __itemImplRef=NULL; \
if (SecCertificateIsItemImplInstance(certificate)) { __itemImplRef=(SecCertificateRef)CFRetain(certificate); } \
if (!__itemImplRef && certificate) { __itemImplRef=(SecCertificateRef)SecCertificateCopyKeychainItem(certificate); } \
if (!__itemImplRef && certificate) { __itemImplRef=SecCertificateCreateItemImplInstance(certificate); \
(void)SecCertificateSetKeychainItem(certificate,__itemImplRef); } \
try {
#define END_SECCERTAPI } \
catch (const MacOSError &err) { __secapiresult=err.osStatus(); } \
catch (const CommonError &err) { __secapiresult=SecKeychainErrFromOSStatus(err.osStatus()); } \
catch (const std::bad_alloc &) { __secapiresult=errSecAllocate; } \
catch (...) { __secapiresult=errSecInternalComponent; } \
if (__itemImplRef) { CFRelease(__itemImplRef); } \
return __secapiresult;
#define BEGIN_SECKEYAPI(resultType, resultInit) \
resultType result = resultInit; try {
extern "C" bool SecError(OSStatus status, CFErrorRef *error, CFStringRef format, ...);
#define END_SECKEYAPI }\
catch (const MacOSError &err) { SecError(err.osStatus(), error, CFSTR("%s"), err.what()); result = NULL; } \
catch (const CommonError &err) { \
if (err.osStatus() != CSSMERR_CSP_INVALID_DIGEST_ALGORITHM) { \
OSStatus status = SecKeychainErrFromOSStatus(err.osStatus()); if (status == errSecInputLengthError) status = errSecParam; \
SecError(status, error, CFSTR("%s"), err.what()); result = NULL; } \
} \
catch (const std::bad_alloc &) { SecError(errSecAllocate, error, CFSTR("allocation failed")); result = NULL; } \
catch (...) { SecError(errSecInternalComponent, error, CFSTR("internal error")); result = NULL; } \
return result;
#endif