public Task PassChallengeAsync( Span <byte> publicKey, Span <byte> generator, Span <byte> safePrime, Span <byte> salt) { _writer.Write((byte)AuthCommand.LogonChallenge); _writer.Write((byte)0); _writer.Write((byte)AuthStatus.Success); _writer.Write(publicKey.Slice(0, 32)); _writer.Write((byte)generator.Length); _writer.Write(generator); _writer.Write((byte)safePrime.Length); _writer.Write(safePrime); _writer.Write(salt.Slice(0, 32)); // 16 bytes of nothingness // TODO: figure out the purpose of this for (int i = 0; i < 16; i++) { _writer.Write((byte)0); } // security flags // TODO: provide these from a param _writer.Write((byte)0); return(_writer.FlushAsync()); }
public async Task Test(object value, Func <AsyncBinaryWriter, object, Task> awriteFunc, Action <BinaryWriter, object> swriteFunc, Func <BinaryReader, object> readFunc, Encoding encoding = null) { encoding = encoding ?? Encoding.UTF8; var sstream = new MemoryStream(); var swriter = new BinaryWriter(sstream, encoding); swriteFunc(swriter, value); swriter.Flush(); sstream.Position = 0; var astream = new MemoryStream(); var awriter = new AsyncBinaryWriter(astream, encoding); await awriteFunc(awriter, value); await awriter.FlushAsync(); astream.Position = 0; // The following 2 assertions seem redundant. That's okay, though. // did AsyncBinaryWriter and BinaryWriter produce same bytes? Assert.Equal(sstream.ToArray(), astream.ToArray()); // did AsyncBinaryWriter produce bytes that can be read by BinaryReader? var reader = new BinaryReader(astream, encoding); var result = readFunc(reader); Assert.Equal(value, result); }
public async Task ValidateReadWriteStatistics() { InterceptData clientData = null, serverData = null; var server = new WsServer(); await server.StartAsync(new IPEndPoint(IPAddress.Loopback, 0), async stream => { await stream.WrapSocketAsync(x => Task.FromResult <WStreamSocket>(new Interceptor(x, out serverData)) ); var abr = new AsyncBinaryReader(stream); for (int i = 0; i < 100000; i++) { Assert.Equal(i, await abr.ReadInt32Async()); } await stream.CloseAsync(); }); var client = new WsClient(); var connection = await client.ConnectAsync(new Uri("ws://" + server.ListeningAddresses[0].Substring(7))); await connection.WrapSocketAsync(x => Task.FromResult <WStreamSocket>(new Interceptor(x, out clientData)) ); var abw = new AsyncBinaryWriter(connection); for (int i = 0; i < 100000; i++) { await abw.WriteAsync(i); } await abw.FlushAsync(); await Task.Delay(1000); Assert.Equal(4 * 100000, clientData.BytesWritten); Assert.Equal(4 * 100000, serverData.BytesRead); client.Dispose(); server.Dispose(); }