/*
EQ2Emulator: Everquest II Server Emulator
Copyright (C) 2007 EQ2EMulator Development Team (http://www.eq2emulator.net)
This file is part of EQ2Emulator.
EQ2Emulator is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
EQ2Emulator is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with EQ2Emulator. If not, see .
*/
#include "../common/debug.h"
#include
#include
#include
#include
#include "packet_dump.h"
#include "EQStream.h"
#include "packet_functions.h"
#ifndef WIN32
#include
#endif
using namespace std;
#define eqemu_alloc_func Z_NULL
#define eqemu_free_func Z_NULL
int DeflatePacket(unsigned char* in_data, int in_length, unsigned char* out_data, int max_out_length) {
#ifdef REUSE_ZLIB
static bool inited = false;
static z_stream zstream;
int zerror;
if(in_data == NULL && out_data == NULL && in_length == 0 && max_out_length == 0) {
//special delete state
deflateEnd(&zstream);
return(0);
}
if(!inited) {
zstream.zalloc = eqemu_alloc_func;
zstream.zfree = eqemu_free_func;
zstream.opaque = Z_NULL;
deflateInit(&zstream, Z_FINISH);
}
zstream.next_in = in_data;
zstream.avail_in = in_length;
/* zstream.zalloc = Z_NULL;
zstream.zfree = Z_NULL;
zstream.opaque = Z_NULL;
deflateInit(&zstream, Z_FINISH);*/
zstream.next_out = out_data;
zstream.avail_out = max_out_length;
zerror = deflate(&zstream, Z_FINISH);
deflateReset(&zstream);
if (zerror == Z_STREAM_END)
{
// deflateEnd(&zstream);
return zstream.total_out;
}
else
{
// zerror = deflateEnd(&zstream);
return 0;
}
#else
if(in_data == NULL) {
return(0);
}
z_stream zstream;
int zerror;
zstream.next_in = in_data;
zstream.avail_in = in_length;
zstream.zalloc = eqemu_alloc_func;
zstream.zfree = eqemu_free_func;
zstream.opaque = Z_NULL;
deflateInit(&zstream, Z_FINISH);
zstream.next_out = out_data;
zstream.avail_out = max_out_length;
zerror = deflate(&zstream, Z_FINISH);
if (zerror == Z_STREAM_END)
{
deflateEnd(&zstream);
return zstream.total_out;
}
else
{
zerror = deflateEnd(&zstream);
return 0;
}
#endif
}
uint32 InflatePacket(uchar* indata, uint32 indatalen, uchar* outdata, uint32 outdatalen, bool iQuiet) {
#ifdef REUSE_ZLIB
static bool inited = false;
static z_stream zstream;
int zerror;
if(indata == NULL && outdata == NULL && indatalen == 0 && outdatalen == 0) {
//special delete state
inflateEnd(&zstream);
return(0);
}
if(!inited) {
zstream.zalloc = eqemu_alloc_func;
zstream.zfree = eqemu_free_func;
zstream.opaque = Z_NULL;
inflateInit2(&zstream, 15);
}
zstream.next_in = indata;
zstream.avail_in = indatalen;
zstream.next_out = outdata;
zstream.avail_out = outdatalen;
zstream.zalloc = eqemu_alloc_func;
zstream.zfree = eqemu_free_func;
zstream.opaque = Z_NULL;
i = inflateInit2( &zstream, 15 );
if (i != Z_OK) {
return 0;
}
zerror = inflate( &zstream, Z_FINISH );
inflateReset(&zstream);
if(zerror == Z_STREAM_END) {
return zstream.total_out;
}
else {
if (!iQuiet) {
cout << "Error: InflatePacket: inflate() returned " << zerror << " '";
if (zstream.msg)
cout << zstream.msg;
cout << "'" << endl;
//DumpPacket(indata-16, indatalen+16);
}
if (zerror == -4 && zstream.msg == 0)
{
return 0;
}
return 0;
}
#else
if(indata == NULL)
return(0);
z_stream zstream;
int zerror = 0;
int i;
zstream.next_in = indata;
zstream.avail_in = indatalen;
zstream.next_out = outdata;
zstream.avail_out = outdatalen;
zstream.zalloc = eqemu_alloc_func;
zstream.zfree = eqemu_free_func;
zstream.opaque = Z_NULL;
i = inflateInit2( &zstream, 15 );
if (i != Z_OK) {
return 0;
}
zerror = inflate( &zstream, Z_FINISH );
if(zerror == Z_STREAM_END) {
inflateEnd( &zstream );
return zstream.total_out;
}
else {
if (!iQuiet) {
cout << "Error: InflatePacket: inflate() returned " << zerror << " '";
if (zstream.msg)
cout << zstream.msg;
cout << "'" << endl;
//DumpPacket(indata-16, indatalen+16);
}
if (zerror == -4 && zstream.msg == 0)
{
return 0;
}
zerror = inflateEnd( &zstream );
return 0;
}
#endif
}
int32 roll(int32 in, int8 bits) {
return ((in << bits) | (in >> (32-bits)));
}
int64 roll(int64 in, int8 bits) {
return ((in << bits) | (in >> (64-bits)));
}
int32 rorl(int32 in, int8 bits) {
return ((in >> bits) | (in << (32-bits)));
}
int64 rorl(int64 in, int8 bits) {
return ((in >> bits) | (in << (64-bits)));
}
int32 CRCLookup(uchar idx) {
if (idx == 0)
return 0x00000000;
if (idx == 1)
return 0x77073096;
if (idx == 2)
return roll(CRCLookup(1), 1);
if (idx == 4)
return 0x076DC419;
for (uchar b=7; b>0; b--) {
uchar bv = 1 << b;
if (!(idx ^ bv)) {
// bit is only one set
return ( roll(CRCLookup (4), b - 2) );
}
if (idx&bv) {
// bit is set
return( CRCLookup(bv) ^ CRCLookup(idx&(bv - 1)) );
}
}
//Failure
return false;
}
uint32 GenerateCRC(int32 b, int32 bufsize, uchar *buf) {
int32 CRC = (b ^ 0xFFFFFFFF);
int32 bufremain = bufsize;
uchar* bufptr = buf;
while (bufremain--) {
CRC = CRCLookup((uchar)(*(bufptr++)^ (CRC&0xFF))) ^ (CRC >> 8);
}
return (htonl (CRC ^ 0xFFFFFFFF));
}
long int CRCArray[] = {
0,
1996959894,
3993919788,
2567524794,
124634137,
1886057615,
3915621685,
2657392035,
249268274,
2044508324,
3772115230,
2547177864,
162941995,
2125561021,
3887607047,
2428444049,
498536548,
1789927666,
4089016648,
2227061214,
450548861,
1843258603,
4107580753,
2211677639,
325883990,
1684777152,
4251122042,
2321926636,
335633487,
1661365465,
4195302755,
2366115317,
997073096,
1281953886,
3579855332,
2724688242,
1006888145,
1258607687,
3524101629,
2768942443,
901097722,
1119000684,
3686517206,
2898065728,
853044451,
1172266101,
3705015759,
2882616665,
651767980,
1373503546,
3369554304,
3218104598,
565507253,
1454621731,
3485111705,
3099436303,
671266974,
1594198024,
3322730930,
2970347812,
795835527,
1483230225,
3244367275,
3060149565,
1994146192,
31158534,
2563907772,
4023717930,
1907459465,
112637215,
2680153253,
3904427059,
2013776290,
251722036,
2517215374,
3775830040,
2137656763,
141376813,
2439277719,
3865271297,
1802195444,
476864866,
2238001368,
4066508878,
1812370925,
453092731,
2181625025,
4111451223,
1706088902,
314042704,
2344532202,
4240017532,
1658658271,
366619977,
2362670323,
4224994405,
1303535960,
984961486,
2747007092,
3569037538,
1256170817,
1037604311,
2765210733,
3554079995,
1131014506,
879679996,
2909243462,
3663771856,
1141124467,
855842277,
2852801631,
3708648649,
1342533948,
654459306,
3188396048,
3373015174,
1466479909,
544179635,
3110523913,
3462522015,
1591671054,
702138776,
2966460450,
3352799412,
1504918807,
783551873,
3082640443,
3233442989,
3988292384,
2596254646,
62317068,
1957810842,
3939845945,
2647816111,
81470997,
1943803523,
3814918930,
2489596804,
225274430,
2053790376,
3826175755,
2466906013,
167816743,
2097651377,
4027552580,
2265490386,
503444072,
1762050814,
4150417245,
2154129355,
426522225,
1852507879,
4275313526,
2312317920,
282753626,
1742555852,
4189708143,
2394877945,
397917763,
1622183637,
3604390888,
2714866558,
953729732,
1340076626,
3518719985,
2797360999,
1068828381,
1219638859,
3624741850,
2936675148,
906185462,
1090812512,
3747672003,
2825379669,
829329135,
1181335161,
3412177804,
3160834842,
628085408,
1382605366,
3423369109,
3138078467,
570562233,
1426400815,
3317316542,
2998733608,
733239954,
1555261956,
3268935591,
3050360625,
752459403,
1541320221,
2607071920,
3965973030,
1969922972,
40735498,
2617837225,
3943577151,
1913087877,
83908371,
2512341634,
3803740692,
2075208622,
213261112,
2463272603,
3855990285,
2094854071,
198958881,
2262029012,
4057260610,
1759359992,
534414190,
2176718541,
4139329115,
1873836001,
414664567,
2282248934,
4279200368,
1711684554,
285281116,
2405801727,
4167216745,
1634467795,
376229701,
2685067896,
3608007406,
1308918612,
956543938,
2808555105,
3495958263,
1231636301,
1047427035,
2932959818,
3654703836,
1088359270,
936918000,
2847714899,
3736837829,
1202900863,
817233897,
3183342108,
3401237130,
1404277552,
615818150,
3134207493,
3453421203,
1423857449,
601450431,
3009837614,
3294710456,
1567103746,
711928724,
3020668471,
3272380065,
1510334235,
755167117};
uint32 GenerateCRCRecipe(uint32 initial, void* buf, uint32 len)
{
uint32 c = 0xFFFFFFFF;
sint8* u = static_cast(buf);
for (size_t i = 0; i < len; ++i)
{
c = CRCArray[(c ^ u[i]) & 0xFF] ^ (c >> 8);
}
return c;
}