From e11413eab852aea475fcbbdf06426fe2efa209c0 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 19 Oct 2016 18:00:14 -0600 Subject: [PATCH] The XmlConnectionsSerializer now looks to its crypto provider for the value of KdfIterations. This insulates the function from global state (Settings) --- .../Serializers/XmlConnectionsSerializerTests.cs | 15 +++++++++++++++ mRemoteV1/App/Export.cs | 1 + mRemoteV1/Config/Connections/ConnectionsSaver.cs | 1 + .../Serializers/XmlConnectionsSerializer.cs | 2 +- 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/mRemoteNGTests/Config/Serializers/XmlConnectionsSerializerTests.cs b/mRemoteNGTests/Config/Serializers/XmlConnectionsSerializerTests.cs index 0bce28ce0..f6a5b587f 100644 --- a/mRemoteNGTests/Config/Serializers/XmlConnectionsSerializerTests.cs +++ b/mRemoteNGTests/Config/Serializers/XmlConnectionsSerializerTests.cs @@ -70,6 +70,21 @@ namespace mRemoteNGTests.Config.Serializers Assert.That(serializedEncryptionMode, Is.EqualTo(expectedModeAsString)); } + [TestCase(1000)] + [TestCase(1001)] + [TestCase(9999)] + [TestCase(10000)] + public void KeyDerivationIterationsSerialized(int kdfIterations) + { + var encryptor = new AeadCryptographyProvider {KeyDerivationIterations = kdfIterations}; + _serializer = new XmlConnectionsSerializer(encryptor); + var serializedData = _serializer.Serialize(new ConnectionInfo()); + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(serializedData); + var serializedIterations = xmlDoc.DocumentElement?.Attributes["KdfIterations"].Value; + Assert.That(serializedIterations, Is.EqualTo(kdfIterations.ToString())); + } + private ConnectionTreeModel SetupConnectionTreeModel() { /* diff --git a/mRemoteV1/App/Export.cs b/mRemoteV1/App/Export.cs index 3df3b7f74..15af5ac03 100644 --- a/mRemoteV1/App/Export.cs +++ b/mRemoteV1/App/Export.cs @@ -75,6 +75,7 @@ namespace mRemoteNG.App case ConnectionsSaver.Format.mRXML: var factory = new CryptographyProviderFactory(); var cryptographyProvider = factory.CreateAeadCryptographyProvider(mRemoteNG.Settings.Default.EncryptionEngine, mRemoteNG.Settings.Default.EncryptionBlockCipherMode); + cryptographyProvider.KeyDerivationIterations = Settings.Default.EncryptionKeyDerivationIterations; serializer = new XmlConnectionsSerializer(cryptographyProvider); ((XmlConnectionsSerializer) serializer).SaveFilter = saveFilter; break; diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index 349bdf771..328f5f014 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -235,6 +235,7 @@ namespace mRemoteNG.Config.Connections { var factory = new CryptographyProviderFactory(); var cryptographyProvider = factory.CreateAeadCryptographyProvider(mRemoteNG.Settings.Default.EncryptionEngine, mRemoteNG.Settings.Default.EncryptionBlockCipherMode); + cryptographyProvider.KeyDerivationIterations = mRemoteNG.Settings.Default.EncryptionKeyDerivationIterations; var xmlConnectionsSerializer = new XmlConnectionsSerializer(cryptographyProvider) { Export = Export, diff --git a/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs b/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs index 6fbb1a0ff..cbdb39633 100644 --- a/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs +++ b/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs @@ -154,7 +154,7 @@ namespace mRemoteNG.Config.Serializers _xmlTextWriter.WriteAttributeString("EncryptionEngine", "", cipherEngine ?? ""); var cipherMode = Enum.GetName(typeof(BlockCipherModes), _cryptographyProvider.CipherMode); _xmlTextWriter.WriteAttributeString("BlockCipherMode", "", cipherMode ?? ""); - _xmlTextWriter.WriteAttributeString("KdfIterations", "", mRemoteNG.Settings.Default.EncryptionKeyDerivationIterations.ToString()); + _xmlTextWriter.WriteAttributeString("KdfIterations", "", _cryptographyProvider.KeyDerivationIterations.ToString()); _xmlTextWriter.WriteAttributeString("FullFileEncryption", "", UseFullEncryption.ToString()); if (Export)