226 lines
5.6 KiB
C++
226 lines
5.6 KiB
C++
|
/*
|
||
|
* UNPUBLISHED -- Rights reserved under the copyright laws of the
|
||
|
* United States. Use of a copyright notice is precautionary only and
|
||
|
* does not imply publication or disclosure.
|
||
|
*
|
||
|
* THIS DOCUMENTATION CONTAINS CONFIDENTIAL AND PROPRIETARY INFORMATION
|
||
|
* OF BLIZZARD ENTERTAINMENT. ANY DUPLICATION, MODIFICATION,
|
||
|
* DISTRIBUTION, OR DISCLOSURE IS STRICTLY PROHIBITED WITHOUT THE PRIOR
|
||
|
* EXPRESS WRITTEN PERMISSION OF BLIZZARD ENTERTAINMENT.
|
||
|
*/
|
||
|
|
||
|
#include "../types.h"
|
||
|
|
||
|
int encrypt_table[1280];
|
||
|
|
||
|
//----- (00415F43) --------------------------------------------------------
|
||
|
void __fastcall encrypt_decrypt_block(void *block, int size, int key) // DecryptMPQBlock
|
||
|
{
|
||
|
unsigned int v3; // edx
|
||
|
int v4; // eax
|
||
|
unsigned int v5; // edi
|
||
|
unsigned int v6; // edx
|
||
|
int v7; // eax
|
||
|
int v8; // esi
|
||
|
|
||
|
v3 = (unsigned int)size >> 2;
|
||
|
v4 = 0xEEEEEEEE;
|
||
|
if ( v3 )
|
||
|
{
|
||
|
v5 = v3;
|
||
|
v6 = key;
|
||
|
do
|
||
|
{
|
||
|
v7 = encrypt_table[(unsigned char)v6 + 1024] + v4;
|
||
|
*(_DWORD *)block ^= v7 + v6;
|
||
|
v8 = *(_DWORD *)block;
|
||
|
block = (char *)block + 4;
|
||
|
v4 = 33 * v7 + v8 + 3;
|
||
|
v6 = ((~v6 << 21) + 0x11111111) | (v6 >> 11);
|
||
|
--v5;
|
||
|
}
|
||
|
while ( v5 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//----- (00415F8F) --------------------------------------------------------
|
||
|
void __fastcall encrypt_encrypt_block(void *block, int size, int key) // EncryptMPQBlock
|
||
|
{
|
||
|
unsigned int v3; // edx
|
||
|
int v4; // eax
|
||
|
unsigned int v5; // edi
|
||
|
unsigned int v6; // edx
|
||
|
int v7; // eax
|
||
|
int v8; // ebx
|
||
|
|
||
|
v3 = (unsigned int)size >> 2;
|
||
|
v4 = 0xEEEEEEEE;
|
||
|
if ( v3 )
|
||
|
{
|
||
|
v5 = v3;
|
||
|
v6 = key;
|
||
|
do
|
||
|
{
|
||
|
v7 = encrypt_table[(unsigned char)v6 + 1024] + v4;
|
||
|
v8 = *(_DWORD *)block ^ (v7 + v6);
|
||
|
v4 = 33 * v7 + *(_DWORD *)block + 3;
|
||
|
*(_DWORD *)block = v8;
|
||
|
block = (char *)block + 4;
|
||
|
v6 = ((~v6 << 21) + 0x11111111) | (v6 >> 11);
|
||
|
--v5;
|
||
|
}
|
||
|
while ( v5 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//----- (00415FDF) --------------------------------------------------------
|
||
|
int __fastcall encrypt_hash(char *s, int type) // HashStringSlash
|
||
|
{
|
||
|
int v2; // ebp
|
||
|
char *v3; // ebx
|
||
|
signed int v4; // esi
|
||
|
int v5; // edi
|
||
|
int v6; // ST00_4
|
||
|
char v7; // al
|
||
|
|
||
|
v2 = type;
|
||
|
v3 = s;
|
||
|
v4 = 0x7FED7FED;
|
||
|
v5 = 0xEEEEEEEE;
|
||
|
while ( v3 && *v3 )
|
||
|
{
|
||
|
v6 = *v3++;
|
||
|
v7 = toupper(v6);
|
||
|
v4 = (v5 + v4) ^ encrypt_table[v7 + (v2 << 8)];
|
||
|
v5 = v7 + 33 * v5 + v4 + 3;
|
||
|
}
|
||
|
return v4;
|
||
|
}
|
||
|
|
||
|
//----- (0041602E) --------------------------------------------------------
|
||
|
void __cdecl encrypt_init_lookup_table() // InitScratchSpace
|
||
|
{
|
||
|
unsigned int v0; // eax
|
||
|
int *v1; // edi
|
||
|
unsigned int v2; // eax
|
||
|
int v3; // ecx
|
||
|
signed int v4; // [esp+Ch] [ebp-8h]
|
||
|
int *v5; // [esp+10h] [ebp-4h]
|
||
|
|
||
|
v0 = 0x100001;
|
||
|
v5 = encrypt_table;
|
||
|
do
|
||
|
{
|
||
|
v1 = v5;
|
||
|
v4 = 5;
|
||
|
do
|
||
|
{
|
||
|
v2 = (125 * v0 + 3) % 0x2AAAAB;
|
||
|
v3 = (unsigned short)v2 << 16;
|
||
|
v0 = (125 * v2 + 3) % 0x2AAAAB;
|
||
|
*v1 = (unsigned short)v0 | v3;
|
||
|
v1 += 256;
|
||
|
--v4;
|
||
|
}
|
||
|
while ( v4 );
|
||
|
++v5;
|
||
|
}
|
||
|
while ( (signed int)v5 < (signed int)&encrypt_table[256] );
|
||
|
}
|
||
|
|
||
|
//----- (0041609D) --------------------------------------------------------
|
||
|
int __fastcall encrypt_compress(void *buf, int size) // MPQCompress_PKWare
|
||
|
{
|
||
|
unsigned char *v2; // ebx
|
||
|
unsigned char *v3; // esi
|
||
|
int v4; // ecx
|
||
|
unsigned char *v5; // edi
|
||
|
TDataInfo param; // [esp+Ch] [ebp-20h]
|
||
|
unsigned int type; // [esp+20h] [ebp-Ch]
|
||
|
unsigned int dsize; // [esp+24h] [ebp-8h]
|
||
|
char *ptr; // [esp+28h] [ebp-4h]
|
||
|
|
||
|
v2 = (unsigned char *)buf;
|
||
|
v3 = (unsigned char *)size;
|
||
|
ptr = (char *)DiabloAllocPtr(CMP_BUFFER_SIZE); // 36312
|
||
|
v4 = 2 * (_DWORD)v3;
|
||
|
if ( (unsigned int)(2 * (_DWORD)v3) < 0x2000 )
|
||
|
v4 = 0x2000;
|
||
|
v5 = (unsigned char *)DiabloAllocPtr(v4);
|
||
|
param.pbInBuffEnd = 0;
|
||
|
param.pbOutBuffEnd = 0;
|
||
|
type = 0;
|
||
|
param.pbInBuff = v2;
|
||
|
param.pbOutBuff = v5;
|
||
|
param.pbSize = v3;
|
||
|
dsize = 4096;
|
||
|
implode(
|
||
|
encrypt_pkware_read,
|
||
|
encrypt_pkware_write,
|
||
|
ptr,
|
||
|
¶m,
|
||
|
&type,
|
||
|
&dsize);
|
||
|
if ( param.pbOutBuffEnd < v3 )
|
||
|
{
|
||
|
memcpy(v2, v5, (size_t)param.pbOutBuffEnd);
|
||
|
v3 = param.pbOutBuffEnd;
|
||
|
}
|
||
|
mem_free_dbg(ptr);
|
||
|
mem_free_dbg(v5);
|
||
|
return (int)v3;
|
||
|
}
|
||
|
|
||
|
//----- (00416133) --------------------------------------------------------
|
||
|
unsigned int __cdecl encrypt_pkware_read(char *buf, unsigned int *size, void *param) // ReadPKWare
|
||
|
{
|
||
|
TDataInfo * pInfo = (TDataInfo *)param;
|
||
|
int v3; // edi
|
||
|
unsigned char *v4; // ecx
|
||
|
|
||
|
v3 = *size;
|
||
|
v4 = pInfo->pbInBuffEnd;
|
||
|
if ( *size >= (unsigned int)(pInfo->pbSize - v4) )
|
||
|
v3 = pInfo->pbSize - v4;
|
||
|
memcpy(buf, &v4[(unsigned int)pInfo->pbInBuff], v3);
|
||
|
pInfo->pbInBuffEnd += v3;
|
||
|
return v3;
|
||
|
}
|
||
|
|
||
|
//----- (00416167) --------------------------------------------------------
|
||
|
void __cdecl encrypt_pkware_write(char *buf, unsigned int *size, void *param) // WritePKWare
|
||
|
{
|
||
|
TDataInfo * pInfo = (TDataInfo *)param;
|
||
|
|
||
|
memcpy(&pInfo->pbOutBuffEnd[(unsigned int)pInfo->pbOutBuff], buf, *size);
|
||
|
pInfo->pbOutBuffEnd += *size;
|
||
|
}
|
||
|
|
||
|
//----- (0041618E) --------------------------------------------------------
|
||
|
void __fastcall encrypt_decompress(void *param, int recv_size, int dwMaxBytes) // MPQDecompress_PKWare
|
||
|
{
|
||
|
unsigned char *v3; // edi
|
||
|
unsigned char *v4; // ebx
|
||
|
unsigned char *v5; // esi
|
||
|
TDataInfo info; // [esp+Ch] [ebp-18h]
|
||
|
char *ptr; // [esp+20h] [ebp-4h]
|
||
|
|
||
|
v3 = (unsigned char *)param;
|
||
|
v4 = (unsigned char *)recv_size;
|
||
|
ptr = (char *)DiabloAllocPtr(CMP_BUFFER_SIZE); // 36312
|
||
|
v5 = (unsigned char *)DiabloAllocPtr(dwMaxBytes);
|
||
|
info.pbInBuffEnd = 0;
|
||
|
info.pbOutBuffEnd = 0;
|
||
|
info.pbInBuff = v3;
|
||
|
info.pbOutBuff = v5;
|
||
|
info.pbSize = v4;
|
||
|
explode(
|
||
|
encrypt_pkware_read,
|
||
|
encrypt_pkware_write,
|
||
|
ptr,
|
||
|
&info);
|
||
|
memcpy(v3, v5, (size_t)info.pbOutBuffEnd);
|
||
|
mem_free_dbg(ptr);
|
||
|
mem_free_dbg(v5);
|
||
|
}
|