Skip to content

Commit 9511486

Browse files
committed
tpm: support PCR summary reference values
Signed-off-by: Simon Ott <simon.ott@aisec.fraunhofer.de>
1 parent 7a9412d commit 9511486

File tree

6 files changed

+320
-43
lines changed

6 files changed

+320
-43
lines changed

bin/generate-os-manifest-tpm

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,14 @@ kernel=$(uname -r)
4444
os=$(lsb_release -sd 2>/dev/null)
4545
set -e
4646

47-
# Parse the values of the OS PCRs from the kernel's binary bios measurements as reference values
48-
referenceValues=$("${mrtool[@]}" parse tpm --mrs 8,9,12,13,14,15)
47+
# Retrieve reference values from event logs if present, otherwise retrieve final PCR values from TPM
48+
if [[ -f "/sys/kernel/security/tpm0/binary_bios_measurements" ]]; then
49+
echo "TPM event log present: parsing eventlog"
50+
referenceValues=$("${mrtool[@]}" parse tpm --mrs 8,9,12,13,14,15)
51+
else
52+
echo "TPM event log not present: reading final PCR values"
53+
referenceValues=$("${mrtool[@]}" read tpm --mrs 8,9,12,13,14,15)
54+
fi
4955

5056
# Load OS manifest
5157
json=$(cat "${input}/manifest.json")

bin/generate-rtm-manifest-tpm

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,14 @@ mkdir -p "${out}"
3939

4040
echo "Using ${data} as directory for local data"
4141

42-
# Parse the values of the RTM PCRs from the kernel's binary bios measurements as reference values
43-
referenceValues=$("${mrtool[@]}" parse tpm --mrs 0,1,2,3,4,5,6,7)
42+
# Retrieve reference values from event logs if present, otherwise retrieve final PCR values from TPM
43+
if [[ -f "/sys/kernel/security/tpm0/binary_bios_measurements" ]]; then
44+
echo "TPM event log present: parsing eventlog"
45+
referenceValues=$("${mrtool[@]}" parse tpm --mrs 0,1,2,3,4,5,6,7)
46+
else
47+
echo "TPM event log not present: reading final PCR values"
48+
referenceValues=$("${mrtool[@]}" read tpm --mrs 0,1,2,3,4,5,6,7)
49+
fi
4450

4551
# Load manifest template
4652
json=$(cat "${input}/manifest.json")

drivers/tpmdriver/tpmdriver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ func GetEventLogs(serializer ar.Serializer,
555555
}
556556

