Skip to content

Commit dd7b214

Browse files
committed
fix(sevsnp): update matching of REPORTED_TCB
REPORTED_TCB is a bitfield of versions. Extract individual versions for comparison. REPORTED_TCB in evidence should be greater than or equal to the reference value. Signed-off-by: Jagannathan Raman <[email protected]>
1 parent 8b2516b commit dd7b214

File tree

3 files changed

+79
-3
lines changed

3 files changed

+79
-3
lines changed

scheme/sevsnp/common.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ import (
99
"encoding/pem"
1010
"errors"
1111
"fmt"
12+
"reflect"
13+
"strconv"
1214

1315
"github.com/google/go-sev-guest/abi"
16+
"github.com/google/go-sev-guest/kds"
1417
"github.com/google/go-sev-guest/proto/sevsnp"
1518
"github.com/veraison/cmw"
1619
"github.com/veraison/corim/comid"
@@ -163,3 +166,34 @@ func parseAttestationToken(token *proto.AttestationToken) (*tokens.TSMReport, er
163166

164167
return tsm, nil
165168
}
169+
170+
// transformSVNtoTCB extracts TCB from the supplied SVN. SEV-SNP's TCB_VERSION
171+
// is a composite version; it's bitfield consisting of SVNs from various firmware components
172+
func transformSVNtoTCB(svn comid.SVN) (*kds.TCBParts, error) {
173+
var (
174+
tcbVersion uint64
175+
err error
176+
tcbParts kds.TCBParts
177+
)
178+
179+
// ToDo: following is a circuitous way to obtain the 64-bit TCB integer value
180+
// from SVN. Consider updating the SVN type to return a 64-bit value
181+
switch v := svn.Value.(type) {
182+
case *comid.TaggedSVN:
183+
tcbString := v.String()
184+
tcbVersion, err = strconv.ParseUint(tcbString, 10, 64)
185+
case *comid.TaggedMinSVN:
186+
tcbString := v.String()
187+
tcbVersion, err = strconv.ParseUint(tcbString, 10, 64)
188+
default:
189+
err = fmt.Errorf("unsupported SVN type: %v", reflect.TypeOf(svn.Value))
190+
}
191+
192+
if err != nil {
193+
return nil, err
194+
}
195+
196+
tcbParts = kds.DecomposeTCBVersion(kds.TCBVersion(tcbVersion))
197+
198+
return &tcbParts, nil
199+
}

scheme/sevsnp/evidence_handler.go

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,38 @@ func compareMeasurements(refM comid.Measurement, evM comid.Measurement) bool {
366366
return true
367367
}
368368

369+
func compareTcb(refM comid.Measurement, evM comid.Measurement) bool {
370+
if refM.Val.SVN == nil {
371+
log.Errorf("reference doesn't have SVN")
372+
return false
373+
}
374+
375+
if evM.Val.SVN == nil {
376+
log.Errorf("evidence doesn't have SVN")
377+
return false
378+
}
379+
380+
refTcbParts, err := transformSVNtoTCB(*refM.Val.SVN)
381+
if err != nil {
382+
log.Errorf("could not transform reference SVN to TCB parts: %v", err)
383+
return false
384+
}
385+
386+
evTcbParts, err := transformSVNtoTCB(*evM.Val.SVN)
387+
if err != nil {
388+
log.Errorf("could not transform evidence SVN to TCB parts: %v", err)
389+
}
390+
391+
if evTcbParts.BlSpl < refTcbParts.BlSpl ||
392+
evTcbParts.SnpSpl < refTcbParts.SnpSpl ||
393+
evTcbParts.TeeSpl < refTcbParts.TeeSpl ||
394+
evTcbParts.UcodeSpl < refTcbParts.UcodeSpl {
395+
return false
396+
}
397+
398+
return true
399+
}
400+
369401
// AppraiseEvidence confirms if the claims in the evidence match with the provisioned
370402
// reference values.
371403
//
@@ -405,6 +437,7 @@ func (o EvidenceHandler) AppraiseEvidence(
405437
appraisal.TrustVector.Hardware = ear.UnsafeHardwareClaim
406438
appraisal.TrustVector.RuntimeOpaque = ear.VisibleMemoryRuntimeClaim
407439

440+
claimsLoop:
408441
for _, m := range refVal.Measurements.Values {
409442
var (
410443
k uint64
@@ -433,9 +466,17 @@ func (o EvidenceHandler) AppraiseEvidence(
433466
break
434467
}
435468

436-
if !compareMeasurements(m, *em) {
437-
err = fmt.Errorf("MKey %d in reference value doesn't match with evidence", k)
438-
break
469+
switch k {
470+
case mKeyReportedTcb:
471+
if !compareTcb(m, *em) {
472+
err = fmt.Errorf("reported TCB in evidence doesn't match reference")
473+
break claimsLoop
474+
}
475+
default:
476+
if !compareMeasurements(m, *em) {
477+
err = fmt.Errorf("MKey %d in reference value doesn't match with evidence", k)
478+
break claimsLoop
479+
}
439480
}
440481
}
441482

scheme/sevsnp/scheme.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,5 @@ const (
2929
mKeyReportData = 640
3030
mKeyMeasurement = 641
3131
mKeyReportID = 645
32+
mKeyReportedTcb = 647
3233
)

0 commit comments

Comments
 (0)