Я работаю с новой библиотекой криптокитов Apple и пытаюсь настроить базовый сценарий использования.
Цель : я хочу создать закрытый ключ в защищенном анклаве черезкриптокит, сохраните ссылку ключа в цепочке ключей устройства iOS и убедитесь, что ключ может быть повторно инициализирован в безопасном анклаве только после того, как пользователь аутентифицировал себя с помощью некоторого метода биометрической аутентификации.
Текущее состояние : Пока я могу инициализировать закрытый ключ в защищенном анклаве с помощью следующего кода:
var privateKeyReference = try CryptoKit.SecureEnclave.P256.KeyAgreement.PrivateKey.init();
Кроме того, я могу хранить и получать ссылку на соответствующий закрытый ключ из цепочки ключей.После получения ссылки я могу повторно инициализировать закрытый ключ в защищенном анклаве с помощью следующего кода:
var privateKeyReference = getPrivateKeyReferenceFromKeyChain();
var privateKey = try CryptoKit.SecureEnclave.P256.KeyAgreement.PrivateKey.init(
dataRepresentation: privateKeyReference
);
Пока все работает, как ожидается, и все криптографические операции с закрытым ключом завершаются успешно.
Теперь, насколько я понимаю, запасная документация от Apple , я должен иметь возможность изменить первую инициализацию закрытого ключа следующим образом:
let authContext = LAContext();
let accessCtrl = SecAccessControlCreateWithFlags(
kCFAllocatorDefault,
kSecAttrAccesibleWhenUnlockedThisDeviceOnly,
[.privateKeyUsage, .userPresence, .biometryCurrentSet],
nil
);
var privateKeyReference = try CryptoKit.SecureEnclave.P256.KeyAgreement.PrivateKey.init(
accessControl: accessCtrl!,
authenticationContext: authContext
);
Таким образом, гарантируячто закрытый ключ может быть повторно инициализирован, только когда пользователь аутентифицирует себя с помощью какого-либо биометрического метода аутентификации.Начальная инициализация стиля работает без каких-либо ошибок.
Проблема : Однако, добавив предыдущий код, я не получаю никаких запросов биометрической аутентификации и не могу использовать закрытый ключ вообще после повторной инициализации.Следующая ошибка регистрируется всякий раз, когда я пытаюсь выполнить какую-то криптографическую операцию с повторно инициализированным ключом, например, с некоторым подписанием:
Error Domain=CryptoTokenKit Code=-9 "setoken: unable to sign digest" UserInfo={NSLocalizedDescription=setoken: unable to sign digest})
Насколько я мог догадаться из здесь , я думаючто Code=-9
относится к «authenticationNeeded» ошибка.
Вопрос : Может кто-нибудь указать мне какую-то документацию или учебник, как достичьчто я ищу или объясните мне, чего мне не хватает?
Спасибо!