从Keychain中检索SecKey

时间:2017-01-19 03:23:54

标签: ios swift swift3 csr

我正在尝试升级从this answer生成CSR的代码,从Swift 2升级到Swift 3.

我已将大部分代码升级,但原始答案的Utility块中的以下代码因错误而失败:

  

'初始化'不可用:使用' 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!
    }
}

我一直坚持这一天,有什么建议可以解决这个错误吗?

1 个答案:

答案 0 :(得分:2)

只需使用// 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! } } 即可。我能够将其转换为Swift 3并成功生成CSR。

public class RM {
    private HashMap<String, String> attributes = new HashMap<>();

    public void setAttribute(String attr, String val) {
        attributes.put(attr, val);
    }

    public String getAttribute(String attr) {
        attributes.get(attr);
    }
}