From b139eadf0b00aacb4e9b78c476a8832e5f60fbd1 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Thu, 8 Jun 2017 11:43:26 -0400 Subject: [PATCH] KeyStoreBackedStorageService email crash reports --- .../Services/KeyStoreBackedStorageService.cs | 68 ++++++++++++++++--- 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/src/Android/Services/KeyStoreBackedStorageService.cs b/src/Android/Services/KeyStoreBackedStorageService.cs index b0225da9b..0ffed7ecb 100644 --- a/src/Android/Services/KeyStoreBackedStorageService.cs +++ b/src/Android/Services/KeyStoreBackedStorageService.cs @@ -12,6 +12,7 @@ using Android.App; using Plugin.Settings.Abstractions; using Java.Util; using Javax.Crypto.Spec; +using Android.Content; namespace Bit.Android.Services { @@ -30,17 +31,59 @@ namespace Bit.Android.Services public KeyStoreBackedStorageService(ISettings settings) { - _oldAndroid = Build.VERSION.SdkInt < BuildVersionCodes.M; - _rsaMode = _oldAndroid ? "RSA/ECB/PKCS1Padding" : "RSA/ECB/OAEPWithSHA-1AndMGF1Padding"; + try + { + _oldAndroid = Build.VERSION.SdkInt < BuildVersionCodes.M; + _rsaMode = _oldAndroid ? "RSA/ECB/PKCS1Padding" : "RSA/ECB/OAEPWithSHA-1AndMGF1Padding"; - _oldKeyStorageService = new KeyStoreStorageService(new char[] { }); - _settings = settings; + _oldKeyStorageService = new KeyStoreStorageService(new char[] { }); + _settings = settings; - _keyStore = KeyStore.GetInstance(AndroidKeyStore); - _keyStore.Load(null); + _keyStore = KeyStore.GetInstance(AndroidKeyStore); + _keyStore.Load(null); - GenerateRsaKey(); - GenerateAesKey(); + GenerateRsaKey(); + GenerateAesKey(); + } + catch(Exception e) + { + SendEmail(e.Message + "\n\n" + e.StackTrace); + throw; + } + } + + private void SendEmail(string text, bool includeSecurityProviders = true) + { + var crashMessage = "bitwarden has crashed. Please send this email to our support team so that we can help " + + "resolve the problem for you. Thank you."; + + text = crashMessage + "\n\n =============================================== \n\n" + text; + + if(includeSecurityProviders) + { + text += "\n\n"; + var providers = Security.GetProviders(); + foreach(var provider in providers) + { + text += ("provider: " + provider.Name + "\n"); + var services = provider.Services; + foreach(var service in provider.Services) + { + text += ("- alg: " + service.Algorithm + "\n"); + } + } + } + + text += "\n\n ==================================================== \n\n" + crashMessage; + + var emailIntent = new Intent(Intent.ActionSend); + + emailIntent.SetType("plain/text"); + emailIntent.PutExtra(Intent.ExtraEmail, new String[] { "hello@bitwarden.com" }); + emailIntent.PutExtra(Intent.ExtraSubject, "bitwarden Crash Report"); + emailIntent.PutExtra(Intent.ExtraText, text); + + Application.Context.StartActivity(Intent.CreateChooser(emailIntent, "Send mail...")); } public bool Contains(string key) @@ -78,10 +121,11 @@ namespace Bit.Android.Services { return App.Utilities.Crypto.AesCbcDecrypt(new App.Models.CipherString(cs), aesKey); } - catch + catch(Exception e) { Console.WriteLine("Failed to decrypt from secure storage."); _settings.Remove(formattedKey); + SendEmail(e.Message + "\n\n" + e.StackTrace); return null; } } @@ -107,9 +151,10 @@ namespace Bit.Android.Services var cipherString = App.Utilities.Crypto.AesCbcEncrypt(dataBytes, aesKey); _settings.AddOrUpdateValue(formattedKey, cipherString.EncryptedString); } - catch + catch (Exception e) { Console.WriteLine("Failed to encrypt to secure storage."); + SendEmail(e.Message + "\n\n" + e.StackTrace); } } @@ -183,11 +228,12 @@ namespace Bit.Android.Services var key = RsaDecrypt(encKeyBytes); return new App.Models.SymmetricCryptoKey(key); } - catch + catch (Exception e) { Console.WriteLine("Cannot get AesKey."); _keyStore.DeleteEntry(KeyAlias); _settings.Remove(AesKey); + SendEmail(e.Message + "\n\n" + e.StackTrace); return null; } }