1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /*******************************************************************************
3*758e9fbaSOystein Eftevaag * Copyright 2017-2018, Fraunhofer SIT sponsored by Infineon Technologies AG
4*758e9fbaSOystein Eftevaag * All rights reserved.
5*758e9fbaSOystein Eftevaag *******************************************************************************/
6*758e9fbaSOystein Eftevaag
7*758e9fbaSOystein Eftevaag #ifdef HAVE_CONFIG_H
8*758e9fbaSOystein Eftevaag #include <config.h>
9*758e9fbaSOystein Eftevaag #endif
10*758e9fbaSOystein Eftevaag
11*758e9fbaSOystein Eftevaag #include <inttypes.h>
12*758e9fbaSOystein Eftevaag #include <string.h>
13*758e9fbaSOystein Eftevaag
14*758e9fbaSOystein Eftevaag #include "tss2_esys.h"
15*758e9fbaSOystein Eftevaag
16*758e9fbaSOystein Eftevaag #include "esys_mu.h"
17*758e9fbaSOystein Eftevaag #include "esys_iutil.h"
18*758e9fbaSOystein Eftevaag #define LOGMODULE esys
19*758e9fbaSOystein Eftevaag #include "util/log.h"
20*758e9fbaSOystein Eftevaag #include "util/aux_util.h"
21*758e9fbaSOystein Eftevaag
22*758e9fbaSOystein Eftevaag /** Marshal an array of BYTE structures into a byte buffer.
23*758e9fbaSOystein Eftevaag *
24*758e9fbaSOystein Eftevaag * @param[in] in Structures to be marshaled.
25*758e9fbaSOystein Eftevaag * @param[in] count Number of structures to be marshaled.
26*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to write result into.
27*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
28*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer
29*758e9fbaSOystein Eftevaag * (being updated during marshaling).
30*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
31*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
32*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
33*758e9fbaSOystein Eftevaag */
34*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_BYTE_array_Marshal(const BYTE * src,size_t count,uint8_t * buffer,size_t size,size_t * offset)35*758e9fbaSOystein Eftevaag iesys_MU_BYTE_array_Marshal(
36*758e9fbaSOystein Eftevaag const BYTE *src,
37*758e9fbaSOystein Eftevaag size_t count,
38*758e9fbaSOystein Eftevaag uint8_t *buffer,
39*758e9fbaSOystein Eftevaag size_t size,
40*758e9fbaSOystein Eftevaag size_t *offset)
41*758e9fbaSOystein Eftevaag {
42*758e9fbaSOystein Eftevaag LOG_TRACE("called: src=%p count=%zu buffer=%p size=%zu offset=%p", src,
43*758e9fbaSOystein Eftevaag count, buffer, size, offset);
44*758e9fbaSOystein Eftevaag return_if_null(src, "src=NULL", TSS2_ESYS_RC_BAD_REFERENCE);
45*758e9fbaSOystein Eftevaag
46*758e9fbaSOystein Eftevaag size_t offset_loc = (offset != NULL)? *offset : 0;
47*758e9fbaSOystein Eftevaag
48*758e9fbaSOystein Eftevaag if (count > size || size - count < offset_loc) {
49*758e9fbaSOystein Eftevaag LOG_ERROR("not enough space in target buffer");
50*758e9fbaSOystein Eftevaag return TSS2_ESYS_RC_INSUFFICIENT_BUFFER;
51*758e9fbaSOystein Eftevaag }
52*758e9fbaSOystein Eftevaag
53*758e9fbaSOystein Eftevaag if (buffer != NULL)
54*758e9fbaSOystein Eftevaag memcpy(&buffer[offset_loc], src, count);
55*758e9fbaSOystein Eftevaag offset_loc += count;
56*758e9fbaSOystein Eftevaag
57*758e9fbaSOystein Eftevaag if (offset != NULL)
58*758e9fbaSOystein Eftevaag *offset = offset_loc;
59*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
60*758e9fbaSOystein Eftevaag }
61*758e9fbaSOystein Eftevaag
62*758e9fbaSOystein Eftevaag /** Unmarshal an array of BYTE structures from a byte buffer.
63*758e9fbaSOystein Eftevaag *
64*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to read data from.
65*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
66*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer
67*758e9fbaSOystein Eftevaag * (being updated during marshaling).
68*758e9fbaSOystein Eftevaag * @param[in] count Number of structures to be unmarshaled.
69*758e9fbaSOystein Eftevaag * @param[out] out Structures to store the result in.
70*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
71*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_BAD_REFERENCE if buffer==NULL.
72*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
73*758e9fbaSOystein Eftevaag */
74*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_BYTE_array_Unmarshal(const uint8_t * buffer,size_t size,size_t * offset,size_t count,BYTE * dst)75*758e9fbaSOystein Eftevaag iesys_MU_BYTE_array_Unmarshal(
76*758e9fbaSOystein Eftevaag const uint8_t *buffer,
77*758e9fbaSOystein Eftevaag size_t size,
78*758e9fbaSOystein Eftevaag size_t *offset,
79*758e9fbaSOystein Eftevaag size_t count,
80*758e9fbaSOystein Eftevaag BYTE *dst)
81*758e9fbaSOystein Eftevaag {
82*758e9fbaSOystein Eftevaag LOG_TRACE("called: count=%zu buffer=%p size=%zu offset=%p dst=%p",
83*758e9fbaSOystein Eftevaag count, buffer, size, offset, dst);
84*758e9fbaSOystein Eftevaag return_if_null(buffer, "src=NULL", TSS2_ESYS_RC_BAD_REFERENCE);
85*758e9fbaSOystein Eftevaag
86*758e9fbaSOystein Eftevaag size_t offset_loc = (offset != NULL)? *offset : 0;
87*758e9fbaSOystein Eftevaag if (dst != NULL)
88*758e9fbaSOystein Eftevaag memset(dst, 0, sizeof(*dst));
89*758e9fbaSOystein Eftevaag
90*758e9fbaSOystein Eftevaag if (count > size || size - count < offset_loc) {
91*758e9fbaSOystein Eftevaag LOG_ERROR("not enough space in target buffer");
92*758e9fbaSOystein Eftevaag return TSS2_ESYS_RC_INSUFFICIENT_BUFFER;
93*758e9fbaSOystein Eftevaag }
94*758e9fbaSOystein Eftevaag
95*758e9fbaSOystein Eftevaag if (dst != NULL)
96*758e9fbaSOystein Eftevaag memcpy(dst, &buffer[offset_loc], count);
97*758e9fbaSOystein Eftevaag offset_loc += count;
98*758e9fbaSOystein Eftevaag
99*758e9fbaSOystein Eftevaag if (offset != NULL)
100*758e9fbaSOystein Eftevaag *offset = offset_loc;
101*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
102*758e9fbaSOystein Eftevaag }
103*758e9fbaSOystein Eftevaag
104*758e9fbaSOystein Eftevaag
105*758e9fbaSOystein Eftevaag /** Check, if a variable has a possible value of type IESYSC_RESOURCE_TYPE_CONSTANT.
106*758e9fbaSOystein Eftevaag *
107*758e9fbaSOystein Eftevaag * @param[in] in variable to check.
108*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
109*758e9fbaSOystein Eftevaag */
110*758e9fbaSOystein Eftevaag TSS2_RC
Tss2_MU_IESYSC_RESOURCE_TYPE_CONSTANT_check(const IESYSC_RESOURCE_TYPE_CONSTANT * in)111*758e9fbaSOystein Eftevaag Tss2_MU_IESYSC_RESOURCE_TYPE_CONSTANT_check(
112*758e9fbaSOystein Eftevaag const IESYSC_RESOURCE_TYPE_CONSTANT *in)
113*758e9fbaSOystein Eftevaag {
114*758e9fbaSOystein Eftevaag LOG_TRACE("called: in=%p", in);
115*758e9fbaSOystein Eftevaag if (in == NULL) {
116*758e9fbaSOystein Eftevaag LOG_ERROR("in==NULL");
117*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_REFERENCE;
118*758e9fbaSOystein Eftevaag }
119*758e9fbaSOystein Eftevaag /* No Error-Messages, since this function may fail for a good reasons. */
120*758e9fbaSOystein Eftevaag if (FALSE
121*758e9fbaSOystein Eftevaag || (*in == IESYSC_KEY_RSRC)
122*758e9fbaSOystein Eftevaag || (*in == IESYSC_NV_RSRC)
123*758e9fbaSOystein Eftevaag || (*in == IESYSC_SESSION_RSRC)
124*758e9fbaSOystein Eftevaag || (*in == IESYSC_WITHOUT_MISC_RSRC)) {
125*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
126*758e9fbaSOystein Eftevaag } else {
127*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_VALUE;
128*758e9fbaSOystein Eftevaag }
129*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
130*758e9fbaSOystein Eftevaag }
131*758e9fbaSOystein Eftevaag /** Marshal a constant of type IESYSC_PARAM_ENCRYPT into a byte buffer.
132*758e9fbaSOystein Eftevaag *
133*758e9fbaSOystein Eftevaag * @param[in] src constant to be marshaled.
134*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to write result into (may be NULL)
135*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
136*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer (may be NULL.
137*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
138*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
139*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
140*758e9fbaSOystein Eftevaag */
141*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYSC_PARAM_ENCRYPT_Marshal(const IESYSC_PARAM_ENCRYPT src,uint8_t * buffer,size_t size,size_t * offset)142*758e9fbaSOystein Eftevaag iesys_MU_IESYSC_PARAM_ENCRYPT_Marshal(
143*758e9fbaSOystein Eftevaag const IESYSC_PARAM_ENCRYPT src,
144*758e9fbaSOystein Eftevaag uint8_t *buffer,
145*758e9fbaSOystein Eftevaag size_t size,
146*758e9fbaSOystein Eftevaag size_t *offset)
147*758e9fbaSOystein Eftevaag {
148*758e9fbaSOystein Eftevaag LOG_TRACE("called: src=%"PRIx32 " buffer=%p size=%zu offset=%p", src,
149*758e9fbaSOystein Eftevaag buffer, size, offset);
150*758e9fbaSOystein Eftevaag return Tss2_MU_UINT32_Marshal(src, buffer, size, offset);
151*758e9fbaSOystein Eftevaag }
152*758e9fbaSOystein Eftevaag
153*758e9fbaSOystein Eftevaag /** Unmarshal a constant of type IESYSC_PARAM_ENCRYPT from a byte buffer.
154*758e9fbaSOystein Eftevaag *
155*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to read data from.
156*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
157*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer
158*758e9fbaSOystein Eftevaag * (being updated during marshaling).
159*758e9fbaSOystein Eftevaag * @param[out] dst variable to store the result in.
160*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
161*758e9fbaSOystein Eftevaag */
162*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYSC_PARAM_ENCRYPT_Unmarshal(const uint8_t * buffer,size_t size,size_t * offset,IESYSC_PARAM_ENCRYPT * dst)163*758e9fbaSOystein Eftevaag iesys_MU_IESYSC_PARAM_ENCRYPT_Unmarshal(
164*758e9fbaSOystein Eftevaag const uint8_t *buffer,
165*758e9fbaSOystein Eftevaag size_t size,
166*758e9fbaSOystein Eftevaag size_t *offset,
167*758e9fbaSOystein Eftevaag IESYSC_PARAM_ENCRYPT *dst)
168*758e9fbaSOystein Eftevaag {
169*758e9fbaSOystein Eftevaag LOG_TRACE("called: buffer=%p size=%zu offset=%p dst=%p",
170*758e9fbaSOystein Eftevaag buffer, size, offset, dst);
171*758e9fbaSOystein Eftevaag size_t offset_loc = (offset != NULL)? *offset : 0;
172*758e9fbaSOystein Eftevaag if (dst != NULL)
173*758e9fbaSOystein Eftevaag memset(dst, 0, sizeof(*dst));
174*758e9fbaSOystein Eftevaag IESYSC_PARAM_ENCRYPT dst_loc;
175*758e9fbaSOystein Eftevaag TSS2_RC ret = Tss2_MU_UINT32_Unmarshal(buffer, size,
176*758e9fbaSOystein Eftevaag &offset_loc, &dst_loc);
177*758e9fbaSOystein Eftevaag return_if_error(ret, "Unmarshaling the base type");
178*758e9fbaSOystein Eftevaag
179*758e9fbaSOystein Eftevaag ret = iesys_MU_IESYSC_PARAM_ENCRYPT_check(&dst_loc);
180*758e9fbaSOystein Eftevaag if (ret != TSS2_RC_SUCCESS) {
181*758e9fbaSOystein Eftevaag LOG_ERROR("Bad value %"PRIx32 "", dst_loc);
182*758e9fbaSOystein Eftevaag return ret;
183*758e9fbaSOystein Eftevaag }
184*758e9fbaSOystein Eftevaag if (offset != NULL)
185*758e9fbaSOystein Eftevaag *offset = offset_loc;
186*758e9fbaSOystein Eftevaag if (dst != NULL)
187*758e9fbaSOystein Eftevaag *dst = dst_loc;
188*758e9fbaSOystein Eftevaag LOG_TRACE("return: dst=%p value=%"PRIx32 "", dst, dst_loc);
189*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
190*758e9fbaSOystein Eftevaag }
191*758e9fbaSOystein Eftevaag
192*758e9fbaSOystein Eftevaag /** Check, if a variable has a possible value of type IESYSC_PARAM_ENCRYPT.
193*758e9fbaSOystein Eftevaag *
194*758e9fbaSOystein Eftevaag * @param[in] in variable to check.
195*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
196*758e9fbaSOystein Eftevaag */
197*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYSC_PARAM_ENCRYPT_check(const IESYSC_PARAM_ENCRYPT * in)198*758e9fbaSOystein Eftevaag iesys_MU_IESYSC_PARAM_ENCRYPT_check(
199*758e9fbaSOystein Eftevaag const IESYSC_PARAM_ENCRYPT *in)
200*758e9fbaSOystein Eftevaag {
201*758e9fbaSOystein Eftevaag LOG_TRACE("called: in=%p", in);
202*758e9fbaSOystein Eftevaag return_if_null(in, "in==NULL", TSS2_SYS_RC_BAD_REFERENCE);
203*758e9fbaSOystein Eftevaag
204*758e9fbaSOystein Eftevaag /* No Error-Messages, since this function may fail for a good reasons. */
205*758e9fbaSOystein Eftevaag if (FALSE
206*758e9fbaSOystein Eftevaag || (*in == ENCRYPT)
207*758e9fbaSOystein Eftevaag || (*in == NO_ENCRYPT)) {
208*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
209*758e9fbaSOystein Eftevaag } else {
210*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_VALUE;
211*758e9fbaSOystein Eftevaag }
212*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
213*758e9fbaSOystein Eftevaag }
214*758e9fbaSOystein Eftevaag /** Marshal a constant of type IESYSC_PARAM_DECRYPT into a byte buffer.
215*758e9fbaSOystein Eftevaag *
216*758e9fbaSOystein Eftevaag * @param[in] src constant to be marshaled.
217*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to write result into (may be NULL)
218*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
219*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer (may be NULL.
220*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
221*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
222*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
223*758e9fbaSOystein Eftevaag */
224*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYSC_PARAM_DECRYPT_Marshal(const IESYSC_PARAM_DECRYPT src,uint8_t * buffer,size_t size,size_t * offset)225*758e9fbaSOystein Eftevaag iesys_MU_IESYSC_PARAM_DECRYPT_Marshal(
226*758e9fbaSOystein Eftevaag const IESYSC_PARAM_DECRYPT src,
227*758e9fbaSOystein Eftevaag uint8_t *buffer,
228*758e9fbaSOystein Eftevaag size_t size,
229*758e9fbaSOystein Eftevaag size_t *offset)
230*758e9fbaSOystein Eftevaag {
231*758e9fbaSOystein Eftevaag LOG_TRACE("called: src=%"PRIx32 " buffer=%p size=%zu offset=%p", src,
232*758e9fbaSOystein Eftevaag buffer, size, offset);
233*758e9fbaSOystein Eftevaag return Tss2_MU_UINT32_Marshal(src, buffer, size, offset);
234*758e9fbaSOystein Eftevaag }
235*758e9fbaSOystein Eftevaag
236*758e9fbaSOystein Eftevaag /** Unmarshal a constant of type IESYSC_PARAM_DECRYPT from a byte buffer.
237*758e9fbaSOystein Eftevaag *
238*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to read data from.
239*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
240*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer
241*758e9fbaSOystein Eftevaag * (being updated during marshaling).
242*758e9fbaSOystein Eftevaag * @param[out] dst variable to store the result in.
243*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
244*758e9fbaSOystein Eftevaag */
245*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYSC_PARAM_DECRYPT_Unmarshal(const uint8_t * buffer,size_t size,size_t * offset,IESYSC_PARAM_DECRYPT * dst)246*758e9fbaSOystein Eftevaag iesys_MU_IESYSC_PARAM_DECRYPT_Unmarshal(
247*758e9fbaSOystein Eftevaag const uint8_t *buffer,
248*758e9fbaSOystein Eftevaag size_t size,
249*758e9fbaSOystein Eftevaag size_t *offset,
250*758e9fbaSOystein Eftevaag IESYSC_PARAM_DECRYPT *dst)
251*758e9fbaSOystein Eftevaag {
252*758e9fbaSOystein Eftevaag LOG_TRACE("called: buffer=%p size=%zu offset=%p dst=%p",
253*758e9fbaSOystein Eftevaag buffer, size, offset, dst);
254*758e9fbaSOystein Eftevaag size_t offset_loc = (offset != NULL)? *offset : 0;
255*758e9fbaSOystein Eftevaag if (dst != NULL)
256*758e9fbaSOystein Eftevaag memset(dst, 0, sizeof(*dst));
257*758e9fbaSOystein Eftevaag IESYSC_PARAM_DECRYPT dst_loc;
258*758e9fbaSOystein Eftevaag TSS2_RC ret = Tss2_MU_UINT32_Unmarshal(buffer, size,
259*758e9fbaSOystein Eftevaag &offset_loc, &dst_loc);
260*758e9fbaSOystein Eftevaag return_if_error(ret, "Unmarshaling the base type");
261*758e9fbaSOystein Eftevaag
262*758e9fbaSOystein Eftevaag ret = iesys_MU_IESYSC_PARAM_DECRYPT_check(&dst_loc);
263*758e9fbaSOystein Eftevaag if (ret != TSS2_RC_SUCCESS) {
264*758e9fbaSOystein Eftevaag LOG_ERROR("Bad value %"PRIx32 "", dst_loc);
265*758e9fbaSOystein Eftevaag return ret;
266*758e9fbaSOystein Eftevaag }
267*758e9fbaSOystein Eftevaag if (offset != NULL)
268*758e9fbaSOystein Eftevaag *offset = offset_loc;
269*758e9fbaSOystein Eftevaag if (dst != NULL)
270*758e9fbaSOystein Eftevaag *dst = dst_loc;
271*758e9fbaSOystein Eftevaag LOG_TRACE("return: dst=%p value=%"PRIx32 "", dst, dst_loc);
272*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
273*758e9fbaSOystein Eftevaag }
274*758e9fbaSOystein Eftevaag
275*758e9fbaSOystein Eftevaag /** Check, if a variable has a possible value of type IESYSC_PARAM_DECRYPT.
276*758e9fbaSOystein Eftevaag *
277*758e9fbaSOystein Eftevaag * @param[in] in variable to check.
278*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
279*758e9fbaSOystein Eftevaag */
280*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYSC_PARAM_DECRYPT_check(const IESYSC_PARAM_DECRYPT * in)281*758e9fbaSOystein Eftevaag iesys_MU_IESYSC_PARAM_DECRYPT_check(
282*758e9fbaSOystein Eftevaag const IESYSC_PARAM_DECRYPT *in)
283*758e9fbaSOystein Eftevaag {
284*758e9fbaSOystein Eftevaag LOG_TRACE("called: in=%p", in);
285*758e9fbaSOystein Eftevaag return_if_null(in, "in==NULL", TSS2_SYS_RC_BAD_REFERENCE);
286*758e9fbaSOystein Eftevaag
287*758e9fbaSOystein Eftevaag /* No Error-Messages, since this function may fail for a good reasons. */
288*758e9fbaSOystein Eftevaag if (FALSE
289*758e9fbaSOystein Eftevaag || (*in == DECRYPT)
290*758e9fbaSOystein Eftevaag || (*in == NO_DECRYPT)) {
291*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
292*758e9fbaSOystein Eftevaag } else {
293*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_VALUE;
294*758e9fbaSOystein Eftevaag }
295*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
296*758e9fbaSOystein Eftevaag }
297*758e9fbaSOystein Eftevaag /** Marshal a constant of type IESYSC_TYPE_POLICY_AUTH into a byte buffer.
298*758e9fbaSOystein Eftevaag *
299*758e9fbaSOystein Eftevaag * @param[in] src constant to be marshaled.
300*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to write result into (may be NULL)
301*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
302*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer (may be NULL.
303*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
304*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
305*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
306*758e9fbaSOystein Eftevaag */
307*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYSC_TYPE_POLICY_AUTH_Marshal(const IESYSC_TYPE_POLICY_AUTH src,uint8_t * buffer,size_t size,size_t * offset)308*758e9fbaSOystein Eftevaag iesys_MU_IESYSC_TYPE_POLICY_AUTH_Marshal(
309*758e9fbaSOystein Eftevaag const IESYSC_TYPE_POLICY_AUTH src,
310*758e9fbaSOystein Eftevaag uint8_t *buffer,
311*758e9fbaSOystein Eftevaag size_t size,
312*758e9fbaSOystein Eftevaag size_t *offset)
313*758e9fbaSOystein Eftevaag {
314*758e9fbaSOystein Eftevaag LOG_TRACE("called: src=%"PRIx32 " buffer=%p size=%zu offset=%p", src,
315*758e9fbaSOystein Eftevaag buffer, size, offset);
316*758e9fbaSOystein Eftevaag return Tss2_MU_UINT32_Marshal(src, buffer, size, offset);
317*758e9fbaSOystein Eftevaag }
318*758e9fbaSOystein Eftevaag
319*758e9fbaSOystein Eftevaag /** Unmarshal a constant of type IESYSC_TYPE_POLICY_AUTH from a byte buffer.
320*758e9fbaSOystein Eftevaag *
321*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to read data from.
322*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
323*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer
324*758e9fbaSOystein Eftevaag * (being updated during marshaling).
325*758e9fbaSOystein Eftevaag * @param[out] dst variable to store the result in.
326*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
327*758e9fbaSOystein Eftevaag */
328*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYSC_TYPE_POLICY_AUTH_Unmarshal(const uint8_t * buffer,size_t size,size_t * offset,IESYSC_TYPE_POLICY_AUTH * dst)329*758e9fbaSOystein Eftevaag iesys_MU_IESYSC_TYPE_POLICY_AUTH_Unmarshal(
330*758e9fbaSOystein Eftevaag const uint8_t *buffer,
331*758e9fbaSOystein Eftevaag size_t size,
332*758e9fbaSOystein Eftevaag size_t *offset,
333*758e9fbaSOystein Eftevaag IESYSC_TYPE_POLICY_AUTH *dst)
334*758e9fbaSOystein Eftevaag {
335*758e9fbaSOystein Eftevaag LOG_TRACE("called: buffer=%p size=%zu offset=%p dst=%p",
336*758e9fbaSOystein Eftevaag buffer, size, offset, dst);
337*758e9fbaSOystein Eftevaag size_t offset_loc = (offset != NULL)? *offset : 0;
338*758e9fbaSOystein Eftevaag if (dst != NULL)
339*758e9fbaSOystein Eftevaag memset(dst, 0, sizeof(*dst));
340*758e9fbaSOystein Eftevaag IESYSC_TYPE_POLICY_AUTH dst_loc;
341*758e9fbaSOystein Eftevaag TSS2_RC ret = Tss2_MU_UINT32_Unmarshal(buffer, size,
342*758e9fbaSOystein Eftevaag &offset_loc, &dst_loc);
343*758e9fbaSOystein Eftevaag return_if_error(ret, "Unmarshaling the base type");
344*758e9fbaSOystein Eftevaag
345*758e9fbaSOystein Eftevaag ret = iesys_MU_IESYSC_TYPE_POLICY_AUTH_check(&dst_loc);
346*758e9fbaSOystein Eftevaag if (ret != TSS2_RC_SUCCESS) {
347*758e9fbaSOystein Eftevaag LOG_ERROR("Bad value %"PRIx32 "", dst_loc);
348*758e9fbaSOystein Eftevaag return ret;
349*758e9fbaSOystein Eftevaag }
350*758e9fbaSOystein Eftevaag if (offset != NULL)
351*758e9fbaSOystein Eftevaag *offset = offset_loc;
352*758e9fbaSOystein Eftevaag if (dst != NULL)
353*758e9fbaSOystein Eftevaag *dst = dst_loc;
354*758e9fbaSOystein Eftevaag LOG_TRACE("return: dst=%p value=%"PRIx32 "", dst, dst_loc);
355*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
356*758e9fbaSOystein Eftevaag }
357*758e9fbaSOystein Eftevaag
358*758e9fbaSOystein Eftevaag /** Check, if a variable has a possible value of type IESYSC_TYPE_POLICY_AUTH.
359*758e9fbaSOystein Eftevaag *
360*758e9fbaSOystein Eftevaag * @param[in] in variable to check.
361*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
362*758e9fbaSOystein Eftevaag */
363*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYSC_TYPE_POLICY_AUTH_check(const IESYSC_TYPE_POLICY_AUTH * in)364*758e9fbaSOystein Eftevaag iesys_MU_IESYSC_TYPE_POLICY_AUTH_check(
365*758e9fbaSOystein Eftevaag const IESYSC_TYPE_POLICY_AUTH *in)
366*758e9fbaSOystein Eftevaag {
367*758e9fbaSOystein Eftevaag LOG_TRACE("called: in=%p", in);
368*758e9fbaSOystein Eftevaag return_if_null(in, "in==NULL", TSS2_SYS_RC_BAD_REFERENCE);
369*758e9fbaSOystein Eftevaag
370*758e9fbaSOystein Eftevaag /* No Error-Messages, since this function may fail for a good reasons. */
371*758e9fbaSOystein Eftevaag if (FALSE
372*758e9fbaSOystein Eftevaag || (*in == POLICY_PASSWORD)
373*758e9fbaSOystein Eftevaag || (*in == POLICY_AUTH)
374*758e9fbaSOystein Eftevaag || (*in == NO_POLICY_AUTH)) {
375*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
376*758e9fbaSOystein Eftevaag } else {
377*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_VALUE;
378*758e9fbaSOystein Eftevaag }
379*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
380*758e9fbaSOystein Eftevaag }
381*758e9fbaSOystein Eftevaag
382*758e9fbaSOystein Eftevaag /** Marshal a IESYS_SESSION structure into a byte buffer.
383*758e9fbaSOystein Eftevaag *
384*758e9fbaSOystein Eftevaag * @param[in] src variable to be marshaled.
385*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to write result into.
386*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
387*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer
388*758e9fbaSOystein Eftevaag * (being updated during marshaling).
389*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
390*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
391*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
392*758e9fbaSOystein Eftevaag */
393*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYS_SESSION_Marshal(const IESYS_SESSION * src,uint8_t * buffer,size_t size,size_t * offset)394*758e9fbaSOystein Eftevaag iesys_MU_IESYS_SESSION_Marshal(
395*758e9fbaSOystein Eftevaag const IESYS_SESSION *src,
396*758e9fbaSOystein Eftevaag uint8_t *buffer,
397*758e9fbaSOystein Eftevaag size_t size,
398*758e9fbaSOystein Eftevaag size_t *offset)
399*758e9fbaSOystein Eftevaag {
400*758e9fbaSOystein Eftevaag LOG_TRACE("called: src=%p buffer=%p size=%zu offset=%p", src,
401*758e9fbaSOystein Eftevaag buffer, size, offset);
402*758e9fbaSOystein Eftevaag if (src == NULL) {
403*758e9fbaSOystein Eftevaag LOG_ERROR("src=NULL");
404*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_REFERENCE;
405*758e9fbaSOystein Eftevaag }
406*758e9fbaSOystein Eftevaag TSS2_RC ret;
407*758e9fbaSOystein Eftevaag size_t offset_loc = (offset != NULL)? *offset : 0;
408*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2B_NAME_Marshal(&src->bound_entity, buffer, size, &offset_loc);
409*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield bound_entity");
410*758e9fbaSOystein Eftevaag
411*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2B_ENCRYPTED_SECRET_Marshal(&src->encryptedSalt, buffer, size, &offset_loc);
412*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield encryptedSalt");
413*758e9fbaSOystein Eftevaag
414*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2B_DATA_Marshal(&src->salt, buffer, size, &offset_loc);
415*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield salt");
416*758e9fbaSOystein Eftevaag
417*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPMT_SYM_DEF_Marshal(&src->symmetric, buffer, size, &offset_loc);
418*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield symmetric");
419*758e9fbaSOystein Eftevaag
420*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPMI_ALG_HASH_Marshal(src->authHash, buffer, size, &offset_loc);
421*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield authHash");
422*758e9fbaSOystein Eftevaag
423*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2B_DIGEST_Marshal(&src->sessionKey, buffer, size, &offset_loc);
424*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield sessionKey");
425*758e9fbaSOystein Eftevaag
426*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2_SE_Marshal(src->sessionType, buffer, size, &offset_loc);
427*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield sessionType");
428*758e9fbaSOystein Eftevaag
429*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPMA_SESSION_Marshal(src->sessionAttributes, buffer, size, &offset_loc);
430*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield sessionAttributes");
431*758e9fbaSOystein Eftevaag
432*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2B_NONCE_Marshal(&src->nonceCaller, buffer, size, &offset_loc);
433*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield nonceCaller");
434*758e9fbaSOystein Eftevaag
435*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2B_NONCE_Marshal(&src->nonceTPM, buffer, size, &offset_loc);
436*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield nonceTPM");
437*758e9fbaSOystein Eftevaag
438*758e9fbaSOystein Eftevaag ret = iesys_MU_IESYSC_PARAM_ENCRYPT_Marshal(src->encrypt, buffer, size, &offset_loc);
439*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield encrypt");
440*758e9fbaSOystein Eftevaag
441*758e9fbaSOystein Eftevaag ret = iesys_MU_IESYSC_PARAM_DECRYPT_Marshal(src->decrypt, buffer, size, &offset_loc);
442*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield decrypt");
443*758e9fbaSOystein Eftevaag
444*758e9fbaSOystein Eftevaag ret = iesys_MU_IESYSC_TYPE_POLICY_AUTH_Marshal(src->type_policy_session, buffer, size, &offset_loc);
445*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield type_policy_session");
446*758e9fbaSOystein Eftevaag
447*758e9fbaSOystein Eftevaag ret = Tss2_MU_UINT16_Marshal(src->sizeSessionValue, buffer, size, &offset_loc);
448*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield sizeSessionValue");
449*758e9fbaSOystein Eftevaag
450*758e9fbaSOystein Eftevaag ret = iesys_MU_BYTE_array_Marshal(&src->sessionValue[0], src->sizeSessionValue,
451*758e9fbaSOystein Eftevaag buffer, size, &offset_loc);
452*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield sessionValue");
453*758e9fbaSOystein Eftevaag
454*758e9fbaSOystein Eftevaag ret = Tss2_MU_UINT16_Marshal(src->sizeHmacValue, buffer, size, &offset_loc);
455*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield sizeHmacValue");
456*758e9fbaSOystein Eftevaag
457*758e9fbaSOystein Eftevaag if (offset != NULL)
458*758e9fbaSOystein Eftevaag *offset = offset_loc;
459*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
460*758e9fbaSOystein Eftevaag }
461*758e9fbaSOystein Eftevaag
462*758e9fbaSOystein Eftevaag /** Unmarshal a IESYS_SESSION variable from a byte buffer.
463*758e9fbaSOystein Eftevaag *
464*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to read data from.
465*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
466*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer
467*758e9fbaSOystein Eftevaag * (being updated during marshaling).
468*758e9fbaSOystein Eftevaag * @param[out] out variable to store the result in.
469*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
470*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_BAD_REFERENCE if buffer==NULL.
471*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
472*758e9fbaSOystein Eftevaag */
473*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYS_SESSION_Unmarshal(const uint8_t * buffer,size_t size,size_t * offset,IESYS_SESSION * dst)474*758e9fbaSOystein Eftevaag iesys_MU_IESYS_SESSION_Unmarshal(
475*758e9fbaSOystein Eftevaag const uint8_t *buffer,
476*758e9fbaSOystein Eftevaag size_t size,
477*758e9fbaSOystein Eftevaag size_t *offset,
478*758e9fbaSOystein Eftevaag IESYS_SESSION *dst)
479*758e9fbaSOystein Eftevaag {
480*758e9fbaSOystein Eftevaag LOG_TRACE("called: buffer=%p size=%zu offset=%p dst=%p",
481*758e9fbaSOystein Eftevaag buffer, size, offset, dst);
482*758e9fbaSOystein Eftevaag if (buffer == NULL) {
483*758e9fbaSOystein Eftevaag LOG_ERROR("buffer=NULL");
484*758e9fbaSOystein Eftevaag return TSS2_ESYS_RC_BAD_REFERENCE;
485*758e9fbaSOystein Eftevaag }
486*758e9fbaSOystein Eftevaag TSS2_RC ret;
487*758e9fbaSOystein Eftevaag size_t offset_loc = (offset != NULL)? *offset : 0;
488*758e9fbaSOystein Eftevaag if (dst != NULL)
489*758e9fbaSOystein Eftevaag memset(dst, 0, sizeof(*dst));
490*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2B_NAME_Unmarshal(buffer, size, &offset_loc,
491*758e9fbaSOystein Eftevaag (dst == NULL)? NULL : &dst->bound_entity);
492*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield bound_entity");
493*758e9fbaSOystein Eftevaag
494*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2B_ENCRYPTED_SECRET_Unmarshal(buffer, size, &offset_loc,
495*758e9fbaSOystein Eftevaag (dst == NULL)? NULL : &dst->encryptedSalt);
496*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield encryptedSalt");
497*758e9fbaSOystein Eftevaag
498*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2B_DATA_Unmarshal(buffer, size, &offset_loc,
499*758e9fbaSOystein Eftevaag (dst == NULL)? NULL : &dst->salt);
500*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield salt");
501*758e9fbaSOystein Eftevaag
502*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPMT_SYM_DEF_Unmarshal(buffer, size, &offset_loc,
503*758e9fbaSOystein Eftevaag (dst == NULL)? NULL : &dst->symmetric);
504*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield symmetric");
505*758e9fbaSOystein Eftevaag
506*758e9fbaSOystein Eftevaag TPMI_ALG_HASH out_authHash;
507*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPMI_ALG_HASH_Unmarshal(buffer, size, &offset_loc,
508*758e9fbaSOystein Eftevaag (dst == NULL)? &out_authHash : &dst->authHash);
509*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield authHash");
510*758e9fbaSOystein Eftevaag
511*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2B_DIGEST_Unmarshal(buffer, size, &offset_loc,
512*758e9fbaSOystein Eftevaag (dst == NULL)? NULL : &dst->sessionKey);
513*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield sessionKey");
514*758e9fbaSOystein Eftevaag
515*758e9fbaSOystein Eftevaag TPM2_SE out_sessionType;
516*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2_SE_Unmarshal(buffer, size, &offset_loc,
517*758e9fbaSOystein Eftevaag (dst == NULL)? &out_sessionType : &dst->sessionType);
518*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield sessionType");
519*758e9fbaSOystein Eftevaag
520*758e9fbaSOystein Eftevaag TPMA_SESSION out_sessionAttributes;
521*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPMA_SESSION_Unmarshal(buffer, size, &offset_loc,
522*758e9fbaSOystein Eftevaag (dst == NULL)? &out_sessionAttributes : &dst->sessionAttributes);
523*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield sessionAttributes");
524*758e9fbaSOystein Eftevaag
525*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2B_NONCE_Unmarshal(buffer, size, &offset_loc,
526*758e9fbaSOystein Eftevaag (dst == NULL)? NULL : &dst->nonceCaller);
527*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield nonceCaller");
528*758e9fbaSOystein Eftevaag
529*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2B_NONCE_Unmarshal(buffer, size, &offset_loc,
530*758e9fbaSOystein Eftevaag (dst == NULL)? NULL : &dst->nonceTPM);
531*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield nonceTPM");
532*758e9fbaSOystein Eftevaag
533*758e9fbaSOystein Eftevaag IESYSC_PARAM_ENCRYPT out_encrypt;
534*758e9fbaSOystein Eftevaag ret = iesys_MU_IESYSC_PARAM_ENCRYPT_Unmarshal(buffer, size, &offset_loc,
535*758e9fbaSOystein Eftevaag (dst == NULL)? &out_encrypt : &dst->encrypt);
536*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield encrypt");
537*758e9fbaSOystein Eftevaag
538*758e9fbaSOystein Eftevaag IESYSC_PARAM_DECRYPT out_decrypt;
539*758e9fbaSOystein Eftevaag ret = iesys_MU_IESYSC_PARAM_DECRYPT_Unmarshal(buffer, size, &offset_loc,
540*758e9fbaSOystein Eftevaag (dst == NULL)? &out_decrypt : &dst->decrypt);
541*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield decrypt");
542*758e9fbaSOystein Eftevaag
543*758e9fbaSOystein Eftevaag IESYSC_TYPE_POLICY_AUTH out_type_policy_session;
544*758e9fbaSOystein Eftevaag ret = iesys_MU_IESYSC_TYPE_POLICY_AUTH_Unmarshal(buffer, size, &offset_loc,
545*758e9fbaSOystein Eftevaag (dst == NULL)? &out_type_policy_session : &dst->type_policy_session);
546*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield type_policy_session");
547*758e9fbaSOystein Eftevaag
548*758e9fbaSOystein Eftevaag UINT16 out_sizeSessionValue;
549*758e9fbaSOystein Eftevaag ret = Tss2_MU_UINT16_Unmarshal(buffer, size, &offset_loc,
550*758e9fbaSOystein Eftevaag (dst == NULL)? &out_sizeSessionValue : &dst->sizeSessionValue);
551*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield sizeSessionValue");
552*758e9fbaSOystein Eftevaag
553*758e9fbaSOystein Eftevaag ret = iesys_MU_BYTE_array_Unmarshal(buffer, size, &offset_loc,
554*758e9fbaSOystein Eftevaag (dst == NULL)? out_sizeSessionValue : dst->sizeSessionValue,
555*758e9fbaSOystein Eftevaag (dst == NULL)? NULL : &dst->sessionValue[0]);
556*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield sessionValue");
557*758e9fbaSOystein Eftevaag
558*758e9fbaSOystein Eftevaag UINT16 out_sizeHmacValue;
559*758e9fbaSOystein Eftevaag ret = Tss2_MU_UINT16_Unmarshal(buffer, size, &offset_loc,
560*758e9fbaSOystein Eftevaag (dst == NULL)? &out_sizeHmacValue : &dst->sizeHmacValue);
561*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield sizeHmacValue");
562*758e9fbaSOystein Eftevaag
563*758e9fbaSOystein Eftevaag if (offset != NULL)
564*758e9fbaSOystein Eftevaag *offset = offset_loc;
565*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
566*758e9fbaSOystein Eftevaag }
567*758e9fbaSOystein Eftevaag
568*758e9fbaSOystein Eftevaag /** Marshal a IESYSC_RESOURCE_TYPE type into a byte buffer.
569*758e9fbaSOystein Eftevaag *
570*758e9fbaSOystein Eftevaag * @param[in] src constant to be marshaled.
571*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to write result into (may be NULL)
572*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
573*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer (may be NULL.
574*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
575*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
576*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
577*758e9fbaSOystein Eftevaag */
578*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYSC_RESOURCE_TYPE_Marshal(const IESYSC_RESOURCE_TYPE src,uint8_t * buffer,size_t size,size_t * offset)579*758e9fbaSOystein Eftevaag iesys_MU_IESYSC_RESOURCE_TYPE_Marshal(
580*758e9fbaSOystein Eftevaag const IESYSC_RESOURCE_TYPE src,
581*758e9fbaSOystein Eftevaag uint8_t *buffer,
582*758e9fbaSOystein Eftevaag size_t size,
583*758e9fbaSOystein Eftevaag size_t *offset)
584*758e9fbaSOystein Eftevaag {
585*758e9fbaSOystein Eftevaag LOG_TRACE("called: src=%"PRIx32 " buffer=%p size=%zu offset=%p", src,
586*758e9fbaSOystein Eftevaag buffer, size, offset);
587*758e9fbaSOystein Eftevaag return Tss2_MU_UINT32_Marshal(src, buffer, size, offset);
588*758e9fbaSOystein Eftevaag }
589*758e9fbaSOystein Eftevaag
590*758e9fbaSOystein Eftevaag /** Unmarshal a IESYSC_RESOURCE_TYPE type from a byte buffer.
591*758e9fbaSOystein Eftevaag *
592*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to read data from.
593*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
594*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer
595*758e9fbaSOystein Eftevaag * (being updated during marshaling).
596*758e9fbaSOystein Eftevaag * @param[out] dst variable to store the result in.
597*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
598*758e9fbaSOystein Eftevaag */
599*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYSC_RESOURCE_TYPE_Unmarshal(const uint8_t * buffer,size_t size,size_t * offset,IESYSC_RESOURCE_TYPE * dst)600*758e9fbaSOystein Eftevaag iesys_MU_IESYSC_RESOURCE_TYPE_Unmarshal(
601*758e9fbaSOystein Eftevaag const uint8_t *buffer,
602*758e9fbaSOystein Eftevaag size_t size,
603*758e9fbaSOystein Eftevaag size_t *offset,
604*758e9fbaSOystein Eftevaag IESYSC_RESOURCE_TYPE *dst)
605*758e9fbaSOystein Eftevaag {
606*758e9fbaSOystein Eftevaag LOG_TRACE("called: buffer=%p size=%zu offset=%p dst=%p",
607*758e9fbaSOystein Eftevaag buffer, size, offset, dst);
608*758e9fbaSOystein Eftevaag IESYSC_RESOURCE_TYPE dst_loc;
609*758e9fbaSOystein Eftevaag TSS2_RC ret = Tss2_MU_UINT32_Unmarshal(buffer, size,
610*758e9fbaSOystein Eftevaag offset, &dst_loc);
611*758e9fbaSOystein Eftevaag return_if_error(ret, "Unmarshaling the base type");
612*758e9fbaSOystein Eftevaag
613*758e9fbaSOystein Eftevaag ret = iesys_MU_IESYSC_RESOURCE_TYPE_check(&dst_loc);
614*758e9fbaSOystein Eftevaag if (ret != TSS2_RC_SUCCESS) {
615*758e9fbaSOystein Eftevaag LOG_ERROR("Bad value %"PRIx32 "", dst_loc);
616*758e9fbaSOystein Eftevaag return ret;
617*758e9fbaSOystein Eftevaag }
618*758e9fbaSOystein Eftevaag if (dst != NULL)
619*758e9fbaSOystein Eftevaag *dst = dst_loc;
620*758e9fbaSOystein Eftevaag LOG_TRACE("return: dst=%p value=%"PRIx32 "", dst, dst_loc);
621*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
622*758e9fbaSOystein Eftevaag }
623*758e9fbaSOystein Eftevaag /** Check, if a variable has a possible value of type IESYSC_RESOURCE_TYPE.
624*758e9fbaSOystein Eftevaag *
625*758e9fbaSOystein Eftevaag * @param[in] in variable to check.
626*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
627*758e9fbaSOystein Eftevaag */
628*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYSC_RESOURCE_TYPE_check(const IESYSC_RESOURCE_TYPE * in)629*758e9fbaSOystein Eftevaag iesys_MU_IESYSC_RESOURCE_TYPE_check(
630*758e9fbaSOystein Eftevaag const IESYSC_RESOURCE_TYPE *in)
631*758e9fbaSOystein Eftevaag {
632*758e9fbaSOystein Eftevaag LOG_TRACE("called: in=%p", in);
633*758e9fbaSOystein Eftevaag return_if_null(in, "in==NULL", TSS2_SYS_RC_BAD_REFERENCE);
634*758e9fbaSOystein Eftevaag
635*758e9fbaSOystein Eftevaag /* No Error-Messages, since this function may fail for a good reasons. */
636*758e9fbaSOystein Eftevaag if (FALSE
637*758e9fbaSOystein Eftevaag || (*in == IESYSC_KEY_RSRC)
638*758e9fbaSOystein Eftevaag || (*in == IESYSC_NV_RSRC)
639*758e9fbaSOystein Eftevaag || (*in == IESYSC_SESSION_RSRC)
640*758e9fbaSOystein Eftevaag || (*in == IESYSC_WITHOUT_MISC_RSRC)) {
641*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
642*758e9fbaSOystein Eftevaag } else {
643*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_VALUE;
644*758e9fbaSOystein Eftevaag }
645*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
646*758e9fbaSOystein Eftevaag }
647*758e9fbaSOystein Eftevaag
648*758e9fbaSOystein Eftevaag /** Marshal a IESYS_RSRC_UNION union into a byte buffer.
649*758e9fbaSOystein Eftevaag *
650*758e9fbaSOystein Eftevaag * @param[in] src variable to be marshaled.
651*758e9fbaSOystein Eftevaag * @param[in] selector the selector value.
652*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to write result into.
653*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
654*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer
655*758e9fbaSOystein Eftevaag * (being updated during marshaling).
656*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
657*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
658*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
659*758e9fbaSOystein Eftevaag */
660*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYS_RSRC_UNION_Marshal(const IESYS_RSRC_UNION * src,UINT32 selector,uint8_t * buffer,size_t size,size_t * offset)661*758e9fbaSOystein Eftevaag iesys_MU_IESYS_RSRC_UNION_Marshal(
662*758e9fbaSOystein Eftevaag const IESYS_RSRC_UNION *src,
663*758e9fbaSOystein Eftevaag UINT32 selector,
664*758e9fbaSOystein Eftevaag uint8_t *buffer,
665*758e9fbaSOystein Eftevaag size_t size,
666*758e9fbaSOystein Eftevaag size_t *offset)
667*758e9fbaSOystein Eftevaag {
668*758e9fbaSOystein Eftevaag LOG_TRACE("called: src=%p buffer=%p size=%zu offset=%p", src,
669*758e9fbaSOystein Eftevaag buffer, size, offset);
670*758e9fbaSOystein Eftevaag if (src == NULL) {
671*758e9fbaSOystein Eftevaag LOG_ERROR("src=NULL");
672*758e9fbaSOystein Eftevaag return TSS2_ESYS_RC_BAD_REFERENCE;
673*758e9fbaSOystein Eftevaag }
674*758e9fbaSOystein Eftevaag
675*758e9fbaSOystein Eftevaag switch (selector) {
676*758e9fbaSOystein Eftevaag case IESYSC_KEY_RSRC:
677*758e9fbaSOystein Eftevaag return Tss2_MU_TPM2B_PUBLIC_Marshal(&src->rsrc_key_pub, buffer, size, offset);
678*758e9fbaSOystein Eftevaag case IESYSC_NV_RSRC:
679*758e9fbaSOystein Eftevaag return Tss2_MU_TPM2B_NV_PUBLIC_Marshal(&src->rsrc_nv_pub, buffer, size, offset);
680*758e9fbaSOystein Eftevaag case IESYSC_SESSION_RSRC:
681*758e9fbaSOystein Eftevaag return iesys_MU_IESYS_SESSION_Marshal(&src->rsrc_session, buffer, size, offset);
682*758e9fbaSOystein Eftevaag case IESYSC_WITHOUT_MISC_RSRC:
683*758e9fbaSOystein Eftevaag return Tss2_MU_TPMS_EMPTY_Marshal(&src->rsrc_empty, buffer, size, offset);
684*758e9fbaSOystein Eftevaag default:
685*758e9fbaSOystein Eftevaag LOG_ERROR("Selector value %"PRIu32 " not found", selector);
686*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_VALUE;
687*758e9fbaSOystein Eftevaag };
688*758e9fbaSOystein Eftevaag }
689*758e9fbaSOystein Eftevaag
690*758e9fbaSOystein Eftevaag /** Unmarshal a IESYS_RSRC_UNION union from a byte buffer.
691*758e9fbaSOystein Eftevaag *
692*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to read data from.
693*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
694*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer (may be NULL).
695*758e9fbaSOystein Eftevaag * @param[in] selector The selector.
696*758e9fbaSOystein Eftevaag * @param[out] out variable to store the result in (may be NULL).
697*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
698*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
699*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
700*758e9fbaSOystein Eftevaag */
701*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYS_RSRC_UNION_Unmarshal(const uint8_t * buffer,size_t size,size_t * offset,UINT32 selector,IESYS_RSRC_UNION * dst)702*758e9fbaSOystein Eftevaag iesys_MU_IESYS_RSRC_UNION_Unmarshal(
703*758e9fbaSOystein Eftevaag const uint8_t *buffer,
704*758e9fbaSOystein Eftevaag size_t size,
705*758e9fbaSOystein Eftevaag size_t *offset,
706*758e9fbaSOystein Eftevaag UINT32 selector,
707*758e9fbaSOystein Eftevaag IESYS_RSRC_UNION *dst)
708*758e9fbaSOystein Eftevaag {
709*758e9fbaSOystein Eftevaag LOG_TRACE("called: buffer=%p size=%zu offset=%p dst=%p",
710*758e9fbaSOystein Eftevaag buffer, size, offset, dst);
711*758e9fbaSOystein Eftevaag if (buffer == NULL) {
712*758e9fbaSOystein Eftevaag LOG_ERROR("buffer=NULL");
713*758e9fbaSOystein Eftevaag return TSS2_ESYS_RC_BAD_REFERENCE;
714*758e9fbaSOystein Eftevaag }
715*758e9fbaSOystein Eftevaag switch (selector) {
716*758e9fbaSOystein Eftevaag case IESYSC_KEY_RSRC:
717*758e9fbaSOystein Eftevaag return Tss2_MU_TPM2B_PUBLIC_Unmarshal(buffer, size, offset,
718*758e9fbaSOystein Eftevaag (dst != NULL)? &dst->rsrc_key_pub : NULL);
719*758e9fbaSOystein Eftevaag case IESYSC_NV_RSRC:
720*758e9fbaSOystein Eftevaag return Tss2_MU_TPM2B_NV_PUBLIC_Unmarshal(buffer, size, offset,
721*758e9fbaSOystein Eftevaag (dst != NULL)? &dst->rsrc_nv_pub : NULL);
722*758e9fbaSOystein Eftevaag case IESYSC_SESSION_RSRC:
723*758e9fbaSOystein Eftevaag return iesys_MU_IESYS_SESSION_Unmarshal(buffer, size, offset,
724*758e9fbaSOystein Eftevaag (dst != NULL)? &dst->rsrc_session : NULL);
725*758e9fbaSOystein Eftevaag case IESYSC_WITHOUT_MISC_RSRC:
726*758e9fbaSOystein Eftevaag return Tss2_MU_TPMS_EMPTY_Unmarshal(buffer, size, offset,
727*758e9fbaSOystein Eftevaag (dst != NULL)? &dst->rsrc_empty : NULL);
728*758e9fbaSOystein Eftevaag default:
729*758e9fbaSOystein Eftevaag LOG_ERROR("Selector value %"PRIu32 " not found", selector);
730*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_VALUE;
731*758e9fbaSOystein Eftevaag };
732*758e9fbaSOystein Eftevaag }
733*758e9fbaSOystein Eftevaag
734*758e9fbaSOystein Eftevaag /** Marshal a IESYS_RESOURCE structure into a byte buffer.
735*758e9fbaSOystein Eftevaag *
736*758e9fbaSOystein Eftevaag * @param[in] src variable to be marshaled.
737*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to write result into.
738*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
739*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer
740*758e9fbaSOystein Eftevaag * (being updated during marshaling).
741*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
742*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
743*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
744*758e9fbaSOystein Eftevaag */
745*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYS_RESOURCE_Marshal(const IESYS_RESOURCE * src,uint8_t * buffer,size_t size,size_t * offset)746*758e9fbaSOystein Eftevaag iesys_MU_IESYS_RESOURCE_Marshal(
747*758e9fbaSOystein Eftevaag const IESYS_RESOURCE *src,
748*758e9fbaSOystein Eftevaag uint8_t *buffer,
749*758e9fbaSOystein Eftevaag size_t size,
750*758e9fbaSOystein Eftevaag size_t *offset)
751*758e9fbaSOystein Eftevaag {
752*758e9fbaSOystein Eftevaag LOG_TRACE("called: src=%p buffer=%p size=%zu offset=%p", src,
753*758e9fbaSOystein Eftevaag buffer, size, offset);
754*758e9fbaSOystein Eftevaag if (src == NULL) {
755*758e9fbaSOystein Eftevaag LOG_ERROR("src=NULL");
756*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_REFERENCE;
757*758e9fbaSOystein Eftevaag }
758*758e9fbaSOystein Eftevaag TSS2_RC ret;
759*758e9fbaSOystein Eftevaag size_t offset_loc = (offset != NULL)? *offset : 0;
760*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2_HANDLE_Marshal(src->handle, buffer, size, &offset_loc);
761*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield handle");
762*758e9fbaSOystein Eftevaag
763*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2B_NAME_Marshal(&src->name, buffer, size, &offset_loc);
764*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield name");
765*758e9fbaSOystein Eftevaag
766*758e9fbaSOystein Eftevaag ret = iesys_MU_IESYSC_RESOURCE_TYPE_Marshal(src->rsrcType, buffer, size, &offset_loc);
767*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield rsrcType");
768*758e9fbaSOystein Eftevaag
769*758e9fbaSOystein Eftevaag ret = iesys_MU_IESYS_RSRC_UNION_Marshal(&src->misc, src->rsrcType,
770*758e9fbaSOystein Eftevaag buffer, size, &offset_loc);
771*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield misc");
772*758e9fbaSOystein Eftevaag
773*758e9fbaSOystein Eftevaag if (offset != NULL)
774*758e9fbaSOystein Eftevaag *offset = offset_loc;
775*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
776*758e9fbaSOystein Eftevaag }
777*758e9fbaSOystein Eftevaag
778*758e9fbaSOystein Eftevaag /** Unmarshal a IESYS_RESOURCE variable from a byte buffer.
779*758e9fbaSOystein Eftevaag *
780*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to read data from.
781*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
782*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer
783*758e9fbaSOystein Eftevaag * (being updated during marshaling).
784*758e9fbaSOystein Eftevaag * @param[out] out variable to store the result in.
785*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
786*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_BAD_REFERENCE if buffer==NULL.
787*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
788*758e9fbaSOystein Eftevaag */
789*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYS_RESOURCE_Unmarshal(const uint8_t * buffer,size_t size,size_t * offset,IESYS_RESOURCE * dst)790*758e9fbaSOystein Eftevaag iesys_MU_IESYS_RESOURCE_Unmarshal(
791*758e9fbaSOystein Eftevaag const uint8_t *buffer,
792*758e9fbaSOystein Eftevaag size_t size,
793*758e9fbaSOystein Eftevaag size_t *offset,
794*758e9fbaSOystein Eftevaag IESYS_RESOURCE *dst)
795*758e9fbaSOystein Eftevaag {
796*758e9fbaSOystein Eftevaag LOG_TRACE("called: buffer=%p size=%zu offset=%p dst=%p",
797*758e9fbaSOystein Eftevaag buffer, size, offset, dst);
798*758e9fbaSOystein Eftevaag if (buffer == NULL) {
799*758e9fbaSOystein Eftevaag LOG_ERROR("buffer=NULL");
800*758e9fbaSOystein Eftevaag return TSS2_ESYS_RC_BAD_REFERENCE;
801*758e9fbaSOystein Eftevaag }
802*758e9fbaSOystein Eftevaag TSS2_RC ret;
803*758e9fbaSOystein Eftevaag size_t offset_loc = (offset != NULL)? *offset : 0;
804*758e9fbaSOystein Eftevaag if (dst != NULL)
805*758e9fbaSOystein Eftevaag memset(dst, 0, sizeof(*dst));
806*758e9fbaSOystein Eftevaag TPM2_HANDLE out_handle;
807*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2_HANDLE_Unmarshal(buffer, size, &offset_loc,
808*758e9fbaSOystein Eftevaag (dst == NULL)? &out_handle : &dst->handle);
809*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield handle");
810*758e9fbaSOystein Eftevaag
811*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2B_NAME_Unmarshal(buffer, size, &offset_loc,
812*758e9fbaSOystein Eftevaag (dst == NULL)? NULL : &dst->name);
813*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield name");
814*758e9fbaSOystein Eftevaag
815*758e9fbaSOystein Eftevaag IESYSC_RESOURCE_TYPE out_rsrcType;
816*758e9fbaSOystein Eftevaag ret = iesys_MU_IESYSC_RESOURCE_TYPE_Unmarshal(buffer, size, &offset_loc,
817*758e9fbaSOystein Eftevaag (dst == NULL)? &out_rsrcType : &dst->rsrcType);
818*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield rsrcType");
819*758e9fbaSOystein Eftevaag
820*758e9fbaSOystein Eftevaag ret = iesys_MU_IESYS_RSRC_UNION_Unmarshal(buffer, size, &offset_loc,
821*758e9fbaSOystein Eftevaag (dst == NULL)? out_rsrcType : dst->rsrcType,
822*758e9fbaSOystein Eftevaag (dst == NULL)? NULL : &dst->misc);
823*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield misc");
824*758e9fbaSOystein Eftevaag
825*758e9fbaSOystein Eftevaag if (offset != NULL)
826*758e9fbaSOystein Eftevaag *offset = offset_loc;
827*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
828*758e9fbaSOystein Eftevaag }
829*758e9fbaSOystein Eftevaag
830*758e9fbaSOystein Eftevaag /** Marshal a IESYS_METADATA structure into a byte buffer.
831*758e9fbaSOystein Eftevaag *
832*758e9fbaSOystein Eftevaag * @param[in] src variable to be marshaled.
833*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to write result into.
834*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
835*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer
836*758e9fbaSOystein Eftevaag * (being updated during marshaling).
837*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
838*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
839*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
840*758e9fbaSOystein Eftevaag */
841*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYS_METADATA_Marshal(const IESYS_METADATA * src,uint8_t * buffer,size_t size,size_t * offset)842*758e9fbaSOystein Eftevaag iesys_MU_IESYS_METADATA_Marshal(
843*758e9fbaSOystein Eftevaag const IESYS_METADATA *src,
844*758e9fbaSOystein Eftevaag uint8_t *buffer,
845*758e9fbaSOystein Eftevaag size_t size,
846*758e9fbaSOystein Eftevaag size_t *offset)
847*758e9fbaSOystein Eftevaag {
848*758e9fbaSOystein Eftevaag LOG_TRACE("called: src=%p buffer=%p size=%zu offset=%p", src,
849*758e9fbaSOystein Eftevaag buffer, size, offset);
850*758e9fbaSOystein Eftevaag if (src == NULL) {
851*758e9fbaSOystein Eftevaag LOG_ERROR("src=NULL");
852*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_REFERENCE;
853*758e9fbaSOystein Eftevaag }
854*758e9fbaSOystein Eftevaag TSS2_RC ret;
855*758e9fbaSOystein Eftevaag size_t offset_loc = (offset != NULL)? *offset : 0;
856*758e9fbaSOystein Eftevaag ret = Tss2_MU_UINT16_Marshal(src->size, buffer, size, &offset_loc);
857*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield size");
858*758e9fbaSOystein Eftevaag
859*758e9fbaSOystein Eftevaag ret = iesys_MU_IESYS_RESOURCE_Marshal(&src->data, buffer, size, &offset_loc);
860*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield data");
861*758e9fbaSOystein Eftevaag
862*758e9fbaSOystein Eftevaag if (offset != NULL)
863*758e9fbaSOystein Eftevaag *offset = offset_loc;
864*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
865*758e9fbaSOystein Eftevaag }
866*758e9fbaSOystein Eftevaag
867*758e9fbaSOystein Eftevaag /** Unmarshal a IESYS_METADATA variable from a byte buffer.
868*758e9fbaSOystein Eftevaag *
869*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to read data from.
870*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
871*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer
872*758e9fbaSOystein Eftevaag * (being updated during marshaling).
873*758e9fbaSOystein Eftevaag * @param[out] out variable to store the result in.
874*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
875*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_BAD_REFERENCE if buffer==NULL.
876*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
877*758e9fbaSOystein Eftevaag */
878*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYS_METADATA_Unmarshal(const uint8_t * buffer,size_t size,size_t * offset,IESYS_METADATA * dst)879*758e9fbaSOystein Eftevaag iesys_MU_IESYS_METADATA_Unmarshal(
880*758e9fbaSOystein Eftevaag const uint8_t *buffer,
881*758e9fbaSOystein Eftevaag size_t size,
882*758e9fbaSOystein Eftevaag size_t *offset,
883*758e9fbaSOystein Eftevaag IESYS_METADATA *dst)
884*758e9fbaSOystein Eftevaag {
885*758e9fbaSOystein Eftevaag LOG_TRACE("called: buffer=%p size=%zu offset=%p dst=%p",
886*758e9fbaSOystein Eftevaag buffer, size, offset, dst);
887*758e9fbaSOystein Eftevaag if (buffer == NULL) {
888*758e9fbaSOystein Eftevaag LOG_ERROR("buffer=NULL");
889*758e9fbaSOystein Eftevaag return TSS2_ESYS_RC_BAD_REFERENCE;
890*758e9fbaSOystein Eftevaag }
891*758e9fbaSOystein Eftevaag TSS2_RC ret;
892*758e9fbaSOystein Eftevaag size_t offset_loc = (offset != NULL)? *offset : 0;
893*758e9fbaSOystein Eftevaag if (dst != NULL)
894*758e9fbaSOystein Eftevaag memset(dst, 0, sizeof(*dst));
895*758e9fbaSOystein Eftevaag UINT16 out_size;
896*758e9fbaSOystein Eftevaag ret = Tss2_MU_UINT16_Unmarshal(buffer, size, &offset_loc,
897*758e9fbaSOystein Eftevaag (dst == NULL)? &out_size : &dst->size);
898*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield size");
899*758e9fbaSOystein Eftevaag
900*758e9fbaSOystein Eftevaag IESYS_RESOURCE out_data;
901*758e9fbaSOystein Eftevaag ret = iesys_MU_IESYS_RESOURCE_Unmarshal(buffer, size, &offset_loc,
902*758e9fbaSOystein Eftevaag (dst == NULL)? &out_data : &dst->data);
903*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield data");
904*758e9fbaSOystein Eftevaag
905*758e9fbaSOystein Eftevaag if (offset != NULL)
906*758e9fbaSOystein Eftevaag *offset = offset_loc;
907*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
908*758e9fbaSOystein Eftevaag }
909*758e9fbaSOystein Eftevaag
910*758e9fbaSOystein Eftevaag /** Marshal a IESYS_CONTEXT_DATA structure into a byte buffer.
911*758e9fbaSOystein Eftevaag *
912*758e9fbaSOystein Eftevaag * @param[in] src variable to be marshaled.
913*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to write result into.
914*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
915*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer
916*758e9fbaSOystein Eftevaag * (being updated during marshaling).
917*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
918*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
919*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
920*758e9fbaSOystein Eftevaag */
921*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYS_CONTEXT_DATA_Marshal(const IESYS_CONTEXT_DATA * src,uint8_t * buffer,size_t size,size_t * offset)922*758e9fbaSOystein Eftevaag iesys_MU_IESYS_CONTEXT_DATA_Marshal(
923*758e9fbaSOystein Eftevaag const IESYS_CONTEXT_DATA *src,
924*758e9fbaSOystein Eftevaag uint8_t *buffer,
925*758e9fbaSOystein Eftevaag size_t size,
926*758e9fbaSOystein Eftevaag size_t *offset)
927*758e9fbaSOystein Eftevaag {
928*758e9fbaSOystein Eftevaag LOG_TRACE("called: src=%p buffer=%p size=%zu offset=%p", src,
929*758e9fbaSOystein Eftevaag buffer, size, offset);
930*758e9fbaSOystein Eftevaag if (src == NULL) {
931*758e9fbaSOystein Eftevaag LOG_ERROR("src=NULL");
932*758e9fbaSOystein Eftevaag return TSS2_SYS_RC_BAD_REFERENCE;
933*758e9fbaSOystein Eftevaag }
934*758e9fbaSOystein Eftevaag TSS2_RC ret;
935*758e9fbaSOystein Eftevaag size_t offset_loc = (offset != NULL)? *offset : 0;
936*758e9fbaSOystein Eftevaag ret = Tss2_MU_UINT32_Marshal(src->reserved, buffer, size, &offset_loc);
937*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield reserved");
938*758e9fbaSOystein Eftevaag
939*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2B_CONTEXT_DATA_Marshal(&src->tpmContext, buffer, size, &offset_loc);
940*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield tpmContext");
941*758e9fbaSOystein Eftevaag
942*758e9fbaSOystein Eftevaag ret = iesys_MU_IESYS_METADATA_Marshal(&src->esysMetadata, buffer, size, &offset_loc);
943*758e9fbaSOystein Eftevaag return_if_error(ret, "Error marshaling subfield esysMetadata");
944*758e9fbaSOystein Eftevaag
945*758e9fbaSOystein Eftevaag if (offset != NULL)
946*758e9fbaSOystein Eftevaag *offset = offset_loc;
947*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
948*758e9fbaSOystein Eftevaag }
949*758e9fbaSOystein Eftevaag
950*758e9fbaSOystein Eftevaag /** Unmarshal a IESYS_CONTEXT_DATA variable from a byte buffer.
951*758e9fbaSOystein Eftevaag *
952*758e9fbaSOystein Eftevaag * @param[in,out] buffer Buffer to read data from.
953*758e9fbaSOystein Eftevaag * @param[in] size Size of the buffer.
954*758e9fbaSOystein Eftevaag * @param[in,out] offset Offset inside the buffer
955*758e9fbaSOystein Eftevaag * (being updated during marshaling).
956*758e9fbaSOystein Eftevaag * @param[out] out variable to store the result in.
957*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS on success.
958*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_BAD_REFERENCE if buffer==NULL.
959*758e9fbaSOystein Eftevaag * @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
960*758e9fbaSOystein Eftevaag */
961*758e9fbaSOystein Eftevaag TSS2_RC
iesys_MU_IESYS_CONTEXT_DATA_Unmarshal(const uint8_t * buffer,size_t size,size_t * offset,IESYS_CONTEXT_DATA * dst)962*758e9fbaSOystein Eftevaag iesys_MU_IESYS_CONTEXT_DATA_Unmarshal(
963*758e9fbaSOystein Eftevaag const uint8_t *buffer,
964*758e9fbaSOystein Eftevaag size_t size,
965*758e9fbaSOystein Eftevaag size_t *offset,
966*758e9fbaSOystein Eftevaag IESYS_CONTEXT_DATA *dst)
967*758e9fbaSOystein Eftevaag {
968*758e9fbaSOystein Eftevaag LOG_TRACE("called: buffer=%p size=%zu offset=%p dst=%p",
969*758e9fbaSOystein Eftevaag buffer, size, offset, dst);
970*758e9fbaSOystein Eftevaag if (buffer == NULL) {
971*758e9fbaSOystein Eftevaag LOG_ERROR("buffer=NULL");
972*758e9fbaSOystein Eftevaag return TSS2_ESYS_RC_BAD_REFERENCE;
973*758e9fbaSOystein Eftevaag }
974*758e9fbaSOystein Eftevaag TSS2_RC ret;
975*758e9fbaSOystein Eftevaag size_t offset_loc = (offset != NULL)? *offset : 0;
976*758e9fbaSOystein Eftevaag if (dst != NULL)
977*758e9fbaSOystein Eftevaag memset(dst, 0, sizeof(*dst));
978*758e9fbaSOystein Eftevaag UINT32 out_reserved;
979*758e9fbaSOystein Eftevaag ret = Tss2_MU_UINT32_Unmarshal(buffer, size, &offset_loc,
980*758e9fbaSOystein Eftevaag (dst == NULL)? &out_reserved : &dst->reserved);
981*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield reserved");
982*758e9fbaSOystein Eftevaag
983*758e9fbaSOystein Eftevaag ret = Tss2_MU_TPM2B_CONTEXT_DATA_Unmarshal(buffer, size, &offset_loc,
984*758e9fbaSOystein Eftevaag (dst == NULL)? NULL : &dst->tpmContext);
985*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield tpmContext");
986*758e9fbaSOystein Eftevaag
987*758e9fbaSOystein Eftevaag IESYS_METADATA out_esysMetadata;
988*758e9fbaSOystein Eftevaag ret = iesys_MU_IESYS_METADATA_Unmarshal(buffer, size, &offset_loc,
989*758e9fbaSOystein Eftevaag (dst == NULL)? &out_esysMetadata : &dst->esysMetadata);
990*758e9fbaSOystein Eftevaag return_if_error(ret, "Error unmarshaling subfield esysMetadata");
991*758e9fbaSOystein Eftevaag
992*758e9fbaSOystein Eftevaag if (offset != NULL)
993*758e9fbaSOystein Eftevaag *offset = offset_loc;
994*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
995*758e9fbaSOystein Eftevaag }
996