123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537 |
- /*
- 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 <http://www.gnu.org/licenses/>.
- */
- #include "../common/debug.h"
- #include <iostream>
- #include <iomanip>
- #include <string.h>
- #include <zlib.h>
- #include "packet_dump.h"
- #include "EQStream.h"
- #include "packet_functions.h"
- #ifndef WIN32
- #include <netinet/in.h>
- #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<sint8*>(buf);
- for (size_t i = 0; i < len; ++i)
- {
- c = CRCArray[(c ^ u[i]) & 0xFF] ^ (c >> 8);
- }
- return c;
- }
|