/ keychain / SecureObjectSync / SOSBackupSliceKeyBag.h
SOSBackupSliceKeyBag.h
  1  /*
  2   * Copyright (c) 2015 Apple Inc. All Rights Reserved.
  3   *
  4   * @APPLE_LICENSE_HEADER_START@
  5   *
  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
 11   * file.
 12   *
 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.
 20   *
 21   * @APPLE_LICENSE_HEADER_END@
 22   */
 23  
 24  /*!
 25   @header SOSBackupSliceKeyBag.h - View Bags - backup bags for views
 26   */
 27  
 28  #ifndef _sec_SOSBackupSliceKeyBag_
 29  #define _sec_SOSBackupSliceKeyBag_
 30  
 31  #include <CoreFoundation/CoreFoundation.h>
 32  #include <Security/SecureObjectSync/SOSPeerInfo.h>
 33  
 34  extern CFStringRef bskbRkbgPrefix;
 35  
 36  CFDataRef SOSRKNullKey(void);
 37  
 38  // We don't have a portable header (particularly for the SIM) so for now we define the one type we need.
 39  // This should be fixed when we get a portable AKS interface.
 40  typedef int32_t bskb_keybag_handle_t;
 41  
 42  typedef struct CF_BRIDGED_TYPE(id) __OpaqueSOSBackupSliceKeyBag *SOSBackupSliceKeyBagRef;
 43  
 44  SOSBackupSliceKeyBagRef SOSBackupSliceKeyBagCreate(CFAllocatorRef allocator, CFSetRef peers, CFErrorRef* error);
 45  SOSBackupSliceKeyBagRef SOSBackupSliceKeyBagCreateDirect(CFAllocatorRef allocator, CFDataRef aks_bag, CFErrorRef *error);
 46  
 47  SOSBackupSliceKeyBagRef SOSBackupSliceKeyBagCreateWithAdditionalKeys(CFAllocatorRef allocator,
 48                                                                       CFSetRef /*SOSPeerInfoRef*/ peers,
 49                                                                       CFDictionaryRef /*CFStringRef (prefix) CFDataRef (keydata) */ additionalKeys,
 50                                                                       CFErrorRef* error);
 51  
 52  SOSBackupSliceKeyBagRef SOSBackupSliceKeyBagCreateFromData(CFAllocatorRef allocator, CFDataRef data, CFErrorRef *error);
 53  
 54  CFDataRef SOSBSKBCopyEncoded(SOSBackupSliceKeyBagRef BackupSliceKeyBag, CFErrorRef* error);
 55  
 56  //
 57  bool SOSBSKBIsDirect(SOSBackupSliceKeyBagRef backupSliceKeyBag);
 58  
 59  CFSetRef SOSBSKBGetPeers(SOSBackupSliceKeyBagRef backupSliceKeyBag);
 60  
 61  int SOSBSKBCountPeers(SOSBackupSliceKeyBagRef backupSliceKeyBag);
 62  
 63  bool SOSBSKBPeerIsInKeyBag(SOSBackupSliceKeyBagRef backupSliceKeyBag, SOSPeerInfoRef pi);
 64  bool SOSBKSBKeyIsInKeyBag(SOSBackupSliceKeyBagRef backupSliceKeyBag, CFDataRef publicKey);
 65  bool SOSBKSBPeerBackupKeyIsInKeyBag(SOSBackupSliceKeyBagRef backupSliceKeyBag, SOSPeerInfoRef pi);
 66  bool SOSBSKBAllPeersBackupKeysAreInKeyBag(SOSBackupSliceKeyBagRef backupSliceKeyBag, CFSetRef peers);
 67  bool SOSBKSBPrefixedKeyIsInKeyBag(SOSBackupSliceKeyBagRef backupSliceKeyBag, CFStringRef prefix, CFDataRef publicKey);
 68  
 69  // Keybag fetching
 70  CFDataRef SOSBSKBCopyAKSBag(SOSBackupSliceKeyBagRef backupSliceKeyBag, CFErrorRef* error);
 71  
 72  
 73  // Der encoding
 74  const uint8_t* der_decode_BackupSliceKeyBag(CFAllocatorRef allocator,
 75                                    SOSBackupSliceKeyBagRef* BackupSliceKeyBag, CFErrorRef *error,
 76                                    const uint8_t* der, const uint8_t *der_end);
 77  
 78  size_t der_sizeof_BackupSliceKeyBag(SOSBackupSliceKeyBagRef BackupSliceKeyBag, CFErrorRef *error);
 79  uint8_t* der_encode_BackupSliceKeyBag(SOSBackupSliceKeyBagRef BackupSliceKeyBag, CFErrorRef *error,
 80                              const uint8_t *der, uint8_t *der_end);
 81  
 82  bskb_keybag_handle_t SOSBSKBLoadLocked(SOSBackupSliceKeyBagRef backupSliceKeyBag,
 83                                         CFErrorRef *error);
 84  
 85  bskb_keybag_handle_t SOSBSKBLoadAndUnlockWithPeerIDAndSecret(SOSBackupSliceKeyBagRef backupSliceKeyBag,
 86                                                               CFStringRef peerID, CFDataRef peerSecret,
 87                                                               CFErrorRef *error);
 88  
 89  bskb_keybag_handle_t SOSBSKBLoadAndUnlockWithPeerSecret(SOSBackupSliceKeyBagRef backupSliceKeyBag,
 90                                                          SOSPeerInfoRef peer, CFDataRef peerSecret,
 91                                                          CFErrorRef *error);
 92  
 93  bskb_keybag_handle_t SOSBSKBLoadAndUnlockWithDirectSecret(SOSBackupSliceKeyBagRef backupSliceKeyBag,
 94                                                            CFDataRef directSecret,
 95                                                            CFErrorRef *error);
 96  
 97  bskb_keybag_handle_t SOSBSKBLoadAndUnlockWithWrappingSecret(SOSBackupSliceKeyBagRef backupSliceKeyBag,
 98                                                              CFDataRef wrappingSecret,
 99                                                              CFErrorRef *error);
100  
101  // Utilities for backup keys
102  bool SOSBSKBIsGoodBackupPublic(CFDataRef publicKey, CFErrorRef *error);
103  
104  CFDataRef SOSBSKBCopyRecoveryKey(SOSBackupSliceKeyBagRef bskb);
105  bool SOSBSKBHasRecoveryKey(SOSBackupSliceKeyBagRef bskb);
106  bool SOSBSKBHasThisRecoveryKey(SOSBackupSliceKeyBagRef bskb, CFDataRef backupKey);
107  
108  #endif /* defined(_sec_SOSBackupSliceKeyBag_) */