xref: /aosp_15_r20/external/tpm2-tss/test/unit/fapi-json.c (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /*******************************************************************************
3*758e9fbaSOystein Eftevaag  * Copyright 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 <stdarg.h>
12*758e9fbaSOystein Eftevaag #include <inttypes.h>
13*758e9fbaSOystein Eftevaag #include <string.h>
14*758e9fbaSOystein Eftevaag #include <stdlib.h>
15*758e9fbaSOystein Eftevaag #include <stdio.h>
16*758e9fbaSOystein Eftevaag #include <json-c/json_util.h>
17*758e9fbaSOystein Eftevaag #include <json-c/json_tokener.h>
18*758e9fbaSOystein Eftevaag 
19*758e9fbaSOystein Eftevaag #include <setjmp.h>
20*758e9fbaSOystein Eftevaag #include <cmocka.h>
21*758e9fbaSOystein Eftevaag 
22*758e9fbaSOystein Eftevaag #include "tss2_fapi.h"
23*758e9fbaSOystein Eftevaag #include "tpm_json_serialize.h"
24*758e9fbaSOystein Eftevaag #include "tpm_json_deserialize.h"
25*758e9fbaSOystein Eftevaag #include "ifapi_json_serialize.h"
26*758e9fbaSOystein Eftevaag #include "ifapi_json_deserialize.h"
27*758e9fbaSOystein Eftevaag #include "fapi_policy.h"
28*758e9fbaSOystein Eftevaag 
29*758e9fbaSOystein Eftevaag #include "util/aux_util.h"
30*758e9fbaSOystein Eftevaag 
31*758e9fbaSOystein Eftevaag #define LOGMODULE tests
32*758e9fbaSOystein Eftevaag #include "util/log.h"
33*758e9fbaSOystein Eftevaag 
34*758e9fbaSOystein Eftevaag /* 3 copies from ifapi_helpers.c */
35*758e9fbaSOystein Eftevaag static void
cleanup_policy_element(TPMT_POLICYELEMENT * policy)36*758e9fbaSOystein Eftevaag cleanup_policy_element(TPMT_POLICYELEMENT *policy)
37*758e9fbaSOystein Eftevaag {
38*758e9fbaSOystein Eftevaag         switch (policy->type) {
39*758e9fbaSOystein Eftevaag         case POLICYSECRET:
40*758e9fbaSOystein Eftevaag             SAFE_FREE(policy->element.PolicySecret.objectPath);
41*758e9fbaSOystein Eftevaag             break;
42*758e9fbaSOystein Eftevaag         case POLICYAUTHORIZE:
43*758e9fbaSOystein Eftevaag             SAFE_FREE(policy->element.PolicyAuthorize.keyPath);
44*758e9fbaSOystein Eftevaag             SAFE_FREE(policy->element.PolicyAuthorize.keyPEM);
45*758e9fbaSOystein Eftevaag             break;
46*758e9fbaSOystein Eftevaag         case POLICYAUTHORIZENV:
47*758e9fbaSOystein Eftevaag             SAFE_FREE( policy->element.PolicyAuthorizeNv.nvPath);
48*758e9fbaSOystein Eftevaag             SAFE_FREE( policy->element.PolicyAuthorizeNv.policy_buffer);
49*758e9fbaSOystein Eftevaag             break;
50*758e9fbaSOystein Eftevaag         case POLICYSIGNED:
51*758e9fbaSOystein Eftevaag             SAFE_FREE(policy->element.PolicySigned.keyPath);
52*758e9fbaSOystein Eftevaag             SAFE_FREE(policy->element.PolicySigned.keyPEM);
53*758e9fbaSOystein Eftevaag             break;
54*758e9fbaSOystein Eftevaag         case POLICYPCR:
55*758e9fbaSOystein Eftevaag             SAFE_FREE(policy->element.PolicyPCR.pcrs);
56*758e9fbaSOystein Eftevaag             break;
57*758e9fbaSOystein Eftevaag         case POLICYNV:
58*758e9fbaSOystein Eftevaag             SAFE_FREE(policy->element.PolicyNV.nvPath);
59*758e9fbaSOystein Eftevaag             break;
60*758e9fbaSOystein Eftevaag         case POLICYDUPLICATIONSELECT:
61*758e9fbaSOystein Eftevaag             SAFE_FREE(policy->element.PolicyDuplicationSelect.newParentPath);
62*758e9fbaSOystein Eftevaag             break;
63*758e9fbaSOystein Eftevaag         }
64*758e9fbaSOystein Eftevaag }
65*758e9fbaSOystein Eftevaag 
cleanup_policy_elements(TPML_POLICYELEMENTS * policy)66*758e9fbaSOystein Eftevaag static void cleanup_policy_elements(TPML_POLICYELEMENTS *policy)
67*758e9fbaSOystein Eftevaag {
68*758e9fbaSOystein Eftevaag     size_t i, j;
69*758e9fbaSOystein Eftevaag     if (policy != NULL) {
70*758e9fbaSOystein Eftevaag         for (i = 0; i < policy->count; i++) {
71*758e9fbaSOystein Eftevaag             if (policy->elements[i].type ==  POLICYOR) {
72*758e9fbaSOystein Eftevaag                 /* Policy with sub policies */
73*758e9fbaSOystein Eftevaag                 TPML_POLICYBRANCHES *branches = policy->elements[i].element.PolicyOr.branches;
74*758e9fbaSOystein Eftevaag                 for (j = 0; j < branches->count; j++) {
75*758e9fbaSOystein Eftevaag                     SAFE_FREE(branches->authorizations[j].name);
76*758e9fbaSOystein Eftevaag                     SAFE_FREE(branches->authorizations[j].description);
77*758e9fbaSOystein Eftevaag                     cleanup_policy_elements(branches->authorizations[j].policy);
78*758e9fbaSOystein Eftevaag                 }
79*758e9fbaSOystein Eftevaag                 SAFE_FREE(branches);
80*758e9fbaSOystein Eftevaag             } else {
81*758e9fbaSOystein Eftevaag                 cleanup_policy_element(&policy->elements[i]);
82*758e9fbaSOystein Eftevaag             }
83*758e9fbaSOystein Eftevaag         }
84*758e9fbaSOystein Eftevaag         SAFE_FREE(policy);
85*758e9fbaSOystein Eftevaag     }
86*758e9fbaSOystein Eftevaag }
87*758e9fbaSOystein Eftevaag 
88*758e9fbaSOystein Eftevaag /** Free memory allocated during deserialization of policy.
89*758e9fbaSOystein Eftevaag  *
90*758e9fbaSOystein Eftevaag  * The object will not be freed (might be declared on the stack).
91*758e9fbaSOystein Eftevaag  *
92*758e9fbaSOystein Eftevaag  * @param[in]  object The policy to be cleaned up.
93*758e9fbaSOystein Eftevaag  *
94*758e9fbaSOystein Eftevaag  */
ifapi_cleanup_policy(TPMS_POLICY * policy)95*758e9fbaSOystein Eftevaag static void ifapi_cleanup_policy(TPMS_POLICY *policy)
96*758e9fbaSOystein Eftevaag {
97*758e9fbaSOystein Eftevaag     if (policy) {
98*758e9fbaSOystein Eftevaag        SAFE_FREE(policy->description);
99*758e9fbaSOystein Eftevaag        SAFE_FREE(policy->policyAuthorizations);
100*758e9fbaSOystein Eftevaag        cleanup_policy_elements(policy->policy);
101*758e9fbaSOystein Eftevaag     }
102*758e9fbaSOystein Eftevaag }
103*758e9fbaSOystein Eftevaag 
normalize(const char * string)104*758e9fbaSOystein Eftevaag char * normalize(const char *string) {
105*758e9fbaSOystein Eftevaag     char *string2 = malloc(strlen(string)+1);
106*758e9fbaSOystein Eftevaag     int i;
107*758e9fbaSOystein Eftevaag     int j = 0;
108*758e9fbaSOystein Eftevaag     for(i = 0; string[i] != '\0'; i++) {
109*758e9fbaSOystein Eftevaag         if ((string[i] != '\n' && string[i] != ' ')) {
110*758e9fbaSOystein Eftevaag             string2[j] = string[i];
111*758e9fbaSOystein Eftevaag             j += 1;
112*758e9fbaSOystein Eftevaag         }
113*758e9fbaSOystein Eftevaag     }
114*758e9fbaSOystein Eftevaag     string2[j] = '\0';
115*758e9fbaSOystein Eftevaag 	return string2;
116*758e9fbaSOystein Eftevaag }
117*758e9fbaSOystein Eftevaag 
118*758e9fbaSOystein Eftevaag #define CHECK_ERROR(TYPE, SRC, RC) \
119*758e9fbaSOystein Eftevaag         { \
120*758e9fbaSOystein Eftevaag             TYPE out; \
121*758e9fbaSOystein Eftevaag             TSS2_RC rc; \
122*758e9fbaSOystein Eftevaag             json_object *jso = json_tokener_parse((SRC)); \
123*758e9fbaSOystein Eftevaag             assert_non_null(jso); \
124*758e9fbaSOystein Eftevaag             rc = ifapi_json_ ## TYPE ## _deserialize (jso, &out); \
125*758e9fbaSOystein Eftevaag             assert_int_equal (rc, RC); \
126*758e9fbaSOystein Eftevaag             json_object_put(jso); \
127*758e9fbaSOystein Eftevaag         }
128*758e9fbaSOystein Eftevaag 
129*758e9fbaSOystein Eftevaag 
130*758e9fbaSOystein Eftevaag 
131*758e9fbaSOystein Eftevaag #define CHECK_JSON2(TYPE, SRC, DST, PSERIALIZE)  \
132*758e9fbaSOystein Eftevaag         { \
133*758e9fbaSOystein Eftevaag             TYPE out; \
134*758e9fbaSOystein Eftevaag             TSS2_RC rc; \
135*758e9fbaSOystein Eftevaag             json_object *jso = json_tokener_parse((SRC)); \
136*758e9fbaSOystein Eftevaag             if (!jso) fprintf(stderr, "JSON parsing failed\n"); \
137*758e9fbaSOystein Eftevaag             assert_non_null(jso); \
138*758e9fbaSOystein Eftevaag             rc = ifapi_json_ ## TYPE ## _deserialize (jso, &out); \
139*758e9fbaSOystein Eftevaag             if (rc) fprintf(stderr, "Deserialization failed\n"); \
140*758e9fbaSOystein Eftevaag             assert_int_equal (rc, TSS2_RC_SUCCESS); \
141*758e9fbaSOystein Eftevaag             json_object_put(jso); \
142*758e9fbaSOystein Eftevaag             jso = NULL; \
143*758e9fbaSOystein Eftevaag             rc = ifapi_json_ ## TYPE ## _serialize (PSERIALIZE, &jso); \
144*758e9fbaSOystein Eftevaag             assert_int_equal (rc, TSS2_RC_SUCCESS); \
145*758e9fbaSOystein Eftevaag             assert_non_null(jso); \
146*758e9fbaSOystein Eftevaag             const char *jso_string = json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY); \
147*758e9fbaSOystein Eftevaag             assert_non_null(jso_string); \
148*758e9fbaSOystein Eftevaag             char *string1 = normalize(jso_string); \
149*758e9fbaSOystein Eftevaag             char *string2 =  normalize(DST); \
150*758e9fbaSOystein Eftevaag             assert_string_equal(string1, string2); \
151*758e9fbaSOystein Eftevaag             json_object_put(jso); \
152*758e9fbaSOystein Eftevaag             free(string1); \
153*758e9fbaSOystein Eftevaag             free(string2); \
154*758e9fbaSOystein Eftevaag         }
155*758e9fbaSOystein Eftevaag 
156*758e9fbaSOystein Eftevaag #define CHECK_JSON(TYPE, SRC, DST)  \
157*758e9fbaSOystein Eftevaag     CHECK_JSON2(TYPE, SRC, DST, &out)
158*758e9fbaSOystein Eftevaag 
159*758e9fbaSOystein Eftevaag #define CHECK_JSON_SIMPLE(TYPE, SRC, DST)  \
160*758e9fbaSOystein Eftevaag     CHECK_JSON2(TYPE, SRC, DST, out)
161*758e9fbaSOystein Eftevaag 
162*758e9fbaSOystein Eftevaag #define CHECK_JSON_TO_BIN(TYPE, SRC, DST) \
163*758e9fbaSOystein Eftevaag         { \
164*758e9fbaSOystein Eftevaag             TYPE out; \
165*758e9fbaSOystein Eftevaag             TSS2_RC rc; \
166*758e9fbaSOystein Eftevaag             TYPE expected = DST; \
167*758e9fbaSOystein Eftevaag             json_object *jso = json_tokener_parse((SRC)); \
168*758e9fbaSOystein Eftevaag             assert_non_null(jso); \
169*758e9fbaSOystein Eftevaag             rc = ifapi_json_ ## TYPE ## _deserialize (jso, &out); \
170*758e9fbaSOystein Eftevaag             assert_int_equal (rc, TSS2_RC_SUCCESS); \
171*758e9fbaSOystein Eftevaag             json_object_put(jso); \
172*758e9fbaSOystein Eftevaag             assert_true(out == expected);       \
173*758e9fbaSOystein Eftevaag         }
174*758e9fbaSOystein Eftevaag 
175*758e9fbaSOystein Eftevaag #define CHECK_BIN2(TYPE, BIN, PSERIALIZE)                  \
176*758e9fbaSOystein Eftevaag     TYPE BIN ## 2; \
177*758e9fbaSOystein Eftevaag     { \
178*758e9fbaSOystein Eftevaag         char *jso_string1, *jso_string2; \
179*758e9fbaSOystein Eftevaag         json_object *jso = NULL; \
180*758e9fbaSOystein Eftevaag         TSS2_RC rc = ifapi_json_ ## TYPE ## _serialize (PSERIALIZE, &jso); \
181*758e9fbaSOystein Eftevaag         jso_string1 = strdup(json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY)); \
182*758e9fbaSOystein Eftevaag         assert_int_equal (rc, TSS2_RC_SUCCESS); \
183*758e9fbaSOystein Eftevaag         rc = ifapi_json_ ## TYPE ## _deserialize (jso, &BIN ## 2); \
184*758e9fbaSOystein Eftevaag         assert_int_equal (rc, TSS2_RC_SUCCESS); \
185*758e9fbaSOystein Eftevaag         json_object_put(jso); \
186*758e9fbaSOystein Eftevaag         jso = NULL; \
187*758e9fbaSOystein Eftevaag         rc = ifapi_json_ ## TYPE ## _serialize (PSERIALIZE ## 2, &jso); \
188*758e9fbaSOystein Eftevaag         jso_string2 = strdup(json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY)); \
189*758e9fbaSOystein Eftevaag         assert_int_equal (rc, TSS2_RC_SUCCESS); \
190*758e9fbaSOystein Eftevaag         if (strcmp(jso_string1, jso_string2)) { \
191*758e9fbaSOystein Eftevaag             fprintf(stderr,"\n jso: %s\n", jso_string1); \
192*758e9fbaSOystein Eftevaag             fprintf(stderr,"\n jso: %s\n", jso_string2); \
193*758e9fbaSOystein Eftevaag         } \
194*758e9fbaSOystein Eftevaag         assert_string_equal(jso_string1, jso_string2); \
195*758e9fbaSOystein Eftevaag         json_object_put(jso); \
196*758e9fbaSOystein Eftevaag         free(jso_string1); \
197*758e9fbaSOystein Eftevaag         free(jso_string2); \
198*758e9fbaSOystein Eftevaag     }
199*758e9fbaSOystein Eftevaag 
200*758e9fbaSOystein Eftevaag #define CHECK_BIN(TYPE, BIN) \
201*758e9fbaSOystein Eftevaag     CHECK_BIN2(TYPE, BIN, &BIN)
202*758e9fbaSOystein Eftevaag 
203*758e9fbaSOystein Eftevaag #define CHECK_BIN_SIMPLE(TYPE, BIN) \
204*758e9fbaSOystein Eftevaag     CHECK_BIN2(TYPE, BIN, BIN)
205*758e9fbaSOystein Eftevaag 
206*758e9fbaSOystein Eftevaag static void
check_bin(void ** state)207*758e9fbaSOystein Eftevaag check_bin(void **state)
208*758e9fbaSOystein Eftevaag {
209*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC inPublicAES = {
210*758e9fbaSOystein Eftevaag         .size = 0,
211*758e9fbaSOystein Eftevaag         .publicArea = {
212*758e9fbaSOystein Eftevaag             .type = TPM2_ALG_SYMCIPHER,
213*758e9fbaSOystein Eftevaag             .nameAlg = TPM2_ALG_SHA256,
214*758e9fbaSOystein Eftevaag             .objectAttributes = (TPMA_OBJECT_USERWITHAUTH |
215*758e9fbaSOystein Eftevaag                                  TPMA_OBJECT_SIGN_ENCRYPT |
216*758e9fbaSOystein Eftevaag                                  TPMA_OBJECT_DECRYPT),
217*758e9fbaSOystein Eftevaag 
218*758e9fbaSOystein Eftevaag             .authPolicy = {
219*758e9fbaSOystein Eftevaag                  .size = 0,
220*758e9fbaSOystein Eftevaag              },
221*758e9fbaSOystein Eftevaag             .parameters.symDetail = {
222*758e9fbaSOystein Eftevaag                  .sym = {
223*758e9fbaSOystein Eftevaag                      .algorithm = TPM2_ALG_AES,
224*758e9fbaSOystein Eftevaag                      .keyBits = {.aes = 128},
225*758e9fbaSOystein Eftevaag                      .mode = {.aes = TPM2_ALG_CFB}}
226*758e9fbaSOystein Eftevaag              },
227*758e9fbaSOystein Eftevaag             .unique.sym = {
228*758e9fbaSOystein Eftevaag                  .size = 0,
229*758e9fbaSOystein Eftevaag                  .buffer = {}
230*758e9fbaSOystein Eftevaag              }
231*758e9fbaSOystein Eftevaag         }
232*758e9fbaSOystein Eftevaag     };
233*758e9fbaSOystein Eftevaag 
234*758e9fbaSOystein Eftevaag     CHECK_BIN(TPM2B_PUBLIC, inPublicAES);
235*758e9fbaSOystein Eftevaag 
236*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC inPublicECC = {
237*758e9fbaSOystein Eftevaag             .size = 0,
238*758e9fbaSOystein Eftevaag             .publicArea = {
239*758e9fbaSOystein Eftevaag                 .type = TPM2_ALG_ECC,
240*758e9fbaSOystein Eftevaag                 .nameAlg = TPM2_ALG_SHA1,
241*758e9fbaSOystein Eftevaag                 .objectAttributes = (
242*758e9fbaSOystein Eftevaag                              TPMA_OBJECT_USERWITHAUTH |
243*758e9fbaSOystein Eftevaag                              TPMA_OBJECT_RESTRICTED |
244*758e9fbaSOystein Eftevaag                              TPMA_OBJECT_SIGN_ENCRYPT |
245*758e9fbaSOystein Eftevaag                              TPMA_OBJECT_FIXEDTPM |
246*758e9fbaSOystein Eftevaag                              TPMA_OBJECT_FIXEDPARENT |
247*758e9fbaSOystein Eftevaag                              TPMA_OBJECT_SENSITIVEDATAORIGIN
248*758e9fbaSOystein Eftevaag                              ),
249*758e9fbaSOystein Eftevaag                 .authPolicy = {
250*758e9fbaSOystein Eftevaag                          .size = 0,
251*758e9fbaSOystein Eftevaag                      },
252*758e9fbaSOystein Eftevaag 
253*758e9fbaSOystein Eftevaag                 .parameters.eccDetail = {
254*758e9fbaSOystein Eftevaag                      .symmetric = {
255*758e9fbaSOystein Eftevaag                          .algorithm = TPM2_ALG_NULL,
256*758e9fbaSOystein Eftevaag                          .keyBits.aes = 128,
257*758e9fbaSOystein Eftevaag                          .mode.aes = TPM2_ALG_ECB,
258*758e9fbaSOystein Eftevaag                      },
259*758e9fbaSOystein Eftevaag                      .scheme = {
260*758e9fbaSOystein Eftevaag                           .scheme = TPM2_ALG_ECDAA,
261*758e9fbaSOystein Eftevaag                           .details = { .ecdaa = { .hashAlg = TPM2_ALG_SHA256 }},
262*758e9fbaSOystein Eftevaag                       },
263*758e9fbaSOystein Eftevaag                      .curveID = TPM2_ECC_BN_P256,
264*758e9fbaSOystein Eftevaag                      .kdf = { .scheme = TPM2_ALG_NULL, .details = {} }
265*758e9fbaSOystein Eftevaag                  },
266*758e9fbaSOystein Eftevaag                 /*
267*758e9fbaSOystein Eftevaag                   .parameters.asymDetail.symmetric.algorithm = TPM2_ALG_NULL,
268*758e9fbaSOystein Eftevaag                 */
269*758e9fbaSOystein Eftevaag                 .unique.ecc = {
270*758e9fbaSOystein Eftevaag                      .x = { .size = 0, .buffer = {} } ,
271*758e9fbaSOystein Eftevaag                      .y = { .size = 0, .buffer = {} } ,
272*758e9fbaSOystein Eftevaag                  },
273*758e9fbaSOystein Eftevaag             },
274*758e9fbaSOystein Eftevaag         };
275*758e9fbaSOystein Eftevaag 
276*758e9fbaSOystein Eftevaag 
277*758e9fbaSOystein Eftevaag     CHECK_BIN(TPM2B_PUBLIC, inPublicECC);
278*758e9fbaSOystein Eftevaag 
279*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC inPublicRSA2 = {
280*758e9fbaSOystein Eftevaag         .size = 0,
281*758e9fbaSOystein Eftevaag         .publicArea = {
282*758e9fbaSOystein Eftevaag             .type = TPM2_ALG_RSA,
283*758e9fbaSOystein Eftevaag             .nameAlg = TPM2_ALG_SHA1,
284*758e9fbaSOystein Eftevaag             .objectAttributes = (TPMA_OBJECT_USERWITHAUTH |
285*758e9fbaSOystein Eftevaag                                  TPMA_OBJECT_SIGN_ENCRYPT  |
286*758e9fbaSOystein Eftevaag                                  TPMA_OBJECT_FIXEDTPM |
287*758e9fbaSOystein Eftevaag                                  TPMA_OBJECT_FIXEDPARENT |
288*758e9fbaSOystein Eftevaag                                  TPMA_OBJECT_SENSITIVEDATAORIGIN),
289*758e9fbaSOystein Eftevaag             .authPolicy = {
290*758e9fbaSOystein Eftevaag                  .size = 0,
291*758e9fbaSOystein Eftevaag              },
292*758e9fbaSOystein Eftevaag             .parameters.rsaDetail = {
293*758e9fbaSOystein Eftevaag                  .symmetric = {
294*758e9fbaSOystein Eftevaag                      .algorithm = TPM2_ALG_NULL,
295*758e9fbaSOystein Eftevaag                      .keyBits.aes = 128,
296*758e9fbaSOystein Eftevaag                      .mode.aes = TPM2_ALG_CFB},
297*758e9fbaSOystein Eftevaag                  .scheme = {
298*758e9fbaSOystein Eftevaag                       .scheme = TPM2_ALG_RSAPSS,
299*758e9fbaSOystein Eftevaag                       .details = {
300*758e9fbaSOystein Eftevaag                           .rsapss = { .hashAlg = TPM2_ALG_SHA1 }
301*758e9fbaSOystein Eftevaag                       }
302*758e9fbaSOystein Eftevaag                   },
303*758e9fbaSOystein Eftevaag                  .keyBits = 2048,
304*758e9fbaSOystein Eftevaag                  .exponent = 0,
305*758e9fbaSOystein Eftevaag              },
306*758e9fbaSOystein Eftevaag             .unique.rsa = {
307*758e9fbaSOystein Eftevaag                  .size = 0,
308*758e9fbaSOystein Eftevaag                  .buffer = {},
309*758e9fbaSOystein Eftevaag              },
310*758e9fbaSOystein Eftevaag         },
311*758e9fbaSOystein Eftevaag     };
312*758e9fbaSOystein Eftevaag 
313*758e9fbaSOystein Eftevaag     CHECK_BIN(TPM2B_PUBLIC, inPublicRSA2);
314*758e9fbaSOystein Eftevaag 
315*758e9fbaSOystein Eftevaag     TPMT_SIG_SCHEME ecc_scheme = { .scheme = TPM2_ALG_ECDSA, .details.ecdsa = TPM2_ALG_SHA1 };
316*758e9fbaSOystein Eftevaag 
317*758e9fbaSOystein Eftevaag     CHECK_BIN(TPMT_SIG_SCHEME, ecc_scheme);
318*758e9fbaSOystein Eftevaag 
319*758e9fbaSOystein Eftevaag     TPMT_SIG_SCHEME rsa_scheme = { .scheme = TPM2_ALG_NULL };
320*758e9fbaSOystein Eftevaag 
321*758e9fbaSOystein Eftevaag     CHECK_BIN(TPMT_SIG_SCHEME, rsa_scheme);
322*758e9fbaSOystein Eftevaag 
323*758e9fbaSOystein Eftevaag     TPMA_NV testNV = 0xffffff0f ;
324*758e9fbaSOystein Eftevaag 
325*758e9fbaSOystein Eftevaag     CHECK_BIN_SIMPLE(TPMA_NV, testNV);
326*758e9fbaSOystein Eftevaag 
327*758e9fbaSOystein Eftevaag     TPML_PCR_SELECTION pcr_selection = {
328*758e9fbaSOystein Eftevaag         .count = 3,
329*758e9fbaSOystein Eftevaag         .pcrSelections = {
330*758e9fbaSOystein Eftevaag          {
331*758e9fbaSOystein Eftevaag             .hash = TPM2_ALG_SHA1,
332*758e9fbaSOystein Eftevaag             .sizeofSelect = 3,
333*758e9fbaSOystein Eftevaag             .pcrSelect = { 01, 00, 03 }},
334*758e9fbaSOystein Eftevaag         {
335*758e9fbaSOystein Eftevaag             .hash = TPM2_ALG_SHA256,
336*758e9fbaSOystein Eftevaag             .sizeofSelect = 3,
337*758e9fbaSOystein Eftevaag             .pcrSelect = { 01 ,00 ,03 }},
338*758e9fbaSOystein Eftevaag         {
339*758e9fbaSOystein Eftevaag             .hash = TPM2_ALG_SHA384,
340*758e9fbaSOystein Eftevaag             .sizeofSelect = 3,
341*758e9fbaSOystein Eftevaag             .pcrSelect = { 02, 00, 02 }}
342*758e9fbaSOystein Eftevaag         }
343*758e9fbaSOystein Eftevaag     };
344*758e9fbaSOystein Eftevaag 
345*758e9fbaSOystein Eftevaag     CHECK_BIN(TPML_PCR_SELECTION, pcr_selection);
346*758e9fbaSOystein Eftevaag 
347*758e9fbaSOystein Eftevaag     IFAPI_IMA_EVENT imaEvent = {
348*758e9fbaSOystein Eftevaag         .eventData = {
349*758e9fbaSOystein Eftevaag             .size = 0,
350*758e9fbaSOystein Eftevaag             .buffer = { 0 }
351*758e9fbaSOystein Eftevaag         },
352*758e9fbaSOystein Eftevaag         .eventName = "Event"
353*758e9fbaSOystein Eftevaag     };
354*758e9fbaSOystein Eftevaag 
355*758e9fbaSOystein Eftevaag     CHECK_BIN(IFAPI_IMA_EVENT, imaEvent);
356*758e9fbaSOystein Eftevaag     free(imaEvent2.eventName);
357*758e9fbaSOystein Eftevaag }
358*758e9fbaSOystein Eftevaag 
359*758e9fbaSOystein Eftevaag static void
check_policy_bin(void ** state)360*758e9fbaSOystein Eftevaag check_policy_bin(void **state)
361*758e9fbaSOystein Eftevaag {
362*758e9fbaSOystein Eftevaag     TPMS_PCRVALUE pcr_value;
363*758e9fbaSOystein Eftevaag     TPML_PCRVALUES *pcr_value_list;
364*758e9fbaSOystein Eftevaag     TPML_POLICYBRANCHES *or_branch_list;
365*758e9fbaSOystein Eftevaag     TPMS_POLICYPCR pcr_policy;
366*758e9fbaSOystein Eftevaag     TPMT_POLICYELEMENT policy_element0;
367*758e9fbaSOystein Eftevaag     TPMT_POLICYELEMENT policy_element1;
368*758e9fbaSOystein Eftevaag     TPMT_POLICYELEMENT policy_element_or;
369*758e9fbaSOystein Eftevaag     TPML_POLICYELEMENTS *policy_elements_or;
370*758e9fbaSOystein Eftevaag     TPML_POLICYELEMENTS *policy_elements0;
371*758e9fbaSOystein Eftevaag     TPML_POLICYELEMENTS *policy_elements1;
372*758e9fbaSOystein Eftevaag     TPMS_POLICY policy;
373*758e9fbaSOystein Eftevaag     TPMS_POLICYBRANCH branch0;
374*758e9fbaSOystein Eftevaag     TPMS_POLICYBRANCH branch1;
375*758e9fbaSOystein Eftevaag 
376*758e9fbaSOystein Eftevaag     pcr_value.pcr = 16;
377*758e9fbaSOystein Eftevaag     pcr_value.hashAlg = TPM2_ALG_SHA1;
378*758e9fbaSOystein Eftevaag     memset(&pcr_value.digest, 0, sizeof(TPMU_HA));
379*758e9fbaSOystein Eftevaag     memset(&pcr_policy, 0, sizeof(TPMS_POLICYPCR));
380*758e9fbaSOystein Eftevaag     pcr_value_list = calloc(1, sizeof(TPML_PCRVALUES) + sizeof(TPMS_PCRVALUE));
381*758e9fbaSOystein Eftevaag     if (pcr_value_list == NULL) {
382*758e9fbaSOystein Eftevaag         LOG_ERROR("%s", "Out of memory.");
383*758e9fbaSOystein Eftevaag         return;
384*758e9fbaSOystein Eftevaag     }
385*758e9fbaSOystein Eftevaag     pcr_value_list->count = 1;
386*758e9fbaSOystein Eftevaag     pcr_value_list->pcrs[0] = pcr_value;
387*758e9fbaSOystein Eftevaag     pcr_policy.pcrs = pcr_value_list;
388*758e9fbaSOystein Eftevaag     memset(&policy_element0, 0, sizeof(TPMT_POLICYELEMENT));
389*758e9fbaSOystein Eftevaag     policy_element0.element.PolicyPCR = pcr_policy;
390*758e9fbaSOystein Eftevaag     policy_element0.type = POLICYPCR;
391*758e9fbaSOystein Eftevaag     memset(&policy_element1, 0, sizeof(TPMT_POLICYELEMENT));
392*758e9fbaSOystein Eftevaag     policy_element1.element.PolicyPCR = pcr_policy;
393*758e9fbaSOystein Eftevaag     policy_element1.type = POLICYPCR;
394*758e9fbaSOystein Eftevaag     policy_elements0 = calloc(1, sizeof(TPML_POLICYELEMENTS) + sizeof(TPMT_POLICYELEMENT));
395*758e9fbaSOystein Eftevaag     if (policy_elements0 == NULL) {
396*758e9fbaSOystein Eftevaag         LOG_ERROR("%s", "Out of memory.");
397*758e9fbaSOystein Eftevaag         if (pcr_policy.pcrs){
398*758e9fbaSOystein Eftevaag             free(pcr_policy.pcrs);
399*758e9fbaSOystein Eftevaag         }
400*758e9fbaSOystein Eftevaag         return;
401*758e9fbaSOystein Eftevaag     }
402*758e9fbaSOystein Eftevaag     policy_elements0->count = 1;
403*758e9fbaSOystein Eftevaag     policy_elements0->elements[0] = policy_element0;
404*758e9fbaSOystein Eftevaag     policy.policy = policy_elements0;
405*758e9fbaSOystein Eftevaag     policy.description = "hareness description";
406*758e9fbaSOystein Eftevaag     policy.policyAuthorizations = NULL;
407*758e9fbaSOystein Eftevaag     memset(&policy.policyDigests, 0, sizeof(TPML_DIGEST_VALUES));
408*758e9fbaSOystein Eftevaag 
409*758e9fbaSOystein Eftevaag     //CHECK_BIN(TPMS_POLICY, policy);
410*758e9fbaSOystein Eftevaag     {
411*758e9fbaSOystein Eftevaag         char *jso_string1, *jso_string2;
412*758e9fbaSOystein Eftevaag         json_object *jso = NULL;
413*758e9fbaSOystein Eftevaag         TSS2_RC rc = ifapi_json_TPMS_POLICY_serialize (&policy, &jso);
414*758e9fbaSOystein Eftevaag         jso_string1 = strdup(json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY));
415*758e9fbaSOystein Eftevaag         assert_int_equal (rc, TSS2_RC_SUCCESS);
416*758e9fbaSOystein Eftevaag         rc = ifapi_json_TPMS_POLICY_deserialize (jso, &policy);
417*758e9fbaSOystein Eftevaag         assert_int_equal (rc, TSS2_RC_SUCCESS);
418*758e9fbaSOystein Eftevaag         json_object_put(jso);
419*758e9fbaSOystein Eftevaag         jso = NULL;
420*758e9fbaSOystein Eftevaag         rc = ifapi_json_TPMS_POLICY_serialize (&policy, &jso);
421*758e9fbaSOystein Eftevaag         jso_string2 = strdup(json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY));
422*758e9fbaSOystein Eftevaag         assert_int_equal (rc, TSS2_RC_SUCCESS);
423*758e9fbaSOystein Eftevaag         if (strcmp(jso_string1, jso_string2)) {
424*758e9fbaSOystein Eftevaag             fprintf(stderr,"\n jso: %s\n", jso_string1);
425*758e9fbaSOystein Eftevaag             fprintf(stderr,"\n jso: %s\n", jso_string2);
426*758e9fbaSOystein Eftevaag         }
427*758e9fbaSOystein Eftevaag         assert_string_equal(jso_string1, jso_string2);
428*758e9fbaSOystein Eftevaag         json_object_put(jso);
429*758e9fbaSOystein Eftevaag         free(jso_string1);
430*758e9fbaSOystein Eftevaag         free(jso_string2);
431*758e9fbaSOystein Eftevaag     }
432*758e9fbaSOystein Eftevaag     ifapi_cleanup_policy(&policy);
433*758e9fbaSOystein Eftevaag 
434*758e9fbaSOystein Eftevaag     or_branch_list = calloc(2, sizeof(TPML_POLICYBRANCHES) + (2 * sizeof(TPMS_POLICYBRANCH)));
435*758e9fbaSOystein Eftevaag     if (or_branch_list == NULL) {
436*758e9fbaSOystein Eftevaag         LOG_ERROR("%s", "Out of memory.");
437*758e9fbaSOystein Eftevaag         return;
438*758e9fbaSOystein Eftevaag     }
439*758e9fbaSOystein Eftevaag     or_branch_list->count = 2;
440*758e9fbaSOystein Eftevaag 
441*758e9fbaSOystein Eftevaag     policy_elements1 = calloc(1, sizeof(TPML_POLICYELEMENTS) + sizeof(TPMT_POLICYELEMENT));
442*758e9fbaSOystein Eftevaag     if (policy_elements1 == NULL) {
443*758e9fbaSOystein Eftevaag         LOG_ERROR("%s", "Out of memory.");
444*758e9fbaSOystein Eftevaag         if (or_branch_list){
445*758e9fbaSOystein Eftevaag             free(or_branch_list);
446*758e9fbaSOystein Eftevaag         }
447*758e9fbaSOystein Eftevaag         return;
448*758e9fbaSOystein Eftevaag     }
449*758e9fbaSOystein Eftevaag     policy_elements1->count = 1;
450*758e9fbaSOystein Eftevaag     policy_elements1->elements[0] = policy_element1;
451*758e9fbaSOystein Eftevaag 
452*758e9fbaSOystein Eftevaag     memset(&branch0, 0, sizeof(TPMS_POLICYBRANCH));
453*758e9fbaSOystein Eftevaag     memset(&branch1, 0, sizeof(TPMS_POLICYBRANCH));
454*758e9fbaSOystein Eftevaag     branch0.policy = policy_elements0;
455*758e9fbaSOystein Eftevaag     branch0.name = "branch0";
456*758e9fbaSOystein Eftevaag     branch0.description = "description branch 0";
457*758e9fbaSOystein Eftevaag     branch1.policy = policy_elements1;
458*758e9fbaSOystein Eftevaag     branch1.name = "branch1";
459*758e9fbaSOystein Eftevaag     branch1.description = "description branch 1";
460*758e9fbaSOystein Eftevaag     memcpy(&or_branch_list->authorizations[0], &branch0, sizeof(TPMS_POLICYBRANCH));
461*758e9fbaSOystein Eftevaag     memcpy(&or_branch_list->authorizations[1], &branch1, sizeof(TPMS_POLICYBRANCH));
462*758e9fbaSOystein Eftevaag     //or_policy.pcrs = pcr_branch_list;
463*758e9fbaSOystein Eftevaag 
464*758e9fbaSOystein Eftevaag     policy_elements_or = calloc(1, sizeof(TPML_POLICYELEMENTS) + sizeof(TPMT_POLICYELEMENT));
465*758e9fbaSOystein Eftevaag     if (policy_elements_or == NULL) {
466*758e9fbaSOystein Eftevaag         LOG_ERROR("%s", "Out of memory.");
467*758e9fbaSOystein Eftevaag         if (or_branch_list) {
468*758e9fbaSOystein Eftevaag             free(or_branch_list);
469*758e9fbaSOystein Eftevaag         }
470*758e9fbaSOystein Eftevaag         return;
471*758e9fbaSOystein Eftevaag     }
472*758e9fbaSOystein Eftevaag     policy_elements_or->count = 1;
473*758e9fbaSOystein Eftevaag 
474*758e9fbaSOystein Eftevaag     memset(&policy_element_or, 0, sizeof(TPMT_POLICYELEMENT));
475*758e9fbaSOystein Eftevaag     policy_element_or.element.PolicyOr.branches = or_branch_list;
476*758e9fbaSOystein Eftevaag     policy_element_or.type = POLICYOR;
477*758e9fbaSOystein Eftevaag     policy_elements_or->elements[0] = policy_element_or;
478*758e9fbaSOystein Eftevaag     policy.policy =  policy_elements_or;
479*758e9fbaSOystein Eftevaag 
480*758e9fbaSOystein Eftevaag     //CHECK_BIN(TPMS_POLICY, policy);
481*758e9fbaSOystein Eftevaag     {
482*758e9fbaSOystein Eftevaag         char *jso_string1, *jso_string2;
483*758e9fbaSOystein Eftevaag         json_object *jso = NULL;
484*758e9fbaSOystein Eftevaag         TSS2_RC rc = ifapi_json_TPMS_POLICY_serialize (&policy, &jso);
485*758e9fbaSOystein Eftevaag         jso_string1 = strdup(json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY));
486*758e9fbaSOystein Eftevaag         assert_int_equal (rc, TSS2_RC_SUCCESS);
487*758e9fbaSOystein Eftevaag         rc = ifapi_json_TPMS_POLICY_deserialize (jso, &policy);
488*758e9fbaSOystein Eftevaag         assert_int_equal (rc, TSS2_RC_SUCCESS);
489*758e9fbaSOystein Eftevaag         json_object_put(jso);
490*758e9fbaSOystein Eftevaag         jso = NULL;
491*758e9fbaSOystein Eftevaag         rc = ifapi_json_TPMS_POLICY_serialize (&policy, &jso);
492*758e9fbaSOystein Eftevaag         jso_string2 = strdup(json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY));
493*758e9fbaSOystein Eftevaag         assert_int_equal (rc, TSS2_RC_SUCCESS);
494*758e9fbaSOystein Eftevaag         if (strcmp(jso_string1, jso_string2)) {
495*758e9fbaSOystein Eftevaag             fprintf(stderr,"\n jso: %s\n", jso_string1);
496*758e9fbaSOystein Eftevaag             fprintf(stderr,"\n jso: %s\n", jso_string2);
497*758e9fbaSOystein Eftevaag         }
498*758e9fbaSOystein Eftevaag         assert_string_equal(jso_string1, jso_string2);
499*758e9fbaSOystein Eftevaag         json_object_put(jso);
500*758e9fbaSOystein Eftevaag         free(jso_string1);
501*758e9fbaSOystein Eftevaag         free(jso_string2);
502*758e9fbaSOystein Eftevaag     }
503*758e9fbaSOystein Eftevaag     ifapi_cleanup_policy(&policy);
504*758e9fbaSOystein Eftevaag 
505*758e9fbaSOystein Eftevaag     free(policy_elements_or);
506*758e9fbaSOystein Eftevaag     free(policy_elements0);
507*758e9fbaSOystein Eftevaag     free(policy_elements1);
508*758e9fbaSOystein Eftevaag     free(or_branch_list);
509*758e9fbaSOystein Eftevaag     free(pcr_value_list);
510*758e9fbaSOystein Eftevaag }
511*758e9fbaSOystein Eftevaag 
512*758e9fbaSOystein Eftevaag static void
check_json_to_bin(void ** state)513*758e9fbaSOystein Eftevaag check_json_to_bin(void **state)
514*758e9fbaSOystein Eftevaag {
515*758e9fbaSOystein Eftevaag     CHECK_JSON_TO_BIN(UINT64, "22147483647", 22147483647);
516*758e9fbaSOystein Eftevaag     CHECK_JSON_TO_BIN(UINT64, "\"0xffffffff\"", 0xffffffff);
517*758e9fbaSOystein Eftevaag     CHECK_JSON_TO_BIN(UINT64, "\"0xfffffffff\"", 0xfffffffff);
518*758e9fbaSOystein Eftevaag     CHECK_JSON_TO_BIN(UINT32,  "\"0xFfffffff\"", 0xffffffff);
519*758e9fbaSOystein Eftevaag     CHECK_JSON_TO_BIN(UINT16, "\"0xffff\"", 0xffff);
520*758e9fbaSOystein Eftevaag }
521*758e9fbaSOystein Eftevaag 
522*758e9fbaSOystein Eftevaag static void
check_json_structs(void ** state)523*758e9fbaSOystein Eftevaag check_json_structs(void **state)
524*758e9fbaSOystein Eftevaag {
525*758e9fbaSOystein Eftevaag     const char *test_json_TPMS_POLICYTEMPLATE =
526*758e9fbaSOystein Eftevaag         "{\n"
527*758e9fbaSOystein Eftevaag         "  \"templateHash\": \"0011223344556677889900112233445566778899\"\n"
528*758e9fbaSOystein Eftevaag         "}";
529*758e9fbaSOystein Eftevaag     CHECK_JSON(TPMS_POLICYTEMPLATE, test_json_TPMS_POLICYTEMPLATE, test_json_TPMS_POLICYTEMPLATE);
530*758e9fbaSOystein Eftevaag 
531*758e9fbaSOystein Eftevaag     const char *test_json_TPM2B_PUBLIC_expected =
532*758e9fbaSOystein Eftevaag         "{\n"
533*758e9fbaSOystein Eftevaag         "  \"size\":0,\n"
534*758e9fbaSOystein Eftevaag         "  \"publicArea\":{\n"
535*758e9fbaSOystein Eftevaag         "    \"type\":\"ECC\",\n"
536*758e9fbaSOystein Eftevaag         "    \"nameAlg\":\"SHA1\",\n"
537*758e9fbaSOystein Eftevaag         "\"objectAttributes\":{"
538*758e9fbaSOystein Eftevaag         "      \"fixedTPM\":1,"
539*758e9fbaSOystein Eftevaag         "      \"stClear\":0,"
540*758e9fbaSOystein Eftevaag         "      \"fixedParent\":1,"
541*758e9fbaSOystein Eftevaag         "      \"sensitiveDataOrigin\":1,"
542*758e9fbaSOystein Eftevaag         "      \"userWithAuth\":1,"
543*758e9fbaSOystein Eftevaag         "      \"adminWithPolicy\":0,"
544*758e9fbaSOystein Eftevaag         "      \"noDA\":0,"
545*758e9fbaSOystein Eftevaag         "      \"encryptedDuplication\":0,"
546*758e9fbaSOystein Eftevaag         "      \"restricted\":1,"
547*758e9fbaSOystein Eftevaag         "      \"decrypt\":0,"
548*758e9fbaSOystein Eftevaag         "      \"sign\":1"
549*758e9fbaSOystein Eftevaag         "    },"
550*758e9fbaSOystein Eftevaag         "    \"authPolicy\":\"\",\n"
551*758e9fbaSOystein Eftevaag         "    \"parameters\":{\n"
552*758e9fbaSOystein Eftevaag         "      \"symmetric\":{\n"
553*758e9fbaSOystein Eftevaag         "        \"algorithm\":\"NULL\"\n"
554*758e9fbaSOystein Eftevaag         "      },\n"
555*758e9fbaSOystein Eftevaag         "      \"scheme\":{\n"
556*758e9fbaSOystein Eftevaag         "        \"scheme\":\"ECDAA\",\n"
557*758e9fbaSOystein Eftevaag         "        \"details\":{\n"
558*758e9fbaSOystein Eftevaag         "          \"hashAlg\":\"SHA256\",\n"
559*758e9fbaSOystein Eftevaag         "          \"count\":0\n"
560*758e9fbaSOystein Eftevaag         "        }\n"
561*758e9fbaSOystein Eftevaag         "      },\n"
562*758e9fbaSOystein Eftevaag         "      \"curveID\":\"BN_P256\",\n"
563*758e9fbaSOystein Eftevaag         "      \"kdf\":{\n"
564*758e9fbaSOystein Eftevaag         "        \"scheme\":\"NULL\"\n"
565*758e9fbaSOystein Eftevaag         "      }\n"
566*758e9fbaSOystein Eftevaag         "    },\n"
567*758e9fbaSOystein Eftevaag         "    \"unique\":{\n"
568*758e9fbaSOystein Eftevaag         "      \"x\": \"\",\n"
569*758e9fbaSOystein Eftevaag         "      \"y\": \"\"\n"
570*758e9fbaSOystein Eftevaag         "    }\n"
571*758e9fbaSOystein Eftevaag         "  }\n"
572*758e9fbaSOystein Eftevaag         "}";
573*758e9fbaSOystein Eftevaag 
574*758e9fbaSOystein Eftevaag     const char *test_json_TPM2B_PUBLIC_src=
575*758e9fbaSOystein Eftevaag         "{"
576*758e9fbaSOystein Eftevaag         "  \"size\":0,"
577*758e9fbaSOystein Eftevaag         "  \"publicArea\":{"
578*758e9fbaSOystein Eftevaag         "    \"type\":\"ECC\","
579*758e9fbaSOystein Eftevaag         "    \"nameAlg\":\"SHA1\","
580*758e9fbaSOystein Eftevaag         "    \"objectAttributes\":["
581*758e9fbaSOystein Eftevaag         "      \"fixedTPM\","
582*758e9fbaSOystein Eftevaag         "      \"fixedParent\","
583*758e9fbaSOystein Eftevaag         "      \"sensitiveDataOrigin\","
584*758e9fbaSOystein Eftevaag         "      \"userWithAuth\","
585*758e9fbaSOystein Eftevaag         "      \"restricted\","
586*758e9fbaSOystein Eftevaag         "      \"sign\""
587*758e9fbaSOystein Eftevaag         "    ],"
588*758e9fbaSOystein Eftevaag         "    \"authPolicy\":\"\","
589*758e9fbaSOystein Eftevaag         "    \"parameters\":{"
590*758e9fbaSOystein Eftevaag         "      \"symmetric\":{"
591*758e9fbaSOystein Eftevaag         "        \"algorithm\":\"NULL\""
592*758e9fbaSOystein Eftevaag         "      },"
593*758e9fbaSOystein Eftevaag         "      \"scheme\":{"
594*758e9fbaSOystein Eftevaag         "        \"scheme\":\"ECDAA\","
595*758e9fbaSOystein Eftevaag         "        \"details\":{"
596*758e9fbaSOystein Eftevaag         "          \"hashAlg\":\"SHA256\","
597*758e9fbaSOystein Eftevaag         "          \"count\":0"
598*758e9fbaSOystein Eftevaag         "        }"
599*758e9fbaSOystein Eftevaag         "      },"
600*758e9fbaSOystein Eftevaag         "      \"curveID\":\"ECC_BN_P256\","
601*758e9fbaSOystein Eftevaag         "      \"kdf\":{"
602*758e9fbaSOystein Eftevaag         "        \"scheme\":\"NULL\""
603*758e9fbaSOystein Eftevaag         "      }"
604*758e9fbaSOystein Eftevaag         "    },"
605*758e9fbaSOystein Eftevaag         "    \"unique\":{"
606*758e9fbaSOystein Eftevaag         "      \"x\": \"\",\n"
607*758e9fbaSOystein Eftevaag         "      \"y\": \"\"\n"
608*758e9fbaSOystein Eftevaag         "    }"
609*758e9fbaSOystein Eftevaag         "  }"
610*758e9fbaSOystein Eftevaag         "}"
611*758e9fbaSOystein Eftevaag         "";
612*758e9fbaSOystein Eftevaag     const char *test_json_TPM2B_PUBLIC_dwnc_src =
613*758e9fbaSOystein Eftevaag         "{"
614*758e9fbaSOystein Eftevaag         "  \"size\":0,"
615*758e9fbaSOystein Eftevaag         "  \"publicArea\":{"
616*758e9fbaSOystein Eftevaag         "    \"type\":\"ecc\","
617*758e9fbaSOystein Eftevaag         "    \"nameAlg\":\"sha1\","
618*758e9fbaSOystein Eftevaag         "    \"objectAttributes\":["
619*758e9fbaSOystein Eftevaag         "      \"fixedTPM\","
620*758e9fbaSOystein Eftevaag         "      \"fixedParent\","
621*758e9fbaSOystein Eftevaag         "      \"sensitiveDataOrigin\","
622*758e9fbaSOystein Eftevaag         "      \"userWithAuth\","
623*758e9fbaSOystein Eftevaag         "      \"restricted\","
624*758e9fbaSOystein Eftevaag         "      \"sign\""
625*758e9fbaSOystein Eftevaag         "    ],"
626*758e9fbaSOystein Eftevaag         "    \"authPolicy\":\"\","
627*758e9fbaSOystein Eftevaag         "    \"parameters\":{"
628*758e9fbaSOystein Eftevaag         "      \"symmetric\":{"
629*758e9fbaSOystein Eftevaag         "        \"algorithm\":\"null\""
630*758e9fbaSOystein Eftevaag         "      },"
631*758e9fbaSOystein Eftevaag         "      \"scheme\":{"
632*758e9fbaSOystein Eftevaag         "        \"scheme\":\"ecdaa\","
633*758e9fbaSOystein Eftevaag         "        \"details\":{"
634*758e9fbaSOystein Eftevaag         "          \"hashAlg\":\"sha256\","
635*758e9fbaSOystein Eftevaag         "          \"count\":0"
636*758e9fbaSOystein Eftevaag         "        }"
637*758e9fbaSOystein Eftevaag         "      },"
638*758e9fbaSOystein Eftevaag         "      \"curveID\":\"ecc_BN_P256\","
639*758e9fbaSOystein Eftevaag         "      \"kdf\":{"
640*758e9fbaSOystein Eftevaag         "        \"scheme\":\"null\""
641*758e9fbaSOystein Eftevaag         "      }"
642*758e9fbaSOystein Eftevaag         "    },"
643*758e9fbaSOystein Eftevaag         "    \"unique\":{"
644*758e9fbaSOystein Eftevaag         "      \"x\": \"\",\n"
645*758e9fbaSOystein Eftevaag         "      \"y\": \"\"\n"
646*758e9fbaSOystein Eftevaag         "      }"
647*758e9fbaSOystein Eftevaag         "    }"
648*758e9fbaSOystein Eftevaag         "  }"
649*758e9fbaSOystein Eftevaag         "}"
650*758e9fbaSOystein Eftevaag         "";
651*758e9fbaSOystein Eftevaag 
652*758e9fbaSOystein Eftevaag     CHECK_JSON(TPM2B_PUBLIC, test_json_TPM2B_PUBLIC_src, test_json_TPM2B_PUBLIC_expected);
653*758e9fbaSOystein Eftevaag     CHECK_JSON(TPM2B_PUBLIC, test_json_TPM2B_PUBLIC_dwnc_src, test_json_TPM2B_PUBLIC_expected);
654*758e9fbaSOystein Eftevaag 
655*758e9fbaSOystein Eftevaag     const char *test_json_TPMS_ATTEST_certify_src =
656*758e9fbaSOystein Eftevaag         "{\n"
657*758e9fbaSOystein Eftevaag         "    \"magic\": \"0xff544347\",\n"
658*758e9fbaSOystein Eftevaag         "    \"type\": \"ST_ATTEST_CERTIFY\",\n"
659*758e9fbaSOystein Eftevaag         "    \"qualifiedSigner\": \"0x00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
660*758e9fbaSOystein Eftevaag         "    \"extraData\": \"0x00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
661*758e9fbaSOystein Eftevaag         "    \"clockInfo\": {\n"
662*758e9fbaSOystein Eftevaag         "        \"clock\": 123,\n"
663*758e9fbaSOystein Eftevaag         "        \"resetCount\": 23,\n"
664*758e9fbaSOystein Eftevaag         "        \"restartCount\": 1,\n"
665*758e9fbaSOystein Eftevaag         "        \"safe\": \"yes\"\n"
666*758e9fbaSOystein Eftevaag         "    },\n"
667*758e9fbaSOystein Eftevaag         "    \"firmwareVersion\": 783,\n"
668*758e9fbaSOystein Eftevaag         "    \"attested\": {\n"
669*758e9fbaSOystein Eftevaag         "        \"name\": \"0x00010203040506070809c0c1c2c3c4c5c6c7c8c9\",\n"
670*758e9fbaSOystein Eftevaag         "        \"qualifiedName\": \"0x00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
671*758e9fbaSOystein Eftevaag         "    }\n"
672*758e9fbaSOystein Eftevaag         "}";
673*758e9fbaSOystein Eftevaag     const char *test_json_TPMS_ATTEST_certify_expt =
674*758e9fbaSOystein Eftevaag         "{\n"
675*758e9fbaSOystein Eftevaag         "    \"magic\": \"VALUE\",\n"
676*758e9fbaSOystein Eftevaag         "    \"type\": \"ATTEST_CERTIFY\",\n"
677*758e9fbaSOystein Eftevaag         "    \"qualifiedSigner\": \"00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
678*758e9fbaSOystein Eftevaag         "    \"extraData\": \"00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
679*758e9fbaSOystein Eftevaag         "    \"clockInfo\": {\n"
680*758e9fbaSOystein Eftevaag         "        \"clock\": 123,\n"
681*758e9fbaSOystein Eftevaag         "        \"resetCount\": 23,\n"
682*758e9fbaSOystein Eftevaag         "        \"restartCount\": 1,\n"
683*758e9fbaSOystein Eftevaag         "        \"safe\": \"YES\"\n"
684*758e9fbaSOystein Eftevaag         "    },\n"
685*758e9fbaSOystein Eftevaag         "    \"firmwareVersion\": 783,\n"
686*758e9fbaSOystein Eftevaag         "    \"attested\": {\n"
687*758e9fbaSOystein Eftevaag         "        \"name\": \"00010203040506070809c0c1c2c3c4c5c6c7c8c9\",\n"
688*758e9fbaSOystein Eftevaag         "        \"qualifiedName\": \"00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
689*758e9fbaSOystein Eftevaag         "    }\n"
690*758e9fbaSOystein Eftevaag         "}";
691*758e9fbaSOystein Eftevaag     CHECK_JSON(TPMS_ATTEST, test_json_TPMS_ATTEST_certify_src, test_json_TPMS_ATTEST_certify_expt);
692*758e9fbaSOystein Eftevaag 
693*758e9fbaSOystein Eftevaag     const char *test_json_TPMS_ATTEST_sessionaudit_src =
694*758e9fbaSOystein Eftevaag         "{\n"
695*758e9fbaSOystein Eftevaag         "    \"magic\": \"0xff544347\",\n"
696*758e9fbaSOystein Eftevaag         "    \"type\": \"ST_ATTEST_SESSION_AUDIT\",\n"
697*758e9fbaSOystein Eftevaag         "    \"qualifiedSigner\": \"0x00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
698*758e9fbaSOystein Eftevaag         "    \"extraData\": \"0x00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
699*758e9fbaSOystein Eftevaag         "    \"clockInfo\": {\n"
700*758e9fbaSOystein Eftevaag         "        \"clock\": [12345,0],\n"
701*758e9fbaSOystein Eftevaag         "        \"resetCount\": 23,\n"
702*758e9fbaSOystein Eftevaag         "        \"restartCount\": 1,\n"
703*758e9fbaSOystein Eftevaag         "        \"safe\": \"yes\"\n"
704*758e9fbaSOystein Eftevaag         "    },\n"
705*758e9fbaSOystein Eftevaag         "    \"firmwareVersion\": [783783,0],\n"
706*758e9fbaSOystein Eftevaag         "    \"attested\": {\n"
707*758e9fbaSOystein Eftevaag         "        \"exclusiveSession\": \"yes\",\n"
708*758e9fbaSOystein Eftevaag         "        \"sessionDigest\": \"0x00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
709*758e9fbaSOystein Eftevaag         "    }\n"
710*758e9fbaSOystein Eftevaag         "}";
711*758e9fbaSOystein Eftevaag     const char *test_json_TPMS_ATTEST_sessionaudit_expt =
712*758e9fbaSOystein Eftevaag         "{\n"
713*758e9fbaSOystein Eftevaag         "    \"magic\": \"VALUE\",\n"
714*758e9fbaSOystein Eftevaag         "    \"type\": \"ATTEST_SESSION_AUDIT\",\n"
715*758e9fbaSOystein Eftevaag         "    \"qualifiedSigner\": \"00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
716*758e9fbaSOystein Eftevaag         "    \"extraData\": \"00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
717*758e9fbaSOystein Eftevaag         "    \"clockInfo\": {\n"
718*758e9fbaSOystein Eftevaag         "        \"clock\": 53021371269120,\n"
719*758e9fbaSOystein Eftevaag         "        \"resetCount\": 23,\n"
720*758e9fbaSOystein Eftevaag         "        \"restartCount\": 1,\n"
721*758e9fbaSOystein Eftevaag         "        \"safe\": \"YES\"\n"
722*758e9fbaSOystein Eftevaag         "    },\n"
723*758e9fbaSOystein Eftevaag         "    \"firmwareVersion\": [783783,0],\n"
724*758e9fbaSOystein Eftevaag         "    \"attested\": {\n"
725*758e9fbaSOystein Eftevaag         "        \"exclusiveSession\": \"YES\",\n"
726*758e9fbaSOystein Eftevaag         "        \"sessionDigest\": \"00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
727*758e9fbaSOystein Eftevaag         "    }\n"
728*758e9fbaSOystein Eftevaag         "}";
729*758e9fbaSOystein Eftevaag     CHECK_JSON(TPMS_ATTEST, test_json_TPMS_ATTEST_sessionaudit_src, test_json_TPMS_ATTEST_sessionaudit_expt);
730*758e9fbaSOystein Eftevaag 
731*758e9fbaSOystein Eftevaag     const char *test_json_TPMS_ATTEST_certifycreation_src =
732*758e9fbaSOystein Eftevaag         "{\n"
733*758e9fbaSOystein Eftevaag         "    \"magic\": \"0xff544347\",\n"
734*758e9fbaSOystein Eftevaag         "    \"type\": \"ST_ATTEST_CREATION\",\n"
735*758e9fbaSOystein Eftevaag         "    \"qualifiedSigner\": \"0x00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
736*758e9fbaSOystein Eftevaag         "    \"extraData\": \"0x00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
737*758e9fbaSOystein Eftevaag         "    \"clockInfo\": {\n"
738*758e9fbaSOystein Eftevaag         "        \"clock\": 123,\n"
739*758e9fbaSOystein Eftevaag         "        \"resetCount\": 23,\n"
740*758e9fbaSOystein Eftevaag         "        \"restartCount\": 1,\n"
741*758e9fbaSOystein Eftevaag         "        \"safe\": \"yes\"\n"
742*758e9fbaSOystein Eftevaag         "    },\n"
743*758e9fbaSOystein Eftevaag         "    \"firmwareVersion\": [0,783],\n"
744*758e9fbaSOystein Eftevaag         "    \"attested\": {\n"
745*758e9fbaSOystein Eftevaag         "        \"objectName\": \"0x00010203040506070809c0c1c2c3c4c5c6c7c8c9\",\n"
746*758e9fbaSOystein Eftevaag         "        \"creationHash\": \"0x00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
747*758e9fbaSOystein Eftevaag         "    }\n"
748*758e9fbaSOystein Eftevaag         "}";
749*758e9fbaSOystein Eftevaag     const char *test_json_TPMS_ATTEST_certifycreation_expt =
750*758e9fbaSOystein Eftevaag         "{\n"
751*758e9fbaSOystein Eftevaag         "    \"magic\": \"VALUE\",\n"
752*758e9fbaSOystein Eftevaag         "    \"type\": \"ATTEST_CREATION\",\n"
753*758e9fbaSOystein Eftevaag         "    \"qualifiedSigner\": \"00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
754*758e9fbaSOystein Eftevaag         "    \"extraData\": \"00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
755*758e9fbaSOystein Eftevaag         "    \"clockInfo\": {\n"
756*758e9fbaSOystein Eftevaag         "        \"clock\": 123,\n"
757*758e9fbaSOystein Eftevaag         "        \"resetCount\": 23,\n"
758*758e9fbaSOystein Eftevaag         "        \"restartCount\": 1,\n"
759*758e9fbaSOystein Eftevaag         "        \"safe\": \"YES\"\n"
760*758e9fbaSOystein Eftevaag         "    },\n"
761*758e9fbaSOystein Eftevaag         "    \"firmwareVersion\": 783,\n"
762*758e9fbaSOystein Eftevaag         "    \"attested\": {\n"
763*758e9fbaSOystein Eftevaag         "        \"objectName\": \"00010203040506070809c0c1c2c3c4c5c6c7c8c9\",\n"
764*758e9fbaSOystein Eftevaag         "        \"creationHash\": \"00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
765*758e9fbaSOystein Eftevaag         "    }\n"
766*758e9fbaSOystein Eftevaag         "}";
767*758e9fbaSOystein Eftevaag     CHECK_JSON(TPMS_ATTEST, test_json_TPMS_ATTEST_certifycreation_src, test_json_TPMS_ATTEST_certifycreation_expt);
768*758e9fbaSOystein Eftevaag 
769*758e9fbaSOystein Eftevaag     const char *test_json_TPMS_ATTEST_commandaudit_src =
770*758e9fbaSOystein Eftevaag         "{\n"
771*758e9fbaSOystein Eftevaag         "    \"magic\": \"0xff544347\",\n"
772*758e9fbaSOystein Eftevaag         "    \"type\": \"ST_ATTEST_COMMAND_AUDIT\",\n"
773*758e9fbaSOystein Eftevaag         "    \"qualifiedSigner\": \"0x00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
774*758e9fbaSOystein Eftevaag         "    \"extraData\": \"0x00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
775*758e9fbaSOystein Eftevaag         "    \"clockInfo\": {\n"
776*758e9fbaSOystein Eftevaag         "        \"clock\": 123,\n"
777*758e9fbaSOystein Eftevaag         "        \"resetCount\": 23,\n"
778*758e9fbaSOystein Eftevaag         "        \"restartCount\": 1,\n"
779*758e9fbaSOystein Eftevaag         "        \"safe\": \"yes\"\n"
780*758e9fbaSOystein Eftevaag         "    },\n"
781*758e9fbaSOystein Eftevaag         "    \"firmwareVersion\": 783,\n"
782*758e9fbaSOystein Eftevaag         "    \"attested\": {\n"
783*758e9fbaSOystein Eftevaag         "        \"auditCounter\": 456,\n"
784*758e9fbaSOystein Eftevaag         "        \"digestAlg\": \"sha1\",\n"
785*758e9fbaSOystein Eftevaag         "        \"auditDigest\": \"0x00010203040506070809c0c1c2c3c4c5c6c7c8c9\",\n"
786*758e9fbaSOystein Eftevaag         "        \"commandDigest\": \"0x00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
787*758e9fbaSOystein Eftevaag         "    }\n"
788*758e9fbaSOystein Eftevaag         "}";
789*758e9fbaSOystein Eftevaag     const char *test_json_TPMS_ATTEST_commandaudit_expt =
790*758e9fbaSOystein Eftevaag         "{\n"
791*758e9fbaSOystein Eftevaag         "    \"magic\": \"VALUE\",\n"
792*758e9fbaSOystein Eftevaag         "    \"type\": \"ATTEST_COMMAND_AUDIT\",\n"
793*758e9fbaSOystein Eftevaag         "    \"qualifiedSigner\": \"00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
794*758e9fbaSOystein Eftevaag         "    \"extraData\": \"00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
795*758e9fbaSOystein Eftevaag         "    \"clockInfo\": {\n"
796*758e9fbaSOystein Eftevaag         "        \"clock\": 123,\n"
797*758e9fbaSOystein Eftevaag         "        \"resetCount\": 23,\n"
798*758e9fbaSOystein Eftevaag         "        \"restartCount\": 1,\n"
799*758e9fbaSOystein Eftevaag         "        \"safe\": \"YES\"\n"
800*758e9fbaSOystein Eftevaag         "    },\n"
801*758e9fbaSOystein Eftevaag         "    \"firmwareVersion\": 783,\n"
802*758e9fbaSOystein Eftevaag         "    \"attested\": {\n"
803*758e9fbaSOystein Eftevaag         "        \"auditCounter\": 456,\n"
804*758e9fbaSOystein Eftevaag         "        \"digestAlg\": \"SHA1\",\n"
805*758e9fbaSOystein Eftevaag         "        \"auditDigest\": \"00010203040506070809c0c1c2c3c4c5c6c7c8c9\",\n"
806*758e9fbaSOystein Eftevaag         "        \"commandDigest\": \"00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
807*758e9fbaSOystein Eftevaag         "    }\n"
808*758e9fbaSOystein Eftevaag         "}";
809*758e9fbaSOystein Eftevaag     CHECK_JSON(TPMS_ATTEST, test_json_TPMS_ATTEST_commandaudit_src, test_json_TPMS_ATTEST_commandaudit_expt);
810*758e9fbaSOystein Eftevaag 
811*758e9fbaSOystein Eftevaag     const char *test_json_TPMS_ATTEST_time_src =
812*758e9fbaSOystein Eftevaag         "{\n"
813*758e9fbaSOystein Eftevaag         "    \"magic\": \"0xff544347\",\n"
814*758e9fbaSOystein Eftevaag         "    \"type\": \"ST_ATTEST_TIME\",\n"
815*758e9fbaSOystein Eftevaag         "    \"qualifiedSigner\": \"0x00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
816*758e9fbaSOystein Eftevaag         "    \"extraData\": \"0x00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
817*758e9fbaSOystein Eftevaag         "    \"clockInfo\": {\n"
818*758e9fbaSOystein Eftevaag         "        \"clock\": 123,\n"
819*758e9fbaSOystein Eftevaag         "        \"resetCount\": 23,\n"
820*758e9fbaSOystein Eftevaag         "        \"restartCount\": 1,\n"
821*758e9fbaSOystein Eftevaag         "        \"safe\": \"yes\"\n"
822*758e9fbaSOystein Eftevaag         "    },\n"
823*758e9fbaSOystein Eftevaag         "    \"firmwareVersion\": 783,\n"
824*758e9fbaSOystein Eftevaag         "    \"attested\": {\n"
825*758e9fbaSOystein Eftevaag         "        \"time\": {\n"
826*758e9fbaSOystein Eftevaag         "            \"time\": 234,\n"
827*758e9fbaSOystein Eftevaag         "            \"clockInfo\": {\n"
828*758e9fbaSOystein Eftevaag         "                \"clock\": 123,\n"
829*758e9fbaSOystein Eftevaag         "                \"resetCount\": 23,\n"
830*758e9fbaSOystein Eftevaag         "                \"restartCount\": 1,\n"
831*758e9fbaSOystein Eftevaag         "                \"safe\": \"yes\"\n"
832*758e9fbaSOystein Eftevaag         "            }\n"
833*758e9fbaSOystein Eftevaag         "        },\n"
834*758e9fbaSOystein Eftevaag         "        \"firmwareVersion\": 783\n"
835*758e9fbaSOystein Eftevaag         "    }\n"
836*758e9fbaSOystein Eftevaag         "}";
837*758e9fbaSOystein Eftevaag     const char *test_json_TPMS_ATTEST_time_expt =
838*758e9fbaSOystein Eftevaag         "{\n"
839*758e9fbaSOystein Eftevaag         "    \"magic\": \"VALUE\",\n"
840*758e9fbaSOystein Eftevaag         "    \"type\": \"ATTEST_TIME\",\n"
841*758e9fbaSOystein Eftevaag         "    \"qualifiedSigner\": \"00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
842*758e9fbaSOystein Eftevaag         "    \"extraData\": \"00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
843*758e9fbaSOystein Eftevaag         "    \"clockInfo\": {\n"
844*758e9fbaSOystein Eftevaag         "        \"clock\": 123,\n"
845*758e9fbaSOystein Eftevaag         "        \"resetCount\": 23,\n"
846*758e9fbaSOystein Eftevaag         "        \"restartCount\": 1,\n"
847*758e9fbaSOystein Eftevaag         "        \"safe\": \"YES\"\n"
848*758e9fbaSOystein Eftevaag         "    },\n"
849*758e9fbaSOystein Eftevaag         "    \"firmwareVersion\": 783,\n"
850*758e9fbaSOystein Eftevaag         "    \"attested\": {\n"
851*758e9fbaSOystein Eftevaag         "        \"time\": {\n"
852*758e9fbaSOystein Eftevaag         "            \"time\": 234,\n"
853*758e9fbaSOystein Eftevaag         "            \"clockInfo\": {\n"
854*758e9fbaSOystein Eftevaag         "                \"clock\": 123,\n"
855*758e9fbaSOystein Eftevaag         "                \"resetCount\": 23,\n"
856*758e9fbaSOystein Eftevaag         "                \"restartCount\": 1,\n"
857*758e9fbaSOystein Eftevaag         "                \"safe\": \"YES\"\n"
858*758e9fbaSOystein Eftevaag         "            }\n"
859*758e9fbaSOystein Eftevaag         "        },\n"
860*758e9fbaSOystein Eftevaag         "        \"firmwareVersion\": 783\n"
861*758e9fbaSOystein Eftevaag         "    }\n"
862*758e9fbaSOystein Eftevaag         "}";
863*758e9fbaSOystein Eftevaag     CHECK_JSON(TPMS_ATTEST, test_json_TPMS_ATTEST_time_src, test_json_TPMS_ATTEST_time_expt);
864*758e9fbaSOystein Eftevaag 
865*758e9fbaSOystein Eftevaag     const char *test_json_TPMS_ATTEST_certifynv_src =
866*758e9fbaSOystein Eftevaag         "{\n"
867*758e9fbaSOystein Eftevaag         "    \"magic\": \"0xff544347\",\n"
868*758e9fbaSOystein Eftevaag         "    \"type\": \"ST_ATTEST_NV\",\n"
869*758e9fbaSOystein Eftevaag         "    \"qualifiedSigner\": \"0x00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
870*758e9fbaSOystein Eftevaag         "    \"extraData\": \"0x00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
871*758e9fbaSOystein Eftevaag         "    \"clockInfo\": {\n"
872*758e9fbaSOystein Eftevaag         "        \"clock\": 123,\n"
873*758e9fbaSOystein Eftevaag         "        \"resetCount\": 23,\n"
874*758e9fbaSOystein Eftevaag         "        \"restartCount\": 1,\n"
875*758e9fbaSOystein Eftevaag         "        \"safe\": \"yes\"\n"
876*758e9fbaSOystein Eftevaag         "    },\n"
877*758e9fbaSOystein Eftevaag         "    \"firmwareVersion\": 783,\n"
878*758e9fbaSOystein Eftevaag         "    \"attested\": {\n"
879*758e9fbaSOystein Eftevaag         "        \"indexName\": \"0x00010203040506070809c0c1c2c3c4c5c6c7c8c9\",\n"
880*758e9fbaSOystein Eftevaag         "        \"offset\": 10,\n"
881*758e9fbaSOystein Eftevaag         "        \"nvContents\": \"0x00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
882*758e9fbaSOystein Eftevaag         "    }\n"
883*758e9fbaSOystein Eftevaag         "}";
884*758e9fbaSOystein Eftevaag     const char *test_json_TPMS_ATTEST_certifynv_expt =
885*758e9fbaSOystein Eftevaag         "{\n"
886*758e9fbaSOystein Eftevaag         "    \"magic\": \"VALUE\",\n"
887*758e9fbaSOystein Eftevaag         "    \"type\": \"ATTEST_NV\",\n"
888*758e9fbaSOystein Eftevaag         "    \"qualifiedSigner\": \"00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
889*758e9fbaSOystein Eftevaag         "    \"extraData\": \"00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
890*758e9fbaSOystein Eftevaag         "    \"clockInfo\": {\n"
891*758e9fbaSOystein Eftevaag         "        \"clock\": 123,\n"
892*758e9fbaSOystein Eftevaag         "        \"resetCount\": 23,\n"
893*758e9fbaSOystein Eftevaag         "        \"restartCount\": 1,\n"
894*758e9fbaSOystein Eftevaag         "        \"safe\": \"YES\"\n"
895*758e9fbaSOystein Eftevaag         "    },\n"
896*758e9fbaSOystein Eftevaag         "    \"firmwareVersion\": 783,\n"
897*758e9fbaSOystein Eftevaag         "    \"attested\": {\n"
898*758e9fbaSOystein Eftevaag         "        \"indexName\": \"00010203040506070809c0c1c2c3c4c5c6c7c8c9\",\n"
899*758e9fbaSOystein Eftevaag         "        \"offset\": 10,\n"
900*758e9fbaSOystein Eftevaag         "        \"nvContents\": \"00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
901*758e9fbaSOystein Eftevaag         "    }\n"
902*758e9fbaSOystein Eftevaag         "}";
903*758e9fbaSOystein Eftevaag     CHECK_JSON(TPMS_ATTEST, test_json_TPMS_ATTEST_certifynv_src, test_json_TPMS_ATTEST_certifynv_expt);
904*758e9fbaSOystein Eftevaag 
905*758e9fbaSOystein Eftevaag     const char *test_json_TPMT_KEYEDHASH_SCHEME_hmac_src =
906*758e9fbaSOystein Eftevaag         "{\n"
907*758e9fbaSOystein Eftevaag         "    \"scheme\": \"HMAC\",\n"
908*758e9fbaSOystein Eftevaag         "    \"details\": {\n"
909*758e9fbaSOystein Eftevaag         "        \"hashAlg\": \"SHA256\"\n"
910*758e9fbaSOystein Eftevaag         "    }\n"
911*758e9fbaSOystein Eftevaag         "}";
912*758e9fbaSOystein Eftevaag     const char *test_json_TPMT_KEYEDHASH_SCHEME_hmac_expt =
913*758e9fbaSOystein Eftevaag         "{\n"
914*758e9fbaSOystein Eftevaag         "    \"scheme\": \"HMAC\",\n"
915*758e9fbaSOystein Eftevaag         "    \"details\": {\n"
916*758e9fbaSOystein Eftevaag         "        \"hashAlg\": \"SHA256\"\n"
917*758e9fbaSOystein Eftevaag         "    }\n"
918*758e9fbaSOystein Eftevaag         "}";
919*758e9fbaSOystein Eftevaag     CHECK_JSON(TPMT_KEYEDHASH_SCHEME, test_json_TPMT_KEYEDHASH_SCHEME_hmac_src, test_json_TPMT_KEYEDHASH_SCHEME_hmac_expt);
920*758e9fbaSOystein Eftevaag 
921*758e9fbaSOystein Eftevaag     const char *test_json_TPMT_KEYEDHASH_SCHEME_xor_src =
922*758e9fbaSOystein Eftevaag         "{\n"
923*758e9fbaSOystein Eftevaag         "    \"scheme\": \"XOR\",\n"
924*758e9fbaSOystein Eftevaag         "    \"details\": {\n"
925*758e9fbaSOystein Eftevaag         "        \"hashAlg\": \"SHA256\",\n"
926*758e9fbaSOystein Eftevaag         "        \"kdf\": \"MGF1\"\n"
927*758e9fbaSOystein Eftevaag         "    }\n"
928*758e9fbaSOystein Eftevaag         "}";
929*758e9fbaSOystein Eftevaag     const char *test_json_TPMT_KEYEDHASH_SCHEME_xor_expt =
930*758e9fbaSOystein Eftevaag         "{\n"
931*758e9fbaSOystein Eftevaag         "    \"scheme\": \"XOR\",\n"
932*758e9fbaSOystein Eftevaag         "    \"details\": {\n"
933*758e9fbaSOystein Eftevaag         "        \"hashAlg\": \"SHA256\",\n"
934*758e9fbaSOystein Eftevaag         "        \"kdf\": \"MGF1\"\n"
935*758e9fbaSOystein Eftevaag         "    }\n"
936*758e9fbaSOystein Eftevaag         "}";
937*758e9fbaSOystein Eftevaag     CHECK_JSON(TPMT_KEYEDHASH_SCHEME, test_json_TPMT_KEYEDHASH_SCHEME_xor_src, test_json_TPMT_KEYEDHASH_SCHEME_xor_expt);
938*758e9fbaSOystein Eftevaag 
939*758e9fbaSOystein Eftevaag }
940*758e9fbaSOystein Eftevaag 
941*758e9fbaSOystein Eftevaag static void
check_json_constants(void ** state)942*758e9fbaSOystein Eftevaag check_json_constants(void **state)
943*758e9fbaSOystein Eftevaag {
944*758e9fbaSOystein Eftevaag     CHECK_JSON_SIMPLE(TPMI_ALG_HASH, "\"sha1\"", "\"SHA1\"");
945*758e9fbaSOystein Eftevaag     CHECK_JSON_SIMPLE(TPMI_ALG_HASH, "\"0x04\"", "\"SHA1\"");
946*758e9fbaSOystein Eftevaag     CHECK_JSON_SIMPLE(TPMI_ALG_HASH, "4", "\"SHA1\"");
947*758e9fbaSOystein Eftevaag }
948*758e9fbaSOystein Eftevaag 
949*758e9fbaSOystein Eftevaag static void
check_json_numbers(void ** state)950*758e9fbaSOystein Eftevaag check_json_numbers(void **state)
951*758e9fbaSOystein Eftevaag {
952*758e9fbaSOystein Eftevaag     CHECK_JSON_SIMPLE(UINT16, "10", "10");
953*758e9fbaSOystein Eftevaag     CHECK_JSON_SIMPLE(UINT16, "\"0x0a\"", "10");
954*758e9fbaSOystein Eftevaag     CHECK_JSON_SIMPLE(UINT64, "10000000000000000","[2328306,1874919424]");
955*758e9fbaSOystein Eftevaag }
956*758e9fbaSOystein Eftevaag 
957*758e9fbaSOystein Eftevaag static void
check_json_bits(void ** state)958*758e9fbaSOystein Eftevaag check_json_bits(void **state)
959*758e9fbaSOystein Eftevaag {
960*758e9fbaSOystein Eftevaag       const char *test_json_TPMA_NV_expected =\
961*758e9fbaSOystein Eftevaag                     "{"
962*758e9fbaSOystein Eftevaag                     "  \"PPWRITE\":0,"
963*758e9fbaSOystein Eftevaag                     "  \"OWNERWRITE\":1,"
964*758e9fbaSOystein Eftevaag                     "  \"AUTHWRITE\":1,"
965*758e9fbaSOystein Eftevaag                     "  \"POLICYWRITE\":1,"
966*758e9fbaSOystein Eftevaag                     "  \"POLICY_DELETE\":1,"
967*758e9fbaSOystein Eftevaag                     "  \"WRITELOCKED\":0,"
968*758e9fbaSOystein Eftevaag                     "  \"WRITEALL\":0,"
969*758e9fbaSOystein Eftevaag                     "  \"WRITEDEFINE\":0,"
970*758e9fbaSOystein Eftevaag                     "  \"WRITE_STCLEAR\":0,"
971*758e9fbaSOystein Eftevaag                     "  \"GLOBALLOCK\":0,"
972*758e9fbaSOystein Eftevaag                     "  \"PPREAD\":0,"
973*758e9fbaSOystein Eftevaag                     "  \"OWNERREAD\":1,"
974*758e9fbaSOystein Eftevaag                     "  \"AUTHREAD\":1,"
975*758e9fbaSOystein Eftevaag                     "  \"POLICYREAD\":1,"
976*758e9fbaSOystein Eftevaag                     "  \"NO_DA\":0,"
977*758e9fbaSOystein Eftevaag                     "  \"ORDERLY\":1,"
978*758e9fbaSOystein Eftevaag                     "  \"CLEAR_STCLEAR\":1,"
979*758e9fbaSOystein Eftevaag                     "  \"READLOCKED\":1,"
980*758e9fbaSOystein Eftevaag                     "  \"WRITTEN\":1,"
981*758e9fbaSOystein Eftevaag                     "  \"PLATFORMCREATE\":0,"
982*758e9fbaSOystein Eftevaag                     "  \"READ_STCLEAR\":0,"
983*758e9fbaSOystein Eftevaag                     "  \"TPM2_NT\":\"COUNTER\""
984*758e9fbaSOystein Eftevaag                     "}";
985*758e9fbaSOystein Eftevaag 
986*758e9fbaSOystein Eftevaag     const char *test_json_TPMA_NV_src_array =\
987*758e9fbaSOystein Eftevaag                     "["
988*758e9fbaSOystein Eftevaag                     "  \"nv_ownerwrite\","
989*758e9fbaSOystein Eftevaag                     "  \"nv_authwrite\","
990*758e9fbaSOystein Eftevaag                     "  \"nv_policywrite\","
991*758e9fbaSOystein Eftevaag                     "  \"nv_policy_delete\","
992*758e9fbaSOystein Eftevaag                     "  \"nv_ownerread\","
993*758e9fbaSOystein Eftevaag                     "  \"nv_authread\","
994*758e9fbaSOystein Eftevaag                     "  \"nv_policyread\","
995*758e9fbaSOystein Eftevaag                     "  \"nv_orderly\","
996*758e9fbaSOystein Eftevaag                     "  \"nv_clear_stclear\","
997*758e9fbaSOystein Eftevaag                     "  \"nv_readlocked\","
998*758e9fbaSOystein Eftevaag                     "  \"nv_written\","
999*758e9fbaSOystein Eftevaag                     "  {"
1000*758e9fbaSOystein Eftevaag                     "    \"TPM2_NT\": \"NT_COUNTER\""
1001*758e9fbaSOystein Eftevaag                     "  }"
1002*758e9fbaSOystein Eftevaag                     "]";
1003*758e9fbaSOystein Eftevaag 
1004*758e9fbaSOystein Eftevaag        const char *test_json_TPMA_NV_src_struct =\
1005*758e9fbaSOystein Eftevaag                     "{"
1006*758e9fbaSOystein Eftevaag                     "  \"TPMA_NV_OWNERWRITE\":\"YES\","
1007*758e9fbaSOystein Eftevaag                     "  \"TPMA_NV_AUTHWRITE\":\"yes\","
1008*758e9fbaSOystein Eftevaag                     "  \"TPMA_NV_POLICYWRITE\":\"TPM2_YES\","
1009*758e9fbaSOystein Eftevaag                     "  \"TPMA_NV_POLICY_DELETE\":\"tpm2_yes\","
1010*758e9fbaSOystein Eftevaag                     "  \"TPMA_NV_OWNERREAD\":\"SET\","
1011*758e9fbaSOystein Eftevaag                     "  \"TPMA_NV_AUTHREAD\":\"set\","
1012*758e9fbaSOystein Eftevaag                     "  \"TPMA_NV_POLICYREAD\":1,"
1013*758e9fbaSOystein Eftevaag                     "  \"TPMA_NV_ORDERLY\":1,"
1014*758e9fbaSOystein Eftevaag                     "  \"TPMA_NV_CLEAR_STCLEAR\":1,"
1015*758e9fbaSOystein Eftevaag                     "  \"TPMA_NV_READLOCKED\":1,"
1016*758e9fbaSOystein Eftevaag                     "  \"TPMA_NV_WRITTEN\":1,"
1017*758e9fbaSOystein Eftevaag                     "  \"TPM2_NT\":1"
1018*758e9fbaSOystein Eftevaag                     "  }";
1019*758e9fbaSOystein Eftevaag 
1020*758e9fbaSOystein Eftevaag     CHECK_JSON_SIMPLE(TPMA_NV, test_json_TPMA_NV_src_array, test_json_TPMA_NV_expected);
1021*758e9fbaSOystein Eftevaag     CHECK_JSON_SIMPLE(TPMA_NV, test_json_TPMA_NV_src_struct, test_json_TPMA_NV_expected);
1022*758e9fbaSOystein Eftevaag }
1023*758e9fbaSOystein Eftevaag 
1024*758e9fbaSOystein Eftevaag static void
check_json_policy(void ** state)1025*758e9fbaSOystein Eftevaag check_json_policy(void **state)
1026*758e9fbaSOystein Eftevaag {
1027*758e9fbaSOystein Eftevaag      const char *test_json_policy_nv_src =       \
1028*758e9fbaSOystein Eftevaag         "{"
1029*758e9fbaSOystein Eftevaag         "  \"description\":\"Description pol_nv\","
1030*758e9fbaSOystein Eftevaag         "  \"policyDigests\":["
1031*758e9fbaSOystein Eftevaag         "  ],"
1032*758e9fbaSOystein Eftevaag         "  \"policyAuthorizations\":["
1033*758e9fbaSOystein Eftevaag         "  ],"
1034*758e9fbaSOystein Eftevaag         "    \"policy\":["
1035*758e9fbaSOystein Eftevaag         "        {"
1036*758e9fbaSOystein Eftevaag         "            \"type\": \"POLICYNV\","
1037*758e9fbaSOystein Eftevaag         "                   \"nvPath\": \"myNV\","
1038*758e9fbaSOystein Eftevaag         "                   \"operandB\": \"01030304\""
1039*758e9fbaSOystein Eftevaag         "      }"
1040*758e9fbaSOystein Eftevaag         "  ]"
1041*758e9fbaSOystein Eftevaag         "}";
1042*758e9fbaSOystein Eftevaag 
1043*758e9fbaSOystein Eftevaag        const char *test_json_policy_nv_expected =       \
1044*758e9fbaSOystein Eftevaag         "{"
1045*758e9fbaSOystein Eftevaag         "  \"description\":\"Description pol_nv\","
1046*758e9fbaSOystein Eftevaag         "  \"policyDigests\":["
1047*758e9fbaSOystein Eftevaag         "  ],"
1048*758e9fbaSOystein Eftevaag         "  \"policyAuthorizations\":["
1049*758e9fbaSOystein Eftevaag         "  ],"
1050*758e9fbaSOystein Eftevaag         "    \"policy\":["
1051*758e9fbaSOystein Eftevaag         "        {"
1052*758e9fbaSOystein Eftevaag         "            \"type\": \"POLICYNV\","
1053*758e9fbaSOystein Eftevaag         "                   \"nvPath\": \"myNV\","
1054*758e9fbaSOystein Eftevaag         "                   \"operandB\": \"01030304\""
1055*758e9fbaSOystein Eftevaag         "     }"
1056*758e9fbaSOystein Eftevaag         "  ]"
1057*758e9fbaSOystein Eftevaag         "}";
1058*758e9fbaSOystein Eftevaag 
1059*758e9fbaSOystein Eftevaag 
1060*758e9fbaSOystein Eftevaag //    CHECK_JSON(TPMS_POLICY, test_json_policy_nv_src, test_json_policy_nv_expected);
1061*758e9fbaSOystein Eftevaag         {
1062*758e9fbaSOystein Eftevaag             TPMS_POLICY out;
1063*758e9fbaSOystein Eftevaag             TSS2_RC rc;
1064*758e9fbaSOystein Eftevaag             json_object *jso = json_tokener_parse(test_json_policy_nv_src);
1065*758e9fbaSOystein Eftevaag             if (!jso) fprintf(stderr, "JSON parsing failed\n");
1066*758e9fbaSOystein Eftevaag             assert_non_null(jso);
1067*758e9fbaSOystein Eftevaag             rc = ifapi_json_TPMS_POLICY_deserialize (jso, &out);
1068*758e9fbaSOystein Eftevaag             if (rc) fprintf(stderr, "Deserialization failed\n");
1069*758e9fbaSOystein Eftevaag             assert_int_equal (rc, TSS2_RC_SUCCESS);
1070*758e9fbaSOystein Eftevaag             json_object_put(jso);
1071*758e9fbaSOystein Eftevaag             jso = NULL;
1072*758e9fbaSOystein Eftevaag             rc = ifapi_json_TPMS_POLICY_serialize (&out, &jso);
1073*758e9fbaSOystein Eftevaag             assert_int_equal (rc, TSS2_RC_SUCCESS);
1074*758e9fbaSOystein Eftevaag             assert_non_null(jso);
1075*758e9fbaSOystein Eftevaag             const char *jso_string = json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY);
1076*758e9fbaSOystein Eftevaag             assert_non_null(jso_string);
1077*758e9fbaSOystein Eftevaag             char *string1 = normalize(jso_string);
1078*758e9fbaSOystein Eftevaag             char *string2 =  normalize(test_json_policy_nv_expected);
1079*758e9fbaSOystein Eftevaag             assert_string_equal(string1, string2);
1080*758e9fbaSOystein Eftevaag             json_object_put(jso);
1081*758e9fbaSOystein Eftevaag             ifapi_cleanup_policy(&out);
1082*758e9fbaSOystein Eftevaag             free(string1);
1083*758e9fbaSOystein Eftevaag             free(string2);
1084*758e9fbaSOystein Eftevaag         }
1085*758e9fbaSOystein Eftevaag 
1086*758e9fbaSOystein Eftevaag     const char *test_json_policy_or_src =       \
1087*758e9fbaSOystein Eftevaag         "{"
1088*758e9fbaSOystein Eftevaag         "  \"description\":\"hareness description\","
1089*758e9fbaSOystein Eftevaag         "  \"policyDigests\":["
1090*758e9fbaSOystein Eftevaag         "    {"
1091*758e9fbaSOystein Eftevaag         "      \"hashAlg\":\"SHA256\","
1092*758e9fbaSOystein Eftevaag         "      \"digest\":\"59215cb6c21a60e26b2cc479334a021113611903795507c1227659e2aef23d16\""
1093*758e9fbaSOystein Eftevaag         "    }"
1094*758e9fbaSOystein Eftevaag         "  ],"
1095*758e9fbaSOystein Eftevaag         "  \"policy\":["
1096*758e9fbaSOystein Eftevaag         "    {"
1097*758e9fbaSOystein Eftevaag         "      \"type\":\"POLICYOR\","
1098*758e9fbaSOystein Eftevaag         "      \"policyDigests\":["
1099*758e9fbaSOystein Eftevaag         "        {"
1100*758e9fbaSOystein Eftevaag         "          \"hashAlg\":\"SHA256\","
1101*758e9fbaSOystein Eftevaag         "          \"digest\":\"59215cb6c21a60e26b2cc479334a021113611903795507c1227659e2aef23d16\""
1102*758e9fbaSOystein Eftevaag         "        }"
1103*758e9fbaSOystein Eftevaag         "      ],"
1104*758e9fbaSOystein Eftevaag         "        \"branches\":["
1105*758e9fbaSOystein Eftevaag         "          {"
1106*758e9fbaSOystein Eftevaag         "            \"name\":\"branch1\","
1107*758e9fbaSOystein Eftevaag         "            \"description\":\"description branch 1\","
1108*758e9fbaSOystein Eftevaag         "            \"policy\":["
1109*758e9fbaSOystein Eftevaag         "              {"
1110*758e9fbaSOystein Eftevaag         "                \"type\":\"POLICYPCR\","
1111*758e9fbaSOystein Eftevaag         "                \"policyDigests\":["
1112*758e9fbaSOystein Eftevaag         "                  {"
1113*758e9fbaSOystein Eftevaag         "                    \"hashAlg\":\"SHA256\","
1114*758e9fbaSOystein Eftevaag         "                    \"digest\":\"17d552f8e39ad882f6b3c09ae139af59616bf6a63f4093d6d20e9e1b9f7cdb6e\""
1115*758e9fbaSOystein Eftevaag         "                  }"
1116*758e9fbaSOystein Eftevaag         "                ],"
1117*758e9fbaSOystein Eftevaag         "                  \"pcrs\":["
1118*758e9fbaSOystein Eftevaag         "                    {"
1119*758e9fbaSOystein Eftevaag         "                      \"pcr\":16,"
1120*758e9fbaSOystein Eftevaag         "                      \"hashAlg\":\"SHA1\","
1121*758e9fbaSOystein Eftevaag         "                      \"digest\":\"0000000000000000000000000000000000000000\""
1122*758e9fbaSOystein Eftevaag         "                    }"
1123*758e9fbaSOystein Eftevaag         "                  ]"
1124*758e9fbaSOystein Eftevaag         "              }"
1125*758e9fbaSOystein Eftevaag         "            ],"
1126*758e9fbaSOystein Eftevaag         "            \"policyDigests\":["
1127*758e9fbaSOystein Eftevaag         "              {"
1128*758e9fbaSOystein Eftevaag         "                \"hashAlg\":\"SHA256\","
1129*758e9fbaSOystein Eftevaag         "                \"digest\":\"17d552f8e39ad882f6b3c09ae139af59616bf6a63f4093d6d20e9e1b9f7cdb6e\""
1130*758e9fbaSOystein Eftevaag         "              }"
1131*758e9fbaSOystein Eftevaag         "            ]"
1132*758e9fbaSOystein Eftevaag         "          },"
1133*758e9fbaSOystein Eftevaag         "          {"
1134*758e9fbaSOystein Eftevaag         "            \"name\":\"branch1\","
1135*758e9fbaSOystein Eftevaag         "            \"description\":\"description branch 1\","
1136*758e9fbaSOystein Eftevaag         "            \"policy\":["
1137*758e9fbaSOystein Eftevaag         "              {"
1138*758e9fbaSOystein Eftevaag         "                \"type\":\"POLICYPCR\","
1139*758e9fbaSOystein Eftevaag         "                \"policyDigests\":["
1140*758e9fbaSOystein Eftevaag         "                  {"
1141*758e9fbaSOystein Eftevaag         "                    \"hashAlg\":\"SHA256\","
1142*758e9fbaSOystein Eftevaag         "                    \"digest\":\"17d552f8e39ad882f6b3c09ae139af59616bf6a63f4093d6d20e9e1b9f7cdb6e\""
1143*758e9fbaSOystein Eftevaag         "                  }"
1144*758e9fbaSOystein Eftevaag         "                ],"
1145*758e9fbaSOystein Eftevaag         "                  \"pcrs\":["
1146*758e9fbaSOystein Eftevaag         "                    {"
1147*758e9fbaSOystein Eftevaag         "                      \"pcr\":16,"
1148*758e9fbaSOystein Eftevaag         "                      \"hashAlg\":\"SHA1\","
1149*758e9fbaSOystein Eftevaag         "                      \"digest\":\"0000000000000000000000000000000000000000\""
1150*758e9fbaSOystein Eftevaag         "                    }"
1151*758e9fbaSOystein Eftevaag         "                  ]"
1152*758e9fbaSOystein Eftevaag         "              }"
1153*758e9fbaSOystein Eftevaag         "            ],"
1154*758e9fbaSOystein Eftevaag         "            \"policyDigests\":["
1155*758e9fbaSOystein Eftevaag         "              {"
1156*758e9fbaSOystein Eftevaag         "                \"hashAlg\":\"SHA256\","
1157*758e9fbaSOystein Eftevaag         "                \"digest\":\"17d552f8e39ad882f6b3c09ae139af59616bf6a63f4093d6d20e9e1b9f7cdb6e\""
1158*758e9fbaSOystein Eftevaag         "              }"
1159*758e9fbaSOystein Eftevaag         "            ]"
1160*758e9fbaSOystein Eftevaag         "          }"
1161*758e9fbaSOystein Eftevaag         "        ]"
1162*758e9fbaSOystein Eftevaag         "    }"
1163*758e9fbaSOystein Eftevaag         "  ]"
1164*758e9fbaSOystein Eftevaag         "}";
1165*758e9fbaSOystein Eftevaag 
1166*758e9fbaSOystein Eftevaag     char *test_json_policy_or_expected = strdup(test_json_policy_or_src);
1167*758e9fbaSOystein Eftevaag     if (test_json_policy_or_expected == NULL){
1168*758e9fbaSOystein Eftevaag         LOG_ERROR("%s", "Out of memory.");
1169*758e9fbaSOystein Eftevaag         return;
1170*758e9fbaSOystein Eftevaag     }
1171*758e9fbaSOystein Eftevaag //    CHECK_JSON(TPMS_POLICY, test_json_policy_or_src, test_json_policy_or_expected);
1172*758e9fbaSOystein Eftevaag         {
1173*758e9fbaSOystein Eftevaag             TPMS_POLICY out;
1174*758e9fbaSOystein Eftevaag             TSS2_RC rc;
1175*758e9fbaSOystein Eftevaag             json_object *jso = json_tokener_parse(test_json_policy_or_src);
1176*758e9fbaSOystein Eftevaag             if (!jso) fprintf(stderr, "JSON parsing failed\n");
1177*758e9fbaSOystein Eftevaag             assert_non_null(jso);
1178*758e9fbaSOystein Eftevaag             rc = ifapi_json_TPMS_POLICY_deserialize (jso, &out);
1179*758e9fbaSOystein Eftevaag             if (rc) fprintf(stderr, "Deserialization failed\n");
1180*758e9fbaSOystein Eftevaag             assert_int_equal (rc, TSS2_RC_SUCCESS);
1181*758e9fbaSOystein Eftevaag             json_object_put(jso);
1182*758e9fbaSOystein Eftevaag             jso = NULL;
1183*758e9fbaSOystein Eftevaag             rc = ifapi_json_TPMS_POLICY_serialize (&out, &jso);
1184*758e9fbaSOystein Eftevaag             assert_int_equal (rc, TSS2_RC_SUCCESS);
1185*758e9fbaSOystein Eftevaag             assert_non_null(jso);
1186*758e9fbaSOystein Eftevaag             const char *jso_string = json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY);
1187*758e9fbaSOystein Eftevaag             assert_non_null(jso_string);
1188*758e9fbaSOystein Eftevaag             char *string1 = normalize(jso_string);
1189*758e9fbaSOystein Eftevaag             char *string2 =  normalize(test_json_policy_or_expected);
1190*758e9fbaSOystein Eftevaag             assert_string_equal(string1, string2);
1191*758e9fbaSOystein Eftevaag             json_object_put(jso);
1192*758e9fbaSOystein Eftevaag             ifapi_cleanup_policy(&out);
1193*758e9fbaSOystein Eftevaag             free(string1);
1194*758e9fbaSOystein Eftevaag             free(string2);
1195*758e9fbaSOystein Eftevaag         }
1196*758e9fbaSOystein Eftevaag     free(test_json_policy_or_expected);
1197*758e9fbaSOystein Eftevaag }
1198*758e9fbaSOystein Eftevaag 
1199*758e9fbaSOystein Eftevaag 
1200*758e9fbaSOystein Eftevaag static void
check_json_tpm2bs(void ** state)1201*758e9fbaSOystein Eftevaag check_json_tpm2bs(void **state)
1202*758e9fbaSOystein Eftevaag {
1203*758e9fbaSOystein Eftevaag     CHECK_JSON(TPM2B_DIGEST, "\"0x0102\"", "\"0102\"");
1204*758e9fbaSOystein Eftevaag     CHECK_JSON(TPM2B_DIGEST, "\"0102\"", "\"0102\"");
1205*758e9fbaSOystein Eftevaag     CHECK_JSON(TPM2B_DIGEST, "\"caffee\"", "\"caffee\"");
1206*758e9fbaSOystein Eftevaag }
1207*758e9fbaSOystein Eftevaag 
1208*758e9fbaSOystein Eftevaag static void
check_error(void ** state)1209*758e9fbaSOystein Eftevaag check_error(void **state)
1210*758e9fbaSOystein Eftevaag {
1211*758e9fbaSOystein Eftevaag    /* Value is > then max value for UINT */
1212*758e9fbaSOystein Eftevaag     CHECK_ERROR(UINT16, "\"0x10000\"", TSS2_FAPI_RC_BAD_VALUE);
1213*758e9fbaSOystein Eftevaag     CHECK_ERROR(UINT32, "\"0x100000000\"", TSS2_FAPI_RC_BAD_VALUE);
1214*758e9fbaSOystein Eftevaag 
1215*758e9fbaSOystein Eftevaag     /* Digest/list is too large*/
1216*758e9fbaSOystein Eftevaag     CHECK_ERROR(TPM2B_DIGEST, "\"0x0102222222222222222222222222222222222222222222222222222"
1217*758e9fbaSOystein Eftevaag                 "22222222222222222222222222222222222222222222222222222222222222222222222222222\"",
1218*758e9fbaSOystein Eftevaag                 TSS2_FAPI_RC_BAD_VALUE);
1219*758e9fbaSOystein Eftevaag 
1220*758e9fbaSOystein Eftevaag     /* Illegal values */
1221*758e9fbaSOystein Eftevaag     CHECK_ERROR(TPMI_ALG_HASH, "\"SHA9999\"", TSS2_FAPI_RC_BAD_VALUE);
1222*758e9fbaSOystein Eftevaag     CHECK_ERROR(TPM2B_DIGEST, "\"xxxx\"", TSS2_FAPI_RC_BAD_VALUE);
1223*758e9fbaSOystein Eftevaag     CHECK_ERROR(TPM2B_DIGEST, "\"0x010x\"", TSS2_FAPI_RC_BAD_VALUE);
1224*758e9fbaSOystein Eftevaag }
1225*758e9fbaSOystein Eftevaag 
1226*758e9fbaSOystein Eftevaag 
1227*758e9fbaSOystein Eftevaag static void
check_tpmjson_tofromtxt(void ** state)1228*758e9fbaSOystein Eftevaag check_tpmjson_tofromtxt(void **state)
1229*758e9fbaSOystein Eftevaag {
1230*758e9fbaSOystein Eftevaag     const char *testcase_alg_id[] = { "\"TPM_ALG_ID_SHA1\"", "\"TPM2_ALG_ID_SHA1\"",
1231*758e9fbaSOystein Eftevaag                                       "\"ALG_ID_SHA1\"", "\"SHA1\"", "\"ALG_SHA1\"",
1232*758e9fbaSOystein Eftevaag                                       "\"tpm2_alg_id_sha1\"", "\"sha1\"", "\"0x0004\"" };
1233*758e9fbaSOystein Eftevaag     const char *expected_ald_id = { "\"SHA1\"" };
1234*758e9fbaSOystein Eftevaag     for (size_t i = 0; i < sizeof(testcase_alg_id) / sizeof(testcase_alg_id[0]); i++) {
1235*758e9fbaSOystein Eftevaag         CHECK_JSON_SIMPLE(TPM2_ALG_ID, testcase_alg_id[i], expected_ald_id);
1236*758e9fbaSOystein Eftevaag     }
1237*758e9fbaSOystein Eftevaag 
1238*758e9fbaSOystein Eftevaag     const char *testcase_ecc_curve[] = { "\"TPM2_ECC_NIST_P256\"", "\"ECC_NIST_P256\"",
1239*758e9fbaSOystein Eftevaag                                          "\"NIST_P256\"", "\"0x0003\"", "\"nist_p256\"" };
1240*758e9fbaSOystein Eftevaag     const char *expected_ecc_curve = { "\"NIST_P256\"" };
1241*758e9fbaSOystein Eftevaag     for (size_t i = 0; i < sizeof(testcase_ecc_curve) / sizeof(testcase_ecc_curve[0]); i++) {
1242*758e9fbaSOystein Eftevaag         CHECK_JSON_SIMPLE(TPM2_ECC_CURVE, testcase_ecc_curve[i], expected_ecc_curve);
1243*758e9fbaSOystein Eftevaag     }
1244*758e9fbaSOystein Eftevaag 
1245*758e9fbaSOystein Eftevaag     const char *testcase_cc[] = { "\"TPM2_CC_Startup\"", "\"CC_Startup\"",
1246*758e9fbaSOystein Eftevaag                                   "\"Startup\"", "\"0x00000144\"" };
1247*758e9fbaSOystein Eftevaag     const char *expected_cc = { "\"Startup\"" };
1248*758e9fbaSOystein Eftevaag     for (size_t i = 0; i < sizeof(testcase_cc) / sizeof(testcase_cc[0]); i++) {
1249*758e9fbaSOystein Eftevaag         CHECK_JSON_SIMPLE(TPM2_CC, testcase_cc[i], expected_cc);
1250*758e9fbaSOystein Eftevaag     }
1251*758e9fbaSOystein Eftevaag 
1252*758e9fbaSOystein Eftevaag     const char *testcase_eo[] = { "\"TPM2_EO_EQ\"", "\"EO_EQ\"",
1253*758e9fbaSOystein Eftevaag                                   "\"EQ\"", "\"0x0000\"" };
1254*758e9fbaSOystein Eftevaag     const char *expected_eo = { "\"EQ\"" };
1255*758e9fbaSOystein Eftevaag     for (size_t i = 0; i < sizeof(testcase_eo) / sizeof(testcase_eo[0]); i++) {
1256*758e9fbaSOystein Eftevaag         CHECK_JSON_SIMPLE(TPM2_EO, testcase_eo[i], expected_eo);
1257*758e9fbaSOystein Eftevaag     }
1258*758e9fbaSOystein Eftevaag 
1259*758e9fbaSOystein Eftevaag     const char *testcase_st[] = { "\"TPM2_ST_NO_SESSIONS\"", "\"ST_NO_SESSIONS\"",
1260*758e9fbaSOystein Eftevaag                                   "\"no_SESSIONS\"", "\"0x8001\"" };
1261*758e9fbaSOystein Eftevaag     const char *expected_st = { "\"NO_SESSIONS\"" };
1262*758e9fbaSOystein Eftevaag     for (size_t i = 0; i < sizeof(testcase_st) / sizeof(testcase_st[0]); i++) {
1263*758e9fbaSOystein Eftevaag         CHECK_JSON_SIMPLE(TPM2_ST, testcase_st[i], expected_st);
1264*758e9fbaSOystein Eftevaag     }
1265*758e9fbaSOystein Eftevaag 
1266*758e9fbaSOystein Eftevaag     const char *testcase_pt_pcr[] = { "\"TPM2_PT_PCR_EXTEND_L0\"", "\"PT_PCR_EXTEND_L0\"",
1267*758e9fbaSOystein Eftevaag                                   "\"PCR_EXTEND_L0\"", "\"EXTEND_L0\"" };
1268*758e9fbaSOystein Eftevaag     const char *expected_pt_pcr = { "\"EXTEND_L0\"" };
1269*758e9fbaSOystein Eftevaag     for (size_t i = 0; i < sizeof(testcase_pt_pcr) / sizeof(testcase_pt_pcr[0]); i++) {
1270*758e9fbaSOystein Eftevaag         CHECK_JSON_SIMPLE(TPM2_PT_PCR, testcase_pt_pcr[i], expected_pt_pcr);
1271*758e9fbaSOystein Eftevaag     }
1272*758e9fbaSOystein Eftevaag 
1273*758e9fbaSOystein Eftevaag     const char *testcase_alg_public[] = { "\"TPM2_ALG_RSA\"", "\"ALG_RSA\"",
1274*758e9fbaSOystein Eftevaag                                           "\"RSA\"", "\"0x0001\"" };
1275*758e9fbaSOystein Eftevaag     const char *expected_alg_public = { "\"RSA\"" };
1276*758e9fbaSOystein Eftevaag     for (size_t i = 0; i < sizeof(testcase_alg_public) / sizeof(testcase_alg_public[0]); i++) {
1277*758e9fbaSOystein Eftevaag         CHECK_JSON_SIMPLE(TPMI_ALG_PUBLIC, testcase_alg_public[i], expected_alg_public);
1278*758e9fbaSOystein Eftevaag     }
1279*758e9fbaSOystein Eftevaag }
1280*758e9fbaSOystein Eftevaag 
1281*758e9fbaSOystein Eftevaag int
main(int argc,char * argv[])1282*758e9fbaSOystein Eftevaag main(int argc, char *argv[])
1283*758e9fbaSOystein Eftevaag {
1284*758e9fbaSOystein Eftevaag     const struct CMUnitTest tests[] = {
1285*758e9fbaSOystein Eftevaag         cmocka_unit_test(check_tpmjson_tofromtxt),
1286*758e9fbaSOystein Eftevaag         cmocka_unit_test(check_json_structs),
1287*758e9fbaSOystein Eftevaag         cmocka_unit_test(check_json_constants),
1288*758e9fbaSOystein Eftevaag         cmocka_unit_test(check_json_numbers),
1289*758e9fbaSOystein Eftevaag         cmocka_unit_test(check_json_bits),
1290*758e9fbaSOystein Eftevaag         cmocka_unit_test(check_json_tpm2bs),
1291*758e9fbaSOystein Eftevaag         cmocka_unit_test(check_json_to_bin),
1292*758e9fbaSOystein Eftevaag         cmocka_unit_test(check_bin),
1293*758e9fbaSOystein Eftevaag         cmocka_unit_test(check_policy_bin),
1294*758e9fbaSOystein Eftevaag         cmocka_unit_test(check_error),
1295*758e9fbaSOystein Eftevaag         cmocka_unit_test(check_json_policy),
1296*758e9fbaSOystein Eftevaag     };
1297*758e9fbaSOystein Eftevaag     return cmocka_run_group_tests(tests, NULL, NULL);
1298*758e9fbaSOystein Eftevaag }
1299