Получение статуса ошибки -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 ответ

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

Я добавил в приложение разрешение на совместное использование связки ключей, и эта проблема исчезла. Я не добавлял никаких групп, просто добавил возможность.

Другие вопросы по тегам