From f0920098ad21a6cc7e2913a071f4e0bdb5c30f0b Mon Sep 17 00:00:00 2001 From: clowwindy Date: Sat, 13 Dec 2014 10:15:15 +0800 Subject: [PATCH] sodium works --- shadowsocks-csharp/Encrypt/EncryptorBase.cs | 2 ++ .../Encrypt/EncryptorFactory.cs | 2 +- shadowsocks-csharp/Encrypt/IVEncryptor.cs | 2 +- shadowsocks-csharp/Encrypt/SodiumEncryptor.cs | 35 +++++++++++++++++-- .../View/ConfigForm.Designer.cs | 2 ++ 5 files changed, 38 insertions(+), 5 deletions(-) diff --git a/shadowsocks-csharp/Encrypt/EncryptorBase.cs b/shadowsocks-csharp/Encrypt/EncryptorBase.cs index eb8c1f37..06779103 100644 --- a/shadowsocks-csharp/Encrypt/EncryptorBase.cs +++ b/shadowsocks-csharp/Encrypt/EncryptorBase.cs @@ -6,6 +6,8 @@ namespace Shadowsocks.Encrypt public abstract class EncryptorBase : IEncryptor { + public const int MAX_INPUT_SIZE = 32768; + protected EncryptorBase(string method, string password) { Method = method; diff --git a/shadowsocks-csharp/Encrypt/EncryptorFactory.cs b/shadowsocks-csharp/Encrypt/EncryptorFactory.cs index 59111a69..e62aed06 100644 --- a/shadowsocks-csharp/Encrypt/EncryptorFactory.cs +++ b/shadowsocks-csharp/Encrypt/EncryptorFactory.cs @@ -10,7 +10,7 @@ namespace Shadowsocks.Encrypt return new TableEncryptor(method, password); } - return new PolarSSLEncryptor(method, password); + return new SodiumEncryptor(method, password); } } } diff --git a/shadowsocks-csharp/Encrypt/IVEncryptor.cs b/shadowsocks-csharp/Encrypt/IVEncryptor.cs index 66883918..bdeae866 100755 --- a/shadowsocks-csharp/Encrypt/IVEncryptor.cs +++ b/shadowsocks-csharp/Encrypt/IVEncryptor.cs @@ -8,7 +8,7 @@ namespace Shadowsocks.Encrypt public abstract class IVEncryptor : EncryptorBase { - protected static byte[] tempbuf = new byte[32768]; + protected static byte[] tempbuf = new byte[MAX_INPUT_SIZE]; protected Dictionary ciphers; diff --git a/shadowsocks-csharp/Encrypt/SodiumEncryptor.cs b/shadowsocks-csharp/Encrypt/SodiumEncryptor.cs index d08027d7..277fb80f 100755 --- a/shadowsocks-csharp/Encrypt/SodiumEncryptor.cs +++ b/shadowsocks-csharp/Encrypt/SodiumEncryptor.cs @@ -10,15 +10,21 @@ namespace Shadowsocks.Encrypt const int CIPHER_SALSA20 = 1; const int CIPHER_CHACHA20 = 2; - protected uint _encryptBytesRemaining; - protected uint _decryptBytesRemaining; + const int SODIUM_BLOCK_SIZE = 64; + + protected int _encryptBytesRemaining; + protected int _decryptBytesRemaining; protected ulong _encryptIC; protected ulong _decryptIC; + protected byte[] _encryptBuf; + protected byte[] _decryptBuf; public SodiumEncryptor(string method, string password) : base(method, password) { InitKey(method, password); + _encryptBuf = new byte[MAX_INPUT_SIZE + SODIUM_BLOCK_SIZE]; + _decryptBuf = new byte[MAX_INPUT_SIZE + SODIUM_BLOCK_SIZE]; } protected override Dictionary getCiphers() @@ -31,18 +37,41 @@ namespace Shadowsocks.Encrypt protected override void cipherUpdate(bool isCipher, int length, byte[] buf, byte[] outbuf) { - uint bytesRemaining; + // TODO write a unidirection cipher so we don't have to if if if + int bytesRemaining; ulong ic; + byte[] sodiumBuf; + byte[] iv; if (isCipher) { bytesRemaining = _encryptBytesRemaining; ic = _encryptIC; + sodiumBuf = _encryptBuf; + iv = _encryptIV; } else { bytesRemaining = _decryptBytesRemaining; ic = _decryptIC; + sodiumBuf = _decryptBuf; + iv = _decryptIV; + } + int padding = bytesRemaining; + Buffer.BlockCopy(buf, 0, sodiumBuf, padding, length); + + switch (_cipher) + { + case CIPHER_SALSA20: + Sodium.crypto_stream_salsa20_xor_ic(sodiumBuf, sodiumBuf, (ulong)(padding + length), iv, ic, _key); + break; + case CIPHER_CHACHA20: + Sodium.crypto_stream_chacha20_xor_ic(sodiumBuf, sodiumBuf, (ulong)(padding + length), iv, ic, _key); + break; } + Buffer.BlockCopy(sodiumBuf, padding, outbuf, 0, length); + padding += length; + ic += (ulong)padding / SODIUM_BLOCK_SIZE; + bytesRemaining = padding % SODIUM_BLOCK_SIZE; if (isCipher) { diff --git a/shadowsocks-csharp/View/ConfigForm.Designer.cs b/shadowsocks-csharp/View/ConfigForm.Designer.cs index 50273d07..03b4a134 100755 --- a/shadowsocks-csharp/View/ConfigForm.Designer.cs +++ b/shadowsocks-csharp/View/ConfigForm.Designer.cs @@ -206,6 +206,8 @@ this.EncryptionSelect.Items.AddRange(new object[] { "table", "rc4-md5", + "salsa20", + "chacha20", "aes-256-cfb", "aes-192-cfb", "aes-128-cfb",