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
|
#import "KeychainHelper.h"
NS_ASSUME_NONNULL_BEGIN
@implementation KeychainHelper
+ (NSString *)authenticationKey {
CFDictionaryRef query = (__bridge CFDictionaryRef)@{
(__bridge NSString *)kSecClass: (__bridge NSString *)kSecClassGenericPassword,
(__bridge NSString *)kSecAttrService: kKeychainService,
(__bridge NSString *)kSecAttrAccount: kAuthenticationKeyKeychainKey,
(__bridge NSString *)kSecReturnData: @YES,
(__bridge NSString *)kSecMatchLimit: (__bridge NSString *)kSecMatchLimitOne
};
CFTypeRef result = NULL;
OSStatus status = SecItemCopyMatching(query, &result);
if (status == errSecSuccess && result != NULL) {
NSData *keyData = (__bridge NSData *)result;
NSString *authenticationKey = [[[NSString alloc] initWithData:keyData
encoding:NSUTF8StringEncoding] autorelease];
CFRelease(result);
return authenticationKey;
}
return nil;
}
+ (OSStatus)setAuthenticationKey:(NSString *)authenticationKey {
NSData *passwordData = [authenticationKey dataUsingEncoding:NSUTF8StringEncoding];
// First try to update existing item
CFDictionaryRef query = (__bridge CFDictionaryRef)@{
(__bridge NSString *)kSecClass: (__bridge NSString *)kSecClassGenericPassword,
(__bridge NSString *)kSecAttrService: kKeychainService,
(__bridge NSString *)kSecAttrAccount: kAuthenticationKeyKeychainKey
};
CFDictionaryRef attributesToUpdate = (__bridge CFDictionaryRef)@{
(__bridge NSString *)kSecValueData: passwordData
};
OSStatus status = SecItemUpdate(query, attributesToUpdate);
if (status == errSecItemNotFound) {
// Item doesn't exist, create new one
CFDictionaryRef attributes = (__bridge CFDictionaryRef)@{
(__bridge NSString *)kSecClass: (__bridge NSString *)kSecClassGenericPassword,
(__bridge NSString *)kSecAttrService: kKeychainService,
(__bridge NSString *)kSecAttrAccount: kAuthenticationKeyKeychainKey,
(__bridge NSString *)kSecValueData: passwordData,
(__bridge NSString *)kSecAttrAccessible: (__bridge NSString *)kSecAttrAccessibleWhenUnlockedThisDeviceOnly
};
status = SecItemAdd(attributes, NULL);
}
return status;
}
+ (OSStatus)deleteAuthenticationKey {
CFDictionaryRef query = (__bridge CFDictionaryRef)@{
(__bridge NSString *)kSecClass: (__bridge NSString *)kSecClassGenericPassword,
(__bridge NSString *)kSecAttrService: kKeychainService,
(__bridge NSString *)kSecAttrAccount: kAuthenticationKeyKeychainKey
};
OSStatus status = SecItemDelete(query);
return status;
}
@end
NS_ASSUME_NONNULL_END
|