xref: /aosp_15_r20/external/tpm2-tss/src/tss2-fapi/ifapi_json_deserialize.c (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /*******************************************************************************
3*758e9fbaSOystein Eftevaag  * Copyright 2018-2019, 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 <stdio.h>
12*758e9fbaSOystein Eftevaag #include <string.h>
13*758e9fbaSOystein Eftevaag 
14*758e9fbaSOystein Eftevaag #include "tpm_json_deserialize.h"
15*758e9fbaSOystein Eftevaag #include "ifapi_json_deserialize.h"
16*758e9fbaSOystein Eftevaag #include "fapi_policy.h"
17*758e9fbaSOystein Eftevaag #include "ifapi_config.h"
18*758e9fbaSOystein Eftevaag #define LOGMODULE fapijson
19*758e9fbaSOystein Eftevaag #include "util/log.h"
20*758e9fbaSOystein Eftevaag #include "util/aux_util.h"
21*758e9fbaSOystein Eftevaag 
22*758e9fbaSOystein Eftevaag static char *tss_const_prefixes[] = { "TPM2_ALG_", "TPM2_", "TPM_", "TPMA_", "POLICY", NULL };
23*758e9fbaSOystein Eftevaag 
24*758e9fbaSOystein Eftevaag /** Get the index of a sub string after a certain prefix.
25*758e9fbaSOystein Eftevaag  *
26*758e9fbaSOystein Eftevaag  * The prefixes from table tss_const_prefixes will be used for case
27*758e9fbaSOystein Eftevaag  * insensitive comparison.
28*758e9fbaSOystein Eftevaag  *
29*758e9fbaSOystein Eftevaag  * param[in] token the token with a potential prefix.
30*758e9fbaSOystein Eftevaag  * @retval the position of the sub string after the prefix.
31*758e9fbaSOystein Eftevaag  * @retval 0 if no prefix is found.
32*758e9fbaSOystein Eftevaag  */
33*758e9fbaSOystein Eftevaag static int
get_token_start_idx(const char * token)34*758e9fbaSOystein Eftevaag get_token_start_idx(const char *token)
35*758e9fbaSOystein Eftevaag {
36*758e9fbaSOystein Eftevaag     int itoken = 0;
37*758e9fbaSOystein Eftevaag     char *entry;
38*758e9fbaSOystein Eftevaag     int i;
39*758e9fbaSOystein Eftevaag 
40*758e9fbaSOystein Eftevaag     for (i = 0, entry = tss_const_prefixes[0]; entry != NULL;
41*758e9fbaSOystein Eftevaag             i++, entry = tss_const_prefixes[i]) {
42*758e9fbaSOystein Eftevaag         if (strncasecmp(token, entry, strlen(entry)) == 0) {
43*758e9fbaSOystein Eftevaag             itoken += strlen(entry);
44*758e9fbaSOystein Eftevaag             break;
45*758e9fbaSOystein Eftevaag         }
46*758e9fbaSOystein Eftevaag     }
47*758e9fbaSOystein Eftevaag     return itoken;
48*758e9fbaSOystein Eftevaag }
49*758e9fbaSOystein Eftevaag 
50*758e9fbaSOystein Eftevaag /** Get number from a string.
51*758e9fbaSOystein Eftevaag  *
52*758e9fbaSOystein Eftevaag  * A string which represents a number or hex number (prefix 0x) is converted
53*758e9fbaSOystein Eftevaag  * to an int64 number.
54*758e9fbaSOystein Eftevaag  *
55*758e9fbaSOystein Eftevaag  * param[in] token the string representing the number.
56*758e9fbaSOystein Eftevaag  * param[out] num the converted number.
57*758e9fbaSOystein Eftevaag  * @retval true if token represents a number
58*758e9fbaSOystein Eftevaag  * @retval false if token does not represent a number.
59*758e9fbaSOystein Eftevaag  */
60*758e9fbaSOystein Eftevaag static bool
get_number(const char * token,int64_t * num)61*758e9fbaSOystein Eftevaag get_number(const char *token, int64_t *num)
62*758e9fbaSOystein Eftevaag {
63*758e9fbaSOystein Eftevaag     int itoken = 0;
64*758e9fbaSOystein Eftevaag     int pos = 0;
65*758e9fbaSOystein Eftevaag     if (strncmp(token, "0x", 2) == 0) {
66*758e9fbaSOystein Eftevaag         itoken = 2;
67*758e9fbaSOystein Eftevaag         sscanf(&token[itoken], "%"PRIx64"%n", num, &pos);
68*758e9fbaSOystein Eftevaag     } else {
69*758e9fbaSOystein Eftevaag         sscanf(&token[itoken], "%"PRId64"%n", num, &pos);
70*758e9fbaSOystein Eftevaag     }
71*758e9fbaSOystein Eftevaag     if ((size_t)pos == strlen(token) - itoken)
72*758e9fbaSOystein Eftevaag         return true;
73*758e9fbaSOystein Eftevaag     else
74*758e9fbaSOystein Eftevaag         return false;
75*758e9fbaSOystein Eftevaag }
76*758e9fbaSOystein Eftevaag 
77*758e9fbaSOystein Eftevaag /** Deserialize a character string.
78*758e9fbaSOystein Eftevaag  *
79*758e9fbaSOystein Eftevaag  * @param[in] jso json string object.
80*758e9fbaSOystein Eftevaag  * @param[out] out the pointer to the created string.
81*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS if the function call was a success.
82*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_MEMORY if not enough memory can be allocated.
83*758e9fbaSOystein Eftevaag  */
84*758e9fbaSOystein Eftevaag TSS2_RC
ifapi_json_char_deserialize(json_object * jso,char ** out)85*758e9fbaSOystein Eftevaag ifapi_json_char_deserialize(
86*758e9fbaSOystein Eftevaag     json_object *jso,
87*758e9fbaSOystein Eftevaag     char **out)
88*758e9fbaSOystein Eftevaag {
89*758e9fbaSOystein Eftevaag     *out = strdup(json_object_get_string(jso));
90*758e9fbaSOystein Eftevaag     return_if_null(*out, "Out of memory.", TSS2_FAPI_RC_MEMORY);
91*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
92*758e9fbaSOystein Eftevaag }
93*758e9fbaSOystein Eftevaag 
94*758e9fbaSOystein Eftevaag /** Deserialize a IFAPI_KEY json object.
95*758e9fbaSOystein Eftevaag  *
96*758e9fbaSOystein Eftevaag  * @param[in]  jso the json object to be deserialized.
97*758e9fbaSOystein Eftevaag  * @param[out] out the deserialzed binary object.
98*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS if the function call was a success.
99*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
100*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
101*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_MEMORY if not enough memory can be allocated.
102*758e9fbaSOystein Eftevaag  */
103*758e9fbaSOystein Eftevaag TSS2_RC
ifapi_json_IFAPI_KEY_deserialize(json_object * jso,IFAPI_KEY * out)104*758e9fbaSOystein Eftevaag ifapi_json_IFAPI_KEY_deserialize(json_object *jso,  IFAPI_KEY *out)
105*758e9fbaSOystein Eftevaag {
106*758e9fbaSOystein Eftevaag     json_object *jso2;
107*758e9fbaSOystein Eftevaag     TSS2_RC r;
108*758e9fbaSOystein Eftevaag     LOG_TRACE("call");
109*758e9fbaSOystein Eftevaag     return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
110*758e9fbaSOystein Eftevaag 
111*758e9fbaSOystein Eftevaag 
112*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "persistent_handle", &jso2)) {
113*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
114*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
115*758e9fbaSOystein Eftevaag     }
116*758e9fbaSOystein Eftevaag     r = ifapi_json_UINT32_deserialize(jso2, &out->persistent_handle);
117*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
118*758e9fbaSOystein Eftevaag 
119*758e9fbaSOystein Eftevaag     if (ifapi_get_sub_object(jso, "with_auth", &jso2)) {
120*758e9fbaSOystein Eftevaag         r = ifapi_json_TPMI_YES_NO_deserialize(jso2, &out->with_auth);
121*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
122*758e9fbaSOystein Eftevaag 
123*758e9fbaSOystein Eftevaag     } else {
124*758e9fbaSOystein Eftevaag         out->with_auth = TPM2_NO;
125*758e9fbaSOystein Eftevaag     }
126*758e9fbaSOystein Eftevaag 
127*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "public", &jso2)) {
128*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
129*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
130*758e9fbaSOystein Eftevaag     }
131*758e9fbaSOystein Eftevaag     r = ifapi_json_TPM2B_PUBLIC_deserialize(jso2, &out->public);
132*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
133*758e9fbaSOystein Eftevaag 
134*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "serialization", &jso2)) {
135*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
136*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
137*758e9fbaSOystein Eftevaag     }
138*758e9fbaSOystein Eftevaag     r = ifapi_json_UINT8_ARY_deserialize(jso2, &out->serialization);
139*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
140*758e9fbaSOystein Eftevaag 
141*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "private", &jso2)) {
142*758e9fbaSOystein Eftevaag         memset(&out->private, 0, sizeof(UINT8_ARY));
143*758e9fbaSOystein Eftevaag     } else {
144*758e9fbaSOystein Eftevaag         r = ifapi_json_UINT8_ARY_deserialize(jso2, &out->private);
145*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
146*758e9fbaSOystein Eftevaag     }
147*758e9fbaSOystein Eftevaag 
148*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "appData", &jso2)) {
149*758e9fbaSOystein Eftevaag         memset(&out->appData, 0, sizeof(UINT8_ARY));
150*758e9fbaSOystein Eftevaag     } else {
151*758e9fbaSOystein Eftevaag         r = ifapi_json_UINT8_ARY_deserialize(jso2, &out->appData);
152*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
153*758e9fbaSOystein Eftevaag     }
154*758e9fbaSOystein Eftevaag 
155*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "policyInstance", &jso2)) {
156*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
157*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
158*758e9fbaSOystein Eftevaag     }
159*758e9fbaSOystein Eftevaag     r = ifapi_json_char_deserialize(jso2, &out->policyInstance);
160*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
161*758e9fbaSOystein Eftevaag 
162*758e9fbaSOystein Eftevaag     if (ifapi_get_sub_object(jso, "creationData", &jso2)) {
163*758e9fbaSOystein Eftevaag         r = ifapi_json_TPM2B_CREATION_DATA_deserialize(jso2, &out->creationData);
164*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
165*758e9fbaSOystein Eftevaag 
166*758e9fbaSOystein Eftevaag     } else {
167*758e9fbaSOystein Eftevaag         memset(&out->creationData, 0, sizeof(TPM2B_CREATION_DATA));
168*758e9fbaSOystein Eftevaag     }
169*758e9fbaSOystein Eftevaag 
170*758e9fbaSOystein Eftevaag     if (ifapi_get_sub_object(jso, "creationTicket", &jso2)) {
171*758e9fbaSOystein Eftevaag         r = ifapi_json_TPMT_TK_CREATION_deserialize(jso2, &out->creationTicket);
172*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
173*758e9fbaSOystein Eftevaag 
174*758e9fbaSOystein Eftevaag     } else {
175*758e9fbaSOystein Eftevaag         memset(&out->creationData, 0, sizeof(TPMT_TK_CREATION));
176*758e9fbaSOystein Eftevaag     }
177*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "description", &jso2)) {
178*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
179*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
180*758e9fbaSOystein Eftevaag     }
181*758e9fbaSOystein Eftevaag     r = ifapi_json_char_deserialize(jso2, &out->description);
182*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
183*758e9fbaSOystein Eftevaag 
184*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "certificate", &jso2)) {
185*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
186*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
187*758e9fbaSOystein Eftevaag     }
188*758e9fbaSOystein Eftevaag     r = ifapi_json_char_deserialize(jso2, &out->certificate);
189*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
190*758e9fbaSOystein Eftevaag 
191*758e9fbaSOystein Eftevaag     if (out->public.publicArea.type != TPM2_ALG_KEYEDHASH) {
192*758e9fbaSOystein Eftevaag          /* Keyed hash objects to not need a signing scheme. */
193*758e9fbaSOystein Eftevaag         if (!ifapi_get_sub_object(jso, "signing_scheme", &jso2)) {
194*758e9fbaSOystein Eftevaag             LOG_ERROR("Bad value");
195*758e9fbaSOystein Eftevaag             return TSS2_FAPI_RC_BAD_VALUE;
196*758e9fbaSOystein Eftevaag         }
197*758e9fbaSOystein Eftevaag         r = ifapi_json_TPMT_SIG_SCHEME_deserialize(jso2, &out->signing_scheme);
198*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
199*758e9fbaSOystein Eftevaag     }
200*758e9fbaSOystein Eftevaag 
201*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "name", &jso2)) {
202*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
203*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
204*758e9fbaSOystein Eftevaag     }
205*758e9fbaSOystein Eftevaag     r = ifapi_json_TPM2B_NAME_deserialize(jso2, &out->name);
206*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
207*758e9fbaSOystein Eftevaag     LOG_TRACE("true");
208*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
209*758e9fbaSOystein Eftevaag }
210*758e9fbaSOystein Eftevaag 
211*758e9fbaSOystein Eftevaag /** Deserialize a IFAPI_EXT_PUB_KEY json object.
212*758e9fbaSOystein Eftevaag  *
213*758e9fbaSOystein Eftevaag  * @param[in]  jso the json object to be deserialized.
214*758e9fbaSOystein Eftevaag  * @param[out] out the deserialzed binary object.
215*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS if the function call was a success.
216*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
217*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
218*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_MEMORY if not enough memory can be allocated.
219*758e9fbaSOystein Eftevaag  */
220*758e9fbaSOystein Eftevaag TSS2_RC
ifapi_json_IFAPI_EXT_PUB_KEY_deserialize(json_object * jso,IFAPI_EXT_PUB_KEY * out)221*758e9fbaSOystein Eftevaag ifapi_json_IFAPI_EXT_PUB_KEY_deserialize(json_object *jso,
222*758e9fbaSOystein Eftevaag         IFAPI_EXT_PUB_KEY *out)
223*758e9fbaSOystein Eftevaag {
224*758e9fbaSOystein Eftevaag     json_object *jso2;
225*758e9fbaSOystein Eftevaag     TSS2_RC r;
226*758e9fbaSOystein Eftevaag     LOG_TRACE("call");
227*758e9fbaSOystein Eftevaag     return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
228*758e9fbaSOystein Eftevaag 
229*758e9fbaSOystein Eftevaag 
230*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "pem_ext_public", &jso2)) {
231*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
232*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
233*758e9fbaSOystein Eftevaag     }
234*758e9fbaSOystein Eftevaag     r = ifapi_json_char_deserialize(jso2, &out->pem_ext_public);
235*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
236*758e9fbaSOystein Eftevaag 
237*758e9fbaSOystein Eftevaag     if (ifapi_get_sub_object(jso, "certificate", &jso2)) {
238*758e9fbaSOystein Eftevaag         r = ifapi_json_char_deserialize(jso2, &out->certificate);
239*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
240*758e9fbaSOystein Eftevaag     } else {
241*758e9fbaSOystein Eftevaag         out->certificate = NULL;
242*758e9fbaSOystein Eftevaag     }
243*758e9fbaSOystein Eftevaag 
244*758e9fbaSOystein Eftevaag     if (ifapi_get_sub_object(jso, "public", &jso2)) {
245*758e9fbaSOystein Eftevaag         r = ifapi_json_TPM2B_PUBLIC_deserialize(jso2, &out->public);
246*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
247*758e9fbaSOystein Eftevaag 
248*758e9fbaSOystein Eftevaag     } else {
249*758e9fbaSOystein Eftevaag         memset(&out->public, 0, sizeof(TPM2B_PUBLIC));
250*758e9fbaSOystein Eftevaag     }
251*758e9fbaSOystein Eftevaag     LOG_TRACE("true");
252*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
253*758e9fbaSOystein Eftevaag }
254*758e9fbaSOystein Eftevaag 
255*758e9fbaSOystein Eftevaag /** Deserialize a IFAPI_NV json object.
256*758e9fbaSOystein Eftevaag  *
257*758e9fbaSOystein Eftevaag  * @param[in]  jso the json object to be deserialized.
258*758e9fbaSOystein Eftevaag  * @param[out] out the deserialzed binary object.
259*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS if the function call was a success.
260*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
261*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
262*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_MEMORY if not enough memory can be allocated.
263*758e9fbaSOystein Eftevaag  */
264*758e9fbaSOystein Eftevaag TSS2_RC
ifapi_json_IFAPI_NV_deserialize(json_object * jso,IFAPI_NV * out)265*758e9fbaSOystein Eftevaag ifapi_json_IFAPI_NV_deserialize(json_object *jso,  IFAPI_NV *out)
266*758e9fbaSOystein Eftevaag {
267*758e9fbaSOystein Eftevaag     json_object *jso2;
268*758e9fbaSOystein Eftevaag     TSS2_RC r;
269*758e9fbaSOystein Eftevaag     LOG_TRACE("call");
270*758e9fbaSOystein Eftevaag     return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
271*758e9fbaSOystein Eftevaag 
272*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "appData", &jso2)) {
273*758e9fbaSOystein Eftevaag         memset(&out->appData, 0, sizeof(UINT8_ARY));
274*758e9fbaSOystein Eftevaag     } else {
275*758e9fbaSOystein Eftevaag         r = ifapi_json_UINT8_ARY_deserialize(jso2, &out->appData);
276*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
277*758e9fbaSOystein Eftevaag     }
278*758e9fbaSOystein Eftevaag 
279*758e9fbaSOystein Eftevaag     if (ifapi_get_sub_object(jso, "with_auth", &jso2)) {
280*758e9fbaSOystein Eftevaag         r = ifapi_json_TPMI_YES_NO_deserialize(jso2, &out->with_auth);
281*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
282*758e9fbaSOystein Eftevaag 
283*758e9fbaSOystein Eftevaag     } else {
284*758e9fbaSOystein Eftevaag         out->with_auth = TPM2_NO;
285*758e9fbaSOystein Eftevaag     }
286*758e9fbaSOystein Eftevaag 
287*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "public", &jso2)) {
288*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
289*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
290*758e9fbaSOystein Eftevaag     }
291*758e9fbaSOystein Eftevaag     r = ifapi_json_TPM2B_NV_PUBLIC_deserialize(jso2, &out->public);
292*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
293*758e9fbaSOystein Eftevaag 
294*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "serialization", &jso2)) {
295*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
296*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
297*758e9fbaSOystein Eftevaag     }
298*758e9fbaSOystein Eftevaag     r = ifapi_json_UINT8_ARY_deserialize(jso2, &out->serialization);
299*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
300*758e9fbaSOystein Eftevaag 
301*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "hierarchy", &jso2)) {
302*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
303*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
304*758e9fbaSOystein Eftevaag     }
305*758e9fbaSOystein Eftevaag     r = ifapi_json_UINT32_deserialize(jso2, &out->hierarchy);
306*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
307*758e9fbaSOystein Eftevaag 
308*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "policyInstance", &jso2)) {
309*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
310*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
311*758e9fbaSOystein Eftevaag     }
312*758e9fbaSOystein Eftevaag     r = ifapi_json_char_deserialize(jso2, &out->policyInstance);
313*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
314*758e9fbaSOystein Eftevaag 
315*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "description", &jso2)) {
316*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
317*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
318*758e9fbaSOystein Eftevaag     }
319*758e9fbaSOystein Eftevaag     r = ifapi_json_char_deserialize(jso2, &out->description);
320*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
321*758e9fbaSOystein Eftevaag 
322*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
323*758e9fbaSOystein Eftevaag     if (ifapi_get_sub_object(jso, "event_log", &jso2)) {
324*758e9fbaSOystein Eftevaag         r = ifapi_json_char_deserialize(jso2, &out->event_log);
325*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
326*758e9fbaSOystein Eftevaag 
327*758e9fbaSOystein Eftevaag     } else {
328*758e9fbaSOystein Eftevaag         out->event_log = NULL;
329*758e9fbaSOystein Eftevaag     }
330*758e9fbaSOystein Eftevaag     LOG_TRACE("true");
331*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
332*758e9fbaSOystein Eftevaag }
333*758e9fbaSOystein Eftevaag 
334*758e9fbaSOystein Eftevaag /** Deserialize a IFAPI_NV json object.
335*758e9fbaSOystein Eftevaag  *
336*758e9fbaSOystein Eftevaag  * @param[in]  jso the json object to be deserialized.
337*758e9fbaSOystein Eftevaag  * @param[out] out the deserialzed binary object.
338*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS if the function call was a success.
339*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
340*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
341*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_MEMORY if not enough memory can be allocated.
342*758e9fbaSOystein Eftevaag  */
343*758e9fbaSOystein Eftevaag TSS2_RC
ifapi_json_IFAPI_HIERARCHY_deserialize(json_object * jso,IFAPI_HIERARCHY * out)344*758e9fbaSOystein Eftevaag ifapi_json_IFAPI_HIERARCHY_deserialize(json_object *jso,  IFAPI_HIERARCHY *out)
345*758e9fbaSOystein Eftevaag {
346*758e9fbaSOystein Eftevaag     json_object *jso2;
347*758e9fbaSOystein Eftevaag     TSS2_RC r;
348*758e9fbaSOystein Eftevaag     LOG_TRACE("call");
349*758e9fbaSOystein Eftevaag     return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
350*758e9fbaSOystein Eftevaag 
351*758e9fbaSOystein Eftevaag     if (ifapi_get_sub_object(jso, "with_auth", &jso2)) {
352*758e9fbaSOystein Eftevaag         r = ifapi_json_TPMI_YES_NO_deserialize(jso2, &out->with_auth);
353*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
354*758e9fbaSOystein Eftevaag 
355*758e9fbaSOystein Eftevaag     } else {
356*758e9fbaSOystein Eftevaag         out->with_auth = TPM2_NO;
357*758e9fbaSOystein Eftevaag     }
358*758e9fbaSOystein Eftevaag 
359*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "authPolicy", &jso2)) {
360*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
361*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
362*758e9fbaSOystein Eftevaag     }
363*758e9fbaSOystein Eftevaag     r = ifapi_json_TPM2B_DIGEST_deserialize(jso2, &out->authPolicy);
364*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
365*758e9fbaSOystein Eftevaag 
366*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "description", &jso2)) {
367*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
368*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
369*758e9fbaSOystein Eftevaag     }
370*758e9fbaSOystein Eftevaag     r = ifapi_json_char_deserialize(jso2, &out->description);
371*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
372*758e9fbaSOystein Eftevaag 
373*758e9fbaSOystein Eftevaag     LOG_TRACE("true");
374*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
375*758e9fbaSOystein Eftevaag }
376*758e9fbaSOystein Eftevaag 
377*758e9fbaSOystein Eftevaag /** Deserialize a FAPI_QUOTE_INFO json object.
378*758e9fbaSOystein Eftevaag  *
379*758e9fbaSOystein Eftevaag  * @param[in]  jso the json object to be deserialized.
380*758e9fbaSOystein Eftevaag  * @param[out] out the deserialzed binary object.
381*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS if the function call was a success.
382*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
383*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
384*758e9fbaSOystein Eftevaag  */
385*758e9fbaSOystein Eftevaag TSS2_RC
ifapi_json_FAPI_QUOTE_INFO_deserialize(json_object * jso,FAPI_QUOTE_INFO * out)386*758e9fbaSOystein Eftevaag ifapi_json_FAPI_QUOTE_INFO_deserialize(json_object *jso,  FAPI_QUOTE_INFO *out)
387*758e9fbaSOystein Eftevaag {
388*758e9fbaSOystein Eftevaag     json_object *jso2;
389*758e9fbaSOystein Eftevaag     TSS2_RC r;
390*758e9fbaSOystein Eftevaag     LOG_TRACE("call");
391*758e9fbaSOystein Eftevaag     return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
392*758e9fbaSOystein Eftevaag 
393*758e9fbaSOystein Eftevaag 
394*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "sig_scheme", &jso2)) {
395*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
396*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
397*758e9fbaSOystein Eftevaag     }
398*758e9fbaSOystein Eftevaag     r = ifapi_json_TPMT_SIG_SCHEME_deserialize(jso2, &out->sig_scheme);
399*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
400*758e9fbaSOystein Eftevaag 
401*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "attest", &jso2)) {
402*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
403*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
404*758e9fbaSOystein Eftevaag     }
405*758e9fbaSOystein Eftevaag     r = ifapi_json_TPMS_ATTEST_deserialize(jso2, &out->attest);
406*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
407*758e9fbaSOystein Eftevaag     LOG_TRACE("true");
408*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
409*758e9fbaSOystein Eftevaag }
410*758e9fbaSOystein Eftevaag 
411*758e9fbaSOystein Eftevaag /** Deserialize a IFAPI_DUPLICATE json object.
412*758e9fbaSOystein Eftevaag  *
413*758e9fbaSOystein Eftevaag  * @param[in]  jso the json object to be deserialized.
414*758e9fbaSOystein Eftevaag  * @param[out] out the deserialzed binary object.
415*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS if the function call was a success.
416*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
417*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
418*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_MEMORY if not enough memory can be allocated.
419*758e9fbaSOystein Eftevaag  */
420*758e9fbaSOystein Eftevaag TSS2_RC
ifapi_json_IFAPI_DUPLICATE_deserialize(json_object * jso,IFAPI_DUPLICATE * out)421*758e9fbaSOystein Eftevaag ifapi_json_IFAPI_DUPLICATE_deserialize(json_object *jso, IFAPI_DUPLICATE *out)
422*758e9fbaSOystein Eftevaag {
423*758e9fbaSOystein Eftevaag     json_object *jso2;
424*758e9fbaSOystein Eftevaag     TSS2_RC r;
425*758e9fbaSOystein Eftevaag     LOG_TRACE("call");
426*758e9fbaSOystein Eftevaag     return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
427*758e9fbaSOystein Eftevaag 
428*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "duplicate", &jso2)) {
429*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
430*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
431*758e9fbaSOystein Eftevaag     }
432*758e9fbaSOystein Eftevaag 
433*758e9fbaSOystein Eftevaag     r = ifapi_json_TPM2B_PRIVATE_deserialize(jso2, &out->duplicate);
434*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
435*758e9fbaSOystein Eftevaag 
436*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "encrypted_seed", &jso2)) {
437*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
438*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
439*758e9fbaSOystein Eftevaag     }
440*758e9fbaSOystein Eftevaag     r = ifapi_json_TPM2B_ENCRYPTED_SECRET_deserialize(jso2, &out->encrypted_seed);
441*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
442*758e9fbaSOystein Eftevaag 
443*758e9fbaSOystein Eftevaag     if (ifapi_get_sub_object(jso, "certificate", &jso2)) {
444*758e9fbaSOystein Eftevaag         r = ifapi_json_char_deserialize(jso2, &out->certificate);
445*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
446*758e9fbaSOystein Eftevaag 
447*758e9fbaSOystein Eftevaag     } else {
448*758e9fbaSOystein Eftevaag         out->certificate = NULL;
449*758e9fbaSOystein Eftevaag     }
450*758e9fbaSOystein Eftevaag 
451*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "public", &jso2)) {
452*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
453*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
454*758e9fbaSOystein Eftevaag     }
455*758e9fbaSOystein Eftevaag 
456*758e9fbaSOystein Eftevaag     r = ifapi_json_TPM2B_PUBLIC_deserialize(jso2, &out->public);
457*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
458*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "public_parent", &jso2)) {
459*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
460*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
461*758e9fbaSOystein Eftevaag     }
462*758e9fbaSOystein Eftevaag 
463*758e9fbaSOystein Eftevaag     r = ifapi_json_TPM2B_PUBLIC_deserialize(jso2, &out->public_parent);
464*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
465*758e9fbaSOystein Eftevaag 
466*758e9fbaSOystein Eftevaag     if (ifapi_get_sub_object(jso, "policy", &jso2)) {
467*758e9fbaSOystein Eftevaag         out->policy = calloc(1, sizeof(TPMS_POLICY));
468*758e9fbaSOystein Eftevaag         goto_if_null2(out->policy, "Out of memory.", r, TSS2_FAPI_RC_MEMORY,
469*758e9fbaSOystein Eftevaag                       error_cleanup);
470*758e9fbaSOystein Eftevaag 
471*758e9fbaSOystein Eftevaag         r = ifapi_json_TPMS_POLICY_deserialize(jso2, out->policy);
472*758e9fbaSOystein Eftevaag         goto_if_error(r, "Deserialize policy.", error_cleanup);
473*758e9fbaSOystein Eftevaag     } else {
474*758e9fbaSOystein Eftevaag         out->policy = NULL;
475*758e9fbaSOystein Eftevaag     }
476*758e9fbaSOystein Eftevaag 
477*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
478*758e9fbaSOystein Eftevaag 
479*758e9fbaSOystein Eftevaag error_cleanup:
480*758e9fbaSOystein Eftevaag     SAFE_FREE(out->policy);
481*758e9fbaSOystein Eftevaag     return r;
482*758e9fbaSOystein Eftevaag }
483*758e9fbaSOystein Eftevaag 
484*758e9fbaSOystein Eftevaag /**  Deserialize a IFAPI_OBJECT_TYPE_CONSTANT json object.
485*758e9fbaSOystein Eftevaag  *
486*758e9fbaSOystein Eftevaag  * @param[in]  jso the json object to be deserialized.
487*758e9fbaSOystein Eftevaag  * @param[out] out the deserialzed binary object.
488*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS if the function call was a success.
489*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
490*758e9fbaSOystein Eftevaag  */
491*758e9fbaSOystein Eftevaag TSS2_RC
ifapi_json_IFAPI_OBJECT_TYPE_CONSTANT_deserialize(json_object * jso,IFAPI_OBJECT_TYPE_CONSTANT * out)492*758e9fbaSOystein Eftevaag ifapi_json_IFAPI_OBJECT_TYPE_CONSTANT_deserialize(json_object *jso,
493*758e9fbaSOystein Eftevaag         IFAPI_OBJECT_TYPE_CONSTANT *out)
494*758e9fbaSOystein Eftevaag {
495*758e9fbaSOystein Eftevaag     LOG_TRACE("call");
496*758e9fbaSOystein Eftevaag     const char *token = json_object_get_string(jso);
497*758e9fbaSOystein Eftevaag     int64_t i64;
498*758e9fbaSOystein Eftevaag     if (get_number(token, &i64)) {
499*758e9fbaSOystein Eftevaag         *out = (IFAPI_OBJECT_TYPE_CONSTANT) i64;
500*758e9fbaSOystein Eftevaag         if ((int64_t)*out != i64) {
501*758e9fbaSOystein Eftevaag             LOG_ERROR("Bad value");
502*758e9fbaSOystein Eftevaag             return TSS2_FAPI_RC_BAD_VALUE;
503*758e9fbaSOystein Eftevaag         }
504*758e9fbaSOystein Eftevaag         return TSS2_RC_SUCCESS;
505*758e9fbaSOystein Eftevaag     } else {
506*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
507*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
508*758e9fbaSOystein Eftevaag     }
509*758e9fbaSOystein Eftevaag }
510*758e9fbaSOystein Eftevaag 
511*758e9fbaSOystein Eftevaag /** Deserialize a IFAPI_OBJECT json object.
512*758e9fbaSOystein Eftevaag  *
513*758e9fbaSOystein Eftevaag  * @param[in]  jso the json object to be deserialized.
514*758e9fbaSOystein Eftevaag  * @param[out] out the deserialzed binary object.
515*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS if the function call was a success.
516*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
517*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
518*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_GENERAL_FAILURE if an internal error occurred.
519*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_MEMORY if not enough memory can be allocated.
520*758e9fbaSOystein Eftevaag  */
521*758e9fbaSOystein Eftevaag TSS2_RC
ifapi_json_IFAPI_OBJECT_deserialize(json_object * jso,IFAPI_OBJECT * out)522*758e9fbaSOystein Eftevaag ifapi_json_IFAPI_OBJECT_deserialize(json_object *jso, IFAPI_OBJECT *out)
523*758e9fbaSOystein Eftevaag {
524*758e9fbaSOystein Eftevaag     json_object *jso2;
525*758e9fbaSOystein Eftevaag     TSS2_RC r;
526*758e9fbaSOystein Eftevaag     LOG_TRACE("call");
527*758e9fbaSOystein Eftevaag     return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
528*758e9fbaSOystein Eftevaag 
529*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "objectType", &jso2)) {
530*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
531*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
532*758e9fbaSOystein Eftevaag     }
533*758e9fbaSOystein Eftevaag 
534*758e9fbaSOystein Eftevaag     r = ifapi_json_IFAPI_OBJECT_TYPE_CONSTANT_deserialize(jso2, &out->objectType);
535*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
536*758e9fbaSOystein Eftevaag 
537*758e9fbaSOystein Eftevaag     switch (out->objectType) {
538*758e9fbaSOystein Eftevaag     case IFAPI_NV_OBJ:
539*758e9fbaSOystein Eftevaag         r = ifapi_json_IFAPI_NV_deserialize(jso, &out->misc.nv);
540*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
541*758e9fbaSOystein Eftevaag         break;
542*758e9fbaSOystein Eftevaag 
543*758e9fbaSOystein Eftevaag     case IFAPI_DUPLICATE_OBJ:
544*758e9fbaSOystein Eftevaag         r = ifapi_json_IFAPI_DUPLICATE_deserialize(jso, &out->misc.key_tree);
545*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
546*758e9fbaSOystein Eftevaag 
547*758e9fbaSOystein Eftevaag         break;
548*758e9fbaSOystein Eftevaag 
549*758e9fbaSOystein Eftevaag     case IFAPI_EXT_PUB_KEY_OBJ:
550*758e9fbaSOystein Eftevaag         r = ifapi_json_IFAPI_EXT_PUB_KEY_deserialize(jso, &out->misc.ext_pub_key);
551*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
552*758e9fbaSOystein Eftevaag 
553*758e9fbaSOystein Eftevaag         break;
554*758e9fbaSOystein Eftevaag 
555*758e9fbaSOystein Eftevaag     case IFAPI_HIERARCHY_OBJ:
556*758e9fbaSOystein Eftevaag         r = ifapi_json_IFAPI_HIERARCHY_deserialize(jso, &out->misc.hierarchy);
557*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
558*758e9fbaSOystein Eftevaag 
559*758e9fbaSOystein Eftevaag         break;
560*758e9fbaSOystein Eftevaag     case IFAPI_KEY_OBJ:
561*758e9fbaSOystein Eftevaag         r = ifapi_json_IFAPI_KEY_deserialize(jso, &out->misc.key);
562*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
563*758e9fbaSOystein Eftevaag 
564*758e9fbaSOystein Eftevaag         break;
565*758e9fbaSOystein Eftevaag     default:
566*758e9fbaSOystein Eftevaag         goto_error(r, TSS2_FAPI_RC_GENERAL_FAILURE, "Invalid call deserialize",
567*758e9fbaSOystein Eftevaag                    cleanup);
568*758e9fbaSOystein Eftevaag     }
569*758e9fbaSOystein Eftevaag 
570*758e9fbaSOystein Eftevaag     if (ifapi_get_sub_object(jso, "system", &jso2)) {
571*758e9fbaSOystein Eftevaag         r = ifapi_json_TPMI_YES_NO_deserialize(jso2, &out->system);
572*758e9fbaSOystein Eftevaag         return_if_error(r, "BAD VALUE");
573*758e9fbaSOystein Eftevaag 
574*758e9fbaSOystein Eftevaag     } else {
575*758e9fbaSOystein Eftevaag         out->system = TPM2_NO;
576*758e9fbaSOystein Eftevaag     }
577*758e9fbaSOystein Eftevaag 
578*758e9fbaSOystein Eftevaag     if (ifapi_get_sub_object(jso, "policy", &jso2)) {
579*758e9fbaSOystein Eftevaag         out->policy = calloc(1, sizeof(TPMS_POLICY));
580*758e9fbaSOystein Eftevaag         goto_if_null2(out->policy, "Out of memory.", r, TSS2_FAPI_RC_MEMORY,
581*758e9fbaSOystein Eftevaag                       cleanup);
582*758e9fbaSOystein Eftevaag 
583*758e9fbaSOystein Eftevaag         r = ifapi_json_TPMS_POLICY_deserialize(jso2, out->policy);
584*758e9fbaSOystein Eftevaag         goto_if_error(r, "Deserialize policy.", cleanup);
585*758e9fbaSOystein Eftevaag     } else {
586*758e9fbaSOystein Eftevaag         out->policy = NULL;
587*758e9fbaSOystein Eftevaag     }
588*758e9fbaSOystein Eftevaag 
589*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
590*758e9fbaSOystein Eftevaag 
591*758e9fbaSOystein Eftevaag cleanup:
592*758e9fbaSOystein Eftevaag     SAFE_FREE(out->policy);
593*758e9fbaSOystein Eftevaag     return r;
594*758e9fbaSOystein Eftevaag }
595*758e9fbaSOystein Eftevaag 
596*758e9fbaSOystein Eftevaag /** Deserialize a IFAPI_EVENT_TYPE json object.
597*758e9fbaSOystein Eftevaag  *
598*758e9fbaSOystein Eftevaag  * @param[in]  jso the json object to be deserialized.
599*758e9fbaSOystein Eftevaag  * @param[out] out the deserialzed binary object.
600*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS if the function call was a success.
601*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
602*758e9fbaSOystein Eftevaag  */
603*758e9fbaSOystein Eftevaag TSS2_RC
ifapi_json_IFAPI_EVENT_TYPE_deserialize(json_object * jso,IFAPI_EVENT_TYPE * out)604*758e9fbaSOystein Eftevaag ifapi_json_IFAPI_EVENT_TYPE_deserialize(json_object *jso, IFAPI_EVENT_TYPE *out)
605*758e9fbaSOystein Eftevaag {
606*758e9fbaSOystein Eftevaag     LOG_TRACE("call");
607*758e9fbaSOystein Eftevaag     return ifapi_json_IFAPI_EVENT_TYPE_deserialize_txt(jso, out);
608*758e9fbaSOystein Eftevaag }
609*758e9fbaSOystein Eftevaag 
610*758e9fbaSOystein Eftevaag typedef struct {
611*758e9fbaSOystein Eftevaag     IFAPI_EVENT_TYPE in;
612*758e9fbaSOystein Eftevaag     char *name;
613*758e9fbaSOystein Eftevaag } IFAPI_IFAPI_EVENT_TYPE_ASSIGN;
614*758e9fbaSOystein Eftevaag 
615*758e9fbaSOystein Eftevaag static IFAPI_IFAPI_EVENT_TYPE_ASSIGN deserialize_IFAPI_EVENT_TYPE_tab[] = {
616*758e9fbaSOystein Eftevaag     { IFAPI_IMA_EVENT_TAG, "ima-legacy" },
617*758e9fbaSOystein Eftevaag     { IFAPI_TSS_EVENT_TAG, "tss2" },
618*758e9fbaSOystein Eftevaag };
619*758e9fbaSOystein Eftevaag 
620*758e9fbaSOystein Eftevaag /**  Deserialize a json object of type IFAPI_EVENT_TYPE.
621*758e9fbaSOystein Eftevaag  *
622*758e9fbaSOystein Eftevaag  * @param[in]  jso the json object to be deserialized.
623*758e9fbaSOystein Eftevaag  * @param[out] out the deserialzed binary object.
624*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS if the function call was a success.
625*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
626*758e9fbaSOystein Eftevaag  */
627*758e9fbaSOystein Eftevaag TSS2_RC
ifapi_json_IFAPI_EVENT_TYPE_deserialize_txt(json_object * jso,IFAPI_EVENT_TYPE * out)628*758e9fbaSOystein Eftevaag ifapi_json_IFAPI_EVENT_TYPE_deserialize_txt(json_object *jso,
629*758e9fbaSOystein Eftevaag         IFAPI_EVENT_TYPE *out)
630*758e9fbaSOystein Eftevaag {
631*758e9fbaSOystein Eftevaag     LOG_TRACE("call");
632*758e9fbaSOystein Eftevaag     const char *token = json_object_get_string(jso);
633*758e9fbaSOystein Eftevaag     int64_t i64;
634*758e9fbaSOystein Eftevaag     if (get_number(token, &i64)) {
635*758e9fbaSOystein Eftevaag         *out = (IFAPI_EVENT_TYPE) i64;
636*758e9fbaSOystein Eftevaag         if ((int64_t)*out != i64) {
637*758e9fbaSOystein Eftevaag             LOG_ERROR("Bad value");
638*758e9fbaSOystein Eftevaag             return TSS2_FAPI_RC_BAD_VALUE;
639*758e9fbaSOystein Eftevaag         }
640*758e9fbaSOystein Eftevaag         return TSS2_RC_SUCCESS;
641*758e9fbaSOystein Eftevaag 
642*758e9fbaSOystein Eftevaag     } else {
643*758e9fbaSOystein Eftevaag         int itoken = get_token_start_idx(token);
644*758e9fbaSOystein Eftevaag         size_t i;
645*758e9fbaSOystein Eftevaag         size_t n = sizeof(deserialize_IFAPI_EVENT_TYPE_tab) /
646*758e9fbaSOystein Eftevaag                    sizeof(deserialize_IFAPI_EVENT_TYPE_tab[0]);
647*758e9fbaSOystein Eftevaag         size_t size = strlen(token) - itoken;
648*758e9fbaSOystein Eftevaag         for (i = 0; i < n; i++) {
649*758e9fbaSOystein Eftevaag             if (strncasecmp(&token[itoken],
650*758e9fbaSOystein Eftevaag                             &deserialize_IFAPI_EVENT_TYPE_tab[i].name[0],
651*758e9fbaSOystein Eftevaag                             size) == 0) {
652*758e9fbaSOystein Eftevaag                 *out = deserialize_IFAPI_EVENT_TYPE_tab[i].in;
653*758e9fbaSOystein Eftevaag                 return TSS2_RC_SUCCESS;
654*758e9fbaSOystein Eftevaag             }
655*758e9fbaSOystein Eftevaag         }
656*758e9fbaSOystein Eftevaag         return_error(TSS2_FAPI_RC_BAD_VALUE, "Undefined constant.");
657*758e9fbaSOystein Eftevaag     }
658*758e9fbaSOystein Eftevaag 
659*758e9fbaSOystein Eftevaag }
660*758e9fbaSOystein Eftevaag 
661*758e9fbaSOystein Eftevaag /** Deserialize a IFAPI_TSS_EVENT json object.
662*758e9fbaSOystein Eftevaag  *
663*758e9fbaSOystein Eftevaag  * @param[in]  jso the json object to be deserialized.
664*758e9fbaSOystein Eftevaag  * @param[out] out the deserialzed binary object.
665*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS if the function call was a success.
666*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
667*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
668*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_MEMORY if not enough memory can be allocated.
669*758e9fbaSOystein Eftevaag  */
670*758e9fbaSOystein Eftevaag TSS2_RC
ifapi_json_IFAPI_TSS_EVENT_deserialize(json_object * jso,IFAPI_TSS_EVENT * out)671*758e9fbaSOystein Eftevaag ifapi_json_IFAPI_TSS_EVENT_deserialize(json_object *jso,  IFAPI_TSS_EVENT *out)
672*758e9fbaSOystein Eftevaag {
673*758e9fbaSOystein Eftevaag     json_object *jso2;
674*758e9fbaSOystein Eftevaag     TSS2_RC r;
675*758e9fbaSOystein Eftevaag     LOG_TRACE("call");
676*758e9fbaSOystein Eftevaag     return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
677*758e9fbaSOystein Eftevaag 
678*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "data", &jso2)) {
679*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
680*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
681*758e9fbaSOystein Eftevaag     }
682*758e9fbaSOystein Eftevaag     r = ifapi_json_TPM2B_EVENT_deserialize(jso2, &out->data);
683*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
684*758e9fbaSOystein Eftevaag 
685*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "event", &jso2)) {
686*758e9fbaSOystein Eftevaag         out->event = NULL;
687*758e9fbaSOystein Eftevaag     } else {
688*758e9fbaSOystein Eftevaag         /* out->event is a special case. It can be an arbitrary
689*758e9fbaSOystein Eftevaag            JSON object. Since FAPI does not access its internals
690*758e9fbaSOystein Eftevaag            we just store its string represenation here. */
691*758e9fbaSOystein Eftevaag         out->event = strdup(json_object_to_json_string_ext(jso2,
692*758e9fbaSOystein Eftevaag                                 JSON_C_TO_STRING_PRETTY));
693*758e9fbaSOystein Eftevaag         return_if_null(out->event, "OOM", TSS2_FAPI_RC_MEMORY);
694*758e9fbaSOystein Eftevaag     }
695*758e9fbaSOystein Eftevaag     LOG_TRACE("true");
696*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
697*758e9fbaSOystein Eftevaag }
698*758e9fbaSOystein Eftevaag 
699*758e9fbaSOystein Eftevaag /** Deserialize a IFAPI_IMA_EVENT json object.
700*758e9fbaSOystein Eftevaag  *
701*758e9fbaSOystein Eftevaag  * @param[in]  jso the json object to be deserialized.
702*758e9fbaSOystein Eftevaag  * @param[out] out the deserialzed binary object.
703*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS if the function call was a success.
704*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
705*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
706*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_MEMORY if not enough memory can be allocated.
707*758e9fbaSOystein Eftevaag  */
708*758e9fbaSOystein Eftevaag TSS2_RC
ifapi_json_IFAPI_IMA_EVENT_deserialize(json_object * jso,IFAPI_IMA_EVENT * out)709*758e9fbaSOystein Eftevaag ifapi_json_IFAPI_IMA_EVENT_deserialize(json_object *jso,  IFAPI_IMA_EVENT *out)
710*758e9fbaSOystein Eftevaag {
711*758e9fbaSOystein Eftevaag     json_object *jso2;
712*758e9fbaSOystein Eftevaag     TSS2_RC r;
713*758e9fbaSOystein Eftevaag     LOG_TRACE("call");
714*758e9fbaSOystein Eftevaag     return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
715*758e9fbaSOystein Eftevaag 
716*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "eventData", &jso2)) {
717*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
718*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
719*758e9fbaSOystein Eftevaag     }
720*758e9fbaSOystein Eftevaag     r = ifapi_json_TPM2B_DIGEST_deserialize(jso2, &out->eventData);
721*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
722*758e9fbaSOystein Eftevaag 
723*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "eventName", &jso2)) {
724*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
725*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
726*758e9fbaSOystein Eftevaag     }
727*758e9fbaSOystein Eftevaag     r = ifapi_json_char_deserialize(jso2, &out->eventName);
728*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
729*758e9fbaSOystein Eftevaag     LOG_TRACE("true");
730*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
731*758e9fbaSOystein Eftevaag }
732*758e9fbaSOystein Eftevaag 
733*758e9fbaSOystein Eftevaag /** Deserialize a IFAPI_EVENT_UNION json object.
734*758e9fbaSOystein Eftevaag  *
735*758e9fbaSOystein Eftevaag  * This functions expects the Bitfield to be encoded as unsigned int in host-endianess.
736*758e9fbaSOystein Eftevaag  * @param[in] jso the json object to be deserialized.
737*758e9fbaSOystein Eftevaag  * @param[in] selector the event type.
738*758e9fbaSOystein Eftevaag  * @param[out] out the deserialzed binary object.
739*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS if the function call was a success.
740*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
741*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
742*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_MEMORY if not enough memory can be allocated.
743*758e9fbaSOystein Eftevaag  */
744*758e9fbaSOystein Eftevaag TSS2_RC
ifapi_json_IFAPI_EVENT_UNION_deserialize(UINT32 selector,json_object * jso,IFAPI_EVENT_UNION * out)745*758e9fbaSOystein Eftevaag ifapi_json_IFAPI_EVENT_UNION_deserialize(
746*758e9fbaSOystein Eftevaag     UINT32 selector,
747*758e9fbaSOystein Eftevaag     json_object *jso,
748*758e9fbaSOystein Eftevaag     IFAPI_EVENT_UNION *out)
749*758e9fbaSOystein Eftevaag {
750*758e9fbaSOystein Eftevaag     LOG_TRACE("call");
751*758e9fbaSOystein Eftevaag     switch (selector) {
752*758e9fbaSOystein Eftevaag     case IFAPI_TSS_EVENT_TAG:
753*758e9fbaSOystein Eftevaag         return ifapi_json_IFAPI_TSS_EVENT_deserialize(jso, &out->tss_event);
754*758e9fbaSOystein Eftevaag     case IFAPI_IMA_EVENT_TAG:
755*758e9fbaSOystein Eftevaag         return ifapi_json_IFAPI_IMA_EVENT_deserialize(jso, &out->ima_event);
756*758e9fbaSOystein Eftevaag     default:
757*758e9fbaSOystein Eftevaag         LOG_TRACE("false");
758*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
759*758e9fbaSOystein Eftevaag     };
760*758e9fbaSOystein Eftevaag }
761*758e9fbaSOystein Eftevaag 
762*758e9fbaSOystein Eftevaag /** Deserialize a IFAPI_EVENT json object.
763*758e9fbaSOystein Eftevaag  *
764*758e9fbaSOystein Eftevaag  * @param[in]  jso the json object to be deserialized.
765*758e9fbaSOystein Eftevaag  * @param[out] out the deserialzed binary object.
766*758e9fbaSOystein Eftevaag  * @retval TSS2_RC_SUCCESS if the function call was a success.
767*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
768*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
769*758e9fbaSOystein Eftevaag  * @retval TSS2_FAPI_RC_MEMORY if not enough memory can be allocated.
770*758e9fbaSOystein Eftevaag  */
771*758e9fbaSOystein Eftevaag TSS2_RC
ifapi_json_IFAPI_EVENT_deserialize(json_object * jso,IFAPI_EVENT * out)772*758e9fbaSOystein Eftevaag ifapi_json_IFAPI_EVENT_deserialize(json_object *jso,  IFAPI_EVENT *out)
773*758e9fbaSOystein Eftevaag {
774*758e9fbaSOystein Eftevaag     json_object *jso2;
775*758e9fbaSOystein Eftevaag     TSS2_RC r;
776*758e9fbaSOystein Eftevaag     LOG_TRACE("call");
777*758e9fbaSOystein Eftevaag     return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
778*758e9fbaSOystein Eftevaag 
779*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "recnum", &jso2)) {
780*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
781*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
782*758e9fbaSOystein Eftevaag     }
783*758e9fbaSOystein Eftevaag     r = ifapi_json_UINT32_deserialize(jso2, &out->recnum);
784*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
785*758e9fbaSOystein Eftevaag 
786*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "pcr", &jso2)) {
787*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
788*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
789*758e9fbaSOystein Eftevaag     }
790*758e9fbaSOystein Eftevaag     r = ifapi_json_TPM2_HANDLE_deserialize(jso2, &out->pcr);
791*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
792*758e9fbaSOystein Eftevaag 
793*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "digests", &jso2)) {
794*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
795*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
796*758e9fbaSOystein Eftevaag     }
797*758e9fbaSOystein Eftevaag     r = ifapi_json_TPML_DIGEST_VALUES_deserialize(jso2, &out->digests);
798*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
799*758e9fbaSOystein Eftevaag 
800*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "type", &jso2)) {
801*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
802*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
803*758e9fbaSOystein Eftevaag     }
804*758e9fbaSOystein Eftevaag     r = ifapi_json_IFAPI_EVENT_TYPE_deserialize(jso2, &out->type);
805*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
806*758e9fbaSOystein Eftevaag 
807*758e9fbaSOystein Eftevaag     if (!ifapi_get_sub_object(jso, "sub_event", &jso2)) {
808*758e9fbaSOystein Eftevaag         LOG_ERROR("Bad value");
809*758e9fbaSOystein Eftevaag         return TSS2_FAPI_RC_BAD_VALUE;
810*758e9fbaSOystein Eftevaag     }
811*758e9fbaSOystein Eftevaag     r = ifapi_json_IFAPI_EVENT_UNION_deserialize(out->type, jso2, &out->sub_event);
812*758e9fbaSOystein Eftevaag     return_if_error(r, "BAD VALUE");
813*758e9fbaSOystein Eftevaag     LOG_TRACE("true");
814*758e9fbaSOystein Eftevaag     return TSS2_RC_SUCCESS;
815*758e9fbaSOystein Eftevaag }
816