【发布时间】:2015-10-05 14:28:04
【问题描述】:
创建密钥对(私有、公共)的函数
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 keyPairAttr: [String: AnyObject] = [
kSecAttrKeyType as! String: kSecAttrKeyTypeRSA,
kSecAttrKeySizeInBits as! String: keySize,
kSecPrivateKeyAttrs as! String: privateKeyAttr,
kSecPublicKeyAttrs as! String: publicKeyAttr
];
var publicKeyPtr, privateKeyPtr: Unmanaged<SecKey>?;
let error = SecKeyGeneratePair(keyPairAttr, &publicKeyPtr, &privateKeyPtr)
if( result != errSecSuccess ){
return nil
}
let publicKey = publicKeyPtr!.takeRetainedValue()
let privateKey = privateKeyPtr!.takeRetainedValue()
return KeyPair(publicKey: publicKey, privateKey: privateKey)
}
加注
Cannot convert value of type 'inout Unmanged<SecKey>?' ... expected argument type 'UnsafeMutablePointer<SecKey?> ...'
当我查找 the api for SecKeyGeneratePair 时,这听起来是 sound,所以让我们更改 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)
}
但是当我使用该函数时,publicKey 和 privateKey 会引发:
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_i386_INVOP, ...
当我插入断点时,我意识到指针(`publicKeyPtr,privateKeyPtr)从未设置。
那么如何将 swift 1.2 代码迁移到 swift 2.0 呢?
【问题讨论】:
标签: swift