use crate::prelude::*; use std::ffi::CString; const SGXIOC_CMD_NUM_KEY: u64 = 0xc010730b; cfg_if::cfg_if! { if #[cfg(target_env = "musl")] { const IOCTL_CMD_NUM_KEY: i32 = SGXIOC_CMD_NUM_KEY as i32; } else { const IOCTL_CMD_NUM_KEY: u64 = SGXIOC_CMD_NUM_KEY; } } // Copy from occlum/src/libos/src/fs/dev_fs/dev_sgx/mod.rs #[repr(C)] pub struct IoctlGetKeyArg { pub key_request: *const sgx_key_request_t, // Input pub key: *mut sgx_key_128bit_t, // Output } pub struct UtilsIoctl { fd: c_int, // for backward compatibility with DcapQuote _quote_size: u32, _supplemental_size: u32, } impl UtilsIoctl { pub fn new() -> Result { let path = CString::new("/dev/sgx").unwrap(); let fd = unsafe { libc::open(path.as_ptr(), O_RDONLY) }; if fd > 0 { Ok(Self { fd, _quote_size: 0, _supplemental_size: 0, }) } else { let os_err = Error::last_os_error(); println!("OS error: {os_err:?}"); Err(os_err) } } pub(crate) fn generate_key(&mut self, key_arg: *mut IoctlGetKeyArg) -> Result { let ret = unsafe { libc::ioctl(self.fd, IOCTL_CMD_NUM_KEY, key_arg) }; if ret < 0 { let os_err = Error::last_os_error(); println!("OS error: {os_err:?}"); Err(os_err) } else { Ok(0) } } pub fn close(&mut self) { unsafe { libc::close(self.fd) }; } }