#ifndef _H_CS
#define _H_CS
#include "cserror.h"
#include <Security/CodeSigning.h>
#include <Security/SecCodeSigner.h>
#include <Security/SecBasePriv.h>
#include <CoreServices/../Frameworks/CarbonCore.framework/Headers/MacErrors.h>
#include <security_utilities/globalizer.h>
#include <security_utilities/seccfobject.h>
#include <security_utilities/cfclass.h>
#include <security_utilities/errors.h>
#include <security_utilities/cfutilities.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;
static inline SecCSFlags apiFlags() { return gCFObjects().flags(); }
#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 CommonError &err) { return SecKeychainErrFromOSStatus(err.osStatus()); } \
catch (const std::bad_alloc &) { return memFullErr; } \
catch (...) { return internalComponentErr; } \
return noErr;
#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 CommonError &err) { return CSError::cfError(errors, SecKeychainErrFromOSStatus(err.osStatus())); } \
catch (const std::bad_alloc &) { return CSError::cfError(errors, memFullErr); } \
catch (...) { return CSError::cfError(errors, internalComponentErr); } \
return noErr;
#define END_CSAPI1(bad) } catch (...) { 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);
gCFObjects().flags() = flags;
}
} }
#endif //_H_CS