use sgx_isa::Enclu;
pub use sgx_isa::{Keyname,Keypolicy,Keyrequest,Report,Targetinfo};
use rustc_alloc::{heap,oom};
use core::{ptr,mem};
use aes;
pub fn egetkey(req: &Keyrequest) -> [u8;16] {
let req_p;
let out_p;
let out;
unsafe {
req_p=heap::allocate(mem::size_of::<Keyrequest>(),512) as *mut Keyrequest;
out_p=heap::allocate(16,16) as *mut [u8;16];
if req_p==ptr::null_mut() || out_p==ptr::null_mut() { oom::oom() }
ptr::copy(req,req_p,1);
asm!("enclu"::"{eax}"(Enclu::EGetkey),"{rbx}"(req_p),"{rcx}"(out_p));
out=*out_p;
heap::deallocate(req_p as *mut _,mem::size_of::<Keyrequest>(),512);
heap::deallocate(out_p as *mut _,16,16);
}
out
}
pub fn ereport(tinfo: &Targetinfo, rdata: &[u8; 64]) -> Report {
ereport_internal(Some(tinfo),Some(rdata))
}
pub fn ereport_self() -> Report {
ereport_internal(None,None)
}
pub fn verify_report(report: &Report) -> bool {
let req=Keyrequest{
keyname: Keyname::Report as u16,
keyid: report.keyid,
..Default::default()
};
let key=egetkey(&req);
let mac_data=unsafe{::core::slice::from_raw_parts(report as *const _ as *const u8,384)};
aes::cmac_128(&key,mac_data)==report.mac
}
fn ereport_internal(tinfo: Option<&Targetinfo>, rdata: Option<&[u8; 64]>) -> Report {
let tinfo_p;
let rdata_p;
let report_p;
let report;
unsafe {
tinfo_p=heap::allocate(mem::size_of::<Targetinfo>(),512) as *mut Targetinfo;
rdata_p=heap::allocate(64,128) as *mut [u8;64];
report_p=heap::allocate(mem::size_of::<Report>(),512) as *mut Report;
if tinfo_p==ptr::null_mut() || rdata_p==ptr::null_mut() || report_p==ptr::null_mut() { oom::oom() }
match tinfo {
Some(tinfo) => ptr::copy(tinfo,tinfo_p,1),
None => ptr::write_bytes(tinfo_p,0,1),
};
match rdata {
Some(rdata) => ptr::copy(rdata,rdata_p,1),
None => ptr::write_bytes(rdata_p,0,1),
};
asm!("enclu"::"{eax}"(Enclu::EReport),"{rbx}"(tinfo_p),"{rcx}"(rdata_p),"{rdx}"(report_p));
report=ptr::read(report_p);
heap::deallocate(tinfo_p as *mut _,mem::size_of::<Targetinfo>(),512);
heap::deallocate(rdata_p as *mut _,64,128);
heap::deallocate(report_p as *mut _,mem::size_of::<Report>(),512);
}
report
}