Changeset 104940 in vbox
- Timestamp:
- Jun 17, 2024 8:34:13 AM (8 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Trace/VBoxTraceLogDecoders.cpp
r104923 r104940 44 44 45 45 /** 46 * TPM decoder context. 47 */ 48 typedef struct TPMDECODECTX 49 { 50 /** Pointer to the next data item. */ 51 const uint8_t *pbBuf; 52 /** Number of bytes left for the buffer. */ 53 size_t cbLeft; 54 /** Flag whether an error was encountered. */ 55 bool fError; 56 } TPMDECODECTX; 57 /** Pointer to a TPM decoder context. */ 58 typedef TPMDECODECTX *PTPMDECODECTX; 59 60 61 /** 46 62 * Algorithm ID to string mapping. 47 63 */ … … 50 66 uint16_t u16AlgId; 51 67 const char *pszAlgId; 68 size_t cbDigest; 52 69 } TPMALGID2STR; 53 70 typedef const TPMALGID2STR *PCTPMALGID2STR; … … 87 104 /** 88 105 */ 89 typedef DECLCALLBACKTYPE(void, FNDECODETPM2CCREQ, (PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, P CTPMREQHDR pHdr, size_t cb));106 typedef DECLCALLBACKTYPE(void, FNDECODETPM2CCREQ, (PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PTPMDECODECTX pCtx)); 90 107 /** Pointer to an event decode request callback. */ 91 108 typedef FNDECODETPM2CCREQ *PFNFNDECODETPM2CCREQ; … … 94 111 /** 95 112 */ 96 typedef DECLCALLBACKTYPE(void, FNDECODETPM2CCRESP, (PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, P CTPMRESPHDR pHdr, size_t cb));113 typedef DECLCALLBACKTYPE(void, FNDECODETPM2CCRESP, (PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PTPMDECODECTX pCtx)); 97 114 /** Pointer to an event decode request callback. */ 98 115 typedef FNDECODETPM2CCRESP *PFNFNDECODETPM2CCRESP; … … 108 125 static const TPMALGID2STR g_aAlgId2Str[] = 109 126 { 110 #define TPM_ALGID_2_STR(a_AlgId) { a_AlgId, #a_AlgId } 127 #define TPM_ALGID_2_STR(a_AlgId) { a_AlgId, #a_AlgId, 0 } 128 #define TPM_ALGID_2_STR_DIGEST(a_AlgId, a_cbDigest) { a_AlgId, #a_AlgId, a_cbDigest } 129 111 130 TPM_ALGID_2_STR(TPM2_ALG_ERROR), 112 131 TPM_ALGID_2_STR(TPM2_ALG_RSA), 113 132 TPM_ALGID_2_STR(TPM2_ALG_TDES), 114 TPM_ALGID_2_STR (TPM2_ALG_SHA1),133 TPM_ALGID_2_STR_DIGEST(TPM2_ALG_SHA1, 20), 115 134 TPM_ALGID_2_STR(TPM2_ALG_HMAC), 116 135 TPM_ALGID_2_STR(TPM2_ALG_AES), … … 118 137 TPM_ALGID_2_STR(TPM2_ALG_KEYEDHASH), 119 138 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),139 TPM_ALGID_2_STR_DIGEST(TPM2_ALG_SHA256, 32), 140 TPM_ALGID_2_STR_DIGEST(TPM2_ALG_SHA384, 48), 141 TPM_ALGID_2_STR_DIGEST(TPM2_ALG_SHA512, 64), 142 TPM_ALGID_2_STR_DIGEST(TPM2_ALG_SHA256_192, 24), 124 143 TPM_ALGID_2_STR(TPM2_ALG_NULL), 125 144 TPM_ALGID_2_STR(TPM2_ALG_SM3_256), … … 141 160 TPM_ALGID_2_STR(TPM2_ALG_SYMCIPHER), 142 161 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),162 TPM_ALGID_2_STR_DIGEST(TPM2_ALG_SHA3_256, 32), 163 TPM_ALGID_2_STR_DIGEST(TPM2_ALG_SHA3_384, 48), 164 TPM_ALGID_2_STR_DIGEST(TPM2_ALG_SHA3_512, 64), 146 165 TPM_ALGID_2_STR(TPM2_ALG_SHAKE128), 147 166 TPM_ALGID_2_STR(TPM2_ALG_SHAKE256), … … 177 196 *********************************************************************************************************************************/ 178 197 198 DECLINLINE(void) vboxTraceLogDecodeEvtTpmDecodeCtxInit(PTPMDECODECTX pCtx, const uint8_t *pbBuf, size_t cbBuf) 199 { 200 pCtx->pbBuf = pbBuf; 201 pCtx->cbLeft = cbBuf; 202 pCtx->fError = false; 203 } 204 205 206 static uint8_t vboxTraceLogDecodeEvtTpmDecodeCtxGetU8(PTPMDECODECTX pCtx, PRTTRACELOGDECODERHLP pHlp, const char *pszItem) 207 { 208 if (RT_UNLIKELY(pCtx->fError)) 209 return 0; 210 211 if (RT_UNLIKELY(!pCtx->cbLeft)) 212 { 213 pHlp->pfnErrorMsg(pHlp, "Failed to decode '%s' as there is not enough space in the buffer (required %u, available %u)", 214 pszItem, sizeof(uint8_t), pCtx->cbLeft); 215 pCtx->fError = true; 216 return 0; 217 } 218 219 pCtx->cbLeft--; 220 return *pCtx->pbBuf++; 221 } 222 223 224 static uint16_t vboxTraceLogDecodeEvtTpmDecodeCtxGetU16(PTPMDECODECTX pCtx, PRTTRACELOGDECODERHLP pHlp, const char *pszItem) 225 { 226 if (RT_UNLIKELY(pCtx->fError)) 227 return 0; 228 229 if (RT_UNLIKELY(pCtx->cbLeft < sizeof(uint16_t))) 230 { 231 pHlp->pfnErrorMsg(pHlp, "Failed to decode '%s' as there is not enough space in the buffer (required %u, available %u)", 232 pszItem, sizeof(uint16_t), pCtx->cbLeft); 233 pCtx->fError = true; 234 return 0; 235 } 236 237 uint16_t u16 = *(uint16_t *)pCtx->pbBuf; 238 pCtx->pbBuf += sizeof(uint16_t); 239 pCtx->cbLeft -= sizeof(uint16_t); 240 return RT_BE2H_U16(u16); 241 } 242 243 244 static uint32_t vboxTraceLogDecodeEvtTpmDecodeCtxGetU32(PTPMDECODECTX pCtx, PRTTRACELOGDECODERHLP pHlp, const char *pszItem) 245 { 246 if (RT_UNLIKELY(pCtx->fError)) 247 return 0; 248 249 if (RT_UNLIKELY(pCtx->cbLeft < sizeof(uint32_t))) 250 { 251 pHlp->pfnErrorMsg(pHlp, "Failed to decode '%s' as there is not enough space in the buffer (required %u, available %u)", 252 pszItem, sizeof(uint32_t), pCtx->cbLeft); 253 pCtx->fError = true; 254 return 0; 255 } 256 257 uint32_t u32 = *(uint32_t *)pCtx->pbBuf; 258 pCtx->pbBuf += sizeof(uint32_t); 259 pCtx->cbLeft -= sizeof(uint32_t); 260 return RT_BE2H_U32(u32); 261 } 262 263 264 #if 0 /* unused */ 265 static uint64_t vboxTraceLogDecodeEvtTpmDecodeCtxGetU64(PTPMDECODECTX pCtx, PRTTRACELOGDECODERHLP pHlp, const char *pszItem) 266 { 267 if (RT_UNLIKELY(pCtx->fError)) 268 return 0; 269 270 if (RT_UNLIKELY(pCtx->cbLeft < sizeof(uint64_t))) 271 { 272 pHlp->pfnErrorMsg(pHlp, "Failed to decode '%s' as there is not enough space in the buffer (required %u, available %u)", 273 pszItem, sizeof(uint64_t), pCtx->cbLeft); 274 pCtx->fError = true; 275 return 0; 276 } 277 278 uint64_t u64 = *(uint64_t *)pCtx->pbBuf; 279 pCtx->pbBuf += sizeof(uint64_t); 280 pCtx->cbLeft -= sizeof(uint64_t); 281 return RT_BE2H_U64(u64); 282 } 283 #endif 284 285 286 static const uint8_t *vboxTraceLogDecodeEvtTpmDecodeCtxGetBuf(PTPMDECODECTX pCtx, PRTTRACELOGDECODERHLP pHlp, const char *pszItem, size_t cbBuf) 287 { 288 if (RT_UNLIKELY(pCtx->fError)) 289 return 0; 290 291 if (RT_UNLIKELY(pCtx->cbLeft < cbBuf)) 292 { 293 pHlp->pfnErrorMsg(pHlp, "Failed to decode '%s' as there is not enough space in the buffer (required %u, available %u)", 294 pszItem, cbBuf, pCtx->cbLeft); 295 pCtx->fError = true; 296 return 0; 297 } 298 299 /* Just return nothing if nothing is requested. */ 300 if (!cbBuf) 301 return NULL; 302 303 const uint8_t *pb = pCtx->pbBuf; 304 pCtx->pbBuf += cbBuf; 305 pCtx->cbLeft -= cbBuf; 306 return pb; 307 } 308 309 179 310 static const char *vboxTraceLogDecodeEvtTpmAlgId2Str(uint16_t u16AlgId) 180 311 { … … 187 318 188 319 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); 320 static size_t vboxTraceLogDecodeEvtTpmAlgId2DigestSize(uint16_t u16AlgId) 321 { 322 for (uint32_t i = 0; i < RT_ELEMENTS(g_aAlgId2Str); i++) 323 if (g_aAlgId2Str[i].u16AlgId == u16AlgId) 324 return g_aAlgId2Str[i].cbDigest; 325 326 return 0; 327 } 328 329 330 #define TPM_DECODE_INIT() do { 331 332 #define TPM_DECODE_END() \ 333 } while (0); \ 334 if (pCtx->fError) return 335 336 #define TPM_DECODE_U8(a_Var, a_Name) \ 337 uint8_t a_Var = vboxTraceLogDecodeEvtTpmDecodeCtxGetU8(pCtx, pHlp, #a_Name); \ 338 if (pCtx->fError) break 339 340 #define TPM_DECODE_U16(a_Var, a_Name) \ 341 uint16_t a_Var = vboxTraceLogDecodeEvtTpmDecodeCtxGetU16(pCtx, pHlp, #a_Name); \ 342 if (pCtx->fError) break 343 344 #define TPM_DECODE_U32(a_Var, a_Name) \ 345 uint32_t a_Var = vboxTraceLogDecodeEvtTpmDecodeCtxGetU32(pCtx, pHlp, #a_Name); \ 346 if (pCtx->fError) break 347 348 #define TPM_DECODE_U64(a_Var, a_Name) \ 349 uint64_t a_Var = vboxTraceLogDecodeEvtTpmDecodeCtxGetU64(pCtx, pHlp, #a_Name); \ 350 if (pCtx->fError) break 351 352 #define TPM_DECODE_BUF(a_Var, a_Name, a_cb) \ 353 const uint8_t *a_Var = vboxTraceLogDecodeEvtTpmDecodeCtxGetBuf(pCtx, pHlp, #a_Name, a_cb); \ 354 if (pCtx->fError) break 355 356 #define TPM_DECODE_END_IF_ERROR() \ 357 if (pCtx->fError) return 358 359 static void vboxTraceLogDecodePcrSelection(PRTTRACELOGDECODERHLP pHlp, PTPMDECODECTX pCtx) 360 { 361 TPM_DECODE_INIT(); 362 TPM_DECODE_U16(u16AlgId, u16AlgId); 363 TPM_DECODE_U8(cbPcrSelection, u8SizeOfSelect); 364 TPM_DECODE_BUF(pb, PCRs, cbPcrSelection); 365 366 pHlp->pfnPrintf(pHlp, " u16AlgId: %s\n", vboxTraceLogDecodeEvtTpmAlgId2Str(u16AlgId)); 367 pHlp->pfnPrintf(pHlp, " u8SizeOfSlect: %u\n", cbPcrSelection); 368 pHlp->pfnPrintf(pHlp, " PCRs: "); 369 370 for (uint8_t idxPcr = 0; idxPcr < cbPcrSelection * 8; idxPcr++) 371 if (RT_BOOL(*(pb + (idxPcr / 8)) & RT_BIT(idxPcr % 8))) 372 pHlp->pfnPrintf(pHlp, "%u ", idxPcr); 373 374 pHlp->pfnPrintf(pHlp, "\n"); 375 TPM_DECODE_END(); 376 } 377 378 379 static void vboxTraceLogDecodePcrSelectionList(PRTTRACELOGDECODERHLP pHlp, PTPMDECODECTX pCtx) 380 { 381 TPM_DECODE_INIT(); 382 TPM_DECODE_U32(u32Count, u32Count); 383 pHlp->pfnPrintf(pHlp, " u32Count: %u\n", u32Count); 384 385 /* Walk the list of PCR selection entries. */ 386 for (uint32_t i = 0; i < u32Count; i++) 387 { 388 vboxTraceLogDecodePcrSelection(pHlp, pCtx); 389 TPM_DECODE_END_IF_ERROR(); 390 } 391 TPM_DECODE_END(); 392 } 393 394 395 static void vboxTraceLogDecodeEvtTpmDigestList(PRTTRACELOGDECODERHLP pHlp, PTPMDECODECTX pCtx) 396 { 397 TPM_DECODE_INIT(); 398 TPM_DECODE_U32(u32DigestCount, u32DigestCount); 399 pHlp->pfnPrintf(pHlp, " u32DigestCount: %u\n", u32DigestCount); 400 for (uint32_t i = 0; i < u32DigestCount; i++) 401 { 402 TPM_DECODE_U16(u16DigestSize, u16DigestSize); 403 TPM_DECODE_BUF(pbDigest, abDigest, u16DigestSize); 404 pHlp->pfnPrintf(pHlp, " u16DigestSize: %u\n", u16DigestSize); 405 pHlp->pfnPrintf(pHlp, " abDigest: %.*Rhxs\n", u16DigestSize, pbDigest); 406 } 407 TPM_DECODE_END(); 408 } 409 410 411 static void vboxTraceLogDecodeEvtTpmDigestValuesList(PRTTRACELOGDECODERHLP pHlp, PTPMDECODECTX pCtx) 412 { 413 TPM_DECODE_INIT(); 414 TPM_DECODE_U32(u32DigestCount, u32DigestCount); 415 pHlp->pfnPrintf(pHlp, " u32DigestCount: %u\n", u32DigestCount); 416 for (uint32_t i = 0; i < u32DigestCount; i++) 417 { 418 TPM_DECODE_U16(u16HashAlg, u16HashAlg); 419 420 size_t cbDigest = vboxTraceLogDecodeEvtTpmAlgId2DigestSize(u16HashAlg); 421 TPM_DECODE_BUF(pb, abDigest, cbDigest); 422 423 pHlp->pfnPrintf(pHlp, " u16HashAlg: %s\n", vboxTraceLogDecodeEvtTpmAlgId2Str(u16HashAlg)); 424 pHlp->pfnPrintf(pHlp, " abDigest: %.*Rhxs\n", cbDigest, pb); 425 } 426 TPM_DECODE_END(); 427 } 428 429 430 static void vboxTraceLogDecodeEvtTpmAuthSession(PRTTRACELOGDECODERHLP pHlp, PTPMDECODECTX pCtx) 431 { 432 TPM_DECODE_INIT(); 433 TPM_DECODE_U32(u32Size, u32Size); 434 TPM_DECODE_U32(u32SessionHandle, u32SessionHandle); 435 TPM_DECODE_U16(u16NonceSize, u16NonceSize); 436 TPM_DECODE_BUF(pbNonce, abNonce, u16NonceSize); 437 TPM_DECODE_U8( u8Attr, u8Attr); 438 TPM_DECODE_U16(u16HmacSize, u16HmacSize); 439 TPM_DECODE_BUF(pbHmac, abHmac, u16HmacSize); 440 441 pHlp->pfnPrintf(pHlp, " u32AuthSize: %u\n", u32Size); 442 pHlp->pfnPrintf(pHlp, " u32SessionHandle: %#x\n", u32SessionHandle); 443 pHlp->pfnPrintf(pHlp, " u16NonceSize: %u\n", u16NonceSize); 444 if (u16NonceSize) 445 pHlp->pfnPrintf(pHlp, " abNonce: %.*Rhxs\n", u16NonceSize, pbNonce); 446 pHlp->pfnPrintf(pHlp, " u8Attr: %u\n", u8Attr); 447 pHlp->pfnPrintf(pHlp, " u16HmacSize: %u\n", u16HmacSize); 448 if (u16HmacSize) 449 pHlp->pfnPrintf(pHlp, " abHmac: %.*Rhxs\n", u16HmacSize, pbHmac); 450 TPM_DECODE_END(); 451 } 452 453 454 static DECLCALLBACK(void) vboxTraceLogDecodeEvtTpmDecodeStartupShutdownReq(PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PTPMDECODECTX pCtx) 455 { 456 RT_NOREF(pThis); 457 458 TPM_DECODE_INIT(); 459 TPM_DECODE_U16(u16TpmSu, u16State); 460 461 if (u16TpmSu == TPM2_SU_CLEAR) 462 pHlp->pfnPrintf(pHlp, " TPM2_SU_CLEAR\n"); 463 else if (u16TpmSu == TPM2_SU_STATE) 464 pHlp->pfnPrintf(pHlp, " TPM2_SU_STATE\n"); 465 else 466 pHlp->pfnPrintf(pHlp, " Unknown: %#x\n", u16TpmSu); 467 TPM_DECODE_END(); 200 468 } 201 469 … … 220 488 }; 221 489 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: 490 static DECLCALLBACK(void) vboxTraceLogDecodeEvtTpmDecodeGetCapabilityReq(PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PTPMDECODECTX pCtx) 491 { 492 TPM_DECODE_INIT(); 493 TPM_DECODE_U32(u32Cap, u32Cap); 494 TPM_DECODE_U32(u32Property, u32Property); 495 TPM_DECODE_U32(u32Count, u32Count); 496 497 pThis->u.GetCapability.u32Cap = u32Cap; 498 pThis->u.GetCapability.u32Property = u32Property; 499 pThis->u.GetCapability.u32Count = u32Count; 500 501 if (u32Cap < RT_ELEMENTS(s_aTpm2Caps)) 502 pHlp->pfnPrintf(pHlp, " u32Cap: %s\n" 503 " u32Property: %#x\n" 504 " u32Count: %#x\n", 505 s_aTpm2Caps[u32Cap].pszCap, u32Property, u32Count); 506 else 507 pHlp->pfnPrintf(pHlp, " u32Cap: %#x (UNKNOWN)\n" 508 " u32Property: %#x\n" 509 " u32Count: %#x\n", 510 u32Cap, u32Property, u32Count); 511 TPM_DECODE_END(); 512 } 513 514 515 static DECLCALLBACK(void) vboxTraceLogDecodeEvtTpmDecodeGetCapabilityResp(PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PTPMDECODECTX pCtx) 516 { 517 RT_NOREF(pThis); 518 519 TPM_DECODE_INIT(); 520 TPM_DECODE_U8( fMoreData, fMoreData); 521 TPM_DECODE_U32(u32Cap, u32Cap); 522 523 pHlp->pfnPrintf(pHlp, " fMoreData: %RTbool\n", fMoreData); 524 if (u32Cap < RT_ELEMENTS(s_aTpm2Caps)) 525 { 526 pHlp->pfnPrintf(pHlp, " u32Cap: %s\n", s_aTpm2Caps[u32Cap]); 527 switch (u32Cap) 261 528 { 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++) 529 case TPM2_CAP_PCRS: 268 530 { 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"); 531 vboxTraceLogDecodePcrSelectionList(pHlp, pCtx); 532 break; 282 533 } 283 break; 534 default: 535 pHlp->pfnPrintf(pHlp, "%.*Rhxd\n", pCtx->cbLeft, pCtx->pbBuf); 536 break; 284 537 } 285 default: 286 pHlp->pfnPrintf(pHlp, "%.*Rhxd\n", cb - sizeof(TPMYESNO) - sizeof(TPMCAP), &pResp->abCap[0]); 287 break; 288 } 289 } 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]); 294 } 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); 538 } 539 else 540 { 541 pHlp->pfnPrintf(pHlp, " u32Cap: %#x (UNKNOWN)\n", u32Cap); 542 pHlp->pfnPrintf(pHlp, "%.*Rhxd\n", pCtx->cbLeft, pCtx->pbBuf); 543 } 544 TPM_DECODE_END(); 545 } 546 547 548 static DECLCALLBACK(void) vboxTraceLogDecodeEvtTpmDecodeReadPublicReq(PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PTPMDECODECTX pCtx) 549 { 550 RT_NOREF(pThis); 551 552 TPM_DECODE_INIT(); 553 TPM_DECODE_U32(hObj, hObj); 554 pHlp->pfnPrintf(pHlp, " hObj: %#x\n", hObj); 555 TPM_DECODE_END(); 556 } 557 558 559 static DECLCALLBACK(void) vboxTraceLogDecodeEvtTpmDecodeGetRandomReq(PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PTPMDECODECTX pCtx) 560 { 561 RT_NOREF(pThis); 562 563 TPM_DECODE_INIT(); 564 TPM_DECODE_U16(u16RandomBytes, u16RandomBytes); 565 pThis->u.GetRandom.cbRnd = u16RandomBytes; 566 pHlp->pfnPrintf(pHlp, " u16RandomBytes: %u\n", pThis->u.GetRandom.cbRnd); 567 TPM_DECODE_END(); 568 } 569 570 571 static DECLCALLBACK(void) vboxTraceLogDecodeEvtTpmDecodeGetRandomResp(PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PTPMDECODECTX pCtx) 572 { 573 TPM_DECODE_INIT(); 574 TPM_DECODE_U16(cbBuf, u16Size); 575 if (pThis->u.GetRandom.cbRnd != cbBuf) 576 { 577 pHlp->pfnErrorMsg(pHlp, "Requested random data size doesn't match returned data size (requested %u, returned %u), using smaller value\n", 578 pThis->u.GetRandom.cbRnd, cbBuf); 579 cbBuf = RT_MIN(cbBuf, pThis->u.GetRandom.cbRnd); 580 } 581 582 TPM_DECODE_BUF(pb, RndBuf, cbBuf); 583 pHlp->pfnPrintf(pHlp, "%.*Rhxd\n", cbBuf, pb); 584 TPM_DECODE_END(); 585 } 586 587 588 static DECLCALLBACK(void) vboxTraceLogDecodeEvtTpmDecodePcrReadReq(PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PTPMDECODECTX pCtx) 589 { 590 RT_NOREF(pThis); 591 592 TPM_DECODE_INIT(); 593 vboxTraceLogDecodePcrSelectionList(pHlp, pCtx); 594 TPM_DECODE_END(); 595 } 596 597 598 static DECLCALLBACK(void) vboxTraceLogDecodeEvtTpmDecodePcrReadResp(PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PTPMDECODECTX pCtx) 599 { 600 RT_NOREF(pThis); 601 602 TPM_DECODE_INIT(); 603 TPM_DECODE_U32(u32PcrUpdateCounter, u32PcrUpdateCounter); 604 pHlp->pfnPrintf(pHlp, " u32PcrUpdateCounter: %u\n", u32PcrUpdateCounter); 605 606 vboxTraceLogDecodePcrSelectionList(pHlp, pCtx); 607 TPM_DECODE_END_IF_ERROR(); 608 vboxTraceLogDecodeEvtTpmDigestList(pHlp, pCtx); 609 TPM_DECODE_END(); 610 } 611 612 613 static DECLCALLBACK(void) vboxTraceLogDecodeEvtTpmDecodePcrExtendReq(PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PTPMDECODECTX pCtx) 614 { 615 RT_NOREF(pThis); 616 617 TPM_DECODE_INIT(); 618 TPM_DECODE_U32(hPcr, hPcr); 619 pHlp->pfnPrintf(pHlp, " hPcr: %#x\n", hPcr); 620 621 vboxTraceLogDecodeEvtTpmAuthSession(pHlp, pCtx); 622 TPM_DECODE_END_IF_ERROR(); 623 vboxTraceLogDecodeEvtTpmDigestValuesList(pHlp, pCtx); 624 TPM_DECODE_END(); 333 625 } 334 626 … … 437 729 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_GET_TEST_RESULT), 438 730 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_GET_HASH), 439 TPM_CMD_CODE_INIT _NOT_IMPL(TPM2_CC_PCR_READ),731 TPM_CMD_CODE_INIT( TPM2_CC_PCR_READ, TPMREQHDR, TPMRESPHDR, vboxTraceLogDecodeEvtTpmDecodePcrReadReq, vboxTraceLogDecodeEvtTpmDecodePcrReadResp), 440 732 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_PCR), 441 733 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_RESTART), 442 734 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_READ_CLOCK), 443 TPM_CMD_CODE_INIT _NOT_IMPL(TPM2_CC_PCR_EXTEND),735 TPM_CMD_CODE_INIT( TPM2_CC_PCR_EXTEND, TPMREQHDR, TPMRESPHDR, vboxTraceLogDecodeEvtTpmDecodePcrExtendReq, NULL), 444 736 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_PCR_SET_AUTH_VALUE), 445 737 TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_NV_CERTIFY), … … 502 794 { 503 795 if (cbCmd >= s_aTpmCmdCodes[i].cbReqMin) 504 s_aTpmCmdCodes[i].pfnDecodeReq(pHlp, pTpmState, pHdr, cbReqPayload); 796 { 797 TPMDECODECTX Ctx; 798 vboxTraceLogDecodeEvtTpmDecodeCtxInit(&Ctx, (const uint8_t *)(pHdr + 1), cbReqPayload); 799 s_aTpmCmdCodes[i].pfnDecodeReq(pHlp, pTpmState, &Ctx); 800 } 505 801 else 506 802 pHlp->pfnErrorMsg(pHlp, "Malformed %s command, not enough room for the input\n", s_aTpmCmdCodes[i].pszCmdCode); … … 542 838 if (s_aTpmCmdCodes[i].pfnDecodeResp) 543 839 { 544 s_aTpmCmdCodes[i].pfnDecodeResp(pHlp, pTpmState, pHdr, cbRespPayload); 840 if (cbResp >= s_aTpmCmdCodes[i].cbRespMin) 841 { 842 TPMDECODECTX Ctx; 843 vboxTraceLogDecodeEvtTpmDecodeCtxInit(&Ctx, (const uint8_t *)(pHdr + 1), cbRespPayload); 844 s_aTpmCmdCodes[i].pfnDecodeResp(pHlp, pTpmState, &Ctx); 845 } 846 else 847 pHlp->pfnErrorMsg(pHlp, "Malformed %s response buffer, not enough room for the output\n", s_aTpmCmdCodes[i].pszCmdCode); 545 848 return; 546 849 }
Note:
See TracChangeset
for help on using the changeset viewer.