using System; using System.Collections.Generic; using System.Reflection; namespace Shadowsocks.Encryption { public static class EncryptorFactory { private static Dictionary _registeredEncryptors; private static Type[] _constructorTypes = new Type[] { typeof(string), typeof(string), typeof(bool), typeof(bool) }; static EncryptorFactory() { _registeredEncryptors = new Dictionary(); foreach (string method in PolarSSLEncryptor.SupportedCiphers()) { _registeredEncryptors.Add(method, typeof(PolarSSLEncryptor)); } foreach (string method in SodiumEncryptor.SupportedCiphers()) { _registeredEncryptors.Add(method, typeof(SodiumEncryptor)); } } public static IEncryptor GetEncryptor(string method, string password, bool onetimeauth, bool isudp) { if (string.IsNullOrEmpty(method)) { method = "aes-256-cfb"; } method = method.ToLowerInvariant(); Type t = _registeredEncryptors[method]; ConstructorInfo c = t.GetConstructor(_constructorTypes); IEncryptor result = (IEncryptor)c.Invoke(new object[] { method, password, onetimeauth, isudp }); return result; } } }