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
|
#import "KeychainHelper.h"
NS_ASSUME_NONNULL_BEGIN
@implementation KeychainHelper
+ (NSString *)authenticationKey {
const char *service = [kKeychainService UTF8String];
const char *account = [kAuthenticationKeyKeychainKey UTF8String];
UInt32 authenticationKeyLength = 0;
void *authenticationKeyData = NULL;
OSStatus status = SecKeychainFindGenericPassword(
NULL, (UInt32)strlen(service), service, (UInt32)strlen(account), account,
&authenticationKeyLength, &authenticationKeyData, NULL);
if (status == errSecSuccess && authenticationKeyData != NULL) {
NSString *authenticationKey = [[NSString alloc] initWithBytes:authenticationKeyData
length:authenticationKeyLength
encoding:NSUTF8StringEncoding];
SecKeychainItemFreeContent(NULL, authenticationKeyData);
return authenticationKey;
}
return nil;
}
+ (OSStatus)setAuthenticationKey:(NSString *)authenticationKey {
const char *service = [kKeychainService UTF8String];
const char *account = [kAuthenticationKeyKeychainKey UTF8String];
const char *authenticationKeyCString = [authenticationKey UTF8String];
// First try to find existing item
SecKeychainItemRef item = NULL;
OSStatus findStatus = SecKeychainFindGenericPassword(
NULL, (UInt32)strlen(service), service, (UInt32)strlen(account), account,
NULL, NULL, &item);
OSStatus status;
if (findStatus == errSecSuccess) {
// Update existing item
status = SecKeychainItemModifyAttributesAndData(
item, NULL, (UInt32)strlen(authenticationKeyCString), authenticationKeyCString);
CFRelease(item);
} else {
// Create new item
status = SecKeychainAddGenericPassword(
NULL, (UInt32)strlen(service), service, (UInt32)strlen(account),
account, (UInt32)strlen(authenticationKeyCString), authenticationKeyCString, NULL);
}
return status;
}
+ (OSStatus) deleteAuthenticationKey {
const char *service = [kKeychainService UTF8String];
const char *account = [kAuthenticationKeyKeychainKey UTF8String];
SecKeychainItemRef item = NULL;
OSStatus findStatus = SecKeychainFindGenericPassword(
NULL, (UInt32)strlen(service), service, (UInt32)strlen(account), account,
NULL, NULL, &item);
if (findStatus == errSecSuccess) {
OSStatus deleteStatus = SecKeychainItemDelete(item);
CFRelease(item);
return deleteStatus;
}
return findStatus;
}
@end
NS_ASSUME_NONNULL_END
|