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);
        }
예제 #2
0
 private void SetResultSafe(SecureFingerprintAuthenticationResult result)
 {
     if (!(_taskCompletionSource.Task.IsCanceled || _taskCompletionSource.Task.IsCompleted || _taskCompletionSource.Task.IsFaulted))
     {
         _taskCompletionSource.SetResult(result);
     }
 }
예제 #3
0
        // 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();
        }
예제 #5
0
        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);
        }