X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/39236c6e673c41db228275375ab7fdb0f837b292..a39ff7e25e19b3a8c3020042a3872ca9ec9659f1:/iokit/Kernel/i386/IOKeyStoreHelper.cpp diff --git a/iokit/Kernel/i386/IOKeyStoreHelper.cpp b/iokit/Kernel/i386/IOKeyStoreHelper.cpp index a1d41b8d0..17ebea802 100644 --- a/iokit/Kernel/i386/IOKeyStoreHelper.cpp +++ b/iokit/Kernel/i386/IOKeyStoreHelper.cpp @@ -47,6 +47,13 @@ IOGetBootKeyStoreData(void); void IOSetKeyStoreData(IOMemoryDescriptor * data); +// APFS +static volatile UInt32 apfsKeyFetched = 0; +static IOMemoryDescriptor* apfsKeyData = NULL; + +IOMemoryDescriptor* IOGetAPFSKeyStoreData(); +void IOSetAPFSKeyStoreData(IOMemoryDescriptor* data); + __END_DECLS #if 1 @@ -102,3 +109,52 @@ IOGetBootKeyStoreData(void) return memoryDescriptor; } + +// APFS volume key fetcher + +// Store in-memory key (could be used by IOHibernateDone) +void +IOSetAPFSKeyStoreData(IOMemoryDescriptor* data) +{ + // Do not allow re-fetching of the boot_args key by passing NULL here. + if (data != NULL) + { + apfsKeyData = data; + apfsKeyFetched = 0; + } +} + +// Retrieve any key we may have (stored in boot_args or by Hibernate) +IOMemoryDescriptor* +IOGetAPFSKeyStoreData() +{ + // Check if someone got the key before us + if (!OSCompareAndSwap(0, 1, &apfsKeyFetched)) + return NULL; + + // Do we have in-memory key? + if (apfsKeyData) + { + IOMemoryDescriptor* data = apfsKeyData; + apfsKeyData = NULL; + return data; + } + + // Looks like there was no in-memory key and it's the first call - try boot_args + 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; + + // We have the key in the boot_args, create IOMemoryDescriptor for the blob + 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; +}