From 41c5c5a483b2627c3f280fa1429cbfc1a6ed8e56 Mon Sep 17 00:00:00 2001 From: clowwindy Date: Thu, 6 Nov 2014 00:57:49 +0800 Subject: [PATCH] add polarssl --- polarssl/polarssl.dll | Bin 0 -> 40677 bytes .../Encrypt/EncryptorFactory.cs | 2 +- shadowsocks-csharp/Encrypt/PolarSSL.cs | 44 ++++ .../Encrypt/PolarSSLEncryptor.cs | 219 ++++++++++++++++++ shadowsocks-csharp/shadowsocks-csharp.csproj | 2 + 5 files changed, 266 insertions(+), 1 deletion(-) create mode 100755 polarssl/polarssl.dll create mode 100755 shadowsocks-csharp/Encrypt/PolarSSL.cs create mode 100755 shadowsocks-csharp/Encrypt/PolarSSLEncryptor.cs diff --git a/polarssl/polarssl.dll b/polarssl/polarssl.dll new file mode 100755 index 0000000000000000000000000000000000000000..d64fa6dca4725e4610c98e4d17c65c69bd04d177 GIT binary patch literal 40677 zcmeIb3tUY3|37}JiHVp&5yBwWHO)*)_rlOpM8YD|Z6Z>s8TY82#&#S-cCqfV*mYej za;MY^8*;ye(Ar5YxwpCWf4$CSE={|i-^cg!|NS5T-|urCk2B}IpXc>{-QKVF>%7nV zTqby27GXsY1P|8QT7ozXTU`9<-+%r|gTqZb9BoP*u({Cjutm^?j-w{WrHGP}6DK7{ zP7_5(CL|;(MNtY-vMNCommnHAJXAC-F-GCsq)8(umUW1XAc8C!5rf3zMiDUtp|&K5 zQldfU#uk?Lgewq5zzW2TLllZs|n`B`CZ)NYHi>govq!6|g=m z^d^@eet`N!F+ub~2mI|~LD>D%@hXCFsHg5;;H#_$=OAaLViq1hD}f(W2yN9H0sF8- z5FruHF_Fqh*hdoDcGS5a77U9&;gai|%n(+#1Uv#(RLT=pqs5&((HK&XqV+n92Wo5e2wY9aBtc(ISz$5hoSs8xXme4A@qUbafecXj0G`X8m zBV|+}AOx`)4cX*91MJFG+Mz7;9mXNZt1Sj$x@SG1YIl fbhIqq@GVHn}QFcl%Rq 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 VGqy7uEM=PKZ=#*;I_&h<{{!AL5>fyF literal 0 HcmV?d00001 diff --git a/shadowsocks-csharp/Encrypt/EncryptorFactory.cs b/shadowsocks-csharp/Encrypt/EncryptorFactory.cs index df3a975c..58d77715 100644 --- a/shadowsocks-csharp/Encrypt/EncryptorFactory.cs +++ b/shadowsocks-csharp/Encrypt/EncryptorFactory.cs @@ -10,7 +10,7 @@ namespace shadowsocks_csharp.Encrypt return new TableEncryptor(method, password); } - return new OpensslEncryptor(method, password); + return new PolarSSLEncryptor(method, password); } } } diff --git a/shadowsocks-csharp/Encrypt/PolarSSL.cs b/shadowsocks-csharp/Encrypt/PolarSSL.cs new file mode 100755 index 00000000..b20117b5 --- /dev/null +++ b/shadowsocks-csharp/Encrypt/PolarSSL.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; + +namespace shadowsocks_csharp.Encrypt +{ + public class PolarSSL + { + const string DLLNAME = "polarssl"; + + public const int AES_CTX_SIZE = 8 + 4 * 68; + public const int AES_ENCRYPT = 1; + public const int AES_DECRYPT = 0; + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public extern static void aes_init(byte[] ctx); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public extern static void aes_free(byte[] ctx); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public extern static int aes_setkey_enc(byte[] ctx, byte[] key, int keysize); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public extern static int aes_crypt_cfb128(byte[] ctx, int mode, int length, ref int iv_off, byte[] iv, byte[] input, byte[] output); + + + public const int ARC4_CTX_SIZE = 264; + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public extern static void arc4_init(byte[] ctx); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public extern static void arc4_free(byte[] ctx); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public extern static void arc4_setup(byte[] ctx, byte[] key, int keysize); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public extern static int arc4_crypt(byte[] ctx, int length, byte[] input, byte[] output); + + } +} diff --git a/shadowsocks-csharp/Encrypt/PolarSSLEncryptor.cs b/shadowsocks-csharp/Encrypt/PolarSSLEncryptor.cs new file mode 100755 index 00000000..d1a3a78f --- /dev/null +++ b/shadowsocks-csharp/Encrypt/PolarSSLEncryptor.cs @@ -0,0 +1,219 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Security.Cryptography; +using System.Text; + +namespace shadowsocks_csharp.Encrypt +{ + public class PolarSSLEncryptor + : EncryptorBase, IDisposable + { + const int CIPHER_AES = 1; + const int CIPHER_RC4 = 2; + const int CIPHER_BF = 3; + + static Dictionary ciphers = new Dictionary { + {"aes-128-cfb", new int[]{16, 16, CIPHER_AES, PolarSSL.AES_CTX_SIZE}}, + {"aes-192-cfb", new int[]{24, 16, CIPHER_AES, PolarSSL.AES_CTX_SIZE}}, + {"aes-256-cfb", new int[]{32, 16, CIPHER_AES, PolarSSL.AES_CTX_SIZE}}, + //{"bf-cfb", new int[]{16, 8, CIPHER_BF, PolarSSL.BF_CTX_SIZE}}, + {"rc4", new int[]{16, 0, CIPHER_RC4, PolarSSL.ARC4_CTX_SIZE}}, + {"rc4-md5", new int[]{16, 16, CIPHER_RC4, PolarSSL.ARC4_CTX_SIZE}}, + }; + + private static readonly Dictionary CachedKeys = new Dictionary(); + private int _cipher; + private int[] _cipherInfo; + private byte[] _key; + private byte[] _encryptCtx; + private byte[] _decryptCtx; + private byte[] _encryptIV; + private byte[] _decryptIV; + private int _encryptIVOffset; + private int _decryptIVOffset; + private string _method; + private int keyLen; + private int ivLen; + + public PolarSSLEncryptor(string method, string password) + : base(method, password) + { + InitKey(method, password); + } + + private static void randBytes(byte[] buf, int length) + { + byte[] temp = new byte[length]; + new Random().NextBytes(temp); + temp.CopyTo(buf, 0); + } + + private void bytesToKey(byte[] password, byte[] key) + { + byte[] result = new byte[password.Length + 16]; + int i = 0; + byte[] md5sum = null; + while (i < key.Length) + { + MD5 md5 = MD5.Create(); + if (i == 0) + { + md5sum = md5.ComputeHash(password); + } + else + { + md5sum.CopyTo(result, 0); + password.CopyTo(result, md5sum.Length); + md5sum = md5.ComputeHash(result); + } + md5sum.CopyTo(key, i); + i += md5sum.Length; + } + } + + private void InitKey(string method, string password) + { + method = method.ToLower(); + _method = method; + string k = method + ":" + password; + _cipherInfo = ciphers[_method]; + _cipher = _cipherInfo[2]; + if (_cipher == 0) + { + throw new Exception("method not found"); + } + keyLen = ciphers[_method][0]; + ivLen = ciphers[_method][1]; + if (CachedKeys.ContainsKey(k)) + { + _key = CachedKeys[k]; + } + else + { + byte[] passbuf = Encoding.UTF8.GetBytes(password); + _key = new byte[32]; + byte[] iv = new byte[16]; + bytesToKey(passbuf, _key); + CachedKeys[k] = _key; + } + } + + private void InitCipher(ref byte[] ctx, byte[] iv, bool isCipher) + { + ctx = new byte[_cipherInfo[3]]; + byte[] realkey; + if (_method == "rc4-md5") + { + byte[] temp = new byte[keyLen + ivLen]; + realkey = new byte[keyLen]; + Array.Copy(_key, 0, temp, 0, keyLen); + Array.Copy(iv, 0, temp, keyLen, ivLen); + realkey = MD5.Create().ComputeHash(temp); + } + else + { + realkey = _key; + } + if (_cipher == CIPHER_AES) + { + PolarSSL.aes_init(ctx); + if (isCipher) + { + // PolarSSL takes key length by bit + PolarSSL.aes_setkey_enc(ctx, realkey, keyLen * 8); + _encryptIV = new byte[ivLen]; + Array.Copy(iv, _encryptIV, ivLen); + } + else + { + // PolarSSL takes key length by bit + // since we'll use CFB mode, here we also do enc, not dec + PolarSSL.aes_setkey_enc(ctx, realkey, keyLen * 8); + _decryptIV = new byte[ivLen]; + Array.Copy(iv, _decryptIV, ivLen); + } + } + else if (_cipher == CIPHER_RC4) + { + PolarSSL.arc4_init(ctx); + PolarSSL.arc4_setup(ctx, realkey, keyLen); + } + } + + + + static byte[] tempbuf = new byte[32768]; + + public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength) + { + if (_encryptCtx == null) + { + randBytes(outbuf, ivLen); + InitCipher(ref _encryptCtx, outbuf, true); + outlength = length + ivLen; + switch (_cipher) + { + case CIPHER_AES: + PolarSSL.aes_crypt_cfb128(_encryptCtx, PolarSSL.AES_ENCRYPT, length, ref _encryptIVOffset, _encryptIV, buf, tempbuf); + break; + case CIPHER_RC4: + PolarSSL.arc4_crypt(_encryptCtx, length, buf, tempbuf); + break; + } + outlength = length + ivLen; + Buffer.BlockCopy(tempbuf, 0, outbuf, ivLen, outlength); + } + else + { + outlength = length; + switch (_cipher) + { + case CIPHER_AES: + PolarSSL.aes_crypt_cfb128(_encryptCtx, PolarSSL.AES_ENCRYPT, length, ref _encryptIVOffset, _encryptIV, buf, outbuf); + break; + case CIPHER_RC4: + PolarSSL.arc4_crypt(_encryptCtx, length, buf, outbuf); + break; + } + } + } + + public override void Decrypt(byte[] buf, int length, byte[] outbuf, out int outlength) + { + if (_decryptCtx == null) + { + InitCipher(ref _decryptCtx, buf, false); + outlength = length - ivLen; + Buffer.BlockCopy(buf, ivLen, tempbuf, 0, length - ivLen); + switch (_cipher) + { + case CIPHER_AES: + PolarSSL.aes_crypt_cfb128(_decryptCtx, PolarSSL.AES_DECRYPT, length - ivLen, ref _decryptIVOffset, _decryptIV, tempbuf, outbuf); + break; + case CIPHER_RC4: + PolarSSL.arc4_crypt(_decryptCtx, length - ivLen, tempbuf, outbuf); + break; + } + } + else + { + outlength = length; + switch (_cipher) + { + case CIPHER_AES: + PolarSSL.aes_crypt_cfb128(_decryptCtx, PolarSSL.AES_DECRYPT, length, ref _decryptIVOffset, _decryptIV, buf, outbuf); + break; + case CIPHER_RC4: + PolarSSL.arc4_crypt(_decryptCtx, length, buf, outbuf); + break; + } + } + } + + + public override void Dispose() + { + } + } +} diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index 169d0ef3..28aba093 100755 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -85,6 +85,8 @@ + +