From b30bb7ef5ea873960534acc2c9bb8aee2904b051 Mon Sep 17 00:00:00 2001 From: clowwindy Date: Sat, 13 Dec 2014 11:19:17 +0800 Subject: [PATCH] fix aes --- .../Encrypt/PolarSSLEncryptor.cs | 5 +- shadowsocks-csharp/Properties/AssemblyInfo.cs | 2 +- test/UnitTest.cs | 77 ++++++++++++++++++- 3 files changed, 78 insertions(+), 6 deletions(-) diff --git a/shadowsocks-csharp/Encrypt/PolarSSLEncryptor.cs b/shadowsocks-csharp/Encrypt/PolarSSLEncryptor.cs index 0e1e668f..7e71d054 100755 --- a/shadowsocks-csharp/Encrypt/PolarSSLEncryptor.cs +++ b/shadowsocks-csharp/Encrypt/PolarSSLEncryptor.cs @@ -91,20 +91,23 @@ namespace Shadowsocks.Encrypt } byte[] iv; int ivOffset; + IntPtr ctx; if (isCipher) { iv = _encryptIV; ivOffset = _encryptIVOffset; + ctx = _encryptCtx; } else { iv = _decryptIV; ivOffset = _decryptIVOffset; + ctx = _decryptCtx; } switch (_cipher) { case CIPHER_AES: - PolarSSL.aes_crypt_cfb128(_encryptCtx, isCipher ? PolarSSL.AES_ENCRYPT : PolarSSL.AES_DECRYPT, length, ref ivOffset, iv, buf, outbuf); + PolarSSL.aes_crypt_cfb128(ctx, isCipher ? PolarSSL.AES_ENCRYPT : PolarSSL.AES_DECRYPT, length, ref ivOffset, iv, buf, outbuf); if (isCipher) { _encryptIVOffset = ivOffset; diff --git a/shadowsocks-csharp/Properties/AssemblyInfo.cs b/shadowsocks-csharp/Properties/AssemblyInfo.cs index 47f94a5e..2b18902f 100755 --- a/shadowsocks-csharp/Properties/AssemblyInfo.cs +++ b/shadowsocks-csharp/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值, // 方法是按如下所示使用“*”: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.0.11")] +[assembly: AssemblyVersion("2.1")] // [assembly: AssemblyFileVersion("2.0.0")] diff --git a/test/UnitTest.cs b/test/UnitTest.cs index 69c23b41..b6856e8e 100755 --- a/test/UnitTest.cs +++ b/test/UnitTest.cs @@ -23,14 +23,14 @@ namespace test } [TestMethod] - public void TestEncryption() + public void TestPolarSSLEncryption() { // run it once before the multi-threading test to initialize global tables - RunSingleEncryptionThread(); + RunSinglePolarSSLEncryptionThread(); List threads = new List(); for (int i = 0; i < 10; i++) { - Thread t = new Thread(new ThreadStart(RunSingleEncryptionThread)); + Thread t = new Thread(new ThreadStart(RunSinglePolarSSLEncryptionThread)); threads.Add(t); t.Start(); } @@ -44,7 +44,7 @@ namespace test private static bool encryptionFailed = false; private static object locker = new object(); - private void RunSingleEncryptionThread() + private void RunSinglePolarSSLEncryptionThread() { try { @@ -93,5 +93,74 @@ namespace test throw; } } + + [TestMethod] + public void TestSodiumEncryption() + { + // run it once before the multi-threading test to initialize global tables + RunSingleSodiumEncryptionThread(); + List threads = new List(); + for (int i = 0; i < 10; i++) + { + Thread t = new Thread(new ThreadStart(RunSingleSodiumEncryptionThread)); + threads.Add(t); + t.Start(); + } + foreach (Thread t in threads) + { + t.Join(); + } + Assert.IsFalse(encryptionFailed); + } + + private void RunSingleSodiumEncryptionThread() + { + try + { + for (int i = 0; i < 100; i++) + { + var random = new Random(); + IEncryptor encryptor; + IEncryptor decryptor; + encryptor = new SodiumEncryptor("salsa20", "barfoo!"); + decryptor = new SodiumEncryptor("salsa20", "barfoo!"); + byte[] plain = new byte[16384]; + byte[] cipher = new byte[plain.Length + 16]; + byte[] plain2 = new byte[plain.Length + 16]; + int outLen = 0; + int outLen2 = 0; + random.NextBytes(plain); + //lock (locker) + //{ + encryptor.Encrypt(plain, plain.Length, cipher, out outLen); + decryptor.Decrypt(cipher, outLen, plain2, out outLen2); + Assert.AreEqual(plain.Length, outLen2); + for (int j = 0; j < plain.Length; j++) + { + Assert.AreEqual(plain[j], plain2[j]); + } + encryptor.Encrypt(plain, 1000, cipher, out outLen); + decryptor.Decrypt(cipher, outLen, plain2, out outLen2); + Assert.AreEqual(1000, outLen2); + for (int j = 0; j < outLen2; j++) + { + Assert.AreEqual(plain[j], plain2[j]); + } + encryptor.Encrypt(plain, 12333, cipher, out outLen); + decryptor.Decrypt(cipher, outLen, plain2, out outLen2); + Assert.AreEqual(12333, outLen2); + for (int j = 0; j < outLen2; j++) + { + Assert.AreEqual(plain[j], plain2[j]); + } + //} + } + } + catch + { + encryptionFailed = true; + throw; + } + } } }