VirtualBox

Changeset 104940 in vbox


Ignore:
Timestamp:
Jun 17, 2024 8:34:13 AM (8 months ago)
Author:
vboxsync
Message:

Devices/Trace: Some updates to the TPM tracxelog decoding, bugref:10701

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Trace/VBoxTraceLogDecoders.cpp

    r104923 r104940  
    4444
    4545/**
     46 * TPM decoder context.
     47 */
     48typedef 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. */
     58typedef TPMDECODECTX *PTPMDECODECTX;
     59
     60
     61/**
    4662 * Algorithm ID to string mapping.
    4763 */
     
    5066    uint16_t    u16AlgId;
    5167    const char *pszAlgId;
     68    size_t      cbDigest;
    5269} TPMALGID2STR;
    5370typedef const TPMALGID2STR *PCTPMALGID2STR;
     
    87104/**
    88105 */
    89 typedef DECLCALLBACKTYPE(void, FNDECODETPM2CCREQ, (PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PCTPMREQHDR pHdr, size_t cb));
     106typedef DECLCALLBACKTYPE(void, FNDECODETPM2CCREQ, (PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PTPMDECODECTX pCtx));
    90107/** Pointer to an event decode request callback. */
    91108typedef FNDECODETPM2CCREQ *PFNFNDECODETPM2CCREQ;
     
    94111/**
    95112 */
    96 typedef DECLCALLBACKTYPE(void, FNDECODETPM2CCRESP, (PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PCTPMRESPHDR pHdr, size_t cb));
     113typedef DECLCALLBACKTYPE(void, FNDECODETPM2CCRESP, (PRTTRACELOGDECODERHLP pHlp, PTPMSTATE pThis, PTPMDECODECTX pCtx));
    97114/** Pointer to an event decode request callback. */
    98115typedef FNDECODETPM2CCRESP *PFNFNDECODETPM2CCRESP;
     
    108125static const TPMALGID2STR g_aAlgId2Str[] =
    109126{
    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
    111130    TPM_ALGID_2_STR(TPM2_ALG_ERROR),
    112131    TPM_ALGID_2_STR(TPM2_ALG_RSA),
    113132    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),
    115134    TPM_ALGID_2_STR(TPM2_ALG_HMAC),
    116135    TPM_ALGID_2_STR(TPM2_ALG_AES),
     
    118137    TPM_ALGID_2_STR(TPM2_ALG_KEYEDHASH),
    119138    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),
    124143    TPM_ALGID_2_STR(TPM2_ALG_NULL),
    125144    TPM_ALGID_2_STR(TPM2_ALG_SM3_256),
     
    141160    TPM_ALGID_2_STR(TPM2_ALG_SYMCIPHER),
    142161    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),
    146165    TPM_ALGID_2_STR(TPM2_ALG_SHAKE128),
    147166    TPM_ALGID_2_STR(TPM2_ALG_SHAKE256),
     
    177196*********************************************************************************************************************************/
    178197
     198DECLINLINE(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
     206static 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
     224static 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
     244static 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 */
     265static 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
     286static 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
    179310static const char *vboxTraceLogDecodeEvtTpmAlgId2Str(uint16_t u16AlgId)
    180311{
     
    187318
    188319
    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);
     320static 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
     359static 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
     379static 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
     395static 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
     411static 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
     430static 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
     454static 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();
    200468}
    201469
     
    220488};
    221489
    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:
     490static 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
     515static 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)
    261528            {
    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:
    268530                {
    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;
    282533                }
    283                 break;
     534                default:
     535                    pHlp->pfnPrintf(pHlp, "%.*Rhxd\n", pCtx->cbLeft, pCtx->pbBuf);
     536                    break;
    284537            }
    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
     548static 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
     559static 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
     571static 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
     588static 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
     598static 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
     613static 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();
    333625}
    334626
     
    437729    TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_GET_TEST_RESULT),
    438730    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),
    440732    TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_PCR),
    441733    TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_POLICY_RESTART),
    442734    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),
    444736    TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_PCR_SET_AUTH_VALUE),
    445737    TPM_CMD_CODE_INIT_NOT_IMPL(TPM2_CC_NV_CERTIFY),
     
    502794                {
    503795                    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                    }
    505801                    else
    506802                        pHlp->pfnErrorMsg(pHlp, "Malformed %s command, not enough room for the input\n", s_aTpmCmdCodes[i].pszCmdCode);
     
    542838                    if (s_aTpmCmdCodes[i].pfnDecodeResp)
    543839                    {
    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);
    545848                        return;
    546849                    }
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette