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, })); } }