Когда вы создаете криптографический ключ, вы можете установить для параметра kSecAttrIsPermanent значение true, которое автоматически сохранит ключ в цепочке для ключей по умолчанию. Это немного очистит ваш код, так что вам больше не придется иметь дело с SecItemAdd () и всей обработкой ошибок с этим. Вот простой способ сделать то, что вы пытаетесь сделать.
Чтобы создать ключ и запросить ключ
let tag = "com.example.keys.mykey".data(using: .utf8)!
let attributes: [String: Any] =
[kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
kSecAttrKeySizeInBits as String: 2048,
kSecPrivateKeyAttrs as String:
[kSecAttrIsPermanent as String: true,
kSecAttrApplicationTag as String: tag]
]
let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, nil)
let query: [String: Any] = [kSecClass as String: kSecClassKey,
kSecAttrApplicationTag as String: tag,
kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
kSecReturnRef as String: true]
var item: CFTypeRef?
let status2 = SecItemCopyMatching(query as CFDictionary, &item)
guard status2 == errSecSuccess else { print("error1"); return }
let key = item as! SecKey
Запуск этого кода, я полагаю, сделает то, что вы пытаетесь сделать, в коде, который вы указали в вопросе. Я попытался запустить код, который вы дали, и версия Xcode и swift, которые я использую, дают ошибки компилятора.
Если вы запустите код в этом ответе, вы заметите, что на консоль не выводятся ошибки, указывающие на то, что ключ был успешно найден в цепочке для ключей по умолчанию.