#ifndef _SYS_CPROTECT_H_
#define _SYS_CPROTECT_H_
#ifdef __cplusplus
extern "C" {
#endif
#if KERNEL_PRIVATE
#include <sys/cdefs.h>
#include <sys/content_protection.h>
#include <sys/kernel_types.h>
#define CP_KEYSIZE 32
#define CP_WRAPPEDKEYSIZE 40
#define CP_LOCKED_STATE 0
#define CP_UNLOCKED_STATE 1
#define CP_LOCKED_KEYCHAIN 0
#define CP_UNLOCKED_KEYCHAIN 1
#define CP_NEEDS_KEYS 0x1
#define CP_KEY_FLUSHED 0x2
#define CP_NO_XATTR 0x4
#define CP_READ_ACCESS 0x1
#define CP_WRITE_ACCESS 0x2
#define CONTENT_PROTECTION_XATTR_NAME "com.apple.system.cprotect"
#define CP_CURRENT_MAJOR_VERS 2
#define CP_CURRENT_MINOR_VERS 0
typedef struct cprotect *cprotect_t;
typedef struct cp_wrap_func *cp_wrap_func_t;
typedef struct cp_global_state *cp_global_state_t;
typedef struct cp_xattr *cp_xattr_t;
typedef struct cnode * cnode_ptr_t;
struct hfsmount;
typedef int wrapper_t(uint32_t properties, void *key_bytes, size_t key_length, void *wrapped_data, size_t *wrapped_length);
typedef int unwrapper_t(uint32_t properties, void *wrapped_data, size_t wrapped_data_length, void *key_bytes, size_t *key_length);
struct cprotect {
uint8_t cp_cache_key[CP_KEYSIZE];
uint8_t cp_persistent_key[CP_WRAPPEDKEYSIZE];
uint32_t cp_flags;
uint32_t cp_pclass;
};
struct cp_wrap_func {
wrapper_t *wrapper;
unwrapper_t *unwrapper;
};
struct cp_global_state {
uint8_t wrap_functions_set;
uint8_t lock_state;
};
struct cp_xattr {
u_int16_t xattr_major_version;
u_int16_t xattr_minor_version;
u_int32_t flags;
u_int32_t persistent_class;
u_int32_t key_size;
uint8_t persistent_key[CP_WRAPPEDKEYSIZE];
};
struct cp_root_xattr {
u_int16_t major_version;
u_int16_t minor_version;
u_int64_t flags;
u_int32_t reserved1;
u_int32_t reserved2;
u_int32_t reserved3;
u_int32_t reserved4;
};
int cp_vnode_getclass(vnode_t, int *);
int cp_vnode_setclass(vnode_t, uint32_t);
int cp_key_store_action(int);
int cp_register_wraps(cp_wrap_func_t);
int cp_entry_init(cnode_ptr_t, struct mount *);
int cp_entry_create_keys(cnode_ptr_t);
void cp_entry_destroy(cnode_ptr_t);
cnode_ptr_t cp_get_protected_cnode(vnode_t);
int cp_handle_vnop(cnode_ptr_t, int);
int cp_fs_protected (mount_t);
int cp_getrootxattr (struct hfsmount *hfsmp, struct cp_root_xattr *outxattr);
int cp_setrootxattr (struct hfsmount *hfsmp, struct cp_root_xattr *newxattr);
int cp_handle_relocate (cnode_ptr_t cp);
#endif
#ifdef __cplusplus
};
#endif
#endif