diff --git a/shadowsocks-csharp/Data/libsscrypto.dll.gz b/shadowsocks-csharp/Data/libsscrypto.dll.gz index b0429860..544c80bf 100755 Binary files a/shadowsocks-csharp/Data/libsscrypto.dll.gz and b/shadowsocks-csharp/Data/libsscrypto.dll.gz differ diff --git a/shadowsocks-csharp/Encryption/EncryptorBase.cs b/shadowsocks-csharp/Encryption/EncryptorBase.cs index 8285f165..25694181 100644 --- a/shadowsocks-csharp/Encryption/EncryptorBase.cs +++ b/shadowsocks-csharp/Encryption/EncryptorBase.cs @@ -24,7 +24,7 @@ namespace Shadowsocks.Encryption protected byte[] GetPasswordHash() { byte[] inputBytes = Encoding.UTF8.GetBytes(Password); - byte[] hash = MD5.Create().ComputeHash(inputBytes); + byte[] hash = MbedTLS.MD5(inputBytes); return hash; } diff --git a/shadowsocks-csharp/Encryption/IVEncryptor.cs b/shadowsocks-csharp/Encryption/IVEncryptor.cs index 52d1970b..29b98abe 100755 --- a/shadowsocks-csharp/Encryption/IVEncryptor.cs +++ b/shadowsocks-csharp/Encryption/IVEncryptor.cs @@ -83,16 +83,15 @@ namespace Shadowsocks.Encryption byte[] md5sum = null; while (i < key.Length) { - MD5 md5 = MD5.Create(); if (i == 0) { - md5sum = md5.ComputeHash(password); + md5sum = MbedTLS.MD5(password); } else { md5sum.CopyTo(result, 0); password.CopyTo(result, md5sum.Length); - md5sum = md5.ComputeHash(result); + md5sum = MbedTLS.MD5(result); } md5sum.CopyTo(key, i); i += md5sum.Length; diff --git a/shadowsocks-csharp/Encryption/MbedTLS.cs b/shadowsocks-csharp/Encryption/MbedTLS.cs new file mode 100644 index 00000000..a9266a2c --- /dev/null +++ b/shadowsocks-csharp/Encryption/MbedTLS.cs @@ -0,0 +1,68 @@ +using Shadowsocks.Controller; +using Shadowsocks.Properties; +using Shadowsocks.Util; +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; + +namespace Shadowsocks.Encryption +{ + public class MbedTLS + { + const string DLLNAME = "libsscrypto"; + + static MbedTLS() + { + string tempPath = Utils.GetTempPath(); + string dllPath = tempPath + "/libsscrypto.dll"; + try + { + FileManager.UncompressFile(dllPath, Resources.libsscrypto_dll); + } + catch (IOException ex) + { + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + LoadLibrary(dllPath); + } + + [DllImport("Kernel32.dll")] + private static extern IntPtr LoadLibrary(string path); + + public const int MD5_CTX_SIZE = 88; + + public static byte[] MD5(byte[] input) + { + IntPtr ctx = Marshal.AllocHGlobal(MD5_CTX_SIZE); + byte[] output = new byte[16]; + MbedTLS.md5_init(ctx); + MbedTLS.md5_starts(ctx); + MbedTLS.md5_update(ctx, input, (uint)input.Length); + MbedTLS.md5_finish(ctx, output); + MbedTLS.md5_free(ctx); + Marshal.FreeHGlobal(ctx); + return output; + } + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public extern static void md5_init(IntPtr ctx); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public extern static void md5_free(IntPtr ctx); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public extern static void md5_starts(IntPtr ctx); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public extern static void md5_update(IntPtr ctx, byte[] input, uint ilen ); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public extern static void md5_finish(IntPtr ctx, byte[] output); + + } +} diff --git a/shadowsocks-csharp/Encryption/PolarSSLEncryptor.cs b/shadowsocks-csharp/Encryption/PolarSSLEncryptor.cs index a40a12a1..8e521862 100755 --- a/shadowsocks-csharp/Encryption/PolarSSLEncryptor.cs +++ b/shadowsocks-csharp/Encryption/PolarSSLEncryptor.cs @@ -60,7 +60,7 @@ namespace Shadowsocks.Encryption realkey = new byte[keyLen]; Array.Copy(_key, 0, temp, 0, keyLen); Array.Copy(iv, 0, temp, keyLen, ivLen); - realkey = MD5.Create().ComputeHash(temp); + realkey = MbedTLS.MD5(temp); } else { diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index bfe37140..d58ca508 100644 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -184,6 +184,7 @@ + diff --git a/test/UnitTest.cs b/test/UnitTest.cs index 1970e85f..7cbcee1c 100755 --- a/test/UnitTest.cs +++ b/test/UnitTest.cs @@ -22,6 +22,21 @@ namespace test Assert.IsTrue(UpdateChecker.Asset.CompareVersion("1.3.2", "1.3.1") > 0); } + [TestMethod] + public void TestMD5() + { + for (int len = 1; len < 64; len++) + { + System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create(); + byte[] bytes = new byte[len]; + var random = new Random(); + random.NextBytes(bytes); + string md5str = Convert.ToBase64String(md5.ComputeHash(bytes)); + string md5str2 = Convert.ToBase64String(MbedTLS.MD5(bytes)); + Assert.IsTrue(md5str == md5str2); + } + } + private void RunEncryptionRound(IEncryptor encryptor, IEncryptor decryptor) { byte[] plain = new byte[16384];