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
85
86#pragma pack(push, 1)
87 // Table 3
88 constexpr size_t snp_tcb_version_size = 8;
89
91 {
92 uint8_t boot_loader = 0;
93 uint8_t tee = 0;
94 uint8_t reserved[4];
95 uint8_t snp = 0;
96 uint8_t microcode = 0;
97 };
98 static_assert(
100 "Milan/Genoa TCB version size mismatch");
101
103 {
104 uint8_t fmc = 0;
105 uint8_t boot_loader = 0;
106 uint8_t tee = 0;
107 uint8_t snp = 0;
108 uint8_t reserved[3];
109 uint8_t microcode = 0;
110 };
111 static_assert(
113 "Turin TCB version size mismatch");
114#pragma pack(pop)
115
117 {
118 std::optional<std::string> hexstring = std::nullopt;
119 std::optional<uint32_t> microcode = std::nullopt;
120 std::optional<uint32_t> snp = std::nullopt;
121 std::optional<uint32_t> tee = std::nullopt;
122 std::optional<uint32_t> boot_loader = std::nullopt;
123 std::optional<uint32_t> fmc = std::nullopt;
124
126 {
127 auto valid = true;
128 valid &= microcode.has_value();
129 valid &= snp.has_value();
130 valid &= tee.has_value();
131 valid &= boot_loader.has_value();
132 if (!valid)
133 {
134 throw std::logic_error(
135 fmt::format("Invalid TCB version policy for Milan or Genoa"));
136 }
137 // NOLINTBEGIN(bugprone-unchecked-optional-access)
139 static_cast<uint8_t>(boot_loader.value()),
140 static_cast<uint8_t>(tee.value()),
141 {0, 0, 0, 0}, // reserved
142 static_cast<uint8_t>(snp.value()),
143 static_cast<uint8_t>(microcode.value())};
144 // NOLINTEND(bugprone-unchecked-optional-access)
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 // NOLINTBEGIN(bugprone-unchecked-optional-access)
161 return TcbVersionTurin{
162 static_cast<uint8_t>(fmc.value()),
163 static_cast<uint8_t>(boot_loader.value()),
164 static_cast<uint8_t>(tee.value()),
165 static_cast<uint8_t>(snp.value()),
166 {0, 0, 0}, // reserved
167 static_cast<uint8_t>(microcode.value())};
168 // NOLINTEND(bugprone-unchecked-optional-access)
169 }
170
171 static bool is_valid(TcbVersionPolicy& minimum, TcbVersionPolicy& test)
172 {
173 auto more_than_min =
174 [](std::optional<uint32_t>& min, std::optional<uint32_t>& test) {
175 if ((min.has_value() != test.has_value()))
176 {
177 return false;
178 }
179 if (!min.has_value() && !test.has_value())
180 {
181 return true;
182 }
183 // both set
184 return min.value() <= test.value();
185 };
186 auto valid = true;
187 valid &= more_than_min(minimum.microcode, test.microcode);
188 valid &= more_than_min(minimum.snp, test.snp);
189 valid &= more_than_min(minimum.tee, test.tee);
190 valid &= more_than_min(minimum.boot_loader, test.boot_loader);
191 valid &= more_than_min(minimum.fmc, test.fmc);
192 return valid;
193 }
194 };
198 TcbVersionPolicy, fmc, boot_loader, tee, snp, microcode, hexstring);
199
201 {
202 private:
203 uint8_t underlying_data[snp_tcb_version_size]{};
204
205 public:
206 bool operator==(const TcbVersionRaw& other) const = default;
207
208 TcbVersionRaw() = default;
209
210 TcbVersionRaw(const std::vector<uint8_t>& data)
211 {
212 if (data.size() != snp_tcb_version_size)
213 {
214 throw std::logic_error(
215 fmt::format("Invalid TCB version raw data size: {}", data.size()));
216 }
217 std::memcpy(
218 static_cast<void*>(underlying_data), data.data(), snp_tcb_version_size);
219 }
220
221 [[nodiscard]] std::vector<uint8_t> data() const
222 {
223 return {
224 static_cast<const uint8_t*>(underlying_data),
225 static_cast<const uint8_t*>(underlying_data) + snp_tcb_version_size};
226 }
227 [[nodiscard]] std::string to_hex() const
228 {
229 auto data = this->data();
230 // reverse to match endianness
231 std::reverse(data.begin(), data.end());
232 return ccf::ds::to_hex(data);
233 }
234 static TcbVersionRaw from_hex(const std::string& hex)
235 {
236 auto data = ccf::ds::from_hex(hex);
237 if (data.size() != snp_tcb_version_size)
238 {
239 throw std::logic_error(
240 fmt::format("Invalid TCB version data size: {}", data.size()));
241 }
242 // reverse to match endianness
243 std::reverse(data.begin(), data.end());
244 TcbVersionRaw tcb_version{};
245 std::memcpy(
246 static_cast<void*>(tcb_version.underlying_data),
247 data.data(),
249 return tcb_version;
250 }
251
252 [[nodiscard]] TcbVersionPolicy to_policy(ProductName product) const
253 {
254 switch (product)
255 {
258 {
259 auto tcb = *reinterpret_cast<const TcbVersionMilanGenoa*>(this);
260 return TcbVersionPolicy{
261 .hexstring = this->to_hex(),
262 .microcode = tcb.microcode,
263 .snp = tcb.snp,
264 .tee = tcb.tee,
265 .boot_loader = tcb.boot_loader,
266 .fmc = std::nullopt // fmc is not applicable for Milan/Genoa
267 };
268 }
270 {
271 auto tcb = *reinterpret_cast<const TcbVersionTurin*>(this);
272 return TcbVersionPolicy{
273 .hexstring = this->to_hex(),
274 .microcode = tcb.microcode,
275 .snp = tcb.snp,
276 .tee = tcb.tee,
277 .boot_loader = tcb.boot_loader,
278 .fmc = tcb.fmc};
279 }
280 default:
281 throw std::logic_error(
282 "Unsupported SEV-SNP product for TCB version policy");
283 }
284 }
285
287 {
288 return reinterpret_cast<TcbVersionMilanGenoa*>(this);
289 }
290
291 [[nodiscard]] TcbVersionTurin* as_turin()
292 {
293 return reinterpret_cast<TcbVersionTurin*>(this);
294 }
295 };
296 static_assert(
297 sizeof(TcbVersionRaw) == snp_tcb_version_size,
298 "TCB version raw size mismatch");
299#pragma pack(push, 1)
300 inline void to_json(nlohmann::json& j, const TcbVersionRaw& tcb_version)
301 {
302 j = tcb_version.to_hex();
303 }
304 inline void from_json(const nlohmann::json& j, TcbVersionRaw& tcb_version_raw)
305 {
306 if (!j.is_string())
307 {
308 throw std::logic_error(
309 fmt::format("Invalid TCB version raw data: {}", j.dump()));
310 }
311 tcb_version_raw = TcbVersionRaw::from_hex(j.get<std::string>());
312 }
313 inline std::string schema_name(const TcbVersionRaw& tcb_version)
314 {
315 (void)tcb_version;
316 return "TcbVersionRaw";
317 }
318
320 {
321 uint8_t r[72];
322 uint8_t s[72];
323 uint8_t reserved[512 - 144];
324 };
325#pragma pack(pop)
326
327 // Table 105
328 // NOLINTNEXTLINE(performance-enum-size)
329 enum class SignatureAlgorithm : uint32_t
330 {
331 invalid = 0,
333 };
334
335#pragma pack(push, 1)
336 // Table 8
338 {
339 uint8_t abi_minor;
340 uint8_t abi_major;
341 uint8_t smt : 1;
342 uint8_t reserved : 1;
343 uint8_t migrate_ma : 1;
344 uint8_t debug : 1;
345 uint8_t single_socket : 1;
346 uint64_t reserved2 : 43;
347 };
348#pragma pack(pop)
349 static_assert(
350 sizeof(GuestPolicy) == sizeof(uint64_t),
351 "Cannot cast GuestPolicy to uint64_t");
352
353 static constexpr uint8_t attestation_flags_signing_key_vcek = 0;
354
355#pragma pack(push, 1)
356 struct Flags
357 {
358 uint8_t author_key_en : 1;
359 uint8_t mask_chip_key : 1;
360 uint8_t signing_key : 3;
361 uint64_t reserved : 27;
362 };
363#pragma pack(pop)
364 static_assert(
365 sizeof(Flags) == sizeof(uint32_t), "Cannot cast Flags to uint32_t");
366
367#pragma pack(push, 1)
368 // Table 22
370 {
371 uint8_t smt_en : 1;
372 uint8_t tsme_en : 1;
373 uint64_t reserved : 62;
374 };
375#pragma pack(pop)
376 static_assert(
377 sizeof(PlatformInfo) == sizeof(uint64_t),
378 "Cannot cast PlatformInfo to uint64_t");
379
380#pragma pack(push, 1)
381 // Table 21
382
383 static constexpr uint32_t minimum_attestation_version = 3;
384 static constexpr uint32_t attestation_policy_abi_major = 1;
385
387 {
388 uint32_t version = 0; /* 0x000 */
389 uint32_t guest_svn = 0; /* 0x004 */
390 struct GuestPolicy policy = {}; /* 0x008 */
391 uint8_t family_id[16] = {0}; /* 0x010 */
392 uint8_t image_id[16] = {0}; /* 0x020 */
393 uint32_t vmpl = 0; /* 0x030 */
396 PlatformInfo platform_info = {}; /* 0x040 */
397 Flags flags = {}; /* 0x048 */
398 uint32_t reserved0 = 0; /* 0x04C */
399 uint8_t report_data[snp_attestation_report_data_size] = {0}; /* 0x050 */
400 uint8_t measurement[snp_attestation_measurement_size] = {0}; /* 0x090 */
401 uint8_t host_data[32] = {0}; /* 0x0C0 */
402 uint8_t id_key_digest[48] = {0}; /* 0x0E0 */
403 uint8_t author_key_digest[48] = {0}; /* 0x110 */
404 uint8_t report_id[32] = {0}; /* 0x140 */
405 uint8_t report_id_ma[32] = {0}; /* 0x160 */
407 uint8_t cpuid_fam_id = 0; /* 0x188*/
408 uint8_t cpuid_mod_id = 0; /* 0x189 */
409 uint8_t cpuid_step = 0; /* 0x18A */
410 uint8_t reserved1[21] = {0}; /* 0x18B */
411 uint8_t chip_id[64] = {0}; /* 0x1A0 */
413 uint8_t current_minor = 0; /* 0x1E8 */
414 uint8_t current_build = 0; /* 0x1E9 */
415 uint8_t current_major = 0; /* 0x1EA */
416 uint8_t reserved2 = 0; /* 0x1EB */
417 uint8_t committed_build = 0; /* 0x1EC */
418 uint8_t committed_minor = 0; /* 0x1ED */
419 uint8_t committed_major = 0; /* 0x1EE */
420 uint8_t reserved3 = 0; /* 0x1EF */
422 uint8_t reserved4[168] = {0}; /* 0x1F8 */
423 struct Signature signature = {}; /* 0x2A0 */
424
425 [[nodiscard]] std::span<const uint8_t> get_chip_id_for_vcek() const
426 {
428 if (product == ProductName::Milan || product == ProductName::Genoa)
429 {
430 return {chip_id, sizeof(chip_id)};
431 }
432 // On Turin only the first 8 bytes are used for the chip ID
433 // VCEK certificate and KDS interface spec section 3.1
434 if (product == ProductName::Turin)
435 {
436 return {chip_id, 8};
437 }
438 throw std::logic_error(
439 fmt::format("Unsupported SEV-SNP product: {}", product));
440 }
441 };
442#pragma pack(pop)
443
444 static HostPort get_endpoint_loc(
445 const EndorsementsServer& server, const HostPort& default_values)
446 {
447 if (server.url.has_value())
448 {
449 auto url = server.url.value();
450 auto pos = url.find(':');
451 if (pos == std::string::npos)
452 {
453 return {url, default_values.port};
454 }
455 return {url.substr(0, pos), url.substr(pos + 1)};
456 }
457
458 return default_values;
459 }
460
461 static EndorsementEndpointsConfiguration
462 make_endorsement_endpoint_configuration(
463 const Attestation& quote,
464 const snp::EndorsementsServers& endorsements_servers = {})
465 {
466 if (quote.version < minimum_attestation_version)
467 {
468 throw std::logic_error(fmt::format(
469 "SEV-SNP: attestation version {} is not supported. Minimum "
470 "supported version is {}",
471 quote.version,
472 minimum_attestation_version));
473 }
474
475 EndorsementEndpointsConfiguration config;
476
477 auto chip_id_hex =
478 fmt::format("{:02x}", fmt::join(quote.get_chip_id_for_vcek(), ""));
479 auto reported_tcb = fmt::format(
480 "{:0x}", *reinterpret_cast<const uint64_t*>(&quote.reported_tcb));
481
482 constexpr size_t default_max_retries_count = 10;
483 static const ds::SizeString default_max_client_response_size =
484 ds::SizeString("100mb");
485
486 if (endorsements_servers.empty())
487 {
488 // Default to Azure server if no servers are specified
489 config.servers.emplace_back(make_azure_endorsements_server(
490 default_azure_endorsements_endpoint,
491 chip_id_hex,
492 reported_tcb,
493 default_max_retries_count,
494 default_max_client_response_size));
495 return config;
496 }
497
498 for (auto const& server : endorsements_servers)
499 {
500 size_t max_retries_count =
501 server.max_retries_count.value_or(default_max_retries_count);
502 size_t max_client_response_size =
503 server.max_client_response_size.value_or(
504 default_max_client_response_size);
505 switch (server.type)
506 {
508 {
509 auto loc =
510 get_endpoint_loc(server, default_azure_endorsements_endpoint);
511 config.servers.emplace_back(make_azure_endorsements_server(
512 loc,
513 chip_id_hex,
514 reported_tcb,
515 max_retries_count,
516 max_client_response_size));
517 break;
518 }
520 {
521 auto product =
522 get_sev_snp_product(quote.cpuid_fam_id, quote.cpuid_mod_id);
523
524 std::string boot_loader;
525 std::string tee;
526 std::string snp;
527 std::string microcode;
528 std::optional<std::string> fmc = std::nullopt;
529 switch (product)
530 {
533 {
534 auto tcb = quote.reported_tcb.to_policy(product).to_milan_genoa();
535 boot_loader = fmt::format("{}", tcb.boot_loader);
536 tee = fmt::format("{}", tcb.tee);
537 snp = fmt::format("{}", tcb.snp);
538 microcode = fmt::format("{}", tcb.microcode);
539 break;
540 }
542 {
543 auto tcb = quote.reported_tcb.to_policy(product).to_turin();
544 boot_loader = fmt::format("{}", tcb.boot_loader);
545 tee = fmt::format("{}", tcb.tee);
546 snp = fmt::format("{}", tcb.snp);
547 microcode = fmt::format("{}", tcb.microcode);
548 fmc = fmt::format("{}", tcb.fmc);
549 break;
550 }
551 default:
552 {
553 throw std::logic_error(
554 fmt::format("Unsupported SEV-SNP product: {}", product));
555 }
556 }
557
558 auto loc =
559 get_endpoint_loc(server, default_amd_endorsements_endpoint);
560 config.servers.emplace_back(make_amd_endorsements_server(
561 loc,
562 chip_id_hex,
563 boot_loader,
564 tee,
565 snp,
566 microcode,
567 product,
568 max_retries_count,
569 max_client_response_size,
570 fmc));
571 break;
572 }
574 {
575 auto loc =
576 get_endpoint_loc(server, default_thim_endorsements_endpoint);
577 config.servers.emplace_back(make_thim_endorsements_server(
578 loc,
579 chip_id_hex,
580 reported_tcb,
581 max_retries_count,
582 max_client_response_size));
583 break;
584 }
585 default:
586 {
587 throw std::logic_error(fmt::format(
588 "Unsupported endorsements server type: {}", server.type));
589 }
590 }
591 }
592
593 return config;
594 }
595
597 {
598 public:
599 [[nodiscard]] virtual const snp::Attestation& get() const = 0;
600 virtual std::vector<uint8_t> get_raw() = 0;
601
602 virtual ~AttestationInterface() = default;
603 };
604
605}
606
607namespace ccf::kv::serialisers
608{
609 // Use hex string to ensure uniformity between the endpoint perspective and
610 // the kv's key
611 template <>
613 {
615 {
616 auto hex_str = chip.hex_str();
617 return {hex_str.begin(), hex_str.end()};
618 }
619
621 {
622 return ccf::pal::snp::cpuid_from_hex(
623 std::string(data.data(), data.end()));
624 }
625 };
626}
Definition attestation_sev_snp.h:597
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:718
#define DECLARE_JSON_TYPE_WITH_OPTIONAL_FIELDS(TYPE)
Definition json.h:694
#define DECLARE_JSON_OPTIONAL_FIELDS(TYPE,...)
Definition json.h:790
Definition sha256_hash.h:88
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:300
SignatureAlgorithm
Definition attestation_sev_snp.h:330
void from_json(const nlohmann::json &j, TcbVersionRaw &tcb_version_raw)
Definition attestation_sev_snp.h:304
constexpr auto amd_milan_root_signing_public_key
Definition attestation_sev_snp.h:31
@ Azure
Definition attestation_sev_snp_endorsements.h:64
@ THIM
Definition attestation_sev_snp_endorsements.h:66
@ AMD
Definition attestation_sev_snp_endorsements.h:65
constexpr size_t snp_tcb_version_size
Definition attestation_sev_snp.h:88
ProductName get_sev_snp_product(AMDFamily family, AMDModel model)
Definition sev_snp_cpuid.h:119
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:313
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
ProductName
Definition sev_snp_cpuid.h:87
Definition app_interface.h:14
static ccf::pal::snp::CPUID from_serialised(const SerialisedEntry &data)
Definition attestation_sev_snp.h:620
static SerialisedEntry to_serialised(const ccf::pal::snp::CPUID &chip)
Definition attestation_sev_snp.h:614
Definition blit_serialiser.h:14
Definition attestation_sev_snp.h:387
TcbVersionRaw reported_tcb
Definition attestation_sev_snp.h:406
uint8_t reserved3
Definition attestation_sev_snp.h:420
uint32_t guest_svn
Definition attestation_sev_snp.h:389
uint8_t committed_major
Definition attestation_sev_snp.h:419
struct Signature signature
Definition attestation_sev_snp.h:423
uint8_t current_build
Definition attestation_sev_snp.h:414
uint8_t id_key_digest[48]
Definition attestation_sev_snp.h:402
PlatformInfo platform_info
Definition attestation_sev_snp.h:396
uint8_t chip_id[64]
Definition attestation_sev_snp.h:411
uint8_t committed_minor
Definition attestation_sev_snp.h:418
uint8_t reserved2
Definition attestation_sev_snp.h:416
uint32_t reserved0
Definition attestation_sev_snp.h:398
struct GuestPolicy policy
Definition attestation_sev_snp.h:390
uint32_t version
Definition attestation_sev_snp.h:388
uint8_t measurement[snp_attestation_measurement_size]
Definition attestation_sev_snp.h:400
uint8_t host_data[32]
Definition attestation_sev_snp.h:401
uint8_t current_minor
Definition attestation_sev_snp.h:413
std::span< const uint8_t > get_chip_id_for_vcek() const
Definition attestation_sev_snp.h:425
uint8_t report_data[snp_attestation_report_data_size]
Definition attestation_sev_snp.h:399
uint8_t family_id[16]
Definition attestation_sev_snp.h:391
uint8_t committed_build
Definition attestation_sev_snp.h:417
TcbVersionRaw platform_version
Definition attestation_sev_snp.h:395
TcbVersionRaw launch_tcb
Definition attestation_sev_snp.h:421
uint8_t image_id[16]
Definition attestation_sev_snp.h:392
uint8_t cpuid_fam_id
Definition attestation_sev_snp.h:407
TcbVersionRaw committed_tcb
Definition attestation_sev_snp.h:412
uint8_t report_id[32]
Definition attestation_sev_snp.h:404
uint8_t reserved1[21]
Definition attestation_sev_snp.h:410
uint32_t vmpl
Definition attestation_sev_snp.h:393
SignatureAlgorithm signature_algo
Definition attestation_sev_snp.h:394
uint8_t report_id_ma[32]
Definition attestation_sev_snp.h:405
uint8_t cpuid_step
Definition attestation_sev_snp.h:409
Flags flags
Definition attestation_sev_snp.h:397
uint8_t cpuid_mod_id
Definition attestation_sev_snp.h:408
uint8_t current_major
Definition attestation_sev_snp.h:415
uint8_t reserved4[168]
Definition attestation_sev_snp.h:422
uint8_t author_key_digest[48]
Definition attestation_sev_snp.h:403
Definition sev_snp_cpuid.h:22
std::string hex_str() const
Definition sev_snp_cpuid.h:32
Definition attestation_sev_snp.h:357
uint64_t reserved
Definition attestation_sev_snp.h:361
uint8_t signing_key
Definition attestation_sev_snp.h:360
uint8_t mask_chip_key
Definition attestation_sev_snp.h:359
uint8_t author_key_en
Definition attestation_sev_snp.h:358
Definition attestation_sev_snp.h:338
uint8_t single_socket
Definition attestation_sev_snp.h:345
uint64_t reserved2
Definition attestation_sev_snp.h:346
uint8_t abi_major
Definition attestation_sev_snp.h:340
uint8_t abi_minor
Definition attestation_sev_snp.h:339
uint8_t reserved
Definition attestation_sev_snp.h:342
uint8_t smt
Definition attestation_sev_snp.h:341
uint8_t migrate_ma
Definition attestation_sev_snp.h:343
uint8_t debug
Definition attestation_sev_snp.h:344
std::string port
Definition attestation_sev_snp_endorsements.h:92
Definition attestation_sev_snp.h:370
uint64_t reserved
Definition attestation_sev_snp.h:373
uint8_t tsme_en
Definition attestation_sev_snp.h:372
uint8_t smt_en
Definition attestation_sev_snp.h:371
Definition attestation_sev_snp.h:320
uint8_t r[72]
Definition attestation_sev_snp.h:321
uint8_t reserved[512 - 144]
Definition attestation_sev_snp.h:323
uint8_t s[72]
Definition attestation_sev_snp.h:322
Definition attestation_sev_snp.h:91
uint8_t tee
Definition attestation_sev_snp.h:93
uint8_t boot_loader
Definition attestation_sev_snp.h:92
uint8_t microcode
Definition attestation_sev_snp.h:96
uint8_t reserved[4]
Definition attestation_sev_snp.h:94
uint8_t snp
Definition attestation_sev_snp.h:95
Definition attestation_sev_snp.h:117
static bool is_valid(TcbVersionPolicy &minimum, TcbVersionPolicy &test)
Definition attestation_sev_snp.h:171
std::optional< std::string > hexstring
Definition attestation_sev_snp.h:118
std::optional< uint32_t > microcode
Definition attestation_sev_snp.h:119
TcbVersionTurin to_turin() const
Definition attestation_sev_snp.h:147
std::optional< uint32_t > fmc
Definition attestation_sev_snp.h:123
std::optional< uint32_t > tee
Definition attestation_sev_snp.h:121
std::optional< uint32_t > boot_loader
Definition attestation_sev_snp.h:122
TcbVersionMilanGenoa to_milan_genoa() const
Definition attestation_sev_snp.h:125
std::optional< uint32_t > snp
Definition attestation_sev_snp.h:120
Definition attestation_sev_snp.h:201
TcbVersionRaw(const std::vector< uint8_t > &data)
Definition attestation_sev_snp.h:210
TcbVersionPolicy to_policy(ProductName product) const
Definition attestation_sev_snp.h:252
static TcbVersionRaw from_hex(const std::string &hex)
Definition attestation_sev_snp.h:234
std::string to_hex() const
Definition attestation_sev_snp.h:227
bool operator==(const TcbVersionRaw &other) const =default
TcbVersionTurin * as_turin()
Definition attestation_sev_snp.h:291
std::vector< uint8_t > data() const
Definition attestation_sev_snp.h:221
TcbVersionMilanGenoa * as_milan_genoa()
Definition attestation_sev_snp.h:286
Definition attestation_sev_snp.h:103
uint8_t fmc
Definition attestation_sev_snp.h:104
uint8_t microcode
Definition attestation_sev_snp.h:109
uint8_t tee
Definition attestation_sev_snp.h:106
uint8_t reserved[3]
Definition attestation_sev_snp.h:108
uint8_t snp
Definition attestation_sev_snp.h:107
uint8_t boot_loader
Definition attestation_sev_snp.h:105