#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