CCF
Loading...
Searching...
No Matches
attestation_sev_snp_endorsements.h
Go to the documentation of this file.
1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the Apache 2.0 License.
3#pragma once
4
5#include "ccf/ds/json.h"
7
8#include <list>
9#include <map>
10#include <string>
11#include <vector>
12
13#define FMT_HEADER_ONLY
14#include <fmt/format.h>
15
16namespace ccf::pal::snp
17{
19 {
20 std::string cache_control;
21 std::string vcek_cert;
22 std::string certificate_chain;
23 std::string tcbm;
24 };
28 cache_control,
29 "cacheControl",
30 vcek_cert,
31 "vcekCert",
32 certificate_chain,
33 "certificateChain",
34 tcbm,
35 "tcbm");
36
38 {
40 {
41 std::string host;
42 std::string port;
43 std::string uri;
44 std::map<std::string, std::string> params;
45 bool response_is_der = false;
47 std::map<std::string, std::string> headers = {};
48 bool tls = true;
49
50 bool operator==(const EndpointInfo&) const = default;
51 };
52 using Server = std::list<EndpointInfo>;
53
54 // First server in list is always used first and other servers are provided
55 // as fallback.
56 std::list<Server> servers;
57 };
58
60 {
61 Azure = 0,
62 AMD = 1,
63 THIM = 2,
64 };
70
72 {
74 std::optional<std::string> url = std::nullopt;
75
76 bool operator==(const EndorsementsServer&) const = default;
77 };
81 using EndorsementsServers = std::vector<EndorsementsServer>;
82
83 struct HostPort
84 {
85 std::string host;
86 std::string port;
87 };
88
89 static HostPort default_azure_endorsements_endpoint = {
90 "global.acccache.azure.net", "443"};
91
93 make_azure_endorsements_server(
94 const HostPort& endpoint,
95 const std::string& chip_id_hex,
96 const std::string& reported_tcb)
97 {
98 std::map<std::string, std::string> params;
99 params["api-version"] = "2020-10-15-preview";
100 return {
101 {endpoint.host,
102 endpoint.port,
103 fmt::format("/SevSnpVM/certificates/{}/{}", chip_id_hex, reported_tcb),
104 params}};
105 }
106
107 // AMD endorsements endpoints. See
108 // https://www.amd.com/system/files/TechDocs/57230.pdf
109 static HostPort default_amd_endorsements_endpoint = {
110 "kdsintf.amd.com", "443"};
111
112 static EndorsementEndpointsConfiguration::Server make_amd_endorsements_server(
113 const HostPort& endpoint,
114 const std::string& chip_id_hex,
115 const std::string& boot_loader,
116 const std::string& tee,
117 const std::string& snp,
118 const std::string& microcode,
119 const ProductName& product_name)
120 {
121 std::map<std::string, std::string> params;
122 params["blSPL"] = boot_loader;
123 params["teeSPL"] = tee;
124 params["snpSPL"] = snp;
125 params["ucodeSPL"] = microcode;
126
127 EndorsementEndpointsConfiguration::EndpointInfo leaf{
128 endpoint.host,
129 endpoint.port,
130 fmt::format("/vcek/v1/{}/{}", to_string(product_name), chip_id_hex),
131 params,
132 true // DER
133 };
134 EndorsementEndpointsConfiguration::EndpointInfo chain{
135 endpoint.host,
136 endpoint.port,
137 fmt::format("/vcek/v1/{}/cert_chain", to_string(product_name)),
138 {}};
139
141 server.push_back(leaf);
142 server.push_back(chain);
143
144 return server;
145 }
146
147 static HostPort default_thim_endorsements_endpoint = {
148 "169.254.169.254", "80"};
149
151 make_thim_endorsements_server(
152 const HostPort& endpoint,
153 const std::string& chip_id_hex,
154 const std::string& reported_tcb)
155 {
156 std::map<std::string, std::string> params;
157 params["tcbVersion"] = reported_tcb;
158 params["platformId"] = chip_id_hex;
159 return {{
160 endpoint.host,
161 endpoint.port,
162 "/metadata/THIM/amd/certification",
163 params,
164 false, // Not DER
165 true, // But THIM JSON
166 {{"Metadata", "true"}},
167 false // No TLS
168 }};
169 }
170}
171
172FMT_BEGIN_NAMESPACE
173template <>
174struct formatter<ccf::pal::snp::EndorsementEndpointsConfiguration::EndpointInfo>
175{
176 template <typename ParseContext>
177 constexpr auto parse(ParseContext& ctx)
178 {
179 return ctx.begin();
180 }
181
182 template <typename FormatContext>
183 auto format(
185 FormatContext& ctx) const
186 {
187 return format_to(
188 ctx.out(), "http{}://{}:{}", e.tls ? "s" : "", e.host, e.port);
189 }
190};
191FMT_END_NAMESPACE
#define DECLARE_JSON_REQUIRED_FIELDS(TYPE,...)
Definition json.h:712
#define DECLARE_JSON_TYPE(TYPE)
Definition json.h:661
#define DECLARE_JSON_REQUIRED_FIELDS_WITH_RENAMES(TYPE,...)
Definition json.h:750
#define DECLARE_JSON_TYPE_WITH_OPTIONAL_FIELDS(TYPE)
Definition json.h:688
#define DECLARE_JSON_OPTIONAL_FIELDS(TYPE,...)
Definition json.h:784
#define DECLARE_JSON_ENUM(TYPE,...)
Definition json.h:835
Definition attestation_sev_snp.h:16
std::string to_string(ProductName product)
Definition sev_snp_cpuid.h:19
ProductName
Definition sev_snp_cpuid.h:14
EndorsementsEndpointType
Definition attestation_sev_snp_endorsements.h:60
@ Azure
Definition attestation_sev_snp_endorsements.h:61
@ THIM
Definition attestation_sev_snp_endorsements.h:63
@ AMD
Definition attestation_sev_snp_endorsements.h:62
std::vector< EndorsementsServer > EndorsementsServers
Definition attestation_sev_snp_endorsements.h:81
Definition app_interface.h:15
Definition key_exchange.h:18
Definition attestation_sev_snp_endorsements.h:19
std::string tcbm
Definition attestation_sev_snp_endorsements.h:23
std::string certificate_chain
Definition attestation_sev_snp_endorsements.h:22
std::string vcek_cert
Definition attestation_sev_snp_endorsements.h:21
std::string cache_control
Definition attestation_sev_snp_endorsements.h:20
Definition attestation_sev_snp_endorsements.h:40
std::string host
Definition attestation_sev_snp_endorsements.h:41
std::map< std::string, std::string > params
Definition attestation_sev_snp_endorsements.h:44
std::map< std::string, std::string > headers
Definition attestation_sev_snp_endorsements.h:47
bool operator==(const EndpointInfo &) const =default
bool response_is_der
Definition attestation_sev_snp_endorsements.h:45
std::string port
Definition attestation_sev_snp_endorsements.h:42
std::string uri
Definition attestation_sev_snp_endorsements.h:43
bool tls
Definition attestation_sev_snp_endorsements.h:48
bool response_is_thim_json
Definition attestation_sev_snp_endorsements.h:46
Definition attestation_sev_snp_endorsements.h:38
std::list< Server > servers
Definition attestation_sev_snp_endorsements.h:56
std::list< EndpointInfo > Server
Definition attestation_sev_snp_endorsements.h:52
Definition attestation_sev_snp_endorsements.h:72
EndorsementsEndpointType type
Definition attestation_sev_snp_endorsements.h:73
bool operator==(const EndorsementsServer &) const =default
std::optional< std::string > url
Definition attestation_sev_snp_endorsements.h:74
Definition attestation_sev_snp_endorsements.h:84
std::string port
Definition attestation_sev_snp_endorsements.h:86
std::string host
Definition attestation_sev_snp_endorsements.h:85
auto format(const ccf::pal::snp::EndorsementEndpointsConfiguration::EndpointInfo &e, FormatContext &ctx) const
Definition attestation_sev_snp_endorsements.h:183
constexpr auto parse(ParseContext &ctx)
Definition attestation_sev_snp_endorsements.h:177