/ OSX / sec / Security / SecBackupKeybagEntry.m
SecBackupKeybagEntry.m
  1  /*
  2   * Copyright (c) 2016 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  #include <AssertMacros.h>
 25  
 26  #import <Foundation/Foundation.h>
 27  
 28  #include <utilities/SecDb.h>
 29  #include "keychain/securityd/SecDbItem.h"
 30  #include "keychain/securityd/SecItemSchema.h"
 31  
 32  #if OCTAGON
 33  
 34  #import "SecBackupKeybagEntry.h"
 35  
 36  // from CKKSZoneStateEntry.m
 37  
 38  @implementation SecBackupKeybagEntry
 39  
 40  - (instancetype) initWithPublicKey: (NSData*)publicKey publickeyHash: (NSData*) publickeyHash user: (NSData*) user {
 41      if (self = [super init]) {
 42          _publickey = publicKey;
 43          _publickeyHash = publickeyHash;
 44          _musr = user;
 45      }
 46      return self;
 47  }
 48  
 49  - (BOOL)isEqual: (id) object {
 50      if(![object isKindOfClass:[SecBackupKeybagEntry class]]) {
 51          return NO;
 52      }
 53  
 54      SecBackupKeybagEntry* obj = (SecBackupKeybagEntry*) object;
 55  
 56      return ([self.publickeyHash isEqual: obj.publickeyHash]) ? YES : NO;
 57  }
 58  
 59  + (instancetype) state: (NSData*) publickeyHash {
 60      NSError* error = nil;
 61      SecBackupKeybagEntry* ret = [SecBackupKeybagEntry tryFromDatabase:publickeyHash error:&error];
 62  
 63      if (error) {
 64          secerror("CKKS: error fetching SecBackupKeybagEntry(%@): %@", publickeyHash, error);
 65      }
 66  
 67      if(!ret) {
 68          ret = [[SecBackupKeybagEntry alloc] initWithPublicKey: nil publickeyHash: (NSData*) publickeyHash user: nil];
 69      }
 70      return ret;
 71  }
 72  
 73  #pragma mark - Database Operations
 74  
 75  + (instancetype) fromDatabase: (NSData*) publickeyHash error: (NSError * __autoreleasing *) error {
 76      return [self fromDatabaseWhere: @{@"publickeyHash": publickeyHash} error: error];
 77  }
 78  
 79  + (instancetype) tryFromDatabase: (NSData*) publickeyHash error: (NSError * __autoreleasing *) error {
 80      return [self tryFromDatabaseWhere: @{@"publickeyHash": publickeyHash} error: error];
 81  }
 82  
 83  #pragma mark - CKKSSQLDatabaseObject methods
 84  
 85  + (NSString*) sqlTable {
 86      return @"backup_keybag";
 87  }
 88  
 89  + (NSArray<NSString*>*) sqlColumns {
 90      return @[@"publickey", @"publickeyHash", @"musr"];
 91  }
 92  
 93  - (NSDictionary<NSString*,id>*) whereClauseToFindSelf {
 94      return @{@"publickeyHash": self.publickeyHash};
 95  }
 96  
 97  // used by saveToDatabaseWithConnection to write to db
 98  - (NSDictionary<NSString*,id>*) sqlValues {
 99      return @{
100          @"publickey":       [self.publickey base64EncodedStringWithOptions:0],
101          @"publickeyHash":   [self.publickeyHash base64EncodedStringWithOptions:0],
102          @"musr":            [self.musr base64EncodedStringWithOptions:0],
103      };
104  }
105  
106  + (instancetype)fromDatabaseRow:(NSDictionary<NSString*, CKKSSQLResult*>*)row {
107      NSData *publicKey = row[@"publickey"].asBase64DecodedData;
108      NSData *publickeyHash = row[@"publickeyHash"].asBase64DecodedData;
109      NSData *musr = row[@"musr"].asBase64DecodedData;
110      if (publicKey == NULL || publickeyHash == NULL || musr == NULL) {
111          return nil;
112      }
113  
114      return [[SecBackupKeybagEntry alloc] initWithPublicKey:publicKey publickeyHash:publickeyHash user:musr];
115  }
116  
117  @end
118  
119  #endif