/* Copyright (c) Edgeless Systems GmbH SPDX-License-Identifier: AGPL-3.0-only */ package config import ( "crypto/x509" "encoding/json" "encoding/pem" "fmt" "github.com/edgelesssys/constellation/v2/internal/attestation/measurements" "github.com/edgelesssys/constellation/v2/internal/variant" ) // AttestationConfig is the common interface for passing attestation configs. type AttestationConfig interface { // GetMeasurements returns the measurements that should be used for attestation. GetMeasurements() measurements.M // GetVariant returns the variant of the attestation config. GetVariant() variant.Variant } // Certificate is a wrapper around x509.Certificate allowing custom marshaling. type Certificate x509.Certificate // MarshalJSON marshals the certificate to PEM. func (c Certificate) MarshalJSON() ([]byte, error) { pem := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: c.Raw}) return json.Marshal(string(pem)) } // MarshalYAML marshals the certificate to PEM. func (c Certificate) MarshalYAML() (any, error) { pem := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: c.Raw}) return string(pem), nil } // UnmarshalJSON unmarshals the certificate from PEM. func (c *Certificate) UnmarshalJSON(data []byte) error { return c.unmarshal(func(val any) error { return json.Unmarshal(data, val) }) } // UnmarshalYAML unmarshals the certificate from PEM. func (c *Certificate) UnmarshalYAML(unmarshal func(any) error) error { return c.unmarshal(unmarshal) } func (c *Certificate) unmarshal(unmarshalFunc func(any) error) error { var pemData string if err := unmarshalFunc(&pemData); err != nil { return err } block, _ := pem.Decode([]byte(pemData)) cert, err := x509.ParseCertificate(block.Bytes) if err != nil { return err } *c = Certificate(*cert) return nil } func mustParsePEM(data string) Certificate { jsonData := fmt.Sprintf("\"%s\"", data) var cert Certificate if err := json.Unmarshal([]byte(jsonData), &cert); err != nil { panic(err) } return cert }