From 92266c7a586030153d16b4fbc399a225674317b0 Mon Sep 17 00:00:00 2001 From: tidusjar Date: Thu, 6 Apr 2017 21:31:54 +0100 Subject: [PATCH] Upgrade to .Net Standard 1.6 --- Ombi/Ombi.Api/Ombi.Api.csproj | 2 +- Ombi/Ombi.Core/Ombi.Core.csproj | 2 +- Ombi/Ombi.Core/Settings/ISettingsService.cs | 4 +- .../Ombi.DependencyInjection.csproj | 2 +- .../Ombi.Helpers.Tests.csproj | 11 ++ Ombi/Ombi.Helpers/Ombi.Helpers.csproj | 2 +- Ombi/Ombi.Helpers/StringCipher.cs | 107 ++++++------------ Ombi/Ombi.Store/Ombi.Store.csproj | 2 +- .../Ombi.TheMovieDbApi.csproj | 2 +- Ombi/Ombi.sln | 11 +- 10 files changed, 65 insertions(+), 80 deletions(-) create mode 100644 Ombi/Ombi.Helpers.Tests/Ombi.Helpers.Tests.csproj diff --git a/Ombi/Ombi.Api/Ombi.Api.csproj b/Ombi/Ombi.Api/Ombi.Api.csproj index 80457725a..b3d86c156 100644 --- a/Ombi/Ombi.Api/Ombi.Api.csproj +++ b/Ombi/Ombi.Api/Ombi.Api.csproj @@ -1,7 +1,7 @@  - netstandard1.4 + netstandard1.6 diff --git a/Ombi/Ombi.Core/Ombi.Core.csproj b/Ombi/Ombi.Core/Ombi.Core.csproj index 078f56b95..ed719e074 100644 --- a/Ombi/Ombi.Core/Ombi.Core.csproj +++ b/Ombi/Ombi.Core/Ombi.Core.csproj @@ -1,7 +1,7 @@  - netstandard1.4 + netstandard1.6 diff --git a/Ombi/Ombi.Core/Settings/ISettingsService.cs b/Ombi/Ombi.Core/Settings/ISettingsService.cs index f781676a0..7fe6b4f6f 100644 --- a/Ombi/Ombi.Core/Settings/ISettingsService.cs +++ b/Ombi/Ombi.Core/Settings/ISettingsService.cs @@ -8,7 +8,7 @@ namespace Ombi.Core.Settings Task GetSettingsAsync(); bool SaveSettings(T model); Task SaveSettingsAsync(T model); - bool Delete(T model); - Task DeleteAsync(T model); + void Delete(T model); + Task DeleteAsync(T model); } } \ No newline at end of file diff --git a/Ombi/Ombi.DependencyInjection/Ombi.DependencyInjection.csproj b/Ombi/Ombi.DependencyInjection/Ombi.DependencyInjection.csproj index 0be698b01..828d87026 100644 --- a/Ombi/Ombi.DependencyInjection/Ombi.DependencyInjection.csproj +++ b/Ombi/Ombi.DependencyInjection/Ombi.DependencyInjection.csproj @@ -1,7 +1,7 @@  - netstandard1.4 + netstandard1.6 diff --git a/Ombi/Ombi.Helpers.Tests/Ombi.Helpers.Tests.csproj b/Ombi/Ombi.Helpers.Tests/Ombi.Helpers.Tests.csproj new file mode 100644 index 000000000..3aabbe61a --- /dev/null +++ b/Ombi/Ombi.Helpers.Tests/Ombi.Helpers.Tests.csproj @@ -0,0 +1,11 @@ + + + + netstandard1.6 + + + + + + + \ No newline at end of file diff --git a/Ombi/Ombi.Helpers/Ombi.Helpers.csproj b/Ombi/Ombi.Helpers/Ombi.Helpers.csproj index 498e443c1..2a9ec6330 100644 --- a/Ombi/Ombi.Helpers/Ombi.Helpers.csproj +++ b/Ombi/Ombi.Helpers/Ombi.Helpers.csproj @@ -1,7 +1,7 @@  - netstandard1.4 + netstandard1.6 diff --git a/Ombi/Ombi.Helpers/StringCipher.cs b/Ombi/Ombi.Helpers/StringCipher.cs index 152dc3f0d..aaa33d289 100644 --- a/Ombi/Ombi.Helpers/StringCipher.cs +++ b/Ombi/Ombi.Helpers/StringCipher.cs @@ -1,6 +1,5 @@ using System; using System.IO; -using System.Linq; using System.Security.Cryptography; using System.Text; @@ -8,12 +7,6 @@ namespace Ombi.Helpers { public class StringCipher { - // This constant determines the number of iterations for the password bytes generation function. - private const int DerivationIterations = 1000; - // This constant is used to determine the keysize of the encryption algorithm in bits. - // We divide this by 8 within the code below to get the equivalent number of bytes. - private const int Keysize = 256; - /// /// Decrypts the specified cipher text. /// @@ -22,39 +15,32 @@ namespace Ombi.Helpers /// public static string Decrypt(string cipherText, string passPhrase) { - // Get the complete stream of bytes that represent: - // [32 bytes of Salt] + [32 bytes of IV] + [n bytes of CipherText] - var cipherTextBytesWithSaltAndIv = Convert.FromBase64String(cipherText); - // Get the saltbytes by extracting the first 32 bytes from the supplied cipherText bytes. - var saltStringBytes = cipherTextBytesWithSaltAndIv.Take(Keysize / 8).ToArray(); - // Get the IV bytes by extracting the next 32 bytes from the supplied cipherText bytes. - var ivStringBytes = cipherTextBytesWithSaltAndIv.Skip(Keysize / 8).Take(Keysize / 8).ToArray(); - // Get the actual cipher text bytes by removing the first 64 bytes from the cipherText string. - var cipherTextBytes = cipherTextBytesWithSaltAndIv.Skip((Keysize / 8) * 2).Take(cipherTextBytesWithSaltAndIv.Length - ((Keysize / 8) * 2)).ToArray(); + var fullCipher = Convert.FromBase64String(cipherText); + + var iv = new byte[16]; + var cipher = new byte[16]; + + Buffer.BlockCopy(fullCipher, 0, iv, 0, iv.Length); + Buffer.BlockCopy(fullCipher, iv.Length, cipher, 0, iv.Length); + var key = Encoding.UTF8.GetBytes(passPhrase); - using (var password = new Rfc2898DeriveBytes(passPhrase, saltStringBytes, DerivationIterations)) + using (var aesAlg = Aes.Create()) { - var keyBytes = password.GetBytes(Keysize / 8); - var aes = Aes.Create(); - using (var symmetricKey = new RijndaelManaged()) + using (var decryptor = aesAlg.CreateDecryptor(key, iv)) { - symmetricKey.BlockSize = 256; - symmetricKey.Mode = CipherMode.CBC; - symmetricKey.Padding = PaddingMode.PKCS7; - using (var decryptor = symmetricKey.CreateDecryptor(keyBytes, ivStringBytes)) + string result; + using (var msDecrypt = new MemoryStream(cipher)) { - using (var memoryStream = new MemoryStream(cipherTextBytes)) + using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) { - using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) + using (var srDecrypt = new StreamReader(csDecrypt)) { - var plainTextBytes = new byte[cipherTextBytes.Length]; - var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length); - memoryStream.Close(); - cryptoStream.Close(); - return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount); + result = srDecrypt.ReadToEnd(); } } } + + return result; } } } @@ -67,54 +53,33 @@ namespace Ombi.Helpers /// public static string Encrypt(string plainText, string passPhrase) { - // Salt and IV is randomly generated each time, but is preprended to encrypted cipher text - // so that the same Salt and IV values can be used when decrypting. - var saltStringBytes = Generate256BitsOfRandomEntropy(); - var ivStringBytes = Generate256BitsOfRandomEntropy(); - var plainTextBytes = Encoding.UTF8.GetBytes(plainText); - using (var password = new Rfc2898DeriveBytes(passPhrase, saltStringBytes, DerivationIterations)) + var key = Encoding.UTF8.GetBytes(passPhrase); + + using (var aesAlg = Aes.Create()) { - var keyBytes = password.GetBytes(Keysize / 8); - using (var symmetricKey = new RijndaelManaged()) + using (var encryptor = aesAlg.CreateEncryptor(key, aesAlg.IV)) { - symmetricKey.BlockSize = 256; - symmetricKey.Mode = CipherMode.CBC; - symmetricKey.Padding = PaddingMode.PKCS7; - using (var encryptor = symmetricKey.CreateEncryptor(keyBytes, ivStringBytes)) + using (var msEncrypt = new MemoryStream()) { - using (var memoryStream = new MemoryStream()) + using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) + using (var swEncrypt = new StreamWriter(csEncrypt)) { - using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) - { - cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length); - cryptoStream.FlushFinalBlock(); - // Create the final bytes as a concatenation of the random salt bytes, the random iv bytes and the cipher bytes. - var cipherTextBytes = saltStringBytes; - cipherTextBytes = cipherTextBytes.Concat(ivStringBytes).ToArray(); - cipherTextBytes = cipherTextBytes.Concat(memoryStream.ToArray()).ToArray(); - memoryStream.Close(); - cryptoStream.Close(); - return Convert.ToBase64String(cipherTextBytes); - } + swEncrypt.Write(plainText); } + + var iv = aesAlg.IV; + + var decryptedContent = msEncrypt.ToArray(); + + var result = new byte[iv.Length + decryptedContent.Length]; + + Buffer.BlockCopy(iv, 0, result, 0, iv.Length); + Buffer.BlockCopy(decryptedContent, 0, result, iv.Length, decryptedContent.Length); + + return Convert.ToBase64String(result); } } } } - - /// - /// Generate256s the bits of random entropy. - /// - /// - private static byte[] Generate256BitsOfRandomEntropy() - { - var randomBytes = new byte[32]; // 32 Bytes will give us 256 bits. - using (var rngCsp = new RNGCryptoServiceProvider()) - { - // Fill the array with cryptographically secure random bytes. - rngCsp.GetBytes(randomBytes); - } - return randomBytes; - } } } \ No newline at end of file diff --git a/Ombi/Ombi.Store/Ombi.Store.csproj b/Ombi/Ombi.Store/Ombi.Store.csproj index 7d9da619e..6dac2a1d5 100644 --- a/Ombi/Ombi.Store/Ombi.Store.csproj +++ b/Ombi/Ombi.Store/Ombi.Store.csproj @@ -1,7 +1,7 @@  - netstandard1.4 + netstandard1.6 diff --git a/Ombi/Ombi.TheMovieDbApi/Ombi.TheMovieDbApi.csproj b/Ombi/Ombi.TheMovieDbApi/Ombi.TheMovieDbApi.csproj index 16516740e..07b575cc8 100644 --- a/Ombi/Ombi.TheMovieDbApi/Ombi.TheMovieDbApi.csproj +++ b/Ombi/Ombi.TheMovieDbApi/Ombi.TheMovieDbApi.csproj @@ -1,7 +1,7 @@  - netstandard1.4 + netstandard1.6 diff --git a/Ombi/Ombi.sln b/Ombi/Ombi.sln index bd42c7e32..cfe27f8fb 100644 --- a/Ombi/Ombi.sln +++ b/Ombi/Ombi.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26228.10 +VisualStudioVersion = 15.0.26228.9 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ombi", "Ombi\Ombi.csproj", "{C987AA67-AFE1-468F-ACD3-EAD5A48E1F6A}" EndProject @@ -26,6 +26,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ombi.Store", "Ombi.Store\Om EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ombi.DependencyInjection", "Ombi.DependencyInjection\Ombi.DependencyInjection.csproj", "{B39E4558-C557-48E7-AA74-19C5CD809617}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ombi.Helpers.Tests", "Ombi.Helpers.Tests\Ombi.Helpers.Tests.csproj", "{0E74C637-F5DE-42CF-AF5C-98440676D9F6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{2DA84300-4B25-42E0-BB9C-4A32A984C87E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -60,6 +64,10 @@ Global {B39E4558-C557-48E7-AA74-19C5CD809617}.Debug|Any CPU.Build.0 = Debug|Any CPU {B39E4558-C557-48E7-AA74-19C5CD809617}.Release|Any CPU.ActiveCfg = Release|Any CPU {B39E4558-C557-48E7-AA74-19C5CD809617}.Release|Any CPU.Build.0 = Release|Any CPU + {0E74C637-F5DE-42CF-AF5C-98440676D9F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0E74C637-F5DE-42CF-AF5C-98440676D9F6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0E74C637-F5DE-42CF-AF5C-98440676D9F6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0E74C637-F5DE-42CF-AF5C-98440676D9F6}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -67,5 +75,6 @@ Global GlobalSection(NestedProjects) = preSolution {132DA282-5894-4570-8916-D8C18ED2CE84} = {9293CA11-360A-4C20-A674-B9E794431BF5} {EA31F915-31F9-4318-B521-1500CDF40DDF} = {9293CA11-360A-4C20-A674-B9E794431BF5} + {0E74C637-F5DE-42CF-AF5C-98440676D9F6} = {2DA84300-4B25-42E0-BB9C-4A32A984C87E} EndGlobalSection EndGlobal