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; }
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; }
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; }
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; }
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); }
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; }
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; }
bool Entity::getTag(int32 index) const { return GetBitFlag(tags, (uint32)(1 << index)); }