Apple, iOS 13, CryptoKit, Secure Enclave - использование биометрической аутентификации перед использованием закрытого ключа - PullRequest
3 голосов
/ 25 сентября 2019

Я работаю с новой библиотекой криптокитов 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» ошибка.

Вопрос : Может кто-нибудь указать мне какую-то документацию или учебник, как достичьчто я ищу или объясните мне, чего мне не хватает?

Спасибо!

...