blob: 45c3ac3d5cba84d70cf38529abfc0b9f9ca6ff3e [file] [log] [blame]
/* SPDX-License-Identifier: BSD-2-Clause */
/***********************************************************************;
* Copyright (c) 2015 - 2018, Intel Corporation
* All rights reserved.
***********************************************************************/
#ifndef TSS2_SYSAPI_UTIL_H
#define TSS2_SYSAPI_UTIL_H
#include <stdbool.h>
#include "tss2_tpm2_types.h"
#include "tss2_tcti.h"
#include "tss2_sys.h"
#include "util/tpm2b.h"
enum cmdStates {CMD_STAGE_INITIALIZE,
CMD_STAGE_PREPARE,
CMD_STAGE_SEND_COMMAND,
CMD_STAGE_RECEIVE_RESPONSE,
CMD_STAGE_ALL = 0xff };
#pragma pack(push, 1)
typedef struct _TPM20_Header_In {
TPM2_ST tag;
UINT32 commandSize;
UINT32 commandCode;
} TPM20_Header_In;
typedef struct _TPM20_Header_Out {
TPM2_ST tag;
UINT32 responseSize;
UINT32 responseCode;
} TPM20_Header_Out;
#pragma pack(pop)
typedef struct {
TSS2_TCTI_CONTEXT *tctiContext;
UINT8 *cmdBuffer;
UINT32 maxCmdSize;
UINT8 cmd_header[sizeof(TPM20_Header_In)]; /* Copy of the cmd header to allow reissue */
TPM20_Header_Out rsp_header;
TPM2_CC commandCode; /* In host endian */
UINT32 cpBufferUsedSize;
UINT8 *cpBuffer;
UINT32 *rspParamsSize;
UINT8 previousStage;
UINT8 authsCount;
UINT8 numResponseHandles;
struct
{
UINT16 decryptAllowed:1;
UINT16 encryptAllowed:1;
UINT16 decryptNull:1;
UINT16 authAllowed:1;
};
/* Offset to next data in command/response buffer. */
size_t nextData;
} _TSS2_SYS_CONTEXT_BLOB;
static inline _TSS2_SYS_CONTEXT_BLOB *
syscontext_cast(TSS2_SYS_CONTEXT *ctx)
{
return (_TSS2_SYS_CONTEXT_BLOB*) ctx;
}
static inline TPM20_Header_Out *
resp_header_from_cxt(_TSS2_SYS_CONTEXT_BLOB *ctx)
{
return (TPM20_Header_Out *)ctx->cmdBuffer;
}
static inline TPM20_Header_In *
req_header_from_cxt(_TSS2_SYS_CONTEXT_BLOB *ctx)
{
return (TPM20_Header_In *)ctx->cmdBuffer;
}
typedef struct {
TPM2_CC commandCode;
int numCommandHandles;
int numResponseHandles;
} COMMAND_HANDLES;
#ifdef __cplusplus
extern "C" {
#endif
TSS2_RC CopyCommandHeader(_TSS2_SYS_CONTEXT_BLOB *ctx, TPM2_CC commandCode);
UINT32 GetCommandSize(_TSS2_SYS_CONTEXT_BLOB *ctx);
void InitSysContextFields(_TSS2_SYS_CONTEXT_BLOB *ctx);
void InitSysContextPtrs(_TSS2_SYS_CONTEXT_BLOB *ctx, size_t contextSize);
TSS2_RC CompleteChecks(_TSS2_SYS_CONTEXT_BLOB *ctx);
TSS2_RC CommonComplete(_TSS2_SYS_CONTEXT_BLOB *ctx);
TSS2_RC CommonOneCall(
_TSS2_SYS_CONTEXT_BLOB *ctx,
TSS2L_SYS_AUTH_COMMAND const *cmdAuthsArray,
TSS2L_SYS_AUTH_RESPONSE *rspAuthsArray);
TSS2_RC CommonPreparePrologue(
_TSS2_SYS_CONTEXT_BLOB *ctx,
TPM2_CC commandCode);
TSS2_RC CommonPrepareEpilogue(_TSS2_SYS_CONTEXT_BLOB *ctx);
#ifdef DISABLE_WEAK_CRYPTO
bool IsAlgorithmWeak(TPM2_ALG_ID algorith, TPM2_KEY_SIZE key_size);
TSS2_RC ValidatePublicTemplate(const TPM2B_PUBLIC *pub);
TSS2_RC ValidateNV_Public(const TPM2B_NV_PUBLIC *nv_public_info);
TSS2_RC ValidateTPML_PCR_SELECTION(const TPML_PCR_SELECTION *pcr_selection);
#else
/*
* static inline is not portable, so make these empty defines to reduce generating functions
* and thus binary size for them.
*/
#define IsAlgorithmWeak(...) TSS2_RC_SUCCESS
#define ValidatePublicTemplate(...) TSS2_RC_SUCCESS
#define ValidateNV_Public(...) TSS2_RC_SUCCESS
#define ValidateTPML_PCR_SELECTION(...) TSS2_RC_SUCCESS
#endif
#ifdef __cplusplus
}
#endif
#endif