/* SPDX-License-Identifier: BSD-2-Clause */
/***********************************************************************
 * Copyright (c) 2017-2018, Intel Corporation
 *
 * All rights reserved.
 ***********************************************************************/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <inttypes.h>
#include <stdlib.h>
#include <string.h>

#include "tss2_mu.h"
#include "tss2_sys.h"

#define LOGMODULE test
#include "util/log.h"
#include "sapi-util.h"

TSS2_RC
test_invoke (TSS2_SYS_CONTEXT *sapi_context)
{
    TSS2_RC                 rc              = TSS2_RC_SUCCESS;
    TPM2B_SENSITIVE_CREATE  in_sensitive    = { 0 };
    TPMT_PUBLIC             in_public       = { 0 };
    TPM2B_TEMPLATE          public_template = { 0 };
    TPM2B_PRIVATE           out_private     = { 0 };
    TPM2B_PUBLIC            out_public      = { 0 };
    TPM2B_NAME              name            = TPM2B_NAME_INIT;
    TPM2B_NAME              qualified_name  = TPM2B_NAME_INIT;
    TPM2_HANDLE             object_handle   = 0;
    TSS2L_SYS_AUTH_COMMAND  auth_cmd = {
        .auths = {{ .sessionHandle = TPM2_RS_PW }},
        .count = 1
    };
    TSS2L_SYS_AUTH_RESPONSE auth_rsp = {
        .count = 0
    };

    if (sapi_context == NULL)
        return TSS2_RC_LAYER_MASK | TSS2_BASE_RC_BAD_REFERENCE;

    in_public.type = TPM2_ALG_RSA;
    in_public.nameAlg = TPM2_ALG_SHA256;
    in_public.objectAttributes |= TPMA_OBJECT_RESTRICTED;
    in_public.objectAttributes |= TPMA_OBJECT_USERWITHAUTH;
    in_public.objectAttributes |= TPMA_OBJECT_DECRYPT;
    in_public.objectAttributes |= TPMA_OBJECT_FIXEDTPM;
    in_public.objectAttributes |= TPMA_OBJECT_FIXEDPARENT;
    in_public.objectAttributes |= TPMA_OBJECT_SENSITIVEDATAORIGIN;
    in_public.parameters.rsaDetail.symmetric.algorithm = TPM2_ALG_AES;
    in_public.parameters.rsaDetail.symmetric.keyBits.aes = 128;
    in_public.parameters.rsaDetail.symmetric.mode.aes = TPM2_ALG_CFB;
    in_public.parameters.rsaDetail.scheme.scheme = TPM2_ALG_NULL;
    in_public.parameters.rsaDetail.keyBits = 2048;

    uint8_t public_buf[sizeof(in_public)] = {0};
    size_t offset = 0;

    rc = Tss2_MU_TPMT_PUBLIC_Marshal(&in_public, public_buf,
                                     sizeof(in_public), &offset);
    if (rc != TPM2_RC_SUCCESS) {
        LOG_ERROR("Tss2_MU_TPMT_PUBLIC_Marshal FAILED! Response Code: 0x%x", rc);
        exit(1);
    }
    public_template.size = offset;
    memcpy(public_template.buffer, public_buf, offset);
    /* Create an object using CreateLoaded.
     * The result should be that the created object
     * stays in the TPM
     */
    LOG_INFO("Calling CreateLoaded");
    rc = Tss2_Sys_CreateLoaded (sapi_context,
                                TPM2_RH_OWNER,
                                &auth_cmd,
                                &in_sensitive,
                                &public_template,
                                &object_handle,
                                &out_private,
                                &out_public,
                                &name,
                                &auth_rsp);
    if (rc == TPM2_RC_SUCCESS) {
        LOG_INFO("success object handle: 0x%x", object_handle);
    } else {
        LOG_ERROR("CreateLoaded FAILED! Response Code : 0x%x", rc);
        exit(1);
    }

    memset(&out_public, '\0', sizeof(out_public));
    memset(&name, '\0', sizeof(name));

    /* Check if the object is really loaded by accessing its
     * public area */
    LOG_INFO("Calling ReadPublic");
    rc = Tss2_Sys_ReadPublic (sapi_context,
                              object_handle,
                              NULL,
                              &out_public,
                              &name,
                              &qualified_name,
                              NULL);
    if (rc == TPM2_RC_SUCCESS) {
        LOG_INFO("success! Object's qualified name is:");
        LOGBLOB_INFO(qualified_name.name, qualified_name.size, "%s", "name:");
    } else {
        LOG_ERROR("Tss2_Sys_ReadPublic FAILED! Response Code : 0x%x", rc);
        exit(1);
    }

    rc = Tss2_Sys_FlushContext (sapi_context, object_handle);
    if (rc != TSS2_RC_SUCCESS) {
        LOG_ERROR("Tss2_Sys_FlushContext failed: 0x%" PRIx32, rc);
        exit(1);
    }

    return rc;
}
