// // Runtime.h // CoreEntitlements // // #ifndef CORE_ENTITLEMENTS_RUNTIME_H #define CORE_ENTITLEMENTS_RUNTIME_H #ifndef _CE_INDIRECT #error "Please include instead of this file" #endif #include #include #include __ptrcheck_abi_assume_single(); #define CE_MAX_KEY_SIZE 240 #ifndef __result_use_check #define __result_use_check #endif #define CE_RUNTIME_VERSION 1 #define CE_RUNTIME_WITH_INDEX_VERSION 2 /*! * @struct CEBuffer * Represents a sized chunk of DER data * Strings and blobs used and returned by CoreEntitlements always use CEBuffer * * @note * If a DER string is returned to you via a CEBuffer, you cannot assume it is null-terminated. */ typedef struct { const uint8_t *__counted_by(length) data; size_t length; } CEBuffer; /*! * @struct CEStaticBuffer * Represents a sized chunk of data that is stored inline */ typedef struct { uint8_t data[CE_MAX_KEY_SIZE]; size_t length; } CEStaticBuffer; #define CEBuffStr(str) (CEBuffer){.data = (const uint8_t*)str, .length = sizeof(str) - 1} /*! * @typedef CERuntimeMalloc * Function prototype that the CERuntime may ues to allocate data (e.g.. malloc) */ typedef void* __unsafe_indexable (*CERuntimeMalloc)(const CERuntime_t rt, size_t size) __result_use_check; /*! * @typedef CERuntimeFree * Function prototype that the CERuntime may ues to free allocated data (e.g. free) */ typedef void (*CERuntimeFree)(const CERuntime_t rt, void* address); /*! * @typedef CERuntimeLog * Function prototype that the CERuntime may use to log helpful information (e.g. printf) */ typedef void (*CERuntimeLog)(const CERuntime_t rt, const char* __unsafe_indexable fmt, ...) __printflike(2, 3); /*! * @typedef CERuntimeAbort * Function prototype that the CERuntime will use if it encounters a condition which may compromise the integrity of the system (e.g. abort, panic) */ typedef void (*CERuntimeAbort)(const CERuntime_t rt, const char* __unsafe_indexable fmt, ...) __printflike(2, 3) __attribute__((noreturn)); /*! * @typedef CERuntimeInternalStatus * Function prototype that the CERuntime may use to query AppleInternal status */ typedef bool (*CERuntimeInternalStatus)(const CERuntime_t rt); /*! * @typedef CERuntimeAllocIndex * Function prototype that the CERuntime may ues to allocate an index of the specified size */ typedef void* __unsafe_indexable (*CERuntimeAllocIndex)(const CERuntime_t rt, size_t size) __result_use_check; /*! * @typedef CERuntimeFreeIndex * Function prototype that the CERuntime may ues to free an index of the specified size */ typedef void (*CERuntimeFreeIndex)(const CERuntime_t rt, void* index, size_t size); /*! * @struct CERuntime * This structure represents the interface that CoreEntitlements uses to communicate with the outside world. * The presense or absence of function pointers in this structure may degrade certain functionality. * * @note * The only prototype that MUST be implemented is CERuntimeAbort abort. */ struct CERuntime { const uint64_t version; const CERuntimeMalloc alloc; const CERuntimeFree free; const CERuntimeLog log; const CERuntimeAbort abort; const CERuntimeInternalStatus internalStatus; const CERuntimeAllocIndex allocIndex; const CERuntimeFreeIndex freeIndex; } ; #endif