IOKeyStoreHelper.cpp [plain text]
#include <sys/cdefs.h>
#include <stdbool.h>
#include <IOKit/assert.h>
#include <IOKit/system.h>
#include <IOKit/IOLib.h>
#include <IOKit/IOMemoryDescriptor.h>
#include <IOKit/IOKitDebug.h>
__BEGIN_DECLS
#include <pexpert/pexpert.h>
static volatile UInt32 alreadyFetched = 0;
static IOMemoryDescriptor * newData;
IOMemoryDescriptor *
IOGetBootKeyStoreData(void);
void
IOSetKeyStoreData(IOMemoryDescriptor * data);
static volatile UInt32 apfsKeyFetched = 0;
static IOMemoryDescriptor* apfsKeyData = NULL;
IOMemoryDescriptor* IOGetAPFSKeyStoreData();
void IOSetAPFSKeyStoreData(IOMemoryDescriptor* data);
__END_DECLS
#if 1
#define DEBG(fmt, args...) { kprintf(fmt, ## args); }
#else
#define DEBG(fmt, args...) {}
#endif
void
IOSetKeyStoreData(IOMemoryDescriptor * data)
{
newData = data;
alreadyFetched = 0;
}
IOMemoryDescriptor *
IOGetBootKeyStoreData(void)
{
IOMemoryDescriptor *memoryDescriptor;
boot_args *args = (boot_args *)PE_state.bootArgs;
IOOptionBits options;
IOAddressRange ranges;
if (!OSCompareAndSwap(0, 1, &alreadyFetched))
return (NULL);
if (newData)
{
IOMemoryDescriptor * data = newData;
newData = NULL;
return (data);
}
DEBG("%s: data at address %u size %u\n", __func__,
args->keyStoreDataStart,
args->keyStoreDataSize);
if (args->keyStoreDataStart == 0)
return (NULL);
ranges.address = args->keyStoreDataStart;
ranges.length = args->keyStoreDataSize;
options = kIODirectionInOut | kIOMemoryTypePhysical64 | kIOMemoryMapperNone;
memoryDescriptor = IOMemoryDescriptor::withOptions(&ranges,
1,
0,
NULL,
options);
DEBG("%s: memory descriptor %p\n", __func__, memoryDescriptor);
return memoryDescriptor;
}
void
IOSetAPFSKeyStoreData(IOMemoryDescriptor* data)
{
if (data != NULL)
{
apfsKeyData = data;
apfsKeyFetched = 0;
}
}
IOMemoryDescriptor*
IOGetAPFSKeyStoreData()
{
if (!OSCompareAndSwap(0, 1, &apfsKeyFetched))
return NULL;
if (apfsKeyData)
{
IOMemoryDescriptor* data = apfsKeyData;
apfsKeyData = NULL;
return data;
}
boot_args* args = (boot_args*)PE_state.bootArgs;
DEBG("%s: data at address %u size %u\n", __func__, args->apfsDataStart, args->apfsDataSize);
if (args->apfsDataStart == 0)
return NULL;
IOAddressRange ranges;
ranges.address = args->apfsDataStart;
ranges.length = args->apfsDataSize;
const IOOptionBits options = kIODirectionInOut | kIOMemoryTypePhysical64 | kIOMemoryMapperNone;
IOMemoryDescriptor* memoryDescriptor = IOMemoryDescriptor::withOptions(&ranges, 1, 0, NULL, options);
DEBG("%s: memory descriptor %p\n", __func__, memoryDescriptor);
return memoryDescriptor;
}