Example #1
0
 public override void ReadFrom(ref SpanBufferReader bufferReader)
 {
     UserId             = bufferReader.ReadString();
     UserName           = bufferReader.ReadString();
     Secret             = bufferReader.ReadString();
     CurrentPlayerCount = bufferReader.ReadVarUInt();
 }
Example #2
0
 public void ReadFrom(ref SpanBufferReader bufferReader)
 {
     Platform     = (Platform)bufferReader.ReadByte();
     UserId       = bufferReader.ReadString();
     UserName     = bufferReader.ReadString();
     SessionToken = bufferReader.ReadVarBytes().ToArray();
 }
Example #3
0
 public void AddMessage(MultipartMessage message)
 {
     if (message.MultipartMessageId != _multipartMessageId)
     {
         return;
     }
     if (_receivedLength >= _totalLength)
     {
         return;
     }
     if (!_messages.TryAdd(message.Offset, message))
     {
         return;
     }
     if (Interlocked.Add(ref _receivedLength, message.Length) >= _totalLength)
     {
         var buffer = new GrowingSpanBuffer(stackalloc byte[(int)_totalLength]);
         foreach (var kvp in _messages.OrderBy(kvp => kvp.Key))
         {
             buffer.WriteBytes(kvp.Value.Data);
         }
         var bufferReader = new SpanBufferReader(buffer.Data);
         var fullMessage  = _service._messageReader.ReadFrom(ref bufferReader, 0x00);
         Complete(fullMessage);
     }
 }
 public override void ReadFrom(ref SpanBufferReader bufferReader)
 {
     BeatmapDifficultyMask     = (BeatmapDifficultyMask)bufferReader.ReadByte();
     GameplayModifiersMask     = (GameplayModifiersMask)bufferReader.ReadUInt16();
     SongPackBloomFilterTop    = bufferReader.ReadUInt64();
     SongPackBloomFilterBottom = bufferReader.ReadUInt64();
 }
Example #5
0
        public static object ReadObject(this MemoryBufferReader reader, DcPackerInterface pi)
        {
            var spanReader = new SpanBufferReader(reader.RemainingData.Span);
            var value      = spanReader.ReadObject(pi);

            reader.SkipBytes(spanReader.Offset);
            return(value);
        }
Example #6
0
        protected override void OnReceived(EndPoint endPoint, ReadOnlySpan <byte> buffer)
        {
            _logger.Verbose($"Handling OnReceived (EndPoint='{endPoint}', Size={buffer.Length}).");
            if (buffer.Length <= 0)
            {
                ReceiveAsync();
                return;
            }

            // Retrieve the session
            if (!_sessionService.TryGetSession(endPoint, out var session))
            {
                session = _sessionService.OpenSession(this, endPoint);
            }

            // Read the message
            var      bufferReader = new SpanBufferReader(buffer);
            IMessage message;

            try
            {
                var isEncrypted = bufferReader.ReadBool();
                if (isEncrypted)
                {
                    message = _encryptedMessageReader.ReadFrom(
                        ref bufferReader,
                        session.ReceiveKey, session.ReceiveMac
                        );
                }
                else
                {
                    message = _messageReader.ReadFrom(ref bufferReader);
                }
            }
            catch (Exception e)
            {
                _logger.Warning(e, $"Failed to read message (EndPoint='{session.EndPoint}').");
                ReceiveAsync();
                return;
            }

            // Pass it off to a message receiver
            Task.Run(async() =>
            {
                // TODO: This logic should probably be expanded in case of other
                // message receivers being added (i.e. dedicated servers)
                if (message is not IEncryptedMessage)
                {
                    await _handshakeMessageReceiver.OnReceived(session, message).ConfigureAwait(false);
                }
                else
                {
                    await _userMessageReceiver.OnReceived(session, message).ConfigureAwait(false);
                }
            });

            ReceiveAsync();
        }
        public override void ReadFrom(ref SpanBufferReader bufferReader)
        {
            Certificates = new List <byte[]>();
            var certificateCount = bufferReader.ReadVarUInt();

            for (var i = 0; i < certificateCount; i++)
            {
                Certificates.Add(bufferReader.ReadVarBytes().ToArray());
            }
        }
 public void ReadFrom(ref SpanBufferReader bufferReader)
 {
     UserId        = bufferReader.ReadString();
     UserName      = bufferReader.ReadString();
     Random        = bufferReader.ReadBytes(32).ToArray();
     PublicKey     = bufferReader.ReadVarBytes().ToArray();
     Configuration = new GameplayServerConfiguration();
     Configuration.ReadFrom(ref bufferReader);
     Secret = bufferReader.ReadString();
 }
 public void ReadFrom(ref SpanBufferReader bufferReader)
 {
     UserId    = bufferReader.ReadString();
     UserName  = bufferReader.ReadString();
     Random    = bufferReader.ReadBytes(32).ToArray();
     PublicKey = bufferReader.ReadVarBytes().ToArray();
     Secret    = bufferReader.ReadString();
     Code      = bufferReader.ReadString();
     Password  = bufferReader.ReadString();
     UseRelay  = bufferReader.ReadBool();
 }
