#[cfg(all(target_env = "sgx", not(feature = "sgxstd")))]
use crate::arch;
#[cfg(all(target_env = "sgx", feature = "sgxstd"))]
use std::os::fortanix_sgx::arch;
use crate::{enum_def, slice, struct_def, ReportMacStruct, Sha384Hash};
#[cfg(target_env = "sgx")]
use crate::ErrorCode;
enum_def! {
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[repr(u8)]
pub enum TdxReportTypeVersion {
NoBound = 0x00,
ServTdUsed = 0x01,
ConfigSvnUsed = 0x02,
}
}
pub const TDX_REPORT_SIZE: usize = 1024;
pub const TEE_TCB_INFO_SIZE: usize = 239;
pub const TDX_REPORT_RESERVED_SIZE: usize = 17;
pub const TEE_INFO_SIZE: usize = 512;
pub const TDINFO_BASE_SIZE: usize = 448;
pub const TDINFO_EXTENSION_V1_SIZE: usize = 64;
pub const TDINFO_V1_SIZE: usize = TDINFO_BASE_SIZE + TDINFO_EXTENSION_V1_SIZE;
pub const TEE_TCB_INFO_VALID_SIZE: usize = 8;
pub const TEE_TCB_INFO_TEE_TCB_SVN_SIZE: usize = 16;
pub const TEE_TCB_INFO_MR_SIZE: usize = 48;
pub const TEE_TCB_INFO_ATTRIBUTES_SIZE: usize = 8;
pub const TEE_TCB_INFO_RESERVED_SIZE: usize = 95;
struct_def! {
#[repr(C)]
#[cfg_attr(
feature = "large_array_derive",
derive(Clone, Debug, Eq, PartialEq)
)]
pub struct TeeTcbInfo {
pub valid: [u8; TEE_TCB_INFO_VALID_SIZE],
pub tee_tcb_svn: [u8; TEE_TCB_INFO_TEE_TCB_SVN_SIZE],
pub mrseam: [u8; TEE_TCB_INFO_MR_SIZE],
pub mrsigner_seam: [u8; TEE_TCB_INFO_MR_SIZE],
pub attributes: [u8; TEE_TCB_INFO_ATTRIBUTES_SIZE],
pub tee_tcb_svn2: [u8; TEE_TCB_INFO_TEE_TCB_SVN_SIZE],
pub reserved: [u8; TEE_TCB_INFO_RESERVED_SIZE],
}
}
impl TeeTcbInfo {
pub const UNPADDED_SIZE: usize = TEE_TCB_INFO_SIZE;
}
struct_def! {
#[repr(C)]
#[cfg_attr(
feature = "large_array_derive",
derive(Clone, Debug, Eq, PartialEq)
)]
pub struct TdInfoBase {
pub attributes: [u8; 8],
pub xfam: [u8; 8],
pub mr_td: Sha384Hash,
pub mr_config_id: Sha384Hash,
pub mr_owner: Sha384Hash,
pub mr_owner_config: Sha384Hash,
pub rtmr: [Sha384Hash; 4],
pub servtd_hash: Sha384Hash,
}
}
impl TdInfoBase {
pub const UNPADDED_SIZE: usize = TDINFO_BASE_SIZE;
}
struct_def! {
#[repr(C, align(512))]
#[cfg_attr(
feature = "large_array_derive",
derive(Clone, Debug, Eq, PartialEq)
)]
pub struct TdInfoV1 {
pub base: TdInfoBase,
pub extension: [u8; TDINFO_EXTENSION_V1_SIZE],
}
}
impl TdInfoV1 {
pub const UNPADDED_SIZE: usize = TDINFO_V1_SIZE;
}
struct_def! {
#[repr(C, align(1024))]
#[cfg_attr(
feature = "large_array_derive",
derive(Clone, Debug, Eq, PartialEq)
)]
pub struct TdxReportV1 {
pub report_mac: ReportMacStruct,
pub tee_tcb_info: TeeTcbInfo,
pub reserved: [u8; TDX_REPORT_RESERVED_SIZE],
pub td_info: TdInfoV1,
}
}
impl TdxReportV1 {
pub const UNPADDED_SIZE: usize = 1024;
}
#[cfg(not(feature = "large_array_derive"))]
mod debug_impl {
use super::*;
use core::fmt::{Debug, Formatter, Result};
impl Debug for TdxReportV1 {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
f.debug_struct("TdxReport")
.field("report_mac", &self.report_mac)
.field("tee_tcb_info", &self.tee_tcb_info)
.field("reserved", &self.reserved)
.field("tee_info", &self.td_info)
.finish()
}
}
impl Debug for TeeTcbInfo {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
f.debug_struct("TeeTcbInfo")
.field("valid", &self.valid)
.field("tee_tcb_svn", &self.tee_tcb_svn)
.field("mrseam", &self.mrseam)
.field("mrsigner_seam", &self.mrsigner_seam)
.field("attributes", &self.attributes)
.field("reserved", &self.reserved)
.finish()
}
}
impl Debug for TdInfoV1 {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
f.debug_struct("TdInfoV1")
.field("base", &self.base)
.field("extension", &self.extension)
.finish()
}
}
impl Debug for TdInfoBase {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
f.debug_struct("TdInfoBase")
.field("attributes", &self.attributes)
.field("xfam", &self.xfam)
.field("mr_td", &self.mr_td)
.field("mr_config_id", &self.mr_config_id)
.field("mr_owner", &self.mr_owner)
.field("mr_owner_config", &self.mr_owner_config)
.field("rtmr", &self.rtmr)
.field("servtd_hash", &self.servtd_hash)
.finish()
}
}
}