namespace Shadowsocks.Encryption { public class EncryptorInfo { public int KeySize; public int IvSize; public int SaltSize; public int TagSize; public int NonceSize; public int Type; public string InnerLibName; // For those who make use of internal crypto method name // e.g. mbed TLS #region Stream ciphers public EncryptorInfo(string innerLibName, int keySize, int ivSize, int type) { this.KeySize = keySize; this.IvSize = ivSize; this.Type = type; this.InnerLibName = innerLibName; } public EncryptorInfo(int keySize, int ivSize, int type) { this.KeySize = keySize; this.IvSize = ivSize; this.Type = type; this.InnerLibName = string.Empty; } #endregion #region AEAD ciphers public EncryptorInfo(string innerLibName, int keySize, int saltSize, int nonceSize, int tagSize, int type) { this.KeySize = keySize; this.SaltSize = saltSize; this.NonceSize = nonceSize; this.TagSize = tagSize; this.Type = type; this.InnerLibName = innerLibName; } public EncryptorInfo(int keySize, int saltSize, int nonceSize, int tagSize, int type) { this.KeySize = keySize; this.SaltSize = saltSize; this.NonceSize = nonceSize; this.TagSize = tagSize; this.Type = type; this.InnerLibName = string.Empty; } #endregion } public abstract class EncryptorBase : IEncryptor { public const int MAX_INPUT_SIZE = 32768; public const int MAX_DOMAIN_LEN = 255; public const int ADDR_PORT_LEN = 2; public const int ADDR_ATYP_LEN = 1; public const int ATYP_IPv4 = 0x01; public const int ATYP_DOMAIN = 0x03; public const int ATYP_IPv6 = 0x04; public const int MD5_LEN = 16; protected EncryptorBase(string method, string password) { Method = method; Password = password; } protected string Method; protected string Password; 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); public abstract void EncryptUDP(byte[] buf, int length, byte[] outbuf, out int outlength); public abstract void DecryptUDP(byte[] buf, int length, byte[] outbuf, out int outlength); public abstract void Dispose(); public int AddrBufLength { get; set; } = - 1; } }