From f7f42896145c6905847df841c03aa7d27130c549 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Sat, 27 May 2017 12:23:35 -0400 Subject: [PATCH] keystore fixes --- .../Services/KeyStoreBackedStorageService.cs | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/Android/Services/KeyStoreBackedStorageService.cs b/src/Android/Services/KeyStoreBackedStorageService.cs index 7e1d03924..c18078c46 100644 --- a/src/Android/Services/KeyStoreBackedStorageService.cs +++ b/src/Android/Services/KeyStoreBackedStorageService.cs @@ -33,8 +33,7 @@ namespace Bit.Android.Services public KeyStoreBackedStorageService(ISettings settings) { - _oldKeyStorageService = new KeyStoreStorageService(); - + _oldKeyStorageService = new KeyStoreStorageService(new char[] { }); _settings = settings; _keyStore = KeyStore.GetInstance(AndroidKeyStore); @@ -46,7 +45,7 @@ namespace Bit.Android.Services public bool Contains(string key) { - return _settings.Contains(string.Format(SettingsFormat, key)); + return _settings.Contains(string.Format(SettingsFormat, key)) || _oldKeyStorageService.Contains(key); } public void Delete(string key) @@ -57,26 +56,28 @@ namespace Bit.Android.Services public byte[] Retrieve(string key) { - if(!_settings.Contains(key)) + var formattedKey = string.Format(SettingsFormat, key); + if(!_settings.Contains(formattedKey)) { return TryGetAndMigrateFromOldKeyStore(key); } - var cipherString = _settings.GetValueOrDefault(string.Format(SettingsFormat, key)); + var cipherString = _settings.GetValueOrDefault(formattedKey); return AesDecrypt(cipherString); } public void Store(string key, byte[] dataBytes) { + var formattedKey = string.Format(SettingsFormat, key); CleanupOldKeyStore(key); if(dataBytes == null) { - _settings.Remove(key); + _settings.Remove(formattedKey); return; } var cipherString = AesEncrypt(dataBytes); - _settings.AddOrUpdateValue(key, cipherString); + _settings.AddOrUpdateValue(formattedKey, cipherString); } private byte[] RandomBytes(int length) @@ -160,10 +161,11 @@ namespace Bit.Android.Services private string AesEncrypt(byte[] input) { var cipher = Cipher.GetInstance(AesMode); - var ivBytes = RandomBytes(12); - var spec = new GCMParameterSpec(128, ivBytes); - cipher.Init(CipherMode.EncryptMode, GetAesKey(), spec); + //var ivBytes = RandomBytes(12); + //var spec = new GCMParameterSpec(128, ivBytes); + cipher.Init(CipherMode.EncryptMode, GetAesKey()); var encBytes = cipher.DoFinal(input); + var ivBytes = cipher.GetIV(); return $"{Convert.ToBase64String(ivBytes)}|{Convert.ToBase64String(encBytes)}"; }