webmoney 0.0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/ChangeLog ADDED
@@ -0,0 +1,35 @@
1
+ ChangeLog
2
+
3
+ Tue Oct 14 2008 18:46:50 +0400
4
+ ----------------------------
5
+ V 0.0.4.2
6
+ * Remove ActiveSuport stupid dependency
7
+ * Remove Time.from_ms meaningless method
8
+ * Rename config file to ~/.wm/config.yml
9
+
10
+ Tue Aug 19 11:31:53 2008 +0400
11
+ ----------------------------
12
+ V 0.0.4.1
13
+ * Fix error in parsing ms-data without ending zeros
14
+
15
+ Wed Feb 27 19:09:00 MSK 2008
16
+ ----------------------------
17
+ V 0.0.4
18
+ * Redesign interfaces, BIG changes
19
+ * Add Messenger class for processing messages queue in new thread
20
+ * Add ResponseError on incorrect http response (404, 501, etc)
21
+
22
+ Wed Oct 24 17:57:00 MSK 2007
23
+ ----------------------------
24
+ V 0.0.3
25
+ * Add send_message interface
26
+ * Add specific Exceptions
27
+ * Add parse_retval for response
28
+
29
+ Tue Aug 7 14:34:00 MSK 2007
30
+ ----------------------------
31
+ V 0.0.2
32
+ * Bug fixes...
33
+
34
+ V 0.0.1
35
+ * Initial release
@@ -0,0 +1,144 @@
1
+ /****************************************************************************************************************************
2
+ * Usage this module :
3
+ * size_t result = code64( JOB [ENCODE or DECODE], char *ASCII_Buffer, size_t ASCII_BUFFER_SIZE,
4
+ * char *BASE64_Buffer, size_t BASE64_BUFFER_SIZE );
5
+ * Sample for decode from ascii to base64 :
6
+ * result = code64( DECODE, char *ASCII_Buffer, size_t ASCII_BUFFER_SIZE, char *BASE64_Buffer, size_t BASE64_BUFFER_SIZE );
7
+ * Parameter ASCII_BUFFER_SIZE - definition size input to decode sequence !
8
+ * function strlen() - may be used ONLY for text buffers, otherwize - BINARY DATA, use really size !
9
+ * Sample for encode from base64 to ascii :
10
+ * result = code64( ENCODE, char *ASCII_Buffer, size_t ASCII_BUFFER_SIZE, char *BASE64_Buffer, size_t BASE64_BUFFER_SIZE );
11
+ * Parameter BASE64_BUFFER_SIZE - definition size input to encode sequence !
12
+ * function strlen() may be used for counting size for BASE64 array, if last symbol == '\0', otherwise use really size !
13
+ * .........................................................................................................................
14
+ * Return value:
15
+ * size_t result - counter, number of bytes in OUTPUT array, whose successfully encoded/decoded.
16
+ * if result == 0 - error found, abnormal terminating, nothing to encoding or decoding.
17
+ * .........................................................................................................................
18
+ * Internal function: idx64( char Ch ); Binary search index in Base64 array, for Ch character in parameter
19
+ * .........................................................................................................................
20
+ * This module present "AS IS", absolutely no warranty, if anybody modyfied this source.
21
+ ****************************************************************************************************************************/
22
+ #include "base64.h"
23
+
24
+ /* Base_64 characters */
25
+ const char Ch64[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
26
+
27
+ /* Presort array for indexes */
28
+ const INDEX64 Id64[64] = {
29
+ {'+',62},{'/',63},{'0',52},{'1',53},{'2',54},{'3',55},{'4',56},{'5',57},{'6',58},{'7',59},{'8',60},{'9',61},
30
+ {'A',0},{'B',1},{'C',2},{'D',3},{'E',4},{'F',5},{'G',6},{'H',7},{'I',8},{'J',9},{'K',10},{'L',11},{'M',12},
31
+ {'N',13},{'O',14},{'P',15},{'Q',16},{'R',17},{'S',18},{'T',19},{'U',20},{'V',21},{'W',22},{'X',23},{'Y',24},{'Z',25},
32
+ {'a',26},{'b',27},{'c',28},{'d',29},{'e',30},{'f',31},{'g',32},{'h',33},{'i',34},{'j',35},{'k',36},{'l',37},{'m',38},
33
+ {'n',39},{'o',40},{'p',41},{'q',42},{'r',43},{'s',44},{'t',45},{'u',46},{'v',47},{'w',48},{'x',49},{'y',50},{'z',51}
34
+ };
35
+
36
+ /* Base64 ENCODE / DECODE function */
37
+ size_t code64( int job, char *buf_ascii, size_t ascii_size, char *buf_64, size_t buf_64_size )
38
+ {
39
+ BASE64 b64;
40
+ size_t i = 0, j = 0, k = 0, i3 = 0; /* job indexes */
41
+ size_t ask_len = 0; /* Internal variable for size ascii buffer */
42
+ size_t buf64_len = 0; /* Internal variable for size base64 buffer */
43
+
44
+ b64.a[0] = 0; b64.a[1] = 0; b64.a[2] = 0;
45
+
46
+ /* Decoding to Base64 code */
47
+ if( job == DECODE ) {
48
+ ask_len = ascii_size;
49
+ if( (ascii_size * 4 / 3) > buf_64_size ) return( CODE_ERR ); /* No enough space to decoding */
50
+ if( ask_len == 0 ) return( CODE_ERR );
51
+ i3 = (int) 3 * (ask_len / 3); /* Dividing by 3 */
52
+ if( i3 > 0 ) k = 3 - ask_len + i3; /* End of seq (1 or 2) */
53
+ if( ask_len < 3 ) k = 3 - ask_len;
54
+
55
+ while( i < i3 ) {
56
+ b64.a[2] = buf_ascii[i];
57
+ b64.a[1] = buf_ascii[i+1];
58
+ b64.a[0] = buf_ascii[i+2];
59
+ buf_64[j++] = Ch64[b64.b.b0];
60
+ buf_64[j++] = Ch64[b64.b.b1];
61
+ buf_64[j++] = Ch64[b64.b.b2];
62
+ buf_64[j++] = Ch64[b64.b.b3];
63
+ i+=3;
64
+ }
65
+
66
+ if( k == 2 ) {
67
+ b64.a[2] = buf_ascii[i];
68
+ b64.a[1] = 0;
69
+ b64.a[0] = 0;
70
+ buf_64[j++] = Ch64[b64.b.b0];
71
+ buf_64[j++] = Ch64[b64.b.b1];
72
+ buf_64[j++] = '=';
73
+ buf_64[j++] = '=';
74
+ }
75
+
76
+ if( k == 1 ) {
77
+ b64.a[2] = buf_ascii[i];
78
+ b64.a[1] = buf_ascii[i+1];
79
+ b64.a[0] = 0;
80
+ buf_64[j++] = Ch64[b64.b.b0];
81
+ buf_64[j++] = Ch64[b64.b.b1];
82
+ buf_64[j++] = Ch64[b64.b.b2];
83
+ buf_64[j++] = '=';
84
+ }
85
+
86
+ return( j );
87
+ }
88
+
89
+ /* Restoring original characters */
90
+ if( job == ENCODE ) {
91
+ buf64_len = buf_64_size;
92
+ if( buf64_len < 4 ) return( CODE_ERR ); /* Too small input buffer */
93
+ if( (buf_64_size * 3 / 4) > ascii_size ) return( CODE_ERR ); /* No enough space to encoding */
94
+ i3 = buf64_len / 4;
95
+ k = buf64_len - i3 * 4;
96
+ if( k ) return( CODE_ERR ); /* Illegal size for input sequence !! */
97
+ k = 0; /* Counter original bytes for output */
98
+
99
+ for( i = 0; i < buf64_len; i+=4 ) {
100
+ b64.b.b0 = idx64( buf_64[i] );
101
+ b64.b.b1 = idx64( buf_64[i+1] );
102
+ b64.b.b2 = 0; b64.b.b3 = 0;
103
+ if( buf_64[i+2] != '=' ) b64.b.b2 = idx64( buf_64[i+2] );
104
+ else k--;
105
+ if( buf_64[i+3] != '=' ) b64.b.b3 = idx64( buf_64[i+3] );
106
+ else k--;
107
+ buf_ascii[j++] = b64.a[2]; k++;
108
+ buf_ascii[j++] = b64.a[1]; k++;
109
+ buf_ascii[j++] = b64.a[0]; k++;
110
+ }
111
+
112
+ return( k );
113
+ }
114
+
115
+ return( CODE_ERR ); /* Unknown command ! */
116
+ }
117
+
118
+ /* Binary search character's index in array */
119
+ int idx64( char ch )
120
+ {
121
+ int start = 0;
122
+ int pos = 32;
123
+ int end = 63;
124
+
125
+ while( (pos >= start) || (pos <= end) ) {
126
+ if( ch == Id64[start].Ch ) return( Id64[start].Id );
127
+ if( ch == Id64[pos].Ch ) return( Id64[pos].Id );
128
+ if( ch == Id64[end].Ch ) return( Id64[end].Id );
129
+
130
+ if( ch > Id64[pos].Ch ) {
131
+ start = pos;
132
+ }
133
+
134
+ if( ch < Id64[pos].Ch ) {
135
+ end = pos;
136
+ }
137
+
138
+ pos = (int) (start+end) / 2;
139
+ }
140
+
141
+ /* Illegal character found, task aborted ! */
142
+ fprintf( stderr, "\n\rBase64 Fatal Error: Illegal character found : '%c' [%d] - No Base64 legal character!!\n\r", ch, ch );
143
+ exit(1);
144
+ }
@@ -0,0 +1,48 @@
1
+ #include <stdio.h>
2
+ #include <stdlib.h>
3
+ #include <string.h>
4
+
5
+ #ifndef __BASE64_DEFINED___
6
+ #define __BASE64_DEFINED___
7
+ #endif /* __BASE64_DEFINED___ */
8
+
9
+ #define ENCODE 0
10
+ #define DECODE 1
11
+
12
+ #define CODE_ERR 0
13
+
14
+ #ifndef TRUE
15
+ #define TRUE 1
16
+ #endif
17
+ #ifndef FALSE
18
+ #define FALSE 0
19
+ #endif
20
+
21
+ #define MAXBUFFER 4096 // Don`t change this parameter !!!
22
+ #define READBYTES 3072 // Don`t change this parameter !!!
23
+
24
+ /* Bits BASE64 structure */
25
+ typedef struct __Bits64__ {
26
+ unsigned b3 : 6; /* 1 Base 64 character */
27
+ unsigned b2 : 6; /* 2 Base 64 character */
28
+ unsigned b1 : 6; /* 3 Base 64 character */
29
+ unsigned b0 : 6; /* 4 Base 64 character */
30
+ } BITS, *BITSPTR;
31
+
32
+ /* Union of Bits & Bytes */
33
+ typedef union __Base64__ {
34
+ char a[3]; /* Byte array in the case */
35
+ BITS b; /* Bits fields in the case */
36
+ } BASE64;
37
+
38
+ /* Base_64 index structure */
39
+
40
+ typedef struct __index64__ {
41
+ char Ch;
42
+ int Id;
43
+ } INDEX64, *INDEX64PTR;
44
+
45
+ /* Prototypes */
46
+ size_t code64( int job, char *buf_ascii, size_t ascii_size, char *buf_64, size_t buf_64_size );
47
+ int idx64( char ch );
48
+
@@ -0,0 +1,417 @@
1
+ #include "stdafx.h"
2
+ #include <stdio.h>
3
+ #include <stdlib.h>
4
+ //#include <io.h>
5
+ #include <string.h>
6
+ #include "ctype.h"
7
+ #include "cmdbase.h"
8
+
9
+ WORD SwitchIndian(WORD n1)
10
+ {
11
+ #ifndef LOWBYTEFIRST
12
+ WORD n2;
13
+
14
+ char* ps=(char*)&n1;
15
+ char* pd=(char*)&n2;
16
+ pd[1] = ps[0];
17
+ pd[0] = ps[1];
18
+
19
+ return n2;
20
+ #else
21
+ return n1;
22
+ #endif
23
+ }
24
+
25
+ DWORD SwitchIndian(DWORD n1)
26
+ {
27
+ #ifndef LOWBYTEFIRST
28
+ DWORD n2;
29
+
30
+ char* ps=(char*)&n1;
31
+ char* pd=(char*)&n2;
32
+ pd[3] = ps[0];
33
+ pd[2] = ps[1];
34
+ pd[1] = ps[2];
35
+ pd[0] = ps[3];
36
+
37
+ return n2;
38
+ #else
39
+ return n1;
40
+ #endif
41
+ }
42
+
43
+ szptr::szptr(const char *csz)
44
+ {
45
+ if (csz)
46
+ {
47
+ sz = new char[::strlen(csz)+4];
48
+ strcpy(sz, csz);
49
+ }
50
+ else
51
+ sz = NULL;
52
+ }
53
+
54
+ szptr::szptr(const szptr& cszptr)
55
+ {
56
+ if ((const char *)cszptr)
57
+ {
58
+ sz = new char[cszptr.strlen()+4];
59
+ sz = strcpy(sz, cszptr);
60
+ }
61
+ else
62
+ sz = (const char *)cszptr ? strcpy(new char[cszptr.strlen()+4], cszptr) : NULL;
63
+ }
64
+
65
+ szptr::~szptr()
66
+ {
67
+ if(sz) delete[] sz;
68
+ }
69
+
70
+ char* szptr::operator = (char *csz)
71
+ {
72
+ if(sz && csz)
73
+ {
74
+ if(!strcmp(csz,sz))
75
+ return sz;
76
+ }
77
+
78
+ char *szprev = sz;
79
+ if(csz)
80
+ {
81
+ sz = new char[::strlen(csz)+4];
82
+ sz = strcpy(sz, csz);
83
+ }
84
+ else
85
+ sz = NULL;
86
+
87
+ if(szprev)
88
+ delete[] szprev;
89
+
90
+ return sz;
91
+ }
92
+
93
+ szptr& szptr::operator = (const szptr& cszptr)
94
+ {
95
+ if(sz && cszptr.sz)
96
+ if(!strcmp(cszptr,sz))
97
+ return *this;
98
+
99
+ char *szprev = sz;
100
+ if(cszptr)
101
+ {
102
+ sz = new char[::strlen(cszptr)+4];
103
+ sz = strcpy(sz, cszptr);
104
+ }
105
+ else
106
+ sz = NULL;
107
+ if(szprev)
108
+ delete[] szprev;
109
+ return *this;
110
+ }
111
+
112
+ szptr& szptr::operator += (const szptr& cszptr)
113
+ {
114
+ if(!&cszptr) return *this;
115
+ if(!cszptr.strlen()) return *this;
116
+
117
+ char *szprev = sz;
118
+ sz = new char[strlen()+cszptr.strlen()+4];
119
+ if(szprev)
120
+ {
121
+ strcpy(sz, szprev);
122
+ delete[] szprev;
123
+ }
124
+ else
125
+ sz[0] = '\0';
126
+
127
+ strcat(sz, cszptr);
128
+ return *this;
129
+ }
130
+
131
+ szptr& szptr::TrimRight()
132
+ {
133
+ if (NULL== this->sz)
134
+ return *this;
135
+ char* lpsz = this->sz;
136
+ char* lpszLast = NULL;
137
+
138
+ while (*lpsz != '\0')
139
+ {
140
+ if (*lpsz == ' ')
141
+ {
142
+ if (lpszLast == NULL)
143
+ lpszLast = lpsz;
144
+ }
145
+ else
146
+ lpszLast = NULL;
147
+ lpsz = ((char*)lpsz)+1;
148
+ }
149
+
150
+ if (lpszLast != NULL)
151
+ {
152
+ *lpszLast = '\0';
153
+ }
154
+ return *this;
155
+ }
156
+
157
+ szptr& szptr::TrimLeft()
158
+ {
159
+ if (NULL== this->sz)
160
+ return *this;
161
+ char* lpsz = this->sz;
162
+ int nLen = (int)::strlen(sz);
163
+ while ((*lpsz==' '))
164
+ lpsz = ((char*)lpsz)+1;
165
+
166
+ if (lpsz != sz)
167
+ {
168
+ int nDataLength = (int)nLen - (int)(lpsz - sz);
169
+ memmove(sz, lpsz, (nDataLength+1)*sizeof(char));
170
+ }
171
+ return *this;
172
+ }
173
+
174
+ static char *dwordFromBuf(DWORD *wMember, char *szNextElemBufPtr)
175
+ {
176
+ *wMember = SwitchIndian(*((DWORD*)szNextElemBufPtr));
177
+ return (szNextElemBufPtr+sizeof(DWORD));
178
+ }
179
+
180
+ static char *wordFromBuf(WORD *wMember, char *szNextElemBufPtr)
181
+ {
182
+ *wMember = SwitchIndian(*((WORD*)szNextElemBufPtr));
183
+ return (szNextElemBufPtr+sizeof(WORD));
184
+ }
185
+
186
+ static char *dwordToBuf(char *szNextElemBufPtr, DWORD wMember)
187
+ {
188
+ *((DWORD*)szNextElemBufPtr) = wMember;
189
+ return (szNextElemBufPtr+sizeof(DWORD));
190
+ }
191
+
192
+ static char *wordToBuf(char *szNextElemBufPtr, WORD wMember)
193
+ {
194
+ *((WORD*)szNextElemBufPtr) = wMember;
195
+ return (szNextElemBufPtr+sizeof(WORD));
196
+ }
197
+
198
+
199
+ /**/
200
+ Keys::Keys()
201
+ :dwReserv(0)
202
+ {
203
+ memset(arwEKey, 0, (MAX_UNIT_PRECISION) * 2);
204
+ memset(arwNKey, 0, (MAX_UNIT_PRECISION) * 2);
205
+ wEKeyBase= wNKeyBase = 0;
206
+ }
207
+
208
+ Keys::Keys(const Keys& keysFrom)
209
+ {
210
+ dwReserv = keysFrom.dwReserv;
211
+ wEKeyBase= wNKeyBase = 0;
212
+ memcpy(arwEKey, keysFrom.arwEKey, (MAX_UNIT_PRECISION) * 2);
213
+ memcpy(arwNKey, keysFrom.arwEKey, (MAX_UNIT_PRECISION) * 2);
214
+ wEKeyBase = keysFrom.wEKeyBase;
215
+ wNKeyBase = keysFrom.wNKeyBase;
216
+ }
217
+
218
+ Keys& Keys::operator=(const Keys& keysFrom)
219
+ {
220
+ dwReserv = keysFrom.dwReserv;
221
+ memcpy(arwEKey, keysFrom.arwEKey, (MAX_UNIT_PRECISION) * 2);
222
+ memcpy(arwNKey, keysFrom.arwNKey, (MAX_UNIT_PRECISION) * 2);
223
+ wEKeyBase = keysFrom.wEKeyBase;
224
+ wNKeyBase = keysFrom.wNKeyBase;
225
+ return *this;
226
+ }
227
+
228
+ DWORD Keys::GetMembersSize()
229
+ {
230
+ return (
231
+ sizeof(dwReserv)
232
+ + GetKeyBaseB(arwEKey)
233
+ + GetKeyBaseB(arwNKey)
234
+ + sizeof(wEKeyBase)
235
+ + sizeof(wNKeyBase));
236
+ }
237
+
238
+ char *Keys::LoadMembers(char *BufPtr)
239
+ {
240
+ char *ptrNextMemb = dwordFromBuf(&dwReserv, BufPtr);
241
+
242
+ ptrNextMemb = wordFromBuf(&wEKeyBase, ptrNextMemb);
243
+ memcpy(arwEKey, ptrNextMemb, wEKeyBase);
244
+ for(WORD i=0;i<wEKeyBase/sizeof(arwEKey[0]);i++)
245
+ { arwEKey[i] = SwitchIndian(arwEKey[i]); }
246
+
247
+ ptrNextMemb += wEKeyBase;
248
+
249
+ ptrNextMemb = wordFromBuf(&wNKeyBase, ptrNextMemb);
250
+ memcpy(arwNKey, ptrNextMemb, wNKeyBase);
251
+ for(unsigned int i=0;i<wNKeyBase/sizeof(arwNKey[0]);i++)
252
+ { arwNKey[i] = SwitchIndian(arwNKey[i]); }
253
+
254
+ ptrNextMemb += wNKeyBase;
255
+
256
+ return ptrNextMemb;
257
+ }
258
+
259
+ char *Keys::SaveMembers(char *BufPtr)
260
+ {
261
+ char *ptrNextMemb = dwordToBuf(BufPtr, dwReserv);
262
+
263
+ wEKeyBase = GetKeyBaseB(arwEKey);
264
+ ptrNextMemb = wordToBuf(ptrNextMemb, wEKeyBase);
265
+ memcpy(ptrNextMemb, arwEKey, wEKeyBase);
266
+ ptrNextMemb += wEKeyBase;
267
+
268
+ wNKeyBase = GetKeyBaseB(arwNKey);
269
+ ptrNextMemb = wordToBuf(ptrNextMemb, wNKeyBase);
270
+ memcpy(ptrNextMemb, arwNKey, wNKeyBase);
271
+ ptrNextMemb += wNKeyBase;
272
+
273
+ return ptrNextMemb;
274
+ }
275
+
276
+
277
+ void Keys::RecalcBase()
278
+ {
279
+ wEKeyBase = GetKeyBaseB(arwEKey);
280
+ wNKeyBase = GetKeyBaseB(arwNKey);
281
+ }
282
+
283
+ int Keys::LoadFromBuffer(const char *Buf, DWORD dwBufLen)
284
+ {
285
+ if(dwBufLen < KeyFileFormat::sizeof_header)
286
+ return _CMDLOAD_ERR_BUF_LEN_;
287
+
288
+ KeyFileFormat *keyFmt = (KeyFileFormat *)Buf;
289
+ DWORD ardwRecievedCRC[4], ardwCheckedCRC[4], i;
290
+
291
+ if(dwBufLen-2*sizeof(DWORD) >= SwitchIndian(keyFmt->dwLenBuf))
292
+ {
293
+ for(i=0; i<4; i++)
294
+ ardwRecievedCRC[i] = SwitchIndian(keyFmt->dwCRC[i]);
295
+ for(i=0; i<4; i++) keyFmt->dwCRC[i] = 0;
296
+ CountCrcMD4(ardwCheckedCRC, Buf, SwitchIndian(keyFmt->dwLenBuf)+KeyFileFormat::sizeof_header);
297
+
298
+ for(i=0; i<4; i++) keyFmt->dwCRC[i] = SwitchIndian(ardwRecievedCRC[i]);
299
+
300
+ bool bCrcGood = true;
301
+ for(i=0; i<4; i++)
302
+ if(ardwCheckedCRC[i]!=ardwRecievedCRC[i])
303
+ {
304
+ bCrcGood = false;
305
+ break;
306
+ }
307
+
308
+ if(bCrcGood)
309
+ {
310
+ LoadMembers(keyFmt->ptrBuffer);
311
+ return 0;
312
+ }
313
+ else
314
+ return _CMDLOAD_ERR_CMD_CRC_;
315
+ }
316
+ else
317
+ return _CMDLOAD_ERR_BUF_LEN_;
318
+ }
319
+
320
+ int Keys::SaveIntoBuffer(char **ptrAllocBuf, DWORD *dwBufLen)
321
+ {
322
+ char *Buf;
323
+ KeyFileFormat *cmdFmt;
324
+ DWORD dwMembersSize;
325
+ DWORD dwBufSize, i;
326
+ BOOL bRC = false;
327
+
328
+ dwMembersSize = GetMembersSize();
329
+
330
+ dwBufSize = dwMembersSize+KeyFileFormat::sizeof_header;
331
+ Buf = new char[dwBufSize];
332
+ memset(Buf, 0, dwBufSize); // Clear for Trail...
333
+ cmdFmt = (KeyFileFormat *)Buf;
334
+ if(Buf)
335
+ {
336
+ char *BufMemb;
337
+ BufMemb = cmdFmt->ptrBuffer;
338
+
339
+ if(SaveMembers(BufMemb))
340
+ {
341
+ cmdFmt->wReserved1 = 0x81;
342
+ cmdFmt->wSignFlag = 0;
343
+ cmdFmt->dwLenBuf = dwMembersSize;
344
+
345
+ for(i=0; i<4; i++) cmdFmt->dwCRC[i] = 0;
346
+ CountCrcMD4(cmdFmt->dwCRC, Buf, dwBufSize); //*((WORD *)(Buf+sizeof(WORD)))=
347
+ *dwBufLen = dwBufSize;
348
+ *ptrAllocBuf = Buf;
349
+ bRC = true;
350
+ }
351
+ }
352
+ else
353
+ bRC = false; // NOT_ENOUGH_MEMORY
354
+
355
+ return bRC;
356
+ }
357
+
358
+ bool Keys::CountCrcMD4(DWORD *dwCRC, const char *Buf, DWORD dwBufLenBytes)
359
+ {
360
+ int b,bitcount;
361
+ MDstruct MD;
362
+
363
+ MDbegin(&MD);
364
+ for(b=0,bitcount=512; (unsigned int)b<dwBufLenBytes/64+1; b++)
365
+ {
366
+ if((unsigned int)b==dwBufLenBytes/64) bitcount = (dwBufLenBytes%64)<<3;
367
+ MDupdate(&MD, (unsigned char *)(Buf+b*64), bitcount);
368
+ }
369
+ MDupdate(&MD, (unsigned char *)Buf, 0);
370
+
371
+ for(b=0; b<4; b++) dwCRC[b] = MD.buffer[b];
372
+
373
+ return true;
374
+ }
375
+
376
+ bool us2sz(const unsigned short *buf, int len, char *szBuffer)
377
+ {
378
+ char tmp[5];
379
+ szBuffer[0] = '\0';
380
+
381
+ for(int i=0;i<len;i++)
382
+ {
383
+ sprintf(tmp, "%04x", buf[i]);
384
+ strcat(szBuffer, tmp);
385
+ }
386
+ return true;
387
+ }
388
+
389
+ char stohb(char s)
390
+ {
391
+ if ( s>='0' && s<='9') return (s-'0');
392
+ else
393
+ if ( s>='A' && s<='F') return (s-'A'+0xA);
394
+ else
395
+ if ( s>='a' && s<='f') return (s-'a'+0xA);
396
+ return 0;
397
+ }
398
+
399
+ bool sz2us(const char *szBuffer, unsigned short *usBuf)
400
+ {
401
+ const char* p = szBuffer;
402
+ int l = (int)strlen(szBuffer);
403
+ unsigned short cell = 0;
404
+ for(int i=0,k=0; i<l; i+=4) {
405
+ cell = 0;
406
+ cell = stohb(*p++);
407
+ cell <<= 4;
408
+ cell |= stohb(*p++);
409
+ cell <<= 4;
410
+ cell |= stohb(*p++);
411
+ cell <<= 4;
412
+ cell |= stohb(*p++);
413
+ usBuf[k++] = cell;
414
+ }
415
+ return true;
416
+ }
417
+ //----