557557
// Collect detailed measurements from event logs if specified
558-
if biosLog {
558+
if biosLog && len(biosMeasurements) > 0 {
559559
for _, digest := range biosMeasurements {
560560
if num == digest.Index {
561561
event := ar.MeasureEvent{

example-setup/configs/installed/est-server-conf.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"tpmEkCertDb": "data/tpm-ek-certs.db",
1818
"logLevel": "trace",
1919
"authMethods": [
20-
"attestation"
20+
"none"
2121
],
2222
"tokenPath": "data/token_store",
2323
"publishAddr": "http://localhost:8080/results",

verifier/tpm.go

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,12 @@ func verifyPcrs(s ar.Serializer, measurement ar.Measurement,
149149
}
150150

151151
if measuredPcr.Type == ar.ARTIFACT_TYPE_PCR_EVENTLOG {
152-
// measurement contains a detailed measurement list (e.g. retrieved from bios
152+
// Measurement contains a detailed measurement list (e.g. retrieved from bios
153153
// measurement logs or ima runtime measurement logs)
154+
log.Tracef("PCR%v measurement contains event log", measuredPcr.Index)
154155
measuredSummary := make([]byte, 32)
155156
for _, event := range measuredPcr.Events {
156-
//first event could be a TPM_PCR_INIT_VALUE ()
157+
// First event could be a TPM_PCR_INIT_VALUE
157158
if event.EventName == "TPM_PCR_INIT_VALUE" {
158159
calculatedPcrs[pcr] = event.Sha256
159160
measuredSummary = event.Sha256
@@ -194,6 +195,9 @@ func verifyPcrs(s ar.Serializer, measurement ar.Measurement,
194195
nameInfo += ": " + event.EventName
195196
}
196197

198+
log.Tracef("Found refval for PCR%v measurement %v: %v",
199+
pcr, nameInfo, hex.EncodeToString(event.Sha256))
200+
197201
measResult := ar.DigestResult{
198202
Type: "Verified",
199203
Index: pcr,
@@ -205,18 +209,15 @@ func verifyPcrs(s ar.Serializer, measurement ar.Measurement,
205209
CtrDetails: event.CtrData,
206210
}
207211
detailedResults = append(detailedResults, measResult)
208-
209-
log.Tracef("Found refval for PCR%v measurement %v: %v",
210-
pcr, nameInfo, hex.EncodeToString(event.Sha256))
211212
}
212213
pcrResult.Digest = hex.EncodeToString(calculatedPcrs[pcr])
213214
if !bytes.Equal(measuredSummary, calculatedPcrs[pcr]) {
214215
pcrResult.Measured = hex.EncodeToString(measuredSummary)
215216
}
216217

217218
} else if measuredPcr.Type == ar.ARTIFACT_TYPE_PCR_SUMMARY {
218-
// measurement contains just the summary PCR value
219-
// We therefore unconditionally extend every reference value for this PCR
219+
// Measurement contains just the summary PCR value
220+
log.Tracef("PCR%v measurement contains PCR summary", measuredPcr.Index)
220221
if len(measuredPcr.Events) != 1 {
221222
log.Debugf("Expected exactly one event for artifact type %q, got %v",
222223
ar.ARTIFACT_TYPE_PCR_SUMMARY, len(measuredPcr.Events))
@@ -229,17 +230,38 @@ func verifyPcrs(s ar.Serializer, measurement ar.Measurement,
229230
calculatedPcrs[pcr] = ref.Sha256 //the Sha256 should contain the init value
230231
continue //break the loop iteration and continue with the next event
231232
}
232-
calculatedPcrs[pcr] = internal.ExtendSha256(calculatedPcrs[pcr], ref.Sha256)
233+
234+
if ref.SubType == ar.ARTIFACT_TYPE_PCR_SUMMARY {
235+
log.Tracef("PCR%v refval is PCR summary", measuredPcr.Index)
236+
237+
// Check if calculatedPcrs is uninitialized, as only one reference
238+
// value summary is allowed
239+
if !bytes.Equal(calculatedPcrs[pcr], make([]byte, len(calculatedPcrs[pcr]))) {
240+
log.Debugf("Fail: PCR%v multiple reference values type %q",
241+
pcr, ar.ARTIFACT_TYPE_PCR_SUMMARY)
242+
success = false
243+
}
244+
245+
// Also the reference value is a PCR summary, set the calculated value
246+
calculatedPcrs[pcr] = ref.Sha256
247+
} else {
248+
// As we only have the measured final value, but reference values for
249+
// each artifact, unconditionally extend the reference value
250+
calculatedPcrs[pcr] = internal.ExtendSha256(calculatedPcrs[pcr], ref.Sha256)
251+
252+
log.Tracef("Extended refval for PCR%v %v: %v",
253+
pcr, ref.SubType, hex.EncodeToString(ref.Sha256))
254+
}
233255

234256
// As we only have the PCR summary, we will later set all reference values
235257
// to true/false depending on whether the calculation matches the PCR summary
236-
measResult := ar.DigestResult{
258+
r := ar.DigestResult{
237259
Index: pcr,
238260
Digest: hex.EncodeToString(ref.Sha256),
239261
SubType: ref.SubType,
240262
Description: ref.Description,
241263
}
242-
detailedResults = append(detailedResults, measResult)
264+
detailedResults = append(detailedResults, r)
243265
}
244266

245267
}
@@ -248,6 +270,7 @@ func verifyPcrs(s ar.Serializer, measurement ar.Measurement,
248270
if equal {
249271
pcrResult.Digest = hex.EncodeToString(calculatedPcrs[pcr])
250272
pcrResult.Success = true
273+
log.Tracef("PCR%v match: %x", pcr, calculatedPcrs[pcr])
251274
} else {
252275
log.Debugf("PCR%v mismatch: measured: %v, calculated: %v", pcr,
253276
hex.EncodeToString(measuredPcr.Events[0].Sha256),

0 commit comments

Comments
 (0)