xref: /xnu-11417.101.15/EXTERNAL_HEADERS/CoreEntitlements/Serialization.h (revision e3723e1f17661b24996789d8afc084c0c3303b26)
1*e3723e1fSApple OSS Distributions //
2*e3723e1fSApple OSS Distributions //  Serialization.h
3*e3723e1fSApple OSS Distributions //  CoreEntitlements
4*e3723e1fSApple OSS Distributions //
5*e3723e1fSApple OSS Distributions //
6*e3723e1fSApple OSS Distributions 
7*e3723e1fSApple OSS Distributions #ifndef CORE_ENTITLEMENTS_SERIALIZATION_H
8*e3723e1fSApple OSS Distributions #define CORE_ENTITLEMENTS_SERIALIZATION_H
9*e3723e1fSApple OSS Distributions 
10*e3723e1fSApple OSS Distributions #ifndef _CE_INDIRECT
11*e3723e1fSApple OSS Distributions #error "Please include <CoreEntitlements/CoreEntitlements.h> instead of this file"
12*e3723e1fSApple OSS Distributions #endif
13*e3723e1fSApple OSS Distributions 
14*e3723e1fSApple OSS Distributions #include <CoreEntitlements/Result.h>
15*e3723e1fSApple OSS Distributions #include <CoreEntitlements/Runtime.h>
16*e3723e1fSApple OSS Distributions #include <CoreEntitlements/Entitlements.h>
17*e3723e1fSApple OSS Distributions 
18*e3723e1fSApple OSS Distributions __ptrcheck_abi_assume_single();
19*e3723e1fSApple OSS Distributions 
20*e3723e1fSApple OSS Distributions /*!
21*e3723e1fSApple OSS Distributions  * @enum CESerializedElementType_t
22*e3723e1fSApple OSS Distributions  * These are the primitive types that CoreEntitlements can serialize
23*e3723e1fSApple OSS Distributions  * Depending on the underlying representation some of these elements may be "virtual" or zero-sized.
24*e3723e1fSApple OSS Distributions  * However, they must still be included.
25*e3723e1fSApple OSS Distributions  */
26*e3723e1fSApple OSS Distributions OS_CLOSED_ENUM(CESerializedElementType, int64_t,
27*e3723e1fSApple OSS Distributions                /* A boolean element with a true / false value */
28*e3723e1fSApple OSS Distributions                kCESerializedBool = 1,
29*e3723e1fSApple OSS Distributions                /* A string element with a definite length */
30*e3723e1fSApple OSS Distributions                kCESerializedString = 2,
31*e3723e1fSApple OSS Distributions                /* A key string element with a definite length */
32*e3723e1fSApple OSS Distributions                kCESerializedKey = 3,
33*e3723e1fSApple OSS Distributions                /* An integer element, must be representable as int64_t */
34*e3723e1fSApple OSS Distributions                kCESerializedInteger = 4,
35*e3723e1fSApple OSS Distributions                /* Marks the start of an array / ordered sequence */
36*e3723e1fSApple OSS Distributions                kCESerializedArrayBegin = 5,
37*e3723e1fSApple OSS Distributions                /* Marks the end of an array / ordered sequence */
38*e3723e1fSApple OSS Distributions                kCESerializedArrayEnd = 6,
39*e3723e1fSApple OSS Distributions                /* Marks the start of a dictionary */
40*e3723e1fSApple OSS Distributions                /* The only valid elements contained in a dictionary are tuples (represented as an ordered sequence) */
41*e3723e1fSApple OSS Distributions                /* The first element of the ordered sequence must be kCESerializedString value */
42*e3723e1fSApple OSS Distributions                /* No restrictions are placed on the contents of the second element*/
43*e3723e1fSApple OSS Distributions                kCESerializedDictionaryBegin = 7,
44*e3723e1fSApple OSS Distributions                /* Marks the end of a dictionary */
45*e3723e1fSApple OSS Distributions                kCESerializedDictionaryEnd = 8,
46*e3723e1fSApple OSS Distributions                /* A data element with a definite length*/
47*e3723e1fSApple OSS Distributions                kCESerializedData = 9,
48*e3723e1fSApple OSS Distributions                );
49*e3723e1fSApple OSS Distributions 
50*e3723e1fSApple OSS Distributions /*!
51*e3723e1fSApple OSS Distributions  * @typedef CESerializedElement_t
52*e3723e1fSApple OSS Distributions  * This structure represents an encodable piece of data, along with its type and length (in bytes).
53*e3723e1fSApple OSS Distributions  * For the most part you will not need to use this structure manually, and instead you should use the helpers below
54*e3723e1fSApple OSS Distributions  */
55*e3723e1fSApple OSS Distributions typedef struct CESerializedElement {
56*e3723e1fSApple OSS Distributions     CESerializedElementType_t type;
57*e3723e1fSApple OSS Distributions     union {
58*e3723e1fSApple OSS Distributions #if !__has_ptrcheck
59*e3723e1fSApple OSS Distributions         void* bytes;
60*e3723e1fSApple OSS Distributions #endif
61*e3723e1fSApple OSS Distributions         int64_t value;
62*e3723e1fSApple OSS Distributions     } data;
63*e3723e1fSApple OSS Distributions     size_t length;
64*e3723e1fSApple OSS Distributions     bool pair;
65*e3723e1fSApple OSS Distributions } CESerializedElement_t;
66*e3723e1fSApple OSS Distributions 
CESerializedElementGetData(const CESerializedElement_t * element)67*e3723e1fSApple OSS Distributions static inline void *CE_HEADER_INDEXABLE CESerializedElementGetData(const CESerializedElement_t *element) {
68*e3723e1fSApple OSS Distributions     return __unsafe_forge_bidi_indexable(void *, element->data.value, element->length);
69*e3723e1fSApple OSS Distributions }
70*e3723e1fSApple OSS Distributions 
CESerializedElementSetData(CESerializedElement_t * element,void * __sized_by (length)bytes,size_t length)71*e3723e1fSApple OSS Distributions static inline void CESerializedElementSetData(CESerializedElement_t *element, void *__sized_by(length) bytes, size_t length) {
72*e3723e1fSApple OSS Distributions     element->data.value = (intptr_t)bytes;
73*e3723e1fSApple OSS Distributions     element->length = length;
74*e3723e1fSApple OSS Distributions }
75*e3723e1fSApple OSS Distributions 
76*e3723e1fSApple OSS Distributions /*!
77*e3723e1fSApple OSS Distributions  * @function CESizeSerialization
78*e3723e1fSApple OSS Distributions  * This function will iterate over the elements that are to be serialized and compute the size of an allocation that needs to be made
79*e3723e1fSApple OSS Distributions  * for a successful serialization.
80*e3723e1fSApple OSS Distributions  *
81*e3723e1fSApple OSS Distributions  * @note
82*e3723e1fSApple OSS Distributions  * This function may modify the length field of the CESerializedElements that are passed in. This must be done for serialization to succeed
83*e3723e1fSApple OSS Distributions  *
84*e3723e1fSApple OSS Distributions  * @returns
85*e3723e1fSApple OSS Distributions  * kCENoError if the requiredSize has been successfully populated and contains a valid value
86*e3723e1fSApple OSS Distributions  */
87*e3723e1fSApple OSS Distributions CEError_t CESizeSerialization(CESerializedElement_t elements[__counted_by(elementsCount)], size_t elementsCount, size_t* requiredSize) __result_use_check;
88*e3723e1fSApple OSS Distributions 
89*e3723e1fSApple OSS Distributions /*!
90*e3723e1fSApple OSS Distributions  * @function CESizeXMLSerialization
91*e3723e1fSApple OSS Distributions  * This function will iterate over the elements that are to be serialized and compute the size of an allocation that needs to be made
92*e3723e1fSApple OSS Distributions  * for a successful serialization to XML.
93*e3723e1fSApple OSS Distributions  *
94*e3723e1fSApple OSS Distributions  * @note
95*e3723e1fSApple OSS Distributions  * This function may modify the length field of the CESerializedElements that are passed in. This must be done for serialization to succeed
96*e3723e1fSApple OSS Distributions  *
97*e3723e1fSApple OSS Distributions  * @returns
98*e3723e1fSApple OSS Distributions  * kCENoError if the requiredSize has been successfully populated and contains a valid value
99*e3723e1fSApple OSS Distributions  */
100*e3723e1fSApple OSS Distributions CEError_t CESizeXMLSerialization(CESerializedElement_t elements[__counted_by(elementsCount)], size_t elementsCount, size_t* requiredSize) __result_use_check;
101*e3723e1fSApple OSS Distributions 
102*e3723e1fSApple OSS Distributions /*!
103*e3723e1fSApple OSS Distributions  * @function CESerializeWithOptions
104*e3723e1fSApple OSS Distributions  * Serializes the array of elements that contains the underlying data. The elements must have been sized with CESizeSerialization before calling this function.
105*e3723e1fSApple OSS Distributions  *
106*e3723e1fSApple OSS Distributions  * @param runtime
107*e3723e1fSApple OSS Distributions  * The runtime to use for this operation
108*e3723e1fSApple OSS Distributions  *
109*e3723e1fSApple OSS Distributions  * @param options
110*e3723e1fSApple OSS Distributions  * Options that modify what can be serialized.
111*e3723e1fSApple OSS Distributions  *
112*e3723e1fSApple OSS Distributions  * @param elements
113*e3723e1fSApple OSS Distributions  * The list of elements to serialize
114*e3723e1fSApple OSS Distributions  *
115*e3723e1fSApple OSS Distributions  * @param elementsCount
116*e3723e1fSApple OSS Distributions  * How many elements are in that list
117*e3723e1fSApple OSS Distributions  *
118*e3723e1fSApple OSS Distributions  * @param start
119*e3723e1fSApple OSS Distributions  * A pointer to the first byte into a buffer that will be filled with the serialized representation
120*e3723e1fSApple OSS Distributions  *
121*e3723e1fSApple OSS Distributions  * @param end
122*e3723e1fSApple OSS Distributions  * A pointer 1 byte past the end of the buffer to be used for serialization
123*e3723e1fSApple OSS Distributions  */
124*e3723e1fSApple OSS Distributions CEError_t CESerializeWithOptions(const CERuntime_t runtime, CEValidationOptions* options, CESerializedElement_t elements[__counted_by(elementsCount)], size_t elementsCount, uint8_t *__ended_by(end) start, uint8_t* end) __result_use_check;
125*e3723e1fSApple OSS Distributions 
126*e3723e1fSApple OSS Distributions /*!
127*e3723e1fSApple OSS Distributions  * @function CESerialize
128*e3723e1fSApple OSS Distributions  * Serializes the array of elements that contains the underlying data. The elements must have been sized with CESizeSerialization before calling this function.
129*e3723e1fSApple OSS Distributions  *
130*e3723e1fSApple OSS Distributions  * @param runtime
131*e3723e1fSApple OSS Distributions  * The runtime to use for this operation
132*e3723e1fSApple OSS Distributions  *
133*e3723e1fSApple OSS Distributions  * @param elements
134*e3723e1fSApple OSS Distributions  * The list of elements to serialize
135*e3723e1fSApple OSS Distributions  *
136*e3723e1fSApple OSS Distributions  * @param elementsCount
137*e3723e1fSApple OSS Distributions  * How many elements are in that list
138*e3723e1fSApple OSS Distributions  *
139*e3723e1fSApple OSS Distributions  * @param start
140*e3723e1fSApple OSS Distributions  * A pointer to the first byte into a buffer that will be filled with the serialized representation
141*e3723e1fSApple OSS Distributions  *
142*e3723e1fSApple OSS Distributions  * @param end
143*e3723e1fSApple OSS Distributions  * A pointer 1 byte past the end of the buffer to be used for serialization
144*e3723e1fSApple OSS Distributions  */
145*e3723e1fSApple OSS Distributions CEError_t CESerialize(const CERuntime_t runtime, CESerializedElement_t elements[__counted_by(elementsCount)], size_t elementsCount, uint8_t *__ended_by(end) start, uint8_t* end) __result_use_check;
146*e3723e1fSApple OSS Distributions 
147*e3723e1fSApple OSS Distributions /*!
148*e3723e1fSApple OSS Distributions  * @function CESerializeXML
149*e3723e1fSApple OSS Distributions  * Serializes the array of elements that contains the underlying data. The elements must have been sized with CESizeXMLSerialization before calling this function.
150*e3723e1fSApple OSS Distributions  *
151*e3723e1fSApple OSS Distributions  * @param runtime
152*e3723e1fSApple OSS Distributions  * The runtime to use for this operation
153*e3723e1fSApple OSS Distributions  *
154*e3723e1fSApple OSS Distributions  * @param elements
155*e3723e1fSApple OSS Distributions  * The list of elements to serialize
156*e3723e1fSApple OSS Distributions  *
157*e3723e1fSApple OSS Distributions  * @param elementsCount
158*e3723e1fSApple OSS Distributions  * How many elements are in that list
159*e3723e1fSApple OSS Distributions  *
160*e3723e1fSApple OSS Distributions  * @param start
161*e3723e1fSApple OSS Distributions  * A pointer to the first byte into a buffer that will be filled with the serialized representation
162*e3723e1fSApple OSS Distributions  *
163*e3723e1fSApple OSS Distributions  * @param end
164*e3723e1fSApple OSS Distributions  * A pointer 1 byte past the end of the buffer to be used for serialization
165*e3723e1fSApple OSS Distributions  */
166*e3723e1fSApple OSS Distributions CEError_t CESerializeXML(const CERuntime_t runtime, CESerializedElement_t elements[__counted_by(elementsCount)], size_t elementsCount, uint8_t *__ended_by(end) start, uint8_t* end) __result_use_check;
167*e3723e1fSApple OSS Distributions 
168*e3723e1fSApple OSS Distributions // Helpers
169*e3723e1fSApple OSS Distributions // These automatically construct CESerializedElements for you
170*e3723e1fSApple OSS Distributions #define CESerializeInteger(intv) (CESerializedElement_t){.type = kCESerializedInteger, .data.value = intv}
171*e3723e1fSApple OSS Distributions #define CESerializeBool(boolVal) (CESerializedElement_t){.type = kCESerializedBool, .data.value = !!boolVal}
172*e3723e1fSApple OSS Distributions #define CESerializeStaticString(strVal) (CESerializedElement_t){.type = kCESerializedString, .data.value = (intptr_t)strVal, .length = sizeof(strVal) - 1}
173*e3723e1fSApple OSS Distributions #define CESerializeKey(strVal) (CESerializedElement_t){.type = kCESerializedKey, .data.value = (intptr_t)strVal, .length = sizeof(strVal) - 1}
174*e3723e1fSApple OSS Distributions #define CESerializeDynamicKey(strVal, len) (CESerializedElement_t){.type = kCESerializedKey, .data.value = (intptr_t)strVal, .length = len}
175*e3723e1fSApple OSS Distributions #define CESerializeString(strVal, len) (CESerializedElement_t){.type = kCESerializedString, .data.value = (intptr_t)strVal, .length = len}
176*e3723e1fSApple OSS Distributions #define CESerializeData(dataVal, len) (CESerializedElement_t){.type = kCESerializedData, .data.value = (intptr_t)dataVal, .length = len}
177*e3723e1fSApple OSS Distributions #define CESerializeArray(...) (CESerializedElement_t){.type = kCESerializedArrayBegin}, __VA_ARGS__ , (CESerializedElement_t){.type = kCESerializedArrayEnd}
178*e3723e1fSApple OSS Distributions #define CESerializeDictionary(...) (CESerializedElement_t){.type = kCESerializedDictionaryBegin}, __VA_ARGS__ , (CESerializedElement_t){.type = kCESerializedDictionaryEnd}
179*e3723e1fSApple OSS Distributions #define CESerializeDictionaryPair(a, b) CESerializeArray(a, b)
180*e3723e1fSApple OSS Distributions 
181*e3723e1fSApple OSS Distributions #endif
182