使用 SecItemUpdate returns -50 更新钥匙串 kSecAttrAccessible
Update Keychain kSecAttrAccessible with SecItemUpdate returns -50
我正在尝试根据 mbinna 个问题更新我的钥匙串项目的 kSecAttrAccessible。
问题是下面的代码returns-50为updateItemStatus
变量。我查看了 ,然后从查询中删除了 kSecReturnRef
属性 (newQuery
),但它仍然无法正常工作并返回 -50,这意味着 "One or more parameters passed to a function were not valid."
我做错了什么?
NSString *privateKeyAttrTag = @"mykeytag";
NSDictionary *getQuery = [NSDictionary dictionaryWithObjectsAndKeys:
kSecClassKey, kSecClass,
privateKeyAttrTag, kSecAttrApplicationTag,
kSecAttrKeyTypeRSA, kSecAttrKeyType,
@YES, kSecReturnRef,
kSecAttrAccessibleWhenUnlocked, kSecAttrAccessible, nil];
CFTypeRef dataTypeRef = NULL;
OSStatus status = SecItemCopyMatching(
(__bridge CFDictionaryRef)getQuery, &dataTypeRef);
if (status==errSecSuccess && dataTypeRef != NULL) {
NSData *data = (__bridge NSData *)dataTypeRef;
NSDictionary *newQuery = [NSDictionary dictionaryWithObjectsAndKeys:
kSecClassKey, kSecClass,
privateKeyAttrTag, kSecAttrApplicationTag,
kSecAttrKeyTypeRSA, kSecAttrKeyType,
kSecAttrAccessibleWhenUnlocked, kSecAttrAccessible, nil];
NSDictionary *updateAttrs = [NSDictionary dictionaryWithObjectsAndKeys:
kSecAttrAccessibleAfterFirstUnlock, kSecAttrAccessible,
(CFDataRef)data, kSecValueData, nil];
OSStatus updateItemStatus = SecItemUpdate(
(__bridge CFDictionaryRef)newQuery, (__bridge CFDictionaryRef)updateAttrs);
// updateItemStatus == -50, which means "One or more parameters passed to a function were not valid."
}
问题是因为 dataTypeRef
不是 NSData
本身,而是包含数据的 Dictionary
。
完整代码:
NSString *keyTag = @"mykeytag";
NSDictionary *getQuery = @{
(NSString *)kSecClass: (NSString *)kSecClassKey,
(NSString *)kSecAttrApplicationTag: keyTag,
(NSString *)kSecAttrKeyType: (NSString *)kSecAttrKeyTypeRSA,
(NSString *)kSecReturnRef: @YES,
(NSString *)kSecAttrAccessible: (NSString *)kSecAttrAccessibleWhenUnlocked,
(NSString *)kSecReturnData: @YES
};
CFDictionaryRef item = NULL;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)getQuery, (CFTypeRef *)&item);
if (status == errSecSuccess && item != NULL) {
NSDictionary *itemDictionary = (__bridge_transfer NSDictionary *)item;
NSMutableDictionary *updateItem = [NSMutableDictionary dictionaryWithDictionary:itemDictionary];
[updateItem setObject:[getQuery objectForKey:(id)kSecClass] forKey:(id)kSecClass];
NSData *data = itemDictionary[(id)kSecValueData];
NSDictionary *attributesToUpdate = [NSDictionary dictionaryWithObjectsAndKeys:
(NSString *)kSecAttrAccessibleAfterFirstUnlock,
kSecAttrAccessible,
(CFDataRef)data,
kSecValueData,
nil];
OSStatus updateItemStatus = SecItemUpdate((__bridge CFDictionaryRef)updateItem,
(__bridge CFDictionaryRef)attributesToUpdate);
}
我正在尝试根据 mbinna 个问题更新我的钥匙串项目的 kSecAttrAccessible。
问题是下面的代码returns-50为updateItemStatus
变量。我查看了 kSecReturnRef
属性 (newQuery
),但它仍然无法正常工作并返回 -50,这意味着 "One or more parameters passed to a function were not valid."
我做错了什么?
NSString *privateKeyAttrTag = @"mykeytag";
NSDictionary *getQuery = [NSDictionary dictionaryWithObjectsAndKeys:
kSecClassKey, kSecClass,
privateKeyAttrTag, kSecAttrApplicationTag,
kSecAttrKeyTypeRSA, kSecAttrKeyType,
@YES, kSecReturnRef,
kSecAttrAccessibleWhenUnlocked, kSecAttrAccessible, nil];
CFTypeRef dataTypeRef = NULL;
OSStatus status = SecItemCopyMatching(
(__bridge CFDictionaryRef)getQuery, &dataTypeRef);
if (status==errSecSuccess && dataTypeRef != NULL) {
NSData *data = (__bridge NSData *)dataTypeRef;
NSDictionary *newQuery = [NSDictionary dictionaryWithObjectsAndKeys:
kSecClassKey, kSecClass,
privateKeyAttrTag, kSecAttrApplicationTag,
kSecAttrKeyTypeRSA, kSecAttrKeyType,
kSecAttrAccessibleWhenUnlocked, kSecAttrAccessible, nil];
NSDictionary *updateAttrs = [NSDictionary dictionaryWithObjectsAndKeys:
kSecAttrAccessibleAfterFirstUnlock, kSecAttrAccessible,
(CFDataRef)data, kSecValueData, nil];
OSStatus updateItemStatus = SecItemUpdate(
(__bridge CFDictionaryRef)newQuery, (__bridge CFDictionaryRef)updateAttrs);
// updateItemStatus == -50, which means "One or more parameters passed to a function were not valid."
}
问题是因为 dataTypeRef
不是 NSData
本身,而是包含数据的 Dictionary
。
完整代码:
NSString *keyTag = @"mykeytag";
NSDictionary *getQuery = @{
(NSString *)kSecClass: (NSString *)kSecClassKey,
(NSString *)kSecAttrApplicationTag: keyTag,
(NSString *)kSecAttrKeyType: (NSString *)kSecAttrKeyTypeRSA,
(NSString *)kSecReturnRef: @YES,
(NSString *)kSecAttrAccessible: (NSString *)kSecAttrAccessibleWhenUnlocked,
(NSString *)kSecReturnData: @YES
};
CFDictionaryRef item = NULL;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)getQuery, (CFTypeRef *)&item);
if (status == errSecSuccess && item != NULL) {
NSDictionary *itemDictionary = (__bridge_transfer NSDictionary *)item;
NSMutableDictionary *updateItem = [NSMutableDictionary dictionaryWithDictionary:itemDictionary];
[updateItem setObject:[getQuery objectForKey:(id)kSecClass] forKey:(id)kSecClass];
NSData *data = itemDictionary[(id)kSecValueData];
NSDictionary *attributesToUpdate = [NSDictionary dictionaryWithObjectsAndKeys:
(NSString *)kSecAttrAccessibleAfterFirstUnlock,
kSecAttrAccessible,
(CFDataRef)data,
kSecValueData,
nil];
OSStatus updateItemStatus = SecItemUpdate((__bridge CFDictionaryRef)updateItem,
(__bridge CFDictionaryRef)attributesToUpdate);
}