Невозможно сохранить kSecClassKey для открытого ключа в связке ключей Mac OS - PullRequest
0 голосов
/ 25 декабря 2018

Я работаю над проектом статической библиотеки для MacOS, который мы конвертируем из iOS.Я абсолютно новичок в MacOS.Тем не менее, я искал проблему и нашел похожие сообщения, но моя проблема не была решена, и поэтому этот пост здесь.

Я использовал в качестве ссылки https://developer.apple.com/videos/play/wwdc2013/709/ это видео.Сначала я хочу проверить, существует ли ключ в связке ключей MacOS, и удалить его, если он найден.Затем создайте новый, чтобы сохранить.Извините, я не могу быть абсолютно открытым для исходного кода, но я попытаюсь объяснить ситуацию.

Во-первых, этот кусок кода работает отлично (на основе видео выше):

NSData *data = [[NSData alloc] initWithBase64EncodedString:@"A_RANDOM_BASE_64_STRING" options:0];

if (!data) {
    NSLog(@"No Data! Break here!");
}

NSString *tag = @"MAC_TEST_TAG"; 
NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]];

NSMutableDictionary *publicKey = [[NSMutableDictionary alloc] init];
[publicKey setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
[publicKey setObject:(id)@"myService" forKey:(id)kSecAttrService];
[publicKey setObject:(id)@"myAccount" forKey:(id)kSecAttrAccount];
[publicKey setObject:(id)data forKey:(id)kSecValueData];
[publicKey setObject:(id)d_tag forKey:(id)kSecAttrApplicationTag];

// Saving the data 
OSStatus status = SecItemAdd((CFDictionaryRef)publicKey, NULL);
NSLog(@"%@", SecCopyErrorMessageString(status, nil));

// Deleting the data 
status = SecItemDelete((CFDictionaryRef)publicKey); 
NSLog(@"%@", SecCopyErrorMessageString(status, nil));

Но когда я пытаюсь сделать следующее, я получаю 2 ошибки:

NSData *data = [[NSData alloc] initWithBase64EncodedString:@"A_RANDOM_BASE_64_STRING" options:0];

if (!data) {
    NSLog(@"No Data! Break here!");
}

NSString *tag = @"MAC_TEST_TAG";
NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]];

NSMutableDictionary *publicKey = [[NSMutableDictionary alloc] init];
[publicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
[publicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
[publicKey setObject:(id)data forKey:(id)kSecValueData];
[publicKey setObject:(id)d_tag forKey:(id)kSecAttrApplicationTag];

// Deleting the data
OSStatus status = SecItemDelete((CFDictionaryRef)publicKey);
NSLog(@"%@", SecCopyErrorMessageString(status, nil));

// Saving the data
status = SecItemAdd((CFDictionaryRef)publicKey, NULL);
NSLog(@"%@", SecCopyErrorMessageString(status, nil));

Для первого NSLog, он говорит, (-25300) " Указанный элемент не может быть найден вцепочка для ключей."А для второй, он говорит, (-25299)" Указанный элемент уже существует в цепочке для ключей."

У меня сложилось впечатление, что

[publicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];

Это утверждение (особенно kSecClassKey ) каким-то образом конфликтует.И , вероятно, , только в первый раз операция сохранения прошла успешно.Однако в аналогичной реализации iOS это не показало никаких проблем.Поскольку мое требование заключается в том, чтобы хранить ключ типа RSA в связке ключей MacOS, я затрудняюсь с тем, что делать в данный момент.

Любая помощь, рекомендации, ссылки будут очень благодарны.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...