You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
285 lines
6.3 KiB
285 lines
6.3 KiB
// 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); |
|
} |
|
}
|
|
|