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];