diff --git a/CHANGES b/CHANGES index 99c0fc2e5..3773974b7 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +4.4.1.0 2022-02-08 +- Add plain/none ciphers + 4.4.0.0 2021-01-01 - Security: remove infrastructure of stream ciphers (#3048) - Show warning message when importing from deprecated legacy ss:// links. diff --git a/appveyor.yml b/appveyor.yml index ee2cb6f8d..8fa2a3e83 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,7 +11,7 @@ # version format # Build version format is taken from UI if it is not set -version: 4.4.0.{build} +version: 4.4.1.{build} # # branches to build # branches: diff --git a/shadowsocks-csharp/Controller/Service/UpdateChecker.cs b/shadowsocks-csharp/Controller/Service/UpdateChecker.cs index c8a49ee0d..be57427b1 100644 --- a/shadowsocks-csharp/Controller/Service/UpdateChecker.cs +++ b/shadowsocks-csharp/Controller/Service/UpdateChecker.cs @@ -33,7 +33,7 @@ public class UpdateChecker public event EventHandler CheckUpdateCompleted; - public const string Version = "4.4.0.0"; + public const string Version = "4.4.1.0"; private readonly Version _version; public UpdateChecker() diff --git a/shadowsocks-csharp/Encryption/EncryptorFactory.cs b/shadowsocks-csharp/Encryption/EncryptorFactory.cs index dc1f3abd8..81df1fe97 100644 --- a/shadowsocks-csharp/Encryption/EncryptorFactory.cs +++ b/shadowsocks-csharp/Encryption/EncryptorFactory.cs @@ -3,6 +3,7 @@ using System.Reflection; using System.Text; using Shadowsocks.Encryption.AEAD; +using Shadowsocks.Encryption.Stream; namespace Shadowsocks.Encryption { @@ -16,6 +17,8 @@ static EncryptorFactory() { var AEADMbedTLSEncryptorSupportedCiphers = AEADMbedTLSEncryptor.SupportedCiphers(); var AEADSodiumEncryptorSupportedCiphers = AEADSodiumEncryptor.SupportedCiphers(); + var PlainEncryptorSupportedCiphers = PlainEncryptor.SupportedCiphers(); + if (Sodium.AES256GCMAvailable) { // prefer to aes-256-gcm in libsodium @@ -43,6 +46,12 @@ static EncryptorFactory() if (!_registeredEncryptors.ContainsKey(method)) _registeredEncryptors.Add(method, typeof(AEADMbedTLSEncryptor)); } + + foreach (string method in PlainEncryptorSupportedCiphers) + { + if (!_registeredEncryptors.ContainsKey(method)) + _registeredEncryptors.Add(method, typeof(PlainEncryptor)); + } } public static IEncryptor GetEncryptor(string method, string password) diff --git a/shadowsocks-csharp/Encryption/Stream/PlainEncryptor.cs b/shadowsocks-csharp/Encryption/Stream/PlainEncryptor.cs new file mode 100644 index 000000000..8097f4b95 --- /dev/null +++ b/shadowsocks-csharp/Encryption/Stream/PlainEncryptor.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; + +namespace Shadowsocks.Encryption.Stream +{ + class PlainEncryptor + : EncryptorBase, IDisposable + { + const int CIPHER_NONE = 1; + + private static Dictionary _ciphers = new Dictionary { + { "plain", new EncryptorInfo("PLAIN", 0, 0, CIPHER_NONE) }, + { "none", new EncryptorInfo("PLAIN", 0, 0, CIPHER_NONE) } + }; + + public PlainEncryptor(string method, string password) : base(method, password) + { + } + + public static List SupportedCiphers() + { + return new List(_ciphers.Keys); + } + + protected Dictionary getCiphers() + { + return _ciphers; + } + + #region TCP + + public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength) + { + Buffer.BlockCopy(buf, 0, outbuf, 0, length); + outlength = length; + } + + public override void Decrypt(byte[] buf, int length, byte[] outbuf, out int outlength) + { + Buffer.BlockCopy(buf, 0, outbuf, 0, length); + outlength = length; + } + + #endregion + + #region UDP + + public override void EncryptUDP(byte[] buf, int length, byte[] outbuf, out int outlength) + { + Buffer.BlockCopy(buf, 0, outbuf, 0, length); + outlength = length; + } + + public override void DecryptUDP(byte[] buf, int length, byte[] outbuf, out int outlength) + { + Buffer.BlockCopy(buf, 0, outbuf, 0, length); + outlength = length; + } + + #endregion + + + #region IDisposable + + private bool _disposed; + + // instance based lock + private readonly object _lock = new object(); + + public override void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + ~PlainEncryptor() + { + Dispose(false); + } + + protected virtual void Dispose(bool disposing) + { + lock (_lock) + { + if (_disposed) return; + _disposed = true; + } + + if (disposing) + { + // free managed objects + } + } + + #endregion + + } +} diff --git a/shadowsocks-csharp/View/ConfigForm.cs b/shadowsocks-csharp/View/ConfigForm.cs index 3fa423b4a..a60788ee4 100755 --- a/shadowsocks-csharp/View/ConfigForm.cs +++ b/shadowsocks-csharp/View/ConfigForm.cs @@ -27,6 +27,8 @@ private class EncryptionMethod // Edit here to add/delete encryption method displayed in UI private static string[] inuseMethod = new string[] { + "none", + "plain", "aes-256-gcm", "aes-192-gcm", "aes-128-gcm", @@ -611,5 +613,10 @@ private void UsePluginArgCheckBox_CheckedChanged(object sender, EventArgs e) { ShowHidePluginArgInput(NeedPluginArgCheckBox.Checked); } + + private void EncryptionSelect_SelectedIndexChanged(object sender, EventArgs e) + { + + } } } diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index f5ec02b83..ed1e1b391 100644 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -240,6 +240,7 @@ + True