Merge pull request #12 from philsmd/master
[hashcat.git] / src / shared.c
1 /**
2 * Author......: Jens Steube <jens.steube@gmail.com>
3 * License.....: MIT
4 */
5
6 #include <shared.h>
7 #include <limits.h>
8
9 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
10 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
11
12 /**
13 * tuning tools
14 */
15
16 #ifdef _CUDA
17 #define GET_ACCEL(x) GPU_ACCEL_NV_ ## x
18 #define GET_LOOPS(x) GPU_LOOPS_NV_ ## x
19 #elif _OCL
20 #define GET_ACCEL(x) GPU_ACCEL_AMD_ ## x
21 #define GET_LOOPS(x) GPU_LOOPS_AMD_ ## x
22 #endif
23
24 /**
25 * bit rotate
26 */
27
28 uint32_t rotl32 (const uint32_t a, const uint n)
29 {
30 return ((a << n) | (a >> (32 - n)));
31 }
32
33 uint32_t rotr32 (const uint32_t a, const uint n)
34 {
35 return ((a >> n) | (a << (32 - n)));
36 }
37
38 uint64_t rotl64 (const uint64_t a, const uint n)
39 {
40 return ((a << n) | (a >> (64 - n)));
41 }
42
43 uint64_t rotr64 (const uint64_t a, const uint n)
44 {
45 return ((a >> n) | (a << (64 - n)));
46 }
47
48 /**
49 * ciphers for use on cpu
50 */
51
52 #include "cpu-des.c"
53 #include "cpu-aes.c"
54
55 /**
56 * hashes for use on cpu
57 */
58
59 #include "cpu-md5.c"
60 #include "cpu-sha256.c"
61
62 /**
63 * logging
64 */
65
66 int last_len = 0;
67
68 void log_final (FILE *fp, const char *fmt, va_list ap)
69 {
70 if (last_len)
71 {
72 fputc ('\r', fp);
73
74 for (int i = 0; i < last_len; i++)
75 {
76 fputc (' ', fp);
77 }
78
79 fputc ('\r', fp);
80 }
81
82 char s[4096];
83
84 int max_len = (int) sizeof (s);
85
86 int len = vsnprintf (s, max_len, fmt, ap);
87
88 if (len > max_len) len = max_len;
89
90 fwrite (s, len, 1, fp);
91
92 fflush (fp);
93
94 last_len = len;
95 }
96
97 void log_out_nn (FILE *fp, const char *fmt, ...)
98 {
99 if (SUPPRESS_OUTPUT) return;
100
101 va_list ap;
102
103 va_start (ap, fmt);
104
105 log_final (fp, fmt, ap);
106
107 va_end (ap);
108 }
109
110 void log_info_nn (const char *fmt, ...)
111 {
112 if (SUPPRESS_OUTPUT) return;
113
114 va_list ap;
115
116 va_start (ap, fmt);
117
118 log_final (stdout, fmt, ap);
119
120 va_end (ap);
121 }
122
123 void log_error_nn (const char *fmt, ...)
124 {
125 if (SUPPRESS_OUTPUT) return;
126
127 va_list ap;
128
129 va_start (ap, fmt);
130
131 log_final (stderr, fmt, ap);
132
133 va_end (ap);
134 }
135
136 void log_out (FILE *fp, const char *fmt, ...)
137 {
138 if (SUPPRESS_OUTPUT) return;
139
140 va_list ap;
141
142 va_start (ap, fmt);
143
144 log_final (fp, fmt, ap);
145
146 va_end (ap);
147
148 fputc ('\n', fp);
149
150 last_len = 0;
151 }
152
153 void log_info (const char *fmt, ...)
154 {
155 if (SUPPRESS_OUTPUT) return;
156
157 va_list ap;
158
159 va_start (ap, fmt);
160
161 log_final (stdout, fmt, ap);
162
163 va_end (ap);
164
165 fputc ('\n', stdout);
166
167 last_len = 0;
168 }
169
170 void log_error (const char *fmt, ...)
171 {
172 if (SUPPRESS_OUTPUT) return;
173
174 fputc ('\n', stderr);
175 fputc ('\n', stderr);
176
177 va_list ap;
178
179 va_start (ap, fmt);
180
181 log_final (stderr, fmt, ap);
182
183 va_end (ap);
184
185 fputc ('\n', stderr);
186 fputc ('\n', stderr);
187
188 last_len = 0;
189 }
190
191 /**
192 * converter
193 */
194
195 uint byte_swap_32 (const uint n)
196 {
197 return (n & 0xff000000) >> 24
198 | (n & 0x00ff0000) >> 8
199 | (n & 0x0000ff00) << 8
200 | (n & 0x000000ff) << 24;
201 }
202
203 uint64_t byte_swap_64 (const uint64_t n)
204 {
205 return (n & 0xff00000000000000ULL) >> 56
206 | (n & 0x00ff000000000000ULL) >> 40
207 | (n & 0x0000ff0000000000ULL) >> 24
208 | (n & 0x000000ff00000000ULL) >> 8
209 | (n & 0x00000000ff000000ULL) << 8
210 | (n & 0x0000000000ff0000ULL) << 24
211 | (n & 0x000000000000ff00ULL) << 40
212 | (n & 0x00000000000000ffULL) << 56;
213 }
214
215 char int_to_base32 (const char c)
216 {
217 static const char tbl[0x20] =
218 {
219 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
220 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
221 };
222
223 return tbl[(const uint8_t) c];
224 }
225
226 char base32_to_int (const char c)
227 {
228 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
229 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
230
231 return 0;
232 }
233
234 char int_to_itoa32 (const char c)
235 {
236 static const char tbl[0x20] =
237 {
238 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
239 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
240 };
241
242 return tbl[(const uint8_t) c];
243 }
244
245 char itoa32_to_int (const char c)
246 {
247 if ((c >= '0') && (c <= '9')) return c - '0';
248 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
249
250 return 0;
251 }
252
253 char int_to_itoa64 (const char c)
254 {
255 static const char tbl[0x40] =
256 {
257 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
258 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
259 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
260 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
261 };
262
263 return tbl[(const uint8_t) c];
264 }
265
266 char itoa64_to_int (const char c)
267 {
268 static const char tbl[0x100] =
269 {
270 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
271 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
272 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
273 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
274 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
275 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
276 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
277 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
278 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
279 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
280 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
281 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
282 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
283 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
284 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
285 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
286 };
287
288 return tbl[(const uint8_t) c];
289 }
290
291 char int_to_base64 (const char c)
292 {
293 static const char tbl[0x40] =
294 {
295 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
296 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
297 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
298 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
299 };
300
301 return tbl[(const uint8_t) c];
302 }
303
304 char base64_to_int (const char c)
305 {
306 static const char tbl[0x100] =
307 {
308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
311 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
313 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
315 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
324 };
325
326 return tbl[(const uint8_t) c];
327 }
328
329 char int_to_bf64 (const char c)
330 {
331 static const char tbl[0x40] =
332 {
333 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
334 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
335 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
336 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
337 };
338
339 return tbl[(const uint8_t) c];
340 }
341
342 char bf64_to_int (const char c)
343 {
344 static const char tbl[0x100] =
345 {
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
349 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
351 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
353 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362 };
363
364 return tbl[(const uint8_t) c];
365 }
366
367 char int_to_lotus64 (const char c)
368 {
369 if (c < 10) return '0' + c;
370 else if (c < 36) return 'A' + c - 10;
371 else if (c < 62) return 'a' + c - 36;
372 else if (c == 62) return '+';
373 else if (c == 63) return '/';
374
375 return 0;
376 }
377
378 char lotus64_to_int (const char c)
379 {
380 if ((c >= '0') && (c <= '9')) return c - '0';
381 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
382 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
383 else if (c == '+') return 62;
384 else if (c == '/') return 63;
385 else
386
387 return 0;
388 }
389
390 int base32_decode (char (*f) (const char), char *in_buf, int in_len, char *out_buf)
391 {
392 char *in_ptr = in_buf;
393
394 char *out_ptr = out_buf;
395
396 for (int i = 0; i < in_len; i += 8)
397 {
398 char out_val0 = f (in_ptr[0] & 0x7f);
399 char out_val1 = f (in_ptr[1] & 0x7f);
400 char out_val2 = f (in_ptr[2] & 0x7f);
401 char out_val3 = f (in_ptr[3] & 0x7f);
402 char out_val4 = f (in_ptr[4] & 0x7f);
403 char out_val5 = f (in_ptr[5] & 0x7f);
404 char out_val6 = f (in_ptr[6] & 0x7f);
405 char out_val7 = f (in_ptr[7] & 0x7f);
406
407 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
408 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
409 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
410 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
411 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
412
413 in_ptr += 8;
414 out_ptr += 5;
415 }
416
417 for (int i = 0; i < in_len; i++)
418 {
419 if (in_buf[i] != '=') continue;
420
421 in_len = i;
422 }
423
424 int out_len = (in_len * 5) / 8;
425
426 return out_len;
427 }
428
429 int base32_encode (char (*f) (const char), char *in_buf, int in_len, char *out_buf)
430 {
431 char *in_ptr = in_buf;
432
433 char *out_ptr = out_buf;
434
435 for (int i = 0; i < in_len; i += 5)
436 {
437 char out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
438 char out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
439 char out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
440 char out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
441 char out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
442 char out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
443 char out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
444 char out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
445
446 out_ptr[0] = out_val0 & 0x7f;
447 out_ptr[1] = out_val1 & 0x7f;
448 out_ptr[2] = out_val2 & 0x7f;
449 out_ptr[3] = out_val3 & 0x7f;
450 out_ptr[4] = out_val4 & 0x7f;
451 out_ptr[5] = out_val5 & 0x7f;
452 out_ptr[6] = out_val6 & 0x7f;
453 out_ptr[7] = out_val7 & 0x7f;
454
455 in_ptr += 5;
456 out_ptr += 8;
457 }
458
459 int out_len = (in_len * 8) / 5;
460
461 for (int i = 0; i < (7 - (in_len % 7)); i++)
462 {
463 out_len++;
464
465 out_buf[out_len] = '=';
466 }
467
468 return out_len;
469 }
470
471 int base64_decode (char (*f) (const char), char *in_buf, int in_len, char *out_buf)
472 {
473 char *in_ptr = in_buf;
474
475 char *out_ptr = out_buf;
476
477 for (int i = 0; i < in_len; i += 4)
478 {
479 char out_val0 = f (in_ptr[0] & 0x7f);
480 char out_val1 = f (in_ptr[1] & 0x7f);
481 char out_val2 = f (in_ptr[2] & 0x7f);
482 char out_val3 = f (in_ptr[3] & 0x7f);
483
484 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
485 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
486 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
487
488 in_ptr += 4;
489 out_ptr += 3;
490 }
491
492 for (int i = 0; i < in_len; i++)
493 {
494 if (in_buf[i] != '=') continue;
495
496 in_len = i;
497 }
498
499 int out_len = (in_len * 6) / 8;
500
501 return out_len;
502 }
503
504 int base64_encode (char (*f) (const char), char *in_buf, int in_len, char *out_buf)
505 {
506 char *in_ptr = in_buf;
507
508 char *out_ptr = out_buf;
509
510 for (int i = 0; i < in_len; i += 3)
511 {
512 char out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
513 char out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
514 char out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
515 char out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
516
517 out_ptr[0] = out_val0 & 0x7f;
518 out_ptr[1] = out_val1 & 0x7f;
519 out_ptr[2] = out_val2 & 0x7f;
520 out_ptr[3] = out_val3 & 0x7f;
521
522 in_ptr += 3;
523 out_ptr += 4;
524 }
525
526 int out_len = (in_len * 8) / 6;
527
528 for (int i = 0; i < (3 - (in_len % 3)); i++)
529 {
530 out_len++;
531
532 out_buf[out_len] = '=';
533 }
534
535 return out_len;
536 }
537
538 static void AES128_decrypt_cbc (const uint key[4], const uint iv[4], const uint in[16], uint out[16])
539 {
540 AES_KEY skey;
541
542 AES_set_decrypt_key ((unsigned char *) key, 128, &skey);
543
544 uint _iv[4];
545
546 _iv[0] = iv[0];
547 _iv[1] = iv[1];
548 _iv[2] = iv[2];
549 _iv[3] = iv[3];
550
551 for (int i = 0; i < 16; i += 4)
552 {
553 uint _in[4];
554 uint _out[4];
555
556 _in[0] = in[i + 0];
557 _in[1] = in[i + 1];
558 _in[2] = in[i + 2];
559 _in[3] = in[i + 3];
560
561 AES_decrypt (&skey, (char *) _in, (char *) _out);
562
563 _out[0] ^= _iv[0];
564 _out[1] ^= _iv[1];
565 _out[2] ^= _iv[2];
566 _out[3] ^= _iv[3];
567
568 out[i + 0] = _out[0];
569 out[i + 1] = _out[1];
570 out[i + 2] = _out[2];
571 out[i + 3] = _out[3];
572
573 _iv[0] = _in[0];
574 _iv[1] = _in[1];
575 _iv[2] = _in[2];
576 _iv[3] = _in[3];
577 }
578 }
579
580 static void juniper_decrypt_hash (char *in, char *out)
581 {
582 // base64 decode
583
584 char base64_buf[100];
585
586 memset (base64_buf, 0, sizeof (base64_buf));
587
588 base64_decode (base64_to_int, in, DISPLAY_LEN_MIN_501, base64_buf);
589
590 // iv stuff
591
592 uint juniper_iv[4] = { 0 };
593
594 memcpy (juniper_iv, base64_buf, 12);
595
596 memcpy (out, juniper_iv, 12);
597
598 // reversed key
599
600 uint juniper_key[4];
601
602 juniper_key[0] = byte_swap_32 (0xa6707a7e);
603 juniper_key[1] = byte_swap_32 (0x8df91059);
604 juniper_key[2] = byte_swap_32 (0xdea70ae5);
605 juniper_key[3] = byte_swap_32 (0x2f9c2442);
606
607 // AES decrypt
608
609 uint *in_ptr = (uint *) (base64_buf + 12);
610 uint *out_ptr = (uint *) (out + 12);
611
612 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
613 }
614
615 uint is_valid_hex_char (const char c)
616 {
617 if ((c >= '0') && (c <= '9')) return 1;
618 if ((c >= 'A') && (c <= 'F')) return 1;
619 if ((c >= 'a') && (c <= 'f')) return 1;
620
621 return 0;
622 }
623
624 char hex_convert (const char c)
625 {
626 return (c & 15) + (c >> 6) * 9;
627 }
628
629 char hex_to_char (const char hex[2])
630 {
631 char v = 0;
632
633 v |= (hex_convert (hex[1]) << 0);
634 v |= (hex_convert (hex[0]) << 4);
635
636 return (v);
637 }
638
639 uint hex_to_uint (const char hex[8])
640 {
641 uint v = 0;
642
643 v |= hex_convert (hex[7]) << 0;
644 v |= hex_convert (hex[6]) << 4;
645 v |= hex_convert (hex[5]) << 8;
646 v |= hex_convert (hex[4]) << 12;
647 v |= hex_convert (hex[3]) << 16;
648 v |= hex_convert (hex[2]) << 20;
649 v |= hex_convert (hex[1]) << 24;
650 v |= hex_convert (hex[0]) << 28;
651
652 return (v);
653 }
654
655 uint64_t hex_to_uint64_t (const char hex[16])
656 {
657 uint64_t v = 0;
658
659 v |= ((uint64_t) hex_convert (hex[15]) << 0);
660 v |= ((uint64_t) hex_convert (hex[14]) << 4);
661 v |= ((uint64_t) hex_convert (hex[13]) << 8);
662 v |= ((uint64_t) hex_convert (hex[12]) << 12);
663 v |= ((uint64_t) hex_convert (hex[11]) << 16);
664 v |= ((uint64_t) hex_convert (hex[10]) << 20);
665 v |= ((uint64_t) hex_convert (hex[ 9]) << 24);
666 v |= ((uint64_t) hex_convert (hex[ 8]) << 28);
667 v |= ((uint64_t) hex_convert (hex[ 7]) << 32);
668 v |= ((uint64_t) hex_convert (hex[ 6]) << 36);
669 v |= ((uint64_t) hex_convert (hex[ 5]) << 40);
670 v |= ((uint64_t) hex_convert (hex[ 4]) << 44);
671 v |= ((uint64_t) hex_convert (hex[ 3]) << 48);
672 v |= ((uint64_t) hex_convert (hex[ 2]) << 52);
673 v |= ((uint64_t) hex_convert (hex[ 1]) << 56);
674 v |= ((uint64_t) hex_convert (hex[ 0]) << 60);
675
676 return (v);
677 }
678
679 void bin_to_hex_lower (uint v, char hex[8])
680 {
681 hex[0] = v >> 28 & 15;
682 hex[1] = v >> 24 & 15;
683 hex[2] = v >> 20 & 15;
684 hex[3] = v >> 16 & 15;
685 hex[4] = v >> 12 & 15;
686 hex[5] = v >> 8 & 15;
687 hex[6] = v >> 4 & 15;
688 hex[7] = v >> 0 & 15;
689
690 uint add;
691
692 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
693 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
694 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
695 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
696 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
697 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
698 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
699 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
700 }
701
702 void phpass_decode (unsigned char digest[16], unsigned char buf[22])
703 {
704 int l;
705
706 l = itoa64_to_int (buf[ 0]) << 0;
707 l |= itoa64_to_int (buf[ 1]) << 6;
708 l |= itoa64_to_int (buf[ 2]) << 12;
709 l |= itoa64_to_int (buf[ 3]) << 18;
710
711 digest[ 0] = (l >> 0) & 0xff;
712 digest[ 1] = (l >> 8) & 0xff;
713 digest[ 2] = (l >> 16) & 0xff;
714
715 l = itoa64_to_int (buf[ 4]) << 0;
716 l |= itoa64_to_int (buf[ 5]) << 6;
717 l |= itoa64_to_int (buf[ 6]) << 12;
718 l |= itoa64_to_int (buf[ 7]) << 18;
719
720 digest[ 3] = (l >> 0) & 0xff;
721 digest[ 4] = (l >> 8) & 0xff;
722 digest[ 5] = (l >> 16) & 0xff;
723
724 l = itoa64_to_int (buf[ 8]) << 0;
725 l |= itoa64_to_int (buf[ 9]) << 6;
726 l |= itoa64_to_int (buf[10]) << 12;
727 l |= itoa64_to_int (buf[11]) << 18;
728
729 digest[ 6] = (l >> 0) & 0xff;
730 digest[ 7] = (l >> 8) & 0xff;
731 digest[ 8] = (l >> 16) & 0xff;
732
733 l = itoa64_to_int (buf[12]) << 0;
734 l |= itoa64_to_int (buf[13]) << 6;
735 l |= itoa64_to_int (buf[14]) << 12;
736 l |= itoa64_to_int (buf[15]) << 18;
737
738 digest[ 9] = (l >> 0) & 0xff;
739 digest[10] = (l >> 8) & 0xff;
740 digest[11] = (l >> 16) & 0xff;
741
742 l = itoa64_to_int (buf[16]) << 0;
743 l |= itoa64_to_int (buf[17]) << 6;
744 l |= itoa64_to_int (buf[18]) << 12;
745 l |= itoa64_to_int (buf[19]) << 18;
746
747 digest[12] = (l >> 0) & 0xff;
748 digest[13] = (l >> 8) & 0xff;
749 digest[14] = (l >> 16) & 0xff;
750
751 l = itoa64_to_int (buf[20]) << 0;
752 l |= itoa64_to_int (buf[21]) << 6;
753
754 digest[15] = (l >> 0) & 0xff;
755 }
756
757 void phpass_encode (unsigned char digest[16], unsigned char buf[22])
758 {
759 int l;
760
761 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
762
763 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
764 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
765 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
766 buf[ 3] = int_to_itoa64 (l & 0x3f);
767
768 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
769
770 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
771 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
772 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
773 buf[ 7] = int_to_itoa64 (l & 0x3f);
774
775 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
776
777 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
778 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
779 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
780 buf[11] = int_to_itoa64 (l & 0x3f);
781
782 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
783
784 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
785 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
786 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
787 buf[15] = int_to_itoa64 (l & 0x3f);
788
789 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
790
791 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
792 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
793 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
794 buf[19] = int_to_itoa64 (l & 0x3f);
795
796 l = (digest[15] << 0);
797
798 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
799 buf[21] = int_to_itoa64 (l & 0x3f);
800 }
801
802 void md5crypt_decode (unsigned char digest[16], unsigned char buf[22])
803 {
804 int l;
805
806 l = itoa64_to_int (buf[ 0]) << 0;
807 l |= itoa64_to_int (buf[ 1]) << 6;
808 l |= itoa64_to_int (buf[ 2]) << 12;
809 l |= itoa64_to_int (buf[ 3]) << 18;
810
811 digest[ 0] = (l >> 16) & 0xff;
812 digest[ 6] = (l >> 8) & 0xff;
813 digest[12] = (l >> 0) & 0xff;
814
815 l = itoa64_to_int (buf[ 4]) << 0;
816 l |= itoa64_to_int (buf[ 5]) << 6;
817 l |= itoa64_to_int (buf[ 6]) << 12;
818 l |= itoa64_to_int (buf[ 7]) << 18;
819
820 digest[ 1] = (l >> 16) & 0xff;
821 digest[ 7] = (l >> 8) & 0xff;
822 digest[13] = (l >> 0) & 0xff;
823
824 l = itoa64_to_int (buf[ 8]) << 0;
825 l |= itoa64_to_int (buf[ 9]) << 6;
826 l |= itoa64_to_int (buf[10]) << 12;
827 l |= itoa64_to_int (buf[11]) << 18;
828
829 digest[ 2] = (l >> 16) & 0xff;
830 digest[ 8] = (l >> 8) & 0xff;
831 digest[14] = (l >> 0) & 0xff;
832
833 l = itoa64_to_int (buf[12]) << 0;
834 l |= itoa64_to_int (buf[13]) << 6;
835 l |= itoa64_to_int (buf[14]) << 12;
836 l |= itoa64_to_int (buf[15]) << 18;
837
838 digest[ 3] = (l >> 16) & 0xff;
839 digest[ 9] = (l >> 8) & 0xff;
840 digest[15] = (l >> 0) & 0xff;
841
842 l = itoa64_to_int (buf[16]) << 0;
843 l |= itoa64_to_int (buf[17]) << 6;
844 l |= itoa64_to_int (buf[18]) << 12;
845 l |= itoa64_to_int (buf[19]) << 18;
846
847 digest[ 4] = (l >> 16) & 0xff;
848 digest[10] = (l >> 8) & 0xff;
849 digest[ 5] = (l >> 0) & 0xff;
850
851 l = itoa64_to_int (buf[20]) << 0;
852 l |= itoa64_to_int (buf[21]) << 6;
853
854 digest[11] = (l >> 0) & 0xff;
855 }
856
857 void md5crypt_encode (unsigned char digest[16], unsigned char buf[22])
858 {
859 int l;
860
861 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
862
863 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
864 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
865 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
866 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
867
868 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
869
870 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
871 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
872 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
873 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
874
875 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
876
877 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
878 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
879 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
880 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
881
882 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
883
884 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
885 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
886 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
887 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
888
889 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
890
891 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
892 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
893 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
894 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
895
896 l = (digest[11] << 0);
897
898 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
899 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
900 }
901
902 void sha512crypt_decode (unsigned char digest[64], unsigned char buf[86])
903 {
904 int l;
905
906 l = itoa64_to_int (buf[ 0]) << 0;
907 l |= itoa64_to_int (buf[ 1]) << 6;
908 l |= itoa64_to_int (buf[ 2]) << 12;
909 l |= itoa64_to_int (buf[ 3]) << 18;
910
911 digest[ 0] = (l >> 16) & 0xff;
912 digest[21] = (l >> 8) & 0xff;
913 digest[42] = (l >> 0) & 0xff;
914
915 l = itoa64_to_int (buf[ 4]) << 0;
916 l |= itoa64_to_int (buf[ 5]) << 6;
917 l |= itoa64_to_int (buf[ 6]) << 12;
918 l |= itoa64_to_int (buf[ 7]) << 18;
919
920 digest[22] = (l >> 16) & 0xff;
921 digest[43] = (l >> 8) & 0xff;
922 digest[ 1] = (l >> 0) & 0xff;
923
924 l = itoa64_to_int (buf[ 8]) << 0;
925 l |= itoa64_to_int (buf[ 9]) << 6;
926 l |= itoa64_to_int (buf[10]) << 12;
927 l |= itoa64_to_int (buf[11]) << 18;
928
929 digest[44] = (l >> 16) & 0xff;
930 digest[ 2] = (l >> 8) & 0xff;
931 digest[23] = (l >> 0) & 0xff;
932
933 l = itoa64_to_int (buf[12]) << 0;
934 l |= itoa64_to_int (buf[13]) << 6;
935 l |= itoa64_to_int (buf[14]) << 12;
936 l |= itoa64_to_int (buf[15]) << 18;
937
938 digest[ 3] = (l >> 16) & 0xff;
939 digest[24] = (l >> 8) & 0xff;
940 digest[45] = (l >> 0) & 0xff;
941
942 l = itoa64_to_int (buf[16]) << 0;
943 l |= itoa64_to_int (buf[17]) << 6;
944 l |= itoa64_to_int (buf[18]) << 12;
945 l |= itoa64_to_int (buf[19]) << 18;
946
947 digest[25] = (l >> 16) & 0xff;
948 digest[46] = (l >> 8) & 0xff;
949 digest[ 4] = (l >> 0) & 0xff;
950
951 l = itoa64_to_int (buf[20]) << 0;
952 l |= itoa64_to_int (buf[21]) << 6;
953 l |= itoa64_to_int (buf[22]) << 12;
954 l |= itoa64_to_int (buf[23]) << 18;
955
956 digest[47] = (l >> 16) & 0xff;
957 digest[ 5] = (l >> 8) & 0xff;
958 digest[26] = (l >> 0) & 0xff;
959
960 l = itoa64_to_int (buf[24]) << 0;
961 l |= itoa64_to_int (buf[25]) << 6;
962 l |= itoa64_to_int (buf[26]) << 12;
963 l |= itoa64_to_int (buf[27]) << 18;
964
965 digest[ 6] = (l >> 16) & 0xff;
966 digest[27] = (l >> 8) & 0xff;
967 digest[48] = (l >> 0) & 0xff;
968
969 l = itoa64_to_int (buf[28]) << 0;
970 l |= itoa64_to_int (buf[29]) << 6;
971 l |= itoa64_to_int (buf[30]) << 12;
972 l |= itoa64_to_int (buf[31]) << 18;
973
974 digest[28] = (l >> 16) & 0xff;
975 digest[49] = (l >> 8) & 0xff;
976 digest[ 7] = (l >> 0) & 0xff;
977
978 l = itoa64_to_int (buf[32]) << 0;
979 l |= itoa64_to_int (buf[33]) << 6;
980 l |= itoa64_to_int (buf[34]) << 12;
981 l |= itoa64_to_int (buf[35]) << 18;
982
983 digest[50] = (l >> 16) & 0xff;
984 digest[ 8] = (l >> 8) & 0xff;
985 digest[29] = (l >> 0) & 0xff;
986
987 l = itoa64_to_int (buf[36]) << 0;
988 l |= itoa64_to_int (buf[37]) << 6;
989 l |= itoa64_to_int (buf[38]) << 12;
990 l |= itoa64_to_int (buf[39]) << 18;
991
992 digest[ 9] = (l >> 16) & 0xff;
993 digest[30] = (l >> 8) & 0xff;
994 digest[51] = (l >> 0) & 0xff;
995
996 l = itoa64_to_int (buf[40]) << 0;
997 l |= itoa64_to_int (buf[41]) << 6;
998 l |= itoa64_to_int (buf[42]) << 12;
999 l |= itoa64_to_int (buf[43]) << 18;
1000
1001 digest[31] = (l >> 16) & 0xff;
1002 digest[52] = (l >> 8) & 0xff;
1003 digest[10] = (l >> 0) & 0xff;
1004
1005 l = itoa64_to_int (buf[44]) << 0;
1006 l |= itoa64_to_int (buf[45]) << 6;
1007 l |= itoa64_to_int (buf[46]) << 12;
1008 l |= itoa64_to_int (buf[47]) << 18;
1009
1010 digest[53] = (l >> 16) & 0xff;
1011 digest[11] = (l >> 8) & 0xff;
1012 digest[32] = (l >> 0) & 0xff;
1013
1014 l = itoa64_to_int (buf[48]) << 0;
1015 l |= itoa64_to_int (buf[49]) << 6;
1016 l |= itoa64_to_int (buf[50]) << 12;
1017 l |= itoa64_to_int (buf[51]) << 18;
1018
1019 digest[12] = (l >> 16) & 0xff;
1020 digest[33] = (l >> 8) & 0xff;
1021 digest[54] = (l >> 0) & 0xff;
1022
1023 l = itoa64_to_int (buf[52]) << 0;
1024 l |= itoa64_to_int (buf[53]) << 6;
1025 l |= itoa64_to_int (buf[54]) << 12;
1026 l |= itoa64_to_int (buf[55]) << 18;
1027
1028 digest[34] = (l >> 16) & 0xff;
1029 digest[55] = (l >> 8) & 0xff;
1030 digest[13] = (l >> 0) & 0xff;
1031
1032 l = itoa64_to_int (buf[56]) << 0;
1033 l |= itoa64_to_int (buf[57]) << 6;
1034 l |= itoa64_to_int (buf[58]) << 12;
1035 l |= itoa64_to_int (buf[59]) << 18;
1036
1037 digest[56] = (l >> 16) & 0xff;
1038 digest[14] = (l >> 8) & 0xff;
1039 digest[35] = (l >> 0) & 0xff;
1040
1041 l = itoa64_to_int (buf[60]) << 0;
1042 l |= itoa64_to_int (buf[61]) << 6;
1043 l |= itoa64_to_int (buf[62]) << 12;
1044 l |= itoa64_to_int (buf[63]) << 18;
1045
1046 digest[15] = (l >> 16) & 0xff;
1047 digest[36] = (l >> 8) & 0xff;
1048 digest[57] = (l >> 0) & 0xff;
1049
1050 l = itoa64_to_int (buf[64]) << 0;
1051 l |= itoa64_to_int (buf[65]) << 6;
1052 l |= itoa64_to_int (buf[66]) << 12;
1053 l |= itoa64_to_int (buf[67]) << 18;
1054
1055 digest[37] = (l >> 16) & 0xff;
1056 digest[58] = (l >> 8) & 0xff;
1057 digest[16] = (l >> 0) & 0xff;
1058
1059 l = itoa64_to_int (buf[68]) << 0;
1060 l |= itoa64_to_int (buf[69]) << 6;
1061 l |= itoa64_to_int (buf[70]) << 12;
1062 l |= itoa64_to_int (buf[71]) << 18;
1063
1064 digest[59] = (l >> 16) & 0xff;
1065 digest[17] = (l >> 8) & 0xff;
1066 digest[38] = (l >> 0) & 0xff;
1067
1068 l = itoa64_to_int (buf[72]) << 0;
1069 l |= itoa64_to_int (buf[73]) << 6;
1070 l |= itoa64_to_int (buf[74]) << 12;
1071 l |= itoa64_to_int (buf[75]) << 18;
1072
1073 digest[18] = (l >> 16) & 0xff;
1074 digest[39] = (l >> 8) & 0xff;
1075 digest[60] = (l >> 0) & 0xff;
1076
1077 l = itoa64_to_int (buf[76]) << 0;
1078 l |= itoa64_to_int (buf[77]) << 6;
1079 l |= itoa64_to_int (buf[78]) << 12;
1080 l |= itoa64_to_int (buf[79]) << 18;
1081
1082 digest[40] = (l >> 16) & 0xff;
1083 digest[61] = (l >> 8) & 0xff;
1084 digest[19] = (l >> 0) & 0xff;
1085
1086 l = itoa64_to_int (buf[80]) << 0;
1087 l |= itoa64_to_int (buf[81]) << 6;
1088 l |= itoa64_to_int (buf[82]) << 12;
1089 l |= itoa64_to_int (buf[83]) << 18;
1090
1091 digest[62] = (l >> 16) & 0xff;
1092 digest[20] = (l >> 8) & 0xff;
1093 digest[41] = (l >> 0) & 0xff;
1094
1095 l = itoa64_to_int (buf[84]) << 0;
1096 l |= itoa64_to_int (buf[85]) << 6;
1097
1098 digest[63] = (l >> 0) & 0xff;
1099 }
1100
1101 void sha512crypt_encode (unsigned char digest[64], unsigned char buf[86])
1102 {
1103 int l;
1104
1105 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1106
1107 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1108 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1109 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1110 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1111
1112 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1113
1114 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1115 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1116 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1117 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1118
1119 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1120
1121 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1122 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1123 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1124 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1125
1126 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1127
1128 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1129 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1130 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1131 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1132
1133 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1134
1135 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1136 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1137 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1138 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1139
1140 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1141
1142 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1143 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1144 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1145 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1146
1147 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1148
1149 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1150 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1151 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1152 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1153
1154 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1155
1156 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1157 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1158 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1159 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1160
1161 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1162
1163 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1164 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1165 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1166 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1167
1168 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1169
1170 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1171 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1172 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1173 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1174
1175 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1176
1177 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1178 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1179 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1180 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1181
1182 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1183
1184 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1185 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1186 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1187 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1188
1189 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1190
1191 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1192 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1193 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1194 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1195
1196 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1197
1198 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1199 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1200 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1201 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1202
1203 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1204
1205 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1206 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1207 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1208 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1209
1210 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1211
1212 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1213 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1214 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1215 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1216
1217 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1218
1219 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1220 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1221 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1222 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1223
1224 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1225
1226 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1227 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1228 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1229 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1230
1231 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1232
1233 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1234 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1235 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1236 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1237
1238 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1239
1240 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1241 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1242 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1243 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1244
1245 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1246
1247 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1248 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1249 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1250 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1251
1252 l = 0 | 0 | (digest[63] << 0);
1253
1254 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1255 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1256 }
1257
1258 void sha1aix_decode (unsigned char digest[20], unsigned char buf[27])
1259 {
1260 int l;
1261
1262 l = itoa64_to_int (buf[ 0]) << 0;
1263 l |= itoa64_to_int (buf[ 1]) << 6;
1264 l |= itoa64_to_int (buf[ 2]) << 12;
1265 l |= itoa64_to_int (buf[ 3]) << 18;
1266
1267 digest[ 2] = (l >> 0) & 0xff;
1268 digest[ 1] = (l >> 8) & 0xff;
1269 digest[ 0] = (l >> 16) & 0xff;
1270
1271 l = itoa64_to_int (buf[ 4]) << 0;
1272 l |= itoa64_to_int (buf[ 5]) << 6;
1273 l |= itoa64_to_int (buf[ 6]) << 12;
1274 l |= itoa64_to_int (buf[ 7]) << 18;
1275
1276 digest[ 5] = (l >> 0) & 0xff;
1277 digest[ 4] = (l >> 8) & 0xff;
1278 digest[ 3] = (l >> 16) & 0xff;
1279
1280 l = itoa64_to_int (buf[ 8]) << 0;
1281 l |= itoa64_to_int (buf[ 9]) << 6;
1282 l |= itoa64_to_int (buf[10]) << 12;
1283 l |= itoa64_to_int (buf[11]) << 18;
1284
1285 digest[ 8] = (l >> 0) & 0xff;
1286 digest[ 7] = (l >> 8) & 0xff;
1287 digest[ 6] = (l >> 16) & 0xff;
1288
1289 l = itoa64_to_int (buf[12]) << 0;
1290 l |= itoa64_to_int (buf[13]) << 6;
1291 l |= itoa64_to_int (buf[14]) << 12;
1292 l |= itoa64_to_int (buf[15]) << 18;
1293
1294 digest[11] = (l >> 0) & 0xff;
1295 digest[10] = (l >> 8) & 0xff;
1296 digest[ 9] = (l >> 16) & 0xff;
1297
1298 l = itoa64_to_int (buf[16]) << 0;
1299 l |= itoa64_to_int (buf[17]) << 6;
1300 l |= itoa64_to_int (buf[18]) << 12;
1301 l |= itoa64_to_int (buf[19]) << 18;
1302
1303 digest[14] = (l >> 0) & 0xff;
1304 digest[13] = (l >> 8) & 0xff;
1305 digest[12] = (l >> 16) & 0xff;
1306
1307 l = itoa64_to_int (buf[20]) << 0;
1308 l |= itoa64_to_int (buf[21]) << 6;
1309 l |= itoa64_to_int (buf[22]) << 12;
1310 l |= itoa64_to_int (buf[23]) << 18;
1311
1312 digest[17] = (l >> 0) & 0xff;
1313 digest[16] = (l >> 8) & 0xff;
1314 digest[15] = (l >> 16) & 0xff;
1315
1316 l = itoa64_to_int (buf[24]) << 0;
1317 l |= itoa64_to_int (buf[25]) << 6;
1318 l |= itoa64_to_int (buf[26]) << 12;
1319
1320 digest[19] = (l >> 8) & 0xff;
1321 digest[18] = (l >> 16) & 0xff;
1322 }
1323
1324 void sha1aix_encode (unsigned char digest[20], unsigned char buf[27])
1325 {
1326 int l;
1327
1328 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1329
1330 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1331 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1332 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1333 buf[ 3] = int_to_itoa64 (l & 0x3f);
1334
1335 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1336
1337 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1338 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1339 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1340 buf[ 7] = int_to_itoa64 (l & 0x3f);
1341
1342 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1343
1344 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1345 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1346 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1347 buf[11] = int_to_itoa64 (l & 0x3f);
1348
1349 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1350
1351 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1352 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1353 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1354 buf[15] = int_to_itoa64 (l & 0x3f);
1355
1356 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1357
1358 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1359 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1360 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1361 buf[19] = int_to_itoa64 (l & 0x3f);
1362
1363 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1364
1365 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1366 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1367 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1368 buf[23] = int_to_itoa64 (l & 0x3f);
1369
1370 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1371
1372 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1373 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1374 buf[26] = int_to_itoa64 (l & 0x3f);
1375 }
1376
1377 void sha256aix_decode (unsigned char digest[32], unsigned char buf[43])
1378 {
1379 int l;
1380
1381 l = itoa64_to_int (buf[ 0]) << 0;
1382 l |= itoa64_to_int (buf[ 1]) << 6;
1383 l |= itoa64_to_int (buf[ 2]) << 12;
1384 l |= itoa64_to_int (buf[ 3]) << 18;
1385
1386 digest[ 2] = (l >> 0) & 0xff;
1387 digest[ 1] = (l >> 8) & 0xff;
1388 digest[ 0] = (l >> 16) & 0xff;
1389
1390 l = itoa64_to_int (buf[ 4]) << 0;
1391 l |= itoa64_to_int (buf[ 5]) << 6;
1392 l |= itoa64_to_int (buf[ 6]) << 12;
1393 l |= itoa64_to_int (buf[ 7]) << 18;
1394
1395 digest[ 5] = (l >> 0) & 0xff;
1396 digest[ 4] = (l >> 8) & 0xff;
1397 digest[ 3] = (l >> 16) & 0xff;
1398
1399 l = itoa64_to_int (buf[ 8]) << 0;
1400 l |= itoa64_to_int (buf[ 9]) << 6;
1401 l |= itoa64_to_int (buf[10]) << 12;
1402 l |= itoa64_to_int (buf[11]) << 18;
1403
1404 digest[ 8] = (l >> 0) & 0xff;
1405 digest[ 7] = (l >> 8) & 0xff;
1406 digest[ 6] = (l >> 16) & 0xff;
1407
1408 l = itoa64_to_int (buf[12]) << 0;
1409 l |= itoa64_to_int (buf[13]) << 6;
1410 l |= itoa64_to_int (buf[14]) << 12;
1411 l |= itoa64_to_int (buf[15]) << 18;
1412
1413 digest[11] = (l >> 0) & 0xff;
1414 digest[10] = (l >> 8) & 0xff;
1415 digest[ 9] = (l >> 16) & 0xff;
1416
1417 l = itoa64_to_int (buf[16]) << 0;
1418 l |= itoa64_to_int (buf[17]) << 6;
1419 l |= itoa64_to_int (buf[18]) << 12;
1420 l |= itoa64_to_int (buf[19]) << 18;
1421
1422 digest[14] = (l >> 0) & 0xff;
1423 digest[13] = (l >> 8) & 0xff;
1424 digest[12] = (l >> 16) & 0xff;
1425
1426 l = itoa64_to_int (buf[20]) << 0;
1427 l |= itoa64_to_int (buf[21]) << 6;
1428 l |= itoa64_to_int (buf[22]) << 12;
1429 l |= itoa64_to_int (buf[23]) << 18;
1430
1431 digest[17] = (l >> 0) & 0xff;
1432 digest[16] = (l >> 8) & 0xff;
1433 digest[15] = (l >> 16) & 0xff;
1434
1435 l = itoa64_to_int (buf[24]) << 0;
1436 l |= itoa64_to_int (buf[25]) << 6;
1437 l |= itoa64_to_int (buf[26]) << 12;
1438 l |= itoa64_to_int (buf[27]) << 18;
1439
1440 digest[20] = (l >> 0) & 0xff;
1441 digest[19] = (l >> 8) & 0xff;
1442 digest[18] = (l >> 16) & 0xff;
1443
1444 l = itoa64_to_int (buf[28]) << 0;
1445 l |= itoa64_to_int (buf[29]) << 6;
1446 l |= itoa64_to_int (buf[30]) << 12;
1447 l |= itoa64_to_int (buf[31]) << 18;
1448
1449 digest[23] = (l >> 0) & 0xff;
1450 digest[22] = (l >> 8) & 0xff;
1451 digest[21] = (l >> 16) & 0xff;
1452
1453 l = itoa64_to_int (buf[32]) << 0;
1454 l |= itoa64_to_int (buf[33]) << 6;
1455 l |= itoa64_to_int (buf[34]) << 12;
1456 l |= itoa64_to_int (buf[35]) << 18;
1457
1458 digest[26] = (l >> 0) & 0xff;
1459 digest[25] = (l >> 8) & 0xff;
1460 digest[24] = (l >> 16) & 0xff;
1461
1462 l = itoa64_to_int (buf[36]) << 0;
1463 l |= itoa64_to_int (buf[37]) << 6;
1464 l |= itoa64_to_int (buf[38]) << 12;
1465 l |= itoa64_to_int (buf[39]) << 18;
1466
1467 digest[29] = (l >> 0) & 0xff;
1468 digest[28] = (l >> 8) & 0xff;
1469 digest[27] = (l >> 16) & 0xff;
1470
1471 l = itoa64_to_int (buf[40]) << 0;
1472 l |= itoa64_to_int (buf[41]) << 6;
1473 l |= itoa64_to_int (buf[42]) << 12;
1474
1475 //digest[32] = (l >> 0) & 0xff;
1476 digest[31] = (l >> 8) & 0xff;
1477 digest[30] = (l >> 16) & 0xff;
1478 }
1479
1480 void sha256aix_encode (unsigned char digest[32], unsigned char buf[43])
1481 {
1482 int l;
1483
1484 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1485
1486 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1487 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1488 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1489 buf[ 3] = int_to_itoa64 (l & 0x3f);
1490
1491 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1492
1493 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1494 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1495 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1496 buf[ 7] = int_to_itoa64 (l & 0x3f);
1497
1498 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1499
1500 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1501 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1502 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1503 buf[11] = int_to_itoa64 (l & 0x3f);
1504
1505 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1506
1507 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1508 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1509 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1510 buf[15] = int_to_itoa64 (l & 0x3f);
1511
1512 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1513
1514 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1515 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1516 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1517 buf[19] = int_to_itoa64 (l & 0x3f);
1518
1519 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1520
1521 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1522 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1523 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1524 buf[23] = int_to_itoa64 (l & 0x3f);
1525
1526 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1527
1528 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1529 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1530 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1531 buf[27] = int_to_itoa64 (l & 0x3f);
1532
1533 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1534
1535 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1536 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1537 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1538 buf[31] = int_to_itoa64 (l & 0x3f);
1539
1540 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1541
1542 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1543 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1544 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1545 buf[35] = int_to_itoa64 (l & 0x3f);
1546
1547 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1548
1549 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1550 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1551 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1552 buf[39] = int_to_itoa64 (l & 0x3f);
1553
1554 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1555
1556 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1557 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1558 buf[42] = int_to_itoa64 (l & 0x3f);
1559 }
1560
1561 void sha512aix_decode (unsigned char digest[64], unsigned char buf[86])
1562 {
1563 int l;
1564
1565 l = itoa64_to_int (buf[ 0]) << 0;
1566 l |= itoa64_to_int (buf[ 1]) << 6;
1567 l |= itoa64_to_int (buf[ 2]) << 12;
1568 l |= itoa64_to_int (buf[ 3]) << 18;
1569
1570 digest[ 2] = (l >> 0) & 0xff;
1571 digest[ 1] = (l >> 8) & 0xff;
1572 digest[ 0] = (l >> 16) & 0xff;
1573
1574 l = itoa64_to_int (buf[ 4]) << 0;
1575 l |= itoa64_to_int (buf[ 5]) << 6;
1576 l |= itoa64_to_int (buf[ 6]) << 12;
1577 l |= itoa64_to_int (buf[ 7]) << 18;
1578
1579 digest[ 5] = (l >> 0) & 0xff;
1580 digest[ 4] = (l >> 8) & 0xff;
1581 digest[ 3] = (l >> 16) & 0xff;
1582
1583 l = itoa64_to_int (buf[ 8]) << 0;
1584 l |= itoa64_to_int (buf[ 9]) << 6;
1585 l |= itoa64_to_int (buf[10]) << 12;
1586 l |= itoa64_to_int (buf[11]) << 18;
1587
1588 digest[ 8] = (l >> 0) & 0xff;
1589 digest[ 7] = (l >> 8) & 0xff;
1590 digest[ 6] = (l >> 16) & 0xff;
1591
1592 l = itoa64_to_int (buf[12]) << 0;
1593 l |= itoa64_to_int (buf[13]) << 6;
1594 l |= itoa64_to_int (buf[14]) << 12;
1595 l |= itoa64_to_int (buf[15]) << 18;
1596
1597 digest[11] = (l >> 0) & 0xff;
1598 digest[10] = (l >> 8) & 0xff;
1599 digest[ 9] = (l >> 16) & 0xff;
1600
1601 l = itoa64_to_int (buf[16]) << 0;
1602 l |= itoa64_to_int (buf[17]) << 6;
1603 l |= itoa64_to_int (buf[18]) << 12;
1604 l |= itoa64_to_int (buf[19]) << 18;
1605
1606 digest[14] = (l >> 0) & 0xff;
1607 digest[13] = (l >> 8) & 0xff;
1608 digest[12] = (l >> 16) & 0xff;
1609
1610 l = itoa64_to_int (buf[20]) << 0;
1611 l |= itoa64_to_int (buf[21]) << 6;
1612 l |= itoa64_to_int (buf[22]) << 12;
1613 l |= itoa64_to_int (buf[23]) << 18;
1614
1615 digest[17] = (l >> 0) & 0xff;
1616 digest[16] = (l >> 8) & 0xff;
1617 digest[15] = (l >> 16) & 0xff;
1618
1619 l = itoa64_to_int (buf[24]) << 0;
1620 l |= itoa64_to_int (buf[25]) << 6;
1621 l |= itoa64_to_int (buf[26]) << 12;
1622 l |= itoa64_to_int (buf[27]) << 18;
1623
1624 digest[20] = (l >> 0) & 0xff;
1625 digest[19] = (l >> 8) & 0xff;
1626 digest[18] = (l >> 16) & 0xff;
1627
1628 l = itoa64_to_int (buf[28]) << 0;
1629 l |= itoa64_to_int (buf[29]) << 6;
1630 l |= itoa64_to_int (buf[30]) << 12;
1631 l |= itoa64_to_int (buf[31]) << 18;
1632
1633 digest[23] = (l >> 0) & 0xff;
1634 digest[22] = (l >> 8) & 0xff;
1635 digest[21] = (l >> 16) & 0xff;
1636
1637 l = itoa64_to_int (buf[32]) << 0;
1638 l |= itoa64_to_int (buf[33]) << 6;
1639 l |= itoa64_to_int (buf[34]) << 12;
1640 l |= itoa64_to_int (buf[35]) << 18;
1641
1642 digest[26] = (l >> 0) & 0xff;
1643 digest[25] = (l >> 8) & 0xff;
1644 digest[24] = (l >> 16) & 0xff;
1645
1646 l = itoa64_to_int (buf[36]) << 0;
1647 l |= itoa64_to_int (buf[37]) << 6;
1648 l |= itoa64_to_int (buf[38]) << 12;
1649 l |= itoa64_to_int (buf[39]) << 18;
1650
1651 digest[29] = (l >> 0) & 0xff;
1652 digest[28] = (l >> 8) & 0xff;
1653 digest[27] = (l >> 16) & 0xff;
1654
1655 l = itoa64_to_int (buf[40]) << 0;
1656 l |= itoa64_to_int (buf[41]) << 6;
1657 l |= itoa64_to_int (buf[42]) << 12;
1658 l |= itoa64_to_int (buf[43]) << 18;
1659
1660 digest[32] = (l >> 0) & 0xff;
1661 digest[31] = (l >> 8) & 0xff;
1662 digest[30] = (l >> 16) & 0xff;
1663
1664 l = itoa64_to_int (buf[44]) << 0;
1665 l |= itoa64_to_int (buf[45]) << 6;
1666 l |= itoa64_to_int (buf[46]) << 12;
1667 l |= itoa64_to_int (buf[47]) << 18;
1668
1669 digest[35] = (l >> 0) & 0xff;
1670 digest[34] = (l >> 8) & 0xff;
1671 digest[33] = (l >> 16) & 0xff;
1672
1673 l = itoa64_to_int (buf[48]) << 0;
1674 l |= itoa64_to_int (buf[49]) << 6;
1675 l |= itoa64_to_int (buf[50]) << 12;
1676 l |= itoa64_to_int (buf[51]) << 18;
1677
1678 digest[38] = (l >> 0) & 0xff;
1679 digest[37] = (l >> 8) & 0xff;
1680 digest[36] = (l >> 16) & 0xff;
1681
1682 l = itoa64_to_int (buf[52]) << 0;
1683 l |= itoa64_to_int (buf[53]) << 6;
1684 l |= itoa64_to_int (buf[54]) << 12;
1685 l |= itoa64_to_int (buf[55]) << 18;
1686
1687 digest[41] = (l >> 0) & 0xff;
1688 digest[40] = (l >> 8) & 0xff;
1689 digest[39] = (l >> 16) & 0xff;
1690
1691 l = itoa64_to_int (buf[56]) << 0;
1692 l |= itoa64_to_int (buf[57]) << 6;
1693 l |= itoa64_to_int (buf[58]) << 12;
1694 l |= itoa64_to_int (buf[59]) << 18;
1695
1696 digest[44] = (l >> 0) & 0xff;
1697 digest[43] = (l >> 8) & 0xff;
1698 digest[42] = (l >> 16) & 0xff;
1699
1700 l = itoa64_to_int (buf[60]) << 0;
1701 l |= itoa64_to_int (buf[61]) << 6;
1702 l |= itoa64_to_int (buf[62]) << 12;
1703 l |= itoa64_to_int (buf[63]) << 18;
1704
1705 digest[47] = (l >> 0) & 0xff;
1706 digest[46] = (l >> 8) & 0xff;
1707 digest[45] = (l >> 16) & 0xff;
1708
1709 l = itoa64_to_int (buf[64]) << 0;
1710 l |= itoa64_to_int (buf[65]) << 6;
1711 l |= itoa64_to_int (buf[66]) << 12;
1712 l |= itoa64_to_int (buf[67]) << 18;
1713
1714 digest[50] = (l >> 0) & 0xff;
1715 digest[49] = (l >> 8) & 0xff;
1716 digest[48] = (l >> 16) & 0xff;
1717
1718 l = itoa64_to_int (buf[68]) << 0;
1719 l |= itoa64_to_int (buf[69]) << 6;
1720 l |= itoa64_to_int (buf[70]) << 12;
1721 l |= itoa64_to_int (buf[71]) << 18;
1722
1723 digest[53] = (l >> 0) & 0xff;
1724 digest[52] = (l >> 8) & 0xff;
1725 digest[51] = (l >> 16) & 0xff;
1726
1727 l = itoa64_to_int (buf[72]) << 0;
1728 l |= itoa64_to_int (buf[73]) << 6;
1729 l |= itoa64_to_int (buf[74]) << 12;
1730 l |= itoa64_to_int (buf[75]) << 18;
1731
1732 digest[56] = (l >> 0) & 0xff;
1733 digest[55] = (l >> 8) & 0xff;
1734 digest[54] = (l >> 16) & 0xff;
1735
1736 l = itoa64_to_int (buf[76]) << 0;
1737 l |= itoa64_to_int (buf[77]) << 6;
1738 l |= itoa64_to_int (buf[78]) << 12;
1739 l |= itoa64_to_int (buf[79]) << 18;
1740
1741 digest[59] = (l >> 0) & 0xff;
1742 digest[58] = (l >> 8) & 0xff;
1743 digest[57] = (l >> 16) & 0xff;
1744
1745 l = itoa64_to_int (buf[80]) << 0;
1746 l |= itoa64_to_int (buf[81]) << 6;
1747 l |= itoa64_to_int (buf[82]) << 12;
1748 l |= itoa64_to_int (buf[83]) << 18;
1749
1750 digest[62] = (l >> 0) & 0xff;
1751 digest[61] = (l >> 8) & 0xff;
1752 digest[60] = (l >> 16) & 0xff;
1753
1754 l = itoa64_to_int (buf[84]) << 0;
1755 l |= itoa64_to_int (buf[85]) << 6;
1756
1757 digest[63] = (l >> 16) & 0xff;
1758 }
1759
1760 void sha512aix_encode (unsigned char digest[64], unsigned char buf[86])
1761 {
1762 int l;
1763
1764 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1765
1766 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1767 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1768 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1769 buf[ 3] = int_to_itoa64 (l & 0x3f);
1770
1771 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1772
1773 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1774 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1775 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1776 buf[ 7] = int_to_itoa64 (l & 0x3f);
1777
1778 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1779
1780 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1781 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1782 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1783 buf[11] = int_to_itoa64 (l & 0x3f);
1784
1785 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1786
1787 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1788 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1789 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1790 buf[15] = int_to_itoa64 (l & 0x3f);
1791
1792 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1793
1794 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1795 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1796 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1797 buf[19] = int_to_itoa64 (l & 0x3f);
1798
1799 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1800
1801 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1802 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1803 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1804 buf[23] = int_to_itoa64 (l & 0x3f);
1805
1806 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1807
1808 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1809 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1810 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1811 buf[27] = int_to_itoa64 (l & 0x3f);
1812
1813 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1814
1815 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1816 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1817 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1818 buf[31] = int_to_itoa64 (l & 0x3f);
1819
1820 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1821
1822 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1823 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1824 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1825 buf[35] = int_to_itoa64 (l & 0x3f);
1826
1827 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1828
1829 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1830 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1831 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1832 buf[39] = int_to_itoa64 (l & 0x3f);
1833
1834 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1835
1836 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1837 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1838 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1839 buf[43] = int_to_itoa64 (l & 0x3f);
1840
1841 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1842
1843 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1844 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1845 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1846 buf[47] = int_to_itoa64 (l & 0x3f);
1847
1848 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1849
1850 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1851 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1852 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1853 buf[51] = int_to_itoa64 (l & 0x3f);
1854
1855 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1856
1857 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1858 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1859 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1860 buf[55] = int_to_itoa64 (l & 0x3f);
1861
1862 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1863
1864 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1865 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1866 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1867 buf[59] = int_to_itoa64 (l & 0x3f);
1868
1869 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1870
1871 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1872 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1873 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1874 buf[63] = int_to_itoa64 (l & 0x3f);
1875
1876 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1877
1878 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1879 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1880 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1881 buf[67] = int_to_itoa64 (l & 0x3f);
1882
1883 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1884
1885 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1886 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1887 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1888 buf[71] = int_to_itoa64 (l & 0x3f);
1889
1890 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1891
1892 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1893 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1894 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1895 buf[75] = int_to_itoa64 (l & 0x3f);
1896
1897 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1898
1899 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1900 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1901 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1902 buf[79] = int_to_itoa64 (l & 0x3f);
1903
1904 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1905
1906 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1907 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1908 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1909 buf[83] = int_to_itoa64 (l & 0x3f);
1910
1911 l = 0 | 0 | (digest[63] << 16);
1912
1913 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1914 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1915 }
1916
1917 void sha256crypt_decode (unsigned char digest[32], unsigned char buf[43])
1918 {
1919 int l;
1920
1921 l = itoa64_to_int (buf[ 0]) << 0;
1922 l |= itoa64_to_int (buf[ 1]) << 6;
1923 l |= itoa64_to_int (buf[ 2]) << 12;
1924 l |= itoa64_to_int (buf[ 3]) << 18;
1925
1926 digest[ 0] = (l >> 16) & 0xff;
1927 digest[10] = (l >> 8) & 0xff;
1928 digest[20] = (l >> 0) & 0xff;
1929
1930 l = itoa64_to_int (buf[ 4]) << 0;
1931 l |= itoa64_to_int (buf[ 5]) << 6;
1932 l |= itoa64_to_int (buf[ 6]) << 12;
1933 l |= itoa64_to_int (buf[ 7]) << 18;
1934
1935 digest[21] = (l >> 16) & 0xff;
1936 digest[ 1] = (l >> 8) & 0xff;
1937 digest[11] = (l >> 0) & 0xff;
1938
1939 l = itoa64_to_int (buf[ 8]) << 0;
1940 l |= itoa64_to_int (buf[ 9]) << 6;
1941 l |= itoa64_to_int (buf[10]) << 12;
1942 l |= itoa64_to_int (buf[11]) << 18;
1943
1944 digest[12] = (l >> 16) & 0xff;
1945 digest[22] = (l >> 8) & 0xff;
1946 digest[ 2] = (l >> 0) & 0xff;
1947
1948 l = itoa64_to_int (buf[12]) << 0;
1949 l |= itoa64_to_int (buf[13]) << 6;
1950 l |= itoa64_to_int (buf[14]) << 12;
1951 l |= itoa64_to_int (buf[15]) << 18;
1952
1953 digest[ 3] = (l >> 16) & 0xff;
1954 digest[13] = (l >> 8) & 0xff;
1955 digest[23] = (l >> 0) & 0xff;
1956
1957 l = itoa64_to_int (buf[16]) << 0;
1958 l |= itoa64_to_int (buf[17]) << 6;
1959 l |= itoa64_to_int (buf[18]) << 12;
1960 l |= itoa64_to_int (buf[19]) << 18;
1961
1962 digest[24] = (l >> 16) & 0xff;
1963 digest[ 4] = (l >> 8) & 0xff;
1964 digest[14] = (l >> 0) & 0xff;
1965
1966 l = itoa64_to_int (buf[20]) << 0;
1967 l |= itoa64_to_int (buf[21]) << 6;
1968 l |= itoa64_to_int (buf[22]) << 12;
1969 l |= itoa64_to_int (buf[23]) << 18;
1970
1971 digest[15] = (l >> 16) & 0xff;
1972 digest[25] = (l >> 8) & 0xff;
1973 digest[ 5] = (l >> 0) & 0xff;
1974
1975 l = itoa64_to_int (buf[24]) << 0;
1976 l |= itoa64_to_int (buf[25]) << 6;
1977 l |= itoa64_to_int (buf[26]) << 12;
1978 l |= itoa64_to_int (buf[27]) << 18;
1979
1980 digest[ 6] = (l >> 16) & 0xff;
1981 digest[16] = (l >> 8) & 0xff;
1982 digest[26] = (l >> 0) & 0xff;
1983
1984 l = itoa64_to_int (buf[28]) << 0;
1985 l |= itoa64_to_int (buf[29]) << 6;
1986 l |= itoa64_to_int (buf[30]) << 12;
1987 l |= itoa64_to_int (buf[31]) << 18;
1988
1989 digest[27] = (l >> 16) & 0xff;
1990 digest[ 7] = (l >> 8) & 0xff;
1991 digest[17] = (l >> 0) & 0xff;
1992
1993 l = itoa64_to_int (buf[32]) << 0;
1994 l |= itoa64_to_int (buf[33]) << 6;
1995 l |= itoa64_to_int (buf[34]) << 12;
1996 l |= itoa64_to_int (buf[35]) << 18;
1997
1998 digest[18] = (l >> 16) & 0xff;
1999 digest[28] = (l >> 8) & 0xff;
2000 digest[ 8] = (l >> 0) & 0xff;
2001
2002 l = itoa64_to_int (buf[36]) << 0;
2003 l |= itoa64_to_int (buf[37]) << 6;
2004 l |= itoa64_to_int (buf[38]) << 12;
2005 l |= itoa64_to_int (buf[39]) << 18;
2006
2007 digest[ 9] = (l >> 16) & 0xff;
2008 digest[19] = (l >> 8) & 0xff;
2009 digest[29] = (l >> 0) & 0xff;
2010
2011 l = itoa64_to_int (buf[40]) << 0;
2012 l |= itoa64_to_int (buf[41]) << 6;
2013 l |= itoa64_to_int (buf[42]) << 12;
2014
2015 digest[31] = (l >> 8) & 0xff;
2016 digest[30] = (l >> 0) & 0xff;
2017 }
2018
2019 void sha256crypt_encode (unsigned char digest[32], unsigned char buf[43])
2020 {
2021 int l;
2022
2023 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2024
2025 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2026 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2027 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2028 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2029
2030 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2031
2032 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2033 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2034 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2035 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2036
2037 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2038
2039 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2040 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2041 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2042 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2043
2044 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2045
2046 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2047 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2048 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2049 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2050
2051 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2052
2053 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2054 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2055 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2056 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2057
2058 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2059
2060 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2061 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2062 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2063 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2064
2065 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2066
2067 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2068 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2069 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2070 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2071
2072 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2073
2074 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2075 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2076 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2077 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2078
2079 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2080
2081 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2082 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2083 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2084 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2085
2086 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2087
2088 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2089 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2090 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2091 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2092
2093 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2094
2095 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2096 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2097 buf[42] = int_to_itoa64 (l & 0x3f);
2098 }
2099
2100 void drupal7_decode (unsigned char digest[64], unsigned char buf[44])
2101 {
2102 int l;
2103
2104 l = itoa64_to_int (buf[ 0]) << 0;
2105 l |= itoa64_to_int (buf[ 1]) << 6;
2106 l |= itoa64_to_int (buf[ 2]) << 12;
2107 l |= itoa64_to_int (buf[ 3]) << 18;
2108
2109 digest[ 0] = (l >> 0) & 0xff;
2110 digest[ 1] = (l >> 8) & 0xff;
2111 digest[ 2] = (l >> 16) & 0xff;
2112
2113 l = itoa64_to_int (buf[ 4]) << 0;
2114 l |= itoa64_to_int (buf[ 5]) << 6;
2115 l |= itoa64_to_int (buf[ 6]) << 12;
2116 l |= itoa64_to_int (buf[ 7]) << 18;
2117
2118 digest[ 3] = (l >> 0) & 0xff;
2119 digest[ 4] = (l >> 8) & 0xff;
2120 digest[ 5] = (l >> 16) & 0xff;
2121
2122 l = itoa64_to_int (buf[ 8]) << 0;
2123 l |= itoa64_to_int (buf[ 9]) << 6;
2124 l |= itoa64_to_int (buf[10]) << 12;
2125 l |= itoa64_to_int (buf[11]) << 18;
2126
2127 digest[ 6] = (l >> 0) & 0xff;
2128 digest[ 7] = (l >> 8) & 0xff;
2129 digest[ 8] = (l >> 16) & 0xff;
2130
2131 l = itoa64_to_int (buf[12]) << 0;
2132 l |= itoa64_to_int (buf[13]) << 6;
2133 l |= itoa64_to_int (buf[14]) << 12;
2134 l |= itoa64_to_int (buf[15]) << 18;
2135
2136 digest[ 9] = (l >> 0) & 0xff;
2137 digest[10] = (l >> 8) & 0xff;
2138 digest[11] = (l >> 16) & 0xff;
2139
2140 l = itoa64_to_int (buf[16]) << 0;
2141 l |= itoa64_to_int (buf[17]) << 6;
2142 l |= itoa64_to_int (buf[18]) << 12;
2143 l |= itoa64_to_int (buf[19]) << 18;
2144
2145 digest[12] = (l >> 0) & 0xff;
2146 digest[13] = (l >> 8) & 0xff;
2147 digest[14] = (l >> 16) & 0xff;
2148
2149 l = itoa64_to_int (buf[20]) << 0;
2150 l |= itoa64_to_int (buf[21]) << 6;
2151 l |= itoa64_to_int (buf[22]) << 12;
2152 l |= itoa64_to_int (buf[23]) << 18;
2153
2154 digest[15] = (l >> 0) & 0xff;
2155 digest[16] = (l >> 8) & 0xff;
2156 digest[17] = (l >> 16) & 0xff;
2157
2158 l = itoa64_to_int (buf[24]) << 0;
2159 l |= itoa64_to_int (buf[25]) << 6;
2160 l |= itoa64_to_int (buf[26]) << 12;
2161 l |= itoa64_to_int (buf[27]) << 18;
2162
2163 digest[18] = (l >> 0) & 0xff;
2164 digest[19] = (l >> 8) & 0xff;
2165 digest[20] = (l >> 16) & 0xff;
2166
2167 l = itoa64_to_int (buf[28]) << 0;
2168 l |= itoa64_to_int (buf[29]) << 6;
2169 l |= itoa64_to_int (buf[30]) << 12;
2170 l |= itoa64_to_int (buf[31]) << 18;
2171
2172 digest[21] = (l >> 0) & 0xff;
2173 digest[22] = (l >> 8) & 0xff;
2174 digest[23] = (l >> 16) & 0xff;
2175
2176 l = itoa64_to_int (buf[32]) << 0;
2177 l |= itoa64_to_int (buf[33]) << 6;
2178 l |= itoa64_to_int (buf[34]) << 12;
2179 l |= itoa64_to_int (buf[35]) << 18;
2180
2181 digest[24] = (l >> 0) & 0xff;
2182 digest[25] = (l >> 8) & 0xff;
2183 digest[26] = (l >> 16) & 0xff;
2184
2185 l = itoa64_to_int (buf[36]) << 0;
2186 l |= itoa64_to_int (buf[37]) << 6;
2187 l |= itoa64_to_int (buf[38]) << 12;
2188 l |= itoa64_to_int (buf[39]) << 18;
2189
2190 digest[27] = (l >> 0) & 0xff;
2191 digest[28] = (l >> 8) & 0xff;
2192 digest[29] = (l >> 16) & 0xff;
2193
2194 l = itoa64_to_int (buf[40]) << 0;
2195 l |= itoa64_to_int (buf[41]) << 6;
2196 l |= itoa64_to_int (buf[42]) << 12;
2197 l |= itoa64_to_int (buf[43]) << 18;
2198
2199 digest[30] = (l >> 0) & 0xff;
2200 digest[31] = (l >> 8) & 0xff;
2201 digest[32] = (l >> 16) & 0xff;
2202
2203 digest[33] = 0;
2204 digest[34] = 0;
2205 digest[35] = 0;
2206 digest[36] = 0;
2207 digest[37] = 0;
2208 digest[38] = 0;
2209 digest[39] = 0;
2210 digest[40] = 0;
2211 digest[41] = 0;
2212 digest[42] = 0;
2213 digest[43] = 0;
2214 digest[44] = 0;
2215 digest[45] = 0;
2216 digest[46] = 0;
2217 digest[47] = 0;
2218 digest[48] = 0;
2219 digest[49] = 0;
2220 digest[50] = 0;
2221 digest[51] = 0;
2222 digest[52] = 0;
2223 digest[53] = 0;
2224 digest[54] = 0;
2225 digest[55] = 0;
2226 digest[56] = 0;
2227 digest[57] = 0;
2228 digest[58] = 0;
2229 digest[59] = 0;
2230 digest[60] = 0;
2231 digest[61] = 0;
2232 digest[62] = 0;
2233 digest[63] = 0;
2234 }
2235
2236 void drupal7_encode (unsigned char digest[64], unsigned char buf[43])
2237 {
2238 int l;
2239
2240 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2241
2242 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2243 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2244 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2245 buf[ 3] = int_to_itoa64 (l & 0x3f);
2246
2247 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2248
2249 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2250 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2251 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2252 buf[ 7] = int_to_itoa64 (l & 0x3f);
2253
2254 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2255
2256 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2257 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2258 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2259 buf[11] = int_to_itoa64 (l & 0x3f);
2260
2261 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2262
2263 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2264 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2265 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2266 buf[15] = int_to_itoa64 (l & 0x3f);
2267
2268 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2269
2270 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2271 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2272 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2273 buf[19] = int_to_itoa64 (l & 0x3f);
2274
2275 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2276
2277 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2278 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2279 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2280 buf[23] = int_to_itoa64 (l & 0x3f);
2281
2282 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2283
2284 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2285 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2286 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2287 buf[27] = int_to_itoa64 (l & 0x3f);
2288
2289 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2290
2291 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2292 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2293 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2294 buf[31] = int_to_itoa64 (l & 0x3f);
2295
2296 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2297
2298 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2299 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2300 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2301 buf[35] = int_to_itoa64 (l & 0x3f);
2302
2303 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2304
2305 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2306 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2307 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2308 buf[39] = int_to_itoa64 (l & 0x3f);
2309
2310 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2311
2312 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2313 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2314 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2315 //buf[43] = int_to_itoa64 (l & 0x3f);
2316 }
2317
2318 /**
2319 * tty
2320 */
2321
2322 #ifdef LINUX
2323 static struct termio savemodes;
2324 static int havemodes = 0;
2325
2326 int tty_break()
2327 {
2328 struct termio modmodes;
2329
2330 if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1;
2331
2332 havemodes = 1;
2333
2334 modmodes = savemodes;
2335 modmodes.c_lflag &= ~ICANON;
2336 modmodes.c_cc[VMIN] = 1;
2337 modmodes.c_cc[VTIME] = 0;
2338
2339 return ioctl (fileno (stdin), TCSETAW, &modmodes);
2340 }
2341
2342 int tty_getchar()
2343 {
2344 fd_set rfds;
2345
2346 FD_ZERO (&rfds);
2347
2348 FD_SET (fileno (stdin), &rfds);
2349
2350 struct timeval tv;
2351
2352 tv.tv_sec = 1;
2353 tv.tv_usec = 0;
2354
2355 int retval = select (1, &rfds, NULL, NULL, &tv);
2356
2357 if (retval == 0) return 0;
2358 if (retval == -1) return -1;
2359
2360 return getchar();
2361 }
2362
2363 int tty_fix()
2364 {
2365 if (!havemodes) return 0;
2366
2367 return ioctl (fileno (stdin), TCSETAW, &savemodes);
2368 }
2369 #endif
2370
2371 #ifdef OSX
2372 static struct termios savemodes;
2373 static int havemodes = 0;
2374
2375 int tty_break()
2376 {
2377 struct termios modmodes;
2378
2379 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2380
2381 havemodes = 1;
2382
2383 modmodes = savemodes;
2384 modmodes.c_lflag &= ~ICANON;
2385 modmodes.c_cc[VMIN] = 1;
2386 modmodes.c_cc[VTIME] = 0;
2387
2388 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2389 }
2390
2391 int tty_getchar()
2392 {
2393 fd_set rfds;
2394
2395 FD_ZERO (&rfds);
2396
2397 FD_SET (fileno (stdin), &rfds);
2398
2399 struct timeval tv;
2400
2401 tv.tv_sec = 1;
2402 tv.tv_usec = 0;
2403
2404 int retval = select (1, &rfds, NULL, NULL, &tv);
2405
2406 if (retval == 0) return 0;
2407 if (retval == -1) return -1;
2408
2409 return getchar();
2410 }
2411
2412 int tty_fix()
2413 {
2414 if (!havemodes) return 0;
2415
2416 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2417 }
2418 #endif
2419
2420 #ifdef WIN
2421 static DWORD saveMode = 0;
2422
2423 int tty_break()
2424 {
2425 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2426
2427 GetConsoleMode (stdinHandle, &saveMode);
2428 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2429
2430 return 0;
2431 }
2432
2433 int tty_getchar()
2434 {
2435 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2436
2437 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2438
2439 if (rc == WAIT_TIMEOUT) return 0;
2440 if (rc == WAIT_ABANDONED) return -1;
2441 if (rc == WAIT_FAILED) return -1;
2442
2443 // The whole ReadConsoleInput () part is a workaround.
2444 // For some unknown reason, maybe a mingw bug, a random signal
2445 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2446 // Then it wants to read with getche () a keyboard input
2447 // which has never been made.
2448
2449 INPUT_RECORD buf[100];
2450
2451 DWORD num = 0;
2452
2453 ReadConsoleInput (stdinHandle, buf, 100, &num);
2454
2455 FlushConsoleInputBuffer (stdinHandle);
2456
2457 for (uint i = 0; i < num; i++)
2458 {
2459 if (buf[i].EventType != KEY_EVENT) continue;
2460
2461 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2462
2463 if (KeyEvent.bKeyDown != TRUE) continue;
2464
2465 return KeyEvent.uChar.AsciiChar;
2466 }
2467
2468 return 0;
2469 }
2470
2471 int tty_fix()
2472 {
2473 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2474
2475 SetConsoleMode (stdinHandle, saveMode);
2476
2477 return 0;
2478 }
2479 #endif
2480
2481 /**
2482 * mem alloc
2483 */
2484
2485 #define MSG_ENOMEM "Insufficient memory available"
2486
2487 void *mycalloc (size_t nmemb, size_t size)
2488 {
2489 void *p = calloc (nmemb, size);
2490
2491 if (p == NULL)
2492 {
2493 log_error ("ERROR: %s", MSG_ENOMEM);
2494
2495 exit (-1);
2496 }
2497
2498 return (p);
2499 }
2500
2501 void *mymalloc (size_t size)
2502 {
2503 void *p = malloc (size);
2504
2505 if (p == NULL)
2506 {
2507 log_error ("ERROR: %s", MSG_ENOMEM);
2508
2509 exit (-1);
2510 }
2511
2512 memset (p, 0, size);
2513
2514 return (p);
2515 }
2516
2517 void myfree (void *ptr)
2518 {
2519 if (ptr == NULL) return;
2520
2521 free (ptr);
2522 }
2523
2524 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2525 {
2526 void *p = realloc (ptr, oldsz + add);
2527
2528 if (p == NULL)
2529 {
2530 log_error ("ERROR: %s", MSG_ENOMEM);
2531
2532 exit (-1);
2533 }
2534
2535 memset ((char *) p + oldsz, 0, add);
2536
2537 return (p);
2538 }
2539
2540 char *mystrdup (const char *s)
2541 {
2542 const size_t len = strlen (s);
2543
2544 char *b = (char *) mymalloc (len + 1);
2545
2546 memcpy (b, s, len);
2547
2548 return (b);
2549 }
2550
2551 FILE *logfile_open (char *logfile)
2552 {
2553 FILE *fp = fopen (logfile, "ab");
2554
2555 if (fp == NULL)
2556 {
2557 fp = stdout;
2558 }
2559
2560 return fp;
2561 }
2562
2563 void logfile_close (FILE *fp)
2564 {
2565 if (fp == stdout) return;
2566
2567 fclose (fp);
2568 }
2569
2570 void logfile_append (const char *fmt, ...)
2571 {
2572 if (data.logfile_disable == 1) return;
2573
2574 FILE *fp = logfile_open (data.logfile);
2575
2576 va_list ap;
2577
2578 va_start (ap, fmt);
2579
2580 vfprintf (fp, fmt, ap);
2581
2582 va_end (ap);
2583
2584 fputc ('\n', fp);
2585
2586 fflush (fp);
2587
2588 logfile_close (fp);
2589 }
2590
2591 int logfile_generate_id ()
2592 {
2593 const int n = rand ();
2594
2595 time_t t;
2596
2597 time (&t);
2598
2599 return t + n;
2600 }
2601
2602 char *logfile_generate_topid ()
2603 {
2604 const int id = logfile_generate_id ();
2605
2606 char *topid = (char *) mymalloc (1 + 16 + 1);
2607
2608 sprintf (topid, "TOP%08x", id);
2609
2610 return topid;
2611 }
2612
2613 char *logfile_generate_subid ()
2614 {
2615 const int id = logfile_generate_id ();
2616
2617 char *subid = (char *) mymalloc (1 + 16 + 1);
2618
2619 sprintf (subid, "SUB%08x", id);
2620
2621 return subid;
2622 }
2623
2624 /**
2625 * system
2626 */
2627
2628 #ifdef _WIN
2629 void fsync (int fd)
2630 {
2631 HANDLE h = (HANDLE) _get_osfhandle (fd);
2632
2633 FlushFileBuffers (h);
2634 }
2635 #endif
2636
2637 /**
2638 * thermal
2639 */
2640
2641 #ifdef _CUDA
2642 #ifdef _WIN
2643 int hm_get_adapter_index (HM_ADAPTER nvGPUHandle[DEVICES_MAX])
2644 {
2645 NvU32 pGpuCount;
2646
2647 if (hc_NvAPI_EnumPhysicalGPUs (nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2648
2649 if (pGpuCount == 0)
2650 {
2651 log_info ("WARN: No NvAPI adapters found");
2652
2653 return (0);
2654 }
2655
2656 return (pGpuCount);
2657 }
2658 #endif
2659
2660 #ifdef LINUX
2661 int hm_get_adapter_index (HM_ADAPTER nvGPUHandle[DEVICES_MAX])
2662 {
2663 int pGpuCount = 0;
2664
2665 for (uint i = 0; i < DEVICES_MAX; i++)
2666 {
2667 /* do not use wrapper function to omit warning message */
2668 if (nvmlDeviceGetHandleByIndex (i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2669
2670 //can be used to determine if the device by index matches the cuda device by index
2671 //char name[100]; memset (name, 0, sizeof (name));
2672 //hc_NVML_nvmlDeviceGetName (nvGPUHandle[i], name, sizeof (name) - 1);
2673
2674 pGpuCount++;
2675 }
2676
2677 if (pGpuCount == 0)
2678 {
2679 log_info ("WARN: No NVML adapters found");
2680
2681 return (0);
2682 }
2683
2684 return (pGpuCount);
2685 }
2686 #endif
2687 #endif
2688
2689 #ifdef _OCL
2690 #ifndef OSX
2691 void hm_close (HM_LIB hm_dll)
2692 {
2693 #ifdef _POSIX
2694 dlclose (hm_dll);
2695
2696 #elif _WIN
2697 FreeLibrary (hm_dll);
2698
2699 #endif
2700 }
2701
2702 HM_LIB hm_init ()
2703 {
2704 #ifdef _POSIX
2705 HM_LIB hm_dll = dlopen ("libatiadlxx.so", RTLD_LAZY | RTLD_GLOBAL);
2706
2707 #elif _WIN
2708 HM_LIB hm_dll = LoadLibrary ("atiadlxx.dll");
2709
2710 if (hm_dll == NULL)
2711 hm_dll = LoadLibrary ("atiadlxy.dll");
2712
2713 #endif
2714
2715 return hm_dll;
2716 }
2717
2718 int get_adapters_num (HM_LIB hm_dll, int *iNumberAdapters)
2719 {
2720 if (hc_ADL_Adapter_NumberOfAdapters_Get (hm_dll, iNumberAdapters) != ADL_OK) return -1;
2721
2722 if (iNumberAdapters == 0)
2723 {
2724 log_info ("WARN: No ADL adapters found.");
2725
2726 return -1;
2727 }
2728
2729 return 0;
2730 }
2731
2732 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2733 {
2734 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2735 ADLODParameters lpOdParameters;
2736
2737 lpOdParameters.iSize = sizeof (ADLODParameters);
2738 size_t plevels_size = 0;
2739
2740 if (hc_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2741
2742 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2743 __func__, iAdapterIndex,
2744 lpOdParameters.iNumberOfPerformanceLevels,
2745 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2746 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2747
2748 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2749
2750 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2751
2752 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2753
2754 if (hc_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2755
2756 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2757 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2758 __func__, iAdapterIndex, j,
2759 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2760
2761 myfree (lpOdPerformanceLevels);
2762
2763 return 0;
2764 }
2765
2766 LPAdapterInfo hm_get_adapter_info (HM_LIB hm_dll, int iNumberAdapters)
2767 {
2768 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2769
2770 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2771
2772 if (hc_ADL_Adapter_AdapterInfo_Get (hm_dll, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2773
2774 return lpAdapterInfo;
2775 }
2776
2777 /*
2778 * does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2779 *
2780
2781 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2782 {
2783 uint32_t idx = -1;
2784
2785 for (uint i = 0; i < num_adl_adapters; i++)
2786 {
2787 int opencl_bus_num = hm_device[i].busid;
2788 int opencl_dev_num = hm_device[i].devid;
2789
2790 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2791 {
2792 idx = i;
2793
2794 break;
2795 }
2796 }
2797
2798 if (idx >= DEVICES_MAX) return -1;
2799
2800 return idx;
2801 }
2802
2803 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2804 {
2805 for (uint i = 0; i < opencl_num_devices; i++)
2806 {
2807 cl_device_topology_amd device_topology;
2808
2809 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2810
2811 hm_device[i].busid = device_topology.pcie.bus;
2812 hm_device[i].devid = device_topology.pcie.device;
2813 }
2814 }
2815 */
2816
2817 void hm_sort_adl_adapters_by_busid_devid (uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2818 {
2819 // basically bubble sort
2820
2821 for (int i = 0; i < num_adl_adapters; i++)
2822 {
2823 for (int j = 0; j < num_adl_adapters - 1; j++)
2824 {
2825 // get info of adapter [x]
2826
2827 uint32_t adapter_index_x = valid_adl_device_list[j];
2828 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2829
2830 uint32_t bus_num_x = info_x.iBusNumber;
2831 uint32_t dev_num_x = info_x.iDeviceNumber;
2832
2833 // get info of adapter [y]
2834
2835 uint32_t adapter_index_y = valid_adl_device_list[j + 1];
2836 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2837
2838 uint32_t bus_num_y = info_y.iBusNumber;
2839 uint32_t dev_num_y = info_y.iDeviceNumber;
2840
2841 uint need_swap = 0;
2842
2843 if (bus_num_y < bus_num_x)
2844 {
2845 need_swap = 1;
2846 }
2847 else if (bus_num_y == bus_num_x)
2848 {
2849 if (dev_num_y < dev_num_x)
2850 {
2851 need_swap = 1;
2852 }
2853 }
2854
2855 if (need_swap == 1)
2856 {
2857 uint32_t temp = valid_adl_device_list[j + 1];
2858
2859 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2860 valid_adl_device_list[j + 0] = temp;
2861 }
2862 }
2863 }
2864 }
2865
2866 uint32_t *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2867 {
2868 *num_adl_adapters = 0;
2869
2870 uint32_t *adl_adapters = NULL;
2871
2872 int *bus_numbers = NULL;
2873 int *device_numbers = NULL;
2874
2875 for (int i = 0; i < iNumberAdapters; i++)
2876 {
2877 AdapterInfo info = lpAdapterInfo[i];
2878
2879 if ((info.strUDID == NULL) || (strlen (info.strUDID) < 1)) continue;
2880
2881 #ifdef WIN
2882 if (info.iVendorID != 1002) continue;
2883 #else
2884 if (info.iVendorID != 0x1002) continue;
2885 #endif
2886
2887 if (info.iBusNumber < 0) continue;
2888 if (info.iDeviceNumber < 0) continue;
2889
2890 int found = 0;
2891
2892 for (int pos = 0; pos < *num_adl_adapters; pos++)
2893 {
2894 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2895 {
2896 found = 1;
2897 break;
2898 }
2899 }
2900
2901 if (found) continue;
2902
2903 // add it to the list
2904
2905 adl_adapters = (uint32_t *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2906
2907 adl_adapters[*num_adl_adapters] = i;
2908
2909 // rest is just bookkeeping
2910
2911 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2912 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2913
2914 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2915 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2916
2917 (*num_adl_adapters)++;
2918 }
2919
2920 myfree (bus_numbers);
2921 myfree (device_numbers);
2922
2923 // sort the list by increasing bus id, device id number
2924
2925 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2926
2927 return adl_adapters;
2928 }
2929
2930 int hm_check_fanspeed_control (HM_LIB hm_dll, hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2931 {
2932 // loop through all valid devices
2933
2934 for (int i = 0; i < num_adl_adapters; i++)
2935 {
2936 uint32_t adapter_index = valid_adl_device_list[i];
2937
2938 // get AdapterInfo
2939
2940 AdapterInfo info = lpAdapterInfo[adapter_index];
2941
2942 // unfortunately this doesn't work since bus id and dev id are not unique
2943 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2944 // if (opencl_device_index == -1) continue;
2945
2946 int opencl_device_index = i;
2947
2948 // if (hm_show_performance_level (hm_dll, info.iAdapterIndex) != 0) return -1;
2949
2950 // get fanspeed info
2951
2952 if (hm_device[opencl_device_index].od_version == 5)
2953 {
2954 ADLFanSpeedInfo FanSpeedInfo;
2955
2956 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2957
2958 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2959
2960 if (hc_ADL_Overdrive5_FanSpeedInfo_Get (hm_dll, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2961
2962 // check read and write capability in fanspeedinfo
2963
2964 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2965 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2966 {
2967 hm_device[opencl_device_index].fan_supported = 1;
2968 }
2969 else
2970 {
2971 hm_device[opencl_device_index].fan_supported = 0;
2972 }
2973 }
2974 else // od_version == 6
2975 {
2976 ADLOD6FanSpeedInfo faninfo;
2977
2978 memset (&faninfo, 0, sizeof (faninfo));
2979
2980 if (hc_ADL_Overdrive6_FanSpeed_Get (hm_dll, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2981
2982 // check read capability in fanspeedinfo
2983
2984 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
2985 {
2986 hm_device[opencl_device_index].fan_supported = 1;
2987 }
2988 else
2989 {
2990 hm_device[opencl_device_index].fan_supported = 0;
2991 }
2992 }
2993 }
2994
2995 return 0;
2996 }
2997
2998 int hm_get_overdrive_version (HM_LIB hm_dll, hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2999 {
3000 for (int i = 0; i < num_adl_adapters; i++)
3001 {
3002 uint32_t adapter_index = valid_adl_device_list[i];
3003
3004 // get AdapterInfo
3005
3006 AdapterInfo info = lpAdapterInfo[adapter_index];
3007
3008 // get overdrive version
3009
3010 int od_supported = 0;
3011 int od_enabled = 0;
3012 int od_version = 0;
3013
3014 if (hc_ADL_Overdrive_Caps (hm_dll, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3015
3016 // store the overdrive version in hm_device
3017
3018 // unfortunately this doesn't work since bus id and dev id are not unique
3019 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3020 // if (opencl_device_index == -1) continue;
3021
3022 int opencl_device_index = i;
3023
3024 hm_device[opencl_device_index].od_version = od_version;
3025 }
3026
3027 return 0;
3028 }
3029
3030 int hm_get_adapter_index (hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3031 {
3032 for (int i = 0; i < num_adl_adapters; i++)
3033 {
3034 uint32_t adapter_index = valid_adl_device_list[i];
3035
3036 // get AdapterInfo
3037
3038 AdapterInfo info = lpAdapterInfo[adapter_index];
3039
3040 // store the iAdapterIndex in hm_device
3041
3042 // unfortunately this doesn't work since bus id and dev id are not unique
3043 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3044 // if (opencl_device_index == -1) continue;
3045
3046 int opencl_device_index = i;
3047
3048 hm_device[opencl_device_index].adapter_index = info.iAdapterIndex;
3049 }
3050
3051 return num_adl_adapters;
3052 }
3053 #endif
3054 #endif
3055
3056 int hm_get_temperature_with_device_id (const uint device_id)
3057 {
3058 #ifdef _OCL
3059 #ifndef OSX
3060 if (data.hm_dll)
3061 {
3062 if (data.hm_device[device_id].od_version == 5)
3063 {
3064 ADLTemperature Temperature;
3065
3066 Temperature.iSize = sizeof (ADLTemperature);
3067
3068 if (hc_ADL_Overdrive5_Temperature_Get (data.hm_dll, data.hm_device[device_id].adapter_index, 0, &Temperature) != ADL_OK) return -1;
3069
3070 return Temperature.iTemperature / 1000;
3071 }
3072 else if (data.hm_device[device_id].od_version == 6)
3073 {
3074 int Temperature = 0;
3075
3076 if (hc_ADL_Overdrive6_Temperature_Get (data.hm_dll, data.hm_device[device_id].adapter_index, &Temperature) != ADL_OK) return -1;
3077
3078 return Temperature / 1000;
3079 }
3080 }
3081 #endif
3082 #endif
3083
3084 #ifdef _CUDA
3085 #ifdef LINUX
3086 int temperature = 0;
3087
3088 hc_NVML_nvmlDeviceGetTemperature (data.hm_device[device_id].adapter_index, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature);
3089
3090 return temperature;
3091 #endif
3092
3093 #ifdef WIN
3094 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3095
3096 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3097 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3098 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3099 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3100
3101 if (hc_NvAPI_GPU_GetThermalSettings (data.hm_device[device_id].adapter_index, 0, &pThermalSettings) != NVAPI_OK) return -1;
3102
3103 return pThermalSettings.sensor[0].currentTemp;
3104 #endif
3105 #endif
3106
3107 return -1;
3108 }
3109
3110 int hm_get_fanspeed_with_device_id (const uint device_id)
3111 {
3112 if (data.hm_device[device_id].fan_supported == 1)
3113 {
3114 #ifdef _OCL
3115 #ifndef OSX
3116 if (data.hm_dll)
3117 {
3118 if (data.hm_device[device_id].od_version == 5)
3119 {
3120 ADLFanSpeedValue lpFanSpeedValue;
3121
3122 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3123
3124 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3125 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3126 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3127
3128 if (hc_ADL_Overdrive5_FanSpeed_Get (data.hm_dll, data.hm_device[device_id].adapter_index, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3129
3130 return lpFanSpeedValue.iFanSpeed;
3131 }
3132 else // od_version == 6
3133 {
3134 ADLOD6FanSpeedInfo faninfo;
3135
3136 memset (&faninfo, 0, sizeof (faninfo));
3137
3138 if (hc_ADL_Overdrive6_FanSpeed_Get (data.hm_dll, data.hm_device[device_id].adapter_index, &faninfo) != ADL_OK) return -1;
3139
3140 return faninfo.iFanSpeedPercent;
3141 }
3142 }
3143 #endif
3144 #endif
3145
3146 #ifdef _CUDA
3147 #ifdef LINUX
3148 int speed = 0;
3149
3150 hc_NVML_nvmlDeviceGetFanSpeed (data.hm_device[device_id].adapter_index, (unsigned int *) &speed);
3151
3152 return speed;
3153 #endif
3154
3155 #ifdef WIN
3156 NvU32 speed = 0;
3157
3158 hc_NvAPI_GPU_GetTachReading (data.hm_device[device_id].adapter_index, &speed);
3159
3160 return speed;
3161 #endif
3162 #endif
3163 }
3164
3165 return -1;
3166 }
3167
3168 int hm_get_utilization_with_device_id (const uint device_id)
3169 {
3170 #ifdef _OCL
3171 #ifndef OSX
3172 if (data.hm_dll)
3173 {
3174 ADLPMActivity PMActivity;
3175
3176 PMActivity.iSize = sizeof (ADLPMActivity);
3177
3178 if (hc_ADL_Overdrive_CurrentActivity_Get (data.hm_dll, data.hm_device[device_id].adapter_index, &PMActivity) != ADL_OK) return -1;
3179
3180 return PMActivity.iActivityPercent;
3181 }
3182 #endif
3183 #endif
3184
3185 #ifdef _CUDA
3186 #ifdef LINUX
3187 nvmlUtilization_t utilization;
3188
3189 hc_NVML_nvmlDeviceGetUtilizationRates (data.hm_device[device_id].adapter_index, &utilization);
3190
3191 return utilization.gpu;
3192 #endif
3193
3194 #ifdef WIN
3195 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3196
3197 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3198
3199 if (hc_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_device[device_id].adapter_index, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3200
3201 return pDynamicPstatesInfoEx.utilization[0].percentage;
3202 #endif
3203 #endif
3204
3205 return -1;
3206 }
3207
3208 #ifdef _OCL
3209 #ifndef OSX
3210 int hm_set_fanspeed_with_device_id (const uint device_id, const int fanspeed)
3211 {
3212 if (data.hm_device[device_id].fan_supported == 1)
3213 {
3214 if (data.hm_dll)
3215 {
3216 if (data.hm_device[device_id].od_version == 5)
3217 {
3218 ADLFanSpeedValue lpFanSpeedValue;
3219
3220 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3221
3222 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3223 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3224 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3225 lpFanSpeedValue.iFanSpeed = fanspeed;
3226
3227 if (hc_ADL_Overdrive5_FanSpeed_Set (data.hm_dll, data.hm_device[device_id].adapter_index, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3228
3229 return 0;
3230 }
3231 else // od_version == 6
3232 {
3233 ADLOD6FanSpeedValue fan_speed_value;
3234
3235 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3236
3237 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3238 fan_speed_value.iFanSpeed = fanspeed;
3239
3240 if (hc_ADL_Overdrive6_FanSpeed_Set (data.hm_dll, data.hm_device[device_id].adapter_index, &fan_speed_value) != ADL_OK) return -1;
3241
3242 return 0;
3243 }
3244 }
3245 }
3246
3247 return -1;
3248 }
3249 #endif
3250 #endif
3251
3252 /**
3253 * maskprocessor
3254 */
3255
3256 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3257 {
3258 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3259
3260 if (css_cnt > SP_PW_MAX)
3261 {
3262 log_error ("ERROR: mask length is too long");
3263
3264 exit (-1);
3265 }
3266
3267 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3268 {
3269 uint *uniq_tbl = uniq_tbls[css_pos];
3270
3271 uint *cs_buf = css[css_pos].cs_buf;
3272 uint cs_len = css[css_pos].cs_len;
3273
3274 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3275 {
3276 uint c = cs_buf[cs_pos] & 0xff;
3277
3278 uniq_tbl[c] = 1;
3279 }
3280 }
3281 }
3282
3283 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3284 {
3285 cs_t *cs = &css[css_cnt];
3286
3287 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3288
3289 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3290
3291 memset (css_uniq, 0, css_uniq_sz);
3292
3293 size_t i;
3294
3295 for (i = 0; i < cs->cs_len; i++)
3296 {
3297 const uint u = cs->cs_buf[i];
3298
3299 css_uniq[u] = 1;
3300 }
3301
3302 for (i = 0; i < in_len; i++)
3303 {
3304 uint u = in_buf[i] & 0xff;
3305
3306 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3307
3308 if (css_uniq[u] == 1) continue;
3309
3310 css_uniq[u] = 1;
3311
3312 cs->cs_buf[cs->cs_len] = u;
3313
3314 cs->cs_len++;
3315 }
3316
3317 myfree (css_uniq);
3318 }
3319
3320 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3321 {
3322 size_t in_pos;
3323
3324 for (in_pos = 0; in_pos < in_len; in_pos++)
3325 {
3326 uint p0 = in_buf[in_pos] & 0xff;
3327
3328 if (interpret == 1 && p0 == '?')
3329 {
3330 in_pos++;
3331
3332 if (in_pos == in_len) break;
3333
3334 uint p1 = in_buf[in_pos] & 0xff;
3335
3336 switch (p1)
3337 {
3338 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3339 break;
3340 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3341 break;
3342 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3343 break;
3344 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3345 break;
3346 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3347 break;
3348 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3349 break;
3350 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3351 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3352 break;
3353 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3354 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3355 break;
3356 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3357 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3358 break;
3359 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3360 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3361 break;
3362 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3363 break;
3364 default: log_error ("Syntax error: %s", in_buf);
3365 exit (-1);
3366 }
3367 }
3368 else
3369 {
3370 if (data.hex_charset)
3371 {
3372 in_pos++;
3373
3374 if (in_pos == in_len)
3375 {
3376 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3377
3378 exit (-1);
3379 }
3380
3381 uint p1 = in_buf[in_pos] & 0xff;
3382
3383 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3384 {
3385 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3386
3387 exit (-1);
3388 }
3389
3390 uint chr = 0;
3391
3392 chr = hex_convert (p1) << 0;
3393 chr |= hex_convert (p0) << 4;
3394
3395 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3396 }
3397 else
3398 {
3399 uint chr = p0;
3400
3401 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3402 }
3403 }
3404 }
3405 }
3406
3407 uint64_t mp_get_sum (uint css_cnt, cs_t *css)
3408 {
3409 uint64_t sum = 1;
3410
3411 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3412 {
3413 sum *= css[css_pos].cs_len;
3414 }
3415
3416 return (sum);
3417 }
3418
3419 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3420 {
3421 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3422
3423 uint mask_pos;
3424 uint css_pos;
3425
3426 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3427 {
3428 char p0 = mask_buf[mask_pos];
3429
3430 if (p0 == '?')
3431 {
3432 mask_pos++;
3433
3434 if (mask_pos == mask_len) break;
3435
3436 char p1 = mask_buf[mask_pos];
3437
3438 uint chr = p1;
3439
3440 switch (p1)
3441 {
3442 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3443 break;
3444 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3445 break;
3446 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3447 break;
3448 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3449 break;
3450 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3451 break;
3452 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3453 break;
3454 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3455 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3456 break;
3457 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3458 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3459 break;
3460 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3461 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3462 break;
3463 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3464 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3465 break;
3466 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3467 break;
3468 default: log_error ("ERROR: syntax error: %s", mask_buf);
3469 exit (-1);
3470 }
3471 }
3472 else
3473 {
3474 if (data.hex_charset)
3475 {
3476 mask_pos++;
3477
3478 // if there is no 2nd hex character, show an error:
3479
3480 if (mask_pos == mask_len)
3481 {
3482 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3483
3484 exit (-1);
3485 }
3486
3487 char p1 = mask_buf[mask_pos];
3488
3489 // if they are not valid hex character, show an error:
3490
3491 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3492 {
3493 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3494
3495 exit (-1);
3496 }
3497
3498 uint chr = 0;
3499
3500 chr |= hex_convert (p1) << 0;
3501 chr |= hex_convert (p0) << 4;
3502
3503 mp_add_cs_buf (&chr, 1, css, css_pos);
3504 }
3505 else
3506 {
3507 uint chr = p0;
3508
3509 mp_add_cs_buf (&chr, 1, css, css_pos);
3510 }
3511 }
3512 }
3513
3514 if (css_pos == 0)
3515 {
3516 log_error ("ERROR: invalid mask length (0)");
3517
3518 exit (-1);
3519 }
3520
3521 *css_cnt = css_pos;
3522
3523 return (css);
3524 }
3525
3526 void mp_exec (uint64_t val, char *buf, cs_t *css, int css_cnt)
3527 {
3528 for (int i = 0; i < css_cnt; i++)
3529 {
3530 uint len = css[i].cs_len;
3531 uint64_t next = val / len;
3532 uint pos = val % len;
3533 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3534 val = next;
3535 }
3536 }
3537
3538 void mp_cut_at (char *mask, uint max)
3539 {
3540 uint i;
3541 uint j;
3542 uint mask_len = strlen (mask);
3543
3544 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3545 {
3546 if (mask[i] == '?') i++;
3547 }
3548
3549 mask[i] = 0;
3550 }
3551
3552 void mp_setup_sys (cs_t *mp_sys)
3553 {
3554 uint pos;
3555 uint chr;
3556 uint donec[CHARSIZ];
3557
3558 memset (donec, 0, sizeof (donec));
3559
3560 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3561 mp_sys[0].cs_buf[pos++] = chr;
3562 mp_sys[0].cs_len = pos; }
3563
3564 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3565 mp_sys[1].cs_buf[pos++] = chr;
3566 mp_sys[1].cs_len = pos; }
3567
3568 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3569 mp_sys[2].cs_buf[pos++] = chr;
3570 mp_sys[2].cs_len = pos; }
3571
3572 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3573 mp_sys[3].cs_buf[pos++] = chr;
3574 mp_sys[3].cs_len = pos; }
3575
3576 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3577 mp_sys[4].cs_len = pos; }
3578
3579 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3580 mp_sys[5].cs_len = pos; }
3581 }
3582
3583 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3584 {
3585 FILE *fp = fopen (buf, "rb");
3586
3587 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3588 {
3589 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3590 }
3591 else
3592 {
3593 char mp_file[1024];
3594
3595 memset (mp_file, 0, sizeof (mp_file));
3596
3597 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3598
3599 fclose (fp);
3600
3601 len = in_superchop (mp_file);
3602
3603 if (len == 0)
3604 {
3605 log_info ("WARNING: charset file corrupted");
3606
3607 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3608 }
3609 else
3610 {
3611 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3612 }
3613 }
3614 }
3615
3616 void mp_reset_usr (cs_t *mp_usr, uint index)
3617 {
3618 mp_usr[index].cs_len = 0;
3619
3620 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3621 }
3622
3623 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3624 {
3625 char *new_mask_buf = (char *) mymalloc (256);
3626
3627 uint mask_pos;
3628
3629 uint css_pos;
3630
3631 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3632 {
3633 if (css_pos == len) break;
3634
3635 char p0 = mask_buf[mask_pos];
3636
3637 new_mask_buf[mask_pos] = p0;
3638
3639 if (p0 == '?')
3640 {
3641 mask_pos++;
3642
3643 if (mask_pos == mask_len) break;
3644
3645 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3646 }
3647 else
3648 {
3649 if (data.hex_charset)
3650 {
3651 mask_pos++;
3652
3653 if (mask_pos == mask_len)
3654 {
3655 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3656
3657 exit (-1);
3658 }
3659
3660 char p1 = mask_buf[mask_pos];
3661
3662 // if they are not valid hex character, show an error:
3663
3664 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3665 {
3666 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3667
3668 exit (-1);
3669 }
3670
3671 new_mask_buf[mask_pos] = p1;
3672 }
3673 }
3674 }
3675
3676 if (css_pos == len) return (new_mask_buf);
3677
3678 myfree (new_mask_buf);
3679
3680 return (NULL);
3681 }
3682
3683 /**
3684 * statprocessor
3685 */
3686
3687 uint64_t sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3688 {
3689 uint64_t sum = 1;
3690
3691 uint i;
3692
3693 for (i = start; i < stop; i++)
3694 {
3695 sum *= root_css_buf[i].cs_len;
3696 }
3697
3698 return (sum);
3699 }
3700
3701 void sp_exec (uint64_t ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3702 {
3703 uint64_t v = ctx;
3704
3705 cs_t *cs = &root_css_buf[start];
3706
3707 uint i;
3708
3709 for (i = start; i < stop; i++)
3710 {
3711 const uint64_t m = v % cs->cs_len;
3712 const uint64_t d = v / cs->cs_len;
3713
3714 v = d;
3715
3716 const uint k = cs->cs_buf[m];
3717
3718 pw_buf[i - start] = (char) k;
3719
3720 cs = &markov_css_buf[(i * CHARSIZ) + k];
3721 }
3722 }
3723
3724 int sp_comp_val (const void *p1, const void *p2)
3725 {
3726 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3727 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3728
3729 return b2->val - b1->val;
3730 }
3731
3732 void sp_setup_tbl (const char *install_dir, char *hcstat, uint disable, uint classic, hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf)
3733 {
3734 uint i;
3735 uint j;
3736 uint k;
3737
3738 /**
3739 * Initialize hcstats
3740 */
3741
3742 uint64_t *root_stats_buf = (uint64_t *) mycalloc (SP_ROOT_CNT, sizeof (uint64_t));
3743
3744 uint64_t *root_stats_ptr = root_stats_buf;
3745
3746 uint64_t *root_stats_buf_by_pos[SP_PW_MAX];
3747
3748 for (i = 0; i < SP_PW_MAX; i++)
3749 {
3750 root_stats_buf_by_pos[i] = root_stats_ptr;
3751
3752 root_stats_ptr += CHARSIZ;
3753 }
3754
3755 uint64_t *markov_stats_buf = (uint64_t *) mycalloc (SP_MARKOV_CNT, sizeof (uint64_t));
3756
3757 uint64_t *markov_stats_ptr = markov_stats_buf;
3758
3759 uint64_t *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3760
3761 for (i = 0; i < SP_PW_MAX; i++)
3762 {
3763 for (j = 0; j < CHARSIZ; j++)
3764 {
3765 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3766
3767 markov_stats_ptr += CHARSIZ;
3768 }
3769 }
3770
3771 /**
3772 * Load hcstats File
3773 */
3774
3775 if (hcstat == NULL)
3776 {
3777 char hcstat_tmp[256];
3778
3779 memset (hcstat_tmp, 0, sizeof (hcstat_tmp));
3780
3781 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", install_dir, SP_HCSTAT);
3782
3783 hcstat = hcstat_tmp;
3784 }
3785
3786 FILE *fd = fopen (hcstat, "rb");
3787
3788 if (fd == NULL)
3789 {
3790 log_error ("%s: %s", hcstat, strerror (errno));
3791
3792 exit (-1);
3793 }
3794
3795 if (fread (root_stats_buf, sizeof (uint64_t), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3796 {
3797 log_error ("%s: Could not load data", hcstat);
3798
3799 exit (-1);
3800 }
3801
3802 if (fread (markov_stats_buf, sizeof (uint64_t), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3803 {
3804 log_error ("%s: Could not load data", hcstat);
3805
3806 exit (-1);
3807 }
3808
3809 fclose (fd);
3810
3811 /**
3812 * Markov modifier of hcstat_table on user request
3813 */
3814
3815 if (disable)
3816 {
3817 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (uint64_t));
3818 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (uint64_t));
3819 }
3820
3821 if (classic)
3822 {
3823 /* Add all stats to first position */
3824
3825 for (i = 1; i < SP_PW_MAX; i++)
3826 {
3827 uint64_t *out = root_stats_buf_by_pos[0];
3828 uint64_t *in = root_stats_buf_by_pos[i];
3829
3830 for (j = 0; j < CHARSIZ; j++)
3831 {
3832 *out++ += *in++;
3833 }
3834 }
3835
3836 for (i = 1; i < SP_PW_MAX; i++)
3837 {
3838 uint64_t *out = markov_stats_buf_by_key[0][0];
3839 uint64_t *in = markov_stats_buf_by_key[i][0];
3840
3841 for (j = 0; j < CHARSIZ; j++)
3842 {
3843 for (k = 0; k < CHARSIZ; k++)
3844 {
3845 *out++ += *in++;
3846 }
3847 }
3848 }
3849
3850 /* copy them to all pw_positions */
3851
3852 for (i = 1; i < SP_PW_MAX; i++)
3853 {
3854 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (uint64_t));
3855 }
3856
3857 for (i = 1; i < SP_PW_MAX; i++)
3858 {
3859 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (uint64_t));
3860 }
3861 }
3862
3863 /**
3864 * Initialize tables
3865 */
3866
3867 hcstat_table_t *root_table_ptr = root_table_buf;
3868
3869 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3870
3871 for (i = 0; i < SP_PW_MAX; i++)
3872 {
3873 root_table_buf_by_pos[i] = root_table_ptr;
3874
3875 root_table_ptr += CHARSIZ;
3876 }
3877
3878 hcstat_table_t *markov_table_ptr = markov_table_buf;
3879
3880 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3881
3882 for (i = 0; i < SP_PW_MAX; i++)
3883 {
3884 for (j = 0; j < CHARSIZ; j++)
3885 {
3886 markov_table_buf_by_key[i][j] = markov_table_ptr;
3887
3888 markov_table_ptr += CHARSIZ;
3889 }
3890 }
3891
3892 /**
3893 * Convert hcstat to tables
3894 */
3895
3896 for (i = 0; i < SP_ROOT_CNT; i++)
3897 {
3898 uint key = i % CHARSIZ;
3899
3900 root_table_buf[i].key = key;
3901 root_table_buf[i].val = root_stats_buf[i];
3902 }
3903
3904 for (i = 0; i < SP_MARKOV_CNT; i++)
3905 {
3906 uint key = i % CHARSIZ;
3907
3908 markov_table_buf[i].key = key;
3909 markov_table_buf[i].val = markov_stats_buf[i];
3910 }
3911
3912 myfree (root_stats_buf);
3913 myfree (markov_stats_buf);
3914
3915 /**
3916 * Finally sort them
3917 */
3918
3919 for (i = 0; i < SP_PW_MAX; i++)
3920 {
3921 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3922 }
3923
3924 for (i = 0; i < SP_PW_MAX; i++)
3925 {
3926 for (j = 0; j < CHARSIZ; j++)
3927 {
3928 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3929 }
3930 }
3931 }
3932
3933 void sp_tbl_to_css (hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint threshold, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3934 {
3935 /**
3936 * Convert tables to css
3937 */
3938
3939 for (uint i = 0; i < SP_ROOT_CNT; i++)
3940 {
3941 uint pw_pos = i / CHARSIZ;
3942
3943 cs_t *cs = &root_css_buf[pw_pos];
3944
3945 if (cs->cs_len == threshold) continue;
3946
3947 uint key = root_table_buf[i].key;
3948
3949 if (uniq_tbls[pw_pos][key] == 0) continue;
3950
3951 cs->cs_buf[cs->cs_len] = key;
3952
3953 cs->cs_len++;
3954 }
3955
3956 /**
3957 * Convert table to css
3958 */
3959
3960 for (uint i = 0; i < SP_MARKOV_CNT; i++)
3961 {
3962 uint c = i / CHARSIZ;
3963
3964 cs_t *cs = &markov_css_buf[c];
3965
3966 if (cs->cs_len == threshold) continue;
3967
3968 uint pw_pos = c / CHARSIZ;
3969
3970 uint key = markov_table_buf[i].key;
3971
3972 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
3973
3974 cs->cs_buf[cs->cs_len] = key;
3975
3976 cs->cs_len++;
3977 }
3978
3979 /*
3980 for (uint i = 0; i < 8; i++)
3981 {
3982 for (uint j = 0x20; j < 0x80; j++)
3983 {
3984 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
3985
3986 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
3987
3988 for (uint k = 0; k < 10; k++)
3989 {
3990 printf (" %u\n", ptr->cs_buf[k]);
3991 }
3992 }
3993 }
3994 */
3995 }
3996
3997 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
3998 {
3999 for (uint i = 0; i < SP_PW_MAX; i += 2)
4000 {
4001 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4002
4003 out += CHARSIZ;
4004 in += CHARSIZ;
4005
4006 out->key = 0;
4007 out->val = 1;
4008
4009 out++;
4010
4011 for (uint j = 1; j < CHARSIZ; j++)
4012 {
4013 out->key = j;
4014 out->val = 0;
4015
4016 out++;
4017 }
4018 }
4019 }
4020
4021 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4022 {
4023 for (uint i = 0; i < SP_PW_MAX; i += 2)
4024 {
4025 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4026
4027 out += CHARSIZ * CHARSIZ;
4028 in += CHARSIZ * CHARSIZ;
4029
4030 for (uint j = 0; j < CHARSIZ; j++)
4031 {
4032 out->key = 0;
4033 out->val = 1;
4034
4035 out++;
4036
4037 for (uint k = 1; k < CHARSIZ; k++)
4038 {
4039 out->key = k;
4040 out->val = 0;
4041
4042 out++;
4043 }
4044 }
4045 }
4046 }
4047
4048 /**
4049 * mixed shared functions
4050 */
4051
4052 void dump_hex (const char *s, size_t size)
4053 {
4054 size_t i;
4055
4056 for (i = 0; i < size; i++)
4057 {
4058 log_info_nn ("%02x ", (unsigned char) s[i]);
4059 }
4060
4061 log_info ("");
4062 }
4063
4064 void usage_mini_print (const char *progname)
4065 {
4066 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4067 }
4068
4069 void usage_big_print (const char *progname)
4070 {
4071 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4072 }
4073
4074 char *get_install_dir (const char *progname)
4075 {
4076 char *install_dir = mystrdup (progname);
4077 char *last_slash = NULL;
4078
4079 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4080 {
4081 *last_slash = 0;
4082 }
4083 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4084 {
4085 *last_slash = 0;
4086 }
4087 else
4088 {
4089 install_dir[0] = '.';
4090 install_dir[1] = 0;
4091 }
4092
4093 return (install_dir);
4094 }
4095
4096 void truecrypt_crc32 (char *file, unsigned char keytab[64])
4097 {
4098 uint crc = ~0;
4099
4100 FILE *fd = fopen (file, "rb");
4101
4102 if (fd == NULL)
4103 {
4104 log_error ("%s: %s", file, strerror (errno));
4105
4106 exit (-1);
4107 }
4108
4109 #define MAX_KEY_SIZE (1024 * 1024)
4110
4111 char *buf = (char *) mymalloc (MAX_KEY_SIZE);
4112
4113 int nread = fread (buf, 1, MAX_KEY_SIZE, fd);
4114
4115 int kpos = 0;
4116
4117 for (int fpos = 0; fpos < nread; fpos++)
4118 {
4119 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4120
4121 keytab[kpos++] += (crc >> 24) & 0xff;
4122 keytab[kpos++] += (crc >> 16) & 0xff;
4123 keytab[kpos++] += (crc >> 8) & 0xff;
4124 keytab[kpos++] += (crc >> 0) & 0xff;
4125
4126 if (kpos >= 64) kpos = 0;
4127 }
4128
4129 myfree (buf);
4130
4131 fclose(fd);
4132 }
4133
4134 void set_cpu_affinity (char *cpu_affinity)
4135 {
4136 #ifdef WIN
4137 DWORD_PTR aff_mask = 0;
4138 #endif
4139
4140 #ifdef LINUX
4141 cpu_set_t cpuset;
4142
4143 CPU_ZERO (&cpuset);
4144 #endif
4145
4146 if (cpu_affinity)
4147 {
4148 char *devices = strdup (cpu_affinity);
4149
4150 char *next = strtok (devices, ",");
4151
4152 do
4153 {
4154 uint cpu_id = atoi (next);
4155
4156 if (cpu_id == 0)
4157 {
4158 #ifdef WIN
4159 aff_mask = 0;
4160 #endif
4161
4162 #ifdef LINUX
4163 CPU_ZERO (&cpuset);
4164 #endif
4165
4166 break;
4167 }
4168
4169 if (cpu_id > 32)
4170 {
4171 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4172
4173 exit (-1);
4174 }
4175
4176 #ifdef WIN
4177 aff_mask |= 1 << (cpu_id - 1);
4178 #endif
4179
4180 #ifdef LINUX
4181 CPU_SET ((cpu_id - 1), &cpuset);
4182 #endif
4183
4184 } while ((next = strtok (NULL, ",")) != NULL);
4185
4186 free (devices);
4187 }
4188
4189 #ifdef WIN
4190 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4191 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4192 #endif
4193
4194 #ifdef LINUX
4195 pthread_t thread = pthread_self ();
4196 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4197 #endif
4198 }
4199
4200 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4201 {
4202 char *element, *end;
4203
4204 end = (char *) base + nmemb * size;
4205
4206 for (element = (char *) base; element < end; element += size)
4207 if (!compar (element, key))
4208 return element;
4209
4210 return NULL;
4211 }
4212
4213 int sort_by_salt (const void *v1, const void *v2)
4214 {
4215 const salt_t *s1 = (const salt_t *) v1;
4216 const salt_t *s2 = (const salt_t *) v2;
4217
4218 const int res1 = s1->salt_len - s2->salt_len;
4219
4220 if (res1 != 0) return (res1);
4221
4222 const int res2 = s1->salt_iter - s2->salt_iter;
4223
4224 if (res2 != 0) return (res2);
4225
4226 uint n;
4227
4228 n = 12;
4229
4230 while (n--)
4231 {
4232 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4233 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4234 }
4235
4236 n = 8;
4237
4238 while (n--)
4239 {
4240 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4241 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4242 }
4243
4244 return (0);
4245 }
4246
4247 int sort_by_salt_buf (const void *v1, const void *v2)
4248 {
4249 const pot_t *p1 = (const pot_t *) v1;
4250 const pot_t *p2 = (const pot_t *) v2;
4251
4252 const hash_t *h1 = &p1->hash;
4253 const hash_t *h2 = &p2->hash;
4254
4255 const salt_t *s1 = h1->salt;
4256 const salt_t *s2 = h2->salt;
4257
4258 uint n = 12;
4259
4260 while (n--)
4261 {
4262 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4263 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4264 }
4265
4266 return 0;
4267 }
4268
4269 int sort_by_hash_t_salt (const void *v1, const void *v2)
4270 {
4271 const hash_t *h1 = (const hash_t *) v1;
4272 const hash_t *h2 = (const hash_t *) v2;
4273
4274 const salt_t *s1 = h1->salt;
4275 const salt_t *s2 = h2->salt;
4276
4277 // testphase: this should work
4278 uint n = 12;
4279
4280 while (n--)
4281 {
4282 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4283 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4284 }
4285
4286 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4287 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4288 if (s1->salt_len > s2->salt_len) return ( 1);
4289 if (s1->salt_len < s2->salt_len) return (-1);
4290
4291 uint n = s1->salt_len;
4292
4293 while (n--)
4294 {
4295 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4296 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4297 }
4298 */
4299
4300 return 0;
4301 }
4302
4303 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4304 {
4305 const hash_t *h1 = (const hash_t *) v1;
4306 const hash_t *h2 = (const hash_t *) v2;
4307
4308 const salt_t *s1 = h1->salt;
4309 const salt_t *s2 = h2->salt;
4310
4311 // 12 - 2 (since last 2 uints contain the digest)
4312 uint n = 10;
4313
4314 while (n--)
4315 {
4316 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4317 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4318 }
4319
4320 return 0;
4321 }
4322
4323 int sort_by_hash_no_salt (const void *v1, const void *v2)
4324 {
4325 const hash_t *h1 = (const hash_t *) v1;
4326 const hash_t *h2 = (const hash_t *) v2;
4327
4328 const void *d1 = h1->digest;
4329 const void *d2 = h2->digest;
4330
4331 return data.sort_by_digest (d1, d2);
4332 }
4333
4334 int sort_by_hash (const void *v1, const void *v2)
4335 {
4336 const hash_t *h1 = (const hash_t *) v1;
4337 const hash_t *h2 = (const hash_t *) v2;
4338
4339 if (data.isSalted)
4340 {
4341 const salt_t *s1 = h1->salt;
4342 const salt_t *s2 = h2->salt;
4343
4344 int res = sort_by_salt (s1, s2);
4345
4346 if (res != 0) return (res);
4347 }
4348
4349 const void *d1 = h1->digest;
4350 const void *d2 = h2->digest;
4351
4352 return data.sort_by_digest (d1, d2);
4353 }
4354
4355 int sort_by_pot (const void *v1, const void *v2)
4356 {
4357 const pot_t *p1 = (const pot_t *) v1;
4358 const pot_t *p2 = (const pot_t *) v2;
4359
4360 const hash_t *h1 = &p1->hash;
4361 const hash_t *h2 = &p2->hash;
4362
4363 return sort_by_hash (h1, h2);
4364 }
4365
4366 int sort_by_mtime (const void *p1, const void *p2)
4367 {
4368 const char **f1 = (const char **) p1;
4369 const char **f2 = (const char **) p2;
4370
4371 struct stat s1; stat (*f1, &s1);
4372 struct stat s2; stat (*f2, &s2);
4373
4374 return s2.st_mtime - s1.st_mtime;
4375 }
4376
4377 int sort_by_cpu_rule (const void *p1, const void *p2)
4378 {
4379 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4380 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4381
4382 return memcmp (r1, r2, sizeof (cpu_rule_t));
4383 }
4384
4385 int sort_by_gpu_rule (const void *p1, const void *p2)
4386 {
4387 const gpu_rule_t *r1 = (const gpu_rule_t *) p1;
4388 const gpu_rule_t *r2 = (const gpu_rule_t *) p2;
4389
4390 return memcmp (r1, r2, sizeof (gpu_rule_t));
4391 }
4392
4393 int sort_by_stringptr (const void *p1, const void *p2)
4394 {
4395 const char **s1 = (const char **) p1;
4396 const char **s2 = (const char **) p2;
4397
4398 return strcmp (*s1, *s2);
4399 }
4400
4401 int sort_by_dictstat (const void *s1, const void *s2)
4402 {
4403 dictstat_t *d1 = (dictstat_t *) s1;
4404 dictstat_t *d2 = (dictstat_t *) s2;
4405
4406 #ifdef _POSIX
4407 d2->stat.st_atim = d1->stat.st_atim;
4408 #else
4409 d2->stat.st_atime = d1->stat.st_atime;
4410 #endif
4411
4412 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4413 }
4414
4415 int sort_by_bitmap (const void *p1, const void *p2)
4416 {
4417 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4418 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4419
4420 return b1->collisions - b2->collisions;
4421 }
4422
4423 int sort_by_digest_4_2 (const void *v1, const void *v2)
4424 {
4425 const uint32_t *d1 = (const uint32_t *) v1;
4426 const uint32_t *d2 = (const uint32_t *) v2;
4427
4428 uint n = 2;
4429
4430 while (n--)
4431 {
4432 if (d1[n] > d2[n]) return ( 1);
4433 if (d1[n] < d2[n]) return (-1);
4434 }
4435
4436 return (0);
4437 }
4438
4439 int sort_by_digest_4_4 (const void *v1, const void *v2)
4440 {
4441 const uint32_t *d1 = (const uint32_t *) v1;
4442 const uint32_t *d2 = (const uint32_t *) v2;
4443
4444 uint n = 4;
4445
4446 while (n--)
4447 {
4448 if (d1[n] > d2[n]) return ( 1);
4449 if (d1[n] < d2[n]) return (-1);
4450 }
4451
4452 return (0);
4453 }
4454
4455 int sort_by_digest_4_5 (const void *v1, const void *v2)
4456 {
4457 const uint32_t *d1 = (const uint32_t *) v1;
4458 const uint32_t *d2 = (const uint32_t *) v2;
4459
4460 uint n = 5;
4461
4462 while (n--)
4463 {
4464 if (d1[n] > d2[n]) return ( 1);
4465 if (d1[n] < d2[n]) return (-1);
4466 }
4467
4468 return (0);
4469 }
4470
4471 int sort_by_digest_4_6 (const void *v1, const void *v2)
4472 {
4473 const uint32_t *d1 = (const uint32_t *) v1;
4474 const uint32_t *d2 = (const uint32_t *) v2;
4475
4476 uint n = 6;
4477
4478 while (n--)
4479 {
4480 if (d1[n] > d2[n]) return ( 1);
4481 if (d1[n] < d2[n]) return (-1);
4482 }
4483
4484 return (0);
4485 }
4486
4487 int sort_by_digest_4_8 (const void *v1, const void *v2)
4488 {
4489 const uint32_t *d1 = (const uint32_t *) v1;
4490 const uint32_t *d2 = (const uint32_t *) v2;
4491
4492 uint n = 8;
4493
4494 while (n--)
4495 {
4496 if (d1[n] > d2[n]) return ( 1);
4497 if (d1[n] < d2[n]) return (-1);
4498 }
4499
4500 return (0);
4501 }
4502
4503 int sort_by_digest_4_16 (const void *v1, const void *v2)
4504 {
4505 const uint32_t *d1 = (const uint32_t *) v1;
4506 const uint32_t *d2 = (const uint32_t *) v2;
4507
4508 uint n = 16;
4509
4510 while (n--)
4511 {
4512 if (d1[n] > d2[n]) return ( 1);
4513 if (d1[n] < d2[n]) return (-1);
4514 }
4515
4516 return (0);
4517 }
4518
4519 int sort_by_digest_4_32 (const void *v1, const void *v2)
4520 {
4521 const uint32_t *d1 = (const uint32_t *) v1;
4522 const uint32_t *d2 = (const uint32_t *) v2;
4523
4524 uint n = 32;
4525
4526 while (n--)
4527 {
4528 if (d1[n] > d2[n]) return ( 1);
4529 if (d1[n] < d2[n]) return (-1);
4530 }
4531
4532 return (0);
4533 }
4534
4535 int sort_by_digest_4_64 (const void *v1, const void *v2)
4536 {
4537 const uint32_t *d1 = (const uint32_t *) v1;
4538 const uint32_t *d2 = (const uint32_t *) v2;
4539
4540 uint n = 64;
4541
4542 while (n--)
4543 {
4544 if (d1[n] > d2[n]) return ( 1);
4545 if (d1[n] < d2[n]) return (-1);
4546 }
4547
4548 return (0);
4549 }
4550
4551 int sort_by_digest_8_8 (const void *v1, const void *v2)
4552 {
4553 const uint64_t *d1 = (const uint64_t *) v1;
4554 const uint64_t *d2 = (const uint64_t *) v2;
4555
4556 uint n = 8;
4557
4558 while (n--)
4559 {
4560 if (d1[n] > d2[n]) return ( 1);
4561 if (d1[n] < d2[n]) return (-1);
4562 }
4563
4564 return (0);
4565 }
4566
4567 int sort_by_digest_8_16 (const void *v1, const void *v2)
4568 {
4569 const uint64_t *d1 = (const uint64_t *) v1;
4570 const uint64_t *d2 = (const uint64_t *) v2;
4571
4572 uint n = 16;
4573
4574 while (n--)
4575 {
4576 if (d1[n] > d2[n]) return ( 1);
4577 if (d1[n] < d2[n]) return (-1);
4578 }
4579
4580 return (0);
4581 }
4582
4583 int sort_by_digest_8_25 (const void *v1, const void *v2)
4584 {
4585 const uint64_t *d1 = (const uint64_t *) v1;
4586 const uint64_t *d2 = (const uint64_t *) v2;
4587
4588 uint n = 25;
4589
4590 while (n--)
4591 {
4592 if (d1[n] > d2[n]) return ( 1);
4593 if (d1[n] < d2[n]) return (-1);
4594 }
4595
4596 return (0);
4597 }
4598
4599 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4600 {
4601 const uint32_t *d1 = (const uint32_t *) v1;
4602 const uint32_t *d2 = (const uint32_t *) v2;
4603
4604 const uint dgst_pos0 = data.dgst_pos0;
4605 const uint dgst_pos1 = data.dgst_pos1;
4606 const uint dgst_pos2 = data.dgst_pos2;
4607 const uint dgst_pos3 = data.dgst_pos3;
4608
4609 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4610 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4611 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4612 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4613 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4614 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4615 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4616 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4617
4618 return (0);
4619 }
4620
4621 void format_debug (char * debug_file, uint debug_mode, unsigned char *orig_plain_ptr, uint orig_plain_len, unsigned char *mod_plain_ptr, uint mod_plain_len, char *rule_buf, int rule_len)
4622 {
4623 uint outfile_autohex = data.outfile_autohex;
4624
4625 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4626
4627 FILE *debug_fp = NULL;
4628
4629 if (debug_file != NULL)
4630 {
4631 debug_fp = fopen (debug_file, "ab");
4632 }
4633 else
4634 {
4635 debug_fp = stderr;
4636 }
4637
4638 if (debug_fp == NULL)
4639 {
4640 log_info ("WARNING: Could not open debug-file for writing");
4641 }
4642 else
4643 {
4644 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4645 {
4646 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4647
4648 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4649 }
4650
4651 fwrite (rule_ptr, rule_len, 1, debug_fp);
4652
4653 if (debug_mode == 4)
4654 {
4655 fputc (':', debug_fp);
4656
4657 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4658 }
4659
4660 fputc ('\n', debug_fp);
4661
4662 if (debug_file != NULL) fclose (debug_fp);
4663 }
4664 }
4665
4666 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4667 {
4668 int needs_hexify = 0;
4669
4670 if (outfile_autohex == 1)
4671 {
4672 for (uint i = 0; i < plain_len; i++)
4673 {
4674 if (plain_ptr[i] < 0x20)
4675 {
4676 needs_hexify = 1;
4677
4678 break;
4679 }
4680
4681 if (plain_ptr[i] > 0x7f)
4682 {
4683 needs_hexify = 1;
4684
4685 break;
4686 }
4687 }
4688 }
4689
4690 if (needs_hexify == 1)
4691 {
4692 fprintf (fp, "$HEX[");
4693
4694 for (uint i = 0; i < plain_len; i++)
4695 {
4696 fprintf (fp, "%02x", plain_ptr[i]);
4697 }
4698
4699 fprintf (fp, "]");
4700 }
4701 else
4702 {
4703 fwrite (plain_ptr, plain_len, 1, fp);
4704 }
4705 }
4706
4707 void format_output (FILE *out_fp, char *out_buf, unsigned char *plain_ptr, const uint plain_len, const uint64_t crackpos, unsigned char *username, const uint user_len)
4708 {
4709 uint outfile_format = data.outfile_format;
4710
4711 char separator = data.separator;
4712
4713 if (outfile_format & OUTFILE_FMT_HASH)
4714 {
4715 fprintf (out_fp, "%s", out_buf);
4716
4717 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4718 {
4719 fputc (separator, out_fp);
4720 }
4721 }
4722 else if (data.username)
4723 {
4724 if (username != NULL)
4725 {
4726 for (uint i = 0; i < user_len; i++)
4727 {
4728 fprintf (out_fp, "%c", username[i]);
4729 }
4730
4731 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4732 {
4733 fputc (separator, out_fp);
4734 }
4735 }
4736 }
4737
4738 if (outfile_format & OUTFILE_FMT_PLAIN)
4739 {
4740 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4741
4742 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4743 {
4744 fputc (separator, out_fp);
4745 }
4746 }
4747
4748 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4749 {
4750 for (uint i = 0; i < plain_len; i++)
4751 {
4752 fprintf (out_fp, "%02x", plain_ptr[i]);
4753 }
4754
4755 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4756 {
4757 fputc (separator, out_fp);
4758 }
4759 }
4760
4761 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4762 {
4763 #ifdef _WIN
4764 __mingw_fprintf (out_fp, "%llu", crackpos);
4765 #endif
4766
4767 #ifdef _POSIX
4768 #ifdef __x86_64__
4769 fprintf (out_fp, "%lu", crackpos);
4770 #else
4771 fprintf (out_fp, "%llu", crackpos);
4772 #endif
4773 #endif
4774 }
4775
4776 fputc ('\n', out_fp);
4777 }
4778
4779 void handle_show_request (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hashes_buf, int (*sort_by_pot) (const void *, const void *), FILE *out_fp)
4780 {
4781 pot_t pot_key;
4782
4783 pot_key.hash.salt = hashes_buf->salt;
4784 pot_key.hash.digest = hashes_buf->digest;
4785
4786 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4787
4788 if (pot_ptr)
4789 {
4790 log_info_nn ("");
4791
4792 input_buf[input_len] = 0;
4793
4794 // user
4795 unsigned char *username = NULL;
4796 uint user_len = 0;
4797
4798 if (data.username)
4799 {
4800 user_t *user = hashes_buf->hash_info->user;
4801
4802 if (user)
4803 {
4804 username = (unsigned char *) (user->user_name);
4805
4806 user_len = user->user_len;
4807 }
4808 }
4809
4810 // do output the line
4811 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4812 }
4813 }
4814
4815 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4816 #define LM_MASKED_PLAIN "[notfound]"
4817
4818 void handle_show_request_lm (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hash_left, hash_t *hash_right, int (*sort_by_pot) (const void *, const void *), FILE *out_fp)
4819 {
4820 // left
4821
4822 pot_t pot_left_key;
4823
4824 pot_left_key.hash.salt = hash_left->salt;
4825 pot_left_key.hash.digest = hash_left->digest;
4826
4827 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4828
4829 // right
4830
4831 uint weak_hash_found = 0;
4832
4833 pot_t pot_right_key;
4834
4835 pot_right_key.hash.salt = hash_right->salt;
4836 pot_right_key.hash.digest = hash_right->digest;
4837
4838 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4839
4840 if (pot_right_ptr == NULL)
4841 {
4842 // special case, if "weak hash"
4843
4844 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4845 {
4846 weak_hash_found = 1;
4847
4848 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4849
4850 // in theory this is not needed, but we are paranoia:
4851
4852 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4853 pot_right_ptr->plain_len = 0;
4854 }
4855 }
4856
4857 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
4858 {
4859 if (weak_hash_found == 1) myfree (pot_right_ptr); // this shouldn't happen at all: if weak_hash_found == 1, than pot_right_ptr is not NULL for sure
4860
4861 return;
4862 }
4863
4864 // at least one half was found:
4865
4866 log_info_nn ("");
4867
4868 input_buf[input_len] = 0;
4869
4870 // user
4871
4872 unsigned char *username = NULL;
4873 uint user_len = 0;
4874
4875 if (data.username)
4876 {
4877 user_t *user = hash_left->hash_info->user;
4878
4879 if (user)
4880 {
4881 username = (unsigned char *) (user->user_name);
4882
4883 user_len = user->user_len;
4884 }
4885 }
4886
4887 // mask the part which was not found
4888
4889 uint left_part_masked = 0;
4890 uint right_part_masked = 0;
4891
4892 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
4893
4894 if (pot_left_ptr == NULL)
4895 {
4896 left_part_masked = 1;
4897
4898 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4899
4900 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
4901
4902 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
4903 pot_left_ptr->plain_len = mask_plain_len;
4904 }
4905
4906 if (pot_right_ptr == NULL)
4907 {
4908 right_part_masked = 1;
4909
4910 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4911
4912 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4913
4914 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
4915 pot_right_ptr->plain_len = mask_plain_len;
4916 }
4917
4918 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
4919
4920 pot_t pot_ptr;
4921
4922 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
4923
4924 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
4925
4926 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
4927
4928 // do output the line
4929
4930 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
4931
4932 if (weak_hash_found == 1) myfree (pot_right_ptr);
4933
4934 if (left_part_masked == 1) myfree (pot_left_ptr);
4935 if (right_part_masked == 1) myfree (pot_right_ptr);
4936 }
4937
4938 void handle_left_request (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hashes_buf, int (*sort_by_pot) (const void *, const void *), FILE *out_fp)
4939 {
4940 pot_t pot_key;
4941
4942 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
4943
4944 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4945
4946 if (pot_ptr == NULL)
4947 {
4948 log_info_nn ("");
4949
4950 input_buf[input_len] = 0;
4951
4952 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
4953 }
4954 }
4955
4956 void handle_left_request_lm (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hash_left, hash_t *hash_right, int (*sort_by_pot) (const void *, const void *), FILE *out_fp)
4957 {
4958 // left
4959
4960 pot_t pot_left_key;
4961
4962 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
4963
4964 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4965
4966 // right
4967
4968 pot_t pot_right_key;
4969
4970 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
4971
4972 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4973
4974 uint weak_hash_found = 0;
4975
4976 if (pot_right_ptr == NULL)
4977 {
4978 // special case, if "weak hash"
4979
4980 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4981 {
4982 weak_hash_found = 1;
4983
4984 // we just need that pot_right_ptr is not a NULL pointer
4985
4986 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4987 }
4988 }
4989
4990 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
4991 {
4992 if (weak_hash_found == 1) myfree (pot_right_ptr);
4993
4994 return;
4995 }
4996
4997 // ... at least one part was not cracked
4998
4999 log_info_nn ("");
5000
5001 input_buf[input_len] = 0;
5002
5003 // only show the hash part which is still not cracked
5004
5005 uint user_len = input_len - 32;
5006
5007 char hash_output[user_len + 33];
5008
5009 memset (hash_output, 0, sizeof (hash_output));
5010
5011 memcpy (hash_output, input_buf, input_len);
5012
5013 if (pot_left_ptr != NULL)
5014 {
5015 // only show right part (because left part was already found)
5016
5017 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5018
5019 hash_output[user_len + 16] = 0;
5020 }
5021
5022 if (pot_right_ptr != NULL)
5023 {
5024 // only show left part (because right part was already found)
5025
5026 memcpy (hash_output + user_len, input_buf + user_len, 16);
5027
5028 hash_output[user_len + 16] = 0;
5029 }
5030
5031 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5032
5033 if (weak_hash_found == 1) myfree (pot_right_ptr);
5034 }
5035
5036 uint devices_to_devicemask (char *gpu_devices)
5037 {
5038 uint gpu_devicemask = 0;
5039
5040 if (gpu_devices)
5041 {
5042 char *devices = strdup (gpu_devices);
5043
5044 char *next = strtok (devices, ",");
5045
5046 do
5047 {
5048 uint gpu_id = atoi (next);
5049
5050 if (gpu_id < 1 || gpu_id > 8)
5051 {
5052 log_error ("ERROR: invalid gpu_id %u specified", gpu_id);
5053
5054 exit (-1);
5055 }
5056
5057 gpu_devicemask |= 1 << (gpu_id - 1);
5058
5059 } while ((next = strtok (NULL, ",")) != NULL);
5060
5061 free (devices);
5062 }
5063
5064 return gpu_devicemask;
5065 }
5066
5067 uint get_random_num (uint min, uint max)
5068 {
5069 if (min == max) return (min);
5070
5071 return (uint) ((rand () % (max - min)) + min);
5072 }
5073
5074 uint32_t mydivc32 (const uint32_t dividend, const uint32_t divisor)
5075 {
5076 uint32_t quotient = dividend / divisor;
5077
5078 if (dividend % divisor) quotient++;
5079
5080 return quotient;
5081 }
5082
5083 uint64_t mydivc64 (const uint64_t dividend, const uint64_t divisor)
5084 {
5085 uint64_t quotient = dividend / divisor;
5086
5087 if (dividend % divisor) quotient++;
5088
5089 return quotient;
5090 }
5091
5092 void format_timer_display (struct tm *tm, char *buf, size_t len)
5093 {
5094 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5095 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5096
5097 if (tm->tm_year - 70)
5098 {
5099 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5100 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5101
5102 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5103 }
5104 else if (tm->tm_yday)
5105 {
5106 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5107 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5108
5109 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5110 }
5111 else if (tm->tm_hour)
5112 {
5113 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5114 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5115
5116 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5117 }
5118 else if (tm->tm_min)
5119 {
5120 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5121 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5122
5123 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5124 }
5125 else
5126 {
5127 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5128
5129 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5130 }
5131 }
5132
5133 void format_speed_display (float val, char *buf, size_t len)
5134 {
5135 if (val <= 0)
5136 {
5137 buf[0] = '0';
5138 buf[1] = ' ';
5139 buf[2] = 0;
5140
5141 return;
5142 }
5143
5144 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5145
5146 uint level = 0;
5147
5148 while (val > 99999)
5149 {
5150 val /= 1000;
5151
5152 level++;
5153 }
5154
5155 /* generate output */
5156
5157 if (level == 0)
5158 {
5159 snprintf (buf, len - 1, "%.0f ", val);
5160 }
5161 else
5162 {
5163 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5164 }
5165 }
5166
5167 void lowercase (char *buf, int len)
5168 {
5169 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5170 }
5171
5172 void uppercase (char *buf, int len)
5173 {
5174 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5175 }
5176
5177 int fgetl (FILE *fp, char *line_buf)
5178 {
5179 int line_len = 0;
5180
5181 while (!feof (fp))
5182 {
5183 const int c = fgetc (fp);
5184
5185 if (c == EOF) break;
5186
5187 line_buf[line_len] = (char) c;
5188
5189 line_len++;
5190
5191 if (line_len == BUFSIZ) line_len--;
5192
5193 if (c == '\n') break;
5194 }
5195
5196 if (line_len == 0) return 0;
5197
5198 if (line_buf[line_len - 1] == '\n')
5199 {
5200 line_len--;
5201
5202 line_buf[line_len] = 0;
5203 }
5204
5205 if (line_len == 0) return 0;
5206
5207 if (line_buf[line_len - 1] == '\r')
5208 {
5209 line_len--;
5210
5211 line_buf[line_len] = 0;
5212 }
5213
5214 return (line_len);
5215 }
5216
5217 int in_superchop (char *buf)
5218 {
5219 int len = strlen (buf);
5220
5221 while (len)
5222 {
5223 if (buf[len - 1] == '\n')
5224 {
5225 len--;
5226
5227 continue;
5228 }
5229
5230 if (buf[len - 1] == '\r')
5231 {
5232 len--;
5233
5234 continue;
5235 }
5236
5237 break;
5238 }
5239
5240 buf[len] = 0;
5241
5242 return len;
5243 }
5244
5245 char **scan_directory (const char *path)
5246 {
5247 char *tmp_path = mystrdup (path);
5248
5249 size_t tmp_path_len = strlen (tmp_path);
5250
5251 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5252 {
5253 tmp_path[tmp_path_len - 1] = 0;
5254
5255 tmp_path_len = strlen (tmp_path);
5256 }
5257
5258 char **files = NULL;
5259
5260 int num_files = 0;
5261
5262 DIR *d;
5263
5264 if ((d = opendir (tmp_path)) != NULL)
5265 {
5266 struct dirent *de;
5267
5268 while ((de = readdir (d)) != NULL)
5269 {
5270 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5271
5272 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5273
5274 char *path_file = (char *) mymalloc (path_size + 1);
5275
5276 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5277
5278 path_file[path_size] = 0;
5279
5280 DIR *d_test;
5281
5282 if ((d_test = opendir (path_file)) != NULL)
5283 {
5284 closedir (d_test);
5285
5286 myfree (path_file);
5287 }
5288 else
5289 {
5290 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5291
5292 num_files++;
5293
5294 files[num_files - 1] = path_file;
5295 }
5296 }
5297
5298 closedir (d);
5299 }
5300 else if (errno == ENOTDIR)
5301 {
5302 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5303
5304 num_files++;
5305
5306 files[num_files - 1] = mystrdup (path);
5307 }
5308
5309 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5310
5311 num_files++;
5312
5313 files[num_files - 1] = NULL;
5314
5315 myfree (tmp_path);
5316
5317 return (files);
5318 }
5319
5320 int count_dictionaries (char **dictionary_files)
5321 {
5322 if (dictionary_files == NULL) return 0;
5323
5324 int cnt = 0;
5325
5326 for (int d = 0; dictionary_files[d] != NULL; d++)
5327 {
5328 cnt++;
5329 }
5330
5331 return (cnt);
5332 }
5333
5334 char *stroptitype (const uint opti_type)
5335 {
5336 switch (opti_type)
5337 {
5338 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5339 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5340 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5341 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5342 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5343 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5344 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5345 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5346 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5347 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5348 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5349 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5350 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5351 case OPTI_TYPE_SCALAR_MODE: return ((char *) OPTI_STR_SCALAR_MODE); break;
5352 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5353 }
5354
5355 return (NULL);
5356 }
5357
5358 char *strparser (const uint parser_status)
5359 {
5360 switch (parser_status)
5361 {
5362 case PARSER_OK: return ((char *) PA_000); break;
5363 case PARSER_COMMENT: return ((char *) PA_001); break;
5364 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5365 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5366 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5367 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5368 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5369 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5370 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5371 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5372 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5373 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5374 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5375 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5376 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5377 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5378 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5379 }
5380
5381 return ((char *) PA_255);
5382 }
5383
5384 char *strhashtype (const uint hash_mode)
5385 {
5386 switch (hash_mode)
5387 {
5388 case 0: return ((char *) HT_00000); break;
5389 case 10: return ((char *) HT_00010); break;
5390 case 11: return ((char *) HT_00011); break;
5391 case 12: return ((char *) HT_00012); break;
5392 case 20: return ((char *) HT_00020); break;
5393 case 21: return ((char *) HT_00021); break;
5394 case 22: return ((char *) HT_00022); break;
5395 case 23: return ((char *) HT_00023); break;
5396 case 30: return ((char *) HT_00030); break;
5397 case 40: return ((char *) HT_00040); break;
5398 case 50: return ((char *) HT_00050); break;
5399 case 60: return ((char *) HT_00060); break;
5400 case 100: return ((char *) HT_00100); break;
5401 case 101: return ((char *) HT_00101); break;
5402 case 110: return ((char *) HT_00110); break;
5403 case 111: return ((char *) HT_00111); break;
5404 case 112: return ((char *) HT_00112); break;
5405 case 120: return ((char *) HT_00120); break;
5406 case 121: return ((char *) HT_00121); break;
5407 case 122: return ((char *) HT_00122); break;
5408 case 124: return ((char *) HT_00124); break;
5409 case 130: return ((char *) HT_00130); break;
5410 case 131: return ((char *) HT_00131); break;
5411 case 132: return ((char *) HT_00132); break;
5412 case 133: return ((char *) HT_00133); break;
5413 case 140: return ((char *) HT_00140); break;
5414 case 141: return ((char *) HT_00141); break;
5415 case 150: return ((char *) HT_00150); break;
5416 case 160: return ((char *) HT_00160); break;
5417 case 190: return ((char *) HT_00190); break;
5418 case 200: return ((char *) HT_00200); break;
5419 case 300: return ((char *) HT_00300); break;
5420 case 400: return ((char *) HT_00400); break;
5421 case 500: return ((char *) HT_00500); break;
5422 case 501: return ((char *) HT_00501); break;
5423 case 900: return ((char *) HT_00900); break;
5424 case 910: return ((char *) HT_00910); break;
5425 case 1000: return ((char *) HT_01000); break;
5426 case 1100: return ((char *) HT_01100); break;
5427 case 1400: return ((char *) HT_01400); break;
5428 case 1410: return ((char *) HT_01410); break;
5429 case 1420: return ((char *) HT_01420); break;
5430 case 1421: return ((char *) HT_01421); break;
5431 case 1430: return ((char *) HT_01430); break;
5432 case 1440: return ((char *) HT_01440); break;
5433 case 1441: return ((char *) HT_01441); break;
5434 case 1450: return ((char *) HT_01450); break;
5435 case 1460: return ((char *) HT_01460); break;
5436 case 1500: return ((char *) HT_01500); break;
5437 case 1600: return ((char *) HT_01600); break;
5438 case 1700: return ((char *) HT_01700); break;
5439 case 1710: return ((char *) HT_01710); break;
5440 case 1711: return ((char *) HT_01711); break;
5441 case 1720: return ((char *) HT_01720); break;
5442 case 1722: return ((char *) HT_01722); break;
5443 case 1730: return ((char *) HT_01730); break;
5444 case 1731: return ((char *) HT_01731); break;
5445 case 1740: return ((char *) HT_01740); break;
5446 case 1750: return ((char *) HT_01750); break;
5447 case 1760: return ((char *) HT_01760); break;
5448 case 1800: return ((char *) HT_01800); break;
5449 case 2100: return ((char *) HT_02100); break;
5450 case 2400: return ((char *) HT_02400); break;
5451 case 2410: return ((char *) HT_02410); break;
5452 case 2500: return ((char *) HT_02500); break;
5453 case 2600: return ((char *) HT_02600); break;
5454 case 2611: return ((char *) HT_02611); break;
5455 case 2612: return ((char *) HT_02612); break;
5456 case 2711: return ((char *) HT_02711); break;
5457 case 2811: return ((char *) HT_02811); break;
5458 case 3000: return ((char *) HT_03000); break;
5459 case 3100: return ((char *) HT_03100); break;
5460 case 3200: return ((char *) HT_03200); break;
5461 case 3710: return ((char *) HT_03710); break;
5462 case 3711: return ((char *) HT_03711); break;
5463 case 3800: return ((char *) HT_03800); break;
5464 case 4300: return ((char *) HT_04300); break;
5465 case 4400: return ((char *) HT_04400); break;
5466 case 4500: return ((char *) HT_04500); break;
5467 case 4700: return ((char *) HT_04700); break;
5468 case 4800: return ((char *) HT_04800); break;
5469 case 4900: return ((char *) HT_04900); break;
5470 case 5000: return ((char *) HT_05000); break;
5471 case 5100: return ((char *) HT_05100); break;
5472 case 5200: return ((char *) HT_05200); break;
5473 case 5300: return ((char *) HT_05300); break;
5474 case 5400: return ((char *) HT_05400); break;
5475 case 5500: return ((char *) HT_05500); break;
5476 case 5600: return ((char *) HT_05600); break;
5477 case 5700: return ((char *) HT_05700); break;
5478 case 5800: return ((char *) HT_05800); break;
5479 case 6000: return ((char *) HT_06000); break;
5480 case 6100: return ((char *) HT_06100); break;
5481 case 6211: return ((char *) HT_06211); break;
5482 case 6212: return ((char *) HT_06212); break;
5483 case 6213: return ((char *) HT_06213); break;
5484 case 6221: return ((char *) HT_06221); break;
5485 case 6222: return ((char *) HT_06222); break;
5486 case 6223: return ((char *) HT_06223); break;
5487 case 6231: return ((char *) HT_06231); break;
5488 case 6232: return ((char *) HT_06232); break;
5489 case 6233: return ((char *) HT_06233); break;
5490 case 6241: return ((char *) HT_06241); break;
5491 case 6242: return ((char *) HT_06242); break;
5492 case 6243: return ((char *) HT_06243); break;
5493 case 6300: return ((char *) HT_06300); break;
5494 case 6400: return ((char *) HT_06400); break;
5495 case 6500: return ((char *) HT_06500); break;
5496 case 6600: return ((char *) HT_06600); break;
5497 case 6700: return ((char *) HT_06700); break;
5498 case 6800: return ((char *) HT_06800); break;
5499 case 6900: return ((char *) HT_06900); break;
5500 case 7100: return ((char *) HT_07100); break;
5501 case 7200: return ((char *) HT_07200); break;
5502 case 7300: return ((char *) HT_07300); break;
5503 case 7400: return ((char *) HT_07400); break;
5504 case 7500: return ((char *) HT_07500); break;
5505 case 7600: return ((char *) HT_07600); break;
5506 case 7700: return ((char *) HT_07700); break;
5507 case 7800: return ((char *) HT_07800); break;
5508 case 7900: return ((char *) HT_07900); break;
5509 case 8000: return ((char *) HT_08000); break;
5510 case 8100: return ((char *) HT_08100); break;
5511 case 8200: return ((char *) HT_08200); break;
5512 case 8300: return ((char *) HT_08300); break;
5513 case 8400: return ((char *) HT_08400); break;
5514 case 8500: return ((char *) HT_08500); break;
5515 case 8600: return ((char *) HT_08600); break;
5516 case 8700: return ((char *) HT_08700); break;
5517 case 8800: return ((char *) HT_08800); break;
5518 case 8900: return ((char *) HT_08900); break;
5519 case 9000: return ((char *) HT_09000); break;
5520 case 9100: return ((char *) HT_09100); break;
5521 case 9200: return ((char *) HT_09200); break;
5522 case 9300: return ((char *) HT_09300); break;
5523 case 9400: return ((char *) HT_09400); break;
5524 case 9500: return ((char *) HT_09500); break;
5525 case 9600: return ((char *) HT_09600); break;
5526 case 9700: return ((char *) HT_09700); break;
5527 case 9710: return ((char *) HT_09710); break;
5528 case 9720: return ((char *) HT_09720); break;
5529 case 9800: return ((char *) HT_09800); break;
5530 case 9810: return ((char *) HT_09810); break;
5531 case 9820: return ((char *) HT_09820); break;
5532 case 9900: return ((char *) HT_09900); break;
5533 case 10000: return ((char *) HT_10000); break;
5534 case 10100: return ((char *) HT_10100); break;
5535 case 10200: return ((char *) HT_10200); break;
5536 case 10300: return ((char *) HT_10300); break;
5537 case 10400: return ((char *) HT_10400); break;
5538 case 10410: return ((char *) HT_10410); break;
5539 case 10420: return ((char *) HT_10420); break;
5540 case 10500: return ((char *) HT_10500); break;
5541 case 10600: return ((char *) HT_10600); break;
5542 case 10700: return ((char *) HT_10700); break;
5543 case 10800: return ((char *) HT_10800); break;
5544 case 10900: return ((char *) HT_10900); break;
5545 case 11000: return ((char *) HT_11000); break;
5546 case 11100: return ((char *) HT_11100); break;
5547 case 11200: return ((char *) HT_11200); break;
5548 case 11300: return ((char *) HT_11300); break;
5549 case 11400: return ((char *) HT_11400); break;
5550 case 11500: return ((char *) HT_11500); break;
5551 case 11600: return ((char *) HT_11600); break;
5552 case 11700: return ((char *) HT_11700); break;
5553 case 11800: return ((char *) HT_11800); break;
5554 case 11900: return ((char *) HT_11900); break;
5555 case 12000: return ((char *) HT_12000); break;
5556 case 12100: return ((char *) HT_12100); break;
5557 case 12200: return ((char *) HT_12200); break;
5558 case 12300: return ((char *) HT_12300); break;
5559 case 12400: return ((char *) HT_12400); break;
5560 case 12500: return ((char *) HT_12500); break;
5561 case 12600: return ((char *) HT_12600); break;
5562 case 12700: return ((char *) HT_12700); break;
5563 case 12800: return ((char *) HT_12800); break;
5564 }
5565
5566 return ((char *) "Unknown");
5567 }
5568
5569 char *strstatus (const uint devices_status)
5570 {
5571 switch (devices_status)
5572 {
5573 case STATUS_INIT: return ((char *) ST_0000); break;
5574 case STATUS_STARTING: return ((char *) ST_0001); break;
5575 case STATUS_RUNNING: return ((char *) ST_0002); break;
5576 case STATUS_PAUSED: return ((char *) ST_0003); break;
5577 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5578 case STATUS_CRACKED: return ((char *) ST_0005); break;
5579 case STATUS_ABORTED: return ((char *) ST_0006); break;
5580 case STATUS_QUIT: return ((char *) ST_0007); break;
5581 case STATUS_BYPASS: return ((char *) ST_0008); break;
5582 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5583 }
5584
5585 return ((char *) "Unknown");
5586 }
5587
5588 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5589 {
5590 uint hash_type = data.hash_type;
5591 uint hash_mode = data.hash_mode;
5592 uint salt_type = data.salt_type;
5593 uint opts_type = data.opts_type;
5594 uint opti_type = data.opti_type;
5595 uint dgst_size = data.dgst_size;
5596
5597 char *hashfile = data.hashfile;
5598
5599 uint len = 4096;
5600
5601 uint digest_buf[64];
5602
5603 uint64_t *digest_buf64 = (uint64_t *) digest_buf;
5604
5605 char *digests_buf_ptr = (char *) data.digests_buf;
5606
5607 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5608
5609 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5610 {
5611 uint tt;
5612
5613 switch (hash_type)
5614 {
5615 case HASH_TYPE_DESCRYPT:
5616 FP (digest_buf[1], digest_buf[0], tt);
5617 break;
5618
5619 case HASH_TYPE_DESRACF:
5620 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 29);
5621 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 29);
5622
5623 FP (digest_buf[1], digest_buf[0], tt);
5624 break;
5625
5626 case HASH_TYPE_LM:
5627 FP (digest_buf[1], digest_buf[0], tt);
5628 break;
5629
5630 case HASH_TYPE_NETNTLM:
5631 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 29);
5632 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 29);
5633 digest_buf[2] = ROTATE_LEFT (digest_buf[2], 29);
5634 digest_buf[3] = ROTATE_LEFT (digest_buf[3], 29);
5635
5636 FP (digest_buf[1], digest_buf[0], tt);
5637 FP (digest_buf[3], digest_buf[2], tt);
5638 break;
5639
5640 case HASH_TYPE_BSDICRYPT:
5641 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 31);
5642 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 31);
5643
5644 FP (digest_buf[1], digest_buf[0], tt);
5645 break;
5646 }
5647 }
5648
5649 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5650 {
5651 switch (hash_type)
5652 {
5653 case HASH_TYPE_MD4:
5654 digest_buf[0] += MD4M_A;
5655 digest_buf[1] += MD4M_B;
5656 digest_buf[2] += MD4M_C;
5657 digest_buf[3] += MD4M_D;
5658 break;
5659
5660 case HASH_TYPE_MD5:
5661 digest_buf[0] += MD5M_A;
5662 digest_buf[1] += MD5M_B;
5663 digest_buf[2] += MD5M_C;
5664 digest_buf[3] += MD5M_D;
5665 break;
5666
5667 case HASH_TYPE_SHA1:
5668 digest_buf[0] += SHA1M_A;
5669 digest_buf[1] += SHA1M_B;
5670 digest_buf[2] += SHA1M_C;
5671 digest_buf[3] += SHA1M_D;
5672 digest_buf[4] += SHA1M_E;
5673 break;
5674
5675 case HASH_TYPE_SHA256:
5676 digest_buf[0] += SHA256M_A;
5677 digest_buf[1] += SHA256M_B;
5678 digest_buf[2] += SHA256M_C;
5679 digest_buf[3] += SHA256M_D;
5680 digest_buf[4] += SHA256M_E;
5681 digest_buf[5] += SHA256M_F;
5682 digest_buf[6] += SHA256M_G;
5683 digest_buf[7] += SHA256M_H;
5684 break;
5685
5686 case HASH_TYPE_SHA384:
5687 digest_buf64[0] += SHA384M_A;
5688 digest_buf64[1] += SHA384M_B;
5689 digest_buf64[2] += SHA384M_C;
5690 digest_buf64[3] += SHA384M_D;
5691 digest_buf64[4] += SHA384M_E;
5692 digest_buf64[5] += SHA384M_F;
5693 digest_buf64[6] += 0;
5694 digest_buf64[7] += 0;
5695 break;
5696
5697 case HASH_TYPE_SHA512:
5698 digest_buf64[0] += SHA512M_A;
5699 digest_buf64[1] += SHA512M_B;
5700 digest_buf64[2] += SHA512M_C;
5701 digest_buf64[3] += SHA512M_D;
5702 digest_buf64[4] += SHA512M_E;
5703 digest_buf64[5] += SHA512M_F;
5704 digest_buf64[6] += SHA512M_G;
5705 digest_buf64[7] += SHA512M_H;
5706 break;
5707 }
5708 }
5709
5710 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5711 {
5712 if (dgst_size == DGST_SIZE_4_2)
5713 {
5714 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5715 }
5716 else if (dgst_size == DGST_SIZE_4_4)
5717 {
5718 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5719 }
5720 else if (dgst_size == DGST_SIZE_4_5)
5721 {
5722 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5723 }
5724 else if (dgst_size == DGST_SIZE_4_6)
5725 {
5726 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5727 }
5728 else if (dgst_size == DGST_SIZE_4_8)
5729 {
5730 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5731 }
5732 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
5733 {
5734 if (hash_type == HASH_TYPE_WHIRLPOOL)
5735 {
5736 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5737 }
5738 else if (hash_type == HASH_TYPE_SHA384)
5739 {
5740 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5741 }
5742 else if (hash_type == HASH_TYPE_SHA512)
5743 {
5744 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5745 }
5746 else if (hash_type == HASH_TYPE_GOST)
5747 {
5748 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5749 }
5750 }
5751 else if (dgst_size == DGST_SIZE_4_64)
5752 {
5753 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5754 }
5755 else if (dgst_size == DGST_SIZE_8_25)
5756 {
5757 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5758 }
5759 }
5760
5761 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
5762 | (data.salt_type == SALT_TYPE_EXTERN)
5763 | (data.salt_type == SALT_TYPE_EMBEDDED));
5764
5765 salt_t salt;
5766
5767 if (isSalted)
5768 {
5769 memset (&salt, 0, sizeof (salt_t));
5770
5771 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
5772
5773 char *ptr = (char *) salt.salt_buf;
5774
5775 uint len = salt.salt_len;
5776
5777 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5778 {
5779 uint tt;
5780
5781 switch (hash_type)
5782 {
5783 case HASH_TYPE_NETNTLM:
5784
5785 salt.salt_buf[0] = ROTATE_RIGHT (salt.salt_buf[0], 3);
5786 salt.salt_buf[1] = ROTATE_RIGHT (salt.salt_buf[1], 3);
5787
5788 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
5789
5790 break;
5791 }
5792 }
5793
5794 if (opts_type & OPTS_TYPE_ST_UNICODE)
5795 {
5796 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5797 {
5798 ptr[i] = ptr[j];
5799 }
5800
5801 len = len / 2;
5802 }
5803
5804 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
5805 {
5806 uint max = salt.salt_len / 4;
5807
5808 if (len % 4) max++;
5809
5810 for (uint i = 0; i < max; i++)
5811 {
5812 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
5813 }
5814 }
5815
5816 if (opts_type & OPTS_TYPE_ST_HEX)
5817 {
5818 char tmp[64];
5819
5820 memset (tmp, 0, sizeof (tmp));
5821
5822 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5823 {
5824 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
5825 }
5826
5827 len = len * 2;
5828
5829 memcpy (ptr, tmp, len);
5830 }
5831
5832 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
5833
5834 memset (ptr + len, 0, memset_size);
5835
5836 salt.salt_len = len;
5837 }
5838
5839 //
5840 // some modes require special encoding
5841 //
5842
5843 uint out_buf_plain[256];
5844 uint out_buf_salt[256];
5845
5846 char tmp_buf[1024];
5847
5848 memset (out_buf_plain, 0, sizeof (out_buf_plain));
5849 memset (out_buf_salt, 0, sizeof (out_buf_salt));
5850
5851 memset (tmp_buf, 0, sizeof (tmp_buf));
5852
5853 char *ptr_plain = (char *) out_buf_plain;
5854 char *ptr_salt = (char *) out_buf_salt;
5855
5856 if (hash_mode == 22)
5857 {
5858 char username[30];
5859
5860 memset (username, 0, sizeof (username));
5861
5862 memcpy (username, salt.salt_buf, salt.salt_len - 22);
5863
5864 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
5865
5866 uint16_t *ptr = (uint16_t *) digest_buf;
5867
5868 tmp_buf[ 0] = sig[0];
5869 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
5870 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
5871 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
5872 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
5873 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
5874 tmp_buf[ 6] = sig[1];
5875 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
5876 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
5877 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
5878 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
5879 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
5880 tmp_buf[12] = sig[2];
5881 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
5882 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
5883 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
5884 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
5885 tmp_buf[17] = sig[3];
5886 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
5887 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
5888 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
5889 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
5890 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
5891 tmp_buf[23] = sig[4];
5892 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
5893 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
5894 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
5895 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
5896 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
5897 tmp_buf[29] = sig[5];
5898
5899 snprintf (out_buf, len-1, "%s:%s",
5900 tmp_buf,
5901 username);
5902 }
5903 else if (hash_mode == 23)
5904 {
5905 // do not show the \nskyper\n part in output
5906
5907 char *salt_buf_ptr = (char *) salt.salt_buf;
5908
5909 salt_buf_ptr[salt.salt_len - 8] = 0;
5910
5911 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
5912 digest_buf[0],
5913 digest_buf[1],
5914 digest_buf[2],
5915 digest_buf[3],
5916 salt_buf_ptr);
5917 }
5918 else if (hash_mode == 101)
5919 {
5920 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5921
5922 digest_buf[0] = byte_swap_32 (digest_buf[0]);
5923 digest_buf[1] = byte_swap_32 (digest_buf[1]);
5924 digest_buf[2] = byte_swap_32 (digest_buf[2]);
5925 digest_buf[3] = byte_swap_32 (digest_buf[3]);
5926 digest_buf[4] = byte_swap_32 (digest_buf[4]);
5927
5928 memcpy (tmp_buf, digest_buf, 20);
5929
5930 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
5931
5932 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
5933 }
5934 else if (hash_mode == 111)
5935 {
5936 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5937
5938 digest_buf[0] = byte_swap_32 (digest_buf[0]);
5939 digest_buf[1] = byte_swap_32 (digest_buf[1]);
5940 digest_buf[2] = byte_swap_32 (digest_buf[2]);
5941 digest_buf[3] = byte_swap_32 (digest_buf[3]);
5942 digest_buf[4] = byte_swap_32 (digest_buf[4]);
5943
5944 memcpy (tmp_buf, digest_buf, 20);
5945 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
5946
5947 base64_encode (int_to_base64, tmp_buf, 20 + salt.salt_len, ptr_plain);
5948
5949 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
5950 }
5951 else if (hash_mode == 122)
5952 {
5953 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
5954 (unsigned char *) salt.salt_buf,
5955 digest_buf[0],
5956 digest_buf[1],
5957 digest_buf[2],
5958 digest_buf[3],
5959 digest_buf[4]);
5960 }
5961 else if (hash_mode == 124)
5962 {
5963 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
5964 (unsigned char *) salt.salt_buf,
5965 digest_buf[0],
5966 digest_buf[1],
5967 digest_buf[2],
5968 digest_buf[3],
5969 digest_buf[4]);
5970 }
5971 else if (hash_mode == 131)
5972 {
5973 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
5974 (unsigned char *) salt.salt_buf,
5975 0, 0, 0, 0, 0,
5976 digest_buf[0],
5977 digest_buf[1],
5978 digest_buf[2],
5979 digest_buf[3],
5980 digest_buf[4]);
5981 }
5982 else if (hash_mode == 132)
5983 {
5984 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
5985 (unsigned char *) salt.salt_buf,
5986 digest_buf[0],
5987 digest_buf[1],
5988 digest_buf[2],
5989 digest_buf[3],
5990 digest_buf[4]);
5991 }
5992 else if (hash_mode == 133)
5993 {
5994 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5995
5996 digest_buf[0] = byte_swap_32 (digest_buf[0]);
5997 digest_buf[1] = byte_swap_32 (digest_buf[1]);
5998 digest_buf[2] = byte_swap_32 (digest_buf[2]);
5999 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6000 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6001
6002 memcpy (tmp_buf, digest_buf, 20);
6003
6004 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
6005
6006 snprintf (out_buf, len-1, "%s", ptr_plain);
6007 }
6008 else if (hash_mode == 141)
6009 {
6010 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6011
6012 base64_encode (int_to_base64, tmp_buf, salt.salt_len, ptr_salt);
6013
6014 memset (tmp_buf, 0, sizeof (tmp_buf));
6015
6016 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6017
6018 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6019 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6020 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6021 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6022 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6023
6024 memcpy (tmp_buf, digest_buf, 20);
6025
6026 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
6027
6028 ptr_plain[27] = 0;
6029
6030 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6031 }
6032 else if (hash_mode == 400)
6033 {
6034 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6035
6036 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6037 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6038 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6039 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6040
6041 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6042
6043 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6044 }
6045 else if (hash_mode == 500)
6046 {
6047 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6048
6049 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6050 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6051 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6052 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6053
6054 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6055
6056 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6057 {
6058 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6059 }
6060 else
6061 {
6062 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6063 }
6064 }
6065 else if (hash_mode == 501)
6066 {
6067 uint digest_idx = salt.digests_offset + digest_pos;
6068
6069 hashinfo_t **hashinfo_ptr = data.hash_info;
6070 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6071
6072 snprintf (out_buf, len-1, "%s", hash_buf);
6073 }
6074 else if (hash_mode == 1421)
6075 {
6076 uint8_t *salt_ptr = (uint8_t *) salt.salt_buf;
6077
6078 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6079 salt_ptr[0],
6080 salt_ptr[1],
6081 salt_ptr[2],
6082 salt_ptr[3],
6083 salt_ptr[4],
6084 salt_ptr[5],
6085 digest_buf[0],
6086 digest_buf[1],
6087 digest_buf[2],
6088 digest_buf[3],
6089 digest_buf[4],
6090 digest_buf[5],
6091 digest_buf[6],
6092 digest_buf[7]);
6093 }
6094 else if (hash_mode == 1441)
6095 {
6096 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6097
6098 base64_encode (int_to_base64, tmp_buf, salt.salt_len, ptr_salt);
6099
6100 memset (tmp_buf, 0, sizeof (tmp_buf));
6101
6102 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6103
6104 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6105 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6106 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6107 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6108 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6109 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6110 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6111 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6112
6113 memcpy (tmp_buf, digest_buf, 32);
6114
6115 base64_encode (int_to_base64, tmp_buf, 32, ptr_plain);
6116
6117 ptr_plain[43] = 0;
6118
6119 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6120 }
6121 else if (hash_mode == 1500)
6122 {
6123 out_buf[0] = salt.salt_sign[0] & 0xff;
6124 out_buf[1] = salt.salt_sign[1] & 0xff;
6125 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6126 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6127 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6128
6129 memset (tmp_buf, 0, sizeof (tmp_buf));
6130
6131 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6132
6133 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6134 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6135
6136 memcpy (tmp_buf, digest_buf, 8);
6137
6138 base64_encode (int_to_itoa64, tmp_buf, 8, ptr_plain);
6139
6140 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6141
6142 out_buf[13] = 0;
6143 }
6144 else if (hash_mode == 1600)
6145 {
6146 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6147
6148 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6149 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6150 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6151 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6152
6153 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6154
6155 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6156 {
6157 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6158 }
6159 else
6160 {
6161 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6162 }
6163 }
6164 else if (hash_mode == 1711)
6165 {
6166 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6167
6168 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6169 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6170 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6171 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6172 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6173 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6174 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6175 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6176
6177 memcpy (tmp_buf, digest_buf, 64);
6178 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6179
6180 base64_encode (int_to_base64, tmp_buf, 64 + salt.salt_len, ptr_plain);
6181
6182 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6183 }
6184 else if (hash_mode == 1722)
6185 {
6186 uint *ptr = digest_buf;
6187
6188 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6189 (unsigned char *) salt.salt_buf,
6190 ptr[ 1], ptr[ 0],
6191 ptr[ 3], ptr[ 2],
6192 ptr[ 5], ptr[ 4],
6193 ptr[ 7], ptr[ 6],
6194 ptr[ 9], ptr[ 8],
6195 ptr[11], ptr[10],
6196 ptr[13], ptr[12],
6197 ptr[15], ptr[14]);
6198 }
6199 else if (hash_mode == 1731)
6200 {
6201 uint *ptr = digest_buf;
6202
6203 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6204 (unsigned char *) salt.salt_buf,
6205 ptr[ 1], ptr[ 0],
6206 ptr[ 3], ptr[ 2],
6207 ptr[ 5], ptr[ 4],
6208 ptr[ 7], ptr[ 6],
6209 ptr[ 9], ptr[ 8],
6210 ptr[11], ptr[10],
6211 ptr[13], ptr[12],
6212 ptr[15], ptr[14]);
6213 }
6214 else if (hash_mode == 1800)
6215 {
6216 // temp workaround
6217
6218 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6219 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6220 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6221 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6222 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6223 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6224 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6225 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6226
6227 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6228
6229 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6230 {
6231 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6232 }
6233 else
6234 {
6235 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6236 }
6237 }
6238 else if (hash_mode == 2100)
6239 {
6240 uint pos = 0;
6241
6242 snprintf (out_buf + pos, len-1, "%s%i#",
6243 SIGNATURE_DCC2,
6244 salt.salt_iter + 1);
6245
6246 uint signature_len = strlen (out_buf);
6247
6248 pos += signature_len;
6249 len -= signature_len;
6250
6251 char *salt_ptr = (char *) salt.salt_buf;
6252
6253 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6254
6255 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6256 byte_swap_32 (digest_buf[0]),
6257 byte_swap_32 (digest_buf[1]),
6258 byte_swap_32 (digest_buf[2]),
6259 byte_swap_32 (digest_buf[3]));
6260 }
6261 else if ((hash_mode == 2400) || (hash_mode == 2410))
6262 {
6263 memcpy (tmp_buf, digest_buf, 16);
6264
6265 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6266
6267 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6268 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6269 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6270 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6271
6272 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6273 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6274 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6275 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6276
6277 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6278 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6279 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6280 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6281
6282 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6283 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6284 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6285 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6286
6287 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6288 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6289 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6290 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6291
6292 out_buf[16] = 0;
6293 }
6294 else if (hash_mode == 2500)
6295 {
6296 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6297
6298 wpa_t *wpa = &wpas[salt_pos];
6299
6300 uint pke[25];
6301
6302 char *pke_ptr = (char *) pke;
6303
6304 for (uint i = 0; i < 25; i++)
6305 {
6306 pke[i] = byte_swap_32 (wpa->pke[i]);
6307 }
6308
6309 unsigned char mac1[6];
6310 unsigned char mac2[6];
6311
6312 memcpy (mac1, pke_ptr + 23, 6);
6313 memcpy (mac2, pke_ptr + 29, 6);
6314
6315 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6316 (char *) salt.salt_buf,
6317 mac1[0],
6318 mac1[1],
6319 mac1[2],
6320 mac1[3],
6321 mac1[4],
6322 mac1[5],
6323 mac2[0],
6324 mac2[1],
6325 mac2[2],
6326 mac2[3],
6327 mac2[4],
6328 mac2[5]);
6329 }
6330 else if (hash_mode == 4400)
6331 {
6332 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6333 byte_swap_32 (digest_buf[0]),
6334 byte_swap_32 (digest_buf[1]),
6335 byte_swap_32 (digest_buf[2]),
6336 byte_swap_32 (digest_buf[3]));
6337 }
6338 else if (hash_mode == 4700)
6339 {
6340 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6341 byte_swap_32 (digest_buf[0]),
6342 byte_swap_32 (digest_buf[1]),
6343 byte_swap_32 (digest_buf[2]),
6344 byte_swap_32 (digest_buf[3]),
6345 byte_swap_32 (digest_buf[4]));
6346 }
6347 else if (hash_mode == 4800)
6348 {
6349 uint8_t chap_id_byte = (uint8_t) salt.salt_buf[4];
6350
6351 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6352 digest_buf[0],
6353 digest_buf[1],
6354 digest_buf[2],
6355 digest_buf[3],
6356 byte_swap_32 (salt.salt_buf[0]),
6357 byte_swap_32 (salt.salt_buf[1]),
6358 byte_swap_32 (salt.salt_buf[2]),
6359 byte_swap_32 (salt.salt_buf[3]),
6360 chap_id_byte);
6361 }
6362 else if (hash_mode == 4900)
6363 {
6364 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6365 byte_swap_32 (digest_buf[0]),
6366 byte_swap_32 (digest_buf[1]),
6367 byte_swap_32 (digest_buf[2]),
6368 byte_swap_32 (digest_buf[3]),
6369 byte_swap_32 (digest_buf[4]));
6370 }
6371 else if (hash_mode == 5100)
6372 {
6373 snprintf (out_buf, len-1, "%08x%08x",
6374 digest_buf[0],
6375 digest_buf[1]);
6376 }
6377 else if (hash_mode == 5200)
6378 {
6379 snprintf (out_buf, len-1, "%s", hashfile);
6380 }
6381 else if (hash_mode == 5300)
6382 {
6383 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6384
6385 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6386
6387 int buf_len = len -1;
6388
6389 // msg_buf
6390
6391 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6392
6393 for (uint i = 0; i < ikepsk_msg_len; i++)
6394 {
6395 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6396 {
6397 snprintf (out_buf, buf_len, ":");
6398
6399 buf_len--;
6400 out_buf++;
6401 }
6402
6403 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6404
6405 buf_len -= 8;
6406 out_buf += 8;
6407 }
6408
6409 // nr_buf
6410
6411 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6412
6413 for (uint i = 0; i < ikepsk_nr_len; i++)
6414 {
6415 if ((i == 0) || (i == 5))
6416 {
6417 snprintf (out_buf, buf_len, ":");
6418
6419 buf_len--;
6420 out_buf++;
6421 }
6422
6423 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6424
6425 buf_len -= 8;
6426 out_buf += 8;
6427 }
6428
6429 // digest_buf
6430
6431 for (uint i = 0; i < 4; i++)
6432 {
6433 if (i == 0)
6434 {
6435 snprintf (out_buf, buf_len, ":");
6436
6437 buf_len--;
6438 out_buf++;
6439 }
6440
6441 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6442
6443 buf_len -= 8;
6444 out_buf += 8;
6445 }
6446 }
6447 else if (hash_mode == 5400)
6448 {
6449 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6450
6451 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6452
6453 int buf_len = len -1;
6454
6455 // msg_buf
6456
6457 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6458
6459 for (uint i = 0; i < ikepsk_msg_len; i++)
6460 {
6461 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6462 {
6463 snprintf (out_buf, buf_len, ":");
6464
6465 buf_len--;
6466 out_buf++;
6467 }
6468
6469 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6470
6471 buf_len -= 8;
6472 out_buf += 8;
6473 }
6474
6475 // nr_buf
6476
6477 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6478
6479 for (uint i = 0; i < ikepsk_nr_len; i++)
6480 {
6481 if ((i == 0) || (i == 5))
6482 {
6483 snprintf (out_buf, buf_len, ":");
6484
6485 buf_len--;
6486 out_buf++;
6487 }
6488
6489 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6490
6491 buf_len -= 8;
6492 out_buf += 8;
6493 }
6494
6495 // digest_buf
6496
6497 for (uint i = 0; i < 5; i++)
6498 {
6499 if (i == 0)
6500 {
6501 snprintf (out_buf, buf_len, ":");
6502
6503 buf_len--;
6504 out_buf++;
6505 }
6506
6507 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6508
6509 buf_len -= 8;
6510 out_buf += 8;
6511 }
6512 }
6513 else if (hash_mode == 5500)
6514 {
6515 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6516
6517 netntlm_t *netntlm = &netntlms[salt_pos];
6518
6519 char user_buf[64];
6520 char domain_buf[64];
6521 char srvchall_buf[1024];
6522 char clichall_buf[1024];
6523
6524 memset (user_buf, 0, sizeof (user_buf));
6525 memset (domain_buf, 0, sizeof (domain_buf));
6526 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6527 memset (clichall_buf, 0, sizeof (clichall_buf));
6528
6529 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6530 {
6531 char *ptr = (char *) netntlm->userdomain_buf;
6532
6533 user_buf[i] = ptr[j];
6534 }
6535
6536 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6537 {
6538 char *ptr = (char *) netntlm->userdomain_buf;
6539
6540 domain_buf[i] = ptr[netntlm->user_len + j];
6541 }
6542
6543 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6544 {
6545 char *ptr = (char *) netntlm->chall_buf;
6546
6547 sprintf (srvchall_buf + j, "%02x", (uint8_t) ptr[i]);
6548 }
6549
6550 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6551 {
6552 char *ptr = (char *) netntlm->chall_buf;
6553
6554 sprintf (clichall_buf + j, "%02x", (uint8_t) ptr[netntlm->srvchall_len + i]);
6555 }
6556
6557 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6558 user_buf,
6559 domain_buf,
6560 srvchall_buf,
6561 digest_buf[0],
6562 digest_buf[1],
6563 digest_buf[2],
6564 digest_buf[3],
6565 byte_swap_32 (salt.salt_buf_pc[0]),
6566 byte_swap_32 (salt.salt_buf_pc[1]),
6567 clichall_buf);
6568 }
6569 else if (hash_mode == 5600)
6570 {
6571 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6572
6573 netntlm_t *netntlm = &netntlms[salt_pos];
6574
6575 char user_buf[64];
6576 char domain_buf[64];
6577 char srvchall_buf[1024];
6578 char clichall_buf[1024];
6579
6580 memset (user_buf, 0, sizeof (user_buf));
6581 memset (domain_buf, 0, sizeof (domain_buf));
6582 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6583 memset (clichall_buf, 0, sizeof (clichall_buf));
6584
6585 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6586 {
6587 char *ptr = (char *) netntlm->userdomain_buf;
6588
6589 user_buf[i] = ptr[j];
6590 }
6591
6592 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6593 {
6594 char *ptr = (char *) netntlm->userdomain_buf;
6595
6596 domain_buf[i] = ptr[netntlm->user_len + j];
6597 }
6598
6599 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6600 {
6601 char *ptr = (char *) netntlm->chall_buf;
6602
6603 sprintf (srvchall_buf + j, "%02x", (uint8_t) ptr[i]);
6604 }
6605
6606 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6607 {
6608 char *ptr = (char *) netntlm->chall_buf;
6609
6610 sprintf (clichall_buf + j, "%02x", (uint8_t) ptr[netntlm->srvchall_len + i]);
6611 }
6612
6613 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6614 user_buf,
6615 domain_buf,
6616 srvchall_buf,
6617 digest_buf[0],
6618 digest_buf[1],
6619 digest_buf[2],
6620 digest_buf[3],
6621 clichall_buf);
6622 }
6623 else if (hash_mode == 5700)
6624 {
6625 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6626
6627 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6628 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6629 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6630 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6631 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6632 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6633 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6634 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6635
6636 memcpy (tmp_buf, digest_buf, 32);
6637
6638 base64_encode (int_to_itoa64, tmp_buf, 32, ptr_plain);
6639
6640 ptr_plain[43] = 0;
6641
6642 snprintf (out_buf, len-1, "%s", ptr_plain);
6643 }
6644 else if (hash_mode == 5800)
6645 {
6646 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6647 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6648 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6649 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6650 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6651
6652 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6653 digest_buf[0],
6654 digest_buf[1],
6655 digest_buf[2],
6656 digest_buf[3],
6657 digest_buf[4]);
6658 }
6659 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6660 {
6661 snprintf (out_buf, len-1, "%s", hashfile);
6662 }
6663 else if (hash_mode == 6300)
6664 {
6665 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6666
6667 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6668 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6669 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6670 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6671
6672 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6673
6674 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6675 }
6676 else if (hash_mode == 6400)
6677 {
6678 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6679
6680 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6681 }
6682 else if (hash_mode == 6500)
6683 {
6684 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6685
6686 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6687 }
6688 else if (hash_mode == 6600)
6689 {
6690 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6691
6692 agilekey_t *agilekey = &agilekeys[salt_pos];
6693
6694 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6695 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6696
6697 uint buf_len = len - 1;
6698
6699 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6700 buf_len -= 22;
6701
6702 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6703 {
6704 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6705
6706 buf_len -= 2;
6707 }
6708 }
6709 else if (hash_mode == 6700)
6710 {
6711 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6712
6713 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6714 }
6715 else if (hash_mode == 6800)
6716 {
6717 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6718 }
6719 else if (hash_mode == 7100)
6720 {
6721 uint *ptr = digest_buf;
6722
6723 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6724
6725 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6726
6727 uint esalt[16];
6728
6729 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6730 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6731 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6732 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6733 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6734 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6735 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6736 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6737
6738 snprintf (out_buf, len-1, "%s%i$%08x%08x%08x%08x%08x%08x%08x%08x$%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6739 SIGNATURE_SHA512OSX,
6740 salt.salt_iter + 1,
6741 esalt[ 0], esalt[ 1],
6742 esalt[ 2], esalt[ 3],
6743 esalt[ 4], esalt[ 5],
6744 esalt[ 6], esalt[ 7],
6745 ptr [ 1], ptr [ 0],
6746 ptr [ 3], ptr [ 2],
6747 ptr [ 5], ptr [ 4],
6748 ptr [ 7], ptr [ 6],
6749 ptr [ 9], ptr [ 8],
6750 ptr [11], ptr [10],
6751 ptr [13], ptr [12],
6752 ptr [15], ptr [14]);
6753 }
6754 else if (hash_mode == 7200)
6755 {
6756 uint *ptr = digest_buf;
6757
6758 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6759
6760 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6761
6762 uint len_used = 0;
6763
6764 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
6765
6766 len_used = strlen (out_buf);
6767
6768 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
6769
6770 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
6771 {
6772 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
6773 }
6774
6775 snprintf (out_buf + len_used, len - len_used - 1, ".%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6776 ptr [ 1], ptr [ 0],
6777 ptr [ 3], ptr [ 2],
6778 ptr [ 5], ptr [ 4],
6779 ptr [ 7], ptr [ 6],
6780 ptr [ 9], ptr [ 8],
6781 ptr [11], ptr [10],
6782 ptr [13], ptr [12],
6783 ptr [15], ptr [14]);
6784 }
6785 else if (hash_mode == 7300)
6786 {
6787 rakp_t *rakps = (rakp_t *) data.esalts_buf;
6788
6789 rakp_t *rakp = &rakps[salt_pos];
6790
6791 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
6792 {
6793 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
6794 }
6795
6796 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
6797 digest_buf[0],
6798 digest_buf[1],
6799 digest_buf[2],
6800 digest_buf[3],
6801 digest_buf[4]);
6802 }
6803 else if (hash_mode == 7400)
6804 {
6805 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6806
6807 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6808 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6809 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6810 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6811 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6812 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6813 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6814 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6815
6816 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6817
6818 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
6819 {
6820 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6821 }
6822 else
6823 {
6824 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6825 }
6826 }
6827 else if (hash_mode == 7500)
6828 {
6829 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
6830
6831 krb5pa_t *krb5pa = &krb5pas[salt_pos];
6832
6833 uint8_t *ptr_timestamp = (uint8_t *) krb5pa->timestamp;
6834 uint8_t *ptr_checksum = (uint8_t *) krb5pa->checksum;
6835
6836 char data[128];
6837
6838 char *ptr_data = data;
6839
6840 for (uint i = 0; i < 36; i++, ptr_data += 2)
6841 {
6842 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
6843 }
6844
6845 for (uint i = 0; i < 16; i++, ptr_data += 2)
6846 {
6847 sprintf (ptr_data, "%02x", ptr_checksum[i]);
6848 }
6849
6850 *ptr_data = 0;
6851
6852 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
6853 SIGNATURE_KRB5PA,
6854 (char *) krb5pa->user,
6855 (char *) krb5pa->realm,
6856 (char *) krb5pa->salt,
6857 data);
6858 }
6859 else if (hash_mode == 7700)
6860 {
6861 snprintf (out_buf, len-1, "%s$%08X%08X",
6862 (char *) salt.salt_buf,
6863 digest_buf[0],
6864 digest_buf[1]);
6865 }
6866 else if (hash_mode == 7800)
6867 {
6868 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
6869 (char *) salt.salt_buf,
6870 digest_buf[0],
6871 digest_buf[1],
6872 digest_buf[2],
6873 digest_buf[3],
6874 digest_buf[4]);
6875 }
6876 else if (hash_mode == 7900)
6877 {
6878 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6879
6880 // ugly hack start
6881
6882 char *tmp = (char *) salt.salt_buf_pc;
6883
6884 ptr_plain[42] = tmp[0];
6885
6886 // ugly hack end
6887
6888 ptr_plain[43] = 0;
6889
6890 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6891 }
6892 else if (hash_mode == 8000)
6893 {
6894 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
6895 (unsigned char *) salt.salt_buf,
6896 digest_buf[0],
6897 digest_buf[1],
6898 digest_buf[2],
6899 digest_buf[3],
6900 digest_buf[4],
6901 digest_buf[5],
6902 digest_buf[6],
6903 digest_buf[7]);
6904 }
6905 else if (hash_mode == 8100)
6906 {
6907 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6908 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6909
6910 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
6911 (unsigned char *) salt.salt_buf,
6912 digest_buf[0],
6913 digest_buf[1],
6914 digest_buf[2],
6915 digest_buf[3],
6916 digest_buf[4]);
6917 }
6918 else if (hash_mode == 8200)
6919 {
6920 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
6921
6922 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
6923
6924 char data_buf[4096];
6925
6926 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
6927 {
6928 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
6929 }
6930
6931 data_buf[cloudkey->data_len * 2] = 0;
6932
6933 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6934 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6935 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6936 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6937 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6938 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6939 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6940 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6941
6942 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6943 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6944 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
6945 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
6946
6947 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
6948 digest_buf[0],
6949 digest_buf[1],
6950 digest_buf[2],
6951 digest_buf[3],
6952 digest_buf[4],
6953 digest_buf[5],
6954 digest_buf[6],
6955 digest_buf[7],
6956 salt.salt_buf[0],
6957 salt.salt_buf[1],
6958 salt.salt_buf[2],
6959 salt.salt_buf[3],
6960 salt.salt_iter + 1,
6961 data_buf);
6962 }
6963 else if (hash_mode == 8300)
6964 {
6965 // todo
6966
6967 char digest_buf_c[33];
6968
6969 base32_encode (int_to_itoa32, (char *) digest_buf, 32, digest_buf_c);
6970
6971 digest_buf_c[32] = 0;
6972
6973 // domain
6974
6975 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
6976
6977 char domain_buf_c[33];
6978
6979 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
6980
6981 for (uint i = 0; i < salt_pc_len; i++)
6982 {
6983 const char next = domain_buf_c[i];
6984
6985 domain_buf_c[i] = '.';
6986
6987 i += next;
6988 }
6989
6990 domain_buf_c[salt_pc_len] = 0;
6991
6992 // final
6993
6994 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
6995 }
6996 else if (hash_mode == 8500)
6997 {
6998 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
6999 }
7000 else if (hash_mode == 2612)
7001 {
7002 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7003 SIGNATURE_PHPS,
7004 (char *) salt.salt_buf,
7005 digest_buf[0],
7006 digest_buf[1],
7007 digest_buf[2],
7008 digest_buf[3]);
7009 }
7010 else if (hash_mode == 3711)
7011 {
7012 char *salt_ptr = (char *) salt.salt_buf;
7013
7014 salt_ptr[salt.salt_len - 1] = 0;
7015
7016 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7017 SIGNATURE_MEDIAWIKI_B,
7018 salt_ptr,
7019 digest_buf[0],
7020 digest_buf[1],
7021 digest_buf[2],
7022 digest_buf[3]);
7023 }
7024 else if (hash_mode == 8800)
7025 {
7026 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7027
7028 androidfde_t *androidfde = &androidfdes[salt_pos];
7029
7030 char tmp[3073];
7031
7032 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7033 {
7034 sprintf (tmp + j, "%08x", androidfde->data[i]);
7035 }
7036
7037 tmp[3072] = 0;
7038
7039 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7040 SIGNATURE_ANDROIDFDE,
7041 byte_swap_32 (salt.salt_buf[0]),
7042 byte_swap_32 (salt.salt_buf[1]),
7043 byte_swap_32 (salt.salt_buf[2]),
7044 byte_swap_32 (salt.salt_buf[3]),
7045 byte_swap_32 (digest_buf[0]),
7046 byte_swap_32 (digest_buf[1]),
7047 byte_swap_32 (digest_buf[2]),
7048 byte_swap_32 (digest_buf[3]),
7049 tmp);
7050 }
7051 else if (hash_mode == 8900)
7052 {
7053 uint N = salt.scrypt_N;
7054 uint r = salt.scrypt_r;
7055 uint p = salt.scrypt_p;
7056
7057 char base64_salt[32];
7058
7059 memset (base64_salt, 0, 32);
7060
7061 base64_encode (int_to_base64, (char *) salt.salt_buf, salt.salt_len, base64_salt + 0);
7062
7063 memset (tmp_buf, 0, 46);
7064
7065 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7066 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7067 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7068 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7069 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7070 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7071 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7072 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7073 digest_buf[8] = 0; // needed for base64_encode ()
7074
7075 base64_encode (int_to_base64, (char *) digest_buf, 32, tmp_buf + 0);
7076
7077 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7078 SIGNATURE_SCRYPT,
7079 N,
7080 r,
7081 p,
7082 base64_salt,
7083 tmp_buf);
7084 }
7085 else if (hash_mode == 9000)
7086 {
7087 snprintf (out_buf, len-1, "%s", hashfile);
7088 }
7089 else if (hash_mode == 9200)
7090 {
7091 // salt
7092
7093 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7094
7095 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7096
7097 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7098
7099 // hash
7100
7101 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7102 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7103 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7104 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7105 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7106 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7107 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7108 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7109 digest_buf[8] = 0; // needed for base64_encode ()
7110
7111 char tmp_buf[64];
7112 memset (tmp_buf, 0, sizeof (tmp_buf));
7113
7114 base64_encode (int_to_itoa64, (char *) digest_buf, 32, tmp_buf);
7115 tmp_buf[43] = 0; // cut it here
7116
7117 // output
7118
7119 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7120 }
7121 else if (hash_mode == 9300)
7122 {
7123 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7124 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7125 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7126 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7127 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7128 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7129 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7130 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7131 digest_buf[8] = 0; // needed for base64_encode ()
7132
7133 char tmp_buf[64];
7134 memset (tmp_buf, 0, sizeof (tmp_buf));
7135
7136 base64_encode (int_to_itoa64, (char *) digest_buf, 32, tmp_buf);
7137 tmp_buf[43] = 0; // cut it here
7138
7139 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7140
7141 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7142 }
7143 else if (hash_mode == 9400)
7144 {
7145 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7146
7147 office2007_t *office2007 = &office2007s[salt_pos];
7148
7149 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7150 SIGNATURE_OFFICE2007,
7151 2007,
7152 20,
7153 office2007->keySize,
7154 16,
7155 salt.salt_buf[0],
7156 salt.salt_buf[1],
7157 salt.salt_buf[2],
7158 salt.salt_buf[3],
7159 office2007->encryptedVerifier[0],
7160 office2007->encryptedVerifier[1],
7161 office2007->encryptedVerifier[2],
7162 office2007->encryptedVerifier[3],
7163 office2007->encryptedVerifierHash[0],
7164 office2007->encryptedVerifierHash[1],
7165 office2007->encryptedVerifierHash[2],
7166 office2007->encryptedVerifierHash[3],
7167 office2007->encryptedVerifierHash[4]);
7168 }
7169 else if (hash_mode == 9500)
7170 {
7171 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7172
7173 office2010_t *office2010 = &office2010s[salt_pos];
7174
7175 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x%08x%08x", SIGNATURE_OFFICE2010, 2010, 100000, 128, 16,
7176
7177 salt.salt_buf[0],
7178 salt.salt_buf[1],
7179 salt.salt_buf[2],
7180 salt.salt_buf[3],
7181 office2010->encryptedVerifier[0],
7182 office2010->encryptedVerifier[1],
7183 office2010->encryptedVerifier[2],
7184 office2010->encryptedVerifier[3],
7185 office2010->encryptedVerifierHash[0],
7186 office2010->encryptedVerifierHash[1],
7187 office2010->encryptedVerifierHash[2],
7188 office2010->encryptedVerifierHash[3],
7189 office2010->encryptedVerifierHash[4],
7190 office2010->encryptedVerifierHash[5],
7191 office2010->encryptedVerifierHash[6],
7192 office2010->encryptedVerifierHash[7]);
7193 }
7194 else if (hash_mode == 9600)
7195 {
7196 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7197
7198 office2013_t *office2013 = &office2013s[salt_pos];
7199
7200 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x%08x%08x", SIGNATURE_OFFICE2013, 2013, 100000, 256, 16,
7201
7202 salt.salt_buf[0],
7203 salt.salt_buf[1],
7204 salt.salt_buf[2],
7205 salt.salt_buf[3],
7206 office2013->encryptedVerifier[0],
7207 office2013->encryptedVerifier[1],
7208 office2013->encryptedVerifier[2],
7209 office2013->encryptedVerifier[3],
7210 office2013->encryptedVerifierHash[0],
7211 office2013->encryptedVerifierHash[1],
7212 office2013->encryptedVerifierHash[2],
7213 office2013->encryptedVerifierHash[3],
7214 office2013->encryptedVerifierHash[4],
7215 office2013->encryptedVerifierHash[5],
7216 office2013->encryptedVerifierHash[6],
7217 office2013->encryptedVerifierHash[7]);
7218 }
7219 else if (hash_mode == 9700)
7220 {
7221 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7222
7223 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7224
7225 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7226 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7227 byte_swap_32 (salt.salt_buf[0]),
7228 byte_swap_32 (salt.salt_buf[1]),
7229 byte_swap_32 (salt.salt_buf[2]),
7230 byte_swap_32 (salt.salt_buf[3]),
7231 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7232 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7233 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7234 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7235 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7236 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7237 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7238 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7239 }
7240 else if (hash_mode == 9710)
7241 {
7242 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7243
7244 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7245
7246 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7247 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7248 byte_swap_32 (salt.salt_buf[0]),
7249 byte_swap_32 (salt.salt_buf[1]),
7250 byte_swap_32 (salt.salt_buf[2]),
7251 byte_swap_32 (salt.salt_buf[3]),
7252 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7253 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7254 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7255 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7256 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7257 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7258 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7259 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7260 }
7261 else if (hash_mode == 9720)
7262 {
7263 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7264
7265 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7266
7267 uint8_t *rc4key = (uint8_t *) oldoffice01->rc4key;
7268
7269 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7270 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7271 byte_swap_32 (salt.salt_buf[0]),
7272 byte_swap_32 (salt.salt_buf[1]),
7273 byte_swap_32 (salt.salt_buf[2]),
7274 byte_swap_32 (salt.salt_buf[3]),
7275 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7276 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7277 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7278 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7279 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7280 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7281 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7282 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7283 rc4key[0],
7284 rc4key[1],
7285 rc4key[2],
7286 rc4key[3],
7287 rc4key[4]);
7288 }
7289 else if (hash_mode == 9800)
7290 {
7291 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7292
7293 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7294
7295 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7296 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7297 salt.salt_buf[0],
7298 salt.salt_buf[1],
7299 salt.salt_buf[2],
7300 salt.salt_buf[3],
7301 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7302 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7303 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7304 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7305 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7306 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7307 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7308 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7309 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7310 }
7311 else if (hash_mode == 9810)
7312 {
7313 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7314
7315 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7316
7317 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7318 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7319 salt.salt_buf[0],
7320 salt.salt_buf[1],
7321 salt.salt_buf[2],
7322 salt.salt_buf[3],
7323 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7324 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7325 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7326 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7327 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7328 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7329 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7330 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7331 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7332 }
7333 else if (hash_mode == 9820)
7334 {
7335 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7336
7337 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7338
7339 uint8_t *rc4key = (uint8_t *) oldoffice34->rc4key;
7340
7341 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7342 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7343 salt.salt_buf[0],
7344 salt.salt_buf[1],
7345 salt.salt_buf[2],
7346 salt.salt_buf[3],
7347 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7348 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7349 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7350 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7351 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7352 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7353 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7354 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7355 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7356 rc4key[0],
7357 rc4key[1],
7358 rc4key[2],
7359 rc4key[3],
7360 rc4key[4]);
7361 }
7362 else if (hash_mode == 10000)
7363 {
7364 // salt
7365
7366 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7367
7368 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7369
7370 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7371
7372 // hash
7373
7374 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7375 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7376 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7377 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7378 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7379 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7380 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7381 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7382 digest_buf[8] = 0; // needed for base64_encode ()
7383
7384 char tmp_buf[64];
7385 memset (tmp_buf, 0, sizeof (tmp_buf));
7386
7387 base64_encode (int_to_base64, (char *) digest_buf, 32, tmp_buf);
7388
7389 // output
7390
7391 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7392 }
7393 else if (hash_mode == 10100)
7394 {
7395 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7396 digest_buf[0],
7397 digest_buf[1],
7398 2,
7399 4,
7400 byte_swap_32 (salt.salt_buf[0]),
7401 byte_swap_32 (salt.salt_buf[1]),
7402 byte_swap_32 (salt.salt_buf[2]),
7403 byte_swap_32 (salt.salt_buf[3]));
7404 }
7405 else if (hash_mode == 10200)
7406 {
7407 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7408
7409 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7410
7411 // challenge
7412
7413 char challenge[100];
7414
7415 memset (challenge, 0, sizeof (challenge));
7416
7417 base64_encode (int_to_base64, (char *) salt.salt_buf, salt.salt_len, challenge);
7418
7419 // response
7420
7421 char tmp_buf[100];
7422
7423 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7424 (char *) cram_md5->user,
7425 digest_buf[0],
7426 digest_buf[1],
7427 digest_buf[2],
7428 digest_buf[3]);
7429
7430 char response[100];
7431
7432 memset (response, 0, sizeof (response));
7433
7434 base64_encode (int_to_base64, (char *) tmp_buf, tmp_len, response);
7435
7436 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7437 }
7438 else if (hash_mode == 10300)
7439 {
7440 char tmp_buf[100];
7441
7442 memset (tmp_buf, 0, sizeof (tmp_buf));
7443
7444 memcpy (tmp_buf + 0, digest_buf, 20);
7445 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7446
7447 uint tmp_len = 20 + salt.salt_len;
7448
7449 // base64 encode it
7450
7451 char base64_encoded[100];
7452
7453 memset (base64_encoded, 0, sizeof (base64_encoded));
7454
7455 base64_encode (int_to_base64, (char *) tmp_buf, tmp_len, base64_encoded);
7456
7457 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7458 }
7459 else if (hash_mode == 10400)
7460 {
7461 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7462
7463 pdf_t *pdf = &pdfs[salt_pos];
7464
7465 snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x",
7466
7467 pdf->V,
7468 pdf->R,
7469 40,
7470 pdf->P,
7471 pdf->enc_md,
7472 pdf->id_len,
7473 byte_swap_32 (pdf->id_buf[0]),
7474 byte_swap_32 (pdf->id_buf[1]),
7475 byte_swap_32 (pdf->id_buf[2]),
7476 byte_swap_32 (pdf->id_buf[3]),
7477 pdf->u_len,
7478 byte_swap_32 (pdf->u_buf[0]),
7479 byte_swap_32 (pdf->u_buf[1]),
7480 byte_swap_32 (pdf->u_buf[2]),
7481 byte_swap_32 (pdf->u_buf[3]),
7482 byte_swap_32 (pdf->u_buf[4]),
7483 byte_swap_32 (pdf->u_buf[5]),
7484 byte_swap_32 (pdf->u_buf[6]),
7485 byte_swap_32 (pdf->u_buf[7]),
7486 pdf->o_len,
7487 byte_swap_32 (pdf->o_buf[0]),
7488 byte_swap_32 (pdf->o_buf[1]),
7489 byte_swap_32 (pdf->o_buf[2]),
7490 byte_swap_32 (pdf->o_buf[3]),
7491 byte_swap_32 (pdf->o_buf[4]),
7492 byte_swap_32 (pdf->o_buf[5]),
7493 byte_swap_32 (pdf->o_buf[6]),
7494 byte_swap_32 (pdf->o_buf[7])
7495 );
7496 }
7497 else if (hash_mode == 10410)
7498 {
7499 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7500
7501 pdf_t *pdf = &pdfs[salt_pos];
7502
7503 snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x",
7504
7505 pdf->V,
7506 pdf->R,
7507 40,
7508 pdf->P,
7509 pdf->enc_md,
7510 pdf->id_len,
7511 byte_swap_32 (pdf->id_buf[0]),
7512 byte_swap_32 (pdf->id_buf[1]),
7513 byte_swap_32 (pdf->id_buf[2]),
7514 byte_swap_32 (pdf->id_buf[3]),
7515 pdf->u_len,
7516 byte_swap_32 (pdf->u_buf[0]),
7517 byte_swap_32 (pdf->u_buf[1]),
7518 byte_swap_32 (pdf->u_buf[2]),
7519 byte_swap_32 (pdf->u_buf[3]),
7520 byte_swap_32 (pdf->u_buf[4]),
7521 byte_swap_32 (pdf->u_buf[5]),
7522 byte_swap_32 (pdf->u_buf[6]),
7523 byte_swap_32 (pdf->u_buf[7]),
7524 pdf->o_len,
7525 byte_swap_32 (pdf->o_buf[0]),
7526 byte_swap_32 (pdf->o_buf[1]),
7527 byte_swap_32 (pdf->o_buf[2]),
7528 byte_swap_32 (pdf->o_buf[3]),
7529 byte_swap_32 (pdf->o_buf[4]),
7530 byte_swap_32 (pdf->o_buf[5]),
7531 byte_swap_32 (pdf->o_buf[6]),
7532 byte_swap_32 (pdf->o_buf[7])
7533 );
7534 }
7535 else if (hash_mode == 10420)
7536 {
7537 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7538
7539 pdf_t *pdf = &pdfs[salt_pos];
7540
7541 uint8_t *rc4key = (uint8_t *) pdf->rc4key;
7542
7543 snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7544
7545 pdf->V,
7546 pdf->R,
7547 40,
7548 pdf->P,
7549 pdf->enc_md,
7550 pdf->id_len,
7551 byte_swap_32 (pdf->id_buf[0]),
7552 byte_swap_32 (pdf->id_buf[1]),
7553 byte_swap_32 (pdf->id_buf[2]),
7554 byte_swap_32 (pdf->id_buf[3]),
7555 pdf->u_len,
7556 byte_swap_32 (pdf->u_buf[0]),
7557 byte_swap_32 (pdf->u_buf[1]),
7558 byte_swap_32 (pdf->u_buf[2]),
7559 byte_swap_32 (pdf->u_buf[3]),
7560 byte_swap_32 (pdf->u_buf[4]),
7561 byte_swap_32 (pdf->u_buf[5]),
7562 byte_swap_32 (pdf->u_buf[6]),
7563 byte_swap_32 (pdf->u_buf[7]),
7564 pdf->o_len,
7565 byte_swap_32 (pdf->o_buf[0]),
7566 byte_swap_32 (pdf->o_buf[1]),
7567 byte_swap_32 (pdf->o_buf[2]),
7568 byte_swap_32 (pdf->o_buf[3]),
7569 byte_swap_32 (pdf->o_buf[4]),
7570 byte_swap_32 (pdf->o_buf[5]),
7571 byte_swap_32 (pdf->o_buf[6]),
7572 byte_swap_32 (pdf->o_buf[7]),
7573 rc4key[0],
7574 rc4key[1],
7575 rc4key[2],
7576 rc4key[3],
7577 rc4key[4]
7578 );
7579 }
7580 else if (hash_mode == 10500)
7581 {
7582 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7583
7584 pdf_t *pdf = &pdfs[salt_pos];
7585
7586 if (pdf->id_len == 32)
7587 {
7588 snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x",
7589
7590 pdf->V,
7591 pdf->R,
7592 128,
7593 pdf->P,
7594 pdf->enc_md,
7595 pdf->id_len,
7596 byte_swap_32 (pdf->id_buf[0]),
7597 byte_swap_32 (pdf->id_buf[1]),
7598 byte_swap_32 (pdf->id_buf[2]),
7599 byte_swap_32 (pdf->id_buf[3]),
7600 byte_swap_32 (pdf->id_buf[4]),
7601 byte_swap_32 (pdf->id_buf[5]),
7602 byte_swap_32 (pdf->id_buf[6]),
7603 byte_swap_32 (pdf->id_buf[7]),
7604 pdf->u_len,
7605 byte_swap_32 (pdf->u_buf[0]),
7606 byte_swap_32 (pdf->u_buf[1]),
7607 byte_swap_32 (pdf->u_buf[2]),
7608 byte_swap_32 (pdf->u_buf[3]),
7609 byte_swap_32 (pdf->u_buf[4]),
7610 byte_swap_32 (pdf->u_buf[5]),
7611 byte_swap_32 (pdf->u_buf[6]),
7612 byte_swap_32 (pdf->u_buf[7]),
7613 pdf->o_len,
7614 byte_swap_32 (pdf->o_buf[0]),
7615 byte_swap_32 (pdf->o_buf[1]),
7616 byte_swap_32 (pdf->o_buf[2]),
7617 byte_swap_32 (pdf->o_buf[3]),
7618 byte_swap_32 (pdf->o_buf[4]),
7619 byte_swap_32 (pdf->o_buf[5]),
7620 byte_swap_32 (pdf->o_buf[6]),
7621 byte_swap_32 (pdf->o_buf[7])
7622 );
7623 }
7624 else
7625 {
7626 snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x",
7627
7628 pdf->V,
7629 pdf->R,
7630 128,
7631 pdf->P,
7632 pdf->enc_md,
7633 pdf->id_len,
7634 byte_swap_32 (pdf->id_buf[0]),
7635 byte_swap_32 (pdf->id_buf[1]),
7636 byte_swap_32 (pdf->id_buf[2]),
7637 byte_swap_32 (pdf->id_buf[3]),
7638 pdf->u_len,
7639 byte_swap_32 (pdf->u_buf[0]),
7640 byte_swap_32 (pdf->u_buf[1]),
7641 byte_swap_32 (pdf->u_buf[2]),
7642 byte_swap_32 (pdf->u_buf[3]),
7643 byte_swap_32 (pdf->u_buf[4]),
7644 byte_swap_32 (pdf->u_buf[5]),
7645 byte_swap_32 (pdf->u_buf[6]),
7646 byte_swap_32 (pdf->u_buf[7]),
7647 pdf->o_len,
7648 byte_swap_32 (pdf->o_buf[0]),
7649 byte_swap_32 (pdf->o_buf[1]),
7650 byte_swap_32 (pdf->o_buf[2]),
7651 byte_swap_32 (pdf->o_buf[3]),
7652 byte_swap_32 (pdf->o_buf[4]),
7653 byte_swap_32 (pdf->o_buf[5]),
7654 byte_swap_32 (pdf->o_buf[6]),
7655 byte_swap_32 (pdf->o_buf[7])
7656 );
7657 }
7658 }
7659 else if (hash_mode == 10600)
7660 {
7661 uint digest_idx = salt.digests_offset + digest_pos;
7662
7663 hashinfo_t **hashinfo_ptr = data.hash_info;
7664 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7665
7666 snprintf (out_buf, len-1, "%s", hash_buf);
7667 }
7668 else if (hash_mode == 10700)
7669 {
7670 uint digest_idx = salt.digests_offset + digest_pos;
7671
7672 hashinfo_t **hashinfo_ptr = data.hash_info;
7673 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7674
7675 snprintf (out_buf, len-1, "%s", hash_buf);
7676 }
7677 else if (hash_mode == 10900)
7678 {
7679 uint digest_idx = salt.digests_offset + digest_pos;
7680
7681 hashinfo_t **hashinfo_ptr = data.hash_info;
7682 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7683
7684 snprintf (out_buf, len-1, "%s", hash_buf);
7685 }
7686 else if (hash_mode == 11100)
7687 {
7688 uint32_t salt_challenge = salt.salt_buf[0];
7689
7690 salt_challenge = byte_swap_32 (salt_challenge);
7691
7692 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7693
7694 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7695 SIGNATURE_POSTGRESQL_AUTH,
7696 user_name,
7697 salt_challenge,
7698 digest_buf[0],
7699 digest_buf[1],
7700 digest_buf[2],
7701 digest_buf[3]);
7702 }
7703 else if (hash_mode == 11200)
7704 {
7705 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7706 SIGNATURE_MYSQL_AUTH,
7707 (unsigned char *) salt.salt_buf,
7708 digest_buf[0],
7709 digest_buf[1],
7710 digest_buf[2],
7711 digest_buf[3],
7712 digest_buf[4]);
7713 }
7714 else if (hash_mode == 11300)
7715 {
7716 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7717
7718 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7719
7720 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7721 const uint ckey_len = bitcoin_wallet->ckey_len;
7722 const uint public_key_len = bitcoin_wallet->public_key_len;
7723
7724 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7725 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7726 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7727
7728 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7729 {
7730 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->cry_master_buf;
7731
7732 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7733 }
7734
7735 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7736 {
7737 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->ckey_buf;
7738
7739 sprintf (ckey_buf + j, "%02x", ptr[i]);
7740 }
7741
7742 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7743 {
7744 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->public_key_buf;
7745
7746 sprintf (public_key_buf + j, "%02x", ptr[i]);
7747 }
7748
7749 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7750 SIGNATURE_BITCOIN_WALLET,
7751 cry_master_len * 2,
7752 cry_master_buf,
7753 salt.salt_len,
7754 (unsigned char *) salt.salt_buf,
7755 salt.salt_iter + 1,
7756 ckey_len * 2,
7757 ckey_buf,
7758 public_key_len * 2,
7759 public_key_buf
7760 );
7761
7762 free (cry_master_buf);
7763 free (ckey_buf);
7764 free (public_key_buf);
7765 }
7766 else if (hash_mode == 11400)
7767 {
7768 uint digest_idx = salt.digests_offset + digest_pos;
7769
7770 hashinfo_t **hashinfo_ptr = data.hash_info;
7771 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7772
7773 snprintf (out_buf, len-1, "%s", hash_buf);
7774 }
7775 else if (hash_mode == 11600)
7776 {
7777 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
7778
7779 seven_zip_t *seven_zip = &seven_zips[salt_pos];
7780
7781 const uint data_len = seven_zip->data_len;
7782
7783 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
7784
7785 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
7786 {
7787 const uint8_t *ptr = (const uint8_t *) seven_zip->data_buf;
7788
7789 sprintf (data_buf + j, "%02x", ptr[i]);
7790 }
7791
7792 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
7793 SIGNATURE_SEVEN_ZIP,
7794 0,
7795 salt.salt_sign[0],
7796 0,
7797 (char *) seven_zip->salt_buf,
7798 seven_zip->iv_len,
7799 seven_zip->iv_buf[0],
7800 seven_zip->iv_buf[1],
7801 seven_zip->iv_buf[2],
7802 seven_zip->iv_buf[3],
7803 seven_zip->crc,
7804 seven_zip->data_len,
7805 seven_zip->unpack_size,
7806 data_buf);
7807
7808 free (data_buf);
7809 }
7810 else if (hash_mode == 11700)
7811 {
7812 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7813 digest_buf[0],
7814 digest_buf[1],
7815 digest_buf[2],
7816 digest_buf[3],
7817 digest_buf[4],
7818 digest_buf[5],
7819 digest_buf[6],
7820 digest_buf[7]);
7821 }
7822 else if (hash_mode == 11800)
7823 {
7824 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
7825 digest_buf[ 0],
7826 digest_buf[ 1],
7827 digest_buf[ 2],
7828 digest_buf[ 3],
7829 digest_buf[ 4],
7830 digest_buf[ 5],
7831 digest_buf[ 6],
7832 digest_buf[ 7],
7833 digest_buf[ 8],
7834 digest_buf[ 9],
7835 digest_buf[10],
7836 digest_buf[11],
7837 digest_buf[12],
7838 digest_buf[13],
7839 digest_buf[14],
7840 digest_buf[15]);
7841 }
7842 else if (hash_mode == 11900)
7843 {
7844 uint digest_idx = salt.digests_offset + digest_pos;
7845
7846 hashinfo_t **hashinfo_ptr = data.hash_info;
7847 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7848
7849 snprintf (out_buf, len-1, "%s", hash_buf);
7850 }
7851 else if (hash_mode == 12000)
7852 {
7853 uint digest_idx = salt.digests_offset + digest_pos;
7854
7855 hashinfo_t **hashinfo_ptr = data.hash_info;
7856 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7857
7858 snprintf (out_buf, len-1, "%s", hash_buf);
7859 }
7860 else if (hash_mode == 12100)
7861 {
7862 uint digest_idx = salt.digests_offset + digest_pos;
7863
7864 hashinfo_t **hashinfo_ptr = data.hash_info;
7865 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7866
7867 snprintf (out_buf, len-1, "%s", hash_buf);
7868 }
7869 else if (hash_mode == 12200)
7870 {
7871 uint *ptr_digest = digest_buf;
7872 uint *ptr_salt = salt.salt_buf;
7873
7874 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
7875 SIGNATURE_ECRYPTFS,
7876 ptr_salt[0],
7877 ptr_salt[1],
7878 ptr_digest[0],
7879 ptr_digest[1]);
7880 }
7881 else if (hash_mode == 12300)
7882 {
7883 uint *ptr_digest = digest_buf;
7884 uint *ptr_salt = salt.salt_buf;
7885
7886 snprintf (out_buf, len-1, "%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X",
7887 ptr_digest[ 0], ptr_digest[ 1],
7888 ptr_digest[ 2], ptr_digest[ 3],
7889 ptr_digest[ 4], ptr_digest[ 5],
7890 ptr_digest[ 6], ptr_digest[ 7],
7891 ptr_digest[ 8], ptr_digest[ 9],
7892 ptr_digest[10], ptr_digest[11],
7893 ptr_digest[12], ptr_digest[13],
7894 ptr_digest[14], ptr_digest[15],
7895 ptr_salt[0],
7896 ptr_salt[1],
7897 ptr_salt[2],
7898 ptr_salt[3]);
7899 }
7900 else if (hash_mode == 12400)
7901 {
7902 // encode iteration count
7903
7904 char salt_iter[5];
7905
7906 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
7907 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
7908 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
7909 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
7910 salt_iter[4] = 0;
7911
7912 // encode salt
7913
7914 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
7915 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
7916 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
7917 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
7918 ptr_salt[4] = 0;
7919
7920 // encode digest
7921
7922 memset (tmp_buf, 0, sizeof (tmp_buf));
7923
7924 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7925 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7926
7927 memcpy (tmp_buf, digest_buf, 8);
7928
7929 base64_encode (int_to_itoa64, tmp_buf, 8, ptr_plain);
7930
7931 ptr_plain[11] = 0;
7932
7933 // fill the resulting buffer
7934
7935 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
7936 }
7937 else if (hash_mode == 12500)
7938 {
7939 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
7940 SIGNATURE_RAR3,
7941 byte_swap_32 (salt.salt_buf[0]),
7942 byte_swap_32 (salt.salt_buf[1]),
7943 salt.salt_buf[2],
7944 salt.salt_buf[3],
7945 salt.salt_buf[4],
7946 salt.salt_buf[5]);
7947 }
7948 else if (hash_mode == 12600)
7949 {
7950 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7951 digest_buf[0] + salt.salt_buf_pc[0],
7952 digest_buf[1] + salt.salt_buf_pc[1],
7953 digest_buf[2] + salt.salt_buf_pc[2],
7954 digest_buf[3] + salt.salt_buf_pc[3],
7955 digest_buf[4] + salt.salt_buf_pc[4],
7956 digest_buf[5] + salt.salt_buf_pc[5],
7957 digest_buf[6] + salt.salt_buf_pc[6],
7958 digest_buf[7] + salt.salt_buf_pc[7]);
7959 }
7960 else if (hash_mode == 12700)
7961 {
7962 uint digest_idx = salt.digests_offset + digest_pos;
7963
7964 hashinfo_t **hashinfo_ptr = data.hash_info;
7965 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7966
7967 snprintf (out_buf, len-1, "%s", hash_buf);
7968 }
7969 else if (hash_mode == 12800)
7970 {
7971 const uint8_t *ptr = (const uint8_t *) salt.salt_buf;
7972
7973 snprintf (out_buf, len-1, "%s,%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x,%d,%08x%08x%08x%08x%08x%08x%08x%08x",
7974 SIGNATURE_MS_DRSR,
7975 ptr[0],
7976 ptr[1],
7977 ptr[2],
7978 ptr[3],
7979 ptr[4],
7980 ptr[5],
7981 ptr[6],
7982 ptr[7],
7983 ptr[8],
7984 ptr[9],
7985 salt.salt_iter + 1,
7986 byte_swap_32 (digest_buf[0]),
7987 byte_swap_32 (digest_buf[1]),
7988 byte_swap_32 (digest_buf[2]),
7989 byte_swap_32 (digest_buf[3]),
7990 byte_swap_32 (digest_buf[4]),
7991 byte_swap_32 (digest_buf[5]),
7992 byte_swap_32 (digest_buf[6]),
7993 byte_swap_32 (digest_buf[7])
7994 );
7995 }
7996 else
7997 {
7998 if (hash_type == HASH_TYPE_MD4)
7999 {
8000 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8001 digest_buf[0],
8002 digest_buf[1],
8003 digest_buf[2],
8004 digest_buf[3]);
8005 }
8006 else if (hash_type == HASH_TYPE_MD5)
8007 {
8008 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8009 digest_buf[0],
8010 digest_buf[1],
8011 digest_buf[2],
8012 digest_buf[3]);
8013 }
8014 else if (hash_type == HASH_TYPE_SHA1)
8015 {
8016 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8017 digest_buf[0],
8018 digest_buf[1],
8019 digest_buf[2],
8020 digest_buf[3],
8021 digest_buf[4]);
8022 }
8023 else if (hash_type == HASH_TYPE_SHA256)
8024 {
8025 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8026 digest_buf[0],
8027 digest_buf[1],
8028 digest_buf[2],
8029 digest_buf[3],
8030 digest_buf[4],
8031 digest_buf[5],
8032 digest_buf[6],
8033 digest_buf[7]);
8034 }
8035 else if (hash_type == HASH_TYPE_SHA384)
8036 {
8037 uint *ptr = digest_buf;
8038
8039 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8040 ptr[ 1], ptr[ 0],
8041 ptr[ 3], ptr[ 2],
8042 ptr[ 5], ptr[ 4],
8043 ptr[ 7], ptr[ 6],
8044 ptr[ 9], ptr[ 8],
8045 ptr[11], ptr[10]);
8046 }
8047 else if (hash_type == HASH_TYPE_SHA512)
8048 {
8049 uint *ptr = digest_buf;
8050
8051 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8052 ptr[ 1], ptr[ 0],
8053 ptr[ 3], ptr[ 2],
8054 ptr[ 5], ptr[ 4],
8055 ptr[ 7], ptr[ 6],
8056 ptr[ 9], ptr[ 8],
8057 ptr[11], ptr[10],
8058 ptr[13], ptr[12],
8059 ptr[15], ptr[14]);
8060 }
8061 else if (hash_type == HASH_TYPE_LM)
8062 {
8063 snprintf (out_buf, len-1, "%08x%08x",
8064 digest_buf[0],
8065 digest_buf[1]);
8066 }
8067 else if (hash_type == HASH_TYPE_ORACLEH)
8068 {
8069 snprintf (out_buf, len-1, "%08X%08X",
8070 digest_buf[0],
8071 digest_buf[1]);
8072 }
8073 else if (hash_type == HASH_TYPE_BCRYPT)
8074 {
8075 base64_encode (int_to_bf64, (char *) salt.salt_buf, 16, tmp_buf + 0);
8076 base64_encode (int_to_bf64, (char *) digest_buf, 23, tmp_buf + 22);
8077
8078 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8079
8080 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8081 }
8082 else if (hash_type == HASH_TYPE_KECCAK)
8083 {
8084 uint *ptr = digest_buf;
8085
8086 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8087 ptr[ 1], ptr[ 0],
8088 ptr[ 3], ptr[ 2],
8089 ptr[ 5], ptr[ 4],
8090 ptr[ 7], ptr[ 6],
8091 ptr[ 9], ptr[ 8],
8092 ptr[11], ptr[10],
8093 ptr[13], ptr[12],
8094 ptr[15], ptr[14],
8095 ptr[17], ptr[16],
8096 ptr[19], ptr[18],
8097 ptr[21], ptr[20],
8098 ptr[23], ptr[22],
8099 ptr[25], ptr[24],
8100 ptr[27], ptr[26],
8101 ptr[29], ptr[28],
8102 ptr[31], ptr[30],
8103 ptr[33], ptr[32],
8104 ptr[35], ptr[34],
8105 ptr[37], ptr[36],
8106 ptr[39], ptr[38],
8107 ptr[41], ptr[30],
8108 ptr[43], ptr[42],
8109 ptr[45], ptr[44],
8110 ptr[47], ptr[46],
8111 ptr[49], ptr[48]
8112 );
8113
8114 out_buf[salt.keccak_mdlen * 2] = 0;
8115 }
8116 else if (hash_type == HASH_TYPE_RIPEMD160)
8117 {
8118 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8119 digest_buf[0],
8120 digest_buf[1],
8121 digest_buf[2],
8122 digest_buf[3],
8123 digest_buf[4]);
8124 }
8125 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8126 {
8127 digest_buf[ 0] = digest_buf[ 0];
8128 digest_buf[ 1] = digest_buf[ 1];
8129 digest_buf[ 2] = digest_buf[ 2];
8130 digest_buf[ 3] = digest_buf[ 3];
8131 digest_buf[ 4] = digest_buf[ 4];
8132 digest_buf[ 5] = digest_buf[ 5];
8133 digest_buf[ 6] = digest_buf[ 6];
8134 digest_buf[ 7] = digest_buf[ 7];
8135 digest_buf[ 8] = digest_buf[ 8];
8136 digest_buf[ 9] = digest_buf[ 9];
8137 digest_buf[10] = digest_buf[10];
8138 digest_buf[11] = digest_buf[11];
8139 digest_buf[12] = digest_buf[12];
8140 digest_buf[13] = digest_buf[13];
8141 digest_buf[14] = digest_buf[14];
8142 digest_buf[15] = digest_buf[15];
8143
8144 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8145 digest_buf[ 0],
8146 digest_buf[ 1],
8147 digest_buf[ 2],
8148 digest_buf[ 3],
8149 digest_buf[ 4],
8150 digest_buf[ 5],
8151 digest_buf[ 6],
8152 digest_buf[ 7],
8153 digest_buf[ 8],
8154 digest_buf[ 9],
8155 digest_buf[10],
8156 digest_buf[11],
8157 digest_buf[12],
8158 digest_buf[13],
8159 digest_buf[14],
8160 digest_buf[15]);
8161 }
8162 else if (hash_type == HASH_TYPE_GOST)
8163 {
8164 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8165 digest_buf[0],
8166 digest_buf[1],
8167 digest_buf[2],
8168 digest_buf[3],
8169 digest_buf[4],
8170 digest_buf[5],
8171 digest_buf[6],
8172 digest_buf[7]);
8173 }
8174 else if (hash_type == HASH_TYPE_MYSQL)
8175 {
8176 snprintf (out_buf, len-1, "%08x%08x",
8177 digest_buf[0],
8178 digest_buf[1]);
8179 }
8180 else if (hash_type == HASH_TYPE_LOTUS5)
8181 {
8182 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8183 digest_buf[0],
8184 digest_buf[1],
8185 digest_buf[2],
8186 digest_buf[3]);
8187 }
8188 else if (hash_type == HASH_TYPE_LOTUS6)
8189 {
8190 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8191 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8192 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8193 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8194
8195 char buf[16];
8196
8197 memcpy (buf + 0, salt.salt_buf, 5);
8198 memcpy (buf + 5, digest_buf, 9);
8199
8200 buf[3] -= -4;
8201
8202 base64_encode (int_to_lotus64, buf, 14, tmp_buf);
8203
8204 tmp_buf[18] = salt.salt_buf_pc[7];
8205 tmp_buf[19] = 0;
8206
8207 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8208 }
8209 else if (hash_type == HASH_TYPE_LOTUS8)
8210 {
8211 char buf[52];
8212
8213 memset (buf, 0, sizeof (buf));
8214
8215 // salt
8216
8217 memcpy (buf + 0, salt.salt_buf, 16);
8218
8219 buf[3] -= -4;
8220
8221 // iteration
8222
8223 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8224
8225 // chars
8226
8227 buf[26] = salt.salt_buf_pc[0];
8228 buf[27] = salt.salt_buf_pc[1];
8229
8230 // digest
8231
8232 memcpy (buf + 28, digest_buf, 8);
8233
8234 base64_encode (int_to_lotus64, buf, 36, tmp_buf);
8235
8236 tmp_buf[49] = 0;
8237
8238 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8239 }
8240 else if (hash_type == HASH_TYPE_CRC32)
8241 {
8242 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8243 }
8244 }
8245
8246 if (salt_type == SALT_TYPE_INTERN)
8247 {
8248 size_t pos = strlen (out_buf);
8249
8250 out_buf[pos] = data.separator;
8251
8252 char *ptr = (char *) salt.salt_buf;
8253
8254 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8255
8256 out_buf[pos + 1 + salt.salt_len] = 0;
8257 }
8258 }
8259
8260 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8261 {
8262 memset (hccap, 0, sizeof (hccap_t));
8263
8264 salt_t *salt = &data.salts_buf[salt_pos];
8265
8266 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8267
8268 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8269 wpa_t *wpa = &wpas[salt_pos];
8270
8271 hccap->keyver = wpa->keyver;
8272
8273 hccap->eapol_size = wpa->eapol_size;
8274
8275 if (wpa->keyver != 1)
8276 {
8277 uint eapol_tmp[64];
8278
8279 for (uint i = 0; i < 64; i++)
8280 {
8281 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8282 }
8283
8284 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8285 }
8286 else
8287 {
8288 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8289 }
8290
8291 uint pke_tmp[25];
8292
8293 for (int i = 5; i < 25; i++)
8294 {
8295 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8296 }
8297
8298 char *pke_ptr = (char *) pke_tmp;
8299
8300 memcpy (hccap->mac1, pke_ptr + 23, 6);
8301 memcpy (hccap->mac2, pke_ptr + 29, 6);
8302 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8303 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8304
8305 char *digests_buf_ptr = (char *) data.digests_buf;
8306
8307 uint dgst_size = data.dgst_size;
8308
8309 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8310
8311 if (wpa->keyver != 1)
8312 {
8313 uint digest_tmp[4];
8314
8315 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8316 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8317 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8318 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8319
8320 memcpy (hccap->keymic, digest_tmp, 16);
8321 }
8322 else
8323 {
8324 memcpy (hccap->keymic, digest_ptr, 16);
8325 }
8326 }
8327
8328 void SuspendThreads ()
8329 {
8330 if (data.devices_status == STATUS_RUNNING)
8331 {
8332 hc_timer_set (&data.timer_paused);
8333
8334 data.devices_status = STATUS_PAUSED;
8335
8336 log_info ("Paused");
8337 }
8338 }
8339
8340 void ResumeThreads ()
8341 {
8342 if (data.devices_status == STATUS_PAUSED)
8343 {
8344 float ms_paused;
8345
8346 hc_timer_get (data.timer_paused, ms_paused);
8347
8348 data.ms_paused += ms_paused;
8349
8350 data.devices_status = STATUS_RUNNING;
8351
8352 log_info ("Resumed");
8353 }
8354 }
8355
8356 void bypass ()
8357 {
8358 if (data.devices_status != STATUS_RUNNING) return;
8359
8360 data.devices_status = STATUS_BYPASS;
8361
8362 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8363 }
8364
8365 void stop_at_checkpoint ()
8366 {
8367 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8368 {
8369 if (data.devices_status != STATUS_RUNNING) return;
8370 }
8371
8372 // this feature only makes sense if --restore-disable was not specified
8373
8374 if (data.restore_disable == 1)
8375 {
8376 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8377
8378 return;
8379 }
8380
8381 // check if monitoring of Restore Point updates should be enabled or disabled
8382
8383 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8384 {
8385 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8386
8387 // save the current restore point value
8388
8389 data.checkpoint_cur_words = get_lowest_words_done ();
8390
8391 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8392 }
8393 else
8394 {
8395 data.devices_status = STATUS_RUNNING;
8396
8397 // reset the global value for checkpoint checks
8398
8399 data.checkpoint_cur_words = 0;
8400
8401 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8402 }
8403 }
8404
8405 void myabort ()
8406 {
8407 if (data.devices_status == STATUS_INIT) return;
8408 if (data.devices_status == STATUS_STARTING) return;
8409
8410 data.devices_status = STATUS_ABORTED;
8411 }
8412
8413 void myquit ()
8414 {
8415 if (data.devices_status == STATUS_INIT) return;
8416 if (data.devices_status == STATUS_STARTING) return;
8417
8418 data.devices_status = STATUS_QUIT;
8419 }
8420
8421 #ifdef _OCL
8422 uint get_vliw_by_device_name (const char *device_name)
8423 {
8424 uint vliw = 0;
8425
8426 if (strcmp (device_name, "Capeverde" ) == 0) vliw = 1;
8427 if (strcmp (device_name, "Pitcairn" ) == 0) vliw = 1;
8428 if (strcmp (device_name, "Tahiti" ) == 0) vliw = 1;
8429 if (strcmp (device_name, "ATI RV710" ) == 0) vliw = 1;
8430 if (strcmp (device_name, "ATI RV730" ) == 0) vliw = 1;
8431 if (strcmp (device_name, "ATI RV770" ) == 0) vliw = 4;
8432 if (strcmp (device_name, "Cayman" ) == 0) vliw = 4;
8433 if (strcmp (device_name, "Devastator" ) == 0) vliw = 4;
8434 if (strcmp (device_name, "Scrapper" ) == 0) vliw = 4;
8435 if (strcmp (device_name, "Barts" ) == 0) vliw = 5;
8436 if (strcmp (device_name, "BeaverCreek" ) == 0) vliw = 5;
8437 if (strcmp (device_name, "Caicos" ) == 0) vliw = 5;
8438 if (strcmp (device_name, "Cedar" ) == 0) vliw = 5;
8439 if (strcmp (device_name, "Cypress" ) == 0) vliw = 5;
8440 if (strcmp (device_name, "Juniper" ) == 0) vliw = 5;
8441 if (strcmp (device_name, "Loveland" ) == 0) vliw = 5;
8442 if (strcmp (device_name, "Redwood" ) == 0) vliw = 5;
8443 if (strcmp (device_name, "Turks" ) == 0) vliw = 5;
8444 if (strcmp (device_name, "WinterPark" ) == 0) vliw = 5;
8445 if (strcmp (device_name, "Oland" ) == 0) vliw = 1;
8446 if (strcmp (device_name, "Cats" ) == 0) vliw = 1;
8447 if (strcmp (device_name, "Raccoons" ) == 0) vliw = 1;
8448 if (strcmp (device_name, "Bonaire" ) == 0) vliw = 1;
8449 if (strcmp (device_name, "Hawaii" ) == 0) vliw = 1;
8450 if (strcmp (device_name, "Spectre" ) == 0) vliw = 1;
8451 if (strcmp (device_name, "Spooky" ) == 0) vliw = 1;
8452 if (strcmp (device_name, "Kalindi" ) == 0) vliw = 1;
8453 if (strcmp (device_name, "Hainan" ) == 0) vliw = 1;
8454 if (strcmp (device_name, "Iceland" ) == 0) vliw = 1;
8455 if (strcmp (device_name, "Tonga" ) == 0) vliw = 1;
8456 if (strcmp (device_name, "Mullins" ) == 0) vliw = 1;
8457 if (strcmp (device_name, "Fiji" ) == 0) vliw = 1;
8458
8459 if (strncmp (device_name, "ATI Radeon HD 4", 15) == 0) vliw = 1;
8460 if (strncmp (device_name, "ATI Radeon HD 5", 15) == 0) vliw = 5;
8461 if (strncmp (device_name, "ATI Radeon HD 6", 15) == 0) vliw = 4;
8462 if (strncmp (device_name, "ATI Radeon HD 7", 15) == 0) vliw = 4;
8463 if (strncmp (device_name, "ATI Radeon HD 79", 16) == 0) vliw = 1;
8464 if (strncmp (device_name, "ATI Radeon HD 8", 15) == 0) vliw = 1;
8465 if (strncmp (device_name, "AMD Radeon R9", 13) == 0) vliw = 1;
8466
8467 return vliw;
8468 }
8469 #else
8470 uint get_vliw_by_compute_capability (const uint major, const uint minor)
8471 {
8472 uint vliw = 0;
8473
8474 if (major == 1 && minor == 0) vliw = 1;
8475 if (major == 1 && minor == 1) vliw = 1;
8476 if (major == 1 && minor == 2) vliw = 1;
8477 if (major == 1 && minor == 3) vliw = 1;
8478 if (major == 2 && minor == 0) vliw = 1;
8479 if (major == 2 && minor == 1) vliw = 2;
8480 if (major == 3 && minor == 0) vliw = 2;
8481 if (major == 3 && minor == 5) vliw = 2;
8482 if (major == 3 && minor == 7) vliw = 2;
8483 if (major == 5 && minor == 0) vliw = 2;
8484 if (major == 5 && minor == 2) vliw = 2;
8485
8486 return vliw;
8487 }
8488 #endif
8489
8490 #ifdef _OCL
8491 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const unsigned char **kernel_sources)
8492 {
8493 FILE *fp;
8494
8495 if ((fp = fopen (kernel_file, "rb")) != NULL)
8496 {
8497 struct stat st;
8498
8499 memset (&st, 0, sizeof (st));
8500
8501 stat (kernel_file, &st);
8502
8503 unsigned char *buf = (unsigned char *) mymalloc (st.st_size + 1);
8504
8505 size_t num_read = fread (buf, sizeof (unsigned char), st.st_size, fp);
8506
8507 if (num_read != (size_t) st.st_size)
8508 {
8509 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8510
8511 exit (-1);
8512 }
8513
8514 fclose (fp);
8515
8516 buf[st.st_size] = 0;
8517
8518 for (int i = 0; i < num_devices; i++)
8519 {
8520 kernel_lengths[i] = (size_t) st.st_size;
8521
8522 kernel_sources[i] = buf;
8523 }
8524 }
8525 else
8526 {
8527 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8528
8529 exit (-1);
8530 }
8531
8532 return;
8533 }
8534
8535 void writeProgramBin (char *dst, unsigned char *binary, size_t binary_size)
8536 {
8537 FILE *fp = fopen (dst, "wb");
8538
8539 fwrite (binary, sizeof (unsigned char), binary_size, fp);
8540
8541 fflush (fp);
8542 fclose (fp);
8543 }
8544 #endif
8545
8546 /**
8547 * restore
8548 */
8549
8550 restore_data_t *init_restore (int argc, char **argv)
8551 {
8552 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8553
8554 if (data.restore_disable == 0)
8555 {
8556 FILE *fp = fopen (data.eff_restore_file, "rb");
8557
8558 if (fp)
8559 {
8560 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8561
8562 if (nread != 1)
8563 {
8564 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8565
8566 exit (-1);
8567 }
8568
8569 fclose (fp);
8570
8571 if (rd->pid)
8572 {
8573 char pidbin[BUFSIZ];
8574
8575 int pidbin_len;
8576
8577 #ifdef _POSIX
8578 memset (pidbin, 0, sizeof (pidbin));
8579
8580 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8581
8582 FILE *fd = fopen (pidbin, "rb");
8583
8584 if (fd)
8585 {
8586 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8587
8588 pidbin[pidbin_len] = 0;
8589
8590 fclose (fd);
8591
8592 char *argv0_r = strrchr (argv[0], '/');
8593
8594 char *pidbin_r = strrchr (pidbin, '/');
8595
8596 if (argv0_r == NULL) argv0_r = argv[0];
8597
8598 if (pidbin_r == NULL) pidbin_r = pidbin;
8599
8600 if (strcmp (argv0_r, pidbin_r) == 0)
8601 {
8602 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8603
8604 exit (-1);
8605 }
8606 }
8607
8608 #elif _WIN
8609 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8610
8611 char pidbin2[BUFSIZ];
8612
8613 int pidbin2_len;
8614
8615 memset (pidbin2, 0, sizeof (pidbin2));
8616
8617 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8618 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8619
8620 pidbin[pidbin_len] = 0;
8621 pidbin2[pidbin2_len] = 0;
8622
8623 if (pidbin2_len)
8624 {
8625 if (strcmp (pidbin, pidbin2) == 0)
8626 {
8627 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8628
8629 exit (-1);
8630 }
8631 }
8632 #endif
8633 }
8634
8635 if (rd->version_bin < RESTORE_MIN)
8636 {
8637 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8638
8639 exit (-1);
8640 }
8641 }
8642 }
8643
8644 memset (rd, 0, sizeof (restore_data_t));
8645
8646 rd->version_bin = VERSION_BIN;
8647
8648 #ifdef _POSIX
8649 rd->pid = getpid ();
8650 #elif _WIN
8651 rd->pid = GetCurrentProcessId ();
8652 #endif
8653
8654 if (getcwd (rd->cwd, 255) == NULL)
8655 {
8656 myfree (rd);
8657
8658 return (NULL);
8659 }
8660
8661 rd->argc = argc;
8662 rd->argv = argv;
8663
8664 return (rd);
8665 }
8666
8667 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8668 {
8669 FILE *fp = fopen (eff_restore_file, "rb");
8670
8671 if (fp == NULL)
8672 {
8673 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8674
8675 exit (-1);
8676 }
8677
8678 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8679 {
8680 log_error ("ERROR: cannot read %s", eff_restore_file);
8681
8682 exit (-1);
8683 }
8684
8685 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8686
8687 for (uint i = 0; i < rd->argc; i++)
8688 {
8689 char buf[BUFSIZ];
8690
8691 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8692 {
8693 log_error ("ERROR: cannot read %s", eff_restore_file);
8694
8695 exit (-1);
8696 }
8697
8698 size_t len = strlen (buf);
8699
8700 if (len) buf[len - 1] = 0;
8701
8702 rd->argv[i] = mystrdup (buf);
8703 }
8704
8705 fclose (fp);
8706
8707 char new_cwd[256];
8708
8709 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8710
8711 if (nwd == NULL)
8712 {
8713 log_error ("Restore file is corrupted");
8714 }
8715
8716 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8717 {
8718 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8719 {
8720 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8721
8722 exit (-1);
8723 }
8724
8725 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8726 }
8727
8728
8729 if (chdir (rd->cwd))
8730 {
8731 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8732
8733 exit (-1);
8734 }
8735 }
8736
8737 uint64_t get_lowest_words_done ()
8738 {
8739 uint64_t words_cur = -1;
8740
8741 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8742 {
8743 hc_device_param_t *device_param = &data.devices_param[device_id];
8744
8745 const uint64_t words_done = device_param->words_done;
8746
8747 if (words_done < words_cur) words_cur = words_done;
8748 }
8749
8750 return words_cur;
8751 }
8752
8753 void write_restore (const char *new_restore_file, restore_data_t *rd)
8754 {
8755 uint64_t words_cur = get_lowest_words_done ();
8756
8757 rd->words_cur = words_cur;
8758
8759 FILE *fp = fopen (new_restore_file, "wb");
8760
8761 if (fp == NULL)
8762 {
8763 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8764
8765 exit (-1);
8766 }
8767
8768 if (setvbuf (fp, NULL, _IONBF, 0))
8769 {
8770 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8771
8772 exit (-1);
8773 }
8774
8775 fwrite (rd, sizeof (restore_data_t), 1, fp);
8776
8777 for (uint i = 0; i < rd->argc; i++)
8778 {
8779 fprintf (fp, "%s", rd->argv[i]);
8780 fputc ('\n', fp);
8781 }
8782
8783 fflush (fp);
8784
8785 fsync (fileno (fp));
8786
8787 fclose (fp);
8788 }
8789
8790 void cycle_restore ()
8791 {
8792 const char *eff_restore_file = data.eff_restore_file;
8793 const char *new_restore_file = data.new_restore_file;
8794
8795 restore_data_t *rd = data.rd;
8796
8797 write_restore (new_restore_file, rd);
8798
8799 struct stat st;
8800
8801 memset (&st, 0, sizeof(st));
8802
8803 if (stat (eff_restore_file, &st) == 0)
8804 {
8805 if (unlink (eff_restore_file))
8806 {
8807 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
8808 }
8809 }
8810
8811 if (rename (new_restore_file, eff_restore_file))
8812 {
8813 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
8814 }
8815 }
8816
8817 void check_checkpoint ()
8818 {
8819 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
8820
8821 uint64_t words_cur = get_lowest_words_done ();
8822
8823 if (words_cur != data.checkpoint_cur_words)
8824 {
8825 myabort ();
8826 }
8827 }
8828
8829 /**
8830 * adjustments
8831 */
8832
8833 uint set_gpu_accel (uint hash_mode)
8834 {
8835 switch (hash_mode)
8836 {
8837 case 0: return GET_ACCEL (0);
8838 case 10: return GET_ACCEL (10);
8839 case 11: return GET_ACCEL (11);
8840 case 12: return GET_ACCEL (12);
8841 case 20: return GET_ACCEL (20);
8842 case 21: return GET_ACCEL (21);
8843 case 22: return GET_ACCEL (22);
8844 case 23: return GET_ACCEL (23);
8845 case 30: return GET_ACCEL (30);
8846 case 40: return GET_ACCEL (40);
8847 case 50: return GET_ACCEL (50);
8848 case 60: return GET_ACCEL (60);
8849 case 100: return GET_ACCEL (100);
8850 case 101: return GET_ACCEL (101);
8851 case 110: return GET_ACCEL (110);
8852 case 111: return GET_ACCEL (111);
8853 case 112: return GET_ACCEL (112);
8854 case 120: return GET_ACCEL (120);
8855 case 121: return GET_ACCEL (121);
8856 case 122: return GET_ACCEL (122);
8857 case 124: return GET_ACCEL (124);
8858 case 130: return GET_ACCEL (130);
8859 case 131: return GET_ACCEL (131);
8860 case 132: return GET_ACCEL (132);
8861 case 133: return GET_ACCEL (133);
8862 case 140: return GET_ACCEL (140);
8863 case 141: return GET_ACCEL (141);
8864 case 150: return GET_ACCEL (150);
8865 case 160: return GET_ACCEL (160);
8866 case 190: return GET_ACCEL (190);
8867 case 200: return GET_ACCEL (200);
8868 case 300: return GET_ACCEL (300);
8869 case 400: return GET_ACCEL (400);
8870 case 500: return GET_ACCEL (500);
8871 case 501: return GET_ACCEL (501);
8872 case 900: return GET_ACCEL (900);
8873 case 910: return GET_ACCEL (910);
8874 case 1000: return GET_ACCEL (1000);
8875 case 1100: return GET_ACCEL (1100);
8876 case 1400: return GET_ACCEL (1400);
8877 case 1410: return GET_ACCEL (1410);
8878 case 1420: return GET_ACCEL (1420);
8879 case 1421: return GET_ACCEL (1421);
8880 case 1430: return GET_ACCEL (1430);
8881 case 1440: return GET_ACCEL (1440);
8882 case 1441: return GET_ACCEL (1441);
8883 case 1450: return GET_ACCEL (1450);
8884 case 1460: return GET_ACCEL (1460);
8885 case 1500: return GET_ACCEL (1500);
8886 case 1600: return GET_ACCEL (1600);
8887 case 1700: return GET_ACCEL (1700);
8888 case 1710: return GET_ACCEL (1710);
8889 case 1711: return GET_ACCEL (1711);
8890 case 1720: return GET_ACCEL (1720);
8891 case 1722: return GET_ACCEL (1722);
8892 case 1730: return GET_ACCEL (1730);
8893 case 1731: return GET_ACCEL (1731);
8894 case 1740: return GET_ACCEL (1740);
8895 case 1750: return GET_ACCEL (1750);
8896 case 1760: return GET_ACCEL (1760);
8897 case 1800: return GET_ACCEL (1800);
8898 case 2100: return GET_ACCEL (2100);
8899 case 2400: return GET_ACCEL (2400);
8900 case 2410: return GET_ACCEL (2410);
8901 case 2500: return GET_ACCEL (2500);
8902 case 2600: return GET_ACCEL (2600);
8903 case 2611: return GET_ACCEL (2611);
8904 case 2612: return GET_ACCEL (2612);
8905 case 2711: return GET_ACCEL (2711);
8906 case 2811: return GET_ACCEL (2811);
8907 case 3000: return GET_ACCEL (3000);
8908 case 3100: return GET_ACCEL (3100);
8909 case 3200: return GET_ACCEL (3200);
8910 case 3710: return GET_ACCEL (3710);
8911 case 3711: return GET_ACCEL (3711);
8912 case 3800: return GET_ACCEL (3800);
8913 case 4300: return GET_ACCEL (4300);
8914 case 4400: return GET_ACCEL (4400);
8915 case 4500: return GET_ACCEL (4500);
8916 case 4700: return GET_ACCEL (4700);
8917 case 4800: return GET_ACCEL (4800);
8918 case 4900: return GET_ACCEL (4900);
8919 case 5000: return GET_ACCEL (5000);
8920 case 5100: return GET_ACCEL (5100);
8921 case 5200: return GET_ACCEL (5200);
8922 case 5300: return GET_ACCEL (5300);
8923 case 5400: return GET_ACCEL (5400);
8924 case 5500: return GET_ACCEL (5500);
8925 case 5600: return GET_ACCEL (5600);
8926 case 5700: return GET_ACCEL (5700);
8927 case 5800: return GET_ACCEL (5800);
8928 case 6000: return GET_ACCEL (6000);
8929 case 6100: return GET_ACCEL (6100);
8930 case 6211: return GET_ACCEL (6211);
8931 case 6212: return GET_ACCEL (6212);
8932 case 6213: return GET_ACCEL (6213);
8933 case 6221: return GET_ACCEL (6221);
8934 case 6222: return GET_ACCEL (6222);
8935 case 6223: return GET_ACCEL (6223);
8936 case 6231: return GET_ACCEL (6231);
8937 case 6232: return GET_ACCEL (6232);
8938 case 6233: return GET_ACCEL (6233);
8939 case 6241: return GET_ACCEL (6241);
8940 case 6242: return GET_ACCEL (6242);
8941 case 6243: return GET_ACCEL (6243);
8942 case 6300: return GET_ACCEL (6300);
8943 case 6400: return GET_ACCEL (6400);
8944 case 6500: return GET_ACCEL (6500);
8945 case 6600: return GET_ACCEL (6600);
8946 case 6700: return GET_ACCEL (6700);
8947 case 6800: return GET_ACCEL (6800);
8948 case 6900: return GET_ACCEL (6900);
8949 case 7100: return GET_ACCEL (7100);
8950 case 7200: return GET_ACCEL (7200);
8951 case 7300: return GET_ACCEL (7300);
8952 case 7400: return GET_ACCEL (7400);
8953 case 7500: return GET_ACCEL (7500);
8954 case 7600: return GET_ACCEL (7600);
8955 case 7700: return GET_ACCEL (7700);
8956 case 7800: return GET_ACCEL (7800);
8957 case 7900: return GET_ACCEL (7900);
8958 case 8000: return GET_ACCEL (8000);
8959 case 8100: return GET_ACCEL (8100);
8960 case 8200: return GET_ACCEL (8200);
8961 case 8300: return GET_ACCEL (8300);
8962 case 8400: return GET_ACCEL (8400);
8963 case 8500: return GET_ACCEL (8500);
8964 case 8600: return GET_ACCEL (8600);
8965 case 8700: return GET_ACCEL (8700);
8966 case 8800: return GET_ACCEL (8800);
8967 case 8900: return GET_ACCEL (8900);
8968 case 9000: return GET_ACCEL (9000);
8969 case 9100: return GET_ACCEL (9100);
8970 case 9200: return GET_ACCEL (9200);
8971 case 9300: return GET_ACCEL (9300);
8972 case 9400: return GET_ACCEL (9400);
8973 case 9500: return GET_ACCEL (9500);
8974 case 9600: return GET_ACCEL (9600);
8975 case 9700: return GET_ACCEL (9700);
8976 case 9710: return GET_ACCEL (9710);
8977 case 9720: return GET_ACCEL (9720);
8978 case 9800: return GET_ACCEL (9800);
8979 case 9810: return GET_ACCEL (9810);
8980 case 9820: return GET_ACCEL (9820);
8981 case 9900: return GET_ACCEL (9900);
8982 case 10000: return GET_ACCEL (10000);
8983 case 10100: return GET_ACCEL (10100);
8984 case 10200: return GET_ACCEL (10200);
8985 case 10300: return GET_ACCEL (10300);
8986 case 10400: return GET_ACCEL (10400);
8987 case 10410: return GET_ACCEL (10410);
8988 case 10420: return GET_ACCEL (10420);
8989 case 10500: return GET_ACCEL (10500);
8990 case 10600: return GET_ACCEL (10600);
8991 case 10700: return GET_ACCEL (10700);
8992 case 10800: return GET_ACCEL (10800);
8993 case 10900: return GET_ACCEL (10900);
8994 case 11000: return GET_ACCEL (11000);
8995 case 11100: return GET_ACCEL (11100);
8996 case 11200: return GET_ACCEL (11200);
8997 case 11300: return GET_ACCEL (11300);
8998 case 11400: return GET_ACCEL (11400);
8999 case 11500: return GET_ACCEL (11500);
9000 case 11600: return GET_ACCEL (11600);
9001 case 11700: return GET_ACCEL (11700);
9002 case 11800: return GET_ACCEL (11800);
9003 case 11900: return GET_ACCEL (11900);
9004 case 12000: return GET_ACCEL (12000);
9005 case 12100: return GET_ACCEL (12100);
9006 case 12200: return GET_ACCEL (12200);
9007 case 12300: return GET_ACCEL (12300);
9008 case 12400: return GET_ACCEL (12400);
9009 case 12500: return GET_ACCEL (12500);
9010 case 12600: return GET_ACCEL (12600);
9011 case 12700: return GET_ACCEL (12700);
9012 case 12800: return GET_ACCEL (12800);
9013 }
9014
9015 return 0;
9016 }
9017
9018 uint set_gpu_loops (uint hash_mode)
9019 {
9020 switch (hash_mode)
9021 {
9022 case 0: return GET_LOOPS (0);
9023 case 10: return GET_LOOPS (10);
9024 case 11: return GET_LOOPS (11);
9025 case 12: return GET_LOOPS (12);
9026 case 20: return GET_LOOPS (20);
9027 case 21: return GET_LOOPS (21);
9028 case 22: return GET_LOOPS (22);
9029 case 23: return GET_LOOPS (23);
9030 case 30: return GET_LOOPS (30);
9031 case 40: return GET_LOOPS (40);
9032 case 50: return GET_LOOPS (50);
9033 case 60: return GET_LOOPS (60);
9034 case 100: return GET_LOOPS (100);
9035 case 101: return GET_LOOPS (101);
9036 case 110: return GET_LOOPS (110);
9037 case 111: return GET_LOOPS (111);
9038 case 112: return GET_LOOPS (112);
9039 case 120: return GET_LOOPS (120);
9040 case 121: return GET_LOOPS (121);
9041 case 122: return GET_LOOPS (122);
9042 case 124: return GET_LOOPS (124);
9043 case 130: return GET_LOOPS (130);
9044 case 131: return GET_LOOPS (131);
9045 case 132: return GET_LOOPS (132);
9046 case 133: return GET_LOOPS (133);
9047 case 140: return GET_LOOPS (140);
9048 case 141: return GET_LOOPS (141);
9049 case 150: return GET_LOOPS (150);
9050 case 160: return GET_LOOPS (160);
9051 case 190: return GET_LOOPS (190);
9052 case 200: return GET_LOOPS (200);
9053 case 300: return GET_LOOPS (300);
9054 case 400: return GET_LOOPS (400);
9055 case 500: return GET_LOOPS (500);
9056 case 501: return GET_LOOPS (501);
9057 case 900: return GET_LOOPS (900);
9058 case 910: return GET_LOOPS (910);
9059 case 1000: return GET_LOOPS (1000);
9060 case 1100: return GET_LOOPS (1100);
9061 case 1400: return GET_LOOPS (1400);
9062 case 1410: return GET_LOOPS (1410);
9063 case 1420: return GET_LOOPS (1420);
9064 case 1421: return GET_LOOPS (1421);
9065 case 1430: return GET_LOOPS (1430);
9066 case 1440: return GET_LOOPS (1440);
9067 case 1441: return GET_LOOPS (1441);
9068 case 1450: return GET_LOOPS (1450);
9069 case 1460: return GET_LOOPS (1460);
9070 case 1500: return GET_LOOPS (1500);
9071 case 1600: return GET_LOOPS (1600);
9072 case 1700: return GET_LOOPS (1700);
9073 case 1710: return GET_LOOPS (1710);
9074 case 1711: return GET_LOOPS (1711);
9075 case 1720: return GET_LOOPS (1720);
9076 case 1722: return GET_LOOPS (1722);
9077 case 1730: return GET_LOOPS (1730);
9078 case 1731: return GET_LOOPS (1731);
9079 case 1740: return GET_LOOPS (1740);
9080 case 1750: return GET_LOOPS (1750);
9081 case 1760: return GET_LOOPS (1760);
9082 case 1800: return GET_LOOPS (1800);
9083 case 2100: return GET_LOOPS (2100);
9084 case 2400: return GET_LOOPS (2400);
9085 case 2410: return GET_LOOPS (2410);
9086 case 2500: return GET_LOOPS (2500);
9087 case 2600: return GET_LOOPS (2600);
9088 case 2611: return GET_LOOPS (2611);
9089 case 2612: return GET_LOOPS (2612);
9090 case 2711: return GET_LOOPS (2711);
9091 case 2811: return GET_LOOPS (2811);
9092 case 3000: return GET_LOOPS (3000);
9093 case 3100: return GET_LOOPS (3100);
9094 case 3200: return GET_LOOPS (3200);
9095 case 3710: return GET_LOOPS (3710);
9096 case 3711: return GET_LOOPS (3711);
9097 case 3800: return GET_LOOPS (3800);
9098 case 4300: return GET_LOOPS (4300);
9099 case 4400: return GET_LOOPS (4400);
9100 case 4500: return GET_LOOPS (4500);
9101 case 4700: return GET_LOOPS (4700);
9102 case 4800: return GET_LOOPS (4800);
9103 case 4900: return GET_LOOPS (4900);
9104 case 5000: return GET_LOOPS (5000);
9105 case 5100: return GET_LOOPS (5100);
9106 case 5200: return GET_LOOPS (5200);
9107 case 5300: return GET_LOOPS (5300);
9108 case 5400: return GET_LOOPS (5400);
9109 case 5500: return GET_LOOPS (5500);
9110 case 5600: return GET_LOOPS (5600);
9111 case 5700: return GET_LOOPS (5700);
9112 case 5800: return GET_LOOPS (5800);
9113 case 6000: return GET_LOOPS (6000);
9114 case 6100: return GET_LOOPS (6100);
9115 case 6211: return GET_LOOPS (6211);
9116 case 6212: return GET_LOOPS (6212);
9117 case 6213: return GET_LOOPS (6213);
9118 case 6221: return GET_LOOPS (6221);
9119 case 6222: return GET_LOOPS (6222);
9120 case 6223: return GET_LOOPS (6223);
9121 case 6231: return GET_LOOPS (6231);
9122 case 6232: return GET_LOOPS (6232);
9123 case 6233: return GET_LOOPS (6233);
9124 case 6241: return GET_LOOPS (6241);
9125 case 6242: return GET_LOOPS (6242);
9126 case 6243: return GET_LOOPS (6243);
9127 case 6300: return GET_LOOPS (6300);
9128 case 6400: return GET_LOOPS (6400);
9129 case 6500: return GET_LOOPS (6500);
9130 case 6600: return GET_LOOPS (6600);
9131 case 6700: return GET_LOOPS (6700);
9132 case 6800: return GET_LOOPS (6800);
9133 case 6900: return GET_LOOPS (6900);
9134 case 7100: return GET_LOOPS (7100);
9135 case 7200: return GET_LOOPS (7200);
9136 case 7300: return GET_LOOPS (7300);
9137 case 7400: return GET_LOOPS (7400);
9138 case 7500: return GET_LOOPS (7500);
9139 case 7600: return GET_LOOPS (7600);
9140 case 7700: return GET_LOOPS (7700);
9141 case 7800: return GET_LOOPS (7800);
9142 case 7900: return GET_LOOPS (7900);
9143 case 8000: return GET_LOOPS (8000);
9144 case 8100: return GET_LOOPS (8100);
9145 case 8200: return GET_LOOPS (8200);
9146 case 8300: return GET_LOOPS (8300);
9147 case 8400: return GET_LOOPS (8400);
9148 case 8500: return GET_LOOPS (8500);
9149 case 8600: return GET_LOOPS (8600);
9150 case 8700: return GET_LOOPS (8700);
9151 case 8800: return GET_LOOPS (8800);
9152 case 8900: return GET_LOOPS (8900);
9153 case 9000: return GET_LOOPS (9000);
9154 case 9100: return GET_LOOPS (9100);
9155 case 9200: return GET_LOOPS (9200);
9156 case 9300: return GET_LOOPS (9300);
9157 case 9400: return GET_LOOPS (9400);
9158 case 9500: return GET_LOOPS (9500);
9159 case 9600: return GET_LOOPS (9600);
9160 case 9700: return GET_LOOPS (9700);
9161 case 9710: return GET_LOOPS (9710);
9162 case 9720: return GET_LOOPS (9720);
9163 case 9800: return GET_LOOPS (9800);
9164 case 9810: return GET_LOOPS (9810);
9165 case 9820: return GET_LOOPS (9820);
9166 case 9900: return GET_LOOPS (9900);
9167 case 10000: return GET_LOOPS (10000);
9168 case 10100: return GET_LOOPS (10100);
9169 case 10200: return GET_LOOPS (10200);
9170 case 10300: return GET_LOOPS (10300);
9171 case 10400: return GET_LOOPS (10400);
9172 case 10410: return GET_LOOPS (10410);
9173 case 10420: return GET_LOOPS (10420);
9174 case 10500: return GET_LOOPS (10500);
9175 case 10600: return GET_LOOPS (10600);
9176 case 10700: return GET_LOOPS (10700);
9177 case 10800: return GET_LOOPS (10800);
9178 case 10900: return GET_LOOPS (10900);
9179 case 11000: return GET_LOOPS (11000);
9180 case 11100: return GET_LOOPS (11100);
9181 case 11200: return GET_LOOPS (11200);
9182 case 11300: return GET_LOOPS (11300);
9183 case 11400: return GET_LOOPS (11400);
9184 case 11500: return GET_LOOPS (11500);
9185 case 11600: return GET_LOOPS (11600);
9186 case 11700: return GET_LOOPS (11700);
9187 case 11800: return GET_LOOPS (11800);
9188 case 11900: return GET_LOOPS (11900);
9189 case 12000: return GET_LOOPS (12000);
9190 case 12100: return GET_LOOPS (12100);
9191 case 12200: return GET_LOOPS (12200);
9192 case 12300: return GET_LOOPS (12300);
9193 case 12400: return GET_LOOPS (12400);
9194 case 12500: return GET_LOOPS (12500);
9195 case 12600: return GET_LOOPS (12600);
9196 case 12700: return GET_LOOPS (12700);
9197 case 12800: return GET_LOOPS (12800);
9198 }
9199
9200 return 0;
9201 }
9202
9203 /**
9204 * parser
9205 */
9206
9207 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9208 {
9209 char tmp[256];
9210
9211 if (salt_len > sizeof(tmp))
9212 {
9213 return UINT_MAX;
9214 }
9215
9216 memset (tmp, 0, sizeof (tmp));
9217 memcpy (tmp, in, salt_len);
9218
9219 if (data.opts_type & OPTS_TYPE_ST_HEX)
9220 {
9221 if ((salt_len % 2) == 0)
9222 {
9223 uint new_salt_len = salt_len / 2;
9224
9225 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9226 {
9227 char p0 = tmp[j + 0];
9228 char p1 = tmp[j + 1];
9229
9230 tmp[i] = hex_convert (p1) << 0;
9231 tmp[i] |= hex_convert (p0) << 4;
9232 }
9233
9234 salt_len = new_salt_len;
9235 }
9236 else
9237 {
9238 return UINT_MAX;
9239 }
9240 }
9241 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9242 {
9243 salt_len = base64_decode (base64_to_int, in, salt_len, tmp);
9244 }
9245
9246 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9247
9248 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9249 {
9250 if (salt_len < 20)
9251 {
9252 uint *tmp_uint = (uint *) tmp;
9253
9254 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9255 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9256 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9257 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9258 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9259 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9260 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9261 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9262 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9263 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9264
9265 salt_len = salt_len * 2;
9266 }
9267 else
9268 {
9269 return UINT_MAX;
9270 }
9271 }
9272
9273 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9274 {
9275 lowercase (tmp, salt_len);
9276 }
9277
9278 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9279 {
9280 uppercase (tmp, salt_len);
9281 }
9282
9283 uint len = salt_len;
9284
9285 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9286 {
9287 tmp[len++] = 0x80;
9288 }
9289
9290 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9291 {
9292 tmp[len++] = 0x01;
9293 }
9294
9295 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9296 {
9297 uint *tmp_uint = (uint *) tmp;
9298
9299 uint max = len / 4;
9300
9301 if (len % 4) max++;
9302
9303 for (uint i = 0; i < max; i++)
9304 {
9305 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9306 }
9307
9308 // Important: we may need to increase the length of memcpy since
9309 // we don't want to "loose" some swapped bytes (could happen if
9310 // they do not perfectly fit in the 4-byte blocks)
9311 // Memcpy does always copy the bytes in the BE order, but since
9312 // we swapped them, some important bytes could be in positions
9313 // we normally skip with the original len
9314
9315 if (len % 4) len += 4 - (len % 4);
9316 }
9317
9318 memcpy (out, tmp, len);
9319
9320 return (salt_len);
9321 }
9322
9323 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9324 {
9325 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9326
9327 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9328
9329 uint32_t *digest = (uint32_t *) hash_buf->digest;
9330
9331 salt_t *salt = hash_buf->salt;
9332
9333 memcpy ((char *) salt->salt_sign, input_buf, 6);
9334
9335 char *iter_pos = input_buf + 4;
9336
9337 salt->salt_iter = 1 << atoi (iter_pos);
9338
9339 char *salt_pos = strchr (iter_pos, '$');
9340
9341 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9342
9343 salt_pos++;
9344
9345 uint salt_len = 16;
9346
9347 salt->salt_len = salt_len;
9348
9349 char tmp_buf[100];
9350
9351 memset (tmp_buf, 0, sizeof (tmp_buf));
9352
9353 base64_decode (bf64_to_int, salt_pos, 22, tmp_buf);
9354
9355 char *salt_buf_ptr = (char *) salt->salt_buf;
9356
9357 memcpy (salt_buf_ptr, tmp_buf, 16);
9358
9359 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9360 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9361 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9362 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9363
9364 char *hash_pos = salt_pos + 22;
9365
9366 memset (tmp_buf, 0, sizeof (tmp_buf));
9367
9368 base64_decode (bf64_to_int, hash_pos, 31, tmp_buf);
9369
9370 memcpy (digest, tmp_buf, 24);
9371
9372 digest[0] = byte_swap_32 (digest[0]);
9373 digest[1] = byte_swap_32 (digest[1]);
9374 digest[2] = byte_swap_32 (digest[2]);
9375 digest[3] = byte_swap_32 (digest[3]);
9376 digest[4] = byte_swap_32 (digest[4]);
9377 digest[5] = byte_swap_32 (digest[5]);
9378
9379 digest[5] &= ~0xff; // its just 23 not 24 !
9380
9381 return (PARSER_OK);
9382 }
9383
9384 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9385 {
9386 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9387
9388 uint32_t *digest = (uint32_t *) hash_buf->digest;
9389
9390 char tmp_buf[100];
9391
9392 memset (tmp_buf, 0, sizeof (tmp_buf));
9393
9394 base64_decode (itoa64_to_int, input_buf, 43, tmp_buf);
9395
9396 memcpy (digest, tmp_buf, 32);
9397
9398 digest[0] = byte_swap_32 (digest[0]);
9399 digest[1] = byte_swap_32 (digest[1]);
9400 digest[2] = byte_swap_32 (digest[2]);
9401 digest[3] = byte_swap_32 (digest[3]);
9402 digest[4] = byte_swap_32 (digest[4]);
9403 digest[5] = byte_swap_32 (digest[5]);
9404 digest[6] = byte_swap_32 (digest[6]);
9405 digest[7] = byte_swap_32 (digest[7]);
9406
9407 digest[0] -= SHA256M_A;
9408 digest[1] -= SHA256M_B;
9409 digest[2] -= SHA256M_C;
9410 digest[3] -= SHA256M_D;
9411 digest[4] -= SHA256M_E;
9412 digest[5] -= SHA256M_F;
9413 digest[6] -= SHA256M_G;
9414 digest[7] -= SHA256M_H;
9415
9416 return (PARSER_OK);
9417 }
9418
9419 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9420 {
9421 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9422
9423 uint32_t *digest = (uint32_t *) hash_buf->digest;
9424
9425 digest[0] = hex_to_uint (&input_buf[ 0]);
9426 digest[1] = hex_to_uint (&input_buf[ 8]);
9427
9428 digest[0] = byte_swap_32 (digest[0]);
9429 digest[1] = byte_swap_32 (digest[1]);
9430
9431 uint tt;
9432
9433 IP (digest[0], digest[1], tt);
9434
9435 digest[0] = digest[0];
9436 digest[1] = digest[1];
9437 digest[2] = 0;
9438 digest[3] = 0;
9439
9440 return (PARSER_OK);
9441 }
9442
9443 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9444 {
9445 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9446
9447 uint32_t *digest = (uint32_t *) hash_buf->digest;
9448
9449 salt_t *salt = hash_buf->salt;
9450
9451 char *hash_pos = input_buf + 8;
9452
9453 digest[0] = hex_to_uint (&hash_pos[ 0]);
9454 digest[1] = hex_to_uint (&hash_pos[ 8]);
9455 digest[2] = hex_to_uint (&hash_pos[16]);
9456 digest[3] = hex_to_uint (&hash_pos[24]);
9457 digest[4] = hex_to_uint (&hash_pos[32]);
9458
9459 digest[0] -= SHA1M_A;
9460 digest[1] -= SHA1M_B;
9461 digest[2] -= SHA1M_C;
9462 digest[3] -= SHA1M_D;
9463 digest[4] -= SHA1M_E;
9464
9465 uint salt_len = 8;
9466
9467 char *salt_buf_ptr = (char *) salt->salt_buf;
9468
9469 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9470
9471 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9472
9473 salt->salt_len = salt_len;
9474
9475 return (PARSER_OK);
9476 }
9477
9478 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9479 {
9480 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9481
9482 uint64_t *digest = (uint64_t *) hash_buf->digest;
9483
9484 salt_t *salt = hash_buf->salt;
9485
9486 char *hash_pos = input_buf + 8;
9487
9488 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
9489 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
9490 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
9491 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
9492 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
9493 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
9494 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
9495 digest[7] = hex_to_uint64_t (&hash_pos[112]);
9496
9497 digest[0] -= SHA512M_A;
9498 digest[1] -= SHA512M_B;
9499 digest[2] -= SHA512M_C;
9500 digest[3] -= SHA512M_D;
9501 digest[4] -= SHA512M_E;
9502 digest[5] -= SHA512M_F;
9503 digest[6] -= SHA512M_G;
9504 digest[7] -= SHA512M_H;
9505
9506 uint salt_len = 8;
9507
9508 char *salt_buf_ptr = (char *) salt->salt_buf;
9509
9510 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9511
9512 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9513
9514 salt->salt_len = salt_len;
9515
9516 return (PARSER_OK);
9517 }
9518
9519 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9520 {
9521 if (data.opts_type & OPTS_TYPE_ST_HEX)
9522 {
9523 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9524 }
9525 else
9526 {
9527 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9528 }
9529
9530 uint32_t *digest = (uint32_t *) hash_buf->digest;
9531
9532 salt_t *salt = hash_buf->salt;
9533
9534 digest[0] = hex_to_uint (&input_buf[ 0]);
9535 digest[1] = hex_to_uint (&input_buf[ 8]);
9536 digest[2] = hex_to_uint (&input_buf[16]);
9537 digest[3] = hex_to_uint (&input_buf[24]);
9538
9539 digest[0] = byte_swap_32 (digest[0]);
9540 digest[1] = byte_swap_32 (digest[1]);
9541 digest[2] = byte_swap_32 (digest[2]);
9542 digest[3] = byte_swap_32 (digest[3]);
9543
9544 digest[0] -= MD5M_A;
9545 digest[1] -= MD5M_B;
9546 digest[2] -= MD5M_C;
9547 digest[3] -= MD5M_D;
9548
9549 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9550
9551 uint salt_len = input_len - 32 - 1;
9552
9553 char *salt_buf = input_buf + 32 + 1;
9554
9555 char *salt_buf_ptr = (char *) salt->salt_buf;
9556
9557 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9558
9559 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9560
9561 salt->salt_len = salt_len;
9562
9563 return (PARSER_OK);
9564 }
9565
9566 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9567 {
9568 if (data.opts_type & OPTS_TYPE_ST_HEX)
9569 {
9570 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9571 }
9572 else
9573 {
9574 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9575 }
9576
9577 // unscramble
9578
9579 char clean_input_buf[32];
9580
9581 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9582 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9583
9584 for (int i = 0, j = 0, k = 0; i < 30; i++)
9585 {
9586 if (i == pos[j])
9587 {
9588 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9589
9590 j++;
9591 }
9592 else
9593 {
9594 clean_input_buf[k] = input_buf[i];
9595
9596 k++;
9597 }
9598 }
9599
9600 // base64 decode
9601
9602 uint32_t *digest = (uint32_t *) hash_buf->digest;
9603
9604 salt_t *salt = hash_buf->salt;
9605
9606 char a, b, c, d, e, f;
9607
9608 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9609 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9610 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9611 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9612 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9613 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9614
9615 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9616 | (((d << 12) | (e << 6) | (f)) << 0);
9617
9618 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9619 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9620 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9621 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9622 e = base64_to_int (clean_input_buf[10] & 0x7f);
9623 f = base64_to_int (clean_input_buf[11] & 0x7f);
9624
9625 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9626 | (((d << 12) | (e << 6) | (f)) << 0);
9627
9628 a = base64_to_int (clean_input_buf[12] & 0x7f);
9629 b = base64_to_int (clean_input_buf[13] & 0x7f);
9630 c = base64_to_int (clean_input_buf[14] & 0x7f);
9631 d = base64_to_int (clean_input_buf[15] & 0x7f);
9632 e = base64_to_int (clean_input_buf[16] & 0x7f);
9633 f = base64_to_int (clean_input_buf[17] & 0x7f);
9634
9635 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9636 | (((d << 12) | (e << 6) | (f)) << 0);
9637
9638 a = base64_to_int (clean_input_buf[18] & 0x7f);
9639 b = base64_to_int (clean_input_buf[19] & 0x7f);
9640 c = base64_to_int (clean_input_buf[20] & 0x7f);
9641 d = base64_to_int (clean_input_buf[21] & 0x7f);
9642 e = base64_to_int (clean_input_buf[22] & 0x7f);
9643 f = base64_to_int (clean_input_buf[23] & 0x7f);
9644
9645 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9646 | (((d << 12) | (e << 6) | (f)) << 0);
9647
9648 digest[0] = byte_swap_32 (digest[0]);
9649 digest[1] = byte_swap_32 (digest[1]);
9650 digest[2] = byte_swap_32 (digest[2]);
9651 digest[3] = byte_swap_32 (digest[3]);
9652
9653 digest[0] -= MD5M_A;
9654 digest[1] -= MD5M_B;
9655 digest[2] -= MD5M_C;
9656 digest[3] -= MD5M_D;
9657
9658 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9659
9660 uint salt_len = input_len - 30 - 1;
9661
9662 char *salt_buf = input_buf + 30 + 1;
9663
9664 char *salt_buf_ptr = (char *) salt->salt_buf;
9665
9666 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9667
9668 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9669
9670 salt->salt_len = salt_len;
9671
9672 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9673
9674 salt->salt_len += 22;
9675
9676 return (PARSER_OK);
9677 }
9678
9679 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9680 {
9681 if (data.opts_type & OPTS_TYPE_ST_HEX)
9682 {
9683 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9684 }
9685 else
9686 {
9687 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9688 }
9689
9690 uint32_t *digest = (uint32_t *) hash_buf->digest;
9691
9692 salt_t *salt = hash_buf->salt;
9693
9694 digest[0] = hex_to_uint (&input_buf[ 0]);
9695 digest[1] = hex_to_uint (&input_buf[ 8]);
9696 digest[2] = hex_to_uint (&input_buf[16]);
9697 digest[3] = hex_to_uint (&input_buf[24]);
9698 digest[4] = hex_to_uint (&input_buf[32]);
9699
9700 digest[0] -= SHA1M_A;
9701 digest[1] -= SHA1M_B;
9702 digest[2] -= SHA1M_C;
9703 digest[3] -= SHA1M_D;
9704 digest[4] -= SHA1M_E;
9705
9706 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9707
9708 uint salt_len = input_len - 40 - 1;
9709
9710 char *salt_buf = input_buf + 40 + 1;
9711
9712 char *salt_buf_ptr = (char *) salt->salt_buf;
9713
9714 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9715
9716 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9717
9718 salt->salt_len = salt_len;
9719
9720 return (PARSER_OK);
9721 }
9722
9723 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9724 {
9725 if (data.opts_type & OPTS_TYPE_ST_HEX)
9726 {
9727 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9728 }
9729 else
9730 {
9731 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9732 }
9733
9734 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9735
9736 char *iter_pos = input_buf + 6;
9737
9738 salt_t *salt = hash_buf->salt;
9739
9740 salt->salt_iter = atoi (iter_pos) - 1;
9741
9742 char *salt_pos = strchr (iter_pos, '#');
9743
9744 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9745
9746 salt_pos++;
9747
9748 char *digest_pos = strchr (salt_pos, '#');
9749
9750 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9751
9752 digest_pos++;
9753
9754 uint salt_len = digest_pos - salt_pos - 1;
9755
9756 uint32_t *digest = (uint32_t *) hash_buf->digest;
9757
9758 digest[0] = hex_to_uint (&digest_pos[ 0]);
9759 digest[1] = hex_to_uint (&digest_pos[ 8]);
9760 digest[2] = hex_to_uint (&digest_pos[16]);
9761 digest[3] = hex_to_uint (&digest_pos[24]);
9762
9763 char *salt_buf_ptr = (char *) salt->salt_buf;
9764
9765 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9766
9767 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9768
9769 salt->salt_len = salt_len;
9770
9771 return (PARSER_OK);
9772 }
9773
9774 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9775 {
9776 uint32_t *digest = (uint32_t *) hash_buf->digest;
9777
9778 salt_t *salt = hash_buf->salt;
9779
9780 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9781
9782 hccap_t in;
9783
9784 memcpy (&in, input_buf, input_len);
9785
9786 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9787
9788 memcpy (digest, in.keymic, 16);
9789
9790 /*
9791 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9792 The phrase "Pairwise key expansion"
9793 Access Point Address (Referred to as Authenticator Address AA)
9794 Supplicant Address (referred to as Supplicant Address SA)
9795 Access Point Nonce (referred to as Authenticator Anonce)
9796 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9797 */
9798
9799 uint salt_len = strlen (in.essid);
9800
9801 memcpy (salt->salt_buf, in.essid, salt_len);
9802
9803 salt->salt_len = salt_len;
9804
9805 salt->salt_iter = ROUNDS_WPA2 - 1;
9806
9807 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9808
9809 memcpy (pke_ptr, "Pairwise key expansion", 23);
9810
9811 if (memcmp (in.mac1, in.mac2, 6) < 0)
9812 {
9813 memcpy (pke_ptr + 23, in.mac1, 6);
9814 memcpy (pke_ptr + 29, in.mac2, 6);
9815 }
9816 else
9817 {
9818 memcpy (pke_ptr + 23, in.mac2, 6);
9819 memcpy (pke_ptr + 29, in.mac1, 6);
9820 }
9821
9822 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
9823 {
9824 memcpy (pke_ptr + 35, in.nonce1, 32);
9825 memcpy (pke_ptr + 67, in.nonce2, 32);
9826 }
9827 else
9828 {
9829 memcpy (pke_ptr + 35, in.nonce2, 32);
9830 memcpy (pke_ptr + 67, in.nonce1, 32);
9831 }
9832
9833 for (int i = 0; i < 25; i++)
9834 {
9835 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
9836 }
9837
9838 wpa->keyver = in.keyver;
9839
9840 if (wpa->keyver > 255)
9841 {
9842 log_info ("ATTENTION!");
9843 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
9844 log_info (" This could be due to a recent aircrack-ng bug.");
9845 log_info (" The key version was automatically reset to a reasonable value.");
9846 log_info ("");
9847
9848 wpa->keyver &= 0xff;
9849 }
9850
9851 wpa->eapol_size = in.eapol_size;
9852
9853 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
9854
9855 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
9856
9857 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
9858
9859 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
9860
9861 if (wpa->keyver == 1)
9862 {
9863 // nothing to do
9864 }
9865 else
9866 {
9867 digest[0] = byte_swap_32 (digest[0]);
9868 digest[1] = byte_swap_32 (digest[1]);
9869 digest[2] = byte_swap_32 (digest[2]);
9870 digest[3] = byte_swap_32 (digest[3]);
9871
9872 for (int i = 0; i < 64; i++)
9873 {
9874 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
9875 }
9876 }
9877
9878 salt->salt_buf[10] = digest[1];
9879 salt->salt_buf[11] = digest[2];
9880
9881 return (PARSER_OK);
9882 }
9883
9884 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9885 {
9886 uint32_t *digest = (uint32_t *) hash_buf->digest;
9887
9888 salt_t *salt = hash_buf->salt;
9889
9890 if (input_len == 0)
9891 {
9892 log_error ("Password Safe v2 container not specified");
9893
9894 exit (-1);
9895 }
9896
9897 FILE *fp = fopen (input_buf, "rb");
9898
9899 if (fp == NULL)
9900 {
9901 log_error ("%s: %s", input_buf, strerror (errno));
9902
9903 exit (-1);
9904 }
9905
9906 typedef struct
9907 {
9908 uint32_t random[2];
9909 uint32_t hash[5];
9910 uint32_t salt[5]; // unused, but makes better valid check
9911 uint32_t iv[2]; // unused, but makes better valid check
9912
9913 } psafe2_hdr;
9914
9915 psafe2_hdr buf;
9916
9917 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
9918
9919 fclose (fp);
9920
9921 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
9922
9923 salt->salt_buf[0] = buf.random[0];
9924 salt->salt_buf[1] = buf.random[1];
9925
9926 salt->salt_len = 8;
9927 salt->salt_iter = 1000;
9928
9929 digest[0] = byte_swap_32 (buf.hash[0]);
9930 digest[1] = byte_swap_32 (buf.hash[1]);
9931 digest[2] = byte_swap_32 (buf.hash[2]);
9932 digest[3] = byte_swap_32 (buf.hash[3]);
9933 digest[4] = byte_swap_32 (buf.hash[4]);
9934
9935 return (PARSER_OK);
9936 }
9937
9938 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9939 {
9940 uint32_t *digest = (uint32_t *) hash_buf->digest;
9941
9942 salt_t *salt = hash_buf->salt;
9943
9944 if (input_len == 0)
9945 {
9946 log_error (".psafe3 not specified");
9947
9948 exit (-1);
9949 }
9950
9951 FILE *fp = fopen (input_buf, "rb");
9952
9953 if (fp == NULL)
9954 {
9955 log_error ("%s: %s", input_buf, strerror (errno));
9956
9957 exit (-1);
9958 }
9959
9960 psafe3_t in;
9961
9962 int n = fread (&in, sizeof (psafe3_t), 1, fp);
9963
9964 fclose (fp);
9965
9966 data.hashfile = input_buf; // we will need this in case it gets cracked
9967
9968 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
9969
9970 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
9971
9972 salt->salt_iter = in.iterations + 1;
9973
9974 salt->salt_buf[0] = in.salt_buf[0];
9975 salt->salt_buf[1] = in.salt_buf[1];
9976 salt->salt_buf[2] = in.salt_buf[2];
9977 salt->salt_buf[3] = in.salt_buf[3];
9978 salt->salt_buf[4] = in.salt_buf[4];
9979 salt->salt_buf[5] = in.salt_buf[5];
9980 salt->salt_buf[6] = in.salt_buf[6];
9981 salt->salt_buf[7] = in.salt_buf[7];
9982
9983 salt->salt_len = 32;
9984
9985 digest[0] = in.hash_buf[0];
9986 digest[1] = in.hash_buf[1];
9987 digest[2] = in.hash_buf[2];
9988 digest[3] = in.hash_buf[3];
9989 digest[4] = in.hash_buf[4];
9990 digest[5] = in.hash_buf[5];
9991 digest[6] = in.hash_buf[6];
9992 digest[7] = in.hash_buf[7];
9993
9994 digest[0] = byte_swap_32 (digest[0]);
9995 digest[1] = byte_swap_32 (digest[1]);
9996 digest[2] = byte_swap_32 (digest[2]);
9997 digest[3] = byte_swap_32 (digest[3]);
9998 digest[4] = byte_swap_32 (digest[4]);
9999 digest[5] = byte_swap_32 (digest[5]);
10000 digest[6] = byte_swap_32 (digest[6]);
10001 digest[7] = byte_swap_32 (digest[7]);
10002
10003 return (PARSER_OK);
10004 }
10005
10006 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10007 {
10008 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10009
10010 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10011
10012 uint32_t *digest = (uint32_t *) hash_buf->digest;
10013
10014 salt_t *salt = hash_buf->salt;
10015
10016 char *iter_pos = input_buf + 3;
10017
10018 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10019
10020 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10021
10022 memcpy ((char *) salt->salt_sign, input_buf, 4);
10023
10024 salt->salt_iter = salt_iter;
10025
10026 char *salt_pos = iter_pos + 1;
10027
10028 uint salt_len = 8;
10029
10030 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10031
10032 salt->salt_len = salt_len;
10033
10034 char *hash_pos = salt_pos + salt_len;
10035
10036 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10037
10038 return (PARSER_OK);
10039 }
10040
10041 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10042 {
10043 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10044
10045 uint32_t *digest = (uint32_t *) hash_buf->digest;
10046
10047 salt_t *salt = hash_buf->salt;
10048
10049 char *salt_pos = input_buf + 3;
10050
10051 uint iterations_len = 0;
10052
10053 if (memcmp (salt_pos, "rounds=", 7) == 0)
10054 {
10055 salt_pos += 7;
10056
10057 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10058
10059 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10060 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10061
10062 salt_pos[0] = 0x0;
10063
10064 salt->salt_iter = atoi (salt_pos - iterations_len);
10065
10066 salt_pos += 1;
10067
10068 iterations_len += 8;
10069 }
10070 else
10071 {
10072 salt->salt_iter = ROUNDS_MD5CRYPT;
10073 }
10074
10075 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10076
10077 char *hash_pos = strchr (salt_pos, '$');
10078
10079 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10080
10081 uint salt_len = hash_pos - salt_pos;
10082
10083 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10084
10085 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10086
10087 salt->salt_len = salt_len;
10088
10089 hash_pos++;
10090
10091 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10092
10093 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10094
10095 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10096
10097 return (PARSER_OK);
10098 }
10099
10100 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10101 {
10102 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10103
10104 uint32_t *digest = (uint32_t *) hash_buf->digest;
10105
10106 salt_t *salt = hash_buf->salt;
10107
10108 char *salt_pos = input_buf + 6;
10109
10110 uint iterations_len = 0;
10111
10112 if (memcmp (salt_pos, "rounds=", 7) == 0)
10113 {
10114 salt_pos += 7;
10115
10116 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10117
10118 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10119 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10120
10121 salt_pos[0] = 0x0;
10122
10123 salt->salt_iter = atoi (salt_pos - iterations_len);
10124
10125 salt_pos += 1;
10126
10127 iterations_len += 8;
10128 }
10129 else
10130 {
10131 salt->salt_iter = ROUNDS_MD5CRYPT;
10132 }
10133
10134 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10135
10136 char *hash_pos = strchr (salt_pos, '$');
10137
10138 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10139
10140 uint salt_len = hash_pos - salt_pos;
10141
10142 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10143
10144 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10145
10146 salt->salt_len = salt_len;
10147
10148 hash_pos++;
10149
10150 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10151
10152 return (PARSER_OK);
10153 }
10154
10155 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10156 {
10157 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10158
10159 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10160
10161 uint32_t *digest = (uint32_t *) hash_buf->digest;
10162
10163 salt_t *salt = hash_buf->salt;
10164
10165 char *salt_pos = input_buf + 14;
10166
10167 char *hash_pos = strchr (salt_pos, '*');
10168
10169 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10170
10171 hash_pos++;
10172
10173 uint salt_len = hash_pos - salt_pos - 1;
10174
10175 char *salt_buf_ptr = (char *) salt->salt_buf;
10176
10177 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10178
10179 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10180
10181 salt->salt_len = salt_len;
10182
10183 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
10184
10185 base64_decode (base64_to_int, hash_pos, 27, tmp_buf);
10186
10187 memcpy (digest, tmp_buf, 20);
10188
10189 digest[0] = byte_swap_32 (digest[0]);
10190 digest[1] = byte_swap_32 (digest[1]);
10191 digest[2] = byte_swap_32 (digest[2]);
10192 digest[3] = byte_swap_32 (digest[3]);
10193 digest[4] = byte_swap_32 (digest[4]);
10194
10195 digest[0] -= SHA1M_A;
10196 digest[1] -= SHA1M_B;
10197 digest[2] -= SHA1M_C;
10198 digest[3] -= SHA1M_D;
10199 digest[4] -= SHA1M_E;
10200
10201 return (PARSER_OK);
10202 }
10203
10204 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10205 {
10206 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10207
10208 unsigned char c12 = itoa64_to_int (input_buf[12]);
10209
10210 if (c12 & 3) return (PARSER_HASH_VALUE);
10211
10212 uint32_t *digest = (uint32_t *) hash_buf->digest;
10213
10214 salt_t *salt = hash_buf->salt;
10215
10216 // for ascii_digest
10217 salt->salt_sign[0] = input_buf[0];
10218 salt->salt_sign[1] = input_buf[1];
10219
10220 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10221 | itoa64_to_int (input_buf[1]) << 6;
10222
10223 salt->salt_len = 2;
10224
10225 char tmp_buf[100];
10226
10227 memset (tmp_buf, 0, sizeof (tmp_buf));
10228
10229 base64_decode (itoa64_to_int, input_buf + 2, 11, tmp_buf);
10230
10231 memcpy (digest, tmp_buf, 8);
10232
10233 uint tt;
10234
10235 IP (digest[0], digest[1], tt);
10236
10237 digest[2] = 0;
10238 digest[3] = 0;
10239
10240 return (PARSER_OK);
10241 }
10242
10243 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10244 {
10245 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10246
10247 uint32_t *digest = (uint32_t *) hash_buf->digest;
10248
10249 digest[0] = hex_to_uint (&input_buf[ 0]);
10250 digest[1] = hex_to_uint (&input_buf[ 8]);
10251 digest[2] = hex_to_uint (&input_buf[16]);
10252 digest[3] = hex_to_uint (&input_buf[24]);
10253
10254 digest[0] = byte_swap_32 (digest[0]);
10255 digest[1] = byte_swap_32 (digest[1]);
10256 digest[2] = byte_swap_32 (digest[2]);
10257 digest[3] = byte_swap_32 (digest[3]);
10258
10259 digest[0] -= MD4M_A;
10260 digest[1] -= MD4M_B;
10261 digest[2] -= MD4M_C;
10262 digest[3] -= MD4M_D;
10263
10264 return (PARSER_OK);
10265 }
10266
10267 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10268 {
10269 if (data.opts_type & OPTS_TYPE_ST_HEX)
10270 {
10271 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10272 }
10273 else
10274 {
10275 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10276 }
10277
10278 uint32_t *digest = (uint32_t *) hash_buf->digest;
10279
10280 salt_t *salt = hash_buf->salt;
10281
10282 digest[0] = hex_to_uint (&input_buf[ 0]);
10283 digest[1] = hex_to_uint (&input_buf[ 8]);
10284 digest[2] = hex_to_uint (&input_buf[16]);
10285 digest[3] = hex_to_uint (&input_buf[24]);
10286
10287 digest[0] = byte_swap_32 (digest[0]);
10288 digest[1] = byte_swap_32 (digest[1]);
10289 digest[2] = byte_swap_32 (digest[2]);
10290 digest[3] = byte_swap_32 (digest[3]);
10291
10292 digest[0] -= MD4M_A;
10293 digest[1] -= MD4M_B;
10294 digest[2] -= MD4M_C;
10295 digest[3] -= MD4M_D;
10296
10297 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10298
10299 uint salt_len = input_len - 32 - 1;
10300
10301 char *salt_buf = input_buf + 32 + 1;
10302
10303 char *salt_buf_ptr = (char *) salt->salt_buf;
10304
10305 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10306
10307 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10308
10309 salt->salt_len = salt_len;
10310
10311 return (PARSER_OK);
10312 }
10313
10314 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10315 {
10316 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10317
10318 uint32_t *digest = (uint32_t *) hash_buf->digest;
10319
10320 digest[0] = hex_to_uint (&input_buf[ 0]);
10321 digest[1] = hex_to_uint (&input_buf[ 8]);
10322 digest[2] = hex_to_uint (&input_buf[16]);
10323 digest[3] = hex_to_uint (&input_buf[24]);
10324
10325 digest[0] = byte_swap_32 (digest[0]);
10326 digest[1] = byte_swap_32 (digest[1]);
10327 digest[2] = byte_swap_32 (digest[2]);
10328 digest[3] = byte_swap_32 (digest[3]);
10329
10330 digest[0] -= MD5M_A;
10331 digest[1] -= MD5M_B;
10332 digest[2] -= MD5M_C;
10333 digest[3] -= MD5M_D;
10334
10335 return (PARSER_OK);
10336 }
10337
10338 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10339 {
10340 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10341
10342 uint32_t *digest = (uint32_t *) hash_buf->digest;
10343
10344 digest[0] = hex_to_uint (&input_buf[0]);
10345 digest[1] = hex_to_uint (&input_buf[8]);
10346 digest[2] = 0;
10347 digest[3] = 0;
10348
10349 digest[0] = byte_swap_32 (digest[0]);
10350 digest[1] = byte_swap_32 (digest[1]);
10351
10352 return (PARSER_OK);
10353 }
10354
10355 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10356 {
10357 if (data.opts_type & OPTS_TYPE_ST_HEX)
10358 {
10359 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10360 }
10361 else
10362 {
10363 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10364 }
10365
10366 uint32_t *digest = (uint32_t *) hash_buf->digest;
10367
10368 salt_t *salt = hash_buf->salt;
10369
10370 digest[0] = hex_to_uint (&input_buf[ 0]);
10371 digest[1] = hex_to_uint (&input_buf[ 8]);
10372 digest[2] = hex_to_uint (&input_buf[16]);
10373 digest[3] = hex_to_uint (&input_buf[24]);
10374
10375 digest[0] = byte_swap_32 (digest[0]);
10376 digest[1] = byte_swap_32 (digest[1]);
10377 digest[2] = byte_swap_32 (digest[2]);
10378 digest[3] = byte_swap_32 (digest[3]);
10379
10380 digest[0] -= MD5M_A;
10381 digest[1] -= MD5M_B;
10382 digest[2] -= MD5M_C;
10383 digest[3] -= MD5M_D;
10384
10385 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10386
10387 uint salt_len = input_len - 32 - 1;
10388
10389 char *salt_buf = input_buf + 32 + 1;
10390
10391 char *salt_buf_ptr = (char *) salt->salt_buf;
10392
10393 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10394
10395 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10396
10397 salt->salt_len = salt_len;
10398
10399 return (PARSER_OK);
10400 }
10401
10402 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10403 {
10404 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10405
10406 uint32_t *digest = (uint32_t *) hash_buf->digest;
10407
10408 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10409 | itoa64_to_int (input_buf[ 1]) << 6
10410 | itoa64_to_int (input_buf[ 2]) << 12
10411 | itoa64_to_int (input_buf[ 3]) << 18;
10412 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10413 | itoa64_to_int (input_buf[ 5]) << 6
10414 | itoa64_to_int (input_buf[ 6]) << 12
10415 | itoa64_to_int (input_buf[ 7]) << 18;
10416 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10417 | itoa64_to_int (input_buf[ 9]) << 6
10418 | itoa64_to_int (input_buf[10]) << 12
10419 | itoa64_to_int (input_buf[11]) << 18;
10420 digest[3] = itoa64_to_int (input_buf[12]) << 0
10421 | itoa64_to_int (input_buf[13]) << 6
10422 | itoa64_to_int (input_buf[14]) << 12
10423 | itoa64_to_int (input_buf[15]) << 18;
10424
10425 digest[0] -= MD5M_A;
10426 digest[1] -= MD5M_B;
10427 digest[2] -= MD5M_C;
10428 digest[3] -= MD5M_D;
10429
10430 digest[0] &= 0x00ffffff;
10431 digest[1] &= 0x00ffffff;
10432 digest[2] &= 0x00ffffff;
10433 digest[3] &= 0x00ffffff;
10434
10435 return (PARSER_OK);
10436 }
10437
10438 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10439 {
10440 if (data.opts_type & OPTS_TYPE_ST_HEX)
10441 {
10442 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10443 }
10444 else
10445 {
10446 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10447 }
10448
10449 uint32_t *digest = (uint32_t *) hash_buf->digest;
10450
10451 salt_t *salt = hash_buf->salt;
10452
10453 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10454 | itoa64_to_int (input_buf[ 1]) << 6
10455 | itoa64_to_int (input_buf[ 2]) << 12
10456 | itoa64_to_int (input_buf[ 3]) << 18;
10457 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10458 | itoa64_to_int (input_buf[ 5]) << 6
10459 | itoa64_to_int (input_buf[ 6]) << 12
10460 | itoa64_to_int (input_buf[ 7]) << 18;
10461 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10462 | itoa64_to_int (input_buf[ 9]) << 6
10463 | itoa64_to_int (input_buf[10]) << 12
10464 | itoa64_to_int (input_buf[11]) << 18;
10465 digest[3] = itoa64_to_int (input_buf[12]) << 0
10466 | itoa64_to_int (input_buf[13]) << 6
10467 | itoa64_to_int (input_buf[14]) << 12
10468 | itoa64_to_int (input_buf[15]) << 18;
10469
10470 digest[0] -= MD5M_A;
10471 digest[1] -= MD5M_B;
10472 digest[2] -= MD5M_C;
10473 digest[3] -= MD5M_D;
10474
10475 digest[0] &= 0x00ffffff;
10476 digest[1] &= 0x00ffffff;
10477 digest[2] &= 0x00ffffff;
10478 digest[3] &= 0x00ffffff;
10479
10480 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10481
10482 uint salt_len = input_len - 16 - 1;
10483
10484 char *salt_buf = input_buf + 16 + 1;
10485
10486 char *salt_buf_ptr = (char *) salt->salt_buf;
10487
10488 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10489
10490 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10491
10492 salt->salt_len = salt_len;
10493
10494 return (PARSER_OK);
10495 }
10496
10497 void transform_netntlmv1_key (const uint8_t *nthash, uint8_t *key)
10498 {
10499 key[0] = (nthash[0] >> 0);
10500 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10501 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10502 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10503 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10504 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10505 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10506 key[7] = (nthash[6] << 1);
10507
10508 key[0] |= 0x01;
10509 key[1] |= 0x01;
10510 key[2] |= 0x01;
10511 key[3] |= 0x01;
10512 key[4] |= 0x01;
10513 key[5] |= 0x01;
10514 key[6] |= 0x01;
10515 key[7] |= 0x01;
10516 }
10517
10518 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10519 {
10520 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10521
10522 uint32_t *digest = (uint32_t *) hash_buf->digest;
10523
10524 salt_t *salt = hash_buf->salt;
10525
10526 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10527
10528 /**
10529 * parse line
10530 */
10531
10532 char *user_pos = input_buf;
10533
10534 char *unused_pos = strchr (user_pos, ':');
10535
10536 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10537
10538 uint user_len = unused_pos - user_pos;
10539
10540 if (user_len > 60) return (PARSER_SALT_LENGTH);
10541
10542 unused_pos++;
10543
10544 char *domain_pos = strchr (unused_pos, ':');
10545
10546 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10547
10548 uint unused_len = domain_pos - unused_pos;
10549
10550 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10551
10552 domain_pos++;
10553
10554 char *srvchall_pos = strchr (domain_pos, ':');
10555
10556 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10557
10558 uint domain_len = srvchall_pos - domain_pos;
10559
10560 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10561
10562 srvchall_pos++;
10563
10564 char *hash_pos = strchr (srvchall_pos, ':');
10565
10566 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10567
10568 uint srvchall_len = hash_pos - srvchall_pos;
10569
10570 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10571
10572 hash_pos++;
10573
10574 char *clichall_pos = strchr (hash_pos, ':');
10575
10576 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10577
10578 uint hash_len = clichall_pos - hash_pos;
10579
10580 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10581
10582 clichall_pos++;
10583
10584 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10585
10586 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10587
10588 /**
10589 * store some data for later use
10590 */
10591
10592 netntlm->user_len = user_len * 2;
10593 netntlm->domain_len = domain_len * 2;
10594 netntlm->srvchall_len = srvchall_len / 2;
10595 netntlm->clichall_len = clichall_len / 2;
10596
10597 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10598 char *chall_ptr = (char *) netntlm->chall_buf;
10599
10600 /**
10601 * handle username and domainname
10602 */
10603
10604 for (uint i = 0; i < user_len; i++)
10605 {
10606 *userdomain_ptr++ = user_pos[i];
10607 *userdomain_ptr++ = 0;
10608 }
10609
10610 for (uint i = 0; i < domain_len; i++)
10611 {
10612 *userdomain_ptr++ = domain_pos[i];
10613 *userdomain_ptr++ = 0;
10614 }
10615
10616 /**
10617 * handle server challenge encoding
10618 */
10619
10620 for (uint i = 0; i < srvchall_len; i += 2)
10621 {
10622 const char p0 = srvchall_pos[i + 0];
10623 const char p1 = srvchall_pos[i + 1];
10624
10625 *chall_ptr++ = hex_convert (p1) << 0
10626 | hex_convert (p0) << 4;
10627 }
10628
10629 /**
10630 * handle client challenge encoding
10631 */
10632
10633 for (uint i = 0; i < clichall_len; i += 2)
10634 {
10635 const char p0 = clichall_pos[i + 0];
10636 const char p1 = clichall_pos[i + 1];
10637
10638 *chall_ptr++ = hex_convert (p1) << 0
10639 | hex_convert (p0) << 4;
10640 }
10641
10642 /**
10643 * store data
10644 */
10645
10646 char *salt_buf_ptr = (char *) salt->salt_buf;
10647
10648 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10649
10650 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10651
10652 salt->salt_len = salt_len;
10653
10654 digest[0] = hex_to_uint (&hash_pos[ 0]);
10655 digest[1] = hex_to_uint (&hash_pos[ 8]);
10656 digest[2] = hex_to_uint (&hash_pos[16]);
10657 digest[3] = hex_to_uint (&hash_pos[24]);
10658
10659 digest[0] = byte_swap_32 (digest[0]);
10660 digest[1] = byte_swap_32 (digest[1]);
10661 digest[2] = byte_swap_32 (digest[2]);
10662 digest[3] = byte_swap_32 (digest[3]);
10663
10664 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10665
10666 uint digest_tmp[2];
10667
10668 digest_tmp[0] = hex_to_uint (&hash_pos[32]);
10669 digest_tmp[1] = hex_to_uint (&hash_pos[40]);
10670
10671 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10672 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10673
10674 /* special case 2: ESS */
10675
10676 if (srvchall_len == 48)
10677 {
10678 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10679 {
10680 uint w[16];
10681
10682 w[ 0] = netntlm->chall_buf[6];
10683 w[ 1] = netntlm->chall_buf[7];
10684 w[ 2] = netntlm->chall_buf[0];
10685 w[ 3] = netntlm->chall_buf[1];
10686 w[ 4] = 0x80;
10687 w[ 5] = 0;
10688 w[ 6] = 0;
10689 w[ 7] = 0;
10690 w[ 8] = 0;
10691 w[ 9] = 0;
10692 w[10] = 0;
10693 w[11] = 0;
10694 w[12] = 0;
10695 w[13] = 0;
10696 w[14] = 16 * 8;
10697 w[15] = 0;
10698
10699 uint dgst[4];
10700
10701 dgst[0] = MAGIC_A;
10702 dgst[1] = MAGIC_B;
10703 dgst[2] = MAGIC_C;
10704 dgst[3] = MAGIC_D;
10705
10706 md5_64 (w, dgst);
10707
10708 salt->salt_buf[0] = dgst[0];
10709 salt->salt_buf[1] = dgst[1];
10710 }
10711 }
10712
10713 /* precompute netntlmv1 exploit start */
10714
10715 for (uint i = 0; i < 0x10000; i++)
10716 {
10717 uint key_md4[2] = { i, 0 };
10718 uint key_des[2] = { 0, 0 };
10719
10720 transform_netntlmv1_key ((uint8_t *) key_md4, (uint8_t *) key_des);
10721
10722 uint Kc[16];
10723 uint Kd[16];
10724
10725 _des_keysetup (key_des, Kc, Kd, c_skb);
10726
10727 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10728
10729 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10730
10731 if (data3[0] != digest_tmp[0]) continue;
10732 if (data3[1] != digest_tmp[1]) continue;
10733
10734 salt->salt_buf[2] = i;
10735
10736 salt->salt_len = 24;
10737
10738 break;
10739 }
10740
10741 salt->salt_buf_pc[0] = digest_tmp[0];
10742 salt->salt_buf_pc[1] = digest_tmp[1];
10743
10744 /* precompute netntlmv1 exploit stop */
10745
10746 uint32_t tt;
10747
10748 IP (digest[0], digest[1], tt);
10749 IP (digest[2], digest[3], tt);
10750
10751 digest[0] = ROTATE_RIGHT (digest[0], 29);
10752 digest[1] = ROTATE_RIGHT (digest[1], 29);
10753 digest[2] = ROTATE_RIGHT (digest[2], 29);
10754 digest[3] = ROTATE_RIGHT (digest[3], 29);
10755
10756 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10757
10758 salt->salt_buf[0] = ROTATE_LEFT (salt->salt_buf[0], 3);
10759 salt->salt_buf[1] = ROTATE_LEFT (salt->salt_buf[1], 3);
10760
10761 return (PARSER_OK);
10762 }
10763
10764 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10765 {
10766 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10767
10768 uint32_t *digest = (uint32_t *) hash_buf->digest;
10769
10770 salt_t *salt = hash_buf->salt;
10771
10772 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10773
10774 /**
10775 * parse line
10776 */
10777
10778 char *user_pos = input_buf;
10779
10780 char *unused_pos = strchr (user_pos, ':');
10781
10782 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10783
10784 uint user_len = unused_pos - user_pos;
10785
10786 if (user_len > 60) return (PARSER_SALT_LENGTH);
10787
10788 unused_pos++;
10789
10790 char *domain_pos = strchr (unused_pos, ':');
10791
10792 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10793
10794 uint unused_len = domain_pos - unused_pos;
10795
10796 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10797
10798 domain_pos++;
10799
10800 char *srvchall_pos = strchr (domain_pos, ':');
10801
10802 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10803
10804 uint domain_len = srvchall_pos - domain_pos;
10805
10806 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10807
10808 srvchall_pos++;
10809
10810 char *hash_pos = strchr (srvchall_pos, ':');
10811
10812 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10813
10814 uint srvchall_len = hash_pos - srvchall_pos;
10815
10816 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10817
10818 hash_pos++;
10819
10820 char *clichall_pos = strchr (hash_pos, ':');
10821
10822 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10823
10824 uint hash_len = clichall_pos - hash_pos;
10825
10826 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10827
10828 clichall_pos++;
10829
10830 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10831
10832 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10833
10834 if (clichall_len % 2) return (PARSER_SALT_VALUE);
10835
10836 /**
10837 * store some data for later use
10838 */
10839
10840 netntlm->user_len = user_len * 2;
10841 netntlm->domain_len = domain_len * 2;
10842 netntlm->srvchall_len = srvchall_len / 2;
10843 netntlm->clichall_len = clichall_len / 2;
10844
10845 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10846 char *chall_ptr = (char *) netntlm->chall_buf;
10847
10848 /**
10849 * handle username and domainname
10850 */
10851
10852 for (uint i = 0; i < user_len; i++)
10853 {
10854 *userdomain_ptr++ = toupper (user_pos[i]);
10855 *userdomain_ptr++ = 0;
10856 }
10857
10858 for (uint i = 0; i < domain_len; i++)
10859 {
10860 *userdomain_ptr++ = domain_pos[i];
10861 *userdomain_ptr++ = 0;
10862 }
10863
10864 *userdomain_ptr++ = 0x80;
10865
10866 /**
10867 * handle server challenge encoding
10868 */
10869
10870 for (uint i = 0; i < srvchall_len; i += 2)
10871 {
10872 const char p0 = srvchall_pos[i + 0];
10873 const char p1 = srvchall_pos[i + 1];
10874
10875 *chall_ptr++ = hex_convert (p1) << 0
10876 | hex_convert (p0) << 4;
10877 }
10878
10879 /**
10880 * handle client challenge encoding
10881 */
10882
10883 for (uint i = 0; i < clichall_len; i += 2)
10884 {
10885 const char p0 = clichall_pos[i + 0];
10886 const char p1 = clichall_pos[i + 1];
10887
10888 *chall_ptr++ = hex_convert (p1) << 0
10889 | hex_convert (p0) << 4;
10890 }
10891
10892 *chall_ptr++ = 0x80;
10893
10894 /**
10895 * handle hash itself
10896 */
10897
10898 digest[0] = hex_to_uint (&hash_pos[ 0]);
10899 digest[1] = hex_to_uint (&hash_pos[ 8]);
10900 digest[2] = hex_to_uint (&hash_pos[16]);
10901 digest[3] = hex_to_uint (&hash_pos[24]);
10902
10903 digest[0] = byte_swap_32 (digest[0]);
10904 digest[1] = byte_swap_32 (digest[1]);
10905 digest[2] = byte_swap_32 (digest[2]);
10906 digest[3] = byte_swap_32 (digest[3]);
10907
10908 /**
10909 * reuse challange data as salt_buf, its the buffer that is most likely unique
10910 */
10911
10912 salt->salt_buf[0] = 0;
10913 salt->salt_buf[1] = 0;
10914 salt->salt_buf[2] = 0;
10915 salt->salt_buf[3] = 0;
10916 salt->salt_buf[4] = 0;
10917 salt->salt_buf[5] = 0;
10918 salt->salt_buf[6] = 0;
10919 salt->salt_buf[7] = 0;
10920
10921 uint *uptr;
10922
10923 uptr = (uint *) netntlm->userdomain_buf;
10924
10925 for (uint i = 0; i < 16; i += 16)
10926 {
10927 md5_64 (uptr, salt->salt_buf);
10928 }
10929
10930 uptr = (uint *) netntlm->chall_buf;
10931
10932 for (uint i = 0; i < 256; i += 16)
10933 {
10934 md5_64 (uptr, salt->salt_buf);
10935 }
10936
10937 salt->salt_len = 16;
10938
10939 return (PARSER_OK);
10940 }
10941
10942 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10943 {
10944 if (data.opts_type & OPTS_TYPE_ST_HEX)
10945 {
10946 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
10947 }
10948 else
10949 {
10950 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
10951 }
10952
10953 uint32_t *digest = (uint32_t *) hash_buf->digest;
10954
10955 salt_t *salt = hash_buf->salt;
10956
10957 digest[0] = hex_to_uint (&input_buf[ 0]);
10958 digest[1] = hex_to_uint (&input_buf[ 8]);
10959 digest[2] = hex_to_uint (&input_buf[16]);
10960 digest[3] = hex_to_uint (&input_buf[24]);
10961
10962 digest[0] = byte_swap_32 (digest[0]);
10963 digest[1] = byte_swap_32 (digest[1]);
10964 digest[2] = byte_swap_32 (digest[2]);
10965 digest[3] = byte_swap_32 (digest[3]);
10966
10967 digest[0] -= MD5M_A;
10968 digest[1] -= MD5M_B;
10969 digest[2] -= MD5M_C;
10970 digest[3] -= MD5M_D;
10971
10972 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10973
10974 uint salt_len = input_len - 32 - 1;
10975
10976 char *salt_buf = input_buf + 32 + 1;
10977
10978 char *salt_buf_ptr = (char *) salt->salt_buf;
10979
10980 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10981
10982 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10983
10984 salt->salt_len = salt_len;
10985
10986 return (PARSER_OK);
10987 }
10988
10989 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10990 {
10991 if (data.opts_type & OPTS_TYPE_ST_HEX)
10992 {
10993 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
10994 }
10995 else
10996 {
10997 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
10998 }
10999
11000 uint32_t *digest = (uint32_t *) hash_buf->digest;
11001
11002 salt_t *salt = hash_buf->salt;
11003
11004 digest[0] = hex_to_uint (&input_buf[ 0]);
11005 digest[1] = hex_to_uint (&input_buf[ 8]);
11006 digest[2] = hex_to_uint (&input_buf[16]);
11007 digest[3] = hex_to_uint (&input_buf[24]);
11008
11009 digest[0] = byte_swap_32 (digest[0]);
11010 digest[1] = byte_swap_32 (digest[1]);
11011 digest[2] = byte_swap_32 (digest[2]);
11012 digest[3] = byte_swap_32 (digest[3]);
11013
11014 digest[0] -= MD5M_A;
11015 digest[1] -= MD5M_B;
11016 digest[2] -= MD5M_C;
11017 digest[3] -= MD5M_D;
11018
11019 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11020
11021 uint salt_len = input_len - 32 - 1;
11022
11023 char *salt_buf = input_buf + 32 + 1;
11024
11025 char *salt_buf_ptr = (char *) salt->salt_buf;
11026
11027 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11028
11029 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11030
11031 salt->salt_len = salt_len;
11032
11033 return (PARSER_OK);
11034 }
11035
11036 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11037 {
11038 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11039
11040 uint32_t *digest = (uint32_t *) hash_buf->digest;
11041
11042 salt_t *salt = hash_buf->salt;
11043
11044 digest[0] = hex_to_uint (&input_buf[ 0]);
11045 digest[1] = hex_to_uint (&input_buf[ 8]);
11046 digest[2] = hex_to_uint (&input_buf[16]);
11047 digest[3] = hex_to_uint (&input_buf[24]);
11048
11049 digest[0] = byte_swap_32 (digest[0]);
11050 digest[1] = byte_swap_32 (digest[1]);
11051 digest[2] = byte_swap_32 (digest[2]);
11052 digest[3] = byte_swap_32 (digest[3]);
11053
11054 digest[0] -= MD5M_A;
11055 digest[1] -= MD5M_B;
11056 digest[2] -= MD5M_C;
11057 digest[3] -= MD5M_D;
11058
11059 /**
11060 * This is a virtual salt. While the algorithm is basically not salted
11061 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11062 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11063 */
11064
11065 char *salt_buf_ptr = (char *) salt->salt_buf;
11066
11067 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11068
11069 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11070
11071 salt->salt_len = salt_len;
11072
11073 return (PARSER_OK);
11074 }
11075
11076 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11077 {
11078 if (data.opts_type & OPTS_TYPE_ST_HEX)
11079 {
11080 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11081 }
11082 else
11083 {
11084 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11085 }
11086
11087 uint32_t *digest = (uint32_t *) hash_buf->digest;
11088
11089 salt_t *salt = hash_buf->salt;
11090
11091 digest[0] = hex_to_uint (&input_buf[ 0]);
11092 digest[1] = hex_to_uint (&input_buf[ 8]);
11093 digest[2] = hex_to_uint (&input_buf[16]);
11094 digest[3] = hex_to_uint (&input_buf[24]);
11095
11096 digest[0] = byte_swap_32 (digest[0]);
11097 digest[1] = byte_swap_32 (digest[1]);
11098 digest[2] = byte_swap_32 (digest[2]);
11099 digest[3] = byte_swap_32 (digest[3]);
11100
11101 digest[0] -= MD5M_A;
11102 digest[1] -= MD5M_B;
11103 digest[2] -= MD5M_C;
11104 digest[3] -= MD5M_D;
11105
11106 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11107
11108 uint salt_len = input_len - 32 - 1;
11109
11110 char *salt_buf = input_buf + 32 + 1;
11111
11112 char *salt_buf_ptr = (char *) salt->salt_buf;
11113
11114 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11115
11116 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11117
11118 salt->salt_len = salt_len;
11119
11120 return (PARSER_OK);
11121 }
11122
11123 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11124 {
11125 if (data.opts_type & OPTS_TYPE_ST_HEX)
11126 {
11127 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11128 }
11129 else
11130 {
11131 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11132 }
11133
11134 uint32_t *digest = (uint32_t *) hash_buf->digest;
11135
11136 salt_t *salt = hash_buf->salt;
11137
11138 digest[0] = hex_to_uint (&input_buf[ 0]);
11139 digest[1] = hex_to_uint (&input_buf[ 8]);
11140 digest[2] = hex_to_uint (&input_buf[16]);
11141 digest[3] = hex_to_uint (&input_buf[24]);
11142
11143 digest[0] = byte_swap_32 (digest[0]);
11144 digest[1] = byte_swap_32 (digest[1]);
11145 digest[2] = byte_swap_32 (digest[2]);
11146 digest[3] = byte_swap_32 (digest[3]);
11147
11148 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11149
11150 uint salt_len = input_len - 32 - 1;
11151
11152 char *salt_buf = input_buf + 32 + 1;
11153
11154 char *salt_buf_ptr = (char *) salt->salt_buf;
11155
11156 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11157
11158 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11159
11160 salt->salt_len = salt_len;
11161
11162 return (PARSER_OK);
11163 }
11164
11165 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11166 {
11167 if (data.opts_type & OPTS_TYPE_ST_HEX)
11168 {
11169 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11170 }
11171 else
11172 {
11173 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11174 }
11175
11176 uint32_t *digest = (uint32_t *) hash_buf->digest;
11177
11178 salt_t *salt = hash_buf->salt;
11179
11180 digest[0] = hex_to_uint (&input_buf[ 0]);
11181 digest[1] = hex_to_uint (&input_buf[ 8]);
11182 digest[2] = hex_to_uint (&input_buf[16]);
11183 digest[3] = hex_to_uint (&input_buf[24]);
11184
11185 digest[0] = byte_swap_32 (digest[0]);
11186 digest[1] = byte_swap_32 (digest[1]);
11187 digest[2] = byte_swap_32 (digest[2]);
11188 digest[3] = byte_swap_32 (digest[3]);
11189
11190 digest[0] -= MD4M_A;
11191 digest[1] -= MD4M_B;
11192 digest[2] -= MD4M_C;
11193 digest[3] -= MD4M_D;
11194
11195 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11196
11197 uint salt_len = input_len - 32 - 1;
11198
11199 char *salt_buf = input_buf + 32 + 1;
11200
11201 char *salt_buf_ptr = (char *) salt->salt_buf;
11202
11203 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11204
11205 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11206
11207 salt->salt_len = salt_len;
11208
11209 return (PARSER_OK);
11210 }
11211
11212 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11213 {
11214 if (data.opts_type & OPTS_TYPE_ST_HEX)
11215 {
11216 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11217 }
11218 else
11219 {
11220 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11221 }
11222
11223 uint32_t *digest = (uint32_t *) hash_buf->digest;
11224
11225 salt_t *salt = hash_buf->salt;
11226
11227 digest[0] = hex_to_uint (&input_buf[ 0]);
11228 digest[1] = hex_to_uint (&input_buf[ 8]);
11229 digest[2] = hex_to_uint (&input_buf[16]);
11230 digest[3] = hex_to_uint (&input_buf[24]);
11231
11232 digest[0] = byte_swap_32 (digest[0]);
11233 digest[1] = byte_swap_32 (digest[1]);
11234 digest[2] = byte_swap_32 (digest[2]);
11235 digest[3] = byte_swap_32 (digest[3]);
11236
11237 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11238
11239 uint salt_len = input_len - 32 - 1;
11240
11241 char *salt_buf = input_buf + 32 + 1;
11242
11243 uint salt_pc_block[16];
11244
11245 memset (salt_pc_block, 0, sizeof (salt_pc_block));
11246
11247 char *salt_pc_block_ptr = (char *) salt_pc_block;
11248
11249 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11250
11251 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11252
11253 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11254
11255 salt_pc_block[14] = salt_len * 8;
11256
11257 uint salt_pc_digest[4];
11258
11259 salt_pc_digest[0] = MAGIC_A;
11260 salt_pc_digest[1] = MAGIC_B;
11261 salt_pc_digest[2] = MAGIC_C;
11262 salt_pc_digest[3] = MAGIC_D;
11263
11264 md5_64 (salt_pc_block, salt_pc_digest);
11265
11266 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11267 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11268 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11269 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11270
11271 char *salt_buf_ptr = (char *) salt->salt_buf;
11272
11273 memcpy (salt_buf_ptr, salt_buf, salt_len);
11274
11275 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
11276
11277 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11278 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11279 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11280 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11281
11282 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11283
11284 return (PARSER_OK);
11285 }
11286
11287 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11288 {
11289 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11290
11291 uint32_t *digest = (uint32_t *) hash_buf->digest;
11292
11293 digest[0] = hex_to_uint (&input_buf[ 0]);
11294 digest[1] = hex_to_uint (&input_buf[ 8]);
11295 digest[2] = hex_to_uint (&input_buf[16]);
11296 digest[3] = hex_to_uint (&input_buf[24]);
11297 digest[4] = hex_to_uint (&input_buf[32]);
11298
11299 digest[0] -= SHA1M_A;
11300 digest[1] -= SHA1M_B;
11301 digest[2] -= SHA1M_C;
11302 digest[3] -= SHA1M_D;
11303 digest[4] -= SHA1M_E;
11304
11305 return (PARSER_OK);
11306 }
11307
11308 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11309 {
11310 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11311
11312 uint32_t *digest = (uint32_t *) hash_buf->digest;
11313
11314 digest[0] = hex_to_uint (&input_buf[ 0]);
11315 digest[1] = hex_to_uint (&input_buf[ 8]);
11316 digest[2] = hex_to_uint (&input_buf[16]);
11317 digest[3] = hex_to_uint (&input_buf[24]);
11318 digest[4] = hex_to_uint (&input_buf[32]);
11319
11320 return (PARSER_OK);
11321 }
11322
11323 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11324 {
11325 if (data.opts_type & OPTS_TYPE_ST_HEX)
11326 {
11327 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11328 }
11329 else
11330 {
11331 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11332 }
11333
11334 uint32_t *digest = (uint32_t *) hash_buf->digest;
11335
11336 salt_t *salt = hash_buf->salt;
11337
11338 digest[0] = hex_to_uint (&input_buf[ 0]);
11339 digest[1] = hex_to_uint (&input_buf[ 8]);
11340 digest[2] = hex_to_uint (&input_buf[16]);
11341 digest[3] = hex_to_uint (&input_buf[24]);
11342 digest[4] = hex_to_uint (&input_buf[32]);
11343
11344 digest[0] -= SHA1M_A;
11345 digest[1] -= SHA1M_B;
11346 digest[2] -= SHA1M_C;
11347 digest[3] -= SHA1M_D;
11348 digest[4] -= SHA1M_E;
11349
11350 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11351
11352 uint salt_len = input_len - 40 - 1;
11353
11354 char *salt_buf = input_buf + 40 + 1;
11355
11356 char *salt_buf_ptr = (char *) salt->salt_buf;
11357
11358 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11359
11360 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11361
11362 salt->salt_len = salt_len;
11363
11364 return (PARSER_OK);
11365 }
11366
11367 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11368 {
11369 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11370
11371 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11372
11373 uint32_t *digest = (uint32_t *) hash_buf->digest;
11374
11375 char tmp_buf[100];
11376
11377 memset (tmp_buf, 0, sizeof (tmp_buf));
11378
11379 base64_decode (base64_to_int, input_buf + 5, input_len - 5, tmp_buf);
11380
11381 memcpy (digest, tmp_buf, 20);
11382
11383 digest[0] = byte_swap_32 (digest[0]);
11384 digest[1] = byte_swap_32 (digest[1]);
11385 digest[2] = byte_swap_32 (digest[2]);
11386 digest[3] = byte_swap_32 (digest[3]);
11387 digest[4] = byte_swap_32 (digest[4]);
11388
11389 digest[0] -= SHA1M_A;
11390 digest[1] -= SHA1M_B;
11391 digest[2] -= SHA1M_C;
11392 digest[3] -= SHA1M_D;
11393 digest[4] -= SHA1M_E;
11394
11395 return (PARSER_OK);
11396 }
11397
11398 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11399 {
11400 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11401
11402 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11403
11404 uint32_t *digest = (uint32_t *) hash_buf->digest;
11405
11406 salt_t *salt = hash_buf->salt;
11407
11408 char tmp_buf[100];
11409
11410 memset (tmp_buf, 0, sizeof (tmp_buf));
11411
11412 int tmp_len = base64_decode (base64_to_int, input_buf + 6, input_len - 6, tmp_buf);
11413
11414 memcpy (digest, tmp_buf, 20);
11415
11416 salt->salt_len = tmp_len - 20;
11417
11418 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11419
11420 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11421 {
11422 char *ptr = (char *) salt->salt_buf;
11423
11424 ptr[salt->salt_len] = 0x80;
11425 }
11426
11427 digest[0] = byte_swap_32 (digest[0]);
11428 digest[1] = byte_swap_32 (digest[1]);
11429 digest[2] = byte_swap_32 (digest[2]);
11430 digest[3] = byte_swap_32 (digest[3]);
11431 digest[4] = byte_swap_32 (digest[4]);
11432
11433 digest[0] -= SHA1M_A;
11434 digest[1] -= SHA1M_B;
11435 digest[2] -= SHA1M_C;
11436 digest[3] -= SHA1M_D;
11437 digest[4] -= SHA1M_E;
11438
11439 return (PARSER_OK);
11440 }
11441
11442 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11443 {
11444 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11445
11446 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11447
11448 uint32_t *digest = (uint32_t *) hash_buf->digest;
11449
11450 salt_t *salt = hash_buf->salt;
11451
11452 char *salt_buf = input_buf + 6;
11453
11454 uint salt_len = 8;
11455
11456 char *salt_buf_ptr = (char *) salt->salt_buf;
11457
11458 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11459
11460 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11461
11462 salt->salt_len = salt_len;
11463
11464 char *hash_pos = input_buf + 6 + 8 + 40;
11465
11466 digest[0] = hex_to_uint (&hash_pos[ 0]);
11467 digest[1] = hex_to_uint (&hash_pos[ 8]);
11468 digest[2] = hex_to_uint (&hash_pos[16]);
11469 digest[3] = hex_to_uint (&hash_pos[24]);
11470 digest[4] = hex_to_uint (&hash_pos[32]);
11471
11472 digest[0] -= SHA1M_A;
11473 digest[1] -= SHA1M_B;
11474 digest[2] -= SHA1M_C;
11475 digest[3] -= SHA1M_D;
11476 digest[4] -= SHA1M_E;
11477
11478 return (PARSER_OK);
11479 }
11480
11481 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11482 {
11483 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11484
11485 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11486
11487 uint32_t *digest = (uint32_t *) hash_buf->digest;
11488
11489 salt_t *salt = hash_buf->salt;
11490
11491 char *salt_buf = input_buf + 6;
11492
11493 uint salt_len = 8;
11494
11495 char *salt_buf_ptr = (char *) salt->salt_buf;
11496
11497 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11498
11499 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11500
11501 salt->salt_len = salt_len;
11502
11503 char *hash_pos = input_buf + 6 + 8;
11504
11505 digest[0] = hex_to_uint (&hash_pos[ 0]);
11506 digest[1] = hex_to_uint (&hash_pos[ 8]);
11507 digest[2] = hex_to_uint (&hash_pos[16]);
11508 digest[3] = hex_to_uint (&hash_pos[24]);
11509 digest[4] = hex_to_uint (&hash_pos[32]);
11510
11511 digest[0] -= SHA1M_A;
11512 digest[1] -= SHA1M_B;
11513 digest[2] -= SHA1M_C;
11514 digest[3] -= SHA1M_D;
11515 digest[4] -= SHA1M_E;
11516
11517 return (PARSER_OK);
11518 }
11519
11520 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11521 {
11522 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11523
11524 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11525
11526 uint64_t *digest = (uint64_t *) hash_buf->digest;
11527
11528 salt_t *salt = hash_buf->salt;
11529
11530 char *salt_buf = input_buf + 6;
11531
11532 uint salt_len = 8;
11533
11534 char *salt_buf_ptr = (char *) salt->salt_buf;
11535
11536 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11537
11538 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11539
11540 salt->salt_len = salt_len;
11541
11542 char *hash_pos = input_buf + 6 + 8;
11543
11544 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
11545 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
11546 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
11547 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
11548 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
11549 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
11550 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
11551 digest[7] = hex_to_uint64_t (&hash_pos[112]);
11552
11553 digest[0] -= SHA512M_A;
11554 digest[1] -= SHA512M_B;
11555 digest[2] -= SHA512M_C;
11556 digest[3] -= SHA512M_D;
11557 digest[4] -= SHA512M_E;
11558 digest[5] -= SHA512M_F;
11559 digest[6] -= SHA512M_G;
11560 digest[7] -= SHA512M_H;
11561
11562 return (PARSER_OK);
11563 }
11564
11565 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11566 {
11567 if (data.opts_type & OPTS_TYPE_ST_HEX)
11568 {
11569 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11570 }
11571 else
11572 {
11573 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11574 }
11575
11576 uint32_t *digest = (uint32_t *) hash_buf->digest;
11577
11578 salt_t *salt = hash_buf->salt;
11579
11580 digest[0] = hex_to_uint (&input_buf[ 0]);
11581 digest[1] = hex_to_uint (&input_buf[ 8]);
11582 digest[2] = 0;
11583 digest[3] = 0;
11584
11585 digest[0] = byte_swap_32 (digest[0]);
11586 digest[1] = byte_swap_32 (digest[1]);
11587
11588 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11589
11590 uint salt_len = input_len - 16 - 1;
11591
11592 char *salt_buf = input_buf + 16 + 1;
11593
11594 char *salt_buf_ptr = (char *) salt->salt_buf;
11595
11596 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11597
11598 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11599
11600 salt->salt_len = salt_len;
11601
11602 return (PARSER_OK);
11603 }
11604
11605 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11606 {
11607 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11608
11609 uint32_t *digest = (uint32_t *) hash_buf->digest;
11610
11611 salt_t *salt = hash_buf->salt;
11612
11613 digest[0] = hex_to_uint (&input_buf[ 0]);
11614 digest[1] = hex_to_uint (&input_buf[ 8]);
11615 digest[2] = hex_to_uint (&input_buf[16]);
11616 digest[3] = hex_to_uint (&input_buf[24]);
11617 digest[4] = hex_to_uint (&input_buf[32]);
11618
11619 digest[0] -= SHA1M_A;
11620 digest[1] -= SHA1M_B;
11621 digest[2] -= SHA1M_C;
11622 digest[3] -= SHA1M_D;
11623 digest[4] -= SHA1M_E;
11624
11625 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11626
11627 uint salt_len = input_len - 40 - 1;
11628
11629 char *salt_buf = input_buf + 40 + 1;
11630
11631 char *salt_buf_ptr = (char *) salt->salt_buf;
11632
11633 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11634
11635 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11636
11637 salt->salt_len = salt_len;
11638
11639 return (PARSER_OK);
11640 }
11641
11642 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11643 {
11644 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11645
11646 uint32_t *digest = (uint32_t *) hash_buf->digest;
11647
11648 salt_t *salt = hash_buf->salt;
11649
11650 char *hash_pos = input_buf;
11651
11652 digest[ 0] = hex_to_uint (&hash_pos[ 0]);
11653 digest[ 1] = hex_to_uint (&hash_pos[ 8]);
11654 digest[ 2] = hex_to_uint (&hash_pos[ 16]);
11655 digest[ 3] = hex_to_uint (&hash_pos[ 24]);
11656 digest[ 4] = hex_to_uint (&hash_pos[ 32]);
11657 digest[ 5] = hex_to_uint (&hash_pos[ 40]);
11658 digest[ 6] = hex_to_uint (&hash_pos[ 48]);
11659 digest[ 7] = hex_to_uint (&hash_pos[ 56]);
11660 digest[ 8] = hex_to_uint (&hash_pos[ 64]);
11661 digest[ 9] = hex_to_uint (&hash_pos[ 72]);
11662 digest[10] = hex_to_uint (&hash_pos[ 80]);
11663 digest[11] = hex_to_uint (&hash_pos[ 88]);
11664 digest[12] = hex_to_uint (&hash_pos[ 96]);
11665 digest[13] = hex_to_uint (&hash_pos[104]);
11666 digest[14] = hex_to_uint (&hash_pos[112]);
11667 digest[15] = hex_to_uint (&hash_pos[120]);
11668
11669 char *salt_pos = input_buf + 128;
11670
11671 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
11672 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
11673 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]);
11674 salt->salt_buf[3] = hex_to_uint (&salt_pos[24]);
11675
11676 salt->salt_iter = ROUNDS_ORACLET - 1;
11677 salt->salt_len = 16;
11678
11679 return (PARSER_OK);
11680 }
11681
11682 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11683 {
11684 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11685
11686 uint32_t *digest = (uint32_t *) hash_buf->digest;
11687
11688 digest[0] = hex_to_uint (&input_buf[ 0]);
11689 digest[1] = hex_to_uint (&input_buf[ 8]);
11690 digest[2] = hex_to_uint (&input_buf[16]);
11691 digest[3] = hex_to_uint (&input_buf[24]);
11692 digest[4] = hex_to_uint (&input_buf[32]);
11693 digest[5] = hex_to_uint (&input_buf[40]);
11694 digest[6] = hex_to_uint (&input_buf[48]);
11695 digest[7] = hex_to_uint (&input_buf[56]);
11696
11697 digest[0] -= SHA256M_A;
11698 digest[1] -= SHA256M_B;
11699 digest[2] -= SHA256M_C;
11700 digest[3] -= SHA256M_D;
11701 digest[4] -= SHA256M_E;
11702 digest[5] -= SHA256M_F;
11703 digest[6] -= SHA256M_G;
11704 digest[7] -= SHA256M_H;
11705
11706 return (PARSER_OK);
11707 }
11708
11709 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11710 {
11711 if (data.opts_type & OPTS_TYPE_ST_HEX)
11712 {
11713 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11714 }
11715 else
11716 {
11717 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11718 }
11719
11720 uint32_t *digest = (uint32_t *) hash_buf->digest;
11721
11722 salt_t *salt = hash_buf->salt;
11723
11724 digest[0] = hex_to_uint (&input_buf[ 0]);
11725 digest[1] = hex_to_uint (&input_buf[ 8]);
11726 digest[2] = hex_to_uint (&input_buf[16]);
11727 digest[3] = hex_to_uint (&input_buf[24]);
11728 digest[4] = hex_to_uint (&input_buf[32]);
11729 digest[5] = hex_to_uint (&input_buf[40]);
11730 digest[6] = hex_to_uint (&input_buf[48]);
11731 digest[7] = hex_to_uint (&input_buf[56]);
11732
11733 digest[0] -= SHA256M_A;
11734 digest[1] -= SHA256M_B;
11735 digest[2] -= SHA256M_C;
11736 digest[3] -= SHA256M_D;
11737 digest[4] -= SHA256M_E;
11738 digest[5] -= SHA256M_F;
11739 digest[6] -= SHA256M_G;
11740 digest[7] -= SHA256M_H;
11741
11742 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11743
11744 uint salt_len = input_len - 64 - 1;
11745
11746 char *salt_buf = input_buf + 64 + 1;
11747
11748 char *salt_buf_ptr = (char *) salt->salt_buf;
11749
11750 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11751
11752 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11753
11754 salt->salt_len = salt_len;
11755
11756 return (PARSER_OK);
11757 }
11758
11759 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11760 {
11761 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11762
11763 uint64_t *digest = (uint64_t *) hash_buf->digest;
11764
11765 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11766 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11767 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11768 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11769 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11770 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11771 digest[6] = 0;
11772 digest[7] = 0;
11773
11774 digest[0] -= SHA384M_A;
11775 digest[1] -= SHA384M_B;
11776 digest[2] -= SHA384M_C;
11777 digest[3] -= SHA384M_D;
11778 digest[4] -= SHA384M_E;
11779 digest[5] -= SHA384M_F;
11780 digest[6] -= 0;
11781 digest[7] -= 0;
11782
11783 return (PARSER_OK);
11784 }
11785
11786 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11787 {
11788 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11789
11790 uint64_t *digest = (uint64_t *) hash_buf->digest;
11791
11792 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11793 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11794 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11795 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11796 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11797 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11798 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
11799 digest[7] = hex_to_uint64_t (&input_buf[112]);
11800
11801 digest[0] -= SHA512M_A;
11802 digest[1] -= SHA512M_B;
11803 digest[2] -= SHA512M_C;
11804 digest[3] -= SHA512M_D;
11805 digest[4] -= SHA512M_E;
11806 digest[5] -= SHA512M_F;
11807 digest[6] -= SHA512M_G;
11808 digest[7] -= SHA512M_H;
11809
11810 return (PARSER_OK);
11811 }
11812
11813 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11814 {
11815 if (data.opts_type & OPTS_TYPE_ST_HEX)
11816 {
11817 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11818 }
11819 else
11820 {
11821 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11822 }
11823
11824 uint64_t *digest = (uint64_t *) hash_buf->digest;
11825
11826 salt_t *salt = hash_buf->salt;
11827
11828 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11829 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11830 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11831 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11832 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11833 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11834 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
11835 digest[7] = hex_to_uint64_t (&input_buf[112]);
11836
11837 digest[0] -= SHA512M_A;
11838 digest[1] -= SHA512M_B;
11839 digest[2] -= SHA512M_C;
11840 digest[3] -= SHA512M_D;
11841 digest[4] -= SHA512M_E;
11842 digest[5] -= SHA512M_F;
11843 digest[6] -= SHA512M_G;
11844 digest[7] -= SHA512M_H;
11845
11846 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11847
11848 uint salt_len = input_len - 128 - 1;
11849
11850 char *salt_buf = input_buf + 128 + 1;
11851
11852 char *salt_buf_ptr = (char *) salt->salt_buf;
11853
11854 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11855
11856 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11857
11858 salt->salt_len = salt_len;
11859
11860 return (PARSER_OK);
11861 }
11862
11863 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11864 {
11865 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
11866
11867 uint64_t *digest = (uint64_t *) hash_buf->digest;
11868
11869 salt_t *salt = hash_buf->salt;
11870
11871 char *salt_pos = input_buf + 3;
11872
11873 uint iterations_len = 0;
11874
11875 if (memcmp (salt_pos, "rounds=", 7) == 0)
11876 {
11877 salt_pos += 7;
11878
11879 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
11880
11881 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
11882 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
11883
11884 salt_pos[0] = 0x0;
11885
11886 salt->salt_iter = atoi (salt_pos - iterations_len);
11887
11888 salt_pos += 1;
11889
11890 iterations_len += 8;
11891 }
11892 else
11893 {
11894 salt->salt_iter = ROUNDS_SHA512CRYPT;
11895 }
11896
11897 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
11898
11899 char *hash_pos = strchr (salt_pos, '$');
11900
11901 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11902
11903 uint salt_len = hash_pos - salt_pos;
11904
11905 if (salt_len > 16) return (PARSER_SALT_LENGTH);
11906
11907 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
11908
11909 salt->salt_len = salt_len;
11910
11911 hash_pos++;
11912
11913 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
11914
11915 return (PARSER_OK);
11916 }
11917
11918 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11919 {
11920 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
11921
11922 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
11923
11924 uint64_t *digest = (uint64_t *) hash_buf->digest;
11925
11926 salt_t *salt = hash_buf->salt;
11927
11928 uint keccak_mdlen = input_len / 2;
11929
11930 for (uint i = 0; i < keccak_mdlen / 8; i++)
11931 {
11932 digest[i] = hex_to_uint64_t (&input_buf[i * 16]);
11933
11934 digest[i] = byte_swap_64 (digest[i]);
11935 }
11936
11937 salt->keccak_mdlen = keccak_mdlen;
11938
11939 return (PARSER_OK);
11940 }
11941
11942 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11943 {
11944 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
11945
11946 uint32_t *digest = (uint32_t *) hash_buf->digest;
11947
11948 salt_t *salt = hash_buf->salt;
11949
11950 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
11951
11952 /**
11953 * Parse that strange long line
11954 */
11955
11956 char *in_off[9];
11957
11958 size_t in_len[9];
11959
11960 in_off[0] = strtok (input_buf, ":");
11961
11962 in_len[0] = strlen (in_off[0]);
11963
11964 size_t i;
11965
11966 for (i = 1; i < 9; i++)
11967 {
11968 in_off[i] = strtok (NULL, ":");
11969
11970 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11971
11972 in_len[i] = strlen (in_off[i]);
11973 }
11974
11975 char *ptr;
11976
11977 ptr = (char *) ikepsk->msg_buf;
11978
11979 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i);
11980 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i);
11981 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i);
11982 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i);
11983 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i);
11984 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i);
11985
11986 *ptr = 0x80;
11987
11988 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
11989
11990 ptr = (char *) ikepsk->nr_buf;
11991
11992 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i);
11993 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i);
11994
11995 *ptr = 0x80;
11996
11997 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
11998
11999 /**
12000 * Store to database
12001 */
12002
12003 ptr = in_off[8];
12004
12005 digest[0] = hex_to_uint (&ptr[ 0]);
12006 digest[1] = hex_to_uint (&ptr[ 8]);
12007 digest[2] = hex_to_uint (&ptr[16]);
12008 digest[3] = hex_to_uint (&ptr[24]);
12009
12010 digest[0] = byte_swap_32 (digest[0]);
12011 digest[1] = byte_swap_32 (digest[1]);
12012 digest[2] = byte_swap_32 (digest[2]);
12013 digest[3] = byte_swap_32 (digest[3]);
12014
12015 salt->salt_len = 32;
12016
12017 salt->salt_buf[0] = ikepsk->nr_buf[0];
12018 salt->salt_buf[1] = ikepsk->nr_buf[1];
12019 salt->salt_buf[2] = ikepsk->nr_buf[2];
12020 salt->salt_buf[3] = ikepsk->nr_buf[3];
12021 salt->salt_buf[4] = ikepsk->nr_buf[4];
12022 salt->salt_buf[5] = ikepsk->nr_buf[5];
12023 salt->salt_buf[6] = ikepsk->nr_buf[6];
12024 salt->salt_buf[7] = ikepsk->nr_buf[7];
12025
12026 return (PARSER_OK);
12027 }
12028
12029 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12030 {
12031 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12032
12033 uint32_t *digest = (uint32_t *) hash_buf->digest;
12034
12035 salt_t *salt = hash_buf->salt;
12036
12037 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12038
12039 /**
12040 * Parse that strange long line
12041 */
12042
12043 char *in_off[9];
12044
12045 size_t in_len[9];
12046
12047 in_off[0] = strtok (input_buf, ":");
12048
12049 in_len[0] = strlen (in_off[0]);
12050
12051 size_t i;
12052
12053 for (i = 1; i < 9; i++)
12054 {
12055 in_off[i] = strtok (NULL, ":");
12056
12057 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12058
12059 in_len[i] = strlen (in_off[i]);
12060 }
12061
12062 char *ptr;
12063
12064 ptr = (char *) ikepsk->msg_buf;
12065
12066 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i);
12067 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i);
12068 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i);
12069 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i);
12070 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i);
12071 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i);
12072
12073 *ptr = 0x80;
12074
12075 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12076
12077 ptr = (char *) ikepsk->nr_buf;
12078
12079 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i);
12080 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i);
12081
12082 *ptr = 0x80;
12083
12084 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12085
12086 /**
12087 * Store to database
12088 */
12089
12090 ptr = in_off[8];
12091
12092 digest[0] = hex_to_uint (&ptr[ 0]);
12093 digest[1] = hex_to_uint (&ptr[ 8]);
12094 digest[2] = hex_to_uint (&ptr[16]);
12095 digest[3] = hex_to_uint (&ptr[24]);
12096 digest[4] = hex_to_uint (&ptr[32]);
12097
12098 salt->salt_len = 32;
12099
12100 salt->salt_buf[0] = ikepsk->nr_buf[0];
12101 salt->salt_buf[1] = ikepsk->nr_buf[1];
12102 salt->salt_buf[2] = ikepsk->nr_buf[2];
12103 salt->salt_buf[3] = ikepsk->nr_buf[3];
12104 salt->salt_buf[4] = ikepsk->nr_buf[4];
12105 salt->salt_buf[5] = ikepsk->nr_buf[5];
12106 salt->salt_buf[6] = ikepsk->nr_buf[6];
12107 salt->salt_buf[7] = ikepsk->nr_buf[7];
12108
12109 return (PARSER_OK);
12110 }
12111
12112 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12113 {
12114 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12115
12116 uint32_t *digest = (uint32_t *) hash_buf->digest;
12117
12118 digest[0] = hex_to_uint (&input_buf[ 0]);
12119 digest[1] = hex_to_uint (&input_buf[ 8]);
12120 digest[2] = hex_to_uint (&input_buf[16]);
12121 digest[3] = hex_to_uint (&input_buf[24]);
12122 digest[4] = hex_to_uint (&input_buf[32]);
12123
12124 digest[0] = byte_swap_32 (digest[0]);
12125 digest[1] = byte_swap_32 (digest[1]);
12126 digest[2] = byte_swap_32 (digest[2]);
12127 digest[3] = byte_swap_32 (digest[3]);
12128 digest[4] = byte_swap_32 (digest[4]);
12129
12130 return (PARSER_OK);
12131 }
12132
12133 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12134 {
12135 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12136
12137 uint32_t *digest = (uint32_t *) hash_buf->digest;
12138
12139 digest[ 0] = hex_to_uint (&input_buf[ 0]);
12140 digest[ 1] = hex_to_uint (&input_buf[ 8]);
12141 digest[ 2] = hex_to_uint (&input_buf[ 16]);
12142 digest[ 3] = hex_to_uint (&input_buf[ 24]);
12143 digest[ 4] = hex_to_uint (&input_buf[ 32]);
12144 digest[ 5] = hex_to_uint (&input_buf[ 40]);
12145 digest[ 6] = hex_to_uint (&input_buf[ 48]);
12146 digest[ 7] = hex_to_uint (&input_buf[ 56]);
12147 digest[ 8] = hex_to_uint (&input_buf[ 64]);
12148 digest[ 9] = hex_to_uint (&input_buf[ 72]);
12149 digest[10] = hex_to_uint (&input_buf[ 80]);
12150 digest[11] = hex_to_uint (&input_buf[ 88]);
12151 digest[12] = hex_to_uint (&input_buf[ 96]);
12152 digest[13] = hex_to_uint (&input_buf[104]);
12153 digest[14] = hex_to_uint (&input_buf[112]);
12154 digest[15] = hex_to_uint (&input_buf[120]);
12155
12156 return (PARSER_OK);
12157 }
12158
12159 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12160 {
12161 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12162
12163 uint32_t *digest = (uint32_t *) hash_buf->digest;
12164
12165 salt_t *salt = hash_buf->salt;
12166
12167 digest[0] = hex_to_uint (&input_buf[ 0]);
12168 digest[1] = hex_to_uint (&input_buf[ 8]);
12169 digest[2] = hex_to_uint (&input_buf[16]);
12170 digest[3] = hex_to_uint (&input_buf[24]);
12171 digest[4] = hex_to_uint (&input_buf[32]);
12172
12173 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12174
12175 uint salt_len = input_len - 40 - 1;
12176
12177 char *salt_buf = input_buf + 40 + 1;
12178
12179 char *salt_buf_ptr = (char *) salt->salt_buf;
12180
12181 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12182
12183 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12184
12185 salt->salt_len = salt_len;
12186
12187 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12188
12189 return (PARSER_OK);
12190 }
12191
12192 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12193 {
12194 uint32_t *digest = (uint32_t *) hash_buf->digest;
12195
12196 salt_t *salt = hash_buf->salt;
12197
12198 tc_t *tc = (tc_t *) hash_buf->esalt;
12199
12200 if (input_len == 0)
12201 {
12202 log_error ("TrueCrypt container not specified");
12203
12204 exit (-1);
12205 }
12206
12207 FILE *fp = fopen (input_buf, "rb");
12208
12209 if (fp == NULL)
12210 {
12211 log_error ("%s: %s", input_buf, strerror (errno));
12212
12213 exit (-1);
12214 }
12215
12216 char buf[512];
12217
12218 int n = fread (buf, 1, sizeof (buf), fp);
12219
12220 fclose (fp);
12221
12222 if (n != 512) return (PARSER_TC_FILE_SIZE);
12223
12224 memcpy (tc->salt_buf, buf, 64);
12225
12226 memcpy (tc->data_buf, buf + 64, 512 - 64);
12227
12228 salt->salt_buf[0] = tc->salt_buf[0];
12229
12230 salt->salt_len = 4;
12231
12232 salt->salt_iter = 1000 - 1;
12233
12234 digest[0] = tc->data_buf[0];
12235
12236 return (PARSER_OK);
12237 }
12238
12239 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12240 {
12241 uint32_t *digest = (uint32_t *) hash_buf->digest;
12242
12243 salt_t *salt = hash_buf->salt;
12244
12245 tc_t *tc = (tc_t *) hash_buf->esalt;
12246
12247 if (input_len == 0)
12248 {
12249 log_error ("TrueCrypt container not specified");
12250
12251 exit (-1);
12252 }
12253
12254 FILE *fp = fopen (input_buf, "rb");
12255
12256 if (fp == NULL)
12257 {
12258 log_error ("%s: %s", input_buf, strerror (errno));
12259
12260 exit (-1);
12261 }
12262
12263 char buf[512];
12264
12265 int n = fread (buf, 1, sizeof (buf), fp);
12266
12267 fclose (fp);
12268
12269 if (n != 512) return (PARSER_TC_FILE_SIZE);
12270
12271 memcpy (tc->salt_buf, buf, 64);
12272
12273 memcpy (tc->data_buf, buf + 64, 512 - 64);
12274
12275 salt->salt_buf[0] = tc->salt_buf[0];
12276
12277 salt->salt_len = 4;
12278
12279 salt->salt_iter = 2000 - 1;
12280
12281 digest[0] = tc->data_buf[0];
12282
12283 return (PARSER_OK);
12284 }
12285
12286 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12287 {
12288 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12289
12290 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12291
12292 uint32_t *digest = (uint32_t *) hash_buf->digest;
12293
12294 salt_t *salt = hash_buf->salt;
12295
12296 char *salt_pos = input_buf + 6;
12297
12298 char *hash_pos = strchr (salt_pos, '$');
12299
12300 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12301
12302 uint salt_len = hash_pos - salt_pos;
12303
12304 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12305
12306 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12307
12308 salt->salt_len = salt_len;
12309
12310 salt->salt_iter = 1000;
12311
12312 hash_pos++;
12313
12314 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12315
12316 return (PARSER_OK);
12317 }
12318
12319 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12320 {
12321 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12322
12323 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12324
12325 uint32_t *digest = (uint32_t *) hash_buf->digest;
12326
12327 salt_t *salt = hash_buf->salt;
12328
12329 char *iter_pos = input_buf + 7;
12330
12331 char *salt_pos = strchr (iter_pos, '$');
12332
12333 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12334
12335 salt_pos++;
12336
12337 char *hash_pos = strchr (salt_pos, '$');
12338
12339 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12340
12341 uint salt_len = hash_pos - salt_pos;
12342
12343 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12344
12345 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12346
12347 salt->salt_len = salt_len;
12348
12349 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12350
12351 salt->salt_sign[0] = atoi (salt_iter);
12352
12353 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12354
12355 hash_pos++;
12356
12357 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12358
12359 digest[0] = byte_swap_32 (digest[0]);
12360 digest[1] = byte_swap_32 (digest[1]);
12361 digest[2] = byte_swap_32 (digest[2]);
12362 digest[3] = byte_swap_32 (digest[3]);
12363 digest[4] = byte_swap_32 (digest[4]);
12364
12365 return (PARSER_OK);
12366 }
12367
12368 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12369 {
12370 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12371
12372 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12373
12374 uint32_t *digest = (uint32_t *) hash_buf->digest;
12375
12376 salt_t *salt = hash_buf->salt;
12377
12378 char *iter_pos = input_buf + 9;
12379
12380 char *salt_pos = strchr (iter_pos, '$');
12381
12382 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12383
12384 salt_pos++;
12385
12386 char *hash_pos = strchr (salt_pos, '$');
12387
12388 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12389
12390 uint salt_len = hash_pos - salt_pos;
12391
12392 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12393
12394 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12395
12396 salt->salt_len = salt_len;
12397
12398 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12399
12400 salt->salt_sign[0] = atoi (salt_iter);
12401
12402 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12403
12404 hash_pos++;
12405
12406 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12407
12408 digest[0] = byte_swap_32 (digest[0]);
12409 digest[1] = byte_swap_32 (digest[1]);
12410 digest[2] = byte_swap_32 (digest[2]);
12411 digest[3] = byte_swap_32 (digest[3]);
12412 digest[4] = byte_swap_32 (digest[4]);
12413 digest[5] = byte_swap_32 (digest[5]);
12414 digest[6] = byte_swap_32 (digest[6]);
12415 digest[7] = byte_swap_32 (digest[7]);
12416
12417 return (PARSER_OK);
12418 }
12419
12420 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12421 {
12422 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12423
12424 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12425
12426 uint64_t *digest = (uint64_t *) hash_buf->digest;
12427
12428 salt_t *salt = hash_buf->salt;
12429
12430 char *iter_pos = input_buf + 9;
12431
12432 char *salt_pos = strchr (iter_pos, '$');
12433
12434 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12435
12436 salt_pos++;
12437
12438 char *hash_pos = strchr (salt_pos, '$');
12439
12440 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12441
12442 uint salt_len = hash_pos - salt_pos;
12443
12444 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12445
12446 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12447
12448 salt->salt_len = salt_len;
12449
12450 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12451
12452 salt->salt_sign[0] = atoi (salt_iter);
12453
12454 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12455
12456 hash_pos++;
12457
12458 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12459
12460 digest[0] = byte_swap_64 (digest[0]);
12461 digest[1] = byte_swap_64 (digest[1]);
12462 digest[2] = byte_swap_64 (digest[2]);
12463 digest[3] = byte_swap_64 (digest[3]);
12464 digest[4] = byte_swap_64 (digest[4]);
12465 digest[5] = byte_swap_64 (digest[5]);
12466 digest[6] = byte_swap_64 (digest[6]);
12467 digest[7] = byte_swap_64 (digest[7]);
12468
12469 return (PARSER_OK);
12470 }
12471
12472 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12473 {
12474 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12475
12476 uint32_t *digest = (uint32_t *) hash_buf->digest;
12477
12478 salt_t *salt = hash_buf->salt;
12479
12480 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12481
12482 /**
12483 * parse line
12484 */
12485
12486 char *iterations_pos = input_buf;
12487
12488 char *saltbuf_pos = strchr (iterations_pos, ':');
12489
12490 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12491
12492 uint iterations_len = saltbuf_pos - iterations_pos;
12493
12494 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12495
12496 saltbuf_pos++;
12497
12498 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12499
12500 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12501
12502 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12503
12504 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12505
12506 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12507
12508 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12509
12510 cipherbuf_pos++;
12511
12512 /**
12513 * pbkdf2 iterations
12514 */
12515
12516 salt->salt_iter = atoi (iterations_pos) - 1;
12517
12518 /**
12519 * handle salt encoding
12520 */
12521
12522 char *saltbuf_ptr = (char *) salt->salt_buf;
12523
12524 for (uint i = 0; i < saltbuf_len; i += 2)
12525 {
12526 const char p0 = saltbuf_pos[i + 0];
12527 const char p1 = saltbuf_pos[i + 1];
12528
12529 *saltbuf_ptr++ = hex_convert (p1) << 0
12530 | hex_convert (p0) << 4;
12531 }
12532
12533 salt->salt_len = saltbuf_len / 2;
12534
12535 /**
12536 * handle cipher encoding
12537 */
12538
12539 uint *tmp = (uint *) mymalloc (32);
12540
12541 char *cipherbuf_ptr = (char *) tmp;
12542
12543 for (uint i = 2016; i < cipherbuf_len; i += 2)
12544 {
12545 const char p0 = cipherbuf_pos[i + 0];
12546 const char p1 = cipherbuf_pos[i + 1];
12547
12548 *cipherbuf_ptr++ = hex_convert (p1) << 0
12549 | hex_convert (p0) << 4;
12550 }
12551
12552 // iv is stored at salt_buf 4 (length 16)
12553 // data is stored at salt_buf 8 (length 16)
12554
12555 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12556 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12557 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12558 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12559
12560 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12561 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12562 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12563 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12564
12565 free (tmp);
12566
12567 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12568 {
12569 const char p0 = cipherbuf_pos[j + 0];
12570 const char p1 = cipherbuf_pos[j + 1];
12571
12572 agilekey->cipher[i] = hex_convert (p1) << 0
12573 | hex_convert (p0) << 4;
12574 }
12575
12576 /**
12577 * digest buf
12578 */
12579
12580 digest[0] = 0x10101010;
12581 digest[1] = 0x10101010;
12582 digest[2] = 0x10101010;
12583 digest[3] = 0x10101010;
12584
12585 return (PARSER_OK);
12586 }
12587
12588 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12589 {
12590 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12591
12592 uint32_t *digest = (uint32_t *) hash_buf->digest;
12593
12594 salt_t *salt = hash_buf->salt;
12595
12596 char *hashbuf_pos = input_buf;
12597
12598 char *iterations_pos = strchr (hashbuf_pos, ':');
12599
12600 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12601
12602 uint hash_len = iterations_pos - hashbuf_pos;
12603
12604 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12605
12606 iterations_pos++;
12607
12608 char *saltbuf_pos = strchr (iterations_pos, ':');
12609
12610 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12611
12612 uint iterations_len = saltbuf_pos - iterations_pos;
12613
12614 saltbuf_pos++;
12615
12616 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12617
12618 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12619
12620 char *salt_buf_ptr = (char *) salt->salt_buf;
12621
12622 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12623
12624 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12625
12626 salt->salt_len = salt_len;
12627
12628 salt->salt_iter = atoi (iterations_pos) - 1;
12629
12630 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
12631 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
12632 digest[2] = hex_to_uint (&hashbuf_pos[16]);
12633 digest[3] = hex_to_uint (&hashbuf_pos[24]);
12634
12635 return (PARSER_OK);
12636 }
12637
12638 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12639 {
12640 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12641
12642 uint32_t *digest = (uint32_t *) hash_buf->digest;
12643
12644 digest[0] = hex_to_uint (&input_buf[ 0]);
12645 digest[1] = hex_to_uint (&input_buf[ 8]);
12646 digest[2] = hex_to_uint (&input_buf[16]);
12647 digest[3] = hex_to_uint (&input_buf[24]);
12648 digest[4] = hex_to_uint (&input_buf[32]);
12649 digest[5] = hex_to_uint (&input_buf[40]);
12650 digest[6] = hex_to_uint (&input_buf[48]);
12651 digest[7] = hex_to_uint (&input_buf[56]);
12652
12653 digest[0] = byte_swap_32 (digest[0]);
12654 digest[1] = byte_swap_32 (digest[1]);
12655 digest[2] = byte_swap_32 (digest[2]);
12656 digest[3] = byte_swap_32 (digest[3]);
12657 digest[4] = byte_swap_32 (digest[4]);
12658 digest[5] = byte_swap_32 (digest[5]);
12659 digest[6] = byte_swap_32 (digest[6]);
12660 digest[7] = byte_swap_32 (digest[7]);
12661
12662 return (PARSER_OK);
12663 }
12664
12665 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12666 {
12667 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12668
12669 uint32_t *digest = (uint32_t *) hash_buf->digest;
12670
12671 salt_t *salt = hash_buf->salt;
12672
12673 char *salt_pos = input_buf + 3;
12674
12675 uint iterations_len = 0;
12676
12677 if (memcmp (salt_pos, "rounds=", 7) == 0)
12678 {
12679 salt_pos += 7;
12680
12681 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12682
12683 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12684 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12685
12686 salt_pos[0] = 0x0;
12687
12688 salt->salt_iter = atoi (salt_pos - iterations_len);
12689
12690 salt_pos += 1;
12691
12692 iterations_len += 8;
12693 }
12694 else
12695 {
12696 salt->salt_iter = ROUNDS_SHA256CRYPT;
12697 }
12698
12699 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12700
12701 char *hash_pos = strchr (salt_pos, '$');
12702
12703 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12704
12705 uint salt_len = hash_pos - salt_pos;
12706
12707 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12708
12709 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12710
12711 salt->salt_len = salt_len;
12712
12713 hash_pos++;
12714
12715 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12716
12717 return (PARSER_OK);
12718 }
12719
12720 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12721 {
12722 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12723
12724 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12725
12726 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12727
12728 uint64_t *digest = (uint64_t *) hash_buf->digest;
12729
12730 salt_t *salt = hash_buf->salt;
12731
12732 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12733
12734 char *iter_pos = input_buf + 4;
12735
12736 char *salt_pos = strchr (iter_pos, '$');
12737
12738 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12739
12740 salt_pos++;
12741
12742 char *hash_pos = strchr (salt_pos, '$');
12743
12744 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12745
12746 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12747
12748 hash_pos++;
12749
12750 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
12751 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
12752 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
12753 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
12754 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
12755 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
12756 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
12757 digest[7] = hex_to_uint64_t (&hash_pos[112]);
12758
12759 uint salt_len = hash_pos - salt_pos - 1;
12760
12761 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12762
12763 salt->salt_len = salt_len / 2;
12764
12765 pbkdf2_sha512->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
12766 pbkdf2_sha512->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
12767 pbkdf2_sha512->salt_buf[2] = hex_to_uint (&salt_pos[16]);
12768 pbkdf2_sha512->salt_buf[3] = hex_to_uint (&salt_pos[24]);
12769 pbkdf2_sha512->salt_buf[4] = hex_to_uint (&salt_pos[32]);
12770 pbkdf2_sha512->salt_buf[5] = hex_to_uint (&salt_pos[40]);
12771 pbkdf2_sha512->salt_buf[6] = hex_to_uint (&salt_pos[48]);
12772 pbkdf2_sha512->salt_buf[7] = hex_to_uint (&salt_pos[56]);
12773
12774 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12775 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12776 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12777 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12778 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12779 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12780 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12781 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12782 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12783 pbkdf2_sha512->salt_buf[9] = 0x80;
12784
12785 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12786
12787 salt->salt_iter = atoi (iter_pos) - 1;
12788
12789 return (PARSER_OK);
12790 }
12791
12792 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12793 {
12794 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12795
12796 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12797
12798 uint32_t *digest = (uint32_t *) hash_buf->digest;
12799
12800 salt_t *salt = hash_buf->salt;
12801
12802 char *salt_pos = input_buf + 14;
12803
12804 char *hash_pos = strchr (salt_pos, '*');
12805
12806 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12807
12808 hash_pos++;
12809
12810 uint salt_len = hash_pos - salt_pos - 1;
12811
12812 char *salt_buf_ptr = (char *) salt->salt_buf;
12813
12814 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12815
12816 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12817
12818 salt->salt_len = salt_len;
12819
12820 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
12821
12822 base64_decode (base64_to_int, hash_pos, 43, tmp_buf);
12823
12824 memcpy (digest, tmp_buf, 32);
12825
12826 digest[0] = byte_swap_32 (digest[0]);
12827 digest[1] = byte_swap_32 (digest[1]);
12828 digest[2] = byte_swap_32 (digest[2]);
12829 digest[3] = byte_swap_32 (digest[3]);
12830 digest[4] = byte_swap_32 (digest[4]);
12831 digest[5] = byte_swap_32 (digest[5]);
12832 digest[6] = byte_swap_32 (digest[6]);
12833 digest[7] = byte_swap_32 (digest[7]);
12834
12835 digest[0] -= SHA256M_A;
12836 digest[1] -= SHA256M_B;
12837 digest[2] -= SHA256M_C;
12838 digest[3] -= SHA256M_D;
12839 digest[4] -= SHA256M_E;
12840 digest[5] -= SHA256M_F;
12841 digest[6] -= SHA256M_G;
12842 digest[7] -= SHA256M_H;
12843
12844 return (PARSER_OK);
12845 }
12846
12847 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12848 {
12849 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
12850
12851 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12852
12853 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
12854
12855 uint64_t *digest = (uint64_t *) hash_buf->digest;
12856
12857 salt_t *salt = hash_buf->salt;
12858
12859 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12860
12861 char *iter_pos = input_buf + 19;
12862
12863 char *salt_pos = strchr (iter_pos, '.');
12864
12865 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12866
12867 salt_pos++;
12868
12869 char *hash_pos = strchr (salt_pos, '.');
12870
12871 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12872
12873 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12874
12875 hash_pos++;
12876
12877 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
12878 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
12879 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
12880 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
12881 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
12882 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
12883 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
12884 digest[7] = hex_to_uint64_t (&hash_pos[112]);
12885
12886 uint salt_len = hash_pos - salt_pos - 1;
12887
12888 salt_len /= 2;
12889
12890 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
12891
12892 uint i;
12893
12894 for (i = 0; i < salt_len; i++)
12895 {
12896 salt_buf_ptr[i] = hex_to_char (&salt_pos[i * 2]);
12897 }
12898
12899 salt_buf_ptr[salt_len + 3] = 0x01;
12900 salt_buf_ptr[salt_len + 4] = 0x80;
12901
12902 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12903
12904 salt->salt_len = salt_len;
12905
12906 salt->salt_iter = atoi (iter_pos) - 1;
12907
12908 return (PARSER_OK);
12909 }
12910
12911 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12912 {
12913 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
12914
12915 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12916
12917 uint64_t *digest = (uint64_t *) hash_buf->digest;
12918
12919 salt_t *salt = hash_buf->salt;
12920
12921 char tmp_buf[120];
12922
12923 memset (tmp_buf, 0, sizeof (tmp_buf));
12924
12925 int tmp_len = base64_decode (base64_to_int, input_buf + 9, input_len - 9, tmp_buf);
12926
12927 memcpy (digest, tmp_buf, 64);
12928
12929 digest[0] = byte_swap_64 (digest[0]);
12930 digest[1] = byte_swap_64 (digest[1]);
12931 digest[2] = byte_swap_64 (digest[2]);
12932 digest[3] = byte_swap_64 (digest[3]);
12933 digest[4] = byte_swap_64 (digest[4]);
12934 digest[5] = byte_swap_64 (digest[5]);
12935 digest[6] = byte_swap_64 (digest[6]);
12936 digest[7] = byte_swap_64 (digest[7]);
12937
12938 digest[0] -= SHA512M_A;
12939 digest[1] -= SHA512M_B;
12940 digest[2] -= SHA512M_C;
12941 digest[3] -= SHA512M_D;
12942 digest[4] -= SHA512M_E;
12943 digest[5] -= SHA512M_F;
12944 digest[6] -= SHA512M_G;
12945 digest[7] -= SHA512M_H;
12946
12947 salt->salt_len = tmp_len - 64;
12948
12949 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
12950
12951 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12952 {
12953 char *ptr = (char *) salt->salt_buf;
12954
12955 ptr[salt->salt_len] = 0x80;
12956 }
12957
12958 return (PARSER_OK);
12959 }
12960
12961 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12962 {
12963 if (data.opts_type & OPTS_TYPE_ST_HEX)
12964 {
12965 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
12966 }
12967 else
12968 {
12969 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
12970 }
12971
12972 uint32_t *digest = (uint32_t *) hash_buf->digest;
12973
12974 salt_t *salt = hash_buf->salt;
12975
12976 digest[0] = hex_to_uint (&input_buf[ 0]);
12977 digest[1] = hex_to_uint (&input_buf[ 8]);
12978 digest[2] = hex_to_uint (&input_buf[16]);
12979 digest[3] = hex_to_uint (&input_buf[24]);
12980
12981 digest[0] = byte_swap_32 (digest[0]);
12982 digest[1] = byte_swap_32 (digest[1]);
12983 digest[2] = byte_swap_32 (digest[2]);
12984 digest[3] = byte_swap_32 (digest[3]);
12985
12986 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12987
12988 uint salt_len = input_len - 32 - 1;
12989
12990 char *salt_buf = input_buf + 32 + 1;
12991
12992 char *salt_buf_ptr = (char *) salt->salt_buf;
12993
12994 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12995
12996 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12997
12998 salt->salt_len = salt_len;
12999
13000 return (PARSER_OK);
13001 }
13002
13003 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13004 {
13005 if (data.opts_type & OPTS_TYPE_ST_HEX)
13006 {
13007 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13008 }
13009 else
13010 {
13011 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13012 }
13013
13014 uint32_t *digest = (uint32_t *) hash_buf->digest;
13015
13016 salt_t *salt = hash_buf->salt;
13017
13018 digest[0] = hex_to_uint (&input_buf[ 0]);
13019 digest[1] = hex_to_uint (&input_buf[ 8]);
13020 digest[2] = hex_to_uint (&input_buf[16]);
13021 digest[3] = hex_to_uint (&input_buf[24]);
13022 digest[4] = hex_to_uint (&input_buf[32]);
13023
13024 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13025
13026 uint salt_len = input_len - 40 - 1;
13027
13028 char *salt_buf = input_buf + 40 + 1;
13029
13030 char *salt_buf_ptr = (char *) salt->salt_buf;
13031
13032 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13033
13034 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13035
13036 salt->salt_len = salt_len;
13037
13038 return (PARSER_OK);
13039 }
13040
13041 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13042 {
13043 if (data.opts_type & OPTS_TYPE_ST_HEX)
13044 {
13045 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13046 }
13047 else
13048 {
13049 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13050 }
13051
13052 uint32_t *digest = (uint32_t *) hash_buf->digest;
13053
13054 salt_t *salt = hash_buf->salt;
13055
13056 digest[0] = hex_to_uint (&input_buf[ 0]);
13057 digest[1] = hex_to_uint (&input_buf[ 8]);
13058 digest[2] = hex_to_uint (&input_buf[16]);
13059 digest[3] = hex_to_uint (&input_buf[24]);
13060 digest[4] = hex_to_uint (&input_buf[32]);
13061 digest[5] = hex_to_uint (&input_buf[40]);
13062 digest[6] = hex_to_uint (&input_buf[48]);
13063 digest[7] = hex_to_uint (&input_buf[56]);
13064
13065 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13066
13067 uint salt_len = input_len - 64 - 1;
13068
13069 char *salt_buf = input_buf + 64 + 1;
13070
13071 char *salt_buf_ptr = (char *) salt->salt_buf;
13072
13073 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13074
13075 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13076
13077 salt->salt_len = salt_len;
13078
13079 return (PARSER_OK);
13080 }
13081
13082 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13083 {
13084 if (data.opts_type & OPTS_TYPE_ST_HEX)
13085 {
13086 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13087 }
13088 else
13089 {
13090 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13091 }
13092
13093 uint64_t *digest = (uint64_t *) hash_buf->digest;
13094
13095 salt_t *salt = hash_buf->salt;
13096
13097 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
13098 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
13099 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
13100 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
13101 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
13102 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
13103 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
13104 digest[7] = hex_to_uint64_t (&input_buf[112]);
13105
13106 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13107
13108 uint salt_len = input_len - 128 - 1;
13109
13110 char *salt_buf = input_buf + 128 + 1;
13111
13112 char *salt_buf_ptr = (char *) salt->salt_buf;
13113
13114 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13115
13116 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13117
13118 salt->salt_len = salt_len;
13119
13120 return (PARSER_OK);
13121 }
13122
13123 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13124 {
13125 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13126
13127 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13128
13129 uint32_t *digest = (uint32_t *) hash_buf->digest;
13130
13131 salt_t *salt = hash_buf->salt;
13132
13133 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13134
13135 /**
13136 * parse line
13137 */
13138
13139 char *user_pos = input_buf + 10 + 1;
13140
13141 char *realm_pos = strchr (user_pos, '$');
13142
13143 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13144
13145 uint user_len = realm_pos - user_pos;
13146
13147 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13148
13149 realm_pos++;
13150
13151 char *salt_pos = strchr (realm_pos, '$');
13152
13153 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13154
13155 uint realm_len = salt_pos - realm_pos;
13156
13157 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13158
13159 salt_pos++;
13160
13161 char *data_pos = strchr (salt_pos, '$');
13162
13163 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13164
13165 uint salt_len = data_pos - salt_pos;
13166
13167 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13168
13169 data_pos++;
13170
13171 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13172
13173 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13174
13175 /**
13176 * copy data
13177 */
13178
13179 memcpy (krb5pa->user, user_pos, user_len);
13180 memcpy (krb5pa->realm, realm_pos, realm_len);
13181 memcpy (krb5pa->salt, salt_pos, salt_len);
13182
13183 char *timestamp_ptr = (char *) krb5pa->timestamp;
13184
13185 for (uint i = 0; i < (36 * 2); i += 2)
13186 {
13187 const char p0 = data_pos[i + 0];
13188 const char p1 = data_pos[i + 1];
13189
13190 *timestamp_ptr++ = hex_convert (p1) << 0
13191 | hex_convert (p0) << 4;
13192 }
13193
13194 char *checksum_ptr = (char *) krb5pa->checksum;
13195
13196 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13197 {
13198 const char p0 = data_pos[i + 0];
13199 const char p1 = data_pos[i + 1];
13200
13201 *checksum_ptr++ = hex_convert (p1) << 0
13202 | hex_convert (p0) << 4;
13203 }
13204
13205 /**
13206 * copy some data to generic buffers to make sorting happy
13207 */
13208
13209 salt->salt_buf[0] = krb5pa->timestamp[0];
13210 salt->salt_buf[1] = krb5pa->timestamp[1];
13211 salt->salt_buf[2] = krb5pa->timestamp[2];
13212 salt->salt_buf[3] = krb5pa->timestamp[3];
13213 salt->salt_buf[4] = krb5pa->timestamp[4];
13214 salt->salt_buf[5] = krb5pa->timestamp[5];
13215 salt->salt_buf[6] = krb5pa->timestamp[6];
13216 salt->salt_buf[7] = krb5pa->timestamp[7];
13217 salt->salt_buf[8] = krb5pa->timestamp[8];
13218
13219 salt->salt_len = 36;
13220
13221 digest[0] = krb5pa->checksum[0];
13222 digest[1] = krb5pa->checksum[1];
13223 digest[2] = krb5pa->checksum[2];
13224 digest[3] = krb5pa->checksum[3];
13225
13226 return (PARSER_OK);
13227 }
13228
13229 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13230 {
13231 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13232
13233 uint32_t *digest = (uint32_t *) hash_buf->digest;
13234
13235 salt_t *salt = hash_buf->salt;
13236
13237 /**
13238 * parse line
13239 */
13240
13241 char *salt_pos = input_buf;
13242
13243 char *hash_pos = strchr (salt_pos, '$');
13244
13245 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13246
13247 uint salt_len = hash_pos - salt_pos;
13248
13249 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13250
13251 hash_pos++;
13252
13253 uint hash_len = input_len - 1 - salt_len;
13254
13255 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13256
13257 /**
13258 * valid some data
13259 */
13260
13261 uint user_len = 0;
13262
13263 for (uint i = 0; i < salt_len; i++)
13264 {
13265 if (salt_pos[i] == ' ') continue;
13266
13267 user_len++;
13268 }
13269
13270 // SAP user names cannot be longer than 12 characters
13271 if (user_len > 12) return (PARSER_SALT_LENGTH);
13272
13273 // SAP user name cannot start with ! or ?
13274 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13275
13276 /**
13277 * copy data
13278 */
13279
13280 char *salt_buf_ptr = (char *) salt->salt_buf;
13281
13282 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13283
13284 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13285
13286 salt->salt_len = salt_len;
13287
13288 digest[0] = hex_to_uint (&hash_pos[0]);
13289 digest[1] = hex_to_uint (&hash_pos[8]);
13290 digest[2] = 0;
13291 digest[3] = 0;
13292
13293 digest[0] = byte_swap_32 (digest[0]);
13294 digest[1] = byte_swap_32 (digest[1]);
13295
13296 return (PARSER_OK);
13297 }
13298
13299 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13300 {
13301 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13302
13303 uint32_t *digest = (uint32_t *) hash_buf->digest;
13304
13305 salt_t *salt = hash_buf->salt;
13306
13307 /**
13308 * parse line
13309 */
13310
13311 char *salt_pos = input_buf;
13312
13313 char *hash_pos = strchr (salt_pos, '$');
13314
13315 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13316
13317 uint salt_len = hash_pos - salt_pos;
13318
13319 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13320
13321 hash_pos++;
13322
13323 uint hash_len = input_len - 1 - salt_len;
13324
13325 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13326
13327 /**
13328 * valid some data
13329 */
13330
13331 uint user_len = 0;
13332
13333 for (uint i = 0; i < salt_len; i++)
13334 {
13335 if (salt_pos[i] == ' ') continue;
13336
13337 user_len++;
13338 }
13339
13340 // SAP user names cannot be longer than 12 characters
13341 if (user_len > 12) return (PARSER_SALT_LENGTH);
13342
13343 // SAP user name cannot start with ! or ?
13344 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13345
13346 /**
13347 * copy data
13348 */
13349
13350 char *salt_buf_ptr = (char *) salt->salt_buf;
13351
13352 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13353
13354 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13355
13356 salt->salt_len = salt_len;
13357
13358 digest[0] = hex_to_uint (&hash_pos[ 0]);
13359 digest[1] = hex_to_uint (&hash_pos[ 8]);
13360 digest[2] = hex_to_uint (&hash_pos[16]);
13361 digest[3] = hex_to_uint (&hash_pos[24]);
13362 digest[4] = hex_to_uint (&hash_pos[32]);
13363
13364 return (PARSER_OK);
13365 }
13366
13367 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13368 {
13369 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13370
13371 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13372
13373 uint64_t *digest = (uint64_t *) hash_buf->digest;
13374
13375 salt_t *salt = hash_buf->salt;
13376
13377 char *iter_pos = input_buf + 3;
13378
13379 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13380
13381 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13382
13383 memcpy ((char *) salt->salt_sign, input_buf, 4);
13384
13385 salt->salt_iter = salt_iter;
13386
13387 char *salt_pos = iter_pos + 1;
13388
13389 uint salt_len = 8;
13390
13391 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13392
13393 salt->salt_len = salt_len;
13394
13395 char *hash_pos = salt_pos + salt_len;
13396
13397 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13398
13399 // ugly hack start
13400
13401 char *tmp = (char *) salt->salt_buf_pc;
13402
13403 tmp[0] = hash_pos[42];
13404
13405 // ugly hack end
13406
13407 digest[ 0] = byte_swap_64 (digest[ 0]);
13408 digest[ 1] = byte_swap_64 (digest[ 1]);
13409 digest[ 2] = byte_swap_64 (digest[ 2]);
13410 digest[ 3] = byte_swap_64 (digest[ 3]);
13411 digest[ 4] = 0;
13412 digest[ 5] = 0;
13413 digest[ 6] = 0;
13414 digest[ 7] = 0;
13415
13416 return (PARSER_OK);
13417 }
13418
13419 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13420 {
13421 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13422
13423 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13424
13425 uint32_t *digest = (uint32_t *) hash_buf->digest;
13426
13427 salt_t *salt = hash_buf->salt;
13428
13429 char *salt_buf = input_buf + 6;
13430
13431 uint salt_len = 16;
13432
13433 char *salt_buf_ptr = (char *) salt->salt_buf;
13434
13435 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13436
13437 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13438
13439 salt->salt_len = salt_len;
13440
13441 char *hash_pos = input_buf + 6 + 16;
13442
13443 digest[0] = hex_to_uint (&hash_pos[ 0]);
13444 digest[1] = hex_to_uint (&hash_pos[ 8]);
13445 digest[2] = hex_to_uint (&hash_pos[16]);
13446 digest[3] = hex_to_uint (&hash_pos[24]);
13447 digest[4] = hex_to_uint (&hash_pos[32]);
13448 digest[5] = hex_to_uint (&hash_pos[40]);
13449 digest[6] = hex_to_uint (&hash_pos[48]);
13450 digest[7] = hex_to_uint (&hash_pos[56]);
13451
13452 return (PARSER_OK);
13453 }
13454
13455 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13456 {
13457 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13458
13459 uint32_t *digest = (uint32_t *) hash_buf->digest;
13460
13461 digest[0] = hex_to_uint (&input_buf[ 0]);
13462 digest[1] = hex_to_uint (&input_buf[ 8]);
13463 digest[2] = 0;
13464 digest[3] = 0;
13465
13466 return (PARSER_OK);
13467 }
13468
13469 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13470 {
13471 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13472
13473 uint32_t *digest = (uint32_t *) hash_buf->digest;
13474
13475 salt_t *salt = hash_buf->salt;
13476
13477 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13478
13479 char *saltbuf_pos = input_buf;
13480
13481 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13482
13483 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13484
13485 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13486
13487 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13488 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13489
13490 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13491
13492 hashbuf_pos++;
13493
13494 uint hashbuf_len = input_len - saltbuf_len - 1;
13495
13496 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13497
13498 char *salt_ptr = (char *) saltbuf_pos;
13499 char *rakp_ptr = (char *) rakp->salt_buf;
13500
13501 uint i;
13502 uint j;
13503
13504 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13505 {
13506 rakp_ptr[j] = hex_to_char (&salt_ptr[i]);
13507 }
13508
13509 rakp_ptr[j] = 0x80;
13510
13511 rakp->salt_len = j;
13512
13513 for (i = 0; i < 64; i++)
13514 {
13515 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13516 }
13517
13518 salt->salt_buf[0] = rakp->salt_buf[0];
13519 salt->salt_buf[1] = rakp->salt_buf[1];
13520 salt->salt_buf[2] = rakp->salt_buf[2];
13521 salt->salt_buf[3] = rakp->salt_buf[3];
13522 salt->salt_buf[4] = rakp->salt_buf[4];
13523 salt->salt_buf[5] = rakp->salt_buf[5];
13524 salt->salt_buf[6] = rakp->salt_buf[6];
13525 salt->salt_buf[7] = rakp->salt_buf[7];
13526
13527 salt->salt_len = 32; // muss min. 32 haben
13528
13529 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
13530 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
13531 digest[2] = hex_to_uint (&hashbuf_pos[16]);
13532 digest[3] = hex_to_uint (&hashbuf_pos[24]);
13533 digest[4] = hex_to_uint (&hashbuf_pos[32]);
13534
13535 return (PARSER_OK);
13536 }
13537
13538 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13539 {
13540 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13541
13542 uint32_t *digest = (uint32_t *) hash_buf->digest;
13543
13544 salt_t *salt = hash_buf->salt;
13545
13546 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13547
13548 char *salt_pos = input_buf + 1;
13549
13550 memcpy (salt->salt_buf, salt_pos, 8);
13551
13552 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13553 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13554
13555 salt->salt_len = 8;
13556
13557 char *hash_pos = salt_pos + 8;
13558
13559 digest[0] = hex_to_uint (&hash_pos[ 0]);
13560 digest[1] = hex_to_uint (&hash_pos[ 8]);
13561 digest[2] = hex_to_uint (&hash_pos[16]);
13562 digest[3] = hex_to_uint (&hash_pos[24]);
13563 digest[4] = hex_to_uint (&hash_pos[32]);
13564
13565 digest[0] -= SHA1M_A;
13566 digest[1] -= SHA1M_B;
13567 digest[2] -= SHA1M_C;
13568 digest[3] -= SHA1M_D;
13569 digest[4] -= SHA1M_E;
13570
13571 return (PARSER_OK);
13572 }
13573
13574 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13575 {
13576 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13577
13578 uint32_t *digest = (uint32_t *) hash_buf->digest;
13579
13580 salt_t *salt = hash_buf->salt;
13581
13582 digest[0] = hex_to_uint (&input_buf[ 0]);
13583 digest[1] = hex_to_uint (&input_buf[ 8]);
13584 digest[2] = hex_to_uint (&input_buf[16]);
13585 digest[3] = hex_to_uint (&input_buf[24]);
13586
13587 digest[0] = byte_swap_32 (digest[0]);
13588 digest[1] = byte_swap_32 (digest[1]);
13589 digest[2] = byte_swap_32 (digest[2]);
13590 digest[3] = byte_swap_32 (digest[3]);
13591
13592 digest[0] -= MD5M_A;
13593 digest[1] -= MD5M_B;
13594 digest[2] -= MD5M_C;
13595 digest[3] -= MD5M_D;
13596
13597 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13598
13599 char *salt_buf_ptr = input_buf + 32 + 1;
13600
13601 uint32_t *salt_buf = salt->salt_buf;
13602
13603 salt_buf[0] = hex_to_uint (&salt_buf_ptr[ 0]);
13604 salt_buf[1] = hex_to_uint (&salt_buf_ptr[ 8]);
13605 salt_buf[2] = hex_to_uint (&salt_buf_ptr[16]);
13606 salt_buf[3] = hex_to_uint (&salt_buf_ptr[24]);
13607
13608 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13609 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13610 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13611 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13612
13613 salt->salt_len = 16 + 1;
13614
13615 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13616
13617 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13618
13619 salt_buf[4] = hex_to_char (&idbyte_buf_ptr[0]) & 0xff;
13620
13621 return (PARSER_OK);
13622 }
13623
13624 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13625 {
13626 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13627
13628 uint32_t *digest = (uint32_t *) hash_buf->digest;
13629
13630 salt_t *salt = hash_buf->salt;
13631
13632 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13633
13634 /**
13635 * parse line
13636 */
13637
13638 char *hashbuf_pos = input_buf;
13639
13640 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13641
13642 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13643
13644 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13645
13646 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13647
13648 saltbuf_pos++;
13649
13650 char *iteration_pos = strchr (saltbuf_pos, ':');
13651
13652 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13653
13654 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13655
13656 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13657
13658 iteration_pos++;
13659
13660 char *databuf_pos = strchr (iteration_pos, ':');
13661
13662 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13663
13664 const uint iteration_len = databuf_pos - iteration_pos;
13665
13666 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13667 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13668
13669 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13670
13671 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13672 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13673
13674 databuf_pos++;
13675
13676 // digest
13677
13678 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
13679 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
13680 digest[2] = hex_to_uint (&hashbuf_pos[16]);
13681 digest[3] = hex_to_uint (&hashbuf_pos[24]);
13682 digest[4] = hex_to_uint (&hashbuf_pos[32]);
13683 digest[5] = hex_to_uint (&hashbuf_pos[40]);
13684 digest[6] = hex_to_uint (&hashbuf_pos[48]);
13685 digest[7] = hex_to_uint (&hashbuf_pos[56]);
13686
13687 // salt
13688
13689 char *saltbuf_ptr = (char *) salt->salt_buf;
13690
13691 for (uint i = 0; i < saltbuf_len; i += 2)
13692 {
13693 const char p0 = saltbuf_pos[i + 0];
13694 const char p1 = saltbuf_pos[i + 1];
13695
13696 *saltbuf_ptr++ = hex_convert (p1) << 0
13697 | hex_convert (p0) << 4;
13698 }
13699
13700 salt->salt_buf[4] = 0x01000000;
13701 salt->salt_buf[5] = 0x80;
13702
13703 salt->salt_len = saltbuf_len / 2;
13704
13705 // iteration
13706
13707 salt->salt_iter = atoi (iteration_pos) - 1;
13708
13709 // data
13710
13711 char *databuf_ptr = (char *) cloudkey->data_buf;
13712
13713 for (uint i = 0; i < databuf_len; i += 2)
13714 {
13715 const char p0 = databuf_pos[i + 0];
13716 const char p1 = databuf_pos[i + 1];
13717
13718 *databuf_ptr++ = hex_convert (p1) << 0
13719 | hex_convert (p0) << 4;
13720 }
13721
13722 *databuf_ptr++ = 0x80;
13723
13724 for (uint i = 0; i < 512; i++)
13725 {
13726 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13727 }
13728
13729 cloudkey->data_len = databuf_len / 2;
13730
13731 return (PARSER_OK);
13732 }
13733
13734 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13735 {
13736 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13737
13738 uint32_t *digest = (uint32_t *) hash_buf->digest;
13739
13740 salt_t *salt = hash_buf->salt;
13741
13742 /**
13743 * parse line
13744 */
13745
13746 char *hashbuf_pos = input_buf;
13747
13748 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13749
13750 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13751
13752 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13753
13754 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13755
13756 domainbuf_pos++;
13757
13758 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13759
13760 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13761
13762 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13763
13764 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13765
13766 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13767
13768 saltbuf_pos++;
13769
13770 char *iteration_pos = strchr (saltbuf_pos, ':');
13771
13772 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13773
13774 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13775
13776 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13777
13778 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13779
13780 iteration_pos++;
13781
13782 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13783
13784 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13785 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13786
13787 // ok, the plan for this algorithm is the following:
13788 // we have 2 salts here, the domain-name and a random salt
13789 // while both are used in the initial transformation,
13790 // only the random salt is used in the following iterations
13791 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13792 // and one that includes only the real salt (stored into salt_buf[]).
13793 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13794
13795 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
13796
13797 base32_decode (itoa32_to_int, hashbuf_pos, 32, tmp_buf);
13798
13799 memcpy (digest, tmp_buf, 20);
13800
13801 digest[0] = byte_swap_32 (digest[0]);
13802 digest[1] = byte_swap_32 (digest[1]);
13803 digest[2] = byte_swap_32 (digest[2]);
13804 digest[3] = byte_swap_32 (digest[3]);
13805 digest[4] = byte_swap_32 (digest[4]);
13806
13807 // domain
13808
13809 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13810
13811 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13812
13813 char *len_ptr = NULL;
13814
13815 for (uint i = 0; i < domainbuf_len; i++)
13816 {
13817 if (salt_buf_pc_ptr[i] == '.')
13818 {
13819 len_ptr = &salt_buf_pc_ptr[i];
13820
13821 *len_ptr = 0;
13822 }
13823 else
13824 {
13825 *len_ptr += 1;
13826 }
13827 }
13828
13829 salt->salt_buf_pc[7] = domainbuf_len;
13830
13831 // "real" salt
13832
13833 char *salt_buf_ptr = (char *) salt->salt_buf;
13834
13835 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13836
13837 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13838
13839 salt->salt_len = salt_len;
13840
13841 // iteration
13842
13843 salt->salt_iter = atoi (iteration_pos);
13844
13845 return (PARSER_OK);
13846 }
13847
13848 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13849 {
13850 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
13851
13852 uint32_t *digest = (uint32_t *) hash_buf->digest;
13853
13854 salt_t *salt = hash_buf->salt;
13855
13856 digest[0] = hex_to_uint (&input_buf[ 0]);
13857 digest[1] = hex_to_uint (&input_buf[ 8]);
13858 digest[2] = hex_to_uint (&input_buf[16]);
13859 digest[3] = hex_to_uint (&input_buf[24]);
13860 digest[4] = hex_to_uint (&input_buf[32]);
13861
13862 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13863
13864 uint salt_len = input_len - 40 - 1;
13865
13866 char *salt_buf = input_buf + 40 + 1;
13867
13868 char *salt_buf_ptr = (char *) salt->salt_buf;
13869
13870 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13871
13872 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13873
13874 salt->salt_len = salt_len;
13875
13876 return (PARSER_OK);
13877 }
13878
13879 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13880 {
13881 const uint8_t ascii_to_ebcdic[] =
13882 {
13883 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
13884 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
13885 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
13886 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
13887 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
13888 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
13889 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
13890 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
13891 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
13892 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
13893 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
13894 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
13895 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
13896 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
13897 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
13898 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
13899 };
13900
13901 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
13902
13903 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13904
13905 uint32_t *digest = (uint32_t *) hash_buf->digest;
13906
13907 salt_t *salt = hash_buf->salt;
13908
13909 char *salt_pos = input_buf + 6 + 1;
13910
13911 char *digest_pos = strchr (salt_pos, '*');
13912
13913 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13914
13915 uint salt_len = digest_pos - salt_pos;
13916
13917 if (salt_len > 8) return (PARSER_SALT_LENGTH);
13918
13919 uint hash_len = input_len - 1 - salt_len - 1 - 6;
13920
13921 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13922
13923 digest_pos++;
13924
13925 char *salt_buf_ptr = (char *) salt->salt_buf;
13926 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13927
13928 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13929
13930 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13931
13932 salt->salt_len = salt_len;
13933
13934 for (uint i = 0; i < salt_len; i++)
13935 {
13936 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
13937 }
13938 for (uint i = salt_len; i < 8; i++)
13939 {
13940 salt_buf_pc_ptr[i] = 0x40;
13941 }
13942
13943 uint tt;
13944
13945 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
13946
13947 salt->salt_buf_pc[0] = ROTATE_LEFT (salt->salt_buf_pc[0], 3u);
13948 salt->salt_buf_pc[1] = ROTATE_LEFT (salt->salt_buf_pc[1], 3u);
13949
13950 digest[0] = hex_to_uint (&digest_pos[ 0]);
13951 digest[1] = hex_to_uint (&digest_pos[ 8]);
13952
13953 digest[0] = byte_swap_32 (digest[0]);
13954 digest[1] = byte_swap_32 (digest[1]);
13955
13956 IP (digest[0], digest[1], tt);
13957
13958 digest[0] = ROTATE_RIGHT (digest[0], 29);
13959 digest[1] = ROTATE_RIGHT (digest[1], 29);
13960 digest[2] = 0;
13961 digest[3] = 0;
13962
13963 return (PARSER_OK);
13964 }
13965
13966 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13967 {
13968 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
13969
13970 uint32_t *digest = (uint32_t *) hash_buf->digest;
13971
13972 digest[0] = hex_to_uint (&input_buf[ 0]);
13973 digest[1] = hex_to_uint (&input_buf[ 8]);
13974 digest[2] = hex_to_uint (&input_buf[16]);
13975 digest[3] = hex_to_uint (&input_buf[24]);
13976
13977 digest[0] = byte_swap_32 (digest[0]);
13978 digest[1] = byte_swap_32 (digest[1]);
13979 digest[2] = byte_swap_32 (digest[2]);
13980 digest[3] = byte_swap_32 (digest[3]);
13981
13982 return (PARSER_OK);
13983 }
13984
13985 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13986 {
13987 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
13988
13989 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
13990
13991 uint32_t *digest = (uint32_t *) hash_buf->digest;
13992
13993 salt_t *salt = hash_buf->salt;
13994
13995 char tmp_buf[120];
13996
13997 memset (tmp_buf, 0, sizeof (tmp_buf));
13998
13999 base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf);
14000
14001 tmp_buf[3] += -4; // dont ask!
14002
14003 memcpy (salt->salt_buf, tmp_buf, 5);
14004
14005 salt->salt_len = 5;
14006
14007 memcpy (digest, tmp_buf + 5, 9);
14008
14009 // yes, only 9 byte are needed to crack, but 10 to display
14010
14011 salt->salt_buf_pc[7] = input_buf[20];
14012
14013 return (PARSER_OK);
14014 }
14015
14016 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14017 {
14018 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14019
14020 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14021
14022 uint32_t *digest = (uint32_t *) hash_buf->digest;
14023
14024 salt_t *salt = hash_buf->salt;
14025
14026 char tmp_buf[120];
14027
14028 memset (tmp_buf, 0, sizeof (tmp_buf));
14029
14030 base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf);
14031
14032 tmp_buf[3] += -4; // dont ask!
14033
14034 // salt
14035
14036 memcpy (salt->salt_buf, tmp_buf, 16);
14037
14038 salt->salt_len = 16; // Attention: in theory we have 2 salt_len, one for the -m 8700 part (len: 8), 2nd for the 9100 part (len: 16)
14039
14040 // iteration
14041
14042 char tmp_iter_buf[11];
14043
14044 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14045
14046 tmp_iter_buf[10] = 0;
14047
14048 salt->salt_iter = atoi (tmp_iter_buf);
14049
14050 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14051 {
14052 return (PARSER_SALT_ITERATION);
14053 }
14054
14055 salt->salt_iter--; // first round in init
14056
14057 // 2 additional bytes for display only
14058
14059 salt->salt_buf_pc[0] = tmp_buf[26];
14060 salt->salt_buf_pc[1] = tmp_buf[27];
14061
14062 // digest
14063
14064 memcpy (digest, tmp_buf + 28, 8);
14065
14066 digest[0] = byte_swap_32 (digest[0]);
14067 digest[1] = byte_swap_32 (digest[1]);
14068 digest[2] = 0;
14069 digest[3] = 0;
14070
14071 return (PARSER_OK);
14072 }
14073
14074 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14075 {
14076 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14077
14078 uint32_t *digest = (uint32_t *) hash_buf->digest;
14079
14080 salt_t *salt = hash_buf->salt;
14081
14082 char *salt_buf_pos = input_buf;
14083
14084 char *hash_buf_pos = salt_buf_pos + 6;
14085
14086 digest[0] = hex_to_uint (&hash_buf_pos[ 0]);
14087 digest[1] = hex_to_uint (&hash_buf_pos[ 8]);
14088 digest[2] = hex_to_uint (&hash_buf_pos[16]);
14089 digest[3] = hex_to_uint (&hash_buf_pos[24]);
14090 digest[4] = hex_to_uint (&hash_buf_pos[32]);
14091 digest[5] = hex_to_uint (&hash_buf_pos[40]);
14092 digest[6] = hex_to_uint (&hash_buf_pos[48]);
14093 digest[7] = hex_to_uint (&hash_buf_pos[56]);
14094
14095 digest[0] -= SHA256M_A;
14096 digest[1] -= SHA256M_B;
14097 digest[2] -= SHA256M_C;
14098 digest[3] -= SHA256M_D;
14099 digest[4] -= SHA256M_E;
14100 digest[5] -= SHA256M_F;
14101 digest[6] -= SHA256M_G;
14102 digest[7] -= SHA256M_H;
14103
14104 char *salt_buf_ptr = (char *) salt->salt_buf;
14105
14106 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14107
14108 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14109
14110 salt->salt_len = salt_len;
14111
14112 return (PARSER_OK);
14113 }
14114
14115 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14116 {
14117 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14118
14119 uint32_t *digest = (uint32_t *) hash_buf->digest;
14120
14121 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14122
14123 salt_t *salt = hash_buf->salt;
14124
14125 char *salt_buf = input_buf + 6;
14126
14127 char *digest_buf = strchr (salt_buf, '$');
14128
14129 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14130
14131 uint salt_len = digest_buf - salt_buf;
14132
14133 digest_buf++; // skip the '$' symbol
14134
14135 char *salt_buf_ptr = (char *) salt->salt_buf;
14136
14137 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14138
14139 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14140
14141 salt->salt_len = salt_len;
14142
14143 digest[0] = hex_to_uint (&digest_buf[ 0]);
14144 digest[1] = hex_to_uint (&digest_buf[ 8]);
14145 digest[2] = hex_to_uint (&digest_buf[16]);
14146 digest[3] = hex_to_uint (&digest_buf[24]);
14147
14148 digest[0] = byte_swap_32 (digest[0]);
14149 digest[1] = byte_swap_32 (digest[1]);
14150 digest[2] = byte_swap_32 (digest[2]);
14151 digest[3] = byte_swap_32 (digest[3]);
14152
14153 digest[0] -= MD5M_A;
14154 digest[1] -= MD5M_B;
14155 digest[2] -= MD5M_C;
14156 digest[3] -= MD5M_D;
14157
14158 return (PARSER_OK);
14159 }
14160
14161 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14162 {
14163 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14164
14165 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14166
14167 uint32_t *digest = (uint32_t *) hash_buf->digest;
14168
14169 salt_t *salt = hash_buf->salt;
14170
14171 char *salt_buf = input_buf + 3;
14172
14173 char *digest_buf = strchr (salt_buf, '$');
14174
14175 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14176
14177 uint salt_len = digest_buf - salt_buf;
14178
14179 digest_buf++; // skip the '$' symbol
14180
14181 char *salt_buf_ptr = (char *) salt->salt_buf;
14182
14183 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14184
14185 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14186
14187 salt_buf_ptr[salt_len] = 0x2d;
14188
14189 salt->salt_len = salt_len + 1;
14190
14191 digest[0] = hex_to_uint (&digest_buf[ 0]);
14192 digest[1] = hex_to_uint (&digest_buf[ 8]);
14193 digest[2] = hex_to_uint (&digest_buf[16]);
14194 digest[3] = hex_to_uint (&digest_buf[24]);
14195
14196 digest[0] = byte_swap_32 (digest[0]);
14197 digest[1] = byte_swap_32 (digest[1]);
14198 digest[2] = byte_swap_32 (digest[2]);
14199 digest[3] = byte_swap_32 (digest[3]);
14200
14201 digest[0] -= MD5M_A;
14202 digest[1] -= MD5M_B;
14203 digest[2] -= MD5M_C;
14204 digest[3] -= MD5M_D;
14205
14206 return (PARSER_OK);
14207 }
14208
14209 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14210 {
14211 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14212
14213 uint32_t *digest = (uint32_t *) hash_buf->digest;
14214
14215 char tmp_buf[100];
14216
14217 memset (tmp_buf, 0, sizeof (tmp_buf));
14218
14219 base64_decode (base64_to_int, input_buf, input_len, tmp_buf);
14220
14221 memcpy (digest, tmp_buf, 20);
14222
14223 digest[0] = byte_swap_32 (digest[0]);
14224 digest[1] = byte_swap_32 (digest[1]);
14225 digest[2] = byte_swap_32 (digest[2]);
14226 digest[3] = byte_swap_32 (digest[3]);
14227 digest[4] = byte_swap_32 (digest[4]);
14228
14229 digest[0] -= SHA1M_A;
14230 digest[1] -= SHA1M_B;
14231 digest[2] -= SHA1M_C;
14232 digest[3] -= SHA1M_D;
14233 digest[4] -= SHA1M_E;
14234
14235 return (PARSER_OK);
14236 }
14237
14238 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14239 {
14240 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14241
14242 uint32_t *digest = (uint32_t *) hash_buf->digest;
14243
14244 salt_t *salt = hash_buf->salt;
14245
14246 digest[0] = hex_to_uint (&input_buf[ 0]);
14247 digest[1] = hex_to_uint (&input_buf[ 8]);
14248 digest[2] = hex_to_uint (&input_buf[16]);
14249 digest[3] = hex_to_uint (&input_buf[24]);
14250
14251 digest[0] = byte_swap_32 (digest[0]);
14252 digest[1] = byte_swap_32 (digest[1]);
14253 digest[2] = byte_swap_32 (digest[2]);
14254 digest[3] = byte_swap_32 (digest[3]);
14255
14256 digest[0] -= MD5M_A;
14257 digest[1] -= MD5M_B;
14258 digest[2] -= MD5M_C;
14259 digest[3] -= MD5M_D;
14260
14261 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14262
14263 uint salt_len = input_len - 32 - 1;
14264
14265 char *salt_buf = input_buf + 32 + 1;
14266
14267 char *salt_buf_ptr = (char *) salt->salt_buf;
14268
14269 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14270
14271 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14272
14273 /*
14274 * add static "salt" part
14275 */
14276
14277 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14278
14279 salt_len += 8;
14280
14281 salt->salt_len = salt_len;
14282
14283 return (PARSER_OK);
14284 }
14285
14286 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14287 {
14288 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14289
14290 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14291
14292 uint32_t *digest = (uint32_t *) hash_buf->digest;
14293
14294 salt_t *salt = hash_buf->salt;
14295
14296 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14297
14298 /**
14299 * parse line
14300 */
14301
14302 char *saltlen_pos = input_buf + 1 + 3 + 1;
14303
14304 char *saltbuf_pos = strchr (saltlen_pos, '$');
14305
14306 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14307
14308 uint saltlen_len = saltbuf_pos - saltlen_pos;
14309
14310 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14311
14312 saltbuf_pos++;
14313
14314 char *keylen_pos = strchr (saltbuf_pos, '$');
14315
14316 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14317
14318 uint saltbuf_len = keylen_pos - saltbuf_pos;
14319
14320 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14321
14322 keylen_pos++;
14323
14324 char *keybuf_pos = strchr (keylen_pos, '$');
14325
14326 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14327
14328 uint keylen_len = keybuf_pos - keylen_pos;
14329
14330 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14331
14332 keybuf_pos++;
14333
14334 char *databuf_pos = strchr (keybuf_pos, '$');
14335
14336 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14337
14338 uint keybuf_len = databuf_pos - keybuf_pos;
14339
14340 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14341
14342 databuf_pos++;
14343
14344 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14345
14346 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14347
14348 /**
14349 * copy data
14350 */
14351
14352 digest[0] = hex_to_uint (&keybuf_pos[ 0]);
14353 digest[1] = hex_to_uint (&keybuf_pos[ 8]);
14354 digest[2] = hex_to_uint (&keybuf_pos[16]);
14355 digest[3] = hex_to_uint (&keybuf_pos[24]);
14356
14357 salt->salt_buf[0] = hex_to_uint (&saltbuf_pos[ 0]);
14358 salt->salt_buf[1] = hex_to_uint (&saltbuf_pos[ 8]);
14359 salt->salt_buf[2] = hex_to_uint (&saltbuf_pos[16]);
14360 salt->salt_buf[3] = hex_to_uint (&saltbuf_pos[24]);
14361
14362 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14363 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14364 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14365 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14366
14367 salt->salt_len = 16;
14368 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14369
14370 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14371 {
14372 androidfde->data[j] = hex_to_uint (&databuf_pos[i]);
14373 }
14374
14375 return (PARSER_OK);
14376 }
14377
14378 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14379 {
14380 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14381
14382 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14383
14384 uint32_t *digest = (uint32_t *) hash_buf->digest;
14385
14386 salt_t *salt = hash_buf->salt;
14387
14388 /**
14389 * parse line
14390 */
14391
14392 // first is the N salt parameter
14393
14394 char *N_pos = input_buf + 6;
14395
14396 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14397
14398 N_pos++;
14399
14400 salt->scrypt_N = atoi (N_pos);
14401
14402 // r
14403
14404 char *r_pos = strchr (N_pos, ':');
14405
14406 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14407
14408 r_pos++;
14409
14410 salt->scrypt_r = atoi (r_pos);
14411
14412 // p
14413
14414 char *p_pos = strchr (r_pos, ':');
14415
14416 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14417
14418 p_pos++;
14419
14420 salt->scrypt_p = atoi (p_pos);
14421
14422 // salt
14423
14424 char *saltbuf_pos = strchr (p_pos, ':');
14425
14426 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14427
14428 saltbuf_pos++;
14429
14430 char *hash_pos = strchr (saltbuf_pos, ':');
14431
14432 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14433
14434 hash_pos++;
14435
14436 // base64 decode
14437
14438 char tmp_buf[32];
14439
14440 memset (tmp_buf, 0, sizeof (tmp_buf));
14441
14442 int tmp_len = base64_decode (base64_to_int, saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14443
14444 char *salt_buf_ptr = (char *) salt->salt_buf;
14445
14446 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14447
14448 salt->salt_len = tmp_len;
14449 salt->salt_iter = 1;
14450
14451 // digest - base64 decode
14452
14453 memset (tmp_buf, 0, sizeof (tmp_buf));
14454
14455 tmp_len = input_len - (hash_pos - input_buf);
14456
14457 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14458
14459 base64_decode (base64_to_int, hash_pos, tmp_len, tmp_buf);
14460
14461 memcpy (digest, tmp_buf, 32);
14462
14463 return (PARSER_OK);
14464 }
14465
14466 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14467 {
14468 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14469
14470 uint32_t *digest = (uint32_t *) hash_buf->digest;
14471
14472 salt_t *salt = hash_buf->salt;
14473
14474 /**
14475 * parse line
14476 */
14477
14478 char decrypted[76]; // iv + hash
14479
14480 juniper_decrypt_hash (input_buf, decrypted);
14481
14482 char *md5crypt_hash = decrypted + 12;
14483
14484 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14485
14486 salt->salt_iter = ROUNDS_MD5CRYPT;
14487
14488 char *salt_pos = md5crypt_hash + 3;
14489
14490 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14491
14492 salt->salt_len = hash_pos - salt_pos; // should be 8
14493
14494 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14495
14496 hash_pos++;
14497
14498 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14499
14500 return (PARSER_OK);
14501 }
14502
14503 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14504 {
14505 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14506
14507 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14508
14509 uint32_t *digest = (uint32_t *) hash_buf->digest;
14510
14511 salt_t *salt = hash_buf->salt;
14512
14513 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14514
14515 /**
14516 * parse line
14517 */
14518
14519 // first is *raw* salt
14520
14521 char *salt_pos = input_buf + 3;
14522
14523 char *hash_pos = strchr (salt_pos, '$');
14524
14525 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14526
14527 uint salt_len = hash_pos - salt_pos;
14528
14529 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14530
14531 hash_pos++;
14532
14533 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14534
14535 memcpy (salt_buf_ptr, salt_pos, 14);
14536
14537 salt_buf_ptr[17] = 0x01;
14538 salt_buf_ptr[18] = 0x80;
14539
14540 // add some stuff to normal salt to make sorted happy
14541
14542 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14543 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14544 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14545 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14546
14547 salt->salt_len = salt_len;
14548 salt->salt_iter = ROUNDS_CISCO8 - 1;
14549
14550 // base64 decode hash
14551
14552 char tmp_buf[100];
14553
14554 memset (tmp_buf, 0, sizeof (tmp_buf));
14555
14556 uint hash_len = input_len - 3 - salt_len - 1;
14557
14558 int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf);
14559
14560 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14561
14562 memcpy (digest, tmp_buf, 32);
14563
14564 digest[0] = byte_swap_32 (digest[0]);
14565 digest[1] = byte_swap_32 (digest[1]);
14566 digest[2] = byte_swap_32 (digest[2]);
14567 digest[3] = byte_swap_32 (digest[3]);
14568 digest[4] = byte_swap_32 (digest[4]);
14569 digest[5] = byte_swap_32 (digest[5]);
14570 digest[6] = byte_swap_32 (digest[6]);
14571 digest[7] = byte_swap_32 (digest[7]);
14572
14573 return (PARSER_OK);
14574 }
14575
14576 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14577 {
14578 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14579
14580 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14581
14582 uint32_t *digest = (uint32_t *) hash_buf->digest;
14583
14584 salt_t *salt = hash_buf->salt;
14585
14586 /**
14587 * parse line
14588 */
14589
14590 // first is *raw* salt
14591
14592 char *salt_pos = input_buf + 3;
14593
14594 char *hash_pos = strchr (salt_pos, '$');
14595
14596 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14597
14598 uint salt_len = hash_pos - salt_pos;
14599
14600 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14601
14602 salt->salt_len = salt_len;
14603 hash_pos++;
14604
14605 char *salt_buf_ptr = (char *) salt->salt_buf;
14606
14607 memcpy (salt_buf_ptr, salt_pos, salt_len);
14608 salt_buf_ptr[salt_len] = 0;
14609
14610 // base64 decode hash
14611
14612 char tmp_buf[100];
14613
14614 memset (tmp_buf, 0, sizeof (tmp_buf));
14615
14616 uint hash_len = input_len - 3 - salt_len - 1;
14617
14618 int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf);
14619
14620 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14621
14622 memcpy (digest, tmp_buf, 32);
14623
14624 // fixed:
14625 salt->scrypt_N = 16384;
14626 salt->scrypt_r = 1;
14627 salt->scrypt_p = 1;
14628 salt->salt_iter = 1;
14629
14630 return (PARSER_OK);
14631 }
14632
14633 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14634 {
14635 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14636
14637 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14638
14639 uint32_t *digest = (uint32_t *) hash_buf->digest;
14640
14641 salt_t *salt = hash_buf->salt;
14642
14643 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14644
14645 /**
14646 * parse line
14647 */
14648
14649 char *version_pos = input_buf + 8 + 1;
14650
14651 char *verifierHashSize_pos = strchr (version_pos, '*');
14652
14653 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14654
14655 uint32_t version_len = verifierHashSize_pos - version_pos;
14656
14657 if (version_len != 4) return (PARSER_SALT_LENGTH);
14658
14659 verifierHashSize_pos++;
14660
14661 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14662
14663 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14664
14665 uint32_t verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14666
14667 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14668
14669 keySize_pos++;
14670
14671 char *saltSize_pos = strchr (keySize_pos, '*');
14672
14673 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14674
14675 uint32_t keySize_len = saltSize_pos - keySize_pos;
14676
14677 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14678
14679 saltSize_pos++;
14680
14681 char *osalt_pos = strchr (saltSize_pos, '*');
14682
14683 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14684
14685 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14686
14687 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14688
14689 osalt_pos++;
14690
14691 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14692
14693 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14694
14695 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14696
14697 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14698
14699 encryptedVerifier_pos++;
14700
14701 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14702
14703 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14704
14705 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14706
14707 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14708
14709 encryptedVerifierHash_pos++;
14710
14711 uint32_t encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - verifierHashSize_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
14712
14713 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14714
14715 const uint version = atoi (version_pos);
14716
14717 if (version != 2007) return (PARSER_SALT_VALUE);
14718
14719 const uint verifierHashSize = atoi (verifierHashSize_pos);
14720
14721 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14722
14723 const uint keySize = atoi (keySize_pos);
14724
14725 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14726
14727 office2007->keySize = keySize;
14728
14729 const uint saltSize = atoi (saltSize_pos);
14730
14731 if (saltSize != 16) return (PARSER_SALT_VALUE);
14732
14733 /**
14734 * salt
14735 */
14736
14737 salt->salt_len = 16;
14738 salt->salt_iter = ROUNDS_OFFICE2007;
14739
14740 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14741 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14742 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14743 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14744
14745 /**
14746 * esalt
14747 */
14748
14749 office2007->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14750 office2007->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14751 office2007->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14752 office2007->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14753
14754 office2007->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14755 office2007->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14756 office2007->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14757 office2007->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14758 office2007->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14759
14760 /**
14761 * digest
14762 */
14763
14764 digest[0] = office2007->encryptedVerifierHash[0];
14765 digest[1] = office2007->encryptedVerifierHash[1];
14766 digest[2] = office2007->encryptedVerifierHash[2];
14767 digest[3] = office2007->encryptedVerifierHash[3];
14768
14769 return (PARSER_OK);
14770 }
14771
14772 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14773 {
14774 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14775
14776 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14777
14778 uint32_t *digest = (uint32_t *) hash_buf->digest;
14779
14780 salt_t *salt = hash_buf->salt;
14781
14782 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14783
14784 /**
14785 * parse line
14786 */
14787
14788 char *version_pos = input_buf + 8 + 1;
14789
14790 char *spinCount_pos = strchr (version_pos, '*');
14791
14792 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14793
14794 uint32_t version_len = spinCount_pos - version_pos;
14795
14796 if (version_len != 4) return (PARSER_SALT_LENGTH);
14797
14798 spinCount_pos++;
14799
14800 char *keySize_pos = strchr (spinCount_pos, '*');
14801
14802 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14803
14804 uint32_t spinCount_len = keySize_pos - spinCount_pos;
14805
14806 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14807
14808 keySize_pos++;
14809
14810 char *saltSize_pos = strchr (keySize_pos, '*');
14811
14812 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14813
14814 uint32_t keySize_len = saltSize_pos - keySize_pos;
14815
14816 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14817
14818 saltSize_pos++;
14819
14820 char *osalt_pos = strchr (saltSize_pos, '*');
14821
14822 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14823
14824 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14825
14826 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14827
14828 osalt_pos++;
14829
14830 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14831
14832 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14833
14834 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14835
14836 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14837
14838 encryptedVerifier_pos++;
14839
14840 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14841
14842 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14843
14844 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14845
14846 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14847
14848 encryptedVerifierHash_pos++;
14849
14850 uint32_t encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - spinCount_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
14851
14852 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14853
14854 const uint version = atoi (version_pos);
14855
14856 if (version != 2010) return (PARSER_SALT_VALUE);
14857
14858 const uint spinCount = atoi (spinCount_pos);
14859
14860 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14861
14862 const uint keySize = atoi (keySize_pos);
14863
14864 if (keySize != 128) return (PARSER_SALT_VALUE);
14865
14866 const uint saltSize = atoi (saltSize_pos);
14867
14868 if (saltSize != 16) return (PARSER_SALT_VALUE);
14869
14870 /**
14871 * salt
14872 */
14873
14874 salt->salt_len = 16;
14875 salt->salt_iter = spinCount;
14876
14877 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14878 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14879 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14880 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14881
14882 /**
14883 * esalt
14884 */
14885
14886 office2010->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14887 office2010->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14888 office2010->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14889 office2010->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14890
14891 office2010->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14892 office2010->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14893 office2010->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14894 office2010->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14895 office2010->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14896 office2010->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]);
14897 office2010->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]);
14898 office2010->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]);
14899
14900 /**
14901 * digest
14902 */
14903
14904 digest[0] = office2010->encryptedVerifierHash[0];
14905 digest[1] = office2010->encryptedVerifierHash[1];
14906 digest[2] = office2010->encryptedVerifierHash[2];
14907 digest[3] = office2010->encryptedVerifierHash[3];
14908
14909 return (PARSER_OK);
14910 }
14911
14912 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14913 {
14914 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
14915
14916 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14917
14918 uint32_t *digest = (uint32_t *) hash_buf->digest;
14919
14920 salt_t *salt = hash_buf->salt;
14921
14922 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
14923
14924 /**
14925 * parse line
14926 */
14927
14928 char *version_pos = input_buf + 8 + 1;
14929
14930 char *spinCount_pos = strchr (version_pos, '*');
14931
14932 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14933
14934 uint32_t version_len = spinCount_pos - version_pos;
14935
14936 if (version_len != 4) return (PARSER_SALT_LENGTH);
14937
14938 spinCount_pos++;
14939
14940 char *keySize_pos = strchr (spinCount_pos, '*');
14941
14942 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14943
14944 uint32_t spinCount_len = keySize_pos - spinCount_pos;
14945
14946 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14947
14948 keySize_pos++;
14949
14950 char *saltSize_pos = strchr (keySize_pos, '*');
14951
14952 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14953
14954 uint32_t keySize_len = saltSize_pos - keySize_pos;
14955
14956 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14957
14958 saltSize_pos++;
14959
14960 char *osalt_pos = strchr (saltSize_pos, '*');
14961
14962 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14963
14964 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14965
14966 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14967
14968 osalt_pos++;
14969
14970 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14971
14972 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14973
14974 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14975
14976 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14977
14978 encryptedVerifier_pos++;
14979
14980 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14981
14982 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14983
14984 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14985
14986 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14987
14988 encryptedVerifierHash_pos++;
14989
14990 uint32_t encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - spinCount_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
14991
14992 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14993
14994 const uint version = atoi (version_pos);
14995
14996 if (version != 2013) return (PARSER_SALT_VALUE);
14997
14998 const uint spinCount = atoi (spinCount_pos);
14999
15000 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15001
15002 const uint keySize = atoi (keySize_pos);
15003
15004 if (keySize != 256) return (PARSER_SALT_VALUE);
15005
15006 const uint saltSize = atoi (saltSize_pos);
15007
15008 if (saltSize != 16) return (PARSER_SALT_VALUE);
15009
15010 /**
15011 * salt
15012 */
15013
15014 salt->salt_len = 16;
15015 salt->salt_iter = spinCount;
15016
15017 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15018 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15019 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15020 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15021
15022 /**
15023 * esalt
15024 */
15025
15026 office2013->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15027 office2013->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15028 office2013->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15029 office2013->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15030
15031 office2013->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15032 office2013->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15033 office2013->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15034 office2013->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15035 office2013->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15036 office2013->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]);
15037 office2013->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]);
15038 office2013->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]);
15039
15040 /**
15041 * digest
15042 */
15043
15044 digest[0] = office2013->encryptedVerifierHash[0];
15045 digest[1] = office2013->encryptedVerifierHash[1];
15046 digest[2] = office2013->encryptedVerifierHash[2];
15047 digest[3] = office2013->encryptedVerifierHash[3];
15048
15049 return (PARSER_OK);
15050 }
15051
15052 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15053 {
15054 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15055
15056 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15057
15058 uint32_t *digest = (uint32_t *) hash_buf->digest;
15059
15060 salt_t *salt = hash_buf->salt;
15061
15062 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15063
15064 /**
15065 * parse line
15066 */
15067
15068 char *version_pos = input_buf + 11;
15069
15070 char *osalt_pos = strchr (version_pos, '*');
15071
15072 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15073
15074 uint32_t version_len = osalt_pos - version_pos;
15075
15076 if (version_len != 1) return (PARSER_SALT_LENGTH);
15077
15078 osalt_pos++;
15079
15080 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15081
15082 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15083
15084 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15085
15086 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15087
15088 encryptedVerifier_pos++;
15089
15090 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15091
15092 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15093
15094 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15095
15096 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15097
15098 encryptedVerifierHash_pos++;
15099
15100 uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15101
15102 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15103
15104 const uint version = *version_pos - 0x30;
15105
15106 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15107
15108 /**
15109 * esalt
15110 */
15111
15112 oldoffice01->version = version;
15113
15114 oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15115 oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15116 oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15117 oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15118
15119 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15120 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15121 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15122 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15123
15124 oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15125 oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15126 oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15127 oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15128
15129 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15130 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15131 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15132 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15133
15134 /**
15135 * salt
15136 */
15137
15138 salt->salt_len = 16;
15139
15140 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15141 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15142 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15143 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15144
15145 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15146 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15147 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15148 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15149
15150 // this is a workaround as office produces multiple documents with the same salt
15151
15152 salt->salt_len += 32;
15153
15154 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15155 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15156 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15157 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15158 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15159 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15160 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15161 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15162
15163 /**
15164 * digest
15165 */
15166
15167 digest[0] = oldoffice01->encryptedVerifierHash[0];
15168 digest[1] = oldoffice01->encryptedVerifierHash[1];
15169 digest[2] = oldoffice01->encryptedVerifierHash[2];
15170 digest[3] = oldoffice01->encryptedVerifierHash[3];
15171
15172 return (PARSER_OK);
15173 }
15174
15175 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15176 {
15177 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15178 }
15179
15180 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15181 {
15182 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15183
15184 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15185
15186 uint32_t *digest = (uint32_t *) hash_buf->digest;
15187
15188 salt_t *salt = hash_buf->salt;
15189
15190 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15191
15192 /**
15193 * parse line
15194 */
15195
15196 char *version_pos = input_buf + 11;
15197
15198 char *osalt_pos = strchr (version_pos, '*');
15199
15200 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15201
15202 uint32_t version_len = osalt_pos - version_pos;
15203
15204 if (version_len != 1) return (PARSER_SALT_LENGTH);
15205
15206 osalt_pos++;
15207
15208 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15209
15210 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15211
15212 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15213
15214 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15215
15216 encryptedVerifier_pos++;
15217
15218 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15219
15220 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15221
15222 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15223
15224 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15225
15226 encryptedVerifierHash_pos++;
15227
15228 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15229
15230 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15231
15232 uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15233
15234 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15235
15236 rc4key_pos++;
15237
15238 uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15239
15240 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15241
15242 const uint version = *version_pos - 0x30;
15243
15244 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15245
15246 /**
15247 * esalt
15248 */
15249
15250 oldoffice01->version = version;
15251
15252 oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15253 oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15254 oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15255 oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15256
15257 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15258 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15259 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15260 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15261
15262 oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15263 oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15264 oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15265 oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15266
15267 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15268 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15269 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15270 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15271
15272 oldoffice01->rc4key[1] = 0;
15273 oldoffice01->rc4key[0] = 0;
15274
15275 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15276 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15277 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15278 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15279 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15280 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15281 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15282 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15283 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15284 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15285
15286 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15287 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15288
15289 /**
15290 * salt
15291 */
15292
15293 salt->salt_len = 16;
15294
15295 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15296 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15297 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15298 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15299
15300 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15301 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15302 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15303 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15304
15305 // this is a workaround as office produces multiple documents with the same salt
15306
15307 salt->salt_len += 32;
15308
15309 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15310 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15311 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15312 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15313 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15314 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15315 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15316 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15317
15318 /**
15319 * digest
15320 */
15321
15322 digest[0] = oldoffice01->rc4key[0];
15323 digest[1] = oldoffice01->rc4key[1];
15324 digest[2] = 0;
15325 digest[3] = 0;
15326
15327 return (PARSER_OK);
15328 }
15329
15330 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15331 {
15332 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15333
15334 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15335
15336 uint32_t *digest = (uint32_t *) hash_buf->digest;
15337
15338 salt_t *salt = hash_buf->salt;
15339
15340 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15341
15342 /**
15343 * parse line
15344 */
15345
15346 char *version_pos = input_buf + 11;
15347
15348 char *osalt_pos = strchr (version_pos, '*');
15349
15350 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15351
15352 uint32_t version_len = osalt_pos - version_pos;
15353
15354 if (version_len != 1) return (PARSER_SALT_LENGTH);
15355
15356 osalt_pos++;
15357
15358 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15359
15360 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15361
15362 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15363
15364 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15365
15366 encryptedVerifier_pos++;
15367
15368 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15369
15370 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15371
15372 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15373
15374 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15375
15376 encryptedVerifierHash_pos++;
15377
15378 uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15379
15380 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15381
15382 const uint version = *version_pos - 0x30;
15383
15384 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15385
15386 /**
15387 * esalt
15388 */
15389
15390 oldoffice34->version = version;
15391
15392 oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15393 oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15394 oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15395 oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15396
15397 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15398 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15399 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15400 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15401
15402 oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15403 oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15404 oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15405 oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15406 oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15407
15408 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15409 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15410 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15411 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15412 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15413
15414 /**
15415 * salt
15416 */
15417
15418 salt->salt_len = 16;
15419
15420 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15421 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15422 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15423 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15424
15425 // this is a workaround as office produces multiple documents with the same salt
15426
15427 salt->salt_len += 32;
15428
15429 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15430 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15431 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15432 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15433 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15434 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15435 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15436 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15437
15438 /**
15439 * digest
15440 */
15441
15442 digest[0] = oldoffice34->encryptedVerifierHash[0];
15443 digest[1] = oldoffice34->encryptedVerifierHash[1];
15444 digest[2] = oldoffice34->encryptedVerifierHash[2];
15445 digest[3] = oldoffice34->encryptedVerifierHash[3];
15446
15447 return (PARSER_OK);
15448 }
15449
15450 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15451 {
15452 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15453
15454 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15455 }
15456
15457 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15458 {
15459 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15460
15461 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15462
15463 uint32_t *digest = (uint32_t *) hash_buf->digest;
15464
15465 salt_t *salt = hash_buf->salt;
15466
15467 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15468
15469 /**
15470 * parse line
15471 */
15472
15473 char *version_pos = input_buf + 11;
15474
15475 char *osalt_pos = strchr (version_pos, '*');
15476
15477 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15478
15479 uint32_t version_len = osalt_pos - version_pos;
15480
15481 if (version_len != 1) return (PARSER_SALT_LENGTH);
15482
15483 osalt_pos++;
15484
15485 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15486
15487 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15488
15489 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15490
15491 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15492
15493 encryptedVerifier_pos++;
15494
15495 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15496
15497 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15498
15499 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15500
15501 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15502
15503 encryptedVerifierHash_pos++;
15504
15505 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15506
15507 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15508
15509 uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15510
15511 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15512
15513 rc4key_pos++;
15514
15515 uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15516
15517 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15518
15519 const uint version = *version_pos - 0x30;
15520
15521 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15522
15523 /**
15524 * esalt
15525 */
15526
15527 oldoffice34->version = version;
15528
15529 oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15530 oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15531 oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15532 oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15533
15534 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15535 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15536 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15537 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15538
15539 oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15540 oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15541 oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15542 oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15543 oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15544
15545 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15546 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15547 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15548 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15549 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15550
15551 oldoffice34->rc4key[1] = 0;
15552 oldoffice34->rc4key[0] = 0;
15553
15554 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15555 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15556 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15557 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15558 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15559 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15560 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15561 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15562 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15563 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15564
15565 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15566 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15567
15568 /**
15569 * salt
15570 */
15571
15572 salt->salt_len = 16;
15573
15574 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15575 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15576 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15577 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15578
15579 // this is a workaround as office produces multiple documents with the same salt
15580
15581 salt->salt_len += 32;
15582
15583 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15584 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15585 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15586 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15587 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15588 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15589 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15590 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15591
15592 /**
15593 * digest
15594 */
15595
15596 digest[0] = oldoffice34->rc4key[0];
15597 digest[1] = oldoffice34->rc4key[1];
15598 digest[2] = 0;
15599 digest[3] = 0;
15600
15601 return (PARSER_OK);
15602 }
15603
15604 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15605 {
15606 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15607
15608 uint32_t *digest = (uint32_t *) hash_buf->digest;
15609
15610 digest[0] = hex_to_uint (&input_buf[ 0]);
15611 digest[1] = hex_to_uint (&input_buf[ 8]);
15612 digest[2] = hex_to_uint (&input_buf[16]);
15613 digest[3] = hex_to_uint (&input_buf[24]);
15614
15615 digest[0] = byte_swap_32 (digest[0]);
15616 digest[1] = byte_swap_32 (digest[1]);
15617 digest[2] = byte_swap_32 (digest[2]);
15618 digest[3] = byte_swap_32 (digest[3]);
15619
15620 return (PARSER_OK);
15621 }
15622
15623 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15624 {
15625 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15626
15627 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15628
15629 uint32_t *digest = (uint32_t *) hash_buf->digest;
15630
15631 salt_t *salt = hash_buf->salt;
15632
15633 char *signature_pos = input_buf;
15634
15635 char *salt_pos = strchr (signature_pos, '$');
15636
15637 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15638
15639 uint32_t signature_len = salt_pos - signature_pos;
15640
15641 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15642
15643 salt_pos++;
15644
15645 char *hash_pos = strchr (salt_pos, '$');
15646
15647 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15648
15649 uint32_t salt_len = hash_pos - salt_pos;
15650
15651 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15652
15653 hash_pos++;
15654
15655 uint32_t hash_len = input_len - signature_len - 1 - salt_len - 1;
15656
15657 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15658
15659 digest[0] = hex_to_uint (&hash_pos[ 0]);
15660 digest[1] = hex_to_uint (&hash_pos[ 8]);
15661 digest[2] = hex_to_uint (&hash_pos[16]);
15662 digest[3] = hex_to_uint (&hash_pos[24]);
15663 digest[4] = hex_to_uint (&hash_pos[32]);
15664
15665 digest[0] -= SHA1M_A;
15666 digest[1] -= SHA1M_B;
15667 digest[2] -= SHA1M_C;
15668 digest[3] -= SHA1M_D;
15669 digest[4] -= SHA1M_E;
15670
15671 char *salt_buf_ptr = (char *) salt->salt_buf;
15672
15673 memcpy (salt_buf_ptr, salt_pos, salt_len);
15674
15675 salt->salt_len = salt_len;
15676
15677 return (PARSER_OK);
15678 }
15679
15680 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15681 {
15682 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15683
15684 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15685
15686 uint32_t *digest = (uint32_t *) hash_buf->digest;
15687
15688 salt_t *salt = hash_buf->salt;
15689
15690 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15691
15692 /**
15693 * parse line
15694 */
15695
15696 char *iter_pos = input_buf + 14;
15697
15698 const int iter = atoi (iter_pos);
15699
15700 if (iter < 1) return (PARSER_SALT_ITERATION);
15701
15702 salt->salt_iter = iter - 1;
15703
15704 char *salt_pos = strchr (iter_pos, '$');
15705
15706 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15707
15708 salt_pos++;
15709
15710 char *hash_pos = strchr (salt_pos, '$');
15711
15712 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15713
15714 const uint salt_len = hash_pos - salt_pos;
15715
15716 hash_pos++;
15717
15718 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15719
15720 memcpy (salt_buf_ptr, salt_pos, salt_len);
15721
15722 salt->salt_len = salt_len;
15723
15724 salt_buf_ptr[salt_len + 3] = 0x01;
15725 salt_buf_ptr[salt_len + 4] = 0x80;
15726
15727 // add some stuff to normal salt to make sorted happy
15728
15729 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15730 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15731 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15732 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15733 salt->salt_buf[4] = salt->salt_iter;
15734
15735 // base64 decode hash
15736
15737 char tmp_buf[100];
15738
15739 memset (tmp_buf, 0, sizeof (tmp_buf));
15740
15741 uint hash_len = input_len - (hash_pos - input_buf);
15742
15743 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15744
15745 base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf);
15746
15747 memcpy (digest, tmp_buf, 32);
15748
15749 digest[0] = byte_swap_32 (digest[0]);
15750 digest[1] = byte_swap_32 (digest[1]);
15751 digest[2] = byte_swap_32 (digest[2]);
15752 digest[3] = byte_swap_32 (digest[3]);
15753 digest[4] = byte_swap_32 (digest[4]);
15754 digest[5] = byte_swap_32 (digest[5]);
15755 digest[6] = byte_swap_32 (digest[6]);
15756 digest[7] = byte_swap_32 (digest[7]);
15757
15758 return (PARSER_OK);
15759 }
15760
15761 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15762 {
15763 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15764
15765 uint32_t *digest = (uint32_t *) hash_buf->digest;
15766
15767 salt_t *salt = hash_buf->salt;
15768
15769 digest[0] = hex_to_uint (&input_buf[ 0]);
15770 digest[1] = hex_to_uint (&input_buf[ 8]);
15771 digest[2] = 0;
15772 digest[3] = 0;
15773
15774 digest[0] = byte_swap_32 (digest[0]);
15775 digest[1] = byte_swap_32 (digest[1]);
15776
15777 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15778 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15779 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15780
15781 char iter_c = input_buf[17];
15782 char iter_d = input_buf[19];
15783
15784 // atm only defaults, let's see if there's more request
15785 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15786 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15787
15788 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15789
15790 salt->salt_buf[0] = hex_to_uint (&salt_buf[ 0]);
15791 salt->salt_buf[1] = hex_to_uint (&salt_buf[ 8]);
15792 salt->salt_buf[2] = hex_to_uint (&salt_buf[16]);
15793 salt->salt_buf[3] = hex_to_uint (&salt_buf[24]);
15794
15795 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15796 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15797 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15798 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15799
15800 salt->salt_len = 16;
15801
15802 return (PARSER_OK);
15803 }
15804
15805 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15806 {
15807 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15808
15809 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15810
15811 uint32_t *digest = (uint32_t *) hash_buf->digest;
15812
15813 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15814
15815 salt_t *salt = hash_buf->salt;
15816
15817 char *salt_pos = input_buf + 10;
15818
15819 char *hash_pos = strchr (salt_pos, '$');
15820
15821 uint salt_len = hash_pos - salt_pos;
15822
15823 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15824
15825 hash_pos++;
15826
15827 uint hash_len = input_len - 10 - salt_len - 1;
15828
15829 // base64 decode salt
15830
15831 char tmp_buf[100];
15832
15833 memset (tmp_buf, 0, sizeof (tmp_buf));
15834
15835 salt_len = base64_decode (base64_to_int, salt_pos, salt_len, tmp_buf);
15836
15837 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15838
15839 tmp_buf[salt_len] = 0x80;
15840
15841 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15842
15843 salt->salt_len = salt_len;
15844
15845 // base64 decode salt
15846
15847 memset (tmp_buf, 0, sizeof (tmp_buf));
15848
15849 hash_len = base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf);
15850
15851 uint user_len = hash_len - 32;
15852
15853 char *tmp_hash = tmp_buf + user_len;
15854
15855 user_len--; // skip the trailing space
15856
15857 digest[0] = hex_to_uint (&tmp_hash[ 0]);
15858 digest[1] = hex_to_uint (&tmp_hash[ 8]);
15859 digest[2] = hex_to_uint (&tmp_hash[16]);
15860 digest[3] = hex_to_uint (&tmp_hash[24]);
15861
15862 digest[0] = byte_swap_32 (digest[0]);
15863 digest[1] = byte_swap_32 (digest[1]);
15864 digest[2] = byte_swap_32 (digest[2]);
15865 digest[3] = byte_swap_32 (digest[3]);
15866
15867 // store username for host only (output hash if cracked)
15868
15869 memset (cram_md5->user, 0, sizeof (cram_md5->user));
15870 memcpy (cram_md5->user, tmp_buf, user_len);
15871
15872 return (PARSER_OK);
15873 }
15874
15875 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15876 {
15877 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
15878
15879 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15880
15881 uint32_t *digest = (uint32_t *) hash_buf->digest;
15882
15883 salt_t *salt = hash_buf->salt;
15884
15885 char *iter_pos = input_buf + 10;
15886
15887 uint32_t iter = atoi (iter_pos);
15888
15889 if (iter < 1)
15890 {
15891 return (PARSER_SALT_ITERATION);
15892 }
15893
15894 iter--; // first iteration is special
15895
15896 salt->salt_iter = iter;
15897
15898 char *base64_pos = strchr (iter_pos, '}');
15899
15900 if (base64_pos == NULL)
15901 {
15902 return (PARSER_SIGNATURE_UNMATCHED);
15903 }
15904
15905 base64_pos++;
15906
15907 // base64 decode salt
15908
15909 uint32_t base64_len = input_len - (base64_pos - input_buf);
15910
15911 char tmp_buf[100];
15912
15913 memset (tmp_buf, 0, sizeof (tmp_buf));
15914
15915 uint32_t decoded_len = base64_decode (base64_to_int, base64_pos, base64_len, tmp_buf);
15916
15917 if (decoded_len < 24)
15918 {
15919 return (PARSER_SALT_LENGTH);
15920 }
15921
15922 // copy the salt
15923
15924 uint salt_len = decoded_len - 20;
15925
15926 if (salt_len < 4) return (PARSER_SALT_LENGTH);
15927 if (salt_len > 16) return (PARSER_SALT_LENGTH);
15928
15929 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
15930
15931 salt->salt_len = salt_len;
15932
15933 // set digest
15934
15935 uint32_t *digest_ptr = (uint32_t*) tmp_buf;
15936
15937 digest[0] = byte_swap_32 (digest_ptr[0]);
15938 digest[1] = byte_swap_32 (digest_ptr[1]);
15939 digest[2] = byte_swap_32 (digest_ptr[2]);
15940 digest[3] = byte_swap_32 (digest_ptr[3]);
15941 digest[4] = byte_swap_32 (digest_ptr[4]);
15942
15943 return (PARSER_OK);
15944 }
15945
15946 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15947 {
15948 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
15949
15950 uint32_t *digest = (uint32_t *) hash_buf->digest;
15951
15952 salt_t *salt = hash_buf->salt;
15953
15954 digest[0] = hex_to_uint (&input_buf[ 0]);
15955 digest[1] = hex_to_uint (&input_buf[ 8]);
15956 digest[2] = hex_to_uint (&input_buf[16]);
15957 digest[3] = hex_to_uint (&input_buf[24]);
15958 digest[4] = hex_to_uint (&input_buf[32]);
15959
15960 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15961
15962 uint salt_len = input_len - 40 - 1;
15963
15964 char *salt_buf = input_buf + 40 + 1;
15965
15966 char *salt_buf_ptr = (char *) salt->salt_buf;
15967
15968 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15969
15970 if (salt_len != 32) return (PARSER_SALT_LENGTH);
15971
15972 salt->salt_len = salt_len;
15973
15974 return (PARSER_OK);
15975 }
15976
15977 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15978 {
15979 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
15980
15981 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15982
15983 uint32_t *digest = (uint32_t *) hash_buf->digest;
15984
15985 salt_t *salt = hash_buf->salt;
15986
15987 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
15988
15989 /**
15990 * parse line
15991 */
15992
15993 char *V_pos = input_buf + 5;
15994
15995 char *R_pos = strchr (V_pos, '*');
15996
15997 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15998
15999 uint32_t V_len = R_pos - V_pos;
16000
16001 R_pos++;
16002
16003 char *bits_pos = strchr (R_pos, '*');
16004
16005 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16006
16007 uint32_t R_len = bits_pos - R_pos;
16008
16009 bits_pos++;
16010
16011 char *P_pos = strchr (bits_pos, '*');
16012
16013 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16014
16015 uint32_t bits_len = P_pos - bits_pos;
16016
16017 P_pos++;
16018
16019 char *enc_md_pos = strchr (P_pos, '*');
16020
16021 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16022
16023 uint32_t P_len = enc_md_pos - P_pos;
16024
16025 enc_md_pos++;
16026
16027 char *id_len_pos = strchr (enc_md_pos, '*');
16028
16029 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16030
16031 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16032
16033 id_len_pos++;
16034
16035 char *id_buf_pos = strchr (id_len_pos, '*');
16036
16037 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16038
16039 uint32_t id_len_len = id_buf_pos - id_len_pos;
16040
16041 id_buf_pos++;
16042
16043 char *u_len_pos = strchr (id_buf_pos, '*');
16044
16045 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16046
16047 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16048
16049 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16050
16051 u_len_pos++;
16052
16053 char *u_buf_pos = strchr (u_len_pos, '*');
16054
16055 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16056
16057 uint32_t u_len_len = u_buf_pos - u_len_pos;
16058
16059 u_buf_pos++;
16060
16061 char *o_len_pos = strchr (u_buf_pos, '*');
16062
16063 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16064
16065 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16066
16067 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16068
16069 o_len_pos++;
16070
16071 char *o_buf_pos = strchr (o_len_pos, '*');
16072
16073 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16074
16075 uint32_t o_len_len = o_buf_pos - o_len_pos;
16076
16077 o_buf_pos++;
16078
16079 uint32_t o_buf_len = input_len - 5 - V_len - 1 - R_len - 1 - bits_len - 1 - P_len - 1 - enc_md_len - 1 - id_len_len - 1 - id_buf_len - 1 - u_len_len - 1 - u_buf_len - 1 - o_len_len - 1;
16080
16081 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16082
16083 // validate data
16084
16085 const int V = atoi (V_pos);
16086 const int R = atoi (R_pos);
16087 const int P = atoi (P_pos);
16088
16089 if (V != 1) return (PARSER_SALT_VALUE);
16090 if (R != 2) return (PARSER_SALT_VALUE);
16091
16092 const int enc_md = atoi (enc_md_pos);
16093
16094 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16095
16096 const int id_len = atoi (id_len_pos);
16097 const int u_len = atoi (u_len_pos);
16098 const int o_len = atoi (o_len_pos);
16099
16100 if (id_len != 16) return (PARSER_SALT_VALUE);
16101 if (u_len != 32) return (PARSER_SALT_VALUE);
16102 if (o_len != 32) return (PARSER_SALT_VALUE);
16103
16104 const int bits = atoi (bits_pos);
16105
16106 if (bits != 40) return (PARSER_SALT_VALUE);
16107
16108 // copy data to esalt
16109
16110 pdf->V = V;
16111 pdf->R = R;
16112 pdf->P = P;
16113
16114 pdf->enc_md = enc_md;
16115
16116 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16117 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16118 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16119 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16120 pdf->id_len = id_len;
16121
16122 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16123 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16124 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16125 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16126 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16127 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16128 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16129 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16130 pdf->u_len = u_len;
16131
16132 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16133 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16134 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16135 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16136 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16137 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16138 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16139 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16140 pdf->o_len = o_len;
16141
16142 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16143 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16144 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16145 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16146
16147 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16148 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16149 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16150 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16151 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16152 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16153 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16154 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16155
16156 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16157 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16158 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16159 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16160 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16161 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16162 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16163 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16164
16165 // we use ID for salt, maybe needs to change, we will see...
16166
16167 salt->salt_buf[0] = pdf->id_buf[0];
16168 salt->salt_buf[1] = pdf->id_buf[1];
16169 salt->salt_buf[2] = pdf->id_buf[2];
16170 salt->salt_buf[3] = pdf->id_buf[3];
16171 salt->salt_len = pdf->id_len;
16172
16173 digest[0] = pdf->u_buf[0];
16174 digest[1] = pdf->u_buf[1];
16175 digest[2] = pdf->u_buf[2];
16176 digest[3] = pdf->u_buf[3];
16177
16178 return (PARSER_OK);
16179 }
16180
16181 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16182 {
16183 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16184 }
16185
16186 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16187 {
16188 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16189
16190 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16191
16192 uint32_t *digest = (uint32_t *) hash_buf->digest;
16193
16194 salt_t *salt = hash_buf->salt;
16195
16196 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16197
16198 /**
16199 * parse line
16200 */
16201
16202 char *V_pos = input_buf + 5;
16203
16204 char *R_pos = strchr (V_pos, '*');
16205
16206 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16207
16208 uint32_t V_len = R_pos - V_pos;
16209
16210 R_pos++;
16211
16212 char *bits_pos = strchr (R_pos, '*');
16213
16214 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16215
16216 uint32_t R_len = bits_pos - R_pos;
16217
16218 bits_pos++;
16219
16220 char *P_pos = strchr (bits_pos, '*');
16221
16222 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16223
16224 uint32_t bits_len = P_pos - bits_pos;
16225
16226 P_pos++;
16227
16228 char *enc_md_pos = strchr (P_pos, '*');
16229
16230 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16231
16232 uint32_t P_len = enc_md_pos - P_pos;
16233
16234 enc_md_pos++;
16235
16236 char *id_len_pos = strchr (enc_md_pos, '*');
16237
16238 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16239
16240 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16241
16242 id_len_pos++;
16243
16244 char *id_buf_pos = strchr (id_len_pos, '*');
16245
16246 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16247
16248 uint32_t id_len_len = id_buf_pos - id_len_pos;
16249
16250 id_buf_pos++;
16251
16252 char *u_len_pos = strchr (id_buf_pos, '*');
16253
16254 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16255
16256 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16257
16258 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16259
16260 u_len_pos++;
16261
16262 char *u_buf_pos = strchr (u_len_pos, '*');
16263
16264 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16265
16266 uint32_t u_len_len = u_buf_pos - u_len_pos;
16267
16268 u_buf_pos++;
16269
16270 char *o_len_pos = strchr (u_buf_pos, '*');
16271
16272 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16273
16274 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16275
16276 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16277
16278 o_len_pos++;
16279
16280 char *o_buf_pos = strchr (o_len_pos, '*');
16281
16282 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16283
16284 uint32_t o_len_len = o_buf_pos - o_len_pos;
16285
16286 o_buf_pos++;
16287
16288 char *rc4key_pos = strchr (o_buf_pos, ':');
16289
16290 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16291
16292 uint32_t o_buf_len = rc4key_pos - o_buf_pos;
16293
16294 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16295
16296 rc4key_pos++;
16297
16298 uint32_t rc4key_len = input_len - 5 - V_len - 1 - R_len - 1 - bits_len - 1 - P_len - 1 - enc_md_len - 1 - id_len_len - 1 - id_buf_len - 1 - u_len_len - 1 - u_buf_len - 1 - o_len_len - 1 - o_buf_len - 1;
16299
16300 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16301
16302 // validate data
16303
16304 const int V = atoi (V_pos);
16305 const int R = atoi (R_pos);
16306 const int P = atoi (P_pos);
16307
16308 if (V != 1) return (PARSER_SALT_VALUE);
16309 if (R != 2) return (PARSER_SALT_VALUE);
16310
16311 const int enc_md = atoi (enc_md_pos);
16312
16313 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16314
16315 const int id_len = atoi (id_len_pos);
16316 const int u_len = atoi (u_len_pos);
16317 const int o_len = atoi (o_len_pos);
16318
16319 if (id_len != 16) return (PARSER_SALT_VALUE);
16320 if (u_len != 32) return (PARSER_SALT_VALUE);
16321 if (o_len != 32) return (PARSER_SALT_VALUE);
16322
16323 const int bits = atoi (bits_pos);
16324
16325 if (bits != 40) return (PARSER_SALT_VALUE);
16326
16327 // copy data to esalt
16328
16329 pdf->V = V;
16330 pdf->R = R;
16331 pdf->P = P;
16332
16333 pdf->enc_md = enc_md;
16334
16335 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16336 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16337 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16338 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16339 pdf->id_len = id_len;
16340
16341 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16342 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16343 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16344 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16345 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16346 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16347 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16348 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16349 pdf->u_len = u_len;
16350
16351 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16352 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16353 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16354 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16355 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16356 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16357 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16358 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16359 pdf->o_len = o_len;
16360
16361 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16362 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16363 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16364 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16365
16366 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16367 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16368 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16369 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16370 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16371 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16372 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16373 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16374
16375 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16376 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16377 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16378 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16379 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16380 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16381 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16382 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16383
16384 pdf->rc4key[1] = 0;
16385 pdf->rc4key[0] = 0;
16386
16387 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16388 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16389 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16390 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16391 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16392 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16393 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16394 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16395 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16396 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16397
16398 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16399 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16400
16401 // we use ID for salt, maybe needs to change, we will see...
16402
16403 salt->salt_buf[0] = pdf->id_buf[0];
16404 salt->salt_buf[1] = pdf->id_buf[1];
16405 salt->salt_buf[2] = pdf->id_buf[2];
16406 salt->salt_buf[3] = pdf->id_buf[3];
16407 salt->salt_buf[4] = pdf->u_buf[0];
16408 salt->salt_buf[5] = pdf->u_buf[1];
16409 salt->salt_buf[6] = pdf->o_buf[0];
16410 salt->salt_buf[7] = pdf->o_buf[1];
16411 salt->salt_len = pdf->id_len + 16;
16412
16413 digest[0] = pdf->rc4key[0];
16414 digest[1] = pdf->rc4key[1];
16415 digest[2] = 0;
16416 digest[3] = 0;
16417
16418 return (PARSER_OK);
16419 }
16420
16421 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16422 {
16423 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16424
16425 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16426
16427 uint32_t *digest = (uint32_t *) hash_buf->digest;
16428
16429 salt_t *salt = hash_buf->salt;
16430
16431 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16432
16433 /**
16434 * parse line
16435 */
16436
16437 char *V_pos = input_buf + 5;
16438
16439 char *R_pos = strchr (V_pos, '*');
16440
16441 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16442
16443 uint32_t V_len = R_pos - V_pos;
16444
16445 R_pos++;
16446
16447 char *bits_pos = strchr (R_pos, '*');
16448
16449 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16450
16451 uint32_t R_len = bits_pos - R_pos;
16452
16453 bits_pos++;
16454
16455 char *P_pos = strchr (bits_pos, '*');
16456
16457 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16458
16459 uint32_t bits_len = P_pos - bits_pos;
16460
16461 P_pos++;
16462
16463 char *enc_md_pos = strchr (P_pos, '*');
16464
16465 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16466
16467 uint32_t P_len = enc_md_pos - P_pos;
16468
16469 enc_md_pos++;
16470
16471 char *id_len_pos = strchr (enc_md_pos, '*');
16472
16473 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16474
16475 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16476
16477 id_len_pos++;
16478
16479 char *id_buf_pos = strchr (id_len_pos, '*');
16480
16481 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16482
16483 uint32_t id_len_len = id_buf_pos - id_len_pos;
16484
16485 id_buf_pos++;
16486
16487 char *u_len_pos = strchr (id_buf_pos, '*');
16488
16489 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16490
16491 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16492
16493 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16494
16495 u_len_pos++;
16496
16497 char *u_buf_pos = strchr (u_len_pos, '*');
16498
16499 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16500
16501 uint32_t u_len_len = u_buf_pos - u_len_pos;
16502
16503 u_buf_pos++;
16504
16505 char *o_len_pos = strchr (u_buf_pos, '*');
16506
16507 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16508
16509 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16510
16511 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16512
16513 o_len_pos++;
16514
16515 char *o_buf_pos = strchr (o_len_pos, '*');
16516
16517 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16518
16519 uint32_t o_len_len = o_buf_pos - o_len_pos;
16520
16521 o_buf_pos++;
16522
16523 uint32_t o_buf_len = input_len - 5 - V_len - 1 - R_len - 1 - bits_len - 1 - P_len - 1 - enc_md_len - 1 - id_len_len - 1 - id_buf_len - 1 - u_len_len - 1 - u_buf_len - 1 - o_len_len - 1;
16524
16525 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16526
16527 // validate data
16528
16529 const int V = atoi (V_pos);
16530 const int R = atoi (R_pos);
16531 const int P = atoi (P_pos);
16532
16533 int vr_ok = 0;
16534
16535 if ((V == 2) && (R == 3)) vr_ok = 1;
16536 if ((V == 4) && (R == 4)) vr_ok = 1;
16537
16538 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16539
16540 const int id_len = atoi (id_len_pos);
16541 const int u_len = atoi (u_len_pos);
16542 const int o_len = atoi (o_len_pos);
16543
16544 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16545
16546 if (u_len != 32) return (PARSER_SALT_VALUE);
16547 if (o_len != 32) return (PARSER_SALT_VALUE);
16548
16549 const int bits = atoi (bits_pos);
16550
16551 if (bits != 128) return (PARSER_SALT_VALUE);
16552
16553 int enc_md = 1;
16554
16555 if (R >= 4)
16556 {
16557 enc_md = atoi (enc_md_pos);
16558 }
16559
16560 // copy data to esalt
16561
16562 pdf->V = V;
16563 pdf->R = R;
16564 pdf->P = P;
16565
16566 pdf->enc_md = enc_md;
16567
16568 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16569 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16570 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16571 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16572
16573 if (id_len == 32)
16574 {
16575 pdf->id_buf[4] = hex_to_uint (&id_buf_pos[32]);
16576 pdf->id_buf[5] = hex_to_uint (&id_buf_pos[40]);
16577 pdf->id_buf[6] = hex_to_uint (&id_buf_pos[48]);
16578 pdf->id_buf[7] = hex_to_uint (&id_buf_pos[56]);
16579 }
16580
16581 pdf->id_len = id_len;
16582
16583 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16584 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16585 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16586 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16587 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16588 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16589 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16590 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16591 pdf->u_len = u_len;
16592
16593 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16594 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16595 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16596 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16597 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16598 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16599 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16600 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16601 pdf->o_len = o_len;
16602
16603 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16604 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16605 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16606 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16607
16608 if (id_len == 32)
16609 {
16610 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16611 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16612 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16613 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16614 }
16615
16616 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16617 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16618 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16619 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16620 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16621 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16622 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16623 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16624
16625 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16626 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16627 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16628 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16629 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16630 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16631 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16632 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16633
16634 // precompute rc4 data for later use
16635
16636 uint padding[8] =
16637 {
16638 0x5e4ebf28,
16639 0x418a754e,
16640 0x564e0064,
16641 0x0801faff,
16642 0xb6002e2e,
16643 0x803e68d0,
16644 0xfea90c2f,
16645 0x7a695364
16646 };
16647
16648 // md5
16649
16650 uint salt_pc_block[32];
16651
16652 char *salt_pc_ptr = (char *) salt_pc_block;
16653
16654 memcpy (salt_pc_ptr, padding, 32);
16655 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16656
16657 uint salt_pc_digest[4];
16658
16659 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16660
16661 pdf->rc4data[0] = salt_pc_digest[0];
16662 pdf->rc4data[1] = salt_pc_digest[1];
16663
16664 // we use ID for salt, maybe needs to change, we will see...
16665
16666 salt->salt_buf[0] = pdf->id_buf[0];
16667 salt->salt_buf[1] = pdf->id_buf[1];
16668 salt->salt_buf[2] = pdf->id_buf[2];
16669 salt->salt_buf[3] = pdf->id_buf[3];
16670 salt->salt_buf[4] = pdf->u_buf[0];
16671 salt->salt_buf[5] = pdf->u_buf[1];
16672 salt->salt_buf[6] = pdf->o_buf[0];
16673 salt->salt_buf[7] = pdf->o_buf[1];
16674 salt->salt_len = pdf->id_len + 16;
16675
16676 salt->salt_iter = ROUNDS_PDF14;
16677
16678 digest[0] = pdf->u_buf[0];
16679 digest[1] = pdf->u_buf[1];
16680 digest[2] = 0;
16681 digest[3] = 0;
16682
16683 return (PARSER_OK);
16684 }
16685
16686 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16687 {
16688 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16689
16690 if (ret != PARSER_OK)
16691 {
16692 return ret;
16693 }
16694
16695 uint32_t *digest = (uint32_t *) hash_buf->digest;
16696
16697 salt_t *salt = hash_buf->salt;
16698
16699 digest[0] -= SHA256M_A;
16700 digest[1] -= SHA256M_B;
16701 digest[2] -= SHA256M_C;
16702 digest[3] -= SHA256M_D;
16703 digest[4] -= SHA256M_E;
16704 digest[5] -= SHA256M_F;
16705 digest[6] -= SHA256M_G;
16706 digest[7] -= SHA256M_H;
16707
16708 salt->salt_buf[2] = 0x80;
16709
16710 return (PARSER_OK);
16711 }
16712
16713 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16714 {
16715 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16716
16717 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16718
16719 uint32_t *digest = (uint32_t *) hash_buf->digest;
16720
16721 salt_t *salt = hash_buf->salt;
16722
16723 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16724
16725 /**
16726 * parse line
16727 */
16728
16729 char *V_pos = input_buf + 5;
16730
16731 char *R_pos = strchr (V_pos, '*');
16732
16733 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16734
16735 uint32_t V_len = R_pos - V_pos;
16736
16737 R_pos++;
16738
16739 char *bits_pos = strchr (R_pos, '*');
16740
16741 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16742
16743 uint32_t R_len = bits_pos - R_pos;
16744
16745 bits_pos++;
16746
16747 char *P_pos = strchr (bits_pos, '*');
16748
16749 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16750
16751 uint32_t bits_len = P_pos - bits_pos;
16752
16753 P_pos++;
16754
16755 char *enc_md_pos = strchr (P_pos, '*');
16756
16757 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16758
16759 uint32_t P_len = enc_md_pos - P_pos;
16760
16761 enc_md_pos++;
16762
16763 char *id_len_pos = strchr (enc_md_pos, '*');
16764
16765 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16766
16767 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16768
16769 id_len_pos++;
16770
16771 char *id_buf_pos = strchr (id_len_pos, '*');
16772
16773 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16774
16775 uint32_t id_len_len = id_buf_pos - id_len_pos;
16776
16777 id_buf_pos++;
16778
16779 char *u_len_pos = strchr (id_buf_pos, '*');
16780
16781 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16782
16783 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16784
16785 u_len_pos++;
16786
16787 char *u_buf_pos = strchr (u_len_pos, '*');
16788
16789 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16790
16791 uint32_t u_len_len = u_buf_pos - u_len_pos;
16792
16793 u_buf_pos++;
16794
16795 char *o_len_pos = strchr (u_buf_pos, '*');
16796
16797 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16798
16799 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16800
16801 o_len_pos++;
16802
16803 char *o_buf_pos = strchr (o_len_pos, '*');
16804
16805 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16806
16807 uint32_t o_len_len = o_buf_pos - o_len_pos;
16808
16809 o_buf_pos++;
16810
16811 char *last = strchr (o_buf_pos, '*');
16812
16813 if (last == NULL) last = input_buf + input_len;
16814
16815 uint32_t o_buf_len = last - o_buf_pos;
16816
16817 // validate data
16818
16819 const int V = atoi (V_pos);
16820 const int R = atoi (R_pos);
16821
16822 int vr_ok = 0;
16823
16824 if ((V == 5) && (R == 5)) vr_ok = 1;
16825 if ((V == 5) && (R == 6)) vr_ok = 1;
16826
16827 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16828
16829 const int bits = atoi (bits_pos);
16830
16831 if (bits != 256) return (PARSER_SALT_VALUE);
16832
16833 int enc_md = atoi (enc_md_pos);
16834
16835 if (enc_md != 1) return (PARSER_SALT_VALUE);
16836
16837 const uint id_len = atoi (id_len_pos);
16838 const uint u_len = atoi (u_len_pos);
16839 const uint o_len = atoi (o_len_pos);
16840
16841 if (V_len > 6) return (PARSER_SALT_LENGTH);
16842 if (R_len > 6) return (PARSER_SALT_LENGTH);
16843 if (P_len > 6) return (PARSER_SALT_LENGTH);
16844 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16845 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16846 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16847 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16848 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
16849
16850 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
16851 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
16852 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
16853
16854 // copy data to esalt
16855
16856 if (u_len < 40) return (PARSER_SALT_VALUE);
16857
16858 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
16859 {
16860 pdf->u_buf[i] = hex_to_uint (&u_buf_pos[j]);
16861 }
16862
16863 salt->salt_buf[0] = pdf->u_buf[8];
16864 salt->salt_buf[1] = pdf->u_buf[9];
16865
16866 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16867 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16868
16869 salt->salt_len = 8;
16870 salt->salt_iter = ROUNDS_PDF17L8;
16871
16872 digest[0] = pdf->u_buf[0];
16873 digest[1] = pdf->u_buf[1];
16874 digest[2] = pdf->u_buf[2];
16875 digest[3] = pdf->u_buf[3];
16876 digest[4] = pdf->u_buf[4];
16877 digest[5] = pdf->u_buf[5];
16878 digest[6] = pdf->u_buf[6];
16879 digest[7] = pdf->u_buf[7];
16880
16881 return (PARSER_OK);
16882 }
16883
16884 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16885 {
16886 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
16887
16888 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
16889
16890 uint32_t *digest = (uint32_t *) hash_buf->digest;
16891
16892 salt_t *salt = hash_buf->salt;
16893
16894 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16895
16896 /**
16897 * parse line
16898 */
16899
16900 // iterations
16901
16902 char *iter_pos = input_buf + 7;
16903
16904 uint32_t iter = atoi (iter_pos);
16905
16906 if (iter < 1) return (PARSER_SALT_ITERATION);
16907 if (iter > 999999) return (PARSER_SALT_ITERATION);
16908
16909 // first is *raw* salt
16910
16911 char *salt_pos = strchr (iter_pos, ':');
16912
16913 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16914
16915 salt_pos++;
16916
16917 char *hash_pos = strchr (salt_pos, ':');
16918
16919 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16920
16921 uint32_t salt_len = hash_pos - salt_pos;
16922
16923 if (salt_len > 64) return (PARSER_SALT_LENGTH);
16924
16925 hash_pos++;
16926
16927 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
16928
16929 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
16930
16931 // decode salt
16932
16933 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16934
16935 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
16936
16937 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
16938
16939 salt_buf_ptr[salt_len + 3] = 0x01;
16940 salt_buf_ptr[salt_len + 4] = 0x80;
16941
16942 salt->salt_len = salt_len;
16943 salt->salt_iter = iter - 1;
16944
16945 // decode hash
16946
16947 char tmp_buf[100];
16948
16949 memset (tmp_buf, 0, sizeof (tmp_buf));
16950
16951 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
16952
16953 if (hash_len < 16) return (PARSER_HASH_LENGTH);
16954
16955 memcpy (digest, tmp_buf, 16);
16956
16957 digest[0] = byte_swap_32 (digest[0]);
16958 digest[1] = byte_swap_32 (digest[1]);
16959 digest[2] = byte_swap_32 (digest[2]);
16960 digest[3] = byte_swap_32 (digest[3]);
16961
16962 // add some stuff to normal salt to make sorted happy
16963
16964 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16965 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16966 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16967 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16968 salt->salt_buf[4] = salt->salt_iter;
16969
16970 return (PARSER_OK);
16971 }
16972
16973 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16974 {
16975 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
16976
16977 uint32_t *digest = (uint32_t *) hash_buf->digest;
16978
16979 salt_t *salt = hash_buf->salt;
16980
16981 digest[0] = hex_to_uint (&input_buf[ 0]);
16982 digest[1] = hex_to_uint (&input_buf[ 8]);
16983 digest[2] = hex_to_uint (&input_buf[16]);
16984 digest[3] = hex_to_uint (&input_buf[24]);
16985
16986 digest[0] = byte_swap_32 (digest[0]);
16987 digest[1] = byte_swap_32 (digest[1]);
16988 digest[2] = byte_swap_32 (digest[2]);
16989 digest[3] = byte_swap_32 (digest[3]);
16990
16991 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16992
16993 uint salt_len = input_len - 32 - 1;
16994
16995 char *salt_buf = input_buf + 32 + 1;
16996
16997 char *salt_buf_ptr = (char *) salt->salt_buf;
16998
16999 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17000
17001 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17002
17003 salt->salt_len = salt_len;
17004
17005 return (PARSER_OK);
17006 }
17007
17008 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17009 {
17010 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17011
17012 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17013
17014 uint32_t *digest = (uint32_t *) hash_buf->digest;
17015
17016 salt_t *salt = hash_buf->salt;
17017
17018 char *user_pos = input_buf + 10;
17019
17020 char *salt_pos = strchr (user_pos, '*');
17021
17022 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17023
17024 salt_pos++;
17025
17026 char *hash_pos = strchr (salt_pos, '*');
17027
17028 hash_pos++;
17029
17030 uint hash_len = input_len - (hash_pos - input_buf);
17031
17032 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17033
17034 uint user_len = salt_pos - user_pos - 1;
17035
17036 uint salt_len = hash_pos - salt_pos - 1;
17037
17038 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17039
17040 /*
17041 * store digest
17042 */
17043
17044 digest[0] = hex_to_uint (&hash_pos[ 0]);
17045 digest[1] = hex_to_uint (&hash_pos[ 8]);
17046 digest[2] = hex_to_uint (&hash_pos[16]);
17047 digest[3] = hex_to_uint (&hash_pos[24]);
17048
17049 digest[0] = byte_swap_32 (digest[0]);
17050 digest[1] = byte_swap_32 (digest[1]);
17051 digest[2] = byte_swap_32 (digest[2]);
17052 digest[3] = byte_swap_32 (digest[3]);
17053
17054 digest[0] -= MD5M_A;
17055 digest[1] -= MD5M_B;
17056 digest[2] -= MD5M_C;
17057 digest[3] -= MD5M_D;
17058
17059 /*
17060 * store salt
17061 */
17062
17063 char *salt_buf_ptr = (char *) salt->salt_buf;
17064
17065 // first 4 bytes are the "challenge"
17066
17067 salt_buf_ptr[0] = hex_to_char (&salt_pos[0]);
17068 salt_buf_ptr[1] = hex_to_char (&salt_pos[2]);
17069 salt_buf_ptr[2] = hex_to_char (&salt_pos[4]);
17070 salt_buf_ptr[3] = hex_to_char (&salt_pos[6]);
17071
17072 // append the user name
17073
17074 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17075
17076 salt->salt_len = 4 + user_len;
17077
17078 return (PARSER_OK);
17079 }
17080
17081 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17082 {
17083 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17084
17085 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17086
17087 uint32_t *digest = (uint32_t *) hash_buf->digest;
17088
17089 salt_t *salt = hash_buf->salt;
17090
17091 char *salt_pos = input_buf + 9;
17092
17093 char *hash_pos = strchr (salt_pos, '*');
17094
17095 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17096
17097 hash_pos++;
17098
17099 uint hash_len = input_len - (hash_pos - input_buf);
17100
17101 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17102
17103 uint salt_len = hash_pos - salt_pos - 1;
17104
17105 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17106
17107 /*
17108 * store digest
17109 */
17110
17111 digest[0] = hex_to_uint (&hash_pos[ 0]);
17112 digest[1] = hex_to_uint (&hash_pos[ 8]);
17113 digest[2] = hex_to_uint (&hash_pos[16]);
17114 digest[3] = hex_to_uint (&hash_pos[24]);
17115 digest[4] = hex_to_uint (&hash_pos[32]);
17116
17117 /*
17118 * store salt
17119 */
17120
17121 char *salt_buf_ptr = (char *) salt->salt_buf;
17122
17123 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17124
17125 salt->salt_len = salt_len;
17126
17127 return (PARSER_OK);
17128 }
17129
17130 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17131 {
17132 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17133
17134 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17135
17136 uint32_t *digest = (uint32_t *) hash_buf->digest;
17137
17138 salt_t *salt = hash_buf->salt;
17139
17140 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17141
17142 /**
17143 * parse line
17144 */
17145
17146 char *cry_master_len_pos = input_buf + 9;
17147
17148 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17149
17150 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17151
17152 uint32_t cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17153
17154 cry_master_buf_pos++;
17155
17156 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17157
17158 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17159
17160 uint32_t cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17161
17162 cry_salt_len_pos++;
17163
17164 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17165
17166 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17167
17168 uint32_t cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17169
17170 cry_salt_buf_pos++;
17171
17172 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17173
17174 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17175
17176 uint32_t cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17177
17178 cry_rounds_pos++;
17179
17180 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17181
17182 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17183
17184 uint32_t cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17185
17186 ckey_len_pos++;
17187
17188 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17189
17190 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17191
17192 uint32_t ckey_len_len = ckey_buf_pos - ckey_len_pos;
17193
17194 ckey_buf_pos++;
17195
17196 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17197
17198 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17199
17200 uint32_t ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17201
17202 public_key_len_pos++;
17203
17204 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17205
17206 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17207
17208 uint32_t public_key_len_len = public_key_buf_pos - public_key_len_pos;
17209
17210 public_key_buf_pos++;
17211
17212 uint32_t public_key_buf_len = input_len - 1 - 7 - 1 - cry_master_len_len - 1 - cry_master_buf_len - 1 - cry_salt_len_len - 1 - cry_salt_buf_len - 1 - cry_rounds_len - 1 - ckey_len_len - 1 - ckey_buf_len - 1 - public_key_len_len - 1;
17213
17214 const uint cry_master_len = atoi (cry_master_len_pos);
17215 const uint cry_salt_len = atoi (cry_salt_len_pos);
17216 const uint ckey_len = atoi (ckey_len_pos);
17217 const uint public_key_len = atoi (public_key_len_pos);
17218
17219 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17220 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17221 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17222 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17223
17224 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 8)
17225 {
17226 bitcoin_wallet->cry_master_buf[i] = hex_to_uint (&cry_master_buf_pos[j]);
17227
17228 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17229 }
17230
17231 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 8)
17232 {
17233 bitcoin_wallet->ckey_buf[i] = hex_to_uint (&ckey_buf_pos[j]);
17234
17235 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17236 }
17237
17238 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 8)
17239 {
17240 bitcoin_wallet->public_key_buf[i] = hex_to_uint (&public_key_buf_pos[j]);
17241
17242 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17243 }
17244
17245 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17246 bitcoin_wallet->ckey_len = ckey_len / 2;
17247 bitcoin_wallet->public_key_len = public_key_len / 2;
17248
17249 /*
17250 * store digest (should be unique enought, hopefully)
17251 */
17252
17253 digest[0] = bitcoin_wallet->cry_master_buf[0];
17254 digest[1] = bitcoin_wallet->cry_master_buf[1];
17255 digest[2] = bitcoin_wallet->cry_master_buf[2];
17256 digest[3] = bitcoin_wallet->cry_master_buf[3];
17257
17258 /*
17259 * store salt
17260 */
17261
17262 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17263
17264 const uint cry_rounds = atoi (cry_rounds_pos);
17265
17266 salt->salt_iter = cry_rounds - 1;
17267
17268 char *salt_buf_ptr = (char *) salt->salt_buf;
17269
17270 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17271
17272 salt->salt_len = salt_len;
17273
17274 return (PARSER_OK);
17275 }
17276
17277 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17278 {
17279 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17280
17281 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17282
17283 uint32_t *digest = (uint32_t *) hash_buf->digest;
17284
17285 salt_t *salt = hash_buf->salt;
17286
17287 sip_t *sip = (sip_t *) hash_buf->esalt;
17288
17289 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17290
17291 char temp_input_buf[input_len + 1];
17292
17293 memset (temp_input_buf, 0, sizeof (temp_input_buf));
17294 memcpy (temp_input_buf, input_buf, input_len);
17295
17296 // URI_server:
17297
17298 char *URI_server_pos = temp_input_buf + 6;
17299
17300 char *URI_client_pos = strchr (URI_server_pos, '*');
17301
17302 if (URI_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17303
17304 URI_client_pos[0] = 0;
17305 URI_client_pos++;
17306
17307 uint URI_server_len = strlen (URI_server_pos);
17308
17309 if (URI_server_len > 512) return (PARSER_SALT_LENGTH);
17310
17311 // URI_client:
17312
17313 char *user_pos = strchr (URI_client_pos, '*');
17314
17315 if (user_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17316
17317 user_pos[0] = 0;
17318 user_pos++;
17319
17320 uint URI_client_len = strlen (URI_client_pos);
17321
17322 if (URI_client_len > 512) return (PARSER_SALT_LENGTH);
17323
17324 // user:
17325
17326 char *realm_pos = strchr (user_pos, '*');
17327
17328 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17329
17330 realm_pos[0] = 0;
17331 realm_pos++;
17332
17333 uint user_len = strlen (user_pos);
17334
17335 if (user_len > 116) return (PARSER_SALT_LENGTH);
17336
17337 // realm:
17338
17339 char *method_pos = strchr (realm_pos, '*');
17340
17341 if (method_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17342
17343 method_pos[0] = 0;
17344 method_pos++;
17345
17346 uint realm_len = strlen (realm_pos);
17347
17348 if (realm_len > 116) return (PARSER_SALT_LENGTH);
17349
17350 // method:
17351
17352 char *URI_prefix_pos = strchr (method_pos, '*');
17353
17354 if (URI_prefix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17355
17356 URI_prefix_pos[0] = 0;
17357 URI_prefix_pos++;
17358
17359 uint method_len = strlen (method_pos);
17360
17361 if (method_len > 246) return (PARSER_SALT_LENGTH);
17362
17363 // URI_prefix:
17364
17365 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17366
17367 if (URI_resource_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17368
17369 URI_resource_pos[0] = 0;
17370 URI_resource_pos++;
17371
17372 uint URI_prefix_len = strlen (URI_prefix_pos);
17373
17374 if (URI_prefix_len > 245) return (PARSER_SALT_LENGTH);
17375
17376 // URI_resource:
17377
17378 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17379
17380 if (URI_suffix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17381
17382 URI_suffix_pos[0] = 0;
17383 URI_suffix_pos++;
17384
17385 uint URI_resource_len = strlen (URI_resource_pos);
17386
17387 if (URI_resource_len < 1) return (PARSER_SALT_LENGTH);
17388 if (URI_resource_len > 246) return (PARSER_SALT_LENGTH);
17389
17390 // URI_suffix:
17391
17392 char *nonce_pos = strchr (URI_suffix_pos, '*');
17393
17394 if (nonce_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17395
17396 nonce_pos[0] = 0;
17397 nonce_pos++;
17398
17399 uint URI_suffix_len = strlen (URI_suffix_pos);
17400
17401 if (URI_suffix_len > 245) return (PARSER_SALT_LENGTH);
17402
17403 // nonce:
17404
17405 char *nonce_client_pos = strchr (nonce_pos, '*');
17406
17407 if (nonce_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17408
17409 nonce_client_pos[0] = 0;
17410 nonce_client_pos++;
17411
17412 uint nonce_len = strlen (nonce_pos);
17413
17414 if (nonce_len < 1) return (PARSER_SALT_LENGTH);
17415 if (nonce_len > 50) return (PARSER_SALT_LENGTH);
17416
17417 // nonce_client:
17418
17419 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17420
17421 if (nonce_count_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17422
17423 nonce_count_pos[0] = 0;
17424 nonce_count_pos++;
17425
17426 uint nonce_client_len = strlen (nonce_client_pos);
17427
17428 if (nonce_client_len > 50) return (PARSER_SALT_LENGTH);
17429
17430 // nonce_count:
17431
17432 char *qop_pos = strchr (nonce_count_pos, '*');
17433
17434 if (qop_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17435
17436 qop_pos[0] = 0;
17437 qop_pos++;
17438
17439 uint nonce_count_len = strlen (nonce_count_pos);
17440
17441 if (nonce_count_len > 50) return (PARSER_SALT_LENGTH);
17442
17443 // qop:
17444
17445 char *directive_pos = strchr (qop_pos, '*');
17446
17447 if (directive_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17448
17449 directive_pos[0] = 0;
17450 directive_pos++;
17451
17452 uint qop_len = strlen (qop_pos);
17453
17454 if (qop_len > 50) return (PARSER_SALT_LENGTH);
17455
17456 // directive
17457
17458 char *digest_pos = strchr (directive_pos, '*');
17459
17460 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17461
17462 digest_pos[0] = 0;
17463 digest_pos++;
17464
17465 uint directive_len = strlen (directive_pos);
17466
17467 if (directive_len != 3) return (PARSER_SALT_LENGTH);
17468
17469 if (memcmp (directive_pos, "MD5", 3))
17470 {
17471 log_info ("ERROR: only the MD5 directive is currently supported\n");
17472
17473 return (PARSER_SIP_AUTH_DIRECTIVE);
17474 }
17475
17476 /*
17477 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17478 */
17479
17480 uint md5_len = 0;
17481
17482 uint md5_max_len = 4 * 64;
17483
17484 uint md5_remaining_len = md5_max_len;
17485
17486 uint tmp_md5_buf[md5_max_len / 4];
17487
17488 memset (tmp_md5_buf, 0, sizeof (tmp_md5_buf));
17489
17490 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17491
17492 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17493
17494 md5_len += method_len + 1;
17495 tmp_md5_ptr += method_len + 1;
17496
17497 if (URI_prefix_len > 0)
17498 {
17499 md5_remaining_len = md5_max_len - md5_len;
17500
17501 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17502
17503 md5_len += URI_prefix_len + 1;
17504 tmp_md5_ptr += URI_prefix_len + 1;
17505 }
17506
17507 md5_remaining_len = md5_max_len - md5_len;
17508
17509 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17510
17511 md5_len += URI_resource_len;
17512 tmp_md5_ptr += URI_resource_len;
17513
17514 if (URI_suffix_len > 0)
17515 {
17516 md5_remaining_len = md5_max_len - md5_len;
17517
17518 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17519
17520 md5_len += 1 + URI_suffix_len;
17521 }
17522
17523 uint tmp_digest[4];
17524
17525 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17526
17527 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17528 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17529 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17530 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17531
17532 /*
17533 * esalt
17534 */
17535
17536 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17537
17538 uint esalt_len = 0;
17539
17540 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17541
17542 // there are 2 possibilities for the esalt:
17543
17544 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17545 {
17546 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17547
17548 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17549
17550 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17551 nonce_pos,
17552 nonce_count_pos,
17553 nonce_client_pos,
17554 qop_pos,
17555 tmp_digest[0],
17556 tmp_digest[1],
17557 tmp_digest[2],
17558 tmp_digest[3]);
17559 }
17560 else
17561 {
17562 esalt_len = 1 + nonce_len + 1 + 32;
17563
17564 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17565
17566 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17567 nonce_pos,
17568 tmp_digest[0],
17569 tmp_digest[1],
17570 tmp_digest[2],
17571 tmp_digest[3]);
17572 }
17573
17574 // add 0x80 to esalt
17575
17576 esalt_buf_ptr[esalt_len] = 0x80;
17577
17578 sip->esalt_len = esalt_len;
17579
17580 /*
17581 * actual salt
17582 */
17583
17584 char *sip_salt_ptr = (char *) sip->salt_buf;
17585
17586 uint salt_len = user_len + 1 + realm_len + 1;
17587
17588 uint max_salt_len = 119;
17589
17590 if (salt_len > max_salt_len) return (PARSER_SALT_LENGTH);
17591
17592 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17593
17594 sip->salt_len = salt_len;
17595
17596 /*
17597 * fake salt (for sorting)
17598 */
17599
17600 char *salt_buf_ptr = (char *) salt->salt_buf;
17601
17602 max_salt_len = 55;
17603
17604 uint fake_salt_len = salt_len;
17605
17606 if (fake_salt_len > max_salt_len)
17607 {
17608 fake_salt_len = max_salt_len;
17609 }
17610
17611 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17612
17613 salt->salt_len = fake_salt_len;
17614
17615 /*
17616 * digest
17617 */
17618
17619 digest[0] = hex_to_uint (&digest_pos[ 0]);
17620 digest[1] = hex_to_uint (&digest_pos[ 8]);
17621 digest[2] = hex_to_uint (&digest_pos[16]);
17622 digest[3] = hex_to_uint (&digest_pos[24]);
17623
17624 digest[0] = byte_swap_32 (digest[0]);
17625 digest[1] = byte_swap_32 (digest[1]);
17626 digest[2] = byte_swap_32 (digest[2]);
17627 digest[3] = byte_swap_32 (digest[3]);
17628
17629 return (PARSER_OK);
17630 }
17631
17632 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17633 {
17634 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17635
17636 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17637
17638 uint32_t *digest = (uint32_t *) hash_buf->digest;
17639
17640 salt_t *salt = hash_buf->salt;
17641
17642 // digest
17643
17644 char *digest_pos = input_buf;
17645
17646 digest[0] = hex_to_uint (&digest_pos[0]);
17647 digest[1] = 0;
17648 digest[2] = 0;
17649 digest[3] = 0;
17650
17651 // salt
17652
17653 char *salt_buf = input_buf + 8 + 1;
17654
17655 uint salt_len = 8;
17656
17657 char *salt_buf_ptr = (char *) salt->salt_buf;
17658
17659 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17660
17661 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17662
17663 salt->salt_len = salt_len;
17664
17665 return (PARSER_OK);
17666 }
17667
17668 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17669 {
17670 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17671
17672 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17673
17674 uint32_t *digest = (uint32_t *) hash_buf->digest;
17675
17676 salt_t *salt = hash_buf->salt;
17677
17678 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17679
17680 /**
17681 * parse line
17682 */
17683
17684 char *p_buf_pos = input_buf + 4;
17685
17686 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17687
17688 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17689
17690 uint32_t p_buf_len = NumCyclesPower_pos - p_buf_pos;
17691
17692 NumCyclesPower_pos++;
17693
17694 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17695
17696 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17697
17698 uint32_t NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17699
17700 salt_len_pos++;
17701
17702 char *salt_buf_pos = strchr (salt_len_pos, '$');
17703
17704 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17705
17706 uint32_t salt_len_len = salt_buf_pos - salt_len_pos;
17707
17708 salt_buf_pos++;
17709
17710 char *iv_len_pos = strchr (salt_buf_pos, '$');
17711
17712 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17713
17714 uint32_t salt_buf_len = iv_len_pos - salt_buf_pos;
17715
17716 iv_len_pos++;
17717
17718 char *iv_buf_pos = strchr (iv_len_pos, '$');
17719
17720 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17721
17722 uint32_t iv_len_len = iv_buf_pos - iv_len_pos;
17723
17724 iv_buf_pos++;
17725
17726 char *crc_buf_pos = strchr (iv_buf_pos, '$');
17727
17728 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17729
17730 uint32_t iv_buf_len = crc_buf_pos - iv_buf_pos;
17731
17732 crc_buf_pos++;
17733
17734 char *data_len_pos = strchr (crc_buf_pos, '$');
17735
17736 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17737
17738 uint32_t crc_buf_len = data_len_pos - crc_buf_pos;
17739
17740 data_len_pos++;
17741
17742 char *unpack_size_pos = strchr (data_len_pos, '$');
17743
17744 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17745
17746 uint32_t data_len_len = unpack_size_pos - data_len_pos;
17747
17748 unpack_size_pos++;
17749
17750 char *data_buf_pos = strchr (unpack_size_pos, '$');
17751
17752 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17753
17754 uint32_t unpack_size_len = data_buf_pos - unpack_size_pos;
17755
17756 data_buf_pos++;
17757
17758 uint32_t data_buf_len = input_len - 1 - 2 - 1 - p_buf_len - 1 - NumCyclesPower_len - 1 - salt_len_len - 1 - salt_buf_len - 1 - iv_len_len - 1 - iv_buf_len - 1 - crc_buf_len - 1 - data_len_len - 1 - unpack_size_len - 1;
17759
17760 const uint iter = atoi (NumCyclesPower_pos);
17761 const uint crc = atoi (crc_buf_pos);
17762 const uint p_buf = atoi (p_buf_pos);
17763 const uint salt_len = atoi (salt_len_pos);
17764 const uint iv_len = atoi (iv_len_pos);
17765 const uint unpack_size = atoi (unpack_size_pos);
17766 const uint data_len = atoi (data_len_pos);
17767
17768 /**
17769 * verify some data
17770 */
17771
17772 if (p_buf != 0) return (PARSER_SALT_VALUE);
17773 if (salt_len != 0) return (PARSER_SALT_VALUE);
17774
17775 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
17776
17777 if (data_len > 384) return (PARSER_SALT_VALUE);
17778
17779 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
17780
17781 /**
17782 * store data
17783 */
17784
17785 seven_zip->iv_buf[0] = hex_to_uint (&iv_buf_pos[ 0]);
17786 seven_zip->iv_buf[1] = hex_to_uint (&iv_buf_pos[ 8]);
17787 seven_zip->iv_buf[2] = hex_to_uint (&iv_buf_pos[16]);
17788 seven_zip->iv_buf[3] = hex_to_uint (&iv_buf_pos[24]);
17789
17790 seven_zip->iv_len = iv_len;
17791
17792 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
17793
17794 seven_zip->salt_len = 0;
17795
17796 seven_zip->crc = crc;
17797
17798 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
17799 {
17800 seven_zip->data_buf[i] = hex_to_uint (&data_buf_pos[j]);
17801
17802 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
17803 }
17804
17805 seven_zip->data_len = data_len;
17806
17807 seven_zip->unpack_size = unpack_size;
17808
17809 // real salt
17810
17811 salt->salt_buf[0] = seven_zip->data_buf[0];
17812 salt->salt_buf[1] = seven_zip->data_buf[1];
17813 salt->salt_buf[2] = seven_zip->data_buf[2];
17814 salt->salt_buf[3] = seven_zip->data_buf[3];
17815
17816 salt->salt_len = 16;
17817
17818 salt->salt_sign[0] = iter;
17819
17820 salt->salt_iter = 1 << iter;
17821
17822 /**
17823 * digest
17824 */
17825
17826 digest[0] = crc;
17827 digest[1] = 0;
17828 digest[2] = 0;
17829 digest[3] = 0;
17830
17831 return (PARSER_OK);
17832 }
17833
17834 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17835 {
17836 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
17837
17838 uint32_t *digest = (uint32_t *) hash_buf->digest;
17839
17840 digest[0] = hex_to_uint (&input_buf[ 0]);
17841 digest[1] = hex_to_uint (&input_buf[ 8]);
17842 digest[2] = hex_to_uint (&input_buf[16]);
17843 digest[3] = hex_to_uint (&input_buf[24]);
17844 digest[4] = hex_to_uint (&input_buf[32]);
17845 digest[5] = hex_to_uint (&input_buf[40]);
17846 digest[6] = hex_to_uint (&input_buf[48]);
17847 digest[7] = hex_to_uint (&input_buf[56]);
17848
17849 digest[0] = byte_swap_32 (digest[0]);
17850 digest[1] = byte_swap_32 (digest[1]);
17851 digest[2] = byte_swap_32 (digest[2]);
17852 digest[3] = byte_swap_32 (digest[3]);
17853 digest[4] = byte_swap_32 (digest[4]);
17854 digest[5] = byte_swap_32 (digest[5]);
17855 digest[6] = byte_swap_32 (digest[6]);
17856 digest[7] = byte_swap_32 (digest[7]);
17857
17858 return (PARSER_OK);
17859 }
17860
17861 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17862 {
17863 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
17864
17865 uint32_t *digest = (uint32_t *) hash_buf->digest;
17866
17867 digest[ 0] = hex_to_uint (&input_buf[ 0]);
17868 digest[ 1] = hex_to_uint (&input_buf[ 8]);
17869 digest[ 2] = hex_to_uint (&input_buf[ 16]);
17870 digest[ 3] = hex_to_uint (&input_buf[ 24]);
17871 digest[ 4] = hex_to_uint (&input_buf[ 32]);
17872 digest[ 5] = hex_to_uint (&input_buf[ 40]);
17873 digest[ 6] = hex_to_uint (&input_buf[ 48]);
17874 digest[ 7] = hex_to_uint (&input_buf[ 56]);
17875 digest[ 8] = hex_to_uint (&input_buf[ 64]);
17876 digest[ 9] = hex_to_uint (&input_buf[ 72]);
17877 digest[10] = hex_to_uint (&input_buf[ 80]);
17878 digest[11] = hex_to_uint (&input_buf[ 88]);
17879 digest[12] = hex_to_uint (&input_buf[ 96]);
17880 digest[13] = hex_to_uint (&input_buf[104]);
17881 digest[14] = hex_to_uint (&input_buf[112]);
17882 digest[15] = hex_to_uint (&input_buf[120]);
17883
17884 digest[ 0] = byte_swap_32 (digest[ 0]);
17885 digest[ 1] = byte_swap_32 (digest[ 1]);
17886 digest[ 2] = byte_swap_32 (digest[ 2]);
17887 digest[ 3] = byte_swap_32 (digest[ 3]);
17888 digest[ 4] = byte_swap_32 (digest[ 4]);
17889 digest[ 5] = byte_swap_32 (digest[ 5]);
17890 digest[ 6] = byte_swap_32 (digest[ 6]);
17891 digest[ 7] = byte_swap_32 (digest[ 7]);
17892 digest[ 8] = byte_swap_32 (digest[ 8]);
17893 digest[ 9] = byte_swap_32 (digest[ 9]);
17894 digest[10] = byte_swap_32 (digest[10]);
17895 digest[11] = byte_swap_32 (digest[11]);
17896 digest[12] = byte_swap_32 (digest[12]);
17897 digest[13] = byte_swap_32 (digest[13]);
17898 digest[14] = byte_swap_32 (digest[14]);
17899 digest[15] = byte_swap_32 (digest[15]);
17900
17901 return (PARSER_OK);
17902 }
17903
17904 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17905 {
17906 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
17907
17908 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17909
17910 uint32_t *digest = (uint32_t *) hash_buf->digest;
17911
17912 salt_t *salt = hash_buf->salt;
17913
17914 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
17915
17916 /**
17917 * parse line
17918 */
17919
17920 // iterations
17921
17922 char *iter_pos = input_buf + 4;
17923
17924 uint32_t iter = atoi (iter_pos);
17925
17926 if (iter < 1) return (PARSER_SALT_ITERATION);
17927 if (iter > 999999) return (PARSER_SALT_ITERATION);
17928
17929 // first is *raw* salt
17930
17931 char *salt_pos = strchr (iter_pos, ':');
17932
17933 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17934
17935 salt_pos++;
17936
17937 char *hash_pos = strchr (salt_pos, ':');
17938
17939 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17940
17941 uint32_t salt_len = hash_pos - salt_pos;
17942
17943 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17944
17945 hash_pos++;
17946
17947 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
17948
17949 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17950
17951 // decode salt
17952
17953 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
17954
17955 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17956
17957 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17958
17959 salt_buf_ptr[salt_len + 3] = 0x01;
17960 salt_buf_ptr[salt_len + 4] = 0x80;
17961
17962 salt->salt_len = salt_len;
17963 salt->salt_iter = iter - 1;
17964
17965 // decode hash
17966
17967 char tmp_buf[100];
17968
17969 memset (tmp_buf, 0, sizeof (tmp_buf));
17970
17971 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
17972
17973 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17974
17975 memcpy (digest, tmp_buf, 16);
17976
17977 // add some stuff to normal salt to make sorted happy
17978
17979 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
17980 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
17981 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
17982 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
17983 salt->salt_buf[4] = salt->salt_iter;
17984
17985 return (PARSER_OK);
17986 }
17987
17988 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17989 {
17990 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
17991
17992 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
17993
17994 uint32_t *digest = (uint32_t *) hash_buf->digest;
17995
17996 salt_t *salt = hash_buf->salt;
17997
17998 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
17999
18000 /**
18001 * parse line
18002 */
18003
18004 // iterations
18005
18006 char *iter_pos = input_buf + 5;
18007
18008 uint32_t iter = atoi (iter_pos);
18009
18010 if (iter < 1) return (PARSER_SALT_ITERATION);
18011 if (iter > 999999) return (PARSER_SALT_ITERATION);
18012
18013 // first is *raw* salt
18014
18015 char *salt_pos = strchr (iter_pos, ':');
18016
18017 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18018
18019 salt_pos++;
18020
18021 char *hash_pos = strchr (salt_pos, ':');
18022
18023 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18024
18025 uint32_t salt_len = hash_pos - salt_pos;
18026
18027 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18028
18029 hash_pos++;
18030
18031 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
18032
18033 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18034
18035 // decode salt
18036
18037 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18038
18039 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18040
18041 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18042
18043 salt_buf_ptr[salt_len + 3] = 0x01;
18044 salt_buf_ptr[salt_len + 4] = 0x80;
18045
18046 salt->salt_len = salt_len;
18047 salt->salt_iter = iter - 1;
18048
18049 // decode hash
18050
18051 char tmp_buf[100];
18052
18053 memset (tmp_buf, 0, sizeof (tmp_buf));
18054
18055 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
18056
18057 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18058
18059 memcpy (digest, tmp_buf, 16);
18060
18061 digest[0] = byte_swap_32 (digest[0]);
18062 digest[1] = byte_swap_32 (digest[1]);
18063 digest[2] = byte_swap_32 (digest[2]);
18064 digest[3] = byte_swap_32 (digest[3]);
18065
18066 // add some stuff to normal salt to make sorted happy
18067
18068 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18069 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18070 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18071 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18072 salt->salt_buf[4] = salt->salt_iter;
18073
18074 return (PARSER_OK);
18075 }
18076
18077 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18078 {
18079 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18080
18081 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18082
18083 uint64_t *digest = (uint64_t *) hash_buf->digest;
18084
18085 salt_t *salt = hash_buf->salt;
18086
18087 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18088
18089 /**
18090 * parse line
18091 */
18092
18093 // iterations
18094
18095 char *iter_pos = input_buf + 7;
18096
18097 uint32_t iter = atoi (iter_pos);
18098
18099 if (iter < 1) return (PARSER_SALT_ITERATION);
18100 if (iter > 999999) return (PARSER_SALT_ITERATION);
18101
18102 // first is *raw* salt
18103
18104 char *salt_pos = strchr (iter_pos, ':');
18105
18106 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18107
18108 salt_pos++;
18109
18110 char *hash_pos = strchr (salt_pos, ':');
18111
18112 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18113
18114 uint32_t salt_len = hash_pos - salt_pos;
18115
18116 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18117
18118 hash_pos++;
18119
18120 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
18121
18122 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18123
18124 // decode salt
18125
18126 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18127
18128 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18129
18130 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18131
18132 salt_buf_ptr[salt_len + 3] = 0x01;
18133 salt_buf_ptr[salt_len + 4] = 0x80;
18134
18135 salt->salt_len = salt_len;
18136 salt->salt_iter = iter - 1;
18137
18138 // decode hash
18139
18140 char tmp_buf[100];
18141
18142 memset (tmp_buf, 0, sizeof (tmp_buf));
18143
18144 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
18145
18146 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18147
18148 memcpy (digest, tmp_buf, 64);
18149
18150 digest[0] = byte_swap_64 (digest[0]);
18151 digest[1] = byte_swap_64 (digest[1]);
18152 digest[2] = byte_swap_64 (digest[2]);
18153 digest[3] = byte_swap_64 (digest[3]);
18154 digest[4] = byte_swap_64 (digest[4]);
18155 digest[5] = byte_swap_64 (digest[5]);
18156 digest[6] = byte_swap_64 (digest[6]);
18157 digest[7] = byte_swap_64 (digest[7]);
18158
18159 // add some stuff to normal salt to make sorted happy
18160
18161 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18162 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18163 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18164 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18165 salt->salt_buf[4] = salt->salt_iter;
18166
18167 return (PARSER_OK);
18168 }
18169
18170 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18171 {
18172 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18173
18174 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18175
18176 uint *digest = (uint *) hash_buf->digest;
18177
18178 salt_t *salt = hash_buf->salt;
18179
18180 /**
18181 * parse line
18182 */
18183
18184 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18185
18186 char *hash_pos = strchr (salt_pos, '$');
18187
18188 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18189
18190 uint32_t salt_len = hash_pos - salt_pos;
18191
18192 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18193
18194 hash_pos++;
18195
18196 uint32_t hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18197
18198 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18199
18200 // decode hash
18201
18202 digest[ 0] = hex_to_uint (&hash_pos[0]);
18203 digest[ 1] = hex_to_uint (&hash_pos[8]);
18204 digest[ 2] = 0;
18205 digest[ 3] = 0;
18206 digest[ 4] = 0;
18207 digest[ 5] = 0;
18208 digest[ 6] = 0;
18209 digest[ 7] = 0;
18210 digest[ 8] = 0;
18211 digest[ 9] = 0;
18212 digest[10] = 0;
18213 digest[11] = 0;
18214 digest[12] = 0;
18215 digest[13] = 0;
18216 digest[14] = 0;
18217 digest[15] = 0;
18218
18219 // decode salt
18220
18221 salt->salt_buf[0] = hex_to_uint (&salt_pos[0]);
18222 salt->salt_buf[1] = hex_to_uint (&salt_pos[8]);
18223
18224 salt->salt_iter = ROUNDS_ECRYPTFS;
18225 salt->salt_len = 8;
18226
18227 return (PARSER_OK);
18228 }
18229
18230 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18231 {
18232 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18233
18234 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18235
18236 unsigned char c19 = itoa64_to_int (input_buf[19]);
18237
18238 if (c19 & 3) return (PARSER_HASH_VALUE);
18239
18240 salt_t *salt = hash_buf->salt;
18241
18242 uint32_t *digest = (uint32_t *) hash_buf->digest;
18243
18244 // iteration count
18245
18246 salt->salt_iter = itoa64_to_int (input_buf[1])
18247 | itoa64_to_int (input_buf[2]) << 6
18248 | itoa64_to_int (input_buf[3]) << 12
18249 | itoa64_to_int (input_buf[4]) << 18;
18250
18251 // set salt
18252
18253 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18254 | itoa64_to_int (input_buf[6]) << 6
18255 | itoa64_to_int (input_buf[7]) << 12
18256 | itoa64_to_int (input_buf[8]) << 18;
18257
18258 salt->salt_len = 4;
18259
18260 char tmp_buf[100];
18261
18262 memset (tmp_buf, 0, sizeof (tmp_buf));
18263
18264 base64_decode (itoa64_to_int, input_buf + 9, 11, tmp_buf);
18265
18266 memcpy (digest, tmp_buf, 8);
18267
18268 uint tt;
18269
18270 IP (digest[0], digest[1], tt);
18271
18272 digest[0] = ROTATE_RIGHT (digest[0], 31);
18273 digest[1] = ROTATE_RIGHT (digest[1], 31);
18274 digest[2] = 0;
18275 digest[3] = 0;
18276
18277 return (PARSER_OK);
18278 }
18279
18280 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18281 {
18282 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18283
18284 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18285
18286 uint32_t *digest = (uint32_t *) hash_buf->digest;
18287
18288 salt_t *salt = hash_buf->salt;
18289
18290 /**
18291 * parse line
18292 */
18293
18294 char *type_pos = input_buf + 6 + 1;
18295
18296 char *salt_pos = strchr (type_pos, '*');
18297
18298 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18299
18300 uint32_t type_len = salt_pos - type_pos;
18301
18302 if (type_len != 1) return (PARSER_SALT_LENGTH);
18303
18304 salt_pos++;
18305
18306 char *crypted_pos = strchr (salt_pos, '*');
18307
18308 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18309
18310 uint32_t salt_len = crypted_pos - salt_pos;
18311
18312 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18313
18314 crypted_pos++;
18315
18316 uint32_t crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18317
18318 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18319
18320 /**
18321 * copy data
18322 */
18323
18324 salt->salt_buf[0] = hex_to_uint (&salt_pos[0]);
18325 salt->salt_buf[1] = hex_to_uint (&salt_pos[8]);
18326
18327 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18328 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18329
18330 salt->salt_buf[2] = hex_to_uint (&crypted_pos[ 0]);
18331 salt->salt_buf[3] = hex_to_uint (&crypted_pos[ 8]);
18332 salt->salt_buf[4] = hex_to_uint (&crypted_pos[16]);
18333 salt->salt_buf[5] = hex_to_uint (&crypted_pos[24]);
18334
18335 salt->salt_len = 24;
18336 salt->salt_iter = ROUNDS_RAR3;
18337
18338 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18339 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18340
18341 digest[0] = 0xc43d7b00;
18342 digest[1] = 0x40070000;
18343 digest[2] = 0;
18344 digest[3] = 0;
18345
18346 return (PARSER_OK);
18347 }
18348
18349 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18350 {
18351 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18352
18353 uint32_t *digest = (uint32_t *) hash_buf->digest;
18354
18355 salt_t *salt = hash_buf->salt;
18356
18357 digest[0] = hex_to_uint (&input_buf[ 0]);
18358 digest[1] = hex_to_uint (&input_buf[ 8]);
18359 digest[2] = hex_to_uint (&input_buf[16]);
18360 digest[3] = hex_to_uint (&input_buf[24]);
18361 digest[4] = hex_to_uint (&input_buf[32]);
18362 digest[5] = hex_to_uint (&input_buf[40]);
18363 digest[6] = hex_to_uint (&input_buf[48]);
18364 digest[7] = hex_to_uint (&input_buf[56]);
18365
18366 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18367
18368 uint salt_len = input_len - 64 - 1;
18369
18370 char *salt_buf = input_buf + 64 + 1;
18371
18372 char *salt_buf_ptr = (char *) salt->salt_buf;
18373
18374 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18375
18376 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18377
18378 salt->salt_len = salt_len;
18379
18380 /**
18381 * we can precompute the first sha256 transform
18382 */
18383
18384 uint w[16];
18385
18386 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18387 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18388 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18389 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18390 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18391 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18392 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18393 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18394 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18395 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18396 w[10] = byte_swap_32 (salt->salt_buf[10]);
18397 w[11] = byte_swap_32 (salt->salt_buf[11]);
18398 w[12] = byte_swap_32 (salt->salt_buf[12]);
18399 w[13] = byte_swap_32 (salt->salt_buf[13]);
18400 w[14] = byte_swap_32 (salt->salt_buf[14]);
18401 w[15] = byte_swap_32 (salt->salt_buf[15]);
18402
18403 uint pc256[8];
18404
18405 pc256[0] = SHA256M_A;
18406 pc256[1] = SHA256M_B;
18407 pc256[2] = SHA256M_C;
18408 pc256[3] = SHA256M_D;
18409 pc256[4] = SHA256M_E;
18410 pc256[5] = SHA256M_F;
18411 pc256[6] = SHA256M_G;
18412 pc256[7] = SHA256M_H;
18413
18414 sha256_64 (w, pc256);
18415
18416 salt->salt_buf_pc[0] = pc256[0];
18417 salt->salt_buf_pc[1] = pc256[1];
18418 salt->salt_buf_pc[2] = pc256[2];
18419 salt->salt_buf_pc[3] = pc256[3];
18420 salt->salt_buf_pc[4] = pc256[4];
18421 salt->salt_buf_pc[5] = pc256[5];
18422 salt->salt_buf_pc[6] = pc256[6];
18423 salt->salt_buf_pc[7] = pc256[7];
18424
18425 digest[0] -= pc256[0];
18426 digest[1] -= pc256[1];
18427 digest[2] -= pc256[2];
18428 digest[3] -= pc256[3];
18429 digest[4] -= pc256[4];
18430 digest[5] -= pc256[5];
18431 digest[6] -= pc256[6];
18432 digest[7] -= pc256[7];
18433
18434 return (PARSER_OK);
18435 }
18436
18437 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18438 {
18439 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18440
18441 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18442
18443 uint32_t *digest = (uint32_t *) hash_buf->digest;
18444
18445 salt_t *salt = hash_buf->salt;
18446
18447 /**
18448 * parse line
18449 */
18450
18451 char *data_len_pos = input_buf + 1 + 10 + 1;
18452
18453 char *data_buf_pos = strchr (data_len_pos, '$');
18454
18455 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18456
18457 uint32_t data_len_len = data_buf_pos - data_len_pos;
18458
18459 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18460 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18461
18462 data_buf_pos++;
18463
18464 uint32_t data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18465
18466 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18467
18468 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18469
18470 uint32_t data_len = atoi (data_len_pos);
18471
18472 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18473
18474 /**
18475 * salt
18476 */
18477
18478 char *salt_pos = data_buf_pos;
18479
18480 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
18481 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
18482 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]);
18483 salt->salt_buf[3] = hex_to_uint (&salt_pos[24]);
18484
18485 // this is actually the CT, which is also the hash later (if matched)
18486
18487 salt->salt_buf[4] = hex_to_uint (&salt_pos[32]);
18488 salt->salt_buf[5] = hex_to_uint (&salt_pos[40]);
18489 salt->salt_buf[6] = hex_to_uint (&salt_pos[48]);
18490 salt->salt_buf[7] = hex_to_uint (&salt_pos[56]);
18491
18492 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18493
18494 salt->salt_iter = 10 - 1;
18495
18496 /**
18497 * digest buf
18498 */
18499
18500 digest[0] = salt->salt_buf[4];
18501 digest[1] = salt->salt_buf[5];
18502 digest[2] = salt->salt_buf[6];
18503 digest[3] = salt->salt_buf[7];
18504
18505 return (PARSER_OK);
18506 }
18507
18508 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18509 {
18510 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18511
18512 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18513
18514 uint32_t *digest = (uint32_t *) hash_buf->digest;
18515
18516 salt_t *salt = hash_buf->salt;
18517
18518 /**
18519 * parse line
18520 */
18521
18522 char *salt_pos = input_buf + 11 + 1;
18523
18524 char *iter_pos = strchr (salt_pos, ',');
18525
18526 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18527
18528 uint32_t salt_len = iter_pos - salt_pos;
18529
18530 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18531
18532 iter_pos++;
18533
18534 char *hash_pos = strchr (iter_pos, ',');
18535
18536 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18537
18538 uint32_t iter_len = hash_pos - iter_pos;
18539
18540 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18541
18542 hash_pos++;
18543
18544 uint32_t hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18545
18546 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18547
18548 /**
18549 * salt
18550 */
18551
18552 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
18553 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
18554 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]) & 0xffff0000;
18555 salt->salt_buf[3] = 0x00018000;
18556
18557 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18558 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18559 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
18560 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
18561
18562 salt->salt_len = salt_len / 2;
18563
18564 salt->salt_iter = atoi (iter_pos) - 1;
18565
18566 /**
18567 * digest buf
18568 */
18569
18570 digest[0] = hex_to_uint (&hash_pos[ 0]);
18571 digest[1] = hex_to_uint (&hash_pos[ 8]);
18572 digest[2] = hex_to_uint (&hash_pos[16]);
18573 digest[3] = hex_to_uint (&hash_pos[24]);
18574 digest[4] = hex_to_uint (&hash_pos[32]);
18575 digest[5] = hex_to_uint (&hash_pos[40]);
18576 digest[6] = hex_to_uint (&hash_pos[48]);
18577 digest[7] = hex_to_uint (&hash_pos[56]);
18578
18579 return (PARSER_OK);
18580 }
18581
18582 /**
18583 * parallel running threads
18584 */
18585
18586 #ifdef WIN
18587
18588 BOOL WINAPI sigHandler_default (DWORD sig)
18589 {
18590 switch (sig)
18591 {
18592 case CTRL_CLOSE_EVENT:
18593
18594 /*
18595 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
18596 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
18597 * function otherwise it is to late (e.g. after returning from this function)
18598 */
18599
18600 myabort ();
18601
18602 SetConsoleCtrlHandler (NULL, TRUE);
18603
18604 hc_sleep (10);
18605
18606 return TRUE;
18607
18608 case CTRL_C_EVENT:
18609 case CTRL_LOGOFF_EVENT:
18610 case CTRL_SHUTDOWN_EVENT:
18611
18612 myabort ();
18613
18614 SetConsoleCtrlHandler (NULL, TRUE);
18615
18616 return TRUE;
18617 }
18618
18619 return FALSE;
18620 }
18621
18622 BOOL WINAPI sigHandler_benchmark (DWORD sig)
18623 {
18624 switch (sig)
18625 {
18626 case CTRL_CLOSE_EVENT:
18627
18628 myabort ();
18629
18630 SetConsoleCtrlHandler (NULL, TRUE);
18631
18632 hc_sleep (10);
18633
18634 return TRUE;
18635
18636 case CTRL_C_EVENT:
18637 case CTRL_LOGOFF_EVENT:
18638 case CTRL_SHUTDOWN_EVENT:
18639
18640 myquit ();
18641
18642 SetConsoleCtrlHandler (NULL, TRUE);
18643
18644 return TRUE;
18645 }
18646
18647 return FALSE;
18648 }
18649
18650 void hc_signal (BOOL WINAPI (callback) (DWORD))
18651 {
18652 if (callback == NULL)
18653 {
18654 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
18655 }
18656 else
18657 {
18658 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
18659 }
18660 }
18661
18662 #else
18663
18664 void sigHandler_default (int sig)
18665 {
18666 myabort ();
18667
18668 signal (sig, NULL);
18669 }
18670
18671 void sigHandler_benchmark (int sig)
18672 {
18673 myquit ();
18674
18675 signal (sig, NULL);
18676 }
18677
18678 void hc_signal (void (callback) (int))
18679 {
18680 if (callback == NULL) callback = SIG_DFL;
18681
18682 signal (SIGINT, callback);
18683 signal (SIGTERM, callback);
18684 signal (SIGABRT, callback);
18685 }
18686
18687 #endif
18688
18689 void status_display ();
18690
18691 void *thread_keypress (void *p)
18692 {
18693 int benchmark = *((int *) p);
18694
18695 uint quiet = data.quiet;
18696
18697 tty_break();
18698
18699 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
18700 {
18701 int ch = tty_getchar();
18702
18703 if (ch == -1) break;
18704
18705 if (ch == 0) continue;
18706
18707 #ifdef _POSIX
18708 if (ch != '\n')
18709 #endif
18710
18711 hc_thread_mutex_lock (mux_display);
18712
18713 log_info ("");
18714
18715 switch (ch)
18716 {
18717 case 's':
18718 case '\n':
18719
18720 log_info ("");
18721
18722 status_display ();
18723
18724 log_info ("");
18725
18726 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18727 if (quiet == 0) fflush (stdout);
18728
18729 break;
18730
18731 case 'b':
18732
18733 log_info ("");
18734
18735 bypass ();
18736
18737 log_info ("");
18738
18739 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18740 if (quiet == 0) fflush (stdout);
18741
18742 break;
18743
18744 case 'p':
18745
18746 log_info ("");
18747
18748 SuspendThreads ();
18749
18750 log_info ("");
18751
18752 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18753 if (quiet == 0) fflush (stdout);
18754
18755 break;
18756
18757 case 'r':
18758
18759 log_info ("");
18760
18761 ResumeThreads ();
18762
18763 log_info ("");
18764
18765 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18766 if (quiet == 0) fflush (stdout);
18767
18768 break;
18769
18770 case 'c':
18771
18772 log_info ("");
18773
18774 if (benchmark == 1) break;
18775
18776 stop_at_checkpoint ();
18777
18778 log_info ("");
18779
18780 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18781 if (quiet == 0) fflush (stdout);
18782
18783 break;
18784
18785 case 'q':
18786
18787 log_info ("");
18788
18789 if (benchmark == 1)
18790 {
18791 myquit ();
18792 }
18793 else
18794 {
18795 myabort ();
18796 }
18797
18798 break;
18799 }
18800
18801 hc_thread_mutex_unlock (mux_display);
18802 }
18803
18804 tty_fix();
18805
18806 return (p);
18807 }
18808
18809 /**
18810 * rules common
18811 */
18812
18813 bool class_num (char c)
18814 {
18815 return ((c >= '0') && (c <= '9'));
18816 }
18817
18818 bool class_lower (char c)
18819 {
18820 return ((c >= 'a') && (c <= 'z'));
18821 }
18822
18823 bool class_upper (char c)
18824 {
18825 return ((c >= 'A') && (c <= 'Z'));
18826 }
18827
18828 bool class_alpha (char c)
18829 {
18830 return (class_lower (c) || class_upper (c));
18831 }
18832
18833 char conv_ctoi (char c)
18834 {
18835 if (class_num (c))
18836 {
18837 return c - '0';
18838 }
18839 else if (class_upper (c))
18840 {
18841 return c - 'A' + (char) 10;
18842 }
18843
18844 return (char) (-1);
18845 }
18846
18847 char conv_itoc (char c)
18848 {
18849 if (c < 10)
18850 {
18851 return c + '0';
18852 }
18853 else if (c < 37)
18854 {
18855 return c + 'A' - (char) 10;
18856 }
18857
18858 return (char) (-1);
18859 }
18860
18861 /**
18862 * GPU rules
18863 */
18864
18865 #define INCR_POS if (++rule_pos == rule_len) return (-1)
18866 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
18867 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
18868 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
18869 #define MAX_GPU_RULES 14
18870 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
18871 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
18872 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
18873
18874 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
18875 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
18876 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
18877 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
18878
18879 int cpu_rule_to_gpu_rule (char rule_buf[BUFSIZ], uint rule_len, gpu_rule_t *rule)
18880 {
18881 uint rule_pos;
18882 uint rule_cnt;
18883
18884 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_GPU_RULES; rule_pos++, rule_cnt++)
18885 {
18886 switch (rule_buf[rule_pos])
18887 {
18888 case ' ':
18889 rule_cnt--;
18890 break;
18891
18892 case RULE_OP_MANGLE_NOOP:
18893 SET_NAME (rule, rule_buf[rule_pos]);
18894 break;
18895
18896 case RULE_OP_MANGLE_LREST:
18897 SET_NAME (rule, rule_buf[rule_pos]);
18898 break;
18899
18900 case RULE_OP_MANGLE_UREST:
18901 SET_NAME (rule, rule_buf[rule_pos]);
18902 break;
18903
18904 case RULE_OP_MANGLE_LREST_UFIRST:
18905 SET_NAME (rule, rule_buf[rule_pos]);
18906 break;
18907
18908 case RULE_OP_MANGLE_UREST_LFIRST:
18909 SET_NAME (rule, rule_buf[rule_pos]);
18910 break;
18911
18912 case RULE_OP_MANGLE_TREST:
18913 SET_NAME (rule, rule_buf[rule_pos]);
18914 break;
18915
18916 case RULE_OP_MANGLE_TOGGLE_AT:
18917 SET_NAME (rule, rule_buf[rule_pos]);
18918 SET_P0_CONV (rule, rule_buf[rule_pos]);
18919 break;
18920
18921 case RULE_OP_MANGLE_REVERSE:
18922 SET_NAME (rule, rule_buf[rule_pos]);
18923 break;
18924
18925 case RULE_OP_MANGLE_DUPEWORD:
18926 SET_NAME (rule, rule_buf[rule_pos]);
18927 break;
18928
18929 case RULE_OP_MANGLE_DUPEWORD_TIMES:
18930 SET_NAME (rule, rule_buf[rule_pos]);
18931 SET_P0_CONV (rule, rule_buf[rule_pos]);
18932 break;
18933
18934 case RULE_OP_MANGLE_REFLECT:
18935 SET_NAME (rule, rule_buf[rule_pos]);
18936 break;
18937
18938 case RULE_OP_MANGLE_ROTATE_LEFT:
18939 SET_NAME (rule, rule_buf[rule_pos]);
18940 break;
18941
18942 case RULE_OP_MANGLE_ROTATE_RIGHT:
18943 SET_NAME (rule, rule_buf[rule_pos]);
18944 break;
18945
18946 case RULE_OP_MANGLE_APPEND:
18947 SET_NAME (rule, rule_buf[rule_pos]);
18948 SET_P0 (rule, rule_buf[rule_pos]);
18949 break;
18950
18951 case RULE_OP_MANGLE_PREPEND:
18952 SET_NAME (rule, rule_buf[rule_pos]);
18953 SET_P0 (rule, rule_buf[rule_pos]);
18954 break;
18955
18956 case RULE_OP_MANGLE_DELETE_FIRST:
18957 SET_NAME (rule, rule_buf[rule_pos]);
18958 break;
18959
18960 case RULE_OP_MANGLE_DELETE_LAST:
18961 SET_NAME (rule, rule_buf[rule_pos]);
18962 break;
18963
18964 case RULE_OP_MANGLE_DELETE_AT:
18965 SET_NAME (rule, rule_buf[rule_pos]);
18966 SET_P0_CONV (rule, rule_buf[rule_pos]);
18967 break;
18968
18969 case RULE_OP_MANGLE_EXTRACT:
18970 SET_NAME (rule, rule_buf[rule_pos]);
18971 SET_P0_CONV (rule, rule_buf[rule_pos]);
18972 SET_P1_CONV (rule, rule_buf[rule_pos]);
18973 break;
18974
18975 case RULE_OP_MANGLE_OMIT:
18976 SET_NAME (rule, rule_buf[rule_pos]);
18977 SET_P0_CONV (rule, rule_buf[rule_pos]);
18978 SET_P1_CONV (rule, rule_buf[rule_pos]);
18979 break;
18980
18981 case RULE_OP_MANGLE_INSERT:
18982 SET_NAME (rule, rule_buf[rule_pos]);
18983 SET_P0_CONV (rule, rule_buf[rule_pos]);
18984 SET_P1 (rule, rule_buf[rule_pos]);
18985 break;
18986
18987 case RULE_OP_MANGLE_OVERSTRIKE:
18988 SET_NAME (rule, rule_buf[rule_pos]);
18989 SET_P0_CONV (rule, rule_buf[rule_pos]);
18990 SET_P1 (rule, rule_buf[rule_pos]);
18991 break;
18992
18993 case RULE_OP_MANGLE_TRUNCATE_AT:
18994 SET_NAME (rule, rule_buf[rule_pos]);
18995 SET_P0_CONV (rule, rule_buf[rule_pos]);
18996 break;
18997
18998 case RULE_OP_MANGLE_REPLACE:
18999 SET_NAME (rule, rule_buf[rule_pos]);
19000 SET_P0 (rule, rule_buf[rule_pos]);
19001 SET_P1 (rule, rule_buf[rule_pos]);
19002 break;
19003
19004 case RULE_OP_MANGLE_PURGECHAR:
19005 return (-1);
19006 break;
19007
19008 case RULE_OP_MANGLE_TOGGLECASE_REC:
19009 return (-1);
19010 break;
19011
19012 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19013 SET_NAME (rule, rule_buf[rule_pos]);
19014 SET_P0_CONV (rule, rule_buf[rule_pos]);
19015 break;
19016
19017 case RULE_OP_MANGLE_DUPECHAR_LAST:
19018 SET_NAME (rule, rule_buf[rule_pos]);
19019 SET_P0_CONV (rule, rule_buf[rule_pos]);
19020 break;
19021
19022 case RULE_OP_MANGLE_DUPECHAR_ALL:
19023 SET_NAME (rule, rule_buf[rule_pos]);
19024 break;
19025
19026 case RULE_OP_MANGLE_SWITCH_FIRST:
19027 SET_NAME (rule, rule_buf[rule_pos]);
19028 break;
19029
19030 case RULE_OP_MANGLE_SWITCH_LAST:
19031 SET_NAME (rule, rule_buf[rule_pos]);
19032 break;
19033
19034 case RULE_OP_MANGLE_SWITCH_AT:
19035 SET_NAME (rule, rule_buf[rule_pos]);
19036 SET_P0_CONV (rule, rule_buf[rule_pos]);
19037 SET_P1_CONV (rule, rule_buf[rule_pos]);
19038 break;
19039
19040 case RULE_OP_MANGLE_CHR_SHIFTL:
19041 SET_NAME (rule, rule_buf[rule_pos]);
19042 SET_P0_CONV (rule, rule_buf[rule_pos]);
19043 break;
19044
19045 case RULE_OP_MANGLE_CHR_SHIFTR:
19046 SET_NAME (rule, rule_buf[rule_pos]);
19047 SET_P0_CONV (rule, rule_buf[rule_pos]);
19048 break;
19049
19050 case RULE_OP_MANGLE_CHR_INCR:
19051 SET_NAME (rule, rule_buf[rule_pos]);
19052 SET_P0_CONV (rule, rule_buf[rule_pos]);
19053 break;
19054
19055 case RULE_OP_MANGLE_CHR_DECR:
19056 SET_NAME (rule, rule_buf[rule_pos]);
19057 SET_P0_CONV (rule, rule_buf[rule_pos]);
19058 break;
19059
19060 case RULE_OP_MANGLE_REPLACE_NP1:
19061 SET_NAME (rule, rule_buf[rule_pos]);
19062 SET_P0_CONV (rule, rule_buf[rule_pos]);
19063 break;
19064
19065 case RULE_OP_MANGLE_REPLACE_NM1:
19066 SET_NAME (rule, rule_buf[rule_pos]);
19067 SET_P0_CONV (rule, rule_buf[rule_pos]);
19068 break;
19069
19070 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19071 SET_NAME (rule, rule_buf[rule_pos]);
19072 SET_P0_CONV (rule, rule_buf[rule_pos]);
19073 break;
19074
19075 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19076 SET_NAME (rule, rule_buf[rule_pos]);
19077 SET_P0_CONV (rule, rule_buf[rule_pos]);
19078 break;
19079
19080 case RULE_OP_MANGLE_TITLE:
19081 SET_NAME (rule, rule_buf[rule_pos]);
19082 break;
19083
19084 default:
19085 return (-1);
19086 break;
19087 }
19088 }
19089
19090 if (rule_pos < rule_len) return (-1);
19091
19092 return (0);
19093 }
19094
19095 int gpu_rule_to_cpu_rule (char rule_buf[BUFSIZ], gpu_rule_t *rule)
19096 {
19097 uint rule_cnt;
19098 uint rule_pos;
19099 uint rule_len = BUFSIZ - 1; // maximum possible len
19100
19101 char rule_cmd;
19102
19103 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_GPU_RULES; rule_pos++, rule_cnt++)
19104 {
19105 GET_NAME (rule);
19106
19107 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19108
19109 switch (rule_cmd)
19110 {
19111 case RULE_OP_MANGLE_NOOP:
19112 rule_buf[rule_pos] = rule_cmd;
19113 break;
19114
19115 case RULE_OP_MANGLE_LREST:
19116 rule_buf[rule_pos] = rule_cmd;
19117 break;
19118
19119 case RULE_OP_MANGLE_UREST:
19120 rule_buf[rule_pos] = rule_cmd;
19121 break;
19122
19123 case RULE_OP_MANGLE_LREST_UFIRST:
19124 rule_buf[rule_pos] = rule_cmd;
19125 break;
19126
19127 case RULE_OP_MANGLE_UREST_LFIRST:
19128 rule_buf[rule_pos] = rule_cmd;
19129 break;
19130
19131 case RULE_OP_MANGLE_TREST:
19132 rule_buf[rule_pos] = rule_cmd;
19133 break;
19134
19135 case RULE_OP_MANGLE_TOGGLE_AT:
19136 rule_buf[rule_pos] = rule_cmd;
19137 GET_P0_CONV (rule);
19138 break;
19139
19140 case RULE_OP_MANGLE_REVERSE:
19141 rule_buf[rule_pos] = rule_cmd;
19142 break;
19143
19144 case RULE_OP_MANGLE_DUPEWORD:
19145 rule_buf[rule_pos] = rule_cmd;
19146 break;
19147
19148 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19149 rule_buf[rule_pos] = rule_cmd;
19150 GET_P0_CONV (rule);
19151 break;
19152
19153 case RULE_OP_MANGLE_REFLECT:
19154 rule_buf[rule_pos] = rule_cmd;
19155 break;
19156
19157 case RULE_OP_MANGLE_ROTATE_LEFT:
19158 rule_buf[rule_pos] = rule_cmd;
19159 break;
19160
19161 case RULE_OP_MANGLE_ROTATE_RIGHT:
19162 rule_buf[rule_pos] = rule_cmd;
19163 break;
19164
19165 case RULE_OP_MANGLE_APPEND:
19166 rule_buf[rule_pos] = rule_cmd;
19167 GET_P0 (rule);
19168 break;
19169
19170 case RULE_OP_MANGLE_PREPEND:
19171 rule_buf[rule_pos] = rule_cmd;
19172 GET_P0 (rule);
19173 break;
19174
19175 case RULE_OP_MANGLE_DELETE_FIRST:
19176 rule_buf[rule_pos] = rule_cmd;
19177 break;
19178
19179 case RULE_OP_MANGLE_DELETE_LAST:
19180 rule_buf[rule_pos] = rule_cmd;
19181 break;
19182
19183 case RULE_OP_MANGLE_DELETE_AT:
19184 rule_buf[rule_pos] = rule_cmd;
19185 GET_P0_CONV (rule);
19186 break;
19187
19188 case RULE_OP_MANGLE_EXTRACT:
19189 rule_buf[rule_pos] = rule_cmd;
19190 GET_P0_CONV (rule);
19191 GET_P1_CONV (rule);
19192 break;
19193
19194 case RULE_OP_MANGLE_OMIT:
19195 rule_buf[rule_pos] = rule_cmd;
19196 GET_P0_CONV (rule);
19197 GET_P1_CONV (rule);
19198 break;
19199
19200 case RULE_OP_MANGLE_INSERT:
19201 rule_buf[rule_pos] = rule_cmd;
19202 GET_P0_CONV (rule);
19203 GET_P1 (rule);
19204 break;
19205
19206 case RULE_OP_MANGLE_OVERSTRIKE:
19207 rule_buf[rule_pos] = rule_cmd;
19208 GET_P0_CONV (rule);
19209 GET_P1 (rule);
19210 break;
19211
19212 case RULE_OP_MANGLE_TRUNCATE_AT:
19213 rule_buf[rule_pos] = rule_cmd;
19214 GET_P0_CONV (rule);
19215 break;
19216
19217 case RULE_OP_MANGLE_REPLACE:
19218 rule_buf[rule_pos] = rule_cmd;
19219 GET_P0 (rule);
19220 GET_P1 (rule);
19221 break;
19222
19223 case RULE_OP_MANGLE_PURGECHAR:
19224 return (-1);
19225 break;
19226
19227 case RULE_OP_MANGLE_TOGGLECASE_REC:
19228 return (-1);
19229 break;
19230
19231 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19232 rule_buf[rule_pos] = rule_cmd;
19233 GET_P0_CONV (rule);
19234 break;
19235
19236 case RULE_OP_MANGLE_DUPECHAR_LAST:
19237 rule_buf[rule_pos] = rule_cmd;
19238 GET_P0_CONV (rule);
19239 break;
19240
19241 case RULE_OP_MANGLE_DUPECHAR_ALL:
19242 rule_buf[rule_pos] = rule_cmd;
19243 break;
19244
19245 case RULE_OP_MANGLE_SWITCH_FIRST:
19246 rule_buf[rule_pos] = rule_cmd;
19247 break;
19248
19249 case RULE_OP_MANGLE_SWITCH_LAST:
19250 rule_buf[rule_pos] = rule_cmd;
19251 break;
19252
19253 case RULE_OP_MANGLE_SWITCH_AT:
19254 rule_buf[rule_pos] = rule_cmd;
19255 GET_P0_CONV (rule);
19256 GET_P1_CONV (rule);
19257 break;
19258
19259 case RULE_OP_MANGLE_CHR_SHIFTL:
19260 rule_buf[rule_pos] = rule_cmd;
19261 GET_P0_CONV (rule);
19262 break;
19263
19264 case RULE_OP_MANGLE_CHR_SHIFTR:
19265 rule_buf[rule_pos] = rule_cmd;
19266 GET_P0_CONV (rule);
19267 break;
19268
19269 case RULE_OP_MANGLE_CHR_INCR:
19270 rule_buf[rule_pos] = rule_cmd;
19271 GET_P0_CONV (rule);
19272 break;
19273
19274 case RULE_OP_MANGLE_CHR_DECR:
19275 rule_buf[rule_pos] = rule_cmd;
19276 GET_P0_CONV (rule);
19277 break;
19278
19279 case RULE_OP_MANGLE_REPLACE_NP1:
19280 rule_buf[rule_pos] = rule_cmd;
19281 GET_P0_CONV (rule);
19282 break;
19283
19284 case RULE_OP_MANGLE_REPLACE_NM1:
19285 rule_buf[rule_pos] = rule_cmd;
19286 GET_P0_CONV (rule);
19287 break;
19288
19289 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19290 rule_buf[rule_pos] = rule_cmd;
19291 GET_P0_CONV (rule);
19292 break;
19293
19294 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19295 rule_buf[rule_pos] = rule_cmd;
19296 GET_P0_CONV (rule);
19297 break;
19298
19299 case RULE_OP_MANGLE_TITLE:
19300 rule_buf[rule_pos] = rule_cmd;
19301 break;
19302
19303 case 0:
19304 return rule_pos - 1;
19305 break;
19306
19307 default:
19308 return (-1);
19309 break;
19310 }
19311 }
19312
19313 if (rule_cnt > 0)
19314 {
19315 return rule_pos;
19316 }
19317
19318 return (-1);
19319 }
19320
19321 /**
19322 * CPU rules : this is from hashcat sources, cpu based rules
19323 */
19324
19325 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19326 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19327
19328 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19329 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19330 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19331
19332 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19333 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19334 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19335
19336 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19337 {
19338 int pos;
19339
19340 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19341
19342 return (arr_len);
19343 }
19344
19345 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19346 {
19347 int pos;
19348
19349 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19350
19351 return (arr_len);
19352 }
19353
19354 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19355 {
19356 int pos;
19357
19358 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19359
19360 return (arr_len);
19361 }
19362
19363 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19364 {
19365 int l;
19366 int r;
19367
19368 for (l = 0; l < arr_len; l++)
19369 {
19370 r = arr_len - 1 - l;
19371
19372 if (l >= r) break;
19373
19374 MANGLE_SWITCH (arr, l, r);
19375 }
19376
19377 return (arr_len);
19378 }
19379
19380 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19381 {
19382 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19383
19384 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19385
19386 return (arr_len * 2);
19387 }
19388
19389 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19390 {
19391 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19392
19393 int orig_len = arr_len;
19394
19395 int i;
19396
19397 for (i = 0; i < times; i++)
19398 {
19399 memcpy (&arr[arr_len], arr, orig_len);
19400
19401 arr_len += orig_len;
19402 }
19403
19404 return (arr_len);
19405 }
19406
19407 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19408 {
19409 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19410
19411 mangle_double (arr, arr_len);
19412
19413 mangle_reverse (arr + arr_len, arr_len);
19414
19415 return (arr_len * 2);
19416 }
19417
19418 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19419 {
19420 int l;
19421 int r;
19422
19423 for (l = 0, r = arr_len - 1; r > 0; r--)
19424 {
19425 MANGLE_SWITCH (arr, l, r);
19426 }
19427
19428 return (arr_len);
19429 }
19430
19431 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19432 {
19433 int l;
19434 int r;
19435
19436 for (l = 0, r = arr_len - 1; l < r; l++)
19437 {
19438 MANGLE_SWITCH (arr, l, r);
19439 }
19440
19441 return (arr_len);
19442 }
19443
19444 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19445 {
19446 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19447
19448 arr[arr_len] = c;
19449
19450 return (arr_len + 1);
19451 }
19452
19453 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19454 {
19455 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19456
19457 int arr_pos;
19458
19459 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19460 {
19461 arr[arr_pos + 1] = arr[arr_pos];
19462 }
19463
19464 arr[0] = c;
19465
19466 return (arr_len + 1);
19467 }
19468
19469 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19470 {
19471 if (upos >= arr_len) return (arr_len);
19472
19473 int arr_pos;
19474
19475 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19476 {
19477 arr[arr_pos] = arr[arr_pos + 1];
19478 }
19479
19480 return (arr_len - 1);
19481 }
19482
19483 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19484 {
19485 if (upos >= arr_len) return (arr_len);
19486
19487 if ((upos + ulen) > arr_len) return (arr_len);
19488
19489 int arr_pos;
19490
19491 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19492 {
19493 arr[arr_pos] = arr[upos + arr_pos];
19494 }
19495
19496 return (ulen);
19497 }
19498
19499 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19500 {
19501 if (upos >= arr_len) return (arr_len);
19502
19503 if ((upos + ulen) >= arr_len) return (arr_len);
19504
19505 int arr_pos;
19506
19507 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
19508 {
19509 arr[arr_pos] = arr[arr_pos + ulen];
19510 }
19511
19512 return (arr_len - ulen);
19513 }
19514
19515 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19516 {
19517 if (upos >= arr_len) return (arr_len);
19518
19519 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19520
19521 int arr_pos;
19522
19523 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
19524 {
19525 arr[arr_pos + 1] = arr[arr_pos];
19526 }
19527
19528 arr[upos] = c;
19529
19530 return (arr_len + 1);
19531 }
19532
19533 int mangle_insert_multi (char arr[BLOCK_SIZE], int arr_len, int arr_pos, char arr2[BLOCK_SIZE], int arr2_len, int arr2_pos, int arr2_cpy)
19534 {
19535 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
19536
19537 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
19538
19539 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
19540
19541 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
19542
19543 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
19544
19545 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
19546
19547 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
19548
19549 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
19550
19551 return (arr_len + arr2_cpy);
19552 }
19553
19554 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19555 {
19556 if (upos >= arr_len) return (arr_len);
19557
19558 arr[upos] = c;
19559
19560 return (arr_len);
19561 }
19562
19563 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19564 {
19565 if (upos >= arr_len) return (arr_len);
19566
19567 memset (arr + upos, 0, arr_len - upos);
19568
19569 return (upos);
19570 }
19571
19572 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
19573 {
19574 int arr_pos;
19575
19576 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
19577 {
19578 if (arr[arr_pos] != oldc) continue;
19579
19580 arr[arr_pos] = newc;
19581 }
19582
19583 return (arr_len);
19584 }
19585
19586 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
19587 {
19588 int arr_pos;
19589
19590 int ret_len;
19591
19592 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
19593 {
19594 if (arr[arr_pos] == c) continue;
19595
19596 arr[ret_len] = arr[arr_pos];
19597
19598 ret_len++;
19599 }
19600
19601 return (ret_len);
19602 }
19603
19604 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
19605 {
19606 if (ulen > arr_len) return (arr_len);
19607
19608 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19609
19610 char cs[100];
19611
19612 memcpy (cs, arr, ulen);
19613
19614 int i;
19615
19616 for (i = 0; i < ulen; i++)
19617 {
19618 char c = cs[i];
19619
19620 arr_len = mangle_insert (arr, arr_len, i, c);
19621 }
19622
19623 return (arr_len);
19624 }
19625
19626 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
19627 {
19628 if (ulen > arr_len) return (arr_len);
19629
19630 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19631
19632 int upos = arr_len - ulen;
19633
19634 int i;
19635
19636 for (i = 0; i < ulen; i++)
19637 {
19638 char c = arr[upos + i];
19639
19640 arr_len = mangle_append (arr, arr_len, c);
19641 }
19642
19643 return (arr_len);
19644 }
19645
19646 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19647 {
19648 if ( arr_len == 0) return (arr_len);
19649 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19650
19651 char c = arr[upos];
19652
19653 int i;
19654
19655 for (i = 0; i < ulen; i++)
19656 {
19657 arr_len = mangle_insert (arr, arr_len, upos, c);
19658 }
19659
19660 return (arr_len);
19661 }
19662
19663 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
19664 {
19665 if ( arr_len == 0) return (arr_len);
19666 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
19667
19668 int arr_pos;
19669
19670 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19671 {
19672 int new_pos = arr_pos * 2;
19673
19674 arr[new_pos] = arr[arr_pos];
19675
19676 arr[new_pos + 1] = arr[arr_pos];
19677 }
19678
19679 return (arr_len * 2);
19680 }
19681
19682 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
19683 {
19684 if (upos >= arr_len) return (arr_len);
19685 if (upos2 >= arr_len) return (arr_len);
19686
19687 MANGLE_SWITCH (arr, upos, upos2);
19688
19689 return (arr_len);
19690 }
19691
19692 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
19693 {
19694 MANGLE_SWITCH (arr, upos, upos2);
19695
19696 return (arr_len);
19697 }
19698
19699 int mangle_chr_shiftl (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19700 {
19701 if (upos >= arr_len) return (arr_len);
19702
19703 arr[upos] <<= 1;
19704
19705 return (arr_len);
19706 }
19707
19708 int mangle_chr_shiftr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19709 {
19710 if (upos >= arr_len) return (arr_len);
19711
19712 arr[upos] >>= 1;
19713
19714 return (arr_len);
19715 }
19716
19717 int mangle_chr_incr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19718 {
19719 if (upos >= arr_len) return (arr_len);
19720
19721 arr[upos] += 1;
19722
19723 return (arr_len);
19724 }
19725
19726 int mangle_chr_decr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19727 {
19728 if (upos >= arr_len) return (arr_len);
19729
19730 arr[upos] -= 1;
19731
19732 return (arr_len);
19733 }
19734
19735 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
19736 {
19737 int upper_next = 1;
19738
19739 int pos;
19740
19741 for (pos = 0; pos < arr_len; pos++)
19742 {
19743 if (arr[pos] == ' ')
19744 {
19745 upper_next = 1;
19746
19747 continue;
19748 }
19749
19750 if (upper_next)
19751 {
19752 upper_next = 0;
19753
19754 MANGLE_UPPER_AT (arr, pos);
19755 }
19756 else
19757 {
19758 MANGLE_LOWER_AT (arr, pos);
19759 }
19760 }
19761
19762 return (arr_len);
19763 }
19764
19765 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], uint32_t rp_gen_func_min, uint32_t rp_gen_func_max)
19766 {
19767 uint32_t rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
19768
19769 uint32_t j;
19770
19771 uint32_t rule_pos = 0;
19772
19773 for (j = 0; j < rp_gen_num; j++)
19774 {
19775 uint32_t r = 0;
19776 uint32_t p1 = 0;
19777 uint32_t p2 = 0;
19778 uint32_t p3 = 0;
19779
19780 switch ((char) get_random_num (0, 9))
19781 {
19782 case 0:
19783 r = get_random_num (0, sizeof (grp_op_nop));
19784 rule_buf[rule_pos++] = grp_op_nop[r];
19785 break;
19786
19787 case 1:
19788 r = get_random_num (0, sizeof (grp_op_pos_p0));
19789 rule_buf[rule_pos++] = grp_op_pos_p0[r];
19790 p1 = get_random_num (0, sizeof (grp_pos));
19791 rule_buf[rule_pos++] = grp_pos[p1];
19792 break;
19793
19794 case 2:
19795 r = get_random_num (0, sizeof (grp_op_pos_p1));
19796 rule_buf[rule_pos++] = grp_op_pos_p1[r];
19797 p1 = get_random_num (1, 6);
19798 rule_buf[rule_pos++] = grp_pos[p1];
19799 break;
19800
19801 case 3:
19802 r = get_random_num (0, sizeof (grp_op_chr));
19803 rule_buf[rule_pos++] = grp_op_chr[r];
19804 p1 = get_random_num (0x20, 0x7e);
19805 rule_buf[rule_pos++] = (char) p1;
19806 break;
19807
19808 case 4:
19809 r = get_random_num (0, sizeof (grp_op_chr_chr));
19810 rule_buf[rule_pos++] = grp_op_chr_chr[r];
19811 p1 = get_random_num (0x20, 0x7e);
19812 rule_buf[rule_pos++] = (char) p1;
19813 p2 = get_random_num (0x20, 0x7e);
19814 while (p1 == p2)
19815 p2 = get_random_num (0x20, 0x7e);
19816 rule_buf[rule_pos++] = (char) p2;
19817 break;
19818
19819 case 5:
19820 r = get_random_num (0, sizeof (grp_op_pos_chr));
19821 rule_buf[rule_pos++] = grp_op_pos_chr[r];
19822 p1 = get_random_num (0, sizeof (grp_pos));
19823 rule_buf[rule_pos++] = grp_pos[p1];
19824 p2 = get_random_num (0x20, 0x7e);
19825 rule_buf[rule_pos++] = (char) p2;
19826 break;
19827
19828 case 6:
19829 r = get_random_num (0, sizeof (grp_op_pos_pos0));
19830 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
19831 p1 = get_random_num (0, sizeof (grp_pos));
19832 rule_buf[rule_pos++] = grp_pos[p1];
19833 p2 = get_random_num (0, sizeof (grp_pos));
19834 while (p1 == p2)
19835 p2 = get_random_num (0, sizeof (grp_pos));
19836 rule_buf[rule_pos++] = grp_pos[p2];
19837 break;
19838
19839 case 7:
19840 r = get_random_num (0, sizeof (grp_op_pos_pos1));
19841 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
19842 p1 = get_random_num (0, sizeof (grp_pos));
19843 rule_buf[rule_pos++] = grp_pos[p1];
19844 p2 = get_random_num (1, sizeof (grp_pos));
19845 while (p1 == p2)
19846 p2 = get_random_num (1, sizeof (grp_pos));
19847 rule_buf[rule_pos++] = grp_pos[p2];
19848 break;
19849
19850 case 8:
19851 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
19852 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
19853 p1 = get_random_num (0, sizeof (grp_pos));
19854 rule_buf[rule_pos++] = grp_pos[p1];
19855 p2 = get_random_num (1, sizeof (grp_pos));
19856 rule_buf[rule_pos++] = grp_pos[p1];
19857 p3 = get_random_num (0, sizeof (grp_pos));
19858 rule_buf[rule_pos++] = grp_pos[p3];
19859 break;
19860 }
19861 }
19862
19863 return (rule_pos);
19864 }
19865
19866 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
19867 {
19868 char mem[BLOCK_SIZE];
19869
19870 if (in == NULL) return (RULE_RC_REJECT_ERROR);
19871
19872 if (out == NULL) return (RULE_RC_REJECT_ERROR);
19873
19874 if (in_len < 1) return (RULE_RC_REJECT_ERROR);
19875
19876 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
19877
19878 int out_len = in_len;
19879 int mem_len = in_len;
19880
19881 memcpy (out, in, out_len);
19882
19883 int rule_pos;
19884
19885 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
19886 {
19887 int upos; int upos2;
19888 int ulen;
19889
19890 switch (rule[rule_pos])
19891 {
19892 case ' ':
19893 break;
19894
19895 case RULE_OP_MANGLE_NOOP:
19896 break;
19897
19898 case RULE_OP_MANGLE_LREST:
19899 out_len = mangle_lrest (out, out_len);
19900 break;
19901
19902 case RULE_OP_MANGLE_UREST:
19903 out_len = mangle_urest (out, out_len);
19904 break;
19905
19906 case RULE_OP_MANGLE_LREST_UFIRST:
19907 out_len = mangle_lrest (out, out_len);
19908 if (out_len) MANGLE_UPPER_AT (out, 0);
19909 break;
19910
19911 case RULE_OP_MANGLE_UREST_LFIRST:
19912 out_len = mangle_urest (out, out_len);
19913 if (out_len) MANGLE_LOWER_AT (out, 0);
19914 break;
19915
19916 case RULE_OP_MANGLE_TREST:
19917 out_len = mangle_trest (out, out_len);
19918 break;
19919
19920 case RULE_OP_MANGLE_TOGGLE_AT:
19921 NEXT_RULEPOS (rule_pos);
19922 NEXT_RPTOI (rule, rule_pos, upos);
19923 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
19924 break;
19925
19926 case RULE_OP_MANGLE_REVERSE:
19927 out_len = mangle_reverse (out, out_len);
19928 break;
19929
19930 case RULE_OP_MANGLE_DUPEWORD:
19931 out_len = mangle_double (out, out_len);
19932 break;
19933
19934 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19935 NEXT_RULEPOS (rule_pos);
19936 NEXT_RPTOI (rule, rule_pos, ulen);
19937 out_len = mangle_double_times (out, out_len, ulen);
19938 break;
19939
19940 case RULE_OP_MANGLE_REFLECT:
19941 out_len = mangle_reflect (out, out_len);
19942 break;
19943
19944 case RULE_OP_MANGLE_ROTATE_LEFT:
19945 mangle_rotate_left (out, out_len);
19946 break;
19947
19948 case RULE_OP_MANGLE_ROTATE_RIGHT:
19949 mangle_rotate_right (out, out_len);
19950 break;
19951
19952 case RULE_OP_MANGLE_APPEND:
19953 NEXT_RULEPOS (rule_pos);
19954 out_len = mangle_append (out, out_len, rule[rule_pos]);
19955 break;
19956
19957 case RULE_OP_MANGLE_PREPEND:
19958 NEXT_RULEPOS (rule_pos);
19959 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
19960 break;
19961
19962 case RULE_OP_MANGLE_DELETE_FIRST:
19963 out_len = mangle_delete_at (out, out_len, 0);
19964 break;
19965
19966 case RULE_OP_MANGLE_DELETE_LAST:
19967 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
19968 break;
19969
19970 case RULE_OP_MANGLE_DELETE_AT:
19971 NEXT_RULEPOS (rule_pos);
19972 NEXT_RPTOI (rule, rule_pos, upos);
19973 out_len = mangle_delete_at (out, out_len, upos);
19974 break;
19975
19976 case RULE_OP_MANGLE_EXTRACT:
19977 NEXT_RULEPOS (rule_pos);
19978 NEXT_RPTOI (rule, rule_pos, upos);
19979 NEXT_RULEPOS (rule_pos);
19980 NEXT_RPTOI (rule, rule_pos, ulen);
19981 out_len = mangle_extract (out, out_len, upos, ulen);
19982 break;
19983
19984 case RULE_OP_MANGLE_OMIT:
19985 NEXT_RULEPOS (rule_pos);
19986 NEXT_RPTOI (rule, rule_pos, upos);
19987 NEXT_RULEPOS (rule_pos);
19988 NEXT_RPTOI (rule, rule_pos, ulen);
19989 out_len = mangle_omit (out, out_len, upos, ulen);
19990 break;
19991
19992 case RULE_OP_MANGLE_INSERT:
19993 NEXT_RULEPOS (rule_pos);
19994 NEXT_RPTOI (rule, rule_pos, upos);
19995 NEXT_RULEPOS (rule_pos);
19996 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
19997 break;
19998
19999 case RULE_OP_MANGLE_OVERSTRIKE:
20000 NEXT_RULEPOS (rule_pos);
20001 NEXT_RPTOI (rule, rule_pos, upos);
20002 NEXT_RULEPOS (rule_pos);
20003 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
20004 break;
20005
20006 case RULE_OP_MANGLE_TRUNCATE_AT:
20007 NEXT_RULEPOS (rule_pos);
20008 NEXT_RPTOI (rule, rule_pos, upos);
20009 out_len = mangle_truncate_at (out, out_len, upos);
20010 break;
20011
20012 case RULE_OP_MANGLE_REPLACE:
20013 NEXT_RULEPOS (rule_pos);
20014 NEXT_RULEPOS (rule_pos);
20015 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20016 break;
20017
20018 case RULE_OP_MANGLE_PURGECHAR:
20019 NEXT_RULEPOS (rule_pos);
20020 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20021 break;
20022
20023 case RULE_OP_MANGLE_TOGGLECASE_REC:
20024 /* todo */
20025 break;
20026
20027 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20028 NEXT_RULEPOS (rule_pos);
20029 NEXT_RPTOI (rule, rule_pos, ulen);
20030 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20031 break;
20032
20033 case RULE_OP_MANGLE_DUPECHAR_LAST:
20034 NEXT_RULEPOS (rule_pos);
20035 NEXT_RPTOI (rule, rule_pos, ulen);
20036 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20037 break;
20038
20039 case RULE_OP_MANGLE_DUPECHAR_ALL:
20040 out_len = mangle_dupechar (out, out_len);
20041 break;
20042
20043 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20044 NEXT_RULEPOS (rule_pos);
20045 NEXT_RPTOI (rule, rule_pos, ulen);
20046 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20047 break;
20048
20049 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20050 NEXT_RULEPOS (rule_pos);
20051 NEXT_RPTOI (rule, rule_pos, ulen);
20052 out_len = mangle_dupeblock_append (out, out_len, ulen);
20053 break;
20054
20055 case RULE_OP_MANGLE_SWITCH_FIRST:
20056 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20057 break;
20058
20059 case RULE_OP_MANGLE_SWITCH_LAST:
20060 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20061 break;
20062
20063 case RULE_OP_MANGLE_SWITCH_AT:
20064 NEXT_RULEPOS (rule_pos);
20065 NEXT_RPTOI (rule, rule_pos, upos);
20066 NEXT_RULEPOS (rule_pos);
20067 NEXT_RPTOI (rule, rule_pos, upos2);
20068 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20069 break;
20070
20071 case RULE_OP_MANGLE_CHR_SHIFTL:
20072 NEXT_RULEPOS (rule_pos);
20073 NEXT_RPTOI (rule, rule_pos, upos);
20074 mangle_chr_shiftl ((uint8_t *) out, out_len, upos);
20075 break;
20076
20077 case RULE_OP_MANGLE_CHR_SHIFTR:
20078 NEXT_RULEPOS (rule_pos);
20079 NEXT_RPTOI (rule, rule_pos, upos);
20080 mangle_chr_shiftr ((uint8_t *) out, out_len, upos);
20081 break;
20082
20083 case RULE_OP_MANGLE_CHR_INCR:
20084 NEXT_RULEPOS (rule_pos);
20085 NEXT_RPTOI (rule, rule_pos, upos);
20086 mangle_chr_incr ((uint8_t *) out, out_len, upos);
20087 break;
20088
20089 case RULE_OP_MANGLE_CHR_DECR:
20090 NEXT_RULEPOS (rule_pos);
20091 NEXT_RPTOI (rule, rule_pos, upos);
20092 mangle_chr_decr ((uint8_t *) out, out_len, upos);
20093 break;
20094
20095 case RULE_OP_MANGLE_REPLACE_NP1:
20096 NEXT_RULEPOS (rule_pos);
20097 NEXT_RPTOI (rule, rule_pos, upos);
20098 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20099 break;
20100
20101 case RULE_OP_MANGLE_REPLACE_NM1:
20102 NEXT_RULEPOS (rule_pos);
20103 NEXT_RPTOI (rule, rule_pos, upos);
20104 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20105 break;
20106
20107 case RULE_OP_MANGLE_TITLE:
20108 out_len = mangle_title (out, out_len);
20109 break;
20110
20111 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20112 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20113 NEXT_RULEPOS (rule_pos);
20114 NEXT_RPTOI (rule, rule_pos, upos);
20115 NEXT_RULEPOS (rule_pos);
20116 NEXT_RPTOI (rule, rule_pos, ulen);
20117 NEXT_RULEPOS (rule_pos);
20118 NEXT_RPTOI (rule, rule_pos, upos2);
20119 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20120 break;
20121
20122 case RULE_OP_MANGLE_APPEND_MEMORY:
20123 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20124 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20125 memcpy (out + out_len, mem, mem_len);
20126 out_len += mem_len;
20127 break;
20128
20129 case RULE_OP_MANGLE_PREPEND_MEMORY:
20130 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20131 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20132 memcpy (mem + mem_len, out, out_len);
20133 out_len += mem_len;
20134 memcpy (out, mem, out_len);
20135 break;
20136
20137 case RULE_OP_MEMORIZE_WORD:
20138 memcpy (mem, out, out_len);
20139 mem_len = out_len;
20140 break;
20141
20142 case RULE_OP_REJECT_LESS:
20143 NEXT_RULEPOS (rule_pos);
20144 NEXT_RPTOI (rule, rule_pos, upos);
20145 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20146 break;
20147
20148 case RULE_OP_REJECT_GREATER:
20149 NEXT_RULEPOS (rule_pos);
20150 NEXT_RPTOI (rule, rule_pos, upos);
20151 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20152 break;
20153
20154 case RULE_OP_REJECT_CONTAIN:
20155 NEXT_RULEPOS (rule_pos);
20156 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20157 break;
20158
20159 case RULE_OP_REJECT_NOT_CONTAIN:
20160 NEXT_RULEPOS (rule_pos);
20161 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20162 break;
20163
20164 case RULE_OP_REJECT_EQUAL_FIRST:
20165 NEXT_RULEPOS (rule_pos);
20166 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20167 break;
20168
20169 case RULE_OP_REJECT_EQUAL_LAST:
20170 NEXT_RULEPOS (rule_pos);
20171 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20172 break;
20173
20174 case RULE_OP_REJECT_EQUAL_AT:
20175 NEXT_RULEPOS (rule_pos);
20176 NEXT_RPTOI (rule, rule_pos, upos);
20177 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20178 NEXT_RULEPOS (rule_pos);
20179 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20180 break;
20181
20182 case RULE_OP_REJECT_CONTAINS:
20183 NEXT_RULEPOS (rule_pos);
20184 NEXT_RPTOI (rule, rule_pos, upos);
20185 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20186 NEXT_RULEPOS (rule_pos);
20187 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20188 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20189 break;
20190
20191 case RULE_OP_REJECT_MEMORY:
20192 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20193 break;
20194
20195 default:
20196 return (RULE_RC_SYNTAX_ERROR);
20197 break;
20198 }
20199 }
20200
20201 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20202
20203 return (out_len);
20204 }