public override Task <SecureFingerprintAuthenticationResult> NativeSecureAuthenticateAsync(AuthenticationRequestConfiguration authRequestConfig, string key, CancellationToken cancellationToken) { TaskCompletionSource <SecureFingerprintAuthenticationResult> response = new TaskCompletionSource <SecureFingerprintAuthenticationResult>(); var securityRecord = new SecRecord(SecKind.GenericPassword) { Service = key }; DispatchQueue.MainQueue.DispatchAsync(() => { SecStatusCode status; NSData resultData = SecKeyChain.QueryAsData(securityRecord, false, out status); var result = resultData != null ? new NSString(resultData, NSStringEncoding.UTF8) : ""; var secResponse = new SecureFingerprintAuthenticationResult() { ErrorMessage = "", SecureData = new Dictionary <string, string> { { key, result } }, Status = MapStatus(status) }; if (status == SecStatusCode.VerifyFailed) { //Todo: check if this is the correct status code when a finger print has been added or removed throw new FingerprintStoreInvalidatedException(); } }); return(response.Task); }
private void SetResultSafe(SecureFingerprintAuthenticationResult result) { if (!(_taskCompletionSource.Task.IsCanceled || _taskCompletionSource.Task.IsCompleted || _taskCompletionSource.Task.IsFaulted)) { _taskCompletionSource.SetResult(result); } }
// https://developer.android.com/reference/android/hardware/fingerprint/FingerprintManager.AuthenticationCallback.html public override void OnAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult res) { base.OnAuthenticationSucceeded(res); //todo: read the key value from the android keystore var result = new SecureFingerprintAuthenticationResult { Status = FingerprintAuthenticationResultStatus.Succeeded }; SetResultSafe(result); }
private async void Dismiss(SecureFingerprintAuthenticationResult result, bool animation = true) { DetachEventHandlers(); if (animation) { HideHelpText(); await AnimateResultAsync(result.Status); } _secureResultTaskCompletionSource.TrySetResult(result); DismissAllowingStateLoss(); }
public override void OnAuthenticationError(int errMsgId, ICharSequence errString) { var errorCode = (FingerprintState)errMsgId; base.OnAuthenticationError(errMsgId, errString); var message = errString != null?errString.ToString() : string.Empty; var result = new SecureFingerprintAuthenticationResult { Status = FingerprintAuthenticationResultStatus.Failed, ErrorMessage = message }; if (errorCode == FingerprintState.ErrorLockout) { result.Status = FingerprintAuthenticationResultStatus.TooManyAttempts; } SetResultSafe(result); }