protected override void OnMessageReceived(MessageEventArgs args) { try { using (args.Message) { if (args.Message.HasCompressionMark()) { logger.Trace($"Message {args.Message} has compression mark, decompressing it"); using (var uncompressedMessage = args.Message.Decompress()) { logger.Trace($"Decompressing {args.Message} to {uncompressedMessage}"); using (WardenStreamReader sr = new WardenStreamReader(uncompressedMessage.BaseStream, true)) { session.OnMessage(sr); } } } else { using (WardenStreamReader sr = new WardenStreamReader(args.Message.BaseStream, true)) { session.OnMessage(sr); } } } } catch (Exception e) { logger.Error($"Unhandled exception in {nameof(RpcTcpConnection)}.{nameof(OnMessageReceived)}: {e}"); Close(); } }
void OnMtuSuccess(Datagram datagram) { if (!CheckStatus(datagram, UdpConnectionStatus.Connected)) { return; } using (WardenStreamReader reader = new WardenStreamReader(datagram.BaseStream, true)) { int size = reader.ReadVarInt32(); bool fix = reader.ReadByte() == 1; if (size > this.Mtu) { logger.Debug($"MTU Successfully expanded to {size}"); this.Mtu = size; if (!fix) { SendNextMtuExpand(); } } if (fix) { logger.Debug($"Other side asks us to fix MTU on {size}"); FixMtu(); } } }
public void RecvHandshakeResponse(Stream handshakeResponse) { if (status != DhStatus.WaitingForServerMod) { throw new InvalidOperationException($"Wrong status {status}, expected: {DhStatus.WaitingForServerMod}"); } using (WardenStreamReader reader = new WardenStreamReader(handshakeResponse, true)) { int serverModSize = reader.ReadInt32(); BigInteger serverMod = new BigInteger(reader.ReadBytes(serverModSize)); commonKey = ((privateKey * serverMod) % mod).ToByteArray(); } SetCipherKey(); }
protected override void OnMessageReceived(Networking.Udp.Messages.MessageInfo messageInfo) { try { using (messageInfo.Message) { using (WardenStreamReader sr = new WardenStreamReader(messageInfo.Message.BaseStream, true)) { session.OnMessage(sr); } } } catch (Exception e) { logger.Error($"Unhandled exception in {nameof(RpcUdpConnection)}.{nameof(OnMessageReceived)}: {e}"); Close(); } }
public void RecvHandshakeRequest(Stream handshakeRequest, Stream handshakeResponse) { if (status != DhStatus.None) { throw new InvalidOperationException($"Wrong status {status}, expected: {DhStatus.None}"); } BigInteger clientMod; using (WardenStreamReader reader = new WardenStreamReader(handshakeRequest, true)) { ushort gotMark = reader.ReadUInt16(); if (mark != gotMark) { throw new InvalidOperationException("Handshake failed, wrong mark. Perhaps the other peer is trying to connect with unsecure connection"); } int publicKeySize = reader.ReadInt32(); publicKey = new BigInteger(reader.ReadBytes(publicKeySize)); int clientModSize = reader.ReadInt32(); clientMod = new BigInteger(reader.ReadBytes(clientModSize)); } byte[] keyBytes = new byte[64]; rngCsp.GetBytes(keyBytes); privateKey = new BigInteger(keyBytes); BigInteger serverMod = (privateKey * publicKey) % mod; commonKey = ((privateKey * clientMod) % mod).ToByteArray(); using (WardenStreamWriter writer = new WardenStreamWriter(handshakeResponse, true)) { byte[] serverModBytes = serverMod.ToByteArray(); writer.Write(serverModBytes.Length); writer.Write(serverModBytes); } SetCipherKey(); }