diff --git a/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Encryption/Symmetric/ISymmetricEncryptionEngine.cs b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Encryption/Symmetric/ISymmetricEncryptionEngine.cs
new file mode 100644
index 0000000..b3fb700
--- /dev/null
+++ b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Encryption/Symmetric/ISymmetricEncryptionEngine.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace SafeMessageStorage.Encryption.Symmetric
+{
+ public interface ISymmetricEncryptionEngine
+ {
+ string Encrypt(string content, string key);
+
+ string Decrypt(string cipher, string key);
+ }
+}
diff --git a/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Pages/AuthorizationPage.xaml b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Pages/AuthorizationPage.xaml
index 6839fc5..ba7db68 100644
--- a/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Pages/AuthorizationPage.xaml
+++ b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Pages/AuthorizationPage.xaml
@@ -5,7 +5,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="SafeMessageStorage.Pages.AuthorizationPage"
- Title="Authorize">
+ Title="AuthorizeAsync">
-
+
\ No newline at end of file
diff --git a/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage.csproj b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage.csproj
index 992183c..ee655dd 100644
--- a/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage.csproj
+++ b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage.csproj
@@ -6,12 +6,12 @@
+
-
diff --git a/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/AuthorizationService/AuthorizationService.cs b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/AuthorizationService/AuthorizationService.cs
index 635bb5d..193a9f3 100644
--- a/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/AuthorizationService/AuthorizationService.cs
+++ b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/AuthorizationService/AuthorizationService.cs
@@ -8,7 +8,7 @@ namespace SafeMessageStorage.Services.AuthorizationService
{
public class AuthorizationService : IAuthorizationService
{
- private readonly string _passwordKey = "passwordGUID";
+ private readonly string _passwordKey = "86d9ee32-c00e-4b18-bb1b-a4f7d9e23ec9";
private readonly IHashProvider _hashProvider;
public AuthorizationService(IHashProvider hashProvider)
@@ -17,22 +17,27 @@ namespace SafeMessageStorage.Services.AuthorizationService
}
public bool IsAuthorized { get; private set; }
+
+ public string AuthorizedUserHash { get; private set; }
+
public bool IsPasswordSet => Xamarin.Essentials.SecureStorage.GetAsync(_passwordKey).Result != null;
- public async Task Authorize(string password)
+ public async Task AuthorizeAsync(string password)
{
var keyChainPassword = await Xamarin.Essentials.SecureStorage.GetAsync(_passwordKey);
var result = keyChainPassword?.Equals(_hashProvider.GetHashString(password)) ?? false;
IsAuthorized = result;
+ AuthorizedUserHash = IsAuthorized ? keyChainPassword : null;
return result;
}
- public Task Deauthorize()
+ public Task DeauthorizeAsync()
{
IsAuthorized = false;
+ AuthorizedUserHash = null;
return Task.FromResult(true);
}
- public async Task ChangePassword(string currentPassword, string newPassword)
+ public async Task ChangePasswordAsync(string currentPassword, string newPassword)
{
var keyChainPassword = await Xamarin.Essentials.SecureStorage.GetAsync(_passwordKey);
var passwordMatch = keyChainPassword?.Equals(_hashProvider.GetHashString(currentPassword)) ?? true;
diff --git a/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/AuthorizationService/AuthorizationServiceMOCK.cs b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/AuthorizationService/AuthorizationServiceMOCK.cs
index a0d3b63..f611fd2 100644
--- a/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/AuthorizationService/AuthorizationServiceMOCK.cs
+++ b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/AuthorizationService/AuthorizationServiceMOCK.cs
@@ -8,18 +8,19 @@ namespace SafeMessageStorage.Services.AuthorizationService
public class AuthorizationServiceMOCK : IAuthorizationService
{
public bool IsAuthorized => false;
+ public string AuthorizedUserHash => "kanapka";
public bool IsPasswordSet => false;
- public Task Authorize(string password)
+ public Task AuthorizeAsync(string password)
{
return Task.FromResult(false);
}
- public Task Deauthorize()
+ public Task DeauthorizeAsync()
{
throw new NotImplementedException();
}
- public Task ChangePassword(string currentPassword, string newPassword)
+ public Task ChangePasswordAsync(string currentPassword, string newPassword)
{
return Task.FromResult(true);
}
diff --git a/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/AuthorizationService/IAuthorizationService.cs b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/AuthorizationService/IAuthorizationService.cs
index c451ad3..c23332e 100644
--- a/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/AuthorizationService/IAuthorizationService.cs
+++ b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/AuthorizationService/IAuthorizationService.cs
@@ -9,12 +9,14 @@ namespace SafeMessageStorage.Services.AuthorizationService
{
bool IsAuthorized { get; }
+ string AuthorizedUserHash { get; }
+
bool IsPasswordSet { get; }
- Task Authorize(string password);
+ Task AuthorizeAsync(string password);
- Task Deauthorize();
+ Task DeauthorizeAsync();
- Task ChangePassword(string currentPassword, string newPassword);
+ Task ChangePasswordAsync(string currentPassword, string newPassword);
}
}
diff --git a/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/MessageStorageService/IMessageStorageService.cs b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/MessageStorageService/IMessageStorageService.cs
index e11f469..588a9b5 100644
--- a/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/MessageStorageService/IMessageStorageService.cs
+++ b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/MessageStorageService/IMessageStorageService.cs
@@ -8,15 +8,12 @@ namespace SafeMessageStorage.Services.MessageStorageService
{
public interface IMessageStorageService
{
- Task IsStorageEmpty { get; }
-
- Task SaveMessage(Message message);
-
- Task ReadMessage();
-
- Task DeleteMessage();
+ bool IsStorageEmpty { get; }
+ Task SaveMessageAsync(Message message);
+ Task ReadMessageAsync();
+ Task DeleteMessageAsync();
}
}
diff --git a/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/MessageStorageService/SafeMessageStorageService.cs b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/MessageStorageService/SafeMessageStorageService.cs
new file mode 100644
index 0000000..2703e8a
--- /dev/null
+++ b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/Services/MessageStorageService/SafeMessageStorageService.cs
@@ -0,0 +1,51 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using Newtonsoft.Json;
+using SafeMessageStorage.Encryption.Symmetric;
+using SafeMessageStorage.Models;
+using SafeMessageStorage.Services.AuthorizationService;
+
+namespace SafeMessageStorage.Services.MessageStorageService
+{
+ public class SafeMessageStorageService : IMessageStorageService
+ {
+ private IAuthorizationService _authorizationService;
+ private ISymmetricEncryptionEngine _encryptionEngine;
+ private readonly string _messageKey = "377f2486-d2c3-48a7-b821-45d7314479cd";
+
+ public bool IsStorageEmpty => Xamarin.Essentials.SecureStorage.GetAsync(_messageKey).Result != null;
+
+ public async Task SaveMessageAsync(Message message)
+ {
+ CheckIfAuthorized();
+ var encrypyedMessage = _encryptionEngine.Encrypt(JsonConvert.SerializeObject(message), _authorizationService.AuthorizedUserHash);
+ await Xamarin.Essentials.SecureStorage.SetAsync(_messageKey, encrypyedMessage);
+ return true;
+ }
+
+ public async Task ReadMessageAsync()
+ {
+ CheckIfAuthorized();
+ var encryptedMessage =await Xamarin.Essentials.SecureStorage.GetAsync(_messageKey);
+ if (encryptedMessage == null)
+ return null;
+
+ var decryptedMessage = _encryptionEngine.Decrypt(encryptedMessage, _authorizationService.AuthorizedUserHash);
+ return JsonConvert.DeserializeObject(decryptedMessage);
+ }
+
+ public async Task DeleteMessageAsync()
+ {
+ CheckIfAuthorized();
+ return Xamarin.Essentials.SecureStorage.Remove(_messageKey);
+ }
+
+ private void CheckIfAuthorized()
+ {
+ if(!_authorizationService.IsAuthorized)
+ throw new UnauthorizedAccessException();
+ }
+ }
+}
diff --git a/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/ViewModels/AuthorizationPageViewModel.cs b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/ViewModels/AuthorizationPageViewModel.cs
index ad48825..ccb894c 100644
--- a/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/ViewModels/AuthorizationPageViewModel.cs
+++ b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/ViewModels/AuthorizationPageViewModel.cs
@@ -42,7 +42,7 @@ namespace SafeMessageStorage.ViewModels
private async Task Authorize(string code)
{
- if (await _authorizationService.Authorize(code))
+ if (await _authorizationService.AuthorizeAsync(code))
AuthorizationSucceeded?.Invoke(this, EventArgs.Empty);
else
{
diff --git a/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/ViewModels/SetPasswordPageViewModel.cs b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/ViewModels/SetPasswordPageViewModel.cs
index 4cdcde2..7884be7 100644
--- a/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/ViewModels/SetPasswordPageViewModel.cs
+++ b/src/SafeMessageStorage/SafeMessageStorage/SafeMessageStorage/ViewModels/SetPasswordPageViewModel.cs
@@ -43,7 +43,7 @@ namespace SafeMessageStorage.ViewModels
}
else
{
- if(await _authorizationService.ChangePassword(null, password))
+ if(await _authorizationService.ChangePasswordAsync(null, password))
PasswordSetSucceeded?.Invoke(this,EventArgs.Empty);
}
}