mirror of
https://github.com/edgelesssys/constellation.git
synced 2024-12-27 00:19:36 -05:00
c478df36fa
Signed-off-by: Daniel Weiße <dw@edgeless.systems>
72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
/*
|
|
Copyright (c) Edgeless Systems GmbH
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
|
|
// Package sorted defines a type for print-friendly sorted measurements and allows sorting TPM and TDX measurements.
|
|
package sorted
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
|
|
"github.com/edgelesssys/constellation/v2/internal/attestation/measurements"
|
|
)
|
|
|
|
// Measurement wraps a measurement custom index and value.
|
|
type Measurement struct {
|
|
Index string
|
|
Value []byte
|
|
}
|
|
|
|
// MeasurementType are the supported attestation types we can sort.
|
|
type MeasurementType uint32
|
|
|
|
// Available measurement types.
|
|
const (
|
|
TPM MeasurementType = iota
|
|
TDX
|
|
)
|
|
|
|
// SortMeasurements returns the sorted measurements for either TPM or TDX measurements.
|
|
func SortMeasurements(m measurements.M, measurementType MeasurementType) []Measurement {
|
|
if measurementType != TPM && measurementType != TDX {
|
|
return nil
|
|
}
|
|
|
|
keys := make([]uint32, 0, len(m))
|
|
for idx := range m {
|
|
keys = append(keys, idx)
|
|
}
|
|
sort.Slice(keys, func(i, j int) bool {
|
|
return keys[i] < keys[j]
|
|
})
|
|
|
|
var sortedMeasurements []Measurement
|
|
|
|
for _, idx := range keys {
|
|
var index string
|
|
switch measurementType {
|
|
case TPM:
|
|
index = fmt.Sprintf("PCR[%02d]", idx)
|
|
case TDX:
|
|
// idx 0 is MRTD
|
|
if idx == 0 {
|
|
index = "MRTD"
|
|
break
|
|
}
|
|
// RTMR 0 starts at idx 1, so we have to subtract by one here.
|
|
index = fmt.Sprintf("RTMR[%01d]", idx-1)
|
|
}
|
|
|
|
expected := m[idx].Expected
|
|
sortedMeasurements = append(sortedMeasurements, Measurement{
|
|
Index: index,
|
|
Value: expected[:],
|
|
})
|
|
}
|
|
|
|
return sortedMeasurements
|
|
}
|