/********************************************************************************/
/*                                                                              */
/*                              TPM Types                                       */
/*                           Written by Ken Goldman                             */
/*                     IBM Thomas J. Watson Research Center                     */
/*            $Id: tpmtypes12.h 1257 2018-06-27 20:52:08Z kgoldman $		*/
/*                                                                              */
/* (c) Copyright IBM Corporation 2006, 2018.					*/
/*										*/
/* 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.		*/
/********************************************************************************/

#ifndef TPMTYPES12_H
#define TPMTYPES12_H

#include <stdint.h>

#ifdef TPM_WINDOWS
#include <winsock2.h>
#include <windows.h>
#endif
#if defined (TPM_POSIX) || defined (TPM_SYSTEM_P)
#include <netinet/in.h>         /* for byte order conversions */
#endif

#include <ibmtss/BaseTypes.h>

/* 2.2.1 Basic data types rev 87 */
//typedef unsigned char  BYTE;            /* Basic byte used to transmit all character fields.  */
typedef unsigned char  TPM_BOOL;        /* TRUE/FALSE field. TRUE = 0x01, FALSE = 0x00 Use TPM_BOOL
					   because MS VC++ defines BOOL on Windows */

/* 2.2.2 Boolean types rev 107 */

#undef TRUE
#define TRUE   0x01  /* Assertion   */
#undef FALSE
#define FALSE  0x00  /* Contradiction   */

/* 2.2.3 Helper redefinitions rev 101

   The following definitions are to make the definitions more explicit and easier to read.

   NOTE: They cannot be changed without breaking the serialization.
*/

typedef BYTE  TPM_AUTH_DATA_USAGE;      /* Indicates the conditions where it is required that
                                           authorization be presented.  */
typedef BYTE  TPM_PAYLOAD_TYPE;         /* The information as to what the payload is in an encrypted
                                           structure */
typedef BYTE  TPM_VERSION_BYTE;         /* The version info breakdown */
typedef BYTE  TPM_DA_STATE;             /* The state of the dictionary attack mitigation logic */

/* added kgold */
typedef BYTE  TPM_ENT_TYPE;             /* LSB of TPM_ENTITY_TYPE */
typedef BYTE  TPM_ADIP_ENC_SCHEME;      /* MSB of TPM_ENTITY_TYPE */

typedef uint16_t  TPM_PROTOCOL_ID;	/* The protocol in use.  */
typedef uint16_t  TPM_STARTUP_TYPE;	/* Indicates the start state.  */
typedef uint16_t  TPM_ENC_SCHEME;	/* The definition of the encryption scheme. */
typedef uint16_t  TPM_SIG_SCHEME;	/* The definition of the signature scheme. */
typedef uint16_t  TPM_MIGRATE_SCHEME;	/* The definition of the migration scheme */
typedef uint16_t  TPM_PHYSICAL_PRESENCE; /* Sets the state of the physical presence mechanism. */
typedef uint16_t  TPM_ENTITY_TYPE;	/* Indicates the types of entity that are supported by the
                                           TPM. */
typedef uint16_t  TPM_KEY_USAGE;	/* Indicates the permitted usage of the key.  */
typedef uint16_t  TPM_EK_TYPE;		/* The type of asymmetric encrypted structure in use by the
                                           endorsement key  */
typedef uint16_t  TPM_STRUCTURE_TAG;	/* The tag for the structure */
typedef uint16_t  TPM_PLATFORM_SPECIFIC; /* The platform specific spec to which the information
                                           relates to */
typedef uint32_t  TPM_COMMAND_CODE;	/* The command ordinal. */
typedef uint32_t  TPM_CAPABILITY_AREA;	/* Identifies a TPM capability area. */
typedef uint32_t  TPM_KEY_FLAGS;	/* Indicates information regarding a key. */
//typedef uint32_t  TPM_ALGORITHM_ID;	/* Indicates the type of algorithm.  */
//typedef uint32_t  TPM_MODIFIER_INDICATOR; /* The locality modifier  */
typedef uint32_t  TPM_ACTUAL_COUNT;	/* The actual number of a counter.  */
typedef uint32_t  TPM_TRANSPORT_ATTRIBUTES;	/* Attributes that define what options are in use
                                                   for a transport session */
typedef uint32_t  TPM_AUTHHANDLE;	/* Handle to an authorization session  */
typedef uint32_t  TPM_DIRINDEX;		/* Index to a DIR register  */
typedef uint32_t  TPM_KEY_HANDLE;	/* The area where a key is held assigned by the TPM.  */
typedef uint32_t  TPM_PCRINDEX;		/* Index to a PCR register  */
typedef uint32_t  TPM_RESULT;		/* The return code from a function  */
typedef uint32_t  TPM_RESOURCE_TYPE;	/* The types of resources that a TPM may have using internal
                                           resources */
typedef uint32_t  TPM_KEY_CONTROL;	/* Allows for controlling of the key when loaded and how to
                                           handle TPM_Startup issues  */
typedef uint32_t  TPM12_NV_INDEX;	/* The index into the NV storage area  */
typedef uint32_t  TPM_FAMILY_ID;	/* The family ID. Families ID's are automatically assigned a
                                           sequence number by the TPM. A trusted process can set the
                                           FamilyID value in an individual row to zero, which
                                           invalidates that row. The family ID resets to zero on
                                           each change of TPM Owner.  */
typedef uint32_t  TPM_FAMILY_VERIFICATION;	/* A value used as a label for the most recent
						   verification of this family. Set to zero when not
						   in use.  */
typedef uint32_t  TPM_STARTUP_EFFECTS;	/* How the TPM handles var  */
typedef uint32_t  TPM_SYM_MODE;		/* The mode of a symmetric encryption  */
typedef uint32_t  TPM_FAMILY_FLAGS;	/* The family flags  */
typedef uint32_t  TPM_DELEGATE_INDEX;	/* The index value for the delegate NV table  */
typedef uint32_t  TPM_CMK_DELEGATE;	/* The restrictions placed on delegation of CMK
                                           commands */
typedef uint32_t  TPM_COUNT_ID;		/* The ID value of a monotonic counter  */
typedef uint32_t  TPM_REDIT_COMMAND;	/* A command to execute  */
typedef uint32_t  TPM_TRANSHANDLE;	/* A transport session handle  */
//typedef uint32_t  TPM_HANDLE;		/* A generic handle could be key, transport etc.  */
typedef uint32_t  TPM_FAMILY_OPERATION;	/* What operation is happening  */
#ifdef TPM_VTPM
typedef uint32_t  TPM_INSTANCE_HANDLE;	/* Handle to a virtual TPM instance */
typedef uint32_t  TPM_CREATION_MASK;	/* TPM_CreateInstance creation mask */
#endif

/* Not in specification */

typedef uint16_t  TPM_TAG;		/* The command and response tags */

typedef unsigned char *	TPM_SYMMETRIC_KEY_TOKEN;	/* abstract symmetric key token */
typedef unsigned char *	TPM_BIGNUM;			/* abstract bignum */

#endif
