@@ -1,3 +1,13 @@ | |||||
2.0.9 2014-11-13 | |||||
- Fix startup path | |||||
- Fix allowed port range for polipo | |||||
2.0.8 2014-11-12 | |||||
- Fix data corruption | |||||
- Set proxy for PPPoE | |||||
- Auto Startup Option | |||||
- Support high DPI screens | |||||
2.0.7 2014-11-11 | 2.0.7 2014-11-11 | ||||
- Use OpenSSL for now | - Use OpenSSL for now | ||||
@@ -0,0 +1,39 @@ | |||||
using System; | |||||
using System.Windows.Forms; | |||||
using Microsoft.Win32; | |||||
namespace Shadowsocks.Controller { | |||||
class AutoStartup { | |||||
public static bool Set(bool enabled) { | |||||
try { | |||||
string path = Application.ExecutablePath; | |||||
RegistryKey runKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true); | |||||
if (enabled) { | |||||
runKey.SetValue("Shadowsocks", path); | |||||
} else { | |||||
runKey.DeleteValue("Shadowsocks"); | |||||
} | |||||
runKey.Close(); | |||||
return true; | |||||
} catch (Exception) { | |||||
return false; | |||||
} | |||||
} | |||||
public static bool Check() { | |||||
try { | |||||
string path = Application.ExecutablePath; | |||||
RegistryKey runKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run"); | |||||
string[] runList = runKey.GetValueNames(); | |||||
runKey.Close(); | |||||
foreach (string item in runList) { | |||||
if (item.Equals("Shadowsocks")) | |||||
return true; | |||||
} | |||||
return false; | |||||
} catch (Exception) { | |||||
return false; | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -115,6 +115,9 @@ namespace Shadowsocks.Controller | |||||
private bool connectionShutdown = false; | private bool connectionShutdown = false; | ||||
private bool remoteShutdown = false; | private bool remoteShutdown = false; | ||||
private bool closed = false; | private bool closed = false; | ||||
private object encryptionLock = new object(); | |||||
private object decryptionLock = new object(); | |||||
public void Start() | public void Start() | ||||
{ | { | ||||
@@ -141,7 +144,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Console.WriteLine(e.Message); | |||||
Console.WriteLine(e); | |||||
this.Close(); | this.Close(); | ||||
} | } | ||||
} | } | ||||
@@ -173,7 +176,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Console.WriteLine(e.Message); | |||||
Console.WriteLine(e); | |||||
} | } | ||||
} | } | ||||
if (remote != null) | if (remote != null) | ||||
@@ -185,14 +188,24 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (SocketException e) | catch (SocketException e) | ||||
{ | { | ||||
Console.WriteLine(e.Message); | |||||
Console.WriteLine(e); | |||||
} | |||||
} | |||||
lock (encryptionLock) | |||||
{ | |||||
lock (decryptionLock) | |||||
{ | |||||
((IDisposable)encryptor).Dispose(); | |||||
} | } | ||||
} | } | ||||
((IDisposable)encryptor).Dispose(); | |||||
} | } | ||||
private void ConnectCallback(IAsyncResult ar) | private void ConnectCallback(IAsyncResult ar) | ||||
{ | { | ||||
if (closed) | |||||
{ | |||||
return; | |||||
} | |||||
try | try | ||||
{ | { | ||||
// Complete the connection. | // Complete the connection. | ||||
@@ -205,13 +218,17 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Console.WriteLine(e.Message); | |||||
Console.WriteLine(e); | |||||
this.Close(); | this.Close(); | ||||
} | } | ||||
} | } | ||||
private void HandshakeReceive() | private void HandshakeReceive() | ||||
{ | { | ||||
if (closed) | |||||
{ | |||||
return; | |||||
} | |||||
try | try | ||||
{ | { | ||||
connection.BeginReceive(connetionRecvBuffer, 0, 256, 0, | connection.BeginReceive(connetionRecvBuffer, 0, 256, 0, | ||||
@@ -219,13 +236,17 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Console.WriteLine(e.Message); | |||||
Console.WriteLine(e); | |||||
this.Close(); | this.Close(); | ||||
} | } | ||||
} | } | ||||
private void HandshakeReceiveCallback(IAsyncResult ar) | private void HandshakeReceiveCallback(IAsyncResult ar) | ||||
{ | { | ||||
if (closed) | |||||
{ | |||||
return; | |||||
} | |||||
try | try | ||||
{ | { | ||||
int bytesRead = connection.EndReceive(ar); | int bytesRead = connection.EndReceive(ar); | ||||
@@ -248,13 +269,17 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Console.WriteLine(e.Message); | |||||
Console.WriteLine(e); | |||||
this.Close(); | this.Close(); | ||||
} | } | ||||
} | } | ||||
private void HandshakeSendCallback(IAsyncResult ar) | private void HandshakeSendCallback(IAsyncResult ar) | ||||
{ | { | ||||
if (closed) | |||||
{ | |||||
return; | |||||
} | |||||
try | try | ||||
{ | { | ||||
connection.EndSend(ar); | connection.EndSend(ar); | ||||
@@ -271,13 +296,17 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Console.WriteLine(e.Message); | |||||
Console.WriteLine(e); | |||||
this.Close(); | this.Close(); | ||||
} | } | ||||
} | } | ||||
private void handshakeReceive2Callback(IAsyncResult ar) | private void handshakeReceive2Callback(IAsyncResult ar) | ||||
{ | { | ||||
if (closed) | |||||
{ | |||||
return; | |||||
} | |||||
try | try | ||||
{ | { | ||||
int bytesRead = connection.EndReceive(ar); | int bytesRead = connection.EndReceive(ar); | ||||
@@ -295,7 +324,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Console.WriteLine(e.Message); | |||||
Console.WriteLine(e); | |||||
this.Close(); | this.Close(); | ||||
} | } | ||||
} | } | ||||
@@ -303,6 +332,10 @@ namespace Shadowsocks.Controller | |||||
private void StartPipe(IAsyncResult ar) | private void StartPipe(IAsyncResult ar) | ||||
{ | { | ||||
if (closed) | |||||
{ | |||||
return; | |||||
} | |||||
try | try | ||||
{ | { | ||||
connection.EndReceive(ar); | connection.EndReceive(ar); | ||||
@@ -313,14 +346,17 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Console.WriteLine(e.Message); | |||||
Console.WriteLine(e); | |||||
this.Close(); | this.Close(); | ||||
} | } | ||||
} | } | ||||
private void PipeRemoteReceiveCallback(IAsyncResult ar) | private void PipeRemoteReceiveCallback(IAsyncResult ar) | ||||
{ | { | ||||
if (closed) | |||||
{ | |||||
return; | |||||
} | |||||
try | try | ||||
{ | { | ||||
int bytesRead = remote.EndReceive(ar); | int bytesRead = remote.EndReceive(ar); | ||||
@@ -328,7 +364,14 @@ namespace Shadowsocks.Controller | |||||
if (bytesRead > 0) | if (bytesRead > 0) | ||||
{ | { | ||||
int bytesToSend; | int bytesToSend; | ||||
encryptor.Decrypt(remoteRecvBuffer, bytesRead, remoteSendBuffer, out bytesToSend); | |||||
lock (decryptionLock) | |||||
{ | |||||
if (closed) | |||||
{ | |||||
return; | |||||
} | |||||
encryptor.Decrypt(remoteRecvBuffer, bytesRead, remoteSendBuffer, out bytesToSend); | |||||
} | |||||
connection.BeginSend(remoteSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeConnectionSendCallback), null); | connection.BeginSend(remoteSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeConnectionSendCallback), null); | ||||
} | } | ||||
else | else | ||||
@@ -341,14 +384,17 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Console.WriteLine(e.Message); | |||||
Console.WriteLine(e); | |||||
this.Close(); | this.Close(); | ||||
} | } | ||||
} | } | ||||
private void PipeConnectionReceiveCallback(IAsyncResult ar) | private void PipeConnectionReceiveCallback(IAsyncResult ar) | ||||
{ | { | ||||
if (closed) | |||||
{ | |||||
return; | |||||
} | |||||
try | try | ||||
{ | { | ||||
int bytesRead = connection.EndReceive(ar); | int bytesRead = connection.EndReceive(ar); | ||||
@@ -356,7 +402,14 @@ namespace Shadowsocks.Controller | |||||
if (bytesRead > 0) | if (bytesRead > 0) | ||||
{ | { | ||||
int bytesToSend; | int bytesToSend; | ||||
encryptor.Encrypt(connetionRecvBuffer, bytesRead, connetionSendBuffer, out bytesToSend); | |||||
lock (encryptionLock) | |||||
{ | |||||
if (closed) | |||||
{ | |||||
return; | |||||
} | |||||
encryptor.Encrypt(connetionRecvBuffer, bytesRead, connetionSendBuffer, out bytesToSend); | |||||
} | |||||
remote.BeginSend(connetionSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeRemoteSendCallback), null); | remote.BeginSend(connetionSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeRemoteSendCallback), null); | ||||
} | } | ||||
else | else | ||||
@@ -368,13 +421,17 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Console.WriteLine(e.Message); | |||||
Console.WriteLine(e); | |||||
this.Close(); | this.Close(); | ||||
} | } | ||||
} | } | ||||
private void PipeRemoteSendCallback(IAsyncResult ar) | private void PipeRemoteSendCallback(IAsyncResult ar) | ||||
{ | { | ||||
if (closed) | |||||
{ | |||||
return; | |||||
} | |||||
try | try | ||||
{ | { | ||||
remote.EndSend(ar); | remote.EndSend(ar); | ||||
@@ -383,13 +440,17 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Console.WriteLine(e.Message); | |||||
Console.WriteLine(e); | |||||
this.Close(); | this.Close(); | ||||
} | } | ||||
} | } | ||||
private void PipeConnectionSendCallback(IAsyncResult ar) | private void PipeConnectionSendCallback(IAsyncResult ar) | ||||
{ | { | ||||
if (closed) | |||||
{ | |||||
return; | |||||
} | |||||
try | try | ||||
{ | { | ||||
connection.EndSend(ar); | connection.EndSend(ar); | ||||
@@ -398,7 +459,7 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Console.WriteLine(e.Message); | |||||
Console.WriteLine(e); | |||||
this.Close(); | this.Close(); | ||||
} | } | ||||
} | } | ||||
@@ -15,6 +15,7 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
private static int PORT = 8090; | private static int PORT = 8090; | ||||
private static string PAC_FILE = "pac.txt"; | private static string PAC_FILE = "pac.txt"; | ||||
private static Configuration config; | |||||
Socket _listener; | Socket _listener; | ||||
FileSystemWatcher watcher; | FileSystemWatcher watcher; | ||||
@@ -25,6 +26,7 @@ namespace Shadowsocks.Controller | |||||
{ | { | ||||
try | try | ||||
{ | { | ||||
config = configuration; | |||||
// Create a TCP/IP socket. | // Create a TCP/IP socket. | ||||
_listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); | _listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); | ||||
_listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); | _listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); | ||||
@@ -84,12 +86,21 @@ namespace Shadowsocks.Controller | |||||
new AsyncCallback(AcceptCallback), | new AsyncCallback(AcceptCallback), | ||||
listener); | listener); | ||||
conn.BeginReceive(new byte[1024], 0, 1024, 0, | |||||
new AsyncCallback(ReceiveCallback), conn); | |||||
byte[] buf = new byte[2048]; | |||||
object[] state = new object[] { | |||||
conn, | |||||
buf | |||||
}; | |||||
conn.BeginReceive(buf, 0, 1024, 0, | |||||
new AsyncCallback(ReceiveCallback), state); | |||||
} | |||||
catch (ObjectDisposedException) | |||||
{ | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Console.WriteLine(e.Message); | |||||
Console.WriteLine(e); | |||||
} | } | ||||
} | } | ||||
@@ -120,7 +131,10 @@ namespace Shadowsocks.Controller | |||||
private void ReceiveCallback(IAsyncResult ar) | private void ReceiveCallback(IAsyncResult ar) | ||||
{ | { | ||||
Socket conn = (Socket)ar.AsyncState; | |||||
object[] state = (object[])ar.AsyncState; | |||||
Socket conn = (Socket)state[0]; | |||||
byte[] requestBuf = (byte[])state[1]; | |||||
try | try | ||||
{ | { | ||||
int bytesRead = conn.EndReceive(ar); | int bytesRead = conn.EndReceive(ar); | ||||
@@ -129,7 +143,7 @@ namespace Shadowsocks.Controller | |||||
IPEndPoint localEndPoint = (IPEndPoint)conn.LocalEndPoint; | IPEndPoint localEndPoint = (IPEndPoint)conn.LocalEndPoint; | ||||
string proxy = "PROXY " + localEndPoint.Address + ":8123;"; | |||||
string proxy = GetPACAddress(requestBuf, localEndPoint); | |||||
pac = pac.Replace("__PROXY__", proxy); | pac = pac.Replace("__PROXY__", proxy); | ||||
@@ -152,7 +166,7 @@ Connection: Close | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { | ||||
Console.WriteLine(e.Message); | |||||
Console.WriteLine(e); | |||||
conn.Close(); | conn.Close(); | ||||
} | } | ||||
} | } | ||||
@@ -186,5 +200,24 @@ Connection: Close | |||||
PACFileChanged(this, new EventArgs()); | PACFileChanged(this, new EventArgs()); | ||||
} | } | ||||
} | } | ||||
private string GetPACAddress(byte[] requestBuf, IPEndPoint localEndPoint) | |||||
{ | |||||
string proxy = "PROXY " + localEndPoint.Address + ":8123;"; | |||||
//try | |||||
//{ | |||||
// string requestString = Encoding.UTF8.GetString(requestBuf); | |||||
// if (requestString.IndexOf("AppleWebKit") >= 0) | |||||
// { | |||||
// string address = "" + localEndPoint.Address + ":" + config.GetCurrentServer().local_port; | |||||
// proxy = "SOCKS5 " + address + "; SOCKS " + address + ";"; | |||||
// } | |||||
//} | |||||
//catch (Exception e) | |||||
//{ | |||||
// Console.WriteLine(e); | |||||
//} | |||||
return proxy; | |||||
} | |||||
} | } | ||||
} | } |
@@ -35,6 +35,8 @@ namespace Shadowsocks.Controller | |||||
registry.SetValue("ProxyServer", ""); | registry.SetValue("ProxyServer", ""); | ||||
registry.SetValue("AutoConfigURL", "http://127.0.0.1:8090/pac?t=" + GetTimestamp(DateTime.Now)); | registry.SetValue("AutoConfigURL", "http://127.0.0.1:8090/pac?t=" + GetTimestamp(DateTime.Now)); | ||||
SystemProxy.NotifyIE(); | SystemProxy.NotifyIE(); | ||||
//Must Notify IE first, or the connections do not chanage | |||||
CopyProxySettingFromLan(); | |||||
} | } | ||||
catch (Exception) | catch (Exception) | ||||
{ | { | ||||
@@ -54,6 +56,7 @@ namespace Shadowsocks.Controller | |||||
registry.SetValue("ProxyServer", ""); | registry.SetValue("ProxyServer", ""); | ||||
registry.SetValue("AutoConfigURL", ""); | registry.SetValue("AutoConfigURL", ""); | ||||
SystemProxy.NotifyIE(); | SystemProxy.NotifyIE(); | ||||
CopyProxySettingFromLan(); | |||||
} | } | ||||
catch (Exception) | catch (Exception) | ||||
{ | { | ||||
@@ -62,6 +65,25 @@ namespace Shadowsocks.Controller | |||||
} | } | ||||
} | } | ||||
private static void CopyProxySettingFromLan() | |||||
{ | |||||
RegistryKey registry = | |||||
Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections", | |||||
true); | |||||
var defulatValue = registry.GetValue("DefaultConnectionSettings"); | |||||
var connections = registry.GetValueNames(); | |||||
foreach (String each in connections){ | |||||
if (!(each.Equals("DefaultConnectionSettings") | |||||
|| each.Equals("LAN Connection") | |||||
|| each.Equals("SavedLegacySettings"))) | |||||
{ | |||||
//set all the connections's proxy as the lan | |||||
registry.SetValue(each, defulatValue); | |||||
} | |||||
} | |||||
NotifyIE(); | |||||
} | |||||
private static String GetTimestamp(DateTime value) | private static String GetTimestamp(DateTime value) | ||||
{ | { | ||||
return value.ToString("yyyyMMddHHmmssffff"); | return value.ToString("yyyyMMddHHmmssffff"); | ||||
@@ -4,3 +4,6 @@ socksParentProxy = "127.0.0.1:__SOCKS_PORT__" | |||||
socksProxyType = socks5 | socksProxyType = socks5 | ||||
diskCacheRoot = "" | diskCacheRoot = "" | ||||
localDocumentRoot = "" | localDocumentRoot = "" | ||||
allowedPorts = 1-65535 | |||||
tunnelAllowedPorts = 1-65535 |
@@ -10,7 +10,7 @@ namespace Shadowsocks.Encrypt | |||||
return new TableEncryptor(method, password); | return new TableEncryptor(method, password); | ||||
} | } | ||||
return new OpenSSLEncryptor(method, password); | |||||
return new PolarSSLEncryptor(method, password); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -1,45 +0,0 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Runtime.InteropServices; | |||||
using System.Text; | |||||
namespace Shadowsocks.Encrypt | |||||
{ | |||||
public class OpenSSL | |||||
{ | |||||
const string DLLNAME = "libeay32"; | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | |||||
public extern static void OpenSSL_add_all_ciphers(); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | |||||
public extern static IntPtr EVP_md5(); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | |||||
public extern static int EVP_BytesToKey(IntPtr type, IntPtr md, IntPtr salt, byte[] data, int datal, int count, byte[] key, byte[] iv); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | |||||
public extern static int RAND_bytes(byte[] buf, int num); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | |||||
public extern static IntPtr EVP_get_cipherbyname(byte[] name); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | |||||
public extern static IntPtr EVP_CIPHER_CTX_new(); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | |||||
public extern static int EVP_CipherInit_ex(IntPtr ctx, IntPtr type, IntPtr impl, byte[] key, byte[] iv, int enc); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | |||||
public extern static int EVP_CIPHER_CTX_cleanup(IntPtr a); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | |||||
public extern static int EVP_CIPHER_CTX_free(IntPtr a); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | |||||
public extern static int EVP_CipherUpdate(IntPtr ctx, byte[] outb, out int outl, byte[] inb, int inl); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | |||||
public extern static IntPtr MD5(byte[] d, long n, byte[] md); | |||||
} | |||||
} |
@@ -1,170 +0,0 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Runtime.InteropServices; | |||||
using System.Text; | |||||
namespace Shadowsocks.Encrypt | |||||
{ | |||||
public class OpenSSLEncryptor | |||||
: EncryptorBase, IDisposable | |||||
{ | |||||
static Dictionary<string, int[]> ciphers = new Dictionary<string, int[]> { | |||||
{"aes-128-cfb", new int[]{16, 16}}, | |||||
{"aes-192-cfb", new int[]{24, 16}}, | |||||
{"aes-256-cfb", new int[]{32, 16}}, | |||||
{"bf-cfb", new int[]{16, 8}}, | |||||
{"rc4", new int[]{16, 0}}, | |||||
{"rc4-md5", new int[]{16, 16}}, | |||||
}; | |||||
static OpenSSLEncryptor() | |||||
{ | |||||
OpenSSL.OpenSSL_add_all_ciphers(); | |||||
} | |||||
public OpenSSLEncryptor(string method, string password) | |||||
: base(method, password) | |||||
{ | |||||
InitKey(method, password); | |||||
} | |||||
static byte[] tempbuf = new byte[32768]; | |||||
public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength) | |||||
{ | |||||
if (_encryptCtx == IntPtr.Zero) | |||||
{ | |||||
OpenSSL.RAND_bytes(outbuf, ivLen); | |||||
InitCipher(ref _encryptCtx, outbuf, true); | |||||
outlength = length + ivLen; | |||||
OpenSSL.EVP_CipherUpdate(_encryptCtx, tempbuf, out outlength, buf, length); | |||||
outlength = length + ivLen; | |||||
Buffer.BlockCopy(tempbuf, 0, outbuf, ivLen, outlength); | |||||
} | |||||
else | |||||
{ | |||||
outlength = length; | |||||
OpenSSL.EVP_CipherUpdate(_encryptCtx, outbuf, out outlength, buf, length); | |||||
} | |||||
} | |||||
public override void Decrypt(byte[] buf, int length, byte[] outbuf, out int outlength) | |||||
{ | |||||
if (_decryptCtx == IntPtr.Zero) | |||||
{ | |||||
InitCipher(ref _decryptCtx, buf, false); | |||||
outlength = length - ivLen; | |||||
Buffer.BlockCopy(buf, ivLen, tempbuf, 0, length - ivLen); | |||||
OpenSSL.EVP_CipherUpdate(_decryptCtx, outbuf, out outlength, tempbuf, length - ivLen); | |||||
} | |||||
else | |||||
{ | |||||
outlength = length; | |||||
OpenSSL.EVP_CipherUpdate(_decryptCtx, outbuf, out outlength, buf, length); | |||||
} | |||||
} | |||||
private static readonly Dictionary<string, byte[]> CachedKeys = new Dictionary<string, byte[]>(); | |||||
private byte[] _key; | |||||
private IntPtr _encryptCtx; | |||||
private IntPtr _decryptCtx; | |||||
private IntPtr _cipher; | |||||
private string _method; | |||||
private int keyLen; | |||||
private int ivLen; | |||||
private void InitKey(string method, string password) | |||||
{ | |||||
method = method.ToLower(); | |||||
_method = method; | |||||
string k = method + ":" + password; | |||||
if (method == "rc4-md5") | |||||
{ | |||||
method = "rc4"; | |||||
} | |||||
_cipher = OpenSSL.EVP_get_cipherbyname(System.Text.Encoding.UTF8.GetBytes(method)); | |||||
if (_cipher == null) | |||||
{ | |||||
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]; | |||||
OpenSSL.EVP_BytesToKey(_cipher, OpenSSL.EVP_md5(), IntPtr.Zero, passbuf, passbuf.Length, 1, _key, iv); | |||||
CachedKeys[k] = _key; | |||||
} | |||||
} | |||||
private void InitCipher(ref IntPtr ctx, byte[] iv, bool isCipher) | |||||
{ | |||||
ctx = OpenSSL.EVP_CIPHER_CTX_new(); | |||||
int enc = isCipher ? 1 : 0; | |||||
byte[] realkey; | |||||
IntPtr r = IntPtr.Zero; | |||||
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); | |||||
r = OpenSSL.MD5(temp, keyLen + ivLen, null); | |||||
Marshal.Copy(r, realkey, 0, keyLen); | |||||
} | |||||
else | |||||
{ | |||||
realkey = _key; | |||||
} | |||||
OpenSSL.EVP_CipherInit_ex(ctx, _cipher, IntPtr.Zero, realkey, iv, enc); | |||||
} | |||||
#region IDisposable | |||||
private bool _disposed; | |||||
public override void Dispose() | |||||
{ | |||||
Dispose(true); | |||||
GC.SuppressFinalize(this); | |||||
} | |||||
~OpenSSLEncryptor() | |||||
{ | |||||
Dispose(false); | |||||
} | |||||
protected virtual void Dispose(bool disposing) | |||||
{ | |||||
if (!_disposed) | |||||
{ | |||||
if (disposing) | |||||
{ | |||||
} | |||||
if (_encryptCtx.ToInt64() != 0) | |||||
{ | |||||
OpenSSL.EVP_CIPHER_CTX_cleanup(_encryptCtx); | |||||
OpenSSL.EVP_CIPHER_CTX_free(_encryptCtx); | |||||
_encryptCtx = IntPtr.Zero; | |||||
} | |||||
if (_decryptCtx.ToInt64() != 0) | |||||
{ | |||||
OpenSSL.EVP_CIPHER_CTX_cleanup(_decryptCtx); | |||||
OpenSSL.EVP_CIPHER_CTX_free(_decryptCtx); | |||||
_decryptCtx = IntPtr.Zero; | |||||
} | |||||
_disposed = true; | |||||
} | |||||
} | |||||
#endregion | |||||
} | |||||
} |
@@ -1,5 +1,8 @@ | |||||
using System; | |||||
using Shadowsocks.Controller; | |||||
using Shadowsocks.Properties; | |||||
using System; | |||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.IO; | |||||
using System.Runtime.InteropServices; | using System.Runtime.InteropServices; | ||||
using System.Text; | using System.Text; | ||||
@@ -13,32 +16,50 @@ namespace Shadowsocks.Encrypt | |||||
public const int AES_ENCRYPT = 1; | public const int AES_ENCRYPT = 1; | ||||
public const int AES_DECRYPT = 0; | public const int AES_DECRYPT = 0; | ||||
static PolarSSL() | |||||
{ | |||||
string tempPath = Path.GetTempPath(); | |||||
string dllPath = tempPath + "/polarssl.dll"; | |||||
try | |||||
{ | |||||
FileManager.UncompressFile(dllPath, Resources.polarssl_dll); | |||||
} | |||||
catch (IOException e) | |||||
{ | |||||
Console.WriteLine(e.ToString()); | |||||
} | |||||
LoadLibrary(dllPath); | |||||
} | |||||
[DllImport("Kernel32.dll")] | |||||
private static extern IntPtr LoadLibrary(string path); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | ||||
public extern static void aes_init(byte[] ctx); | |||||
public extern static void aes_init(IntPtr ctx); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | ||||
public extern static void aes_free(byte[] ctx); | |||||
public extern static void aes_free(IntPtr ctx); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | ||||
public extern static int aes_setkey_enc(byte[] ctx, byte[] key, int keysize); | |||||
public extern static int aes_setkey_enc(IntPtr ctx, byte[] key, int keysize); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | [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 extern static int aes_crypt_cfb128(IntPtr ctx, int mode, int length, ref int iv_off, byte[] iv, byte[] input, byte[] output); | |||||
public const int ARC4_CTX_SIZE = 264; | public const int ARC4_CTX_SIZE = 264; | ||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | ||||
public extern static void arc4_init(byte[] ctx); | |||||
public extern static void arc4_init(IntPtr ctx); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | ||||
public extern static void arc4_free(byte[] ctx); | |||||
public extern static void arc4_free(IntPtr ctx); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | ||||
public extern static void arc4_setup(byte[] ctx, byte[] key, int keysize); | |||||
public extern static void arc4_setup(IntPtr ctx, byte[] key, int keysize); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | ||||
public extern static int arc4_crypt(byte[] ctx, int length, byte[] input, byte[] output); | |||||
public extern static int arc4_crypt(IntPtr ctx, int length, byte[] input, byte[] output); | |||||
public const int BLOWFISH_CTX_SIZE = 4168; | public const int BLOWFISH_CTX_SIZE = 4168; | ||||
@@ -46,16 +67,16 @@ namespace Shadowsocks.Encrypt | |||||
public const int BLOWFISH_DECRYPT = 0; | public const int BLOWFISH_DECRYPT = 0; | ||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | ||||
public extern static void blowfish_init(byte[] ctx); | |||||
public extern static void blowfish_init(IntPtr ctx); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | ||||
public extern static void blowfish_free(byte[] ctx); | |||||
public extern static void blowfish_free(IntPtr ctx); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | ||||
public extern static int blowfish_setkey(byte[] ctx, byte[] key, int keysize); | |||||
public extern static int blowfish_setkey(IntPtr ctx, byte[] key, int keysize); | |||||
[DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] | ||||
public extern static int blowfish_crypt_cfb64(byte[] ctx, int mode, int length, ref int iv_off, byte[] iv, byte[] input, byte[] output); | |||||
public extern static int blowfish_crypt_cfb64(IntPtr ctx, int mode, int length, ref int iv_off, byte[] iv, byte[] input, byte[] output); | |||||
} | } | ||||
} | } |
@@ -27,12 +27,12 @@ namespace Shadowsocks.Encrypt | |||||
private int _cipher; | private int _cipher; | ||||
private int[] _cipherInfo; | private int[] _cipherInfo; | ||||
private byte[] _key; | private byte[] _key; | ||||
private byte[] _encryptCtx; | |||||
private byte[] _decryptCtx; | |||||
private IntPtr _encryptCtx = IntPtr.Zero; | |||||
private IntPtr _decryptCtx = IntPtr.Zero; | |||||
private byte[] _encryptIV; | private byte[] _encryptIV; | ||||
private byte[] _decryptIV; | private byte[] _decryptIV; | ||||
private int _encryptIVOffset; | |||||
private int _decryptIVOffset; | |||||
private int _encryptIVOffset = 0; | |||||
private int _decryptIVOffset = 0; | |||||
private string _method; | private string _method; | ||||
private int keyLen; | private int keyLen; | ||||
private int ivLen; | private int ivLen; | ||||
@@ -100,63 +100,61 @@ namespace Shadowsocks.Encrypt | |||||
} | } | ||||
} | } | ||||
private void InitCipher(ref byte[] ctx, byte[] iv, bool isCipher) | |||||
private void InitCipher(ref IntPtr ctx, byte[] iv, bool isCipher) | |||||
{ | { | ||||
ctx = new byte[_cipherInfo[3]]; | |||||
lock (ctx) | |||||
ctx = Marshal.AllocHGlobal(_cipherInfo[3]); | |||||
byte[] realkey; | |||||
if (_method == "rc4-md5") | |||||
{ | { | ||||
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); | |||||
// PolarSSL takes key length by bit | |||||
// since we'll use CFB mode, here we both do enc, not dec | |||||
PolarSSL.aes_setkey_enc(ctx, realkey, keyLen * 8); | |||||
if (isCipher) | |||||
{ | { | ||||
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); | |||||
_encryptIV = new byte[ivLen]; | |||||
Array.Copy(iv, _encryptIV, ivLen); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
realkey = _key; | |||||
} | |||||
if (_cipher == CIPHER_AES) | |||||
{ | |||||
PolarSSL.aes_init(ctx); | |||||
// PolarSSL takes key length by bit | |||||
// since we'll use CFB mode, here we both do enc, not dec | |||||
PolarSSL.aes_setkey_enc(ctx, realkey, keyLen * 8); | |||||
if (isCipher) | |||||
{ | |||||
_encryptIV = new byte[ivLen]; | |||||
Array.Copy(iv, _encryptIV, ivLen); | |||||
} | |||||
else | |||||
{ | |||||
_decryptIV = new byte[ivLen]; | |||||
Array.Copy(iv, _decryptIV, ivLen); | |||||
} | |||||
_decryptIV = new byte[ivLen]; | |||||
Array.Copy(iv, _decryptIV, ivLen); | |||||
} | } | ||||
else if (_cipher == CIPHER_BF) | |||||
} | |||||
else if (_cipher == CIPHER_BF) | |||||
{ | |||||
PolarSSL.blowfish_init(ctx); | |||||
// PolarSSL takes key length by bit | |||||
PolarSSL.blowfish_setkey(ctx, realkey, keyLen * 8); | |||||
if (isCipher) | |||||
{ | { | ||||
PolarSSL.blowfish_init(ctx); | |||||
// PolarSSL takes key length by bit | |||||
PolarSSL.blowfish_setkey(ctx, realkey, keyLen * 8); | |||||
if (isCipher) | |||||
{ | |||||
_encryptIV = new byte[ivLen]; | |||||
Array.Copy(iv, _encryptIV, ivLen); | |||||
} | |||||
else | |||||
{ | |||||
_decryptIV = new byte[ivLen]; | |||||
Array.Copy(iv, _decryptIV, ivLen); | |||||
} | |||||
_encryptIV = new byte[ivLen]; | |||||
Array.Copy(iv, _encryptIV, ivLen); | |||||
} | } | ||||
else if (_cipher == CIPHER_RC4) | |||||
else | |||||
{ | { | ||||
PolarSSL.arc4_init(ctx); | |||||
PolarSSL.arc4_setup(ctx, realkey, keyLen); | |||||
_decryptIV = new byte[ivLen]; | |||||
Array.Copy(iv, _decryptIV, ivLen); | |||||
} | } | ||||
} | } | ||||
else if (_cipher == CIPHER_RC4) | |||||
{ | |||||
PolarSSL.arc4_init(ctx); | |||||
// PolarSSL RC4 takes key length by byte | |||||
PolarSSL.arc4_setup(ctx, realkey, keyLen); | |||||
} | |||||
} | } | ||||
@@ -165,7 +163,7 @@ namespace Shadowsocks.Encrypt | |||||
public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength) | public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength) | ||||
{ | { | ||||
if (_encryptCtx == null) | |||||
if (_encryptCtx == IntPtr.Zero) | |||||
{ | { | ||||
randBytes(outbuf, ivLen); | randBytes(outbuf, ivLen); | ||||
InitCipher(ref _encryptCtx, outbuf, true); | InitCipher(ref _encryptCtx, outbuf, true); | ||||
@@ -173,34 +171,6 @@ namespace Shadowsocks.Encrypt | |||||
lock (tempbuf) | lock (tempbuf) | ||||
{ | { | ||||
// C# could be multi-threaded | // C# could be multi-threaded | ||||
lock (_encryptCtx) | |||||
{ | |||||
if (_disposed) | |||||
{ | |||||
throw new ObjectDisposedException(this.ToString()); | |||||
} | |||||
switch (_cipher) | |||||
{ | |||||
case CIPHER_AES: | |||||
PolarSSL.aes_crypt_cfb128(_encryptCtx, PolarSSL.AES_ENCRYPT, length, ref _encryptIVOffset, _encryptIV, buf, tempbuf); | |||||
break; | |||||
case CIPHER_BF: | |||||
PolarSSL.blowfish_crypt_cfb64(_encryptCtx, PolarSSL.BLOWFISH_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; | |||||
lock (_encryptCtx) | |||||
{ | |||||
if (_disposed) | if (_disposed) | ||||
{ | { | ||||
throw new ObjectDisposedException(this.ToString()); | throw new ObjectDisposedException(this.ToString()); | ||||
@@ -208,22 +178,45 @@ namespace Shadowsocks.Encrypt | |||||
switch (_cipher) | switch (_cipher) | ||||
{ | { | ||||
case CIPHER_AES: | case CIPHER_AES: | ||||
PolarSSL.aes_crypt_cfb128(_encryptCtx, PolarSSL.AES_ENCRYPT, length, ref _encryptIVOffset, _encryptIV, buf, outbuf); | |||||
PolarSSL.aes_crypt_cfb128(_encryptCtx, PolarSSL.AES_ENCRYPT, length, ref _encryptIVOffset, _encryptIV, buf, tempbuf); | |||||
break; | break; | ||||
case CIPHER_BF: | case CIPHER_BF: | ||||
PolarSSL.blowfish_crypt_cfb64(_encryptCtx, PolarSSL.BLOWFISH_ENCRYPT, length, ref _encryptIVOffset, _encryptIV, buf, outbuf); | |||||
PolarSSL.blowfish_crypt_cfb64(_encryptCtx, PolarSSL.BLOWFISH_ENCRYPT, length, ref _encryptIVOffset, _encryptIV, buf, tempbuf); | |||||
break; | break; | ||||
case CIPHER_RC4: | case CIPHER_RC4: | ||||
PolarSSL.arc4_crypt(_encryptCtx, length, buf, outbuf); | |||||
PolarSSL.arc4_crypt(_encryptCtx, length, buf, tempbuf); | |||||
break; | break; | ||||
} | } | ||||
outlength = length + ivLen; | |||||
Buffer.BlockCopy(tempbuf, 0, outbuf, ivLen, length); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
outlength = length; | |||||
if (_disposed) | |||||
{ | |||||
throw new ObjectDisposedException(this.ToString()); | |||||
} | |||||
switch (_cipher) | |||||
{ | |||||
case CIPHER_AES: | |||||
PolarSSL.aes_crypt_cfb128(_encryptCtx, PolarSSL.AES_ENCRYPT, length, ref _encryptIVOffset, _encryptIV, buf, outbuf); | |||||
break; | |||||
case CIPHER_BF: | |||||
PolarSSL.blowfish_crypt_cfb64(_encryptCtx, PolarSSL.BLOWFISH_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) | public override void Decrypt(byte[] buf, int length, byte[] outbuf, out int outlength) | ||||
{ | { | ||||
if (_decryptCtx == null) | |||||
if (_decryptCtx == IntPtr.Zero) | |||||
{ | { | ||||
InitCipher(ref _decryptCtx, buf, false); | InitCipher(ref _decryptCtx, buf, false); | ||||
outlength = length - ivLen; | outlength = length - ivLen; | ||||
@@ -231,32 +224,6 @@ namespace Shadowsocks.Encrypt | |||||
{ | { | ||||
// C# could be multi-threaded | // C# could be multi-threaded | ||||
Buffer.BlockCopy(buf, ivLen, tempbuf, 0, length - ivLen); | Buffer.BlockCopy(buf, ivLen, tempbuf, 0, length - ivLen); | ||||
lock (_decryptCtx) | |||||
{ | |||||
if (_disposed) | |||||
{ | |||||
throw new ObjectDisposedException(this.ToString()); | |||||
} | |||||
switch (_cipher) | |||||
{ | |||||
case CIPHER_AES: | |||||
PolarSSL.aes_crypt_cfb128(_decryptCtx, PolarSSL.AES_DECRYPT, length - ivLen, ref _decryptIVOffset, _decryptIV, tempbuf, outbuf); | |||||
break; | |||||
case CIPHER_BF: | |||||
PolarSSL.blowfish_crypt_cfb64(_decryptCtx, PolarSSL.BLOWFISH_DECRYPT, length - ivLen, ref _decryptIVOffset, _decryptIV, tempbuf, outbuf); | |||||
break; | |||||
case CIPHER_RC4: | |||||
PolarSSL.arc4_crypt(_decryptCtx, length - ivLen, tempbuf, outbuf); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
outlength = length; | |||||
lock (_decryptCtx) | |||||
{ | |||||
if (_disposed) | if (_disposed) | ||||
{ | { | ||||
throw new ObjectDisposedException(this.ToString()); | throw new ObjectDisposedException(this.ToString()); | ||||
@@ -264,17 +231,37 @@ namespace Shadowsocks.Encrypt | |||||
switch (_cipher) | switch (_cipher) | ||||
{ | { | ||||
case CIPHER_AES: | case CIPHER_AES: | ||||
PolarSSL.aes_crypt_cfb128(_decryptCtx, PolarSSL.AES_DECRYPT, length, ref _decryptIVOffset, _decryptIV, buf, outbuf); | |||||
PolarSSL.aes_crypt_cfb128(_decryptCtx, PolarSSL.AES_DECRYPT, length - ivLen, ref _decryptIVOffset, _decryptIV, tempbuf, outbuf); | |||||
break; | break; | ||||
case CIPHER_BF: | case CIPHER_BF: | ||||
PolarSSL.blowfish_crypt_cfb64(_decryptCtx, PolarSSL.BLOWFISH_DECRYPT, length, ref _decryptIVOffset, _decryptIV, buf, outbuf); | |||||
PolarSSL.blowfish_crypt_cfb64(_decryptCtx, PolarSSL.BLOWFISH_DECRYPT, length - ivLen, ref _decryptIVOffset, _decryptIV, tempbuf, outbuf); | |||||
break; | break; | ||||
case CIPHER_RC4: | case CIPHER_RC4: | ||||
PolarSSL.arc4_crypt(_decryptCtx, length, buf, outbuf); | |||||
PolarSSL.arc4_crypt(_decryptCtx, length - ivLen, tempbuf, outbuf); | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
else | |||||
{ | |||||
outlength = length; | |||||
if (_disposed) | |||||
{ | |||||
throw new ObjectDisposedException(this.ToString()); | |||||
} | |||||
switch (_cipher) | |||||
{ | |||||
case CIPHER_AES: | |||||
PolarSSL.aes_crypt_cfb128(_decryptCtx, PolarSSL.AES_DECRYPT, length, ref _decryptIVOffset, _decryptIV, buf, outbuf); | |||||
break; | |||||
case CIPHER_BF: | |||||
PolarSSL.blowfish_crypt_cfb64(_decryptCtx, PolarSSL.BLOWFISH_DECRYPT, length, ref _decryptIVOffset, _decryptIV, buf, outbuf); | |||||
break; | |||||
case CIPHER_RC4: | |||||
PolarSSL.arc4_crypt(_decryptCtx, length, buf, outbuf); | |||||
break; | |||||
} | |||||
} | |||||
} | } | ||||
#region IDisposable | #region IDisposable | ||||
@@ -304,41 +291,39 @@ namespace Shadowsocks.Encrypt | |||||
if (disposing) | if (disposing) | ||||
{ | { | ||||
if (_encryptCtx != null) | |||||
if (_encryptCtx != IntPtr.Zero) | |||||
{ | { | ||||
lock (_encryptCtx) | |||||
switch (_cipher) | |||||
{ | { | ||||
switch (_cipher) | |||||
{ | |||||
case CIPHER_AES: | |||||
PolarSSL.aes_free(_encryptCtx); | |||||
break; | |||||
case CIPHER_BF: | |||||
PolarSSL.blowfish_free(_encryptCtx); | |||||
break; | |||||
case CIPHER_RC4: | |||||
PolarSSL.arc4_free(_encryptCtx); | |||||
break; | |||||
} | |||||
case CIPHER_AES: | |||||
PolarSSL.aes_free(_encryptCtx); | |||||
break; | |||||
case CIPHER_BF: | |||||
PolarSSL.blowfish_free(_encryptCtx); | |||||
break; | |||||
case CIPHER_RC4: | |||||
PolarSSL.arc4_free(_encryptCtx); | |||||
break; | |||||
} | } | ||||
Marshal.FreeHGlobal(_encryptCtx); | |||||
_encryptCtx = IntPtr.Zero; | |||||
} | } | ||||
if (_decryptCtx != null) | |||||
if (_decryptCtx != IntPtr.Zero) | |||||
{ | { | ||||
lock (_decryptCtx) | |||||
switch (_cipher) | |||||
{ | { | ||||
switch (_cipher) | |||||
{ | |||||
case CIPHER_AES: | |||||
PolarSSL.aes_free(_decryptCtx); | |||||
break; | |||||
case CIPHER_BF: | |||||
PolarSSL.blowfish_free(_decryptCtx); | |||||
break; | |||||
case CIPHER_RC4: | |||||
PolarSSL.arc4_free(_decryptCtx); | |||||
break; | |||||
} | |||||
case CIPHER_AES: | |||||
PolarSSL.aes_free(_decryptCtx); | |||||
break; | |||||
case CIPHER_BF: | |||||
PolarSSL.blowfish_free(_decryptCtx); | |||||
break; | |||||
case CIPHER_RC4: | |||||
PolarSSL.arc4_free(_decryptCtx); | |||||
break; | |||||
} | } | ||||
Marshal.FreeHGlobal(_decryptCtx); | |||||
_decryptCtx = IntPtr.Zero; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -2,16 +2,13 @@ | |||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.IO; | using System.IO; | ||||
using System.Text; | using System.Text; | ||||
using System.Windows.Forms; | |||||
namespace Shadowsocks.Model | namespace Shadowsocks.Model | ||||
{ | { | ||||
[Serializable] | [Serializable] | ||||
public class Configuration | public class Configuration | ||||
{ | { | ||||
public Configuration() | |||||
{ | |||||
} | |||||
public List<Server> configs; | public List<Server> configs; | ||||
public int index; | public int index; | ||||
public bool enabled; | public bool enabled; | ||||
@@ -5,8 +5,6 @@ using System; | |||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Diagnostics; | using System.Diagnostics; | ||||
using System.IO; | using System.IO; | ||||
using System.Reflection; | |||||
using System.Runtime.InteropServices; | |||||
using System.Threading; | using System.Threading; | ||||
using System.Windows.Forms; | using System.Windows.Forms; | ||||
@@ -14,8 +12,6 @@ namespace Shadowsocks | |||||
{ | { | ||||
static class Program | static class Program | ||||
{ | { | ||||
[DllImport("Kernel32.dll")] | |||||
private static extern IntPtr LoadLibrary(string path); | |||||
/// <summary> | /// <summary> | ||||
/// 应用程序的主入口点。 | /// 应用程序的主入口点。 | ||||
@@ -35,18 +31,7 @@ namespace Shadowsocks | |||||
MessageBox.Show("Shadowsocks is already running.\n\nFind Shadowsocks icon in your notify tray."); | MessageBox.Show("Shadowsocks is already running.\n\nFind Shadowsocks icon in your notify tray."); | ||||
return; | return; | ||||
} | } | ||||
string tempPath = Path.GetTempPath(); | |||||
string dllPath = tempPath + "/libeay32.dll"; | |||||
try | |||||
{ | |||||
FileManager.UncompressFile(dllPath, Resources.libeay32_dll); | |||||
} | |||||
catch (IOException e) | |||||
{ | |||||
Console.WriteLine(e.ToString()); | |||||
} | |||||
LoadLibrary(dllPath); | |||||
Directory.SetCurrentDirectory(Application.StartupPath); | |||||
#if !DEBUG | #if !DEBUG | ||||
Logging.OpenLogFile(); | Logging.OpenLogFile(); | ||||
#endif | #endif | ||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices; | |||||
// 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值, | // 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值, | ||||
// 方法是按如下所示使用“*”: | // 方法是按如下所示使用“*”: | ||||
// [assembly: AssemblyVersion("1.0.*")] | // [assembly: AssemblyVersion("1.0.*")] | ||||
[assembly: AssemblyVersion("2.0.7")] | |||||
[assembly: AssemblyVersion("2.0.9")] | |||||
// [assembly: AssemblyFileVersion("2.0.0")] | // [assembly: AssemblyFileVersion("2.0.0")] |
@@ -63,16 +63,6 @@ namespace Shadowsocks.Properties { | |||||
/// <summary> | /// <summary> | ||||
/// Looks up a localized resource of type System.Byte[]. | /// Looks up a localized resource of type System.Byte[]. | ||||
/// </summary> | /// </summary> | ||||
internal static byte[] libeay32_dll { | |||||
get { | |||||
object obj = ResourceManager.GetObject("libeay32_dll", resourceCulture); | |||||
return ((byte[])(obj)); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Looks up a localized resource of type System.Byte[]. | |||||
/// </summary> | |||||
internal static byte[] polarssl_dll { | internal static byte[] polarssl_dll { | ||||
get { | get { | ||||
object obj = ResourceManager.GetObject("polarssl_dll", resourceCulture); | object obj = ResourceManager.GetObject("polarssl_dll", resourceCulture); | ||||
@@ -118,9 +118,6 @@ | |||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||||
</resheader> | </resheader> | ||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> | <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> | ||||
<data name="libeay32_dll" type="System.Resources.ResXFileRef, System.Windows.Forms"> | |||||
<value>..\Data\libeay32.dll.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | |||||
</data> | |||||
<data name="polarssl_dll" type="System.Resources.ResXFileRef, System.Windows.Forms"> | <data name="polarssl_dll" type="System.Resources.ResXFileRef, System.Windows.Forms"> | ||||
<value>..\Data\polarssl.dll.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | <value>..\Data\polarssl.dll.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||||
</data> | </data> | ||||
@@ -49,6 +49,7 @@ | |||||
this.panel1 = new System.Windows.Forms.Panel(); | this.panel1 = new System.Windows.Forms.Panel(); | ||||
this.contextMenu1 = new System.Windows.Forms.ContextMenu(); | this.contextMenu1 = new System.Windows.Forms.ContextMenu(); | ||||
this.enableItem = new System.Windows.Forms.MenuItem(); | this.enableItem = new System.Windows.Forms.MenuItem(); | ||||
this.AutoStartupItem = new System.Windows.Forms.MenuItem(); | |||||
this.ShareOverLANItem = new System.Windows.Forms.MenuItem(); | this.ShareOverLANItem = new System.Windows.Forms.MenuItem(); | ||||
this.ServersItem = new System.Windows.Forms.MenuItem(); | this.ServersItem = new System.Windows.Forms.MenuItem(); | ||||
this.SeperatorItem = new System.Windows.Forms.MenuItem(); | this.SeperatorItem = new System.Windows.Forms.MenuItem(); | ||||
@@ -65,6 +66,7 @@ | |||||
this.AddButton = new System.Windows.Forms.Button(); | this.AddButton = new System.Windows.Forms.Button(); | ||||
this.ServerGroupBox = new System.Windows.Forms.GroupBox(); | this.ServerGroupBox = new System.Windows.Forms.GroupBox(); | ||||
this.ServersListBox = new System.Windows.Forms.ListBox(); | this.ServersListBox = new System.Windows.Forms.ListBox(); | ||||
this.menuItem1 = new System.Windows.Forms.MenuItem(); | |||||
this.tableLayoutPanel1.SuspendLayout(); | this.tableLayoutPanel1.SuspendLayout(); | ||||
this.panel1.SuspendLayout(); | this.panel1.SuspendLayout(); | ||||
this.panel3.SuspendLayout(); | this.panel3.SuspendLayout(); | ||||
@@ -90,10 +92,10 @@ | |||||
this.tableLayoutPanel1.Controls.Add(this.PasswordTextBox, 1, 2); | this.tableLayoutPanel1.Controls.Add(this.PasswordTextBox, 1, 2); | ||||
this.tableLayoutPanel1.Controls.Add(this.label5, 0, 3); | this.tableLayoutPanel1.Controls.Add(this.label5, 0, 3); | ||||
this.tableLayoutPanel1.Controls.Add(this.EncryptionSelect, 1, 3); | this.tableLayoutPanel1.Controls.Add(this.EncryptionSelect, 1, 3); | ||||
this.tableLayoutPanel1.Location = new System.Drawing.Point(12, 31); | |||||
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(7, 7, 7, 7); | |||||
this.tableLayoutPanel1.Location = new System.Drawing.Point(8, 21); | |||||
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); | |||||
this.tableLayoutPanel1.Name = "tableLayoutPanel1"; | this.tableLayoutPanel1.Name = "tableLayoutPanel1"; | ||||
this.tableLayoutPanel1.Padding = new System.Windows.Forms.Padding(7, 7, 7, 7); | |||||
this.tableLayoutPanel1.Padding = new System.Windows.Forms.Padding(5, 5, 5, 5); | |||||
this.tableLayoutPanel1.RowCount = 6; | this.tableLayoutPanel1.RowCount = 6; | ||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); | this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); | ||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); | this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); | ||||
@@ -101,16 +103,15 @@ | |||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); | this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); | ||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); | this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); | ||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); | this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); | ||||
this.tableLayoutPanel1.Size = new System.Drawing.Size(360, 232); | |||||
this.tableLayoutPanel1.Size = new System.Drawing.Size(242, 167); | |||||
this.tableLayoutPanel1.TabIndex = 0; | this.tableLayoutPanel1.TabIndex = 0; | ||||
// | // | ||||
// RemarksTextBox | // RemarksTextBox | ||||
// | // | ||||
this.RemarksTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | this.RemarksTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | ||||
this.RemarksTextBox.Location = new System.Drawing.Point(110, 194); | |||||
this.RemarksTextBox.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); | |||||
this.RemarksTextBox.Location = new System.Drawing.Point(74, 139); | |||||
this.RemarksTextBox.Name = "RemarksTextBox"; | this.RemarksTextBox.Name = "RemarksTextBox"; | ||||
this.RemarksTextBox.Size = new System.Drawing.Size(238, 26); | |||||
this.RemarksTextBox.Size = new System.Drawing.Size(160, 20); | |||||
this.RemarksTextBox.TabIndex = 10; | this.RemarksTextBox.TabIndex = 10; | ||||
this.RemarksTextBox.WordWrap = false; | this.RemarksTextBox.WordWrap = false; | ||||
// | // | ||||
@@ -118,10 +119,9 @@ | |||||
// | // | ||||
this.label6.Anchor = System.Windows.Forms.AnchorStyles.Right; | this.label6.Anchor = System.Windows.Forms.AnchorStyles.Right; | ||||
this.label6.AutoSize = true; | this.label6.AutoSize = true; | ||||
this.label6.Location = new System.Drawing.Point(27, 197); | |||||
this.label6.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); | |||||
this.label6.Location = new System.Drawing.Point(19, 142); | |||||
this.label6.Name = "label6"; | this.label6.Name = "label6"; | ||||
this.label6.Size = new System.Drawing.Size(73, 20); | |||||
this.label6.Size = new System.Drawing.Size(49, 13); | |||||
this.label6.TabIndex = 9; | this.label6.TabIndex = 9; | ||||
this.label6.Text = "Remarks"; | this.label6.Text = "Remarks"; | ||||
// | // | ||||
@@ -129,10 +129,9 @@ | |||||
// | // | ||||
this.label1.Anchor = System.Windows.Forms.AnchorStyles.Right; | this.label1.Anchor = System.Windows.Forms.AnchorStyles.Right; | ||||
this.label1.AutoSize = true; | this.label1.AutoSize = true; | ||||
this.label1.Location = new System.Drawing.Point(26, 15); | |||||
this.label1.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); | |||||
this.label1.Location = new System.Drawing.Point(17, 11); | |||||
this.label1.Name = "label1"; | this.label1.Name = "label1"; | ||||
this.label1.Size = new System.Drawing.Size(74, 20); | |||||
this.label1.Size = new System.Drawing.Size(51, 13); | |||||
this.label1.TabIndex = 0; | this.label1.TabIndex = 0; | ||||
this.label1.Text = "Server IP"; | this.label1.Text = "Server IP"; | ||||
// | // | ||||
@@ -140,20 +139,18 @@ | |||||
// | // | ||||
this.label2.Anchor = System.Windows.Forms.AnchorStyles.Right; | this.label2.Anchor = System.Windows.Forms.AnchorStyles.Right; | ||||
this.label2.AutoSize = true; | this.label2.AutoSize = true; | ||||
this.label2.Location = new System.Drawing.Point(12, 51); | |||||
this.label2.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); | |||||
this.label2.Location = new System.Drawing.Point(8, 37); | |||||
this.label2.Name = "label2"; | this.label2.Name = "label2"; | ||||
this.label2.Size = new System.Drawing.Size(88, 20); | |||||
this.label2.Size = new System.Drawing.Size(60, 13); | |||||
this.label2.TabIndex = 1; | this.label2.TabIndex = 1; | ||||
this.label2.Text = "Server Port"; | this.label2.Text = "Server Port"; | ||||
// | // | ||||
// ProxyPortTextBox | // ProxyPortTextBox | ||||
// | // | ||||
this.ProxyPortTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | this.ProxyPortTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | ||||
this.ProxyPortTextBox.Location = new System.Drawing.Point(110, 158); | |||||
this.ProxyPortTextBox.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); | |||||
this.ProxyPortTextBox.Location = new System.Drawing.Point(74, 113); | |||||
this.ProxyPortTextBox.Name = "ProxyPortTextBox"; | this.ProxyPortTextBox.Name = "ProxyPortTextBox"; | ||||
this.ProxyPortTextBox.Size = new System.Drawing.Size(238, 26); | |||||
this.ProxyPortTextBox.Size = new System.Drawing.Size(160, 20); | |||||
this.ProxyPortTextBox.TabIndex = 4; | this.ProxyPortTextBox.TabIndex = 4; | ||||
this.ProxyPortTextBox.WordWrap = false; | this.ProxyPortTextBox.WordWrap = false; | ||||
// | // | ||||
@@ -161,10 +158,9 @@ | |||||
// | // | ||||
this.label4.Anchor = System.Windows.Forms.AnchorStyles.Right; | this.label4.Anchor = System.Windows.Forms.AnchorStyles.Right; | ||||
this.label4.AutoSize = true; | this.label4.AutoSize = true; | ||||
this.label4.Location = new System.Drawing.Point(20, 161); | |||||
this.label4.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); | |||||
this.label4.Location = new System.Drawing.Point(13, 116); | |||||
this.label4.Name = "label4"; | this.label4.Name = "label4"; | ||||
this.label4.Size = new System.Drawing.Size(80, 20); | |||||
this.label4.Size = new System.Drawing.Size(55, 13); | |||||
this.label4.TabIndex = 3; | this.label4.TabIndex = 3; | ||||
this.label4.Text = "Proxy Port"; | this.label4.Text = "Proxy Port"; | ||||
// | // | ||||
@@ -172,41 +168,37 @@ | |||||
// | // | ||||
this.label3.Anchor = System.Windows.Forms.AnchorStyles.Right; | this.label3.Anchor = System.Windows.Forms.AnchorStyles.Right; | ||||
this.label3.AutoSize = true; | this.label3.AutoSize = true; | ||||
this.label3.Location = new System.Drawing.Point(22, 87); | |||||
this.label3.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); | |||||
this.label3.Location = new System.Drawing.Point(15, 63); | |||||
this.label3.Name = "label3"; | this.label3.Name = "label3"; | ||||
this.label3.Size = new System.Drawing.Size(78, 20); | |||||
this.label3.Size = new System.Drawing.Size(53, 13); | |||||
this.label3.TabIndex = 2; | this.label3.TabIndex = 2; | ||||
this.label3.Text = "Password"; | this.label3.Text = "Password"; | ||||
// | // | ||||
// IPTextBox | // IPTextBox | ||||
// | // | ||||
this.IPTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | this.IPTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | ||||
this.IPTextBox.Location = new System.Drawing.Point(110, 12); | |||||
this.IPTextBox.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); | |||||
this.IPTextBox.Location = new System.Drawing.Point(74, 8); | |||||
this.IPTextBox.Name = "IPTextBox"; | this.IPTextBox.Name = "IPTextBox"; | ||||
this.IPTextBox.Size = new System.Drawing.Size(238, 26); | |||||
this.IPTextBox.Size = new System.Drawing.Size(160, 20); | |||||
this.IPTextBox.TabIndex = 0; | this.IPTextBox.TabIndex = 0; | ||||
this.IPTextBox.WordWrap = false; | this.IPTextBox.WordWrap = false; | ||||
// | // | ||||
// ServerPortTextBox | // ServerPortTextBox | ||||
// | // | ||||
this.ServerPortTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | this.ServerPortTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | ||||
this.ServerPortTextBox.Location = new System.Drawing.Point(110, 48); | |||||
this.ServerPortTextBox.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); | |||||
this.ServerPortTextBox.Location = new System.Drawing.Point(74, 34); | |||||
this.ServerPortTextBox.Name = "ServerPortTextBox"; | this.ServerPortTextBox.Name = "ServerPortTextBox"; | ||||
this.ServerPortTextBox.Size = new System.Drawing.Size(238, 26); | |||||
this.ServerPortTextBox.Size = new System.Drawing.Size(160, 20); | |||||
this.ServerPortTextBox.TabIndex = 1; | this.ServerPortTextBox.TabIndex = 1; | ||||
this.ServerPortTextBox.WordWrap = false; | this.ServerPortTextBox.WordWrap = false; | ||||
// | // | ||||
// PasswordTextBox | // PasswordTextBox | ||||
// | // | ||||
this.PasswordTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | this.PasswordTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); | ||||
this.PasswordTextBox.Location = new System.Drawing.Point(110, 84); | |||||
this.PasswordTextBox.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); | |||||
this.PasswordTextBox.Location = new System.Drawing.Point(74, 60); | |||||
this.PasswordTextBox.Name = "PasswordTextBox"; | this.PasswordTextBox.Name = "PasswordTextBox"; | ||||
this.PasswordTextBox.PasswordChar = '*'; | this.PasswordTextBox.PasswordChar = '*'; | ||||
this.PasswordTextBox.Size = new System.Drawing.Size(238, 26); | |||||
this.PasswordTextBox.Size = new System.Drawing.Size(160, 20); | |||||
this.PasswordTextBox.TabIndex = 2; | this.PasswordTextBox.TabIndex = 2; | ||||
this.PasswordTextBox.WordWrap = false; | this.PasswordTextBox.WordWrap = false; | ||||
// | // | ||||
@@ -214,10 +206,9 @@ | |||||
// | // | ||||
this.label5.Anchor = System.Windows.Forms.AnchorStyles.Right; | this.label5.Anchor = System.Windows.Forms.AnchorStyles.Right; | ||||
this.label5.AutoSize = true; | this.label5.AutoSize = true; | ||||
this.label5.Location = new System.Drawing.Point(16, 124); | |||||
this.label5.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0); | |||||
this.label5.Location = new System.Drawing.Point(11, 90); | |||||
this.label5.Name = "label5"; | this.label5.Name = "label5"; | ||||
this.label5.Size = new System.Drawing.Size(84, 20); | |||||
this.label5.Size = new System.Drawing.Size(57, 13); | |||||
this.label5.TabIndex = 8; | this.label5.TabIndex = 8; | ||||
this.label5.Text = "Encryption"; | this.label5.Text = "Encryption"; | ||||
// | // | ||||
@@ -228,7 +219,7 @@ | |||||
this.EncryptionSelect.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; | this.EncryptionSelect.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; | ||||
this.EncryptionSelect.FormattingEnabled = true; | this.EncryptionSelect.FormattingEnabled = true; | ||||
this.EncryptionSelect.ImeMode = System.Windows.Forms.ImeMode.NoControl; | this.EncryptionSelect.ImeMode = System.Windows.Forms.ImeMode.NoControl; | ||||
this.EncryptionSelect.ItemHeight = 20; | |||||
this.EncryptionSelect.ItemHeight = 13; | |||||
this.EncryptionSelect.Items.AddRange(new object[] { | this.EncryptionSelect.Items.AddRange(new object[] { | ||||
"table", | "table", | ||||
"rc4-md5", | "rc4-md5", | ||||
@@ -237,10 +228,9 @@ | |||||
"aes-128-cfb", | "aes-128-cfb", | ||||
"bf-cfb", | "bf-cfb", | ||||
"rc4"}); | "rc4"}); | ||||
this.EncryptionSelect.Location = new System.Drawing.Point(110, 120); | |||||
this.EncryptionSelect.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); | |||||
this.EncryptionSelect.Location = new System.Drawing.Point(74, 86); | |||||
this.EncryptionSelect.Name = "EncryptionSelect"; | this.EncryptionSelect.Name = "EncryptionSelect"; | ||||
this.EncryptionSelect.Size = new System.Drawing.Size(238, 28); | |||||
this.EncryptionSelect.Size = new System.Drawing.Size(160, 21); | |||||
this.EncryptionSelect.TabIndex = 3; | this.EncryptionSelect.TabIndex = 3; | ||||
// | // | ||||
// notifyIcon1 | // notifyIcon1 | ||||
@@ -253,8 +243,7 @@ | |||||
this.panel2.Anchor = System.Windows.Forms.AnchorStyles.Top; | this.panel2.Anchor = System.Windows.Forms.AnchorStyles.Top; | ||||
this.panel2.AutoSize = true; | this.panel2.AutoSize = true; | ||||
this.panel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; | this.panel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; | ||||
this.panel2.Location = new System.Drawing.Point(246, 263); | |||||
this.panel2.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); | |||||
this.panel2.Location = new System.Drawing.Point(164, 175); | |||||
this.panel2.Name = "panel2"; | this.panel2.Name = "panel2"; | ||||
this.panel2.Size = new System.Drawing.Size(0, 0); | this.panel2.Size = new System.Drawing.Size(0, 0); | ||||
this.panel2.TabIndex = 1; | this.panel2.TabIndex = 1; | ||||
@@ -262,10 +251,9 @@ | |||||
// OKButton | // OKButton | ||||
// | // | ||||
this.OKButton.DialogResult = System.Windows.Forms.DialogResult.OK; | this.OKButton.DialogResult = System.Windows.Forms.DialogResult.OK; | ||||
this.OKButton.Location = new System.Drawing.Point(6, 6); | |||||
this.OKButton.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); | |||||
this.OKButton.Location = new System.Drawing.Point(4, 4); | |||||
this.OKButton.Name = "OKButton"; | this.OKButton.Name = "OKButton"; | ||||
this.OKButton.Size = new System.Drawing.Size(113, 35); | |||||
this.OKButton.Size = new System.Drawing.Size(75, 23); | |||||
this.OKButton.TabIndex = 8; | this.OKButton.TabIndex = 8; | ||||
this.OKButton.Text = "OK"; | this.OKButton.Text = "OK"; | ||||
this.OKButton.UseVisualStyleBackColor = true; | this.OKButton.UseVisualStyleBackColor = true; | ||||
@@ -274,10 +262,9 @@ | |||||
// MyCancelButton | // MyCancelButton | ||||
// | // | ||||
this.MyCancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; | this.MyCancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; | ||||
this.MyCancelButton.Location = new System.Drawing.Point(130, 6); | |||||
this.MyCancelButton.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); | |||||
this.MyCancelButton.Location = new System.Drawing.Point(87, 4); | |||||
this.MyCancelButton.Name = "MyCancelButton"; | this.MyCancelButton.Name = "MyCancelButton"; | ||||
this.MyCancelButton.Size = new System.Drawing.Size(113, 35); | |||||
this.MyCancelButton.Size = new System.Drawing.Size(75, 23); | |||||
this.MyCancelButton.TabIndex = 9; | this.MyCancelButton.TabIndex = 9; | ||||
this.MyCancelButton.Text = "Cancel"; | this.MyCancelButton.Text = "Cancel"; | ||||
this.MyCancelButton.UseVisualStyleBackColor = true; | this.MyCancelButton.UseVisualStyleBackColor = true; | ||||
@@ -289,20 +276,22 @@ | |||||
this.panel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; | this.panel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; | ||||
this.panel1.Controls.Add(this.MyCancelButton); | this.panel1.Controls.Add(this.MyCancelButton); | ||||
this.panel1.Controls.Add(this.OKButton); | this.panel1.Controls.Add(this.OKButton); | ||||
this.panel1.Location = new System.Drawing.Point(469, 371); | |||||
this.panel1.Location = new System.Drawing.Point(313, 247); | |||||
this.panel1.Margin = new System.Windows.Forms.Padding(0); | this.panel1.Margin = new System.Windows.Forms.Padding(0); | ||||
this.panel1.Name = "panel1"; | this.panel1.Name = "panel1"; | ||||
this.panel1.Size = new System.Drawing.Size(248, 46); | |||||
this.panel1.Size = new System.Drawing.Size(165, 30); | |||||
this.panel1.TabIndex = 1; | this.panel1.TabIndex = 1; | ||||
// | // | ||||
// contextMenu1 | // contextMenu1 | ||||
// | // | ||||
this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { | this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { | ||||
this.enableItem, | this.enableItem, | ||||
this.ShareOverLANItem, | |||||
this.ServersItem, | this.ServersItem, | ||||
this.menuItem4, | |||||
this.menuItem1, | |||||
this.AutoStartupItem, | |||||
this.ShareOverLANItem, | |||||
this.editPACFileItem, | this.editPACFileItem, | ||||
this.menuItem4, | |||||
this.QRCodeItem, | this.QRCodeItem, | ||||
this.ShowLogItem, | this.ShowLogItem, | ||||
this.aboutItem, | this.aboutItem, | ||||
@@ -315,15 +304,21 @@ | |||||
this.enableItem.Text = "&Enable"; | this.enableItem.Text = "&Enable"; | ||||
this.enableItem.Click += new System.EventHandler(this.EnableItem_Click); | this.enableItem.Click += new System.EventHandler(this.EnableItem_Click); | ||||
// | // | ||||
// AutoStartupItem | |||||
// | |||||
this.AutoStartupItem.Index = 3; | |||||
this.AutoStartupItem.Text = "Start on Boot"; | |||||
this.AutoStartupItem.Click += new System.EventHandler(this.AutoStartupItem_Click); | |||||
// | |||||
// ShareOverLANItem | // ShareOverLANItem | ||||
// | // | ||||
this.ShareOverLANItem.Index = 1; | |||||
this.ShareOverLANItem.Index = 4; | |||||
this.ShareOverLANItem.Text = "Share over LAN"; | this.ShareOverLANItem.Text = "Share over LAN"; | ||||
this.ShareOverLANItem.Click += new System.EventHandler(this.ShareOverLANItem_Click); | this.ShareOverLANItem.Click += new System.EventHandler(this.ShareOverLANItem_Click); | ||||
// | // | ||||
// ServersItem | // ServersItem | ||||
// | // | ||||
this.ServersItem.Index = 2; | |||||
this.ServersItem.Index = 1; | |||||
this.ServersItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { | this.ServersItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { | ||||
this.SeperatorItem, | this.SeperatorItem, | ||||
this.ConfigItem}); | this.ConfigItem}); | ||||
@@ -342,41 +337,41 @@ | |||||
// | // | ||||
// menuItem4 | // menuItem4 | ||||
// | // | ||||
this.menuItem4.Index = 3; | |||||
this.menuItem4.Index = 6; | |||||
this.menuItem4.Text = "-"; | this.menuItem4.Text = "-"; | ||||
// | // | ||||
// editPACFileItem | // editPACFileItem | ||||
// | // | ||||
this.editPACFileItem.Index = 4; | |||||
this.editPACFileItem.Index = 5; | |||||
this.editPACFileItem.Text = "Edit &PAC File..."; | this.editPACFileItem.Text = "Edit &PAC File..."; | ||||
this.editPACFileItem.Click += new System.EventHandler(this.EditPACFileItem_Click); | this.editPACFileItem.Click += new System.EventHandler(this.EditPACFileItem_Click); | ||||
// | // | ||||
// QRCodeItem | // QRCodeItem | ||||
// | // | ||||
this.QRCodeItem.Index = 5; | |||||
this.QRCodeItem.Index = 7; | |||||
this.QRCodeItem.Text = "Show &QRCode..."; | this.QRCodeItem.Text = "Show &QRCode..."; | ||||
this.QRCodeItem.Click += new System.EventHandler(this.QRCodeItem_Click); | this.QRCodeItem.Click += new System.EventHandler(this.QRCodeItem_Click); | ||||
// | // | ||||
// ShowLogItem | // ShowLogItem | ||||
// | // | ||||
this.ShowLogItem.Index = 6; | |||||
this.ShowLogItem.Index = 8; | |||||
this.ShowLogItem.Text = "Show Logs..."; | this.ShowLogItem.Text = "Show Logs..."; | ||||
this.ShowLogItem.Click += new System.EventHandler(this.ShowLogItem_Click); | this.ShowLogItem.Click += new System.EventHandler(this.ShowLogItem_Click); | ||||
// | // | ||||
// aboutItem | // aboutItem | ||||
// | // | ||||
this.aboutItem.Index = 7; | |||||
this.aboutItem.Index = 9; | |||||
this.aboutItem.Text = "About..."; | this.aboutItem.Text = "About..."; | ||||
this.aboutItem.Click += new System.EventHandler(this.AboutItem_Click); | this.aboutItem.Click += new System.EventHandler(this.AboutItem_Click); | ||||
// | // | ||||
// menuItem3 | // menuItem3 | ||||
// | // | ||||
this.menuItem3.Index = 8; | |||||
this.menuItem3.Index = 10; | |||||
this.menuItem3.Text = "-"; | this.menuItem3.Text = "-"; | ||||
// | // | ||||
// quitItem | // quitItem | ||||
// | // | ||||
this.quitItem.Index = 9; | |||||
this.quitItem.Index = 11; | |||||
this.quitItem.Text = "&Quit"; | this.quitItem.Text = "&Quit"; | ||||
this.quitItem.Click += new System.EventHandler(this.Quit_Click); | this.quitItem.Click += new System.EventHandler(this.Quit_Click); | ||||
// | // | ||||
@@ -385,18 +380,17 @@ | |||||
this.panel3.AutoSize = true; | this.panel3.AutoSize = true; | ||||
this.panel3.Controls.Add(this.DeleteButton); | this.panel3.Controls.Add(this.DeleteButton); | ||||
this.panel3.Controls.Add(this.AddButton); | this.panel3.Controls.Add(this.AddButton); | ||||
this.panel3.Location = new System.Drawing.Point(18, 330); | |||||
this.panel3.Location = new System.Drawing.Point(12, 220); | |||||
this.panel3.Margin = new System.Windows.Forms.Padding(0); | this.panel3.Margin = new System.Windows.Forms.Padding(0); | ||||
this.panel3.Name = "panel3"; | this.panel3.Name = "panel3"; | ||||
this.panel3.Size = new System.Drawing.Size(288, 46); | |||||
this.panel3.Size = new System.Drawing.Size(192, 31); | |||||
this.panel3.TabIndex = 5; | this.panel3.TabIndex = 5; | ||||
// | // | ||||
// DeleteButton | // DeleteButton | ||||
// | // | ||||
this.DeleteButton.Location = new System.Drawing.Point(150, 6); | |||||
this.DeleteButton.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); | |||||
this.DeleteButton.Location = new System.Drawing.Point(100, 4); | |||||
this.DeleteButton.Name = "DeleteButton"; | this.DeleteButton.Name = "DeleteButton"; | ||||
this.DeleteButton.Size = new System.Drawing.Size(133, 35); | |||||
this.DeleteButton.Size = new System.Drawing.Size(89, 23); | |||||
this.DeleteButton.TabIndex = 7; | this.DeleteButton.TabIndex = 7; | ||||
this.DeleteButton.Text = "&Delete"; | this.DeleteButton.Text = "&Delete"; | ||||
this.DeleteButton.UseVisualStyleBackColor = true; | this.DeleteButton.UseVisualStyleBackColor = true; | ||||
@@ -404,10 +398,9 @@ | |||||
// | // | ||||
// AddButton | // AddButton | ||||
// | // | ||||
this.AddButton.Location = new System.Drawing.Point(6, 6); | |||||
this.AddButton.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); | |||||
this.AddButton.Location = new System.Drawing.Point(4, 4); | |||||
this.AddButton.Name = "AddButton"; | this.AddButton.Name = "AddButton"; | ||||
this.AddButton.Size = new System.Drawing.Size(133, 35); | |||||
this.AddButton.Size = new System.Drawing.Size(89, 23); | |||||
this.AddButton.TabIndex = 6; | this.AddButton.TabIndex = 6; | ||||
this.AddButton.Text = "&Add"; | this.AddButton.Text = "&Add"; | ||||
this.AddButton.UseVisualStyleBackColor = true; | this.AddButton.UseVisualStyleBackColor = true; | ||||
@@ -416,11 +409,9 @@ | |||||
// ServerGroupBox | // ServerGroupBox | ||||
// | // | ||||
this.ServerGroupBox.Controls.Add(this.tableLayoutPanel1); | this.ServerGroupBox.Controls.Add(this.tableLayoutPanel1); | ||||
this.ServerGroupBox.Location = new System.Drawing.Point(334, 18); | |||||
this.ServerGroupBox.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); | |||||
this.ServerGroupBox.Location = new System.Drawing.Point(223, 12); | |||||
this.ServerGroupBox.Name = "ServerGroupBox"; | this.ServerGroupBox.Name = "ServerGroupBox"; | ||||
this.ServerGroupBox.Padding = new System.Windows.Forms.Padding(5, 5, 5, 5); | |||||
this.ServerGroupBox.Size = new System.Drawing.Size(383, 307); | |||||
this.ServerGroupBox.Size = new System.Drawing.Size(255, 205); | |||||
this.ServerGroupBox.TabIndex = 6; | this.ServerGroupBox.TabIndex = 6; | ||||
this.ServerGroupBox.TabStop = false; | this.ServerGroupBox.TabStop = false; | ||||
this.ServerGroupBox.Text = "Server"; | this.ServerGroupBox.Text = "Server"; | ||||
@@ -428,29 +419,31 @@ | |||||
// ServersListBox | // ServersListBox | ||||
// | // | ||||
this.ServersListBox.FormattingEnabled = true; | this.ServersListBox.FormattingEnabled = true; | ||||
this.ServersListBox.ItemHeight = 20; | |||||
this.ServersListBox.Location = new System.Drawing.Point(18, 18); | |||||
this.ServersListBox.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); | |||||
this.ServersListBox.Location = new System.Drawing.Point(12, 12); | |||||
this.ServersListBox.Name = "ServersListBox"; | this.ServersListBox.Name = "ServersListBox"; | ||||
this.ServersListBox.Size = new System.Drawing.Size(286, 264); | |||||
this.ServersListBox.Size = new System.Drawing.Size(192, 173); | |||||
this.ServersListBox.TabIndex = 5; | this.ServersListBox.TabIndex = 5; | ||||
this.ServersListBox.SelectedIndexChanged += new System.EventHandler(this.ServersListBox_SelectedIndexChanged); | this.ServersListBox.SelectedIndexChanged += new System.EventHandler(this.ServersListBox_SelectedIndexChanged); | ||||
// | // | ||||
// menuItem1 | |||||
// | |||||
this.menuItem1.Index = 2; | |||||
this.menuItem1.Text = "-"; | |||||
// | |||||
// ConfigForm | // ConfigForm | ||||
// | // | ||||
this.AcceptButton = this.OKButton; | this.AcceptButton = this.OKButton; | ||||
this.AutoScaleDimensions = new System.Drawing.SizeF(144F, 144F); | |||||
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); | |||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; | ||||
this.AutoSize = true; | this.AutoSize = true; | ||||
this.CancelButton = this.MyCancelButton; | this.CancelButton = this.MyCancelButton; | ||||
this.ClientSize = new System.Drawing.Size(733, 430); | |||||
this.ClientSize = new System.Drawing.Size(489, 287); | |||||
this.Controls.Add(this.ServersListBox); | this.Controls.Add(this.ServersListBox); | ||||
this.Controls.Add(this.ServerGroupBox); | this.Controls.Add(this.ServerGroupBox); | ||||
this.Controls.Add(this.panel1); | this.Controls.Add(this.panel1); | ||||
this.Controls.Add(this.panel3); | this.Controls.Add(this.panel3); | ||||
this.Controls.Add(this.panel2); | this.Controls.Add(this.panel2); | ||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; | ||||
this.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5); | |||||
this.MaximizeBox = false; | this.MaximizeBox = false; | ||||
this.MinimizeBox = false; | this.MinimizeBox = false; | ||||
this.Name = "ConfigForm"; | this.Name = "ConfigForm"; | ||||
@@ -508,6 +501,8 @@ | |||||
private System.Windows.Forms.MenuItem QRCodeItem; | private System.Windows.Forms.MenuItem QRCodeItem; | ||||
private System.Windows.Forms.MenuItem ShowLogItem; | private System.Windows.Forms.MenuItem ShowLogItem; | ||||
private System.Windows.Forms.MenuItem ShareOverLANItem; | private System.Windows.Forms.MenuItem ShareOverLANItem; | ||||
private System.Windows.Forms.MenuItem AutoStartupItem; | |||||
private System.Windows.Forms.MenuItem menuItem1; | |||||
} | } | ||||
} | } | ||||
@@ -5,6 +5,7 @@ using System.Drawing; | |||||
using System.Text; | using System.Text; | ||||
using System.Windows.Forms; | using System.Windows.Forms; | ||||
using System.Diagnostics; | using System.Diagnostics; | ||||
using Microsoft.Win32; | |||||
using Shadowsocks.Controller; | using Shadowsocks.Controller; | ||||
using Shadowsocks.Model; | using Shadowsocks.Model; | ||||
using Shadowsocks.Properties; | using Shadowsocks.Properties; | ||||
@@ -184,6 +185,7 @@ namespace Shadowsocks.View | |||||
UpdateServersMenu(); | UpdateServersMenu(); | ||||
enableItem.Checked = _modifiedConfiguration.enabled; | enableItem.Checked = _modifiedConfiguration.enabled; | ||||
ShareOverLANItem.Checked = _modifiedConfiguration.shareOverLan; | ShareOverLANItem.Checked = _modifiedConfiguration.shareOverLan; | ||||
AutoStartupItem.Checked = AutoStartup.Check(); | |||||
} | } | ||||
private void UpdateServersMenu() | private void UpdateServersMenu() | ||||
@@ -377,5 +379,12 @@ namespace Shadowsocks.View | |||||
qrCodeForm.Icon = this.Icon; | qrCodeForm.Icon = this.Icon; | ||||
qrCodeForm.Show(); | qrCodeForm.Show(); | ||||
} | } | ||||
private void AutoStartupItem_Click(object sender, EventArgs e) { | |||||
AutoStartupItem.Checked = !AutoStartupItem.Checked; | |||||
if (!AutoStartup.Set(AutoStartupItem.Checked)) { | |||||
MessageBox.Show("Failed to edit registry"); | |||||
} | |||||
} | |||||
} | } | ||||
} | } |
@@ -112,15 +112,15 @@ | |||||
<value>2.0</value> | <value>2.0</value> | ||||
</resheader> | </resheader> | ||||
<resheader name="reader"> | <resheader name="reader"> | ||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | |||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | |||||
</resheader> | </resheader> | ||||
<resheader name="writer"> | <resheader name="writer"> | ||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | |||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | |||||
</resheader> | </resheader> | ||||
<metadata name="notifyIcon1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> | |||||
<metadata name="notifyIcon1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> | |||||
<value>17, 17</value> | <value>17, 17</value> | ||||
</metadata> | </metadata> | ||||
<metadata name="contextMenu1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> | |||||
<metadata name="contextMenu1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> | |||||
<value>146, 19</value> | <value>146, 19</value> | ||||
</metadata> | </metadata> | ||||
</root> | </root> |
@@ -71,13 +71,12 @@ | |||||
<ItemGroup> | <ItemGroup> | ||||
<Compile Include="3rd\QRCodeCS.cs" /> | <Compile Include="3rd\QRCodeCS.cs" /> | ||||
<Compile Include="3rd\SimpleJson.cs" /> | <Compile Include="3rd\SimpleJson.cs" /> | ||||
<Compile Include="Controller\AutoStartup.cs" /> | |||||
<Compile Include="Controller\FileManager.cs" /> | <Compile Include="Controller\FileManager.cs" /> | ||||
<Compile Include="Controller\Logging.cs" /> | <Compile Include="Controller\Logging.cs" /> | ||||
<Compile Include="Controller\UpdateChecker.cs" /> | <Compile Include="Controller\UpdateChecker.cs" /> | ||||
<Compile Include="Encrypt\EncryptorBase.cs" /> | <Compile Include="Encrypt\EncryptorBase.cs" /> | ||||
<Compile Include="Encrypt\EncryptorFactory.cs" /> | <Compile Include="Encrypt\EncryptorFactory.cs" /> | ||||
<Compile Include="Encrypt\OpenSSL.cs" /> | |||||
<Compile Include="Encrypt\OpenSSLEncryptor.cs" /> | |||||
<Compile Include="Encrypt\PolarSSL.cs" /> | <Compile Include="Encrypt\PolarSSL.cs" /> | ||||
<Compile Include="Encrypt\PolarSSLEncryptor.cs" /> | <Compile Include="Encrypt\PolarSSLEncryptor.cs" /> | ||||
<Compile Include="Encrypt\TableEncryptor.cs" /> | <Compile Include="Encrypt\TableEncryptor.cs" /> | ||||
@@ -1,6 +1,9 @@ | |||||
using System; | using System; | ||||
using Microsoft.VisualStudio.TestTools.UnitTesting; | using Microsoft.VisualStudio.TestTools.UnitTesting; | ||||
using Shadowsocks.Controller; | using Shadowsocks.Controller; | ||||
using Shadowsocks.Encrypt; | |||||
using System.Threading; | |||||
using System.Collections.Generic; | |||||
namespace test | namespace test | ||||
{ | { | ||||
@@ -18,5 +21,77 @@ namespace test | |||||
Assert.IsTrue(UpdateChecker.CompareVersion("2.3.1", "2.4") < 0); | Assert.IsTrue(UpdateChecker.CompareVersion("2.3.1", "2.4") < 0); | ||||
Assert.IsTrue(UpdateChecker.CompareVersion("1.3.2", "1.3.1") > 0); | Assert.IsTrue(UpdateChecker.CompareVersion("1.3.2", "1.3.1") > 0); | ||||
} | } | ||||
[TestMethod] | |||||
public void TestEncryption() | |||||
{ | |||||
// run it once before the multi-threading test to initialize global tables | |||||
RunSingleEncryptionThread(); | |||||
List<Thread> threads = new List<Thread>(); | |||||
for (int i = 0; i < 10; i++) | |||||
{ | |||||
Thread t = new Thread(new ThreadStart(RunSingleEncryptionThread)); | |||||
threads.Add(t); | |||||
t.Start(); | |||||
} | |||||
foreach (Thread t in threads) | |||||
{ | |||||
t.Join(); | |||||
} | |||||
Assert.IsFalse(encryptionFailed); | |||||
} | |||||
private static bool encryptionFailed = false; | |||||
private static object locker = new object(); | |||||
private void RunSingleEncryptionThread() | |||||
{ | |||||
try | |||||
{ | |||||
for (int i = 0; i < 1000; i++) | |||||
{ | |||||
var random = new Random(); | |||||
IEncryptor encryptor; | |||||
IEncryptor decryptor; | |||||
encryptor = new PolarSSLEncryptor("aes-256-cfb", "barfoo!"); | |||||
decryptor = new PolarSSLEncryptor("aes-256-cfb", "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; | |||||
} | |||||
} | |||||
} | } | ||||
} | } |
@@ -26,6 +26,9 @@ | |||||
<OutputPath>bin\x86\Release\</OutputPath> | <OutputPath>bin\x86\Release\</OutputPath> | ||||
<PlatformTarget>x86</PlatformTarget> | <PlatformTarget>x86</PlatformTarget> | ||||
</PropertyGroup> | </PropertyGroup> | ||||
<PropertyGroup> | |||||
<StartupObject /> | |||||
</PropertyGroup> | |||||
<ItemGroup> | <ItemGroup> | ||||
<Reference Include="System" /> | <Reference Include="System" /> | ||||
</ItemGroup> | </ItemGroup> | ||||