Example #10
0
        public override void ReadFrom(ref SpanBufferReader bufferReader)
        {
            Result = (ResultCode)bufferReader.ReadByte();
            if (!Success)
            {
                return;
            }

            RemoteEndPoint = bufferReader.ReadIPEndPoint();
            Code           = bufferReader.ReadString();
        }
Example #11
0
        public override void ReadFrom(ref SpanBufferReader bufferReader)
        {
            UserId         = bufferReader.ReadString();
            UserName       = bufferReader.ReadString();
            RemoteEndPoint = bufferReader.ReadIPEndPoint();
            Random         = bufferReader.ReadBytes(32).ToArray();
            PublicKey      = bufferReader.ReadVarBytes().ToArray();
            var flags = bufferReader.ReadByte();

            IsConnectionOwner = (flags & 1) > 0;
            IsDedicatedServer = (flags & 2) > 0;
        }
        /// <inheritdoc cref="IEncryptedMessageReader.ReadFrom"/>
        public IEncryptedMessage ReadFrom(ref SpanBufferReader bufferReader, byte[] key, HMAC hmac, byte?packetProperty)
        {
            var sequenceId      = bufferReader.ReadUInt32();
            var iv              = bufferReader.ReadBytes(16).ToArray();
            var decryptedBuffer = bufferReader.RemainingData.ToArray();

            using (var cryptoTransform = _aesCryptoServiceProvider.CreateDecryptor(key, iv))
            {
                var bytesWritten = 0;
                for (var i = decryptedBuffer.Length; i >= cryptoTransform.InputBlockSize; i -= bytesWritten)
                {
                    var inputCount = cryptoTransform.CanTransformMultipleBlocks
                        ? (i / cryptoTransform.InputBlockSize * cryptoTransform.InputBlockSize)
                        : cryptoTransform.InputBlockSize;
                    bytesWritten = cryptoTransform.TransformBlock(
                        decryptedBuffer, bytesWritten, inputCount,
                        decryptedBuffer, bytesWritten
                        );
                }
            }

            var paddingByteCount    = decryptedBuffer[decryptedBuffer.Length - 1] + 1;
            var hmacStart           = decryptedBuffer.Length - paddingByteCount - 10;
            var decryptedBufferSpan = decryptedBuffer.AsSpan();
            var hash             = decryptedBufferSpan.Slice(hmacStart, 10);
            var hashBufferWriter = new SpanBufferWriter(stackalloc byte[decryptedBuffer.Length + 4]);

            hashBufferWriter.WriteBytes(decryptedBufferSpan.Slice(0, hmacStart));
            hashBufferWriter.WriteUInt32(sequenceId);
            Span <byte> computedHash = stackalloc byte[32];

            if (!hmac.TryComputeHash(hashBufferWriter.Data, computedHash, out _))
            {
                throw new Exception("Failed to compute message hash.");
            }
            if (!hash.SequenceEqual(computedHash.Slice(0, 10)))
            {
                throw new Exception("Message hash does not match the computed hash.");
            }

            bufferReader = new SpanBufferReader(decryptedBuffer);
            if (_messageReader.ReadFrom(ref bufferReader, packetProperty) is not IEncryptedMessage message)
            {
                throw new Exception(
                          "Successfully decrypted message but failed to cast to type " +
                          $"'{nameof(IEncryptedMessage)}'."
                          );
            }

            message.SequenceId = sequenceId;
            return(message);
        }
