12#include <openssl/crypto.h>
25 constexpr auto DEVICE =
"/dev/sev-guest";
30 template <
typename T,
size_t N>
34 sizeof(T) < N,
"No padding possible - struct is already N bytes");
145 sizeof(DerivedKeyReq) == 0x20,
146 "DerivedKeyReq struct size does not match expected size of 32 bytes");
171 template <
typename Req,
typename Resp>
203 static inline bool supports_sev_snp()
205 return access(
DEVICE, W_OK) == 0;
217 if (report_data.
data.size() <= snp_attestation_report_data_size)
224 throw std::logic_error(
225 "User-defined report data is larger than available space");
228 int fd = open(
DEVICE, O_RDWR | O_CLOEXEC);
231 throw std::logic_error(
232 fmt::format(
"Failed to open \"{}\" ({})",
DEVICE, fd));
234 auto close_guard = nonstd::make_close_fd_guard(&fd);
239 .
req_data = &req, .resp_wrapper = &padded_resp, .exit_info = {0}};
244 const auto msg = fmt::format(
245 "Failed to issue ioctl SEV_SNP_GUEST_MSG_REPORT: {} fw_error: {} "
250 throw std::logic_error(msg);
258 throw std::logic_error(
259 "SEV_SNP_GUEST_MSG_REPORT IOCTL overwrote safety sentinels.");
265 return padded_resp.report;
270 auto quote_bytes =
reinterpret_cast<uint8_t*
>(&padded_resp.report);
271 return {quote_bytes, quote_bytes + padded_resp.report_size};
283 int fd = open(
DEVICE, O_RDWR | O_CLOEXEC);
286 throw std::logic_error(
287 fmt::format(
"Failed to open \"{}\" ({})",
DEVICE, fd));
289 auto close_guard = nonstd::make_close_fd_guard(&fd);
292 DerivedKeyReq req = {};
294 req.guest_field_select =
296 req.tcb_version = tcb;
299 .req_data = &req, .resp_wrapper = &padded_resp, .exit_info = {0}};
303 const auto msg = fmt::format(
304 "Failed to issue ioctl SEV_SNP_GUEST_MSG_DERIVED_KEY: {} fw_error: "
307 payload.exit_info.errors.fw,
308 payload.exit_info.errors.vmm);
309 throw std::logic_error(msg);
317 throw std::logic_error(
318 "SEV_SNP_GUEST_MSG_DERIVED_KEY IOCTL overwrote safety sentinels.");
321 if (padded_resp.status != 0)
323 const auto msg = fmt::format(
324 "Failed to issue ioctl SEV_SNP_GUEST_MSG_DERIVED_KEY: {}",
326 throw std::logic_error(msg);
332 OPENSSL_cleanse(padded_resp.data,
sizeof(padded_resp.data));
337 return std::span<const uint8_t>{padded_resp.data};
Definition attestation_sev_snp.h:543
Definition snp_ioctl6.h:209
Attestation(const PlatformAttestationReportData &report_data)
Definition snp_ioctl6.h:214
std::vector< uint8_t > get_raw() override
Definition snp_ioctl6.h:268
const snp::Attestation & get() const override
Definition snp_ioctl6.h:263
Definition snp_ioctl6.h:276
~DerivedKey()
Definition snp_ioctl6.h:330
std::span< const uint8_t > get_raw()
Definition snp_ioctl6.h:335
DerivedKey(const TcbVersionRaw tcb={})
Definition snp_ioctl6.h:281
Definition snp_ioctl6.h:24
constexpr char SEV_GUEST_IOC_TYPE
Definition snp_ioctl6.h:197
constexpr uint8_t GUEST_FIELD_SELECT_FAMILY_ID
Definition snp_ioctl6.h:128
GuestRequest< DerivedKeyReq, PaddedDerivedKeyResp > GuestRequestDerivedKey
Definition snp_ioctl6.h:194
constexpr int SEV_SNP_GUEST_MSG_REPORT
Definition snp_ioctl6.h:198
constexpr uint8_t GUEST_FIELD_SELECT_GUEST_SVN
Definition snp_ioctl6.h:130
constexpr uint8_t GUEST_FIELD_SELECT_IMAGE_ID
Definition snp_ioctl6.h:127
constexpr int SEV_SNP_GUEST_MSG_DERIVED_KEY
Definition snp_ioctl6.h:200
constexpr uint8_t GUEST_FIELD_SELECT_GUEST_POLICY
Definition snp_ioctl6.h:126
constexpr uint8_t GUEST_FIELD_SELECT_TCB_VERSION
Definition snp_ioctl6.h:131
constexpr auto DEVICE
Definition snp_ioctl6.h:25
constexpr uint8_t GUEST_FIELD_SELECT_MEASUREMENT
Definition snp_ioctl6.h:129
Definition attestation_sev_snp.h:361
Definition attestation_sev_snp.h:199
Definition snp_ioctl6.h:105
uint8_t report_data[snp_attestation_report_data_size]
Definition snp_ioctl6.h:106
uint8_t reserved[28]
Definition snp_ioctl6.h:108
uint32_t vmpl
Definition snp_ioctl6.h:107
Definition snp_ioctl6.h:115
uint32_t status
Definition snp_ioctl6.h:116
uint32_t report_size
Definition snp_ioctl6.h:117
uint8_t padding[64]
Definition snp_ioctl6.h:120
struct Attestation report
Definition snp_ioctl6.h:119
uint8_t reserved[0x20 - 0x8]
Definition snp_ioctl6.h:118
Definition snp_ioctl6.h:135
uint64_t guest_field_select
Definition snp_ioctl6.h:138
uint32_t key_select
Definition snp_ioctl6.h:136
TcbVersionRaw tcb_version
Definition snp_ioctl6.h:141
uint32_t vmpl
Definition snp_ioctl6.h:139
uint32_t reserved
Definition snp_ioctl6.h:137
uint32_t guest_svn
Definition snp_ioctl6.h:140
Definition snp_ioctl6.h:151
uint8_t data[32]
Definition snp_ioctl6.h:154
uint32_t status
Definition snp_ioctl6.h:152
uint8_t reserved[0x20 - 0x04]
Definition snp_ioctl6.h:153
Definition snp_ioctl6.h:159
uint32_t fw
Definition snp_ioctl6.h:160
uint32_t vmm
Definition snp_ioctl6.h:161
Definition snp_ioctl6.h:173
Resp * resp_wrapper
Definition snp_ioctl6.h:179
ExitInfo exit_info
Definition snp_ioctl6.h:183
Req * req_data
Definition snp_ioctl6.h:178
uint32_t msg_version
Definition snp_ioctl6.h:175
Definition snp_ioctl6.h:43
uint8_t post_sentinels[num_sentinel_bytes]
Definition snp_ioctl6.h:56
static constexpr uint8_t post_sentinel_first
Definition snp_ioctl6.h:51
static constexpr size_t num_sentinel_bytes
Definition snp_ioctl6.h:44
static constexpr uint8_t pre_sentinel_first
Definition snp_ioctl6.h:48
IoctlSentinel()
Definition snp_ioctl6.h:58
static constexpr uint8_t post_sentinel_last
Definition snp_ioctl6.h:52
static constexpr uint8_t default_sentinel
Definition snp_ioctl6.h:46
T data
Definition snp_ioctl6.h:55
uint8_t pre_sentinels[num_sentinel_bytes]
Definition snp_ioctl6.h:54
bool sentinels_intact() const
Definition snp_ioctl6.h:69
static constexpr uint8_t pre_sentinel_last
Definition snp_ioctl6.h:49
Definition snp_ioctl6.h:32
uint8_t padding[num_padding_bytes]
Definition snp_ioctl6.h:36
static constexpr size_t num_padding_bytes
Definition snp_ioctl6.h:35
Definition snp_ioctl6.h:165
ExitInfoErrors errors
Definition snp_ioctl6.h:167
uint64_t whole
Definition snp_ioctl6.h:166