use super::Enclu;
use core::arch::asm;
#[cfg(all(target_env = "sgx", not(feature = "sgxstd")))]
mod upstream {
use super::*;
use core::mem::MaybeUninit;
#[repr(align(16))]
pub struct Align16<T>(pub T);
#[repr(align(128))]
pub struct Align128<T>(pub T);
#[repr(align(512))]
pub struct Align512<T>(pub T);
pub fn egetkey(request: &Align512<[u8; 512]>) -> Result<Align16<[u8; 16]>, u32> {
unsafe {
let mut out = MaybeUninit::uninit();
let error;
asm!(
"xchg %rbx, {0}",
"enclu",
"mov {0}, %rbx",
inout(reg) request => _,
inlateout("eax") Enclu::EGetkey as u32 => error,
in("rcx") out.as_mut_ptr(),
options(att_syntax, nostack),
);
match error {
0 => Ok(out.assume_init()),
err => Err(err),
}
}
}
pub fn ereport(
targetinfo: &Align512<[u8; 512]>,
reportdata: &Align128<[u8; 64]>,
) -> Align512<[u8; 432]> {
unsafe {
let mut report = MaybeUninit::uninit();
asm!(
"xchg %rbx, {0}",
"enclu",
"mov {0}, %rbx",
inout(reg) targetinfo => _,
in("eax") Enclu::EReport as u32,
in("rcx") reportdata,
in("rdx") report.as_mut_ptr(),
options(att_syntax, preserves_flags, nostack),
);
report.assume_init()
}
}
}
#[cfg(all(target_env = "sgx", not(feature = "sgxstd")))]
pub use self::upstream::*;
#[cfg(all(target_env = "sgx", feature = "sgxstd"))]
pub use std::os::fortanix_sgx::arch::*;
#[repr(align(256))]
pub struct Align256<T>(pub T);
pub fn everifyreport2(report_mac: &Align256<[u8; 256]>) -> Result<(), u32> {
unsafe {
let error: u32;
asm!(
"xchg %rbx, {0}",
"enclu",
"mov {0}, %rbx",
"jz 1f",
"xor %eax, %eax",
"1:",
inout(reg) report_mac => _,
inlateout("eax") Enclu::EVerifyReport2 as u32 => error,
options(att_syntax, nostack),
);
match error {
0 => Ok(()),
err => Err(err),
}
}
}