28 static constexpr auto NO_SECURITY_POLICY =
"";
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-----
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-----
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-----
100 "Milan/Genoa TCB version size mismatch");
113 "Turin TCB version size mismatch");
120 std::optional<uint32_t>
snp = std::nullopt;
121 std::optional<uint32_t>
tee = std::nullopt;
123 std::optional<uint32_t>
fmc = std::nullopt;
129 valid &=
snp.has_value();
130 valid &=
tee.has_value();
134 throw std::logic_error(
135 fmt::format(
"Invalid TCB version policy for Milan or Genoa"));
140 static_cast<uint8_t
>(
tee.value()),
142 static_cast<uint8_t
>(
snp.value()),
143 static_cast<uint8_t
>(
microcode.value())};
151 valid &=
snp.has_value();
152 valid &=
tee.has_value();
154 valid &=
fmc.has_value();
157 throw std::logic_error(
158 fmt::format(
"Invalid TCB version policy for Turin"));
162 static_cast<uint8_t
>(
fmc.value()),
164 static_cast<uint8_t
>(
tee.value()),
165 static_cast<uint8_t
>(
snp.value()),
167 static_cast<uint8_t
>(
microcode.value())};
174 [](std::optional<uint32_t>& min, std::optional<uint32_t>& test) {
175 if ((min.has_value() != test.has_value()))
179 if (!min.has_value() && !test.has_value())
184 return min.value() <= test.value();
188 valid &= more_than_min(minimum.
snp, test.
snp);
189 valid &= more_than_min(minimum.
tee, test.
tee);
191 valid &= more_than_min(minimum.
fmc, test.
fmc);
214 throw std::logic_error(
215 fmt::format(
"Invalid TCB version raw data size: {}",
data.size()));
221 [[nodiscard]] std::vector<uint8_t>
data()
const
224 static_cast<const uint8_t*
>(underlying_data),
231 std::reverse(
data.begin(),
data.end());
232 return ccf::ds::to_hex(
data);
236 auto data = ccf::ds::from_hex(hex);
239 throw std::logic_error(
240 fmt::format(
"Invalid TCB version data size: {}",
data.size()));
243 std::reverse(
data.begin(),
data.end());
246 static_cast<void*
>(tcb_version.underlying_data),
262 .microcode = tcb.microcode,
265 .boot_loader = tcb.boot_loader,
274 .microcode = tcb.microcode,
277 .boot_loader = tcb.boot_loader,
281 throw std::logic_error(
282 "Unsupported SEV-SNP product for TCB version policy");
298 "TCB version raw size mismatch");
308 throw std::logic_error(
309 fmt::format(
"Invalid TCB version raw data: {}", j.dump()));
316 return "TcbVersionRaw";
351 "Cannot cast GuestPolicy to uint64_t");
353 static constexpr uint8_t attestation_flags_signing_key_vcek = 0;
365 sizeof(
Flags) ==
sizeof(uint32_t),
"Cannot cast Flags to uint32_t");
378 "Cannot cast PlatformInfo to uint64_t");
383 static constexpr uint32_t minimum_attestation_version = 3;
384 static constexpr uint32_t attestation_policy_abi_major = 1;
438 throw std::logic_error(
439 fmt::format(
"Unsupported SEV-SNP product: {}", product));
444 static HostPort get_endpoint_loc(
445 const EndorsementsServer& server,
const HostPort& default_values)
447 if (server.url.has_value())
449 auto url = server.url.value();
450 auto pos = url.find(
':');
451 if (pos == std::string::npos)
453 return {url, default_values.
port};
455 return {url.substr(0, pos), url.substr(pos + 1)};
458 return default_values;
461 static EndorsementEndpointsConfiguration
462 make_endorsement_endpoint_configuration(
463 const Attestation& quote,
466 if (quote.version < minimum_attestation_version)
468 throw std::logic_error(fmt::format(
469 "SEV-SNP: attestation version {} is not supported. Minimum "
470 "supported version is {}",
472 minimum_attestation_version));
475 EndorsementEndpointsConfiguration config;
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*
>("e.reported_tcb));
482 constexpr size_t default_max_retries_count = 10;
483 static const ds::SizeString default_max_client_response_size =
484 ds::SizeString(
"100mb");
486 if (endorsements_servers.empty())
489 config.servers.emplace_back(make_azure_endorsements_server(
490 default_azure_endorsements_endpoint,
493 default_max_retries_count,
494 default_max_client_response_size));
498 for (
auto const& server : endorsements_servers)
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);
510 get_endpoint_loc(server, default_azure_endorsements_endpoint);
511 config.servers.emplace_back(make_azure_endorsements_server(
516 max_client_response_size));
524 std::string boot_loader;
527 std::string microcode;
528 std::optional<std::string> fmc = std::nullopt;
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);
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);
553 throw std::logic_error(
554 fmt::format(
"Unsupported SEV-SNP product: {}", product));
559 get_endpoint_loc(server, default_amd_endorsements_endpoint);
560 config.servers.emplace_back(make_amd_endorsements_server(
569 max_client_response_size,
576 get_endpoint_loc(server, default_thim_endorsements_endpoint);
577 config.servers.emplace_back(make_thim_endorsements_server(
582 max_client_response_size));
587 throw std::logic_error(fmt::format(
588 "Unsupported endorsements server type: {}", server.type));
617 return {hex_str.begin(), hex_str.end()};
622 return ccf::pal::snp::cpuid_from_hex(
623 std::string(data.data(), data.end()));
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: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