1 | // |
2 | // Runtime.h |
3 | // CoreEntitlements |
4 | // |
5 | // |
6 | |
7 | #ifndef CORE_ENTITLEMENTS_RUNTIME_H |
8 | #define CORE_ENTITLEMENTS_RUNTIME_H |
9 | |
10 | #ifndef _CE_INDIRECT |
11 | #error "Please include <CoreEntitlements/CoreEntitlements.h> instead of this file" |
12 | #endif |
13 | |
14 | #include <stdint.h> |
15 | #include <stddef.h> |
16 | #include <stdbool.h> |
17 | |
18 | __ptrcheck_abi_assume_single(); |
19 | |
20 | #define CE_MAX_KEY_SIZE 240 |
21 | |
22 | #ifndef __result_use_check |
23 | #define __result_use_check |
24 | #endif |
25 | |
26 | #define CE_RUNTIME_VERSION 1 |
27 | #define CE_RUNTIME_WITH_INDEX_VERSION 2 |
28 | |
29 | /*! |
30 | * @struct CEBuffer |
31 | * Represents a sized chunk of DER data |
32 | * Strings and blobs used and returned by CoreEntitlements always use CEBuffer |
33 | * |
34 | * @note |
35 | * If a DER string is returned to you via a CEBuffer, you cannot assume it is null-terminated. |
36 | */ |
37 | typedef struct { |
38 | const uint8_t *__counted_by(length) data; |
39 | size_t length; |
40 | } CEBuffer; |
41 | |
42 | /*! |
43 | * @struct CEStaticBuffer |
44 | * Represents a sized chunk of data that is stored inline |
45 | */ |
46 | typedef struct { |
47 | uint8_t data[CE_MAX_KEY_SIZE]; |
48 | size_t length; |
49 | } CEStaticBuffer; |
50 | |
51 | #define CEBuffStr(str) (CEBuffer){.data = (const uint8_t*)str, .length = sizeof(str) - 1} |
52 | |
53 | /*! |
54 | * @typedef CERuntimeMalloc |
55 | * Function prototype that the CERuntime may ues to allocate data (e.g.. malloc) |
56 | */ |
57 | typedef void* __unsafe_indexable (*CERuntimeMalloc)(const CERuntime_t rt, size_t size) __result_use_check; |
58 | /*! |
59 | * @typedef CERuntimeFree |
60 | * Function prototype that the CERuntime may ues to free allocated data (e.g. free) |
61 | */ |
62 | typedef void (*CERuntimeFree)(const CERuntime_t rt, void* address); |
63 | /*! |
64 | * @typedef CERuntimeLog |
65 | * Function prototype that the CERuntime may use to log helpful information (e.g. printf) |
66 | */ |
67 | typedef void (*CERuntimeLog)(const CERuntime_t rt, const char* __unsafe_indexable fmt, ...) __printflike(2, 3); |
68 | /*! |
69 | * @typedef CERuntimeAbort |
70 | * Function prototype that the CERuntime will use if it encounters a condition which may compromise the integrity of the system (e.g. abort, panic) |
71 | */ |
72 | typedef void (*CERuntimeAbort)(const CERuntime_t rt, const char* __unsafe_indexable fmt, ...) __printflike(2, 3) __attribute__((noreturn)); |
73 | /*! |
74 | * @typedef CERuntimeInternalStatus |
75 | * Function prototype that the CERuntime may use to query AppleInternal status |
76 | */ |
77 | typedef bool (*CERuntimeInternalStatus)(const CERuntime_t rt); |
78 | |
79 | /*! |
80 | * @typedef CERuntimeAllocIndex |
81 | * Function prototype that the CERuntime may ues to allocate an index of the specified size |
82 | */ |
83 | typedef void* __unsafe_indexable (*CERuntimeAllocIndex)(const CERuntime_t rt, size_t size) __result_use_check; |
84 | |
85 | /*! |
86 | * @typedef CERuntimeFreeIndex |
87 | * Function prototype that the CERuntime may ues to free an index of the specified size |
88 | */ |
89 | typedef void (*CERuntimeFreeIndex)(const CERuntime_t rt, void* index, size_t size); |
90 | |
91 | /*! |
92 | * @struct CERuntime |
93 | * This structure represents the interface that CoreEntitlements uses to communicate with the outside world. |
94 | * The presense or absence of function pointers in this structure may degrade certain functionality. |
95 | * |
96 | * @note |
97 | * The only prototype that MUST be implemented is CERuntimeAbort abort. |
98 | */ |
99 | struct CERuntime { |
100 | const uint64_t version; |
101 | const CERuntimeMalloc alloc; |
102 | const CERuntimeFree free; |
103 | const CERuntimeLog log; |
104 | const CERuntimeAbort abort; |
105 | const CERuntimeInternalStatus internalStatus; |
106 | const CERuntimeAllocIndex allocIndex; |
107 | const CERuntimeFreeIndex freeIndex; |
108 | } ; |
109 | |
110 | #endif |
111 | |