private static void TestTcpDecrypt(string method, string password, string str, string encHex)
    {
        Span <byte> origin = Encoding.UTF8.GetBytes(str);

        byte[] encBuffer = encHex.FromHex();

        Span <byte> buffer = new byte[encBuffer.Length];

        using AEADShadowsocksCrypto crypto = (AEADShadowsocksCrypto)ShadowsocksCrypto.Create(method, password);

        int secondIndex = RandomNumberGenerator.GetInt32(crypto.SaltLength, encBuffer.Length);
        ReadOnlySequence <byte> multiSequence = TestUtils.GetMultiSegmentSequence(encBuffer, crypto.SaltLength, secondIndex);

        Assert.IsFalse(multiSequence.IsSingleSegment);
        Assert.AreEqual(encBuffer.LongLength, multiSequence.Length);

        ReadOnlySequence <byte> e0 = multiSequence.Slice(0, crypto.SaltLength);
        int o2 = crypto.DecryptTCP(ref e0, buffer);

        Assert.AreEqual(crypto.SaltLength, e0.Length);
        Assert.AreEqual(0, o2);

        ReadOnlySequence <byte> remain = multiSequence;
        int o1 = crypto.DecryptTCP(ref remain, buffer);

        Assert.AreEqual(0, remain.Length);
        Assert.AreEqual(origin.Length, o1);

        Assert.AreEqual(str, Encoding.UTF8.GetString(buffer[..o1]));
    private static void IsSymmetricalTcp(string method, string password)
    {
        Span <byte> buffer = new byte[8192];

        RandomNumberGenerator.Fill(buffer);
        string originHex = buffer.ToHex();

        using StreamShadowsocksCrypto crypto = (StreamShadowsocksCrypto)ShadowsocksCrypto.Create(method, password);
        int         length = crypto.IvLength + buffer.Length;
        Span <byte> output = new byte[length];

        crypto.EncryptTCP(buffer, output, out int processLength, out int outLength);
        Assert.AreEqual(buffer.Length, processLength);
        Assert.AreEqual(length, outLength);

        Span <byte> encBuffer = output[..outLength];
    public ShadowsocksPipeReader(
        PipeReader reader,
        ShadowsocksServerInfo serverInfo,
        PipeOptions?pipeOptions = null)
    {
        Requires.NotNull(reader, nameof(reader));
        Requires.NotNull(serverInfo, nameof(serverInfo));
        Requires.NotNullAllowStructs(serverInfo.Method, nameof(serverInfo));
        Requires.NotNullAllowStructs(serverInfo.Password, nameof(serverInfo));

        IShadowsocksCrypto decryptor = ShadowsocksCrypto.Create(serverInfo.Method, serverInfo.Password);

        InternalReader           = reader;
        _pipe                    = new Pipe(pipeOptions ?? PipeOptions.Default);
        _cancellationTokenSource = new CancellationTokenSource();

        WrapAsync(decryptor, _cancellationTokenSource.Token).Forget();
    }
Beispiel #4
0
    public static void Test(string method)
    {
        Console.Write($@"Testing {method}: ");

        ReadOnlySpan <byte> i = new byte[Step];
        Span <byte>         o = new byte[AEADShadowsocksCrypto.GetBufferSize(i.Length)];

        using IShadowsocksCrypto crypto = ShadowsocksCrypto.Create(method, Password);
        ulong     length = 0ul;
        Stopwatch sw     = Stopwatch.StartNew();

        do
        {
            crypto.EncryptTCP(i, o, out int pLength, out _);
            length += (uint)pLength;
        } while (sw.ElapsedMilliseconds < 2000);

        sw.Stop();
        double result = length / sw.Elapsed.TotalSeconds / 1024.0 / 1024.0;

        Console.WriteLine($@"{result:F2} MB/s");
    }