void Tss2Util::PopulateCurrentPcrs()

in client-library/src/Attestation/LinuxTpm/lib/Tss2Util.cpp [444:493]


void Tss2Util::PopulateCurrentPcrs(Tss2Ctx& ctx, attest::PcrSet& pcrSet)
{
    auto selection = Tss2Util::GetTssPcrSelection(ctx, pcrSet, pcrSet.hashAlg);

    uint32_t pcrUpdateCounter {0};

    TPML_PCR_SELECTION* pcrSelOut = nullptr;
    TPML_DIGEST* pcrValues = nullptr;

    uint32_t pcrCount = 0;
    uint32_t maskSum = 0;

    do
    {
        TSS2_RC ret = Esys_PCR_Read(ctx.Get(),
                            ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE,
                            selection.get(), &pcrUpdateCounter, &pcrSelOut, &pcrValues);
        if (ret != TSS2_RC_SUCCESS)
        {
            throw Tss2Exception("Unable to read PCRs", ret);
        }

        unique_c_ptr<TPML_DIGEST> pcrVals(pcrValues);
        unique_c_ptr<TPML_PCR_SELECTION> pcrSel(pcrSelOut);

        if (pcrVals != nullptr && pcrSel != nullptr && pcrVals->count != 0)
        {
            for (uint32_t i = 0; i < pcrVals->count; i++)
            {
                // Copy pcr digests into pcrSet vectors
                std::copy(pcrVals->digests[i].buffer,
                        pcrVals->digests[i].buffer + pcrVals->digests[i].size,
                        std::back_inserter(pcrSet.pcrs[pcrCount + i].digest));
            }

            pcrCount += pcrVals->count;

            maskSum = 0;
            // Remove bits from mask.
            // We can also use bitwise operators to do bit shift, I guess we are not doing it
            // because we are not sure which pcrSelect index will be selected by the PCR_read.
            for (uint8_t i = 0; i < pcrSel->pcrSelections[0].sizeofSelect; i++)
            {
                selection->pcrSelections[0].pcrSelect[i] &= (~pcrSel->pcrSelections[0].pcrSelect[i]);
                maskSum += selection->pcrSelections[0].pcrSelect[i];
            }
        }

    } while (maskSum != 0);
}