У меня есть два ключа, общедоступные и частные, которые хранятся в SecKeyRef-переменных. Для простоты, давайте начнем с публичного. Я хочу сделать это, экспортируя его в объект NSData. Для этого есть почти известный фрагмент кода обеспечивает от Apple, которая здесь:iOS SecKeyRef to NSData
- (NSData *)getPublicKeyBits {
OSStatus sanityCheck = noErr;
NSData * publicKeyBits = nil;
NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];
// Set the public key query dictionary.
[queryPublicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
[queryPublicKey setObject:publicTag forKey:(id)kSecAttrApplicationTag];
[queryPublicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
[queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData];
// Get the key bits.
sanityCheck = SecItemCopyMatching((CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyBits);
if (sanityCheck != noErr)
{
publicKeyBits = nil;
}
[queryPublicKey release];
return publicKeyBits;
}
У меня есть Xcode 4.6.2, однако, и код появляется ошибочным («__bridge» добавляются перед каждым переходом к идентификатору). Новая версия выглядит следующим образом:
- (NSData *)getPublicKeyBitsFromKey:(SecKeyRef)givenKey {
OSStatus sanityCheck = noErr;
NSData * publicKeyBits = nil;
NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];
// Set the public key query dictionary.
[queryPublicKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];
[queryPublicKey setObject:publicTag forKey:(__bridge id)kSecAttrApplicationTag];
[queryPublicKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
[queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnData];
// Get the key bits.
sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyBits);
if (sanityCheck != noErr)
{
publicKeyBits = nil;
}
return publicKeyBits;
}
Есть еще две ошибки, хотя:
- использование необъявленной идентификатора «publicTag»
- Cast косвенного указателя на указатель Objective-C для «CFTypeRef » (он же «сопзЬ пустота *») отвергается с ARC
Теперь, я надеюсь, что после вашей помощи, первый номер ш я больше не буду проблемой, потому что я не хочу строить запрос или еще что-то, чтобы извлечь ключ из брелка. У меня есть переменная, и я хочу извлечь ее оттуда. Имя переменной givenPublicKey
, и это ключ, который я хочу преобразовать в NSData.
Итак, как я буду заниматься этим и решить эту проблему с ARC?
Последующие действия: Как я могу экспортировать ключ в NSData, так как я читал несколько раз, что функция, с которой я пытаюсь работать, работает только для открытых ключей.
Не могли бы вы ссылаться на фрагмент кода на документы/сайт Apple? – MCKapur
Конечно, вот оно: http://developer.apple.com/library/ios/#samplecode/CryptoExercise/Listings/Classes_SecKeyWrapper_m.html#//apple_ref/doc/uid/DTS40008019-Classes_SecKeyWrapper_m-DontLinkElementID_17 – arik