diff --git a/cpuid/cpuid.go b/cpuid/cpuid.go index 7b2a198..1ff7893 100644 --- a/cpuid/cpuid.go +++ b/cpuid/cpuid.go @@ -44,4 +44,6 @@ var CpuSigs = map[string]int{ "EPYC-Milan": cpuSig(25, 1, 1), "EPYC-Milan-v1": cpuSig(25, 1, 1), "EPYC-Milan-v2": cpuSig(25, 1, 1), + "EPYC-Genoa": cpuSig(25, 17, 0), + "EPYC-Genoa-v1": cpuSig(25, 17, 0), } diff --git a/e2e/upstream_test.go b/e2e/upstream_test.go index cad290e..142eaf3 100644 --- a/e2e/upstream_test.go +++ b/e2e/upstream_test.go @@ -23,6 +23,7 @@ import ( "github.com/edgelesssys/sev-snp-measure-go/guest" "github.com/edgelesssys/sev-snp-measure-go/ovmf" + "github.com/edgelesssys/sev-snp-measure-go/vmmtypes" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -54,7 +55,7 @@ func TestCompatibility(t *testing.T) { require.NoError(err, "calculating OVMF hash: %s", err) // Documentation for guestFeatures value: https://github.com/virtee/sev-snp-measure/pull/32/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5R126. - digest, err := guest.LaunchDigestFromOVMF(ovmfObj, 0x21, entry.vcpus, ovmfHash) + digest, err := guest.LaunchDigestFromOVMF(ovmfObj, 0x21, entry.vcpus, ovmfHash, vmmtypes.EC2, "") require.NoError(err, "calculating launch digest: %s", err) assert.True(bytes.Equal(digest, entry.measurement), "expected hash %x, got %x", entry.measurement, digest) diff --git a/guest/guest.go b/guest/guest.go index b2772f9..b48c1cf 100644 --- a/guest/guest.go +++ b/guest/guest.go @@ -15,20 +15,21 @@ import ( "github.com/edgelesssys/sev-snp-measure-go/ovmf" "github.com/edgelesssys/sev-snp-measure-go/vmmtypes" "github.com/edgelesssys/sev-snp-measure-go/vmsa" + "github.com/edgelesssys/sev-snp-measure-go/cpuid" ) // LaunchDigestFromMetadataWrapper calculates a launch digest from a MetadataWrapper object. -func LaunchDigestFromMetadataWrapper(wrapper ovmf.MetadataWrapper, guestFeatures uint64, vcpuCount int) ([]byte, error) { - return launchDigest(wrapper.MetadataItems, wrapper.ResetEIP, guestFeatures, vcpuCount, wrapper.OVMFHash) +func LaunchDigestFromMetadataWrapper(wrapper ovmf.MetadataWrapper, guestFeatures uint64, vcpuCount int, vmmtype vmmtypes.VMMType, vcpu_type string) ([]byte, error) { + return launchDigest(wrapper.MetadataItems, wrapper.ResetEIP, guestFeatures, vcpuCount, wrapper.OVMFHash, vmmtype, vcpu_type) } // LaunchDigestFromOVMF calculates a launch digest from an OVMF object and an ovmfHash. -func LaunchDigestFromOVMF(ovmfObj ovmf.OVMF, guestFeatures uint64, vcpuCount int, ovmfHash []byte) ([]byte, error) { +func LaunchDigestFromOVMF(ovmfObj ovmf.OVMF, guestFeatures uint64, vcpuCount int, ovmfHash []byte, vmmtype vmmtypes.VMMType, vcpu_type string) ([]byte, error) { resetEIP, err := ovmfObj.SevESResetEIP() if err != nil { return nil, fmt.Errorf("getting reset EIP: %w", err) } - return launchDigest(ovmfObj.MetadataItems(), resetEIP, guestFeatures, vcpuCount, ovmfHash) + return launchDigest(ovmfObj.MetadataItems(), resetEIP, guestFeatures, vcpuCount, ovmfHash, vmmtype, vcpu_type) } func OVMFHash(ovmfObj ovmf.OVMF) ([]byte, error) { @@ -40,16 +41,20 @@ func OVMFHash(ovmfObj ovmf.OVMF) ([]byte, error) { } // launchDigest calculates the launch digest from metadata and ovmfHash for a SNP guest. -func launchDigest(metadata []ovmf.MetadataSection, resetEIP uint32, guestFeatures uint64, vcpuCount int, ovmfHash []byte) ([]byte, error) { +func launchDigest(metadata []ovmf.MetadataSection, resetEIP uint32, guestFeatures uint64, vcpuCount int, ovmfHash []byte, vmmtype vmmtypes.VMMType, vcpu_type string) ([]byte, error) { guestCtx := gctx.New(ovmfHash) - if err := snpUpdateMetadataPages(guestCtx, metadata, vmmtypes.EC2); err != nil { + if err := snpUpdateMetadataPages(guestCtx, metadata, vmmtype); err != nil { return nil, fmt.Errorf("updating metadata pages: %w", err) } - // Add support for flags {vcpus_family, vcpu_sig, vcpu_type} here, if relevant. - // Use cpuid pkg. - vmsaObj, err := vmsa.New(resetEIP, guestFeatures, 0, vmmtypes.EC2) + vcpu_sig, ok := cpuid.CpuSigs[vcpu_type] + if !ok { + fmt.Println("Failed to find VCPU signature for %s", vcpu_type) + vcpu_sig = 0 + } + + vmsaObj, err := vmsa.New(resetEIP, guestFeatures, uint64(vcpu_sig), vmmtype) if err != nil { return nil, fmt.Errorf("creating VMSA: %w", err) } diff --git a/guest/guest_test.go b/guest/guest_test.go index 7028702..e204370 100644 --- a/guest/guest_test.go +++ b/guest/guest_test.go @@ -16,6 +16,7 @@ import ( "testing" "github.com/edgelesssys/sev-snp-measure-go/ovmf" + "github.com/edgelesssys/sev-snp-measure-go/vmmtypes" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -57,7 +58,7 @@ func TestLaunchDigestFromOVMF(t *testing.T) { ovmfObj, err := ovmf.New(tc.ovmfPath) require.NoError(err) - launchDigest, err := LaunchDigestFromOVMF(ovmfObj, 0x1, tc.vcpuCount, hash) + launchDigest, err := LaunchDigestFromOVMF(ovmfObj, 0x1, tc.vcpuCount, hash, vmmtypes.EC2, "") if tc.wantErr { assert.Error(err) } else { @@ -101,7 +102,7 @@ func TestLaunchDigestFromMetadataWrapper(t *testing.T) { err = json.Unmarshal(data, &apiObject) require.NoError(err) - launchDigest, err := LaunchDigestFromMetadataWrapper(apiObject, 0x1, tc.vcpuCount) + launchDigest, err := LaunchDigestFromMetadataWrapper(apiObject, 0x1, tc.vcpuCount, vmmtypes.EC2, "") if tc.wantErr { assert.Error(err) } else { diff --git a/ovmf/ovmf.go b/ovmf/ovmf.go index d532ab2..a0c656c 100644 --- a/ovmf/ovmf.go +++ b/ovmf/ovmf.go @@ -197,7 +197,7 @@ func (m *MetadataWrapper) MarshalJSON() ([]byte, error) { return json.Marshal(map[string]interface{}{ "MetadataItems": m.MetadataItems, "ResetEIP": fmt.Sprintf("0x%x", m.ResetEIP), - "OVMFHash": fmt.Sprintf("0x%s", hex.EncodeToString(m.OVMFHash)), + "OVMFHash": fmt.Sprintf("%s", hex.EncodeToString(m.OVMFHash)), }) }