Beispiel #1
0
        public void EncyprtedDataWithPasswordDecrypt()
        {
            const string encryptedDataString = "IAAAAG4pxSTP1J4LvdrPEpwmnVtBNfXeOYXreKEuQeMtu8znAFDdm6jl0S1XpDoHHkVWc1IRQH79PnqQYXgeNSCGEGvPrIQXQbtlFotdt3AeWCwKEA==";

            var decryptedTestString = EncryptedDataWithPassword.DecryptData(TestPassword, encryptedDataString);

            Assert.AreEqual(TestString, decryptedTestString);
        }
Beispiel #2
0
        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));
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #5
0
        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);
        }