diff --git a/mRemoteNGTests/Config/Serializers/CredentialSerializers/XmlCredentialDeserializerTests.cs b/mRemoteNGTests/Config/Serializers/CredentialSerializers/XmlCredentialDeserializerTests.cs deleted file mode 100644 index fd5c1af6..00000000 --- a/mRemoteNGTests/Config/Serializers/CredentialSerializers/XmlCredentialDeserializerTests.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using System.Linq; -using System.Security; -using mRemoteNG.Config.Serializers; -using mRemoteNG.Security; -using NUnit.Framework; - -namespace mRemoteNGTests.Config.Serializers.CredentialSerializers -{ - public class XmlCredentialDeserializerTests - { - private XmlCredentialRecordDeserializer _deserializer; - private ICryptographyProvider _cryptographyProvider; - private readonly SecureString _key = "myencrptionpass".ConvertToSecureString(); - - [SetUp] - public void Setup() - { - _cryptographyProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(BlockCipherEngines.AES, BlockCipherModes.GCM); - _deserializer = new XmlCredentialRecordDeserializer(); - } - - [Test] - public void HasCorrectId() - { - var id = Guid.NewGuid(); - var xml = $"\r\n \r\n"; - var creds = _deserializer.Deserialize(xml, _key); - Assert.That(creds.First().Id, Is.EqualTo(id)); - } - - [Test] - public void HasCorrectTitle() - { - const string title = "testtitle"; - var xml = $"\r\n \r\n"; - var creds = _deserializer.Deserialize(xml, _key); - Assert.That(creds.First().Title, Is.EqualTo(title)); - } - - [Test] - public void HasCorrectUsername() - { - const string username = "myuser"; - var xml = $"\r\n \r\n"; - var creds = _deserializer.Deserialize(xml, _key); - Assert.That(creds.First().Username, Is.EqualTo(username)); - } - - [Test] - public void HasCorrectPassword() - { - const string plaintextPassword = "mypassword"; - var xml = $"\r\n \r\n"; - var creds = _deserializer.Deserialize(xml, _key); - Assert.That(creds.First().Password.ConvertToUnsecureString(), Is.EqualTo(plaintextPassword)); - } - - [Test] - public void DeserializesAllCredentials() - { - var xml = $"\r\n \r\n \r\n"; - var creds = _deserializer.Deserialize(xml, _key); - Assert.That(creds.Count(), Is.EqualTo(2)); - } - - [Test] - public void CanDecryptNonStandardEncryptions() - { - var otherCryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(BlockCipherEngines.Serpent, BlockCipherModes.CCM); - otherCryptoProvider.KeyDerivationIterations = 2000; - const string plaintextPassword = "mypassword"; - var encryptedPassword = otherCryptoProvider.Encrypt(plaintextPassword, _key); - var xml = - $"\r\n\r\n \r\n"; - var creds = _deserializer.Deserialize(xml, _key); - Assert.That(creds.First().Password.ConvertToUnsecureString(), Is.EqualTo(plaintextPassword)); - } - - private string GeneratePass(string plaintext) - { - return _cryptographyProvider.Encrypt(plaintext, _key); - } - } -} \ No newline at end of file diff --git a/mRemoteNGTests/Config/Serializers/CredentialSerializers/XmlCredentialRecordDeserializerTests.cs b/mRemoteNGTests/Config/Serializers/CredentialSerializers/XmlCredentialRecordDeserializerTests.cs new file mode 100644 index 00000000..1361a093 --- /dev/null +++ b/mRemoteNGTests/Config/Serializers/CredentialSerializers/XmlCredentialRecordDeserializerTests.cs @@ -0,0 +1,92 @@ +using System; +using System.Linq; +using System.Security; +using mRemoteNG.Config.Serializers.CredentialSerializer; +using mRemoteNG.Security; +using NUnit.Framework; + +namespace mRemoteNGTests.Config.Serializers.CredentialSerializers +{ + public class XmlCredentialRecordDeserializerTests + { + private XmlCredentialRecordDeserializer _deserializer; + private readonly Guid _id = Guid.NewGuid(); + private const string Title = "sometitle"; + private const string Username = "myusername"; + private const string Domain = "mydomain"; + private const string PlaintextPassword = "mypassword"; + private readonly SecureString _key = "myencrptionpass".ConvertToSecureString(); + + + [SetUp] + public void Setup() + { + _deserializer = new XmlCredentialRecordDeserializer(); + } + + [Test] + public void HasCorrectId() + { + var xml = GenerateXml(); + var creds = _deserializer.Deserialize(xml, _key); + Assert.That(creds.First().Id, Is.EqualTo(_id)); + } + + [Test] + public void HasCorrectTitle() + { + var xml = GenerateXml(); + var creds = _deserializer.Deserialize(xml, _key); + Assert.That(creds.First().Title, Is.EqualTo(Title)); + } + + [Test] + public void HasCorrectUsername() + { + var xml = GenerateXml(); + var creds = _deserializer.Deserialize(xml, _key); + Assert.That(creds.First().Username, Is.EqualTo(Username)); + } + + [Test] + public void HasCorrectDomain() + { + var xml = GenerateXml(); + var creds = _deserializer.Deserialize(xml, _key); + Assert.That(creds.First().Domain, Is.EqualTo(Domain)); + } + + [Test] + public void HasCorrectPassword() + { + var xml = GenerateXml(); + var creds = _deserializer.Deserialize(xml, _key); + Assert.That(creds.First().Password.ConvertToUnsecureString(), Is.EqualTo(PlaintextPassword)); + } + + [Test] + public void DeserializesAllCredentials() + { + var xml = GenerateXml(); + var creds = _deserializer.Deserialize(xml, _key); + Assert.That(creds.Count(), Is.EqualTo(2)); + } + + [Test] + public void CanDecryptNonStandardEncryptions() + { + var xml = GenerateXml(BlockCipherEngines.Serpent, BlockCipherModes.EAX, 3000); + var creds = _deserializer.Deserialize(xml, _key); + Assert.That(creds.First().Password.ConvertToUnsecureString(), Is.EqualTo(PlaintextPassword)); + } + + + private string GenerateXml(BlockCipherEngines engine = BlockCipherEngines.AES, BlockCipherModes mode = BlockCipherModes.GCM, int interations = 1000) + { + return $"" + + $"" + + $"" + + ""; + } + } +} \ No newline at end of file diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index ab26ff39..6fba28e0 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -125,7 +125,7 @@ - + diff --git a/mRemoteV1/Config/CredentialRecordLoader.cs b/mRemoteV1/Config/CredentialRecordLoader.cs index ca83c266..2a8f857e 100644 --- a/mRemoteV1/Config/CredentialRecordLoader.cs +++ b/mRemoteV1/Config/CredentialRecordLoader.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Security; using mRemoteNG.Config.DataProviders; -using mRemoteNG.Config.Serializers; +using mRemoteNG.Config.Serializers.CredentialSerializer; using mRemoteNG.Credential; diff --git a/mRemoteV1/Config/Serializers/CredentialSerializer/XmlCredentialRecordDeserializer.cs b/mRemoteV1/Config/Serializers/CredentialSerializer/XmlCredentialRecordDeserializer.cs index 6d0389e8..f19f77a4 100644 --- a/mRemoteV1/Config/Serializers/CredentialSerializer/XmlCredentialRecordDeserializer.cs +++ b/mRemoteV1/Config/Serializers/CredentialSerializer/XmlCredentialRecordDeserializer.cs @@ -5,32 +5,25 @@ using System.Security; using System.Xml.Linq; using mRemoteNG.Credential; using mRemoteNG.Security; -using mRemoteNG.Security.Authentication; - -namespace mRemoteNG.Config.Serializers +namespace mRemoteNG.Config.Serializers.CredentialSerializer { public class XmlCredentialRecordDeserializer { public string SchemaVersion { get; } = "1.0"; - public IAuthenticator Authenticator { get; set; } public IEnumerable Deserialize(string xml, SecureString decryptionKey) { var xdoc = XDocument.Parse(xml); var rootElement = xdoc.Root; ValidateSchemaVersion(rootElement); - var cryptographyProvider = CryptographyProviderFactory.BuildFromXml(rootElement); - Authenticate(rootElement, cryptographyProvider, decryptionKey); var credentials = from element in xdoc.Descendants("Credential") - select new CredentialRecord(Guid.Parse(element.Attribute("Id")?.Value)) + select new CredentialRecord(Guid.Parse(element.Attribute("Id")?.Value ?? Guid.NewGuid().ToString())) { Title = element.Attribute("Title")?.Value ?? "", Username = element.Attribute("Username")?.Value ?? "", - Password = - cryptographyProvider.Decrypt(element.Attribute("Password")?.Value, decryptionKey) - .ConvertToSecureString(), + Password = element.Attribute("Password")?.Value.ConvertToSecureString(), Domain = element.Attribute("Domain")?.Value ?? "" }; return credentials.ToArray(); @@ -42,11 +35,5 @@ namespace mRemoteNG.Config.Serializers if (docSchemaVersion != SchemaVersion) throw new Exception($"The schema version of this document is not supported by this class. Document Version: {docSchemaVersion} Supported Version: {SchemaVersion}"); } - - private void Authenticate(XElement rootElement, ICryptographyProvider cryptographyProvider, SecureString key) - { - var authString = rootElement.Attribute("Auth")?.Value; - cryptographyProvider.Decrypt(authString, key); - } } } \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj.DotSettings b/mRemoteV1/mRemoteV1.csproj.DotSettings index eb7e6301..f9340e33 100644 --- a/mRemoteV1/mRemoteV1.csproj.DotSettings +++ b/mRemoteV1/mRemoteV1.csproj.DotSettings @@ -1,6 +1,6 @@  True - True + False True True True