Example #13
0
        /// <inheritdoc cref="IMessageReader.ReadFrom"/>
        public IMessage ReadFrom(ref SpanBufferReader bufferReader, byte packetProperty)
        {
            if (packetProperty != 0x00)
            {
                var readPacketProperty = bufferReader.ReadUInt8();
                if (readPacketProperty != packetProperty)
                {
                    throw new InvalidDataContractException(
                              "Invalid packet property " +
                              $"(PacketProperty={readPacketProperty}, Expected={packetProperty})."
                              );
                }
            }
            var messageGroup = bufferReader.ReadUInt32();

            if (!_messageRegistries.TryGetValue(messageGroup, out var messageRegistry))
            {
                throw new InvalidDataContractException($"Invalid message group (MessageGroup={messageGroup}).");
            }
            var protocolVersion = bufferReader.ReadVarUInt();

            if (protocolVersion != ProtocolVersion)
            {
                throw new InvalidDataContractException($"Invalid message protocol version (ProtocolVersion={protocolVersion}).");
            }
            var length = bufferReader.ReadVarUInt();

            if (bufferReader.RemainingSize < length)
            {
                throw new InvalidDataContractException($"Message truncated (RemainingSize={bufferReader.RemainingSize}, Expected={length}).");
            }
            var messageId = bufferReader.ReadVarUInt();

            if (!messageRegistry.TryCreateMessage(messageId, out var message))
            {
                throw new InvalidDataContractException($"Invalid message identifier (MessageId={messageId}).");
            }
            if (message is IReliableRequest)
            {
                ((IReliableRequest)message).RequestId = bufferReader.ReadUInt32();
            }
            if (message is IReliableResponse)
            {
                ((IReliableResponse)message).ResponseId = bufferReader.ReadUInt32();
            }
            message.ReadFrom(ref bufferReader);
            return(message);
        }
Example #14
0
 public void ReadFrom(ref SpanBufferReader bufferReader)
 {
     ServerName         = bufferReader.ReadString();
     UserId             = bufferReader.ReadString();
     UserName           = bufferReader.ReadString();
     Secret             = bufferReader.ReadString();
     Password           = bufferReader.ReadString();
     CurrentPlayerCount = bufferReader.ReadVarInt();
     MaximumPlayerCount = bufferReader.ReadVarInt();
     DiscoveryPolicy    = (DiscoveryPolicy)bufferReader.ReadByte();
     InvitePolicy       = (InvitePolicy)bufferReader.ReadByte();
     Configuration      = new GameplayServerConfiguration();
     Configuration.ReadFrom(ref bufferReader);
     Random    = bufferReader.ReadBytes(32).ToArray();
     PublicKey = bufferReader.ReadVarBytes().ToArray();
 }
Example #15
0
 public override void ReadFrom(ref SpanBufferReader bufferReader)
 {
     MultipartMessageId = bufferReader.ReadUInt32();
     Offset             = bufferReader.ReadVarUInt();
     Length             = bufferReader.ReadVarUInt();
     TotalLength        = bufferReader.ReadVarUInt();
     if (Length > _maximumLength)
     {
         throw new InvalidDataContractException($"Length must not surpass {_maximumLength} bytes");
     }
     if (TotalLength > _maximumTotalLength)
     {
         throw new InvalidDataContractException($"Length must not surpass {_maximumTotalLength} bytes");
     }
     Data = bufferReader.ReadBytes((int)Length).ToArray();
 }
