public void EncyprtedDataWithPasswordDecrypt() { const string encryptedDataString = "IAAAAG4pxSTP1J4LvdrPEpwmnVtBNfXeOYXreKEuQeMtu8znAFDdm6jl0S1XpDoHHkVWc1IRQH79PnqQYXgeNSCGEGvPrIQXQbtlFotdt3AeWCwKEA=="; var decryptedTestString = EncryptedDataWithPassword.DecryptData(TestPassword, encryptedDataString); Assert.AreEqual(TestString, decryptedTestString); }
public void EncryptedDataWithPasswordBytes() { var encryptedData = new EncryptedDataWithPassword(Encoding.UTF8.GetBytes(TestString), TestPassword); var encryptedDataString = encryptedData.ToString(); var decryptedTestBytes = EncryptedDataWithPassword.DecryptDataAsBytes(encryptedDataString, TestPassword); Assert.AreEqual(TestString, Encoding.UTF8.GetString(decryptedTestBytes)); }
public void EncryptedDataWithPasswordString() { var encryptedData = new EncryptedDataWithPassword(TestString, TestPassword); var encryptedDataString = encryptedData.ToString(); var decryptedTestString = EncryptedDataWithPassword.DecryptData(TestPassword, encryptedDataString); Assert.AreEqual(TestString, decryptedTestString); }
private void BackupEntrySecrets() { var accountSettings = _model.ServerAccountSettings.Query().First(); if (!accountSettings.BackupRecoveryPasswordHashSet) { return; } var secrets = _model.EntriesSharedSecrets.Query().ToList(); foreach (var secret in secrets) { var entry = _model.Entries.Query().First(r => r.Id == secret.EntryId); var database = _model.Links.Query().First(r => r.Id == entry.LinkId); if (secret.ToBeDeleted) { var deleteRequest = new DeleteDatabaseEntryDeviceSecret { LinkIdentifier = database.Identifier, SecretIdentifier = secret.SecretIdentifier }; try { deleteRequest.GetResponse(GetApiClient()); } catch (RequestException) { // Try again next time. continue; } _model.EntriesSharedSecretsData.Delete(secret.EntrySecretDataId); _model.EntriesSharedSecrets.Delete(secret.Id); continue; } // Is there an update request for this entry? var updateRequests = _model.EntriesSharedSecretsSync.Query() .Where(r => r.EntrySecretId == secret.Id).ToList(); if (updateRequests.Count == 0) { continue; } var updateRequestsSorted = updateRequests.OrderByDescending(update => update.CreatedAt); var latestUpdateRequest = updateRequestsSorted.First(); // Remove duplicate update requests foreach (var updateRequest in updateRequestsSorted) { if (updateRequest.Id == latestUpdateRequest.Id) { continue; } _model.EntriesSharedSecretsSync.Delete(updateRequest.Id); } var secretData = _model.EntriesSharedSecretsData.Query().First(r => r.Id == secret.EntrySecretDataId); var serializedEntry = JsonConvert.SerializeObject(secretData); var encryptedData = new EncryptedDataWithPassword( Compression.Compress(serializedEntry), accountSettings.BackupRecoveryPasswordHash).ToString(); var request = new SetDatabaseEntryDeviceSecret { LinkIdentifier = database.Identifier, EntryIdentifier = entry.Identifier, SecretIdentifier = secret.SecretIdentifier, DataType = "ModelJsonGz", Data = encryptedData }; try { request.GetResponse(GetApiClient()); } catch (RequestException) { // Try again later continue; } // Sync completed _model.EntriesSharedSecretsSync.Delete(latestUpdateRequest.Id); } }
private bool RecoverDeviceData(int serverAccountId, string recoveryKeyHash) { var model = AccountModel.GetModel(serverAccountId); var apiClient = GetApiClientForAccount(serverAccountId); GetUserResponse userInfo; try { userInfo = apiClient.GetUser(new GetUserRequest()); } catch (RequestException) { return(false); } foreach (var serverDatabase in userInfo.Links) { var localDatabase = model.Links.Query().FirstOrDefault(r => r.Identifier == serverDatabase.Identifier); if (localDatabase == null) { // Create the database locally var newLocalDatabaseId = model.Links.Create(new Link { Identifier = serverDatabase.Identifier }); localDatabase = model.Links.Query().First(r => r.Id == newLocalDatabaseId); } var entriesRequest = new ServerAPIRequests.GetDatabaseEntries { LinkIdentifier = serverDatabase.Identifier }; ServerAPIRequests.GetDatabaseEntries.ResponseParams entriesResponse; try { entriesResponse = entriesRequest.GetResponse(apiClient); } catch (RequestException) { return(false); } foreach (var serverEntry in entriesResponse.Entries) { var localEntry = model.Entries.Query().FirstOrDefault( r => r.LinkId == localDatabase.Id && r.Identifier == serverEntry.EntryIdentifier); if (localEntry == null) { var newLocalEntryId = model.Entries.Create(new Entry { LinkId = localDatabase.Id, Identifier = serverEntry.EntryIdentifier }); localEntry = model.Entries.Query().First(r => r.Id == newLocalEntryId); } var secretsRequest = new ServerAPIRequests.GetDatabaseEntryDeviceSecrets { LinkIdentifier = serverDatabase.Identifier, EntryIdentifier = serverEntry.EntryIdentifier }; ServerAPIRequests.GetDatabaseEntryDeviceSecrets.ResponseParams secretsResponse; try { secretsResponse = secretsRequest.GetResponse(apiClient); } catch (RequestException) { return(false); } foreach (var serverSecret in secretsResponse.Secrets) { var localSecret = model.EntriesSharedSecrets.Query().FirstOrDefault( r => r.EntryId == localEntry.Id && r.SecretIdentifier == serverSecret.SecretIdentifier); if (localSecret != null) { continue; } var decryptedData = EncryptedDataWithPassword.DecryptDataAsBytes( serverSecret.Data, recoveryKeyHash); var dataJson = AllAuth.Lib.Utils.Compression.Decompress(decryptedData); var data = Newtonsoft.Json.JsonConvert.DeserializeObject <EntrySharedSecretData>(dataJson); data.RemoveId(); var newSecretDataId = model.EntriesSharedSecretsData.Create(data); model.EntriesSharedSecrets.Create(new EntrySharedSecret { EntryId = localEntry.Id, SecretIdentifier = serverSecret.SecretIdentifier, EntrySecretDataId = newSecretDataId }); } } } return(true); }