使用swift 2.0生成钥匙串密钥

时间:2015-10-05 14:28:04

标签: swift

创建密钥对(私有,公共)

的函数
Cannot convert value of type 'inout Unmanged<SecKey>?' ... expected argument type 'UnsafeMutablePointer<SecKey?> ...'

加注

sound
当我查看the api for SecKeyGeneratePair时,这听起来publicKeyPtr, privateKeyPtr,所以我们可以更改public func generateKeyPair(publicKeyTag: String, privateKeyTag:String, keySize: Int) -> KeyPair ? { let privateKeyAttr: [String: AnyObject] = [ kSecAttrIsPermanent as String: kCFBooleanTrue, kSecAttrApplicationTag as String: privateKeyTag ] let publicKeyAttr: [String: AnyObject] = [ kSecAttrIsPermanent as String: kCFBooleanTrue, kSecAttrApplicationTag as String: publicKeyTag ] let parameters: [String: AnyObject] = [ kSecAttrKeyType as String: kSecAttrKeyTypeRSA, kSecAttrKeySizeInBits as String: keySize, kSecPrivateKeyAttrs as String: privateKeyAttr, kSecPublicKeyAttrs as String: publicKeyAttr ] var publicKeyPtr: UnsafeMutablePointer<SecKey?> = nil var privateKeyPtr: UnsafeMutablePointer<SecKey?> = nil let result = SecKeyGeneratePair(parameters, publicKeyPtr, privateKeyPtr) if( result != errSecSuccess ){ return nil } let publicKey = Unmanaged<SecKey>.fromOpaque(COpaquePointer(publicKeyPtr)).takeRetainedValue() let privateKey = Unmanaged<SecKey>.fromOpaque(COpaquePointer(privateKeyPtr)).takeRetainedValue() publicKeyPtr.destroy() privateKeyPtr.destroy() return KeyPair(publicKey: publicKey, privateKey: privateKey) } 的类型:

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_i386_INVOP, ...

但是当我使用该函数时,publicKey和privateKey会引发:

(

当我插入断点时,我意识到指针(`publicKeyPtr,privateKeyPtr)永远不会被设置。

那么如何将swift 1.2代码迁移到swift 2.0?

1 个答案:

答案 0 :(得分:2)

尝试:

public func generateKeyPair(publicKeyTag: String, privateKeyTag:String, keySize: Int) -> KeyPair?  {

    let privateKeyAttr: [NSString: AnyObject] = [
        kSecAttrIsPermanent: true,
        kSecAttrApplicationTag: privateKeyTag
    ]
    let publicKeyAttr: [NSString: AnyObject] = [
        kSecAttrIsPermanent: true,
        kSecAttrApplicationTag: publicKeyTag
    ]
    let parameters: [NSString: AnyObject] = [
        kSecAttrKeyType: kSecAttrKeyTypeRSA,
        kSecAttrKeySizeInBits: keySize,
        kSecPrivateKeyAttrs: privateKeyAttr,
        kSecPublicKeyAttrs: publicKeyAttr
    ]

    var publicKey: SecKey?
    var privateKey: SecKey?
    let result = SecKeyGeneratePair(parameters, &publicKey, &privateKey)

    if result != errSecSuccess {
        return nil
    }
    return KeyPair(publicKey: publicKey!, privateKey: privateKey!)
}

您可以将&表达式传递给UnsafeMutablePointer个参数。

另请参阅:swift 2.0 keychain type errors for SecItemCopyMatching