protected override void OnMessageReceived(MessageEventArgs args)
        {
            using (args.Message)
            {
                try
                {
                    if (dh.Status == DiffieHellmanImpl.DhStatus.None)
                    {
                        logger.Debug($"Got secure handshake request");
                        var responseMessage = Parent.CreateMessage();
                        dh.RecvHandshakeRequest(args.Message.BaseStream, responseMessage.BaseStream);
                        _ = SendMessageAsync(responseMessage);
                        logger.Debug($"Sent secure handshake response, common key set!");
                        base.InitSession();
                        return;
                    }

                    if (dh.Status == DiffieHellmanImpl.DhStatus.WaitingForServerMod)
                    {
                        dh.RecvHandshakeResponse(args.Message.BaseStream);
                        logger.Debug($"Got secure handshake response, common key set!");
                        base.InitSession();
                        return;
                    }
                }
                catch (Exception e)
                {
                    logger.Error($"Handshake failed for {this}. Closing... {e}");
                    Close();
                    return;
                }

                try
                {
                    using (var decryptedMessage = args.Message.Decrypt(cipher))
                    {
                        logger.Trace($"Decrypting {args.Message} to {decryptedMessage}");
                        base.OnMessageReceived(new MessageEventArgs(this, decryptedMessage));
                    }
                }
                catch (Exception e)
                {
                    logger.Error(
                        $"Unhandled exception in {nameof(RpcTcpConnectionEncrypted)}.{nameof(OnMessageReceived)}: {e}");
                    Close();
                }
            }
        }
        protected override void OnMessageReceived(Networking.Udp.Messages.MessageInfo messageInfo)
        {
            try
            {
                if (dh.Status == DiffieHellmanImpl.DhStatus.None)
                {
                    logger.Debug($"Got secure handshake request");
                    var responseMessage = Parent.CreateMessage();
                    dh.RecvHandshakeRequest(messageInfo.Message.BaseStream, responseMessage.BaseStream);
                    _ = SendMessage(new Networking.Udp.Messages.MessageInfo(responseMessage, DeliveryType.ReliableOrdered, 0));
                    logger.Debug($"Sent secure handshake response, common key set!");
                    base.InitSession();
                    return;
                }

                if (dh.Status == DiffieHellmanImpl.DhStatus.WaitingForServerMod)
                {
                    dh.RecvHandshakeResponse(messageInfo.Message.BaseStream);
                    logger.Debug($"Got secure handshake response, common key set!");
                    base.InitSession();
                    return;
                }
            }
            catch (Exception e)
            {
                logger.Error($"Handshake failed for {this}. Closing... {e}");
                Close();
                return;
            }

            try
            {
                using (messageInfo.Message)
                {
                    using (var decryptedMessage = messageInfo.Message.Decrypt(cipher))
                    {
                        base.OnMessageReceived(new Networking.Udp.Messages.MessageInfo(decryptedMessage, messageInfo.DeliveryType, messageInfo.Channel));
                    }
                }
            }
            catch (Exception e)
            {
                logger.Error($"Unhandled exception in {nameof(RpcTcpConnectionEncrypted)}.{nameof(OnMessageReceived)}: {e}");
                Close();
            }
        }