Refine Encryption module (#717)
- use EncryptorInfo struct instead of Dictionary<string, int[]>>
This commit is contained in:
@@ -2,6 +2,22 @@
|
||||
|
||||
namespace Shadowsocks.Encryption
|
||||
{
|
||||
public struct EncryptorInfo
|
||||
{
|
||||
public string name;
|
||||
public int key_size;
|
||||
public int iv_size;
|
||||
public int type;
|
||||
|
||||
public EncryptorInfo(string name, int key_size, int iv_size, int type)
|
||||
{
|
||||
this.name = name;
|
||||
this.key_size = key_size;
|
||||
this.iv_size = iv_size;
|
||||
this.type = type;
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class EncryptorBase
|
||||
: IEncryptor
|
||||
{
|
||||
|
||||
@@ -16,8 +16,7 @@ namespace Shadowsocks.Encryption
|
||||
|
||||
protected static byte[] tempbuf = new byte[MAX_INPUT_SIZE];
|
||||
|
||||
protected Dictionary<string, Dictionary<string, int[]>> ciphers;
|
||||
protected Dictionary<string, int[]> ciphersDetail;
|
||||
protected Dictionary<string, EncryptorInfo> ciphers;
|
||||
|
||||
private static readonly ConcurrentDictionary<string, byte[]> CachedKeys = new ConcurrentDictionary<string, byte[]>();
|
||||
protected byte[] _encryptIV;
|
||||
@@ -28,7 +27,7 @@ namespace Shadowsocks.Encryption
|
||||
protected int _cipher;
|
||||
// cipher name in MbedTLS, useless when using LibSodium
|
||||
protected string _cipherMbedName;
|
||||
protected int[] _cipherInfo;
|
||||
protected EncryptorInfo _cipherInfo;
|
||||
protected byte[] _key;
|
||||
protected int keyLen;
|
||||
protected int ivLen;
|
||||
@@ -39,7 +38,7 @@ namespace Shadowsocks.Encryption
|
||||
InitKey(method, password);
|
||||
}
|
||||
|
||||
protected abstract Dictionary<string, Dictionary<string, int[]>> getCiphers();
|
||||
protected abstract Dictionary<string, EncryptorInfo> getCiphers();
|
||||
|
||||
private void InitKey(string method, string password)
|
||||
{
|
||||
@@ -47,16 +46,15 @@ namespace Shadowsocks.Encryption
|
||||
_method = method;
|
||||
string k = method + ":" + password;
|
||||
ciphers = getCiphers();
|
||||
ciphersDetail = ciphers[_method];
|
||||
_cipherMbedName = ciphersDetail.Keys.FirstOrDefault();
|
||||
_cipherInfo = ciphers[_method][_cipherMbedName];
|
||||
_cipher = _cipherInfo[2];
|
||||
_cipherInfo = ciphers[_method];
|
||||
_cipherMbedName = _cipherInfo.name;
|
||||
_cipher = _cipherInfo.type;
|
||||
if (_cipher == 0)
|
||||
{
|
||||
throw new Exception("method not found");
|
||||
}
|
||||
keyLen = _cipherInfo[0];
|
||||
ivLen = _cipherInfo[1];
|
||||
keyLen = _cipherInfo.key_size;
|
||||
ivLen = _cipherInfo.iv_size;
|
||||
_key = CachedKeys.GetOrAdd(k, (nk) =>
|
||||
{
|
||||
byte[] passbuf = Encoding.UTF8.GetBytes(password);
|
||||
|
||||
@@ -20,18 +20,18 @@ namespace Shadowsocks.Encryption
|
||||
{
|
||||
}
|
||||
|
||||
private static Dictionary<string, Dictionary<string, int[]>> _ciphers = new Dictionary<string, Dictionary<string, int[]>> {
|
||||
{ "aes-128-cfb", new Dictionary<string, int[]> { { "AES-128-CFB128", new int[] { 16, 16, CIPHER_AES } } } },
|
||||
{ "aes-192-cfb", new Dictionary<string, int[]> { { "AES-192-CFB128", new int[] { 24, 16, CIPHER_AES } } } },
|
||||
{ "aes-256-cfb", new Dictionary<string, int[]> { { "AES-256-CFB128", new int[] { 32, 16, CIPHER_AES } } } },
|
||||
{ "aes-128-ctr", new Dictionary<string, int[]> { { "AES-128-CTR", new int[] { 16, 16, CIPHER_AES } } } },
|
||||
{ "aes-192-ctr", new Dictionary<string, int[]> { { "AES-192-CTR", new int[] { 24, 16, CIPHER_AES } } } },
|
||||
{ "aes-256-ctr", new Dictionary<string, int[]> { { "AES-256-CTR", new int[] { 32, 16, CIPHER_AES } } } },
|
||||
{ "bf-cfb", new Dictionary<string, int[]> { { "BLOWFISH-CFB64", new int[] { 16, 8, CIPHER_BLOWFISH } } } },
|
||||
{ "camellia-128-cfb", new Dictionary<string, int[]> { { "CAMELLIA-128-CFB128", new int[] { 16, 16, CIPHER_CAMELLIA } } } },
|
||||
{ "camellia-192-cfb", new Dictionary<string, int[]> { { "CAMELLIA-192-CFB128", new int[] { 24, 16, CIPHER_CAMELLIA } } } },
|
||||
{ "camellia-256-cfb", new Dictionary<string, int[]> { { "CAMELLIA-256-CFB128", new int[] { 32, 16, CIPHER_CAMELLIA } } } },
|
||||
{ "rc4-md5", new Dictionary<string, int[]> { { "ARC4-128", new int[] { 16, 16, CIPHER_RC4 } } } }
|
||||
private static Dictionary<string, EncryptorInfo> _ciphers = new Dictionary<string, EncryptorInfo> {
|
||||
{ "aes-128-cfb", new EncryptorInfo("AES-128-CFB128", 16, 16, CIPHER_AES) },
|
||||
{ "aes-192-cfb", new EncryptorInfo("AES-192-CFB128", 24, 16, CIPHER_AES) },
|
||||
{ "aes-256-cfb", new EncryptorInfo("AES-256-CFB128", 32, 16, CIPHER_AES) },
|
||||
{ "aes-128-ctr", new EncryptorInfo("AES-128-CTR", 16, 16, CIPHER_AES) },
|
||||
{ "aes-192-ctr", new EncryptorInfo("AES-192-CTR", 24, 16, CIPHER_AES) },
|
||||
{ "aes-256-ctr", new EncryptorInfo("AES-256-CTR", 32, 16, CIPHER_AES) },
|
||||
{ "bf-cfb", new EncryptorInfo("BLOWFISH-CFB64", 16, 8, CIPHER_BLOWFISH) },
|
||||
{ "camellia-128-cfb", new EncryptorInfo("CAMELLIA-128-CFB128", 16, 16, CIPHER_CAMELLIA) },
|
||||
{ "camellia-192-cfb", new EncryptorInfo("CAMELLIA-192-CFB128", 24, 16, CIPHER_CAMELLIA) },
|
||||
{ "camellia-256-cfb", new EncryptorInfo("CAMELLIA-256-CFB128", 32, 16, CIPHER_CAMELLIA) },
|
||||
{ "rc4-md5", new EncryptorInfo("ARC4-128", 16, 16, CIPHER_RC4) }
|
||||
};
|
||||
|
||||
public static List<string> SupportedCiphers()
|
||||
@@ -39,7 +39,7 @@ namespace Shadowsocks.Encryption
|
||||
return new List<string>(_ciphers.Keys);
|
||||
}
|
||||
|
||||
protected override Dictionary<string, Dictionary<string, int[]>> getCiphers()
|
||||
protected override Dictionary<string, EncryptorInfo> getCiphers()
|
||||
{
|
||||
return _ciphers;
|
||||
}
|
||||
|
||||
@@ -24,13 +24,13 @@ namespace Shadowsocks.Encryption
|
||||
{
|
||||
}
|
||||
|
||||
private static Dictionary<string, Dictionary<string, int[]>> _ciphers = new Dictionary<string, Dictionary<string, int[]>> {
|
||||
{ "salsa20", new Dictionary<string, int[]> { { "salsa20", new int[] { 32, 8, CIPHER_SALSA20 } } } },
|
||||
{ "chacha20", new Dictionary<string, int[]> { { "chacha20", new int[] { 32, 8, CIPHER_CHACHA20 } } } },
|
||||
{ "chacha20-ietf", new Dictionary<string, int[]> { { "chacha20-ietf", new int[] { 32, 12, CIPHER_CHACHA20_IETF } } } }
|
||||
private static Dictionary<string, EncryptorInfo> _ciphers = new Dictionary<string, EncryptorInfo> {
|
||||
{ "salsa20", new EncryptorInfo("salsa20", 32, 8, CIPHER_SALSA20) },
|
||||
{ "chacha20", new EncryptorInfo("chacha20", 32, 8, CIPHER_CHACHA20) },
|
||||
{ "chacha20-ietf", new EncryptorInfo("chacha20-ietf", 32, 12, CIPHER_CHACHA20_IETF) }
|
||||
};
|
||||
|
||||
protected override Dictionary<string, Dictionary<string, int[]>> getCiphers()
|
||||
protected override Dictionary<string, EncryptorInfo> getCiphers()
|
||||
{
|
||||
return _ciphers;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user