From 1564e9ff8117d04ab3e53e1c83dea7061a9ab176 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Sat, 19 Sep 2015 11:06:15 +0800 Subject: [PATCH 01/23] support onetime auth --- shadowsocks-csharp/Controller/Service/TCPRelay.cs | 2 +- shadowsocks-csharp/Data/cn.txt | 1 + shadowsocks-csharp/Data/libsscrypto2.dll.gz | Bin 0 -> 45874 bytes shadowsocks-csharp/Encryption/EncryptorBase.cs | 4 +- shadowsocks-csharp/Encryption/EncryptorFactory.cs | 6 +- shadowsocks-csharp/Encryption/IVEncryptor.cs | 68 ++++++++++++- shadowsocks-csharp/Encryption/PolarSSLEncryptor.cs | 4 +- shadowsocks-csharp/Encryption/Sodium.cs | 37 ++++++- shadowsocks-csharp/Encryption/SodiumEncryptor.cs | 4 +- shadowsocks-csharp/Encryption/TableEncryptor.cs | 4 +- shadowsocks-csharp/Model/Server.cs | 5 + .../Properties/Resources.Designer.cs | 106 +++++++++++---------- shadowsocks-csharp/Properties/Resources.resx | 3 + shadowsocks-csharp/View/ConfigForm.Designer.cs | 53 +++++++---- shadowsocks-csharp/View/ConfigForm.cs | 5 +- shadowsocks-csharp/shadowsocks-csharp.csproj | 1 + 16 files changed, 219 insertions(+), 84 deletions(-) create mode 100644 shadowsocks-csharp/Data/libsscrypto2.dll.gz diff --git a/shadowsocks-csharp/Controller/Service/TCPRelay.cs b/shadowsocks-csharp/Controller/Service/TCPRelay.cs index bf0497d4..c1b39a04 100644 --- a/shadowsocks-csharp/Controller/Service/TCPRelay.cs +++ b/shadowsocks-csharp/Controller/Service/TCPRelay.cs @@ -124,7 +124,7 @@ namespace Shadowsocks.Controller { throw new ArgumentException("No server configured"); } - this.encryptor = EncryptorFactory.GetEncryptor(server.method, server.password); + this.encryptor = EncryptorFactory.GetEncryptor(server.method, server.password, server.one_time_auth); this.server = server; } diff --git a/shadowsocks-csharp/Data/cn.txt b/shadowsocks-csharp/Data/cn.txt index 81022f99..813578b7 100644 --- a/shadowsocks-csharp/Data/cn.txt +++ b/shadowsocks-csharp/Data/cn.txt @@ -39,6 +39,7 @@ Password=密码 Encryption=加密 Proxy Port=代理端口 Remarks=备注 +One-time authorization=一次性授权 OK=确定 Cancel=取消 New server=未配置的服务器 diff --git a/shadowsocks-csharp/Data/libsscrypto2.dll.gz b/shadowsocks-csharp/Data/libsscrypto2.dll.gz new file mode 100644 index 0000000000000000000000000000000000000000..83f7aab1186c37fedb817114cf895fad08b7100b GIT binary patch literal 45874 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 literal 0 KcmV+b0RR6000031 diff --git a/shadowsocks-csharp/Encryption/EncryptorBase.cs b/shadowsocks-csharp/Encryption/EncryptorBase.cs index 8b5cd61a..b92233ec 100644 --- a/shadowsocks-csharp/Encryption/EncryptorBase.cs +++ b/shadowsocks-csharp/Encryption/EncryptorBase.cs @@ -8,14 +8,16 @@ namespace Shadowsocks.Encryption { public const int MAX_INPUT_SIZE = 32768; - protected EncryptorBase(string method, string password) + protected EncryptorBase(string method, string password, bool onetimeauth) { Method = method; Password = password; + OnetimeAuth = onetimeauth; } protected string Method; protected string Password; + protected bool OnetimeAuth; protected byte[] GetPasswordHash() { diff --git a/shadowsocks-csharp/Encryption/EncryptorFactory.cs b/shadowsocks-csharp/Encryption/EncryptorFactory.cs index d5ff15e3..120bd53c 100644 --- a/shadowsocks-csharp/Encryption/EncryptorFactory.cs +++ b/shadowsocks-csharp/Encryption/EncryptorFactory.cs @@ -8,7 +8,7 @@ namespace Shadowsocks.Encryption { private static Dictionary _registeredEncryptors; - private static Type[] _constructorTypes = new Type[] { typeof(string), typeof(string) }; + private static Type[] _constructorTypes = new Type[] { typeof(string), typeof(string), typeof(bool) }; static EncryptorFactory() { @@ -27,7 +27,7 @@ namespace Shadowsocks.Encryption } } - public static IEncryptor GetEncryptor(string method, string password) + public static IEncryptor GetEncryptor(string method, string password, bool onetimeauth = false) { if (string.IsNullOrEmpty(method)) { @@ -36,7 +36,7 @@ namespace Shadowsocks.Encryption method = method.ToLowerInvariant(); Type t = _registeredEncryptors[method]; ConstructorInfo c = t.GetConstructor(_constructorTypes); - IEncryptor result = (IEncryptor)c.Invoke(new object[] { method, password }); + IEncryptor result = (IEncryptor)c.Invoke(new object[] { method, password, onetimeauth }); return result; } } diff --git a/shadowsocks-csharp/Encryption/IVEncryptor.cs b/shadowsocks-csharp/Encryption/IVEncryptor.cs index b82d3adf..869cdb58 100755 --- a/shadowsocks-csharp/Encryption/IVEncryptor.cs +++ b/shadowsocks-csharp/Encryption/IVEncryptor.cs @@ -2,12 +2,19 @@ using System.Collections.Generic; using System.Security.Cryptography; using System.Text; +using System.Net; namespace Shadowsocks.Encryption { public abstract class IVEncryptor : EncryptorBase { + public const int ONETIMEAUTH_FLAG = 0x10; + public const int ADDRTYPE_MASK = 0xF; + public const int ONETIMEAUTH_BYTES = 16; + public const int CRC_BUF_LEN = 128; + public const int CRC_BYTES = 2; + protected static byte[] tempbuf = new byte[MAX_INPUT_SIZE]; protected Dictionary ciphers; @@ -25,11 +32,17 @@ namespace Shadowsocks.Encryption protected byte[] _key; protected int keyLen; protected int ivLen; + protected byte[] crc_buf; + protected int crc_idx = 0; - public IVEncryptor(string method, string password) - : base(method, password) + public IVEncryptor(string method, string password, bool onetimeauth) + : base(method, password, onetimeauth) { InitKey(method, password); + if (OnetimeAuth) + { + crc_buf = new byte[CRC_BUF_LEN]; + } } protected abstract Dictionary getCiphers(); @@ -112,6 +125,28 @@ namespace Shadowsocks.Encryption protected abstract void cipherUpdate(bool isCipher, int length, byte[] buf, byte[] outbuf); + protected int GetSSHeadLength(byte[] buf, int length) + { + int len = 0; + int atyp = length > 0 ? (buf[0] & ADDRTYPE_MASK) : 0; + if (atyp == 1) + { + len = 7; // atyp (1 bytes) + ipv4 (4 bytes) + port (2 bytes) + } + else if (atyp == 3 && length > 1) + { + int nameLen = buf[1]; + len = 4 + nameLen; // atyp (1 bytes) + name length (1 bytes) + name (n bytes) + port (2 bytes) + } + else if (atyp == 4) + { + len = 19; // atyp (1 bytes) + ipv6 (16 bytes) + port (2 bytes) + } + if (len == 0 || len > length) + throw new Exception($"invalid header with addr type {atyp}"); + return len; + } + public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength) { if (!_encryptIVSent) @@ -122,6 +157,24 @@ namespace Shadowsocks.Encryption outlength = length + ivLen; lock (tempbuf) { + if (OnetimeAuth) + { + lock(crc_buf) + { + int headLen = GetSSHeadLength(buf, length); + int data_len = length - headLen; + Buffer.BlockCopy(buf, headLen, buf, headLen + ONETIMEAUTH_BYTES, data_len); + buf[0] |= ONETIMEAUTH_FLAG; + byte[] auth = new byte[ONETIMEAUTH_BYTES]; + Sodium.ss_onetimeauth(auth, buf, headLen, _encryptIV, ivLen, _key, keyLen); + Buffer.BlockCopy(auth, 0, buf, headLen, ONETIMEAUTH_BYTES); + int buf_offset = headLen + ONETIMEAUTH_BYTES; + int rc = Sodium.ss_gen_crc(buf, ref buf_offset, ref data_len, crc_buf, ref crc_idx, buf.Length); + if (rc != 0) + throw new Exception("failed to generate crc"); + length = headLen + ONETIMEAUTH_BYTES + data_len; + } + } cipherUpdate(true, length, buf, tempbuf); outlength = length + ivLen; Buffer.BlockCopy(tempbuf, 0, outbuf, ivLen, length); @@ -129,6 +182,16 @@ namespace Shadowsocks.Encryption } else { + if (OnetimeAuth) + { + lock(crc_buf) + { + int buf_offset = 0; + int rc = Sodium.ss_gen_crc(buf, ref buf_offset, ref length, crc_buf, ref crc_idx, buf.Length); + if (rc != 0) + throw new Exception("failed to generate crc"); + } + } outlength = length; cipherUpdate(true, length, buf, outbuf); } @@ -154,5 +217,6 @@ namespace Shadowsocks.Encryption cipherUpdate(false, length, buf, outbuf); } } + } } diff --git a/shadowsocks-csharp/Encryption/PolarSSLEncryptor.cs b/shadowsocks-csharp/Encryption/PolarSSLEncryptor.cs index 6216c24d..3aca3f72 100755 --- a/shadowsocks-csharp/Encryption/PolarSSLEncryptor.cs +++ b/shadowsocks-csharp/Encryption/PolarSSLEncryptor.cs @@ -16,8 +16,8 @@ namespace Shadowsocks.Encryption private IntPtr _encryptCtx = IntPtr.Zero; private IntPtr _decryptCtx = IntPtr.Zero; - public PolarSSLEncryptor(string method, string password) - : base(method, password) + public PolarSSLEncryptor(string method, string password, bool onetimeauth) + : base(method, password, onetimeauth) { InitKey(method, password); } diff --git a/shadowsocks-csharp/Encryption/Sodium.cs b/shadowsocks-csharp/Encryption/Sodium.cs index 564aaeda..14403267 100755 --- a/shadowsocks-csharp/Encryption/Sodium.cs +++ b/shadowsocks-csharp/Encryption/Sodium.cs @@ -12,9 +12,16 @@ namespace Shadowsocks.Encryption public class Sodium { const string DLLNAME = "libsscrypto"; + const string DLLNAME2 = "libsscrypto2"; static Sodium() { + LoadSSCryptoLibrary(); + LoadSSCrypto2Library(); + } + + static void LoadSSCryptoLibrary() + { string tempPath = Utils.GetTempPath(); string dllPath = tempPath + "/libsscrypto.dll"; try @@ -29,7 +36,24 @@ namespace Shadowsocks.Encryption { Console.WriteLine(e.ToString()); } - LoadLibrary(dllPath); + } + + static void LoadSSCrypto2Library() + { + string tempPath = Utils.GetTempPath(); + string dllPath = tempPath + "/libsscrypto2.dll"; + try + { + FileManager.UncompressFile(dllPath, Resources.libsscrypto2_dll); + LoadLibrary(dllPath); + } + catch (IOException) + { + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } } [DllImport("Kernel32.dll")] @@ -40,5 +64,16 @@ namespace Shadowsocks.Encryption [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] public extern static void crypto_stream_chacha20_xor_ic(byte[] c, byte[] m, ulong mlen, byte[] n, ulong ic, byte[] k); + + [DllImport(DLLNAME2, CallingConvention = CallingConvention.Cdecl)] + public extern static int ss_gen_crc(byte[] buf, ref int buf_offset, ref int data_len, + byte[] crc_buf, ref int crc_idx, int buf_size); + + [DllImport(DLLNAME2, CallingConvention = CallingConvention.Cdecl)] + public extern static int ss_onetimeauth(byte[] auth, + byte[] msg, int msg_len, + byte[] iv, int iv_len, + byte[] key, int key_len); } } + diff --git a/shadowsocks-csharp/Encryption/SodiumEncryptor.cs b/shadowsocks-csharp/Encryption/SodiumEncryptor.cs index af51d0ac..8ab8e255 100755 --- a/shadowsocks-csharp/Encryption/SodiumEncryptor.cs +++ b/shadowsocks-csharp/Encryption/SodiumEncryptor.cs @@ -20,8 +20,8 @@ namespace Shadowsocks.Encryption protected ulong _encryptIC; protected ulong _decryptIC; - public SodiumEncryptor(string method, string password) - : base(method, password) + public SodiumEncryptor(string method, string password, bool onetimeauth) + : base(method, password, onetimeauth) { InitKey(method, password); } diff --git a/shadowsocks-csharp/Encryption/TableEncryptor.cs b/shadowsocks-csharp/Encryption/TableEncryptor.cs index db0a7db0..3de625a6 100644 --- a/shadowsocks-csharp/Encryption/TableEncryptor.cs +++ b/shadowsocks-csharp/Encryption/TableEncryptor.cs @@ -6,8 +6,8 @@ namespace Shadowsocks.Encryption public class TableEncryptor : EncryptorBase { - public TableEncryptor(string method, string password) - : base(method, password) + public TableEncryptor(string method, string password, bool onetimeauth) + : base(method, password, onetimeauth) { byte[] hash = GetPasswordHash(); // TODO endian diff --git a/shadowsocks-csharp/Model/Server.cs b/shadowsocks-csharp/Model/Server.cs index 24dd1162..55134335 100755 --- a/shadowsocks-csharp/Model/Server.cs +++ b/shadowsocks-csharp/Model/Server.cs @@ -17,6 +17,7 @@ namespace Shadowsocks.Model public string password; public string method; public string remarks; + public bool one_time_auth; public override int GetHashCode() { @@ -52,6 +53,7 @@ namespace Shadowsocks.Model this.method = "aes-256-cfb"; this.password = ""; this.remarks = ""; + this.one_time_auth = false; } public Server(string ssURL) : this() @@ -88,6 +90,9 @@ namespace Shadowsocks.Model string[] parts = beforeAt.Split(new[] { ':' }); this.method = parts[0]; this.password = parts[1]; + + //TODO: read one_time_auth + } catch (IndexOutOfRangeException) { diff --git a/shadowsocks-csharp/Properties/Resources.Designer.cs b/shadowsocks-csharp/Properties/Resources.Designer.cs index 198e9f48..a5891002 100644 --- a/shadowsocks-csharp/Properties/Resources.Designer.cs +++ b/shadowsocks-csharp/Properties/Resources.Designer.cs @@ -1,10 +1,10 @@ //------------------------------------------------------------------------------ // -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 // -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ @@ -13,12 +13,12 @@ namespace Shadowsocks.Properties { /// - /// A strongly-typed resource class, for looking up localized strings, etc. + /// 一个强类型的资源类,用于查找本地化的字符串等。 /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] @@ -33,7 +33,7 @@ namespace Shadowsocks.Properties { } /// - /// Returns the cached ResourceManager instance used by this class. + /// 返回此类使用的缓存的 ResourceManager 实例。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { @@ -47,8 +47,8 @@ namespace Shadowsocks.Properties { } /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. + /// 使用此强类型资源类,为所有资源查找 + /// 重写当前线程的 CurrentUICulture 属性。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { @@ -61,7 +61,7 @@ namespace Shadowsocks.Properties { } /// - /// Looks up a localized resource of type System.Byte[]. + /// 查找 System.Byte[] 类型的本地化资源。 /// internal static byte[] abp_js { get { @@ -71,30 +71,28 @@ namespace Shadowsocks.Properties { } /// - /// Looks up a localized string similar to # translation for Simplified Chinese - /// - ///Shadowsocks=Shadowsocks - /// - ///# Menu items - /// - ///Enable System Proxy=启用系统代理 - ///Mode=系统代理模式 - ///PAC=PAC 模式 - ///Global=全局模式 - ///Servers=服务器 - ///Edit Servers...=编辑服务器... - ///Start on Boot=开机启动 - ///Allow Clients from LAN=允许来自局域网的连接 - ///Local PAC=使用本地 PAC - ///Online PAC=使用在线 PAC - ///Edit Local PAC File...=编辑本地 PAC 文件... - ///Update Local PAC from GFWList=从 GFWList 更新本地 PAC - ///Edit User Rule for GFWList...=编辑 GFWList 的用户规则... - ///Show QRCode...=显示二维码... - ///Scan QRCode from Screen...=扫描屏幕上的二维码... - ///Show Logs...=显示日志... - ///About...=关于... - ///Quit=退出 [rest of string was truncated]";. + /// 查找类似 # translation for Simplified Chinese + /// + ///Shadowsocks=Shadowsocks + /// + ///# Menu items + /// + ///Enable System Proxy=启用系统代理 + ///Mode=系统代理模式 + ///PAC=PAC 模式 + ///Global=全局模式 + ///Servers=服务器 + ///Edit Servers...=编辑服务器... + ///Start on Boot=开机启动 + ///Allow Clients from LAN=允许来自局域网的连接 + ///Local PAC=使用本地 PAC + ///Online PAC=使用在线 PAC + ///Edit Local PAC File...=编辑本地 PAC 文件... + ///Update Local PAC from GFWList=从 GFWList 更新本地 PAC + ///Edit User Rule for GFWList...=编辑 GFWList 的用户规则... + ///Show QRCode...=显示二维码... + ///Scan QRCode from Screen...=扫描屏幕上的二维码... + ///Availability Statistic [字符串的其余部分被截断]"; 的本地化字符串。 /// internal static string cn { get { @@ -103,7 +101,7 @@ namespace Shadowsocks.Properties { } /// - /// Looks up a localized resource of type System.Byte[]. + /// 查找 System.Byte[] 类型的本地化资源。 /// internal static byte[] libsscrypto_dll { get { @@ -113,7 +111,17 @@ namespace Shadowsocks.Properties { } /// - /// Looks up a localized resource of type System.Byte[]. + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] libsscrypto2_dll { + get { + object obj = ResourceManager.GetObject("libsscrypto2_dll", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 /// internal static byte[] mgwz_dll { get { @@ -123,11 +131,11 @@ namespace Shadowsocks.Properties { } /// - /// Looks up a localized string similar to listen-address __POLIPO_BIND_IP__:8123 + /// 查找类似 listen-address __POLIPO_BIND_IP__:8123 ///show-on-task-bar 0 ///activity-animation 0 ///forward-socks5 / 127.0.0.1:__SOCKS_PORT__ . - ///hide-console. + ///hide-console 的本地化字符串。 /// internal static string privoxy_conf { get { @@ -136,7 +144,7 @@ namespace Shadowsocks.Properties { } /// - /// Looks up a localized resource of type System.Byte[]. + /// 查找 System.Byte[] 类型的本地化资源。 /// internal static byte[] privoxy_exe { get { @@ -146,7 +154,7 @@ namespace Shadowsocks.Properties { } /// - /// Looks up a localized resource of type System.Byte[]. + /// 查找 System.Byte[] 类型的本地化资源。 /// internal static byte[] proxy_pac_txt { get { @@ -156,7 +164,7 @@ namespace Shadowsocks.Properties { } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// internal static System.Drawing.Bitmap ss16 { get { @@ -166,7 +174,7 @@ namespace Shadowsocks.Properties { } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// internal static System.Drawing.Bitmap ss20 { get { @@ -176,7 +184,7 @@ namespace Shadowsocks.Properties { } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// internal static System.Drawing.Bitmap ss24 { get { @@ -186,7 +194,7 @@ namespace Shadowsocks.Properties { } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// internal static System.Drawing.Bitmap ssw128 { get { @@ -196,9 +204,9 @@ namespace Shadowsocks.Properties { } /// - /// Looks up a localized string similar to ! Put user rules line by line in this file. + /// 查找类似 ! Put user rules line by line in this file. ///! See https://adblockplus.org/en/filter-cheatsheet - ///. + /// 的本地化字符串。 /// internal static string user_rule { get { diff --git a/shadowsocks-csharp/Properties/Resources.resx b/shadowsocks-csharp/Properties/Resources.resx index aa0c2f63..36dc1386 100755 --- a/shadowsocks-csharp/Properties/Resources.resx +++ b/shadowsocks-csharp/Properties/Resources.resx @@ -124,6 +124,9 @@ ..\data\cn.txt;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + ..\Data\libsscrypto2.dll.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + ..\data\libsscrypto.dll.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 diff --git a/shadowsocks-csharp/View/ConfigForm.Designer.cs b/shadowsocks-csharp/View/ConfigForm.Designer.cs index f8b5940a..e985937e 100755 --- a/shadowsocks-csharp/View/ConfigForm.Designer.cs +++ b/shadowsocks-csharp/View/ConfigForm.Designer.cs @@ -55,6 +55,7 @@ this.ProxyPortLabel = new System.Windows.Forms.Label(); this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel(); + this.OneTimeAuth = new System.Windows.Forms.CheckBox(); this.tableLayoutPanel1.SuspendLayout(); this.ServerGroupBox.SuspendLayout(); this.tableLayoutPanel2.SuspendLayout(); @@ -81,18 +82,20 @@ this.tableLayoutPanel1.Controls.Add(this.PasswordTextBox, 1, 2); this.tableLayoutPanel1.Controls.Add(this.EncryptionLabel, 0, 3); this.tableLayoutPanel1.Controls.Add(this.EncryptionSelect, 1, 3); + this.tableLayoutPanel1.Controls.Add(this.OneTimeAuth, 1, 6); this.tableLayoutPanel1.Location = new System.Drawing.Point(8, 21); this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(0); this.tableLayoutPanel1.Name = "tableLayoutPanel1"; this.tableLayoutPanel1.Padding = new System.Windows.Forms.Padding(3); - this.tableLayoutPanel1.RowCount = 6; + this.tableLayoutPanel1.RowCount = 7; 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(238, 137); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.Size = new System.Drawing.Size(238, 160); this.tableLayoutPanel1.TabIndex = 0; // // RemarksTextBox @@ -102,7 +105,7 @@ this.RemarksTextBox.MaxLength = 32; this.RemarksTextBox.Name = "RemarksTextBox"; this.RemarksTextBox.Size = new System.Drawing.Size(160, 20); - this.RemarksTextBox.TabIndex = 10; + this.RemarksTextBox.TabIndex = 4; this.RemarksTextBox.WordWrap = false; // // RemarksLabel @@ -188,7 +191,7 @@ // // EncryptionSelect // - this.EncryptionSelect.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.EncryptionSelect.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.EncryptionSelect.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.EncryptionSelect.FormattingEnabled = true; @@ -226,7 +229,7 @@ this.OKButton.Margin = new System.Windows.Forms.Padding(3, 3, 3, 0); this.OKButton.Name = "OKButton"; this.OKButton.Size = new System.Drawing.Size(75, 23); - this.OKButton.TabIndex = 8; + this.OKButton.TabIndex = 12; this.OKButton.Text = "OK"; this.OKButton.UseVisualStyleBackColor = true; this.OKButton.Click += new System.EventHandler(this.OKButton_Click); @@ -239,7 +242,7 @@ this.MyCancelButton.Margin = new System.Windows.Forms.Padding(3, 3, 0, 0); this.MyCancelButton.Name = "MyCancelButton"; this.MyCancelButton.Size = new System.Drawing.Size(75, 23); - this.MyCancelButton.TabIndex = 9; + this.MyCancelButton.TabIndex = 13; this.MyCancelButton.Text = "Cancel"; this.MyCancelButton.UseVisualStyleBackColor = true; this.MyCancelButton.Click += new System.EventHandler(this.CancelButton_Click); @@ -251,7 +254,7 @@ this.DeleteButton.Margin = new System.Windows.Forms.Padding(3, 6, 0, 3); this.DeleteButton.Name = "DeleteButton"; this.DeleteButton.Size = new System.Drawing.Size(80, 23); - this.DeleteButton.TabIndex = 7; + this.DeleteButton.TabIndex = 9; this.DeleteButton.Text = "&Delete"; this.DeleteButton.UseVisualStyleBackColor = true; this.DeleteButton.Click += new System.EventHandler(this.DeleteButton_Click); @@ -263,7 +266,7 @@ this.AddButton.Margin = new System.Windows.Forms.Padding(0, 6, 3, 3); this.AddButton.Name = "AddButton"; this.AddButton.Size = new System.Drawing.Size(80, 23); - this.AddButton.TabIndex = 6; + this.AddButton.TabIndex = 8; this.AddButton.Text = "&Add"; this.AddButton.UseVisualStyleBackColor = true; this.AddButton.Click += new System.EventHandler(this.AddButton_Click); @@ -276,8 +279,8 @@ this.ServerGroupBox.Location = new System.Drawing.Point(178, 0); this.ServerGroupBox.Margin = new System.Windows.Forms.Padding(12, 0, 0, 0); this.ServerGroupBox.Name = "ServerGroupBox"; - this.ServerGroupBox.Size = new System.Drawing.Size(249, 174); - this.ServerGroupBox.TabIndex = 6; + this.ServerGroupBox.Size = new System.Drawing.Size(249, 197); + this.ServerGroupBox.TabIndex = 0; this.ServerGroupBox.TabStop = false; this.ServerGroupBox.Text = "Server"; // @@ -285,12 +288,11 @@ // this.ServersListBox.FormattingEnabled = true; this.ServersListBox.IntegralHeight = false; - this.ServersListBox.ItemHeight = 12; this.ServersListBox.Location = new System.Drawing.Point(0, 0); this.ServersListBox.Margin = new System.Windows.Forms.Padding(0); this.ServersListBox.Name = "ServersListBox"; this.ServersListBox.Size = new System.Drawing.Size(166, 148); - this.ServersListBox.TabIndex = 5; + this.ServersListBox.TabIndex = 7; this.ServersListBox.SelectedIndexChanged += new System.EventHandler(this.ServersListBox_SelectedIndexChanged); // // tableLayoutPanel2 @@ -313,7 +315,7 @@ this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.Size = new System.Drawing.Size(427, 238); + this.tableLayoutPanel2.Size = new System.Drawing.Size(427, 261); this.tableLayoutPanel2.TabIndex = 7; // // tableLayoutPanel6 @@ -326,7 +328,7 @@ this.tableLayoutPanel6.Controls.Add(this.MoveDownButton, 1, 0); this.tableLayoutPanel6.Controls.Add(this.MoveUpButton, 0, 0); this.tableLayoutPanel6.Dock = System.Windows.Forms.DockStyle.Top; - this.tableLayoutPanel6.Location = new System.Drawing.Point(0, 211); + this.tableLayoutPanel6.Location = new System.Drawing.Point(0, 229); this.tableLayoutPanel6.Margin = new System.Windows.Forms.Padding(0); this.tableLayoutPanel6.Name = "tableLayoutPanel6"; this.tableLayoutPanel6.RowCount = 1; @@ -341,7 +343,7 @@ this.MoveDownButton.Margin = new System.Windows.Forms.Padding(3, 6, 0, 3); this.MoveDownButton.Name = "MoveDownButton"; this.MoveDownButton.Size = new System.Drawing.Size(80, 23); - this.MoveDownButton.TabIndex = 7; + this.MoveDownButton.TabIndex = 11; this.MoveDownButton.Text = "Move D&own"; this.MoveDownButton.UseVisualStyleBackColor = true; this.MoveDownButton.Click += new System.EventHandler(this.MoveDownButton_Click); @@ -353,7 +355,7 @@ this.MoveUpButton.Margin = new System.Windows.Forms.Padding(0, 6, 3, 3); this.MoveUpButton.Name = "MoveUpButton"; this.MoveUpButton.Size = new System.Drawing.Size(80, 23); - this.MoveUpButton.TabIndex = 6; + this.MoveUpButton.TabIndex = 10; this.MoveUpButton.Text = "Move &Up"; this.MoveUpButton.UseVisualStyleBackColor = true; this.MoveUpButton.Click += new System.EventHandler(this.MoveUpButton_Click); @@ -369,7 +371,7 @@ this.tableLayoutPanel5.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); this.tableLayoutPanel5.Controls.Add(this.ProxyPortTextBox, 1, 0); this.tableLayoutPanel5.Controls.Add(this.ProxyPortLabel, 0, 0); - this.tableLayoutPanel5.Location = new System.Drawing.Point(241, 174); + this.tableLayoutPanel5.Location = new System.Drawing.Point(241, 197); this.tableLayoutPanel5.Margin = new System.Windows.Forms.Padding(0); this.tableLayoutPanel5.Name = "tableLayoutPanel5"; this.tableLayoutPanel5.Padding = new System.Windows.Forms.Padding(3); @@ -389,7 +391,7 @@ this.ProxyPortTextBox.MaxLength = 10; this.ProxyPortTextBox.Name = "ProxyPortTextBox"; this.ProxyPortTextBox.Size = new System.Drawing.Size(113, 20); - this.ProxyPortTextBox.TabIndex = 4; + this.ProxyPortTextBox.TabIndex = 6; this.ProxyPortTextBox.WordWrap = false; // // ProxyPortLabel @@ -413,7 +415,7 @@ this.tableLayoutPanel3.Controls.Add(this.MyCancelButton, 1, 0); this.tableLayoutPanel3.Controls.Add(this.OKButton, 0, 0); this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Right; - this.tableLayoutPanel3.Location = new System.Drawing.Point(268, 209); + this.tableLayoutPanel3.Location = new System.Drawing.Point(268, 232); this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(3, 3, 0, 3); this.tableLayoutPanel3.Name = "tableLayoutPanel3"; this.tableLayoutPanel3.RowCount = 1; @@ -431,7 +433,7 @@ this.tableLayoutPanel4.Controls.Add(this.DeleteButton, 1, 0); this.tableLayoutPanel4.Controls.Add(this.AddButton, 0, 0); this.tableLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Top; - this.tableLayoutPanel4.Location = new System.Drawing.Point(0, 174); + this.tableLayoutPanel4.Location = new System.Drawing.Point(0, 197); this.tableLayoutPanel4.Margin = new System.Windows.Forms.Padding(0); this.tableLayoutPanel4.Name = "tableLayoutPanel4"; this.tableLayoutPanel4.RowCount = 1; @@ -439,6 +441,16 @@ this.tableLayoutPanel4.Size = new System.Drawing.Size(166, 32); this.tableLayoutPanel4.TabIndex = 8; // + // OneTimeAuth + // + this.OneTimeAuth.AutoSize = true; + this.OneTimeAuth.Location = new System.Drawing.Point(72, 137); + this.OneTimeAuth.Name = "OneTimeAuth"; + this.OneTimeAuth.Size = new System.Drawing.Size(131, 17); + this.OneTimeAuth.TabIndex = 5; + this.OneTimeAuth.Text = "One-time authorization"; + this.OneTimeAuth.UseVisualStyleBackColor = true; + // // ConfigForm // this.AcceptButton = this.OKButton; @@ -505,6 +517,7 @@ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel6; private System.Windows.Forms.Button MoveDownButton; private System.Windows.Forms.Button MoveUpButton; + private System.Windows.Forms.CheckBox OneTimeAuth; } } diff --git a/shadowsocks-csharp/View/ConfigForm.cs b/shadowsocks-csharp/View/ConfigForm.cs index dc290249..b4b1b6bd 100755 --- a/shadowsocks-csharp/View/ConfigForm.cs +++ b/shadowsocks-csharp/View/ConfigForm.cs @@ -48,6 +48,7 @@ namespace Shadowsocks.View EncryptionLabel.Text = I18N.GetString("Encryption"); ProxyPortLabel.Text = I18N.GetString("Proxy Port"); RemarksLabel.Text = I18N.GetString("Remarks"); + OneTimeAuth.Text = I18N.GetString("One-time authorization"); ServerGroupBox.Text = I18N.GetString("Server"); OKButton.Text = I18N.GetString("OK"); MyCancelButton.Text = I18N.GetString("Cancel"); @@ -82,7 +83,8 @@ namespace Shadowsocks.View server_port = int.Parse(ServerPortTextBox.Text), password = PasswordTextBox.Text, method = EncryptionSelect.Text, - remarks = RemarksTextBox.Text + remarks = RemarksTextBox.Text, + one_time_auth = OneTimeAuth.Checked }; int localPort = int.Parse(ProxyPortTextBox.Text); Configuration.CheckServer(server); @@ -115,6 +117,7 @@ namespace Shadowsocks.View ProxyPortTextBox.Text = _modifiedConfiguration.localPort.ToString(); EncryptionSelect.Text = server.method ?? "aes-256-cfb"; RemarksTextBox.Text = server.remarks; + OneTimeAuth.Checked = server.one_time_auth; } } diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index 8200aa07..89389fab 100644 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -205,6 +205,7 @@ + From ca8df1b51fd83fd0f6d65fc13fd7e1d13df2ebc8 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Sat, 19 Sep 2015 11:19:39 +0800 Subject: [PATCH 02/23] fix buffer size --- shadowsocks-csharp/Controller/Service/TCPRelay.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shadowsocks-csharp/Controller/Service/TCPRelay.cs b/shadowsocks-csharp/Controller/Service/TCPRelay.cs index c1b39a04..64535644 100644 --- a/shadowsocks-csharp/Controller/Service/TCPRelay.cs +++ b/shadowsocks-csharp/Controller/Service/TCPRelay.cs @@ -93,7 +93,7 @@ namespace Shadowsocks.Controller private int _firstPacketLength; // Size of receive buffer. public const int RecvSize = 8192; - public const int BufferSize = RecvSize + 32; + public const int BufferSize = RecvSize + (RecvSize / IVEncryptor.CRC_BUF_LEN + 1) * IVEncryptor.CRC_BYTES + 48; private int totalRead = 0; private int totalWrite = 0; From eae394355671c31257f4a6f910030b002b183c39 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Sat, 19 Sep 2015 13:51:32 +0800 Subject: [PATCH 03/23] reserve buffer for one-time auth --- shadowsocks-csharp/Controller/Service/TCPRelay.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/shadowsocks-csharp/Controller/Service/TCPRelay.cs b/shadowsocks-csharp/Controller/Service/TCPRelay.cs index 64535644..86907f9a 100644 --- a/shadowsocks-csharp/Controller/Service/TCPRelay.cs +++ b/shadowsocks-csharp/Controller/Service/TCPRelay.cs @@ -93,17 +93,18 @@ namespace Shadowsocks.Controller private int _firstPacketLength; // Size of receive buffer. public const int RecvSize = 8192; - public const int BufferSize = RecvSize + (RecvSize / IVEncryptor.CRC_BUF_LEN + 1) * IVEncryptor.CRC_BYTES + 48; + public const int RecvReserveSize = (RecvSize / IVEncryptor.CRC_BUF_LEN + 1) * IVEncryptor.CRC_BYTES + 16; // reserve for one-time auth + public const int BufferSize = RecvSize + RecvReserveSize + 32; private int totalRead = 0; private int totalWrite = 0; // remote receive buffer - private byte[] remoteRecvBuffer = new byte[RecvSize]; + private byte[] remoteRecvBuffer = new byte[BufferSize]; // remote send buffer private byte[] remoteSendBuffer = new byte[BufferSize]; // connection receive buffer - private byte[] connetionRecvBuffer = new byte[RecvSize]; + private byte[] connetionRecvBuffer = new byte[BufferSize]; // connection send buffer private byte[] connetionSendBuffer = new byte[BufferSize]; // Received data string. From ff0bc37694f771993779f16d871b434004d7d57d Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Sat, 19 Sep 2015 21:55:29 +0800 Subject: [PATCH 04/23] fix UnitTest --- test/UnitTest.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/UnitTest.cs b/test/UnitTest.cs index 8fdf3f28..bb95fa50 100755 --- a/test/UnitTest.cs +++ b/test/UnitTest.cs @@ -84,8 +84,8 @@ namespace test { IEncryptor encryptor; IEncryptor decryptor; - encryptor = new PolarSSLEncryptor("aes-256-cfb", "barfoo!"); - decryptor = new PolarSSLEncryptor("aes-256-cfb", "barfoo!"); + encryptor = new PolarSSLEncryptor("aes-256-cfb", "barfoo!", false); + decryptor = new PolarSSLEncryptor("aes-256-cfb", "barfoo!", false); RunEncryptionRound(encryptor, decryptor); } } @@ -124,8 +124,8 @@ namespace test var random = new Random(); IEncryptor encryptor; IEncryptor decryptor; - encryptor = new PolarSSLEncryptor("rc4-md5", "barfoo!"); - decryptor = new PolarSSLEncryptor("rc4-md5", "barfoo!"); + encryptor = new PolarSSLEncryptor("rc4-md5", "barfoo!", false); + decryptor = new PolarSSLEncryptor("rc4-md5", "barfoo!", false); RunEncryptionRound(encryptor, decryptor); } } @@ -164,8 +164,8 @@ namespace test var random = new Random(); IEncryptor encryptor; IEncryptor decryptor; - encryptor = new SodiumEncryptor("salsa20", "barfoo!"); - decryptor = new SodiumEncryptor("salsa20", "barfoo!"); + encryptor = new SodiumEncryptor("salsa20", "barfoo!", false); + decryptor = new SodiumEncryptor("salsa20", "barfoo!", false); RunEncryptionRound(encryptor, decryptor); } } From ab1f3660495d91dda537a17fc87573f3caa565a0 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Sat, 19 Sep 2015 21:56:03 +0800 Subject: [PATCH 05/23] Combine libsscrypto.dll and libsslcrypto2.dll --- shadowsocks-csharp/Data/libsscrypto.dll.gz | Bin 10603 -> 53459 bytes shadowsocks-csharp/Data/libsscrypto2.dll.gz | Bin 45874 -> 0 bytes shadowsocks-csharp/Encryption/Sodium.cs | 35 +++------------------ .../Properties/Resources.Designer.cs | 10 ------ shadowsocks-csharp/Properties/Resources.resx | 3 -- shadowsocks-csharp/shadowsocks-csharp.csproj | 1 - 6 files changed, 5 insertions(+), 44 deletions(-) delete mode 100644 shadowsocks-csharp/Data/libsscrypto2.dll.gz diff --git a/shadowsocks-csharp/Data/libsscrypto.dll.gz b/shadowsocks-csharp/Data/libsscrypto.dll.gz index 66a1185ec57e06bf2bddd81b0c93b3f72bd525a9..75fe39ba15997f6b322b66bf724071ea52afc02e 100755 GIT binary patch literal 53459 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 F008M3pJD(2 diff --git a/shadowsocks-csharp/Data/libsscrypto2.dll.gz b/shadowsocks-csharp/Data/libsscrypto2.dll.gz deleted file mode 100644 index 83f7aab1186c37fedb817114cf895fad08b7100b..0000000000000000000000000000000000000000 GIT binary patch literal 0 KcmV+b0RR6000031 literal 45874 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 diff --git a/shadowsocks-csharp/Encryption/Sodium.cs b/shadowsocks-csharp/Encryption/Sodium.cs index 14403267..c2c22839 100755 --- a/shadowsocks-csharp/Encryption/Sodium.cs +++ b/shadowsocks-csharp/Encryption/Sodium.cs @@ -12,40 +12,14 @@ namespace Shadowsocks.Encryption public class Sodium { const string DLLNAME = "libsscrypto"; - const string DLLNAME2 = "libsscrypto2"; static Sodium() { - LoadSSCryptoLibrary(); - LoadSSCrypto2Library(); - } - - static void LoadSSCryptoLibrary() - { string tempPath = Utils.GetTempPath(); string dllPath = tempPath + "/libsscrypto.dll"; try { FileManager.UncompressFile(dllPath, Resources.libsscrypto_dll); - LoadLibrary(dllPath); - } - catch (IOException) - { - } - catch (Exception e) - { - Console.WriteLine(e.ToString()); - } - } - - static void LoadSSCrypto2Library() - { - string tempPath = Utils.GetTempPath(); - string dllPath = tempPath + "/libsscrypto2.dll"; - try - { - FileManager.UncompressFile(dllPath, Resources.libsscrypto2_dll); - LoadLibrary(dllPath); } catch (IOException) { @@ -54,22 +28,23 @@ namespace Shadowsocks.Encryption { Console.WriteLine(e.ToString()); } + LoadLibrary(dllPath); } [DllImport("Kernel32.dll")] private static extern IntPtr LoadLibrary(string path); [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public extern static void crypto_stream_salsa20_xor_ic(byte[] c, byte[] m, ulong mlen, byte[] n, ulong ic, byte[] k); + public extern static int crypto_stream_salsa20_xor_ic(byte[] c, byte[] m, ulong mlen, byte[] n, ulong ic, byte[] k); [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public extern static void crypto_stream_chacha20_xor_ic(byte[] c, byte[] m, ulong mlen, byte[] n, ulong ic, byte[] k); + public extern static int crypto_stream_chacha20_xor_ic(byte[] c, byte[] m, ulong mlen, byte[] n, ulong ic, byte[] k); - [DllImport(DLLNAME2, CallingConvention = CallingConvention.Cdecl)] + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] public extern static int ss_gen_crc(byte[] buf, ref int buf_offset, ref int data_len, byte[] crc_buf, ref int crc_idx, int buf_size); - [DllImport(DLLNAME2, CallingConvention = CallingConvention.Cdecl)] + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] public extern static int ss_onetimeauth(byte[] auth, byte[] msg, int msg_len, byte[] iv, int iv_len, diff --git a/shadowsocks-csharp/Properties/Resources.Designer.cs b/shadowsocks-csharp/Properties/Resources.Designer.cs index a5891002..57242844 100644 --- a/shadowsocks-csharp/Properties/Resources.Designer.cs +++ b/shadowsocks-csharp/Properties/Resources.Designer.cs @@ -113,16 +113,6 @@ namespace Shadowsocks.Properties { /// /// 查找 System.Byte[] 类型的本地化资源。 /// - internal static byte[] libsscrypto2_dll { - get { - object obj = ResourceManager.GetObject("libsscrypto2_dll", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// 查找 System.Byte[] 类型的本地化资源。 - /// internal static byte[] mgwz_dll { get { object obj = ResourceManager.GetObject("mgwz_dll", resourceCulture); diff --git a/shadowsocks-csharp/Properties/Resources.resx b/shadowsocks-csharp/Properties/Resources.resx index 36dc1386..aa0c2f63 100755 --- a/shadowsocks-csharp/Properties/Resources.resx +++ b/shadowsocks-csharp/Properties/Resources.resx @@ -124,9 +124,6 @@ ..\data\cn.txt;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 - - ..\Data\libsscrypto2.dll.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - ..\data\libsscrypto.dll.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index 89389fab..8200aa07 100644 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -205,7 +205,6 @@ - From 19085a3cd170ef7ce18e4e9321934c772c0e4710 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Sun, 20 Sep 2015 23:25:37 -0400 Subject: [PATCH 06/23] Update the hash function follow with https://github.com/shadowsocks/shadowsocks-libev/commit/5ae4df94e440c4f6826a679a62687ad27303d89b --- shadowsocks-csharp/Controller/Service/TCPRelay.cs | 2 +- shadowsocks-csharp/Data/libsscrypto.dll.gz | Bin 53459 -> 51484 bytes shadowsocks-csharp/Encryption/IVEncryptor.cs | 75 +++++++++++++++++----- shadowsocks-csharp/Encryption/Sodium.cs | 13 ++-- 4 files changed, 67 insertions(+), 23 deletions(-) diff --git a/shadowsocks-csharp/Controller/Service/TCPRelay.cs b/shadowsocks-csharp/Controller/Service/TCPRelay.cs index 86907f9a..ca53a97a 100644 --- a/shadowsocks-csharp/Controller/Service/TCPRelay.cs +++ b/shadowsocks-csharp/Controller/Service/TCPRelay.cs @@ -93,7 +93,7 @@ namespace Shadowsocks.Controller private int _firstPacketLength; // Size of receive buffer. public const int RecvSize = 8192; - public const int RecvReserveSize = (RecvSize / IVEncryptor.CRC_BUF_LEN + 1) * IVEncryptor.CRC_BYTES + 16; // reserve for one-time auth + public const int RecvReserveSize = (RecvSize / IVEncryptor.HASH_BUF_LEN + 1) * IVEncryptor.HASH_BYTES + IVEncryptor.ONETIMEAUTH_BYTES; // reserve for one-time auth public const int BufferSize = RecvSize + RecvReserveSize + 32; private int totalRead = 0; diff --git a/shadowsocks-csharp/Data/libsscrypto.dll.gz b/shadowsocks-csharp/Data/libsscrypto.dll.gz index 75fe39ba15997f6b322b66bf724071ea52afc02e..5efa66613ad1f21294f50ba365349e1b4e121ab9 100755 GIT binary patch literal 51484 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 z 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 0 ? (buf[0] & ADDRTYPE_MASK) : 0; @@ -147,6 +153,47 @@ namespace Shadowsocks.Encryption return len; } + protected int ss_onetimeauth(byte[] auth, + byte[] msg, int msg_len, + byte[] iv, int iv_len, + byte[] key, int key_len) + { + byte[] auth_key = new byte[ONETIMEAUTH_KEYBYTES]; + byte[] auth_bytes = new byte[MAX_IV_LENGTH + MAX_KEY_LENGTH]; + Buffer.BlockCopy(iv, 0, auth_bytes, 0, ivLen); + Buffer.BlockCopy(key, 0, auth_bytes, ivLen, key_len); + Sodium.crypto_generichash(auth_key, ONETIMEAUTH_KEYBYTES, auth_bytes, (ulong)(iv_len + key_len), null, 0); + return Sodium.crypto_onetimeauth(auth, msg, (ulong)msg_len, auth_key); + } + + protected void ss_gen_hash(byte[] in_buf, ref int in_offset, ref int in_len, + byte[] hash_buf, ref int hash_idx, int buf_size) + { + int i, j; + int offset = in_offset; + int blen = in_len; + int cidx = hash_idx; + int size = (blen / HASH_BUF_LEN + 1) * HASH_BYTES + blen; + if (buf_size < (size + offset)) + throw new Exception("failed to generate hash: buffer size insufficient"); + byte[] hash = new byte[HASH_BYTES]; + for (i = 0, j = offset; i < blen; i++, j++) + { + if (cidx == HASH_BUF_LEN) + { + Sodium.crypto_generichash(hash, HASH_BYTES, hash_buf, HASH_BUF_LEN, null, 0); + Buffer.BlockCopy(in_buf, j, in_buf, j + HASH_BYTES, blen - i); + Buffer.BlockCopy(hash, 0, in_buf, j, HASH_BYTES); + j += HASH_BYTES; cidx = 0; + } + hash_buf[cidx] = in_buf[j]; + cidx++; + } + in_offset = j; + in_len = j - offset; + hash_idx = cidx; + } + public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength) { if (!_encryptIVSent) @@ -159,19 +206,17 @@ namespace Shadowsocks.Encryption { if (OnetimeAuth) { - lock(crc_buf) + lock (hash_buf) { - int headLen = GetSSHeadLength(buf, length); + int headLen = ss_headlen(buf, length); int data_len = length - headLen; Buffer.BlockCopy(buf, headLen, buf, headLen + ONETIMEAUTH_BYTES, data_len); buf[0] |= ONETIMEAUTH_FLAG; byte[] auth = new byte[ONETIMEAUTH_BYTES]; - Sodium.ss_onetimeauth(auth, buf, headLen, _encryptIV, ivLen, _key, keyLen); + ss_onetimeauth(auth, buf, headLen, _encryptIV, ivLen, _key, keyLen); Buffer.BlockCopy(auth, 0, buf, headLen, ONETIMEAUTH_BYTES); int buf_offset = headLen + ONETIMEAUTH_BYTES; - int rc = Sodium.ss_gen_crc(buf, ref buf_offset, ref data_len, crc_buf, ref crc_idx, buf.Length); - if (rc != 0) - throw new Exception("failed to generate crc"); + ss_gen_hash(buf, ref buf_offset, ref data_len, hash_buf, ref hash_idx, buf.Length); length = headLen + ONETIMEAUTH_BYTES + data_len; } } @@ -184,12 +229,10 @@ namespace Shadowsocks.Encryption { if (OnetimeAuth) { - lock(crc_buf) + lock (hash_buf) { int buf_offset = 0; - int rc = Sodium.ss_gen_crc(buf, ref buf_offset, ref length, crc_buf, ref crc_idx, buf.Length); - if (rc != 0) - throw new Exception("failed to generate crc"); + ss_gen_hash(buf, ref buf_offset, ref length, hash_buf, ref hash_idx, buf.Length); } } outlength = length; diff --git a/shadowsocks-csharp/Encryption/Sodium.cs b/shadowsocks-csharp/Encryption/Sodium.cs index c2c22839..a6bc909e 100755 --- a/shadowsocks-csharp/Encryption/Sodium.cs +++ b/shadowsocks-csharp/Encryption/Sodium.cs @@ -41,14 +41,15 @@ namespace Shadowsocks.Encryption public extern static int crypto_stream_chacha20_xor_ic(byte[] c, byte[] m, ulong mlen, byte[] n, ulong ic, byte[] k); [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public extern static int ss_gen_crc(byte[] buf, ref int buf_offset, ref int data_len, - byte[] crc_buf, ref int crc_idx, int buf_size); + public extern static int crypto_generichash(byte[] outbuf, uint outlen, + byte[] inbuf, ulong inlen, + byte[] key, uint keylen); [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public extern static int ss_onetimeauth(byte[] auth, - byte[] msg, int msg_len, - byte[] iv, int iv_len, - byte[] key, int key_len); + public extern static int crypto_onetimeauth(byte[] outbuf, byte[] inbuf, ulong inlen, byte[] k); + + [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] + public extern static int crypto_onetimeauth_verify(byte[] h, byte[] inbuf, ulong inlen, byte[] k); } } From 204d6b856eece6532f94023630f42b20b01721c2 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Mon, 21 Sep 2015 05:28:18 -0400 Subject: [PATCH 07/23] verbiage --- shadowsocks-csharp/Data/cn.txt | 2 +- .../Properties/Resources.Designer.cs | 86 +++++++++++----------- shadowsocks-csharp/View/ConfigForm.Designer.cs | 14 ++-- shadowsocks-csharp/View/ConfigForm.cs | 2 +- 4 files changed, 52 insertions(+), 52 deletions(-) diff --git a/shadowsocks-csharp/Data/cn.txt b/shadowsocks-csharp/Data/cn.txt index 813578b7..259081da 100644 --- a/shadowsocks-csharp/Data/cn.txt +++ b/shadowsocks-csharp/Data/cn.txt @@ -39,7 +39,7 @@ Password=密码 Encryption=加密 Proxy Port=代理端口 Remarks=备注 -One-time authorization=一次性授权 +Onetime Authentication=一次性认证 OK=确定 Cancel=取消 New server=未配置的服务器 diff --git a/shadowsocks-csharp/Properties/Resources.Designer.cs b/shadowsocks-csharp/Properties/Resources.Designer.cs index 57242844..1205845f 100644 --- a/shadowsocks-csharp/Properties/Resources.Designer.cs +++ b/shadowsocks-csharp/Properties/Resources.Designer.cs @@ -1,24 +1,24 @@ //------------------------------------------------------------------------------ // -// 此代码由工具生成。 -// 运行时版本:4.0.30319.42000 +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 // -// 对此文件的更改可能会导致不正确的行为,并且如果 -// 重新生成代码,这些更改将会丢失。 +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. // //------------------------------------------------------------------------------ namespace Shadowsocks.Properties { using System; - - + + /// - /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// A strongly-typed resource class, for looking up localized strings, etc. /// - // 此类是由 StronglyTypedResourceBuilder - // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 - // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen - // (以 /str 作为命令选项),或重新生成 VS 项目。 + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] @@ -31,9 +31,9 @@ namespace Shadowsocks.Properties { [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } - + /// - /// 返回此类使用的缓存的 ResourceManager 实例。 + /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { @@ -45,10 +45,10 @@ namespace Shadowsocks.Properties { return resourceMan; } } - + /// - /// 使用此强类型资源类,为所有资源查找 - /// 重写当前线程的 CurrentUICulture 属性。 + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { @@ -59,9 +59,9 @@ namespace Shadowsocks.Properties { resourceCulture = value; } } - + /// - /// 查找 System.Byte[] 类型的本地化资源。 + /// Looks up a localized resource of type System.Byte[]. /// internal static byte[] abp_js { get { @@ -69,9 +69,9 @@ namespace Shadowsocks.Properties { return ((byte[])(obj)); } } - + /// - /// 查找类似 # translation for Simplified Chinese + /// Looks up a localized string similar to # translation for Simplified Chinese /// ///Shadowsocks=Shadowsocks /// @@ -92,16 +92,16 @@ namespace Shadowsocks.Properties { ///Edit User Rule for GFWList...=编辑 GFWList 的用户规则... ///Show QRCode...=显示二维码... ///Scan QRCode from Screen...=扫描屏幕上的二维码... - ///Availability Statistic [字符串的其余部分被截断]"; 的本地化字符串。 + ///Availability Statistic [rest of string was truncated]";. /// internal static string cn { get { return ResourceManager.GetString("cn", resourceCulture); } } - + /// - /// 查找 System.Byte[] 类型的本地化资源。 + /// Looks up a localized resource of type System.Byte[]. /// internal static byte[] libsscrypto_dll { get { @@ -109,9 +109,9 @@ namespace Shadowsocks.Properties { return ((byte[])(obj)); } } - + /// - /// 查找 System.Byte[] 类型的本地化资源。 + /// Looks up a localized resource of type System.Byte[]. /// internal static byte[] mgwz_dll { get { @@ -119,22 +119,22 @@ namespace Shadowsocks.Properties { return ((byte[])(obj)); } } - + /// - /// 查找类似 listen-address __POLIPO_BIND_IP__:8123 + /// Looks up a localized string similar to listen-address __POLIPO_BIND_IP__:8123 ///show-on-task-bar 0 ///activity-animation 0 ///forward-socks5 / 127.0.0.1:__SOCKS_PORT__ . - ///hide-console 的本地化字符串。 + ///hide-console. /// internal static string privoxy_conf { get { return ResourceManager.GetString("privoxy_conf", resourceCulture); } } - + /// - /// 查找 System.Byte[] 类型的本地化资源。 + /// Looks up a localized resource of type System.Byte[]. /// internal static byte[] privoxy_exe { get { @@ -142,9 +142,9 @@ namespace Shadowsocks.Properties { return ((byte[])(obj)); } } - + /// - /// 查找 System.Byte[] 类型的本地化资源。 + /// Looks up a localized resource of type System.Byte[]. /// internal static byte[] proxy_pac_txt { get { @@ -152,9 +152,9 @@ namespace Shadowsocks.Properties { return ((byte[])(obj)); } } - + /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// Looks up a localized resource of type System.Drawing.Bitmap. /// internal static System.Drawing.Bitmap ss16 { get { @@ -162,9 +162,9 @@ namespace Shadowsocks.Properties { return ((System.Drawing.Bitmap)(obj)); } } - + /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// Looks up a localized resource of type System.Drawing.Bitmap. /// internal static System.Drawing.Bitmap ss20 { get { @@ -172,9 +172,9 @@ namespace Shadowsocks.Properties { return ((System.Drawing.Bitmap)(obj)); } } - + /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// Looks up a localized resource of type System.Drawing.Bitmap. /// internal static System.Drawing.Bitmap ss24 { get { @@ -182,9 +182,9 @@ namespace Shadowsocks.Properties { return ((System.Drawing.Bitmap)(obj)); } } - + /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// Looks up a localized resource of type System.Drawing.Bitmap. /// internal static System.Drawing.Bitmap ssw128 { get { @@ -192,11 +192,11 @@ namespace Shadowsocks.Properties { return ((System.Drawing.Bitmap)(obj)); } } - + /// - /// 查找类似 ! Put user rules line by line in this file. + /// Looks up a localized string similar to ! Put user rules line by line in this file. ///! See https://adblockplus.org/en/filter-cheatsheet - /// 的本地化字符串。 + ///. /// internal static string user_rule { get { diff --git a/shadowsocks-csharp/View/ConfigForm.Designer.cs b/shadowsocks-csharp/View/ConfigForm.Designer.cs index e985937e..a4754918 100755 --- a/shadowsocks-csharp/View/ConfigForm.Designer.cs +++ b/shadowsocks-csharp/View/ConfigForm.Designer.cs @@ -3,14 +3,14 @@ partial class ConfigForm { /// - /// 必需的设计器变量。 + /// Required designer variable. /// private System.ComponentModel.IContainer components = null; /// - /// 清理所有正在使用的资源。 + /// Clean up any resources being used. /// - /// 如果应释放托管资源,为 true;否则为 false。 + /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) @@ -20,11 +20,11 @@ base.Dispose(disposing); } - #region Windows 窗体设计器生成的代码 + #region Windows Form Designer generated code /// - /// 设计器支持所需的方法 - 不要 - /// 使用代码编辑器修改此方法的内容。 + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. /// private void InitializeComponent() { @@ -448,7 +448,7 @@ this.OneTimeAuth.Name = "OneTimeAuth"; this.OneTimeAuth.Size = new System.Drawing.Size(131, 17); this.OneTimeAuth.TabIndex = 5; - this.OneTimeAuth.Text = "One-time authorization"; + this.OneTimeAuth.Text = "Onetime Authentication"; this.OneTimeAuth.UseVisualStyleBackColor = true; // // ConfigForm diff --git a/shadowsocks-csharp/View/ConfigForm.cs b/shadowsocks-csharp/View/ConfigForm.cs index b4b1b6bd..fd0b8d63 100755 --- a/shadowsocks-csharp/View/ConfigForm.cs +++ b/shadowsocks-csharp/View/ConfigForm.cs @@ -48,7 +48,7 @@ namespace Shadowsocks.View EncryptionLabel.Text = I18N.GetString("Encryption"); ProxyPortLabel.Text = I18N.GetString("Proxy Port"); RemarksLabel.Text = I18N.GetString("Remarks"); - OneTimeAuth.Text = I18N.GetString("One-time authorization"); + OneTimeAuth.Text = I18N.GetString("Onetime Authentication"); ServerGroupBox.Text = I18N.GetString("Server"); OKButton.Text = I18N.GetString("OK"); MyCancelButton.Text = I18N.GetString("Cancel"); From 00ccb52bef8444d7bbe93a404d98be7287bed31b Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Mon, 21 Sep 2015 22:42:16 -0400 Subject: [PATCH 08/23] Add an option for checking updates --- .../Controller/Service/UpdateChecker.cs | 19 ++++---- .../Controller/ShadowsocksController.cs | 6 +++ shadowsocks-csharp/Data/cn.txt | 4 ++ shadowsocks-csharp/Model/Configuration.cs | 2 + shadowsocks-csharp/View/MenuViewController.cs | 57 +++++++++++++++++++--- 5 files changed, 71 insertions(+), 17 deletions(-) diff --git a/shadowsocks-csharp/Controller/Service/UpdateChecker.cs b/shadowsocks-csharp/Controller/Service/UpdateChecker.cs index d48c0aae..a6709388 100644 --- a/shadowsocks-csharp/Controller/Service/UpdateChecker.cs +++ b/shadowsocks-csharp/Controller/Service/UpdateChecker.cs @@ -14,9 +14,10 @@ namespace Shadowsocks.Controller { private const string UpdateURL = "https://api.github.com/repos/shadowsocks/shadowsocks-windows/releases"; + public bool NewVersionFound; public string LatestVersionNumber; public string LatestVersionURL; - public event EventHandler NewVersionFound; + public event EventHandler CheckUpdateCompleted; public const string Version = "2.5.8"; @@ -114,17 +115,17 @@ namespace Shadowsocks.Controller } } - if (versions.Count == 0) + if (versions.Count != 0) { - return; + // sort versions + SortVersions(versions); + NewVersionFound = true; + LatestVersionURL = versions[versions.Count - 1]; + LatestVersionNumber = ParseVersionFromURL(LatestVersionURL); } - // sort versions - SortVersions(versions); - LatestVersionURL = versions[versions.Count - 1]; - LatestVersionNumber = ParseVersionFromURL(LatestVersionURL); - if (NewVersionFound != null) + if (CheckUpdateCompleted != null) { - NewVersionFound(this, new EventArgs()); + CheckUpdateCompleted(this, new EventArgs()); } } catch (Exception ex) diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs index 2e2f5528..7e86354c 100755 --- a/shadowsocks-csharp/Controller/ShadowsocksController.cs +++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs @@ -280,6 +280,12 @@ namespace Shadowsocks.Controller } } + public void ToggleCheckingUpdate(bool enabled) + { + _config.autoCheckUpdate = enabled; + Configuration.Save(_config); + } + protected void Reload() { // some logic in configuration updated the config when saving, we need to read it again diff --git a/shadowsocks-csharp/Data/cn.txt b/shadowsocks-csharp/Data/cn.txt index 259081da..3a641952 100644 --- a/shadowsocks-csharp/Data/cn.txt +++ b/shadowsocks-csharp/Data/cn.txt @@ -21,6 +21,9 @@ Show QRCode...=显示二维码... Scan QRCode from Screen...=扫描屏幕上的二维码... Availability Statistics=统计可用性 Show Logs...=显示日志... +Updates...=更新... +Check Updates...=检查更新 +Automatically Check Updates=自动检查更新 About...=关于... Quit=退出 Edit Servers=编辑服务器 @@ -78,6 +81,7 @@ Password can not be blank=密码不能为空 Port out of range=端口超出范围 Port can't be 8123=端口不能为 8123 Shadowsocks {0} Update Found=Shadowsocks {0} 更新 +No update is available=没有可用的更新 Click here to download=点击这里下载 Shadowsocks is here=Shadowsocks 在这里 You can turn on/off Shadowsocks in the context menu=可以在右键菜单中开关 Shadowsocks diff --git a/shadowsocks-csharp/Model/Configuration.cs b/shadowsocks-csharp/Model/Configuration.cs index 1ccba56c..35ee5235 100755 --- a/shadowsocks-csharp/Model/Configuration.cs +++ b/shadowsocks-csharp/Model/Configuration.cs @@ -23,6 +23,7 @@ namespace Shadowsocks.Model public string pacUrl; public bool useOnlinePac; public bool availabilityStatistics; + public bool autoCheckUpdate; private static string CONFIG_FILE = "gui-config.json"; @@ -76,6 +77,7 @@ namespace Shadowsocks.Model index = 0, isDefault = true, localPort = 1080, + autoCheckUpdate = true, configs = new List() { GetDefaultServer() diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index c8a4c0eb..441a27b2 100755 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -26,6 +26,7 @@ namespace Shadowsocks.View private ContextMenu contextMenu1; private bool _isFirstRun; + private bool _isStartupChecking; private MenuItem enableItem; private MenuItem modeItem; private MenuItem AutoStartupItem; @@ -42,6 +43,7 @@ namespace Shadowsocks.View private MenuItem updateFromGFWListItem; private MenuItem editGFWUserRuleItem; private MenuItem editOnlinePACItem; + private MenuItem autoCheckUpdatesToggleItem; private ConfigForm configForm; private string _urlToOpen; @@ -68,13 +70,19 @@ namespace Shadowsocks.View _notifyIcon.MouseDoubleClick += notifyIcon1_DoubleClick; this.updateChecker = new UpdateChecker(); - updateChecker.NewVersionFound += updateChecker_NewVersionFound; + updateChecker.CheckUpdateCompleted += updateChecker_CheckUpdateCompleted; LoadCurrentConfiguration(); - updateChecker.CheckUpdate(controller.GetConfigurationCopy()); + Configuration config = controller.GetConfigurationCopy(); - if (controller.GetConfigurationCopy().isDefault) + if (config.autoCheckUpdate) + { + _isStartupChecking = true; + updateChecker.CheckUpdate(config); + } + + if (config.isDefault) { _isFirstRun = true; ShowConfigForm(); @@ -182,6 +190,11 @@ namespace Shadowsocks.View this.ShareOverLANItem = CreateMenuItem("Allow Clients from LAN", new EventHandler(this.ShareOverLANItem_Click)), new MenuItem("-"), CreateMenuItem("Show Logs...", new EventHandler(this.ShowLogItem_Click)), + CreateMenuGroup("Updates...", new MenuItem[] { + CreateMenuItem("Check Updates...", new EventHandler(this.checkUpdatesItem_Click)), + new MenuItem("-"), + this.autoCheckUpdatesToggleItem = CreateMenuItem("Automatically Check Updates", new EventHandler(this.autoCheckUpdatesToggleItem_Click)), + }), CreateMenuItem("About...", new EventHandler(this.AboutItem_Click)), new MenuItem("-"), CreateMenuItem("Quit", new EventHandler(this.Quit_Click)) @@ -238,11 +251,20 @@ namespace Shadowsocks.View ShowBalloonTip(I18N.GetString("Shadowsocks"), result, ToolTipIcon.Info, 1000); } - void updateChecker_NewVersionFound(object sender, EventArgs e) + void updateChecker_CheckUpdateCompleted(object sender, EventArgs e) { - ShowBalloonTip(String.Format(I18N.GetString("Shadowsocks {0} Update Found"), updateChecker.LatestVersionNumber), I18N.GetString("Click here to download"), ToolTipIcon.Info, 5000); - _notifyIcon.BalloonTipClicked += notifyIcon1_BalloonTipClicked; - _isFirstRun = false; + if (updateChecker.NewVersionFound) + { + ShowBalloonTip(String.Format(I18N.GetString("Shadowsocks {0} Update Found"), updateChecker.LatestVersionNumber), I18N.GetString("Click here to download"), ToolTipIcon.Info, 5000); + _notifyIcon.BalloonTipClicked += notifyIcon1_BalloonTipClicked; + _isFirstRun = false; + } + else if (!_isStartupChecking) + { + ShowBalloonTip(I18N.GetString("Shadowsocks"), I18N.GetString("No update is available"), ToolTipIcon.Info, 5000); + _isFirstRun = false; + } + _isStartupChecking = false; } void notifyIcon1_BalloonTipClicked(object sender, EventArgs e) @@ -266,6 +288,7 @@ namespace Shadowsocks.View onlinePACItem.Checked = onlinePACItem.Enabled && config.useOnlinePac; localPACItem.Checked = !onlinePACItem.Checked; UpdatePACItemsEnabledStatus(); + UpdateUpdateMenu(); } private void UpdateServersMenu() @@ -343,7 +366,7 @@ namespace Shadowsocks.View if (_isFirstRun) { _notifyIcon.BalloonTipTitle = I18N.GetString("Shadowsocks is here"); - _notifyIcon.BalloonTipText = I18N.GetString("You can turn on/off Shadowsocks in the context menu"); + _notifyIcon.BalloonTipText = I18N.GetString("You can turn on/off Shadowsocks in the context menu"); _notifyIcon.BalloonTipIcon = ToolTipIcon.Info; _notifyIcon.ShowBalloonTip(0); _isFirstRun = false; @@ -591,5 +614,23 @@ namespace Shadowsocks.View this.editOnlinePACItem.Enabled = true; } } + + private void UpdateUpdateMenu() + { + Configuration configuration = controller.GetConfigurationCopy(); + autoCheckUpdatesToggleItem.Checked = configuration.autoCheckUpdate; + } + + private void autoCheckUpdatesToggleItem_Click(object sender, EventArgs e) + { + Configuration configuration = controller.GetConfigurationCopy(); + controller.ToggleCheckingUpdate(!configuration.autoCheckUpdate); + UpdateUpdateMenu(); + } + + private void checkUpdatesItem_Click(object sender, EventArgs e) + { + updateChecker.CheckUpdate(controller.GetConfigurationCopy()); + } } } From ab79dbce0e9d70e42c46488c08c1f7bf3e0dbe3b Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Mon, 21 Sep 2015 23:41:28 -0400 Subject: [PATCH 09/23] Download updates automatically --- .../Controller/Service/UpdateChecker.cs | 216 ++++++++++++++------- shadowsocks-csharp/Data/cn.txt | 2 +- shadowsocks-csharp/View/MenuViewController.cs | 5 +- 3 files changed, 149 insertions(+), 74 deletions(-) diff --git a/shadowsocks-csharp/Controller/Service/UpdateChecker.cs b/shadowsocks-csharp/Controller/Service/UpdateChecker.cs index a6709388..0955b255 100644 --- a/shadowsocks-csharp/Controller/Service/UpdateChecker.cs +++ b/shadowsocks-csharp/Controller/Service/UpdateChecker.cs @@ -1,138 +1,212 @@ -using Shadowsocks.Model; -using System; +using System; using System.Collections; using System.Collections.Generic; using System.Net; using System.Reflection; using System.Text; using System.Text.RegularExpressions; +using System.IO; using SimpleJson; +using Shadowsocks.Model; +using Shadowsocks.Util; + namespace Shadowsocks.Controller { public class UpdateChecker { private const string UpdateURL = "https://api.github.com/repos/shadowsocks/shadowsocks-windows/releases"; + private const string UserAgent = "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.3319.102 Safari/537.36"; + private Configuration config; public bool NewVersionFound; public string LatestVersionNumber; + public string LatestVersionName; public string LatestVersionURL; + public string LatestVersionLocalName; public event EventHandler CheckUpdateCompleted; public const string Version = "2.5.8"; public void CheckUpdate(Configuration config) { - // TODO test failures - WebClient http = new WebClient(); - http.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.3319.102 Safari/537.36"); - http.Proxy = new WebProxy(IPAddress.Loopback.ToString(), config.localPort); - http.DownloadStringCompleted += http_DownloadStringCompleted; - http.DownloadStringAsync(new Uri(UpdateURL)); + this.config = config; + + try + { + WebClient http = CreateWebClient(); + http.DownloadStringCompleted += http_DownloadStringCompleted; + http.DownloadStringAsync(new Uri(UpdateURL)); + } + catch (Exception ex) + { + Logging.LogUsefulException(ex); + } } - public static int CompareVersion(string l, string r) + private void http_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { - var ls = l.Split('.'); - var rs = r.Split('.'); - for (int i = 0; i < Math.Max(ls.Length, rs.Length); i++) + try { - int lp = (i < ls.Length) ? int.Parse(ls[i]) : 0; - int rp = (i < rs.Length) ? int.Parse(rs[i]) : 0; - if (lp != rp) + string response = e.Result; + + JsonArray result = (JsonArray)SimpleJson.SimpleJson.DeserializeObject(e.Result); + + List asserts = new List(); + foreach (JsonObject release in result) { - return lp - rp; + if ((bool)release["prerelease"]) + { + continue; + } + foreach (JsonObject asset in (JsonArray)release["assets"]) + { + Asset ass = new Asset(); + ass.Parse(asset); + if (ass.IsNewVersion(Version)) + { + asserts.Add(ass); + } + } + } + + if (asserts.Count != 0) + { + SortByVersions(asserts); + Asset asset = asserts[asserts.Count - 1]; + NewVersionFound = true; + LatestVersionURL = asset.browser_download_url; + LatestVersionNumber = asset.version; + LatestVersionName = asset.name; + + startDownload(); + } + else if (CheckUpdateCompleted != null) + { + CheckUpdateCompleted(this, new EventArgs()); } } - return 0; + catch (Exception ex) + { + Logging.LogUsefulException(ex); + } } - public class VersionComparer : IComparer + private void startDownload() { - // Calls CaseInsensitiveComparer.Compare with the parameters reversed. - public int Compare(string x, string y) + try + { + string temppath = Utils.GetTempPath(); + LatestVersionLocalName = Path.Combine(temppath, LatestVersionName); + WebClient http = CreateWebClient(); + http.DownloadFileCompleted += Http_DownloadFileCompleted; + http.DownloadFileAsync(new Uri(LatestVersionURL), LatestVersionLocalName); + } + catch (Exception ex) { - return CompareVersion(ParseVersionFromURL(x), ParseVersionFromURL(y)); + Logging.LogUsefulException(ex); } } - private static string ParseVersionFromURL(string url) + private void Http_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) { - Match match = Regex.Match(url, @".*Shadowsocks-win.*?-([\d\.]+)\.\w+", RegexOptions.IgnoreCase); - if (match.Success) + try { - if (match.Groups.Count == 2) + if(e.Error != null) { - return match.Groups[1].Value; + Logging.LogUsefulException(e.Error); + return; + } + if (CheckUpdateCompleted != null) + { + CheckUpdateCompleted(this, new EventArgs()); } } - return null; + catch (Exception ex) + { + Logging.LogUsefulException(ex); + } } - private void SortVersions(List versions) + private WebClient CreateWebClient() { - versions.Sort(new VersionComparer()); + WebClient http = new WebClient(); + http.Headers.Add("User-Agent", UserAgent); + http.Proxy = new WebProxy(IPAddress.Loopback.ToString(), config.localPort); + return http; } - private bool IsNewVersion(string url) + private void SortByVersions(List asserts) { - if (url.IndexOf("prerelease") >= 0) - { - return false; - } - string version = ParseVersionFromURL(url); - if (version == null) - { - return false; - } - string currentVersion = Version; - - return CompareVersion(version, currentVersion) > 0; + asserts.Sort(new VersionComparer()); } - private void http_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) + class Asset { - try + public bool prerelease; + public string name; + public string version; + public string browser_download_url; + + public bool IsNewVersion(string currentVersion) { - string response = e.Result; + if (prerelease) + { + return false; + } + if (version == null) + { + return false; + } + return CompareVersion(version, currentVersion) > 0; + } - JsonArray result = (JsonArray)SimpleJson.SimpleJson.DeserializeObject(e.Result); + public void Parse(JsonObject asset) + { + name = (string)asset["name"]; + browser_download_url = (string)asset["browser_download_url"]; + version = ParseVersionFromURL(browser_download_url); + prerelease = browser_download_url.IndexOf("prerelease") >= 0; + } - List versions = new List(); - foreach (JsonObject release in result) + private static string ParseVersionFromURL(string url) + { + Match match = Regex.Match(url, @".*Shadowsocks-win.*?-([\d\.]+)\.\w+", RegexOptions.IgnoreCase); + if (match.Success) { - if ((bool)release["prerelease"]) - { - continue; - } - foreach (JsonObject asset in (JsonArray)release["assets"]) + if (match.Groups.Count == 2) { - string url = (string)asset["browser_download_url"]; - if (IsNewVersion(url)) - { - versions.Add(url); - } + return match.Groups[1].Value; } } + return null; + } - if (versions.Count != 0) - { - // sort versions - SortVersions(versions); - NewVersionFound = true; - LatestVersionURL = versions[versions.Count - 1]; - LatestVersionNumber = ParseVersionFromURL(LatestVersionURL); - } - if (CheckUpdateCompleted != null) + public static int CompareVersion(string l, string r) + { + var ls = l.Split('.'); + var rs = r.Split('.'); + for (int i = 0; i < Math.Max(ls.Length, rs.Length); i++) { - CheckUpdateCompleted(this, new EventArgs()); + int lp = (i < ls.Length) ? int.Parse(ls[i]) : 0; + int rp = (i < rs.Length) ? int.Parse(rs[i]) : 0; + if (lp != rp) + { + return lp - rp; + } } + return 0; } - catch (Exception ex) + } + + class VersionComparer : IComparer + { + // Calls CaseInsensitiveComparer.Compare with the parameters reversed. + public int Compare(Asset x, Asset y) { - Logging.Debug(ex.ToString()); - return; + return Asset.CompareVersion(x.version, y.version); } } + } } diff --git a/shadowsocks-csharp/Data/cn.txt b/shadowsocks-csharp/Data/cn.txt index 3a641952..f2accf58 100644 --- a/shadowsocks-csharp/Data/cn.txt +++ b/shadowsocks-csharp/Data/cn.txt @@ -82,7 +82,7 @@ Port out of range=端口超出范围 Port can't be 8123=端口不能为 8123 Shadowsocks {0} Update Found=Shadowsocks {0} 更新 No update is available=没有可用的更新 -Click here to download=点击这里下载 +Click here to update=点击这里升级 Shadowsocks is here=Shadowsocks 在这里 You can turn on/off Shadowsocks in the context menu=可以在右键菜单中开关 Shadowsocks System Proxy Enabled=系统代理已启用 diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index 441a27b2..e729d943 100755 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -255,7 +255,7 @@ namespace Shadowsocks.View { if (updateChecker.NewVersionFound) { - ShowBalloonTip(String.Format(I18N.GetString("Shadowsocks {0} Update Found"), updateChecker.LatestVersionNumber), I18N.GetString("Click here to download"), ToolTipIcon.Info, 5000); + ShowBalloonTip(String.Format(I18N.GetString("Shadowsocks {0} Update Found"), updateChecker.LatestVersionNumber), I18N.GetString("Click here to update"), ToolTipIcon.Info, 5000); _notifyIcon.BalloonTipClicked += notifyIcon1_BalloonTipClicked; _isFirstRun = false; } @@ -269,8 +269,9 @@ namespace Shadowsocks.View void notifyIcon1_BalloonTipClicked(object sender, EventArgs e) { - System.Diagnostics.Process.Start(updateChecker.LatestVersionURL); _notifyIcon.BalloonTipClicked -= notifyIcon1_BalloonTipClicked; + string argument = "/select, \"" + updateChecker.LatestVersionLocalName + "\""; + System.Diagnostics.Process.Start("explorer.exe", argument); } From 1d1c325ce103b19bf5262f74bc35119aa28d5e96 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Tue, 22 Sep 2015 00:11:12 -0400 Subject: [PATCH 10/23] fix UnitTest --- shadowsocks-csharp/Controller/Service/UpdateChecker.cs | 2 +- test/UnitTest.cs | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/shadowsocks-csharp/Controller/Service/UpdateChecker.cs b/shadowsocks-csharp/Controller/Service/UpdateChecker.cs index 0955b255..643c7014 100644 --- a/shadowsocks-csharp/Controller/Service/UpdateChecker.cs +++ b/shadowsocks-csharp/Controller/Service/UpdateChecker.cs @@ -141,7 +141,7 @@ namespace Shadowsocks.Controller asserts.Sort(new VersionComparer()); } - class Asset + public class Asset { public bool prerelease; public string name; diff --git a/test/UnitTest.cs b/test/UnitTest.cs index bb95fa50..6003770e 100755 --- a/test/UnitTest.cs +++ b/test/UnitTest.cs @@ -13,13 +13,13 @@ namespace test [TestMethod] public void TestCompareVersion() { - Assert.IsTrue(UpdateChecker.CompareVersion("2.3.1.0", "2.3.1") == 0); - Assert.IsTrue(UpdateChecker.CompareVersion("1.2", "1.3") < 0); - Assert.IsTrue(UpdateChecker.CompareVersion("1.3", "1.2") > 0); - Assert.IsTrue(UpdateChecker.CompareVersion("1.3", "1.3") == 0); - Assert.IsTrue(UpdateChecker.CompareVersion("1.2.1", "1.2") > 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.Asset.CompareVersion("2.3.1.0", "2.3.1") == 0); + Assert.IsTrue(UpdateChecker.Asset.CompareVersion("1.2", "1.3") < 0); + Assert.IsTrue(UpdateChecker.Asset.CompareVersion("1.3", "1.2") > 0); + Assert.IsTrue(UpdateChecker.Asset.CompareVersion("1.3", "1.3") == 0); + Assert.IsTrue(UpdateChecker.Asset.CompareVersion("1.2.1", "1.2") > 0); + Assert.IsTrue(UpdateChecker.Asset.CompareVersion("2.3.1", "2.4") < 0); + Assert.IsTrue(UpdateChecker.Asset.CompareVersion("1.3.2", "1.3.1") > 0); } private void RunEncryptionRound(IEncryptor encryptor, IEncryptor decryptor) From 2ec13402619bd4e2106f6c2a63c0c7929091f169 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Tue, 22 Sep 2015 02:01:23 -0400 Subject: [PATCH 11/23] fix "Only TrueType fonts are supported. This is not a TrueType font." --- shadowsocks-csharp/View/LogForm.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/shadowsocks-csharp/View/LogForm.cs b/shadowsocks-csharp/View/LogForm.cs index c4fcaf51..3f4bc847 100644 --- a/shadowsocks-csharp/View/LogForm.cs +++ b/shadowsocks-csharp/View/LogForm.cs @@ -134,11 +134,19 @@ namespace Shadowsocks.View private void ChangeFontButton_Click(object sender, EventArgs e) { - FontDialog fd = new FontDialog(); - fd.Font = LogMessageTextBox.Font; - if (fd.ShowDialog() == DialogResult.OK) + try { - LogMessageTextBox.Font = fd.Font; + FontDialog fd = new FontDialog(); + fd.Font = LogMessageTextBox.Font; + if (fd.ShowDialog() == DialogResult.OK) + { + LogMessageTextBox.Font = new Font(fd.Font.FontFamily, fd.Font.Size, fd.Font.Style); + } + } + catch (Exception ex) + { + Logging.LogUsefulException(ex); + MessageBox.Show(ex.Message); } } From b197af124b1111c1d19010a1515a3c6d42ba8900 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Tue, 22 Sep 2015 06:36:15 -0400 Subject: [PATCH 12/23] fix bug: shadowsocks restart twice, when click Ok button on Edit Servers window --- shadowsocks-csharp/Controller/ShadowsocksController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs index 7e86354c..1debda15 100755 --- a/shadowsocks-csharp/Controller/ShadowsocksController.cs +++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs @@ -122,7 +122,7 @@ namespace Shadowsocks.Controller { _config.configs = servers; _config.localPort = localPort; - SaveConfig(_config); + Configuration.Save(_config); } public bool AddServerBySSURL(string ssURL) From b632d4a8a984957d86a9d25ff17058a0cc1f3beb Mon Sep 17 00:00:00 2001 From: kimw <1@kimwong.me> Date: Thu, 20 Aug 2015 17:17:21 +0800 Subject: [PATCH 13/23] improved `log viewer`: 1. add menu items for `clear logs`, `change fonts`, `wrap text` and `top most` functions. 2. hide toolbar default. but you can trigger it out by menu. --- shadowsocks-csharp/Data/cn.txt | 6 +- shadowsocks-csharp/View/LogForm.Designer.cs | 159 +++++++++++++++++++--------- shadowsocks-csharp/View/LogForm.cs | 109 +++++++++++++++++-- shadowsocks-csharp/View/LogForm.resx | 5 +- 4 files changed, 217 insertions(+), 62 deletions(-) diff --git a/shadowsocks-csharp/Data/cn.txt b/shadowsocks-csharp/Data/cn.txt index f2accf58..c8bde1ce 100644 --- a/shadowsocks-csharp/Data/cn.txt +++ b/shadowsocks-csharp/Data/cn.txt @@ -54,10 +54,12 @@ Move D&own=下移(&O) &File=文件(&F) &Open Location=在资源管理器中打开(&O) E&xit=退出(&X) -&Clean logs=清空(&C) -&Font=字体(&F) +&View=视图(&V) +&Clean logs=清空日志(&C) +Change &font=设置字体(&F) &Wrap text=自动换行(&W) &Top most=置顶(&T) +&Show toolbar=显示工具栏(&S) Log Viewer=日志查看器 # QRCode Form diff --git a/shadowsocks-csharp/View/LogForm.Designer.cs b/shadowsocks-csharp/View/LogForm.Designer.cs index d0913d16..187ab948 100644 --- a/shadowsocks-csharp/View/LogForm.Designer.cs +++ b/shadowsocks-csharp/View/LogForm.Designer.cs @@ -30,19 +30,25 @@ { this.components = new System.ComponentModel.Container(); this.LogMessageTextBox = new System.Windows.Forms.TextBox(); - this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); - this.mainMenu1 = new System.Windows.Forms.MainMenu(this.components); + this.MainMenu = new System.Windows.Forms.MainMenu(this.components); this.FileMenuItem = new System.Windows.Forms.MenuItem(); this.OpenLocationMenuItem = new System.Windows.Forms.MenuItem(); this.ExitMenuItem = new System.Windows.Forms.MenuItem(); - this.panel1 = new System.Windows.Forms.Panel(); + this.ViewMenuItem = new System.Windows.Forms.MenuItem(); + this.CleanLogsMenuItem = new System.Windows.Forms.MenuItem(); + this.ChangeFontMenuItem = new System.Windows.Forms.MenuItem(); + this.WrapTextMenuItem = new System.Windows.Forms.MenuItem(); + this.TopMostMenuItem = new System.Windows.Forms.MenuItem(); + this.MenuItemSeparater = new System.Windows.Forms.MenuItem(); + this.ShowToolbarMenuItem = new System.Windows.Forms.MenuItem(); + this.TopMostCheckBox = new System.Windows.Forms.CheckBox(); this.ChangeFontButton = new System.Windows.Forms.Button(); this.CleanLogsButton = new System.Windows.Forms.Button(); this.WrapTextCheckBox = new System.Windows.Forms.CheckBox(); this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); - this.TopMostCheckBox = new System.Windows.Forms.CheckBox(); - this.panel1.SuspendLayout(); + this.ToolbarFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel(); this.tableLayoutPanel1.SuspendLayout(); + this.ToolbarFlowLayoutPanel.SuspendLayout(); this.SuspendLayout(); // // LogMessageTextBox @@ -51,25 +57,20 @@ this.LogMessageTextBox.Dock = System.Windows.Forms.DockStyle.Fill; this.LogMessageTextBox.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.LogMessageTextBox.ForeColor = System.Drawing.Color.White; - this.LogMessageTextBox.Location = new System.Drawing.Point(3, 43); + this.LogMessageTextBox.Location = new System.Drawing.Point(3, 38); this.LogMessageTextBox.MaxLength = 2147483647; this.LogMessageTextBox.Multiline = true; this.LogMessageTextBox.Name = "LogMessageTextBox"; this.LogMessageTextBox.ReadOnly = true; this.LogMessageTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.LogMessageTextBox.Size = new System.Drawing.Size(541, 307); + this.LogMessageTextBox.Size = new System.Drawing.Size(584, 377); this.LogMessageTextBox.TabIndex = 0; - this.LogMessageTextBox.WordWrap = false; - // - // contextMenuStrip1 // - this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(61, 4); + // MainMenu // - // mainMenu1 - // - this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { - this.FileMenuItem}); + this.MainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { + this.FileMenuItem, + this.ViewMenuItem}); // // FileMenuItem // @@ -91,21 +92,70 @@ this.ExitMenuItem.Text = "E&xit"; this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click); // - // panel1 + // ViewMenuItem + // + this.ViewMenuItem.Index = 1; + this.ViewMenuItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { + this.CleanLogsMenuItem, + this.ChangeFontMenuItem, + this.WrapTextMenuItem, + this.TopMostMenuItem, + this.MenuItemSeparater, + this.ShowToolbarMenuItem}); + this.ViewMenuItem.Text = "&View"; + // + // CleanLogsMenuItem + // + this.CleanLogsMenuItem.Index = 0; + this.CleanLogsMenuItem.Text = "&Clean logs"; + this.CleanLogsMenuItem.Click += new System.EventHandler(this.CleanLogsMenuItem_Click); + // + // ChangeFontMenuItem + // + this.ChangeFontMenuItem.Index = 1; + this.ChangeFontMenuItem.Text = "Change &font"; + this.ChangeFontMenuItem.Click += new System.EventHandler(this.ChangeFontMenuItem_Click); // - this.panel1.Controls.Add(this.TopMostCheckBox); - this.panel1.Controls.Add(this.ChangeFontButton); - this.panel1.Controls.Add(this.CleanLogsButton); - this.panel1.Controls.Add(this.WrapTextCheckBox); - this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; - this.panel1.Location = new System.Drawing.Point(3, 3); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(541, 34); - this.panel1.TabIndex = 1; + // WrapTextMenuItem + // + this.WrapTextMenuItem.Index = 2; + this.WrapTextMenuItem.Text = "&Wrap text"; + this.WrapTextMenuItem.Click += new System.EventHandler(this.WrapTextMenuItem_Click); + // + // TopMostMenuItem + // + this.TopMostMenuItem.Index = 3; + this.TopMostMenuItem.Text = "&Top most"; + this.TopMostMenuItem.Click += new System.EventHandler(this.TopMostMenuItem_Click); + // + // MenuItemSeparater + // + this.MenuItemSeparater.Index = 4; + this.MenuItemSeparater.Text = "-"; + // + // ShowToolbarMenuItem + // + this.ShowToolbarMenuItem.Index = 5; + this.ShowToolbarMenuItem.Text = "&Show toolbar"; + this.ShowToolbarMenuItem.Click += new System.EventHandler(this.ShowToolbarMenuItem_Click); + // + // TopMostCheckBox + // + this.TopMostCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.TopMostCheckBox.AutoSize = true; + this.TopMostCheckBox.Location = new System.Drawing.Point(249, 3); + this.TopMostCheckBox.Name = "TopMostCheckBox"; + this.TopMostCheckBox.Size = new System.Drawing.Size(72, 23); + this.TopMostCheckBox.TabIndex = 3; + this.TopMostCheckBox.Text = "&Top most"; + this.TopMostCheckBox.UseVisualStyleBackColor = true; + this.TopMostCheckBox.CheckedChanged += new System.EventHandler(this.TopMostCheckBox_CheckedChanged); // // ChangeFontButton // - this.ChangeFontButton.Location = new System.Drawing.Point(107, 4); + this.ChangeFontButton.AutoSize = true; + this.ChangeFontButton.Location = new System.Drawing.Point(84, 3); this.ChangeFontButton.Name = "ChangeFontButton"; this.ChangeFontButton.Size = new System.Drawing.Size(75, 23); this.ChangeFontButton.TabIndex = 2; @@ -115,7 +165,8 @@ // // CleanLogsButton // - this.CleanLogsButton.Location = new System.Drawing.Point(9, 4); + this.CleanLogsButton.AutoSize = true; + this.CleanLogsButton.Location = new System.Drawing.Point(3, 3); this.CleanLogsButton.Name = "CleanLogsButton"; this.CleanLogsButton.Size = new System.Drawing.Size(75, 23); this.CleanLogsButton.TabIndex = 1; @@ -125,10 +176,12 @@ // // WrapTextCheckBox // + this.WrapTextCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); this.WrapTextCheckBox.AutoSize = true; - this.WrapTextCheckBox.Location = new System.Drawing.Point(209, 9); + this.WrapTextCheckBox.Location = new System.Drawing.Point(165, 3); this.WrapTextCheckBox.Name = "WrapTextCheckBox"; - this.WrapTextCheckBox.Size = new System.Drawing.Size(78, 16); + this.WrapTextCheckBox.Size = new System.Drawing.Size(78, 23); this.WrapTextCheckBox.TabIndex = 0; this.WrapTextCheckBox.Text = "&Wrap text"; this.WrapTextCheckBox.UseVisualStyleBackColor = true; @@ -138,45 +191,47 @@ // this.tableLayoutPanel1.ColumnCount = 1; this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); - this.tableLayoutPanel1.Controls.Add(this.panel1, 0, 0); this.tableLayoutPanel1.Controls.Add(this.LogMessageTextBox, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.ToolbarFlowLayoutPanel, 0, 0); this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); this.tableLayoutPanel1.Name = "tableLayoutPanel1"; this.tableLayoutPanel1.RowCount = 2; - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F)); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.Size = new System.Drawing.Size(547, 353); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.Size = new System.Drawing.Size(590, 418); this.tableLayoutPanel1.TabIndex = 2; // - // TopMostCheckBox + // ToolbarFlowLayoutPanel // - this.TopMostCheckBox.AutoSize = true; - this.TopMostCheckBox.Location = new System.Drawing.Point(311, 9); - this.TopMostCheckBox.Name = "TopMostCheckBox"; - this.TopMostCheckBox.Size = new System.Drawing.Size(72, 16); - this.TopMostCheckBox.TabIndex = 3; - this.TopMostCheckBox.Text = "&Top most"; - this.TopMostCheckBox.UseVisualStyleBackColor = true; - this.TopMostCheckBox.CheckedChanged += new System.EventHandler(this.TopMostCheckBox_CheckedChanged); + this.ToolbarFlowLayoutPanel.AutoSize = true; + this.ToolbarFlowLayoutPanel.Controls.Add(this.CleanLogsButton); + this.ToolbarFlowLayoutPanel.Controls.Add(this.ChangeFontButton); + this.ToolbarFlowLayoutPanel.Controls.Add(this.WrapTextCheckBox); + this.ToolbarFlowLayoutPanel.Controls.Add(this.TopMostCheckBox); + this.ToolbarFlowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.ToolbarFlowLayoutPanel.Location = new System.Drawing.Point(3, 3); + this.ToolbarFlowLayoutPanel.Name = "ToolbarFlowLayoutPanel"; + this.ToolbarFlowLayoutPanel.Size = new System.Drawing.Size(584, 29); + this.ToolbarFlowLayoutPanel.TabIndex = 2; // // LogForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(547, 353); + this.ClientSize = new System.Drawing.Size(590, 418); this.Controls.Add(this.tableLayoutPanel1); - this.Menu = this.mainMenu1; + this.Menu = this.MainMenu; this.Name = "LogForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Log Viewer"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.LogForm_FormClosing); this.Load += new System.EventHandler(this.LogForm_Load); this.Shown += new System.EventHandler(this.LogForm_Shown); - this.panel1.ResumeLayout(false); - this.panel1.PerformLayout(); this.tableLayoutPanel1.ResumeLayout(false); this.tableLayoutPanel1.PerformLayout(); + this.ToolbarFlowLayoutPanel.ResumeLayout(false); + this.ToolbarFlowLayoutPanel.PerformLayout(); this.ResumeLayout(false); } @@ -184,16 +239,22 @@ #endregion private System.Windows.Forms.TextBox LogMessageTextBox; - private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; - private System.Windows.Forms.MainMenu mainMenu1; + private System.Windows.Forms.MainMenu MainMenu; private System.Windows.Forms.MenuItem FileMenuItem; private System.Windows.Forms.MenuItem OpenLocationMenuItem; private System.Windows.Forms.MenuItem ExitMenuItem; - private System.Windows.Forms.Panel panel1; private System.Windows.Forms.CheckBox WrapTextCheckBox; private System.Windows.Forms.Button CleanLogsButton; private System.Windows.Forms.Button ChangeFontButton; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; private System.Windows.Forms.CheckBox TopMostCheckBox; + private System.Windows.Forms.MenuItem ViewMenuItem; + private System.Windows.Forms.MenuItem CleanLogsMenuItem; + private System.Windows.Forms.MenuItem ChangeFontMenuItem; + private System.Windows.Forms.MenuItem WrapTextMenuItem; + private System.Windows.Forms.MenuItem TopMostMenuItem; + private System.Windows.Forms.FlowLayoutPanel ToolbarFlowLayoutPanel; + private System.Windows.Forms.MenuItem MenuItemSeparater; + private System.Windows.Forms.MenuItem ShowToolbarMenuItem; } } \ No newline at end of file diff --git a/shadowsocks-csharp/View/LogForm.cs b/shadowsocks-csharp/View/LogForm.cs index 3f4bc847..a9b85d52 100644 --- a/shadowsocks-csharp/View/LogForm.cs +++ b/shadowsocks-csharp/View/LogForm.cs @@ -34,9 +34,15 @@ namespace Shadowsocks.View OpenLocationMenuItem.Text = I18N.GetString("&Open Location"); ExitMenuItem.Text = I18N.GetString("E&xit"); CleanLogsButton.Text = I18N.GetString("&Clean logs"); - ChangeFontButton.Text = I18N.GetString("&Font"); + ChangeFontButton.Text = I18N.GetString("Change &font"); WrapTextCheckBox.Text = I18N.GetString("&Wrap text"); TopMostCheckBox.Text = I18N.GetString("&Top most"); + ViewMenuItem.Text = I18N.GetString("&View"); + CleanLogsMenuItem.Text = I18N.GetString("&Clean logs"); + ChangeFontMenuItem.Text = I18N.GetString("Change &font"); + WrapTextMenuItem.Text = I18N.GetString("&Wrap text"); + TopMostMenuItem.Text = I18N.GetString("&Top most"); + ShowToolbarMenuItem.Text = I18N.GetString("&Show toolbar"); this.Text = I18N.GetString("Log Viewer"); } @@ -97,6 +103,9 @@ namespace Shadowsocks.View timer.Interval = 300; timer.Tick += Timer_Tick; timer.Start(); + this.TopMost = TopMostMenuItem.Checked = TopMostCheckBox.Checked = TopMostTrigger; + LogMessageTextBox.WordWrap = WrapTextCheckBox.Checked = WrapTextMenuItem.Checked = WrapTextTrigger; + ToolbarFlowLayoutPanel.Visible = ShowToolbarTrigger; } private void LogForm_FormClosing(object sender, FormClosingEventArgs e) @@ -121,18 +130,25 @@ namespace Shadowsocks.View LogMessageTextBox.ScrollToCaret(); } - private void WrapTextCheckBox_CheckedChanged(object sender, EventArgs e) + #region Clean up the content in LogMessageTextBox. + private void DoCleanLogs() { - LogMessageTextBox.WordWrap = WrapTextCheckBox.Checked; - LogMessageTextBox.ScrollToCaret(); + LogMessageTextBox.Clear(); + } + + private void CleanLogsMenuItem_Click(object sender, EventArgs e) + { + DoCleanLogs(); } private void CleanLogsButton_Click(object sender, EventArgs e) { - LogMessageTextBox.Clear(); + DoCleanLogs(); } + #endregion - private void ChangeFontButton_Click(object sender, EventArgs e) + #region Change the font settings applied in LogMessageTextBox. + private void DoChangeFont() { try { @@ -150,9 +166,88 @@ namespace Shadowsocks.View } } + private void ChangeFontMenuItem_Click(object sender, EventArgs e) + { + DoChangeFont(); + } + + private void ChangeFontButton_Click(object sender, EventArgs e) + { + DoChangeFont(); + } + #endregion + + #region Trigger the log messages wrapable, or not. + bool WrapTextTrigger = false; + bool WrapTextTriggerLock = false; + + private void TriggerWrapText() + { + WrapTextTriggerLock = true; + + WrapTextTrigger = !WrapTextTrigger; + LogMessageTextBox.WordWrap = WrapTextTrigger; + LogMessageTextBox.ScrollToCaret(); + WrapTextMenuItem.Checked = WrapTextCheckBox.Checked = WrapTextTrigger; + + WrapTextTriggerLock = false; + } + + private void WrapTextMenuItem_Click(object sender, EventArgs e) + { + if (!WrapTextTriggerLock) + { + TriggerWrapText(); + } + } + + private void WrapTextCheckBox_CheckedChanged(object sender, EventArgs e) + { + if (!WrapTextTriggerLock) + { + TriggerWrapText(); + } + } + #endregion + + #region Trigger this window top most, or not. + bool TopMostTrigger = false; + bool TopMostTriggerLock = false; + + private void TriggerTopMost() + { + TopMostTriggerLock = true; + + TopMostTrigger = !TopMostTrigger; + this.TopMost = TopMostTrigger; + TopMostMenuItem.Checked = TopMostCheckBox.Checked = TopMostTrigger; + + TopMostTriggerLock = false; + } + private void TopMostCheckBox_CheckedChanged(object sender, EventArgs e) { - this.TopMost = TopMostCheckBox.Checked; + if (!TopMostTriggerLock) + { + TriggerTopMost(); + } + } + + private void TopMostMenuItem_Click(object sender, EventArgs e) + { + if (!TopMostTriggerLock) + { + TriggerTopMost(); + } + } + #endregion + + private bool ShowToolbarTrigger = false; + private void ShowToolbarMenuItem_Click(object sender, EventArgs e) + { + ShowToolbarTrigger = !ShowToolbarTrigger; + ToolbarFlowLayoutPanel.Visible = ShowToolbarTrigger; + ShowToolbarMenuItem.Checked = ShowToolbarTrigger; } } } diff --git a/shadowsocks-csharp/View/LogForm.resx b/shadowsocks-csharp/View/LogForm.resx index 34b690ce..e8bf04bf 100644 --- a/shadowsocks-csharp/View/LogForm.resx +++ b/shadowsocks-csharp/View/LogForm.resx @@ -117,10 +117,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 17, 17 - - 172, 17 - \ No newline at end of file From f1019b4aad868caaecbf46358b09c9d25e0ce585 Mon Sep 17 00:00:00 2001 From: kimw <1@kimwong.me> Date: Thu, 20 Aug 2015 21:01:40 +0800 Subject: [PATCH 14/23] fix variables' name: (first letter uppercase -> lowercase) 1. WrapTextTrigger -> wrapTextTrigger 2. WrapTextTriggerLock -> wrapTextTriggerLock 3. TopMostTrigger -> topMostTrigger 4. TopMostTriggerLock -> topMostTriggerLock 5. ShowToolbarTrigger -> toolbarTrigger --- shadowsocks-csharp/View/LogForm.cs | 50 +++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/shadowsocks-csharp/View/LogForm.cs b/shadowsocks-csharp/View/LogForm.cs index a9b85d52..c906b7d5 100644 --- a/shadowsocks-csharp/View/LogForm.cs +++ b/shadowsocks-csharp/View/LogForm.cs @@ -103,9 +103,9 @@ namespace Shadowsocks.View timer.Interval = 300; timer.Tick += Timer_Tick; timer.Start(); - this.TopMost = TopMostMenuItem.Checked = TopMostCheckBox.Checked = TopMostTrigger; - LogMessageTextBox.WordWrap = WrapTextCheckBox.Checked = WrapTextMenuItem.Checked = WrapTextTrigger; - ToolbarFlowLayoutPanel.Visible = ShowToolbarTrigger; + this.TopMost = TopMostMenuItem.Checked = TopMostCheckBox.Checked = topMostTrigger; + LogMessageTextBox.WordWrap = WrapTextCheckBox.Checked = WrapTextMenuItem.Checked = wrapTextTrigger; + ToolbarFlowLayoutPanel.Visible = toolbarTrigger; } private void LogForm_FormClosing(object sender, FormClosingEventArgs e) @@ -178,24 +178,24 @@ namespace Shadowsocks.View #endregion #region Trigger the log messages wrapable, or not. - bool WrapTextTrigger = false; - bool WrapTextTriggerLock = false; + bool wrapTextTrigger = false; + bool wrapTextTriggerLock = false; private void TriggerWrapText() { - WrapTextTriggerLock = true; + wrapTextTriggerLock = true; - WrapTextTrigger = !WrapTextTrigger; - LogMessageTextBox.WordWrap = WrapTextTrigger; + wrapTextTrigger = !wrapTextTrigger; + LogMessageTextBox.WordWrap = wrapTextTrigger; LogMessageTextBox.ScrollToCaret(); - WrapTextMenuItem.Checked = WrapTextCheckBox.Checked = WrapTextTrigger; + WrapTextMenuItem.Checked = WrapTextCheckBox.Checked = wrapTextTrigger; - WrapTextTriggerLock = false; + wrapTextTriggerLock = false; } private void WrapTextMenuItem_Click(object sender, EventArgs e) { - if (!WrapTextTriggerLock) + if (!wrapTextTriggerLock) { TriggerWrapText(); } @@ -203,7 +203,7 @@ namespace Shadowsocks.View private void WrapTextCheckBox_CheckedChanged(object sender, EventArgs e) { - if (!WrapTextTriggerLock) + if (!wrapTextTriggerLock) { TriggerWrapText(); } @@ -211,23 +211,23 @@ namespace Shadowsocks.View #endregion #region Trigger this window top most, or not. - bool TopMostTrigger = false; - bool TopMostTriggerLock = false; + bool topMostTrigger = false; + bool topMostTriggerLock = false; private void TriggerTopMost() { - TopMostTriggerLock = true; + topMostTriggerLock = true; - TopMostTrigger = !TopMostTrigger; - this.TopMost = TopMostTrigger; - TopMostMenuItem.Checked = TopMostCheckBox.Checked = TopMostTrigger; + topMostTrigger = !topMostTrigger; + this.TopMost = topMostTrigger; + TopMostMenuItem.Checked = TopMostCheckBox.Checked = topMostTrigger; - TopMostTriggerLock = false; + topMostTriggerLock = false; } private void TopMostCheckBox_CheckedChanged(object sender, EventArgs e) { - if (!TopMostTriggerLock) + if (!topMostTriggerLock) { TriggerTopMost(); } @@ -235,19 +235,19 @@ namespace Shadowsocks.View private void TopMostMenuItem_Click(object sender, EventArgs e) { - if (!TopMostTriggerLock) + if (!topMostTriggerLock) { TriggerTopMost(); } } #endregion - private bool ShowToolbarTrigger = false; + private bool toolbarTrigger = false; private void ShowToolbarMenuItem_Click(object sender, EventArgs e) { - ShowToolbarTrigger = !ShowToolbarTrigger; - ToolbarFlowLayoutPanel.Visible = ShowToolbarTrigger; - ShowToolbarMenuItem.Checked = ShowToolbarTrigger; + toolbarTrigger = !toolbarTrigger; + ToolbarFlowLayoutPanel.Visible = toolbarTrigger; + ShowToolbarMenuItem.Checked = toolbarTrigger; } } } From 0eee5cd98f2e30edb3f4e29b970aba390980668e Mon Sep 17 00:00:00 2001 From: kimw <1@kimwong.me> Date: Thu, 20 Aug 2015 21:03:38 +0800 Subject: [PATCH 15/23] add feature: save LogForm's config into json file. --- shadowsocks-csharp/Model/Configuration.cs | 1 + shadowsocks-csharp/Model/LogViewerConfig.cs | 63 ++++++++++++++++++++++++++++ shadowsocks-csharp/View/LogForm.cs | 36 +++++++++++++++- shadowsocks-csharp/shadowsocks-csharp.csproj | 1 + 4 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 shadowsocks-csharp/Model/LogViewerConfig.cs diff --git a/shadowsocks-csharp/Model/Configuration.cs b/shadowsocks-csharp/Model/Configuration.cs index 35ee5235..cf506072 100755 --- a/shadowsocks-csharp/Model/Configuration.cs +++ b/shadowsocks-csharp/Model/Configuration.cs @@ -24,6 +24,7 @@ namespace Shadowsocks.Model public bool useOnlinePac; public bool availabilityStatistics; public bool autoCheckUpdate; + public LogViewerConfig logViewer; private static string CONFIG_FILE = "gui-config.json"; diff --git a/shadowsocks-csharp/Model/LogViewerConfig.cs b/shadowsocks-csharp/Model/LogViewerConfig.cs new file mode 100644 index 00000000..28471084 --- /dev/null +++ b/shadowsocks-csharp/Model/LogViewerConfig.cs @@ -0,0 +1,63 @@ +using System; +using System.Drawing; + +namespace Shadowsocks.Model +{ + [Serializable] + public class LogViewerConfig + { + public string fontName; + public float fontSize; + public string bgColor; + public string textColor; + public bool topMost; + public bool wrapText; + public bool toolbarShown; + + public LogViewerConfig() + { + this.fontName = "Console"; + this.fontSize = 8; + this.bgColor = "black"; + this.textColor = "white"; + this.topMost = false; + this.wrapText = false; + this.toolbarShown = false; + } + + public Color GetBackgroundColor() + { + try + { + return ColorTranslator.FromHtml(bgColor); + } + catch (Exception) + { + return ColorTranslator.FromHtml("black"); + } + } + + public void SetBackgroundColor(Color color) + { + bgColor = ColorTranslator.ToHtml(color); + } + + public Color GetTextColor() + { + try + { + return ColorTranslator.FromHtml(textColor); + } + catch (Exception) + { + return ColorTranslator.FromHtml("white"); + throw; + } + } + + public void SetTextColor(Color color) + { + textColor = ColorTranslator.ToHtml(color); + } + } +} diff --git a/shadowsocks-csharp/View/LogForm.cs b/shadowsocks-csharp/View/LogForm.cs index c906b7d5..ab16faf0 100644 --- a/shadowsocks-csharp/View/LogForm.cs +++ b/shadowsocks-csharp/View/LogForm.cs @@ -18,6 +18,7 @@ namespace Shadowsocks.View string filename; Timer timer; const int BACK_OFFSET = 65536; + Model.Configuration config; public LogForm(string filename) { @@ -25,6 +26,21 @@ namespace Shadowsocks.View InitializeComponent(); this.Icon = Icon.FromHandle(Resources.ssw128.GetHicon()); + config = Model.Configuration.Load(); + if (config.logViewer == null) + { + config.logViewer = new Model.LogViewerConfig(); + } + else + { + topMostTrigger = config.logViewer.topMost; + wrapTextTrigger = config.logViewer.wrapText; + toolbarTrigger = config.logViewer.toolbarShown; + LogMessageTextBox.Font = new Font(config.logViewer.fontName, config.logViewer.fontSize); + LogMessageTextBox.BackColor = config.logViewer.GetBackgroundColor(); + LogMessageTextBox.ForeColor = config.logViewer.GetTextColor(); + } + UpdateTexts(); } @@ -103,14 +119,29 @@ namespace Shadowsocks.View timer.Interval = 300; timer.Tick += Timer_Tick; timer.Start(); + + topMostTriggerLock = true; this.TopMost = TopMostMenuItem.Checked = TopMostCheckBox.Checked = topMostTrigger; - LogMessageTextBox.WordWrap = WrapTextCheckBox.Checked = WrapTextMenuItem.Checked = wrapTextTrigger; - ToolbarFlowLayoutPanel.Visible = toolbarTrigger; + topMostTriggerLock = false; + + wrapTextTriggerLock = true; + LogMessageTextBox.WordWrap = WrapTextMenuItem.Checked = WrapTextCheckBox.Checked = wrapTextTrigger; + wrapTextTriggerLock = false; + + ToolbarFlowLayoutPanel.Visible = ShowToolbarMenuItem.Checked = toolbarTrigger; } private void LogForm_FormClosing(object sender, FormClosingEventArgs e) { timer.Stop(); + config.logViewer.topMost = topMostTrigger; + config.logViewer.wrapText = wrapTextTrigger; + config.logViewer.toolbarShown = toolbarTrigger; + config.logViewer.fontName = LogMessageTextBox.Font.Name; + config.logViewer.fontSize = LogMessageTextBox.Font.Size; + config.logViewer.SetBackgroundColor(LogMessageTextBox.BackColor); + config.logViewer.SetTextColor(LogMessageTextBox.ForeColor); + Model.Configuration.Save(config); } private void OpenLocationMenuItem_Click(object sender, EventArgs e) @@ -243,6 +274,7 @@ namespace Shadowsocks.View #endregion private bool toolbarTrigger = false; + private void ShowToolbarMenuItem_Click(object sender, EventArgs e) { toolbarTrigger = !toolbarTrigger; diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index 8200aa07..dd957ffb 100644 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -145,6 +145,7 @@ + From a070c3c98617889c5e92732902c26f4fd23021ed Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Tue, 22 Sep 2015 23:38:38 +0800 Subject: [PATCH 16/23] small fix --- .../Controller/ShadowsocksController.cs | 6 +++ shadowsocks-csharp/Model/LogViewerConfig.cs | 19 +++++++- shadowsocks-csharp/View/LogForm.cs | 54 +++++++++++----------- shadowsocks-csharp/View/MenuViewController.cs | 2 +- 4 files changed, 52 insertions(+), 29 deletions(-) diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs index 1debda15..40496cfe 100755 --- a/shadowsocks-csharp/Controller/ShadowsocksController.cs +++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs @@ -286,6 +286,12 @@ namespace Shadowsocks.Controller Configuration.Save(_config); } + public void SaveLogViewerConfig(LogViewerConfig newConfig) + { + _config.logViewer = newConfig; + Configuration.Save(_config); + } + protected void Reload() { // some logic in configuration updated the config when saving, we need to read it again diff --git a/shadowsocks-csharp/Model/LogViewerConfig.cs b/shadowsocks-csharp/Model/LogViewerConfig.cs index 28471084..245e5ddb 100644 --- a/shadowsocks-csharp/Model/LogViewerConfig.cs +++ b/shadowsocks-csharp/Model/LogViewerConfig.cs @@ -25,6 +25,24 @@ namespace Shadowsocks.Model this.toolbarShown = false; } + public Font GetFont() + { + try + { + return new Font(fontName, fontSize); + } + catch (Exception) + { + return new Font("Console", 8F); + } + } + + public void SetFont(Font font) + { + fontName = font.Name; + fontSize = font.Size; + } + public Color GetBackgroundColor() { try @@ -51,7 +69,6 @@ namespace Shadowsocks.Model catch (Exception) { return ColorTranslator.FromHtml("white"); - throw; } } diff --git a/shadowsocks-csharp/View/LogForm.cs b/shadowsocks-csharp/View/LogForm.cs index ab16faf0..ff1c9bb8 100644 --- a/shadowsocks-csharp/View/LogForm.cs +++ b/shadowsocks-csharp/View/LogForm.cs @@ -1,6 +1,4 @@ -using Shadowsocks.Controller; -using Shadowsocks.Properties; -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; @@ -10,6 +8,10 @@ using System.Linq; using System.Text; using System.Windows.Forms; +using Shadowsocks.Controller; +using Shadowsocks.Properties; +using Shadowsocks.Model; + namespace Shadowsocks.View { public partial class LogForm : Form @@ -18,28 +20,24 @@ namespace Shadowsocks.View string filename; Timer timer; const int BACK_OFFSET = 65536; - Model.Configuration config; + ShadowsocksController controller; - public LogForm(string filename) + public LogForm(ShadowsocksController controller, string filename) { + this.controller = controller; this.filename = filename; InitializeComponent(); this.Icon = Icon.FromHandle(Resources.ssw128.GetHicon()); - config = Model.Configuration.Load(); - if (config.logViewer == null) - { - config.logViewer = new Model.LogViewerConfig(); - } - else - { - topMostTrigger = config.logViewer.topMost; - wrapTextTrigger = config.logViewer.wrapText; - toolbarTrigger = config.logViewer.toolbarShown; - LogMessageTextBox.Font = new Font(config.logViewer.fontName, config.logViewer.fontSize); - LogMessageTextBox.BackColor = config.logViewer.GetBackgroundColor(); - LogMessageTextBox.ForeColor = config.logViewer.GetTextColor(); - } + LogViewerConfig config = controller.GetConfigurationCopy().logViewer; + if (config == null) + config = new LogViewerConfig(); + topMostTrigger = config.topMost; + wrapTextTrigger = config.wrapText; + toolbarTrigger = config.toolbarShown; + LogMessageTextBox.BackColor = config.GetBackgroundColor(); + LogMessageTextBox.ForeColor = config.GetTextColor(); + LogMessageTextBox.Font = config.GetFont(); UpdateTexts(); } @@ -134,14 +132,16 @@ namespace Shadowsocks.View private void LogForm_FormClosing(object sender, FormClosingEventArgs e) { timer.Stop(); - config.logViewer.topMost = topMostTrigger; - config.logViewer.wrapText = wrapTextTrigger; - config.logViewer.toolbarShown = toolbarTrigger; - config.logViewer.fontName = LogMessageTextBox.Font.Name; - config.logViewer.fontSize = LogMessageTextBox.Font.Size; - config.logViewer.SetBackgroundColor(LogMessageTextBox.BackColor); - config.logViewer.SetTextColor(LogMessageTextBox.ForeColor); - Model.Configuration.Save(config); + LogViewerConfig config = controller.GetConfigurationCopy().logViewer; + if (config == null) + config = new LogViewerConfig(); + config.topMost = topMostTrigger; + config.wrapText = wrapTextTrigger; + config.toolbarShown = toolbarTrigger; + config.SetFont(LogMessageTextBox.Font); + config.SetBackgroundColor(LogMessageTextBox.BackColor); + config.SetTextColor(LogMessageTextBox.ForeColor); + controller.SaveLogViewerConfig(config); } private void OpenLocationMenuItem_Click(object sender, EventArgs e) diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index e729d943..a3c383df 100755 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -439,7 +439,7 @@ namespace Shadowsocks.View { string argument = Logging.LogFile; - new LogForm(argument).Show(); + new LogForm(controller, argument).Show(); } private void QRCodeItem_Click(object sender, EventArgs e) From 969ee15ad64a743aacdb10ee5e85cb6af4921a53 Mon Sep 17 00:00:00 2001 From: kimw <1@kimwong.me> Date: Fri, 21 Aug 2015 17:12:11 +0800 Subject: [PATCH 17/23] convert "\r\n" -> Environment.NewLine --- shadowsocks-csharp/View/LogForm.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shadowsocks-csharp/View/LogForm.cs b/shadowsocks-csharp/View/LogForm.cs index ff1c9bb8..f7d0e4f3 100644 --- a/shadowsocks-csharp/View/LogForm.cs +++ b/shadowsocks-csharp/View/LogForm.cs @@ -78,7 +78,7 @@ namespace Shadowsocks.View string line = ""; while ((line = reader.ReadLine()) != null) - LogMessageTextBox.AppendText(line + "\r\n"); + LogMessageTextBox.AppendText(line + Environment.NewLine); LogMessageTextBox.ScrollToCaret(); @@ -98,7 +98,7 @@ namespace Shadowsocks.View while ((line = reader.ReadLine()) != null) { changed = true; - LogMessageTextBox.AppendText(line + "\r\n"); + LogMessageTextBox.AppendText(line + Environment.NewLine); } if (changed) From f7c9f2049c7f20006067243c13e33e461997bdf2 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Tue, 22 Sep 2015 22:30:05 -0400 Subject: [PATCH 18/23] default font name --- shadowsocks-csharp/Model/LogViewerConfig.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shadowsocks-csharp/Model/LogViewerConfig.cs b/shadowsocks-csharp/Model/LogViewerConfig.cs index 245e5ddb..c82f1b22 100644 --- a/shadowsocks-csharp/Model/LogViewerConfig.cs +++ b/shadowsocks-csharp/Model/LogViewerConfig.cs @@ -16,7 +16,7 @@ namespace Shadowsocks.Model public LogViewerConfig() { - this.fontName = "Console"; + this.fontName = "Consolas"; this.fontSize = 8; this.bgColor = "black"; this.textColor = "white"; @@ -29,7 +29,7 @@ namespace Shadowsocks.Model { try { - return new Font(fontName, fontSize); + return new Font(fontName, fontSize, FontStyle.Regular); } catch (Exception) { From 3aac1cfcfc6bf083f5b6046c0e92c17db4628af8 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Wed, 23 Sep 2015 02:08:41 -0400 Subject: [PATCH 19/23] Refine the authentication for true CCA --- shadowsocks-csharp/Controller/Service/TCPRelay.cs | 2 +- shadowsocks-csharp/Data/cn.txt | 2 +- shadowsocks-csharp/Encryption/IVEncryptor.cs | 96 ++++++++++------------- shadowsocks-csharp/View/ConfigForm.cs | 2 +- 4 files changed, 46 insertions(+), 56 deletions(-) diff --git a/shadowsocks-csharp/Controller/Service/TCPRelay.cs b/shadowsocks-csharp/Controller/Service/TCPRelay.cs index ca53a97a..a6b20cb0 100644 --- a/shadowsocks-csharp/Controller/Service/TCPRelay.cs +++ b/shadowsocks-csharp/Controller/Service/TCPRelay.cs @@ -93,7 +93,7 @@ namespace Shadowsocks.Controller private int _firstPacketLength; // Size of receive buffer. public const int RecvSize = 8192; - public const int RecvReserveSize = (RecvSize / IVEncryptor.HASH_BUF_LEN + 1) * IVEncryptor.HASH_BYTES + IVEncryptor.ONETIMEAUTH_BYTES; // reserve for one-time auth + public const int RecvReserveSize = IVEncryptor.ONETIMEAUTH_BYTES + IVEncryptor.AUTH_BYTES; // reserve for one-time auth public const int BufferSize = RecvSize + RecvReserveSize + 32; private int totalRead = 0; diff --git a/shadowsocks-csharp/Data/cn.txt b/shadowsocks-csharp/Data/cn.txt index c8bde1ce..77af2154 100644 --- a/shadowsocks-csharp/Data/cn.txt +++ b/shadowsocks-csharp/Data/cn.txt @@ -42,7 +42,7 @@ Password=密码 Encryption=加密 Proxy Port=代理端口 Remarks=备注 -Onetime Authentication=一次性认证 +Onetime Authentication (Experimental)=一次性认证(实验性) OK=确定 Cancel=取消 New server=未配置的服务器 diff --git a/shadowsocks-csharp/Encryption/IVEncryptor.cs b/shadowsocks-csharp/Encryption/IVEncryptor.cs index bd600c06..a4b66ce4 100755 --- a/shadowsocks-csharp/Encryption/IVEncryptor.cs +++ b/shadowsocks-csharp/Encryption/IVEncryptor.cs @@ -18,8 +18,9 @@ namespace Shadowsocks.Encryption public const int ONETIMEAUTH_BYTES = 16; public const int ONETIMEAUTH_KEYBYTES = 32; - public const int HASH_BUF_LEN = 128; public const int HASH_BYTES = 4; + public const int CLEN_BYTES = 2; + public const int AUTH_BYTES = HASH_BYTES + CLEN_BYTES; protected static byte[] tempbuf = new byte[MAX_INPUT_SIZE]; @@ -38,17 +39,13 @@ namespace Shadowsocks.Encryption protected byte[] _key; protected int keyLen; protected int ivLen; - protected byte[] hash_buf; - protected int hash_idx = 0; + protected uint counter = 0; + protected byte[] _keyBuffer = null; public IVEncryptor(string method, string password, bool onetimeauth) : base(method, password, onetimeauth) { InitKey(method, password); - if (OnetimeAuth) - { - hash_buf = new byte[HASH_BUF_LEN]; - } } protected abstract Dictionary getCiphers(); @@ -153,45 +150,44 @@ namespace Shadowsocks.Encryption return len; } - protected int ss_onetimeauth(byte[] auth, - byte[] msg, int msg_len, - byte[] iv, int iv_len, - byte[] key, int key_len) + protected int ss_onetimeauth(byte[] auth, byte[] msg, int msg_len) { byte[] auth_key = new byte[ONETIMEAUTH_KEYBYTES]; byte[] auth_bytes = new byte[MAX_IV_LENGTH + MAX_KEY_LENGTH]; - Buffer.BlockCopy(iv, 0, auth_bytes, 0, ivLen); - Buffer.BlockCopy(key, 0, auth_bytes, ivLen, key_len); - Sodium.crypto_generichash(auth_key, ONETIMEAUTH_KEYBYTES, auth_bytes, (ulong)(iv_len + key_len), null, 0); + Buffer.BlockCopy(_encryptIV, 0, auth_bytes, 0, ivLen); + Buffer.BlockCopy(_key, 0, auth_bytes, ivLen, keyLen); + Sodium.crypto_generichash(auth_key, ONETIMEAUTH_KEYBYTES, auth_bytes, (ulong)(ivLen + keyLen), null, 0); return Sodium.crypto_onetimeauth(auth, msg, (ulong)msg_len, auth_key); } - protected void ss_gen_hash(byte[] in_buf, ref int in_offset, ref int in_len, - byte[] hash_buf, ref int hash_idx, int buf_size) + protected void ss_gen_hash(byte[] buf, ref int offset, ref int len, int buf_size) { - int i, j; - int offset = in_offset; - int blen = in_len; - int cidx = hash_idx; - int size = (blen / HASH_BUF_LEN + 1) * HASH_BYTES + blen; + int size = len + AUTH_BYTES; if (buf_size < (size + offset)) throw new Exception("failed to generate hash: buffer size insufficient"); - byte[] hash = new byte[HASH_BYTES]; - for (i = 0, j = offset; i < blen; i++, j++) + + if (_keyBuffer == null) { - if (cidx == HASH_BUF_LEN) - { - Sodium.crypto_generichash(hash, HASH_BYTES, hash_buf, HASH_BUF_LEN, null, 0); - Buffer.BlockCopy(in_buf, j, in_buf, j + HASH_BYTES, blen - i); - Buffer.BlockCopy(hash, 0, in_buf, j, HASH_BYTES); - j += HASH_BYTES; cidx = 0; - } - hash_buf[cidx] = in_buf[j]; - cidx++; + _keyBuffer = new byte[MAX_IV_LENGTH + 4]; + Buffer.BlockCopy(_encryptIV, 0, _keyBuffer, 0, ivLen); } - in_offset = j; - in_len = j - offset; - hash_idx = cidx; + + byte[] counter_bytes = BitConverter.GetBytes((uint)IPAddress.HostToNetworkOrder((int)counter)); + Buffer.BlockCopy(counter_bytes, 0, _keyBuffer, ivLen, 4); + + byte[] hash = new byte[HASH_BYTES]; + byte[] tmp = new byte[len]; + Buffer.BlockCopy(buf, offset, tmp, 0, len); + Sodium.crypto_generichash(hash, HASH_BYTES, tmp, (ulong)len, _keyBuffer, (uint)_keyBuffer.Length); + + Buffer.BlockCopy(buf, offset, buf, offset + AUTH_BYTES, len); + Buffer.BlockCopy(hash, 0, buf, offset + CLEN_BYTES, HASH_BYTES); + byte[] clen = BitConverter.GetBytes((ushort)IPAddress.HostToNetworkOrder((short)len)); + Buffer.BlockCopy(clen, 0, buf, offset, CLEN_BYTES); + + counter++; + len += AUTH_BYTES; + offset += len; } public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength) @@ -206,19 +202,16 @@ namespace Shadowsocks.Encryption { if (OnetimeAuth) { - lock (hash_buf) - { - int headLen = ss_headlen(buf, length); - int data_len = length - headLen; - Buffer.BlockCopy(buf, headLen, buf, headLen + ONETIMEAUTH_BYTES, data_len); - buf[0] |= ONETIMEAUTH_FLAG; - byte[] auth = new byte[ONETIMEAUTH_BYTES]; - ss_onetimeauth(auth, buf, headLen, _encryptIV, ivLen, _key, keyLen); - Buffer.BlockCopy(auth, 0, buf, headLen, ONETIMEAUTH_BYTES); - int buf_offset = headLen + ONETIMEAUTH_BYTES; - ss_gen_hash(buf, ref buf_offset, ref data_len, hash_buf, ref hash_idx, buf.Length); - length = headLen + ONETIMEAUTH_BYTES + data_len; - } + int headLen = ss_headlen(buf, length); + int len = length - headLen; + Buffer.BlockCopy(buf, headLen, buf, headLen + ONETIMEAUTH_BYTES, len); + buf[0] |= ONETIMEAUTH_FLAG; + byte[] auth = new byte[ONETIMEAUTH_BYTES]; + ss_onetimeauth(auth, buf, headLen); + Buffer.BlockCopy(auth, 0, buf, headLen, ONETIMEAUTH_BYTES); + int offset = headLen + ONETIMEAUTH_BYTES; + ss_gen_hash(buf, ref offset, ref len, buf.Length); + length = headLen + ONETIMEAUTH_BYTES + len; } cipherUpdate(true, length, buf, tempbuf); outlength = length + ivLen; @@ -229,11 +222,8 @@ namespace Shadowsocks.Encryption { if (OnetimeAuth) { - lock (hash_buf) - { - int buf_offset = 0; - ss_gen_hash(buf, ref buf_offset, ref length, hash_buf, ref hash_idx, buf.Length); - } + int offset = 0; + ss_gen_hash(buf, ref offset, ref length, buf.Length); } outlength = length; cipherUpdate(true, length, buf, outbuf); diff --git a/shadowsocks-csharp/View/ConfigForm.cs b/shadowsocks-csharp/View/ConfigForm.cs index fd0b8d63..38bdf1ad 100755 --- a/shadowsocks-csharp/View/ConfigForm.cs +++ b/shadowsocks-csharp/View/ConfigForm.cs @@ -48,7 +48,7 @@ namespace Shadowsocks.View EncryptionLabel.Text = I18N.GetString("Encryption"); ProxyPortLabel.Text = I18N.GetString("Proxy Port"); RemarksLabel.Text = I18N.GetString("Remarks"); - OneTimeAuth.Text = I18N.GetString("Onetime Authentication"); + OneTimeAuth.Text = I18N.GetString("Onetime Authentication (Experimental)"); ServerGroupBox.Text = I18N.GetString("Server"); OKButton.Text = I18N.GetString("OK"); MyCancelButton.Text = I18N.GetString("Cancel"); From d0518e5a114de8ce88081b5e807daa21807945b8 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Thu, 24 Sep 2015 00:34:48 -0400 Subject: [PATCH 20/23] typo --- shadowsocks-csharp/Data/cn.txt | 14 +++++++------- shadowsocks-csharp/View/LogForm.Designer.cs | 16 ++++++++-------- shadowsocks-csharp/View/LogForm.cs | 18 +++++++++--------- shadowsocks-csharp/View/MenuViewController.cs | 4 ++-- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/shadowsocks-csharp/Data/cn.txt b/shadowsocks-csharp/Data/cn.txt index 77af2154..b71a2803 100644 --- a/shadowsocks-csharp/Data/cn.txt +++ b/shadowsocks-csharp/Data/cn.txt @@ -22,8 +22,8 @@ Scan QRCode from Screen...=扫描屏幕上的二维码... Availability Statistics=统计可用性 Show Logs...=显示日志... Updates...=更新... -Check Updates...=检查更新 -Automatically Check Updates=自动检查更新 +Check for Updates...=检查更新 +Check for Updates at Startup=启动时检查更新 About...=关于... Quit=退出 Edit Servers=编辑服务器 @@ -55,11 +55,11 @@ Move D&own=下移(&O) &Open Location=在资源管理器中打开(&O) E&xit=退出(&X) &View=视图(&V) -&Clean logs=清空日志(&C) -Change &font=设置字体(&F) -&Wrap text=自动换行(&W) -&Top most=置顶(&T) -&Show toolbar=显示工具栏(&S) +&Clean Logs=清空日志(&C) +Change &Font=设置字体(&F) +&Wrap Text=自动换行(&W) +&Top Most=置顶(&T) +&Show Toolbar=显示工具栏(&S) Log Viewer=日志查看器 # QRCode Form diff --git a/shadowsocks-csharp/View/LogForm.Designer.cs b/shadowsocks-csharp/View/LogForm.Designer.cs index 187ab948..a4fcfad1 100644 --- a/shadowsocks-csharp/View/LogForm.Designer.cs +++ b/shadowsocks-csharp/View/LogForm.Designer.cs @@ -107,25 +107,25 @@ // CleanLogsMenuItem // this.CleanLogsMenuItem.Index = 0; - this.CleanLogsMenuItem.Text = "&Clean logs"; + this.CleanLogsMenuItem.Text = "&Clean Logs"; this.CleanLogsMenuItem.Click += new System.EventHandler(this.CleanLogsMenuItem_Click); // // ChangeFontMenuItem // this.ChangeFontMenuItem.Index = 1; - this.ChangeFontMenuItem.Text = "Change &font"; + this.ChangeFontMenuItem.Text = "Change &Font"; this.ChangeFontMenuItem.Click += new System.EventHandler(this.ChangeFontMenuItem_Click); // // WrapTextMenuItem // this.WrapTextMenuItem.Index = 2; - this.WrapTextMenuItem.Text = "&Wrap text"; + this.WrapTextMenuItem.Text = "&Wrap Text"; this.WrapTextMenuItem.Click += new System.EventHandler(this.WrapTextMenuItem_Click); // // TopMostMenuItem // this.TopMostMenuItem.Index = 3; - this.TopMostMenuItem.Text = "&Top most"; + this.TopMostMenuItem.Text = "&Top Most"; this.TopMostMenuItem.Click += new System.EventHandler(this.TopMostMenuItem_Click); // // MenuItemSeparater @@ -136,7 +136,7 @@ // ShowToolbarMenuItem // this.ShowToolbarMenuItem.Index = 5; - this.ShowToolbarMenuItem.Text = "&Show toolbar"; + this.ShowToolbarMenuItem.Text = "&Show Toolbar"; this.ShowToolbarMenuItem.Click += new System.EventHandler(this.ShowToolbarMenuItem_Click); // // TopMostCheckBox @@ -148,7 +148,7 @@ this.TopMostCheckBox.Name = "TopMostCheckBox"; this.TopMostCheckBox.Size = new System.Drawing.Size(72, 23); this.TopMostCheckBox.TabIndex = 3; - this.TopMostCheckBox.Text = "&Top most"; + this.TopMostCheckBox.Text = "&Top Most"; this.TopMostCheckBox.UseVisualStyleBackColor = true; this.TopMostCheckBox.CheckedChanged += new System.EventHandler(this.TopMostCheckBox_CheckedChanged); // @@ -170,7 +170,7 @@ this.CleanLogsButton.Name = "CleanLogsButton"; this.CleanLogsButton.Size = new System.Drawing.Size(75, 23); this.CleanLogsButton.TabIndex = 1; - this.CleanLogsButton.Text = "&Clean logs"; + this.CleanLogsButton.Text = "&Clean Logs"; this.CleanLogsButton.UseVisualStyleBackColor = true; this.CleanLogsButton.Click += new System.EventHandler(this.CleanLogsButton_Click); // @@ -183,7 +183,7 @@ this.WrapTextCheckBox.Name = "WrapTextCheckBox"; this.WrapTextCheckBox.Size = new System.Drawing.Size(78, 23); this.WrapTextCheckBox.TabIndex = 0; - this.WrapTextCheckBox.Text = "&Wrap text"; + this.WrapTextCheckBox.Text = "&Wrap Text"; this.WrapTextCheckBox.UseVisualStyleBackColor = true; this.WrapTextCheckBox.CheckedChanged += new System.EventHandler(this.WrapTextCheckBox_CheckedChanged); // diff --git a/shadowsocks-csharp/View/LogForm.cs b/shadowsocks-csharp/View/LogForm.cs index f7d0e4f3..e2bf9fdd 100644 --- a/shadowsocks-csharp/View/LogForm.cs +++ b/shadowsocks-csharp/View/LogForm.cs @@ -47,16 +47,16 @@ namespace Shadowsocks.View FileMenuItem.Text = I18N.GetString("&File"); OpenLocationMenuItem.Text = I18N.GetString("&Open Location"); ExitMenuItem.Text = I18N.GetString("E&xit"); - CleanLogsButton.Text = I18N.GetString("&Clean logs"); - ChangeFontButton.Text = I18N.GetString("Change &font"); - WrapTextCheckBox.Text = I18N.GetString("&Wrap text"); - TopMostCheckBox.Text = I18N.GetString("&Top most"); + CleanLogsButton.Text = I18N.GetString("&Clean Logs"); + ChangeFontButton.Text = I18N.GetString("Change &Font"); + WrapTextCheckBox.Text = I18N.GetString("&Wrap Text"); + TopMostCheckBox.Text = I18N.GetString("&Top Most"); ViewMenuItem.Text = I18N.GetString("&View"); - CleanLogsMenuItem.Text = I18N.GetString("&Clean logs"); - ChangeFontMenuItem.Text = I18N.GetString("Change &font"); - WrapTextMenuItem.Text = I18N.GetString("&Wrap text"); - TopMostMenuItem.Text = I18N.GetString("&Top most"); - ShowToolbarMenuItem.Text = I18N.GetString("&Show toolbar"); + CleanLogsMenuItem.Text = I18N.GetString("&Clean Logs"); + ChangeFontMenuItem.Text = I18N.GetString("Change &Font"); + WrapTextMenuItem.Text = I18N.GetString("&Wrap Text"); + TopMostMenuItem.Text = I18N.GetString("&Top Most"); + ShowToolbarMenuItem.Text = I18N.GetString("&Show Toolbar"); this.Text = I18N.GetString("Log Viewer"); } diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index a3c383df..d4e8a837 100755 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -191,9 +191,9 @@ namespace Shadowsocks.View new MenuItem("-"), CreateMenuItem("Show Logs...", new EventHandler(this.ShowLogItem_Click)), CreateMenuGroup("Updates...", new MenuItem[] { - CreateMenuItem("Check Updates...", new EventHandler(this.checkUpdatesItem_Click)), + CreateMenuItem("Check for Updates...", new EventHandler(this.checkUpdatesItem_Click)), new MenuItem("-"), - this.autoCheckUpdatesToggleItem = CreateMenuItem("Automatically Check Updates", new EventHandler(this.autoCheckUpdatesToggleItem_Click)), + this.autoCheckUpdatesToggleItem = CreateMenuItem("Check for Updates at Startup", new EventHandler(this.autoCheckUpdatesToggleItem_Click)), }), CreateMenuItem("About...", new EventHandler(this.AboutItem_Click)), new MenuItem("-"), From c5e27486fbdf1c0cdf380a23af7d31d62f8278f6 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Fri, 25 Sep 2015 04:03:04 -0400 Subject: [PATCH 21/23] Protocol V2 --- shadowsocks-csharp/Controller/Service/TCPRelay.cs | 2 +- shadowsocks-csharp/Controller/Service/UDPRelay.cs | 12 +-- shadowsocks-csharp/Data/libsscrypto.dll.gz | Bin 51484 -> 47058 bytes shadowsocks-csharp/Encryption/EncryptorBase.cs | 2 +- shadowsocks-csharp/Encryption/EncryptorFactory.cs | 2 +- shadowsocks-csharp/Encryption/IEncryptor.cs | 2 +- shadowsocks-csharp/Encryption/IVEncryptor.cs | 98 ++++++++++++---------- shadowsocks-csharp/Encryption/Sodium.cs | 11 +-- shadowsocks-csharp/Encryption/TableEncryptor.cs | 2 +- test/UnitTest.cs | 8 +- 10 files changed, 71 insertions(+), 68 deletions(-) diff --git a/shadowsocks-csharp/Controller/Service/TCPRelay.cs b/shadowsocks-csharp/Controller/Service/TCPRelay.cs index a6b20cb0..eb676ad2 100644 --- a/shadowsocks-csharp/Controller/Service/TCPRelay.cs +++ b/shadowsocks-csharp/Controller/Service/TCPRelay.cs @@ -586,7 +586,7 @@ namespace Shadowsocks.Controller { return; } - encryptor.Encrypt(connetionRecvBuffer, bytesRead, connetionSendBuffer, out bytesToSend); + encryptor.Encrypt(connetionRecvBuffer, bytesRead, connetionSendBuffer, out bytesToSend, false); } remote.BeginSend(connetionSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeRemoteSendCallback), null); diff --git a/shadowsocks-csharp/Controller/Service/UDPRelay.cs b/shadowsocks-csharp/Controller/Service/UDPRelay.cs index a0662dd2..9d3d3dcf 100644 --- a/shadowsocks-csharp/Controller/Service/UDPRelay.cs +++ b/shadowsocks-csharp/Controller/Service/UDPRelay.cs @@ -74,13 +74,13 @@ namespace Shadowsocks.Controller } public void Send(byte[] data, int length) { - IEncryptor encryptor = EncryptorFactory.GetEncryptor(_server.method, _server.password); - byte[] dataIn = new byte[length - 3]; + IEncryptor encryptor = EncryptorFactory.GetEncryptor(_server.method, _server.password, _server.one_time_auth); + byte[] dataIn = new byte[length - 3 + IVEncryptor.ONETIMEAUTH_BYTES]; Array.Copy(data, 3, dataIn, 0, length - 3); - byte[] dataOut = new byte[length - 3 + 16]; + byte[] dataOut = new byte[length - 3 + 16 + IVEncryptor.ONETIMEAUTH_BYTES]; int outlen; - encryptor.Encrypt(dataIn, dataIn.Length, dataOut, out outlen); - _remote.SendTo(dataOut, _remoteEndPoint); + encryptor.Encrypt(dataIn, length - 3, dataOut, out outlen, true); + _remote.SendTo(dataOut, outlen, SocketFlags.None, _remoteEndPoint); } public void Receive() { @@ -97,7 +97,7 @@ namespace Shadowsocks.Controller byte[] dataOut = new byte[bytesRead]; int outlen; - IEncryptor encryptor = EncryptorFactory.GetEncryptor(_server.method, _server.password); + IEncryptor encryptor = EncryptorFactory.GetEncryptor(_server.method, _server.password, _server.one_time_auth); encryptor.Decrypt(_buffer, bytesRead, dataOut, out outlen); byte[] sendBuf = new byte[outlen + 3]; diff --git a/shadowsocks-csharp/Data/libsscrypto.dll.gz b/shadowsocks-csharp/Data/libsscrypto.dll.gz index 5efa66613ad1f21294f50ba365349e1b4e121ab9..b042986074202b38d3189a9142a2d9ea8f17b772 100755 GIT binary patch literal 47058 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 z ziyK|%Fta!djC(C^43Bd_^c5^_ECFW1w7Cn*Vzo_M#q(yv->|_3$@D2WN*Ev#H z+8cq3X=!iP(%w?%n8M<|L!MhZNUEtC>S=Y^x3Xvnc)1ogU5lH>Q2%b7<9onLwYZsx z<_x`Bx79h)f%j^0voUTKMl4G81#Aq)9fXN}_u;xllL^xU>auTlp|oA~E!pqos)2l1 zmAyf(H&MTMKYwg3j9~<5#w}6qLv~BQd|rEYxIb#b%#w$kqRk*-kI0w5#x175_2?0 zEnBnV0p;!~jdM+pE=`si=Zd%9{Da3E=bD|%k{=EyAe$e&FXF6drXQuC-ekAN+tJn) zEw$`}q?{z;Bl%#~Zb$pm{sr;*sI|`COX`{bEWW}2rN_Pl47R#_u)%E5(;Z-$)#aa~ z4tB*~j{_8HNa3IxzCz}e2yW1;^HdiYNV|J5$qqCoJ~+ctSBMV!4sJu;GlSU@*k7M0 z4DYWsU3dUacooD~l5y*r8?Sz3*Nql>m<@C0H>8OexCke6ObSyg$sAE(pF@&4Al;c( zJ;$o)rgIX><4L3_MPceDnPVeAN+!7(3R603P9OToM}Hu5vZqg2e*0u)H&eDBpQo^k zrE2=t-8(v$%$Yy^neymgDsC&w@0kAZ?m6cacQW(cH~sf*@&tvcsbtO~a@YOSAHV*| zu{Eczeye@4;&!kJ1*RSQ$pIr1LSupNGlP^c&0=hm#8^A1hs>|+W@1m}8gKlU3VV}x zqQ&Od&X6XB>Ay9HfA~>c1?YD5oRdg?a>}yJXOj;5J`#P@7Jn$dn{dN&uMzBlhOzcK zW1C)}W^yvX(pk`rxkb_{HCwg?t-cSf@lC$Ztz6TNf1m8e5{y2@(}ikV)7Wzy2WhXe z8BfL}jS5R4HAu%ui{-^8gYT0G@vX*Y!Wu9Bkn)_!j3W~>5?C`iQW39b$cib5+6F{z zsfHShXY`j;M2)rPW~6<55Y+ZYvaiOM{$G1*xq&mz{l_2v6)@p-IV?4BI)qUH%6S$G z*=X=E&{{zfD+r0cly6qt=R0Y&Y&&O-_e0&|4=QefnJ-Mb2NjPwM6t0xg@tNm9)mIu zN_)>!^KLvkbaSE_nqP3FAx4`BaBe_q3)XyzR&#DjC98VPS%2L;U$6N=;*Xvje0D%_ zqyA8HsPfFCvot%giCa$6UTA~EAqvDFLK-j%yoiNuHF#JNT7eQP5GlY4+9!F3Qot56 z;E)2T4827f1(;dKd{Fxa!bT2Ip_Ne~FhM$OY>saMJq}n<&NgK;8!elWD#~+g9Ocb0 z?jw&qpP;|EceeFXaaDxZA#1_#140HUQ5` z4Ze>>@)FaJ4>K}gF92mSJ_r_saqrkh<0-6 zA5gf8SI>tdHf4MZIYn4=OJ~StB(|}EH$M!+cO?dw_!Sl-@v_<&8&E-s#;Tu_i1mO&S`X;vEf1zL^N(#%o@4m6YW?7>@)BK5!mcc(-1) z5y(ia*dxq?k6=RKAQwo0w?9lAupZ$yX?;OteW6R)%!flaX9C7HvO=zBySeY6th~S7l$Pt4EKH;X7 zD6tZeBi?r&nUESL6G)g81&-*k4VDWWk;@3+$i3l2=!WVyVDVj0?coBsD;S`(LxL!&*2oqJ^iN zr-fg`7WR%L^)>Etb|jf+j*$Aod89r{d?5ND%j4Bg)~esb`28M*sV%^Hx$MX4PYDyi zy2MW%BJpin^=E0Vu5Kr9UA3aC{AO7o{w@6_goqe5&E3tO7C-N0)4=( z<>KM24ALlZ8Ge}aesY!(<6}+?&^}Q1Zy#Cqvzf%pko_9x*EE3h$bOXk@j*>~dZw_U zP^-<~xOtDLLq0#U)K_+=@^%GI4^p4E{RpyuiW)Bat>=~f$5HmTU!v>}ar%^hNcJ;T zBqa5j)uZwD=eX#t#`?2$04@V`!Ot5IWSz)mh{nEA<}ucw34RVZT>K}FEdImj@C?#n zgU${{68b}Rp!17+MtdfqrB)bCybCldFEO6!2Z4`rKT_x)<;iDAwYL6?V4zy+E0~ZzsT?665pnG7bFd%#5y9Z6c%MSW_Cayq zGlICEHbmT~UPRmnBU-qBU_^1x&(COJlPl-9^G6bSsSy&NajB6degj(hP;SDmc`obG zyeIY`uGI7xnVzH@`OJWKCxy#;CdHX*?E0LIqG z1|?QfNYXcg#m`ELl=vMe@#)ACKjq>QKmHW(zsr^Q!9i1Znr`Z*=%%i2?I)=hvi6~6 z&!BNTi_17B*~2CNv`duuT`1|gFIVEvxTwTOX3s+Ed2@_l;YG;(oM*Yk2#j~o+82gf z`}LYWu4(c(=^=4Z$^^UytzoFR=Y0U$p-qaAc$^5^kO`CJVyL)3rHT8Og4#q!s!jq;+=oO!$huEa!>#+IVdB0P#eLn#;+|+i zU#e#Ugimb@(fM?7pLDt6zH4BJ@x!hArpvSL#fu1oo(N&kHL@_s*~BJSFC^~ICkeP6 ze;%Pfk_Fg1g1Fx?78I^w;(po?aX)2$4_Cgbpt2xu72l;%0CrpN%9g>-D)h-Nx6gd#E_)wIj%SQ-rMV9vDg1AIIvq zU#_fAjga-W^U8XCIzPg?=MujaCH~QiTlX^}tb0w0ha^5&^n4CIWY^CKv+Fg^&dLA; zxa8KX{Grx;7s~qXk!Agie};9BGy8+GK85v#XSnzT?dwuy{YW$W$m=l#Wqrye$$Fg5 z-p0h-<;i*`qrSeZ=lniW*1xDcXVO&P3(5M>%>ES3z@MgGY-a!Bru}}D^)2U@^(gKb z53%Yq`7nsW)^NgQead-c{j`x}JriiSMQjEeJgiRkE$5N-A=6$AQ*+E0oXMYYVOh^? z9u)W0mtoz9mUm{HN8EEX#=Z^Rkt1?&1aXg+51-2A;=V`O%vHVMAR`b*uN zBJOq5_rl^{v+mDh_}MN)&>sqkV6Gs5ARaF6Q-+B9Y5$104>xZwJfDAQ5}yg`eO%_B zPvW<7F+V8sUetBEtrwopXM8t8-s?>(g&I4&kxdcv`R9}PJFxn@F1Ct4ROFfdk@@_f zCh@0eTwb&8Hw;?$DPLngU+43K5`RjB#K%&h>PUeRRNC`P{E@0Z$5s5C z{YJh7q)B|UI$Ywjr5;VBVs;Z)Fi!G9brCSTg&f3i67(=Uz7COkk@*i zChtM=_i~y4PmuUsy2S7P*Gha;eEm%Ez4WzwF7MH>{YEAJQRO)sUq>I5_~Iq3<$n_r zUtiSt2dsNOJJY}=I}RbHdGglR<$v>eB>pyC;&TA;{yj5^%;Cn#@nVoXPxWv>j`gC+@kJCr!v==7n1MeAc~g-+fcE{u0*i zMQwE3*y!G-%lhq?AnPx~y0=BhdNEwqkFa&&@^!+`nezN|`3^g^P&$OJBZ^ z6!#`g+zS^F_s^oZ-}ucK_?NYHkBMMS+;7sw{g!`3+=ox*U#ht8KuJe0ckAB84g8C4 z-5cD!$i@8*-N4^9DDKUdEbf6Ed?Ea6iTf9k2wT6I$^4Y_tle`1f5?VCF7A7DanHtq zJs2tO!?)_$!nQA5%2vILiTf@T_uc;-aeu+BdXeJ3mTPvPcMfs^+X&YElo7V-UHaPn z`NX|G(|vhs_fsygc7Ivo{x}HY%NO^TvsG_!fA%*n?ng51xx6z+nD({0xUc(W#eJk{ zZ@$Q8%u8Rm=Y~C~b(b=ke<5)%=zCGEnmP9m$@<}w`NAd0dR?ErysdhdF6&XsgM`QW zYhwSfzEy7vo4&M#$$IghB0aGw&kTa7XN-AS4Ps0n>O zG`X;648K7e{ukY?cd6oj2THnK-~4?3rSH}Q&0n+Yw_nh%53Sly(_|joF^_^?+xh?X zx9UBMMA-PR5ceZm_j@A6ebdF}^G)ZO&mXdOe|}*P_17w&^9%vo@?Ru z`j=VvVb$-#>UUr6+WjS4_ruoi+13Rv=#O*B4=P>w^8LS7-0NExE^qDrQpNoR*6uf= zY5#1vX|M0rGlz+LUC`@doo%W0>S90MN3=Qhi<|aNix}??G|j^gk=^ap8J~ zzHoi1`}Fi(dP7b7vG0;5UDk6cFR5JSb7>zT=J=AHKWs_wU$lHblF;wbt^42wt^4x` z{Y#(BXQE#JFjEuvn~(@wzBzG!nalUDMT&dx#U}IhPZMkx-Kuvn>wX(r_uDTn?uT#H z`$on6GrD!Z;eW!q-;dm|<#M;`O^FZ&sUcy&MZs7fR{<_zs~&Ej`DcrJ-MsxKw(4EV z!o6nI$G38!&SgD{UAI{`a#v`}HA_RsmW7s2BNy&3_^IWkS@-(<&E<)E(?7CRFVea{ zs$2K1mmuyVguT=zg#`ZB75Dn5C;yy<`wNKsY7qDQ*rUrd@Goz-UZiOsZrJM|;%nmm zHI)28T)zCD-K}?Am-y}f>a~0Q8?^uN-Fh9mjZgpeYxnvT$3?`wwqfrZ->p|0Demho zChpDO*xLOj6!%-c$*p>W;{GCA_1Ml?P2BI-t^1aLnRP$HNhJTIwfnuAb>DCv>mHYt zb#c#yJ<7cljqwi(drj_fnqQ{4*T2L17w*%GwC-Qit$Xj+vF-=kR-S^Yy+V1Aiomze$()TmEGd|FRF)8-DNt?q2wZcIIzKiNEdt1Izc9 zaLV2{XWdKc;7}N0tKMt6#P|NIx9VNiDSO|@+WjG%;^VC^hHcf`&jmdf&}i@+(nqC! zz|KgrUR$YWS-J50Iuc)3d;W*E>K%`i`0banc8|L^xSjuxNc^vVs@^xcRj*68?z{h4 z*1h%}?x}C?RK0I(?SAA_^}gAydir`rxUAQBi6-&C@vVB1);$Qjj!QXJ@1L`FfBsYT zE_BAupmon}dt>lx%leT{)%(}2-Cx$Jdgrn36EEY8oi<=ec$gkPMuch>{qFmQtl%RN z_#EFq-MYVoQ}zC3YxlJp^W+=y@Kil6>opm#jn2V+dfI_%-@rb-uXn0mFhbTd$$vTf z^mI-ieyU!ozC%$r?M;`nRZrif$D5b|9{VL1_)?SB@SNR)(AQS(2Y0Jo?x}i=4wotJ zy_&e+$HaZ-gm}ME4V}(yZ`BM3Jdt9?;JH)h7578;=YP$$`&M?Y-q$=;?;l*d?-+Wj zo;dVWy-QiUPrR(j{EqWX=AZvmJ$>jW@=ulg{76{n&)d#geeKrxHk6C3wD?A{Tbo{B zSRxzB&}O?k2J}-h2AgGa3sQR3HNWtb#39wjct`L$E=WZ%@s&E%Xi z$3)x=I=e1l>Ku{WWtI4aEW8=B5+#0?I=`JNE0On8iQPywH7kj$6UsuXRIjm7R{N<7 zZBw(7`Pp9@13WNwVG2LcX=+v~@g#*<>(qr)NY*rd+!a}vCV3cn`A1OvSi!7mTd<5Dq2uTp1|AWQr)UE#qD)|m)w(F+wA-fS(%vY@VGND ziG%KmV)xUzy^r51H>ss1c(=q`^oB1OHOPmH{g6DA_$roIgv3{dCH|r(lvrJv#1pG4 zZR$&ig@c|p3PJ%7E#&v%K{k0$lJpkdmq}k9%su4(IJwI)ShKwK#a6t*LUC;`BvoSd zxr|kbr6qvHVvfWL4#r>e#uA_i-qNw^!J4cLbjXGC1bN*&VRd3c2tBr935A17HUioKm=r7HFgk~KxKQ<9aY*t=jvDPZ$t%~0$;Bx{yp4_bEm z9Ul8@Q0IFdM-c%Hm&_Y(G5zXv*pOlEHE*!J*4xcEermnWg|jkN-&1i*o&7bSgvWlM ztkJ$(FhETj>~9zv?OwbM6A82jBK8Xc{YezwcY;OEFt7_twQlxPtvE!YNtNCzp=-ks zVE3QYM%*{ZQLtinsr6cF-+{xy>+qJY@zhLKQx$G}l7q#kz7W1`!;rnH=0&Cc$|!shym0q@8HDzXq5L{V!nA}keT zKM?Y;a0mU=gX|_v@-Eg#+0Rb#$}TR2+G}A?oC+sNDbl1|3)1*k0hP|-O@d}%8zhR{ zZJHW0b%BY@70KP^shQ%`1!gkWO72danrWT7Ad$?qk-L+oX4`mnwd6r!89^=2Dy9I)XW)E7tE5pL+>M!yR0N9QOW6t z7O*N+iSA~X=vMiapnwtHr&AER50%K+&tJ!$Ke=0R1>Mb-pZpHOSBvQbmZyF#AP;$B z$-Tx#2lcH|Rl{GFu+Cwwxs#9aJQ#jYXk+||^NjIs0;Y$(+i+)g;h1~o=h3E(j5MCV z;NUjq2ia{oGDD;q*xZ@lkgCMVRY9a~o1o;Ip$?`O8cKVW0W2f4vq~)K7+F!fPw=$YBZOJ?IKHrEtf2YJSIS@)UnEzhmdGZ74NIl76 zcks?J@H>yj;DuguqUv&uLv94+_fuJR&NW(g-W{dg=XSS2bMOlUhxMQP@+9wHfkp=G z%7rsB9b|z>3d|PZV=?4OEAp*O;C$^$@ljHe;xSb##XY1r(R~cKp~s{E2lSZ!4fvhM z^oEktidTZ>w~&HlDv@p1EH-==Xr=lTgh9)7#!9d%uDn;h@*Ers?w0C>Ce1chk|}@KKZI?`MgP4%&x@ z($E-#ooA16(7&?~5m-mO-(bhy*|)5Nw35BV-ru+ExUm(#l-=96Y(Khs(B%bJBRVJx zQi_|<(?NpdU1Cq{Th@ZOb&q|wZ&@q4`q9;nt{}Q7x)PPDUFdmDDc-^Jb!++hL-~TC zd_AFj{Yuq#^mHi2+emSfW!t`Me4W=w%^@t0hp=S$CZekyUELvsgXA2;*Rt)PmN}?p zInGc+S1Yf=UJZeMo;irsCi%M@g1^PZV_ru@|gN-l$;=5ut~2m0v)$O z6gdQX_cb*iusfLOHN@V;peXr0B)`iuO99~fpc{}zh~!|5O>(`J*!R?Yj6S)c8@ot; zm)xR)jCFf0PY1qYHy;mJEpj{Fe(n+pUU3^#pigBcL7hq!=x@;3GE+jAf)CYik{J&y zBzMjrO(btt{9flB4fAXn2H9(n4-4+YtFNt$m4numiDera<{2{t9`1^Uu*%OWgbJ(Y z&WwgT9R^1p-QUk{R3>>g@+DcB%&SW7N%4Jtjq!;j(#Y$9Bx%bROD6(DmwGe;b5#}Ukl;Zx0uAYg(iN)RVr+}@+ze{{darZ=f z*Tfte--udCgRlLX_@?-r4pP+v>iZGjXE8uS-v^2DZ;J|y@)9_^#%_@Lx9{y2@~_l)%#&m!w=5hmsY<8#`5Cq>^USH$l%HW9m6V9cHd zyq=B&>FLQdaSqzZ!eS<=cXUIT8A=3wf`uVC z3+RY=Z?B+aSv{FnM`M-^eT`X3{FTgKsBsH)?U!g0rFt@fVXa{9DV|K5gDz$6G*4!d zgD(0KYmfq#Q)AW)o_Q9&8nPThX-V;L{T#1ywickkA`52_A6Y#szQI!43|V$r;pbJ% zj90GrU;8$3B`W!1`rDP()uwd+s!_xbjZNNGVA$lCb@}W*T$#Dr1hz^Bj307}EN1X640e#r+ZSmRcG5 zxnJuai4n>T&=KXhgI#q9+JzN{&lkO@L3e?&e{GmySVEuwDAF7cyWg_Vvh&9l&>cow zc4k_nAl^bLu`4L!&q8PdbDNpl%-r$J9najOn0pj+$1!&tbBoL^GIuO<$1-;ebH^}u zG;>EYw~4t;%xz?DBXdVFcNB9QnA>34c?I5SJ378mIuu`@jl#a&P?`9z_SLP_3&(hXDd9r;Aw$}!Xs=m2&3Uif#)`O9Pr!^PdPkZz+nx%>)`o!c(%av z-|)N+&t7;s;2D6&`Uk)ho@wx8!t;H2%HUZAPaQlP;dv3B|Axm4&rx_f;5iLX6x8{} z-|>3iGFPyM(<9a{SWo;^uu9JjhX1xquqJ{3pgl6J{?`p0C1aPtYTIrI#pgWm(4)zB zJ-X_#hnFqAMfcyk%;~Cplm*n~8myb(X@w{8UW4@kVX3f6ctBVoJS0fMtqcbD-7GvJ ztc2gy;C>X|4+@V7mBKP`l|jf4z*WiOmkU$jmp>QJyHa=@LLL;#Lpg7SCykZ+FoXFh z{4NjSf`9f^%N}*!yX=P#t#mG{3=hj&=Dh3Cvd1bPdBFM5V~-Ao=RaB*o|=UfRzBoh zc3mR zkC<<;I6Lp4~3@(9&-WoOL(ThGasJi@H_+0HhA{K(+!Wg5b6St1D-YTJPXf@@N9)=J3L-^ zI^gMoCkT(Y24Qs`J-8g+D;`)0t;WMvI+ucbIdeP9A6m&hrKM#LtaR$`RnWeV zRcgr)&hpAoo@EdG;30gka8`bI8oVo)t#npC^q>>NT#rIG`5}x*K@UYlk{?~R8sQ`_ zUABCgbD1z3+_&E@2(v)fx*puKA>ev=78eV`V=Ix0QZ zbUjeHl!qe;9{nMAuflc#3P6|(iF+f4F*0+qK*Gpah+n#_>;czuXYzxOJ*r0}Ke+s{ zm99#T3%1<@7s#){56=$Fg3c;A1NuKM$dnxRyGTE19fd&9TIuEiAeBzWeSP zY`aivNBTzwi2WJ+s@9*;DJ*&Hkw+g&#=f!gA#Cv_gT&ye!togzx41aGS%oE!Jn-lP zKU}u-V#FJo?!4_7-VQ^k6ajBItzyWe+UXhpo`9k3F)2^^t`?r~ven z=L3FPWV9f7<2Bu2Jh)Ao``^Rd9&n4A`=?>nn=Ki-Z_x}lV?}!?7zZB*+ zYdS$3Jg5ul8qhM~7SOns3n(M*e5}$A?e3_2?7?L#SMq#Ia=EVetoAH5tzI}fFy(@$V*W($qbp0 znaMCOA&DpfBLafbiW(I)Di&5z!WCYgOd7gko2$74|bxqsgJfXUYVfmtJhAlT{~UV68meu zP7ON+Hb9NSM`-vs^=GI*OZ|nKrbxq!m2))zd0Mt#!vi#LU?CXkK4Govi5kB_>%3gK zLa$%1*Bdn-%mo9lO5>!Aq~&ea@TatXZ|L>+^!lJa(igc`Vx4uRtikty@mFDu z0&9UCxk}dMX;)(n18aqKz|u>xCWCdr(%e|D>Dqmjo7V3=t+y#Ogs^JNHCj!lpxrTC ziQ;;I*Wq1P?LWS5_aH_Tt{=+bc=il_O*iI0kj@WRIb!*7rJn0hiI8BI-NSz^pK9!7 zBKX(Ot@HMT&L`A{@F9VcmP_ z$J0wl7&Yi#@{gyj<(j*#UL5nI^`>$<)6@Kn;X3UC%{U%hU2@!Yp|s`5gL*HDo-q4^ zY7{_^#CY#%j(wzue7$Hz^q73R?@VdD-N>m5|5k9_rBrH1u*bgZIp3}=_8`>FGqnP9 zvKlG=bNSeN&K!}hcTH!0W-4>P-OKhY?uqnwG7KBytXMdVwOOINyb3FdX&!#w572i8 zF)u6M9V+IvJ$Asha9UP)3)}&3Np)V}jQm`tacTy-^N$(e=_j2AbKVL^au?Y5e$Sdj% zl(G7NJgdote9a)r-*RW<qGaWt2>qIN!^qqdmCt`(2e!(tbl6Tk^VwThC zm+~l9XV`SOf*jY2xlLue`CXjBPfqdIaXe`o(a+aoxEm->FTcZQ^8ITV1*m%s^(Ei& zX8tkGwazLhYzr~VB<;y8x01_{GQC<)Dp%r5*)hI{466?EED`<7tWUM&mwMS_n04$L zmVw$Byq?L|y5(b^?!jj?N|*9I`Wb~4Oul}StdKhWU`>I~1mqsTzx4Kz=LFsDvw3|) zf6g+j8DN88Lt#mtTLoJSTMyd+Yl3Zr zHN&>RT46gh{!Z9#*k0H^*g;qa>VhSf3#Nb{zm{zzx?aL&;IzQ&;RYuUvzx=)z{zr<*$bh|LxnqANlV4qlTl` z330to>=U2R_oT#rC---rGT_vKr=5Prpfd*#8G6>R;YlOTK4;{)=bfK?!G%8=m2%PO z)QiVlGIrefOVci!aQVbZlU?cVvT~1iVTG@9QI$UstPU*>N20NsCAD?+KV5L;Rack( z@bzn!UVGiL|L*qxukZhi%&hF3DN}Q&O`nmMUof+9R#9=u>?`KXoi|_l|A(*tkLZ7T z_oYQ0PFioLgQUacg0yxn1WAV}1xdf~fuyyBKw5j(f}~wEfTU%t0!e#V50duK1d>M4 z4AL5Y3rKoQ3rKp*c967-HjvioyTDVyJs=&VX$MaO_k*O390W-l>HyCK4}*hwQ{iyZ zafNu0G#4j$7HJ^hFnY#=!|A&Rke+y{An877;Mvq}@EmG4NT+iOLHhn;E=b>Ll!B!B z`9RWSLLhzrQ47-d9t|LUx3LPO??Tpt^c_eOIG)-MUP|o;=`>3Vcp0@Hr0+)BKo_+i zOsDpPq(ilXq(kioY148LoI>pfr&9Yt(#nk*hjTi$ADlt$2kE^(2%Jgn2Wd@^3|>L) z2kHHv2F|DUgR~mW1((s9dluG2m;i4W58x*F6Tud+AGiZN8QcZ-2ls+B;r4^4fV8d|0MfeVRPb|z4+IZ`r-5-xFdslC zI0zgHo(U#{gTb-j5HKAa3g&@lfpfuOpa&cdhQK6nDL4XL1)dFV0M7xN!I9ur@LX^^ zcpkVDJRjTxUI6X`F9Z*QKLNi1N6`&bi}?T!0!M=*!7*SeI2N1;jstVS@n8vfDfJte z2KvFvz*=wu*a%(@t_LTB8$lPi1xyE9!3?ks%mR0V+0>t44%h)sp?(FY(m2*({(u9) z>0lB#0~`hBfoWg?m<`UP`2ZHud;p7RK7d!yJOJm=JOJlY{Xj4EA6P}>4*IEH;Bu-L z=)eP{9gG8M4ciAi0Dl7c!M@-TFcFNe$NT^Xf~SH>;6QK`csiH{4hFNqv%m%5D9{I9 z4mN<3!L?u(*aTLAEuaGrsx~kV+zs{t+rb3z0N5Ao029F@R1O$_4e|w(z$$PQNGBpD zf^lFj*as{D6TniiFX#so!CG)I*hu++>nS}Rc+Hd^+)C-e?UWweN$J5olpfqi>A{1P zo*tA-ksc35Czt>Z1^a@@U?Mmc91Ny|mxFUDJ|2`liVsF9KG;C zU>n5)chhySovx3h!;H8NenZ#k0eUU2gNdLc8TA1Zz+|v5IF`ckz)YubFpt8)xfGs? z`;)@K5QT$FDSRyMPYMS&P&n93;dr2KB|o^G{1ee%!d%l=p> z@fNaDLX`Y{8efzY16LzT(E=7}zO@ zVXzV`I$c=H_o%;0`@yT}%yvn6e$B_P{)JlK8f~XfH3m0&PSQ!e0-CQIDWrXFO<%3) zDm7k2uU9GSv>r>ee)U@asP=>8Q=#QV)gRURSLt{JtbTE;Kd9;aR)1IV^*WA8nrRK! zmz2+9{=TS;b@NPPs?LuTBZp^2Icug_#(bR@DMq$2L+1v$b98>BAZ3xxi4XJ-*C(Ir8D%|dKG&_5+a>OLjxTPSv!=U>>oAq;Dc^)l;r{e-eWr1J0$k^Ou5*Oj zE8`;CdOo+kit8|g=S&sXe+JL12!AUvgY%DZTV@~AmMG^hV^_xYmvTeeKLvU}nC_@8 zJgRf7K<|ytI{R(zu;q@}(grwwKD*1g&Qmdxau1n(EBBF^!n~hol;`R5vXVzPpGVig z43k!7at|5$?TPetfcvz7`^c?znq}QrSv>zlkCb|NwSVVY_f;nMquetRU+x(R4{}=b zo{93@l`)eV7k2A+xd-IFwa>FGZlho0c&+3eB&7WbXK4ae3`+F+Jl$h9@g&f}4ivWvMMQg)t}7qrTdvZw03 z8MgY^r+qK=2;iM&_Oe+$i~ki5FqaV9^%B(Le}j_@-s zN7F>Cku%fG)3(T%WZL>`rltuVlSb}DNt0>oW0?gKXF8{sI3+sgB0T4cZ1W`3*7iBJ zxtL|enW5o9&Og^yzdS2WhHX4%bKTt9Z@IR*b%xKf^>e1yGs5kawOQ(eVgdIw9?eGj%Udd;QWI9L~k6o$$H`{&sp-fFIB~4saW30bnz@5xj*o0FZw1 z+zS4d_Wt18;BJt9U)v5o4ITh@(q13jM?dAdL9~GQl@8}_a3J^`?d`!`sy&c4F$(^> z={q2>N;M7AIu^iRt{M+%KE9QrDMZ0*Ny7l2QtgMdpeFcpRQsW=?535XIkbQ`suo1r z&<^->RTCnOXcznsfO|nY!?J&+XcV7=PmpE-KB8I!jaS@_4(Cm(C6Tr?@J7)x8dPIS zg8xBk7x+5$H@KDB2htCl3c;UK`#}1AlMj4}+6A^!KH$6HT5u1w>qgN?Hi7i}@fPqM z)vid(+5!Jt)DG}>)DDo&)a(a;L+t>6N$miir~0pQIQNp~0@B%>q2QyWwSd0|$AY&~ zzk~F%<~)#oLOU0vGdmveW9mQfL)yxLA5ne4_vu^~__AtIq)|1m60K&vYEWC@_p2sF zTGe*=eX7BcCbtv*Jk^}&eEuHzBdX1jR<{p+`q}eA@FDOU@G<@oo5M-ZnndtP(vrX( zsvVJLH4^?+szH&qmAYEAqh{6qCax9@YP)J-x$s9-t0N7s1pdcqeytV_YKv-x{?(#c zk)}pxlxtVh_gbRWk%rf}n)YO(A(E!Jezj;@+f`fK2>)%AA2>_3MY=&-;V)7Rjx@S9 z_`|BX(Mgrv@Ykw#Hi7O#_*bYVd5UUfq|qHf_-g7WuvoP^KFP4g;jB}QkhH@@_$yR9 zq%H9v_-ThT61-WpLDCLW;iofW6T$0MqoZ@!x$v)44exU5FZdf(E2NVYrSRWF{RPqv zs1~H1P9r#5HB{16*Ta81^$SQ(wJqQss;!dN+6wANfpnlD%(9~Y7CWn zZ^^lrDz1}gDOG%5`t`(Q)Y6nhy%b$R=BsEyqE3niBDu=WDWLAKEnMbhr#rx79MIE~ zQA>*x#a8qN88dNWdH?cxtwZXcH~?f{RTxFdY8)oc5fSlX$SOt{=i)Oidd^=zzk9h2+#+!u-M9I@r*Bxe zcw4`8vn~D74~@@CY&!F=w|%E6_q$H;)`qO~j)BIPcNorZ?=qZ6VI%JB_Dk`$qesWR z;2ZJ42mN0?>M~v5ck6}t^!T{=crqg{QOxSEWxdQ)lhdU~zt9?+1vRxP)6KpzQ)5n9 z^NK1Rs$OEaBb7Yi-R0Fhp(BgK(PPKQXdp2}&w(}=sXdL=fxcT#Sn3*bXjV#EZ~8Us zM^D}}=O$P0)W3h9P?a{xXt@2O$3h!iXMOy$#M&d5(XUr;zUYIyT!TZwd*2!|Zj#Y9 z?@;@r%`U8^6J}jF1lP-7KJ@K_F4td{e_1v@9@oE^H|&hft`AGzbPayybX*ZRp1 zyH>ulXV;v!M@%x(Urf1V%%iU1+3z3zupa4~-wmCT+~TS!d_4K4ui-EK^7G*vx4HJt zE*|FEkNUNFzZ-Je6Rz7T*2Xn_aw)FA)NuZ-t*);hDtmqF&e5pvXIDjfKk2&f+WXIW z^Tjie-}H4$s-AMy2b%{RJYgu(A1FBK-R-Uwc?G*aHPD{)k!QDF@+;T4ITd3=Uyeum z%_UFX_G{NG1vMkDI{AW0#{SQGo%hEbuGe0>XvGC@{b{1n?0>#B^I6wt`Rl&!|LM6X zf6=zy>z;FMUh>of58Zs>BqM3!OLqs_Tshx<{O5Jc$54N6o!swv*JB;mzm~IR*d%OV z|H0ms$2DFszk+tB9MK7gaHwXMJoadwkm{VfM^!XBuLN#wpK0Liq&dt zZ9$}pb;Z4E71!c|Al417(5gJtXWf@tmEW0}02wUU_v>H3{@#2%e&?QZ*K=>~y>sr& zp%=F60QOVE;(L8Mu^>Fg>E+miSm|`{V3+kT<*4>yU+$BGScuBK%a4z^3KV7OnzrN+ zrZ&1;up99EEZ7!f8gdvDM(#c0a*EW)%V(a)4`X9f>xPGN{1k}m(%qbN1oL(KZtK5m zAU%5Q?tcFW)3)D=Nvf7QJ}lyJG-7N!)gjDR&Kir`l|fbotg>9ult^ybz!4C6_^vAL6_kF%!e@g)AqmS%FCotkW^(f6lC@<~z znRW9{V8()sfrA=AU%`I6ueLvl&HQ0pd9M?s{~~-DH4p0F?((oNPhoTK&B}Xp z3*>oA(&IfUFqG$Z^VX&gQ2r&4oaGf*>eBm9J|G4{dtAca?^uat4~`l1{#4L+{U4H? zh)V2e_wT=7JO##M@qqEXxs}+)2m3#$Rzm%DP3br7XeGu!!2R@{8_?e3s`85sl~~T# z_a3{7V7zA>+~*&B8k@g+;Bbx{>XWDGvn=y8wtS-R0Ly(C|MBa&ncGieS+g6Gf+|2C zy8?P$x_cU{aqT?FFWyUmB8HD~eX9!l-J{5xoz)BS>$W;6sS4}fr?a2?=I#n~A+&Uw zwF%J>D17JMtS+lkC8H|5nN1x@N!|(ae=6k#Kg8smf ziFfO(8CaXc#8M9?7VNvoz??};jB;QiXYBt`YsbQ z+?belwTgkYTbOtui-{5MGI3WwCKkZ>w8wden3%SdiSZgH?!uT@(4C3sMkNC;9Au(& zITP6g6VpaAvGgq_S`ia#w^cAO$G}9+P$rgMJH^1nd?upzn3(q_6S?Qg8CbfEiBS`n zSnJNj#H%M6c(;g&X*wn%e7iW}k(}<)!nA~=dTMm+~!l}=< zP_ouQInYQ}CQ*A4ok2~#^rBVMTdV{XEl5bUq#0nBk_-{3bVi%p!Uf_1=}`h~bV%Dv zf*#K>DU+KV)sQyZy9;UC;lqWrt@GMK+ICsLkhY;$E~jn37naj!L-AJHmi}}hZG%U7 zv@Jc+O54s;t@K%sa~^GDOtaFqWs{Y*L1tKKoBvEJeWozmO52JTSZUkl5-V-PU16nd z=|xuh3}C&Lwh?c$(zfBfR@%0E*h-&ulv!!p`AI8nQ?InrXB-y*LBEvVLC2|f`?+l9 zo)P7M=9GFhN5J<@vY2qr)RtkjL9bT|_=vC&Mi3ZuwuCVneTo+6Bxwz*sT>`V^4bpx zUh^LLe;S{B@7z9mAa>Djr|$-iKsfSgz5I`N%2tO-3bwAr%CDAh$nSf7{##~`lvO86 zf=hB1+?!kUu%tgu%-hy?)gA-hieHmg(IhCC~%S}9B zsk={_TR%mnU;o^GXTO?PQdZaXcK>IGkCi6muUPxhn1bOO7w(RabZNMpHG6-xrFUdj z`RqB?Nzz1F!|k4d-X&%HZgLgxdhm=Ib`Q^9*CRh)8B|&PR_3q2n^%2oa{vC+Qw}dl zF|Op=G@q9>6q}o*-UB-Uklapt;p7iu)RrIi_GaBWI zid*bn$EWS{AvWIq_=D-QJVe7f1S*}+`&!wnTzb|#e0E$?ySXfes7cckPmXPxGwE^0 z&u+WlHScgsJ-Xq}%o!1mzsy=#H^kg$RsDiEo@0-x2loBy7o5NJh9avQvDj_sM&I1H z{toL`e6!QAK5WxxW4UF0!&gnb*6sQq2l}{ojK1?Y-!rUc%vWw3d_rc_X(jB9snJin zvr|q+KKV9%-1GRkMi?XKPxK$f*wf{GRQ{K4$`4HZUKKI@)a#~RFV$TVwuZLlL{G{A>$Rj}erw|s> z?zmJM8#tjl;$kN%T+5o_H9Z@9$8FACD%@f`+Z%AVJ8YZis<^KKdcKt)7xzW55o`!csn2SAOS}pP7x{Qf}TkH)nb6k)@_32mi&6bhcc1 z29v_6C`E3z=(+ zdQSWs-!PF*9Z^1geuKucm`~)khuTUR{DwkchO}84!eZmNWW+hHj`Mt+a`!knHGdID zI&h+0x{==8#%q+J(XnVC!_(V9)Gk~@e^ZTEjI@4`cZSCFO3EgmaEzqwe9&l(%4i@A z$tFLD9Az}5Yt*oq^*}6lB5F*WA}{j2 zgttRuN0Fw61n4(E6RfS|+yjf@Yt)E5>OTMRw{!y@~Z_fR=Tvalx z7>j^yPW*&L`iiR=c z#gh@aOdge=kimr|?Hvs~BiVjn zF)Au%j2$7xTgyTPj!ir{(K~2cZU1c>ak*U+x5IXy7h7%M`)!-A~~e zZKuE7LVmJ^{8V<^@(~}koqu+2+wwmawywV+8xdQ+v3VQ?+V%#M*U)oaR~wbVJmUzw zV4zA^i}HZdfHngq!h;-#e3%0Y2FioQjC&aPKsi7KK$Sq;GKBPyJ{xEr&?2A$pmjjo zf%XF(2f6}u56BVbsQy55pb6xB1vP4i9AI8_LhVrpSYKRFN7M=C{4TJUv0qx%S}juI zL;@8|P$ehv_)?0IO!_z_Z%Eg4)D3}~rs9?aT(3e(qe@68p>OHP}3D1N!mO+o3G&)>qHvJhZAsyl;TN)*V$%rd;36KH& z<8u=-48{bFs)f{6W}}cWs5NF?f)3YZ;zk2nU(9NnV|#9dbr|*uMRq(f>4!Lq^I+)|0t+d^PuxYUFCijir1Q z0u!AhxiJ>PgzI8qkcANBUYEQ>kq*uNdSgau2vYIK z;ZFJ+jzcLVXS6|W*5VPA2I624k-Sk#!W3pSl4d1UbDYNgHN=XAQlSl`83R{`Yt2L| zRW^!nXw`dgh+Z9&rqNTaM}$*slgDB+dEexjIGqeN`6M=xA6qu zT9HZ%QLBwqAFOd0Wl*YZ@~{l3;|9lQlXjebx<;=?oydN+Yt>*@7+L=oRYa)JVHB=R z$6w()u|`m?J6j6Ivg}~AX1K+K#~R|`F(foqX+-5tjkmFeCOHx~ zK=-9l4MzUdJ*}jr4t8FsAkR{|FV%E02nCU0YD`$ta8$&CP)KMLtn)AqK$9AEs6mZK zDN}GXhm1KUY&0p|O2!L~A_oKVBKcwZbdAxVCw-ODMG;We*Ocb}OjOv|3($D7uCS(1 zIT~~@(4jB%cnCVyf)j_1&~+#CAZrUHe9oeV5Ly4>=Hz7D2>tns6XoifGp}q~9x2nREga>=>=o5O~wnfly>v^t)lB1bk}ALhcUq&oe^W>;LXm(r5pOck6=pG`^!@zXDtHS?t!*t;_rO1~s=jdDn&+dsIT0R`m__q#f zXk7U%jkEG=pHp^?tQ-o9A^w3?)vH?Ts#z~-47TC+zZgHnhC3jBMd7tVcXYk5zVQ9l z^UqpI-Hmkus-9fUK?&7Us$YGqpLOQKmD=AC;$=0a{JR&s)yp=*TfP2K6G!X*lWZN@ zs(+t<_>B7heSG{g1_n7tlC}u)+c1(iFwY(?eLZE{E>DPGR@yqXv^O@LzgU^|D29AW zf!J~un*)TxSnM3Y0-#c$s1Yo7B2dlYN}yNYx%?{^i}Er42JMcU!EZ+&yuHFF z{TW5r?5iLA$>Jx+GIUx_I_!vH>!|SJ`Ek8CxE}VOuz6N^jf)NUm3on$?e%J<)}Y4~ zUKX72!h*VVlq(4W*ClB!9LPXVD7?%@eE^|K#dS);SJ!wp;;S;~0+fW#FP-PbfgQRg z87EBR?Ms8KI2^gjXeOw?QDe((;A?Ud45ZRQN&;7zVK;5Dg@I$lr_TsP%NJ{RQN8#zXmZK&AS9mE2`mD(4#W8C_ROFL~!Yf&+C2%i}e{&)Jt(PMA zXVgjV-_$r#ZT^jVgTP;!uINpRC%1%qlY51Cn>S1FrQo`ti_l#-K=_Gpp>V74s_?e( ziI6377A+I46s;3&7uAc9xLCYHd{lf+d{x|4(of&kWS|Tl#-jO0%cbTV5AT!8vWQ%2mvP-f%GRJ^E0p0x3df-CK?8&ML5d(t(A=P9L2H7x1U(FL#`dp1y25?7n0LD(+?O3vMUgn>-($m^YC(g_p_8<$b~1!#l>i$h*ON z$aCWl=8O1Y{3w1pe>Q&!zlgtye}?}H{~n(u=q!*3!UW?4xWFhV5R?cG3(gB_1U-d= zg;HUpaJ(=>^r7f8krgz#S5ziCD|#e)E^-m~7W<3E;!yDz@l>%rJhnh=?Ljq>0~J(&6X~c zt_6LUORr0xNW04h$Yioe*?Y1SS+;DEtS&H8o+;0juLLa~l9$PUk=Mx|$b%J=6e$Wb z=y8RjTCp{#E=Y(eun24nX28tY3~UxQ7yA@jf_;S*Vr#L@*iLL8b`(2>ox^^`Zee$^ z#~3|HP#a@zN3J_}DCjhl8_P}M9^smKt9g%j&ips|UVI5Zg0JU)#LwmD@eBFu`CSC= zf)K$-L6TsFV5i`aph|E_P%m&3dI*OKxk9mUxDXdE6^4isMN>pGL~})XqAx^yM5UtZ zqI>_-*7<*RUEOi~Ls6o!LdC)pTdYx`qq^VU@B4ng@4cT23yt(+2aRp4(8yuY88cc` ztgx`K*ol&kSm>}w(KtqhMUxtxsIY^LHC9xdWDcD*PT{hmqO~WuANLQyz4!HeKAz9} zIq&!9BTrWeb*;Kx)vCE(rkCyA1Qo9LUc}iP@P@pd)y!0pIomyiu3r^#p3_F6hL2`_{5N# z$*rV@{GL2X_L5i0VRDS5uz)RNYjGYAv&}e-KK21S%)VjCd=9^mTfT&^;rH=I{y5*x zpXaahxA-u>L|i3a7YD^rks{BPR62R3yhh$2Zqvr+!3l(NF0v{j%P#-_{59;vf;M4sHsb4_*%r1n&hS z!Li`v@JHd2aCul8ZVaD^-i(e%XTW#a<|4z5HH)E~J?3hAgRQiW+E4A*Hs6)F-BWr< zz+%{coLocxM&`p!tLPef3%wg&YNH?0Pv~bf#!h9k*?gAG7Q#^>Tg>ib53;9O2m1^A zlx6aBxqy$V`1ibAtP@S*KFois9FT|P95^OW^=gya0TRu`{J9r;w|Vz_+q@l^{}JyC zFUdc{r{K_1kf;dG_?^GSZ-qDZ`1}38f=A!@-}}k>9KAp<(h0o+9;wpz=xutJ-lLz_ zgL+iQg42SuU|x_Plm~U-Q&X@t*cW^hd>nikoEDxLE(|XYMYu974Q~lIhr7bP;cMY& z_^&W2IxEVK7DQe&-}uIuz}{k?w6EZFh`ZEP!AD=XSV=54^*sfrkPdQ$P`aKzM-R~p z*#d6(OMIQUU2GTo#5>}Bak@N52J&)DxdiIp0rl^f@5&K*5@wvEm|CH(Q`^)o^}KpX z9Z>J9@6?%?^%8G|cfEI`R{>%?;yv!o10|H7@0a@b`1Sr){|Wy^{}cb1KY>%2uX8lh zPA}F!)6eRULFF@}%c9a~ZB!Z6MVq4C(Ff6I(Rb0QCN%3zo7rcsvg>V|{oEdLQ!k@U zy?`*2TuhdeA##v>Og<+Q@7H!7=yn6B zHvM+P)NjtjP9>|!N%S}LPH=uZ+sD3Tvv>xVn8q4@GvA0+?&L4?321SdxE^ykU$)B~ zY73P1ihqG#j!ZkE&k1C(GI$%FIV)Tiu7WByOzUD_cpy9&9t%&7=0z7o`O(j#^60Lp zA=+=wuuXQio$Ka96?Y+@UU5^4nbJiuSx5TGOgfidL|>x^=vOoc^jyh)#U5erFvG9m zr65BWm^r`?@rB|t@unCShsCENRnC!T$sfv#WGFYvhvgP2!Y$zo;Tz%EQKrd-iWiv`W(`j9J#)w$ zHOCCM*V=pSL-ujI2Sl8(X>NsERsBKTF33PJG7mBELh#$cg6@ZdO-#U-@_F+0nu%7C+ICmy7lIpYMnd z#lOW2dE%LuyeY=hG@4E`Xg1BExipXF(*jyWt7#3brQ_^4n_!bH#*=vp`av2`hpsYt z7SHB6JeL#rz~>Q<^E{r<3wVMT@*-Z0Q!3?Uyqs6?N)WJ`*YH|i$LpcPM&5+9Y~iiE zjkog--U$_S^B#1KKHd*C4Duo5#0Vcnl8*6lejKWuIFt#nL| z%j0qaZ7QacRfkSYzTQ8lS%w6IpR-F9@bPSvHlRgdabeX1Yc8B{}RSdFMm>?jwziLjFbQ)r4! zsVO&=rrOk+deewL)oR*JC%S1boHJ;K&8Qheub4zrO||JZ(`MUTD{N%*Y=JGb#kSOz zBTK7ot*y6>w%NAYcH3#YZLjUOgLc@C+A%cRNt^6aUAoJ3*)G=!7r8uF;0j%_D|O|r z(p9@!xUdm@x7D?~PS=fI((eY{up4z_?zo!-x07OZIQL|dO43Ot$tJl(kci}w0`#_G zQcB86C8;L0q@FaAX0+pW(n-2WFQ_z#jyy`n$Z;}Bl4&Zmp9$^fQb8lAzkn8^Ht?;IpAE8MHp<4}tVwjGR5&UVZpwv|BDkmk4l0Iw%Hf=9xTYSC zX@*S+34kV2A98J!;3nyqHUIX)eQMxg1BF@8ZangeyV^DsvTJdX1}d4X(+xxHd4c%k{WE zH{gcc2wLK}o0!g@q*&Q>PfQ_cB!gs;9750+<0PLXa4RVxWu$^sp*hx(2GT@YNE;eM z7wI8=WB_?PLXMJg9t2=iGSO+CSiSP3g*6|9QYusU@1Cf35*kltOa2W@qL z4Y3h+l#PRMG0-gyWXl582#6L3%@QD42`E+pg4KXt4IozwsMP^t^?+6bAk_#cH4Z|> zK&Ld2DGO90AW|GON`OQqpil(}R0HBSpaZsuHqjxvM33kb17b*wpb3wQ2@%6BHBDy7 zESZBu@MT=)%Y-bFOWaa-wOff?O`86^V$478Ponpw>U5on`)DrmF4B3rKo{y_U8>7< zrLNYsx?VTxX5FgWb*Jvuy}DlyPftD8k~IB$5;@r46rrc6+%`?&0qkRnuLSEZ#)_M; z$|0;Q1FI 0 ? (buf[0] & ADDRTYPE_MASK) : 0; @@ -150,22 +148,21 @@ namespace Shadowsocks.Encryption return len; } - protected int ss_onetimeauth(byte[] auth, byte[] msg, int msg_len) + protected byte[] genOnetimeAuthHash(byte[] msg, int msg_len) { - byte[] auth_key = new byte[ONETIMEAUTH_KEYBYTES]; - byte[] auth_bytes = new byte[MAX_IV_LENGTH + MAX_KEY_LENGTH]; - Buffer.BlockCopy(_encryptIV, 0, auth_bytes, 0, ivLen); - Buffer.BlockCopy(_key, 0, auth_bytes, ivLen, keyLen); - Sodium.crypto_generichash(auth_key, ONETIMEAUTH_KEYBYTES, auth_bytes, (ulong)(ivLen + keyLen), null, 0); - return Sodium.crypto_onetimeauth(auth, msg, (ulong)msg_len, auth_key); + byte[] auth = new byte[ONETIMEAUTH_BYTES]; + byte[] hash = new byte[20]; + byte[] auth_key = new byte[MAX_IV_LENGTH + MAX_KEY_LENGTH]; + Buffer.BlockCopy(_encryptIV, 0, auth_key, 0, ivLen); + Buffer.BlockCopy(_key, 0, auth_key, ivLen, keyLen); + Sodium.ss_sha1_hmac_ex(auth_key, (uint)(ivLen + keyLen), + msg, 0, (uint)msg_len, hash); + Buffer.BlockCopy(hash, 0, auth, 0, ONETIMEAUTH_BYTES); + return auth; } - protected void ss_gen_hash(byte[] buf, ref int offset, ref int len, int buf_size) + protected void updateKeyBuffer() { - int size = len + AUTH_BYTES; - if (buf_size < (size + offset)) - throw new Exception("failed to generate hash: buffer size insufficient"); - if (_keyBuffer == null) { _keyBuffer = new byte[MAX_IV_LENGTH + 4]; @@ -174,23 +171,19 @@ namespace Shadowsocks.Encryption byte[] counter_bytes = BitConverter.GetBytes((uint)IPAddress.HostToNetworkOrder((int)counter)); Buffer.BlockCopy(counter_bytes, 0, _keyBuffer, ivLen, 4); - - byte[] hash = new byte[HASH_BYTES]; - byte[] tmp = new byte[len]; - Buffer.BlockCopy(buf, offset, tmp, 0, len); - Sodium.crypto_generichash(hash, HASH_BYTES, tmp, (ulong)len, _keyBuffer, (uint)_keyBuffer.Length); - - Buffer.BlockCopy(buf, offset, buf, offset + AUTH_BYTES, len); - Buffer.BlockCopy(hash, 0, buf, offset + CLEN_BYTES, HASH_BYTES); - byte[] clen = BitConverter.GetBytes((ushort)IPAddress.HostToNetworkOrder((short)len)); - Buffer.BlockCopy(clen, 0, buf, offset, CLEN_BYTES); - counter++; - len += AUTH_BYTES; - offset += len; } - public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength) + protected byte[] genHash(byte[] buf, int offset, int len) + { + byte[] hash = new byte[20]; + updateKeyBuffer(); + Sodium.ss_sha1_hmac_ex(_keyBuffer, (uint)_keyBuffer.Length, + buf, offset, (uint)len, hash); + return hash; + } + + public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength, bool udp) { if (!_encryptIVSent) { @@ -198,21 +191,32 @@ namespace Shadowsocks.Encryption randBytes(outbuf, ivLen); initCipher(outbuf, true); outlength = length + ivLen; - lock (tempbuf) + if (OnetimeAuth && ivLen > 0) { - if (OnetimeAuth) + if(!udp) + { + int headLen = getHeadLen(buf, length); + int dataLen = length - headLen; + buf[0] |= ONETIMEAUTH_FLAG; + byte[] hash = genOnetimeAuthHash(buf, headLen); + Buffer.BlockCopy(buf, headLen, buf, headLen + ONETIMEAUTH_BYTES + AUTH_BYTES, dataLen); + Buffer.BlockCopy(hash, 0, buf, headLen, ONETIMEAUTH_BYTES); + hash = genHash(buf, headLen + ONETIMEAUTH_BYTES + AUTH_BYTES, dataLen); + Buffer.BlockCopy(hash, 0, buf, headLen + ONETIMEAUTH_BYTES + CLEN_BYTES, ONETIMEAUTH_BYTES); + byte[] lenBytes = BitConverter.GetBytes((ushort)IPAddress.HostToNetworkOrder((short)dataLen)); + Buffer.BlockCopy(lenBytes, 0, buf, headLen + ONETIMEAUTH_BYTES, CLEN_BYTES); + length = headLen + ONETIMEAUTH_BYTES + AUTH_BYTES + dataLen; + } + else { - int headLen = ss_headlen(buf, length); - int len = length - headLen; - Buffer.BlockCopy(buf, headLen, buf, headLen + ONETIMEAUTH_BYTES, len); buf[0] |= ONETIMEAUTH_FLAG; - byte[] auth = new byte[ONETIMEAUTH_BYTES]; - ss_onetimeauth(auth, buf, headLen); - Buffer.BlockCopy(auth, 0, buf, headLen, ONETIMEAUTH_BYTES); - int offset = headLen + ONETIMEAUTH_BYTES; - ss_gen_hash(buf, ref offset, ref len, buf.Length); - length = headLen + ONETIMEAUTH_BYTES + len; + byte[] hash = genOnetimeAuthHash(buf, length); + Buffer.BlockCopy(hash, 0, buf, length, ONETIMEAUTH_BYTES); + length += ONETIMEAUTH_BYTES; } + } + lock (tempbuf) + { cipherUpdate(true, length, buf, tempbuf); outlength = length + ivLen; Buffer.BlockCopy(tempbuf, 0, outbuf, ivLen, length); @@ -220,10 +224,14 @@ namespace Shadowsocks.Encryption } else { - if (OnetimeAuth) + if (OnetimeAuth && ivLen > 0) { - int offset = 0; - ss_gen_hash(buf, ref offset, ref length, buf.Length); + byte[] hash = genHash(buf, 0, length); + Buffer.BlockCopy(buf, 0, buf, AUTH_BYTES, length); + byte[] lenBytes = BitConverter.GetBytes((ushort)IPAddress.HostToNetworkOrder((short)length)); + Buffer.BlockCopy(lenBytes, 0, buf, 0, CLEN_BYTES); + Buffer.BlockCopy(hash, 0, buf, CLEN_BYTES, ONETIMEAUTH_BYTES); + length += AUTH_BYTES; } outlength = length; cipherUpdate(true, length, buf, outbuf); diff --git a/shadowsocks-csharp/Encryption/Sodium.cs b/shadowsocks-csharp/Encryption/Sodium.cs index a6bc909e..8d690dd2 100755 --- a/shadowsocks-csharp/Encryption/Sodium.cs +++ b/shadowsocks-csharp/Encryption/Sodium.cs @@ -41,15 +41,10 @@ namespace Shadowsocks.Encryption public extern static int crypto_stream_chacha20_xor_ic(byte[] c, byte[] m, ulong mlen, byte[] n, ulong ic, byte[] k); [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public extern static int crypto_generichash(byte[] outbuf, uint outlen, - byte[] inbuf, ulong inlen, - byte[] key, uint keylen); + public extern static void ss_sha1_hmac_ex(byte[] key, uint keylen, + byte[] input, int ioff, uint ilen, + byte[] output); - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public extern static int crypto_onetimeauth(byte[] outbuf, byte[] inbuf, ulong inlen, byte[] k); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public extern static int crypto_onetimeauth_verify(byte[] h, byte[] inbuf, ulong inlen, byte[] k); } } diff --git a/shadowsocks-csharp/Encryption/TableEncryptor.cs b/shadowsocks-csharp/Encryption/TableEncryptor.cs index 3de625a6..3f3c5f8c 100644 --- a/shadowsocks-csharp/Encryption/TableEncryptor.cs +++ b/shadowsocks-csharp/Encryption/TableEncryptor.cs @@ -31,7 +31,7 @@ namespace Shadowsocks.Encryption return new List(new string[]{"table"}); } - 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, bool udp) { byte[] result = new byte[length]; for (int i = 0; i < length; i++) diff --git a/test/UnitTest.cs b/test/UnitTest.cs index 6003770e..70c001f3 100755 --- a/test/UnitTest.cs +++ b/test/UnitTest.cs @@ -25,27 +25,27 @@ namespace test private void RunEncryptionRound(IEncryptor encryptor, IEncryptor decryptor) { byte[] plain = new byte[16384]; - byte[] cipher = new byte[plain.Length + 16]; + byte[] cipher = new byte[plain.Length + 16 + IVEncryptor.ONETIMEAUTH_BYTES + IVEncryptor.AUTH_BYTES]; byte[] plain2 = new byte[plain.Length + 16]; int outLen = 0; int outLen2 = 0; var random = new Random(); random.NextBytes(plain); - encryptor.Encrypt(plain, plain.Length, cipher, out outLen); + encryptor.Encrypt(plain, plain.Length, cipher, out outLen, false); 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); + encryptor.Encrypt(plain, 1000, cipher, out outLen, false); 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); + encryptor.Encrypt(plain, 12333, cipher, out outLen, false); decryptor.Decrypt(cipher, outLen, plain2, out outLen2); Assert.AreEqual(12333, outLen2); for (int j = 0; j < outLen2; j++) From 098640e792c6abede23735e45adb25bb7eb9ce9d Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Fri, 25 Sep 2015 04:42:56 -0400 Subject: [PATCH 22/23] refact --- shadowsocks-csharp/Controller/Service/TCPRelay.cs | 4 +- shadowsocks-csharp/Controller/Service/UDPRelay.cs | 6 +- shadowsocks-csharp/Encryption/EncryptorBase.cs | 6 +- shadowsocks-csharp/Encryption/EncryptorFactory.cs | 6 +- shadowsocks-csharp/Encryption/IEncryptor.cs | 2 +- shadowsocks-csharp/Encryption/IVEncryptor.cs | 93 +++++++++++++--------- shadowsocks-csharp/Encryption/PolarSSLEncryptor.cs | 4 +- shadowsocks-csharp/Encryption/SodiumEncryptor.cs | 4 +- shadowsocks-csharp/Encryption/TableEncryptor.cs | 6 +- test/UnitTest.cs | 18 ++--- 10 files changed, 85 insertions(+), 64 deletions(-) diff --git a/shadowsocks-csharp/Controller/Service/TCPRelay.cs b/shadowsocks-csharp/Controller/Service/TCPRelay.cs index eb676ad2..eef5948c 100644 --- a/shadowsocks-csharp/Controller/Service/TCPRelay.cs +++ b/shadowsocks-csharp/Controller/Service/TCPRelay.cs @@ -125,7 +125,7 @@ namespace Shadowsocks.Controller { throw new ArgumentException("No server configured"); } - this.encryptor = EncryptorFactory.GetEncryptor(server.method, server.password, server.one_time_auth); + this.encryptor = EncryptorFactory.GetEncryptor(server.method, server.password, server.one_time_auth, false); this.server = server; } @@ -586,7 +586,7 @@ namespace Shadowsocks.Controller { return; } - encryptor.Encrypt(connetionRecvBuffer, bytesRead, connetionSendBuffer, out bytesToSend, false); + encryptor.Encrypt(connetionRecvBuffer, bytesRead, connetionSendBuffer, out bytesToSend); } remote.BeginSend(connetionSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeRemoteSendCallback), null); diff --git a/shadowsocks-csharp/Controller/Service/UDPRelay.cs b/shadowsocks-csharp/Controller/Service/UDPRelay.cs index 9d3d3dcf..b449c412 100644 --- a/shadowsocks-csharp/Controller/Service/UDPRelay.cs +++ b/shadowsocks-csharp/Controller/Service/UDPRelay.cs @@ -74,12 +74,12 @@ namespace Shadowsocks.Controller } public void Send(byte[] data, int length) { - IEncryptor encryptor = EncryptorFactory.GetEncryptor(_server.method, _server.password, _server.one_time_auth); + IEncryptor encryptor = EncryptorFactory.GetEncryptor(_server.method, _server.password, _server.one_time_auth, true); byte[] dataIn = new byte[length - 3 + IVEncryptor.ONETIMEAUTH_BYTES]; Array.Copy(data, 3, dataIn, 0, length - 3); byte[] dataOut = new byte[length - 3 + 16 + IVEncryptor.ONETIMEAUTH_BYTES]; int outlen; - encryptor.Encrypt(dataIn, length - 3, dataOut, out outlen, true); + encryptor.Encrypt(dataIn, length - 3, dataOut, out outlen); _remote.SendTo(dataOut, outlen, SocketFlags.None, _remoteEndPoint); } public void Receive() @@ -97,7 +97,7 @@ namespace Shadowsocks.Controller byte[] dataOut = new byte[bytesRead]; int outlen; - IEncryptor encryptor = EncryptorFactory.GetEncryptor(_server.method, _server.password, _server.one_time_auth); + IEncryptor encryptor = EncryptorFactory.GetEncryptor(_server.method, _server.password, _server.one_time_auth, true); encryptor.Decrypt(_buffer, bytesRead, dataOut, out outlen); byte[] sendBuf = new byte[outlen + 3]; diff --git a/shadowsocks-csharp/Encryption/EncryptorBase.cs b/shadowsocks-csharp/Encryption/EncryptorBase.cs index 594e67bf..8285f165 100644 --- a/shadowsocks-csharp/Encryption/EncryptorBase.cs +++ b/shadowsocks-csharp/Encryption/EncryptorBase.cs @@ -8,16 +8,18 @@ namespace Shadowsocks.Encryption { public const int MAX_INPUT_SIZE = 32768; - protected EncryptorBase(string method, string password, bool onetimeauth) + protected EncryptorBase(string method, string password, bool onetimeauth, bool isudp) { Method = method; Password = password; OnetimeAuth = onetimeauth; + IsUDP = isudp; } protected string Method; protected string Password; protected bool OnetimeAuth; + protected bool IsUDP; protected byte[] GetPasswordHash() { @@ -26,7 +28,7 @@ namespace Shadowsocks.Encryption return hash; } - public abstract void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength, bool udp); + public abstract void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength); public abstract void Decrypt(byte[] buf, int length, byte[] outbuf, out int outlength); diff --git a/shadowsocks-csharp/Encryption/EncryptorFactory.cs b/shadowsocks-csharp/Encryption/EncryptorFactory.cs index d6c89b9f..f0e2d284 100644 --- a/shadowsocks-csharp/Encryption/EncryptorFactory.cs +++ b/shadowsocks-csharp/Encryption/EncryptorFactory.cs @@ -8,7 +8,7 @@ namespace Shadowsocks.Encryption { private static Dictionary _registeredEncryptors; - private static Type[] _constructorTypes = new Type[] { typeof(string), typeof(string), typeof(bool) }; + private static Type[] _constructorTypes = new Type[] { typeof(string), typeof(string), typeof(bool), typeof(bool) }; static EncryptorFactory() { @@ -27,7 +27,7 @@ namespace Shadowsocks.Encryption } } - public static IEncryptor GetEncryptor(string method, string password, bool onetimeauth) + public static IEncryptor GetEncryptor(string method, string password, bool onetimeauth, bool isudp) { if (string.IsNullOrEmpty(method)) { @@ -36,7 +36,7 @@ namespace Shadowsocks.Encryption method = method.ToLowerInvariant(); Type t = _registeredEncryptors[method]; ConstructorInfo c = t.GetConstructor(_constructorTypes); - IEncryptor result = (IEncryptor)c.Invoke(new object[] { method, password, onetimeauth }); + IEncryptor result = (IEncryptor)c.Invoke(new object[] { method, password, onetimeauth, isudp }); return result; } } diff --git a/shadowsocks-csharp/Encryption/IEncryptor.cs b/shadowsocks-csharp/Encryption/IEncryptor.cs index 33ce0816..b45c62c7 100644 --- a/shadowsocks-csharp/Encryption/IEncryptor.cs +++ b/shadowsocks-csharp/Encryption/IEncryptor.cs @@ -6,7 +6,7 @@ namespace Shadowsocks.Encryption { public interface IEncryptor : IDisposable { - void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength, bool udp); + void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength); void Decrypt(byte[] buf, int length, byte[] outbuf, out int outlength); } } diff --git a/shadowsocks-csharp/Encryption/IVEncryptor.cs b/shadowsocks-csharp/Encryption/IVEncryptor.cs index 8af5b9e5..52d1970b 100755 --- a/shadowsocks-csharp/Encryption/IVEncryptor.cs +++ b/shadowsocks-csharp/Encryption/IVEncryptor.cs @@ -40,8 +40,8 @@ namespace Shadowsocks.Encryption protected uint counter = 0; protected byte[] _keyBuffer = null; - public IVEncryptor(string method, string password, bool onetimeauth) - : base(method, password, onetimeauth) + public IVEncryptor(string method, string password, bool onetimeauth, bool isudp) + : base(method, password, onetimeauth, isudp) { InitKey(method, password); } @@ -183,38 +183,65 @@ namespace Shadowsocks.Encryption return hash; } - public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength, bool udp) + protected void reactBuffer4TCP(byte[] buf, ref int length) + { + if (!_encryptIVSent) + { + int headLen = getHeadLen(buf, length); + int dataLen = length - headLen; + buf[0] |= ONETIMEAUTH_FLAG; + byte[] hash = genOnetimeAuthHash(buf, headLen); + Buffer.BlockCopy(buf, headLen, buf, headLen + ONETIMEAUTH_BYTES + AUTH_BYTES, dataLen); + Buffer.BlockCopy(hash, 0, buf, headLen, ONETIMEAUTH_BYTES); + hash = genHash(buf, headLen + ONETIMEAUTH_BYTES + AUTH_BYTES, dataLen); + Buffer.BlockCopy(hash, 0, buf, headLen + ONETIMEAUTH_BYTES + CLEN_BYTES, ONETIMEAUTH_BYTES); + byte[] lenBytes = BitConverter.GetBytes((ushort)IPAddress.HostToNetworkOrder((short)dataLen)); + Buffer.BlockCopy(lenBytes, 0, buf, headLen + ONETIMEAUTH_BYTES, CLEN_BYTES); + length = headLen + ONETIMEAUTH_BYTES + AUTH_BYTES + dataLen; + } + else + { + byte[] hash = genHash(buf, 0, length); + Buffer.BlockCopy(buf, 0, buf, AUTH_BYTES, length); + byte[] lenBytes = BitConverter.GetBytes((ushort)IPAddress.HostToNetworkOrder((short)length)); + Buffer.BlockCopy(lenBytes, 0, buf, 0, CLEN_BYTES); + Buffer.BlockCopy(hash, 0, buf, CLEN_BYTES, ONETIMEAUTH_BYTES); + length += AUTH_BYTES; + } + } + + protected void reactBuffer4UDP(byte[] buf, ref int length) + { + buf[0] |= ONETIMEAUTH_FLAG; + byte[] hash = genOnetimeAuthHash(buf, length); + Buffer.BlockCopy(hash, 0, buf, length, ONETIMEAUTH_BYTES); + length += ONETIMEAUTH_BYTES; + } + + protected void reactBuffer(byte[] buf, ref int length) + { + if (OnetimeAuth && ivLen > 0) + { + if (!IsUDP) + { + reactBuffer4TCP(buf, ref length); + } + else + { + reactBuffer4UDP(buf, ref length); + } + } + } + + public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength) { if (!_encryptIVSent) { - _encryptIVSent = true; randBytes(outbuf, ivLen); initCipher(outbuf, true); outlength = length + ivLen; - if (OnetimeAuth && ivLen > 0) - { - if(!udp) - { - int headLen = getHeadLen(buf, length); - int dataLen = length - headLen; - buf[0] |= ONETIMEAUTH_FLAG; - byte[] hash = genOnetimeAuthHash(buf, headLen); - Buffer.BlockCopy(buf, headLen, buf, headLen + ONETIMEAUTH_BYTES + AUTH_BYTES, dataLen); - Buffer.BlockCopy(hash, 0, buf, headLen, ONETIMEAUTH_BYTES); - hash = genHash(buf, headLen + ONETIMEAUTH_BYTES + AUTH_BYTES, dataLen); - Buffer.BlockCopy(hash, 0, buf, headLen + ONETIMEAUTH_BYTES + CLEN_BYTES, ONETIMEAUTH_BYTES); - byte[] lenBytes = BitConverter.GetBytes((ushort)IPAddress.HostToNetworkOrder((short)dataLen)); - Buffer.BlockCopy(lenBytes, 0, buf, headLen + ONETIMEAUTH_BYTES, CLEN_BYTES); - length = headLen + ONETIMEAUTH_BYTES + AUTH_BYTES + dataLen; - } - else - { - buf[0] |= ONETIMEAUTH_FLAG; - byte[] hash = genOnetimeAuthHash(buf, length); - Buffer.BlockCopy(hash, 0, buf, length, ONETIMEAUTH_BYTES); - length += ONETIMEAUTH_BYTES; - } - } + reactBuffer(buf, ref length); + _encryptIVSent = true; lock (tempbuf) { cipherUpdate(true, length, buf, tempbuf); @@ -224,15 +251,7 @@ namespace Shadowsocks.Encryption } else { - if (OnetimeAuth && ivLen > 0) - { - byte[] hash = genHash(buf, 0, length); - Buffer.BlockCopy(buf, 0, buf, AUTH_BYTES, length); - byte[] lenBytes = BitConverter.GetBytes((ushort)IPAddress.HostToNetworkOrder((short)length)); - Buffer.BlockCopy(lenBytes, 0, buf, 0, CLEN_BYTES); - Buffer.BlockCopy(hash, 0, buf, CLEN_BYTES, ONETIMEAUTH_BYTES); - length += AUTH_BYTES; - } + reactBuffer(buf, ref length); outlength = length; cipherUpdate(true, length, buf, outbuf); } diff --git a/shadowsocks-csharp/Encryption/PolarSSLEncryptor.cs b/shadowsocks-csharp/Encryption/PolarSSLEncryptor.cs index 3aca3f72..3b3331f9 100755 --- a/shadowsocks-csharp/Encryption/PolarSSLEncryptor.cs +++ b/shadowsocks-csharp/Encryption/PolarSSLEncryptor.cs @@ -16,8 +16,8 @@ namespace Shadowsocks.Encryption private IntPtr _encryptCtx = IntPtr.Zero; private IntPtr _decryptCtx = IntPtr.Zero; - public PolarSSLEncryptor(string method, string password, bool onetimeauth) - : base(method, password, onetimeauth) + public PolarSSLEncryptor(string method, string password, bool onetimeauth, bool isudp) + : base(method, password, onetimeauth, isudp) { InitKey(method, password); } diff --git a/shadowsocks-csharp/Encryption/SodiumEncryptor.cs b/shadowsocks-csharp/Encryption/SodiumEncryptor.cs index 8ab8e255..a18d2a69 100755 --- a/shadowsocks-csharp/Encryption/SodiumEncryptor.cs +++ b/shadowsocks-csharp/Encryption/SodiumEncryptor.cs @@ -20,8 +20,8 @@ namespace Shadowsocks.Encryption protected ulong _encryptIC; protected ulong _decryptIC; - public SodiumEncryptor(string method, string password, bool onetimeauth) - : base(method, password, onetimeauth) + public SodiumEncryptor(string method, string password, bool onetimeauth, bool isudp) + : base(method, password, onetimeauth, isudp) { InitKey(method, password); } diff --git a/shadowsocks-csharp/Encryption/TableEncryptor.cs b/shadowsocks-csharp/Encryption/TableEncryptor.cs index 3f3c5f8c..4b6c8fe3 100644 --- a/shadowsocks-csharp/Encryption/TableEncryptor.cs +++ b/shadowsocks-csharp/Encryption/TableEncryptor.cs @@ -6,8 +6,8 @@ namespace Shadowsocks.Encryption public class TableEncryptor : EncryptorBase { - public TableEncryptor(string method, string password, bool onetimeauth) - : base(method, password, onetimeauth) + public TableEncryptor(string method, string password, bool onetimeauth, bool isudp) + : base(method, password, onetimeauth, isudp) { byte[] hash = GetPasswordHash(); // TODO endian @@ -31,7 +31,7 @@ namespace Shadowsocks.Encryption return new List(new string[]{"table"}); } - public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength, bool udp) + public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength) { byte[] result = new byte[length]; for (int i = 0; i < length; i++) diff --git a/test/UnitTest.cs b/test/UnitTest.cs index 70c001f3..1970e85f 100755 --- a/test/UnitTest.cs +++ b/test/UnitTest.cs @@ -31,21 +31,21 @@ namespace test int outLen2 = 0; var random = new Random(); random.NextBytes(plain); - encryptor.Encrypt(plain, plain.Length, cipher, out outLen, false); + 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, false); + 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, false); + 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++) @@ -84,8 +84,8 @@ namespace test { IEncryptor encryptor; IEncryptor decryptor; - encryptor = new PolarSSLEncryptor("aes-256-cfb", "barfoo!", false); - decryptor = new PolarSSLEncryptor("aes-256-cfb", "barfoo!", false); + encryptor = new PolarSSLEncryptor("aes-256-cfb", "barfoo!", false, false); + decryptor = new PolarSSLEncryptor("aes-256-cfb", "barfoo!", false, false); RunEncryptionRound(encryptor, decryptor); } } @@ -124,8 +124,8 @@ namespace test var random = new Random(); IEncryptor encryptor; IEncryptor decryptor; - encryptor = new PolarSSLEncryptor("rc4-md5", "barfoo!", false); - decryptor = new PolarSSLEncryptor("rc4-md5", "barfoo!", false); + encryptor = new PolarSSLEncryptor("rc4-md5", "barfoo!", false, false); + decryptor = new PolarSSLEncryptor("rc4-md5", "barfoo!", false, false); RunEncryptionRound(encryptor, decryptor); } } @@ -164,8 +164,8 @@ namespace test var random = new Random(); IEncryptor encryptor; IEncryptor decryptor; - encryptor = new SodiumEncryptor("salsa20", "barfoo!", false); - decryptor = new SodiumEncryptor("salsa20", "barfoo!", false); + encryptor = new SodiumEncryptor("salsa20", "barfoo!", false, false); + decryptor = new SodiumEncryptor("salsa20", "barfoo!", false, false); RunEncryptionRound(encryptor, decryptor); } } From 5c570fbb56a7c20375aa07659967ff7d1c446129 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Fri, 25 Sep 2015 21:18:15 +0800 Subject: [PATCH 23/23] disable one-time auth when method is table or rc4 --- shadowsocks-csharp/View/ConfigForm.Designer.cs | 98 +++++++++++++------------- shadowsocks-csharp/View/ConfigForm.cs | 13 ++++ 2 files changed, 63 insertions(+), 48 deletions(-) diff --git a/shadowsocks-csharp/View/ConfigForm.Designer.cs b/shadowsocks-csharp/View/ConfigForm.Designer.cs index a4754918..8c5334d0 100755 --- a/shadowsocks-csharp/View/ConfigForm.Designer.cs +++ b/shadowsocks-csharp/View/ConfigForm.Designer.cs @@ -39,6 +39,7 @@ this.PasswordTextBox = new System.Windows.Forms.TextBox(); this.EncryptionLabel = new System.Windows.Forms.Label(); this.EncryptionSelect = new System.Windows.Forms.ComboBox(); + this.OneTimeAuth = new System.Windows.Forms.CheckBox(); this.panel2 = new System.Windows.Forms.Panel(); this.OKButton = new System.Windows.Forms.Button(); this.MyCancelButton = new System.Windows.Forms.Button(); @@ -55,7 +56,6 @@ this.ProxyPortLabel = new System.Windows.Forms.Label(); this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel(); - this.OneTimeAuth = new System.Windows.Forms.CheckBox(); this.tableLayoutPanel1.SuspendLayout(); this.ServerGroupBox.SuspendLayout(); this.tableLayoutPanel2.SuspendLayout(); @@ -95,16 +95,16 @@ 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(238, 160); + this.tableLayoutPanel1.Size = new System.Drawing.Size(249, 162); this.tableLayoutPanel1.TabIndex = 0; // // RemarksTextBox // this.RemarksTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.RemarksTextBox.Location = new System.Drawing.Point(72, 111); + this.RemarksTextBox.Location = new System.Drawing.Point(83, 113); this.RemarksTextBox.MaxLength = 32; this.RemarksTextBox.Name = "RemarksTextBox"; - this.RemarksTextBox.Size = new System.Drawing.Size(160, 20); + this.RemarksTextBox.Size = new System.Drawing.Size(160, 21); this.RemarksTextBox.TabIndex = 4; this.RemarksTextBox.WordWrap = false; // @@ -112,9 +112,9 @@ // this.RemarksLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; this.RemarksLabel.AutoSize = true; - this.RemarksLabel.Location = new System.Drawing.Point(17, 114); + this.RemarksLabel.Location = new System.Drawing.Point(30, 117); this.RemarksLabel.Name = "RemarksLabel"; - this.RemarksLabel.Size = new System.Drawing.Size(49, 13); + this.RemarksLabel.Size = new System.Drawing.Size(47, 12); this.RemarksLabel.TabIndex = 9; this.RemarksLabel.Text = "Remarks"; // @@ -122,9 +122,9 @@ // this.IPLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; this.IPLabel.AutoSize = true; - this.IPLabel.Location = new System.Drawing.Point(15, 9); + this.IPLabel.Location = new System.Drawing.Point(18, 10); this.IPLabel.Name = "IPLabel"; - this.IPLabel.Size = new System.Drawing.Size(51, 13); + this.IPLabel.Size = new System.Drawing.Size(59, 12); this.IPLabel.TabIndex = 0; this.IPLabel.Text = "Server IP"; // @@ -132,9 +132,9 @@ // this.ServerPortLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; this.ServerPortLabel.AutoSize = true; - this.ServerPortLabel.Location = new System.Drawing.Point(6, 35); + this.ServerPortLabel.Location = new System.Drawing.Point(6, 37); this.ServerPortLabel.Name = "ServerPortLabel"; - this.ServerPortLabel.Size = new System.Drawing.Size(60, 13); + this.ServerPortLabel.Size = new System.Drawing.Size(71, 12); this.ServerPortLabel.TabIndex = 1; this.ServerPortLabel.Text = "Server Port"; // @@ -142,40 +142,40 @@ // this.PasswordLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; this.PasswordLabel.AutoSize = true; - this.PasswordLabel.Location = new System.Drawing.Point(13, 61); + this.PasswordLabel.Location = new System.Drawing.Point(24, 64); this.PasswordLabel.Name = "PasswordLabel"; - this.PasswordLabel.Size = new System.Drawing.Size(53, 13); + this.PasswordLabel.Size = new System.Drawing.Size(53, 12); this.PasswordLabel.TabIndex = 2; this.PasswordLabel.Text = "Password"; // // IPTextBox // this.IPTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.IPTextBox.Location = new System.Drawing.Point(72, 6); + this.IPTextBox.Location = new System.Drawing.Point(83, 6); this.IPTextBox.MaxLength = 512; this.IPTextBox.Name = "IPTextBox"; - this.IPTextBox.Size = new System.Drawing.Size(160, 20); + this.IPTextBox.Size = new System.Drawing.Size(160, 21); this.IPTextBox.TabIndex = 0; this.IPTextBox.WordWrap = false; // // ServerPortTextBox // this.ServerPortTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.ServerPortTextBox.Location = new System.Drawing.Point(72, 32); + this.ServerPortTextBox.Location = new System.Drawing.Point(83, 33); this.ServerPortTextBox.MaxLength = 10; this.ServerPortTextBox.Name = "ServerPortTextBox"; - this.ServerPortTextBox.Size = new System.Drawing.Size(160, 20); + this.ServerPortTextBox.Size = new System.Drawing.Size(160, 21); this.ServerPortTextBox.TabIndex = 1; this.ServerPortTextBox.WordWrap = false; // // PasswordTextBox // this.PasswordTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.PasswordTextBox.Location = new System.Drawing.Point(72, 58); + this.PasswordTextBox.Location = new System.Drawing.Point(83, 60); this.PasswordTextBox.MaxLength = 256; this.PasswordTextBox.Name = "PasswordTextBox"; this.PasswordTextBox.PasswordChar = '*'; - this.PasswordTextBox.Size = new System.Drawing.Size(160, 20); + this.PasswordTextBox.Size = new System.Drawing.Size(160, 21); this.PasswordTextBox.TabIndex = 2; this.PasswordTextBox.WordWrap = false; // @@ -183,9 +183,9 @@ // this.EncryptionLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; this.EncryptionLabel.AutoSize = true; - this.EncryptionLabel.Location = new System.Drawing.Point(9, 88); + this.EncryptionLabel.Location = new System.Drawing.Point(12, 91); this.EncryptionLabel.Name = "EncryptionLabel"; - this.EncryptionLabel.Size = new System.Drawing.Size(57, 13); + this.EncryptionLabel.Size = new System.Drawing.Size(65, 12); this.EncryptionLabel.TabIndex = 8; this.EncryptionLabel.Text = "Encryption"; // @@ -196,7 +196,7 @@ this.EncryptionSelect.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.EncryptionSelect.FormattingEnabled = true; this.EncryptionSelect.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.EncryptionSelect.ItemHeight = 13; + this.EncryptionSelect.ItemHeight = 12; this.EncryptionSelect.Items.AddRange(new object[] { "table", "rc4-md5", @@ -206,10 +206,21 @@ "aes-192-cfb", "aes-128-cfb", "rc4"}); - this.EncryptionSelect.Location = new System.Drawing.Point(72, 84); + this.EncryptionSelect.Location = new System.Drawing.Point(83, 87); this.EncryptionSelect.Name = "EncryptionSelect"; - this.EncryptionSelect.Size = new System.Drawing.Size(160, 21); + this.EncryptionSelect.Size = new System.Drawing.Size(160, 20); this.EncryptionSelect.TabIndex = 3; + this.EncryptionSelect.SelectedIndexChanged += new System.EventHandler(this.EncryptionSelect_SelectedIndexChanged); + // + // OneTimeAuth + // + this.OneTimeAuth.AutoSize = true; + this.OneTimeAuth.Location = new System.Drawing.Point(83, 140); + this.OneTimeAuth.Name = "OneTimeAuth"; + this.OneTimeAuth.Size = new System.Drawing.Size(156, 16); + this.OneTimeAuth.TabIndex = 5; + this.OneTimeAuth.Text = "Onetime Authentication"; + this.OneTimeAuth.UseVisualStyleBackColor = true; // // panel2 // @@ -279,7 +290,7 @@ this.ServerGroupBox.Location = new System.Drawing.Point(178, 0); this.ServerGroupBox.Margin = new System.Windows.Forms.Padding(12, 0, 0, 0); this.ServerGroupBox.Name = "ServerGroupBox"; - this.ServerGroupBox.Size = new System.Drawing.Size(249, 197); + this.ServerGroupBox.Size = new System.Drawing.Size(260, 200); this.ServerGroupBox.TabIndex = 0; this.ServerGroupBox.TabStop = false; this.ServerGroupBox.Text = "Server"; @@ -288,6 +299,7 @@ // this.ServersListBox.FormattingEnabled = true; this.ServersListBox.IntegralHeight = false; + this.ServersListBox.ItemHeight = 12; this.ServersListBox.Location = new System.Drawing.Point(0, 0); this.ServersListBox.Margin = new System.Windows.Forms.Padding(0); this.ServersListBox.Name = "ServersListBox"; @@ -315,7 +327,7 @@ this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.Size = new System.Drawing.Size(427, 261); + this.tableLayoutPanel2.Size = new System.Drawing.Size(438, 265); this.tableLayoutPanel2.TabIndex = 7; // // tableLayoutPanel6 @@ -328,7 +340,7 @@ this.tableLayoutPanel6.Controls.Add(this.MoveDownButton, 1, 0); this.tableLayoutPanel6.Controls.Add(this.MoveUpButton, 0, 0); this.tableLayoutPanel6.Dock = System.Windows.Forms.DockStyle.Top; - this.tableLayoutPanel6.Location = new System.Drawing.Point(0, 229); + this.tableLayoutPanel6.Location = new System.Drawing.Point(0, 233); this.tableLayoutPanel6.Margin = new System.Windows.Forms.Padding(0); this.tableLayoutPanel6.Name = "tableLayoutPanel6"; this.tableLayoutPanel6.RowCount = 1; @@ -371,26 +383,26 @@ this.tableLayoutPanel5.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); this.tableLayoutPanel5.Controls.Add(this.ProxyPortTextBox, 1, 0); this.tableLayoutPanel5.Controls.Add(this.ProxyPortLabel, 0, 0); - this.tableLayoutPanel5.Location = new System.Drawing.Point(241, 197); + this.tableLayoutPanel5.Location = new System.Drawing.Point(242, 200); this.tableLayoutPanel5.Margin = new System.Windows.Forms.Padding(0); this.tableLayoutPanel5.Name = "tableLayoutPanel5"; this.tableLayoutPanel5.Padding = new System.Windows.Forms.Padding(3); this.tableLayoutPanel5.RowCount = 1; this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F)); - this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F)); - this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F)); - this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F)); - this.tableLayoutPanel5.Size = new System.Drawing.Size(186, 32); + this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 27F)); + this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 27F)); + this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 27F)); + this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 27F)); + this.tableLayoutPanel5.Size = new System.Drawing.Size(196, 33); this.tableLayoutPanel5.TabIndex = 9; // // ProxyPortTextBox // this.ProxyPortTextBox.Anchor = System.Windows.Forms.AnchorStyles.Left; - this.ProxyPortTextBox.Location = new System.Drawing.Point(67, 6); + this.ProxyPortTextBox.Location = new System.Drawing.Point(77, 6); this.ProxyPortTextBox.MaxLength = 10; this.ProxyPortTextBox.Name = "ProxyPortTextBox"; - this.ProxyPortTextBox.Size = new System.Drawing.Size(113, 20); + this.ProxyPortTextBox.Size = new System.Drawing.Size(113, 21); this.ProxyPortTextBox.TabIndex = 6; this.ProxyPortTextBox.WordWrap = false; // @@ -398,9 +410,9 @@ // this.ProxyPortLabel.Anchor = System.Windows.Forms.AnchorStyles.Right; this.ProxyPortLabel.AutoSize = true; - this.ProxyPortLabel.Location = new System.Drawing.Point(6, 9); + this.ProxyPortLabel.Location = new System.Drawing.Point(6, 10); this.ProxyPortLabel.Name = "ProxyPortLabel"; - this.ProxyPortLabel.Size = new System.Drawing.Size(55, 13); + this.ProxyPortLabel.Size = new System.Drawing.Size(65, 12); this.ProxyPortLabel.TabIndex = 3; this.ProxyPortLabel.Text = "Proxy Port"; // @@ -415,7 +427,7 @@ this.tableLayoutPanel3.Controls.Add(this.MyCancelButton, 1, 0); this.tableLayoutPanel3.Controls.Add(this.OKButton, 0, 0); this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Right; - this.tableLayoutPanel3.Location = new System.Drawing.Point(268, 232); + this.tableLayoutPanel3.Location = new System.Drawing.Point(279, 236); this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(3, 3, 0, 3); this.tableLayoutPanel3.Name = "tableLayoutPanel3"; this.tableLayoutPanel3.RowCount = 1; @@ -433,7 +445,7 @@ this.tableLayoutPanel4.Controls.Add(this.DeleteButton, 1, 0); this.tableLayoutPanel4.Controls.Add(this.AddButton, 0, 0); this.tableLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Top; - this.tableLayoutPanel4.Location = new System.Drawing.Point(0, 197); + this.tableLayoutPanel4.Location = new System.Drawing.Point(0, 200); this.tableLayoutPanel4.Margin = new System.Windows.Forms.Padding(0); this.tableLayoutPanel4.Name = "tableLayoutPanel4"; this.tableLayoutPanel4.RowCount = 1; @@ -441,16 +453,6 @@ this.tableLayoutPanel4.Size = new System.Drawing.Size(166, 32); this.tableLayoutPanel4.TabIndex = 8; // - // OneTimeAuth - // - this.OneTimeAuth.AutoSize = true; - this.OneTimeAuth.Location = new System.Drawing.Point(72, 137); - this.OneTimeAuth.Name = "OneTimeAuth"; - this.OneTimeAuth.Size = new System.Drawing.Size(131, 17); - this.OneTimeAuth.TabIndex = 5; - this.OneTimeAuth.Text = "Onetime Authentication"; - this.OneTimeAuth.UseVisualStyleBackColor = true; - // // ConfigForm // this.AcceptButton = this.OKButton; diff --git a/shadowsocks-csharp/View/ConfigForm.cs b/shadowsocks-csharp/View/ConfigForm.cs index 38bdf1ad..9ae26583 100755 --- a/shadowsocks-csharp/View/ConfigForm.cs +++ b/shadowsocks-csharp/View/ConfigForm.cs @@ -322,5 +322,18 @@ namespace Shadowsocks.View MoveConfigItem(+1); // +1 means move forward } } + + private void EncryptionSelect_SelectedIndexChanged(object sender, EventArgs e) + { + if (EncryptionSelect.Text == "rc4" || EncryptionSelect.Text == "table") + { + OneTimeAuth.Enabled = false; + OneTimeAuth.Checked = false; + } + else + { + OneTimeAuth.Enabled = true; + } + } } }