/* 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 }