Browse Source

override MD5, so compatible with FIPS

tags/3.2
Gang Zhuo 9 years ago
parent
commit
dd0d047402
7 changed files with 88 additions and 5 deletions
  1. BIN
      shadowsocks-csharp/Data/libsscrypto.dll.gz
  2. +1
    -1
      shadowsocks-csharp/Encryption/EncryptorBase.cs
  3. +2
    -3
      shadowsocks-csharp/Encryption/IVEncryptor.cs
  4. +68
    -0
      shadowsocks-csharp/Encryption/MbedTLS.cs
  5. +1
    -1
      shadowsocks-csharp/Encryption/PolarSSLEncryptor.cs
  6. +1
    -0
      shadowsocks-csharp/shadowsocks-csharp.csproj
  7. +15
    -0
      test/UnitTest.cs

BIN
shadowsocks-csharp/Data/libsscrypto.dll.gz View File


+ 1
- 1
shadowsocks-csharp/Encryption/EncryptorBase.cs View File

@@ -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;
}


+ 2
- 3
shadowsocks-csharp/Encryption/IVEncryptor.cs View File

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


+ 68
- 0
shadowsocks-csharp/Encryption/MbedTLS.cs View File

@@ -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);

}
}

+ 1
- 1
shadowsocks-csharp/Encryption/PolarSSLEncryptor.cs View File

@@ -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
{


+ 1
- 0
shadowsocks-csharp/shadowsocks-csharp.csproj View File

@@ -184,6 +184,7 @@
<Compile Include="Encryption\EncryptorBase.cs" />
<Compile Include="Encryption\EncryptorFactory.cs" />
<Compile Include="Encryption\IVEncryptor.cs" />
<Compile Include="Encryption\MbedTLS.cs" />
<Compile Include="Encryption\PolarSSL.cs" />
<Compile Include="Encryption\PolarSSLEncryptor.cs" />
<Compile Include="Encryption\Sodium.cs" />


+ 15
- 0
test/UnitTest.cs View File

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


Loading…
Cancel
Save