use mach2::kern_return::KERN_SUCCESS;
use mach2::mach_init::mach_thread_self;
use mach2::mach_port::mach_port_deallocate;
use mach2::structs::arm_thread_state64_t;
use mach2::thread_act::thread_get_state;
use mach2::thread_status::ARM_THREAD_STATE64;
use mach2::traps::mach_task_self;
pub(super) fn pointer_authentication_enabled() -> Result<bool, &'static str> {
let mut state = arm_thread_state64_t::default();
let mut count = arm_thread_state64_t::count();
let result = unsafe {
let thread = mach_thread_self();
let result = thread_get_state(
thread,
ARM_THREAD_STATE64,
(&mut state as *mut arm_thread_state64_t).cast(),
&mut count,
);
mach_port_deallocate(mach_task_self(), thread);
result
};
if result != KERN_SUCCESS || count != arm_thread_state64_t::count() {
return Err("failed to query macOS pointer authentication state");
}
const ARM_THREAD_STATE64_FLAGS_NO_PTRAUTH: u32 = 0x1;
Ok(state.__pad & ARM_THREAD_STATE64_FLAGS_NO_PTRAUTH == 0)
}