blob: 6ab24762055d2e711cb79b2d13fe114bbdb6383d [file] [log] [blame]
/* SPDX-License-Identifier: BSD-2-Clause */
/*******************************************************************************
* Copyright 2018-2019, Fraunhofer SIT sponsored by Infineon Technologies AG
* All rights reserved.
******************************************************************************/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "tpm_json_deserialize.h"
#define LOGMODULE fapijson
#include "util/log.h"
#include "util/aux_util.h"
/** Strip a prefix from the input
*
* Strip the provided prefixes from the provided
* input string and return the substring.
*
* @param[in] in The input string to strip the prefix from
* @param[in] ... A list of prefixes to string from the input string
* @return The prefix cleared substring
*/
static const char *
strip_prefix(const char *in, ...)
{
va_list ap;
const char *prefix;
if (!in)
return NULL;
va_start(ap, in);
while ((prefix = va_arg(ap, const char *)) != NULL) {
if (strncasecmp(in, prefix, strlen(prefix)) == 0) {
in = &in[strlen(prefix)];
}
}
va_end(ap);
return in;
}
/* Deserialize according to the rules of parenttype and then filter against values
provided in the ... list. */
#define SUBTYPE_FILTER(type, parenttype, ...) \
TSS2_RC r; \
type tab[] = { __VA_ARGS__ }; \
type v; \
r = ifapi_json_ ## parenttype ## _deserialize(jso, &v); \
return_if_error(r, "Bad value"); \
for (size_t i = 0; i < sizeof(tab) / sizeof(tab[0]); i++) { \
if (v == tab[i]) { \
*out = v; \
return TSS2_RC_SUCCESS; \
} \
} \
LOG_ERROR("Bad sub-value"); \
return TSS2_FAPI_RC_BAD_VALUE;
/** Deserialize a TPMS_EMPTY .
*
* @param[out] out not used.
* @param[in] jso not used.
*/
TSS2_RC
ifapi_json_TPMS_EMPTY_deserialize(json_object *jso, TPMS_EMPTY *out)
{
(void)(out);
(void)(jso);
LOG_TRACE("call");
return TSS2_RC_SUCCESS;
}
/** Convert a byte array in character representation to binary.
*
* @param[in] hex the character representation of the byte array
* @param[in] vlen the maximal length of the binary byte array.
* @param[out] val the byte array.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the character representation is too long.
*/
static TSS2_RC
ifapi_hex_to_byte_ary(const char hex[], UINT32 vlen, BYTE val[])
{
UINT32 j;
UINT32 hexlen;
hexlen = strlen(hex);
if (vlen < hexlen / 2) {
LOG_ERROR("Hex string too long. (%zu > %"PRIu32")", strlen(hex) / 2, vlen);
return TSS2_FAPI_RC_BAD_VALUE;
}
for (j = 0; j < vlen
&& 2 * j < hexlen; j++) { //convert hex-Argv to byte array
if (!isxdigit(hex[2 * j]) || (!(hex[2 * j + 1] == 0)
&& !isxdigit(hex[2 * j + 1]))) {
LOG_ERROR("Error in value (%i)", j);
return TSS2_FAPI_RC_BAD_VALUE;
}
val[j] = hex[2 * j] < 65 ? hex[2 * j] - 48 :
hex[2 * j] < 97 ? hex[2 * j] - 65 + 10 : hex[2 * j] - 97 + 10;
val[j] *= 16;
if (hex[2 * j + 1] != 0)
val[j] += hex[2 * j + 1] < 65 ? hex[2 * j + 1] - 48 :
hex[2 * j + 1] < 97 ? hex[2 * j + 1] - 65 + 10 : hex[2 * j + 1] - 97 + 10;
}
for (; j < vlen; j++) { //Padd with 0
val[j] = 0;
}
return TSS2_RC_SUCCESS;
}
/** Deserialize a json array of bytes.
*
* @param[in] jso the parent object of the json byte array.
* @param[in] max maximal size of the deserialized object.
* @param[out] out* Pointer to the deserialized byte array.
* @param[out] out_size the length of the deserialized byte array.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_byte_deserialize(
json_object *jso,
UINT32 max,
BYTE *out,
UINT16 *out_size)
{
TSS2_RC r;
json_type jso_type = json_object_get_type(jso);
if (jso_type == json_type_array) {
r = ifapi_json_BYTE_array_deserialize(max, jso, out);
return_if_error(r, "BAD VALUE");
*out_size = json_object_array_length(jso);
} else if (jso_type == json_type_string) {
const char *token = json_object_get_string(jso);
int itoken = 0;
if (strncmp(token, "0x", 2) == 0)
itoken = 2;
r = ifapi_hex_to_byte_ary(&token[itoken], max, out);
return_if_error(r, "Error convert hex digest to binary.");
*out_size = (strlen(token) - itoken) / 2;
} else {
LOG_ERROR("Byte array is neither of type array nor string.");
return TSS2_FAPI_RC_BAD_VALUE;
}
return TSS2_RC_SUCCESS;
}
/** Get number from a string.
*
* A string which represents a number or hex number (prefix 0x) is converted
* to an int64 number.
*
* param[in] token the string representing the number.
* param[out] num the converted number.
* @retval true if token represents a number
* @retval false if token does not represent a number.
*/
static bool
get_number(const char *token, int64_t *num)
{
int itoken = 0;
int pos = 0;
if (strncmp(token, "0x", 2) == 0) {
itoken = 2;
sscanf(&token[itoken], "%"PRIx64"%n", num, &pos);
} else {
sscanf(&token[itoken], "%"PRId64"%n", num, &pos);
}
if ((size_t)pos == strlen(token) - itoken)
return true;
else
return false;
}
/** Get sub object from a json object.
*
* A sub object with a certain name stored in the passed object is returned.
* If the sub object is not found e second trial with the lower case version
* of the name will be performed.
*
* param[in] jso the object with the sub object.
* param[in] name the name of the stored sub object.
* param[out] sub_jso the pointer to the sub object.
* @retval true if object was found.
* @retval false if the object was not found.
*/
bool
ifapi_get_sub_object(json_object *jso, char *name, json_object **sub_jso)
{
int i;
if (json_object_object_get_ex(jso, name, sub_jso)) {
return true;
} else {
char name2[strlen(name) + 1];
for (i = 0; name[i]; i++)
name2[i] = tolower(name[i]);
name2[strlen(name)] = '\0';
return json_object_object_get_ex(jso, name2, sub_jso);
}
}
/** Get number from a json object.
*
* A int64 number is retrieved from a json object which should represent a number.
*
* param[in] jso the json object.
* param[out] num the int64 number.
* @retval TSS2_RC_SUCCESS if json object represents a number.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object does not represent a number.
*/
static TSS2_RC
get_number_from_json(json_object *jso, int64_t *num)
{
const char *token = json_object_get_string(jso);
if (!get_number(token, num)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
return TSS2_RC_SUCCESS;
}
/** Get boolean from a json object.
*
* A boolean value is retrieved from a json object.
* The value can be 1, 0, yes, or no.
*
* param[in] jso the json object.
* param[out] value the boolean value.
* @retval TSS2_RC_SUCCESS if json object represents a boolean.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object does not represent a boolean.
*/
static TSS2_RC
get_boolean_from_json(json_object *jso, TPMI_YES_NO *value)
{
TSS2_RC r = ifapi_json_TPMI_YES_NO_deserialize(jso, value);
if (r != TSS2_RC_SUCCESS) {
const char *token = json_object_get_string(jso);
if (strcasecmp(token, "set") || strcasecmp(token, "on")) {
*value = 1;
} else if (strcasecmp(token, "off")) {
*value = 0;
} else {
return_error(TSS2_FAPI_RC_BAD_VALUE, "No boolean value");
}
}
if (*value != 0 && *value != 1) {
return_error(TSS2_FAPI_RC_BAD_VALUE, "No boolean value.");
};
return TSS2_RC_SUCCESS;
}
/** Deserialize json object which represents a pcr selection.
*
* @param[in] jso json array of pcr registers.
* @param[out] sizeofSelect size of bit mask for used pcr registers.
* @param[out] pcrSelect byte array with bit mask.
* @retval TSS2_FAPI_RC_BAD_VALUE if an invalid value was passed into
* the function.
*/
TSS2_RC
ifapi_json_pcr_selection_deserialize(
json_object *jso,
UINT8 *sizeofSelect,
BYTE pcrSelect[])
{
LOG_TRACE("call");
TSS2_RC r;
size_t i;
int64_t n;
int n_byte = 0;
json_type jso_type = json_object_get_type(jso);
if (jso_type != json_type_array) {
return_error(TSS2_FAPI_RC_BAD_VALUE, "Bad value (array of numbers expected).");
}
/* Cast (size_t) is necessary to support older version of libjson-c */
for (i = 0; i < (size_t)json_object_array_length(jso); i++) {
r = get_number_from_json(json_object_array_get_idx(jso, i), &n);
return_if_error(r, "Bad PCR value");
n_byte = n / 8;
pcrSelect[n_byte] |= (BYTE)(1 << (n % 8));
if (n_byte > *sizeofSelect)
*sizeofSelect = n_byte;
}
*sizeofSelect = 3;
return TSS2_RC_SUCCESS;
}
/** Deserialize an array of UINT8.
*
* @param[in] jso object to be deserialized.
* @param[out] out the deserialized object.
* @retval TSS2_FAPI_RC_MEMORY if not enough memory can be allocated.
* @retval TSS2_FAPI_RC_BAD_VALUE if an invalid value was passed into
* the function.
*/
TSS2_RC
ifapi_json_UINT8_ARY_deserialize(
json_object *jso,
UINT8_ARY *out)
{
TSS2_RC r;
const char *hex_string = json_object_get_string(jso);
out->size = strlen(hex_string) / 2;
out->buffer = malloc(out->size);
return_if_null(out->buffer, "Out of memory.", TSS2_FAPI_RC_MEMORY);
r = ifapi_hex_to_byte_ary(hex_string, out->size, &out->buffer[0]);
return_if_error(r, "Can't convert hex values.");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_PCR_SELECT variable.
*
* @param[in] jso json object to be deserialized.
* @param[out] out the deserialized object.
* @retval TSS2_FAPI_RC_BAD_VALUE if an invalid value was passed into
* the function.
*/
TSS2_RC
ifapi_json_TPMS_PCR_SELECT_deserialize(json_object *jso, TPMS_PCR_SELECT *out)
{
LOG_TRACE("call");
memset(out, 0, sizeof(TPMS_PCR_SELECT));
return ifapi_json_pcr_selection_deserialize(jso, &out->sizeofSelect,
&out->pcrSelect[0]);
}
/** Deserialize a TPMS_PCR_SELECTION variable.
*
* @param[in] jso json object to be deserialized.
* @param[out] out the deserialized object.
* @retval TSS2_FAPI_RC_BAD_VALUE if an invalid value was passed into
* the function.
*/
TSS2_RC
ifapi_json_TPMS_PCR_SELECTION_deserialize(json_object *jso,
TPMS_PCR_SELECTION *out)
{
LOG_TRACE("call");
json_object *jso2;
TSS2_RC r;
memset(out, 0, sizeof(TPMS_PCR_SELECTION));
if (!ifapi_get_sub_object(jso, "hash", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_HASH_deserialize(jso2, &out->hash);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "pcrSelect", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
return ifapi_json_pcr_selection_deserialize(jso2, &out->sizeofSelect,
&out->pcrSelect[0]);
}
/** Deserialize an array of BYTE structures.
*
* @param[in] max the maximal number of bytess to be deserialized.
* @param[in] jso the JSON object with the byte array.
* @param[in] out the byte array for deserialization.
* @retval TSS2_FAPI_RC_BAD_VALUE if an invalid value was passed into
* the function.
*/
TSS2_RC
ifapi_json_BYTE_array_deserialize(size_t max, json_object *jso, BYTE *out)
{
LOG_TRACE("call");
json_type jso_type = json_object_get_type(jso);
if (jso_type == json_type_array) {
int size = json_object_array_length(jso);
if (size > (int)max) {
LOG_ERROR("Array of BYTE too large (%i > %zu)", size, max);
}
for (int i = 0; i < size; i++) {
json_object *jso2 = json_object_array_get_idx(jso, i);
TSS2_RC r = ifapi_json_BYTE_deserialize(jso2, &out[i]);
return_if_error(r, "BAD VALUE");
}
return TSS2_RC_SUCCESS;
} else {
LOG_ERROR("BAD VALUE");
return TSS2_FAPI_RC_BAD_VALUE;
}
}
/** Deserialize a BYTE json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_BYTE_deserialize(json_object *jso, BYTE *out)
{
LOG_TRACE("call");
const char *token = json_object_get_string(jso);
int64_t i64;
if (!get_number(token, &i64)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
*out = (BYTE) i64;
if ((int64_t)*out != i64) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
return TSS2_RC_SUCCESS;
}
/** Deserialize a UINT8 json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_UINT8_deserialize(json_object *jso, UINT8 *out)
{
LOG_TRACE("call");
const char *token = json_object_get_string(jso);
int64_t i64;
if (!get_number(token, &i64)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
*out = (UINT8) i64;
if ((int64_t)*out != i64) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
return TSS2_RC_SUCCESS;
}
/** Deserialize a UINT16 json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_UINT16_deserialize(json_object *jso, UINT16 *out)
{
LOG_TRACE("call");
const char *token = json_object_get_string(jso);
int64_t i64;
if (!get_number(token, &i64)) {
LOG_ERROR("Bad value %s", json_object_get_string(jso));
return TSS2_FAPI_RC_BAD_VALUE;
}
*out = (UINT16) i64;
if ((int64_t)*out != i64) {
LOG_ERROR("Bad value %s", json_object_get_string(jso));
return TSS2_FAPI_RC_BAD_VALUE;
}
return TSS2_RC_SUCCESS;
}
/** Deserialize a UINT32 json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_UINT32_deserialize(json_object *jso, UINT32 *out)
{
LOG_TRACE("call");
const char *token = json_object_get_string(jso);
int64_t i64;
if (!get_number(token, &i64)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
*out = (UINT32) i64;
if ((int64_t)*out != i64) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
return TSS2_RC_SUCCESS;
}
/** Deserialize a UINT64 json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_UINT64_deserialize(json_object *jso, UINT64 *out)
{
UINT32 tmp;
LOG_TRACE("call");
/* json-c allows only 53 bit numbers, therefore 64 bit numbers are split */
if (json_object_get_type(jso) == json_type_array) {
if (json_object_array_length(jso) != 2) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
TSS2_RC r = ifapi_json_UINT32_deserialize(json_object_array_get_idx(jso, 0),
&tmp);
return_if_error(r, "BAD VALUE");
*out = tmp * 0x100000000;
r = ifapi_json_UINT32_deserialize(json_object_array_get_idx(jso, 1),
&tmp);
return_if_error(r, "BAD VALUE");
*out += tmp;
return TSS2_RC_SUCCESS;
}
const char *token = json_object_get_string(jso);
int64_t i64;
if (!get_number(token, &i64)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
*out = (UINT64) i64;
if ((int64_t)*out != i64) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPM2_GENERATED json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPM2_GENERATED_deserialize(json_object *jso, TPM2_GENERATED *out)
{
static const struct { TPM2_GENERATED in; const char *name; } tab[] = {
{ TPM2_GENERATED_VALUE, "VALUE" },
};
const char *s = json_object_get_string(jso);
const char *str = strip_prefix(s, "TPM_", "TPM2_", "GENERATED_", NULL);
LOG_TRACE("called for %s parsing %s", s, str);
if (str) {
for (size_t i = 0; i < sizeof(tab) / sizeof(tab[0]); i++) {
if (strcasecmp(str, &tab[i].name[0]) == 0) {
*out = tab[i].in;
return TSS2_RC_SUCCESS;
}
}
}
return ifapi_json_UINT32_deserialize(jso, out);
}
/** Deserialize a TPM2_ALG_ID json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPM2_ALG_ID_deserialize(json_object *jso, TPM2_ALG_ID *out)
{
static const struct { TPM2_ALG_ID in; const char *name; } tab[] = {
{ TPM2_ALG_ERROR, "ERROR" },
{ TPM2_ALG_RSA, "RSA" },
{ TPM2_ALG_SHA, "SHA" },
{ TPM2_ALG_SHA1, "SHA1" },
{ TPM2_ALG_HMAC, "HMAC" },
{ TPM2_ALG_AES, "AES" },
{ TPM2_ALG_MGF1, "MGF1" },
{ TPM2_ALG_KEYEDHASH, "KEYEDHASH" },
{ TPM2_ALG_XOR, "XOR" },
{ TPM2_ALG_SHA256, "SHA256" },
{ TPM2_ALG_SHA384, "SHA384" },
{ TPM2_ALG_SHA512, "SHA512" },
{ TPM2_ALG_NULL, "NULL" },
{ TPM2_ALG_SM3_256, "SM3_256" },
{ TPM2_ALG_SM4, "SM4" },
{ TPM2_ALG_RSASSA, "RSASSA" },
{ TPM2_ALG_RSAES, "RSAES" },
{ TPM2_ALG_RSAPSS, "RSAPSS" },
{ TPM2_ALG_OAEP, "OAEP" },
{ TPM2_ALG_ECDSA, "ECDSA" },
{ TPM2_ALG_ECDH, "ECDH" },
{ TPM2_ALG_ECDAA, "ECDAA" },
{ TPM2_ALG_SM2, "SM2" },
{ TPM2_ALG_ECSCHNORR, "ECSCHNORR" },
{ TPM2_ALG_ECMQV, "ECMQV" },
{ TPM2_ALG_KDF1_SP800_56A, "KDF1_SP800_56A" },
{ TPM2_ALG_KDF2, "KDF2" },
{ TPM2_ALG_KDF1_SP800_108, "KDF1_SP800_108" },
{ TPM2_ALG_ECC, "ECC" },
{ TPM2_ALG_SYMCIPHER, "SYMCIPHER" },
{ TPM2_ALG_CAMELLIA, "CAMELLIA" },
{ TPM2_ALG_CTR, "CTR" },
{ TPM2_ALG_OFB, "OFB" },
{ TPM2_ALG_CBC, "CBC" },
{ TPM2_ALG_CFB, "CFB" },
{ TPM2_ALG_ECB, "ECB" },
};
const char *s = json_object_get_string(jso);
const char *str = strip_prefix(s, "TPM_", "TPM2_", "ALG_", "ID_", NULL);
LOG_TRACE("called for %s parsing %s", s, str);
if (str) {
for (size_t i = 0; i < sizeof(tab) / sizeof(tab[0]); i++) {
if (strcasecmp(str, &tab[i].name[0]) == 0) {
*out = tab[i].in;
return TSS2_RC_SUCCESS;
}
}
}
return ifapi_json_UINT16_deserialize(jso, out);
}
/** Deserialize a TPM2_ECC_CURVE json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPM2_ECC_CURVE_deserialize(json_object *jso, TPM2_ECC_CURVE *out)
{
static const struct { TPM2_ECC_CURVE in; const char *name; } tab[] = {
{ TPM2_ECC_NONE, "NONE" },
{ TPM2_ECC_NIST_P192, "NIST_P192" },
{ TPM2_ECC_NIST_P224, "NIST_P224" },
{ TPM2_ECC_NIST_P256, "NIST_P256" },
{ TPM2_ECC_NIST_P384, "NIST_P384" },
{ TPM2_ECC_NIST_P521, "NIST_P521" },
{ TPM2_ECC_BN_P256, "BN_P256" },
{ TPM2_ECC_BN_P638, "BN_P638" },
{ TPM2_ECC_SM2_P256, "SM2_P256" },
};
const char *s = json_object_get_string(jso);
const char *str = strip_prefix(s, "TPM_", "TPM2_", "ECC_", "CURVE_", NULL);
LOG_TRACE("called for %s parsing %s", s, str);
if (str) {
for (size_t i = 0; i < sizeof(tab) / sizeof(tab[0]); i++) {
if (strcasecmp(str, &tab[i].name[0]) == 0) {
*out = tab[i].in;
return TSS2_RC_SUCCESS;
}
}
}
return ifapi_json_UINT16_deserialize(jso, out);
}
/** Deserialize a TPM2_CC json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPM2_CC_deserialize(json_object *jso, TPM2_CC *out)
{
static const struct { TPM2_CC in; const char *name; } tab[] = {
{ TPM2_CC_FIRST, "FIRST" },
{ TPM2_CC_NV_UndefineSpaceSpecial, "NV_UndefineSpaceSpecial" },
{ TPM2_CC_EvictControl, "EvictControl" },
{ TPM2_CC_HierarchyControl, "HierarchyControl" },
{ TPM2_CC_NV_UndefineSpace, "NV_UndefineSpace" },
{ TPM2_CC_ChangeEPS, "ChangeEPS" },
{ TPM2_CC_ChangePPS, "ChangePPS" },
{ TPM2_CC_Clear, "Clear" },
{ TPM2_CC_ClearControl, "ClearControl" },
{ TPM2_CC_ClockSet, "ClockSet" },
{ TPM2_CC_HierarchyChangeAuth, "HierarchyChangeAuth" },
{ TPM2_CC_NV_DefineSpace, "NV_DefineSpace" },
{ TPM2_CC_PCR_Allocate, "PCR_Allocate" },
{ TPM2_CC_PCR_SetAuthPolicy, "PCR_SetAuthPolicy" },
{ TPM2_CC_PP_Commands, "PP_Commands" },
{ TPM2_CC_SetPrimaryPolicy, "SetPrimaryPolicy" },
{ TPM2_CC_FieldUpgradeStart, "FieldUpgradeStart" },
{ TPM2_CC_ClockRateAdjust, "ClockRateAdjust" },
{ TPM2_CC_CreatePrimary, "CreatePrimary" },
{ TPM2_CC_NV_GlobalWriteLock, "NV_GlobalWriteLock" },
{ TPM2_CC_GetCommandAuditDigest, "GetCommandAuditDigest" },
{ TPM2_CC_NV_Increment, "NV_Increment" },
{ TPM2_CC_NV_SetBits, "NV_SetBits" },
{ TPM2_CC_NV_Extend, "NV_Extend" },
{ TPM2_CC_NV_Write, "NV_Write" },
{ TPM2_CC_NV_WriteLock, "NV_WriteLock" },
{ TPM2_CC_DictionaryAttackLockReset, "DictionaryAttackLockReset" },
{ TPM2_CC_DictionaryAttackParameters, "DictionaryAttackParameters" },
{ TPM2_CC_NV_ChangeAuth, "NV_ChangeAuth" },
{ TPM2_CC_PCR_Event, "PCR_Event" },
{ TPM2_CC_PCR_Reset, "PCR_Reset" },
{ TPM2_CC_SequenceComplete, "SequenceComplete" },
{ TPM2_CC_SetAlgorithmSet, "SetAlgorithmSet" },
{ TPM2_CC_SetCommandCodeAuditStatus, "SetCommandCodeAuditStatus" },
{ TPM2_CC_FieldUpgradeData, "FieldUpgradeData" },
{ TPM2_CC_IncrementalSelfTest, "IncrementalSelfTest" },
{ TPM2_CC_SelfTest, "SelfTest" },
{ TPM2_CC_Startup, "Startup" },
{ TPM2_CC_Shutdown, "Shutdown" },
{ TPM2_CC_StirRandom, "StirRandom" },
{ TPM2_CC_ActivateCredential, "ActivateCredential" },
{ TPM2_CC_Certify, "Certify" },
{ TPM2_CC_PolicyNV, "PolicyNV" },
{ TPM2_CC_CertifyCreation, "CertifyCreation" },
{ TPM2_CC_Duplicate, "Duplicate" },
{ TPM2_CC_GetTime, "GetTime" },
{ TPM2_CC_GetSessionAuditDigest, "GetSessionAuditDigest" },
{ TPM2_CC_NV_Read, "NV_Read" },
{ TPM2_CC_NV_ReadLock, "NV_ReadLock" },
{ TPM2_CC_ObjectChangeAuth, "ObjectChangeAuth" },
{ TPM2_CC_PolicySecret, "PolicySecret" },
{ TPM2_CC_Rewrap, "Rewrap" },
{ TPM2_CC_Create, "Create" },
{ TPM2_CC_ECDH_ZGen, "ECDH_ZGen" },
{ TPM2_CC_HMAC, "HMAC" },
{ TPM2_CC_Import, "Import" },
{ TPM2_CC_Load, "Load" },
{ TPM2_CC_Quote, "Quote" },
{ TPM2_CC_RSA_Decrypt, "RSA_Decrypt" },
{ TPM2_CC_HMAC_Start, "HMAC_Start" },
{ TPM2_CC_SequenceUpdate, "SequenceUpdate" },
{ TPM2_CC_Sign, "Sign" },
{ TPM2_CC_Unseal, "Unseal" },
{ TPM2_CC_PolicySigned, "PolicySigned" },
{ TPM2_CC_ContextLoad, "ContextLoad" },
{ TPM2_CC_ContextSave, "ContextSave" },
{ TPM2_CC_ECDH_KeyGen, "ECDH_KeyGen" },
{ TPM2_CC_EncryptDecrypt, "EncryptDecrypt" },
{ TPM2_CC_FlushContext, "FlushContext" },
{ TPM2_CC_LoadExternal, "LoadExternal" },
{ TPM2_CC_MakeCredential, "MakeCredential" },
{ TPM2_CC_NV_ReadPublic, "NV_ReadPublic" },
{ TPM2_CC_PolicyAuthorize, "PolicyAuthorize" },
{ TPM2_CC_PolicyAuthValue, "PolicyAuthValue" },
{ TPM2_CC_PolicyCommandCode, "PolicyCommandCode" },
{ TPM2_CC_PolicyCounterTimer, "PolicyCounterTimer" },
{ TPM2_CC_PolicyCpHash, "PolicyCpHash" },
{ TPM2_CC_PolicyLocality, "PolicyLocality" },
{ TPM2_CC_PolicyNameHash, "PolicyNameHash" },
{ TPM2_CC_PolicyOR, "PolicyOR" },
{ TPM2_CC_PolicyTicket, "PolicyTicket" },
{ TPM2_CC_ReadPublic, "ReadPublic" },
{ TPM2_CC_RSA_Encrypt, "RSA_Encrypt" },
{ TPM2_CC_StartAuthSession, "StartAuthSession" },
{ TPM2_CC_VerifySignature, "VerifySignature" },
{ TPM2_CC_ECC_Parameters, "ECC_Parameters" },
{ TPM2_CC_FirmwareRead, "FirmwareRead" },
{ TPM2_CC_GetCapability, "GetCapability" },
{ TPM2_CC_GetRandom, "GetRandom" },
{ TPM2_CC_GetTestResult, "GetTestResult" },
{ TPM2_CC_Hash, "Hash" },
{ TPM2_CC_PCR_Read, "PCR_Read" },
{ TPM2_CC_PolicyPCR, "PolicyPCR" },
{ TPM2_CC_PolicyRestart, "PolicyRestart" },
{ TPM2_CC_ReadClock, "ReadClock" },
{ TPM2_CC_PCR_Extend, "PCR_Extend" },
{ TPM2_CC_PCR_SetAuthValue, "PCR_SetAuthValue" },
{ TPM2_CC_NV_Certify, "NV_Certify" },
{ TPM2_CC_EventSequenceComplete, "EventSequenceComplete" },
{ TPM2_CC_HashSequenceStart, "HashSequenceStart" },
{ TPM2_CC_PolicyPhysicalPresence, "PolicyPhysicalPresence" },
{ TPM2_CC_PolicyDuplicationSelect, "PolicyDuplicationSelect" },
{ TPM2_CC_PolicyGetDigest, "PolicyGetDigest" },
{ TPM2_CC_TestParms, "TestParms" },
{ TPM2_CC_Commit, "Commit" },
{ TPM2_CC_PolicyPassword, "PolicyPassword" },
{ TPM2_CC_ZGen_2Phase, "ZGen_2Phase" },
{ TPM2_CC_EC_Ephemeral, "EC_Ephemeral" },
{ TPM2_CC_PolicyNvWritten, "PolicyNvWritten" },
{ TPM2_CC_PolicyTemplate, "PolicyTemplate" },
{ TPM2_CC_CreateLoaded, "CreateLoaded" },
{ TPM2_CC_PolicyAuthorizeNV, "PolicyAuthorizeNV" },
{ TPM2_CC_EncryptDecrypt2, "EncryptDecrypt2" },
{ TPM2_CC_LAST, "LAST" },
{ TPM2_CC_Vendor_TCG_Test, "Vendor_TCG_Test" },
};
const char *s = json_object_get_string(jso);
const char *str = strip_prefix(s, "TPM_", "TPM2_", "CC_", NULL);
LOG_TRACE("called for %s parsing %s", s, str);
if (str) {
for (size_t i = 0; i < sizeof(tab) / sizeof(tab[0]); i++) {
if (strcasecmp(str, &tab[i].name[0]) == 0) {
*out = tab[i].in;
return TSS2_RC_SUCCESS;
}
}
}
return ifapi_json_UINT32_deserialize(jso, out);
}
/** Deserialize a TPM2_EO json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPM2_EO_deserialize(json_object *jso, TPM2_EO *out)
{
static const struct { TPM2_EO in; const char *name; } tab[] = {
{ TPM2_EO_EQ, "EQ" },
{ TPM2_EO_NEQ, "NEQ" },
{ TPM2_EO_SIGNED_GT, "SIGNED_GT" },
{ TPM2_EO_UNSIGNED_GT, "UNSIGNED_GT" },
{ TPM2_EO_SIGNED_LT, "SIGNED_LT" },
{ TPM2_EO_UNSIGNED_LT, "UNSIGNED_LT" },
{ TPM2_EO_SIGNED_GE, "SIGNED_GE" },
{ TPM2_EO_UNSIGNED_GE, "UNSIGNED_GE" },
{ TPM2_EO_SIGNED_LE, "SIGNED_LE" },
{ TPM2_EO_UNSIGNED_LE, "UNSIGNED_LE" },
{ TPM2_EO_BITSET, "BITSET" },
{ TPM2_EO_BITCLEAR, "BITCLEAR" },
};
const char *s = json_object_get_string(jso);
const char *str = strip_prefix(s, "TPM_", "TPM2_", "EO_", NULL);
LOG_TRACE("called for %s parsing %s", s, str);
if (str) {
for (size_t i = 0; i < sizeof(tab) / sizeof(tab[0]); i++) {
if (strcasecmp(str, &tab[i].name[0]) == 0) {
*out = tab[i].in;
return TSS2_RC_SUCCESS;
}
}
}
return ifapi_json_UINT16_deserialize(jso, out);
}
/** Deserialize a TPM2_ST json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPM2_ST_deserialize(json_object *jso, TPM2_ST *out)
{
static const struct { TPM2_ST in; const char *name; } tab[] = {
{ TPM2_ST_RSP_COMMAND, "RSP_COMMAND" },
{ TPM2_ST_NULL, "NULL" },
{ TPM2_ST_NO_SESSIONS, "NO_SESSIONS" },
{ TPM2_ST_SESSIONS, "SESSIONS" },
{ TPM2_ST_ATTEST_NV, "ATTEST_NV" },
{ TPM2_ST_ATTEST_COMMAND_AUDIT, "ATTEST_COMMAND_AUDIT" },
{ TPM2_ST_ATTEST_SESSION_AUDIT, "ATTEST_SESSION_AUDIT" },
{ TPM2_ST_ATTEST_CERTIFY, "ATTEST_CERTIFY" },
{ TPM2_ST_ATTEST_QUOTE, "ATTEST_QUOTE" },
{ TPM2_ST_ATTEST_TIME, "ATTEST_TIME" },
{ TPM2_ST_ATTEST_CREATION, "ATTEST_CREATION" },
{ TPM2_ST_CREATION, "CREATION" },
{ TPM2_ST_VERIFIED, "VERIFIED" },
{ TPM2_ST_AUTH_SECRET, "AUTH_SECRET" },
{ TPM2_ST_HASHCHECK, "HASHCHECK" },
{ TPM2_ST_AUTH_SIGNED, "AUTH_SIGNED" },
{ TPM2_ST_FU_MANIFEST, "FU_MANIFEST" },
};
const char *s = json_object_get_string(jso);
const char *str = strip_prefix(s, "TPM_", "TPM2_", "ST_", NULL);
LOG_TRACE("called for %s parsing %s", s, str);
if (str) {
for (size_t i = 0; i < sizeof(tab) / sizeof(tab[0]); i++) {
if (strcasecmp(str, &tab[i].name[0]) == 0) {
*out = tab[i].in;
return TSS2_RC_SUCCESS;
}
}
}
return ifapi_json_UINT16_deserialize(jso, out);
}
/** Deserialize a TPM2_PT_PCR json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPM2_PT_PCR_deserialize(json_object *jso, TPM2_PT_PCR *out)
{
static const struct { TPM2_PT_PCR in; const char *name; } tab[] = {
{ TPM2_PT_TPM2_PCR_FIRST, "FIRST" },
{ TPM2_PT_PCR_SAVE, "SAVE" },
{ TPM2_PT_PCR_EXTEND_L0, "EXTEND_L0" },
{ TPM2_PT_PCR_RESET_L0, "RESET_L0" },
{ TPM2_PT_PCR_EXTEND_L1, "EXTEND_L1" },
{ TPM2_PT_PCR_RESET_L1, "RESET_L1" },
{ TPM2_PT_PCR_EXTEND_L2, "EXTEND_L2" },
{ TPM2_PT_PCR_RESET_L2, "RESET_L2" },
{ TPM2_PT_PCR_EXTEND_L3, "EXTEND_L3" },
{ TPM2_PT_PCR_RESET_L3, "RESET_L3" },
{ TPM2_PT_PCR_EXTEND_L4, "EXTEND_L4" },
{ TPM2_PT_PCR_RESET_L4, "RESET_L4" },
{ TPM2_PT_PCR_NO_INCREMENT, "NO_INCREMENT" },
{ TPM2_PT_PCR_DRTM_RESET, "DRTM_RESET" },
{ TPM2_PT_PCR_POLICY, "POLICY" },
{ TPM2_PT_PCR_AUTH, "AUTH" },
{ TPM2_PT_TPM2_PCR_LAST, "LAST" }
};
const char *s = json_object_get_string(jso);
const char *str = strip_prefix(s, "TPM_", "TPM2_", "PT_", "PCR_", NULL);
LOG_TRACE("called for %s parsing %s", s, str);
if (str) {
for (size_t i = 0; i < sizeof(tab) / sizeof(tab[0]); i++) {
if (strcasecmp(str, &tab[i].name[0]) == 0) {
*out = tab[i].in;
return TSS2_RC_SUCCESS;
}
}
}
return ifapi_json_UINT32_deserialize(jso, out);
}
/*** Table 26 .Definition of Types for HandlesTable ***/
/** Deserialize a TPM2_HANDLE json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPM2_HANDLE_deserialize(json_object *jso, TPM2_HANDLE *out)
{
LOG_TRACE("call");
const char *token = json_object_get_string(jso);
int64_t i64;
if (get_number(token, &i64)) {
*out = (TPM2_HANDLE) i64;
if ((int64_t)*out != i64) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
return TSS2_RC_SUCCESS;
} else {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
}
/** Deserialize a TPMA_OBJECT json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMA_OBJECT_deserialize(json_object *jso, TPMA_OBJECT *out)
{
struct { TPMA_OBJECT in; char *name; } tab[] = {
{ TPMA_OBJECT_FIXEDTPM, "fixedTPM" },
{ TPMA_OBJECT_STCLEAR, "stClear" },
{ TPMA_OBJECT_FIXEDPARENT, "fixedParent" },
{ TPMA_OBJECT_SENSITIVEDATAORIGIN, "sensitiveDataOrigin" },
{ TPMA_OBJECT_USERWITHAUTH, "userWithAuth" },
{ TPMA_OBJECT_ADMINWITHPOLICY, "adminWithPolicy" },
{ TPMA_OBJECT_NODA, "noDA" },
{ TPMA_OBJECT_ENCRYPTEDDUPLICATION, "encryptedDuplication" },
{ TPMA_OBJECT_RESTRICTED, "restricted" },
{ TPMA_OBJECT_DECRYPT, "decrypt" },
{ TPMA_OBJECT_SIGN_ENCRYPT, "sign" },
};
size_t n = sizeof(tab) / sizeof(tab[0]);
size_t i, j;
TPMI_YES_NO flag;
TSS2_RC r;
LOG_TRACE("call");
memset(out, 0, sizeof(TPMA_OBJECT));
json_type jso_type = json_object_get_type(jso);
if (jso_type == json_type_array) {
/* Cast (size_t) is necessary to support older version of libjson-c */
for (i = 0; i < (size_t)json_object_array_length(jso); i++) {
json_object *jso2 = json_object_array_get_idx(jso, i);
const char *token = strip_prefix(json_object_get_string(jso2),
"TPM_", "TPM2_", "TPMA_", "OBJECT_", NULL);
if (!token) {
LOG_ERROR("Bad object; expected array of strings.");
return TSS2_FAPI_RC_BAD_VALUE;
}
for (j = 0; j < n; j++) {
if (strcasecmp(tab[j].name, token) == 0) {
*out |= tab[j].in;
break;
}
}
if (j == n) {
LOG_ERROR("Unknown value: %s", json_object_get_string(jso2));
return TSS2_FAPI_RC_BAD_VALUE;
}
}
} else if (jso_type == json_type_object) {
json_object_object_foreach(jso, key, val) {
const char *token = strip_prefix(key,
"TPM_", "TPM2_", "TPMA_", "OBJECT_", NULL);
r = get_boolean_from_json(val, &flag);
return_if_error2(r, "Boolean value expected at key: %s", key);
for (j = 0; j < n; j++) {
if (strcasecmp(tab[j].name, token) == 0) {
if (flag)
*out |= tab[j].in;
break;
}
}
if (j == n) {
LOG_ERROR("Unknown key: %s", key);
return TSS2_FAPI_RC_BAD_VALUE;
}
}
} else {
const char *token;
token = json_object_get_string(jso);
int64_t i64;
if (!get_number(token, &i64)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
*out = (TPMA_OBJECT) i64;
if ((int64_t)*out != i64) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
return TSS2_RC_SUCCESS;
}
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMA_LOCALITY json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMA_LOCALITY_deserialize(json_object *jso, TPMA_LOCALITY *out)
{
struct { TPMA_LOCALITY in; char *name; } tab[] = {
{ TPMA_LOCALITY_TPM2_LOC_ZERO, "ZERO" },
{ TPMA_LOCALITY_TPM2_LOC_ONE, "ONE" },
{ TPMA_LOCALITY_TPM2_LOC_TWO, "TWO" },
{ TPMA_LOCALITY_TPM2_LOC_THREE, "THREE" },
{ TPMA_LOCALITY_TPM2_LOC_FOUR, "FOUR" },
};
size_t n = sizeof(tab) / sizeof(tab[0]);
size_t i, j;
TPMI_YES_NO flag;
TSS2_RC r;
LOG_TRACE("call");
memset(out, 0, sizeof(TPMA_LOCALITY));
json_type jso_type = json_object_get_type(jso);
if (jso_type == json_type_array) {
/* Cast (size_t) is necessary to support older version of libjson-c */
for (i = 0; i < (size_t)json_object_array_length(jso); i++) {
json_object *jso2 = json_object_array_get_idx(jso, i);
const char *token = strip_prefix(json_object_get_string(jso2),
"TPM_", "TPM2_", "TPMA_", "LOCALITY_",
"TPM2_", "LOC_", NULL);
if (!token) {
LOG_ERROR("Bad object; expected array of strings.");
return TSS2_FAPI_RC_BAD_VALUE;
}
for (j = 0; j < n; j++) {
if (strcasecmp(tab[j].name, token) == 0) {
*out |= tab[j].in;
break;
}
}
if (j == n) {
LOG_ERROR("Unknown value: %s", json_object_get_string(jso2));
return TSS2_FAPI_RC_BAD_VALUE;
}
}
} else if (jso_type == json_type_object) {
json_object_object_foreach(jso, key, val) {
const char *token = strip_prefix(key,
"TPM_", "TPM2_", "TPMA_", "LOCALITY_",
"TPM2_", "LOC_", NULL);
if (strcasecmp(token, "extended") == 0) {
int64_t i64;
if (!get_number(json_object_get_string(val), &i64)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
if (((i64<<5) & ~TPMA_LOCALITY_EXTENDED_MASK) != 0) {
LOG_ERROR("Bad value for extended");
return TSS2_FAPI_RC_BAD_VALUE;
}
*out |= (TPMA_LOCALITY)(i64<<5);
continue;
}
r = get_boolean_from_json(val, &flag);
return_if_error2(r, "Boolean value expected at key: %s", key);
for (j = 0; j < n; j++) {
if (strcasecmp(tab[j].name, token) == 0) {
if (flag)
*out |= tab[j].in;
break;
}
}
if (j == n) {
LOG_ERROR("Unknown key: %s", key);
return TSS2_FAPI_RC_BAD_VALUE;
}
}
} else {
const char *token;
token = json_object_get_string(jso);
int64_t i64;
if (!get_number(token, &i64)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
*out = (TPMA_LOCALITY) i64;
if ((int64_t)*out != i64) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
return TSS2_RC_SUCCESS;
}
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMI_YES_NO json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMI_YES_NO_deserialize(json_object *jso, TPMI_YES_NO *out)
{
static const struct { TPMI_YES_NO in; const char *name; } tab[] = {
{ NO, "NO" },
{ YES, "YES" },
};
const char *s = json_object_get_string(jso);
const char *str = strip_prefix(s, "TPM_", "TPM2_", "TPMI_", NULL);
LOG_TRACE("called for %s parsing %s", s, str);
if (str) {
for (size_t i = 0; i < sizeof(tab) / sizeof(tab[0]); i++) {
if (strcasecmp(str, &tab[i].name[0]) == 0) {
*out = tab[i].in;
return TSS2_RC_SUCCESS;
}
}
}
return ifapi_json_BYTE_deserialize(jso, out);
}
/** Deserialize a TPMI_RH_HIERARCHY json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMI_RH_HIERARCHY_deserialize(json_object *jso,
TPMI_RH_HIERARCHY *out)
{
static const struct { TPMI_RH_HIERARCHY in; const char *name; } tab[] = {
{ TPM2_RH_OWNER, "OWNER" },
{ TPM2_RH_PLATFORM, "PLATFORM" },
{ TPM2_RH_ENDORSEMENT, "ENDORSEMENT" },
{ TPM2_RH_NULL, "NULL" },
};
const char *s = json_object_get_string(jso);
const char *str = strip_prefix(s, "TPM_", "TPM2_", "TPMI_", "RH_", "HIERARCHY_", NULL);
LOG_TRACE("called for %s parsing %s", s, str);
if (str) {
for (size_t i = 0; i < sizeof(tab) / sizeof(tab[0]); i++) {
if (strcasecmp(str, &tab[i].name[0]) == 0) {
*out = tab[i].in;
return TSS2_RC_SUCCESS;
}
}
}
return ifapi_json_UINT32_deserialize(jso, out);
}
/** Deserialize a TPMI_RH_NV_INDEX json object.
*
* @retval TSS2_FAPI_RC_BAD_VALUE if an invalid value was passed into
* the function.
*/
TSS2_RC
ifapi_json_TPMI_RH_NV_INDEX_deserialize(json_object *jso, TPMI_RH_NV_INDEX *out)
{
return ifapi_json_TPM2_HANDLE_deserialize(jso, out);
}
/** Deserialize a TPMI_ALG_HASH json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMI_ALG_HASH_deserialize(json_object *jso, TPMI_ALG_HASH *out)
{
SUBTYPE_FILTER(TPMI_ALG_HASH, TPM2_ALG_ID,
TPM2_ALG_SHA1, TPM2_ALG_SHA256, TPM2_ALG_SHA384, TPM2_ALG_SHA512, TPM2_ALG_NULL);
}
/** Deserialize a TPMI_ALG_SYM json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMI_ALG_SYM_deserialize(json_object *jso, TPMI_ALG_SYM *out)
{
SUBTYPE_FILTER(TPMI_ALG_SYM, TPM2_ALG_ID,
TPM2_ALG_AES, TPM2_ALG_XOR, TPM2_ALG_NULL);
}
/** Deserialize a TPMI_ALG_SYM_OBJECT json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMI_ALG_SYM_OBJECT_deserialize(json_object *jso,
TPMI_ALG_SYM_OBJECT *out)
{
SUBTYPE_FILTER(TPMI_ALG_SYM_OBJECT, TPM2_ALG_ID,
TPM2_ALG_AES, TPM2_ALG_NULL);
}
/** Deserialize a TPMI_ALG_SYM_MODE json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMI_ALG_SYM_MODE_deserialize(json_object *jso,
TPMI_ALG_SYM_MODE *out)
{
SUBTYPE_FILTER(TPMI_ALG_SYM_MODE, TPM2_ALG_ID,
TPM2_ALG_CTR, TPM2_ALG_OFB, TPM2_ALG_CBC, TPM2_ALG_CFB, TPM2_ALG_ECB, TPM2_ALG_NULL);
}
/** Deserialize a TPMI_ALG_KDF json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMI_ALG_KDF_deserialize(json_object *jso, TPMI_ALG_KDF *out)
{
SUBTYPE_FILTER(TPMI_ALG_KDF, TPM2_ALG_ID,
TPM2_ALG_MGF1, TPM2_ALG_KDF1_SP800_56A, TPM2_ALG_KDF1_SP800_108, TPM2_ALG_NULL);
}
/** Deserialize a TPMI_ALG_SIG_SCHEME json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMI_ALG_SIG_SCHEME_deserialize(json_object *jso,
TPMI_ALG_SIG_SCHEME *out)
{
SUBTYPE_FILTER(TPMI_ALG_SIG_SCHEME, TPM2_ALG_ID,
TPM2_ALG_RSASSA, TPM2_ALG_RSAPSS, TPM2_ALG_ECDSA, TPM2_ALG_ECDAA, TPM2_ALG_SM2,
TPM2_ALG_ECSCHNORR, TPM2_ALG_HMAC, TPM2_ALG_NULL);
}
/** Deserialize a TPMU_HA json object.
*
* This functions expects the Bitfield to be encoded as unsigned int in host-endianess.
* @param[in] selector The type of the HA object.
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMU_HA_deserialize(
UINT32 selector,
json_object *jso,
TPMU_HA *out)
{
UINT16 size;
UINT16 hash_size;
uint8_t *buffer;
TSS2_RC r;
LOG_TRACE("call");
switch (selector) {
case TPM2_ALG_SHA1:
hash_size = TPM2_SHA1_DIGEST_SIZE;
buffer = &out->sha1[0];
break;
case TPM2_ALG_SHA256:
hash_size = TPM2_SHA256_DIGEST_SIZE;
buffer = &out->sha256[0];
break;
case TPM2_ALG_SHA384:
hash_size = TPM2_SHA384_DIGEST_SIZE;
buffer = &out->sha384[0];
break;
case TPM2_ALG_SHA512:
hash_size = TPM2_SHA512_DIGEST_SIZE;
buffer = &out->sha512[0];
break;
case TPM2_ALG_NULL: {
return TSS2_RC_SUCCESS;
}
default:
LOG_TRACE("false");
return TSS2_FAPI_RC_BAD_VALUE;
};
r = ifapi_json_byte_deserialize(jso, hash_size, buffer, &size);
return_if_error(r, "byte serialize");
if (hash_size != size) {
return_error(TSS2_FAPI_RC_BAD_VALUE, "Wrong size of digest.");
}
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMT_HA json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMT_HA_deserialize(json_object *jso, TPMT_HA *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "hashAlg", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_HASH_deserialize(jso2, &out->hashAlg);
return_if_error(r, "BAD VALUE");
if (out->hashAlg != TPM2_ALG_NULL) {
if (!ifapi_get_sub_object(jso, "digest", &jso2)) {
LOG_ERROR("BAD VALUE");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMU_HA_deserialize(out->hashAlg, jso2, &out->digest);
return_if_error(r, "BAD VALUE");
}
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPM2B_DIGEST json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPM2B_DIGEST_deserialize(json_object *jso, TPM2B_DIGEST *out)
{
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
UINT16 size = 0;
r = ifapi_json_byte_deserialize(jso, sizeof(TPMU_HA), (BYTE *)&out->buffer,
&size);
return_if_error(r, "byte serialize");
out->size = size;
return r;
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPM2B_DATA json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPM2B_DATA_deserialize(json_object *jso, TPM2B_DATA *out)
{
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
UINT16 size = 0;
r = ifapi_json_byte_deserialize(jso, sizeof(TPMT_HA), (BYTE *)&out->buffer,
&size);
return_if_error(r, "byte serialize");
out->size = size;
return r;
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/*** Table 75 - Definition of Types for TPM2B_NONCE ***/
/** Deserialize a TPM2B_NONCE json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPM2B_NONCE_deserialize(json_object *jso, TPM2B_NONCE *out)
{
LOG_TRACE("call");
return ifapi_json_TPM2B_DIGEST_deserialize(jso, out);
}
/*** Table 77 - Definition of Types for TPM2B_OPERAND ***/
/** Deserialize a TPM2B_OPERAND json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPM2B_OPERAND_deserialize(json_object *jso, TPM2B_OPERAND *out)
{
LOG_TRACE("call");
return ifapi_json_TPM2B_DIGEST_deserialize(jso, out);
}
/** Deserialize a TPM2B_EVENT json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPM2B_EVENT_deserialize(json_object *jso, TPM2B_EVENT *out)
{
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
UINT16 size = 0;
r = ifapi_json_byte_deserialize(jso, 1024, (BYTE *)&out->buffer, &size);
return_if_error(r, "byte serialize");
out->size = size;
return r;
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPM2B_MAX_NV_BUFFER json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPM2B_MAX_NV_BUFFER_deserialize(json_object *jso,
TPM2B_MAX_NV_BUFFER *out)
{
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
UINT16 size = 0;
r = ifapi_json_byte_deserialize(jso, TPM2_MAX_NV_BUFFER_SIZE,
(BYTE *)&out->buffer, &size);
return_if_error(r, "byte serialize");
out->size = size;
return r;
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPM2B_NAME json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPM2B_NAME_deserialize(json_object *jso, TPM2B_NAME *out)
{
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
UINT16 size = 0;
r = ifapi_json_byte_deserialize(jso, sizeof(TPMU_NAME), (BYTE *)&out->name,
&size);
return_if_error(r, "byte serialize");
out->size = size;
return r;
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMT_TK_CREATION json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMT_TK_CREATION_deserialize(json_object *jso,
TPMT_TK_CREATION *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "tag", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2_ST_deserialize(jso2, &out->tag);
return_if_error(r, "BAD VALUE");
if (out != NULL && out->tag != TPM2_ST_CREATION) {
LOG_ERROR("BAD VALUE %zu != %zu", (size_t)out->tag, (size_t)TPM2_ST_CREATION);
}
if (!ifapi_get_sub_object(jso, "hierarchy", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_RH_HIERARCHY_deserialize(jso2, &out->hierarchy);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "digest", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_DIGEST_deserialize(jso2, &out->digest);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPML_DIGEST_VALUES json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPML_DIGEST_VALUES_deserialize(json_object *jso,
TPML_DIGEST_VALUES *out)
{
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
json_type jso_type = json_object_get_type(jso);
if (jso_type == json_type_array) {
if (json_object_array_length(jso) > (int)TPM2_NUM_PCR_BANKS) {
/* Cast (size_t) is necessary to support older version of libjson-c */
LOG_ERROR("Too many bytes for array (%zu > %zu)",
(size_t)json_object_array_length(jso), (size_t)TPM2_NUM_PCR_BANKS);
return TSS2_FAPI_RC_BAD_VALUE;
}
out->count = json_object_array_length(jso);
size_t i;
/* Cast (size_t) is necessary to support older version of libjson-c */
for (i = 0; i < (size_t)json_object_array_length(jso); i++) {
json_object *jso3 = json_object_array_get_idx(jso, i);
r = ifapi_json_TPMT_HA_deserialize(jso3, &out->digests[i]);
return_if_error(r, "BAD VALUE");
}
return TSS2_RC_SUCCESS;
} else {
LOG_ERROR("BAD VALUE");
return TSS2_FAPI_RC_BAD_VALUE;
}
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPML_PCR_SELECTION json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPML_PCR_SELECTION_deserialize(json_object *jso,
TPML_PCR_SELECTION *out)
{
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
json_type jso_type = json_object_get_type(jso);
if (jso_type == json_type_array) {
if (json_object_array_length(jso) > (int)TPM2_NUM_PCR_BANKS) {
/* Cast (size_t) is necessary to support older version of libjson-c */
LOG_ERROR("Too many bytes for array (%zu > %zu)",
(size_t)json_object_array_length(jso), (size_t)TPM2_NUM_PCR_BANKS);
return TSS2_FAPI_RC_BAD_VALUE;
}
out->count = json_object_array_length(jso);
size_t i;
/* Cast (size_t) is necessary to support older version of libjson-c */
for (i = 0; i < (size_t)json_object_array_length(jso); i++) {
json_object *jso3 = json_object_array_get_idx(jso, i);
r = ifapi_json_TPMS_PCR_SELECTION_deserialize(jso3, &out->pcrSelections[i]);
return_if_error(r, "BAD VALUE");
}
return TSS2_RC_SUCCESS;
} else {
LOG_ERROR("BAD VALUE");
return TSS2_FAPI_RC_BAD_VALUE;
}
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_CLOCK_INFO json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_CLOCK_INFO_deserialize(json_object *jso, TPMS_CLOCK_INFO *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "clock", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_UINT64_deserialize(jso2, &out->clock);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "resetCount", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_UINT32_deserialize(jso2, &out->resetCount);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "restartCount", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_UINT32_deserialize(jso2, &out->restartCount);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "safe", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_YES_NO_deserialize(jso2, &out->safe);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_TIME_INFO json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_TIME_INFO_deserialize(json_object *jso, TPMS_TIME_INFO *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "time", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_UINT64_deserialize(jso2, &out->time);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "clockInfo", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMS_CLOCK_INFO_deserialize(jso2, &out->clockInfo);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_TIME_ATTEST_INFO json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_TIME_ATTEST_INFO_deserialize(json_object *jso,
TPMS_TIME_ATTEST_INFO *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "time", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMS_TIME_INFO_deserialize(jso2, &out->time);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "firmwareVersion", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_UINT64_deserialize(jso2, &out->firmwareVersion);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_CERTIFY_INFO json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_CERTIFY_INFO_deserialize(json_object *jso,
TPMS_CERTIFY_INFO *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "name", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_NAME_deserialize(jso2, &out->name);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "qualifiedName", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_NAME_deserialize(jso2, &out->qualifiedName);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_QUOTE_INFO json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_QUOTE_INFO_deserialize(json_object *jso, TPMS_QUOTE_INFO *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "pcrSelect", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPML_PCR_SELECTION_deserialize(jso2, &out->pcrSelect);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "pcrDigest", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_DIGEST_deserialize(jso2, &out->pcrDigest);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_COMMAND_AUDIT_INFO json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_COMMAND_AUDIT_INFO_deserialize(json_object *jso,
TPMS_COMMAND_AUDIT_INFO *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "auditCounter", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_UINT64_deserialize(jso2, &out->auditCounter);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "digestAlg", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2_ALG_ID_deserialize(jso2, &out->digestAlg);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "auditDigest", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_DIGEST_deserialize(jso2, &out->auditDigest);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "commandDigest", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_DIGEST_deserialize(jso2, &out->commandDigest);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_SESSION_AUDIT_INFO json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SESSION_AUDIT_INFO_deserialize(json_object *jso,
TPMS_SESSION_AUDIT_INFO *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "exclusiveSession", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_YES_NO_deserialize(jso2, &out->exclusiveSession);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "sessionDigest", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_DIGEST_deserialize(jso2, &out->sessionDigest);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_CREATION_INFO json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_CREATION_INFO_deserialize(json_object *jso,
TPMS_CREATION_INFO *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "objectName", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_NAME_deserialize(jso2, &out->objectName);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "creationHash", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_DIGEST_deserialize(jso2, &out->creationHash);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_NV_CERTIFY_INFO json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_NV_CERTIFY_INFO_deserialize(json_object *jso,
TPMS_NV_CERTIFY_INFO *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "indexName", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_NAME_deserialize(jso2, &out->indexName);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "offset", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_UINT16_deserialize(jso2, &out->offset);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "nvContents", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_MAX_NV_BUFFER_deserialize(jso2, &out->nvContents);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMI_ST_ATTEST json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMI_ST_ATTEST_deserialize(json_object *jso, TPMI_ST_ATTEST *out)
{
SUBTYPE_FILTER(TPMI_ST_ATTEST, TPM2_ST,
TPM2_ST_ATTEST_CERTIFY, TPM2_ST_ATTEST_QUOTE, TPM2_ST_ATTEST_SESSION_AUDIT,
TPM2_ST_ATTEST_COMMAND_AUDIT, TPM2_ST_ATTEST_TIME, TPM2_ST_ATTEST_CREATION,
TPM2_ST_ATTEST_NV);
}
/** Deserialize a TPMU_ATTEST json object.
*
* This functions expects the Bitfield to be encoded as unsigned int in host-endianess.
* @param[in] selector The type the attest.
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMU_ATTEST_deserialize(
UINT32 selector,
json_object *jso,
TPMU_ATTEST *out)
{
LOG_TRACE("call");
switch (selector) {
case TPM2_ST_ATTEST_CERTIFY:
return ifapi_json_TPMS_CERTIFY_INFO_deserialize(jso, &out->certify);
case TPM2_ST_ATTEST_CREATION:
return ifapi_json_TPMS_CREATION_INFO_deserialize(jso, &out->creation);
case TPM2_ST_ATTEST_QUOTE:
return ifapi_json_TPMS_QUOTE_INFO_deserialize(jso, &out->quote);
case TPM2_ST_ATTEST_COMMAND_AUDIT:
return ifapi_json_TPMS_COMMAND_AUDIT_INFO_deserialize(jso, &out->commandAudit);
case TPM2_ST_ATTEST_SESSION_AUDIT:
return ifapi_json_TPMS_SESSION_AUDIT_INFO_deserialize(jso, &out->sessionAudit);
case TPM2_ST_ATTEST_TIME:
return ifapi_json_TPMS_TIME_ATTEST_INFO_deserialize(jso, &out->time);
case TPM2_ST_ATTEST_NV:
return ifapi_json_TPMS_NV_CERTIFY_INFO_deserialize(jso, &out->nv);
default:
LOG_TRACE("false");
return TSS2_FAPI_RC_BAD_VALUE;
};
}
/** Deserialize a TPMS_ATTEST json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_ATTEST_deserialize(json_object *jso, TPMS_ATTEST *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "magic", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2_GENERATED_deserialize(jso2, &out->magic);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "type", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ST_ATTEST_deserialize(jso2, &out->type);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "qualifiedSigner", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_NAME_deserialize(jso2, &out->qualifiedSigner);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "extraData", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_DATA_deserialize(jso2, &out->extraData);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "clockInfo", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMS_CLOCK_INFO_deserialize(jso2, &out->clockInfo);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "firmwareVersion", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_UINT64_deserialize(jso2, &out->firmwareVersion);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "attested", &jso2)) {
LOG_ERROR("BAD VALUE");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMU_ATTEST_deserialize(out->type, jso2, &out->attested);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMI_AES_KEY_BITS json object.
*
* @retval TSS2_FAPI_RC_BAD_VALUE if an invalid value was passed into
* the function.
*/
TSS2_RC
ifapi_json_TPMI_AES_KEY_BITS_deserialize(json_object *jso, TPMI_AES_KEY_BITS *out)
{
SUBTYPE_FILTER(TPMI_AES_KEY_BITS, UINT16,
128, 192, 256);
}
/** Deserialize a TPMU_SYM_KEY_BITS json object.
*
* This functions expects the Bitfield to be encoded as unsigned int in host-endianess.
* @param[in] selector The type the symmetric algorithm.
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMU_SYM_KEY_BITS_deserialize(
UINT32 selector,
json_object *jso,
TPMU_SYM_KEY_BITS *out)
{
LOG_TRACE("call");
switch (selector) {
case TPM2_ALG_AES:
return ifapi_json_TPMI_AES_KEY_BITS_deserialize(jso, &out->aes);
case TPM2_ALG_XOR:
return ifapi_json_TPMI_ALG_HASH_deserialize(jso, &out->exclusiveOr);
case TPM2_ALG_NULL: {
return TSS2_RC_SUCCESS;
}
default:
LOG_TRACE("false");
return TSS2_FAPI_RC_BAD_VALUE;
};
}
/** Deserialize a TPMU_SYM_MODE json object.
*
* This functions expects the Bitfield to be encoded as unsigned int in host-endianess.
* @param[in] selector The type the symmetric algorithm.
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMU_SYM_MODE_deserialize(
UINT32 selector,
json_object *jso,
TPMU_SYM_MODE *out)
{
LOG_TRACE("call");
switch (selector) {
case TPM2_ALG_AES:
return ifapi_json_TPMI_ALG_SYM_MODE_deserialize(jso, &out->aes);
case TPM2_ALG_NULL: {
return TSS2_RC_SUCCESS;
}
default:
LOG_TRACE("false");
return TSS2_FAPI_RC_BAD_VALUE;
};
}
/** Deserialize a TPMT_SYM_DEF json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMT_SYM_DEF_deserialize(json_object *jso, TPMT_SYM_DEF *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "algorithm", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_SYM_deserialize(jso2, &out->algorithm);
return_if_error(r, "BAD VALUE");
if (out->algorithm != TPM2_ALG_NULL) {
if (!ifapi_get_sub_object(jso, "keyBits", &jso2)) {
LOG_ERROR("BAD VALUE");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMU_SYM_KEY_BITS_deserialize(out->algorithm, jso2,
&out->keyBits);
return_if_error(r, "BAD VALUE");
}
if (out->algorithm != TPM2_ALG_NULL) {
if (!ifapi_get_sub_object(jso, "mode", &jso2)) {
LOG_ERROR("BAD VALUE");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMU_SYM_MODE_deserialize(out->algorithm, jso2, &out->mode);
return_if_error(r, "BAD VALUE");
}
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMT_SYM_DEF_OBJECT json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMT_SYM_DEF_OBJECT_deserialize(json_object *jso,
TPMT_SYM_DEF_OBJECT *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "algorithm", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_SYM_OBJECT_deserialize(jso2, &out->algorithm);
return_if_error(r, "BAD VALUE");
if (out->algorithm != TPM2_ALG_NULL) {
if (!ifapi_get_sub_object(jso, "keyBits", &jso2)) {
LOG_ERROR("BAD VALUE");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMU_SYM_KEY_BITS_deserialize(out->algorithm, jso2,
&out->keyBits);
return_if_error(r, "BAD VALUE");
}
if (out->algorithm != TPM2_ALG_NULL) {
if (!ifapi_get_sub_object(jso, "mode", &jso2)) {
LOG_ERROR("BAD VALUE");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMU_SYM_MODE_deserialize(out->algorithm, jso2, &out->mode);
return_if_error(r, "BAD VALUE");
}
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_SYMCIPHER_PARMS json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SYMCIPHER_PARMS_deserialize(json_object *jso,
TPMS_SYMCIPHER_PARMS *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "sym", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMT_SYM_DEF_OBJECT_deserialize(jso2, &out->sym);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_SCHEME_HASH json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SCHEME_HASH_deserialize(json_object *jso,
TPMS_SCHEME_HASH *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "hashAlg", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_HASH_deserialize(jso2, &out->hashAlg);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_SCHEME_ECDAA json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SCHEME_ECDAA_deserialize(json_object *jso,
TPMS_SCHEME_ECDAA *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "hashAlg", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_HASH_deserialize(jso2, &out->hashAlg);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "count", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_UINT16_deserialize(jso2, &out->count);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMI_ALG_KEYEDHASH_SCHEME json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMI_ALG_KEYEDHASH_SCHEME_deserialize(json_object *jso,
TPMI_ALG_KEYEDHASH_SCHEME *out)
{
SUBTYPE_FILTER(TPMI_ALG_KEYEDHASH_SCHEME, TPM2_ALG_ID,
TPM2_ALG_HMAC, TPM2_ALG_XOR, TPM2_ALG_NULL);
}
/*** Table 144 - Definition of Types for HMAC_SIG_SCHEME ***/
/** Deserialize a TPMS_SCHEME_HMAC json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SCHEME_HMAC_deserialize(json_object *jso, TPMS_SCHEME_HMAC *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_SCHEME_HASH_deserialize(jso, out);
}
/** Deserialize a TPMS_SCHEME_XOR json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SCHEME_XOR_deserialize(json_object *jso, TPMS_SCHEME_XOR *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "hashAlg", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_HASH_deserialize(jso2, &out->hashAlg);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "kdf", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_KDF_deserialize(jso2, &out->kdf);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMU_SCHEME_KEYEDHASH json object.
*
* This functions expects the Bitfield to be encoded as unsigned int in host-endianess.
* @param[in] selector The type the keyedhash scheme.
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMU_SCHEME_KEYEDHASH_deserialize(
UINT32 selector,
json_object *jso,
TPMU_SCHEME_KEYEDHASH *out)
{
LOG_TRACE("call");
switch (selector) {
case TPM2_ALG_HMAC:
return ifapi_json_TPMS_SCHEME_HMAC_deserialize(jso, &out->hmac);
case TPM2_ALG_XOR:
return ifapi_json_TPMS_SCHEME_XOR_deserialize(jso, &out->exclusiveOr);
case TPM2_ALG_NULL: {
return TSS2_RC_SUCCESS;
}
default:
LOG_TRACE("false");
return TSS2_FAPI_RC_BAD_VALUE;
};
}
/** Deserialize a TPMT_KEYEDHASH_SCHEME json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMT_KEYEDHASH_SCHEME_deserialize(json_object *jso,
TPMT_KEYEDHASH_SCHEME *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "scheme", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_KEYEDHASH_SCHEME_deserialize(jso2, &out->scheme);
return_if_error(r, "BAD VALUE");
if (out->scheme != TPM2_ALG_NULL) {
if (!ifapi_get_sub_object(jso, "details", &jso2)) {
LOG_ERROR("BAD VALUE");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMU_SCHEME_KEYEDHASH_deserialize(out->scheme, jso2,
&out->details);
return_if_error(r, "BAD VALUE");
}
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/*** Table 148 - Definition of Types for RSA Signature Schemes ***/
/** Deserialize a TPMS_SIG_SCHEME_RSASSA json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SIG_SCHEME_RSASSA_deserialize(json_object *jso,
TPMS_SIG_SCHEME_RSASSA *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_SCHEME_HASH_deserialize(jso, out);
}
/** Deserialize a TPMS_SIG_SCHEME_RSAPSS json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SIG_SCHEME_RSAPSS_deserialize(json_object *jso,
TPMS_SIG_SCHEME_RSAPSS *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_SCHEME_HASH_deserialize(jso, out);
}
/*** Table 149 - Definition of Types for ECC Signature Schemes ***/
/** Deserialize a TPMS_SIG_SCHEME_ECDSA json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SIG_SCHEME_ECDSA_deserialize(json_object *jso,
TPMS_SIG_SCHEME_ECDSA *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_SCHEME_HASH_deserialize(jso, out);
}
/** Deserialize a TPMS_SIG_SCHEME_SM2 json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SIG_SCHEME_SM2_deserialize(json_object *jso,
TPMS_SIG_SCHEME_SM2 *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_SCHEME_HASH_deserialize(jso, out);
}
/** Deserialize a TPMS_SIG_SCHEME_ECSCHNORR json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SIG_SCHEME_ECSCHNORR_deserialize(json_object *jso,
TPMS_SIG_SCHEME_ECSCHNORR *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_SCHEME_HASH_deserialize(jso, out);
}
/** Deserialize a TPMS_SIG_SCHEME_ECDAA json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SIG_SCHEME_ECDAA_deserialize(json_object *jso,
TPMS_SIG_SCHEME_ECDAA *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_SCHEME_ECDAA_deserialize(jso, out);
}
/** Deserialize a TPMU_SIG_SCHEME json object.
*
* This functions expects the Bitfield to be encoded as unsigned int in host-endianess.
* @param[in] selector The type the signature scheme.
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMU_SIG_SCHEME_deserialize(
UINT32 selector,
json_object *jso,
TPMU_SIG_SCHEME *out)
{
LOG_TRACE("call");
switch (selector) {
case TPM2_ALG_RSASSA:
return ifapi_json_TPMS_SIG_SCHEME_RSASSA_deserialize(jso, &out->rsassa);
case TPM2_ALG_RSAPSS:
return ifapi_json_TPMS_SIG_SCHEME_RSAPSS_deserialize(jso, &out->rsapss);
case TPM2_ALG_ECDSA:
return ifapi_json_TPMS_SIG_SCHEME_ECDSA_deserialize(jso, &out->ecdsa);
case TPM2_ALG_ECDAA:
return ifapi_json_TPMS_SIG_SCHEME_ECDAA_deserialize(jso, &out->ecdaa);
case TPM2_ALG_SM2:
return ifapi_json_TPMS_SIG_SCHEME_SM2_deserialize(jso, &out->sm2);
case TPM2_ALG_ECSCHNORR:
return ifapi_json_TPMS_SIG_SCHEME_ECSCHNORR_deserialize(jso, &out->ecschnorr);
case TPM2_ALG_HMAC:
return ifapi_json_TPMS_SCHEME_HMAC_deserialize(jso, &out->hmac);
case TPM2_ALG_NULL: {
return TSS2_RC_SUCCESS;
}
default:
LOG_TRACE("false");
return TSS2_FAPI_RC_BAD_VALUE;
};
}
/** Deserialize a TPMT_SIG_SCHEME json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMT_SIG_SCHEME_deserialize(json_object *jso, TPMT_SIG_SCHEME *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "scheme", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_SIG_SCHEME_deserialize(jso2, &out->scheme);
return_if_error(r, "BAD VALUE");
if (out->scheme != TPM2_ALG_NULL) {
if (!ifapi_get_sub_object(jso, "details", &jso2)) {
LOG_ERROR("BAD VALUE");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMU_SIG_SCHEME_deserialize(out->scheme, jso2, &out->details);
return_if_error(r, "BAD VALUE");
}
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/*** Table 152 - Definition of Types for Encryption Schemes ***/
/** Deserialize a TPMS_ENC_SCHEME_OAEP json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_ENC_SCHEME_OAEP_deserialize(json_object *jso,
TPMS_ENC_SCHEME_OAEP *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_SCHEME_HASH_deserialize(jso, out);
}
/** Deserialize a TPMS_ENC_SCHEME_RSAES json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMS_ENC_SCHEME_RSAES_deserialize(json_object *jso,
TPMS_ENC_SCHEME_RSAES *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_EMPTY_deserialize(jso, out);
}
/*** Table 153 - Definition of Types for ECC Key Exchange ***/
/** Deserialize a TPMS_KEY_SCHEME_ECDH json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_KEY_SCHEME_ECDH_deserialize(json_object *jso,
TPMS_KEY_SCHEME_ECDH *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_SCHEME_HASH_deserialize(jso, out);
}
/*** Table 154 - Definition of Types for KDF Schemes ***/
/** Deserialize a TPMS_SCHEME_MGF1 json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SCHEME_MGF1_deserialize(json_object *jso, TPMS_SCHEME_MGF1 *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_SCHEME_HASH_deserialize(jso, out);
}
/** Deserialize a TPMS_SCHEME_KDF1_SP800_56A json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SCHEME_KDF1_SP800_56A_deserialize(json_object *jso,
TPMS_SCHEME_KDF1_SP800_56A *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_SCHEME_HASH_deserialize(jso, out);
}
/** Deserialize a TPMS_SCHEME_KDF1_SP800_108 json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SCHEME_KDF1_SP800_108_deserialize(json_object *jso,
TPMS_SCHEME_KDF1_SP800_108 *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_SCHEME_HASH_deserialize(jso, out);
}
/** Deserialize a TPMU_KDF_SCHEME json object.
*
* This functions expects the Bitfield to be encoded as unsigned int in host-endianess.
* @param[in] selector The type the KDF scheme.
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMU_KDF_SCHEME_deserialize(
UINT32 selector,
json_object *jso,
TPMU_KDF_SCHEME *out)
{
LOG_TRACE("call");
switch (selector) {
case TPM2_ALG_MGF1:
return ifapi_json_TPMS_SCHEME_MGF1_deserialize(jso, &out->mgf1);
case TPM2_ALG_KDF1_SP800_56A:
return ifapi_json_TPMS_SCHEME_KDF1_SP800_56A_deserialize(jso,
&out->kdf1_sp800_56a);
case TPM2_ALG_KDF1_SP800_108:
return ifapi_json_TPMS_SCHEME_KDF1_SP800_108_deserialize(jso,
&out->kdf1_sp800_108);
case TPM2_ALG_NULL: {
return TSS2_RC_SUCCESS;
}
default:
LOG_TRACE("false");
return TSS2_FAPI_RC_BAD_VALUE;
};
}
/** Deserialize a TPMT_KDF_SCHEME json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMT_KDF_SCHEME_deserialize(json_object *jso, TPMT_KDF_SCHEME *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "scheme", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_KDF_deserialize(jso2, &out->scheme);
return_if_error(r, "BAD VALUE");
if (out->scheme != TPM2_ALG_NULL) {
if (!ifapi_get_sub_object(jso, "details", &jso2)) {
LOG_ERROR("BAD VALUE");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMU_KDF_SCHEME_deserialize(out->scheme, jso2, &out->details);
return_if_error(r, "BAD VALUE");
}
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMU_ASYM_SCHEME json object.
*
* This functions expects the Bitfield to be encoded as unsigned int in host-endianess.
* @param[in] jso the json object to be deserialized.
* @param[in] selector The type the scheme.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMU_ASYM_SCHEME_deserialize(
UINT32 selector,
json_object *jso,
TPMU_ASYM_SCHEME *out)
{
LOG_TRACE("call");
switch (selector) {
case TPM2_ALG_ECDH:
return ifapi_json_TPMS_KEY_SCHEME_ECDH_deserialize(jso, &out->ecdh);
case TPM2_ALG_RSASSA:
return ifapi_json_TPMS_SIG_SCHEME_RSASSA_deserialize(jso, &out->rsassa);
case TPM2_ALG_RSAPSS:
return ifapi_json_TPMS_SIG_SCHEME_RSAPSS_deserialize(jso, &out->rsapss);
case TPM2_ALG_ECDSA:
return ifapi_json_TPMS_SIG_SCHEME_ECDSA_deserialize(jso, &out->ecdsa);
case TPM2_ALG_ECDAA:
return ifapi_json_TPMS_SIG_SCHEME_ECDAA_deserialize(jso, &out->ecdaa);
case TPM2_ALG_SM2:
return ifapi_json_TPMS_SIG_SCHEME_SM2_deserialize(jso, &out->sm2);
case TPM2_ALG_ECSCHNORR:
return ifapi_json_TPMS_SIG_SCHEME_ECSCHNORR_deserialize(jso, &out->ecschnorr);
case TPM2_ALG_RSAES:
return ifapi_json_TPMS_ENC_SCHEME_RSAES_deserialize(jso, &out->rsaes);
case TPM2_ALG_OAEP:
return ifapi_json_TPMS_ENC_SCHEME_OAEP_deserialize(jso, &out->oaep);
case TPM2_ALG_NULL: {
return TSS2_RC_SUCCESS;
}
default:
LOG_TRACE("false");
return TSS2_FAPI_RC_BAD_VALUE;
};
}
/** Deserialize a TPMI_ALG_RSA_SCHEME json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMI_ALG_RSA_SCHEME_deserialize(json_object *jso,
TPMI_ALG_RSA_SCHEME *out)
{
SUBTYPE_FILTER(TPMI_ALG_RSA_SCHEME, TPM2_ALG_ID,
TPM2_ALG_RSAES, TPM2_ALG_OAEP, TPM2_ALG_RSASSA, TPM2_ALG_RSAPSS, TPM2_ALG_NULL);
}
/** Deserialize a TPMT_RSA_SCHEME json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMT_RSA_SCHEME_deserialize(json_object *jso, TPMT_RSA_SCHEME *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "scheme", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_RSA_SCHEME_deserialize(jso2, &out->scheme);
return_if_error(r, "BAD VALUE");
if (out->scheme != TPM2_ALG_NULL) {
if (!ifapi_get_sub_object(jso, "details", &jso2)) {
LOG_ERROR("BAD VALUE");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMU_ASYM_SCHEME_deserialize(out->scheme, jso2, &out->details);
return_if_error(r, "BAD VALUE");
}
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMI_ALG_RSA_DECRYPT json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMI_ALG_RSA_DECRYPT_deserialize(json_object *jso,
TPMI_ALG_RSA_DECRYPT *out)
{
SUBTYPE_FILTER(TPMI_ALG_RSA_DECRYPT, TPM2_ALG_ID,
TPM2_ALG_RSAES, TPM2_ALG_OAEP, TPM2_ALG_NULL);
}
/** Deserialize a TPMT_RSA_DECRYPT json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMT_RSA_DECRYPT_deserialize(json_object *jso,
TPMT_RSA_DECRYPT *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "scheme", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_RSA_DECRYPT_deserialize(jso2, &out->scheme);
return_if_error(r, "BAD VALUE");
if (out->scheme != TPM2_ALG_NULL) {
if (!ifapi_get_sub_object(jso, "details", &jso2)) {
LOG_ERROR("BAD VALUE");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMU_ASYM_SCHEME_deserialize(out->scheme, jso2, &out->details);
return_if_error(r, "BAD VALUE");
}
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPM2B_PUBLIC_KEY_RSA json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPM2B_PUBLIC_KEY_RSA_deserialize(json_object *jso,
TPM2B_PUBLIC_KEY_RSA *out)
{
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
UINT16 size = 0;
r = ifapi_json_byte_deserialize(jso, TPM2_MAX_RSA_KEY_BYTES,
(BYTE *)&out->buffer, &size);
return_if_error(r, "byte serialize");
out->size = size;
return r;
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMI_RSA_KEY_BITS json object.
*
* @retval TSS2_FAPI_RC_BAD_VALUE if an invalid value was passed into
* the function.
*/
TSS2_RC
ifapi_json_TPMI_RSA_KEY_BITS_deserialize(json_object *jso,
TPMI_RSA_KEY_BITS *out)
{
SUBTYPE_FILTER(TPMI_RSA_KEY_BITS, UINT16,
1024, 2048);
}
/** Deserialize a TPM2B_ECC_PARAMETER json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPM2B_ECC_PARAMETER_deserialize(json_object *jso,
TPM2B_ECC_PARAMETER *out)
{
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
UINT16 size = 0;
r = ifapi_json_byte_deserialize(jso, TPM2_MAX_ECC_KEY_BYTES,
(BYTE *)&out->buffer, &size);
return_if_error(r, "byte serialize");
out->size = size;
return r;
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_ECC_POINT json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_ECC_POINT_deserialize(json_object *jso, TPMS_ECC_POINT *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "x", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_ECC_PARAMETER_deserialize(jso2, &out->x);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "y", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_ECC_PARAMETER_deserialize(jso2, &out->y);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMI_ALG_ECC_SCHEME json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMI_ALG_ECC_SCHEME_deserialize(json_object *jso,
TPMI_ALG_ECC_SCHEME *out)
{
SUBTYPE_FILTER(TPMI_ALG_ECC_SCHEME, TPM2_ALG_ID,
TPM2_ALG_ECDSA, TPM2_ALG_ECDAA, TPM2_ALG_SM2, TPM2_ALG_ECSCHNORR,
TPM2_ALG_ECDH, TPM2_ALG_NULL);
}
/** Deserialize a TPMI_ECC_CURVE json object.
*
* @retval TSS2_FAPI_RC_BAD_VALUE if an invalid value was passed into
* the function.
*/
TSS2_RC
ifapi_json_TPMI_ECC_CURVE_deserialize(json_object *jso, TPMI_ECC_CURVE *out)
{
SUBTYPE_FILTER(TPMI_ECC_CURVE, TPM2_ECC_CURVE,
TPM2_ECC_NONE, TPM2_ECC_NIST_P192, TPM2_ECC_NIST_P224, TPM2_ECC_NIST_P256,
TPM2_ECC_NIST_P384, TPM2_ECC_NIST_P521, TPM2_ECC_BN_P256, TPM2_ECC_BN_P638,
TPM2_ECC_SM2_P256);
}
/** Deserialize a TPMT_ECC_SCHEME json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMT_ECC_SCHEME_deserialize(json_object *jso, TPMT_ECC_SCHEME *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "scheme", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_ECC_SCHEME_deserialize(jso2, &out->scheme);
return_if_error(r, "BAD VALUE");
if (out->scheme != TPM2_ALG_NULL) {
if (!ifapi_get_sub_object(jso, "details", &jso2)) {
LOG_ERROR("BAD VALUE");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMU_ASYM_SCHEME_deserialize(out->scheme, jso2, &out->details);
return_if_error(r, "BAD VALUE");
}
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_SIGNATURE_RSA json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SIGNATURE_RSA_deserialize(json_object *jso,
TPMS_SIGNATURE_RSA *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "hash", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_HASH_deserialize(jso2, &out->hash);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "sig", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_PUBLIC_KEY_RSA_deserialize(jso2, &out->sig);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/*** Table 175 - Definition of Types for Signature ***/
/** Deserialize a TPMS_SIGNATURE_RSASSA json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SIGNATURE_RSASSA_deserialize(json_object *jso,
TPMS_SIGNATURE_RSASSA *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_SIGNATURE_RSA_deserialize(jso, out);
}
/** Deserialize a TPMS_SIGNATURE_RSAPSS json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SIGNATURE_RSAPSS_deserialize(json_object *jso,
TPMS_SIGNATURE_RSAPSS *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_SIGNATURE_RSA_deserialize(jso, out);
}
/** Deserialize a TPMS_SIGNATURE_ECC json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SIGNATURE_ECC_deserialize(json_object *jso,
TPMS_SIGNATURE_ECC *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "hash", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_HASH_deserialize(jso2, &out->hash);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "signatureR", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_ECC_PARAMETER_deserialize(jso2, &out->signatureR);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "signatureS", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_ECC_PARAMETER_deserialize(jso2, &out->signatureS);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/*** Table 177 - Definition of Types for TPMS_SIGNATURE_ECC ***/
/** Deserialize a TPMS_SIGNATURE_ECDSA json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SIGNATURE_ECDSA_deserialize(json_object *jso,
TPMS_SIGNATURE_ECDSA *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_SIGNATURE_ECC_deserialize(jso, out);
}
/** Deserialize a TPMS_SIGNATURE_ECDAA json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SIGNATURE_ECDAA_deserialize(json_object *jso,
TPMS_SIGNATURE_ECDAA *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_SIGNATURE_ECC_deserialize(jso, out);
}
/** Deserialize a TPMS_SIGNATURE_SM2 json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SIGNATURE_SM2_deserialize(json_object *jso,
TPMS_SIGNATURE_SM2 *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_SIGNATURE_ECC_deserialize(jso, out);
}
/** Deserialize a TPMS_SIGNATURE_ECSCHNORR json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_SIGNATURE_ECSCHNORR_deserialize(json_object *jso,
TPMS_SIGNATURE_ECSCHNORR *out)
{
LOG_TRACE("call");
return ifapi_json_TPMS_SIGNATURE_ECC_deserialize(jso, out);
}
/** Deserialize a TPMU_SIGNATURE json object.
*
* This functions expects the Bitfield to be encoded as unsigned int in host-endianess.
* @param[in] selector The type the signature.
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMU_SIGNATURE_deserialize(
UINT32 selector,
json_object *jso,
TPMU_SIGNATURE *out)
{
LOG_TRACE("call");
switch (selector) {
case TPM2_ALG_RSASSA:
return ifapi_json_TPMS_SIGNATURE_RSASSA_deserialize(jso, &out->rsassa);
case TPM2_ALG_RSAPSS:
return ifapi_json_TPMS_SIGNATURE_RSAPSS_deserialize(jso, &out->rsapss);
case TPM2_ALG_ECDSA:
return ifapi_json_TPMS_SIGNATURE_ECDSA_deserialize(jso, &out->ecdsa);
case TPM2_ALG_ECDAA:
return ifapi_json_TPMS_SIGNATURE_ECDAA_deserialize(jso, &out->ecdaa);
case TPM2_ALG_SM2:
return ifapi_json_TPMS_SIGNATURE_SM2_deserialize(jso, &out->sm2);
case TPM2_ALG_ECSCHNORR:
return ifapi_json_TPMS_SIGNATURE_ECSCHNORR_deserialize(jso, &out->ecschnorr);
case TPM2_ALG_HMAC:
return ifapi_json_TPMT_HA_deserialize(jso, &out->hmac);
case TPM2_ALG_NULL: {
return TSS2_RC_SUCCESS;
}
default:
LOG_TRACE("false");
return TSS2_FAPI_RC_BAD_VALUE;
};
}
/** Deserialize a TPMT_SIGNATURE json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMT_SIGNATURE_deserialize(json_object *jso, TPMT_SIGNATURE *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "sigAlg", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_SIG_SCHEME_deserialize(jso2, &out->sigAlg);
return_if_error(r, "BAD VALUE");
if (out->sigAlg != TPM2_ALG_NULL) {
if (!ifapi_get_sub_object(jso, "signature", &jso2)) {
LOG_ERROR("BAD VALUE");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMU_SIGNATURE_deserialize(out->sigAlg, jso2, &out->signature);
return_if_error(r, "BAD VALUE");
}
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPM2B_ENCRYPTED_SECRET json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPM2B_ENCRYPTED_SECRET_deserialize(json_object *jso,
TPM2B_ENCRYPTED_SECRET *out)
{
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
UINT16 size = 0;
r = ifapi_json_byte_deserialize(jso, sizeof(TPMU_ENCRYPTED_SECRET),
(BYTE *)&out->secret, &size);
return_if_error(r, "byte serialize");
out->size = size;
return r;
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMI_ALG_PUBLIC json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
*/
TSS2_RC
ifapi_json_TPMI_ALG_PUBLIC_deserialize(json_object *jso, TPMI_ALG_PUBLIC *out)
{
SUBTYPE_FILTER(TPMI_ALG_PUBLIC, TPM2_ALG_ID,
TPM2_ALG_RSA, TPM2_ALG_KEYEDHASH, TPM2_ALG_ECC, TPM2_ALG_SYMCIPHER, TPM2_ALG_NULL);
}
/** Deserialize a TPMU_PUBLIC_ID json object.
*
* This functions expects the Bitfield to be encoded as unsigned int in host-endianess.
* @param[in] selector The type the public ID.
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMU_PUBLIC_ID_deserialize(
UINT32 selector,
json_object *jso,
TPMU_PUBLIC_ID *out)
{
LOG_TRACE("call");
switch (selector) {
case TPM2_ALG_KEYEDHASH:
return ifapi_json_TPM2B_DIGEST_deserialize(jso, &out->keyedHash);
case TPM2_ALG_SYMCIPHER:
return ifapi_json_TPM2B_DIGEST_deserialize(jso, &out->sym);
case TPM2_ALG_RSA:
return ifapi_json_TPM2B_PUBLIC_KEY_RSA_deserialize(jso, &out->rsa);
case TPM2_ALG_ECC:
return ifapi_json_TPMS_ECC_POINT_deserialize(jso, &out->ecc);
default:
LOG_TRACE("false");
return TSS2_FAPI_RC_BAD_VALUE;
};
}
/** Deserialize a TPMS_KEYEDHASH_PARMS json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_KEYEDHASH_PARMS_deserialize(json_object *jso,
TPMS_KEYEDHASH_PARMS *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "scheme", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMT_KEYEDHASH_SCHEME_deserialize(jso2, &out->scheme);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_RSA_PARMS json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_RSA_PARMS_deserialize(json_object *jso, TPMS_RSA_PARMS *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "symmetric", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMT_SYM_DEF_OBJECT_deserialize(jso2, &out->symmetric);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "scheme", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMT_RSA_SCHEME_deserialize(jso2, &out->scheme);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "keyBits", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_RSA_KEY_BITS_deserialize(jso2, &out->keyBits);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "exponent", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_UINT32_deserialize(jso2, &out->exponent);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_ECC_PARMS json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_ECC_PARMS_deserialize(json_object *jso, TPMS_ECC_PARMS *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "symmetric", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMT_SYM_DEF_OBJECT_deserialize(jso2, &out->symmetric);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "scheme", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMT_ECC_SCHEME_deserialize(jso2, &out->scheme);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "curveID", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ECC_CURVE_deserialize(jso2, &out->curveID);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "kdf", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMT_KDF_SCHEME_deserialize(jso2, &out->kdf);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMU_PUBLIC_PARMS json object.
*
* This functions expects the Bitfield to be encoded as unsigned int in host-endianess.
* @param[in] selector The type the public params.
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMU_PUBLIC_PARMS_deserialize(
UINT32 selector,
json_object *jso,
TPMU_PUBLIC_PARMS *out)
{
LOG_TRACE("call");
switch (selector) {
case TPM2_ALG_KEYEDHASH:
return ifapi_json_TPMS_KEYEDHASH_PARMS_deserialize(jso, &out->keyedHashDetail);
case TPM2_ALG_SYMCIPHER:
return ifapi_json_TPMS_SYMCIPHER_PARMS_deserialize(jso, &out->symDetail);
case TPM2_ALG_RSA:
return ifapi_json_TPMS_RSA_PARMS_deserialize(jso, &out->rsaDetail);
case TPM2_ALG_ECC:
return ifapi_json_TPMS_ECC_PARMS_deserialize(jso, &out->eccDetail);
default:
LOG_TRACE("false");
return TSS2_FAPI_RC_BAD_VALUE;
};
}
/** Deserialize a TPMT_PUBLIC json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMT_PUBLIC_deserialize(json_object *jso, TPMT_PUBLIC *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "type", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_PUBLIC_deserialize(jso2, &out->type);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "nameAlg", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_HASH_deserialize(jso2, &out->nameAlg);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "objectAttributes", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMA_OBJECT_deserialize(jso2, &out->objectAttributes);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "authPolicy", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_DIGEST_deserialize(jso2, &out->authPolicy);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "parameters", &jso2)) {
LOG_ERROR("BAD VALUE");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMU_PUBLIC_PARMS_deserialize(out->type, jso2, &out->parameters);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "unique", &jso2)) {
LOG_ERROR("BAD VALUE");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMU_PUBLIC_ID_deserialize(out->type, jso2, &out->unique);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPM2B_PUBLIC json object.
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPM2B_PUBLIC_deserialize(json_object *jso, TPM2B_PUBLIC *out)
{
json_object *jso2;
TSS2_RC res;
LOG_TRACE("call");
if (!ifapi_get_sub_object(jso, "size", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
res = ifapi_json_UINT16_deserialize(jso2, &out->size);
return_if_error(res, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "publicArea", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
res = ifapi_json_TPMT_PUBLIC_deserialize(jso2, &out->publicArea);
return_if_error(res, "BAD VALUE");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPM2B_PRIVATE json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPM2B_PRIVATE_deserialize(json_object *jso, TPM2B_PRIVATE *out)
{
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
UINT16 size = 0;
r = ifapi_json_byte_deserialize(jso, sizeof(_PRIVATE), (BYTE *)&out->buffer,
&size);
return_if_error(r, "byte serialize");
out->size = size;
return r;
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPM2_NT json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPM2_NT_deserialize(json_object *jso, TPM2_NT *out)
{
static const struct { TPM2_NT in; const char *name; } tab[] = {
{ TPM2_NT_ORDINARY, "ORDINARY" },
{ TPM2_NT_COUNTER, "COUNTER" },
{ TPM2_NT_BITS, "BITS" },
{ TPM2_NT_EXTEND, "EXTEND" },
{ TPM2_NT_PIN_FAIL, "PIN_FAIL" },
{ TPM2_NT_PIN_PASS, "PIN_PASS" },
};
const char *s = json_object_get_string(jso);
const char *str = strip_prefix(s, "TPM_", "TPM2_", "NT_", NULL);
LOG_TRACE("called for %s parsing %s", s, str);
if (str) {
for (size_t i = 0; i < sizeof(tab) / sizeof(tab[0]); i++) {
if (strcasecmp(str, &tab[i].name[0]) == 0) {
*out = tab[i].in;
return TSS2_RC_SUCCESS;
}
}
}
return ifapi_json_UINT8_deserialize(jso, out);
}
/** Deserialize a TPMA_NV json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMA_NV_deserialize(json_object *jso, TPMA_NV *out)
{
struct { TPMA_NV in; char *name; } tab[] = {
{ TPMA_NV_PPWRITE, "PPWRITE" },
{ TPMA_NV_OWNERWRITE, "OWNERWRITE" },
{ TPMA_NV_AUTHWRITE, "AUTHWRITE" },
{ TPMA_NV_POLICYWRITE, "POLICYWRITE" },
{ TPMA_NV_POLICY_DELETE, "POLICY_DELETE" },
{ TPMA_NV_WRITELOCKED, "WRITELOCKED" },
{ TPMA_NV_WRITEALL, "WRITEALL" },
{ TPMA_NV_WRITEDEFINE, "WRITEDEFINE" },
{ TPMA_NV_WRITE_STCLEAR, "WRITE_STCLEAR" },
{ TPMA_NV_GLOBALLOCK, "GLOBALLOCK" },
{ TPMA_NV_PPREAD, "PPREAD" },
{ TPMA_NV_OWNERREAD, "OWNERREAD" },
{ TPMA_NV_AUTHREAD, "AUTHREAD" },
{ TPMA_NV_POLICYREAD, "POLICYREAD" },
{ TPMA_NV_NO_DA, "NO_DA" },
{ TPMA_NV_ORDERLY, "ORDERLY" },
{ TPMA_NV_CLEAR_STCLEAR, "CLEAR_STCLEAR" },
{ TPMA_NV_READLOCKED, "READLOCKED" },
{ TPMA_NV_WRITTEN, "WRITTEN" },
{ TPMA_NV_PLATFORMCREATE, "PLATFORMCREATE" },
{ TPMA_NV_READ_STCLEAR, "READ_STCLEAR" },
{ TPM2_NT_ORDINARY << 4, "ORDINARY" },
{ TPM2_NT_COUNTER << 4, "COUNTER" },
{ TPM2_NT_BITS << 4, "BITS" },
{ TPM2_NT_EXTEND << 4, "EXTEND" },
{ TPM2_NT_PIN_FAIL << 4, "PIN_FAIL" },
{ TPM2_NT_PIN_PASS << 4, "PIN_PASS" },
};
size_t n = sizeof(tab) / sizeof(tab[0]);
size_t i, j;
TPMI_YES_NO flag;
TSS2_RC r;
LOG_TRACE("call");
memset(out, 0, sizeof(TPMA_NV));
json_type jso_type = json_object_get_type(jso);
if (jso_type == json_type_array) {
/* Cast (size_t) is necessary to support older version of libjson-c */
for (i = 0; i < (size_t)json_object_array_length(jso); i++) {
json_object *jso2 = json_object_array_get_idx(jso, i);
if (json_object_get_type(jso2) == json_type_object) {
if (!json_object_object_get_ex(jso2, "TPM2_NT", &jso2)) {
LOG_ERROR("Found object in array without TPM2_NT");
return TSS2_FAPI_RC_BAD_VALUE;
}
TPM2_NT out2;
TSS2_RC r = ifapi_json_TPM2_NT_deserialize(jso2, &out2);
return_if_error(r, "Bad value");
*out |= out2 << 4;
continue;
}
const char *token = strip_prefix(json_object_get_string(jso2),
"TPM_", "TPM2_", "TPMA_", "NV_",
"TPM2_", "NT_", NULL);
if (!token) {
LOG_ERROR("Bad object; expected array of strings.");
return TSS2_FAPI_RC_BAD_VALUE;
}
for (j = 0; j < n; j++) {
if (strcasecmp(tab[j].name, token) == 0) {
*out |= tab[j].in;
break;
}
}
if (j == n) {
LOG_ERROR("Unknown value: %s", json_object_get_string(jso2));
return TSS2_FAPI_RC_BAD_VALUE;
}
}
} else if (jso_type == json_type_object) {
json_object_object_foreach(jso, key, val) {
const char *token = strip_prefix(key, "TPM_", "TPM2_", "TPMA_", "NV_", "TPM2_", NULL);
if (strcasecmp(token, "NT") == 0) {
TPM2_NT out2;
TSS2_RC r = ifapi_json_TPM2_NT_deserialize(val, &out2);
return_if_error(r, "Bad value");
*out |= out2 << 4;
continue;
}
token = strip_prefix(token, "NT_", NULL);
r = get_boolean_from_json(val, &flag);
return_if_error2(r, "Boolean value expected at key: %s", key);
for (j = 0; j < n; j++) {
if (strcasecmp(tab[j].name, token) == 0) {
if (flag)
*out |= tab[j].in;
break;
}
}
if (j == n) {
LOG_ERROR("Unknown key: %s", key);
return TSS2_FAPI_RC_BAD_VALUE;
}
}
} else {
const char *token;
token = json_object_get_string(jso);
int64_t i64;
if (!get_number(token, &i64)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
*out = (TPMA_NV) i64;
if ((int64_t)*out != i64) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
return TSS2_RC_SUCCESS;
}
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_NV_PUBLIC json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_NV_PUBLIC_deserialize(json_object *jso, TPMS_NV_PUBLIC *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "nvIndex", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_RH_NV_INDEX_deserialize(jso2, &out->nvIndex);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "nameAlg", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMI_ALG_HASH_deserialize(jso2, &out->nameAlg);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "attributes", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMA_NV_deserialize(jso2, &out->attributes);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "authPolicy", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_DIGEST_deserialize(jso2, &out->authPolicy);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "dataSize", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_UINT16_deserialize(jso2, &out->dataSize);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPM2B_NV_PUBLIC json object.
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPM2B_NV_PUBLIC_deserialize(json_object *jso, TPM2B_NV_PUBLIC *out)
{
json_object *jso2;
TSS2_RC res;
LOG_TRACE("call");
if (!ifapi_get_sub_object(jso, "size", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
res = ifapi_json_UINT16_deserialize(jso2, &out->size);
return_if_error(res, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "nvPublic", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
res = ifapi_json_TPMS_NV_PUBLIC_deserialize(jso2, &out->nvPublic);
return_if_error(res, "BAD VALUE");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPMS_CREATION_DATA json object.
*
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPMS_CREATION_DATA_deserialize(json_object *jso,
TPMS_CREATION_DATA *out)
{
json_object *jso2;
TSS2_RC r;
LOG_TRACE("call");
return_if_null(out, "Bad reference.", TSS2_FAPI_RC_BAD_REFERENCE);
if (!ifapi_get_sub_object(jso, "pcrSelect", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPML_PCR_SELECTION_deserialize(jso2, &out->pcrSelect);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "pcrDigest", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_DIGEST_deserialize(jso2, &out->pcrDigest);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "locality", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPMA_LOCALITY_deserialize(jso2, &out->locality);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "parentNameAlg", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2_ALG_ID_deserialize(jso2, &out->parentNameAlg);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "parentName", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_NAME_deserialize(jso2, &out->parentName);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "parentQualifiedName", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_NAME_deserialize(jso2, &out->parentQualifiedName);
return_if_error(r, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "outsideInfo", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
r = ifapi_json_TPM2B_DATA_deserialize(jso2, &out->outsideInfo);
return_if_error(r, "BAD VALUE");
LOG_TRACE("true");
return TSS2_RC_SUCCESS;
}
/** Deserialize a TPM2B_CREATION_DATA json object.
* @param[in] jso the json object to be deserialized.
* @param[out] out the deserialzed binary object.
* @retval TSS2_RC_SUCCESS if the function call was a success.
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
*/
TSS2_RC
ifapi_json_TPM2B_CREATION_DATA_deserialize(json_object *jso,
TPM2B_CREATION_DATA *out)
{
json_object *jso2;
TSS2_RC res;
LOG_TRACE("call");
if (!ifapi_get_sub_object(jso, "size", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
res = ifapi_json_UINT16_deserialize(jso2, &out->size);
return_if_error(res, "BAD VALUE");
if (!ifapi_get_sub_object(jso, "creationData", &jso2)) {
LOG_ERROR("Bad value");
return TSS2_FAPI_RC_BAD_VALUE;
}
res = ifapi_json_TPMS_CREATION_DATA_deserialize(jso2, &out->creationData);
return_if_error(res, "BAD VALUE");
return TSS2_RC_SUCCESS;
}