285 lines
6.3 KiB
C
285 lines
6.3 KiB
C
// 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);
|
|
}
|
|
}
|