/* SPDX-License-Identifier: BSD-2-Clause */
/*******************************************************************************
 * Copyright 2018-2019, Fraunhofer SIT sponsored by Infineon Technologies AG
 * All rights reserved.
 *******************************************************************************/
#ifndef FAPI_UTIL_H
#define FAPI_UTIL_H

#include <stdint.h>
#include <stdarg.h>
#include <stdbool.h>
#include <sys/stat.h>
#include <json-c/json.h>
#include <json-c/json_util.h>

#include "tss2_esys.h"
#include "tss2_fapi.h"
#include "fapi_int.h"
#include "ifapi_helpers.h"


TSS2_RC
ifapi_flush_object(FAPI_CONTEXT *context, ESYS_TR session);

TSS2_RC
ifapi_get_session_async(
    ESYS_CONTEXT *esys,
    ESYS_TR saltkey,
    const IFAPI_PROFILE*profile,
    TPMI_ALG_HASH hashAlg);

TSS2_RC
ifapi_get_session_finish(ESYS_CONTEXT *esys, ESYS_TR *session,
                         TPMA_SESSION flags);

const char *
ifapi_get_object_path(IFAPI_OBJECT *object);

TSS2_RC
ifapi_set_auth(
    FAPI_CONTEXT *context,
    IFAPI_OBJECT *auth_object,
    const char *description);

TSS2_RC
ifapi_get_free_handle_async(FAPI_CONTEXT *fctx, TPM2_HANDLE *handle);

TSS2_RC
ifapi_get_free_handle_finish(FAPI_CONTEXT *fctx, TPM2_HANDLE *handle,
                             TPM2_HANDLE max);

TSS2_RC
ifapi_init_primary_async(
    FAPI_CONTEXT *context,
    TSS2_KEY_TYPE ktype);

TSS2_RC
ifapi_init_primary_finish(
    FAPI_CONTEXT *context,
    TSS2_KEY_TYPE ktype,
    IFAPI_OBJECT *hierarchy);

TSS2_RC
ifapi_session_init(FAPI_CONTEXT *context);

TSS2_RC
ifapi_non_tpm_mode_init(FAPI_CONTEXT *context);

void
ifapi_session_clean(FAPI_CONTEXT *context);

TSS2_RC
ifapi_cleanup_session(FAPI_CONTEXT *context);

void
ifapi_primary_clean(FAPI_CONTEXT *context);

TSS2_RC
ifapi_get_sessions_async(
    FAPI_CONTEXT *context,
    IFAPI_SESSION_TYPE session_flags,
    TPMA_SESSION attribute_flags1,
    TPMA_SESSION attribute_flags2);

TSS2_RC
ifapi_get_sessions_finish(
    FAPI_CONTEXT *context,
    const IFAPI_PROFILE *profile,
    TPMI_ALG_HASH hash_alg);

TSS2_RC
ifapi_merge_profile_into_nv_template(
    FAPI_CONTEXT *context,
    IFAPI_NV_TEMPLATE *template);

TSS2_RC
ifapi_merge_profile_into_template(
    const IFAPI_PROFILE *profile,
    IFAPI_KEY_TEMPLATE *template);

TSS2_RC
ifapi_load_key_async(FAPI_CONTEXT *context, size_t position);

TSS2_RC
ifapi_load_parent_keys_async(FAPI_CONTEXT *context, char const *keyPath);

TSS2_RC
ifapi_load_key_finish(FAPI_CONTEXT *context, bool flush_parent);

TSS2_RC
ifapi_load_keys_async(
    FAPI_CONTEXT *context,
    char const *keyPath);

TSS2_RC
ifapi_load_keys_finish(
    FAPI_CONTEXT *context,
    bool flush_parent,
    ESYS_TR *handle,
    IFAPI_OBJECT **key_object);

TSS2_RC
ifapi_nv_read(
    FAPI_CONTEXT *context,
    uint8_t     **data,
    size_t       *size);

void
ifapi_flush_policy_session(
    FAPI_CONTEXT *context,
    ESYS_TR session,
    TSS2_RC r);

