Получить SecKey из цепочки для ключей

Я пытаюсь обновить код, который я получил из этого ответа для создания CSR, с Swift 2 на Swift 3.

У меня обновлена ​​большая часть кода, но следующий код в служебном блоке исходного ответа завершился ошибкой:

'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!
    }
}

Я застрял на этом целый день, есть ли какие-либо предложения по устранению этой ошибки?


person Captain Rib    schedule 19.01.2017    source источник
comment
@pedrofb вы можете помочь с этим ответом?   -  person Captain Rib    schedule 19.01.2017
comment
Это помогло мне лучше понять использование указателей в Swift3.   -  person shallowThought    schedule 19.01.2017
comment
Да. Я на самом деле уже посмотрел на этот пост. Это здорово, но я все еще не мог понять, что здесь происходит   -  person Captain Rib    schedule 19.01.2017
comment
Взгляните на stackoverflow.com/questions/39441894/   -  person pedrofb    schedule 19.01.2017
comment
Что ж. Этот ответ извлек PrivateKey как данные. Я пытался преобразовать его в SecKey, но не удалось создать CSR.   -  person Captain Rib    schedule 19.01.2017


Ответы (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!
    }
}
person Mike Mikina    schedule 13.07.2017
comment
Вы уверены, что это не утечка памяти? Я вижу, что использование памяти увеличивается каждый раз, когда я вызываю это. - person Dylan Nicholson; 30.01.2019