private async Task<bool> Handshake(CancellationToken cancel_token)
{
Logger.Debug("Handshake start");
var rand = new Random();
var c0 = await RecvAsync(1, cancel_token);
await connection.Stream.WriteByteAsync(0x03, cancel_token);
var s1vec = new byte[1528];
rand.NextBytes(s1vec);
await SendAsync(writer => {
writer.Write(0);
writer.Write(0);
writer.Write(s1vec);
}, cancel_token);
using (var reader=await RecvAsync(1536, cancel_token)) {
await SendAsync(writer => {
writer.Write(reader.ReadInt32());
writer.Write(reader.ReadInt32());
writer.Write(reader.ReadBytes(1528));
}, cancel_token);
}
using (var reader=await RecvAsync(1536, cancel_token)) {
reader.ReadInt32();
reader.ReadInt32();
if (!s1vec.SequenceEqual(reader.ReadBytes(1528))) {
Logger.Debug("Handshake failed");
return false;
}
}
timer.Reset();
timer.Start();
Logger.Debug("Handshake succeeded");
return true;
}