// This file was extracted from the TCG Published // Trusted Platform Module Library // Part 4: Supporting Routines // Family "2.0" // Level 00 Revision 01.16 // October 30, 2014 #define _SWAP_H // Preclude inclusion of unnecessary simulator header #include <stdlib.h> #include <stdio.h> #include <stdint.h> #include "bool.h" #include "Platform.h" #include "ExecCommand_fp.h" #include "Manufacture_fp.h" #include "DRTM_fp.h" #include "_TPM_Init_fp.h" #include "TpmFail_fp.h" #include <windows.h> #include "TpmTcpProtocol.h" static BOOL s_isPowerOn = FALSE; // // // Functions // // Signal_PowerOn() // // This function processes a power-on indicataion. Amoung other things, it calls the _TPM_Init() hangler. // void _rpc__Signal_PowerOn( BOOL isReset ) { // if power is on and this is not a call to do TPM reset then return if(s_isPowerOn && !isReset) return; // If this is a reset but power is not on, then return if(isReset && !s_isPowerOn) return; // Pass power on signal to platform if(isReset) _plat__Signal_Reset(); else _plat__Signal_PowerOn(); // Pass power on signal to TPM _TPM_Init(); // Set state as power on s_isPowerOn = TRUE; } // // // Signal_PowerOff() // // This function processes the power off indication. Its primary funtion is to set a flag indicating that the next // power on indication should cause _TPM_Init() to be called. // void _rpc__Signal_PowerOff( void ) { if(!s_isPowerOn) return; // Pass power off signal to platform _plat__Signal_PowerOff(); s_isPowerOn = FALSE; return; } // // // _rpc__ForceFailureMode() // // This function is used to debug the Failure Mode logic of the TPM. It will set a flag in the TPM code such // that the next call to TPM2_SelfTest() will result in a failure, putting the TPM into Failure Mode. // void _rpc__ForceFailureMode( void ) { SetForceFailureMode(); } // // // _rpc__Signal_PhysicalPresenceOn() // // This function is called to simulate activation of the physical presence pin. // void _rpc__Signal_PhysicalPresenceOn( void ) { // If TPM is power off, reject this signal if(!s_isPowerOn) return; // Pass physical presence on to platform _plat__Signal_PhysicalPresenceOn(); return; } // // // _rpc__Signal_PhysicalPresenceOff() // // This function is called to simulate deactivation of the physical presence pin. // void _rpc__Signal_PhysicalPresenceOff( void ) { // If TPM is power off, reject this signal if(!s_isPowerOn) return; // Pass physical presence off to platform _plat__Signal_PhysicalPresenceOff(); return; } // // // _rpc__Signal_Hash_Start() // // This function is called to simulate a _TPM_Hash_Start() event. It will call // void _rpc__Signal_Hash_Start( void ) { // If TPM is power off, reject this signal if(!s_isPowerOn) return; // Pass _TPM_Hash_Start signal to TPM Signal_Hash_Start(); return; } // // // _rpc__Signal_Hash_Data() // // This function is called to simulate a _TPM_Hash_Data() event. // void _rpc__Signal_Hash_Data( _IN_BUFFER input ) { // If TPM is power off, reject this signal if(!s_isPowerOn) return; // Pass _TPM_Hash_Data signal to TPM Signal_Hash_Data(input.BufferSize, input.Buffer); return; } // // // _rpc__Signal_HashEnd() // // This function is called to simulate a _TPM_Hash_End() event. // void _rpc__Signal_HashEnd( void ) { // If TPM is power off, reject this signal if(!s_isPowerOn) return; // Pass _TPM_HashEnd signal to TPM Signal_Hash_End(); return; } // // Command interface Entry of a RPC call void _rpc__Send_Command( unsigned char locality, _IN_BUFFER request, _OUT_BUFFER *response ) { // If TPM is power off, reject any commands. if(!s_isPowerOn) { response->BufferSize = 0; return; } // Set the locality of the command so that it doesn't change during the command _plat__LocalitySet(locality); // Do implementation-specific command dispatch ExecuteCommand(request.BufferSize, request.Buffer, &response->BufferSize, &response->Buffer); return; } // // // _rpc__Signal_CancelOn() // // This function is used to turn on the indication to cancel a command in process. An executing command is // not interrupted. The command code may perodically check this indication to see if it should abort the // current command processing and returned TPM_RC_CANCELLED. // void _rpc__Signal_CancelOn( void ) { // If TPM is power off, reject this signal if(!s_isPowerOn) return; // Set the platform canceling flag. _plat__SetCancel(); return; } // // // _rpc__Signal_CancelOff() // // This function is used to turn off the indication to cancel a command in process. // void _rpc__Signal_CancelOff( void ) { // If TPM is power off, reject this signal if(!s_isPowerOn) return; // Set the platform canceling flag. _plat__ClearCancel(); return; } // // // // _rpc__Signal_NvOn() // // In a system where the NV memory used by the TPM is not within the TPM, the NV may not always be // available. This function turns on the indicator that indicates that NV is available. // void _rpc__Signal_NvOn( void ) { // If TPM is power off, reject this signal if(!s_isPowerOn) return; _plat__SetNvAvail(); return; } // // // _rpc__Signal_NvOff() // // This function is used to set the indication that NV memory is no longer available. // void _rpc__Signal_NvOff( void ) { // If TPM is power off, reject this signal if(!s_isPowerOn) return; _plat__ClearNvAvail(); return; } // // // _rpc__Shutdown() // // This function is used to stop the TPM simulator. // void _rpc__Shutdown( void ) { RPC_STATUS status; // Stop TPM TPM_TearDown(); status = RpcMgmtStopServerListening(NULL); if (status != RPC_S_OK) { printf_s("RpcMgmtStopServerListening returned: 0x%x\n", status); exit(status); } status = RpcServerUnregisterIf(NULL, NULL, FALSE); if (status != RPC_S_OK) { printf_s("RpcServerUnregisterIf returned 0x%x\n", status); exit(status); } }