2012-04-06 1 views
1

Я использую этот код http://wiki.effectiveprogramming.com/index.php?title=CocoaEncryption&redirect=no в своем приложении для реализации функции входа. Но у меня есть метод ошибки saveRSAPublicKey:Объектив C - SecItemAdd имеет ошибку: EXC_BAD_ACCESS (первый раз) и errSecDuplicateItem (второй раз)

+ (BOOL)saveRSAPublicKey:(NSData*)publicKey appTag:(NSString*)appTag overwrite:(BOOL)overwrite { 
    //Error here (when first call) - Program received signal: "EXC_BAD_ACCESS" -> crash 
    OSStatus status = SecItemAdd((CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys: 
                (id)kSecClassKey, kSecClass, 
                (id)kSecAttrKeyTypeRSA, kSecAttrKeyType, 
                (id)kSecAttrKeyClassPublic, kSecAttrKeyClass, 
                kCFBooleanTrue, kSecAttrIsPermanent, 
                [appTag dataUsingEncoding:NSUTF8StringEncoding], kSecAttrApplicationTag, 
                publicKey, kSecValueData, 
                kCFBooleanTrue, kSecReturnPersistentRef, 
                nil], 
                NULL); //don't need public key ref 

    DebugLog(@"result = %@", [KeychainUtil fetchStatus:status]); 

    if(status == noErr) 
     return YES; 
    else if(status == errSecDuplicateItem && overwrite == YES) 
     return [CryptoUtil updateRSAPublicKey:publicKey appTag:appTag]; 

    return NO; 
} 

Когда я звоню saveRSAPublickey в первый раз, я не могу создать OSStatus и мое приложение разбился. Когда я звоню saveRSAPublickey для второго раза: статус == errSecDuplicateItem и запустите [CryptoUtil updateRSAPublicKey:publicKey appTag:appTag] -> успех.

Сложно найти эту проблему при отладке, поскольку она просто появляется только на новом устройстве (никогда не было установлено мое приложение). Наконец, я обнаружил ошибку, кстати: установите новый appTag перед вызовом saveRSAPublicKey. Я вижу в system.log:

6 апреля 12:30:29 МКВ-MacBook-Pro securityd [4372]: не удалось открыть hwaes ключ

Пожалуйста, помогите мне !!! Спасибо всем.

ответ

0

Я бы предположил, что publicKey или, скорее всего, appTag не содержат того, что, по вашему мнению, они делают. Попробуйте вывести их из системы.

+0

Должен быть комментарий ИМХО. – CodaFi

+0

Я взял слишком много для отладки, и я уверен: publicKey верен. У меня есть переменная «appTag» - строка const. Если я хочу восстановить ошибку, я изменяю значение переменной «appTag». –

+0

Системный журнал: 6 апр 11:35:58 MACs-MacBook-Pro securityd [4301]: не удалось получить доступ к ключу hwaes апр. 6 11:36:12 MACs-MacBook-Pro [0x0-0x13013] .com.google. Chrome [176]: [176: -1272877056: 12564130414539: ОШИБКА: spdy_session.cc (1386)] Spdy stream closed: 6 –

1

Если вы передаете NULL за 2 Arg (где ваш результат выйдет), то вы не разрешается иметь Return Type Key набор при вызове SecItemAdd() (изменить kCFBooleanTrue, kSecReturnPersistentRef к kCFBooleanFalse, kSecReturnPersistentRef или просто удалить его).

Я представил отчет об ошибке только сейчас.

Смежные вопросы