@@ -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