diff --git a/shadowsocks-csharp/Controller/Service/UpdateChecker.cs b/shadowsocks-csharp/Controller/Service/UpdateChecker.cs index 6ae51eaf..64d223b0 100644 --- a/shadowsocks-csharp/Controller/Service/UpdateChecker.cs +++ b/shadowsocks-csharp/Controller/Service/UpdateChecker.cs @@ -41,6 +41,7 @@ namespace Shadowsocks.Controller { #if DEBUG return; +#pragma warning disable CS0162 // 检测到无法访问的代码 #endif CheckUpdateTimer timer = new CheckUpdateTimer(delay); timer.AutoReset = false; diff --git a/shadowsocks-csharp/Encryption/AEAD/AEADAesGcmNativeEncryptor.cs b/shadowsocks-csharp/Encryption/AEAD/AEADAesGcmNativeEncryptor.cs index 363da9db..788f3544 100644 --- a/shadowsocks-csharp/Encryption/AEAD/AEADAesGcmNativeEncryptor.cs +++ b/shadowsocks-csharp/Encryption/AEAD/AEADAesGcmNativeEncryptor.cs @@ -29,19 +29,19 @@ namespace Shadowsocks.Encryption.AEAD } #endregion - public override int CipherEncrypt(Span plain, Span cipher) + public override int CipherEncrypt(ReadOnlySpan plain, Span cipher) { using AesGcm aes = new AesGcm(sessionKey); aes.Encrypt(nonce.AsSpan(), plain, cipher.Slice(0, plain.Length), cipher.Slice(plain.Length, tagLen)); return plain.Length + tagLen; } - public override int CipherDecrypt(Span plain, Span cipher) + public override int CipherDecrypt(Span plain, ReadOnlySpan cipher) { int clen = cipher.Length - tagLen; using AesGcm aes = new AesGcm(sessionKey); - Span ciphertxt = cipher.Slice(0, clen); - Span tag = cipher.Slice(clen); + ReadOnlySpan ciphertxt = cipher.Slice(0, clen); + ReadOnlySpan tag = cipher.Slice(clen); aes.Decrypt(nonce.AsSpan(), ciphertxt, tag, plain.Slice(0, clen)); return clen; } diff --git a/shadowsocks-csharp/Encryption/AEAD/AEADEncryptor.cs b/shadowsocks-csharp/Encryption/AEAD/AEADEncryptor.cs index 1a2151cf..29a18ceb 100644 --- a/shadowsocks-csharp/Encryption/AEAD/AEADEncryptor.cs +++ b/shadowsocks-csharp/Encryption/AEAD/AEADEncryptor.cs @@ -104,8 +104,8 @@ namespace Shadowsocks.Encryption.AEAD DeriveSessionKey(salt, masterKey, sessionKey); } - public abstract int CipherEncrypt(Span plain, Span cipher); - public abstract int CipherDecrypt(Span plain, Span cipher); + public abstract int CipherEncrypt(ReadOnlySpan plain, Span cipher); + public abstract int CipherDecrypt(Span plain, ReadOnlySpan cipher); #region TCP @@ -328,7 +328,7 @@ namespace Shadowsocks.Encryption.AEAD #endregion - private int ChunkEncrypt(Span plain, Span cipher) + private int ChunkEncrypt(ReadOnlySpan plain, Span cipher) { if (plain.Length > ChunkLengthMask) { @@ -344,5 +344,25 @@ namespace Shadowsocks.Encryption.AEAD return cipherLenSize + cipherDataSize; } + + public override int Encrypt(ReadOnlySpan plain, Span cipher) + { + throw new NotImplementedException(); + } + + public override int Decrypt(Span plain, ReadOnlySpan cipher) + { + throw new NotImplementedException(); + } + + public override int EncryptUDP(ReadOnlySpan plain, Span cipher) + { + throw new NotImplementedException(); + } + + public override int DecryptUDP(Span plain, ReadOnlySpan cipher) + { + throw new NotImplementedException(); + } } } \ No newline at end of file diff --git a/shadowsocks-csharp/Encryption/AEAD/AEADNaClEncryptor.cs b/shadowsocks-csharp/Encryption/AEAD/AEADNaClEncryptor.cs index d7579af6..0fb2ff55 100644 --- a/shadowsocks-csharp/Encryption/AEAD/AEADNaClEncryptor.cs +++ b/shadowsocks-csharp/Encryption/AEAD/AEADNaClEncryptor.cs @@ -46,14 +46,14 @@ namespace Shadowsocks.Encryption.AEAD } } - public override int CipherEncrypt(Span plain, Span cipher) + public override int CipherEncrypt(ReadOnlySpan plain, Span cipher) { byte[] ct = enc.Encrypt(plain, null, nonce); ct.CopyTo(cipher); return ct.Length; } - public override int CipherDecrypt(Span plain, Span cipher) + public override int CipherDecrypt(Span plain, ReadOnlySpan cipher) { byte[] pt = enc.Decrypt(cipher, null, nonce); pt.CopyTo(plain); diff --git a/shadowsocks-csharp/Encryption/EncryptorBase.cs b/shadowsocks-csharp/Encryption/EncryptorBase.cs index bd29137f..32d79847 100644 --- a/shadowsocks-csharp/Encryption/EncryptorBase.cs +++ b/shadowsocks-csharp/Encryption/EncryptorBase.cs @@ -1,4 +1,6 @@ -namespace Shadowsocks.Encryption +using System; + +namespace Shadowsocks.Encryption { public abstract class EncryptorBase : IEncryptor { @@ -44,6 +46,11 @@ return $"{instanceId}({Method},{Password})"; } + public abstract int Encrypt(ReadOnlySpan plain, Span cipher); + public abstract int Decrypt(Span plain, ReadOnlySpan cipher); + public abstract int EncryptUDP(ReadOnlySpan plain, Span cipher); + public abstract int DecryptUDP(Span plain, ReadOnlySpan cipher); + public int AddressBufferLength { get; set; } = -1; } } \ No newline at end of file diff --git a/shadowsocks-csharp/Encryption/IEncryptor.cs b/shadowsocks-csharp/Encryption/IEncryptor.cs index 00600a21..76efa1bf 100644 --- a/shadowsocks-csharp/Encryption/IEncryptor.cs +++ b/shadowsocks-csharp/Encryption/IEncryptor.cs @@ -11,5 +11,9 @@ namespace Shadowsocks.Encryption void Decrypt(byte[] buf, int length, byte[] outbuf, out int outlength); void EncryptUDP(byte[] buf, int length, byte[] outbuf, out int outlength); void DecryptUDP(byte[] buf, int length, byte[] outbuf, out int outlength); + int Encrypt(ReadOnlySpan plain, Span cipher); + int Decrypt(Span plain, ReadOnlySpan cipher); + int EncryptUDP(ReadOnlySpan plain, Span cipher); + int DecryptUDP(Span plain, ReadOnlySpan cipher); } } diff --git a/shadowsocks-csharp/Encryption/Stream/StreamAesBouncyCastleEncryptor.cs b/shadowsocks-csharp/Encryption/Stream/StreamAesBouncyCastleEncryptor.cs index b602b045..6a6ea32b 100644 --- a/shadowsocks-csharp/Encryption/Stream/StreamAesBouncyCastleEncryptor.cs +++ b/shadowsocks-csharp/Encryption/Stream/StreamAesBouncyCastleEncryptor.cs @@ -23,19 +23,19 @@ namespace Shadowsocks.Encryption.Stream b.Init(isEncrypt, new ParametersWithIV(new KeyParameter(key), iv)); } - protected override int CipherEncrypt(Span plain, Span cipher) + protected override int CipherEncrypt(ReadOnlySpan plain, Span cipher) { CipherUpdate(plain, cipher); return plain.Length; } - protected override int CipherDecrypt(Span plain, Span cipher) + protected override int CipherDecrypt(Span plain, ReadOnlySpan cipher) { CipherUpdate(cipher, plain); return cipher.Length; } - private void CipherUpdate(Span i, Span o) + private void CipherUpdate(ReadOnlySpan i, Span o) { Span ob = new byte[o.Length + 128]; i.CopyTo(cfbBuf.AsSpan(ptr)); diff --git a/shadowsocks-csharp/Encryption/Stream/StreamChachaNaClEncryptor.cs b/shadowsocks-csharp/Encryption/Stream/StreamChachaNaClEncryptor.cs index 8fd3512d..e8670109 100644 --- a/shadowsocks-csharp/Encryption/Stream/StreamChachaNaClEncryptor.cs +++ b/shadowsocks-csharp/Encryption/Stream/StreamChachaNaClEncryptor.cs @@ -24,17 +24,17 @@ namespace Shadowsocks.Encryption.Stream { } - protected override int CipherDecrypt(Span plain, Span cipher) + protected override int CipherDecrypt(Span plain, ReadOnlySpan cipher) { return CipherUpdate(cipher, plain, false); } - protected override int CipherEncrypt(Span plain, Span cipher) + protected override int CipherEncrypt(ReadOnlySpan plain, Span cipher) { return CipherUpdate(plain, cipher, true); } - private int CipherUpdate(Span i, Span o, bool enc) + private int CipherUpdate(ReadOnlySpan i, Span o, bool enc) { int len = i.Length; int pad = remain; diff --git a/shadowsocks-csharp/Encryption/Stream/StreamEncryptor.cs b/shadowsocks-csharp/Encryption/Stream/StreamEncryptor.cs index 604be0ca..4d1c97e6 100644 --- a/shadowsocks-csharp/Encryption/Stream/StreamEncryptor.cs +++ b/shadowsocks-csharp/Encryption/Stream/StreamEncryptor.cs @@ -85,8 +85,8 @@ namespace Shadowsocks.Encryption.Stream Array.Copy(iv, this.iv, ivLen); } - protected abstract int CipherEncrypt(Span plain, Span cipher); - protected abstract int CipherDecrypt(Span plain, Span cipher); + protected abstract int CipherEncrypt(ReadOnlySpan plain, Span cipher); + protected abstract int CipherDecrypt(Span plain, ReadOnlySpan cipher); #region TCP [MethodImpl(MethodImplOptions.Synchronized)] @@ -193,5 +193,25 @@ namespace Shadowsocks.Encryption.Stream } #endregion + + public override int Encrypt(ReadOnlySpan plain, Span cipher) + { + throw new NotImplementedException(); + } + + public override int Decrypt(Span plain, ReadOnlySpan cipher) + { + throw new NotImplementedException(); + } + + public override int EncryptUDP(ReadOnlySpan plain, Span cipher) + { + throw new NotImplementedException(); + } + + public override int DecryptUDP(Span plain, ReadOnlySpan cipher) + { + throw new NotImplementedException(); + } } } \ No newline at end of file diff --git a/shadowsocks-csharp/Encryption/Stream/StreamPlainNativeEncryptor.cs b/shadowsocks-csharp/Encryption/Stream/StreamPlainNativeEncryptor.cs index d560b4bb..33a59dcc 100644 --- a/shadowsocks-csharp/Encryption/Stream/StreamPlainNativeEncryptor.cs +++ b/shadowsocks-csharp/Encryption/Stream/StreamPlainNativeEncryptor.cs @@ -10,13 +10,13 @@ namespace Shadowsocks.Encryption.Stream { } - protected override int CipherDecrypt(Span plain, Span cipher) + protected override int CipherDecrypt(Span plain, ReadOnlySpan cipher) { cipher.CopyTo(plain); return cipher.Length; } - protected override int CipherEncrypt(Span plain, Span cipher) + protected override int CipherEncrypt(ReadOnlySpan plain, Span cipher) { plain.CopyTo(cipher); return plain.Length; diff --git a/shadowsocks-csharp/Encryption/Stream/StreamRc4NativeEncryptor.cs b/shadowsocks-csharp/Encryption/Stream/StreamRc4NativeEncryptor.cs index f8776954..367b8080 100644 --- a/shadowsocks-csharp/Encryption/Stream/StreamRc4NativeEncryptor.cs +++ b/shadowsocks-csharp/Encryption/Stream/StreamRc4NativeEncryptor.cs @@ -29,17 +29,17 @@ namespace Shadowsocks.Encryption.Stream sbox = SBox(realkey); } - protected override int CipherEncrypt(Span plain, Span cipher) + protected override int CipherEncrypt(ReadOnlySpan plain, Span cipher) { return CipherUpdate(plain, cipher); } - protected override int CipherDecrypt(Span plain, Span cipher) + protected override int CipherDecrypt(Span plain, ReadOnlySpan cipher) { return CipherUpdate(cipher, plain); } - private int CipherUpdate(Span i, Span o) + private int CipherUpdate(ReadOnlySpan i, Span o) { // don't know why we need third array, but it works... Span t = new byte[i.Length];