#ifndef _UTILITIES_SECMETA_H_
#define _UTILITIES_SECMETA_H_
#include <CoreFoundation/CoreFoundation.h>
#define SecInline static inline
#define SecDisableLogging() do { _secOptions = _SecClearMask(_secOptions, mask); } while(0)
#define SecFlags(...) _SecFlags(0, __VA_ARGS__)
#define SecSetLogLevel(level) _SecSetLogLevel(&secOptions, (level));
#define SecAction(flags, key, action,...) \
if (_SecLogLevel(flags)) { _SecSetLogLevel(&_secFlags, _SecLogLevel(flags)); } \
if (_SecSetFlags(flags) \
if ((_secFlags | flags) & kSecTraceAction) {} \
if ((_secFlags | flags) & kSecLogEveryActionFlag) { \
if (flags & kSecLogLevelMask) { \
} \
} \
#define SecTry(result,flags,humanReadableFunctionNameForLogs) switch (0) case 0: { \
__typeof__(result) _secResult = result; \
__typeof__(flags) _secFlags = flags; \
__typeof__(format) _secName = humanReadableFunctionNameForLogs; \
CFErrorRef _secError = NULL; \
CFMutableArrayRef _secChain = NULL; \
CFMutableStringRef _secActions = NULL; \
CFMutableDictionaryRef _secFormatOptions = NULL; \
SecAction(_secFlags, CFSTR("entered"));
#define SecEnableFlags(&_secFlags, flags) _secFlags = (flags);
#define SecDisableFlags(&_secFlags, flags) _secFlags = (flags);
#define SecSetFlags(flags) _SecSetFlags(&_secFlags, flags)
#define SecCatch(result, flags, error, ...) } _SecCatch(&_secResult, &_secFlags, &_secName, &_secError, &_secChain, &_secActions, result, flags, error,__VA_ARGS__)
#define SecFinally(result, flags, error, ...) _SecFinally(&_secResult, &_secFlags, &_secName, &_secError, &_secChain, &_secActions, result, flags, error, __VA_ARGS__)
#define SecOk(result, flags, format, ...) _SecOK()
#if DEBUG
#define SecDebugAction(flags, action...) SecAction(flags, action...)
#else
#define SecDebugAction(flags, action,...)
#endif
#define SecThrow(result, domain, flags, body, format...) { rtype _r = body(); __security_trace_return_api(__FUNCTION__, format, _r); return _r; }
#define SecEnd(rtype, body, error, format...) { rtype _r = body(); __security_trace_return_api(__FUNCTION__, format, _r); return _r; }
#define _SecClearMask(flags, mask) (((flags) | (mask)) ^ (mask))
#define _SecLogLevel(level) (((level) << 0) & kSecLogLevelMask)
#define _SecLogStyle(style) (((style) << 4) & kSecLogStyleMask)
__BEGIN_DECLS
enum SecFlagEnum {
kSecNoFlag = 0, kSecLogLevelMask = (15 << 0),
kSecFirstLogLevel = _SecLogLevel(1), kSecDebugLogLevel = _SecLogLevel(1), kSecInfoLogLevel = _SecLogLevel(2), kSecNoticeLogLevel = _SecLogLevel(3), kSecWarningLogLevel = _SecLogLevel(4), kSecErrorLogLevel = _SecLogLevel(5), kSecCriticalLogLevel = _SecLogLevel(6), kSecAlertLogLevel = _SecLogLevel(7), kSecLastLogLevel = _SecLogLevel(15),
kSecLogStyleMask = ( 0x30), kSecLogPlainStyle = _SecLogStyle(0), kSecLogFunctionStyle = _SecLogStyle(1), kSecLogPrettyFuncStyle=_SecLogStyle(2), kSecLogNameStyle = _SecLogStyle(3),
kSecFlagMask = ( 0xFFC0), kSecFirstFlag = ( 1 << 6),
kSecTraceFlag = ( 1 << 6), kSecChainFlag = ( 1 << 7), kSecFlagAssert = ( 1 << 8), kSecSafeModeFlag = ( 1 << 9), kSecClearPendingFlag = ( 1 << 10), kSecLogDisabledFlag = ( 1 << 11), kSecLogAlwaysFlag = ( 1 << 12), kSecLogEveryActionFlag = ( 1 << 13), kSecReservedFlag = ( 1 << 14), kSecLastFlag = ( 1 << 15),
kSecActionsMask = (15 << 16), kSecLowerLogLevelAction = ( 1 << 16), kSecTraceAction = ( 1 << 17), kSecReserved3Action = ( 1 << 18), kSecReserved4Action = ( 1 << 19), kSecReserved5Action = ( 1 << 20), kSecReserved6Action = ( 1 << 21), kSecReserved7Action = ( 1 << 22), kSecReserved8Action = ( 1 << 23), kSecReserved9Action = ( 1 << 24), kSecReserved10Action = ( 1 << 25), kSecReserved11Action = ( 1 << 26), kSecReserved12Action = ( 1 << 27), kSecReserved13Action = ( 1 << 28), kSecReserved14Action = ( 1 << 29), kSecReserved14Action = ( 1 << 30), kSecLastAction = ( 1 << 31),
};
typedef uint32_t SecFlagType;
SecInline SecFlagType _SecFlags(flag, ...) {
SecFlagType _flag = flag;
va_list ap;
va_start(ap, flag);
SecFlagType nextFlag;
while ((nextFlag = va_arg(ap, SecFlagType))) _flag |= nextFlag;
va_end(ap);
return _flag;
}
SecInline void _SecSetLogLevel(SecFlagType flags[1], SecFlagType newFlags) {
SecFlagType newLevel = _SecLogLevel(newFlags);
if (!newLevel || newFlags & kSecLowerLogLevelAction)
*oldFlags = newLevel & _SecClearMask(newFlags, kSecActionsMask);
else if (newLevel > _SecLogLevel(*oldFlags))
*oldFlags = _SecClearMask(*oldFlags, kSecLogLevelMask) | newLevel;
}
SecInline void _SecAction(void *_secResult, void *flags, void *name, CFErrorRef *error, CFMutableArrayRef *chain, CFMutableStringRef *actions, SecFlagType flags, key, CFStringRef action, __VA_ARGS__) {
}
SecInline void _SecSetFlags(SecFlagType oldFlags[1], SecFlagType newFlags) {
newLevel = newFlags & kSecLogLevelMask
if (!newLevel || newFlags & kSecLowerLogLevelAction)
*oldFlags = newFlags & (kSecLogLevelMask | kSecFlagMask);
else if (newLevel > _SecLogLevel(*oldFlags))
*oldFlags = _SecClearMask(*oldFlags, kSecLogLevelMask)
(_SecLogLevel(newFlags)) ? _SecClearMask(*oldFlags);
*oldFlags |= newFlags;
}
SecInline void _SecEnableFlags(SecFlagType oldFlags[1], SecFlagType newFlags) {
(_SecLogLevel(newFlags)) ? _SecClearMask(*oldFlags);
*oldFlags |= newFlags;
}
SecInline void _SecDisableFlags(SecFlagType oldFlags[1], SecFlagType newFlags) {
}
__END_DECLS
#endif