Changeset 104923 in vbox for trunk/src/VBox/Devices/Trace
- Timestamp:
- Jun 14, 2024 3:15:25 PM (8 months ago)
- svn:sync-xref-src-repo-rev:
- 163525
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Trace/VBoxTraceLogDecoders.cpp
r104920 r104923 34 34 #include <iprt/errcore.h> 35 35 #include <iprt/log.h> 36 #include <iprt/message.h>37 36 #include <iprt/tracelog-decoder-plugin.h> 38 37 … … 45 44 46 45 /** 47 */ 48 typedef DECLCALLBACKTYPE(void, FNDECODETPM2CC, (PRTTRACELOGDECODERHLP pHlp, PCTPMREQHDR pHdr, size_t cb)); 49 /** Pointer to an event decode callback. */ 50 typedef FNDECODETPM2CC *PFNFNDECODETPM2CC; 46 * Algorithm ID to string mapping. 47 */ 48 typedef struct TPMALGID2STR 49 { 50 uint16_t u16AlgId; 51 const char *pszAlgId; 52 } TPMALGID2STR; 53 typedef const TPMALGID2STR *PCTPMALGID2STR; 54 55 56 /** 57 * The TPM state. 58 */ 59 typedef struct TPMSTATE 60 { 61 /** Command code. */ 62 uint32_t u32CmdCode; 63 /** Command code dependent state. */ 64 union 65 { 66 /** TPM2_CC_GET_CAPABILITY related state. */ 67 struct 68 { 69 /** The capability group to query. */ 70 uint32_t u32Cap; 71 /** Property to query. */ 72 uint32_t u32Property; 73 /** Number of values to return. */ 74 uint32_t u32Count; 75 } GetCapability; 76 /** TPM2_GET_RANDOM related state. */ 77 struct 78 { 79 /** Number of bytes of random data to produce. */ 80 uint16_t cbRnd; 81 } GetRandom; 82 } u; 83 } TPMSTATE; 84 typedef TPMSTATE *PTPMSTATE; 85 86 87 /** 88 */ 89 typedef DECLCALLBACKTYPE(void, FNDECODETPM2CCREQ, (PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PCTPMREQHDR pHdr, size_t cb)); 90 /** Pointer to an event decode request callback. */ 91 typedef FNDECODETPM2CCREQ *PFNFNDECODETPM2CCREQ; 92 93 94 /** 95 */ 96 typedef DECLCALLBACKTYPE(void, FNDECODETPM2CCRESP, (PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PCTPMRESPHDR pHdr, size_t cb)); 97 /** Pointer to an event decode request callback. */ 98 typedef FNDECODETPM2CCRESP *PFNFNDECODETPM2CCRESP; 51 99 52 100 … … 55 103 *********************************************************************************************************************************/ 56 104 105 /** 106 * Algorithm ID to string mapping array. 107 */ 108 static const TPMALGID2STR g_aAlgId2Str[] = 109 { 110 #define TPM_ALGID_2_STR(a_AlgId) { a_AlgId, #a_AlgId } 111 TPM_ALGID_2_STR(TPM2_ALG_ERROR), 112 TPM_ALGID_2_STR(TPM2_ALG_RSA), 113 TPM_ALGID_2_STR(TPM2_ALG_TDES), 114 TPM_ALGID_2_STR(TPM2_ALG_SHA1), 115 TPM_ALGID_2_STR(TPM2_ALG_HMAC), 116 TPM_ALGID_2_STR(TPM2_ALG_AES), 117 TPM_ALGID_2_STR(TPM2_ALG_MGF1), 118 TPM_ALGID_2_STR(TPM2_ALG_KEYEDHASH), 119 TPM_ALGID_2_STR(TPM2_ALG_XOR), 120 TPM_ALGID_2_STR(TPM2_ALG_SHA256), 121 TPM_ALGID_2_STR(TPM2_ALG_SHA384), 122 TPM_ALGID_2_STR(TPM2_ALG_SHA512), 123 TPM_ALGID_2_STR(TPM2_ALG_SHA256_192), 124 TPM_ALGID_2_STR(TPM2_ALG_NULL), 125 TPM_ALGID_2_STR(TPM2_ALG_SM3_256), 126 TPM_ALGID_2_STR(TPM2_ALG_SM4), 127 TPM_ALGID_2_STR(TPM2_ALG_RSASSA), 128 TPM_ALGID_2_STR(TPM2_ALG_RSAES), 129 TPM_ALGID_2_STR(TPM2_ALG_RSAPSS), 130 TPM_ALGID_2_STR(TPM2_ALG_OAEP), 131 TPM_ALGID_2_STR(TPM2_ALG_ECDSA), 132 TPM_ALGID_2_STR(TPM2_ALG_ECDH), 133 TPM_ALGID_2_STR(TPM2_ALG_ECDAA), 134 TPM_ALGID_2_STR(TPM2_ALG_SM2), 135 TPM_ALGID_2_STR(TPM2_ALG_ECSCHNORR), 136 TPM_ALGID_2_STR(TPM2_ALG_ECMQV), 137 TPM_ALGID_2_STR(TPM2_ALG_KDF1_SP800_56A), 138 TPM_ALGID_2_STR(TPM2_ALG_KDF2), 139 TPM_ALGID_2_STR(TPM2_ALG_KDF1_SP800_108), 140 TPM_ALGID_2_STR(TPM2_ALG_ECC), 141 TPM_ALGID_2_STR(TPM2_ALG_SYMCIPHER), 142 TPM_ALGID_2_STR(TPM2_ALG_CAMELLIA), 143 TPM_ALGID_2_STR(TPM2_ALG_SHA3_256), 144 TPM_ALGID_2_STR(TPM2_ALG_SHA3_384), 145 TPM_ALGID_2_STR(TPM2_ALG_SHA3_512), 146 TPM_ALGID_2_STR(TPM2_ALG_SHAKE128), 147 TPM_ALGID_2_STR(TPM2_ALG_SHAKE256), 148 TPM_ALGID_2_STR(TPM2_ALG_SHAKE256_192), 149 TPM_ALGID_2_STR(TPM2_ALG_SHAKE256_256), 150 TPM_ALGID_2_STR(TPM2_ALG_SHAKE256_512), 151 TPM_ALGID_2_STR(TPM2_ALG_CMAC), 152 TPM_ALGID_2_STR(TPM2_ALG_CTR), 153 TPM_ALGID_2_STR(TPM2_ALG_OFB), 154 TPM_ALGID_2_STR(TPM2_ALG_CBC), 155 TPM_ALGID_2_STR(TPM2_ALG_CFB), 156 TPM_ALGID_2_STR(TPM2_ALG_ECB), 157 TPM_ALGID_2_STR(TPM2_ALG_CCM), 158 TPM_ALGID_2_STR(TPM2_ALG_GCM), 159 TPM_ALGID_2_STR(TPM2_ALG_KW), 160 TPM_ALGID_2_STR(TPM2_ALG_KWP), 161 TPM_ALGID_2_STR(TPM2_ALG_EAX), 162 TPM_ALGID_2_STR(TPM2_ALG_EDDSA), 163 TPM_ALGID_2_STR(TPM2_ALG_EDDSA_PH), 164 TPM_ALGID_2_STR(TPM2_ALG_LMS), 165 TPM_ALGID_2_STR(TPM2_ALG_XMSS), 166 TPM_ALGID_2_STR(TPM2_ALG_KEYEDXOF), 167 TPM_ALGID_2_STR(TPM2_ALG_KMACXOF128), 168 TPM_ALGID_2_STR(TPM2_ALG_KMACXOF256), 169 TPM_ALGID_2_STR(TPM2_ALG_KMAC128), 170 TPM_ALGID_2_STR(TPM2_ALG_KMAC256) 171 #undef TPM_ALGID_2_STR 172 }; 173 57 174 58 175 /********************************************************************************************************************************* … … 60 177 *********************************************************************************************************************************/ 61 178 62 static DECLCALLBACK(void) vboxTraceLogDecodeEvtTpmDecodeStartupShutdown(PRTTRACELOGDECODERHLP pHlp, PCTPMREQHDR pHdr, size_t cb) 63 { 64 if (cb >= sizeof(uint16_t)) 65 { 66 uint16_t u16TpmSu = RT_BE2H_U16(*(const uint16_t *)(pHdr + 1)); 67 if (u16TpmSu == TPM2_SU_CLEAR) 68 RTMsgInfo(" TPM2_SU_CLEAR\n"); 69 else if (u16TpmSu == TPM2_SU_STATE) 70 RTMsgInfo(" TPM2_SU_STATE\n"); 71 else 72 RTMsgInfo(" Unknown: %#x\n", u16TpmSu); 73 return; 74 } 75 76 pHlp->pfnErrorMsg(pHlp, "Malformed TPM2_CC_STARTUP/TPM2_CC_SHUTDOWN command, not enough room for TPM_SU constant\n"); 179 static const char *vboxTraceLogDecodeEvtTpmAlgId2Str(uint16_t u16AlgId) 180 { 181 for (uint32_t i = 0; i < RT_ELEMENTS(g_aAlgId2Str); i++) 182 if (g_aAlgId2Str[i].u16AlgId == u16AlgId) 183 return g_aAlgId2Str[i].pszAlgId; 184 185 return "<UNKNOWN>"; 186 } 187 188 189 static DECLCALLBACK(void) vboxTraceLogDecodeEvtTpmDecodeStartupShutdownReq(PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PCTPMREQHDR pHdr, size_t cb) 190 { 191 RT_NOREF(pThis, cb); 192 193 uint16_t u16TpmSu = RT_BE2H_U16(*(const uint16_t *)(pHdr + 1)); 194 if (u16TpmSu == TPM2_SU_CLEAR) 195 pHlp->pfnPrintf(pHlp, " TPM2_SU_CLEAR\n"); 196 else if (u16TpmSu == TPM2_SU_STATE) 197 pHlp->pfnPrintf(pHlp, " TPM2_SU_STATE\n"); 198 else 199 pHlp->pfnPrintf(pHlp, " Unknown: %#x\n", u16TpmSu); 77 200 } 78 201 … … 97 220 }; 98 221 99 static DECLCALLBACK(void) vboxTraceLogDecodeEvtTpmDecodeGetCapability(PRTTRACELOGDECODERHLP pHlp, PCTPMREQHDR pHdr, size_t cb) 100 { 101 if (cb >= sizeof(TPM2REQGETCAPABILITY)) 102 { 103 PCTPM2REQGETCAPABILITY pReq = (PCTPM2REQGETCAPABILITY)pHdr; 104 uint32_t u32Cap = RT_BE2H_U32(pReq->u32Cap); 105 uint32_t u32Property = RT_BE2H_U32(pReq->u32Property); 106 uint32_t u32Count = RT_BE2H_U32(pReq->u32Count); 107 if (u32Cap < RT_ELEMENTS(s_aTpm2Caps)) 108 RTMsgInfo(" u32Cap: %s\n" 109 " u32Property: %#x\n" 110 " u32Count: %#x\n", 111 s_aTpm2Caps[u32Cap], u32Property, u32Count); 112 else 113 RTMsgInfo(" u32Cap: %#x (UNKNOWN)\n" 114 " u32Property: %#x\n" 115 " u32Count: %#x\n", 116 u32Cap, u32Property, u32Count); 117 return; 222 static DECLCALLBACK(void) vboxTraceLogDecodeEvtTpmDecodeGetCapabilityReq(PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PCTPMREQHDR pHdr, size_t cb) 223 { 224 RT_NOREF(cb); 225 226 PCTPM2REQGETCAPABILITY pReq = (PCTPM2REQGETCAPABILITY)pHdr; 227 uint32_t u32Cap = RT_BE2H_U32(pReq->u32Cap); 228 uint32_t u32Property = RT_BE2H_U32(pReq->u32Property); 229 uint32_t u32Count = RT_BE2H_U32(pReq->u32Count); 230 231 pThis->u.GetCapability.u32Cap = u32Cap; 232 pThis->u.GetCapability.u32Property = u32Property; 233 pThis->u.GetCapability.u32Count = u32Count; 234 235 if (u32Cap < RT_ELEMENTS(s_aTpm2Caps)) 236 pHlp->pfnPrintf(pHlp, " u32Cap: %s\n" 237 " u32Property: %#x\n" 238 " u32Count: %#x\n", 239 s_aTpm2Caps[u32Cap], u32Property, u32Count); 240 else 241 pHlp->pfnPrintf(pHlp, " u32Cap: %#x (UNKNOWN)\n" 242 " u32Property: %#x\n" 243 " u32Count: %#x\n", 244 u32Cap, u32Property, u32Count); 245 } 246 247 248 static DECLCALLBACK(void) vboxTraceLogDecodeEvtTpmDecodeGetCapabilityResp(PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PCTPMRESPHDR pHdr, size_t cb) 249 { 250 RT_NOREF(pThis, cb); 251 252 PCTPM2RESPGETCAPABILITY pResp = (PCTPM2RESPGETCAPABILITY)pHdr; 253 TPMCAP u32Cap = RT_BE2H_U32(pResp->u32Cap); 254 pHlp->pfnPrintf(pHlp, " fMoreData: %RTbool\n", pResp->fMoreData); 255 if (u32Cap < RT_ELEMENTS(s_aTpm2Caps)) 256 { 257 pHlp->pfnPrintf(pHlp, " u32Cap: %s\n", s_aTpm2Caps[u32Cap]); 258 switch (u32Cap) 259 { 260 case TPM2_CAP_PCRS: 261 { 262 uint32_t u32Count = RT_BE2H_U32(*(uint32_t *)&pResp->abCap[0]); 263 pHlp->pfnPrintf(pHlp, " u32Count: %u\n", u32Count); 264 265 /* Walk the list of PCR selection entries. */ 266 const uint8_t *pbPcrSelection = &pResp->abCap[sizeof(u32Count)]; 267 for (uint32_t i = 0; i < u32Count; i++) 268 { 269 uint16_t u16AlgId = RT_BE2H_U16(*(const uint16_t *)pbPcrSelection); 270 uint8_t cbPcrSelection = *(pbPcrSelection + 2); 271 const char *pszAlgId = vboxTraceLogDecodeEvtTpmAlgId2Str(u16AlgId); 272 273 pbPcrSelection += 3; 274 pHlp->pfnPrintf(pHlp, " u16AlgId: %s\n", pszAlgId); 275 pHlp->pfnPrintf(pHlp, " u8SizeOfSlect: %u\n", cbPcrSelection); 276 pHlp->pfnPrintf(pHlp, " PCRs: "); 277 for (uint8_t idxPcr = 0; idxPcr < cbPcrSelection * 8; idxPcr++) 278 if (RT_BOOL(*(pbPcrSelection + (idxPcr / 8)) & RT_BIT(idxPcr % 8))) 279 pHlp->pfnPrintf(pHlp, "%u ", idxPcr); 280 pbPcrSelection += cbPcrSelection; 281 pHlp->pfnPrintf(pHlp, "\n"); 282 } 283 break; 284 } 285 default: 286 pHlp->pfnPrintf(pHlp, "%.*Rhxd\n", cb - sizeof(TPMYESNO) - sizeof(TPMCAP), &pResp->abCap[0]); 287 break; 288 } 118 289 } 119 120 pHlp->pfnErrorMsg(pHlp, "Malformed TPM2_CC_GET_CAPABILITY command, not enough room for the input\n"); 121 } 122 123 124 static DECLCALLBACK(void) vboxTraceLogDecodeEvtTpmDecodeReadPublic(PRTTRACELOGDECODERHLP pHlp, PCTPMREQHDR pHdr, size_t cb) 125 { 126 if (cb >= sizeof(TPM2REQREADPUBLIC)) 127 { 128 PCTPM2REQREADPUBLIC pReq = (PCTPM2REQREADPUBLIC)pHdr; 129 TPMIDHOBJECT hObj = RT_BE2H_U32(pReq->hObj); 130 RTMsgInfo(" hObj: %#x\n", hObj); 131 return; 290 else 291 { 292 pHlp->pfnPrintf(pHlp, " u32Cap: %#x (UNKNOWN)\n", u32Cap); 293 pHlp->pfnPrintf(pHlp, "%.*Rhxd\n", cb - sizeof(TPMYESNO) - sizeof(TPMCAP), &pResp->abCap[0]); 132 294 } 133 134 pHlp->pfnErrorMsg(pHlp, "Malformed TPM2_CC_READ_PUBLIC command, not enough room for the input\n"); 295 } 296 297 298 static DECLCALLBACK(void) vboxTraceLogDecodeEvtTpmDecodeReadPublicReq(PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PCTPMREQHDR pHdr, size_t cb) 299 { 300 RT_NOREF(pThis, cb); 301 302 PCTPM2REQREADPUBLIC pReq = (PCTPM2REQREADPUBLIC)pHdr; 303 TPMIDHOBJECT hObj = RT_BE2H_U32(pReq->hObj); 304 pHlp->pfnPrintf(pHlp, " hObj: %#x\n", hObj); 305 } 306 307 308 static DECLCALLBACK(void) vboxTraceLogDecodeEvtTpmDecodeGetRandomReq(PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PCTPMREQHDR pHdr, size_t cb) 309 { 310 RT_NOREF(pThis, cb); 311 312 PCTPM2REQGETRANDOM pReq = (PCTPM2REQGETRANDOM)pHdr; 313 pThis->u.GetRandom.cbRnd = RT_BE2H_U16(pReq->u16RandomBytes); 314 pHlp->pfnPrintf(pHlp, " u16RandomBytes: %u\n", pThis->u.GetRandom.cbRnd); 315 } 316 317 318 static DECLCALLBACK(void) vboxTraceLogDecodeEvtTpmDecodeGetRandomResp(PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PCTPMRESPHDR pHdr, size_t cb) 319 { 320 RT_NOREF(pHlp, pThis, cb); 321 PCTPM2RESPGETRANDOM pResp = (PCTPM2RESPGETRANDOM)pHdr; 322 uint16_t cbBuf = RT_BE2H_U16(pResp->Buf.u16Size); 323 if (pThis->u.GetRandom.cbRnd != cbBuf) 324 { 325 pHlp->pfnErrorMsg(pHlp, "Requested random data size doesn't match returned data size (requested %u, returned %u), using smaller value\n", 326 pThis->u.GetRandom.cbRnd, cbBuf); 327 cbBuf = RT_MIN(cbBuf, pThis->u.GetRandom.cbRnd); 328 } 329 330 /** @todo Validate against cb. */ 331 332 pHlp->pfnPrintf(pHlp, "%.*Rhxd\n", cbBuf, pResp->Buf.abBuf); 135 333 } 136 334 … … 138 336 static struct 139 337 { 140 uint32_t u32CmdCode; 141 const char *pszCmdCode; 142 PFNFNDECODETPM2CC pfnDecode; 338 uint32_t u32CmdCode; 339 const char *pszCmdCode; 340 uint32_t cbReqMin; 341 uint32_t cbRespMin; 342 PFNFNDECODETPM2CCREQ pfnDecodeReq; 343 PFNFNDECODETPM2CCRESP pfnDecodeResp; 143 344 } s_aTpmCmdCodes[] = 144 345 { 145 #define TPM_CMD_CODE_INIT(a_CmdCode, a_Desc) { a_CmdCode, #a_CmdCode, a_Desc } 146 TPM_CMD_CODE_INIT(TPM2_CC_NV_UNDEFINE_SPACE_SPECIAL, NULL), 147 TPM_CMD_CODE_INIT(TPM2_CC_EVICT_CONTROL, NULL), 148 TPM_CMD_CODE_INIT(TPM2_CC_HIERARCHY_CONTROL, NULL), 149 TPM_CMD_CODE_INIT(TPM2_CC_NV_UNDEFINE_SPACE, NULL), 150 TPM_CMD_CODE_INIT(TPM2_CC_CHANGE_EPS, NULL), 151 TPM_CMD_CODE_INIT(TPM2_CC_CHANGE_PPS, NULL), 152 TPM_CMD_CODE_INIT(TPM2_CC_CLEAR, NULL), 153 TPM_CMD_CODE_INIT(TPM2_CC_CLEAR_CONTROL, NULL), 154 TPM_CMD_CODE_INIT(TPM2_CC_CLOCK_SET, NULL), 155 TPM_CMD_CODE_INIT(TPM2_CC_HIERARCHY_CHANGE_AUTH, NULL), 156 TPM_CMD_CODE_INIT(TPM2_CC_NV_DEFINE_SPACE, NULL), 157 TPM_CMD_CODE_INIT(TPM2_CC_PCR_ALLOCATE, NULL), 158 TPM_CMD_CODE_INIT(TPM2_CC_PCR_SET_AUTH_POLICY, NULL), 159 TPM_CMD_CODE_INIT(TPM2_CC_PP_COMMANDS, NULL), 160 TPM_CMD_CODE_INIT(TPM2_CC_SET_PRIMARY_POLICY, NULL), 161 TPM_CMD_CODE_INIT(TPM2_CC_FIELD_UPGRADE_START, NULL), 162 TPM_CMD_CODE_INIT(TPM2_CC_CLOCK_RATE_ADJUST, NULL), 163 TPM_CMD_CODE_INIT(TPM2_CC_CREATE_PRIMARY, NULL), 164 TPM_CMD_CODE_INIT(TPM2_CC_NV_GLOBAL_WRITE_LOCK, NULL), 165 TPM_CMD_CODE_INIT(TPM2_CC_GET_COMMAND_AUDIT_DIGEST, NULL), 166 TPM_CMD_CODE_INIT(TPM2_CC_NV_INCREMENT, NULL), 167 TPM_CMD_CODE_INIT(TPM2_CC_NV_SET_BITS, NULL), 168 TPM_CMD_CODE_INIT(TPM2_CC_NV_EXTEND, NULL), 169 TPM_CMD_CODE_INIT(TPM2_CC_NV_WRITE, NULL), 170 TPM_CMD_CODE_INIT(TPM2_CC_NV_WRITE_LOCK, NULL), 171 TPM_CMD_CODE_INIT(TPM2_CC_DICTIONARY_ATTACK_LOCK_RESET, NULL), 172 TPM_CMD_CODE_INIT(TPM2_CC_DICTIONARY_ATTACK_PARAMETERS, NULL), 173 TPM_CMD_CODE_INIT(TPM2_CC_NV_CHANGE_AUTH, NULL), 174 TPM_CMD_CODE_INIT(TPM2_CC_PCR_EVENT, NULL), 175 TPM_CMD_CODE_INIT(TPM2_CC_PCR_RESET, NULL), 176 TPM_CMD_CODE_INIT(TPM2_CC_SEQUENCE_COMPLETE, NULL), 177 TPM_CMD_CODE_INIT(TPM2_CC_SET_ALGORITHM_SET, NULL), 178 TPM_CMD_CODE_INIT(TPM2_CC_SET_COMMAND_CODE_AUDIT_STATUS, NULL), 179 TPM_CMD_CODE_INIT(TPM2_CC_FIELD_UPGRADE_DATA, NULL), 180 TPM_CMD_CODE_INIT(TPM2_CC_INCREMENTAL_SELF_TEST, NULL), 181 TPM_CMD_CODE_INIT(TPM2_CC_SELF_TEST, NULL), 182 TPM_CMD_CODE_INIT(TPM2_CC_STARTUP, vboxTraceLogDecodeEvtTpmDecodeStartupShutdown), 183 TPM_CMD_CODE_INIT(TPM2_CC_SHUTDOWN, vboxTraceLogDecodeEvtTpmDecodeStartupShutdown), 184 TPM_CMD_CODE_INIT(TPM2_CC_STIR_RANDOM, NULL), 185 TPM_CMD_CODE_INIT(TPM2_CC_ACTIVATE_CREDENTIAL, NULL), 186 TPM_CMD_CODE_INIT(TPM2_CC_CERTIFY, NULL), 187 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_NV, NULL), 188 TPM_CMD_CODE_INIT(TPM2_CC_CERTIFY_CREATION, NULL), 189 TPM_CMD_CODE_INIT(TPM2_CC_DUPLICATE, NULL), 190 TPM_CMD_CODE_INIT(TPM2_CC_GET_TIME, NULL), 191 TPM_CMD_CODE_INIT(TPM2_CC_GET_SESSION_AUDIT_DIGEST, NULL), 192 TPM_CMD_CODE_INIT(TPM2_CC_NV_READ, NULL), 193 TPM_CMD_CODE_INIT(TPM2_CC_NV_READ_LOCK, NULL), 194 TPM_CMD_CODE_INIT(TPM2_CC_OBJECT_CHANGE_AUTH, NULL), 195 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_SECRET, NULL), 196 TPM_CMD_CODE_INIT(TPM2_CC_REWRAP, NULL), 197 TPM_CMD_CODE_INIT(TPM2_CC_CREATE, NULL), 198 TPM_CMD_CODE_INIT(TPM2_CC_ECDH_ZGEN, NULL), 199 TPM_CMD_CODE_INIT(TPM2_CC_HMAC_MAC, NULL), 200 TPM_CMD_CODE_INIT(TPM2_CC_IMPORT, NULL), 201 TPM_CMD_CODE_INIT(TPM2_CC_LOAD, NULL), 202 TPM_CMD_CODE_INIT(TPM2_CC_QUOTE, NULL), 203 TPM_CMD_CODE_INIT(TPM2_CC_RSA_DECRYPT, NULL), 204 TPM_CMD_CODE_INIT(TPM2_CC_HMAC_MAC_START, NULL), 205 TPM_CMD_CODE_INIT(TPM2_CC_SEQUENCE_UPDATE, NULL), 206 TPM_CMD_CODE_INIT(TPM2_CC_SIGN, NULL), 207 TPM_CMD_CODE_INIT(TPM2_CC_UNSEAL, NULL), 208 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_SIGNED, NULL), 209 TPM_CMD_CODE_INIT(TPM2_CC_CONTEXT_LOAD, NULL), 210 TPM_CMD_CODE_INIT(TPM2_CC_CONTEXT_SAVE, NULL), 211 TPM_CMD_CODE_INIT(TPM2_CC_ECDH_KEY_GEN, NULL), 212 TPM_CMD_CODE_INIT(TPM2_CC_ENCRYPT_DECRYPT, NULL), 213 TPM_CMD_CODE_INIT(TPM2_CC_FLUSH_CONTEXT, NULL), 214 TPM_CMD_CODE_INIT(TPM2_CC_LOAD_EXTERNAL, NULL), 215 TPM_CMD_CODE_INIT(TPM2_CC_MAKE_CREDENTIAL, NULL), 216 TPM_CMD_CODE_INIT(TPM2_CC_NV_READ_PUBLIC, NULL), 217 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_AUTHORIZE, NULL), 218 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_AUTH_VALUE, NULL), 219 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_COMMAND_CODE, NULL), 220 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_COUNTER_TIMER, NULL), 221 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_CP_HASH, NULL), 222 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_LOCALITY, NULL), 223 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_NAME_HASH, NULL), 224 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_OR, NULL), 225 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_TICKET, NULL), 226 TPM_CMD_CODE_INIT(TPM2_CC_READ_PUBLIC, vboxTraceLogDecodeEvtTpmDecodeReadPublic), 227 TPM_CMD_CODE_INIT(TPM2_CC_RSA_ENCRYPT, NULL), 228 TPM_CMD_CODE_INIT(TPM2_CC_START_AUTH_SESSION, NULL), 229 TPM_CMD_CODE_INIT(TPM2_CC_VERIFY_SIGNATURE, NULL), 230 TPM_CMD_CODE_INIT(TPM2_CC_ECC_PARAMETERS, NULL), 231 TPM_CMD_CODE_INIT(TPM2_CC_FIRMWARE_READ, NULL), 232 TPM_CMD_CODE_INIT(TPM2_CC_GET_CAPABILITY, vboxTraceLogDecodeEvtTpmDecodeGetCapability), 233 TPM_CMD_CODE_INIT(TPM2_CC_GET_RANDOM, NULL), 234 TPM_CMD_CODE_INIT(TPM2_CC_GET_TEST_RESULT, NULL), 235 TPM_CMD_CODE_INIT(TPM2_CC_GET_HASH, NULL), 236 TPM_CMD_CODE_INIT(TPM2_CC_PCR_READ, NULL), 237 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_PCR, NULL), 238 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_RESTART, NULL), 239 TPM_CMD_CODE_INIT(TPM2_CC_READ_CLOCK, NULL), 240 TPM_CMD_CODE_INIT(TPM2_CC_PCR_EXTEND, NULL), 241 TPM_CMD_CODE_INIT(TPM2_CC_PCR_SET_AUTH_VALUE, NULL), 242 TPM_CMD_CODE_INIT(TPM2_CC_NV_CERTIFY, NULL), 243 TPM_CMD_CODE_INIT(TPM2_CC_EVENT_SEQUENCE_COMPLETE, NULL), 244 TPM_CMD_CODE_INIT(TPM2_CC_HASH_SEQUENCE_START, NULL), 245 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_PHYSICAL_PRESENCE, NULL), 246 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_DUPLICATION_SELECT, NULL), 247 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_GET_DIGEST, NULL), 248 TPM_CMD_CODE_INIT(TPM2_CC_TEST_PARMS, NULL), 249 TPM_CMD_CODE_INIT(TPM2_CC_COMMIT, NULL), 250 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_PASSWORD, NULL), 251 TPM_CMD_CODE_INIT(TPM2_CC_ZGEN_2PHASE, NULL), 252 TPM_CMD_CODE_INIT(TPM2_CC_EC_EPHEMERAL, NULL), 253 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_NV_WRITTEN, NULL), 254 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_TEMPLATE, NULL), 255 TPM_CMD_CODE_INIT(TPM2_CC_CREATE_LOADED, NULL), 256 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_AUTHORIZE_NV, NULL), 257 TPM_CMD_CODE_INIT(TPM2_CC_ENCRYPT_DECRYPT_2, NULL), 258 TPM_CMD_CODE_INIT(TPM2_CC_AC_GET_CAPABILITY, NULL), 259 TPM_CMD_CODE_INIT(TPM2_CC_AC_SEND, NULL), 260 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_AC_SEND_SELECT, NULL), 261 TPM_CMD_CODE_INIT(TPM2_CC_CERTIFY_X509, NULL), 262 TPM_CMD_CODE_INIT(TPM2_CC_ACT_SET_TIMEOUT, NULL), 263 TPM_CMD_CODE_INIT(TPM2_CC_ECC_ENCRYPT, NULL), 264 TPM_CMD_CODE_INIT(TPM2_CC_ECC_DECRYPT, NULL), 265 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_CAPABILITY, NULL), 266 TPM_CMD_CODE_INIT(TPM2_CC_POLICY_PARAMETERS, NULL), 267 TPM_CMD_CODE_INIT(TPM2_CC_NV_DEFINE_SPACE_2, NULL), 268 TPM_CMD_CODE_INIT(TPM2_CC_NV_READ_PUBLIC_2, NULL), 269 TPM_CMD_CODE_INIT(TPM2_CC_SET_CAPABILITY, NULL) 346 #define TPM_CMD_CODE_INIT_NOT_IMPL(a_CmdCode) { a_CmdCode, #a_CmdCode, 0, 0, NULL, NULL } 347 #define TPM_CMD_CODE_INIT(a_CmdCode, a_ReqStruct, a_RespStruct, a_pfnReq, a_pfnResp) { a_CmdCode, #a_CmdCode, sizeof(a_ReqStruct), \ 348 sizeof(a_RespStruct), a_pfnReq, a_pfnResp } 349 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_NV_UNDEFINE_SPACE_SPECIAL), 350 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_EVICT_CONTROL), 351 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_HIERARCHY_CONTROL), 352 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_NV_UNDEFINE_SPACE), 353 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_CHANGE_EPS), 354 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_CHANGE_PPS), 355 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_CLEAR), 356 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_CLEAR_CONTROL), 357 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_CLOCK_SET), 358 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_HIERARCHY_CHANGE_AUTH), 359 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_NV_DEFINE_SPACE), 360 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_PCR_ALLOCATE), 361 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_PCR_SET_AUTH_POLICY), 362 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_PP_COMMANDS), 363 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_SET_PRIMARY_POLICY), 364 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_FIELD_UPGRADE_START), 365 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_CLOCK_RATE_ADJUST), 366 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_CREATE_PRIMARY), 367 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_NV_GLOBAL_WRITE_LOCK), 368 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_GET_COMMAND_AUDIT_DIGEST), 369 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_NV_INCREMENT), 370 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_NV_SET_BITS), 371 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_NV_EXTEND), 372 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_NV_WRITE), 373 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_NV_WRITE_LOCK), 374 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_DICTIONARY_ATTACK_LOCK_RESET), 375 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_DICTIONARY_ATTACK_PARAMETERS), 376 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_NV_CHANGE_AUTH), 377 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_PCR_EVENT), 378 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_PCR_RESET), 379 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_SEQUENCE_COMPLETE), 380 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_SET_ALGORITHM_SET), 381 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_SET_COMMAND_CODE_AUDIT_STATUS), 382 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_FIELD_UPGRADE_DATA), 383 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_INCREMENTAL_SELF_TEST), 384 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_SELF_TEST), 385 TPM_CMD_CODE_INIT( TPM2_CC_STARTUP, TPMREQHDR, TPMRESPHDR, vboxTraceLogDecodeEvtTpmDecodeStartupShutdownReq, NULL), 386 TPM_CMD_CODE_INIT( TPM2_CC_SHUTDOWN, TPMREQHDR, TPMRESPHDR, vboxTraceLogDecodeEvtTpmDecodeStartupShutdownReq, NULL), 387 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_STIR_RANDOM), 388 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_ACTIVATE_CREDENTIAL), 389 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_CERTIFY), 390 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_NV), 391 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_CERTIFY_CREATION), 392 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_DUPLICATE), 393 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_GET_TIME), 394 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_GET_SESSION_AUDIT_DIGEST), 395 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_NV_READ), 396 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_NV_READ_LOCK), 397 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_OBJECT_CHANGE_AUTH), 398 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_SECRET), 399 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_REWRAP), 400 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_CREATE), 401 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_ECDH_ZGEN), 402 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_HMAC_MAC), 403 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_IMPORT), 404 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_LOAD), 405 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_QUOTE), 406 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_RSA_DECRYPT), 407 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_HMAC_MAC_START), 408 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_SEQUENCE_UPDATE), 409 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_SIGN), 410 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_UNSEAL), 411 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_SIGNED), 412 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_CONTEXT_LOAD), 413 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_CONTEXT_SAVE), 414 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_ECDH_KEY_GEN), 415 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_ENCRYPT_DECRYPT), 416 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_FLUSH_CONTEXT), 417 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_LOAD_EXTERNAL), 418 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_MAKE_CREDENTIAL), 419 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_NV_READ_PUBLIC), 420 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_AUTHORIZE), 421 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_AUTH_VALUE), 422 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_COMMAND_CODE), 423 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_COUNTER_TIMER), 424 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_CP_HASH), 425 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_LOCALITY), 426 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_NAME_HASH), 427 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_OR), 428 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_TICKET), 429 TPM_CMD_CODE_INIT( TPM2_CC_READ_PUBLIC, TPM2REQREADPUBLIC, TPMRESPHDR, vboxTraceLogDecodeEvtTpmDecodeReadPublicReq, NULL), 430 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_RSA_ENCRYPT), 431 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_START_AUTH_SESSION), 432 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_VERIFY_SIGNATURE), 433 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_ECC_PARAMETERS), 434 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_FIRMWARE_READ), 435 TPM_CMD_CODE_INIT( TPM2_CC_GET_CAPABILITY, TPM2REQGETCAPABILITY, TPM2RESPGETCAPABILITY, vboxTraceLogDecodeEvtTpmDecodeGetCapabilityReq, vboxTraceLogDecodeEvtTpmDecodeGetCapabilityResp), 436 TPM_CMD_CODE_INIT( TPM2_CC_GET_RANDOM, TPM2REQGETRANDOM, TPM2RESPGETRANDOM, vboxTraceLogDecodeEvtTpmDecodeGetRandomReq, vboxTraceLogDecodeEvtTpmDecodeGetRandomResp), 437 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_GET_TEST_RESULT), 438 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_GET_HASH), 439 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_PCR_READ), 440 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_PCR), 441 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_RESTART), 442 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_READ_CLOCK), 443 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_PCR_EXTEND), 444 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_PCR_SET_AUTH_VALUE), 445 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_NV_CERTIFY), 446 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_EVENT_SEQUENCE_COMPLETE), 447 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_HASH_SEQUENCE_START), 448 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_PHYSICAL_PRESENCE), 449 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_DUPLICATION_SELECT), 450 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_GET_DIGEST), 451 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_TEST_PARMS), 452 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_COMMIT), 453 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_PASSWORD), 454 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_ZGEN_2PHASE), 455 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_EC_EPHEMERAL), 456 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_NV_WRITTEN), 457 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_TEMPLATE), 458 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_CREATE_LOADED), 459 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_AUTHORIZE_NV), 460 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_ENCRYPT_DECRYPT_2), 461 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_AC_GET_CAPABILITY), 462 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_AC_SEND), 463 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_AC_SEND_SELECT), 464 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_CERTIFY_X509), 465 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_ACT_SET_TIMEOUT), 466 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_ECC_ENCRYPT), 467 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_ECC_DECRYPT), 468 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_CAPABILITY), 469 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_PARAMETERS), 470 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_NV_DEFINE_SPACE_2), 471 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_NV_READ_PUBLIC_2), 472 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_SET_CAPABILITY) 270 473 #undef TPM_CMD_CODE_INIT 271 474 }; … … 276 479 if (cbCmd >= sizeof(*pHdr)) 277 480 { 278 uint32_t u32CmdCode = RT_BE2H_U32(pHdr->u32Ordinal); 481 uint32_t u32CmdCode = RT_BE2H_U32(pHdr->u32Ordinal); 482 uint32_t cbReqPayload = RT_BE2H_U32(pHdr->cbReq) - sizeof(*pHdr); 483 PTPMSTATE pTpmState = (PTPMSTATE)pHlp->pfnDecoderStateGet(pHlp); 484 485 if (!pTpmState) 486 { 487 int rc = pHlp->pfnDecoderStateCreate(pHlp, sizeof(*pTpmState), NULL, (void **)&pTpmState); 488 if (RT_SUCCESS(rc)) 489 pTpmState->u32CmdCode = u32CmdCode; 490 else 491 pHlp->pfnErrorMsg(pHlp, "Failed to allocate TPM decoder state: %Rrc\n", rc); 492 } 493 else 494 pTpmState->u32CmdCode = u32CmdCode; 495 279 496 for (uint32_t i = 0; i < RT_ELEMENTS(s_aTpmCmdCodes); i++) 280 497 { 281 498 if (s_aTpmCmdCodes[i].u32CmdCode == u32CmdCode) 282 499 { 283 RTMsgInfo(" %s:\n", s_aTpmCmdCodes[i].pszCmdCode); 284 if (s_aTpmCmdCodes[i].pfnDecode) 285 s_aTpmCmdCodes[i].pfnDecode(pHlp, pHdr, RT_BE2H_U32(pHdr->cbReq)); 500 pHlp->pfnPrintf(pHlp, " %s (%u bytes):\n", s_aTpmCmdCodes[i].pszCmdCode, cbReqPayload); 501 if (s_aTpmCmdCodes[i].pfnDecodeReq) 502 { 503 if (cbCmd >= s_aTpmCmdCodes[i].cbReqMin) 504 s_aTpmCmdCodes[i].pfnDecodeReq(pHlp, pTpmState, pHdr, cbReqPayload); 505 else 506 pHlp->pfnErrorMsg(pHlp, "Malformed %s command, not enough room for the input\n", s_aTpmCmdCodes[i].pszCmdCode); 507 } 508 else if (cbReqPayload) 509 pHlp->pfnPrintf(pHlp, "%.*Rhxd\n", cbReqPayload, pHdr + 1); 286 510 return; 287 511 } 288 512 } 289 RTMsgInfo(" <Unknown command code>: %#x\n", u32CmdCode); 513 pHlp->pfnPrintf(pHlp, " <Unknown command code>: %#x\n", u32CmdCode); 514 515 if (cbReqPayload) 516 pHlp->pfnPrintf(pHlp, "%.*Rhxd\n", cbReqPayload, pHdr + 1); 290 517 } 291 518 else 292 RTMsgError("Command buffer is smaller than the request header (required %u, given %zu\n", sizeof(*pHdr), cbCmd);519 pHlp->pfnErrorMsg(pHlp, "Command buffer is smaller than the request header (required %u, given %zu\n", sizeof(*pHdr), cbCmd); 293 520 } 294 521 … … 301 528 if (cbResp >= sizeof(*pHdr)) 302 529 { 303 RTMsgInfo(" Status code: %#x\n", RT_BE2H_U32(pHdr->u32ErrCode)); 530 uint32_t cbRespPayload = RT_BE2H_U32(pHdr->cbResp) - sizeof(*pHdr); 531 532 pHlp->pfnPrintf(pHlp, " Status code: %#x (%u bytes)\n", RT_BE2H_U32(pHdr->u32ErrCode), cbRespPayload); 533 PTPMSTATE pTpmState = (PTPMSTATE)pHlp->pfnDecoderStateGet(pHlp); 534 535 /* Can only decode the response buffer if we know the command code. */ 536 if (pTpmState) 537 { 538 for (uint32_t i = 0; i < RT_ELEMENTS(s_aTpmCmdCodes); i++) 539 { 540 if (s_aTpmCmdCodes[i].u32CmdCode == pTpmState->u32CmdCode) 541 { 542 if (s_aTpmCmdCodes[i].pfnDecodeResp) 543 { 544 s_aTpmCmdCodes[i].pfnDecodeResp(pHlp, pTpmState, pHdr, cbRespPayload); 545 return; 546 } 547 break; 548 } 549 } 550 } 551 552 if (cbRespPayload) 553 pHlp->pfnPrintf(pHlp, "%.*Rhxd\n", cbRespPayload, pHdr + 1); 304 554 } 305 555 else 306 RTMsgError("Response buffer is smaller than the request header (required %u, given %zu\n", sizeof(*pHdr), cbResp);556 pHlp->pfnErrorMsg(pHlp, "Response buffer is smaller than the request header (required %u, given %zu\n", sizeof(*pHdr), cbResp); 307 557 } 308 558
Note:
See TracChangeset
for help on using the changeset viewer.