#include "SAMPRakNet.hpp"
#include
#include
#include
#include
#include
#include
#include
uint8_t SAMPRakNet::buffer_[MAXIMUM_MTU_SIZE];
uint32_t SAMPRakNet::token_;
uint16_t SAMPRakNet::portNumber = 7777;
Query* SAMPRakNet::query_ = nullptr;
unsigned int SAMPRakNet::timeout_ = 10000;
unsigned int SAMPRakNet::minConnectionTime_ = 0;
unsigned int SAMPRakNet::messagesLimit_ = 500;
unsigned int SAMPRakNet::messageHoleLimit_ = 3000;
unsigned int SAMPRakNet::acksLimit_ = 3000;
unsigned int SAMPRakNet::networkLimitsBanTime_ = 60000;
bool SAMPRakNet::logCookies_ = false;
ICore* SAMPRakNet::core_ = nullptr;
FlatHashSet SAMPRakNet::incomingConnections_;
RakNet::RakNetTime SAMPRakNet::gracePeriod_ = 0;
uint16_t
SAMPRakNet::
GetPort()
{
return portNumber;
}
void SAMPRakNet::
SetPort(uint16_t value)
{
portNumber = value;
}
uint8_t*
SAMPRakNet::
Decrypt(uint8_t const* src, int len)
{
static const uint8_t
key[256]
= {
0xB4,
0x62,
0x07,
0xE5,
0x9D,
0xAF,
0x63,
0xDD,
0xE3,
0xD0,
0xCC,
0xFE,
0xDC,
0xDB,
0x6B,
0x2E,
0x6A,
0x40,
0xAB,
0x47,
0xC9,
0xD1,
0x53,
0xD5,
0x20,
0x91,
0xA5,
0x0E,
0x4A,
0xDF,
0x18,
0x89,
0xFD,
0x6F,
0x25,
0x12,
0xB7,
0x13,
0x77,
0x00,
0x65,
0x36,
0x6D,
0x49,
0xEC,
0x57,
0x2A,
0xA9,
0x11,
0x5F,
0xFA,
0x78,
0x95,
0xA4,
0xBD,
0x1E,
0xD9,
0x79,
0x44,
0xCD,
0xDE,
0x81,
0xEB,
0x09,
0x3E,
0xF6,
0xEE,
0xDA,
0x7F,
0xA3,
0x1A,
0xA7,
0x2D,
0xA6,
0xAD,
0xC1,
0x46,
0x93,
0xD2,
0x1B,
0x9C,
0xAA,
0xD7,
0x4E,
0x4B,
0x4D,
0x4C,
0xF3,
0xB8,
0x34,
0xC0,
0xCA,
0x88,
0xF4,
0x94,
0xCB,
0x04,
0x39,
0x30,
0x82,
0xD6,
0x73,
0xB0,
0xBF,
0x22,
0x01,
0x41,
0x6E,
0x48,
0x2C,
0xA8,
0x75,
0xB1,
0x0A,
0xAE,
0x9F,
0x27,
0x80,
0x10,
0xCE,
0xF0,
0x29,
0x28,
0x85,
0x0D,
0x05,
0xF7,
0x35,
0xBB,
0xBC,
0x15,
0x06,
0xF5,
0x60,
0x71,
0x03,
0x1F,
0xEA,
0x5A,
0x33,
0x92,
0x8D,
0xE7,
0x90,
0x5B,
0xE9,
0xCF,
0x9E,
0xD3,
0x5D,
0xED,
0x31,
0x1C,
0x0B,
0x52,
0x16,
0x51,
0x0F,
0x86,
0xC5,
0x68,
0x9B,
0x21,
0x0C,
0x8B,
0x42,
0x87,
0xFF,
0x4F,
0xBE,
0xC8,
0xE8,
0xC7,
0xD4,
0x7A,
0xE0,
0x55,
0x2F,
0x8A,
0x8E,
0xBA,
0x98,
0x37,
0xE4,
0xB2,
0x38,
0xA1,
0xB6,
0x32,
0x83,
0x3A,
0x7B,
0x84,
0x3C,
0x61,
0xFB,
0x8C,
0x14,
0x3D,
0x43,
0x3B,
0x1D,
0xC3,
0xA2,
0x96,
0xB3,
0xF8,
0xC4,
0xF2,
0x26,
0x2B,
0xD8,
0x7C,
0xFC,
0x23,
0x24,
0x66,
0xEF,
0x69,
0x64,
0x50,
0x54,
0x59,
0xF1,
0xA0,
0x74,
0xAC,
0xC6,
0x7D,
0xB5,
0xE6,
0xE2,
0xC2,
0x7E,
0x67,
0x17,
0x5E,
0xE1,
0xB9,
0x3F,
0x6C,
0x70,
0x08,
0x99,
0x45,
0x56,
0x76,
0xF9,
0x9A,
0x97,
0x19,
0x72,
0x5C,
0x02,
0x8F,
0x58,
};
uint8_t
cur,
checksum = 0,
port = GetPort() ^ 0xCC;
for (int i = 1; i != len; ++i) {
// Alternate the mask every byte.
cur = (uint8_t)src[i];
if (!(i & 1))
cur ^= port;
cur = key[cur];
checksum ^= cur & 0xAA;
buffer_[i - 1] = cur;
}
if (src[0] != checksum) {
return nullptr;
}
return buffer_;
}
uint8_t*
SAMPRakNet::
Encrypt(uint8_t const* src, int len)
{
static const uint8_t
key[256]
= {
0x27,
0x69,
0xFD,
0x87,
0x60,
0x7D,
0x83,
0x02,
0xF2,
0x3F,
0x71,
0x99,
0xA3,
0x7C,
0x1B,
0x9D,
0x76,
0x30,
0x23,
0x25,
0xC5,
0x82,
0x9B,
0xEB,
0x1E,
0xFA,
0x46,
0x4F,
0x98,
0xC9,
0x37,
0x88,
0x18,
0xA2,
0x68,
0xD6,
0xD7,
0x22,
0xD1,
0x74,
0x7A,
0x79,
0x2E,
0xD2,
0x6D,
0x48,
0x0F,
0xB1,
0x62,
0x97,
0xBC,
0x8B,
0x59,
0x7F,
0x29,
0xB6,
0xB9,
0x61,
0xBE,
0xC8,
0xC1,
0xC6,
0x40,
0xEF,
0x11,
0x6A,
0xA5,
0xC7,
0x3A,
0xF4,
0x4C,
0x13,
0x6C,
0x2B,
0x1C,
0x54,
0x56,
0x55,
0x53,
0xA8,
0xDC,
0x9C,
0x9A,
0x16,
0xDD,
0xB0,
0xF5,
0x2D,
0xFF,
0xDE,
0x8A,
0x90,
0xFC,
0x95,
0xEC,
0x31,
0x85,
0xC2,
0x01,
0x06,
0xDB,
0x28,
0xD8,
0xEA,
0xA0,
0xDA,
0x10,
0x0E,
0xF0,
0x2A,
0x6B,
0x21,
0xF1,
0x86,
0xFB,
0x65,
0xE1,
0x6F,
0xF6,
0x26,
0x33,
0x39,
0xAE,
0xBF,
0xD4,
0xE4,
0xE9,
0x44,
0x75,
0x3D,
0x63,
0xBD,
0xC0,
0x7B,
0x9E,
0xA6,
0x5C,
0x1F,
0xB2,
0xA4,
0xC4,
0x8D,
0xB3,
0xFE,
0x8F,
0x19,
0x8C,
0x4D,
0x5E,
0x34,
0xCC,
0xF9,
0xB5,
0xF3,
0xF8,
0xA1,
0x50,
0x04,
0x93,
0x73,
0xE0,
0xBA,
0xCB,
0x45,
0x35,
0x1A,
0x49,
0x47,
0x6E,
0x2F,
0x51,
0x12,
0xE2,
0x4A,
0x72,
0x05,
0x66,
0x70,
0xB8,
0xCD,
0x00,
0xE5,
0xBB,
0x24,
0x58,
0xEE,
0xB4,
0x80,
0x81,
0x36,
0xA9,
0x67,
0x5A,
0x4B,
0xE8,
0xCA,
0xCF,
0x9F,
0xE3,
0xAC,
0xAA,
0x14,
0x5B,
0x5F,
0x0A,
0x3B,
0x77,
0x92,
0x09,
0x15,
0x4E,
0x94,
0xAD,
0x17,
0x64,
0x52,
0xD3,
0x38,
0x43,
0x0D,
0x0C,
0x07,
0x3C,
0x1D,
0xAF,
0xED,
0xE7,
0x08,
0xB7,
0x03,
0xE6,
0x8E,
0xAB,
0x91,
0x89,
0x3E,
0x2C,
0x96,
0x42,
0xD9,
0x78,
0xDF,
0xD0,
0x57,
0x5D,
0x84,
0x41,
0x7E,
0xCE,
0xF7,
0x32,
0xC3,
0xD5,
0x20,
0x0B,
0xA7,
};
uint8_t
cur,
checksum = 0,
port = GetPort() ^ 0xCC;
for (int i = 0; i != len; ++i) {
// Alternate the mask every byte.
cur = (uint8_t)src[i];
checksum ^= cur & 0xAA;
if (i & 1)
cur ^= port;
cur = key[cur];
buffer_[i + 1] = cur;
}
buffer_[0] = checksum;
return buffer_;
}
void SAMPRakNet::
HandleQuery(SOCKET instance, int outsize, const sockaddr_in& client, char const* buf, int insize)
{
if (query_ == nullptr) {
return;
}
Span output = query_->handleQuery(
Span(buf, insize),
instance,
client,
outsize);
if (output.data()) {
sendto(instance, output.data(), output.size(), 0, reinterpret_cast(&client), outsize);
}
}
struct AuthEntry {
StringView send;
StringView recv;
} static const AuthTable[UCHAR_MAX + 1] = {
{ "6C407EC29DE59E2", "D9412F235647BAA582089C6F66817F8B8811C057" },
{ "277C2AD934406F33", "132770E4744F6E78F2CBB4D3F3638EC05D7EA79D" },
{ "3A968DE22423B39", "D1080D41AD614649282887E4001C93AAEDBCA570" },
{ "479E294F68A7AB7", "D2A4C61BB6D9FAB47FF4732B70497FAD91BB7FC2" },
{ "583C3D05A2A3CCA", "CD8856BDA216335F3D275587E57D75E62FC8ED3A" },
{ "70A2762B77CD22CC", "B028F73A7B37AB5EF9B990ECA397C78841B7A086" },
{ "4EBF34953B6E1779", "45AB65DF7D64D902A3B130CEA3F9529AC4F260B6" },
{ "29B6F33709B1150", "180ED6A653ECBB56A5DC9DD5E4FD862FEE792990" },
{ "58E30DCFA7343C", "4E50D5C757887821522338185A32DC1A2B263D5E" },
{ "6F2B3B214EFD2674", "6C3F004F320AE3B70FA8BAB7EEB8D66A176497F6" },
{ "347D638A5EB52CA0", "50E366B9D4EF5EFDBFD7BC128FE9F339B19CB873" },
{ "6CF77623265513D", "EBBD29EFED75C5C5D2816F86B737FC4F5021A231" },
{ "664361377D3A1B42", "B9B72B3FA9C877AF292087F765112F859B72C64D" },
{ "49342E5C4471804", "EC664F610315BD0B049A6A42B7003BBAFF99CAF1" },
{ "AFCCAF2B1C3C57", "6E87E67009B19014A2714DB2E174474B3A5C303F" },
{ "7E9F50617E9B60F6", "90D62A04AC0B96827FB0EA67514D3B9A1E3BF91F" },
{ "1AA7B7342075E25", "BF43CD93D89C5285E27B84FE8EFB4E1AC501A3B1" },
{ "471A23BD25EA94", "A17C2F9CE17F09BA78D846F8C8CFC7F7079C23B2" },
{ "47A9A3573E92187", "AC4E454B5D51815B18867CA04560EB5AD8838D7E" },
{ "162A776E4E115434", "E188A468F6A8EE07441C4A1AC63FB29F8D53951B" },
{ "4148515F1974A6C", "E20C4BEB9A4166188C49D8AC7715E759902AF87B" },
{ "23791E662438167E", "DAC1332B09E674A4A619D5A1A1855B17A4D97F8D" },
{ "631298D109F6059", "AEF468EE84F95E064042E7B6D0DCE0608677401A" },
{ "5563C0B31DC4BF0", "99C56BD48BCD93D555D708A1D78E3F4F259B4A79" },
{ "46F3100E2B265EE3", "D8A6A2017ED4EC0717AAE74CF6409D6814E13052" },
{ "5B3060B750A695B", "77E63FDEA5EDD8B5ED8563D0F38E0E83CDECE996" },
{ "58823B662D053635", "A56B5A1E4F8938B7B02E043CD0E02E1AD92E080B" },
{ "81F76391352664", "0FDBD2E992763F49120A5B424BDE97D578303FEF" },
{ "36B56FCF5B015B90", "18CFC66AB764D902910E7A1C6300442CE501CFBF" },
{ "7D5B7C5250495603", "C6F997E2A56407A82F384DB2BB23041B1252C680" },
{ "16C823B4191F29C6", "A309F3B06CB2316FEB4A67E1D3953D63F51D00EA" },
{ "14C2153854076F07", "AD777E54C165C0A09871C37DE42EEFE09B81DFF3" },
{ "9DA7435192B51BE", "0D273519B1154DB6FA1DCF4CE2752D0A69D96218" },
{ "7B57621711AA6491", "E163DBDE328DC9A9F43060C7DF162D157B10400A" },
{ "2F7069A619321AF4", "DE4DB227F4891DB3B5C0C9ACCC7991AAD3780CFA" },
{ "2BBE2F8B1DD12E94", "8776CC093D240126E58F125BE7858E259AF8B5FF" },
{ "77F0C0F320873F6", "D94EAFF471FE5CC6976909F4DCD77AC2AA765D88" },
{ "78C17227522625B", "39E962FC90673235224A76D48C8CA530CC2B9A6C" },
{ "772747AE35C352E8", "F44374A4DBE562211BA7179F19CC8E1861220218" },
{ "27CD12F132C43B03", "1E385E9446FB0605BA96D9DB4A603304DFEAF90B" },
{ "46C421701E3E6600", "AA66E00E75CB893196A84DBC29009BF614C66084" },
{ "1B76BE366E571FD", "7365966472CDB73AC8D4E42C02838C6FFA5C991F" },
{ "78DB3B7CB98140A", "38C0E472DB303430DED2205FAE4596AF08603580" },
{ "DEF546C3D36678E", "5BCF5C415256E41CF8BD9F5BE2A42F7AD7996750" },
{ "1A6329A852B24CE6", "C2AE658442E941A1ADEFA2C96DCA9E1D3B97A23E" },
{ "5B921DED436A1B4E", "62A24EA43DC2E7FDFE89AAB5F7B587EAD0771DC8" },
{ "45B816011BB42A05", "FA52DB6492A87A0078ABD837468A4AD7B4B7E6ED" },
{ "5D5E603D1FBA74AC", "D8E1BF3412E8172CB3710A03F0CAB73E009565DF" },
{ "4519354810895EEF", "085DC16D7C4A3975337FCA16C30E785CADDFDEFE" },
{ "5374362547645B68", "B126F73BDA26767C36DF0261E10C5556B96C9379" },
{ "452BB701B5E79C0", "CA0BC7D627C3B33F1834189D9183F2F19A2D233F" },
{ "5F9A9E445282018", "18A1FC58F1A5DFBEFA1281DF46090A7A50E03C48" },
{ "177421352773A7", "D85E24B5C5E0F8E9BA5D07A261ECA3F26EE40D48" },
{ "FB811ACFC934A4", "2731E85667DF3DF9255EEBEC8FB1D4830939B8EA" },
{ "4E14338441A1166", "2E680524E8873363574778D78EFFE8C4D690D7A6" },
{ "785E1C24709234CA", "940F34C2D41245E4524E1D5434463B5F8AECEE76" },
{ "3041144A3113D5", "457B799050C64D09B68E2FDDB2F40BD0F7216A30" },
{ "5F3B2CE479CF3E9A", "F191F014E3204211EBB782445473F6637C277EDC" },
{ "8C8680A23AD385E", "D2BC447A6745048E7E91E6A9A573773B406C0EB6" },
{ "75A768FCD4F1AFB", "15E28C2087874A7076425385572F92817436F8C3" },
{ "4C8D7B02158E982", "89A10043BFA4FBAEC3FB4C4B8B30FC00B51C5EEF" },
{ "231A536D72E93624", "B8EA6126891D8ED83D8716DAE90D9D297BBF6220" },
{ "1B0C37D86C1C7F53", "50100256B8B3B827E2932017333B11F87390D3ED" },
{ "5FB359AE7EF46824", "CFC5A84B3CF3D04D1FDEE82B91972B90A5D8EAEE" },
{ "17A5AED69616FF8", "F21D89EB25B1263DE5871A60E9407C7A98D0381D" },
{ "1EB2302948CDD5B", "674AF510B26CB1F8E1835B396945C911CDB0F7F0" },
{ "1C1A13D343AC502C", "419C59FE61200D6E59F0774C7E4A0B9FEB0D8543" },
{ "48FE7EBB71546EFF", "A13E3C1959CB65EF9E524BD24F0FDCF8DD11DA1B" },
{ "7B1539D4740F43BF", "FC4F1E495122C86D1605F2C720D307A4F23DA704" },
{ "47A05D37796F7B98", "FB508D6CDDAFE62F088ECC07834BA165A6D9484B" },
{ "52A0106B14E27E13", "AFD221F0E28AB16BF0F3E9570034AB8F949F10FB" },
{ "1E461FE428864F83", "45841042BC967C22FDAE981407BBB57A7081DD45" },
{ "6EABBC9503F72A1", "B0BF1A5B7A3A0586917A84315D210B7DDB652FBC" },
{ "15C173FB306D73", "B7E04B553D665F0C4F59542491B45B9D2EB47248" },
{ "3B8A5525E845572", "FDAD5B7B2C5DC84BE49F07FD03C80EF634EA9C82" },
{ "76874C2A50DF6EB", "F8B0FD3504390C79256C984B7BADA1806D94EE3E" },
{ "4874101E14D46BA6", "87F8E07CE86EBCDD2B98E949F0C3CE79A7258DD7" },
{ "53321D13340634C6", "D64EC2AF19D96CC95D97CFF37C88463DC555EB1B" },
{ "5A051D793952BF0", "152AB05E3464C03EA308DF51B6D4771FAA8E2F8B" },
{ "62FF69CD4EF37FAF", "0DB9491C3D55DED81E3A3C72E40E88C8919758AE" },
{ "CBC716224F32F17", "B8F3114F4DA2779075CBA5574D4B6BDDEEC3CF7D" },
{ "6C5020627B2358A9", "BC293BD1438D6FB4C10D1A5BC778A88B9BD6C99D" },
{ "77E670F1B5C7077", "CA08EE157A0B0A775C3FC516762EE4EDBE90A0B3" },
{ "3F2B464FF972189", "918A09C3659C45882555011270B8460CE6EC9F92" },
{ "3E1156825E7E", "492927CD4E61C8BB6FEF9DF926C1C2D9EC925359" },
{ "3FB8750837546576", "F9E62B21E68DEF3CA5304096E80A45764A6CBAA6" },
{ "43A26388415D3B30", "93369612310EB002BFD93634D17B7A0BC929B30D" },
{ "C6267157E16170", "7AFAF784571E4BEA4CE07906B62A2D5F2D04C03B" },
{ "2D415D4011A64CA4", "E60B8A2D516AA68759272E807052FD3862D7B75C" },
{ "6E4751667CC5CC6", "76679E3836E8EAED90B6F10B121B52FE4F03339B" },
{ "45F1793655D5D84", "B8EDB6CC12E29A032A80A5F98D695B182B32556D" },
{ "7D056341525519F", "8143B0D90476820C30FBACD470D2C433B229CB84" },
{ "4956553B1C4D91", "CA8F2BD50C66A24FDC14506452DE038FC119D40A" },
{ "2B1A3B1E1C016572", "D4F20851FBB40B1606436C0B9D3B470DCC5743B5" },
{ "5E11B221B61721C", "96FD906C1EABF6570C4E43B5C1D31149CDB09C85" },
{ "6E8438D92CF9318E", "3411A0F24E8F3B93BC5E6533044B8423B86A2CDF" },
{ "6FA024E948068E", "C6183E48AADE981C56FE4F73AAE7CA43637B8EBA" },
{ "B8E17103A85B93", "21334344D203C35901E4793CB60F55C04FC89058" },
{ "1A9629656BAE6CE1", "6BA21F9467E0D25D2A940E5B8332367260799462" },
{ "595F58E14D307DF6", "358D0593F129EF431EDA37C1B93478A39CA49846" },
{ "3BAA6F1D2A407E25", "1B08562483516AD6B34E38131DC148742685D8AB" },
{ "5740395D7EB66081", "50132A03C5931C67565600527B145BF736F03238" },
{ "7B2930CE22CA2AFC", "EFCB215CAF75CCECE4925FBA0192F6F6ACC9F9D6" },
{ "471F780C3BE2D0", "E2089098F1CE0AB3729F62AFAE75F29EE5B88624" },
{ "574351E72FA82C1E", "A5737572A642FDF51B111E04E4E2F48C3336C4AE" },
{ "580E75674D606AD5", "92CDAB5A10FAFB4702DB000171DB011451F6C504" },
{ "1689630E21792D6", "EBF13AE17C7EAF5903E938B21519C138B6109E28" },
{ "60C11F5C27616156", "AD3D181D621E4778E4CE285FE5D177A31375F947" },
{ "4A7576994D9E4983", "2F2E103ECAD7EA2E5EADC0DD12DDD05898C934B4" },
{ "2A132DCE1B566A", "7AC50947A514153C84515C96C8B66354B11745C4" },
{ "61E345152CBF5418", "5CDB078FCFEB311A1B174A9EA47B6BA8875A0CA3" },
{ "49812F12764433FF", "A3D6F3D6B29810463835A320840D9E8482560BF1" },
{ "4B9021C2947209C", "91A4F3384BE48B758F14181BE065B4E523EA20E3" },
{ "BAD6473479B7457", "DF1753449635CD25656BCB47933BF05ABDF952C5" },
{ "28A23F143DE317AB", "334E33CEA02105B5AB9DD4290D20EF1CE2FD7955" },
{ "6EDC6EAF1760A86", "7F370CE0F99A3CAA9929A915DAF9175B7EC5437D" },
{ "F2043344071CF3", "3958D8F27C3E2CCF23DF30EF9826B8B4AE012345" },
{ "2D794A7844D71AF6", "7CE44A1AB70E70334A040BB97948F90F7529CA08" },
{ "5C752C7D52696FB7", "64EAD04A4FD68F0DB9A33F87FC3167C666BCD32C" },
{ "58901CF451C93E3", "A24C762722180B42D75D32641BA1F5BD5705498A" },
{ "17F16004B845B50", "C460C7370F9630FDC5DCE592E9D4673CBA0FA769" },
{ "254503D590235E0", "A7BF359223A37F0A3455636EBCF249E92E8A7EE8" },
{ "65486C013C1637A7", "C026C91160AFA9B715D50328CE3B71C802E59EEA" },
{ "789A7FE214D45C50", "3F22A66F651B682C24DEC04FE0F4006E8CFD154D" },
{ "711607829A339BC", "24035C6EC8AF3CEE8C58F90249C717BFE51D8338" },
{ "F5B3564759355ED", "752C905020077D8F524A8616402E12DDCBDE351C" },
{ "71486F9070F01423", "34C6031CEE4EE12BD62EB2F3472D56CA74E34D0F" },
{ "7B3674B948177D44", "1AD6B4FCEC9D0D05B4EFEFA11200B4D9892C6895" },
{ "6BCD242B74886781", "03679F4624B21CF0979722545B783845E3398306" },
{ "3BEC18CC6C3D4137", "ADC16DB34679B031D4B5BBEE184B50083BB9B8A0" },
{ "44E24C5C5B3A313", "5CFA7F8A5334D8F5AE4867A28A25586AEC4AAF4F" },
{ "16E27FFB1B66D7A", "4454AF95AF5B8460D4D5BD1798E2656ED174FB2F" },
{ "13B1DEC5E997528", "453B2549AF80225BC7F638DE7276DD0857B8032F" },
{ "21A28983EF6317", "35E8537F84FD7C1F0E2D5C3A1B50C39C6FFD34C3" },
{ "AC44AD6297B6BA2", "64CBAFE90E809320092A1FB98E1A14572C50CFEF" },
{ "5C5A5D6956D6EA", "73FA1B06A7159BF92AFB50FA455A0B82A28FF548" },
{ "5A8B55CA467A6479", "1A1C51732728D88F55C8AC2755E16B2C72081383" },
{ "5C5B12296FF37C25", "25DFE45F13CEC422AF94A4F8C4D5933CFBD855B9" },
{ "23DA76AE1E762E37", "C92B05E20B8728F1C9A337920EE73A9810CBAF2E" },
{ "69B10042ABD28CD", "FD7E61C06C9036F8845E982C8560964B8A143E87" },
{ "7A683F18712387D", "53BB915F5ECEED59F0C92AB903135E9FDF60BF6C" },
{ "5A34521E51A9723B", "F80C175C517ADDAF3C70E4F3F884026081A0B0EC" },
{ "77512ED66132347D", "F835ADB252311789710633D89D13AEF8742D342A" },
{ "4AE4720D7FAF439D", "63D38A575B69E435526A49EB0B2BF5376A903A7C" },
{ "5B952866478357E", "8FD27820677C48DF887A94BE76147ADACFE32513" },
{ "2B8B45A56CC2072", "259F8C16BA6468B3BE6C4456E5ECAE85574CE4FB" },
{ "4297357E4CF315B", "19B390F6FE5CB0192C289F53706C1542FB0A0D39" },
{ "28AF45044682D11", "E3926F6FFC7DDF8AEE8C6F41FFE706302A1470CC" },
{ "649F1B854B35104", "6E0893E674F14528FABB970FCF592E3F94C3DCFA" },
{ "52FB13FE62534723", "0A392FB24304303AE7DF4C83BAAADBFAF9E394BC" },
{ "69584018413E40FC", "C341AC8EAE4E3433FA4F63F7A4521FBEC4E33BB0" },
{ "39BB41AC48494E24", "334A90A161C6774DACA6C7C5E2D920D85D236056" },
{ "4A525D8641CB11D9", "6DAF4BB4110666179DD2278C364D544955CF8F67" },
{ "15622B6917723BE6", "2B25F4B09D664BD72971367601F92109D3B6C7AB" },
{ "458175471D958C7", "0C98F3E92244EA1C40E537D706AE3956BAAA76DE" },
{ "2052804765C6D0E", "E15406041F2A256A2209B47539E3FE5A5793CC39" },
{ "5FBC7EBA172B6005", "2DE29755238B3769C6565C379652B98C1BE612B4" },
{ "49DE443E299D7995", "FCC9B7CE8F1249F82BF6E98A48EED5393110090F" },
{ "773F572436C77766", "1BFA8AD640401259216B04A43F160A6810866163" },
{ "3FC94F4E3A4E7D48", "2393D160295BD5A03F42CA1D1932C0D8DE940FC9" },
{ "662A6AB2437964D2", "144A22F14F2EA79A588D22D78B3F1E462D152896" },
{ "29CA375D2C8A3048", "C848B7B9C0F4B31A84926C0A48E3A012E2FAB253" },
{ "35001EB85C4F24C2", "0EC322D4E644AB352B8C990EC66F9D6C707C8A1A" },
{ "3B85360B45F44F8B", "6A244AC02399BAC7D4ABCB6B87199AEF377B0177" },
{ "5D29783F1B1B7AC8", "6BE2A3D98D0A8C09417F42CBDDC358219EB33C92" },
{ "20C44CE8642E555A", "97E4E8B37712D2E6D9E0BEF95CD95951116381FB" },
{ "1B708372F45205", "AF76765DFA4A47E500092C55101D73CD31ECFB89" },
{ "17F511FB63631D1", "A55ACFA72989539D611ED1C03481C531D2689A7A" },
{ "528579731EB66DB0", "C51B71C95640001B3A91ADB393C90EEB3C60E7DB" },
{ "1CAA4C3F14BF3362", "80DD8A137A0F8D2B3027DAE1D7B0F2A22DC02BB3" },
{ "7D7C62331F7D6996", "95260B015F7763AA5111E2460BE7DAE82964C709" },
{ "2217602144F1F52", "AAF19B7400E7C12EFB19E0D58F300A9A51B7ADAB" },
{ "324C4B9D4B2EA94", "88E9316C6F822752A71A3337D90F49D29AD47298" },
{ "5D97C0352B07A3A", "E66595B115971A6AF745938D5D426AFBCD9FEA6D" },
{ "34517CBC6AEE5F1F", "246E6FF71D6CA74ADD99363E464A8F30BEEC04AC" },
{ "212774BC55326087", "E72876080826370E4348ED487BAD25175893AA48" },
{ "16CB674F69A92FBD", "FF802A0B2398CCCD3930E8C87F1C8A8DFCB82011" },
{ "45E921652B64EFA", "433558B16219F93CCD61E4CC8DE618DE407607C1" },
{ "6F5D6C4C128C3F89", "5444893CD7F73746EFAD8BF8133E5D57AAE6927B" },
{ "26A3B4E6FC5B29", "4E186672D64DB2A8028F0AEB6D3A767BB1F59CD1" },
{ "188F705B5F8B5CB3", "375D20FBD0A05DECCAB08367E15E5FA5A77A3729" },
{ "2A3E539839C85BFC", "9383AB215ED09F2B996F7DD905E6C69C4D6F734B" },
{ "44C405757DD40FD", "3FA7B99D35480465EC276CBA5B287595BE34BE98" },
{ "5E47569825637231", "B105A621B98C4DCEC677119FF8FB02237B662156" },
{ "1E6445D07E7B423F", "43A554222D382FA10936FA1A296A47CCF7A4726A" },
{ "217164EA6D1A60D9", "1ADFA13B14C69694CE4DA9F94EF6E5AF83BBF020" },
{ "3F0BB8C50A452E4", "8D684C13AC99106FD8FEA3E5626C12A6B97CD01A" },
{ "5E11109B23BD35D9", "269D40DF5E98637F665FFDEA8532ED5E02F360DB" },
{ "2D591201545C526B", "73D1386CBC760FA57BFD1504E47FDEA1F1EA59C6" },
{ "54A169AE6220426A", "74E2C35A7E54AFAC89209B4D0579877F5DA98F13" },
{ "31C873DC36E82DE7", "2C1BE06F66EF376632810A872519BFD18F2CEA6F" },
{ "763EA986D9E6399", "BA59F7B390B0D49CFC7E12D4A835AA337DF01F5E" },
{ "38B95A7E7B53507F", "7C322DB43AC0B97EBEA4881EF138B9DC528DC346" },
{ "4F2974C46E911AC7", "19C722C8D0EE4D1D228019AD003FBCF173AB05A3" },
{ "4EF427A38EC63EF", "83EDD7778BFB69DA52B86B3B5767726DD204DB34" },
{ "1493D0F36DB762A", "8426C0C07C699A93B12CF0B53661541726F6A555" },
{ "7211101869C66105", "59C0C177142EDCA420714A730E662CA182EAD9AC" },
{ "4EA884D1860494A", "B51D6195915BBA8A5CAC1581C6423B83E1B9D21B" },
{ "472D73D449377024", "50018A8C9C4551E01BE38DC675460357544E28B3" },
{ "33F257C34B8A3585", "FBC5E2EE7F584506302A9AC668275D84079AC51E" },
{ "19301EE0425A19C5", "98DCACE879EA22A55AAEB4DF557F0112750538C0" },
{ "12F925AB65C328C", "4867AEC4BC3405FEB6D1D612F0FE5FBACED0FF64" },
{ "3D6F479E6E8D46F1", "56EF5FC757D8080D0C33C00C2F96FAA00948734D" },
{ "6D3451B35FFF46E3", "9EDF0B6A2D06A6BB4DD592CC4FB910F5C071BF5B" },
{ "4C217E2723F311C8", "9C6AE1A930350CB45517994FC5B3D918F5003A96" },
{ "2E3B5D7D2D306065", "84B3C7FD6C1A4E8FC59297ECDFC286C298C246A5" },
{ "32E250C713F365FE", "5F574D100C5906595F1A53E1CAEDAE8B7D75321E" },
{ "64C792160CF3CBE", "52E6215ABA22F11801D868BEE5E0D1C706371D31" },
{ "5732407E79B77159", "C61CAD6746318287AF0BF5B2003868AF6982003C" },
{ "54C95FA7655A71EF", "5E5DE0E176014FEF75047CF57C62610D59F2AF59" },
{ "48F458058AF6434", "3480702908DB81BEBD2FF6DB0A7A3A276DFAB13D" },
{ "22B838D42D026CE", "029A6C2159DF3195513211DD5B7331A580AEA502" },
{ "4F023B64B0B1FE", "8521241F6EC0D396A9D50C1842DDBB9109167565" },
{ "2D42B4775364B83", "6F748D92EC9D010F16AEFB57759C678B4060C7E5" },
{ "47514F3B60441BB", "0A5C6E3E271360346C6FB1BF9E580EDC758525AD" },
{ "341DBA5316220C", "7A11536F824A625D4D88CC5EFC754F52F6C86AEC" },
{ "6E2820E0B933E82", "173AF0F1EE5EB356140E40182583F8C4E6C873E3" },
{ "20817EC03FB16B9", "5DEEBFA4CB6E03CD16C063E211D20640FACA4B4A" },
{ "6BE71AA9227837FE", "6DDFA1F4595A70906C71958B9CBF06582ECC8D3D" },
{ "46BE7BA86F768B1", "C1B8BDC35596EFB40826BE0DF6A7303A1459AD72" },
{ "49E67C4D6B3562ED", "78AF9E59782B0F590464CF9936138798B5F2CF48" },
{ "29A527B2491D226C", "D9C08A2FA2D0AC2A8FE53CCEBD4F2EC31474B9BA" },
{ "3AE167BA3B5149A4", "7704AC660058B05F1A3ECC308FA91A18FFFF84F9" },
{ "589368974C076236", "E4F9B6827BE31BDE47454E28560A9FAD8E3CDBA0" },
{ "3D78558F26167C89", "3EEC56001D9EA511C1F4CC8BBE830BC47BD8BB0A" },
{ "260A52FF5C5072B2", "9A05010BF879AD36D43327DAD911382D50903FF7" },
{ "4EAE59A03B135298", "B491A64DE34519D96E0D428880AD86B0B0F0735F" },
{ "222F5709581B3355", "45B0A24B64A678C5B6A434FCE00016C49A1C75F6" },
{ "2C6B3775549A79DF", "66B37BEFCF9399108C27DC72208E00AB827A7DD2" },
{ "254C3CC758B50E7", "193BC88CFAE3B57050BEAEA9E8AFA097BF8F3B5C" },
{ "27FA46CB76435801", "6D3B25F5B6A0DFD6146AF305781D34E57C5D682C" },
{ "6A4F70BF79494E06", "1A29C1131308250744818611B8329117EE594C1B" },
{ "88C28123B673AB6", "133F545A93DAC8A15DB200C6C0A21090D38541A0" },
{ "394A206BD015BA2", "C2F2FDF47C6BD12310FCDB3B564A5AAA4EE4C627" },
{ "7DB348ED55A6584A", "EE1869A8D0AF990C1D58EF7C683CC6E23BCF0BB1" },
{ "21F126BA65E5182", "E239256C1CB03967F46C9B24005FC8C0E20B1A0D" },
{ "21E738B51B62201A", "E88733B15DC9396B1B20EF094771CF44C818A69A" },
{ "461F488DB2916BD", "24BA1E079FF6BB3CF7F57DC63E1FBCA5C1C6A2F8" },
{ "D044CF726415B1A", "69FC69EE7C95738F917AEA73D1FB6B907AD91953" },
{ "3452413AC85A42", "D66A8D7BC90A297726DFED969FDAA6EF19939864" },
{ "76CA15F11AF1C51", "CB2084E4290C216DF0D0AD8A445A362F8799648A" },
{ "522A1F0C38B67B51", "2CB76D8A0993DE62D0C108D6814D4F7DE0D4C8D1" },
{ "695C2319695A15B", "F097275236912E370955E54509C0E554D28A45A5" },
{ "56EE6FC263FC21FF", "84DE0DD44B8155E58D8E324CBDE2D69E6FC6DD21" },
{ "3C2179617B442E7", "5BCA55150CE749AED97A0CE7B1A7EB205735E7E7" },
{ "56073D0C3E9E7B6", "E4CAADA710179666EA035F509681F9B8DE7FFCFC" },
{ "4C67EC424741536", "B64DC756FD081BBC106EA069708B3C6596222898" },
{ "598259113B62FB3", "BF6A3C57226D5BE61C0C20FD17FC935E37C57E64" },
{ "139C50B5731558A2", "982B1A75CCB87E2AD7EAB23F149A7FEB785BE875" },
{ "C927AEB6164F87", "D830239C33F736942B7FF97B7B12137465CEC08E" },
{ "661356AB31561A15", "74A8F21FB34D6A05C1C08B6BB8DE5712913E8A54" },
{ "760C2B29A0A3796", "0C2B97FC56DA10ADBB6D47A4F079ECDF7EA8BB95" },
{ "F641F9F65B8638D", "369C3F95D1A57DA57655B39807C47D685AA8BFC7" },
{ "42EA4C892B9A", "E34C0A3756936F4852CC6EC0035F5EF66562D477" },
{ "2C8C54BCE045C9F", "B62D5A37BC45ECC0C374C4905629F0D9392715C1" },
{ "20C92B4B3F892B21", "282B4A757C5C4E1DDBFA0D1C39EA53576AB91399" }
};
Pair SAMPRakNet::GenerateAuth()
{
const uint8_t rnd = rand();
return Pair { rnd, AuthTable[rnd].send };
}
bool SAMPRakNet::CheckAuth(uint8_t index, StringView auth)
{
return AuthTable[index].recv == auth;
}
uint16_t cookies[2][256];
void SAMPRakNet::SeedCookie()
{
for (int i = 0; i < 256; ++i) {
cookies[0][i] = rand() % (USHRT_MAX + 1);
cookies[1][i] = rand() % (USHRT_MAX + 1);
}
}
uint16_t SAMPRakNet::GetCookie(unsigned int address)
{
const uint8_t* addressSplit = (const uint8_t*)&address;
return (cookies[0][addressSplit[0]] | cookies[1][addressSplit[3]] configuredMinConnTime)
{
core_->logLn(
LogLevel::Warning,
"Minimum time between new connections (%u) exceeded for %s. Ignoring the request.",
configuredMinConnTime,
playerId.ToString());
minConnectionLogTick = tickTime;
}
return false;
}
minConnectionTick = tickTime;
}
}
if ((*(uint16_t*)(data + 1) ^ 0x6969 /* Petarded [S04E06] */) != (uint16_t)(SAMPRakNet::GetCookie(playerId.binaryAddress)))
{
#ifdef _DO_PRINTF
if (SAMPRakNet::ShouldLogCookies())
{
core_->printLn("%s requests connection cookie", playerId.ToString());
}
#endif
char c[3];
c[0] = RakNet::ID_OPEN_CONNECTION_COOKIE;
*(uint16_t*)&c[1] = (uint16_t)(SAMPRakNet::GetCookie(playerId.binaryAddress));
RakNet::SocketLayer::Instance()->SendTo(connectionSocket, (const char*)&c, 3, playerId.binaryAddress, playerId.port);
return false;
}
return true;
}