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"
8
9#include <list>
10#include <map>
11#include <string>
12#include <vector>
13
14#define FMT_HEADER_ONLY
15#include <fmt/format.h>
16
17namespace ccf::pal::snp
18{
20 {
21 std::string cache_control;
22 std::string vcek_cert;
23 std::string certificate_chain;
24 std::string tcbm;
25 };
29 cache_control,
30 "cacheControl",
31 vcek_cert,
32 "vcekCert",
33 certificate_chain,
34 "certificateChain",
35 tcbm,
36 "tcbm");
37
39 {
41 {
42 std::string host;
43 std::string port;
44 std::string uri;
45 std::map<std::string, std::string> params;
46 bool response_is_der = false;
48 std::map<std::string, std::string> headers = {};
49 bool tls = true;
51 size_t max_client_response_size = SIZE_MAX;
52
53 bool operator==(const EndpointInfo&) const = default;
54 };
55 using Server = std::list<EndpointInfo>;
56
57 // First server in list is always used first and other servers are provided
58 // as fallback.
59 std::list<Server> servers;
60 };
61
63 {
64 Azure = 0,
65 AMD = 1,
66 THIM = 2,
67 };
73
75 {
77 std::optional<std::string> url = std::nullopt;
78 std::optional<size_t> max_retries_count = std::nullopt;
79 std::optional<ccf::ds::SizeString> max_client_response_size = std::nullopt;
80
81 bool operator==(const EndorsementsServer&) const = default;
82 };
86 EndorsementsServer, type, url, max_retries_count, max_client_response_size);
87 using EndorsementsServers = std::vector<EndorsementsServer>;
88
89 struct HostPort
90 {
91 std::string host;
92 std::string port;
93 };
94
95 static HostPort default_azure_endorsements_endpoint = {
96 "global.acccache.azure.net", "443"};
97
99 make_azure_endorsements_server(
100 const HostPort& endpoint,
101 const std::string& chip_id_hex,
102 const std::string& reported_tcb,
103 size_t max_retries_count,
104 size_t max_client_response_size)
105 {
106 std::map<std::string, std::string> params;
107 params["api-version"] = "2020-10-15-preview";
108 EndorsementEndpointsConfiguration::EndpointInfo info{
109 endpoint.host,
110 endpoint.port,
111 fmt::format("/SevSnpVM/certificates/{}/{}", chip_id_hex, reported_tcb),
112 params,
113 };
114
115 info.max_retries_count = max_retries_count;
116 info.max_client_response_size = max_client_response_size;
117
118 return {info};
119 }
120
121 // AMD endorsements endpoints. See
122 // https://www.amd.com/system/files/TechDocs/57230.pdf
123 static HostPort default_amd_endorsements_endpoint = {
124 "kdsintf.amd.com", "443"};
125
126 static EndorsementEndpointsConfiguration::Server make_amd_endorsements_server(
127 const HostPort& endpoint,
128 const std::string& chip_id_hex,
129 const std::string& boot_loader,
130 const std::string& tee,
131 const std::string& snp,
132 const std::string& microcode,
133 const ProductName& product_name,
134 size_t max_retries_count,
135 size_t max_client_response_size)
136 {
137 std::map<std::string, std::string> params;
138 params["blSPL"] = boot_loader;
139 params["teeSPL"] = tee;
140 params["snpSPL"] = snp;
141 params["ucodeSPL"] = microcode;
142
144 EndorsementEndpointsConfiguration::EndpointInfo leaf{
145 endpoint.host,
146 endpoint.port,
147 fmt::format("/vcek/v1/{}/{}", to_string(product_name), chip_id_hex),
148 params,
149 true // DER
150 };
151 leaf.max_retries_count = max_retries_count;
152 leaf.max_client_response_size = max_client_response_size;
153 EndorsementEndpointsConfiguration::EndpointInfo chain{
154 endpoint.host,
155 endpoint.port,
156 fmt::format("/vcek/v1/{}/cert_chain", to_string(product_name)),
157 {}};
158 chain.max_retries_count = max_retries_count;
159 chain.max_client_response_size = max_client_response_size;
160
161 server.push_back(leaf);
162 server.push_back(chain);
163 return server;
164 }
165
166 static HostPort default_thim_endorsements_endpoint = {
167 "169.254.169.254", "80"};
168
170 make_thim_endorsements_server(
171 const HostPort& endpoint,
172 const std::string& chip_id_hex,
173 const std::string& reported_tcb,
174 size_t max_retries_count,
175 size_t max_client_response_size)
176 {
177 std::map<std::string, std::string> params;
178 params["tcbVersion"] = reported_tcb;
179 params["platformId"] = chip_id_hex;
180 EndorsementEndpointsConfiguration::EndpointInfo info{
181 endpoint.host,
182 endpoint.port,
183 "/metadata/THIM/amd/certification",
184 params,
185 false, // Not DER
186 true, // But THIM JSON
187 {{"Metadata", "true"}},
188 false // No TLS
189 };
190 info.max_retries_count = max_retries_count;
191 info.max_client_response_size = max_client_response_size;
192
193 return {info};
194 }
195}
196
197FMT_BEGIN_NAMESPACE
198template <>
199struct formatter<ccf::pal::snp::EndorsementEndpointsConfiguration::EndpointInfo>
200{
201 template <typename ParseContext>
202 constexpr auto parse(ParseContext& ctx)
203 {
204 return ctx.begin();
205 }
206
207 template <typename FormatContext>
208 auto format(
210 FormatContext& ctx) const
211 {
212 return format_to(
213 ctx.out(), "http{}://{}:{}", e.tls ? "s" : "", e.host, e.port);
214 }
215};
216FMT_END_NAMESPACE
#define DECLARE_JSON_REQUIRED_FIELDS(TYPE,...)
Definition json.h:714
#define DECLARE_JSON_TYPE(TYPE)
Definition json.h:663
#define DECLARE_JSON_REQUIRED_FIELDS_WITH_RENAMES(TYPE,...)
Definition json.h:752
#define DECLARE_JSON_TYPE_WITH_OPTIONAL_FIELDS(TYPE)
Definition json.h:690
#define DECLARE_JSON_OPTIONAL_FIELDS(TYPE,...)
Definition json.h:786
#define DECLARE_JSON_ENUM(TYPE,...)
Definition json.h:837
Definition attestation_sev_snp.h:24
std::string to_string(ProductName product)
Definition sev_snp_cpuid.h:92
ProductName
Definition sev_snp_cpuid.h:86
EndorsementsEndpointType
Definition attestation_sev_snp_endorsements.h:63
@ Azure
Definition attestation_sev_snp_endorsements.h:64
@ THIM
Definition attestation_sev_snp_endorsements.h:66
@ AMD
Definition attestation_sev_snp_endorsements.h:65
std::vector< EndorsementsServer > EndorsementsServers
Definition attestation_sev_snp_endorsements.h:87
Definition app_interface.h:14
Definition key_exchange.h:18
Definition attestation_sev_snp_endorsements.h:20
std::string tcbm
Definition attestation_sev_snp_endorsements.h:24
std::string certificate_chain
Definition attestation_sev_snp_endorsements.h:23
std::string vcek_cert
Definition attestation_sev_snp_endorsements.h:22
std::string cache_control
Definition attestation_sev_snp_endorsements.h:21
Definition attestation_sev_snp_endorsements.h:41
std::string host
Definition attestation_sev_snp_endorsements.h:42
std::map< std::string, std::string > params
Definition attestation_sev_snp_endorsements.h:45
std::map< std::string, std::string > headers
Definition attestation_sev_snp_endorsements.h:48
size_t max_retries_count
Definition attestation_sev_snp_endorsements.h:50
bool operator==(const EndpointInfo &) const =default
size_t max_client_response_size
Definition attestation_sev_snp_endorsements.h:51
bool response_is_der
Definition attestation_sev_snp_endorsements.h:46
std::string port
Definition attestation_sev_snp_endorsements.h:43
std::string uri
Definition attestation_sev_snp_endorsements.h:44
bool tls
Definition attestation_sev_snp_endorsements.h:49
bool response_is_thim_json
Definition attestation_sev_snp_endorsements.h:47
Definition attestation_sev_snp_endorsements.h:39
std::list< Server > servers
Definition attestation_sev_snp_endorsements.h:59
std::list< EndpointInfo > Server
Definition attestation_sev_snp_endorsements.h:55
Definition attestation_sev_snp_endorsements.h:75
std::optional< size_t > max_retries_count
Definition attestation_sev_snp_endorsements.h:78
std::optional< ccf::ds::SizeString > max_client_response_size
Definition attestation_sev_snp_endorsements.h:79
EndorsementsEndpointType type
Definition attestation_sev_snp_endorsements.h:76
bool operator==(const EndorsementsServer &) const =default
std::optional< std::string > url
Definition attestation_sev_snp_endorsements.h:77
Definition attestation_sev_snp_endorsements.h:90
std::string port
Definition attestation_sev_snp_endorsements.h:92
std::string host
Definition attestation_sev_snp_endorsements.h:91
auto format(const ccf::pal::snp::EndorsementEndpointsConfiguration::EndpointInfo &e, FormatContext &ctx) const
Definition attestation_sev_snp_endorsements.h:208
constexpr auto parse(ParseContext &ctx)
Definition attestation_sev_snp_endorsements.h:202