【问题标题】:Retrieve SecKey from Keychain从钥匙串中检索 SecKey
【发布时间】:2017-06-03 15:25:54
【问题描述】:

我正在尝试将我从 this answer 获得的用于生成 CSR 的代码从 Swift 2 升级到 Swift 3。

我已经升级了大部分代码,但是原始答案的 Utility 块中的以下代码失败并出现错误:

“init”不可用:使用“withMemoryRebound(to:capacity:_)”临时将内存视为另一种布局兼容类型。

错误发生在以下行:

let status: OSStatus = withUnsafeMutablePointer(to: &dataTypeRef) { SecItemCopyMatching(query as NSDictionary, UnsafeMutablePointer($0)) }
func loadKeySecKeyFromKeyChain(key: String) -> SecKey{
    let query: Dictionary<String, AnyObject> = [
        String(kSecAttrKeyType): kSecAttrKeyTypeRSA,
        String(kSecAttrKeySizeInBits): KEY_SIZE as AnyObject,
        String(kSecClass): kSecClassKey,
        String(kSecAttrApplicationTag): key as AnyObject,
        kSecReturnRef as String : kCFBooleanTrue ]

    var dataTypeRef: Unmanaged<AnyObject>? = nil
    var resultData: SecKey? = nil

    let status: OSStatus = withUnsafeMutablePointer(to: &dataTypeRef) { SecItemCopyMatching(query as NSDictionary, UnsafeMutablePointer($0)) }
    NSLog("SecItemCopyMatching: " + status.description)

    if status == errSecSuccess {
        NSLog("private or public debug description is: " + dataTypeRef.debugDescription)
        resultData = (dataTypeRef!.takeRetainedValue() as! SecKey)
        NSLog("SecItemCopyMatching returns SecKey: " + resultData.debugDescription)
        return resultData!
    } else {
        return resultData!
    }
}

我在这个问题上卡了一整天,有什么建议可以解决这个错误吗?

【问题讨论】:

  • @pedrofb 你能帮忙解答这个问题吗?
  • This 帮助我更好地理解了 Swift3 中的指针用法。
  • 是的。其实我已经看过这个帖子了。很棒,但我仍然无法弄清楚这里发生了什么
  • 好吧。该答案将 PrivateKey 作为数据检索。我尝试将其转换为 SecKey,但在生成 CSR 时失败。

标签: ios swift swift3 csr


【解决方案1】:

只需使用SecItemCopyMatching。我能够将其转换为 Swift 3 并成功生成 CSR。

// Finds the SecKeyRef corresponding to the parameter key and returns it
func loadKeySecKeyFromKeyChain(key: String) -> SecKey {
    let query: Dictionary<String, AnyObject> = [
        String(kSecAttrKeyType): kSecAttrKeyTypeRSA,
        String(kSecAttrKeySizeInBits): KEY_SIZE as AnyObject,
        String(kSecClass): kSecClassKey,
        String(kSecAttrApplicationTag): key as AnyObject,
        kSecReturnRef as String : kCFBooleanTrue ]

    var dataTypeRef: Unmanaged<AnyObject>? = nil
    var resultData: SecKey? = nil
    var result: AnyObject?
    let status = SecItemCopyMatching(query as CFDictionary, &result)

    if status == errSecSuccess {
        resultData = result as! SecKey
        return resultData!
    } else {
        return resultData!
    }
}

【讨论】:

  • 你确定这不会泄漏内存吗?每次调用它时,我都会看到内存使用量上升。
猜你喜欢
  • 1970-01-01
  • 2018-09-05
  • 2015-09-24
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多