From c5e27486fbdf1c0cdf380a23af7d31d62f8278f6 Mon Sep 17 00:00:00 2001 From: Gang Zhuo Date: Fri, 25 Sep 2015 04:03:04 -0400 Subject: [PATCH] Protocol V2 --- .../Controller/Service/TCPRelay.cs | 2 +- .../Controller/Service/UDPRelay.cs | 12 +-- shadowsocks-csharp/Data/libsscrypto.dll.gz | Bin 51484 -> 47058 bytes .../Encryption/EncryptorBase.cs | 2 +- .../Encryption/EncryptorFactory.cs | 2 +- shadowsocks-csharp/Encryption/IEncryptor.cs | 2 +- shadowsocks-csharp/Encryption/IVEncryptor.cs | 98 ++++++++++-------- shadowsocks-csharp/Encryption/Sodium.cs | 11 +- .../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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 diff --git a/shadowsocks-csharp/Encryption/EncryptorBase.cs b/shadowsocks-csharp/Encryption/EncryptorBase.cs index b92233ec..594e67bf 100644 --- a/shadowsocks-csharp/Encryption/EncryptorBase.cs +++ b/shadowsocks-csharp/Encryption/EncryptorBase.cs @@ -26,7 +26,7 @@ namespace Shadowsocks.Encryption return hash; } - public abstract void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength); + public abstract void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength, bool udp); 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 120bd53c..d6c89b9f 100644 --- a/shadowsocks-csharp/Encryption/EncryptorFactory.cs +++ b/shadowsocks-csharp/Encryption/EncryptorFactory.cs @@ -27,7 +27,7 @@ namespace Shadowsocks.Encryption } } - public static IEncryptor GetEncryptor(string method, string password, bool onetimeauth = false) + public static IEncryptor GetEncryptor(string method, string password, bool onetimeauth) { if (string.IsNullOrEmpty(method)) { diff --git a/shadowsocks-csharp/Encryption/IEncryptor.cs b/shadowsocks-csharp/Encryption/IEncryptor.cs index b45c62c7..33ce0816 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); + void Encrypt(byte[] buf, int length, byte[] outbuf, out int outlength, bool udp); 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 a4b66ce4..8af5b9e5 100755 --- a/shadowsocks-csharp/Encryption/IVEncryptor.cs +++ b/shadowsocks-csharp/Encryption/IVEncryptor.cs @@ -15,12 +15,10 @@ namespace Shadowsocks.Encryption public const int ONETIMEAUTH_FLAG = 0x10; public const int ADDRTYPE_MASK = 0xF; - public const int ONETIMEAUTH_BYTES = 16; - public const int ONETIMEAUTH_KEYBYTES = 32; + public const int ONETIMEAUTH_BYTES = 10; - public const int HASH_BYTES = 4; public const int CLEN_BYTES = 2; - public const int AUTH_BYTES = HASH_BYTES + CLEN_BYTES; + public const int AUTH_BYTES = ONETIMEAUTH_BYTES + CLEN_BYTES; protected static byte[] tempbuf = new byte[MAX_INPUT_SIZE]; @@ -128,7 +126,7 @@ namespace Shadowsocks.Encryption protected abstract void cipherUpdate(bool isCipher, int length, byte[] buf, byte[] outbuf); - protected int ss_headlen(byte[] buf, int length) + protected int getHeadLen(byte[] buf, int length) { int len = 0; int atyp = length > 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++)