2012-04-06 58 views
1

我在我的應用程序中使用此代碼http://wiki.effectiveprogramming.com/index.php?title=CocoaEncryption&redirect=no來實現登錄功能。但我有一個錯誤的方法saveRSAPublicKey:Objective 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] - >成功。

調試時很難發現這個問題,因爲它只出現在新設備中(從未安裝過我的應用程序)。最後,我發現錯誤的方式:在調用saveRSAPublicKey之前設置新的appTag。我看到在SYSTEM.LOG:

4月6日12時30分29秒的MAC-的MacBook-Pro的securityd [4372]:無法訪問hwaes關鍵

請幫幫我! 謝謝大家。

回答

0

我猜測publicKey或更可能的appTag不包含你認爲他們做的事。嘗試將它們註銷。

+0

應該是一個評論恕我直言。 – CodaFi 2012-04-06 04:08:07

+0

我花了太多的時間來調試,我確信:publicKey是正確的。我有一個「appTag」變量是const字符串。如果我想恢復錯誤,我更改「appTag」變量的值。 – 2012-04-06 04:19:23

+0

系統日誌: Apr 6 11:35:58 MACs-MacBook-Pro安全[4301]:無法訪問hwaes密鑰 Apr 6 11:36:12 MACs-MacBook-Pro [0x0-0x13013] .com.google。鉻[176]:[176:-1272877056:12564130414539:錯誤:spdy_session.cc(1386)] Spdy流關閉:6 – 2012-04-06 04:40:38

1

如果傳遞NULL的第二ARG(其中你的結果會出來),那麼你就不會允許呼叫SecItemAdd()時,有一個Return Type Key集(改變kCFBooleanTrue, kSecReturnPersistentRefkCFBooleanFalse, kSecReturnPersistentRef或刪除它)。

我剛纔提交了一個錯誤報告。

相關問題