]>
git.saurik.com Git - apple/xnu.git/blob - iokit/Kernel/i386/IOKeyStoreHelper.cpp
   2  * Copyright (c) 2010 Apple Inc. All rights reserved. 
   4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 
   6  * This file contains Original Code and/or Modifications of Original Code 
   7  * as defined in and that are subject to the Apple Public Source License 
   8  * Version 2.0 (the 'License'). You may not use this file except in 
   9  * compliance with the License. The rights granted to you under the License 
  10  * may not be used to create, or enable the creation or redistribution of, 
  11  * unlawful or unlicensed copies of an Apple operating system, or to 
  12  * circumvent, violate, or enable the circumvention or violation of, any 
  13  * terms of an Apple operating system software license agreement. 
  15  * Please obtain a copy of the License at 
  16  * http://www.opensource.apple.com/apsl/ and read it before using this file. 
  18  * The Original Code and all software distributed under the License are 
  19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  23  * Please see the License for the specific language governing rights and 
  24  * limitations under the License. 
  26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 
  29 #include <sys/cdefs.h> 
  32 #include <IOKit/assert.h> 
  33 #include <IOKit/system.h> 
  34 #include <IOKit/IOLib.h> 
  35 #include <IOKit/IOMemoryDescriptor.h> 
  36 #include <IOKit/IOKitDebug.h> 
  40 #include <pexpert/pexpert.h> 
  42 static volatile UInt32 alreadyFetched 
= 0; 
  43 static IOMemoryDescriptor 
* newData
; 
  46 IOGetBootKeyStoreData(void); 
  48 IOSetKeyStoreData(IOMemoryDescriptor 
* data
); 
  51 static volatile UInt32 apfsKeyFetched 
= 0; 
  52 static IOMemoryDescriptor
* apfsKeyData 
= NULL
; 
  54 IOMemoryDescriptor
* IOGetAPFSKeyStoreData(); 
  55 void IOSetAPFSKeyStoreData(IOMemoryDescriptor
* data
); 
  60 #define DEBG(fmt, args...)      { kprintf(fmt, ## args); } 
  62 #define DEBG(fmt, args...)      {} 
  66 IOSetKeyStoreData(IOMemoryDescriptor 
* data
) 
  73 IOGetBootKeyStoreData(void) 
  75   IOMemoryDescriptor 
*memoryDescriptor
; 
  76   boot_args 
*args 
= (boot_args 
*)PE_state
.bootArgs
; 
  78   IOAddressRange ranges
; 
  80   if (!OSCompareAndSwap(0, 1, &alreadyFetched
)) 
  85     IOMemoryDescriptor 
* data 
= newData
; 
  90   DEBG("%s: data at address %u size %u\n", __func__
, 
  91        args
->keyStoreDataStart
, 
  92        args
->keyStoreDataSize
); 
  94   if (args
->keyStoreDataStart 
== 0) 
  97   ranges
.address 
= args
->keyStoreDataStart
; 
  98   ranges
.length 
= args
->keyStoreDataSize
; 
 100   options 
= kIODirectionInOut 
| kIOMemoryTypePhysical64 
| kIOMemoryMapperNone
; 
 102   memoryDescriptor 
= IOMemoryDescriptor::withOptions(&ranges
, 
 108   DEBG("%s: memory descriptor %p\n", __func__
, memoryDescriptor
); 
 110   return memoryDescriptor
; 
 113 // APFS volume key fetcher 
 115 // Store in-memory key (could be used by IOHibernateDone) 
 117 IOSetAPFSKeyStoreData(IOMemoryDescriptor
* data
) 
 119     // Do not allow re-fetching of the boot_args key by passing NULL here. 
 127 // Retrieve any key we may have (stored in boot_args or by Hibernate) 
 129 IOGetAPFSKeyStoreData() 
 131     // Check if someone got the key before us 
 132     if (!OSCompareAndSwap(0, 1, &apfsKeyFetched
)) 
 135     // Do we have in-memory key? 
 138         IOMemoryDescriptor
* data 
= apfsKeyData
; 
 143     // Looks like there was no in-memory key and it's the first call - try boot_args 
 144     boot_args
* args 
= (boot_args
*)PE_state
.bootArgs
; 
 146     DEBG("%s: data at address %u size %u\n", __func__
, args
->apfsDataStart
, args
->apfsDataSize
); 
 147     if (args
->apfsDataStart 
== 0) 
 150     // We have the key in the boot_args, create IOMemoryDescriptor for the blob 
 151     IOAddressRange ranges
; 
 152     ranges
.address 
= args
->apfsDataStart
; 
 153     ranges
.length 
= args
->apfsDataSize
; 
 155     const IOOptionBits options 
= kIODirectionInOut 
| kIOMemoryTypePhysical64 
| kIOMemoryMapperNone
; 
 157     IOMemoryDescriptor
* memoryDescriptor 
= IOMemoryDescriptor::withOptions(&ranges
, 1, 0, NULL
, options
); 
 158     DEBG("%s: memory descriptor %p\n", __func__
, memoryDescriptor
); 
 159     return memoryDescriptor
;