Получение статуса ошибки -34018 при хранении ключей в связке ключей с помощью Cryptokit
Я получаю сообщение об ошибке при сохранении ключей в Связке ключей в Mac OS с помощью Cryptokit. Я использую алгоритм p256 для создания пары ключей. Ошибка, которую я получаю, приведена ниже.
-34018
Playground execution terminated: An error was thrown and was not caught:
▿ Unable to store item:
- message : "Unable to store item:"
Код Swift, который я использую, приведен ниже.
import Cocoa
import Foundation
import CryptoKit
import Security
/// An error we can throw when something goes wrong.
struct KeyStoreError: Error, CustomStringConvertible {
var message: String
init(_ message: String) {
self.message = message
}
public var description: String {
return message
}
}
/*
extension OSStatus {
/// A human readable message for the status.
var message: String {
return (SecCopyErrorMessageString(self, nil) as String?) ?? String(self)
}
}
*/
/// The interface needed for SecKey conversion.
protocol SecKeyConvertible: CustomStringConvertible {
/// Creates a key from an X9.63 representation.
init<Bytes>(x963Representation: Bytes) throws where Bytes: ContiguousBytes
/// An X9.63 representation of the key.
var x963Representation: Data { get }
}
extension SecKeyConvertible {
/// A string version of the key for visual inspection.
/// IMPORTANT: Never log the actual key data.
public var description: String {
return self.x963Representation.withUnsafeBytes { bytes in
return "Key representation contains \(bytes.count) bytes."
}
}
}
// Assert that the NIST keys are convertible.
extension P256.Signing.PrivateKey: SecKeyConvertible {}
extension P256.KeyAgreement.PrivateKey: SecKeyConvertible {}
let keyValue = P256.Signing.PrivateKey();
func storeKey<T: SecKeyConvertible>(_ key: T, label: String) throws {
// Describe the key.
let attributes = [kSecAttrKeyType: kSecAttrKeyTypeECSECPrimeRandom,
kSecAttrKeyClass: kSecAttrKeyClassPrivate] as [String: Any]
// Get a SecKey representation.
guard let secKey = SecKeyCreateWithData(key.x963Representation as CFData,
attributes as CFDictionary,
nil)
else {
throw KeyStoreError("Unable to create SecKey representation.")
}
// Describe the add operation.
let query = [kSecClass: kSecClassKey,
kSecAttrApplicationLabel: label,
kSecAttrAccessible: kSecAttrAccessibleWhenUnlocked,
kSecUseDataProtectionKeychain: true,
kSecValueRef: secKey] as [String: Any]
// Add the key to the keychain.
let status = SecItemAdd(query as CFDictionary, nil)
guard status == errSecSuccess else {
throw KeyStoreError("Unable to store item:")
}
}
storeKey(keyValue, label:"test.sample.com")
Я создал это с помощью Xcode в Mac OS 10.15(бета). Моя версия Xcode - 11.
Заранее спасибо за помощь
1 ответ
Я пытался протестировать разрабатываемый мной криптографический фреймворк... и получал эту ошибку всякий раз, когда пытался сохранить ключ. Я создал тестовое приложение, которое включало фреймворк, добавляло тесты из фреймворка в тесты приложения, и все равно проблема...
Я добавил в приложение разрешение на совместное использование связки ключей, и эта проблема исчезла. Я не добавлял никаких групп, просто добавил возможность.