blob: 88519889b7bce6bd32cfc29cb89d96f589714144 [file] [log] [blame]
/* SPDX-License-Identifier: BSD-2-Clause */
/*******************************************************************************
* Copyright 2017-2018, Fraunhofer SIT sponsored by Infineon Technologies AG
* All rights reserved.
******************************************************************************/
#ifndef ESYS_IUTIL_H
#define ESYS_IUTIL_H
#include <stdbool.h>
#include <inttypes.h>
#include <string.h>
#include "tss2_esys.h"
#include "esys_int.h"
#include "esys_crypto.h"
#ifdef __cplusplus
extern "C" {
#endif
/*
* Start issuing ESYS_TR objects past the TPM2_RH_LAST namespace
* and give ourselves 0x1000 handle space in case of differing
* header files between the library build and the client build.
*
* Due to an API mistake, TPM2_RH constants are valid for a few
* select ESYS API calls.
*
* More details can be found here:
* - https://github.com/tpm2-software/tpm2-tss/issues/1750
*/
#define ESYS_TR_MIN_OBJECT (TPM2_RH_LAST + 1 + 0x1000)
/** An entry in a cpHash or rpHash table. */
typedef struct {
TPM2_ALG_ID alg; /**< The hash algorithm. */
size_t size; /**< The digest size. */
uint8_t digest[sizeof(TPMU_HA)]; /**< The digest. */
} HASH_TAB_ITEM;
TSS2_RC init_session_tab(
ESYS_CONTEXT *esysContext,
ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3);
void iesys_DeleteAllResourceObjects(
ESYS_CONTEXT *esys_context);
TSS2_RC iesys_compute_encrypt_nonce(
ESYS_CONTEXT *esysContext,
int *encryptNonceIdx,
TPM2B_NONCE **encryptNonce);
TSS2_RC iesys_compute_cp_hashtab(
ESYS_CONTEXT *esysContext,
const TPM2B_NAME *name1,
const TPM2B_NAME *name2,
const TPM2B_NAME *name3,
HASH_TAB_ITEM cp_hash_tab[3],
uint8_t *cpHashNum);
TSS2_RC iesys_compute_rp_hashtab(
ESYS_CONTEXT *esysContext,
const uint8_t *rpBuffer,
size_t rpBuffer_size,
HASH_TAB_ITEM rp_hash_tab[3],
uint8_t *rpHashNum);
TSS2_RC esys_CreateResourceObject(
ESYS_CONTEXT *esys_context,
ESYS_TR esys_handle,
RSRC_NODE_T **node);
TSS2_RC iesys_handle_to_tpm_handle(
ESYS_TR esys_handle,
TPM2_HANDLE *tpm_handle);
bool
iesys_is_platform_handle(
ESYS_TR handle);
TSS2_RC esys_GetResourceObject(
ESYS_CONTEXT *esys_context,
ESYS_TR rsrc_handle,
RSRC_NODE_T **node);
TPM2_HT iesys_get_handle_type(
TPM2_HANDLE handle);
TSS2_RC iesys_finalize(ESYS_CONTEXT *context);
bool iesys_compare_name(
TPM2B_PUBLIC *publicInfo,
TPM2B_NAME *name);
TSS2_RC iesys_compute_encrypted_salt(
ESYS_CONTEXT *esysContext,
RSRC_NODE_T *tpmKeyNode,
TPM2B_ENCRYPTED_SECRET *encryptedSalt);
TSS2_RC iesys_gen_caller_nonces(
ESYS_CONTEXT *esysContext);
TSS2_RC iesys_encrypt_param(
ESYS_CONTEXT *esysContext,
TPM2B_NONCE **decryptNonce,
int *decryptNonceIdx);
TSS2_RC iesys_decrypt_param(
ESYS_CONTEXT *esysContext);
TSS2_RC iesys_check_rp_hmacs(
ESYS_CONTEXT *esysContext,
TSS2L_SYS_AUTH_RESPONSE *rspAuths,
HASH_TAB_ITEM rp_hash_tab[3],
uint8_t rpHashNum);
void iesys_compute_bound_entity(
const TPM2B_NAME *name,
const TPM2B_AUTH *auth,
TPM2B_NAME *bound_entity);
bool iesys_is_object_bound(
const TPM2B_NAME * name,
const TPM2B_AUTH * auth,
RSRC_NODE_T * session);
TSS2_RC iesys_check_sequence_async(
ESYS_CONTEXT *esysContext);
TSS2_RC check_session_feasibility(
ESYS_TR shandle1,
ESYS_TR shandle2,
ESYS_TR shandle3,
int mandatory);
void iesys_compute_session_value(
RSRC_NODE_T *session,
const TPM2B_NAME *name,
const TPM2B_AUTH *auth_value);
TSS2_RC iesys_compute_hmac(
RSRC_NODE_T *session,
HASH_TAB_ITEM cp_hash_tab[3],
uint8_t cpHashNum,
TPM2B_NONCE *decryptNonce,
TPM2B_NONCE *encryptNonce,
TPMS_AUTH_COMMAND *auth);
TSS2_RC iesys_gen_auths(
ESYS_CONTEXT *esysContext,
RSRC_NODE_T *h1,
RSRC_NODE_T *h2,
RSRC_NODE_T *h3,
TSS2L_SYS_AUTH_COMMAND *auths);
TSS2_RC iesys_check_response(
ESYS_CONTEXT * esys_context);
TSS2_RC iesys_nv_get_name(
TPM2B_NV_PUBLIC *publicInfo,
TPM2B_NAME *name);
TSS2_RC iesys_get_name(
TPM2B_PUBLIC *publicInfo,
TPM2B_NAME *name);
bool iesys_tpm_error(
TSS2_RC r);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* ESYS_IUTIL_H */