Example #1
0
 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();
     }
 }
Example #2
0
        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();
        }
Example #4
0
 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();
        }