1 /* 2 * Copyright (c) 2022 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * The contents of this file constitute Original Code as defined in and 7 * are subject to the Apple Public Source License Version 1.1 (the 8 * "License"). You may not use this file except in compliance with the 9 * License. Please obtain a copy of the License at 10 * http://www.apple.com/publicsource and read it before using this file. 11 * 12 * This Original Code and all software distributed under the License are 13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER 14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the 17 * License for the specific language governing rights and limitations 18 * under the License. 19 * 20 * @APPLE_LICENSE_HEADER_END@ 21 */ 22 23 #ifndef _SYS_CODE_SIGNING_INTERNAL_H_ 24 #define _SYS_CODE_SIGNING_INTERNAL_H_ 25 26 #include <sys/cdefs.h> 27 __BEGIN_DECLS 28 29 #pragma GCC diagnostic push 30 #pragma GCC diagnostic ignored "-Wnullability-completeness" 31 #pragma GCC diagnostic ignored "-Wnullability-completeness-on-arrays" 32 33 #ifdef XNU_KERNEL_PRIVATE 34 35 #include <mach/boolean.h> 36 #include <mach/kern_return.h> 37 #include <kern/cs_blobs.h> 38 #include <vm/pmap.h> 39 #include <vm/pmap_cs.h> 40 #include <img4/firmware.h> 41 #include <libkern/image4/dlxk.h> 42 43 #if CONFIG_SPTM 44 /* TrustedExecutionMonitor */ 45 #define CODE_SIGNING_MONITOR 1 46 #define CODE_SIGNING_MONITOR_PREFIX txm 47 48 #elif PMAP_CS_PPL_MONITOR 49 /* Page Protection Layer -- PMAP_CS */ 50 #define CODE_SIGNING_MONITOR 1 51 #define CODE_SIGNING_MONITOR_PREFIX ppl 52 53 #else 54 /* No monitor -- XNU */ 55 #define CODE_SIGNING_MONITOR 0 56 #define CODE_SIGNING_MONITOR_PREFIX xnu 57 58 #endif /* CONFIG_SPTM */ 59 60 /** 61 * This macro can be used by code which is abstracting out the concept of the code 62 * signing monitor in order to redirect calls to the correct monitor environment. 63 */ 64 #define __CSM_PREFIX(prefix, name) prefix##_##name 65 #define _CSM_PREFIX(prefix, name) __CSM_PREFIX(prefix, name) 66 #define CSM_PREFIX(name) _CSM_PREFIX(CODE_SIGNING_MONITOR_PREFIX, name) 67 68 void CSM_PREFIX(toggle_developer_mode)( 69 bool state); 70 71 kern_return_t CSM_PREFIX(rem_enable)(void); 72 73 kern_return_t CSM_PREFIX(rem_state)(void); 74 75 kern_return_t CSM_PREFIX(secure_channel_shared_page)( 76 uint64_t * secure_channel_phys, 77 size_t *secure_channel_size); 78 79 void CSM_PREFIX(update_device_state)(void); 80 81 void CSM_PREFIX(complete_security_boot_mode)( 82 uint32_t security_boot_mode); 83 84 void CSM_PREFIX(set_compilation_service_cdhash)( 85 const uint8_t cdhash[CS_CDHASH_LEN]); 86 87 bool CSM_PREFIX(match_compilation_service_cdhash)( 88 const uint8_t cdhash[CS_CDHASH_LEN]); 89 90 void CSM_PREFIX(set_local_signing_public_key)( 91 const uint8_t * public_key); 92 93 uint8_t* CSM_PREFIX(get_local_signing_public_key)(void); 94 95 void* CSM_PREFIX(image4_storage_data)( 96 size_t * allocated_size); 97 98 void CSM_PREFIX(image4_set_nonce)( 99 const img4_nonce_domain_index_t ndi, 100 const img4_nonce_t *nonce); 101 102 void CSM_PREFIX(image4_roll_nonce)( 103 const img4_nonce_domain_index_t ndi); 104 105 errno_t CSM_PREFIX(image4_copy_nonce)( 106 const img4_nonce_domain_index_t ndi, 107 img4_nonce_t *nonce_out); 108 109 errno_t CSM_PREFIX(image4_execute_object)( 110 img4_runtime_object_spec_index_t obj_spec_index, 111 const img4_buff_t *payload, 112 const img4_buff_t *manifest); 113 114 errno_t CSM_PREFIX(image4_copy_object)( 115 img4_runtime_object_spec_index_t obj_spec_index, 116 vm_address_t object_out, 117 size_t *object_length); 118 119 const void* CSM_PREFIX(image4_get_monitor_exports)(void); 120 121 errno_t CSM_PREFIX(image4_set_release_type)( 122 const char *release_type); 123 124 errno_t CSM_PREFIX(image4_set_bnch_shadow)( 125 const img4_nonce_domain_index_t ndi); 126 127 kern_return_t CSM_PREFIX(image4_transfer_region)( 128 image4_cs_trap_t selector, 129 vm_address_t region_addr, 130 vm_size_t region_size); 131 132 kern_return_t CSM_PREFIX(image4_reclaim_region)( 133 image4_cs_trap_t selector, 134 vm_address_t region_addr, 135 vm_size_t region_size); 136 137 errno_t CSM_PREFIX(image4_monitor_trap)( 138 image4_cs_trap_t selector, 139 const void *input_data, 140 size_t input_size); 141 142 #if CODE_SIGNING_MONITOR 143 /* Function prototypes needed only when we have a monitor environment */ 144 145 bool CSM_PREFIX(code_signing_enabled)(void); 146 147 void CSM_PREFIX(enter_lockdown_mode)(void); 148 149 vm_size_t CSM_PREFIX(managed_code_signature_size)(void); 150 151 void CSM_PREFIX(unrestrict_local_signing_cdhash)( 152 const uint8_t cdhash[CS_CDHASH_LEN]); 153 154 kern_return_t CSM_PREFIX(register_provisioning_profile)( 155 const void *profile_blob, 156 const size_t profile_blob_size, 157 void **profile_obj); 158 159 kern_return_t CSM_PREFIX(trust_provisioning_profile)( 160 void *profile_obj, 161 const void *sig_data, 162 size_t sig_size); 163 164 kern_return_t CSM_PREFIX(unregister_provisioning_profile)( 165 void *profile_obj); 166 167 kern_return_t CSM_PREFIX(associate_provisioning_profile)( 168 void *sig_obj, 169 void *profile_obj); 170 171 kern_return_t CSM_PREFIX(disassociate_provisioning_profile)( 172 void *sig_obj); 173 174 kern_return_t CSM_PREFIX(register_code_signature)( 175 const vm_address_t signature_addr, 176 const vm_size_t signature_size, 177 const vm_offset_t code_directory_offset, 178 const char *signature_path, 179 void **sig_obj, 180 vm_address_t *txm_signature_addr); 181 182 kern_return_t CSM_PREFIX(unregister_code_signature)( 183 void *sig_obj); 184 185 kern_return_t CSM_PREFIX(verify_code_signature)( 186 void *sig_obj); 187 188 kern_return_t CSM_PREFIX(reconstitute_code_signature)( 189 void *sig, 190 vm_address_t *unneeded_addr, 191 vm_size_t *unneeded_size); 192 193 kern_return_t CSM_PREFIX(associate_code_signature)( 194 pmap_t pmap, 195 void *sig_obj, 196 const vm_address_t region_addr, 197 const vm_size_t region_size, 198 const vm_offset_t region_offset); 199 200 kern_return_t CSM_PREFIX(allow_jit_region)( 201 pmap_t pmap); 202 203 kern_return_t CSM_PREFIX(associate_jit_region)( 204 pmap_t pmap, 205 const vm_address_t region_addr, 206 const vm_size_t region_size); 207 208 kern_return_t CSM_PREFIX(associate_debug_region)( 209 pmap_t pmap, 210 const vm_address_t region_addr, 211 const vm_size_t region_size); 212 213 kern_return_t CSM_PREFIX(address_space_debugged)( 214 pmap_t pmap); 215 216 kern_return_t CSM_PREFIX(allow_invalid_code)( 217 pmap_t pmap); 218 219 kern_return_t CSM_PREFIX(get_trust_level_kdp)( 220 pmap_t pmap, 221 uint32_t *trust_level); 222 223 kern_return_t CSM_PREFIX(get_jit_address_range_kdp)( 224 pmap_t pmap, 225 uintptr_t *jit_region_start, 226 uintptr_t *jit_region_end); 227 228 kern_return_t CSM_PREFIX(address_space_exempt)( 229 const pmap_t pmap); 230 231 kern_return_t CSM_PREFIX(fork_prepare)( 232 pmap_t old_pmap, 233 pmap_t new_pmap); 234 235 kern_return_t CSM_PREFIX(acquire_signing_identifier)( 236 const void *sig_obj, 237 const char **signing_id); 238 239 kern_return_t CSM_PREFIX(associate_kernel_entitlements)( 240 void *sig_obj, 241 const void *kernel_entitlements); 242 243 kern_return_t CSM_PREFIX(resolve_kernel_entitlements)( 244 pmap_t pmap, 245 const void **kernel_entitlements); 246 247 kern_return_t CSM_PREFIX(accelerate_entitlements)( 248 void *sig_obj, 249 CEQueryContext_t *ce_ctx); 250 251 #endif /* CODE_SIGNING_MONITOR */ 252 253 #endif /* XNU_KERNEL_PRIVATE */ 254 255 #pragma GCC diagnostic pop 256 257 __END_DECLS 258 #endif /* _SYS_CODE_SIGNING_INTERNAL_H_ */ 259