diff --git a/src/Makefile.am b/src/Makefile.am index 77ff4884..19ed0980 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -435,6 +435,7 @@ noinst_HEADERS += \ tpm2/PlatformACT_fp.h \ tpm2/PlatformClock.h \ tpm2/PlatformData.h \ + tpm2/platform_public_interface.h \ tpm2/Platform_fp.h \ tpm2/PolicyAuthorize_fp.h \ tpm2/PolicyAuthorizeNV_fp.h \ diff --git a/src/tpm2/Platform.h b/src/tpm2/Platform.h index cdcf5f7f..7c27ea78 100644 --- a/src/tpm2/Platform.h +++ b/src/tpm2/Platform.h @@ -70,5 +70,7 @@ #include "PlatformACT.h" #include "PlatformClock.h" #include "PlatformData.h" +#include "platform_public_interface.h" #include "Platform_fp.h" + #endif // _PLATFORM_H_ diff --git a/src/tpm2/Platform_fp.h b/src/tpm2/Platform_fp.h index ce25c87b..a2182849 100644 --- a/src/tpm2/Platform_fp.h +++ b/src/tpm2/Platform_fp.h @@ -58,349 +58,4 @@ /* */ /********************************************************************************/ -/* C.8 Platform_fp.h */ -#ifndef _PLATFORM_FP_H_ -#define _PLATFORM_FP_H_ - -#include "BaseTypes.h" - -/* C.8.1. From Cancel.c */ -/* C.8.1.1. _plat__IsCanceled() */ -/* Check if the cancel flag is set */ -/* Return Values Meaning */ -/* TRUE(1) if cancel flag is set */ -/* FALSE(0) if cancel flag is not set */ -LIB_EXPORT int -_plat__IsCanceled( - void - ); -/* Set cancel flag. */ -LIB_EXPORT void -_plat__SetCancel( - void - ); -/* C.8.1.2. _plat__ClearCancel() */ -/* Clear cancel flag */ -LIB_EXPORT void -_plat__ClearCancel( - void - ); -/* C.8.2. From Clock.c */ -/* C.8.2.1. _plat__TimerReset() */ -/* This function sets current system clock time as t0 for counting TPM time. This function is called - at a power on event to reset the clock. When the clock is reset, the indication that the clock - was stopped is also set. */ -LIB_EXPORT void -_plat__TimerReset( - void - ); -/* C.8.2.2. _plat__TimerRestart() */ -/* This function should be called in order to simulate the restart of the timer should it be stopped - while power is still applied. */ -LIB_EXPORT void -_plat__TimerRestart( - void - ); -// C.8.2.3. _plat__Time() This is another, probably futile, attempt to define a portable function -// that will return a 64-bit clock value that has mSec resolution. -LIB_EXPORT uint64_t -_plat__RealTime( - void - ); -/* C.8.2.4. _plat__TimerRead() */ -/* This function provides access to the tick timer of the platform. The TPM code uses this value to - drive the TPM Clock. */ -/* The tick timer is supposed to run when power is applied to the device. This timer should not be - reset by time events including _TPM_Init(). It should only be reset when TPM power is - re-applied. */ -/* If the TPM is run in a protected environment, that environment may provide the tick time to the - TPM as long as the time provided by the environment is not allowed to go backwards. If the time - provided by the system can go backwards during a power discontinuity, then the - _plat__Signal_PowerOn() should call _plat__TimerReset(). */ -LIB_EXPORT uint64_t -_plat__TimerRead( - void - ); -/* C.8.2.5. _plat__TimerWasReset() */ -/* This function is used to interrogate the flag indicating if the tick timer has been reset. */ -/* If the resetFlag parameter is SET, then the flag will be CLEAR before the function returns. */ -LIB_EXPORT int -_plat__TimerWasReset( - void - ); -/* C.8.2.6. _plat__TimerWasStopped() */ -/* This function is used to interrogate the flag indicating if the tick timer has been stopped. If - so, this is typically a reason to roll the nonce. */ -/* This function will CLEAR the s_timerStopped flag before returning. This provides functionality - that is similar to status register that is cleared when read. This is the model used here because - it is the one that has the most impact on the TPM code as the flag can only be accessed by one - entity in the TPM. Any other implementation of the hardware can be made to look like a read-once - register. */ -LIB_EXPORT int -_plat__TimerWasStopped( - void - ); -/* C.8.2.7. _plat__ClockAdjustRate() */ -/* Adjust the clock rate */ -LIB_EXPORT void -_plat__ClockAdjustRate( - int adjust // IN: the adjust number. It could be positive - // or negative - ); -/* C.8.3. From Entropy.c */ -// C.8.4. _plat__GetEntropy() -// This function is used to get available hardware entropy. In a hardware implementation of this -// function, there would be no call to the system to get entropy. -/* Return Values Meaning */ -/* < 0 hardware failure of the entropy generator, this is sticky */ -/* >= 0 the returned amount of entropy (bytes) */ -LIB_EXPORT int32_t -_plat__GetEntropy( - unsigned char *entropy, // output buffer - uint32_t amount // amount requested - ); -/* C.8.4. From LocalityPlat.c */ -/* C.8.4.1. _plat__LocalityGet() */ -/* Get the most recent command locality in locality value form. This is an integer value for - locality and not a locality structure The locality can be 0-4 or 32-255. 5-31 is not allowed. */ -LIB_EXPORT unsigned char -_plat__LocalityGet( - void - ); -/* C.8.4.2. _plat__LocalitySet() */ -/* Set the most recent command locality in locality value form */ -LIB_EXPORT void -_plat__LocalitySet( - unsigned char locality - ); -/* C.8.5. From NVMem.c */ -#if 0 /* libtpms added */ -/* C.8.5.1. _plat__NvErrors() */ -/* This function is used by the simulator to set the error flags in the NV subsystem to simulate an error in the NV loading process */ -LIB_EXPORT void -_plat__NvErrors( - int recoverable, - int unrecoverable - ); -#endif /* libtpms added */ -/* C.8.5.2. _plat__NVEnable() */ -/* Enable NV memory. */ -/* This version just pulls in data from a file. In a real TPM, with NV on chip, this function would - verify the integrity of the saved context. If the NV memory was not on chip but was in something - like RPMB, the NV state would be read in, decrypted and integrity checked. */ -/* The recovery from an integrity failure depends on where the error occurred. It it was in the - state that is discarded by TPM Reset, then the error is recoverable if the TPM is - reset. Otherwise, the TPM must go into failure mode. */ -/* Return Values Meaning */ -/* 0 if success */ -/* > 0 if receive recoverable error */ -/* <0 if unrecoverable error */ -LIB_EXPORT int -_plat__NVEnable( - void *platParameter // IN: platform specific parameters - ); -/* libtpms added begin */ -LIB_EXPORT int -_plat__NVEnable_NVChipFile( - void *platParameter // IN: platform specific parameters - ); -/* libtpms added end */ -/* C.8.5.3. _plat__NVDisable() */ -/* Disable NV memory */ -LIB_EXPORT void -_plat__NVDisable( - int delete // IN: If TRUE, delete the NV contents. - ); -/* C.8.6.4. _plat__IsNvAvailable() */ -/* Check if NV is available */ -/* Return Values Meaning */ -/* 0 NV is available */ -/* 1 NV is not available due to write failure */ -/* 2 NV is not available due to rate limit */ -LIB_EXPORT int -_plat__IsNvAvailable( - void - ); -/* C.8.5.5. _plat__NvMemoryRead() */ -/* Function: Read a chunk of NV memory */ -LIB_EXPORT void -_plat__NvMemoryRead( - unsigned int startOffset, // IN: read start - unsigned int size, // IN: size of bytes to read - void *data // OUT: data buffer - ); -/* C.8.5.6. _plat__NvIsDifferent() */ -/* This function checks to see if the NV is different from the test value. This is so that NV will - not be written if it has not changed. */ -/* Return Values Meaning */ -/* TRUE(1) the NV location is different from the test value */ -/* FALSE(0) the NV location is the same as the test value */ -LIB_EXPORT int -_plat__NvIsDifferent( - unsigned int startOffset, // IN: read start - unsigned int size, // IN: size of bytes to read - void *data // IN: data buffer - ); -/* C.8.5.7. _plat__NvMemoryWrite() */ -/* This function is used to update NV memory. The write is to a memory copy of NV. At the end of the - current command, any changes are written to the actual NV memory. */ -/* NOTE: A useful optimization would be for this code to compare the current contents of NV with the - local copy and note the blocks that have changed. Then only write those blocks when - _plat__NvCommit() is called. */ -LIB_EXPORT int -_plat__NvMemoryWrite( - unsigned int startOffset, // IN: write start - unsigned int size, // IN: size of bytes to write - void *data // OUT: data buffer - ); -/* C.8.6.8. _plat__NvMemoryClear() */ -/* Function is used to set a range of NV memory bytes to an implementation-dependent value. The - value represents the erase state of the memory. */ -LIB_EXPORT void -_plat__NvMemoryClear( - unsigned int start, // IN: clear start - unsigned int size // IN: number of bytes to clear - ); -/* C.8.5.9. _plat__NvMemoryMove() */ -/* Function: Move a chunk of NV memory from source to destination This function should ensure that - if there overlap, the original data is copied before it is written */ -LIB_EXPORT void -_plat__NvMemoryMove( - unsigned int sourceOffset, // IN: source offset - unsigned int destOffset, // IN: destination offset - unsigned int size // IN: size of data being moved - ); -/* C.8.5.10. _plat__NvCommit() */ -// This function writes the local copy of NV to NV for permanent store. It will write NV_MEMORY_SIZE -// bytes to NV. If a file is use, the entire file is written. -/* Return Values Meaning */ -/* 0 NV write success */ -/* non-0 NV write fail */ -LIB_EXPORT int -_plat__NvCommit( - void - ); -/* C.8.5.11. _plat__SetNvAvail() */ -/* Set the current NV state to available. This function is for testing purpose only. It is not - part of the platform NV logic */ -LIB_EXPORT void -_plat__SetNvAvail( - void - ); -/* C.8.5.12. _plat__ClearNvAvail() */ -/* Set the current NV state to unavailable. This function is for testing purpose only. It is not - part of the platform NV logic */ -LIB_EXPORT void -_plat__ClearNvAvail( - void - ); - -/* C.6.2.15. _plat__NVNeedsManufacture() */ -/* This function is used by the simulator to determine when the TPM's NV state needs to be manufactured. */ - -LIB_EXPORT int -_plat__NVNeedsManufacture( - void - ); - -/* C.8.6. From PowerPlat.c */ -/* C.8.6.1. _plat__Signal_PowerOn() */ -/* Signal platform power on */ -LIB_EXPORT int -_plat__Signal_PowerOn( - void - ); -/* C.8.6.2. _plat__WasPowerLost() */ -/* Test whether power was lost before a _TPM_Init(). */ -/* This function will clear the hardware indication of power loss before return. This means that - there can only be one spot in the TPM code where this value gets read. This method is used here - as it is the most difficult to manage in the TPM code and, if the hardware actually works this - way, it is hard to make it look like anything else. So, the burden is placed on the TPM code - rather than the platform code */ -/* Return Values Meaning */ -/* TRUE(1) power was lost */ -/* FALSE(0) power was not lost */ -LIB_EXPORT int -_plat__WasPowerLost( - void - ); -/* C.8.6.3. _plat_Signal_Reset() */ -/* This a TPM reset without a power loss. */ -LIB_EXPORT int -_plat__Signal_Reset( - void - ); -/* C.8.6.4. _plat__Signal_PowerOff() */ -/* Signal platform power off */ -LIB_EXPORT void -_plat__Signal_PowerOff( - void - ); - -/* C.8.7. From PPPlat.c */ -/* C.8.7.1. _plat__PhysicalPresenceAsserted() */ -/* Check if physical presence is signaled */ -/* Return Values Meaning */ -/* TRUE(1) if physical presence is signaled */ -/* FALSE(0) if physical presence is not signaled */ -LIB_EXPORT int -_plat__PhysicalPresenceAsserted( - void - ); -#if 0 /* libtpms added */ -/* C.8.7.2. _plat__Signal_PhysicalPresenceOn() */ -/* Signal physical presence on */ -LIB_EXPORT void -_plat__Signal_PhysicalPresenceOn( - void - ); -/* C.8.7.3. _plat__Signal_PhysicalPresenceOff() */ -/* Signal physical presence off */ -LIB_EXPORT void -_plat__Signal_PhysicalPresenceOff( - void - ); -#endif /* libtpms added */ - -/* C.8.8. From RunCommand.c */ -/* C.8.8.1. _plat__RunCommand() */ -/* This version of RunCommand() will set up a jum_buf and call ExecuteCommand(). If the command - executes without failing, it will return and RunCommand() will return. If there is a failure in - the command, then _plat__Fail() is called and it will longjump back to RunCommand() which will - call ExecuteCommand() again. However, this time, the TPM will be in failure mode so - ExecuteCommand() will simply build a failure response and return. */ -LIB_EXPORT void -_plat__RunCommand( - uint32_t requestSize, // IN: command buffer size - unsigned char *request, // IN: command buffer - uint32_t *responseSize, // IN/OUT: response buffer size - unsigned char **response // IN/OUT: response buffer - ); -/* C.8.8.2. _plat__Fail() */ -/* This is the platform depended failure exit for the TPM. */ -LIB_EXPORT NORETURN void -_plat__Fail( - void - ); - -/* C.8.9. From Unique.c */ -/* C.8.9.1 _plat__GetUnique() */ -/* This function is used to access the platform-specific unique value. This function places the - unique value in the provided buffer (b) and returns the number of bytes transferred. The function - will not copy more data than bSize. */ -/* NOTE: If a platform unique value has unequal distribution of uniqueness and bSize is smaller than - the size of the unique value, the bSize portion with the most uniqueness should be returned. */ -LIB_EXPORT uint32_t -_plat__GetUnique( - uint32_t which, // authorities (0) or details - uint32_t bSize, // size of the buffer - unsigned char *b // output buffer - ); - -/* libtpms added begin */ -#include -void ClockAdjustPostResume(UINT64 backthen, BOOL timesAreRealtime); -uint64_t ClockGetTime(clockid_t clk_id); -/* libtpms added end */ - -#endif // _PLATFORM_FP_H_ +#include "platform_public_interface.h" diff --git a/src/tpm2/platform_public_interface.h b/src/tpm2/platform_public_interface.h new file mode 100644 index 00000000..72b87814 --- /dev/null +++ b/src/tpm2/platform_public_interface.h @@ -0,0 +1,399 @@ +/********************************************************************************/ +/* */ +/* */ +/* Written by Ken Goldman */ +/* IBM Thomas J. Watson Research Center */ +/* */ +/* Licenses and Notices */ +/* */ +/* 1. Copyright Licenses: */ +/* */ +/* - Trusted Computing Group (TCG) grants to the user of the source code in */ +/* this specification (the "Source Code") a worldwide, irrevocable, */ +/* nonexclusive, royalty free, copyright license to reproduce, create */ +/* derivative works, distribute, display and perform the Source Code and */ +/* derivative works thereof, and to grant others the rights granted herein. */ +/* */ +/* - The TCG grants to the user of the other parts of the specification */ +/* (other than the Source Code) the rights to reproduce, distribute, */ +/* display, and perform the specification solely for the purpose of */ +/* developing products based on such documents. */ +/* */ +/* 2. Source Code Distribution Conditions: */ +/* */ +/* - Redistributions of Source Code must retain the above copyright licenses, */ +/* this list of conditions and the following disclaimers. */ +/* */ +/* - Redistributions in binary form must reproduce the above copyright */ +/* licenses, this list of conditions and the following disclaimers in the */ +/* documentation and/or other materials provided with the distribution. */ +/* */ +/* 3. Disclaimers: */ +/* */ +/* - THE COPYRIGHT LICENSES SET FORTH ABOVE DO NOT REPRESENT ANY FORM OF */ +/* LICENSE OR WAIVER, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, WITH */ +/* RESPECT TO PATENT RIGHTS HELD BY TCG MEMBERS (OR OTHER THIRD PARTIES) */ +/* THAT MAY BE NECESSARY TO IMPLEMENT THIS SPECIFICATION OR OTHERWISE. */ +/* Contact TCG Administration (admin@trustedcomputinggroup.org) for */ +/* information on specification licensing rights available through TCG */ +/* membership agreements. */ +/* */ +/* - THIS SPECIFICATION IS PROVIDED "AS IS" WITH NO EXPRESS OR IMPLIED */ +/* WARRANTIES WHATSOEVER, INCLUDING ANY WARRANTY OF MERCHANTABILITY OR */ +/* FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, COMPLETENESS, OR */ +/* NONINFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS, OR ANY WARRANTY */ +/* OTHERWISE ARISING OUT OF ANY PROPOSAL, SPECIFICATION OR SAMPLE. */ +/* */ +/* - Without limitation, TCG and its members and licensors disclaim all */ +/* liability, including liability for infringement of any proprietary */ +/* rights, relating to use of information in this specification and to the */ +/* implementation of this specification, and TCG disclaims all liability for */ +/* cost of procurement of substitute goods or services, lost profits, loss */ +/* of use, loss of data or any incidental, consequential, direct, indirect, */ +/* or special damages, whether under contract, tort, warranty or otherwise, */ +/* arising in any way out of use or reliance upon this specification or any */ +/* information herein. */ +/* */ +/* (c) Copyright IBM Corp. and others, 2023 */ +/* */ +/********************************************************************************/ + +// This file contains the interface into the platform layer from external callers. +// External callers are expected to be implementation specific, and may be a simulator +// or some other implementation + +#ifndef _PLATFORM_PUBLIC_INTERFACE_H_ +#define _PLATFORM_PUBLIC_INTERFACE_H_ + +#include "BaseTypes.h" + +#include + +//** From Cancel.c + +/* C.8.1.1. _plat__IsCanceled() */ +/* Check if the cancel flag is set */ +/* Return Values Meaning */ +/* TRUE(1) if cancel flag is set */ +/* FALSE(0) if cancel flag is not set */ +LIB_EXPORT int _plat__IsCanceled(void); + +// Set cancel flag. +LIB_EXPORT void _plat__SetCancel(void); + +//***_plat__ClearCancel() +// Clear cancel flag +LIB_EXPORT void _plat__ClearCancel(void); + +//** From Clock.c + +//***_plat__TimerReset() +// This function sets current system clock time as t0 for counting TPM time. +// This function is called at a power on event to reset the clock. When the clock +// is reset, the indication that the clock was stopped is also set. +LIB_EXPORT void _plat__TimerReset(void); + +//*** _plat__TimerRestart() +// This function should be called in order to simulate the restart of the timer +// should it be stopped while power is still applied. +LIB_EXPORT void _plat__TimerRestart(void); + +//*** _plat__RealTime() +// This is another, probably futile, attempt to define a portable function +// that will return a 64-bit clock value that has mSec resolution. +LIB_EXPORT uint64_t _plat__RealTime(void); + +/* C.8.2.4. _plat__TimerRead() */ +/* This function provides access to the tick timer of the platform. The TPM code uses this value to + drive the TPM Clock. */ +/* The tick timer is supposed to run when power is applied to the device. This timer should not be + reset by time events including _TPM_Init(). It should only be reset when TPM power is + re-applied. */ +/* If the TPM is run in a protected environment, that environment may provide the tick time to the + TPM as long as the time provided by the environment is not allowed to go backwards. If the time + provided by the system can go backwards during a power discontinuity, then the + _plat__Signal_PowerOn() should call _plat__TimerReset(). */ +LIB_EXPORT uint64_t +_plat__TimerRead( + void + ); +/* C.8.2.5. _plat__TimerWasReset() */ +/* This function is used to interrogate the flag indicating if the tick timer has been reset. */ +/* If the resetFlag parameter is SET, then the flag will be CLEAR before the function returns. */ +LIB_EXPORT int +_plat__TimerWasReset( + void + ); +/* C.8.2.6. _plat__TimerWasStopped() */ +/* This function is used to interrogate the flag indicating if the tick timer has been stopped. If + so, this is typically a reason to roll the nonce. */ +/* This function will CLEAR the s_timerStopped flag before returning. This provides functionality + that is similar to status register that is cleared when read. This is the model used here because + it is the one that has the most impact on the TPM code as the flag can only be accessed by one + entity in the TPM. Any other implementation of the hardware can be made to look like a read-once + register. */ +LIB_EXPORT int +_plat__TimerWasStopped( + void + ); +/* C.8.2.7. _plat__ClockAdjustRate() */ +/* Adjust the clock rate */ +LIB_EXPORT void +_plat__ClockAdjustRate( + int adjust // IN: the adjust number. It could be positive + // or negative + ); +/* C.8.3. From Entropy.c */ +// C.8.4. _plat__GetEntropy() +// This function is used to get available hardware entropy. In a hardware implementation of this +// function, there would be no call to the system to get entropy. +/* Return Values Meaning */ +/* < 0 hardware failure of the entropy generator, this is sticky */ +/* >= 0 the returned amount of entropy (bytes) */ +LIB_EXPORT int32_t +_plat__GetEntropy( + unsigned char *entropy, // output buffer + uint32_t amount // amount requested + ); + +//** From LocalityPlat.c + +/* C.8.4.1. _plat__LocalityGet() */ +/* Get the most recent command locality in locality value form. This is an integer value for + locality and not a locality structure The locality can be 0-4 or 32-255. 5-31 is not allowed. */ +LIB_EXPORT unsigned char +_plat__LocalityGet( + void + ); + +//***_plat__LocalitySet() +// Set the most recent command locality in locality value form +LIB_EXPORT void _plat__LocalitySet(unsigned char locality); + +#if 0 /* libtpms added */ +//** From NVMem.c + +//*** _plat__NvErrors() +// This function is used by the simulator to set the error flags in the NV +// subsystem to simulate an error in the NV loading process +LIB_EXPORT void _plat__NvErrors(int recoverable, int unrecoverable); +#endif /* libtpms added */ + +/* C.8.5.2. _plat__NVEnable() */ +/* Enable NV memory. */ +/* This version just pulls in data from a file. In a real TPM, with NV on chip, this function would + verify the integrity of the saved context. If the NV memory was not on chip but was in something + like RPMB, the NV state would be read in, decrypted and integrity checked. */ +/* The recovery from an integrity failure depends on where the error occurred. It it was in the + state that is discarded by TPM Reset, then the error is recoverable if the TPM is + reset. Otherwise, the TPM must go into failure mode. */ +/* Return Values Meaning */ +/* 0 if success */ +/* > 0 if receive recoverable error */ +/* <0 if unrecoverable error */ +LIB_EXPORT int +_plat__NVEnable( + void *platParameter // IN: platform specific parameters + ); + +/* libtpms added begin */ +LIB_EXPORT int +_plat__NVEnable_NVChipFile( + void *platParameter // IN: platform specific parameters + ); + +/* libtpms added end */ + +//***_plat__NVDisable() +// Disable NV memory +LIB_EXPORT void +_plat__NVDisable( + int delete // IN: If TRUE, delete the NV contents. + ); + +/* C.8.6.4. _plat__IsNvAvailable() */ +/* Check if NV is available */ +/* Return Values Meaning */ +/* 0 NV is available */ +/* 1 NV is not available due to write failure */ +/* 2 NV is not available due to rate limit */ +LIB_EXPORT int +_plat__IsNvAvailable( + void + ); + +/* C.8.5.5. _plat__NvMemoryRead() */ +/* Function: Read a chunk of NV memory */ +LIB_EXPORT void +_plat__NvMemoryRead( + unsigned int startOffset, // IN: read start + unsigned int size, // IN: size of bytes to read + void *data // OUT: data buffer + ); + +/* C.8.5.6. _plat__NvIsDifferent() */ +/* This function checks to see if the NV is different from the test value. This is so that NV will + not be written if it has not changed. */ +/* Return Values Meaning */ +/* TRUE(1) the NV location is different from the test value */ +/* FALSE(0) the NV location is the same as the test value */ +LIB_EXPORT int +_plat__NvIsDifferent( + unsigned int startOffset, // IN: read start + unsigned int size, // IN: size of bytes to read + void *data // IN: data buffer + ); + +/* C.8.5.7. _plat__NvMemoryWrite() */ +/* This function is used to update NV memory. The write is to a memory copy of NV. At the end of the + current command, any changes are written to the actual NV memory. */ +/* NOTE: A useful optimization would be for this code to compare the current contents of NV with the + local copy and note the blocks that have changed. Then only write those blocks when + _plat__NvCommit() is called. */ +LIB_EXPORT int +_plat__NvMemoryWrite( + unsigned int startOffset, // IN: write start + unsigned int size, // IN: size of bytes to write + void *data // OUT: data buffer + ); + +/* C.8.6.8. _plat__NvMemoryClear() */ +/* Function is used to set a range of NV memory bytes to an implementation-dependent value. The + value represents the erase state of the memory. */ +LIB_EXPORT void +_plat__NvMemoryClear( + unsigned int start, // IN: clear start + unsigned int size // IN: number of bytes to clear + ); + +/* C.8.5.9. _plat__NvMemoryMove() */ +/* Function: Move a chunk of NV memory from source to destination This function should ensure that + if there overlap, the original data is copied before it is written */ +LIB_EXPORT void +_plat__NvMemoryMove( + unsigned int sourceOffset, // IN: source offset + unsigned int destOffset, // IN: destination offset + unsigned int size // IN: size of data being moved + ); + +/* C.8.5.10. _plat__NvCommit() */ +// This function writes the local copy of NV to NV for permanent store. It will write NV_MEMORY_SIZE +// bytes to NV. If a file is use, the entire file is written. +/* Return Values Meaning */ +/* 0 NV write success */ +/* non-0 NV write fail */ +LIB_EXPORT int +_plat__NvCommit( + void + ); + +//***_plat__SetNvAvail() +// Set the current NV state to available. This function is for testing purpose +// only. It is not part of the platform NV logic +LIB_EXPORT void _plat__SetNvAvail(void); + +//***_plat__ClearNvAvail() +// Set the current NV state to unavailable. This function is for testing purpose +// only. It is not part of the platform NV logic +LIB_EXPORT void _plat__ClearNvAvail(void); + +//*** _plat__NVNeedsManufacture() +// This function is used by the simulator to determine when the TPM's NV state +// needs to be manufactured. +LIB_EXPORT int _plat__NVNeedsManufacture(void); + +//** From PowerPlat.c + +//***_plat__Signal_PowerOn() +// Signal platform power on +LIB_EXPORT int _plat__Signal_PowerOn(void); + +/* C.8.6.2. _plat__WasPowerLost() */ +/* Test whether power was lost before a _TPM_Init(). */ +/* This function will clear the hardware indication of power loss before return. This means that + there can only be one spot in the TPM code where this value gets read. This method is used here + as it is the most difficult to manage in the TPM code and, if the hardware actually works this + way, it is hard to make it look like anything else. So, the burden is placed on the TPM code + rather than the platform code */ +/* Return Values Meaning */ +/* TRUE(1) power was lost */ +/* FALSE(0) power was not lost */ +LIB_EXPORT int +_plat__WasPowerLost( + void + ); + +//*** _plat_Signal_Reset() +// This a TPM reset without a power loss. +LIB_EXPORT int _plat__Signal_Reset(void); + +//***_plat__Signal_PowerOff() +// Signal platform power off +LIB_EXPORT void _plat__Signal_PowerOff(void); + +//** From PPPlat.c +/* C.8.7.1. _plat__PhysicalPresenceAsserted() */ +/* Check if physical presence is signaled */ +/* Return Values Meaning */ +/* TRUE(1) if physical presence is signaled */ +/* FALSE(0) if physical presence is not signaled */ +LIB_EXPORT int +_plat__PhysicalPresenceAsserted( + void + ); + +#if 0 /* libtpms added */ +//***_plat__Signal_PhysicalPresenceOn() +// Signal physical presence on +LIB_EXPORT void _plat__Signal_PhysicalPresenceOn(void); + +//***_plat__Signal_PhysicalPresenceOff() +// Signal physical presence off +LIB_EXPORT void _plat__Signal_PhysicalPresenceOff(void); + +#endif /* libtpms added */ + +//** From RunCommand.c + +//***_plat__RunCommand() +// This version of RunCommand will set up a jum_buf and call ExecuteCommand(). If +// the command executes without failing, it will return and RunCommand will return. +// If there is a failure in the command, then _plat__Fail() is called and it will +// longjump back to RunCommand which will call ExecuteCommand again. However, this +// time, the TPM will be in failure mode so ExecuteCommand will simply build +// a failure response and return. +LIB_EXPORT void _plat__RunCommand( + uint32_t requestSize, // IN: command buffer size + unsigned char* request, // IN: command buffer + uint32_t* responseSize, // IN/OUT: response buffer size + unsigned char** response // IN/OUT: response buffer + ); + +/* C.8.8.2. _plat__Fail() */ +/* This is the platform depended failure exit for the TPM. */ +LIB_EXPORT NORETURN void +_plat__Fail( + void + ); + +/* C.8.9. From Unique.c */ +/* C.8.9.1 _plat__GetUnique() */ +/* This function is used to access the platform-specific unique value. This function places the + unique value in the provided buffer (b) and returns the number of bytes transferred. The function + will not copy more data than bSize. */ +/* NOTE: If a platform unique value has unequal distribution of uniqueness and bSize is smaller than + the size of the unique value, the bSize portion with the most uniqueness should be returned. */ +LIB_EXPORT uint32_t +_plat__GetUnique( + uint32_t which, // authorities (0) or details + uint32_t bSize, // size of the buffer + unsigned char *b // output buffer + ); + +/* libtpms added begin */ +#include +void ClockAdjustPostResume(UINT64 backthen, BOOL timesAreRealtime); +uint64_t ClockGetTime(clockid_t clk_id); +/* libtpms added end */ + +#endif // _PLATFORM_PUBLIC_INTERFACE_H_