webmoney 0.0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +35 -0
- data/ext/wmsigner/base64.cpp +144 -0
- data/ext/wmsigner/base64.h +48 -0
- data/ext/wmsigner/cmdbase.cpp +417 -0
- data/ext/wmsigner/cmdbase.h +111 -0
- data/ext/wmsigner/crypto.cpp +155 -0
- data/ext/wmsigner/crypto.h +17 -0
- data/ext/wmsigner/extconf.rb +16 -0
- data/ext/wmsigner/md4.cpp +192 -0
- data/ext/wmsigner/md4.h +41 -0
- data/ext/wmsigner/rsalib1.cpp +838 -0
- data/ext/wmsigner/rsalib1.h +81 -0
- data/ext/wmsigner/signer.cpp +315 -0
- data/ext/wmsigner/signer.h +63 -0
- data/ext/wmsigner/stdafx.cpp +8 -0
- data/ext/wmsigner/stdafx.h +33 -0
- data/ext/wmsigner/wmsigner.cpp +119 -0
- data/lib/WebMoneyCA.crt +90 -0
- data/lib/messenger.rb +37 -0
- data/lib/passport.rb +44 -0
- data/lib/webmoney.rb +237 -0
- data/lib/wmid.rb +14 -0
- data/rakefile +63 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/unit/messenger_spec.rb +23 -0
- data/spec/unit/passport_spec.rb +47 -0
- data/spec/unit/signer_spec.rb +35 -0
- data/spec/unit/time_spec.rb +14 -0
- data/spec/unit/webmoney_spec.rb +111 -0
- data/spec/unit/wmid_spec.rb +30 -0
- data/tools/rakehelp.rb +117 -0
- metadata +102 -0
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
|
+
//----
|