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

#ifndef IFAPI_PROFILES_H
#define IFAPI_PROFILES_H

#include "ifapi_io.h"
#include "ifapi_policy_types.h"

/** Internal structure for FAPI profiles
 */
typedef struct IFAPI_PROFILE {
    TPMI_ALG_PUBLIC                                type;    /**< The algorithm used for key creation */
    char                                  *srk_template;    /**< name of SRK template */
    char                                   *ek_template;    /**< name of EK template */
    TPMT_SIG_SCHEME                  ecc_signing_scheme;    /**< < Signing scheme for the ECC key. */
    TPMT_SIG_SCHEME                  rsa_signing_scheme;    /**< < Signing scheme for the RSA key. */
    TPMT_RSA_DECRYPT                 rsa_decrypt_scheme;    /**< < Decrypt scheme for the RSA key. */
    TPMI_ALG_SYM_MODE                          sym_mode;    /**< < Mode for symmectric encryption. */
    TPMT_SYM_DEF_OBJECT                  sym_parameters;    /**< < Parameters for symmectric encryption. */
    UINT16                               sym_block_size;    /**< < Block size for symmectric encryption. */
    TPML_PCR_SELECTION                    pcr_selection;    /**< < Parameters for symmectric encryption. */
    TPMI_ALG_HASH                               nameAlg;
    TPMI_RSA_KEY_BITS                           keyBits;
    UINT32                                     exponent;
    TPMI_ECC_CURVE                              curveID;
    TPMT_SYM_DEF                      session_symmetric;
    TPMS_POLICY                              *eh_policy;
    TPMS_POLICY                              *sh_policy;
    TPMS_POLICY                              *ek_policy;
    TPMS_POLICY                             *srk_policy;
    TPMS_POLICY                         *lockout_policy;
    UINT32                                  newMaxTries;
    UINT32                              newRecoveryTime;
    UINT32                              lockoutRecovery;
} IFAPI_PROFILE;

/* An entry for the dictionary of loaded profiles */
typedef struct IFAPI_PROFILE_ENTRY {
    /** Name of a profile */
    char *name;
    /** Values for a profile */
    struct IFAPI_PROFILE profile;
} IFAPI_PROFILE_ENTRY;

typedef struct IFAPI_PROFILES {
    char *default_name;
    struct IFAPI_PROFILE default_profile;
    /* Dictionary of loaded profiles */
    struct IFAPI_PROFILE_ENTRY *profiles;
    char **filenames;
    /* Size of the loaded profiles dictionary */
    size_t num_profiles;
    size_t profiles_idx;
} IFAPI_PROFILES;

TSS2_RC
ifapi_profiles_initialize_async(
    IFAPI_PROFILES *profiles,
    IFAPI_IO *io,
    const char *profilesdir,
    const char *defaultprofile);

TSS2_RC
ifapi_profiles_initialize_finish(
    IFAPI_PROFILES *profiles,
    IFAPI_IO *io);

TSS2_RC
ifapi_profiles_get(
    const IFAPI_PROFILES *profiles,
    const char *name,
    const IFAPI_PROFILE **profile);

void
ifapi_profiles_finalize(
    IFAPI_PROFILES *profiles);

#endif /* IFAPI_OBJECT_H */
