xref: /xnu-10002.41.9/EXTERNAL_HEADERS/CoreEntitlements/Runtime.h (revision 699cd48037512bf4380799317ca44ca453c82f57)
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