CCF
Loading...
Searching...
No Matches
attestation_sev_snp.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
6#include "ccf/ds/json.h"
10#include "ccf/pal/report_data.h"
12
13#include <algorithm>
14#include <array>
15#include <cstdint>
16#include <cstring>
17#include <map>
18#include <optional>
19#include <stdexcept>
20#include <string>
21#include <vector>
22
24{
25 // Based on the SEV-SNP ABI Spec document at
26 // https://www.amd.com/system/files/TechDocs/56860.pdf
27
28 static constexpr auto NO_SECURITY_POLICY = "";
29
30 // From https://developer.amd.com/sev/
32 R"(-----BEGIN PUBLIC KEY-----
33MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0Ld52RJOdeiJlqK2JdsV
34mD7FktuotWwX1fNgW41XY9Xz1HEhSUmhLz9Cu9DHRlvgJSNxbeYYsnJfvyjx1MfU
350V5tkKiU1EesNFta1kTA0szNisdYc9isqk7mXT5+KfGRbfc4V/9zRIcE8jlHN61S
361ju8X93+6dxDUrG2SzxqJ4BhqyYmUDruPXJSX4vUc01P7j98MpqOS95rORdGHeI5
372Naz5m2B+O+vjsC060d37jY9LFeuOP4Meri8qgfi2S5kKqg/aF6aPtuAZQVR7u3K
38FYXP59XmJgtcog05gmI0T/OitLhuzVvpZcLph0odh/1IPXqx3+MnjD97A7fXpqGd
39/y8KxX7jksTEzAOgbKAeam3lm+3yKIcTYMlsRMXPcjNbIvmsBykD//xSniusuHBk
40gnlENEWx1UcbQQrs+gVDkuVPhsnzIRNgYvM48Y+7LGiJYnrmE8xcrexekBxrva2V
419TJQqnN3Q53kt5viQi3+gCfmkwC0F0tirIZbLkXPrPwzZ0M9eNxhIySb2npJfgnq
42z55I0u33wh4r0ZNQeTGfw03MBUtyuzGesGkcw+loqMaq1qR4tjGbPYxCvpCq7+Og
43pCCoMNit2uLo9M18fHz10lOMT8nWAUvRZFzteXCm+7PHdYPlmQwUw3LvenJ/ILXo
44QPHfbkH0CyPfhl1jWhJFZasCAwEAAQ==
45-----END PUBLIC KEY-----
46)";
48 R"(-----BEGIN PUBLIC KEY-----
49MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA3Cd95S/uFOuRIskW9vz9
50VDBF69NDQF79oRhL/L2PVQGhK3YdfEBgpF/JiwWFBsT/fXDhzA01p3LkcT/7Ldjc
51RfKXjHl+0Qq/M4dZkh6QDoUeKzNBLDcBKDDGWo3v35NyrxbA1DnkYwUKU5AAk4P9
524tKXLp80oxt84ahyHoLmc/LqsGsp+oq1Bz4PPsYLwTG4iMKVaaT90/oZ4I8oibSr
53u92vJhlqWO27d/Rxc3iUMyhNeGToOvgx/iUo4gGpG61NDpkEUvIzuKcaMx8IdTpW
54g2DF6SwF0IgVMffnvtJmA68BwJNWo1E4PLJdaPfBifcJpuBFwNVQIPQEVX3aP89H
55JSp8YbY9lySS6PlVEqTBBtaQmi4ATGmMR+n2K/e+JAhU2Gj7jIpJhOkdH9firQDn
56mlA2SFfJ/Cc0mGNzW9RmIhyOUnNFoclmkRhl3/AQU5Ys9Qsan1jT/EiyT+pCpmnA
57+y9edvhDCbOG8F2oxHGRdTBkylungrkXJGYiwGrR8kaiqv7NN8QhOBMqYjcbrkEr
580f8QMKklIS5ruOfqlLMCBw8JLB3LkjpWgtD7OpxkzSsohN47Uom86RY6lp72g8eX
59HP1qYrnvhzaG1S70vw6OkbaaC9EjiH/uHgAJQGxon7u0Q7xgoREWA/e7JcBQwLg8
600Hq/sbRuqesxz7wBWSY254cCAwEAAQ==
61-----END PUBLIC KEY-----
62)";
64 R"(-----BEGIN PUBLIC KEY-----
65MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwaAriB7EIuVc4ZB1wD3Y
66fDxL+9eyS7+izm0Jj3W772NINCWl8Bj3w/JD2ZjmbRxWdIq/4d9iarCKorXloJUB
671jRdgxqccTx1aOoig4+2w1XhVVJT7K457wT5ZLNJgQaxqa9Etkwjd6+9sOhlCDE9
68l43kQ0R2BikVJa/uyyVOSwEk5w5tXKOuG9jvq6QtAMJasW38wlqRDaKEGtZ9VUgG
69on27ZuL4sTJuC/azz9/iQBw8kEilzOl95AiTkeY5jSEBDWbAqnZk5qlM7kISKG20
70kgQm14mhNKDI2p2oua+zuAG7i52epoRF2GfU0TYk/yf+vCNB2tnechFQuP2e8bLk
7195ZdqPi9/UWw4JXjtdEA4u2JYplSSUPQVAXKt6LVqujtJcM59JKr2u0XQ75KwxcM
72p15gSXhBfInvPAwuAY4dEwwGqT8oIg4esPHwEsmChhYeDIxPG9R4fx9O0q6p8Gb+
73HXlTiS47P9YNeOpidOUKzDl/S1OvyhDtSL8LJc24QATFydo/iD/KUdvFTRlD0crk
74AMkZLoWQ8hLDGc6BZJXsdd7Zf2e4UW3tI/1oh/2t23Ot3zyhTcv5gDbABu0LjVe9
758uRnS15SMwK//lJt9e5BqKvgABkSoABf+B4VFtPVEX0ygrYaFaI9i5ABrxnVBmzX
76pRb21iI1NlNCfOGUPIhVpWECAwEAAQ==
77-----END PUBLIC KEY-----
78)";
79
80 inline const std::map<ProductName, const char*> amd_root_signing_keys{
83 // Disabled until we can test this
84 //{ProductName::turin, amd_turin_root_signing_public_key},
85 };
86
87 static uint8_t MIN_TCB_VERIF_VERSION = 3;
88#pragma pack(push, 1)
89 // Table 3
90 constexpr size_t snp_tcb_version_size = 8;
91
93 {
94 uint8_t boot_loader = 0;
95 uint8_t tee = 0;
96 uint8_t reserved[4];
97 uint8_t snp = 0;
98 uint8_t microcode = 0;
99 };
100 static_assert(
102 "Milan/Genoa TCB version size mismatch");
103
105 {
106 uint8_t fmc = 0;
107 uint8_t boot_loader = 0;
108 uint8_t tee = 0;
109 uint8_t snp = 0;
110 uint8_t reserved[3];
111 uint8_t microcode = 0;
112 };
113 static_assert(
115 "Turin TCB version size mismatch");
116#pragma pack(pop)
117
119 {
120 std::optional<std::string> hexstring = std::nullopt;
121 std::optional<uint32_t> microcode = std::nullopt;
122 std::optional<uint32_t> snp = std::nullopt;
123 std::optional<uint32_t> tee = std::nullopt;
124 std::optional<uint32_t> boot_loader = std::nullopt;
125 std::optional<uint32_t> fmc = std::nullopt;
126
128 {
129 auto valid = true;
130 valid &= microcode.has_value();
131 valid &= snp.has_value();
132 valid &= tee.has_value();
133 valid &= boot_loader.has_value();
134 if (!valid)
135 {
136 throw std::logic_error(
137 fmt::format("Invalid TCB version policy for Milan or Genoa"));
138 }
140 static_cast<uint8_t>(boot_loader.value()),
141 static_cast<uint8_t>(tee.value()),
142 {0, 0, 0, 0}, // reserved
143 static_cast<uint8_t>(snp.value()),
144 static_cast<uint8_t>(microcode.value())};
145 }
146
147 [[nodiscard]] TcbVersionTurin to_turin() const
148 {
149 auto valid = true;
150 valid &= microcode.has_value();
151 valid &= snp.has_value();
152 valid &= tee.has_value();
153 valid &= boot_loader.has_value();
154 valid &= fmc.has_value();
155 if (!valid)
156 {
157 throw std::logic_error(
158 fmt::format("Invalid TCB version policy for Turin"));
159 }
160 return TcbVersionTurin{
161 static_cast<uint8_t>(fmc.value()),
162 static_cast<uint8_t>(boot_loader.value()),
163 static_cast<uint8_t>(tee.value()),
164 static_cast<uint8_t>(snp.value()),
165 {0, 0, 0}, // reserved
166 static_cast<uint8_t>(microcode.value())};
167 }
168
169 static bool is_valid(TcbVersionPolicy& minimum, TcbVersionPolicy& test)
170 {
171 auto more_than_min =
172 [](std::optional<uint32_t>& min, std::optional<uint32_t>& test) {
173 if ((min.has_value() != test.has_value()))
174 {
175 return false;
176 }
177 if (!min.has_value() && !test.has_value())
178 {
179 return true;
180 }
181 // both set
182 return min.value() <= test.value();
183 };
184 auto valid = true;
185 valid &= more_than_min(minimum.microcode, test.microcode);
186 valid &= more_than_min(minimum.snp, test.snp);
187 valid &= more_than_min(minimum.tee, test.tee);
188 valid &= more_than_min(minimum.boot_loader, test.boot_loader);
189 valid &= more_than_min(minimum.fmc, test.fmc);
190 return valid;
191 }
192 };
196 TcbVersionPolicy, fmc, boot_loader, tee, snp, microcode, hexstring);
197
199 {
200 private:
201 uint8_t underlying_data[snp_tcb_version_size];
202
203 public:
204 bool operator==(const TcbVersionRaw& other) const = default;
205
206 [[nodiscard]] std::vector<uint8_t> data() const
207 {
208 return {
209 static_cast<const uint8_t*>(underlying_data),
210 static_cast<const uint8_t*>(underlying_data) + snp_tcb_version_size};
211 }
212 [[nodiscard]] std::string to_hex() const
213 {
214 auto data = this->data();
215 // reverse to match endianness
216 std::reverse(data.begin(), data.end());
217 return ccf::ds::to_hex(data);
218 }
219 static TcbVersionRaw from_hex(const std::string& hex)
220 {
221 auto data = ccf::ds::from_hex(hex);
222 if (data.size() != snp_tcb_version_size)
223 {
224 throw std::logic_error(
225 fmt::format("Invalid TCB version data size: {}", data.size()));
226 }
227 // reverse to match endianness
228 std::reverse(data.begin(), data.end());
229 TcbVersionRaw tcb_version{};
230 std::memcpy(
231 static_cast<void*>(tcb_version.underlying_data),
232 data.data(),
234 return tcb_version;
235 }
236
237 [[nodiscard]] TcbVersionPolicy to_policy(ProductName product) const
238 {
239 switch (product)
240 {
243 {
244 auto tcb = *reinterpret_cast<const TcbVersionMilanGenoa*>(this);
245 return TcbVersionPolicy{
246 .hexstring = this->to_hex(),
247 .microcode = tcb.microcode,
248 .snp = tcb.snp,
249 .tee = tcb.tee,
250 .boot_loader = tcb.boot_loader,
251 .fmc = std::nullopt // fmc is not applicable for Milan/Genoa
252 };
253 }
255 {
256 auto tcb = *reinterpret_cast<const TcbVersionTurin*>(this);
257 return TcbVersionPolicy{
258 .hexstring = this->to_hex(),
259 .microcode = tcb.microcode,
260 .snp = tcb.snp,
261 .tee = tcb.tee,
262 .boot_loader = tcb.boot_loader,
263 .fmc = tcb.fmc};
264 }
265 default:
266 throw std::logic_error(
267 "Unsupported SEV-SNP product for TCB version policy");
268 }
269 }
270 };
271 static_assert(
272 sizeof(TcbVersionRaw) == snp_tcb_version_size,
273 "TCB version raw size mismatch");
274#pragma pack(push, 1)
275 inline void to_json(nlohmann::json& j, const TcbVersionRaw& tcb_version)
276 {
277 j = tcb_version.to_hex();
278 }
279 inline void from_json(const nlohmann::json& j, TcbVersionRaw& tcb_version_raw)
280 {
281 if (!j.is_string())
282 {
283 throw std::logic_error(
284 fmt::format("Invalid TCB version raw data: {}", j.dump()));
285 }
286 tcb_version_raw = TcbVersionRaw::from_hex(j.get<std::string>());
287 }
288 inline std::string schema_name(const TcbVersionRaw& tcb_version)
289 {
290 (void)tcb_version;
291 return "TcbVersionRaw";
292 }
293
295 {
296 uint8_t r[72];
297 uint8_t s[72];
298 uint8_t reserved[512 - 144];
299 };
300#pragma pack(pop)
301
302 // Table 105
303 enum class SignatureAlgorithm : uint32_t
304 {
305 invalid = 0,
307 };
308
309#pragma pack(push, 1)
310 // Table 8
312 {
313 uint8_t abi_minor;
314 uint8_t abi_major;
315 uint8_t smt : 1;
316 uint8_t reserved : 1;
317 uint8_t migrate_ma : 1;
318 uint8_t debug : 1;
319 uint8_t single_socket : 1;
320 uint64_t reserved2 : 43;
321 };
322#pragma pack(pop)
323 static_assert(
324 sizeof(GuestPolicy) == sizeof(uint64_t),
325 "Cannot cast GuestPolicy to uint64_t");
326
327 static constexpr uint8_t attestation_flags_signing_key_vcek = 0;
328
329#pragma pack(push, 1)
330 struct Flags
331 {
332 uint8_t author_key_en : 1;
333 uint8_t mask_chip_key : 1;
334 uint8_t signing_key : 3;
335 uint64_t reserved : 27;
336 };
337#pragma pack(pop)
338 static_assert(
339 sizeof(Flags) == sizeof(uint32_t), "Cannot cast Flags to uint32_t");
340
341#pragma pack(push, 1)
342 // Table 22
344 {
345 uint8_t smt_en : 1;
346 uint8_t tsme_en : 1;
347 uint64_t reserved : 62;
348 };
349#pragma pack(pop)
350 static_assert(
351 sizeof(PlatformInfo) == sizeof(uint64_t),
352 "Cannot cast PlatformInfo to uint64_t");
353
354#pragma pack(push, 1)
355 // Table 21
356
357 static constexpr uint32_t minimum_attestation_version = 2;
358 static constexpr uint32_t attestation_policy_abi_major = 1;
359
361 {
362 uint32_t version; /* 0x000 */
363 uint32_t guest_svn; /* 0x004 */
364 struct GuestPolicy policy; /* 0x008 */
365 uint8_t family_id[16]; /* 0x010 */
366 uint8_t image_id[16]; /* 0x020 */
367 uint32_t vmpl; /* 0x030 */
371 Flags flags; /* 0x048 */
372 uint32_t reserved0; /* 0x04C */
373 uint8_t report_data[snp_attestation_report_data_size]; /* 0x050 */
374 uint8_t measurement[snp_attestation_measurement_size]; /* 0x090 */
375 uint8_t host_data[32]; /* 0x0C0 */
376 uint8_t id_key_digest[48]; /* 0x0E0 */
377 uint8_t author_key_digest[48]; /* 0x110 */
378 uint8_t report_id[32]; /* 0x140 */
379 uint8_t report_id_ma[32]; /* 0x160 */
381 uint8_t cpuid_fam_id; /* 0x188*/
382 uint8_t cpuid_mod_id; /* 0x189 */
383 uint8_t cpuid_step; /* 0x18A */
384 uint8_t reserved1[21]; /* 0x18B */
385 uint8_t chip_id[64]; /* 0x1A0 */
387 uint8_t current_minor; /* 0x1E8 */
388 uint8_t current_build; /* 0x1E9 */
389 uint8_t current_major; /* 0x1EA */
390 uint8_t reserved2; /* 0x1EB */
391 uint8_t committed_build; /* 0x1EC */
392 uint8_t committed_minor; /* 0x1ED */
393 uint8_t committed_major; /* 0x1EE */
394 uint8_t reserved3; /* 0x1EF */
396 uint8_t reserved4[168]; /* 0x1F8 */
397 struct Signature signature; /* 0x2A0 */
398 };
399#pragma pack(pop)
400
401 static HostPort get_endpoint_loc(
402 const EndorsementsServer& server, const HostPort& default_values)
403 {
404 if (server.url.has_value())
405 {
406 auto url = server.url.value();
407 auto pos = url.find(':');
408 if (pos == std::string::npos)
409 {
410 return {url, default_values.port};
411 }
412 else
413 {
414 return {url.substr(0, pos), url.substr(pos + 1)};
415 }
416 }
417
418 return default_values;
419 }
420
421 static EndorsementEndpointsConfiguration
422 make_endorsement_endpoint_configuration(
423 const Attestation& quote,
424 const snp::EndorsementsServers& endorsements_servers = {})
425 {
426 EndorsementEndpointsConfiguration config;
427
428 auto chip_id_hex = fmt::format("{:02x}", fmt::join(quote.chip_id, ""));
429 auto reported_tcb = fmt::format("{:0x}", *(uint64_t*)(&quote.reported_tcb));
430
431 constexpr size_t default_max_retries_count = 10;
432 static const ds::SizeString default_max_client_response_size =
433 ds::SizeString("100mb");
434
435 if (endorsements_servers.empty())
436 {
437 // Default to Azure server if no servers are specified
438 config.servers.emplace_back(make_azure_endorsements_server(
439 default_azure_endorsements_endpoint,
440 chip_id_hex,
441 reported_tcb,
442 default_max_retries_count,
443 default_max_client_response_size));
444 return config;
445 }
446
447 for (auto const& server : endorsements_servers)
448 {
449 size_t max_retries_count =
450 server.max_retries_count.value_or(default_max_retries_count);
451 size_t max_client_response_size =
452 server.max_client_response_size.value_or(
453 default_max_client_response_size);
454 switch (server.type)
455 {
457 {
458 auto loc =
459 get_endpoint_loc(server, default_azure_endorsements_endpoint);
460 config.servers.emplace_back(make_azure_endorsements_server(
461 loc,
462 chip_id_hex,
463 reported_tcb,
464 max_retries_count,
465 max_client_response_size));
466 break;
467 }
469 {
470 auto product =
471 get_sev_snp_product(quote.cpuid_fam_id, quote.cpuid_mod_id);
472
473 std::string boot_loader;
474 std::string tee;
475 std::string snp;
476 std::string microcode;
477 switch (product)
478 {
481 {
482 auto tcb = quote.reported_tcb.to_policy(product).to_milan_genoa();
483 boot_loader = fmt::format("{}", tcb.boot_loader);
484 tee = fmt::format("{}", tcb.tee);
485 snp = fmt::format("{}", tcb.snp);
486 microcode = fmt::format("{}", tcb.microcode);
487 break;
488 }
490 {
491 auto tcb = quote.reported_tcb.to_policy(product).to_turin();
492 boot_loader = fmt::format("{}", tcb.boot_loader);
493 tee = fmt::format("{}", tcb.tee);
494 snp = fmt::format("{}", tcb.snp);
495 microcode = fmt::format("{}", tcb.microcode);
496 break;
497 }
498 default:
499 {
500 throw std::logic_error(
501 fmt::format("Unsupported SEV-SNP product: {}", product));
502 }
503 }
504
505 auto loc =
506 get_endpoint_loc(server, default_amd_endorsements_endpoint);
507 config.servers.emplace_back(make_amd_endorsements_server(
508 loc,
509 chip_id_hex,
510 boot_loader,
511 tee,
512 snp,
513 microcode,
514 product,
515 max_retries_count,
516 max_client_response_size));
517 break;
518 }
520 {
521 auto loc =
522 get_endpoint_loc(server, default_thim_endorsements_endpoint);
523 config.servers.emplace_back(make_thim_endorsements_server(
524 loc,
525 chip_id_hex,
526 reported_tcb,
527 max_retries_count,
528 max_client_response_size));
529 break;
530 }
531 default:
532 {
533 throw std::logic_error(fmt::format(
534 "Unsupported endorsements server type: {}", server.type));
535 }
536 }
537 }
538
539 return config;
540 }
541
543 {
544 public:
545 virtual const snp::Attestation& get() const = 0;
546 virtual std::vector<uint8_t> get_raw() = 0;
547
548 virtual ~AttestationInterface() = default;
549 };
550
551}
552
553namespace ccf::kv::serialisers
554{
555 // Use hex string to ensure uniformity between the endpoint perspective and
556 // the kv's key
557 template <>
559 {
561 {
562 auto hex_str = chip.hex_str();
563 return SerialisedEntry(hex_str.begin(), hex_str.end());
564 }
565
567 {
568 return ccf::pal::snp::cpuid_from_hex(
569 std::string(data.data(), data.end()));
570 }
571 };
572}
Definition attestation_sev_snp.h:543
virtual std::vector< uint8_t > get_raw()=0
virtual ~AttestationInterface()=default
virtual const snp::Attestation & get() const =0
#define DECLARE_JSON_REQUIRED_FIELDS(TYPE,...)
Definition json.h:714
#define DECLARE_JSON_TYPE_WITH_OPTIONAL_FIELDS(TYPE)
Definition json.h:690
#define DECLARE_JSON_OPTIONAL_FIELDS(TYPE,...)
Definition json.h:786
Definition sha256_hash.h:80
ccf::ByteVector SerialisedEntry
Definition serialised_entry.h:8
Definition attestation_sev_snp.h:24
constexpr auto amd_genoa_root_signing_public_key
Definition attestation_sev_snp.h:47
void to_json(nlohmann::json &j, const TcbVersionRaw &tcb_version)
Definition attestation_sev_snp.h:275
SignatureAlgorithm
Definition attestation_sev_snp.h:304
ProductName
Definition sev_snp_cpuid.h:86
@ Azure
Definition attestation_sev_snp_endorsements.h:64
@ THIM
Definition attestation_sev_snp_endorsements.h:66
@ AMD
Definition attestation_sev_snp_endorsements.h:65
void from_json(const nlohmann::json &j, TcbVersionRaw &tcb_version_raw)
Definition attestation_sev_snp.h:279
constexpr auto amd_milan_root_signing_public_key
Definition attestation_sev_snp.h:31
constexpr size_t snp_tcb_version_size
Definition attestation_sev_snp.h:90
ProductName get_sev_snp_product(AMDFamily family, AMDModel model)
Definition sev_snp_cpuid.h:118
constexpr auto amd_turin_root_signing_public_key
Definition attestation_sev_snp.h:63
std::string schema_name(const TcbVersionRaw &tcb_version)
Definition attestation_sev_snp.h:288
std::vector< EndorsementsServer > EndorsementsServers
Definition attestation_sev_snp_endorsements.h:87
const std::map< ProductName, const char * > amd_root_signing_keys
Definition attestation_sev_snp.h:80
Definition app_interface.h:14
static ccf::pal::snp::CPUID from_serialised(const SerialisedEntry &data)
Definition attestation_sev_snp.h:566
static SerialisedEntry to_serialised(const ccf::pal::snp::CPUID &chip)
Definition attestation_sev_snp.h:560
Definition blit_serialiser.h:14
Definition attestation_sev_snp.h:361
TcbVersionRaw reported_tcb
Definition attestation_sev_snp.h:380
uint8_t reserved3
Definition attestation_sev_snp.h:394
uint32_t guest_svn
Definition attestation_sev_snp.h:363
uint8_t committed_major
Definition attestation_sev_snp.h:393
struct Signature signature
Definition attestation_sev_snp.h:397
uint8_t current_build
Definition attestation_sev_snp.h:388
uint8_t id_key_digest[48]
Definition attestation_sev_snp.h:376
PlatformInfo platform_info
Definition attestation_sev_snp.h:370
uint8_t chip_id[64]
Definition attestation_sev_snp.h:385
uint8_t committed_minor
Definition attestation_sev_snp.h:392
uint8_t reserved2
Definition attestation_sev_snp.h:390
uint32_t reserved0
Definition attestation_sev_snp.h:372
struct GuestPolicy policy
Definition attestation_sev_snp.h:364
uint32_t version
Definition attestation_sev_snp.h:362
uint8_t measurement[snp_attestation_measurement_size]
Definition attestation_sev_snp.h:374
uint8_t host_data[32]
Definition attestation_sev_snp.h:375
uint8_t current_minor
Definition attestation_sev_snp.h:387
uint8_t report_data[snp_attestation_report_data_size]
Definition attestation_sev_snp.h:373
uint8_t family_id[16]
Definition attestation_sev_snp.h:365
uint8_t committed_build
Definition attestation_sev_snp.h:391
TcbVersionRaw platform_version
Definition attestation_sev_snp.h:369
TcbVersionRaw launch_tcb
Definition attestation_sev_snp.h:395
uint8_t image_id[16]
Definition attestation_sev_snp.h:366
uint8_t cpuid_fam_id
Definition attestation_sev_snp.h:381
TcbVersionRaw committed_tcb
Definition attestation_sev_snp.h:386
uint8_t report_id[32]
Definition attestation_sev_snp.h:378
uint8_t reserved1[21]
Definition attestation_sev_snp.h:384
uint32_t vmpl
Definition attestation_sev_snp.h:367
SignatureAlgorithm signature_algo
Definition attestation_sev_snp.h:368
uint8_t report_id_ma[32]
Definition attestation_sev_snp.h:379
uint8_t cpuid_step
Definition attestation_sev_snp.h:383
Flags flags
Definition attestation_sev_snp.h:371
uint8_t cpuid_mod_id
Definition attestation_sev_snp.h:382
uint8_t current_major
Definition attestation_sev_snp.h:389
uint8_t reserved4[168]
Definition attestation_sev_snp.h:396
uint8_t author_key_digest[48]
Definition attestation_sev_snp.h:377
Definition sev_snp_cpuid.h:21
std::string hex_str() const
Definition sev_snp_cpuid.h:31
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
std::optional< std::string > url
Definition attestation_sev_snp_endorsements.h:77
Definition attestation_sev_snp.h:331
uint64_t reserved
Definition attestation_sev_snp.h:335
uint8_t signing_key
Definition attestation_sev_snp.h:334
uint8_t mask_chip_key
Definition attestation_sev_snp.h:333
uint8_t author_key_en
Definition attestation_sev_snp.h:332
Definition attestation_sev_snp.h:312
uint8_t single_socket
Definition attestation_sev_snp.h:319
uint64_t reserved2
Definition attestation_sev_snp.h:320
uint8_t abi_major
Definition attestation_sev_snp.h:314
uint8_t abi_minor
Definition attestation_sev_snp.h:313
uint8_t reserved
Definition attestation_sev_snp.h:316
uint8_t smt
Definition attestation_sev_snp.h:315
uint8_t migrate_ma
Definition attestation_sev_snp.h:317
uint8_t debug
Definition attestation_sev_snp.h:318
Definition attestation_sev_snp_endorsements.h:90
std::string port
Definition attestation_sev_snp_endorsements.h:92
Definition attestation_sev_snp.h:344
uint64_t reserved
Definition attestation_sev_snp.h:347
uint8_t tsme_en
Definition attestation_sev_snp.h:346
uint8_t smt_en
Definition attestation_sev_snp.h:345
Definition attestation_sev_snp.h:295
uint8_t r[72]
Definition attestation_sev_snp.h:296
uint8_t reserved[512 - 144]
Definition attestation_sev_snp.h:298
uint8_t s[72]
Definition attestation_sev_snp.h:297
Definition attestation_sev_snp.h:93
uint8_t tee
Definition attestation_sev_snp.h:95
uint8_t boot_loader
Definition attestation_sev_snp.h:94
uint8_t microcode
Definition attestation_sev_snp.h:98
uint8_t reserved[4]
Definition attestation_sev_snp.h:96
uint8_t snp
Definition attestation_sev_snp.h:97
Definition attestation_sev_snp.h:119
static bool is_valid(TcbVersionPolicy &minimum, TcbVersionPolicy &test)
Definition attestation_sev_snp.h:169
std::optional< std::string > hexstring
Definition attestation_sev_snp.h:120
std::optional< uint32_t > microcode
Definition attestation_sev_snp.h:121
TcbVersionTurin to_turin() const
Definition attestation_sev_snp.h:147
std::optional< uint32_t > fmc
Definition attestation_sev_snp.h:125
std::optional< uint32_t > tee
Definition attestation_sev_snp.h:123
std::optional< uint32_t > boot_loader
Definition attestation_sev_snp.h:124
TcbVersionMilanGenoa to_milan_genoa() const
Definition attestation_sev_snp.h:127
std::optional< uint32_t > snp
Definition attestation_sev_snp.h:122
Definition attestation_sev_snp.h:199
TcbVersionPolicy to_policy(ProductName product) const
Definition attestation_sev_snp.h:237
static TcbVersionRaw from_hex(const std::string &hex)
Definition attestation_sev_snp.h:219
std::string to_hex() const
Definition attestation_sev_snp.h:212
bool operator==(const TcbVersionRaw &other) const =default
std::vector< uint8_t > data() const
Definition attestation_sev_snp.h:206
Definition attestation_sev_snp.h:105
uint8_t fmc
Definition attestation_sev_snp.h:106
uint8_t microcode
Definition attestation_sev_snp.h:111
uint8_t tee
Definition attestation_sev_snp.h:108
uint8_t reserved[3]
Definition attestation_sev_snp.h:110
uint8_t snp
Definition attestation_sev_snp.h:109
uint8_t boot_loader
Definition attestation_sev_snp.h:107