Skip to content
This repository
tree: 4430b9c381
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

executable file 103 lines (83 sloc) 3.65 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
//
// Copyright 2011-2012 Kosher Penguin LLC
// Created by Adar Porat (https://github.com/aporat) on 1/16/2012.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#import "KKKeychain.h"
#import <Security/Security.h>

@implementation KKKeychain

+ (NSString*)appName
{
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSString *appName = [bundle objectForInfoDictionaryKey:@"CFBundleDisplayName"];
if (!appName) {
appName = [bundle objectForInfoDictionaryKey:@"CFBundleName"];
}
return appName;
}

+ (BOOL)setString:(NSString*)string forKey:(NSString*)key
{
if (string == nil || key == nil) {
return NO;
}

key = [NSString stringWithFormat:@"%@ - %@", [KKKeychain appName], key];
  
// First check if it already exists, by creating a search dictionary and requesting that
// nothing be returned, and performing the search anyway.
NSMutableDictionary *existsQueryDictionary = [NSMutableDictionary dictionary];

NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];

[existsQueryDictionary setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];

// Add the keys to the search dict
[existsQueryDictionary setObject:@"service" forKey:(id)kSecAttrService];
[existsQueryDictionary setObject:key forKey:(id)kSecAttrAccount];
  
OSStatus res = SecItemCopyMatching((CFDictionaryRef)existsQueryDictionary, NULL);
if (res == errSecItemNotFound) {
if (string != nil) {
NSMutableDictionary *addDict = existsQueryDictionary;
[addDict setObject:data forKey:(id)kSecValueData];
      
res = SecItemAdd((CFDictionaryRef)addDict, NULL);
NSAssert1(res == errSecSuccess, @"Recieved %ld from SecItemAdd!", res);
}
} else if (res == errSecSuccess) {
// Modify an existing one
// Actually pull it now of the keychain at this point.
NSDictionary *attributeDict = [NSDictionary dictionaryWithObject:data forKey:(id)kSecValueData];
res = SecItemUpdate((CFDictionaryRef)existsQueryDictionary, (CFDictionaryRef)attributeDict);
NSAssert1(res == errSecSuccess, @"SecItemUpdated returned %ld!", res);
} else {
NSAssert1(NO, @"Received %ld from SecItemCopyMatching!", res);
}
return YES;
}

+ (NSString*)getStringForKey:(NSString*)key
{
key = [NSString stringWithFormat:@"%@ - %@", [KKKeychain appName], key];
NSMutableDictionary *existsQueryDictionary = [NSMutableDictionary dictionary];
[existsQueryDictionary setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];

// Add the keys to the search dict
[existsQueryDictionary setObject:@"service" forKey:(id)kSecAttrService];
[existsQueryDictionary setObject:key forKey:(id)kSecAttrAccount];

// We want the data back!
NSData *data = nil;

[existsQueryDictionary setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];

OSStatus res = SecItemCopyMatching((CFDictionaryRef)existsQueryDictionary, (CFTypeRef *)&data);
[data autorelease];
if (res == errSecSuccess) {
NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
return string;
} else {
NSAssert1(res == errSecItemNotFound, @"SecItemCopyMatching returned %ld!", res);
}

return nil;
}


@end
Something went wrong with that request. Please try again.