예제 #1
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));
        }
예제 #2
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);
        }