Devilution
Diablo devolved - magic behind the 1996 computer game
encrypt.cpp
Go to the documentation of this file.
1 
6 #include "all.h"
7 #include "../3rdParty/PKWare/pkware.h"
8 
10 
11 DWORD hashtable[1280];
12 
13 void Decrypt(void *block, DWORD size, DWORD key)
14 {
15  DWORD *castBlock;
16  DWORD seed, i;
17 
18  castBlock = (DWORD *)block;
19  seed = 0xEEEEEEEE;
20  for (i = 0; i < (size >> 2); i++) {
21  DWORD t = SwapLE32(*castBlock);
22  seed += hashtable[0x400 + (key & 0xFF)];
23  t ^= seed + key;
24  *castBlock = t;
25  seed += t + (seed << 5) + 3;
26  key = ((~key << 0x15) + 0x11111111) | (key >> 0x0B);
27  castBlock++;
28  }
29 }
30 
31 void Encrypt(void *block, DWORD size, DWORD key)
32 {
33  DWORD *castBlock;
34  DWORD seed, i, ch;
35 
36  castBlock = (DWORD *)block;
37  seed = 0xEEEEEEEE;
38  for (i = 0; i < (size >> 2); i++) {
39  DWORD t = ch = *castBlock;
40  seed += hashtable[0x400 + (key & 0xFF)];
41  t ^= seed + key;
42  *castBlock = SwapLE32(t);
43  seed += ch + (seed << 5) + 3;
44  key = ((~key << 0x15) + 0x11111111) | (key >> 0x0B);
45  castBlock++;
46  }
47 }
48 
49 DWORD Hash(const char *s, int type)
50 {
51  char ch;
52  DWORD seed1, seed2;
53 
54  seed1 = 0x7FED7FED;
55  seed2 = 0xEEEEEEEE;
56  while (s != NULL && *s) {
57  ch = *s++;
58  ch = toupper(ch);
59  seed1 = hashtable[(type << 8) + ch] ^ (seed1 + seed2);
60  seed2 += ch + seed1 + (seed2 << 5) + 3;
61  }
62  return seed1;
63 }
64 
65 void InitHash()
66 {
67  DWORD seed, ch;
68  int i, j;
69 
70  seed = 0x00100001;
71 
72  for (i = 0; i < 256; i++) {
73  for (j = 0; j < 5; j++) {
74  seed = (125 * seed + 3) % 0x2AAAAB;
75  ch = (seed & 0xFFFF);
76  seed = (125 * seed + 3) % 0x2AAAAB;
77  hashtable[i + j * 256] = ch << 16 | (seed & 0xFFFF);
78  }
79  }
80 }
81 
82 int PkwareCompress(void *buf, int size)
83 {
84  BYTE *srcData, *destData;
85  char *ptr;
86  unsigned int destSize, type, dsize;
87  TDataInfo param;
88 
89  srcData = (BYTE *)buf;
90  ptr = (char *)DiabloAllocPtr(CMP_BUFFER_SIZE);
91 
92  destSize = 2 * size;
93  if (destSize < 8192)
94  destSize = 8192;
95 
96  destData = (BYTE *)DiabloAllocPtr(destSize);
97 
98  param.srcData = srcData;
99  param.srcOffset = 0;
100  param.destData = destData;
101  param.destOffset = 0;
102  param.size = size;
103 
104  type = 0;
105  dsize = 4096;
106  implode(PkwareBufferRead, PkwareBufferWrite, ptr, &param, &type, &dsize);
107 
108  if (param.destOffset < size) {
109  memcpy(srcData, destData, param.destOffset);
110  size = param.destOffset;
111  }
112 
113  mem_free_dbg(ptr);
114  mem_free_dbg(destData);
115 
116  return size;
117 }
118 
119 unsigned int PkwareBufferRead(char *buf, unsigned int *size, void *param)
120 {
121  TDataInfo *pInfo;
122  DWORD sSize;
123 
124  pInfo = (TDataInfo *)param;
125 
126  if (*size >= pInfo->size - pInfo->srcOffset) {
127  sSize = pInfo->size - pInfo->srcOffset;
128  } else {
129  sSize = *size;
130  }
131 
132  memcpy(buf, pInfo->srcData + pInfo->srcOffset, sSize);
133  pInfo->srcOffset += sSize;
134 
135  return sSize;
136 }
137 
138 void PkwareBufferWrite(char *buf, unsigned int *size, void *param)
139 {
140  TDataInfo *pInfo;
141 
142  pInfo = (TDataInfo *)param;
143 
144  memcpy(pInfo->destData + pInfo->destOffset, buf, *size);
145  pInfo->destOffset += *size;
146 }
147 
148 void PkwareDecompress(void *param, int recv_size, int dwMaxBytes)
149 {
150  char *ptr;
151  BYTE *pbInBuff, *pbOutBuff;
152  TDataInfo info;
153 
154  ptr = (char *)DiabloAllocPtr(CMP_BUFFER_SIZE);
155  pbInBuff = (BYTE *)param;
156  pbOutBuff = DiabloAllocPtr(dwMaxBytes);
157 
158  info.srcData = pbInBuff;
159  info.srcOffset = 0;
160  info.destData = pbOutBuff;
161  info.destOffset = 0;
162  info.size = recv_size;
163 
164  explode(PkwareBufferRead, PkwareBufferWrite, ptr, &info);
165  memcpy(pbInBuff, pbOutBuff, info.destOffset);
166  mem_free_dbg(ptr);
167  mem_free_dbg(pbOutBuff);
168 }
169 
PkwareDecompress
void PkwareDecompress(void *param, int recv_size, int dwMaxBytes)
Definition: encrypt.cpp:148
TDataInfo::srcData
BYTE * srcData
Definition: structs.h:1582
TDataInfo::srcOffset
DWORD srcOffset
Definition: structs.h:1583
Decrypt
void Decrypt(void *block, DWORD size, DWORD key)
Definition: encrypt.cpp:13
all.h
TDataInfo::destOffset
DWORD destOffset
Definition: structs.h:1585
TDataInfo::size
DWORD size
Definition: structs.h:1586
TDataInfo::destData
BYTE * destData
Definition: structs.h:1584
DEVILUTION_END_NAMESPACE
#define DEVILUTION_END_NAMESPACE
Definition: types.h:10
PkwareBufferWrite
void PkwareBufferWrite(char *buf, unsigned int *size, void *param)
Definition: encrypt.cpp:138
InitHash
void InitHash()
Definition: encrypt.cpp:65
PkwareBufferRead
unsigned int PkwareBufferRead(char *buf, unsigned int *size, void *param)
Definition: encrypt.cpp:119
DiabloAllocPtr
BYTE * DiabloAllocPtr(DWORD dwBytes)
Multithreaded safe malloc.
Definition: engine.cpp:765
Hash
DWORD Hash(const char *s, int type)
Definition: encrypt.cpp:49
SwapLE32
#define SwapLE32
Definition: defs.h:182
mem_free_dbg
void mem_free_dbg(void *p)
Multithreaded safe memfree.
Definition: engine.cpp:786
DEVILUTION_BEGIN_NAMESPACE
Definition: sha.cpp:10
PkwareCompress
int PkwareCompress(void *buf, int size)
Definition: encrypt.cpp:82
TDataInfo
Definition: structs.h:1581
hashtable
DEVILUTION_BEGIN_NAMESPACE DWORD hashtable[1280]
Definition: encrypt.cpp:11
Encrypt
void Encrypt(void *block, DWORD size, DWORD key)
Definition: encrypt.cpp:31