TSS2_RC
ifapi_nv_write(
    FAPI_CONTEXT *context,
    char         *nvPath,
    size_t         param_offset,
    uint8_t const *data,
    size_t         size);

TSS2_RC
ifapi_get_random(
    FAPI_CONTEXT *context,
    size_t numBytes,
    uint8_t **data);

TSS2_RC
ifapi_load_key(
    FAPI_CONTEXT  *context,
    char    const *keyPath,
    IFAPI_OBJECT **key_object);

TSS2_RC
ifapi_key_sign(
    FAPI_CONTEXT    *context,
    IFAPI_OBJECT    *sig_key_object,
    char const      *padding,
    TPM2B_DIGEST    *digest,
    TPMT_SIGNATURE **tpm_signature,
    char           **publicKey,
    char           **certificate);

TSS2_RC
ifapi_authorize_object(
    FAPI_CONTEXT *context,
    IFAPI_OBJECT *object,
    ESYS_TR      *session);

TSS2_RC
ifapi_get_json(
    FAPI_CONTEXT *context,
    IFAPI_OBJECT *object,
    char **json_string);

TSS2_RC
ifapi_key_create_prepare(
    FAPI_CONTEXT  *context,
    char   const *keyPath,
    char   const *policyPath);

TSS2_RC
ifapi_key_create_prepare_auth(
    FAPI_CONTEXT  *context,
    char   const *keyPath,
    char   const *policyPath,
    char   const *authValue);

TSS2_RC
ifapi_key_create_prepare_sensitive(
    FAPI_CONTEXT  *context,
    char    const *keyPath,
    char    const *policyPath,
    size_t         dataSize,
    char    const *authValue,
    uint8_t const *data);

TSS2_RC
ifapi_key_create(
    FAPI_CONTEXT *context,
    IFAPI_KEY_TEMPLATE *template);

TSS2_RC
ifapi_get_sig_scheme(
    FAPI_CONTEXT *context,
    IFAPI_OBJECT *object,
    char const *padding,
    TPM2B_DIGEST *digest,
    TPMT_SIG_SCHEME *sig_scheme);

TSS2_RC
ifapi_change_auth_hierarchy(
    FAPI_CONTEXT *context,
    ESYS_TR handle,
    IFAPI_OBJECT *hierarchy_object,
    TPM2B_AUTH *newAuthValue);

TSS2_RC
ifapi_change_policy_hierarchy(
    FAPI_CONTEXT *context,
    ESYS_TR handle,
    IFAPI_OBJECT *hierarchy_object,
    TPMS_POLICY *policy);

IFAPI_OBJECT
*ifapi_allocate_object(FAPI_CONTEXT *context);

void
ifapi_free_objects(FAPI_CONTEXT *context);

void
ifapi_free_object(FAPI_CONTEXT *context, IFAPI_OBJECT **object);

TPM2_RC
ifapi_capability_init(FAPI_CONTEXT *context);

TPM2_RC
ifapi_capability_get(FAPI_CONTEXT *context, TPM2_CAP capability,
                     UINT32 count, TPMS_CAPABILITY_DATA **capability_data);

TSS2_RC
ifapi_get_certificates(
    FAPI_CONTEXT *context,
    UINT32 min_handle,
    UINT32 max_handle,
    NODE_OBJECT_T **cert_list);

TSS2_RC
ifapi_initialize_object(
    ESYS_CONTEXT *ectx,
    IFAPI_OBJECT *object);

TSS2_RC
ifapi_esys_serialize_object(
    ESYS_CONTEXT *ectx,
    IFAPI_OBJECT *object);

TSS2_RC
ifapi_get_description(IFAPI_OBJECT *object, char **description);

void
ifapi_set_description(IFAPI_OBJECT *object, char *description);

TSS2_RC
ifapi_get_key_properties(
    FAPI_CONTEXT *context,
    char const *key_path,
    bool *is_primary,
    bool *in_null_hierarchy);

TSS2_RC
ifapi_create_primary(FAPI_CONTEXT *context, IFAPI_KEY_TEMPLATE *template);

#endif /* FAPI_UTIL_H */
