#ifndef _H_CS
#define _H_CS
#include "cserror.h"
#include "codesigning_dtrace.h"
#include <Security/CSCommonPriv.h>
#include <Security/SecCodePriv.h>
#include <Security/SecStaticCodePriv.h>
#include <Security/SecRequirementPriv.h>
#include <Security/SecCodeSigner.h>
#include <Security/SecBasePriv.h>
#include <security_utilities/globalizer.h>
#include <security_utilities/seccfobject.h>
#include <security_utilities/cfclass.h>
#include <security_utilities/errors.h>
#include <security_utilities/sqlite++.h>
#include <security_utilities/cfutilities.h>
#include <security_utilities/logging.h>
namespace Security {
namespace CodeSigning {
struct PerThread {
SecCSFlags flags; };
struct CFObjects {
CFObjects();
CFClass Code;
CFClass StaticCode;
CFClass Requirement;
CFClass CodeSigner;
ThreadNexus<PerThread> perThread;
SecCSFlags &flags() { return perThread().flags; }
};
extern ModuleNexus<CFObjects> gCFObjects;
OSStatus dbError(const SQLite3::Error &err);
#if TARGET_OS_IPHONE
#define SecKeychainErrFromOSStatus(status) (status)
#endif
#define BEGIN_CSAPI \
try {
#define END_CSAPI \
} \
catch (const UnixError &err) { \
switch (err.error) { \
case ENOEXEC: return errSecCSBadObjectFormat; \
default: return err.osStatus(); \
}} \
catch (const MacOSError &err) { return err.osStatus(); } \
catch (const SQLite3::Error &err) { return dbError(err); } \
catch (const CommonError &err) { return SecKeychainErrFromOSStatus(err.osStatus()); } \
catch (const std::bad_alloc &) { return errSecAllocate; } \
catch (...) { Syslog::notice("unknown exception in CSAPI"); return errSecCSInternalError; } \
return errSecSuccess;
#define END_CSAPI_ERRORS \
} \
catch (const CSError &err) { return err.cfError(errors); } \
catch (const UnixError &err) { \
switch (err.error) { \
case ENOEXEC: return CSError::cfError(errors, errSecCSBadObjectFormat); \
default: return CSError::cfError(errors, err.osStatus()); \
}} \
catch (const MacOSError &err) { return CSError::cfError(errors, err.osStatus()); } \
catch (const SQLite3::Error &err) { return CSError::cfError(errors, dbError(err)); } \
catch (const CommonError &err) { return CSError::cfError(errors, SecKeychainErrFromOSStatus(err.osStatus())); } \
catch (const std::bad_alloc &) { return CSError::cfError(errors, errSecAllocate); } \
catch (...) { Syslog::notice("unknown exception in CSAPI"); return CSError::cfError(errors, errSecCSInternalError); } \
return errSecSuccess;
#define END_CSAPI1(bad) } catch (...) { return bad; }
#define END_CSAPI_ERRORS1(bad) \
} \
catch (const CSError &err) { err.cfError(errors); } \
catch (const UnixError &err) { \
switch (err.error) { \
case ENOEXEC: CSError::cfError(errors, errSecCSBadObjectFormat); \
default: CSError::cfError(errors, err.osStatus()); \
}} \
catch (const MacOSError &err) { CSError::cfError(errors, err.osStatus()); } \
catch (const SQLite3::Error &err) { CSError::cfError(errors, dbError(err)); } \
catch (const CommonError &err) { CSError::cfError(errors, SecKeychainErrFromOSStatus(err.osStatus())); } \
catch (const std::bad_alloc &) { CSError::cfError(errors, errSecAllocate); } \
catch (...) { Syslog::notice("unknown exception in CSAPI"); CSError::cfError(errors, errSecCSInternalError); } \
return bad;
template <class T>
static inline T &Required(T *ptr)
{
if (ptr == NULL)
MacOSError::throwMe(errSecCSObjectRequired);
return *ptr;
}
static inline void Required(const void *ptr)
{
if (ptr == NULL)
MacOSError::throwMe(errSecCSObjectRequired);
}
static inline void checkFlags(SecCSFlags flags, SecCSFlags acceptable = 0)
{
if (flags & ~acceptable)
MacOSError::throwMe(errSecCSInvalidFlags);
}
#define DTRACK(_prefix, _obj, _args...) \
if (_prefix ## _START_ENABLED()) _prefix ## _START((_obj), ## _args); \
struct _DTFrame ## _prefix { void *me; \
_DTFrame ## _prefix(void *m) : me(m) { } \
~_DTFrame ## _prefix() { _prefix ## _END(me); } \
} _dtframe##_prefix((_obj));
} }
#endif //_H_CS