1 // 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> 12 #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" 21 static 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 // 30 void 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 // 58 void 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 // 76 void 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 // 89 void 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 // 106 void 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 // 123 void 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 // 140 void 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 // 157 void 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 170 void 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 // 197 void 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 // 214 void 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 // 233 void 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 // 249 void 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 // 265 void 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 } 286