Ссылки на связки ключей в Swift, используемые в NEVPNManager

Я пытаюсь подключиться к VPN с помощью Swift в Xcode. Я использую KeychainSwift для хранения ссылок на связки ключей. Мой код выглядит следующим образом:

    private func connectVPN(completion: @escaping () -> Void) { 
        let keychain = KeychainSwift()
        keychain.set("<mypassword>", forKey: "passref")
        keychain.set("<sharedsecretpassword>", forKey: "secretref")

        NEVPNManager.shared().loadFromPreferences { error in
            let vpnhost = "<11.11.11.11>"
            let username = "<myusername>"

            let p = NEVPNProtocolIPSec()
            p.username = username
            p.localIdentifier = username
            p.serverAddress = vpnhost
            p.remoteIdentifier = vpnhost
            p.authenticationMethod = .sharedSecret
            p.disconnectOnSleep = false

            p.sharedSecretReference = keychain.getData("secretref")
            p.passwordReference = keychain.getData("passref")

            var rules = [NEOnDemandRule]()
            let rule = NEOnDemandRuleConnect()
            rule.interfaceTypeMatch = .any
            rules.append(rule)

            NEVPNManager.shared().localizedDescription = "My VPN"
            NEVPNManager.shared().protocolConfiguration = p
            NEVPNManager.shared().onDemandRules = rules
            NEVPNManager.shared().isOnDemandEnabled = true
            NEVPNManager.shared().isEnabled = true
            NEVPNManager.shared().saveToPreferences { error in
                if (error != nil) {
                    print(error!)
                } else {
                    do {
                        try NEVPNManager.shared().connection.startVPNTunnel()
                        completion()
                    } catch {
                        print("can't connect VPN'")
                    }
                }
            }
        }
    }

Я использую keychain.getData("secretref"), потому что для этого поля требуется

Постоянная ссылка на цепочку ссылок на элемент keychain, содержащий IKE общий секрет.

Что еще,

Постоянная ссылка на цепочку ключей должна ссылаться на элемент связки ключей class kSecClassGenericPassword.

Я не уверен, если я сделаю это правильно. Я не подклассифицировал kSecClassGenericPassword или использовал его каким-либо образом.

Когда я использую эту функцию в коде, окно показывает с информацией, что для этого VPN нет общего секрета. Я думаю, это означает, что этот брелок не работает так, как он предполагал.

В настройках iPhone он пытается подключиться, переключается на зеленый и сразу же переключается в состояние "выключено". Когда я помещаю те же данные, что и в коде вручную, соединение работает.

Что я делаю неправильно? Что я должен исправить?

Ответ 1

Хорошо, у меня есть ответ. В запросе для SecItemCopyMatching мне пришлось выбрать kSecReturnPersistentRef с kCFBooleanTrue - не kSecReturnData.