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

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include "tss2-esys/esys_iutil.h"
#include "tss2_esys.h"

/*
 * Esys handles for dummy session and key objects, and initialization values for
 * other objects, which can be used in ESAPI test calls
 */

#define DUMMY_TR_HANDLE_POLICY_SESSION     ESYS_TR_MIN_OBJECT
#define DUMMY_TR_HANDLE_KEY                ESYS_TR_MIN_OBJECT + 1
#define DUMMY_TR_HANDLE_NV_INDEX           ESYS_TR_MIN_OBJECT + 2
#define DUMMY_TR_HANDLE_HIERARCHY_OWNER    ESYS_TR_MIN_OBJECT + 3
#define DUMMY_TR_HANDLE_HIERARCHY_PLATFORM ESYS_TR_MIN_OBJECT + 4
#define DUMMY_TR_HANDLE_PRIVACY_ADMIN      ESYS_TR_MIN_OBJECT + 5
#define DUMMY_TR_HANDLE_HMAC_SESSION       ESYS_TR_MIN_OBJECT + 6
#define DUMMY_TR_HANDLE_LOCKOUT            ESYS_TR_MIN_OBJECT + 7
#define DUMMY_IN_PUBLIC_DATA                                                                       \
    {                                                                                              \
        .size = 0, \
        .publicArea = { \
            .type = TPM2_ALG_ECC, \
            .nameAlg = TPM2_ALG_SHA256, \
            .objectAttributes = (TPMA_OBJECT_USERWITHAUTH | \
                                 TPMA_OBJECT_RESTRICTED | \
                                 TPMA_OBJECT_SIGN_ENCRYPT | \
                                 TPMA_OBJECT_FIXEDTPM | \
                                 TPMA_OBJECT_FIXEDPARENT | \
                                 TPMA_OBJECT_SENSITIVEDATAORIGIN), \
            .authPolicy = { \
                 .size = 0, \
             }, \
            .parameters.eccDetail = { \
                 .symmetric = { \
                     .algorithm = \
                     TPM2_ALG_AES, \
                     .keyBits.aes = \
                     128, \
                     .mode.aes = \
                     TPM2_ALG_ECB, \
                 }, \
                 .scheme = { \
                      .scheme = \
                      TPM2_ALG_ECDSA, \
                      .details = { \
                          .ecdsa = \
                          {. \
                           hashAlg \
                           = \
                           TPM2_ALG_SHA256}}, \
                  }, \
                 .curveID = TPM2_ECC_NIST_P256, \
                 .kdf = { \
                      .scheme = TPM2_ALG_KDF1_SP800_56A, \
                      .details = {}} \
             }, \
            .unique.ecc = { \
                 .x = {.size = 0,.buffer = {}}, \
                 .y = {.size = 0,.buffer = {}}, \
             }, \
        },                                                                               \
    }

#define DUMMY_TPMT_PUBLIC_PARAMS                                                                   \
    {                                                                                              \
        .type = TPM2_ALG_ECC, \
            .parameters.eccDetail = { \
            .symmetric = { \
                 .algorithm = \
                 TPM2_ALG_AES, \
                 .keyBits.aes = \
                 128, \
                 .mode.aes = \
                 TPM2_ALG_ECB, \
             }, \
            .scheme = { \
                 .scheme = \
                 TPM2_ALG_ECDSA, \
                 .details = { \
                     .ecdsa = \
                     {. \
                      hashAlg \
                      = \
                      TPM2_ALG_SHA256}}, \
             }, \
            .curveID = TPM2_ECC_NIST_P256, \
            .kdf = { \
                 .scheme = TPM2_ALG_KDF1_SP800_56A, \
                 .details = {}} \
        }                                                                    \
    }

#define DUMMY_2B_DATA(NAME)                                                                        \
    {                                                                                              \
        .size = 20, NAME                                                                           \
                    = { 1,                                                                         \
                        2,                                                                         \
                        3,                                                                         \
                        4,                                                                         \
                        5,                                                                         \
                        6,                                                                         \
                        7,                                                                         \
                        8,                                                                         \
                        9,                                                                         \
                        10,                                                                        \
                        11,                                                                        \
                        12,                                                                        \
                        13,                                                                        \
                        14,                                                                        \
                        15,                                                                        \
                        16,                                                                        \
                        17,                                                                        \
                        18,                                                                        \
                        19,                                                                        \
                        20 }                                                                       \
    }

#define DUMMY_2B_DATA16(NAME)                                                                      \
    {                                                                                              \
        .size = 16, NAME = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }               \
    }

#define DUMMY_2B_DATA0                                                                             \
    { .size = 0, .buffer = {}, }

#define DUMMY_SYMMETRIC                                                                            \
    {                                                                                              \
        .algorithm = TPM2_ALG_AES, .keyBits = { .aes = 128 }, .mode = {.aes = TPM2_ALG_CFB }       \
    }

#define DUMMY_TPMT_TK_AUTH                                                                         \
    {                                                                                              \
        .tag = TPM2_ST_AUTH_SIGNED, .hierarchy = TPM2_RH_OWNER, .digest = { 0 }                    \
    }

#define DUMMY_TPMT_TK_CREATION                                                                     \
    {                                                                                              \
        .tag = TPM2_ST_CREATION, .hierarchy = TPM2_RH_OWNER, .digest = { 0 }                       \
    }

#define DUMMY_TPMT_TK_VERIFIED                                                                     \
    {                                                                                              \
        .tag = TPM2_ST_VERIFIED, .hierarchy = TPM2_RH_OWNER, .digest = { 0 }                       \
    }

#define DUMMY_TPMT_TK_HASHCHECK                                                                    \
    {                                                                                              \
        .tag = TPM2_ST_HASHCHECK, .hierarchy = TPM2_RH_OWNER, .digest = { 0 }                      \
    }

#define DUMMY_RSA_DECRYPT                                                                          \
    { .scheme = TPM2_ALG_RSAPSS }

#define DUMMY_TPMT_SIGNATURE                                                                       \
    { .sigAlg = TPM2_ALG_RSAPSS,                                                                   \
      .signature = { .rsapss = { .hash = TPM2_ALG_SHA1, .sig = { 0 } } } };
#endif
