public override void ReadFrom(ref SpanBufferReader bufferReader) { UserId = bufferReader.ReadString(); UserName = bufferReader.ReadString(); Secret = bufferReader.ReadString(); CurrentPlayerCount = bufferReader.ReadVarUInt(); }
public void ReadFrom(ref SpanBufferReader bufferReader) { Platform = (Platform)bufferReader.ReadByte(); UserId = bufferReader.ReadString(); UserName = bufferReader.ReadString(); SessionToken = bufferReader.ReadVarBytes().ToArray(); }
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(); }
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); }
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(); }
public override void ReadFrom(ref SpanBufferReader bufferReader) { Result = (ResultCode)bufferReader.ReadByte(); if (!Success) { return; } RemoteEndPoint = bufferReader.ReadIPEndPoint(); Code = bufferReader.ReadString(); }
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); }
/// <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); }
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(); }
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(); }
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(); }
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(); }
public override void ReadFrom(ref SpanBufferReader bufferReader) { Random = bufferReader.ReadBytes(32).ToArray(); PublicKey = bufferReader.ReadVarBytes().ToArray(); Signature = bufferReader.ReadVarBytes().ToArray(); }
public override void ReadFrom(ref SpanBufferReader bufferReader) { AuthenticationToken = new AuthenticationToken(); AuthenticationToken.ReadFrom(ref bufferReader); }
public void ReadFrom(ref SpanBufferReader bufferReader) { Result = (ResultCode)bufferReader.ReadByte(); }
public void ReadFrom(ref SpanBufferReader bufferReader) { Cookie = bufferReader.ReadBytes(32).ToArray(); }
public override void ReadFrom(ref SpanBufferReader bufferReader) { Random = bufferReader.ReadBytes(32).ToArray(); }
public override void ReadFrom(ref SpanBufferReader bufferReader) { }
public void ReadFrom(ref SpanBufferReader bufferReader) { }
public void ReadFrom(ref SpanBufferReader bufferReader) { MessageHandled = bufferReader.ReadBool(); }
public void ReadFrom(ref SpanBufferReader bufferReader) { ClientPublicKey = bufferReader.ReadVarBytes().ToArray(); }