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-----
87 static uint8_t MIN_TCB_VERIF_VERSION = 3;
102 "Milan/Genoa TCB version size mismatch");
115 "Turin TCB version size mismatch");
122 std::optional<uint32_t>
snp = std::nullopt;
123 std::optional<uint32_t>
tee = std::nullopt;
125 std::optional<uint32_t>
fmc = std::nullopt;
131 valid &=
snp.has_value();
132 valid &=
tee.has_value();
136 throw std::logic_error(
137 fmt::format(
"Invalid TCB version policy for Milan or Genoa"));
141 static_cast<uint8_t
>(
tee.value()),
143 static_cast<uint8_t
>(
snp.value()),
144 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"));
161 static_cast<uint8_t
>(
fmc.value()),
163 static_cast<uint8_t
>(
tee.value()),
164 static_cast<uint8_t
>(
snp.value()),
166 static_cast<uint8_t
>(
microcode.value())};
172 [](std::optional<uint32_t>& min, std::optional<uint32_t>& test) {
173 if ((min.has_value() != test.has_value()))
177 if (!min.has_value() && !test.has_value())
182 return min.value() <= test.value();
186 valid &= more_than_min(minimum.
snp, test.
snp);
187 valid &= more_than_min(minimum.
tee, test.
tee);
189 valid &= more_than_min(minimum.
fmc, test.
fmc);
206 [[nodiscard]] std::vector<uint8_t>
data()
const
209 static_cast<const uint8_t*
>(underlying_data),
216 std::reverse(
data.begin(),
data.end());
217 return ccf::ds::to_hex(
data);
221 auto data = ccf::ds::from_hex(hex);
224 throw std::logic_error(
225 fmt::format(
"Invalid TCB version data size: {}",
data.size()));
228 std::reverse(
data.begin(),
data.end());
231 static_cast<void*
>(tcb_version.underlying_data),
247 .microcode = tcb.microcode,
250 .boot_loader = tcb.boot_loader,
259 .microcode = tcb.microcode,
262 .boot_loader = tcb.boot_loader,
266 throw std::logic_error(
267 "Unsupported SEV-SNP product for TCB version policy");
273 "TCB version raw size mismatch");
283 throw std::logic_error(
284 fmt::format(
"Invalid TCB version raw data: {}", j.dump()));
291 return "TcbVersionRaw";
325 "Cannot cast GuestPolicy to uint64_t");
327 static constexpr uint8_t attestation_flags_signing_key_vcek = 0;
339 sizeof(
Flags) ==
sizeof(uint32_t),
"Cannot cast Flags to uint32_t");
352 "Cannot cast PlatformInfo to uint64_t");
357 static constexpr uint32_t minimum_attestation_version = 2;
358 static constexpr uint32_t attestation_policy_abi_major = 1;
404 if (server.
url.has_value())
406 auto url = server.
url.value();
407 auto pos = url.find(
':');
408 if (pos == std::string::npos)
410 return {url, default_values.
port};
414 return {url.substr(0, pos), url.substr(pos + 1)};
418 return default_values;
421 static EndorsementEndpointsConfiguration
422 make_endorsement_endpoint_configuration(
423 const Attestation& quote,
426 EndorsementEndpointsConfiguration config;
428 auto chip_id_hex = fmt::format(
"{:02x}", fmt::join(quote.chip_id,
""));
429 auto reported_tcb = fmt::format(
"{:0x}", *(uint64_t*)("e.reported_tcb));
431 constexpr size_t default_max_retries_count = 10;
432 static const ds::SizeString default_max_client_response_size =
433 ds::SizeString(
"100mb");
435 if (endorsements_servers.empty())
438 config.servers.emplace_back(make_azure_endorsements_server(
439 default_azure_endorsements_endpoint,
442 default_max_retries_count,
443 default_max_client_response_size));
447 for (
auto const& server : endorsements_servers)
449 size_t max_retries_count =
451 size_t max_client_response_size =
453 default_max_client_response_size);
459 get_endpoint_loc(server, default_azure_endorsements_endpoint);
460 config.servers.emplace_back(make_azure_endorsements_server(
465 max_client_response_size));
473 std::string boot_loader;
476 std::string microcode;
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);
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);
500 throw std::logic_error(
501 fmt::format(
"Unsupported SEV-SNP product: {}", product));
506 get_endpoint_loc(server, default_amd_endorsements_endpoint);
507 config.servers.emplace_back(make_amd_endorsements_server(
516 max_client_response_size));
522 get_endpoint_loc(server, default_thim_endorsements_endpoint);
523 config.servers.emplace_back(make_thim_endorsements_server(
528 max_client_response_size));
533 throw std::logic_error(fmt::format(
534 "Unsupported endorsements server type: {}", server.
type));
568 return ccf::pal::snp::cpuid_from_hex(
569 std::string(data.data(), data.end()));
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: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