コード例 #1
0
void Message::prepare()
{
	if( !packet ) createPacket();

	size_t totalSize = (size_t) ms->position;

	size_t bufSize = GetCompressionBufferSize(totalSize);
	enet_packet_resize(packet, bufSize);

	MemoryStream pms;
	StreamMemoryInit(&pms);
	StreamMemorySetRawBuffer(&pms, packet->data);

	EncodeVariableInteger(&pms, id);
	StreamWrite(&pms, &flags, sizeof(flags));
	
	if( GetBitFlag(flags, MessageFlags::Compressed) )
	{
		uint8* in = &ms->data[0];
		uint8* out = pms.buffer + pms.position;
		int32 length = fastlz_compress_level(1, in, totalSize, out);
		pms.position += length;
	}
	else
	{
		enet_packet_resize(packet, totalSize + pms.position);
		StreamWrite(&pms, &ms->data[0], totalSize);
	}

	packet->dataLength = (size_t) pms.position;
}
コード例 #2
0
void Message::setPacket(ENetPacket* packet)
{
	MemoryStream pms;
	StreamMemoryInit(&pms);
	StreamMemorySetRawBuffer(&pms, packet->data);

	uint64 id;

	if( !DecodeVariableInteger(&pms, id) )
		return;

	this->id = (MessageId) id;
	this->packet = packet;

	StreamReadBuffer(&pms, &flags, sizeof(MessageFlags::Enum));

	uint8* in = packet->data + pms.position;
	size_t inSize = packet->dataLength - (size_t) pms.position;

	if( GetBitFlag(flags, MessageFlags::Compressed) )
	{
		size_t bufSize = GetCompressionBufferSize(packet->dataLength);
		StreamResize(ms, bufSize);

		int32 length = fastlz_decompress(in, inSize, &ms->data[0], ms->data.size());
		StreamResize(ms, length);
	}
	else
	{
		StreamResize(ms, inSize);
		StreamWrite(ms, in, inSize);
	}

	freePacket = true;
}
コード例 #3
0
ファイル: Packet.cpp プロジェクト: FloodProject/flood
void Packet::prepare()
{
	if( !packet ) createPacket();

	size_t totalSize = (size_t) ms.getPosition();

	size_t bufSize = GetCompressionBufferSize(totalSize);
	enet_packet_resize(packet, bufSize);

	MemoryStream pms;
	pms.setRawBuffer(packet->data);

	EncodeVariableInteger(&pms, id);
	pms.write((uint8*) &flags, sizeof(flags));
	
	if( GetBitFlag(flags, PacketFlags::Compressed) )
	{
		uint8* in = ms.data.Buffer();
		uint8* out = pms.buffer + pms.position;
		int32 length = fastlz_compress_level(1, in, totalSize, out);
		pms.position += length;
	}
	else
	{
		enet_packet_resize(packet, totalSize + pms.position);
		pms.write(ms.data.Buffer(), totalSize);
	}

	packet->dataLength = (size_t) pms.position;
}
コード例 #4
0
ファイル: Packet.cpp プロジェクト: FloodProject/flood
void Packet::setPacket(ENetPacket* packet)
{
	MemoryStream pms;
	pms.setRawBuffer(packet->data);

	uint64 id;

	if( !DecodeVariableInteger(&pms, id) )
		return;

	this->id = (PacketId) id;
	this->packet = packet;

	pms.readBuffer(&flags, sizeof(PacketFlags));

	uint8* in = packet->data + pms.position;
	size_t inSize = packet->dataLength - (size_t) pms.position;

	if( GetBitFlag(flags, PacketFlags::Compressed) )
	{
		size_t bufSize = GetCompressionBufferSize(packet->dataLength);
		ms.resize(bufSize);

		int32 length = fastlz_decompress(in, inSize, ms.data.Buffer(), ms.data.Size());
		ms.resize(length);
	}
	else
	{
		ms.resize(inSize);
		ms.write(in, inSize);
	}

	freePacket = true;
}
コード例 #5
0
void Message::createPacket()
{
	void* data = nullptr;
	size_t size = 0;
	uint32 pflags = 0;

	if(GetBitFlag(flags, MessageFlags::Reliable))
	{
		pflags |= ENET_PACKET_FLAG_RELIABLE;
	}

	packet = enet_packet_create(nullptr, 0, pflags);
}
コード例 #6
0
bool PacketEncryptor::processInPacket(Peer* peer, Packet* packet, int channelId)
{
    if(!GetBitFlag(packet->getFlags(), PacketFlags::Encrypted))
        return true;

    auto stream = packet->getMemoryStream();
	int size = stream->getPosition();
    uint8* data = stream->data.data();

    // Decrypt
    aes_setkey_dec(aes, secret.data(), secret.size());
    aes_crypt_cbc(aes, AES_DECRYPT, size, iv, data, data);

    // Remove AES padding
    uint8 p = *(data+size-1);
	stream->setPosition(-p-1,  StreamSeekMode::Relative);

    return true;
}
コード例 #7
0
bool PacketEncryptor::processOutPacket(Peer* peer, Packet* packet, int channelId)
{
    if(!GetBitFlag(packet->getFlags(), PacketFlags::Encrypted))
        return true;

    auto stream = packet->getMemoryStream();

    // Add AES padding
	uint8 p = 16 - (stream->getPosition()+1)%16;
	stream->setPosition(p, StreamSeekMode::Relative);
	stream->write(&p, 1);

    // Encrypt
	int size = stream->getPosition();
    uint8* data = stream->data.data();
    aes_setkey_enc(aes, secret.data(), secret.size());
    aes_crypt_cbc(aes, AES_ENCRYPT, size, iv, data, data);

    return true;
}
コード例 #8
0
ファイル: Entity.cpp プロジェクト: FloodProject/flood
bool Entity::getTag(int32 index) const
{
	return GetBitFlag(tags, (uint32)(1 << index));
}