Example #16
0
        public void TestReadEndOfBuffer()
        {
            using var bufferWriter = new SpanBufferWriter(stackalloc byte[64]);
            bufferWriter.WriteString("test", Encoding.UTF8);

            var bufferReader = new SpanBufferReader(bufferWriter);

            _ = bufferReader.ReadString(Encoding.UTF8);

            try
            {
                bufferReader.ReadByte();
            }
            catch (EndOfBufferException)
            {
                Assert.Pass();
                return;
            }
            Assert.Fail();
        }
        public void Signal(ISession session, ReadOnlySpan <byte> buffer)
        {
            var      bufferReader = new SpanBufferReader(buffer);
            IMessage message;

            try
            {
                var isEncrypted = bufferReader.ReadBool();
                if (isEncrypted)
                {
                    if (session.EncryptionParameters is null)
                    {
                        _logger.Warning(
                            "Received an encrypted messsage before any " +
                            "encryption parameters were established " +
                            $"(EndPoint='{session.EndPoint}')."
                            );
                        return;
                    }
                    message = _encryptedMessageReader.ReadFrom(
                        ref bufferReader,
                        session.EncryptionParameters.ReceiveKey,
                        session.EncryptionParameters.ReceiveMac,
                        PacketProperty
                        );
                }
                else
                {
                    message = _messageReader.ReadFrom(ref bufferReader, PacketProperty);
                }
            }
            catch (Exception e)
            {
                _logger.Warning(e, $"Failed to read message (EndPoint='{session.EndPoint}').");
                return;
            }
            Signal(session, message);
        }
        public override void ReadFrom(ref SpanBufferReader bufferReader)
        {
            Result = (ResultCode)bufferReader.ReadUInt8();
            if (!Success)
            {
                return;
            }

            UserId             = bufferReader.ReadString();
            UserName           = bufferReader.ReadString();
            Secret             = bufferReader.ReadString();
            DiscoveryPolicy    = (DiscoveryPolicy)bufferReader.ReadByte();
            InvitePolicy       = (InvitePolicy)bufferReader.ReadByte();
            MaximumPlayerCount = bufferReader.ReadVarInt();
            Configuration      = new GameplayServerConfiguration();
            Configuration.ReadFrom(ref bufferReader);
            var flags = bufferReader.ReadByte();

            IsConnectionOwner = (flags & 1) > 0;
            IsDedicatedServer = (flags & 2) > 0;
            RemoteEndPoint    = bufferReader.ReadIPEndPoint();
            Random            = bufferReader.ReadBytes(32).ToArray();
            PublicKey         = bufferReader.ReadVarBytes().ToArray();
        }
Example #19
0
 public void ReadFrom(ref SpanBufferReader bufferReader)
 {
     CertificateResponseId = bufferReader.ReadUInt32();
     Random = bufferReader.ReadBytes(32).ToArray();
     Cookie = bufferReader.ReadBytes(32).ToArray();
 }
 public void ReadFrom(ref SpanBufferReader bufferReader)
 {
     UserId   = bufferReader.ReadString();
     UserName = bufferReader.ReadString();
     Secret   = bufferReader.ReadString();
 }
Example #21
0
 public override void ReadFrom(ref SpanBufferReader bufferReader)
 {
     Random    = bufferReader.ReadBytes(32).ToArray();
     PublicKey = bufferReader.ReadVarBytes().ToArray();
     Signature = bufferReader.ReadVarBytes().ToArray();
 }
Example #22
0
 public override void ReadFrom(ref SpanBufferReader bufferReader)
 {
     AuthenticationToken = new AuthenticationToken();
     AuthenticationToken.ReadFrom(ref bufferReader);
 }
Example #23
0
 public void ReadFrom(ref SpanBufferReader bufferReader)
 {
     Result = (ResultCode)bufferReader.ReadByte();
 }
Example #24
0
 public void ReadFrom(ref SpanBufferReader bufferReader)
 {
     Cookie = bufferReader.ReadBytes(32).ToArray();
 }
Example #25
0
 public override void ReadFrom(ref SpanBufferReader bufferReader)
 {
     Random = bufferReader.ReadBytes(32).ToArray();
 }
Example #26
0
 public override void ReadFrom(ref SpanBufferReader bufferReader)
 {
 }
Example #27
0
 public void ReadFrom(ref SpanBufferReader bufferReader)
 {
 }
Example #28
0
 public void ReadFrom(ref SpanBufferReader bufferReader)
 {
     MessageHandled = bufferReader.ReadBool();
 }
 public void ReadFrom(ref SpanBufferReader bufferReader)
 {
     ClientPublicKey = bufferReader.ReadVarBytes().ToArray();
 }