/********************************************************************************/
/*										*/
/*			    TSS Configuration Properties			*/
/*			     Written by Ken Goldman				*/
/*		       IBM Thomas J. Watson Research Center			*/
/*										*/
/* (c) Copyright IBM Corporation 2015 - 2020.					*/
/*										*/
/* All rights reserved.								*/
/* 										*/
/* Redistribution and use in source and binary forms, with or without		*/
/* modification, are permitted provided that the following conditions are	*/
/* met:										*/
/* 										*/
/* Redistributions of source code must retain the above copyright notice,	*/
/* this list of conditions and the following disclaimer.			*/
/* 										*/
/* Redistributions in binary form must reproduce the above copyright		*/
/* notice, this list of conditions and the following disclaimer in the		*/
/* documentation and/or other materials provided with the distribution.		*/
/* 										*/
/* Neither the names of the IBM Corporation nor the names of its		*/
/* contributors may be used to endorse or promote products derived from		*/
/* this software without specific prior written permission.			*/
/* 										*/
/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS		*/
/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT		*/
/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR	*/
/* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT		*/
/* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,	*/
/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT		*/
/* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,	*/
/* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY	*/
/* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT		*/
/* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE	*/
/* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.		*/
/********************************************************************************/

/* This is an internal TSS file, subject to change.  Applications should not include it. */

#ifndef TSSPROPERTIES_H
#define TSSPROPERTIES_H

#include <ibmtss/TPM_Types.h>

#ifdef TPM_WINDOWS

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <winsock2.h>
#include <windows.h>
#include <specstrings.h>

#ifdef TPM_SKIBOOT
#include <libstb/tpm_chip.h>
#endif /* TPM_SKIBOOT */

#ifdef TPM_WINDOWS_TBSI
#include <tbs.h>
#endif /* TPM_WINDOWS_TBSI */

typedef SOCKET TSS_SOCKET_FD;

#endif /* TPM_WINDOWS */

#ifdef TPM_POSIX
#ifndef TPM_NOSOCKET
typedef int TSS_SOCKET_FD;
#endif 	/* TPM_NOSOCKET */
#endif	/* TPM_POSIX */

/* There doesn't seem to be a portable Unix MAXPATHLEN variable, so pick a large number.  The
   directory length will be (currently) 17 bytes smaller. */
#define TPM_DATA_DIR_PATH_LENGTH 256

#ifdef __cplusplus
extern "C" {
#endif

#include <ibmtss/tss.h>
#include "tssauth.h"

    /* Structure to hold session data within the context */

    typedef struct TSS_SESSIONS {
	TPMI_SH_AUTH_SESSION sessionHandle;
	uint8_t *sessionData;
	uint16_t sessionDataLength;
    } TSS_SESSIONS;

    /* Structure to hold transient or persistent object data within the context */

    typedef struct TSS_OBJECT_PUBLIC {
	TPM_HANDLE objectHandle;
	TPM2B_NAME name;
	TPM2B_PUBLIC objectPublic;
    } TSS_OBJECT_PUBLIC;

    /* Structure to hold NV index  data within the context */

    typedef struct TSS_NVPUBLIC {
	TPMI_RH_NV_INDEX nvIndex;
	TPM2B_NAME name;
	TPMS_NV_PUBLIC	nvPublic;
    } TSS_NVPUBLIC;

    /* Context for TSS global parameters.

       NOTE:  Keep this in sync with TSS_Properties_Init() and TSS_Delete() */

    struct TSS_CONTEXT {

	TSS_AUTH_CONTEXT *tssAuthContext;

	/* directory for persistant storage */
	const char *tssDataDirectory;

	/* encrypt saved session state */
	int tssEncryptSessions;

	/* saved session encryption key - void so portable across crypto libraries */
#ifndef TPM_TSS_NOCRYPTO
#ifndef TPM_TSS_NOFILE
	void *tssSessionEncKey;
	void *tssSessionDecKey;
#endif
#endif
	/* a minimal TSS with no file support stores the sessions, objects, and NV metadata in a
	   structure.  Scripting will not work, and persistent objects will not work, but a single
	   application will otherwise work. */
#ifdef TPM_TSS_NOFILE
	TSS_SESSIONS sessions[MAX_ACTIVE_SESSIONS];
	TSS_OBJECT_PUBLIC objectPublic[64];
	TSS_NVPUBLIC nvPublic[64];
#endif
	/* ports, host name, server (packet) type for socket interface */
	short tssCommandPort;
	short tssPlatformPort;
	const char *tssServerName;
	const char *tssServerType;

	/* interface type */
	const char *tssInterfaceType;
	/* locality, supported for socket */
	uint8_t locality;

	/* device driver interface */
	const char *tssDevice;

	/* TRUE for the first time through, indicates that interface open must occur */
	int tssFirstTransmit;
	int tpm12Command;		/* TRUE for TPM 1.2 command */

	/* socket file descriptor */
#ifndef TPM_NOSOCKET
	TSS_SOCKET_FD sock_fd;
#endif 	/* TPM_NOSOCKET */

	/* Linux device file descriptor */
#ifdef TPM_POSIX
	int dev_fd;
#endif	/* TPM_POSIX */

	/* Windows device driver handle */
#ifdef TPM_WINDOWS
#ifdef TPM_WINDOWS_TBSI
	TBS_HCONTEXT hContext;
#endif
#endif

#ifdef TPM_SKIBOOT
	struct tpm_dev *tpm_device;
	struct tpm_driver *tpm_driver;
#endif /* TPM_SKIBOOT */
    };

    TPM_RC TSS_GlobalProperties_Init(void);
    TPM_RC TSS_Properties_Init(TSS_CONTEXT *tssContext);

    TPM_RC TSS_AES_KeyAllocate(void **tssSessionEncKey,
			       void **tssSessionDecKey);
    TPM_RC TSS_AES_KeyFree(void *tssSessionEncKey,
			   void *tssSessionDecKey);

#ifdef __cplusplus
}
#endif



#endif
