2  * Copyright (c) 2013-2014 Apple Inc. All Rights Reserved. 
   4  * @APPLE_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. Please obtain a copy of the License at 
  10  * http://www.opensource.apple.com/apsl/ and read it before using this 
  13  * The Original Code and all software distributed under the License are 
  14  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  15  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  16  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  17  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  18  * Please see the License for the specific language governing rights and 
  19  * limitations under the License. 
  21  * @APPLE_LICENSE_HEADER_END@ 
  25 #ifndef _SECAKSWRAPPERS_H_ 
  26 #define _SECAKSWRAPPERS_H_ 
  28 #include <TargetConditionals.h> 
  29 #include <utilities/SecCFError.h> 
  30 #include <AssertMacros.h> 
  31 #include <dispatch/dispatch.h> 
  33 #include <CoreFoundation/CFData.h> 
  35 #if TARGET_OS_SIMULATOR 
  36 #define TARGET_HAS_KEYSTORE 0 
  37 #elif TARGET_OS_MAC && !(TARGET_CPU_X86) 
  38 #define TARGET_HAS_KEYSTORE 1 
  39 #elif TARGET_OS_EMBEDDED 
  40 #define TARGET_HAS_KEYSTORE 1 
  41 #else /* no keystore on this platform */ 
  42 #define TARGET_HAS_KEYSTORE 0 
  45 #if !TARGET_HAS_KEYSTORE 
  47 #include <IOKit/IOReturn.h> 
  49 // Make the compiler happy so this will compile. 
  50 #define device_keybag_handle 0 
  51 #define session_keybag_handle 0 
  53 #define bad_keybag_handle -1 
  56     keybag_state_unlocked 
= 0, 
  57     keybag_state_locked 
= 1 << 0, 
  58     keybag_state_no_pin 
= 1 << 1, 
  59     keybag_state_been_unlocked 
= 1 << 2, 
  61 typedef uint32_t keybag_state_t
; 
  62 typedef int32_t keybag_handle_t
; 
  64 static kern_return_t 
aks_get_lock_state(keybag_handle_t handle
, keybag_state_t 
*state
) { 
  65     if (state
) *state 
= keybag_state_no_pin 
& keybag_state_been_unlocked
; 
  66     return kIOReturnSuccess
; 
  76 // MARK: User lock state 
  80     user_keybag_handle 
= TARGET_OS_EMBEDDED 
? device_keybag_handle 
: session_keybag_handle
, 
  83 extern const char * const kUserKeybagStateChangeNotification
; 
  85 static inline bool SecAKSGetLockedState(keybag_state_t 
*state
, CFErrorRef
* error
) 
  87     kern_return_t status 
= aks_get_lock_state(user_keybag_handle
, state
); 
  89     return SecKernError(status
, error
, CFSTR("aks_get_lock_state failed: %d"), status
); 
  92 // returns true if any of the bits in bits is set in the current state of the user bag 
  93 static inline bool SecAKSLockedAnyStateBitIsSet(bool* isSet
, keybag_state_t bits
, CFErrorRef
* error
) 
  96     bool success 
= SecAKSGetLockedState(&state
, error
); 
  98     require_quiet(success
, exit
); 
 101         *isSet 
= (state 
& bits
); 
 108 static inline bool SecAKSGetIsLocked(bool* isLocked
, CFErrorRef
* error
) 
 110     return SecAKSLockedAnyStateBitIsSet(isLocked
, keybag_state_locked
, error
); 
 113 static inline bool SecAKSGetIsUnlocked(bool* isUnlocked
, CFErrorRef
* error
) 
 115     bool isLocked 
= false; 
 116     bool success 
= SecAKSGetIsLocked(&isLocked
, error
); 
 118     if (success 
&& isUnlocked
) 
 119         *isUnlocked 
= !isLocked
; 
 124 static inline bool SecAKSGetHasBeenUnlocked(bool* hasBeenUnlocked
, CFErrorRef
* error
) 
 126     return SecAKSLockedAnyStateBitIsSet(hasBeenUnlocked
, keybag_state_been_unlocked
, error
); 
 129 bool SecAKSDoWhileUserBagLocked(CFErrorRef 
*error
, dispatch_block_t action
); 
 131 CFDataRef 
SecAKSCopyBackupBagWithSecret(size_t size
, uint8_t *secret
, CFErrorRef 
*error
);