blob: af7c29e7c887d3ceb627604a08461dbe1eec8412 [file] [log] [blame]
/* SPDX-License-Identifier: BSD-2-Clause */
/*******************************************************************************
* Copyright 2018, Fraunhofer SIT sponsored by Infineon Technologies AG
* All rights reserved.
******************************************************************************/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdarg.h>
#include <inttypes.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <json-c/json_util.h>
#include <json-c/json_tokener.h>
#include <setjmp.h>
#include <cmocka.h>
#include "tss2_fapi.h"
#include "tpm_json_serialize.h"
#include "tpm_json_deserialize.h"
#include "ifapi_json_serialize.h"
#include "ifapi_json_deserialize.h"
#include "fapi_policy.h"
#include "util/aux_util.h"
#define LOGMODULE tests
#include "util/log.h"
/* 3 copies from ifapi_helpers.c */
static void
cleanup_policy_element(TPMT_POLICYELEMENT *policy)
{
switch (policy->type) {
case POLICYSECRET:
SAFE_FREE(policy->element.PolicySecret.objectPath);
break;
case POLICYAUTHORIZE:
SAFE_FREE(policy->element.PolicyAuthorize.keyPath);
SAFE_FREE(policy->element.PolicyAuthorize.keyPEM);
break;
case POLICYAUTHORIZENV:
SAFE_FREE( policy->element.PolicyAuthorizeNv.nvPath);
SAFE_FREE( policy->element.PolicyAuthorizeNv.policy_buffer);
break;
case POLICYSIGNED:
SAFE_FREE(policy->element.PolicySigned.keyPath);
SAFE_FREE(policy->element.PolicySigned.keyPEM);
break;
case POLICYPCR:
SAFE_FREE(policy->element.PolicyPCR.pcrs);
break;
case POLICYNV:
SAFE_FREE(policy->element.PolicyNV.nvPath);
break;
case POLICYDUPLICATIONSELECT:
SAFE_FREE(policy->element.PolicyDuplicationSelect.newParentPath);
break;
}
}
static void cleanup_policy_elements(TPML_POLICYELEMENTS *policy)
{
size_t i, j;
if (policy != NULL) {
for (i = 0; i < policy->count; i++) {
if (policy->elements[i].type == POLICYOR) {
/* Policy with sub policies */
TPML_POLICYBRANCHES *branches = policy->elements[i].element.PolicyOr.branches;
for (j = 0; j < branches->count; j++) {
SAFE_FREE(branches->authorizations[j].name);
SAFE_FREE(branches->authorizations[j].description);
cleanup_policy_elements(branches->authorizations[j].policy);
}
SAFE_FREE(branches);
} else {
cleanup_policy_element(&policy->elements[i]);
}
}
SAFE_FREE(policy);
}
}
/** Free memory allocated during deserialization of policy.
*
* The object will not be freed (might be declared on the stack).
*
* @param[in] object The policy to be cleaned up.
*
*/
static void ifapi_cleanup_policy(TPMS_POLICY *policy)
{
if (policy) {
SAFE_FREE(policy->description);
SAFE_FREE(policy->policyAuthorizations);
cleanup_policy_elements(policy->policy);
}
}
/* 6 copies of cleanup functions from ifapi_keystore.c */
void
cleanup_ifapi_duplicate(IFAPI_DUPLICATE * duplicate) {
if (duplicate != NULL) {
SAFE_FREE(duplicate->certificate);
}
}
void
cleanup_ifapi_hierarchy(IFAPI_HIERARCHY * hierarchy) {
if (hierarchy != NULL) {
SAFE_FREE(hierarchy->description);
}
}
void
cleanup_ifapi_ext_pub_key(IFAPI_EXT_PUB_KEY * key) {
if (key != NULL) {
SAFE_FREE(key->pem_ext_public);
SAFE_FREE(key->certificate);
}
}
void
cleanup_ifapi_key(IFAPI_KEY * key) {
if (key != NULL) {
SAFE_FREE(key->policyInstance);
SAFE_FREE(key->serialization.buffer);
SAFE_FREE(key->private.buffer);
SAFE_FREE(key->description);
SAFE_FREE(key->certificate);
SAFE_FREE(key->appData.buffer);
}
}
void
cleanup_ifapi_nv(IFAPI_NV * nv) {
if (nv != NULL) {
SAFE_FREE(nv->serialization.buffer);
SAFE_FREE(nv->appData.buffer);
SAFE_FREE(nv->policyInstance);
SAFE_FREE(nv->description);
SAFE_FREE(nv->event_log);
}
}
void
cleanup_ifapi_object(
IFAPI_OBJECT * object)
{
if (object != NULL) {
if (object->objectType != IFAPI_OBJ_NONE) {
if (object->objectType == IFAPI_KEY_OBJ) {
cleanup_ifapi_key(&object->misc.key);
} else if (object->objectType == IFAPI_NV_OBJ) {
cleanup_ifapi_nv(&object->misc.nv);
} else if (object->objectType == IFAPI_DUPLICATE_OBJ) {
cleanup_ifapi_duplicate(&object->misc.key_tree);
} else if (object->objectType == IFAPI_EXT_PUB_KEY_OBJ) {
cleanup_ifapi_ext_pub_key(&object->misc.ext_pub_key);
} else if (object->objectType == IFAPI_HIERARCHY_OBJ) {
cleanup_ifapi_hierarchy(&object->misc.hierarchy);
}
ifapi_cleanup_policy(object->policy);
SAFE_FREE(object->rel_path);
SAFE_FREE(object->policy);
object->objectType = IFAPI_OBJ_NONE;
}
}
}
char * normalize(const char *string) {
char *string2 = malloc(strlen(string)+1);
int i;
int j = 0;
for(i = 0; string[i] != '\0'; i++) {
if ((string[i] != '\n' && string[i] != ' ')) {
string2[j] = string[i];
j += 1;
}
}
string2[j] = '\0';
return string2;
}
#define CHECK_ERROR(TYPE, SRC, RC) \
{ \
TYPE out; \
TSS2_RC rc; \
json_object *jso = json_tokener_parse((SRC)); \
assert_non_null(jso); \
rc = ifapi_json_ ## TYPE ## _deserialize (jso, &out); \
assert_int_equal (rc, RC); \
json_object_put(jso); \
}
#define CHECK_ERROR_CLEANUP(TYPE, SRC, RC) \
{ \
TYPE out; \
TSS2_RC rc; \
json_object *jso = json_tokener_parse((SRC)); \
memset(&out, 0, sizeof(TYPE)); \
assert_non_null(jso); \
rc = ifapi_json_ ## TYPE ## _deserialize (jso, &out); \
assert_int_equal (rc, RC); \
json_object_put(jso); \
cleanup_ifapi_object(&out); \
}
#define CHECK_JSON2(TYPE, SRC, DST, PSERIALIZE) \
{ \
TYPE out; \
TSS2_RC rc; \
json_object *jso = json_tokener_parse((SRC)); \
if (!jso) fprintf(stderr, "JSON parsing failed\n"); \
assert_non_null(jso); \
rc = ifapi_json_ ## TYPE ## _deserialize (jso, &out); \
if (rc) fprintf(stderr, "Deserialization failed\n"); \
assert_int_equal (rc, TSS2_RC_SUCCESS); \
json_object_put(jso); \
jso = NULL; \
rc = ifapi_json_ ## TYPE ## _serialize (PSERIALIZE, &jso); \
assert_int_equal (rc, TSS2_RC_SUCCESS); \
assert_non_null(jso); \
const char *jso_string = json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY); \
assert_non_null(jso_string); \
char *string1 = normalize(jso_string); \
char *string2 = normalize(DST); \
assert_string_equal(string1, string2); \
json_object_put(jso); \
free(string1); \
free(string2); \
}
#define CHECK_JSON(TYPE, SRC, DST) \
CHECK_JSON2(TYPE, SRC, DST, &out)
#define CHECK_JSON_SIMPLE(TYPE, SRC, DST) \
CHECK_JSON2(TYPE, SRC, DST, out)
#define CHECK_JSON_TO_BIN(TYPE, SRC, DST) \
{ \
TYPE out; \
TSS2_RC rc; \
TYPE expected = DST; \
json_object *jso = json_tokener_parse((SRC)); \
assert_non_null(jso); \
rc = ifapi_json_ ## TYPE ## _deserialize (jso, &out); \
assert_int_equal (rc, TSS2_RC_SUCCESS); \
json_object_put(jso); \
assert_true(out == expected); \
}
#define CHECK_BIN2(TYPE, BIN, PSERIALIZE) \
TYPE BIN ## 2; \
{ \
char *jso_string1, *jso_string2; \
json_object *jso = NULL; \
TSS2_RC rc = ifapi_json_ ## TYPE ## _serialize (PSERIALIZE, &jso); \
jso_string1 = strdup(json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY)); \
assert_int_equal (rc, TSS2_RC_SUCCESS); \
rc = ifapi_json_ ## TYPE ## _deserialize (jso, &BIN ## 2); \
assert_int_equal (rc, TSS2_RC_SUCCESS); \
json_object_put(jso); \
jso = NULL; \
rc = ifapi_json_ ## TYPE ## _serialize (PSERIALIZE ## 2, &jso); \
jso_string2 = strdup(json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY)); \
assert_int_equal (rc, TSS2_RC_SUCCESS); \
if (strcmp(jso_string1, jso_string2)) { \
fprintf(stderr,"\n jso: %s\n", jso_string1); \
fprintf(stderr,"\n jso: %s\n", jso_string2); \
} \
assert_string_equal(jso_string1, jso_string2); \
json_object_put(jso); \
free(jso_string1); \
free(jso_string2); \
}
#define CHECK_BIN(TYPE, BIN) \
CHECK_BIN2(TYPE, BIN, &BIN)
#define CHECK_BIN_SIMPLE(TYPE, BIN) \
CHECK_BIN2(TYPE, BIN, BIN)
static void
check_bin(void **state)
{
TPM2B_PUBLIC inPublicAES = {
.size = 0,
.publicArea = {
.type = TPM2_ALG_SYMCIPHER,
.nameAlg = TPM2_ALG_SHA256,
.objectAttributes = (TPMA_OBJECT_USERWITHAUTH |
TPMA_OBJECT_SIGN_ENCRYPT |
TPMA_OBJECT_DECRYPT),
.authPolicy = {
.size = 0,
},
.parameters.symDetail = {
.sym = {
.algorithm = TPM2_ALG_AES,
.keyBits = {.aes = 128},
.mode = {.aes = TPM2_ALG_CFB}}
},
.unique.sym = {
.size = 0,
.buffer = {}
}
}
};
CHECK_BIN(TPM2B_PUBLIC, inPublicAES);
TPM2B_PUBLIC inPublicECC = {
.size = 0,
.publicArea = {
.type = TPM2_ALG_ECC,
.nameAlg = TPM2_ALG_SHA1,
.objectAttributes = (
TPMA_OBJECT_USERWITHAUTH |
TPMA_OBJECT_RESTRICTED |
TPMA_OBJECT_SIGN_ENCRYPT |
TPMA_OBJECT_FIXEDTPM |
TPMA_OBJECT_FIXEDPARENT |
TPMA_OBJECT_SENSITIVEDATAORIGIN
),
.authPolicy = {
.size = 0,
},
.parameters.eccDetail = {
.symmetric = {
.algorithm = TPM2_ALG_NULL,
.keyBits.aes = 128,
.mode.aes = TPM2_ALG_ECB,
},
.scheme = {
.scheme = TPM2_ALG_ECDAA,
.details = { .ecdaa = { .hashAlg = TPM2_ALG_SHA256 }},
},
.curveID = TPM2_ECC_BN_P256,
.kdf = { .scheme = TPM2_ALG_NULL, .details = {} }
},
/*
.parameters.asymDetail.symmetric.algorithm = TPM2_ALG_NULL,
*/
.unique.ecc = {
.x = { .size = 0, .buffer = {} } ,
.y = { .size = 0, .buffer = {} } ,
},
},
};
CHECK_BIN(TPM2B_PUBLIC, inPublicECC);
TPM2B_PUBLIC inPublicECC_MGF1 = inPublicECC;
inPublicECC_MGF1.publicArea.parameters.eccDetail.kdf.scheme = TPM2_ALG_MGF1;
inPublicECC_MGF1.publicArea.parameters.eccDetail.kdf.details.mgf1.hashAlg = TPM2_ALG_SHA256;
CHECK_BIN(TPM2B_PUBLIC, inPublicECC_MGF1);
TPM2B_PUBLIC inPublicECC_KDF12 = inPublicECC;
inPublicECC_KDF12.publicArea.parameters.eccDetail.kdf.scheme = TPM2_ALG_KDF1_SP800_56A;
inPublicECC_KDF12.publicArea.parameters.eccDetail.kdf.details.kdf1_sp800_56a.hashAlg = TPM2_ALG_SHA256;
CHECK_BIN(TPM2B_PUBLIC, inPublicECC_KDF12);
TPM2B_PUBLIC inPublicECC_KDF13 = inPublicECC;
inPublicECC_KDF13.publicArea.parameters.eccDetail.kdf.scheme = TPM2_ALG_KDF1_SP800_108;
inPublicECC_KDF13.publicArea.parameters.eccDetail.kdf.details.kdf1_sp800_108.hashAlg = TPM2_ALG_SHA256;
CHECK_BIN(TPM2B_PUBLIC, inPublicECC_KDF13);
TPM2B_PUBLIC inPublicRSA2 = {
.size = 0,
.publicArea = {
.type = TPM2_ALG_RSA,
.nameAlg = TPM2_ALG_SHA1,
.objectAttributes = (TPMA_OBJECT_USERWITHAUTH |
TPMA_OBJECT_SIGN_ENCRYPT |
TPMA_OBJECT_FIXEDTPM |
TPMA_OBJECT_FIXEDPARENT |
TPMA_OBJECT_SENSITIVEDATAORIGIN),
.authPolicy = {
.size = 0,
},
.parameters.rsaDetail = {
.symmetric = {
.algorithm = TPM2_ALG_NULL,
.keyBits.aes = 128,
.mode.aes = TPM2_ALG_CFB},
.scheme = {
.scheme = TPM2_ALG_RSAPSS,
.details = {
.rsapss = { .hashAlg = TPM2_ALG_SHA1 }
}
},
.keyBits = 2048,
.exponent = 0,
},
.unique.rsa = {
.size = 0,
.buffer = {},
},
},
};
TPMS_SIGNATURE_ECC ecc_signature = {
.hash = TPM2_ALG_SHA1,
.signatureR = {
.size = 32,
.buffer = {
0x25, 0xdb, 0x1f, 0x8b, 0xbc, 0xfa, 0xbc, 0x31,
0xf8, 0x17, 0x6a, 0xcb, 0xb2, 0xf8, 0x40, 0xa3,
0xb6, 0xa5, 0xd3, 0x40, 0x65, 0x9d, 0x37, 0xee,
0xd9, 0xfd, 0x52, 0x47, 0xf5, 0x14, 0xd5, 0x98
},
},
.signatureS = {
.size = 32,
.buffer = {
0xed, 0x62, 0x3e, 0x3d, 0xd2, 0x09, 0x08, 0xcf,
0x58, 0x3c, 0x81, 0x4b, 0xbf, 0x65, 0x7e, 0x08,
0xab, 0x9f, 0x40, 0xff, 0xea, 0x51, 0xda, 0x21,
0x29, 0x8c, 0xe2, 0x4d, 0xeb, 0x34, 0x4c, 0xcc
}
}
};
CHECK_BIN(TPMS_SIGNATURE_ECC, ecc_signature);
CHECK_BIN(TPM2B_PUBLIC, inPublicRSA2);
TPMT_SIG_SCHEME ecc_scheme_ecdsa = { .scheme = TPM2_ALG_ECDSA, .details.ecdsa = TPM2_ALG_SHA1 };
CHECK_BIN(TPMT_SIG_SCHEME, ecc_scheme_ecdsa);
TPMT_SIG_SCHEME ecc_scheme_ecdaa = { .scheme = TPM2_ALG_ECDAA, .details.ecdaa = TPM2_ALG_SHA1 };
CHECK_BIN(TPMT_SIG_SCHEME, ecc_scheme_ecdaa);
TPMT_SIG_SCHEME rsa_scheme_rsapss = { .scheme = TPM2_ALG_RSAPSS, .details.rsapss = TPM2_ALG_SHA1 };
CHECK_BIN(TPMT_SIG_SCHEME, rsa_scheme_rsapss);
TPMT_SIG_SCHEME rsa_scheme_rsassa = { .scheme = TPM2_ALG_RSASSA, .details.rsassa = TPM2_ALG_SHA1 };
CHECK_BIN(TPMT_SIG_SCHEME, rsa_scheme_rsassa);
TPMT_SIG_SCHEME sm2_scheme = { .scheme = TPM2_ALG_SM2, .details.sm2 = TPM2_ALG_SHA1 };
CHECK_BIN(TPMT_SIG_SCHEME, sm2_scheme);
TPMT_SIG_SCHEME hmac_scheme = { .scheme = TPM2_ALG_HMAC, .details.hmac = TPM2_ALG_SHA1 };
CHECK_BIN(TPMT_SIG_SCHEME, hmac_scheme);
TPMT_SIG_SCHEME ecschnorr_scheme = { .scheme = TPM2_ALG_ECSCHNORR, .details.ecschnorr = TPM2_ALG_SHA1 };
CHECK_BIN(TPMT_SIG_SCHEME, ecschnorr_scheme);
TPMT_SIG_SCHEME rsa_scheme = { .scheme = TPM2_ALG_NULL };
CHECK_BIN(TPMT_SIG_SCHEME, rsa_scheme);
TPMA_NV testNV = 0xffffff0f ;
CHECK_BIN_SIMPLE(TPMA_NV, testNV);
TPML_PCR_SELECTION pcr_selection = {
.count = 3,
.pcrSelections = {
{
.hash = TPM2_ALG_SHA1,
.sizeofSelect = 3,
.pcrSelect = { 01, 00, 03 }},
{
.hash = TPM2_ALG_SHA256,
.sizeofSelect = 3,
.pcrSelect = { 01 ,00 ,03 }},
{
.hash = TPM2_ALG_SHA384,
.sizeofSelect = 3,
.pcrSelect = { 02, 00, 02 }}
}
};
CHECK_BIN(TPML_PCR_SELECTION, pcr_selection);
IFAPI_IMA_EVENT imaEvent = {
.eventData = {
.size = 0,
.buffer = { 0 }
},
.eventName = "Event"
};
CHECK_BIN(IFAPI_IMA_EVENT, imaEvent);
free(imaEvent2.eventName);
}
static void
check_policy_bin(void **state)
{
TPMS_PCRVALUE pcr_value;
TPML_PCRVALUES *pcr_value_list;
TPML_POLICYBRANCHES *or_branch_list;
TPMS_POLICYPCR pcr_policy;
TPMT_POLICYELEMENT policy_element0;
TPMT_POLICYELEMENT policy_element1;
TPMT_POLICYELEMENT policy_element_or;
TPML_POLICYELEMENTS *policy_elements_or;
TPML_POLICYELEMENTS *policy_elements0;
TPML_POLICYELEMENTS *policy_elements1;
TPMS_POLICY policy;
TPMS_POLICYBRANCH branch0;
TPMS_POLICYBRANCH branch1;
pcr_value.pcr = 16;
pcr_value.hashAlg = TPM2_ALG_SHA1;
memset(&pcr_value.digest, 0, sizeof(TPMU_HA));
memset(&pcr_policy, 0, sizeof(TPMS_POLICYPCR));
pcr_value_list = calloc(1, sizeof(TPML_PCRVALUES) + sizeof(TPMS_PCRVALUE));
if (pcr_value_list == NULL) {
LOG_ERROR("%s", "Out of memory.");
return;
}
pcr_value_list->count = 1;
pcr_value_list->pcrs[0] = pcr_value;
pcr_policy.pcrs = pcr_value_list;
memset(&policy_element0, 0, sizeof(TPMT_POLICYELEMENT));
policy_element0.element.PolicyPCR = pcr_policy;
policy_element0.type = POLICYPCR;
memset(&policy_element1, 0, sizeof(TPMT_POLICYELEMENT));
policy_element1.element.PolicyPCR = pcr_policy;
policy_element1.type = POLICYPCR;
policy_elements0 = calloc(1, sizeof(TPML_POLICYELEMENTS) + sizeof(TPMT_POLICYELEMENT));
if (policy_elements0 == NULL) {
LOG_ERROR("%s", "Out of memory.");
if (pcr_policy.pcrs){
free(pcr_policy.pcrs);
}
return;
}
policy_elements0->count = 1;
policy_elements0->elements[0] = policy_element0;
policy.policy = policy_elements0;
policy.description = "hareness description";
policy.policyAuthorizations = NULL;
memset(&policy.policyDigests, 0, sizeof(TPML_DIGEST_VALUES));
//CHECK_BIN(TPMS_POLICY, policy);
{
char *jso_string1, *jso_string2;
json_object *jso = NULL;
TSS2_RC rc = ifapi_json_TPMS_POLICY_serialize (&policy, &jso);
jso_string1 = strdup(json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY));
assert_int_equal (rc, TSS2_RC_SUCCESS);
rc = ifapi_json_TPMS_POLICY_deserialize (jso, &policy);
assert_int_equal (rc, TSS2_RC_SUCCESS);
json_object_put(jso);
jso = NULL;
rc = ifapi_json_TPMS_POLICY_serialize (&policy, &jso);
jso_string2 = strdup(json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY));
assert_int_equal (rc, TSS2_RC_SUCCESS);
if (strcmp(jso_string1, jso_string2)) {
fprintf(stderr,"\n jso: %s\n", jso_string1);
fprintf(stderr,"\n jso: %s\n", jso_string2);
}
assert_string_equal(jso_string1, jso_string2);
json_object_put(jso);
free(jso_string1);
free(jso_string2);
}
ifapi_cleanup_policy(&policy);
or_branch_list = calloc(2, sizeof(TPML_POLICYBRANCHES) + (2 * sizeof(TPMS_POLICYBRANCH)));
if (or_branch_list == NULL) {
LOG_ERROR("%s", "Out of memory.");
return;
}
or_branch_list->count = 2;
policy_elements1 = calloc(1, sizeof(TPML_POLICYELEMENTS) + sizeof(TPMT_POLICYELEMENT));
if (policy_elements1 == NULL) {
LOG_ERROR("%s", "Out of memory.");
if (or_branch_list){
free(or_branch_list);
}
return;
}
policy_elements1->count = 1;
policy_elements1->elements[0] = policy_element1;
memset(&branch0, 0, sizeof(TPMS_POLICYBRANCH));
memset(&branch1, 0, sizeof(TPMS_POLICYBRANCH));
branch0.policy = policy_elements0;
branch0.name = "branch0";
branch0.description = "description branch 0";
branch1.policy = policy_elements1;
branch1.name = "branch1";
branch1.description = "description branch 1";
memcpy(&or_branch_list->authorizations[0], &branch0, sizeof(TPMS_POLICYBRANCH));
memcpy(&or_branch_list->authorizations[1], &branch1, sizeof(TPMS_POLICYBRANCH));
//or_policy.pcrs = pcr_branch_list;
policy_elements_or = calloc(1, sizeof(TPML_POLICYELEMENTS) + sizeof(TPMT_POLICYELEMENT));
if (policy_elements_or == NULL) {
LOG_ERROR("%s", "Out of memory.");
if (or_branch_list) {
free(or_branch_list);
}
return;
}
policy_elements_or->count = 1;
memset(&policy_element_or, 0, sizeof(TPMT_POLICYELEMENT));
policy_element_or.element.PolicyOr.branches = or_branch_list;
policy_element_or.type = POLICYOR;
policy_elements_or->elements[0] = policy_element_or;
policy.policy = policy_elements_or;
//CHECK_BIN(TPMS_POLICY, policy);
{
char *jso_string1, *jso_string2;
json_object *jso = NULL;
TSS2_RC rc = ifapi_json_TPMS_POLICY_serialize (&policy, &jso);
jso_string1 = strdup(json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY));
assert_int_equal (rc, TSS2_RC_SUCCESS);
rc = ifapi_json_TPMS_POLICY_deserialize (jso, &policy);
assert_int_equal (rc, TSS2_RC_SUCCESS);
json_object_put(jso);
jso = NULL;
rc = ifapi_json_TPMS_POLICY_serialize (&policy, &jso);
jso_string2 = strdup(json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY));
assert_int_equal (rc, TSS2_RC_SUCCESS);
if (strcmp(jso_string1, jso_string2)) {
fprintf(stderr,"\n jso: %s\n", jso_string1);
fprintf(stderr,"\n jso: %s\n", jso_string2);
}
assert_string_equal(jso_string1, jso_string2);
json_object_put(jso);
free(jso_string1);
free(jso_string2);
}
ifapi_cleanup_policy(&policy);
free(policy_elements_or);
free(policy_elements0);
free(policy_elements1);
free(or_branch_list);
free(pcr_value_list);
}
static void
check_json_to_bin(void **state)
{
CHECK_JSON_TO_BIN(UINT64, "22147483647", 22147483647);
CHECK_JSON_TO_BIN(UINT64, "\"0xffffffff\"", 0xffffffff);
CHECK_JSON_TO_BIN(UINT64, "\"0xfffffffff\"", 0xfffffffff);
CHECK_JSON_TO_BIN(UINT32, "\"0xFfffffff\"", 0xffffffff);
CHECK_JSON_TO_BIN(UINT16, "\"0xffff\"", 0xffff);
}
static void
check_json_structs(void **state)
{
const char *test_json_TPMS_POLICYTEMPLATE =
"{\n"
" \"templateHash\": \"0011223344556677889900112233445566778899\"\n"
"}";
CHECK_JSON(TPMS_POLICYTEMPLATE, test_json_TPMS_POLICYTEMPLATE, test_json_TPMS_POLICYTEMPLATE);
const char *test_json_TPM2B_PUBLIC_expected =
"{\n"
" \"size\":0,\n"
" \"publicArea\":{\n"
" \"type\":\"ECC\",\n"
" \"nameAlg\":\"SHA1\",\n"
"\"objectAttributes\":{"
" \"fixedTPM\":1,"
" \"stClear\":0,"
" \"fixedParent\":1,"
" \"sensitiveDataOrigin\":1,"
" \"userWithAuth\":1,"
" \"adminWithPolicy\":0,"
" \"noDA\":0,"
" \"encryptedDuplication\":0,"
" \"restricted\":1,"
" \"decrypt\":0,"
" \"sign\":1"
" },"
" \"authPolicy\":\"\",\n"
" \"parameters\":{\n"
" \"symmetric\":{\n"
" \"algorithm\":\"NULL\"\n"
" },\n"
" \"scheme\":{\n"
" \"scheme\":\"ECDAA\",\n"
" \"details\":{\n"
" \"hashAlg\":\"SHA256\",\n"
" \"count\":0\n"
" }\n"
" },\n"
" \"curveID\":\"BN_P256\",\n"
" \"kdf\":{\n"
" \"scheme\":\"NULL\"\n"
" }\n"
" },\n"
" \"unique\":{\n"
" \"x\": \"\",\n"
" \"y\": \"\"\n"
" }\n"
" }\n"
"}";
const char *test_json_TPM2B_PUBLIC_src=
"{"
" \"size\":0,"
" \"publicArea\":{"
" \"type\":\"ECC\","
" \"nameAlg\":\"SHA1\","
" \"objectAttributes\":["
" \"fixedTPM\","
" \"fixedParent\","
" \"sensitiveDataOrigin\","
" \"userWithAuth\","
" \"restricted\","
" \"sign\""
" ],"
" \"authPolicy\":\"\","
" \"parameters\":{"
" \"symmetric\":{"
" \"algorithm\":\"NULL\""
" },"
" \"scheme\":{"
" \"scheme\":\"ECDAA\","
" \"details\":{"
" \"hashAlg\":\"SHA256\","
" \"count\":0"
" }"
" },"
" \"curveID\":\"ECC_BN_P256\","
" \"kdf\":{"
" \"scheme\":\"NULL\""
" }"
" },"
" \"unique\":{"
" \"x\": \"\",\n"
" \"y\": \"\"\n"
" }"
" }"
"}"
"";
const char *test_json_TPM2B_PUBLIC_dwnc_src =
"{"
" \"size\":0,"
" \"publicArea\":{"
" \"type\":\"ecc\","
" \"nameAlg\":\"sha1\","
" \"objectAttributes\":["
" \"fixedTPM\","
" \"fixedParent\","
" \"sensitiveDataOrigin\","
" \"userWithAuth\","
" \"restricted\","
" \"sign\""
" ],"
" \"authPolicy\":\"\","
" \"parameters\":{"
" \"symmetric\":{"
" \"algorithm\":\"null\""
" },"
" \"scheme\":{"
" \"scheme\":\"ecdaa\","
" \"details\":{"
" \"hashAlg\":\"sha256\","
" \"count\":0"
" }"
" },"
" \"curveID\":\"ecc_BN_P256\","
" \"kdf\":{"
" \"scheme\":\"null\""
" }"
" },"
" \"unique\":{"
" \"x\": \"\",\n"
" \"y\": \"\"\n"
" }"
" }"
" }"
"}"
"";
CHECK_JSON(TPM2B_PUBLIC, test_json_TPM2B_PUBLIC_src, test_json_TPM2B_PUBLIC_expected);
CHECK_JSON(TPM2B_PUBLIC, test_json_TPM2B_PUBLIC_dwnc_src, test_json_TPM2B_PUBLIC_expected);
const char *test_json_TPMS_ATTEST_certify_src =
"{\n"
" \"magic\": \"0xff544347\",\n"
" \"type\": \"ST_ATTEST_CERTIFY\",\n"
" \"qualifiedSigner\": \"0x00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
" \"extraData\": \"0x00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
" \"clockInfo\": {\n"
" \"clock\": 123,\n"
" \"resetCount\": 23,\n"
" \"restartCount\": 1,\n"
" \"safe\": \"yes\"\n"
" },\n"
" \"firmwareVersion\": 783,\n"
" \"attested\": {\n"
" \"name\": \"0x00010203040506070809c0c1c2c3c4c5c6c7c8c9\",\n"
" \"qualifiedName\": \"0x00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
" }\n"
"}";
const char *test_json_TPMS_ATTEST_certify_expt =
"{\n"
" \"magic\": \"VALUE\",\n"
" \"type\": \"ATTEST_CERTIFY\",\n"
" \"qualifiedSigner\": \"00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
" \"extraData\": \"00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
" \"clockInfo\": {\n"
" \"clock\": 123,\n"
" \"resetCount\": 23,\n"
" \"restartCount\": 1,\n"
" \"safe\": \"YES\"\n"
" },\n"
" \"firmwareVersion\": 783,\n"
" \"attested\": {\n"
" \"name\": \"00010203040506070809c0c1c2c3c4c5c6c7c8c9\",\n"
" \"qualifiedName\": \"00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
" }\n"
"}";
CHECK_JSON(TPMS_ATTEST, test_json_TPMS_ATTEST_certify_src, test_json_TPMS_ATTEST_certify_expt);
const char *test_json_TPMS_ATTEST_sessionaudit_src =
"{\n"
" \"magic\": \"0xff544347\",\n"
" \"type\": \"ST_ATTEST_SESSION_AUDIT\",\n"
" \"qualifiedSigner\": \"0x00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
" \"extraData\": \"0x00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
" \"clockInfo\": {\n"
" \"clock\": [12345,0],\n"
" \"resetCount\": 23,\n"
" \"restartCount\": 1,\n"
" \"safe\": \"yes\"\n"
" },\n"
" \"firmwareVersion\": [783783,0],\n"
" \"attested\": {\n"
" \"exclusiveSession\": \"yes\",\n"
" \"sessionDigest\": \"0x00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
" }\n"
"}";
const char *test_json_TPMS_ATTEST_sessionaudit_expt =
"{\n"
" \"magic\": \"VALUE\",\n"
" \"type\": \"ATTEST_SESSION_AUDIT\",\n"
" \"qualifiedSigner\": \"00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
" \"extraData\": \"00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
" \"clockInfo\": {\n"
" \"clock\": 53021371269120,\n"
" \"resetCount\": 23,\n"
" \"restartCount\": 1,\n"
" \"safe\": \"YES\"\n"
" },\n"
" \"firmwareVersion\": [783783,0],\n"
" \"attested\": {\n"
" \"exclusiveSession\": \"YES\",\n"
" \"sessionDigest\": \"00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
" }\n"
"}";
CHECK_JSON(TPMS_ATTEST, test_json_TPMS_ATTEST_sessionaudit_src, test_json_TPMS_ATTEST_sessionaudit_expt);
const char *test_json_TPMS_ATTEST_certifycreation_src =
"{\n"
" \"magic\": \"0xff544347\",\n"
" \"type\": \"ST_ATTEST_CREATION\",\n"
" \"qualifiedSigner\": \"0x00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
" \"extraData\": \"0x00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
" \"clockInfo\": {\n"
" \"clock\": 123,\n"
" \"resetCount\": 23,\n"
" \"restartCount\": 1,\n"
" \"safe\": \"yes\"\n"
" },\n"
" \"firmwareVersion\": [0,783],\n"
" \"attested\": {\n"
" \"objectName\": \"0x00010203040506070809c0c1c2c3c4c5c6c7c8c9\",\n"
" \"creationHash\": \"0x00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
" }\n"
"}";
const char *test_json_TPMS_ATTEST_certifycreation_expt =
"{\n"
" \"magic\": \"VALUE\",\n"
" \"type\": \"ATTEST_CREATION\",\n"
" \"qualifiedSigner\": \"00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
" \"extraData\": \"00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
" \"clockInfo\": {\n"
" \"clock\": 123,\n"
" \"resetCount\": 23,\n"
" \"restartCount\": 1,\n"
" \"safe\": \"YES\"\n"
" },\n"
" \"firmwareVersion\": 783,\n"
" \"attested\": {\n"
" \"objectName\": \"00010203040506070809c0c1c2c3c4c5c6c7c8c9\",\n"
" \"creationHash\": \"00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
" }\n"
"}";
CHECK_JSON(TPMS_ATTEST, test_json_TPMS_ATTEST_certifycreation_src, test_json_TPMS_ATTEST_certifycreation_expt);
const char *test_json_TPMS_ATTEST_commandaudit_src =
"{\n"
" \"magic\": \"0xff544347\",\n"
" \"type\": \"ST_ATTEST_COMMAND_AUDIT\",\n"
" \"qualifiedSigner\": \"0x00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
" \"extraData\": \"0x00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
" \"clockInfo\": {\n"
" \"clock\": 123,\n"
" \"resetCount\": 23,\n"
" \"restartCount\": 1,\n"
" \"safe\": \"yes\"\n"
" },\n"
" \"firmwareVersion\": 783,\n"
" \"attested\": {\n"
" \"auditCounter\": 456,\n"
" \"digestAlg\": \"sha1\",\n"
" \"auditDigest\": \"0x00010203040506070809c0c1c2c3c4c5c6c7c8c9\",\n"
" \"commandDigest\": \"0x00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
" }\n"
"}";
const char *test_json_TPMS_ATTEST_commandaudit_expt =
"{\n"
" \"magic\": \"VALUE\",\n"
" \"type\": \"ATTEST_COMMAND_AUDIT\",\n"
" \"qualifiedSigner\": \"00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
" \"extraData\": \"00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
" \"clockInfo\": {\n"
" \"clock\": 123,\n"
" \"resetCount\": 23,\n"
" \"restartCount\": 1,\n"
" \"safe\": \"YES\"\n"
" },\n"
" \"firmwareVersion\": 783,\n"
" \"attested\": {\n"
" \"auditCounter\": 456,\n"
" \"digestAlg\": \"SHA1\",\n"
" \"auditDigest\": \"00010203040506070809c0c1c2c3c4c5c6c7c8c9\",\n"
" \"commandDigest\": \"00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
" }\n"
"}";
CHECK_JSON(TPMS_ATTEST, test_json_TPMS_ATTEST_commandaudit_src, test_json_TPMS_ATTEST_commandaudit_expt);
const char *test_json_TPMS_ATTEST_time_src =
"{\n"
" \"magic\": \"0xff544347\",\n"
" \"type\": \"ST_ATTEST_TIME\",\n"
" \"qualifiedSigner\": \"0x00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
" \"extraData\": \"0x00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
" \"clockInfo\": {\n"
" \"clock\": 123,\n"
" \"resetCount\": 23,\n"
" \"restartCount\": 1,\n"
" \"safe\": \"yes\"\n"
" },\n"
" \"firmwareVersion\": 783,\n"
" \"attested\": {\n"
" \"time\": {\n"
" \"time\": 234,\n"
" \"clockInfo\": {\n"
" \"clock\": 123,\n"
" \"resetCount\": 23,\n"
" \"restartCount\": 1,\n"
" \"safe\": \"yes\"\n"
" }\n"
" },\n"
" \"firmwareVersion\": 783\n"
" }\n"
"}";
const char *test_json_TPMS_ATTEST_time_expt =
"{\n"
" \"magic\": \"VALUE\",\n"
" \"type\": \"ATTEST_TIME\",\n"
" \"qualifiedSigner\": \"00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
" \"extraData\": \"00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
" \"clockInfo\": {\n"
" \"clock\": 123,\n"
" \"resetCount\": 23,\n"
" \"restartCount\": 1,\n"
" \"safe\": \"YES\"\n"
" },\n"
" \"firmwareVersion\": 783,\n"
" \"attested\": {\n"
" \"time\": {\n"
" \"time\": 234,\n"
" \"clockInfo\": {\n"
" \"clock\": 123,\n"
" \"resetCount\": 23,\n"
" \"restartCount\": 1,\n"
" \"safe\": \"YES\"\n"
" }\n"
" },\n"
" \"firmwareVersion\": 783\n"
" }\n"
"}";
CHECK_JSON(TPMS_ATTEST, test_json_TPMS_ATTEST_time_src, test_json_TPMS_ATTEST_time_expt);
const char *test_json_TPMS_ATTEST_certifynv_src =
"{\n"
" \"magic\": \"0xff544347\",\n"
" \"type\": \"ST_ATTEST_NV\",\n"
" \"qualifiedSigner\": \"0x00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
" \"extraData\": \"0x00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
" \"clockInfo\": {\n"
" \"clock\": 123,\n"
" \"resetCount\": 23,\n"
" \"restartCount\": 1,\n"
" \"safe\": \"yes\"\n"
" },\n"
" \"firmwareVersion\": 783,\n"
" \"attested\": {\n"
" \"indexName\": \"0x00010203040506070809c0c1c2c3c4c5c6c7c8c9\",\n"
" \"offset\": 10,\n"
" \"nvContents\": \"0x00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
" }\n"
"}";
const char *test_json_TPMS_ATTEST_certifynv_expt =
"{\n"
" \"magic\": \"VALUE\",\n"
" \"type\": \"ATTEST_NV\",\n"
" \"qualifiedSigner\": \"00010203040506070809a0a1a2a3a4a5a6a7a8a9\",\n"
" \"extraData\": \"00010203040506070809b0b1b2b3b4b5b6b7b8b9\",\n"
" \"clockInfo\": {\n"
" \"clock\": 123,\n"
" \"resetCount\": 23,\n"
" \"restartCount\": 1,\n"
" \"safe\": \"YES\"\n"
" },\n"
" \"firmwareVersion\": 783,\n"
" \"attested\": {\n"
" \"indexName\": \"00010203040506070809c0c1c2c3c4c5c6c7c8c9\",\n"
" \"offset\": 10,\n"
" \"nvContents\": \"00010203040506070809d0d1d2d3d4d5d6d7d8d9\"\n"
" }\n"
"}";
CHECK_JSON(TPMS_ATTEST, test_json_TPMS_ATTEST_certifynv_src, test_json_TPMS_ATTEST_certifynv_expt);
const char *test_json_TPMT_KEYEDHASH_SCHEME_hmac_src =
"{\n"
" \"scheme\": \"HMAC\",\n"
" \"details\": {\n"
" \"hashAlg\": \"SHA256\"\n"
" }\n"
"}";
const char *test_json_TPMT_KEYEDHASH_SCHEME_hmac_expt =
"{\n"
" \"scheme\": \"HMAC\",\n"
" \"details\": {\n"
" \"hashAlg\": \"SHA256\"\n"
" }\n"
"}";
CHECK_JSON(TPMT_KEYEDHASH_SCHEME, test_json_TPMT_KEYEDHASH_SCHEME_hmac_src, test_json_TPMT_KEYEDHASH_SCHEME_hmac_expt);
const char *test_json_TPMT_KEYEDHASH_SCHEME_xor_src =
"{\n"
" \"scheme\": \"XOR\",\n"
" \"details\": {\n"
" \"hashAlg\": \"SHA256\",\n"
" \"kdf\": \"MGF1\"\n"
" }\n"
"}";
const char *test_json_TPMT_KEYEDHASH_SCHEME_xor_expt =
"{\n"
" \"scheme\": \"XOR\",\n"
" \"details\": {\n"
" \"hashAlg\": \"SHA256\",\n"
" \"kdf\": \"MGF1\"\n"
" }\n"
"}";
CHECK_JSON(TPMT_KEYEDHASH_SCHEME, test_json_TPMT_KEYEDHASH_SCHEME_xor_src, test_json_TPMT_KEYEDHASH_SCHEME_xor_expt);
}
static void
check_json_constants(void **state)
{
CHECK_JSON_SIMPLE(TPMI_ALG_HASH, "\"sha1\"", "\"SHA1\"");
CHECK_JSON_SIMPLE(TPMI_ALG_HASH, "\"0x04\"", "\"SHA1\"");
CHECK_JSON_SIMPLE(TPMI_ALG_HASH, "4", "\"SHA1\"");
}
static void
check_json_numbers(void **state)
{
CHECK_JSON_SIMPLE(UINT16, "10", "10");
CHECK_JSON_SIMPLE(UINT16, "\"0x0a\"", "10");
CHECK_JSON_SIMPLE(UINT64, "10000000000000000","[2328306,1874919424]");
}
static void
check_json_bits(void **state)
{
CHECK_JSON_SIMPLE(TPMA_NV, "{\"PPWRITE\":1,\"OWNERWRITE\":1}",
"{\"PPWRITE\":1,\"OWNERWRITE\":1,\"AUTHWRITE\":0,\"POLICYWRITE\":0,\"POLICY_DELETE\":0,"
"\"WRITELOCKED\":0,\"WRITEALL\":0,\"WRITEDEFINE\":0,\"WRITE_STCLEAR\":0,\"GLOBALLOCK\":0,\"PPREAD\":0,"
"\"OWNERREAD\":0,\"AUTHREAD\":0,\"POLICYREAD\":0,\"NO_DA\":0,\"ORDERLY\":0,\"CLEAR_STCLEAR\":0,"
"\"READLOCKED\":0,\"WRITTEN\":0,\"PLATFORMCREATE\":0,\"READ_STCLEAR\":0,\"TPM2_NT\":\"ORDINARY\"}");
CHECK_JSON_SIMPLE(TPMA_LOCALITY, "3", "{\"ZERO\":1,\"ONE\":1,\"TWO\":0,\"THREE\":0,\"FOUR\":0,\"Extended\":0}");
CHECK_JSON_SIMPLE(TPMA_LOCALITY,
"[ \"ZERO\", \"ONE\" ]",
"{\"ZERO\":1,\"ONE\":1,\"TWO\":0,\"THREE\":0,\"FOUR\":0,\"Extended\":0}");
CHECK_JSON_SIMPLE(TPMA_NV, "\"0xffffff0f\"",
"{\"PPWRITE\":1,\"OWNERWRITE\":1,\"AUTHWRITE\":1,\"POLICYWRITE\":1,\"POLICY_DELETE\":1,"
"\"WRITELOCKED\":1,\"WRITEALL\":1,\"WRITEDEFINE\":1,\"WRITE_STCLEAR\":1,\"GLOBALLOCK\":1,\"PPREAD\":1,"
"\"OWNERREAD\":1,\"AUTHREAD\":1,\"POLICYREAD\":1,\"NO_DA\":1,\"ORDERLY\":1,\"CLEAR_STCLEAR\":1,"
"\"READLOCKED\":1,\"WRITTEN\":1,\"PLATFORMCREATE\":1,\"READ_STCLEAR\":1,\"TPM2_NT\":\"ORDINARY\"}");
CHECK_JSON_SIMPLE(TPMA_LOCALITY, "3", "{\"ZERO\":1,\"ONE\":1,\"TWO\":0,\"THREE\":0,\"FOUR\":0,\"Extended\":0}");
CHECK_JSON_SIMPLE(TPMA_LOCALITY,
"{\"ZERO\":1,\"ONE\":1,\"TWO\":0,\"THREE\":0,\"FOUR\":0,\"Extended\":0}",
"{\"ZERO\":1,\"ONE\":1,\"TWO\":0,\"THREE\":0,\"FOUR\":0,\"Extended\":0}");
CHECK_JSON_SIMPLE(TPMA_OBJECT,
"{\"fixedTPM\":1,\"stClear\":1,\"fixedParent\":0,\"sensitiveDataOrigin\":0,\"userWithAuth\":0,"
"\"adminWithPolicy\":0,\"noDA\":0,\"encryptedDuplication\":0,\"restricted\":0,\"decrypt\":0,\"sign\":0}",
"{\"fixedTPM\":1,\"stClear\":1,\"fixedParent\":0,\"sensitiveDataOrigin\":0,\"userWithAuth\":0,"
"\"adminWithPolicy\":0,\"noDA\":0,\"encryptedDuplication\":0,\"restricted\":0,\"decrypt\":0,\"sign\":0}");
CHECK_JSON_SIMPLE(TPMA_OBJECT,
"\"0\"",
"{\"fixedTPM\":0,\"stClear\":0,\"fixedParent\":0,\"sensitiveDataOrigin\":0,\"userWithAuth\":0,"
"\"adminWithPolicy\":0,\"noDA\":0,\"encryptedDuplication\":0,\"restricted\":0,\"decrypt\":0,\"sign\":0}");
const char *test_json_TPMA_NV_expected =\
"{"
" \"PPWRITE\":0,"
" \"OWNERWRITE\":1,"
" \"AUTHWRITE\":1,"
" \"POLICYWRITE\":1,"
" \"POLICY_DELETE\":1,"
" \"WRITELOCKED\":0,"
" \"WRITEALL\":0,"
" \"WRITEDEFINE\":0,"
" \"WRITE_STCLEAR\":0,"
" \"GLOBALLOCK\":0,"
" \"PPREAD\":0,"
" \"OWNERREAD\":1,"
" \"AUTHREAD\":1,"
" \"POLICYREAD\":1,"
" \"NO_DA\":0,"
" \"ORDERLY\":1,"
" \"CLEAR_STCLEAR\":1,"
" \"READLOCKED\":1,"
" \"WRITTEN\":1,"
" \"PLATFORMCREATE\":0,"
" \"READ_STCLEAR\":0,"
" \"TPM2_NT\":\"COUNTER\""
"}";
const char *test_json_TPMA_NV_src_array =\
"["
" \"nv_ownerwrite\","
" \"nv_authwrite\","
" \"nv_policywrite\","
" \"nv_policy_delete\","
" \"nv_ownerread\","
" \"nv_authread\","
" \"nv_policyread\","
" \"nv_orderly\","
" \"nv_clear_stclear\","
" \"nv_readlocked\","
" \"nv_written\","
" {"
" \"TPM2_NT\": \"NT_COUNTER\""
" }"
"]";
const char *test_json_TPMA_NV_src_struct = \
"{"
" \"TPMA_NV_OWNERWRITE\":\"YES\","
" \"TPMA_NV_AUTHWRITE\":\"yes\","
" \"TPMA_NV_POLICYWRITE\":\"TPM2_YES\","
" \"TPMA_NV_POLICY_DELETE\":\"tpm2_yes\","
" \"TPMA_NV_OWNERREAD\":\"SET\","
" \"TPMA_NV_AUTHREAD\":\"set\","
" \"TPMA_NV_POLICYREAD\":1,"
" \"TPMA_NV_ORDERLY\":1,"
" \"TPMA_NV_CLEAR_STCLEAR\":1,"
" \"TPMA_NV_READLOCKED\":1,"
" \"TPMA_NV_WRITTEN\":1,"
" \"TPM2_NT\":1"
" }";
const char *test_json_TPMA_NV_expected2 = \
"{"
" \"PPWRITE\":1,"
" \"OWNERWRITE\":0,"
" \"AUTHWRITE\":0,"
" \"POLICYWRITE\":0,"
" \"POLICY_DELETE\":0,"
" \"WRITELOCKED\":0,"
" \"WRITEALL\":0,"
" \"WRITEDEFINE\":0,"
" \"WRITE_STCLEAR\":0,"
" \"GLOBALLOCK\":0,"
" \"PPREAD\":0,"
" \"OWNERREAD\":0,"
" \"AUTHREAD\":0,"
" \"POLICYREAD\":0,"
" \"NO_DA\":0,"
" \"ORDERLY\":0,"
" \"CLEAR_STCLEAR\":0,"
" \"READLOCKED\":0,"
" \"WRITTEN\":0,"
" \"PLATFORMCREATE\":0,"
" \"READ_STCLEAR\":0,"
" \"TPM2_NT\":\"ORDINARY\""
"}";
CHECK_JSON_SIMPLE(TPMA_NV, test_json_TPMA_NV_src_array, test_json_TPMA_NV_expected);
CHECK_JSON_SIMPLE(TPMA_NV, test_json_TPMA_NV_src_struct, test_json_TPMA_NV_expected);
CHECK_JSON_SIMPLE(TPMA_NV, "1", test_json_TPMA_NV_expected2);
}
static void
check_json_policy(void **state)
{
const char *test_json_policy_nv_src = \
"{"
" \"description\":\"Description pol_nv\","
" \"policyDigests\":["
" ],"
" \"policyAuthorizations\":["
" ],"
" \"policy\":["
" {"
" \"type\": \"POLICYNV\","
" \"nvPath\": \"myNV\","
" \"operandB\": \"01030304\""
" }"
" ]"
"}";
const char *test_json_policy_nv_expected = \
"{"
" \"description\":\"Description pol_nv\","
" \"policyDigests\":["
" ],"
" \"policyAuthorizations\":["
" ],"
" \"policy\":["
" {"
" \"type\": \"POLICYNV\","
" \"nvPath\": \"myNV\","
" \"operandB\": \"01030304\""
" }"
" ]"
"}";
// CHECK_JSON(TPMS_POLICY, test_json_policy_nv_src, test_json_policy_nv_expected);
{
TPMS_POLICY out;
TSS2_RC rc;
json_object *jso = json_tokener_parse(test_json_policy_nv_src);
if (!jso) fprintf(stderr, "JSON parsing failed\n");
assert_non_null(jso);
rc = ifapi_json_TPMS_POLICY_deserialize (jso, &out);
if (rc) fprintf(stderr, "Deserialization failed\n");
assert_int_equal (rc, TSS2_RC_SUCCESS);
json_object_put(jso);
jso = NULL;
rc = ifapi_json_TPMS_POLICY_serialize (&out, &jso);
assert_int_equal (rc, TSS2_RC_SUCCESS);
assert_non_null(jso);
const char *jso_string = json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY);
assert_non_null(jso_string);
char *string1 = normalize(jso_string);
char *string2 = normalize(test_json_policy_nv_expected);
assert_string_equal(string1, string2);
json_object_put(jso);
ifapi_cleanup_policy(&out);
free(string1);
free(string2);
}
const char *test_json_policy_or_src = \
"{"
" \"description\":\"hareness description\","
" \"policyDigests\":["
" {"
" \"hashAlg\":\"SHA256\","
" \"digest\":\"59215cb6c21a60e26b2cc479334a021113611903795507c1227659e2aef23d16\""
" }"
" ],"
" \"policy\":["
" {"
" \"type\":\"POLICYOR\","
" \"policyDigests\":["
" {"
" \"hashAlg\":\"SHA256\","
" \"digest\":\"59215cb6c21a60e26b2cc479334a021113611903795507c1227659e2aef23d16\""
" }"
" ],"
" \"branches\":["
" {"
" \"name\":\"branch1\","
" \"description\":\"description branch 1\","
" \"policy\":["
" {"
" \"type\":\"POLICYPCR\","
" \"policyDigests\":["
" {"
" \"hashAlg\":\"SHA256\","
" \"digest\":\"17d552f8e39ad882f6b3c09ae139af59616bf6a63f4093d6d20e9e1b9f7cdb6e\""
" }"
" ],"
" \"pcrs\":["
" {"
" \"pcr\":16,"
" \"hashAlg\":\"SHA1\","
" \"digest\":\"0000000000000000000000000000000000000000\""
" }"
" ]"
" }"
" ],"
" \"policyDigests\":["
" {"
" \"hashAlg\":\"SHA256\","
" \"digest\":\"17d552f8e39ad882f6b3c09ae139af59616bf6a63f4093d6d20e9e1b9f7cdb6e\""
" }"
" ]"
" },"
" {"
" \"name\":\"branch1\","
" \"description\":\"description branch 1\","
" \"policy\":["
" {"
" \"type\":\"POLICYPCR\","
" \"policyDigests\":["
" {"
" \"hashAlg\":\"SHA256\","
" \"digest\":\"17d552f8e39ad882f6b3c09ae139af59616bf6a63f4093d6d20e9e1b9f7cdb6e\""
" }"
" ],"
" \"pcrs\":["
" {"
" \"pcr\":16,"
" \"hashAlg\":\"SHA1\","
" \"digest\":\"0000000000000000000000000000000000000000\""
" }"
" ]"
" }"
" ],"
" \"policyDigests\":["
" {"
" \"hashAlg\":\"SHA256\","
" \"digest\":\"17d552f8e39ad882f6b3c09ae139af59616bf6a63f4093d6d20e9e1b9f7cdb6e\""
" }"
" ]"
" }"
" ]"
" }"
" ]"
"}";
char *test_json_policy_or_expected = strdup(test_json_policy_or_src);
if (test_json_policy_or_expected == NULL){
LOG_ERROR("%s", "Out of memory.");
return;
}
// CHECK_JSON(TPMS_POLICY, test_json_policy_or_src, test_json_policy_or_expected);
{
TPMS_POLICY out;
TSS2_RC rc;
json_object *jso = json_tokener_parse(test_json_policy_or_src);
if (!jso) fprintf(stderr, "JSON parsing failed\n");
assert_non_null(jso);
rc = ifapi_json_TPMS_POLICY_deserialize (jso, &out);
if (rc) fprintf(stderr, "Deserialization failed\n");
assert_int_equal (rc, TSS2_RC_SUCCESS);
json_object_put(jso);
jso = NULL;
rc = ifapi_json_TPMS_POLICY_serialize (&out, &jso);
assert_int_equal (rc, TSS2_RC_SUCCESS);
assert_non_null(jso);
const char *jso_string = json_object_to_json_string_ext(jso, JSON_C_TO_STRING_PRETTY);
assert_non_null(jso_string);
char *string1 = normalize(jso_string);
char *string2 = normalize(test_json_policy_or_expected);
assert_string_equal(string1, string2);
json_object_put(jso);
ifapi_cleanup_policy(&out);
free(string1);
free(string2);
}
free(test_json_policy_or_expected);
}
static void
check_json_tpm2bs(void **state)
{
CHECK_JSON(TPM2B_DIGEST, "\"0x0102\"", "\"0102\"");
CHECK_JSON(TPM2B_DIGEST, "\"0102\"", "\"0102\"");
CHECK_JSON(TPM2B_DIGEST, "\"caffee\"", "\"caffee\"");
}
static void
check_error(void **state)
{
/* Value is > then max value for UINT */
CHECK_ERROR(UINT16, "\"0x10000\"", TSS2_FAPI_RC_BAD_VALUE);
CHECK_ERROR(UINT32, "\"0x100000000\"", TSS2_FAPI_RC_BAD_VALUE);
/* Digest/list is too large*/
CHECK_ERROR(TPM2B_DIGEST, "\"0x0102222222222222222222222222222222222222222222222222222"
"22222222222222222222222222222222222222222222222222222222222222222222222222222\"",
TSS2_FAPI_RC_BAD_VALUE);
/* Illegal values */
CHECK_ERROR(TPMI_ALG_HASH, "\"SHA9999\"", TSS2_FAPI_RC_BAD_VALUE);
CHECK_ERROR(TPM2B_DIGEST, "\"xxxx\"", TSS2_FAPI_RC_BAD_VALUE);
CHECK_ERROR(TPM2B_DIGEST, "\"0x010x\"", TSS2_FAPI_RC_BAD_VALUE);
/*
* Illegal keys
*/
const char *test_json_key_err1 =
/* Without persistent handle */
"{"
" \"objectType\":1,"
" \"system\":\"YES\","
"}";
CHECK_ERROR_CLEANUP(IFAPI_OBJECT, test_json_key_err1, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_key_err2 =
/* Without public */
"{"
" \"objectType\":1,"
" \"system\":\"YES\","
" \"persistent_handle\":0,"
"}";
CHECK_ERROR_CLEANUP(IFAPI_OBJECT, test_json_key_err2, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_key_err3 =
/* Without serialization */
"{"
" \"objectType\":1,"
" \"system\":\"YES\","
" \"with_auth\":\"NO\","
" \"persistent_handle\":0,"
" \"public\":{"
" \"size\":122,"
" \"publicArea\":{"
" \"type\":\"ECC\","
" \"nameAlg\":\"SHA256\","
" \"objectAttributes\":1,"
" \"authPolicy\":\"837197674484b3f81a90cc8d46a5d724fd52d76e06520b64f2a1da1b331469aa\","
" \"parameters\":{"
" \"symmetric\":{"
" \"algorithm\":\"AES\","
" \"keyBits\":128,"
" \"mode\":\"CFB\""
" },"
" \"scheme\":{"
" \"scheme\":\"NULL\""
" },"
" \"curveID\":\"NIST_P256\","
" \"kdf\":{"
" \"scheme\":\"NULL\""
" }"
" },"
" \"unique\":{"
" \"x\":\"78d926c582566a70eedffcda4fe147e1b24fe624305441167fac483a3079b2e7\","
" \"y\":\"8bdc62992c3382e29687114ea0a9e1ac69f91283ae1d018b6d37859731617c3a\""
" }"
" }"
" },"
"}";
CHECK_ERROR_CLEANUP(IFAPI_OBJECT, test_json_key_err3, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_key_err4 =
/* Without PolicyInstance */
"{"
" \"objectType\":1,"
" \"system\":\"YES\","
" \"with_auth\":\"NO\","
" \"persistent_handle\":0,"
" \"public\":{"
" \"size\":122,"
" \"publicArea\":{"
" \"type\":\"ECC\","
" \"nameAlg\":\"SHA256\","
" \"objectAttributes\":{"
" \"fixedTPM\":1,"
" \"stClear\":0,"
" \"fixedParent\":1,"
" \"sensitiveDataOrigin\":1,"
" \"userWithAuth\":0,"
" \"adminWithPolicy\":1,"
" \"noDA\":0,"
" \"encryptedDuplication\":0,"
" \"restricted\":1,"
" \"decrypt\":1,"
" \"sign\":0"
" },"
" \"authPolicy\":\"837197674484b3f81a90cc8d46a5d724fd52d76e06520b64f2a1da1b331469aa\","
" \"parameters\":{"
" \"symmetric\":{"
" \"algorithm\":\"AES\","
" \"keyBits\":128,"
" \"mode\":\"CFB\""
" },"
" \"scheme\":{"
" \"scheme\":\"NULL\""
" },"
" \"curveID\":\"NIST_P256\","
" \"kdf\":{"
" \"scheme\":\"NULL\""
" }"
" },"
" \"unique\":{"
" \"x\":\"78d926c582566a70eedffcda4fe147e1b24fe624305441167fac483a3079b2e7\","
" \"y\":\"8bdc62992c3382e29687114ea0a9e1ac69f91283ae1d018b6d37859731617c3a\""
" }"
" }"
" },"
" \"serialization\":\"\","
"}";
CHECK_ERROR_CLEANUP(IFAPI_OBJECT, test_json_key_err4, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_key_err5 =
/* Without certificate */
"{"
" \"objectType\":1,"
" \"system\":\"YES\","
" \"with_auth\":\"NO\","
" \"persistent_handle\":0,"
" \"public\":{"
" \"size\":122,"
" \"publicArea\":{"
" \"type\":\"ECC\","
" \"nameAlg\":\"SHA256\","
" \"objectAttributes\":{"
" \"fixedTPM\":1,"
" \"stClear\":0,"
" \"fixedParent\":1,"
" \"sensitiveDataOrigin\":1,"
" \"userWithAuth\":0,"
" \"adminWithPolicy\":1,"
" \"noDA\":0,"
" \"encryptedDuplication\":0,"
" \"restricted\":1,"
" \"decrypt\":1,"
" \"sign\":0"
" },"
" \"authPolicy\":\"837197674484b3f81a90cc8d46a5d724fd52d76e06520b64f2a1da1b331469aa\","
" \"parameters\":{"
" \"symmetric\":{"
" \"algorithm\":\"AES\","
" \"keyBits\":128,"
" \"mode\":\"CFB\""
" },"
" \"scheme\":{"
" \"scheme\":\"NULL\""
" },"
" \"curveID\":\"NIST_P256\","
" \"kdf\":{"
" \"scheme\":\"NULL\""
" }"
" },"
" \"unique\":{"
" \"x\":\"78d926c582566a70eedffcda4fe147e1b24fe624305441167fac483a3079b2e7\","
" \"y\":\"8bdc62992c3382e29687114ea0a9e1ac69f91283ae1d018b6d37859731617c3a\""
" }"
" }"
" },"
" \"serialization\":\"\","
" \"policyInstance\":\"\","
" \"description\":\"\","
"}";
CHECK_ERROR_CLEANUP(IFAPI_OBJECT, test_json_key_err5, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_key_err6 =
/* Without description */
"{"
" \"objectType\":1,"
" \"system\":\"YES\","
" \"with_auth\":\"NO\","
" \"persistent_handle\":0,"
" \"public\":{"
" \"size\":122,"
" \"publicArea\":{"
" \"type\":\"ECC\","
" \"nameAlg\":\"SHA256\","
" \"objectAttributes\":{"
" \"fixedTPM\":1,"
" \"stClear\":0,"
" \"fixedParent\":1,"
" \"sensitiveDataOrigin\":1,"
" \"userWithAuth\":0,"
" \"adminWithPolicy\":1,"
" \"noDA\":0,"
" \"encryptedDuplication\":0,"
" \"restricted\":1,"
" \"decrypt\":1,"
" \"sign\":0"
" },"
" \"authPolicy\":\"837197674484b3f81a90cc8d46a5d724fd52d76e06520b64f2a1da1b331469aa\","
" \"parameters\":{"
" \"symmetric\":{"
" \"algorithm\":\"AES\","
" \"keyBits\":128,"
" \"mode\":\"CFB\""
" },"
" \"scheme\":{"
" \"scheme\":\"NULL\""
" },"
" \"curveID\":\"NIST_P256\","
" \"kdf\":{"
" \"scheme\":\"NULL\""
" }"
" },"
" \"unique\":{"
" \"x\":\"78d926c582566a70eedffcda4fe147e1b24fe624305441167fac483a3079b2e7\","
" \"y\":\"8bdc62992c3382e29687114ea0a9e1ac69f91283ae1d018b6d37859731617c3a\""
" }"
" }"
" },"
" \"serialization\":\"\","
" \"policyInstance\":\"\","
" \"certificate\":\"\","
"}";
CHECK_ERROR_CLEANUP(IFAPI_OBJECT, test_json_key_err6, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_key_err7 =
/* Without signing scheme */
"{"
" \"objectType\":1,"
" \"system\":\"YES\","
" \"public\":{"
" \"size\":122,"
" \"publicArea\":{"
" \"type\":\"ECC\","
" \"nameAlg\":\"SHA256\","
" \"objectAttributes\":{"
" \"fixedTPM\":1,"
" \"stClear\":0,"
" \"fixedParent\":1,"
" \"sensitiveDataOrigin\":1,"
" \"userWithAuth\":0,"
" \"adminWithPolicy\":1,"
" \"noDA\":0,"
" \"encryptedDuplication\":0,"
" \"restricted\":1,"
" \"decrypt\":1,"
" \"sign\":0"
" },"
" \"authPolicy\":\"837197674484b3f81a90cc8d46a5d724fd52d76e06520b64f2a1da1b331469aa\","
" \"parameters\":{"
" \"symmetric\":{"
" \"algorithm\":\"AES\","
" \"keyBits\":128,"
" \"mode\":\"CFB\""
" },"
" \"scheme\":{"
" \"scheme\":\"NULL\""
" },"
" \"curveID\":\"NIST_P256\","
" \"kdf\":{"
" \"scheme\":\"NULL\""
" }"
" },"
" \"unique\":{"
" \"x\":\"78d926c582566a70eedffcda4fe147e1b24fe624305441167fac483a3079b2e7\","
" \"y\":\"8bdc62992c3382e29687114ea0a9e1ac69f91283ae1d018b6d37859731617c3a\""
" }"
" }"
" },"
" \"with_auth\":\"NO\","
" \"persistent_handle\":0,"
" \"serialization\":\"\","
" \"policyInstance\":\"\","
" \"certificate\":\"\","
" \"description\":\"\","
"}";
CHECK_ERROR_CLEANUP(IFAPI_OBJECT, test_json_key_err7, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_key_err8 =
/* Without name */
"{"
" \"objectType\":1,"
" \"system\":\"YES\","
" \"public\":{"
" \"size\":122,"
" \"publicArea\":{"
" \"type\":\"ECC\","
" \"nameAlg\":\"SHA256\","
" \"objectAttributes\":{"
" \"fixedTPM\":1,"
" \"stClear\":0,"
" \"fixedParent\":1,"
" \"sensitiveDataOrigin\":1,"
" \"userWithAuth\":0,"
" \"adminWithPolicy\":1,"
" \"noDA\":0,"
" \"encryptedDuplication\":0,"
" \"restricted\":1,"
" \"decrypt\":1,"
" \"sign\":0"
" },"
" \"authPolicy\":\"837197674484b3f81a90cc8d46a5d724fd52d76e06520b64f2a1da1b331469aa\","
" \"parameters\":{"
" \"symmetric\":{"
" \"algorithm\":\"AES\","
" \"keyBits\":128,"
" \"mode\":\"CFB\""
" },"
" \"scheme\":{"
" \"scheme\":\"NULL\""
" },"
" \"curveID\":\"NIST_P256\","
" \"kdf\":{"
" \"scheme\":\"NULL\""
" }"
" },"
" \"unique\":{"
" \"x\":\"78d926c582566a70eedffcda4fe147e1b24fe624305441167fac483a3079b2e7\","
" \"y\":\"8bdc62992c3382e29687114ea0a9e1ac69f91283ae1d018b6d37859731617c3a\""
" }"
" }"
" },"
" \"with_auth\":\"NO\","
" \"persistent_handle\":0,"
" \"serialization\":\"\","
" \"policyInstance\":\"\","
" \"certificate\":\"\","
" \"description\":\"\","
" \"signing_scheme\":{"
" \"scheme\":\"ECDSA\","
" \"details\":{"
" \"hashAlg\":\"SHA256\""
" }"
" },"
"}";
CHECK_ERROR_CLEANUP(IFAPI_OBJECT, test_json_key_err8, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_nv_err1 =
"{"
" \"objectType\":2,"
" \"system\":\"NO\","
" \"with_auth\":\"NO\","
" \"nv_object\":true,"
" \"hierarchy\":257,"
" \"policyInstance\":\"\","
" \"description\":\"\","
"}";
CHECK_ERROR_CLEANUP(IFAPI_OBJECT, test_json_nv_err1, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_nv_err2 =
"{"
" \"objectType\":2,"
" \"system\":\"NO\","
" \"with_auth\":\"NO\","
" \"nv_object\":true,"
" \"public\":{"
" \"size\":0,"
" \"nvPublic\":{"
" \"nvIndex\":25165824,"
" \"nameAlg\":\"SHA256\","
" \"attributes\":{"
" \"PPWRITE\":0,"
" \"OWNERWRITE\":0,"
" \"AUTHWRITE\":0,"
" \"POLICYWRITE\":1,"
" \"POLICY_DELETE\":0,"
" \"WRITELOCKED\":0,"
" \"WRITEALL\":0,"
" \"WRITEDEFINE\":0,"
" \"WRITE_STCLEAR\":1,"
" \"GLOBALLOCK\":0,"
" \"PPREAD\":0,"
" \"OWNERREAD\":0,"
" \"AUTHREAD\":0,"
" \"POLICYREAD\":1,"
" \"NO_DA\":1,"
" \"ORDERLY\":0,"
" \"CLEAR_STCLEAR\":0,"
" \"READLOCKED\":0,"
" \"WRITTEN\":0,"
" \"PLATFORMCREATE\":0,"
" \"READ_STCLEAR\":1,"
" \"TPM2_NT\":\"ORDINARY\""
" },"
" \"authPolicy\":\"0000000000000000000000000000000000000000000000000000000000000000\","
" \"dataSize\":1200"
" }"
" },"
" \"serialization\":\"018000000022000b59323f518181d5e607ade494f3ecaf7ba552ddc57fde379b3cf8ca82c009257c00000002002e01800000000b820840080020000000000000000000000000000000000000000000000000000000000000000004b0\","
" \"policyInstance\":\"\","
" \"description\":\"\","
"}";
CHECK_ERROR_CLEANUP(IFAPI_OBJECT, test_json_nv_err2, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_nv_err3 =
"{"
" \"objectType\":2,"
" \"system\":\"NO\","
" \"with_auth\":\"NO\","
" \"nv_object\":true,"
" \"public\":{"
" \"size\":0,"
" \"nvPublic\":{"
" \"nvIndex\":25165824,"
" \"nameAlg\":\"SHA256\","
" \"attributes\":{"
" \"PPWRITE\":0,"
" \"OWNERWRITE\":0,"
" \"AUTHWRITE\":0,"
" \"POLICYWRITE\":1,"
" \"POLICY_DELETE\":0,"
" \"WRITELOCKED\":0,"
" \"WRITEALL\":0,"
" \"WRITEDEFINE\":0,"
" \"WRITE_STCLEAR\":1,"
" \"GLOBALLOCK\":0,"
" \"PPREAD\":0,"
" \"OWNERREAD\":0,"
" \"AUTHREAD\":0,"
" \"POLICYREAD\":1,"
" \"NO_DA\":1,"
" \"ORDERLY\":0,"
" \"CLEAR_STCLEAR\":0,"
" \"READLOCKED\":0,"
" \"WRITTEN\":0,"
" \"PLATFORMCREATE\":0,"
" \"READ_STCLEAR\":1,"
" \"TPM2_NT\":\"ORDINARY\""
" },"
" \"authPolicy\":\"0000000000000000000000000000000000000000000000000000000000000000\","
" \"dataSize\":1200"
" }"
" },"
" \"serialization\":\"018000000022000b59323f518181d5e607ade494f3ecaf7ba552ddc57fde379b3cf8ca82c009257c00000002002e01800000000b820840080020000000000000000000000000000000000000000000000000000000000000000004b0\","
" \"hierarchy\":257,"
" \"description\":\"\","
"}";
CHECK_ERROR_CLEANUP(IFAPI_OBJECT, test_json_nv_err3, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_nv_err4 =
"{"
" \"objectType\":2,"
" \"system\":\"NO\","
" \"nv_object\":true,"
" \"public\":{"
" \"size\":0,"
" \"nvPublic\":{"
" \"nvIndex\":25165824,"
" \"nameAlg\":\"SHA256\","
" \"attributes\":{"
" \"PPWRITE\":0,"
" \"OWNERWRITE\":0,"
" \"AUTHWRITE\":0,"
" \"POLICYWRITE\":1,"
" \"POLICY_DELETE\":0,"
" \"WRITELOCKED\":0,"
" \"WRITEALL\":0,"
" \"WRITEDEFINE\":0,"
" \"WRITE_STCLEAR\":1,"
" \"GLOBALLOCK\":0,"
" \"PPREAD\":0,"
" \"OWNERREAD\":0,"
" \"AUTHREAD\":0,"
" \"POLICYREAD\":1,"
" \"NO_DA\":1,"
" \"ORDERLY\":0,"
" \"CLEAR_STCLEAR\":0,"
" \"READLOCKED\":0,"
" \"WRITTEN\":0,"
" \"PLATFORMCREATE\":0,"
" \"READ_STCLEAR\":1,"
" \"TPM2_NT\":\"ORDINARY\""
" },"
" \"authPolicy\":\"0000000000000000000000000000000000000000000000000000000000000000\","
" \"dataSize\":1200"
" }"
" },"
" \"serialization\":\"018000000022000b59323f518181d5e607ade494f3ecaf7ba552ddc57fde379b3cf8ca82c009257c00000002002e01800000000b820840080020000000000000000000000000000000000000000000000000000000000000000004b0\","
" \"hierarchy\":257,"
" \"policyInstance\":\"\","
"}";
CHECK_ERROR_CLEANUP(IFAPI_OBJECT, test_json_nv_err4, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_nv_err5 =
"{"
" \"objectType\":2,"
" \"system\":\"NO\","
" \"with_auth\":\"NO\","
" \"nv_object\":true,"
" \"public\":{"
" \"size\":0,"
" \"nvPublic\":{"
" \"nvIndex\":25165824,"
" \"nameAlg\":\"SHA256\","
" \"attributes\":{"
" \"PPWRITE\":0,"
" \"OWNERWRITE\":0,"
" \"AUTHWRITE\":0,"
" \"POLICYWRITE\":1,"
" \"POLICY_DELETE\":0,"
" \"WRITELOCKED\":0,"
" \"WRITEALL\":0,"
" \"WRITEDEFINE\":0,"
" \"WRITE_STCLEAR\":1,"
" \"GLOBALLOCK\":0,"
" \"PPREAD\":0,"
" \"OWNERREAD\":0,"
" \"AUTHREAD\":0,"
" \"POLICYREAD\":1,"
" \"NO_DA\":1,"
" \"ORDERLY\":0,"
" \"CLEAR_STCLEAR\":0,"
" \"READLOCKED\":0,"
" \"WRITTEN\":0,"
" \"PLATFORMCREATE\":0,"
" \"READ_STCLEAR\":1,"
" \"TPM2_NT\":\"ORDINARY\""
" },"
" \"authPolicy\":\"0000000000000000000000000000000000000000000000000000000000000000\","
" \"dataSize\":1200"
" }"
" },"
" \"serialization\":\"018000000022000b59323f518181d5e607ade494f3ecaf7ba552ddc57fde379b3cf8ca82c009257c00000002002e01800000000b820840080020000000000000000000000000000000000000000000000000000000000000000004b0\","
" \"hierarchy\":257,"
" \"description\":\"\","
"}";
CHECK_ERROR_CLEANUP(IFAPI_OBJECT, test_json_nv_err5, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_attest_err1 =
"{"
" \"magic\":\"VALUE\","
" \"type\":\"ATTEST_QUOTE\","
" \"qualifiedSigner\":\"000b5adea4e8b49b3f76db36b9442a29e515263e28bbd9e9263843675bb3cf750202\","
" \"extraData\":\"6768033e216468247bd031a0a2d9876d79818f8f\","
" \"clockInfo\":{"
" \"clock\":8048,"
" \"resetCount\":639972755,"
" \"restartCount\":158941495,"
" \"safe\":\"YES\" }"
"}";
CHECK_ERROR(TPMS_ATTEST, test_json_attest_err1, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_attest_err2 =
"{"
" \"magic\":\"VALUE\","
" \"type\":\"ATTEST_QUOTE\","
" \"qualifiedSigner\":\"000b5adea4e8b49b3f76db36b9442a29e515263e28bbd9e9263843675bb3cf750202\","
" \"extraData\":\"6768033e216468247bd031a0a2d9876d79818f8f\""
"}";
CHECK_ERROR(TPMS_ATTEST, test_json_attest_err2, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_attest_err3 =
"{"
" \"magic\":\"VALUE\","
" \"type\":\"ATTEST_QUOTE\","
" \"qualifiedSigner\":\"000b5adea4e8b49b3f76db36b9442a29e515263e28bbd9e9263843675bb3cf750202\","
"}";
CHECK_ERROR(TPMS_ATTEST, test_json_attest_err3, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_attest_err4 =
"{"
" \"magic\":\"VALUE\","
" \"type\":\"ATTEST_QUOTE\","
"}";
CHECK_ERROR(TPMS_ATTEST, test_json_attest_err4, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_attest_err5 =
"{"
" \"magic\":\"VALUE\","
"}";
CHECK_ERROR(TPMS_ATTEST, test_json_attest_err5, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_attest_err6 =
"{"
"}";
CHECK_ERROR(TPMS_ATTEST, test_json_attest_err6, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_clock_err1 =
"{"
" \"clock\":8048,"
" \"resetCount\":639972755,"
" \"restartCount\":158941495,"
"}";
CHECK_ERROR(TPMS_CLOCK_INFO, test_json_clock_err1, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_clock_err2 =
"{"
" \"clock\":8048,"
" \"resetCount\":639972755,"
"}";
CHECK_ERROR(TPMS_CLOCK_INFO, test_json_clock_err2, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_clock_err3 =
"{"
" \"clock\":8048,"
"}";
CHECK_ERROR(TPMS_CLOCK_INFO, test_json_clock_err3, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_clock_err4 =
"{"
"}";
CHECK_ERROR(TPMS_CLOCK_INFO, test_json_clock_err4, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_command_audit_err1 =
"{"
" \"auditCounter\":8048,"
" \"digestAlg\":\"sha1\","
" \"auditDigest\":\"0102\","
"}";
CHECK_ERROR(TPMS_COMMAND_AUDIT_INFO, test_json_command_audit_err1, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_command_audit_err2 =
"{"
" \"auditCounter\":8048,"
" \"digestAlg\":\"sha1\","
"}";
CHECK_ERROR(TPMS_COMMAND_AUDIT_INFO, test_json_command_audit_err2, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_command_audit_err3 =
"{"
" \"auditCounter\":8048,"
"}";
CHECK_ERROR(TPMS_COMMAND_AUDIT_INFO, test_json_command_audit_err3, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_command_audit_err4 =
"{"
"}";
CHECK_ERROR(TPMS_COMMAND_AUDIT_INFO, test_json_command_audit_err4, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_tk_creation_err1 =
"{"
" \"tag\":\"NULL\","
" \"hierarchy\":\"OWNER\","
"}";
CHECK_ERROR(TPMT_TK_CREATION, test_json_tk_creation_err1, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_tk_creation_err2 =
"{"
" \"tag\":\"NULL\","
"}";
CHECK_ERROR(TPMT_TK_CREATION, test_json_tk_creation_err2, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_tk_creation_err3 =
"{"
"}";
CHECK_ERROR(TPMT_TK_CREATION, test_json_tk_creation_err3, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_nv_certify_info_err1 =
"{"
" \"indexName\":\"0102\","
" \"offset\":0,"
"}";
CHECK_ERROR(TPMS_NV_CERTIFY_INFO, test_json_nv_certify_info_err1, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_nv_certify_info_err2 =
"{"
" \"indexName\":\"0102\","
"}";
CHECK_ERROR(TPMS_NV_CERTIFY_INFO, test_json_nv_certify_info_err2, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_nv_certify_info_err3 =
"{"
"}";
CHECK_ERROR(TPMS_NV_CERTIFY_INFO, test_json_nv_certify_info_err3, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_signature_ecc_err1 =
"{"
" \"hash\":\"sha1\","
" \"signatureR\":\"0102\","
"}";
CHECK_ERROR(TPMS_SIGNATURE_ECC, test_json_signature_ecc_err1, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_signature_ecc_err2 =
"{"
" \"hash\":\"sha1\","
"}";
CHECK_ERROR(TPMS_SIGNATURE_ECC, test_json_signature_ecc_err2, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_signature_ecc_err4 =
"{"
"}";
CHECK_ERROR(TPMS_SIGNATURE_ECC, test_json_signature_ecc_err4, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_signature_err1 =
"{"
" \"sigAlg\":\"HMAC\","
" \"signature\":\"0102\","
"}";
CHECK_ERROR(TPMT_SIGNATURE, test_json_signature_err1, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_signature_err2 =
"{"
" \"sigAlg\":\"ECDSA\","
" \"signature\":\"0102\","
"}";
CHECK_ERROR(TPMT_SIGNATURE, test_json_signature_err2, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_signature_err3 =
"{"
" \"sigAlg\":\"ECDAA\","
" \"signature\":\"0102\","
"}";
CHECK_ERROR(TPMT_SIGNATURE, test_json_signature_err3, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_signature_err4 =
"{"
" \"sigAlg\":\"SM2\","
" \"signature\":\"0102\","
"}";
CHECK_ERROR(TPMT_SIGNATURE, test_json_signature_err4, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_signature_err5 =
"{"
" \"sigAlg\":\"ECSCHNORR\","
" \"signature\":\"0102\","
"}";
CHECK_ERROR(TPMT_SIGNATURE, test_json_signature_err5, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_signature_err6 =
"{"
" \"sigAlg\":\"RSASSA\","
" \"signature\":\"0102\","
"}";
CHECK_ERROR(TPMT_SIGNATURE, test_json_signature_err6, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_signature_err7 =
"{"
"}";
CHECK_ERROR(TPMT_SIGNATURE, test_json_signature_err7, TSS2_FAPI_RC_BAD_VALUE);
const char *test_json_signature_err8 =
"{"
" \"sigAlg\":\"RSASSA\","
"}";
CHECK_ERROR(TPMT_SIGNATURE, test_json_signature_err8, TSS2_FAPI_RC_BAD_VALUE);
}
static void
check_tpmjson_tofromtxt(void **state)
{
const char *testcase_alg_id[] = { "\"TPM_ALG_ID_SHA1\"", "\"TPM2_ALG_ID_SHA1\"",
"\"ALG_ID_SHA1\"", "\"SHA1\"", "\"ALG_SHA1\"",
"\"tpm2_alg_id_sha1\"", "\"sha1\"", "\"0x0004\"" };
const char *expected_ald_id = { "\"SHA1\"" };
for (size_t i = 0; i < sizeof(testcase_alg_id) / sizeof(testcase_alg_id[0]); i++) {
CHECK_JSON_SIMPLE(TPM2_ALG_ID, testcase_alg_id[i], expected_ald_id);
}
const char *testcase_ecc_curve[] = { "\"TPM2_ECC_NIST_P256\"", "\"ECC_NIST_P256\"",
"\"NIST_P256\"", "\"0x0003\"", "\"nist_p256\"" };
const char *expected_ecc_curve = { "\"NIST_P256\"" };
for (size_t i = 0; i < sizeof(testcase_ecc_curve) / sizeof(testcase_ecc_curve[0]); i++) {
CHECK_JSON_SIMPLE(TPM2_ECC_CURVE, testcase_ecc_curve[i], expected_ecc_curve);
}
const char *testcase_cc[] = { "\"TPM2_CC_Startup\"", "\"CC_Startup\"",
"\"Startup\"", "\"0x00000144\"" };
const char *expected_cc = { "\"Startup\"" };
for (size_t i = 0; i < sizeof(testcase_cc) / sizeof(testcase_cc[0]); i++) {
CHECK_JSON_SIMPLE(TPM2_CC, testcase_cc[i], expected_cc);
}
const char *testcase_eo[] = { "\"TPM2_EO_EQ\"", "\"EO_EQ\"",
"\"EQ\"", "\"0x0000\"" };
const char *expected_eo = { "\"EQ\"" };
for (size_t i = 0; i < sizeof(testcase_eo) / sizeof(testcase_eo[0]); i++) {
CHECK_JSON_SIMPLE(TPM2_EO, testcase_eo[i], expected_eo);
}
const char *testcase_st[] = { "\"TPM2_ST_NO_SESSIONS\"", "\"ST_NO_SESSIONS\"",
"\"no_SESSIONS\"", "\"0x8001\"" };
const char *expected_st = { "\"NO_SESSIONS\"" };
for (size_t i = 0; i < sizeof(testcase_st) / sizeof(testcase_st[0]); i++) {
CHECK_JSON_SIMPLE(TPM2_ST, testcase_st[i], expected_st);
}
const char *testcase_pt_pcr[] = { "\"TPM2_PT_PCR_EXTEND_L0\"", "\"PT_PCR_EXTEND_L0\"",
"\"PCR_EXTEND_L0\"", "\"EXTEND_L0\"" };
const char *expected_pt_pcr = { "\"EXTEND_L0\"" };
for (size_t i = 0; i < sizeof(testcase_pt_pcr) / sizeof(testcase_pt_pcr[0]); i++) {
CHECK_JSON_SIMPLE(TPM2_PT_PCR, testcase_pt_pcr[i], expected_pt_pcr);
}
const char *testcase_alg_public[] = { "\"TPM2_ALG_RSA\"", "\"ALG_RSA\"",
"\"RSA\"", "\"0x0001\"" };
const char *expected_alg_public = { "\"RSA\"" };
for (size_t i = 0; i < sizeof(testcase_alg_public) / sizeof(testcase_alg_public[0]); i++) {
CHECK_JSON_SIMPLE(TPMI_ALG_PUBLIC, testcase_alg_public[i], expected_alg_public);
}
}
int
main(int argc, char *argv[])
{
const struct CMUnitTest tests[] = {
cmocka_unit_test(check_tpmjson_tofromtxt),
cmocka_unit_test(check_json_structs),
cmocka_unit_test(check_json_constants),
cmocka_unit_test(check_json_numbers),
cmocka_unit_test(check_json_bits),
cmocka_unit_test(check_json_tpm2bs),
cmocka_unit_test(check_json_to_bin),
cmocka_unit_test(check_bin),
cmocka_unit_test(check_policy_bin),
cmocka_unit_test(check_error),
cmocka_unit_test(check_json_policy),
};
return cmocka_run_group_tests(tests, NULL, NULL);
}