From 8f9b0927bfe876a55a490138917bf65569c71ec9 Mon Sep 17 00:00:00 2001 From: Chris Hager Date: Wed, 12 Nov 2025 12:34:23 +0100 Subject: [PATCH 1/3] attested-get dcap-tdx support --- cmd/attested-get/main.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/cmd/attested-get/main.go b/cmd/attested-get/main.go index b1ff349..23ea5d7 100644 --- a/cmd/attested-get/main.go +++ b/cmd/attested-get/main.go @@ -4,7 +4,7 @@ package main // Make a HTTP GET request over a TEE-attested connection (to a server with aTLS support), // and print the verified measurements and the response payload. // -// Currently only works for Azure TDX but is straight-forward to expand. +// Currently supports Azure TDX and DCAP TDX attestation. // // Usage: // @@ -47,9 +47,11 @@ import ( azure_tdx "github.com/flashbots/cvm-reverse-proxy/internal/attestation/azure/tdx" "github.com/flashbots/cvm-reverse-proxy/internal/attestation/measurements" "github.com/flashbots/cvm-reverse-proxy/internal/attestation/variant" + "github.com/flashbots/cvm-reverse-proxy/internal/cloud/cloudprovider" "github.com/flashbots/cvm-reverse-proxy/internal/config" "github.com/flashbots/cvm-reverse-proxy/multimeasurements" "github.com/flashbots/cvm-reverse-proxy/proxy" + dcap_tdx "github.com/flashbots/cvm-reverse-proxy/tdx" "github.com/urfave/cli/v2" // imports as package "cli" ) @@ -70,9 +72,9 @@ var flags []cli.Flag = []cli.Flag{ Usage: "Output file for the response payload", }, &cli.StringFlag{ - Name: "attestation-type", // TODO: Add support for other attestation types + Name: "attestation-type", Value: string(proxy.AttestationAzureTDX), - Usage: "type of attestation to present (currently only azure-tdx)", + Usage: "type of attestation to present (azure-tdx or dcap-tdx)", }, &cli.StringFlag{ Name: "expected-measurements", @@ -145,9 +147,15 @@ func runClient(cCtx *cli.Context) (err error) { azure_tcbinfo_override.OverrideAzureValidatorsForV6SEAMLoader(log, []atls.Validator{validator}) } validators = append(validators, validator) + case proxy.AttestationDCAPTDX: + // Prepare a dcap-tdx validator without any required measurements + attConfig := &config.QEMUTDX{Measurements: measurements.DefaultsFor(cloudprovider.QEMU, variant.QEMUTDX{})} + attConfig.SetMeasurements(measurements.M{}) + validator := dcap_tdx.NewValidator(attConfig, proxy.AttestationLogger{Log: log}) + validators = append(validators, validator) default: - log.Error("currently only azure-tdx attestation is supported") - return errors.New("currently only azure-tdx attestation is supported") + log.Error("currently only azure-tdx and dcap-tdx attestation is supported") + return errors.New("currently only azure-tdx and dcap-tdx attestation is supported") } // Load expected measurements from file or URL (if provided) @@ -188,7 +196,7 @@ func runClient(cCtx *cli.Context) (err error) { } // Extract the aTLS variant and measurements from the TLS connection - atlsVariant, extractedMeasurements, err := proxy.GetMeasurementsFromTLS(resp.TLS.PeerCertificates, []asn1.ObjectIdentifier{variant.AzureTDX{}.OID()}) + atlsVariant, extractedMeasurements, err := proxy.GetMeasurementsFromTLS(resp.TLS.PeerCertificates, []asn1.ObjectIdentifier{variant.AzureTDX{}.OID(), variant.QEMUTDX{}.OID()}) if err != nil { log.Error("Error in getMeasurementsFromTLS", "err", err) return err From 1e7aa92fa87c84aa43a08bc380dffea943eb4e2a Mon Sep 17 00:00:00 2001 From: Chris Hager Date: Wed, 12 Nov 2025 13:24:48 +0100 Subject: [PATCH 2/3] simplify (thx copilot) --- cmd/attested-get/main.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cmd/attested-get/main.go b/cmd/attested-get/main.go index 23ea5d7..0caf761 100644 --- a/cmd/attested-get/main.go +++ b/cmd/attested-get/main.go @@ -47,7 +47,6 @@ import ( azure_tdx "github.com/flashbots/cvm-reverse-proxy/internal/attestation/azure/tdx" "github.com/flashbots/cvm-reverse-proxy/internal/attestation/measurements" "github.com/flashbots/cvm-reverse-proxy/internal/attestation/variant" - "github.com/flashbots/cvm-reverse-proxy/internal/cloud/cloudprovider" "github.com/flashbots/cvm-reverse-proxy/internal/config" "github.com/flashbots/cvm-reverse-proxy/multimeasurements" "github.com/flashbots/cvm-reverse-proxy/proxy" @@ -149,8 +148,7 @@ func runClient(cCtx *cli.Context) (err error) { validators = append(validators, validator) case proxy.AttestationDCAPTDX: // Prepare a dcap-tdx validator without any required measurements - attConfig := &config.QEMUTDX{Measurements: measurements.DefaultsFor(cloudprovider.QEMU, variant.QEMUTDX{})} - attConfig.SetMeasurements(measurements.M{}) + attConfig := &config.QEMUTDX{Measurements: measurements.M{}} validator := dcap_tdx.NewValidator(attConfig, proxy.AttestationLogger{Log: log}) validators = append(validators, validator) default: From 71ff6bdb0e1d74c4467eb16632e1cd4fd901b76d Mon Sep 17 00:00:00 2001 From: Chris Hager Date: Wed, 12 Nov 2025 16:21:15 +0100 Subject: [PATCH 3/3] also allow 'auto' attestation mode --- cmd/attested-get/main.go | 45 ++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/cmd/attested-get/main.go b/cmd/attested-get/main.go index 0caf761..304350f 100644 --- a/cmd/attested-get/main.go +++ b/cmd/attested-get/main.go @@ -37,6 +37,7 @@ import ( "fmt" "io" "log" + "log/slog" "net/http" "os" "strings" @@ -72,8 +73,8 @@ var flags []cli.Flag = []cli.Flag{ }, &cli.StringFlag{ Name: "attestation-type", - Value: string(proxy.AttestationAzureTDX), - Usage: "type of attestation to present (azure-tdx or dcap-tdx)", + Value: string(proxy.AttestationAuto), + Usage: "type of attestation to present (auto, azure-tdx, or dcap-tdx)", }, &cli.StringFlag{ Name: "expected-measurements", @@ -106,6 +107,23 @@ func main() { } } +// createAzureTDXValidator creates an Azure TDX validator without required measurements +func createAzureTDXValidator(log *slog.Logger, overrideAzurev6Tcbinfo bool) atls.Validator { + attConfig := config.DefaultForAzureTDX() + attConfig.SetMeasurements(measurements.M{}) + validator := azure_tdx.NewValidator(attConfig, proxy.AttestationLogger{Log: log}) + if overrideAzurev6Tcbinfo { + azure_tcbinfo_override.OverrideAzureValidatorsForV6SEAMLoader(log, []atls.Validator{validator}) + } + return validator +} + +// createDCAPTDXValidator creates a DCAP TDX validator without required measurements +func createDCAPTDXValidator(log *slog.Logger) atls.Validator { + attConfig := &config.QEMUTDX{Measurements: measurements.M{}} + return dcap_tdx.NewValidator(attConfig, proxy.AttestationLogger{Log: log}) +} + func runClient(cCtx *cli.Context) (err error) { logDebug := cCtx.Bool("log-debug") addr := cCtx.String("addr") @@ -138,22 +156,17 @@ func runClient(cCtx *cli.Context) (err error) { var validators []atls.Validator switch attestationType { case proxy.AttestationAzureTDX: - // Prepare an azure-tdx validator without any required measurements - attConfig := config.DefaultForAzureTDX() - attConfig.SetMeasurements(measurements.M{}) - validator := azure_tdx.NewValidator(attConfig, proxy.AttestationLogger{Log: log}) - if overrideAzurev6Tcbinfo { - azure_tcbinfo_override.OverrideAzureValidatorsForV6SEAMLoader(log, []atls.Validator{validator}) - } - validators = append(validators, validator) + validators = append(validators, createAzureTDXValidator(log, overrideAzurev6Tcbinfo)) case proxy.AttestationDCAPTDX: - // Prepare a dcap-tdx validator without any required measurements - attConfig := &config.QEMUTDX{Measurements: measurements.M{}} - validator := dcap_tdx.NewValidator(attConfig, proxy.AttestationLogger{Log: log}) - validators = append(validators, validator) + validators = append(validators, createDCAPTDXValidator(log)) + case proxy.AttestationAuto: + // In auto mode, add all validators to support any attestation type + log.Info("Auto mode: creating validators for all supported attestation types") + validators = append(validators, createAzureTDXValidator(log, overrideAzurev6Tcbinfo)) + validators = append(validators, createDCAPTDXValidator(log)) default: - log.Error("currently only azure-tdx and dcap-tdx attestation is supported") - return errors.New("currently only azure-tdx and dcap-tdx attestation is supported") + log.Error("unsupported attestation type, see --help for available options") + return errors.New("unsupported attestation type") } // Load expected measurements from file or URL (if provided)