protected override Task <SecureValueResult> NativeRemoveSecureValue(SecureValueRequestConfiguration secureValueRequestConfig, CancellationToken cancellationToken)
        {
#if __MAC__
            return(Task.FromResult(new SecureValueResult
            {
                Status = FingerprintAuthenticationResultStatus.NotAvailable,
                ErrorMessage = "Not implemented for the current platform."
            }));
#else
            var key       = secureValueRequestConfig.Key.ToLower();
            var serviceId = secureValueRequestConfig.ServiceId.ToLower();

            var secureRecord = new SecRecord(SecKind.GenericPassword)
            {
                Service = serviceId,
                Label   = serviceId,
                Account = key,
            };

            var statusCode = SecKeyChain.Remove(secureRecord);

            if (statusCode == SecStatusCode.Success)
            {
                return(Task.FromResult(new SecureValueResult
                {
                    Status = FingerprintAuthenticationResultStatus.Succeeded,
                }));
            }

            return(Task.FromResult(new SecureValueResult
            {
                Status = FingerprintAuthenticationResultStatus.UnknownError,
            }));
#endif
        }
        protected override async Task <GetSecureValueResult> NativeGetSecureValue(SecureValueRequestConfiguration secureValueRequestConfig, CancellationToken cancellationToken)
        {
            var currentActivity     = CrossFingerprint.CurrentActivity;
            var _fingerprintManager = FingerprintManagerCompat.From(currentActivity);

            var taskCompletionSource = new TaskCompletionSource <AuthenticationCallbackResult>();

            byte[] iv;
            byte[] value;
            try
            {
                var prefs = Application.Context.GetSharedPreferences(prefsName, FileCreationMode.Private);
                iv    = Convert.FromBase64String(prefs.GetString($"{secureValueRequestConfig.Key}:iv", null));
                value = Convert.FromBase64String(prefs.GetString($"{secureValueRequestConfig.Key}:value", null));
            }
            catch (Exception ex)
            {
                return(new GetSecureValueResult
                {
                    Status = FingerprintAuthenticationResultStatus.UnknownError,
                    ErrorMessage = $"No values for {secureValueRequestConfig.Key}"
                });
            }

            try
            {
                _fingerprintManager.Authenticate(CryptoObjectHelper.Instance.BuildCryptoObject(CipherMode.DecryptMode, iv),
                                                 (int)FingerprintAuthenticationFlags.None,
                                                 new CancellationSignal(),
                                                 new AuthenticationCallback(value, taskCompletionSource),
                                                 null);

                var fragment = CrossFingerprint.CreateSecureValueDialogFragment();
                var result   = await fragment.ShowAsync(secureValueRequestConfig, taskCompletionSource, cancellationToken);

                if (result.Status == FingerprintAuthenticationResultStatus.Succeeded)
                {
                    return(new GetSecureValueResult
                    {
                        Status = result.Status,
                        Value = System.Text.Encoding.UTF8.GetString(result.Result),
                    });
                }

                return(new GetSecureValueResult
                {
                    Status = result.Status,
                    // Pass through error info?
                });
            }
            catch (Exception ex)
            {
                return(new GetSecureValueResult
                {
                    Status = FingerprintAuthenticationResultStatus.UnknownError,
                    ErrorMessage = ex.Message
                });
            }
        }
 protected override Task <GetSecureValueResult> NativeGetSecureValue(SecureValueRequestConfiguration secureValueRequestConfig, CancellationToken cancellationToken)
 {
     return(Task.FromResult(new GetSecureValueResult
     {
         Status = FingerprintAuthenticationResultStatus.NotAvailable,
         ErrorMessage = "Not implemented for the current platform."
     }));
 }
        protected override Task <GetSecureValueResult> NativeGetSecureValue(SecureValueRequestConfiguration secureValueRequestConfig, CancellationToken cancellationToken)
        {
#if __MAC__
            return(Task.FromResult(new GetSecureValueResult
            {
                Status = FingerprintAuthenticationResultStatus.NotAvailable,
                ErrorMessage = "Not implemented for the current platform."
            }));
#else
            var key       = secureValueRequestConfig.Key.ToLower();
            var serviceId = secureValueRequestConfig.ServiceId.ToLower();

            var secureRecord = new SecRecord(SecKind.GenericPassword)
            {
                Service            = serviceId,
                Label              = serviceId,
                Account            = key,
                UseOperationPrompt = secureValueRequestConfig.Reason
            };

            SecStatusCode statusCode;
            secureRecord = SecKeyChain.QueryAsRecord(secureRecord, out statusCode);

            if (statusCode == SecStatusCode.Success && secureRecord != null && secureRecord.Generic != null)
            {
                return(Task.FromResult(new GetSecureValueResult
                {
                    Status = FingerprintAuthenticationResultStatus.Succeeded,
                    Value = NSString.FromData(secureRecord.Generic, NSStringEncoding.UTF8)
                }));
            }

            if (statusCode == SecStatusCode.UserCanceled)
            {
                return(Task.FromResult(new GetSecureValueResult
                {
                    Status = FingerprintAuthenticationResultStatus.Cancelled,
                }));
            }

            return(Task.FromResult(new GetSecureValueResult
            {
                Status = FingerprintAuthenticationResultStatus.UnknownError,
                ErrorMessage = statusCode.ToString()
            }));
#endif
        }
        protected override Task <SecureValueResult> NativeRemoveSecureValue(SecureValueRequestConfiguration secureValueRequestConfig, CancellationToken cancellationToken)
        {
            try
            {
                var prefs = Application.Context.GetSharedPreferences(prefsName, FileCreationMode.Private);
                var edit  = prefs.Edit();
                edit.Remove($"{secureValueRequestConfig.Key}:iv");
                edit.Remove($"{secureValueRequestConfig.Key}:value");
                edit.Commit();

                return(Task.FromResult(new SecureValueResult
                {
                    Status = FingerprintAuthenticationResultStatus.Succeeded,
                }));
            }
            catch (Exception ex)
            {
                return(Task.FromResult(new SecureValueResult
                {
                    Status = FingerprintAuthenticationResultStatus.UnknownError,
                    ErrorMessage = ex.Message,
                }));
            }
        }