What's the best/correct/current way of checking if a SecKey (or any keychain item) is allowed to be accessed (decrypted) by the current process? This would apply to signing or decrypting for a private key, or the data/contents of a password item (or key).
Given the number of APIs deprecated, and that some of the listed interaction mechanisms don't seem to work (FB11153260), I was wondering if there was some SecItemCopyMatching
magic, or something related to LAContext
.
In this use-case the SecKey is provided to this code, or it may fall back to enumeration by hostname (common name), so a persistent reference doesn't apply (though I realize that's a best practice). It looks like kSecUseAuthenticationUI
doesn't work, and neither does kSecUseAuthenticationContext
with interactionNotAllowed
set to false
. The deprecated SecKeychainSetUserInteractionAllowed
still works though.
In the past it was possible to enumerate the ACLs of an item using SecKeychainItemCopyAccess
, but there doesn't seem to be an alternative. I was hoping it was possible to use kSecUseItemList
with one of the kSecUseAuthentication*
options in SecItemCopyMatching
to return an error or an empty list, but that doesn't seem to work. Same with kSecMatchItemList
. LAContext
itself has a way to evaluate operations, but not with reference to a particular item.
Either examination of the item (e.g. ACLs), evaluation of a policy (can sign?), or failure from something like SecItemCopyMatching
would be fine, but it must work with interaction suppressed.