blob: a6ba9910a346dfb587dcae895f70e22bdef87086 [file] [log] [blame]
Vadim Bendebury56797522015-05-20 10:32:25 -07001// This file was extracted from the TCG Published
2// Trusted Platform Module Library
3// Part 4: Supporting Routines
4// Family "2.0"
5// Level 00 Revision 01.16
6// October 30, 2014
7
8#define _SWAP_H // Preclude inclusion of unnecessary simulator header
9#include <stdlib.h>
10#include <stdio.h>
11#include <stdint.h>
Vadim Bendebury56797522015-05-20 10:32:25 -070012#include "bool.h"
13#include "Platform.h"
14#include "ExecCommand_fp.h"
15#include "Manufacture_fp.h"
16#include "DRTM_fp.h"
17#include "_TPM_Init_fp.h"
18#include "TpmFail_fp.h"
19#include <windows.h>
20#include "TpmTcpProtocol.h"
21static BOOL s_isPowerOn = FALSE;
22//
23//
24// Functions
25//
26// Signal_PowerOn()
27//
28// This function processes a power-on indicataion. Amoung other things, it calls the _TPM_Init() hangler.
29//
30void
31_rpc__Signal_PowerOn(
32 BOOL isReset
33 )
34{
35 // if power is on and this is not a call to do TPM reset then return
36 if(s_isPowerOn && !isReset)
37 return;
38 // If this is a reset but power is not on, then return
39 if(isReset && !s_isPowerOn)
40 return;
41 // Pass power on signal to platform
42 if(isReset)
43 _plat__Signal_Reset();
44 else
45 _plat__Signal_PowerOn();
46 // Pass power on signal to TPM
47 _TPM_Init();
48 // Set state as power on
49 s_isPowerOn = TRUE;
50}
51//
52//
53// Signal_PowerOff()
54//
55// This function processes the power off indication. Its primary funtion is to set a flag indicating that the next
56// power on indication should cause _TPM_Init() to be called.
57//
58void
59_rpc__Signal_PowerOff(
60 void
61 )
62{
63 if(!s_isPowerOn) return;
64 // Pass power off signal to platform
65 _plat__Signal_PowerOff();
66 s_isPowerOn = FALSE;
67 return;
68}
69//
70//
71// _rpc__ForceFailureMode()
72//
73// This function is used to debug the Failure Mode logic of the TPM. It will set a flag in the TPM code such
74// that the next call to TPM2_SelfTest() will result in a failure, putting the TPM into Failure Mode.
75//
76void
77_rpc__ForceFailureMode(
78 void
79 )
80{
81 SetForceFailureMode();
82}
83//
84//
85// _rpc__Signal_PhysicalPresenceOn()
86//
87// This function is called to simulate activation of the physical presence pin.
88//
89void
90_rpc__Signal_PhysicalPresenceOn(
91 void
92 )
93{
94 // If TPM is power off, reject this signal
95 if(!s_isPowerOn) return;
96 // Pass physical presence on to platform
97 _plat__Signal_PhysicalPresenceOn();
98 return;
99}
100//
101//
102// _rpc__Signal_PhysicalPresenceOff()
103//
104// This function is called to simulate deactivation of the physical presence pin.
105//
106void
107_rpc__Signal_PhysicalPresenceOff(
108 void
109 )
110{
111 // If TPM is power off, reject this signal
112 if(!s_isPowerOn) return;
113 // Pass physical presence off to platform
114 _plat__Signal_PhysicalPresenceOff();
115 return;
116}
117//
118//
119// _rpc__Signal_Hash_Start()
120//
121// This function is called to simulate a _TPM_Hash_Start() event. It will call
122//
123void
124_rpc__Signal_Hash_Start(
125 void
126 )
127{
128 // If TPM is power off, reject this signal
129 if(!s_isPowerOn) return;
130 // Pass _TPM_Hash_Start signal to TPM
131 Signal_Hash_Start();
132 return;
133}
134//
135//
136// _rpc__Signal_Hash_Data()
137//
138// This function is called to simulate a _TPM_Hash_Data() event.
139//
140void
141_rpc__Signal_Hash_Data(
142 _IN_BUFFER input
143 )
144{
145 // If TPM is power off, reject this signal
146 if(!s_isPowerOn) return;
147 // Pass _TPM_Hash_Data signal to TPM
148 Signal_Hash_Data(input.BufferSize, input.Buffer);
149 return;
150}
151//
152//
153// _rpc__Signal_HashEnd()
154//
155// This function is called to simulate a _TPM_Hash_End() event.
156//
157void
158_rpc__Signal_HashEnd(
159 void
160 )
161{
162 // If TPM is power off, reject this signal
163 if(!s_isPowerOn) return;
164 // Pass _TPM_HashEnd signal to TPM
165 Signal_Hash_End();
166 return;
167}
168//
169// Command interface Entry of a RPC call
170void
171_rpc__Send_Command(
172 unsigned char locality,
173 _IN_BUFFER request,
174 _OUT_BUFFER *response
175 )
176{
177 // If TPM is power off, reject any commands.
178 if(!s_isPowerOn) {
179 response->BufferSize = 0;
180 return;
181 }
182 // Set the locality of the command so that it doesn't change during the command
183 _plat__LocalitySet(locality);
184 // Do implementation-specific command dispatch
185 ExecuteCommand(request.BufferSize, request.Buffer,
186 &response->BufferSize, &response->Buffer);
187 return;
188}
189//
190//
191// _rpc__Signal_CancelOn()
192//
193// This function is used to turn on the indication to cancel a command in process. An executing command is
194// not interrupted. The command code may perodically check this indication to see if it should abort the
195// current command processing and returned TPM_RC_CANCELLED.
196//
197void
198_rpc__Signal_CancelOn(
199 void
200 )
201{
202 // If TPM is power off, reject this signal
203 if(!s_isPowerOn) return;
204 // Set the platform canceling flag.
205 _plat__SetCancel();
206 return;
207}
208//
209//
210// _rpc__Signal_CancelOff()
211//
212// This function is used to turn off the indication to cancel a command in process.
213//
214void
215_rpc__Signal_CancelOff(
216 void
217 )
218{
219 // If TPM is power off, reject this signal
220 if(!s_isPowerOn) return;
221 // Set the platform canceling flag.
222 _plat__ClearCancel();
223 return;
224}
225//
226//
227//
228// _rpc__Signal_NvOn()
229//
230// In a system where the NV memory used by the TPM is not within the TPM, the NV may not always be
231// available. This function turns on the indicator that indicates that NV is available.
232//
233void
234_rpc__Signal_NvOn(
235 void
236 )
237{
238 // If TPM is power off, reject this signal
239 if(!s_isPowerOn) return;
240 _plat__SetNvAvail();
241 return;
242}
243//
244//
245// _rpc__Signal_NvOff()
246//
247// This function is used to set the indication that NV memory is no longer available.
248//
249void
250_rpc__Signal_NvOff(
251 void
252 )
253{
254 // If TPM is power off, reject this signal
255 if(!s_isPowerOn) return;
256 _plat__ClearNvAvail();
257 return;
258}
259//
260//
261// _rpc__Shutdown()
262//
263// This function is used to stop the TPM simulator.
264//
265void
266_rpc__Shutdown(
267 void
268 )
269{
270 RPC_STATUS status;
271 // Stop TPM
272 TPM_TearDown();
273 status = RpcMgmtStopServerListening(NULL);
274 if (status != RPC_S_OK)
275 {
276 printf_s("RpcMgmtStopServerListening returned: 0x%x\n", status);
277 exit(status);
278 }
279 status = RpcServerUnregisterIf(NULL, NULL, FALSE);
280 if (status != RPC_S_OK)
281 {
282 printf_s("RpcServerUnregisterIf returned 0x%x\n", status);
283 exit(status);
284 }
285}