blob: ab2340d39233e69cc1945faeb143752be8cd4b29 [file] [log] [blame]
/* SPDX-License-Identifier: BSD-2-Clause */
/*******************************************************************************
* Copyright 2017-2018, Fraunhofer SIT sponsored by Infineon Technologies AG
* All rights reserved.
*******************************************************************************/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <inttypes.h>
#include <string.h>
#include "tss2_esys.h"
#include "esys_mu.h"
#include "esys_iutil.h"
#define LOGMODULE esys
#include "util/log.h"
#include "util/aux_util.h"
/** Marshal an array of BYTE structures into a byte buffer.
*
* @param[in] in Structures to be marshaled.
* @param[in] count Number of structures to be marshaled.
* @param[in,out] buffer Buffer to write result into.
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer
* (being updated during marshaling).
* @retval TSS2_RC_SUCCESS on success.
* @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
* @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
*/
TSS2_RC
iesys_MU_BYTE_array_Marshal(
const BYTE *src,
size_t count,
uint8_t *buffer,
size_t size,
size_t *offset)
{
LOG_TRACE("called: src=%p count=%zu buffer=%p size=%zu offset=%p", src,
count, buffer, size, offset);
return_if_null(src, "src=NULL", TSS2_ESYS_RC_BAD_REFERENCE);
size_t offset_loc = (offset != NULL)? *offset : 0;
if (count > size || size - count < offset_loc) {
LOG_ERROR("not enough space in target buffer");
return TSS2_ESYS_RC_INSUFFICIENT_BUFFER;
}
if (buffer != NULL)
memcpy(&buffer[offset_loc], src, count);
offset_loc += count;
if (offset != NULL)
*offset = offset_loc;
return TSS2_RC_SUCCESS;
}
/** Unmarshal an array of BYTE structures from a byte buffer.
*
* @param[in,out] buffer Buffer to read data from.
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer
* (being updated during marshaling).
* @param[in] count Number of structures to be unmarshaled.
* @param[out] out Structures to store the result in.
* @retval TSS2_RC_SUCCESS on success.
* @retval TSS2_ESYS_RC_BAD_REFERENCE if buffer==NULL.
* @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
*/
TSS2_RC
iesys_MU_BYTE_array_Unmarshal(
const uint8_t *buffer,
size_t size,
size_t *offset,
size_t count,
BYTE *dst)
{
LOG_TRACE("called: count=%zu buffer=%p size=%zu offset=%p dst=%p",
count, buffer, size, offset, dst);
return_if_null(buffer, "src=NULL", TSS2_ESYS_RC_BAD_REFERENCE);
size_t offset_loc = (offset != NULL)? *offset : 0;
if (dst != NULL)
memset(dst, 0, sizeof(*dst));
if (count > size || size - count < offset_loc) {
LOG_ERROR("not enough space in target buffer");
return TSS2_ESYS_RC_INSUFFICIENT_BUFFER;
}
if (dst != NULL)
memcpy(dst, &buffer[offset_loc], count);
offset_loc += count;
if (offset != NULL)
*offset = offset_loc;
return TSS2_RC_SUCCESS;
}
/** Check, if a variable has a possible value of type IESYSC_RESOURCE_TYPE_CONSTANT.
*
* @param[in] in variable to check.
* @retval TSS2_RC_SUCCESS on success.
*/
TSS2_RC
Tss2_MU_IESYSC_RESOURCE_TYPE_CONSTANT_check(
const IESYSC_RESOURCE_TYPE_CONSTANT *in)
{
LOG_TRACE("called: in=%p", in);
if (in == NULL) {
LOG_ERROR("in==NULL");
return TSS2_SYS_RC_BAD_REFERENCE;
}
/* No Error-Messages, since this function may fail for a good reasons. */
if (FALSE
|| (*in == IESYSC_KEY_RSRC)
|| (*in == IESYSC_NV_RSRC)
|| (*in == IESYSC_SESSION_RSRC)
|| (*in == IESYSC_WITHOUT_MISC_RSRC)) {
return TSS2_RC_SUCCESS;
} else {
return TSS2_SYS_RC_BAD_VALUE;
}
return TSS2_RC_SUCCESS;
}
/** Marshal a constant of type IESYSC_PARAM_ENCRYPT into a byte buffer.
*
* @param[in] src constant to be marshaled.
* @param[in,out] buffer Buffer to write result into (may be NULL)
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer (may be NULL.
* @retval TSS2_RC_SUCCESS on success.
* @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
* @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
*/
TSS2_RC
iesys_MU_IESYSC_PARAM_ENCRYPT_Marshal(
const IESYSC_PARAM_ENCRYPT src,
uint8_t *buffer,
size_t size,
size_t *offset)
{
LOG_TRACE("called: src=%"PRIx32 " buffer=%p size=%zu offset=%p", src,
buffer, size, offset);
return Tss2_MU_UINT32_Marshal(src, buffer, size, offset);
}
/** Unmarshal a constant of type IESYSC_PARAM_ENCRYPT from a byte buffer.
*
* @param[in,out] buffer Buffer to read data from.
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer
* (being updated during marshaling).
* @param[out] dst variable to store the result in.
* @retval TSS2_RC_SUCCESS on success.
*/
TSS2_RC
iesys_MU_IESYSC_PARAM_ENCRYPT_Unmarshal(
const uint8_t *buffer,
size_t size,
size_t *offset,
IESYSC_PARAM_ENCRYPT *dst)
{
LOG_TRACE("called: buffer=%p size=%zu offset=%p dst=%p",
buffer, size, offset, dst);
size_t offset_loc = (offset != NULL)? *offset : 0;
if (dst != NULL)
memset(dst, 0, sizeof(*dst));
IESYSC_PARAM_ENCRYPT dst_loc;
TSS2_RC ret = Tss2_MU_UINT32_Unmarshal(buffer, size,
&offset_loc, &dst_loc);
return_if_error(ret, "Unmarshaling the base type");
ret = iesys_MU_IESYSC_PARAM_ENCRYPT_check(&dst_loc);
if (ret != TSS2_RC_SUCCESS) {
LOG_ERROR("Bad value %"PRIx32 "", dst_loc);
return ret;
}
if (offset != NULL)
*offset = offset_loc;
if (dst != NULL)
*dst = dst_loc;
LOG_TRACE("return: dst=%p value=%"PRIx32 "", dst, dst_loc);
return TSS2_RC_SUCCESS;
}
/** Check, if a variable has a possible value of type IESYSC_PARAM_ENCRYPT.
*
* @param[in] in variable to check.
* @retval TSS2_RC_SUCCESS on success.
*/
TSS2_RC
iesys_MU_IESYSC_PARAM_ENCRYPT_check(
const IESYSC_PARAM_ENCRYPT *in)
{
LOG_TRACE("called: in=%p", in);
return_if_null(in, "in==NULL", TSS2_SYS_RC_BAD_REFERENCE);
/* No Error-Messages, since this function may fail for a good reasons. */
if (FALSE
|| (*in == ENCRYPT)
|| (*in == NO_ENCRYPT)) {
return TSS2_RC_SUCCESS;
} else {
return TSS2_SYS_RC_BAD_VALUE;
}
return TSS2_RC_SUCCESS;
}
/** Marshal a constant of type IESYSC_PARAM_DECRYPT into a byte buffer.
*
* @param[in] src constant to be marshaled.
* @param[in,out] buffer Buffer to write result into (may be NULL)
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer (may be NULL.
* @retval TSS2_RC_SUCCESS on success.
* @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
* @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
*/
TSS2_RC
iesys_MU_IESYSC_PARAM_DECRYPT_Marshal(
const IESYSC_PARAM_DECRYPT src,
uint8_t *buffer,
size_t size,
size_t *offset)
{
LOG_TRACE("called: src=%"PRIx32 " buffer=%p size=%zu offset=%p", src,
buffer, size, offset);
return Tss2_MU_UINT32_Marshal(src, buffer, size, offset);
}
/** Unmarshal a constant of type IESYSC_PARAM_DECRYPT from a byte buffer.
*
* @param[in,out] buffer Buffer to read data from.
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer
* (being updated during marshaling).
* @param[out] dst variable to store the result in.
* @retval TSS2_RC_SUCCESS on success.
*/
TSS2_RC
iesys_MU_IESYSC_PARAM_DECRYPT_Unmarshal(
const uint8_t *buffer,
size_t size,
size_t *offset,
IESYSC_PARAM_DECRYPT *dst)
{
LOG_TRACE("called: buffer=%p size=%zu offset=%p dst=%p",
buffer, size, offset, dst);
size_t offset_loc = (offset != NULL)? *offset : 0;
if (dst != NULL)
memset(dst, 0, sizeof(*dst));
IESYSC_PARAM_DECRYPT dst_loc;
TSS2_RC ret = Tss2_MU_UINT32_Unmarshal(buffer, size,
&offset_loc, &dst_loc);
return_if_error(ret, "Unmarshaling the base type");
ret = iesys_MU_IESYSC_PARAM_DECRYPT_check(&dst_loc);
if (ret != TSS2_RC_SUCCESS) {
LOG_ERROR("Bad value %"PRIx32 "", dst_loc);
return ret;
}
if (offset != NULL)
*offset = offset_loc;
if (dst != NULL)
*dst = dst_loc;
LOG_TRACE("return: dst=%p value=%"PRIx32 "", dst, dst_loc);
return TSS2_RC_SUCCESS;
}
/** Check, if a variable has a possible value of type IESYSC_PARAM_DECRYPT.
*
* @param[in] in variable to check.
* @retval TSS2_RC_SUCCESS on success.
*/
TSS2_RC
iesys_MU_IESYSC_PARAM_DECRYPT_check(
const IESYSC_PARAM_DECRYPT *in)
{
LOG_TRACE("called: in=%p", in);
return_if_null(in, "in==NULL", TSS2_SYS_RC_BAD_REFERENCE);
/* No Error-Messages, since this function may fail for a good reasons. */
if (FALSE
|| (*in == DECRYPT)
|| (*in == NO_DECRYPT)) {
return TSS2_RC_SUCCESS;
} else {
return TSS2_SYS_RC_BAD_VALUE;
}
return TSS2_RC_SUCCESS;
}
/** Marshal a constant of type IESYSC_TYPE_POLICY_AUTH into a byte buffer.
*
* @param[in] src constant to be marshaled.
* @param[in,out] buffer Buffer to write result into (may be NULL)
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer (may be NULL.
* @retval TSS2_RC_SUCCESS on success.
* @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
* @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
*/
TSS2_RC
iesys_MU_IESYSC_TYPE_POLICY_AUTH_Marshal(
const IESYSC_TYPE_POLICY_AUTH src,
uint8_t *buffer,
size_t size,
size_t *offset)
{
LOG_TRACE("called: src=%"PRIx32 " buffer=%p size=%zu offset=%p", src,
buffer, size, offset);
return Tss2_MU_UINT32_Marshal(src, buffer, size, offset);
}
/** Unmarshal a constant of type IESYSC_TYPE_POLICY_AUTH from a byte buffer.
*
* @param[in,out] buffer Buffer to read data from.
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer
* (being updated during marshaling).
* @param[out] dst variable to store the result in.
* @retval TSS2_RC_SUCCESS on success.
*/
TSS2_RC
iesys_MU_IESYSC_TYPE_POLICY_AUTH_Unmarshal(
const uint8_t *buffer,
size_t size,
size_t *offset,
IESYSC_TYPE_POLICY_AUTH *dst)
{
LOG_TRACE("called: buffer=%p size=%zu offset=%p dst=%p",
buffer, size, offset, dst);
size_t offset_loc = (offset != NULL)? *offset : 0;
if (dst != NULL)
memset(dst, 0, sizeof(*dst));
IESYSC_TYPE_POLICY_AUTH dst_loc;
TSS2_RC ret = Tss2_MU_UINT32_Unmarshal(buffer, size,
&offset_loc, &dst_loc);
return_if_error(ret, "Unmarshaling the base type");
ret = iesys_MU_IESYSC_TYPE_POLICY_AUTH_check(&dst_loc);
if (ret != TSS2_RC_SUCCESS) {
LOG_ERROR("Bad value %"PRIx32 "", dst_loc);
return ret;
}
if (offset != NULL)
*offset = offset_loc;
if (dst != NULL)
*dst = dst_loc;
LOG_TRACE("return: dst=%p value=%"PRIx32 "", dst, dst_loc);
return TSS2_RC_SUCCESS;
}
/** Check, if a variable has a possible value of type IESYSC_TYPE_POLICY_AUTH.
*
* @param[in] in variable to check.
* @retval TSS2_RC_SUCCESS on success.
*/
TSS2_RC
iesys_MU_IESYSC_TYPE_POLICY_AUTH_check(
const IESYSC_TYPE_POLICY_AUTH *in)
{
LOG_TRACE("called: in=%p", in);
return_if_null(in, "in==NULL", TSS2_SYS_RC_BAD_REFERENCE);
/* No Error-Messages, since this function may fail for a good reasons. */
if (FALSE
|| (*in == POLICY_PASSWORD)
|| (*in == POLICY_AUTH)
|| (*in == NO_POLICY_AUTH)) {
return TSS2_RC_SUCCESS;
} else {
return TSS2_SYS_RC_BAD_VALUE;
}
return TSS2_RC_SUCCESS;
}
/** Marshal a IESYS_SESSION structure into a byte buffer.
*
* @param[in] src variable to be marshaled.
* @param[in,out] buffer Buffer to write result into.
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer
* (being updated during marshaling).
* @retval TSS2_RC_SUCCESS on success.
* @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
* @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
*/
TSS2_RC
iesys_MU_IESYS_SESSION_Marshal(
const IESYS_SESSION *src,
uint8_t *buffer,
size_t size,
size_t *offset)
{
LOG_TRACE("called: src=%p buffer=%p size=%zu offset=%p", src,
buffer, size, offset);
if (src == NULL) {
LOG_ERROR("src=NULL");
return TSS2_SYS_RC_BAD_REFERENCE;
}
TSS2_RC ret;
size_t offset_loc = (offset != NULL)? *offset : 0;
ret = Tss2_MU_TPM2B_NAME_Marshal(&src->bound_entity, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield bound_entity");
ret = Tss2_MU_TPM2B_ENCRYPTED_SECRET_Marshal(&src->encryptedSalt, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield encryptedSalt");
ret = Tss2_MU_TPM2B_DATA_Marshal(&src->salt, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield salt");
ret = Tss2_MU_TPMT_SYM_DEF_Marshal(&src->symmetric, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield symmetric");
ret = Tss2_MU_TPMI_ALG_HASH_Marshal(src->authHash, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield authHash");
ret = Tss2_MU_TPM2B_DIGEST_Marshal(&src->sessionKey, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield sessionKey");
ret = Tss2_MU_TPM2_SE_Marshal(src->sessionType, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield sessionType");
ret = Tss2_MU_TPMA_SESSION_Marshal(src->sessionAttributes, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield sessionAttributes");
ret = Tss2_MU_TPM2B_NONCE_Marshal(&src->nonceCaller, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield nonceCaller");
ret = Tss2_MU_TPM2B_NONCE_Marshal(&src->nonceTPM, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield nonceTPM");
ret = iesys_MU_IESYSC_PARAM_ENCRYPT_Marshal(src->encrypt, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield encrypt");
ret = iesys_MU_IESYSC_PARAM_DECRYPT_Marshal(src->decrypt, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield decrypt");
ret = iesys_MU_IESYSC_TYPE_POLICY_AUTH_Marshal(src->type_policy_session, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield type_policy_session");
ret = Tss2_MU_UINT16_Marshal(src->sizeSessionValue, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield sizeSessionValue");
ret = iesys_MU_BYTE_array_Marshal(&src->sessionValue[0], src->sizeSessionValue,
buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield sessionValue");
ret = Tss2_MU_UINT16_Marshal(src->sizeHmacValue, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield sizeHmacValue");
if (offset != NULL)
*offset = offset_loc;
return TSS2_RC_SUCCESS;
}
/** Unmarshal a IESYS_SESSION variable from a byte buffer.
*
* @param[in,out] buffer Buffer to read data from.
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer
* (being updated during marshaling).
* @param[out] out variable to store the result in.
* @retval TSS2_RC_SUCCESS on success.
* @retval TSS2_ESYS_RC_BAD_REFERENCE if buffer==NULL.
* @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
*/
TSS2_RC
iesys_MU_IESYS_SESSION_Unmarshal(
const uint8_t *buffer,
size_t size,
size_t *offset,
IESYS_SESSION *dst)
{
LOG_TRACE("called: buffer=%p size=%zu offset=%p dst=%p",
buffer, size, offset, dst);
if (buffer == NULL) {
LOG_ERROR("buffer=NULL");
return TSS2_ESYS_RC_BAD_REFERENCE;
}
TSS2_RC ret;
size_t offset_loc = (offset != NULL)? *offset : 0;
if (dst != NULL)
memset(dst, 0, sizeof(*dst));
ret = Tss2_MU_TPM2B_NAME_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? NULL : &dst->bound_entity);
return_if_error(ret, "Error unmarshaling subfield bound_entity");
ret = Tss2_MU_TPM2B_ENCRYPTED_SECRET_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? NULL : &dst->encryptedSalt);
return_if_error(ret, "Error unmarshaling subfield encryptedSalt");
ret = Tss2_MU_TPM2B_DATA_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? NULL : &dst->salt);
return_if_error(ret, "Error unmarshaling subfield salt");
ret = Tss2_MU_TPMT_SYM_DEF_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? NULL : &dst->symmetric);
return_if_error(ret, "Error unmarshaling subfield symmetric");
TPMI_ALG_HASH out_authHash;
ret = Tss2_MU_TPMI_ALG_HASH_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? &out_authHash : &dst->authHash);
return_if_error(ret, "Error unmarshaling subfield authHash");
ret = Tss2_MU_TPM2B_DIGEST_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? NULL : &dst->sessionKey);
return_if_error(ret, "Error unmarshaling subfield sessionKey");
TPM2_SE out_sessionType;
ret = Tss2_MU_TPM2_SE_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? &out_sessionType : &dst->sessionType);
return_if_error(ret, "Error unmarshaling subfield sessionType");
TPMA_SESSION out_sessionAttributes;
ret = Tss2_MU_TPMA_SESSION_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? &out_sessionAttributes : &dst->sessionAttributes);
return_if_error(ret, "Error unmarshaling subfield sessionAttributes");
ret = Tss2_MU_TPM2B_NONCE_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? NULL : &dst->nonceCaller);
return_if_error(ret, "Error unmarshaling subfield nonceCaller");
ret = Tss2_MU_TPM2B_NONCE_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? NULL : &dst->nonceTPM);
return_if_error(ret, "Error unmarshaling subfield nonceTPM");
IESYSC_PARAM_ENCRYPT out_encrypt;
ret = iesys_MU_IESYSC_PARAM_ENCRYPT_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? &out_encrypt : &dst->encrypt);
return_if_error(ret, "Error unmarshaling subfield encrypt");
IESYSC_PARAM_DECRYPT out_decrypt;
ret = iesys_MU_IESYSC_PARAM_DECRYPT_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? &out_decrypt : &dst->decrypt);
return_if_error(ret, "Error unmarshaling subfield decrypt");
IESYSC_TYPE_POLICY_AUTH out_type_policy_session;
ret = iesys_MU_IESYSC_TYPE_POLICY_AUTH_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? &out_type_policy_session : &dst->type_policy_session);
return_if_error(ret, "Error unmarshaling subfield type_policy_session");
UINT16 out_sizeSessionValue;
ret = Tss2_MU_UINT16_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? &out_sizeSessionValue : &dst->sizeSessionValue);
return_if_error(ret, "Error unmarshaling subfield sizeSessionValue");
ret = iesys_MU_BYTE_array_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? out_sizeSessionValue : dst->sizeSessionValue,
(dst == NULL)? NULL : &dst->sessionValue[0]);
return_if_error(ret, "Error unmarshaling subfield sessionValue");
UINT16 out_sizeHmacValue;
ret = Tss2_MU_UINT16_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? &out_sizeHmacValue : &dst->sizeHmacValue);
return_if_error(ret, "Error unmarshaling subfield sizeHmacValue");
if (offset != NULL)
*offset = offset_loc;
return TSS2_RC_SUCCESS;
}
/** Marshal a IESYSC_RESOURCE_TYPE type into a byte buffer.
*
* @param[in] src constant to be marshaled.
* @param[in,out] buffer Buffer to write result into (may be NULL)
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer (may be NULL.
* @retval TSS2_RC_SUCCESS on success.
* @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
* @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
*/
TSS2_RC
iesys_MU_IESYSC_RESOURCE_TYPE_Marshal(
const IESYSC_RESOURCE_TYPE src,
uint8_t *buffer,
size_t size,
size_t *offset)
{
LOG_TRACE("called: src=%"PRIx32 " buffer=%p size=%zu offset=%p", src,
buffer, size, offset);
return Tss2_MU_UINT32_Marshal(src, buffer, size, offset);
}
/** Unmarshal a IESYSC_RESOURCE_TYPE type from a byte buffer.
*
* @param[in,out] buffer Buffer to read data from.
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer
* (being updated during marshaling).
* @param[out] dst variable to store the result in.
* @retval TSS2_RC_SUCCESS on success.
*/
TSS2_RC
iesys_MU_IESYSC_RESOURCE_TYPE_Unmarshal(
const uint8_t *buffer,
size_t size,
size_t *offset,
IESYSC_RESOURCE_TYPE *dst)
{
LOG_TRACE("called: buffer=%p size=%zu offset=%p dst=%p",
buffer, size, offset, dst);
IESYSC_RESOURCE_TYPE dst_loc;
TSS2_RC ret = Tss2_MU_UINT32_Unmarshal(buffer, size,
offset, &dst_loc);
return_if_error(ret, "Unmarshaling the base type");
ret = iesys_MU_IESYSC_RESOURCE_TYPE_check(&dst_loc);
if (ret != TSS2_RC_SUCCESS) {
LOG_ERROR("Bad value %"PRIx32 "", dst_loc);
return ret;
}
if (dst != NULL)
*dst = dst_loc;
LOG_TRACE("return: dst=%p value=%"PRIx32 "", dst, dst_loc);
return TSS2_RC_SUCCESS;
}
/** Check, if a variable has a possible value of type IESYSC_RESOURCE_TYPE.
*
* @param[in] in variable to check.
* @retval TSS2_RC_SUCCESS on success.
*/
TSS2_RC
iesys_MU_IESYSC_RESOURCE_TYPE_check(
const IESYSC_RESOURCE_TYPE *in)
{
LOG_TRACE("called: in=%p", in);
return_if_null(in, "in==NULL", TSS2_SYS_RC_BAD_REFERENCE);
/* No Error-Messages, since this function may fail for a good reasons. */
if (FALSE
|| (*in == IESYSC_KEY_RSRC)
|| (*in == IESYSC_NV_RSRC)
|| (*in == IESYSC_SESSION_RSRC)
|| (*in == IESYSC_WITHOUT_MISC_RSRC)) {
return TSS2_RC_SUCCESS;
} else {
return TSS2_SYS_RC_BAD_VALUE;
}
return TSS2_RC_SUCCESS;
}
/** Marshal a IESYS_RSRC_UNION union into a byte buffer.
*
* @param[in] src variable to be marshaled.
* @param[in] selector the selector value.
* @param[in,out] buffer Buffer to write result into.
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer
* (being updated during marshaling).
* @retval TSS2_RC_SUCCESS on success.
* @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
* @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
*/
TSS2_RC
iesys_MU_IESYS_RSRC_UNION_Marshal(
const IESYS_RSRC_UNION *src,
UINT32 selector,
uint8_t *buffer,
size_t size,
size_t *offset)
{
LOG_TRACE("called: src=%p buffer=%p size=%zu offset=%p", src,
buffer, size, offset);
if (src == NULL) {
LOG_ERROR("src=NULL");
return TSS2_ESYS_RC_BAD_REFERENCE;
}
switch (selector) {
case IESYSC_KEY_RSRC:
return Tss2_MU_TPM2B_PUBLIC_Marshal(&src->rsrc_key_pub, buffer, size, offset);
case IESYSC_NV_RSRC:
return Tss2_MU_TPM2B_NV_PUBLIC_Marshal(&src->rsrc_nv_pub, buffer, size, offset);
case IESYSC_SESSION_RSRC:
return iesys_MU_IESYS_SESSION_Marshal(&src->rsrc_session, buffer, size, offset);
case IESYSC_WITHOUT_MISC_RSRC:
return Tss2_MU_TPMS_EMPTY_Marshal(&src->rsrc_empty, buffer, size, offset);
default:
LOG_ERROR("Selector value %"PRIu32 " not found", selector);
return TSS2_SYS_RC_BAD_VALUE;
};
}
/** Unmarshal a IESYS_RSRC_UNION union from a byte buffer.
*
* @param[in,out] buffer Buffer to read data from.
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer (may be NULL).
* @param[in] selector The selector.
* @param[out] out variable to store the result in (may be NULL).
* @retval TSS2_RC_SUCCESS on success.
* @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
* @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
*/
TSS2_RC
iesys_MU_IESYS_RSRC_UNION_Unmarshal(
const uint8_t *buffer,
size_t size,
size_t *offset,
UINT32 selector,
IESYS_RSRC_UNION *dst)
{
LOG_TRACE("called: buffer=%p size=%zu offset=%p dst=%p",
buffer, size, offset, dst);
if (buffer == NULL) {
LOG_ERROR("buffer=NULL");
return TSS2_ESYS_RC_BAD_REFERENCE;
}
switch (selector) {
case IESYSC_KEY_RSRC:
return Tss2_MU_TPM2B_PUBLIC_Unmarshal(buffer, size, offset,
(dst != NULL)? &dst->rsrc_key_pub : NULL);
case IESYSC_NV_RSRC:
return Tss2_MU_TPM2B_NV_PUBLIC_Unmarshal(buffer, size, offset,
(dst != NULL)? &dst->rsrc_nv_pub : NULL);
case IESYSC_SESSION_RSRC:
return iesys_MU_IESYS_SESSION_Unmarshal(buffer, size, offset,
(dst != NULL)? &dst->rsrc_session : NULL);
case IESYSC_WITHOUT_MISC_RSRC:
return Tss2_MU_TPMS_EMPTY_Unmarshal(buffer, size, offset,
(dst != NULL)? &dst->rsrc_empty : NULL);
default:
LOG_ERROR("Selector value %"PRIu32 " not found", selector);
return TSS2_SYS_RC_BAD_VALUE;
};
}
/** Marshal a IESYS_RESOURCE structure into a byte buffer.
*
* @param[in] src variable to be marshaled.
* @param[in,out] buffer Buffer to write result into.
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer
* (being updated during marshaling).
* @retval TSS2_RC_SUCCESS on success.
* @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
* @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
*/
TSS2_RC
iesys_MU_IESYS_RESOURCE_Marshal(
const IESYS_RESOURCE *src,
uint8_t *buffer,
size_t size,
size_t *offset)
{
LOG_TRACE("called: src=%p buffer=%p size=%zu offset=%p", src,
buffer, size, offset);
if (src == NULL) {
LOG_ERROR("src=NULL");
return TSS2_SYS_RC_BAD_REFERENCE;
}
TSS2_RC ret;
size_t offset_loc = (offset != NULL)? *offset : 0;
ret = Tss2_MU_TPM2_HANDLE_Marshal(src->handle, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield handle");
ret = Tss2_MU_TPM2B_NAME_Marshal(&src->name, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield name");
ret = iesys_MU_IESYSC_RESOURCE_TYPE_Marshal(src->rsrcType, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield rsrcType");
ret = iesys_MU_IESYS_RSRC_UNION_Marshal(&src->misc, src->rsrcType,
buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield misc");
if (offset != NULL)
*offset = offset_loc;
return TSS2_RC_SUCCESS;
}
/** Unmarshal a IESYS_RESOURCE variable from a byte buffer.
*
* @param[in,out] buffer Buffer to read data from.
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer
* (being updated during marshaling).
* @param[out] out variable to store the result in.
* @retval TSS2_RC_SUCCESS on success.
* @retval TSS2_ESYS_RC_BAD_REFERENCE if buffer==NULL.
* @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
*/
TSS2_RC
iesys_MU_IESYS_RESOURCE_Unmarshal(
const uint8_t *buffer,
size_t size,
size_t *offset,
IESYS_RESOURCE *dst)
{
LOG_TRACE("called: buffer=%p size=%zu offset=%p dst=%p",
buffer, size, offset, dst);
if (buffer == NULL) {
LOG_ERROR("buffer=NULL");
return TSS2_ESYS_RC_BAD_REFERENCE;
}
TSS2_RC ret;
size_t offset_loc = (offset != NULL)? *offset : 0;
if (dst != NULL)
memset(dst, 0, sizeof(*dst));
TPM2_HANDLE out_handle;
ret = Tss2_MU_TPM2_HANDLE_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? &out_handle : &dst->handle);
return_if_error(ret, "Error unmarshaling subfield handle");
ret = Tss2_MU_TPM2B_NAME_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? NULL : &dst->name);
return_if_error(ret, "Error unmarshaling subfield name");
IESYSC_RESOURCE_TYPE out_rsrcType;
ret = iesys_MU_IESYSC_RESOURCE_TYPE_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? &out_rsrcType : &dst->rsrcType);
return_if_error(ret, "Error unmarshaling subfield rsrcType");
ret = iesys_MU_IESYS_RSRC_UNION_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? out_rsrcType : dst->rsrcType,
(dst == NULL)? NULL : &dst->misc);
return_if_error(ret, "Error unmarshaling subfield misc");
if (offset != NULL)
*offset = offset_loc;
return TSS2_RC_SUCCESS;
}
/** Marshal a IESYS_METADATA structure into a byte buffer.
*
* @param[in] src variable to be marshaled.
* @param[in,out] buffer Buffer to write result into.
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer
* (being updated during marshaling).
* @retval TSS2_RC_SUCCESS on success.
* @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
* @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
*/
TSS2_RC
iesys_MU_IESYS_METADATA_Marshal(
const IESYS_METADATA *src,
uint8_t *buffer,
size_t size,
size_t *offset)
{
LOG_TRACE("called: src=%p buffer=%p size=%zu offset=%p", src,
buffer, size, offset);
if (src == NULL) {
LOG_ERROR("src=NULL");
return TSS2_SYS_RC_BAD_REFERENCE;
}
TSS2_RC ret;
size_t offset_loc = (offset != NULL)? *offset : 0;
ret = Tss2_MU_UINT16_Marshal(src->size, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield size");
ret = iesys_MU_IESYS_RESOURCE_Marshal(&src->data, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield data");
if (offset != NULL)
*offset = offset_loc;
return TSS2_RC_SUCCESS;
}
/** Unmarshal a IESYS_METADATA variable from a byte buffer.
*
* @param[in,out] buffer Buffer to read data from.
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer
* (being updated during marshaling).
* @param[out] out variable to store the result in.
* @retval TSS2_RC_SUCCESS on success.
* @retval TSS2_ESYS_RC_BAD_REFERENCE if buffer==NULL.
* @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
*/
TSS2_RC
iesys_MU_IESYS_METADATA_Unmarshal(
const uint8_t *buffer,
size_t size,
size_t *offset,
IESYS_METADATA *dst)
{
LOG_TRACE("called: buffer=%p size=%zu offset=%p dst=%p",
buffer, size, offset, dst);
if (buffer == NULL) {
LOG_ERROR("buffer=NULL");
return TSS2_ESYS_RC_BAD_REFERENCE;
}
TSS2_RC ret;
size_t offset_loc = (offset != NULL)? *offset : 0;
if (dst != NULL)
memset(dst, 0, sizeof(*dst));
UINT16 out_size;
ret = Tss2_MU_UINT16_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? &out_size : &dst->size);
return_if_error(ret, "Error unmarshaling subfield size");
IESYS_RESOURCE out_data;
ret = iesys_MU_IESYS_RESOURCE_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? &out_data : &dst->data);
return_if_error(ret, "Error unmarshaling subfield data");
if (offset != NULL)
*offset = offset_loc;
return TSS2_RC_SUCCESS;
}
/** Marshal a IESYS_CONTEXT_DATA structure into a byte buffer.
*
* @param[in] src variable to be marshaled.
* @param[in,out] buffer Buffer to write result into.
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer
* (being updated during marshaling).
* @retval TSS2_RC_SUCCESS on success.
* @retval TSS2_ESYS_RC_BAD_REFERENCE if src==NULL.
* @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
*/
TSS2_RC
iesys_MU_IESYS_CONTEXT_DATA_Marshal(
const IESYS_CONTEXT_DATA *src,
uint8_t *buffer,
size_t size,
size_t *offset)
{
LOG_TRACE("called: src=%p buffer=%p size=%zu offset=%p", src,
buffer, size, offset);
if (src == NULL) {
LOG_ERROR("src=NULL");
return TSS2_SYS_RC_BAD_REFERENCE;
}
TSS2_RC ret;
size_t offset_loc = (offset != NULL)? *offset : 0;
ret = Tss2_MU_UINT32_Marshal(src->reserved, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield reserved");
ret = Tss2_MU_TPM2B_CONTEXT_DATA_Marshal(&src->tpmContext, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield tpmContext");
ret = iesys_MU_IESYS_METADATA_Marshal(&src->esysMetadata, buffer, size, &offset_loc);
return_if_error(ret, "Error marshaling subfield esysMetadata");
if (offset != NULL)
*offset = offset_loc;
return TSS2_RC_SUCCESS;
}
/** Unmarshal a IESYS_CONTEXT_DATA variable from a byte buffer.
*
* @param[in,out] buffer Buffer to read data from.
* @param[in] size Size of the buffer.
* @param[in,out] offset Offset inside the buffer
* (being updated during marshaling).
* @param[out] out variable to store the result in.
* @retval TSS2_RC_SUCCESS on success.
* @retval TSS2_ESYS_RC_BAD_REFERENCE if buffer==NULL.
* @retval TSS2_ESYS_RC_INSUFFICIENT_BUFFER if remaining buffer is insufficient.
*/
TSS2_RC
iesys_MU_IESYS_CONTEXT_DATA_Unmarshal(
const uint8_t *buffer,
size_t size,
size_t *offset,
IESYS_CONTEXT_DATA *dst)
{
LOG_TRACE("called: buffer=%p size=%zu offset=%p dst=%p",
buffer, size, offset, dst);
if (buffer == NULL) {
LOG_ERROR("buffer=NULL");
return TSS2_ESYS_RC_BAD_REFERENCE;
}
TSS2_RC ret;
size_t offset_loc = (offset != NULL)? *offset : 0;
if (dst != NULL)
memset(dst, 0, sizeof(*dst));
UINT32 out_reserved;
ret = Tss2_MU_UINT32_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? &out_reserved : &dst->reserved);
return_if_error(ret, "Error unmarshaling subfield reserved");
ret = Tss2_MU_TPM2B_CONTEXT_DATA_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? NULL : &dst->tpmContext);
return_if_error(ret, "Error unmarshaling subfield tpmContext");
IESYS_METADATA out_esysMetadata;
ret = iesys_MU_IESYS_METADATA_Unmarshal(buffer, size, &offset_loc,
(dst == NULL)? &out_esysMetadata : &dst->esysMetadata);
return_if_error(ret, "Error unmarshaling subfield esysMetadata");
if (offset != NULL)
*offset = offset_loc;
return TSS2_RC_SUCCESS;
}