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);
}