e972b7d5570b7518e865a79b1a7e27c685d8fe20
[hashcat.git] / src / shared.c
1 /**
2 * Authors.....: Jens Steube <jens.steube@gmail.com>
3 * Gabriele Gristina <matrix@hashcat.net>
4 * magnum <john.magnum@hushmail.com>
5 *
6 * License.....: MIT
7 */
8
9 #ifdef DARWIN
10 #include <stdio.h>
11 #endif
12
13 #ifdef __FreeBSD__
14 #include <stdio.h>
15 #include <pthread_np.h>
16 #endif
17
18 #include <shared.h>
19 #include <limits.h>
20
21 /**
22 * basic bit handling
23 */
24
25 u32 is_power_of_2(u32 v)
26 {
27 return (v && !(v & (v - 1)));
28 }
29
30 u32 rotl32 (const u32 a, const u32 n)
31 {
32 return ((a << n) | (a >> (32 - n)));
33 }
34
35 u32 rotr32 (const u32 a, const u32 n)
36 {
37 return ((a >> n) | (a << (32 - n)));
38 }
39
40 u64 rotl64 (const u64 a, const u64 n)
41 {
42 return ((a << n) | (a >> (64 - n)));
43 }
44
45 u64 rotr64 (const u64 a, const u64 n)
46 {
47 return ((a >> n) | (a << (64 - n)));
48 }
49
50 u32 byte_swap_32 (const u32 n)
51 {
52 return (n & 0xff000000) >> 24
53 | (n & 0x00ff0000) >> 8
54 | (n & 0x0000ff00) << 8
55 | (n & 0x000000ff) << 24;
56 }
57
58 u64 byte_swap_64 (const u64 n)
59 {
60 return (n & 0xff00000000000000ULL) >> 56
61 | (n & 0x00ff000000000000ULL) >> 40
62 | (n & 0x0000ff0000000000ULL) >> 24
63 | (n & 0x000000ff00000000ULL) >> 8
64 | (n & 0x00000000ff000000ULL) << 8
65 | (n & 0x0000000000ff0000ULL) << 24
66 | (n & 0x000000000000ff00ULL) << 40
67 | (n & 0x00000000000000ffULL) << 56;
68 }
69
70 /**
71 * ciphers for use on cpu
72 */
73
74 #include "cpu-des.c"
75 #include "cpu-aes.c"
76
77 /**
78 * hashes for use on cpu
79 */
80
81 #include "cpu-md5.c"
82 #include "cpu-sha1.c"
83 #include "cpu-sha256.c"
84
85 /**
86 * logging
87 */
88
89 int last_len = 0;
90
91 int log_final (FILE *fp, const char *fmt, va_list ap)
92 {
93 if (last_len)
94 {
95 fputc ('\r', fp);
96
97 for (int i = 0; i < last_len; i++)
98 {
99 fputc (' ', fp);
100 }
101
102 fputc ('\r', fp);
103 }
104
105 char s[4096] = { 0 };
106
107 int max_len = (int) sizeof (s);
108
109 int len = vsnprintf (s, max_len, fmt, ap);
110
111 if (len > max_len) len = max_len;
112
113 fwrite (s, len, 1, fp);
114
115 fflush (fp);
116
117 last_len = len;
118
119 return len;
120 }
121
122 int log_out_nn (FILE *fp, const char *fmt, ...)
123 {
124 if (SUPPRESS_OUTPUT) return 0;
125
126 va_list ap;
127
128 va_start (ap, fmt);
129
130 const int len = log_final (fp, fmt, ap);
131
132 va_end (ap);
133
134 return len;
135 }
136
137 int log_info_nn (const char *fmt, ...)
138 {
139 if (SUPPRESS_OUTPUT) return 0;
140
141 va_list ap;
142
143 va_start (ap, fmt);
144
145 const int len = log_final (stdout, fmt, ap);
146
147 va_end (ap);
148
149 return len;
150 }
151
152 int log_error_nn (const char *fmt, ...)
153 {
154 if (SUPPRESS_OUTPUT) return 0;
155
156 va_list ap;
157
158 va_start (ap, fmt);
159
160 const int len = log_final (stderr, fmt, ap);
161
162 va_end (ap);
163
164 return len;
165 }
166
167 int log_out (FILE *fp, const char *fmt, ...)
168 {
169 if (SUPPRESS_OUTPUT) return 0;
170
171 va_list ap;
172
173 va_start (ap, fmt);
174
175 const int len = log_final (fp, fmt, ap);
176
177 va_end (ap);
178
179 fputc ('\n', fp);
180
181 last_len = 0;
182
183 return len;
184 }
185
186 int log_info (const char *fmt, ...)
187 {
188 if (SUPPRESS_OUTPUT) return 0;
189
190 va_list ap;
191
192 va_start (ap, fmt);
193
194 const int len = log_final (stdout, fmt, ap);
195
196 va_end (ap);
197
198 fputc ('\n', stdout);
199
200 last_len = 0;
201
202 return len;
203 }
204
205 int log_error (const char *fmt, ...)
206 {
207 if (SUPPRESS_OUTPUT) return 0;
208
209 fputc ('\n', stderr);
210 fputc ('\n', stderr);
211
212 va_list ap;
213
214 va_start (ap, fmt);
215
216 const int len = log_final (stderr, fmt, ap);
217
218 va_end (ap);
219
220 fputc ('\n', stderr);
221 fputc ('\n', stderr);
222
223 last_len = 0;
224
225 return len;
226 }
227
228 /**
229 * converter
230 */
231
232 u8 int_to_base32 (const u8 c)
233 {
234 static const u8 tbl[0x20] =
235 {
236 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
237 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
238 };
239
240 return tbl[c];
241 }
242
243 u8 base32_to_int (const u8 c)
244 {
245 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
246 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
247
248 return 0;
249 }
250
251 u8 int_to_itoa32 (const u8 c)
252 {
253 static const u8 tbl[0x20] =
254 {
255 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
256 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
257 };
258
259 return tbl[c];
260 }
261
262 u8 itoa32_to_int (const u8 c)
263 {
264 if ((c >= '0') && (c <= '9')) return c - '0';
265 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
266
267 return 0;
268 }
269
270 u8 int_to_itoa64 (const u8 c)
271 {
272 static const u8 tbl[0x40] =
273 {
274 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
275 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
276 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
277 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
278 };
279
280 return tbl[c];
281 }
282
283 u8 itoa64_to_int (const u8 c)
284 {
285 static const u8 tbl[0x100] =
286 {
287 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
288 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
289 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
290 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
291 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
292 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
293 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
294 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
295 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
296 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
297 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
298 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
299 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
300 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
301 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
302 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
303 };
304
305 return tbl[c];
306 }
307
308 u8 int_to_base64 (const u8 c)
309 {
310 static const u8 tbl[0x40] =
311 {
312 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
313 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
314 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
315 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
316 };
317
318 return tbl[c];
319 }
320
321 u8 base64_to_int (const u8 c)
322 {
323 static const u8 tbl[0x100] =
324 {
325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
327 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
328 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
329 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
330 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
331 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
332 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
336 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
341 };
342
343 return tbl[c];
344 }
345
346 u8 int_to_bf64 (const u8 c)
347 {
348 static const u8 tbl[0x40] =
349 {
350 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
351 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
352 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
353 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
354 };
355
356 return tbl[c];
357 }
358
359 u8 bf64_to_int (const u8 c)
360 {
361 static const u8 tbl[0x100] =
362 {
363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
364 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
366 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
368 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
369 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
370 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
371 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
372 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
373 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
374 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
379 };
380
381 return tbl[c];
382 }
383
384 u8 int_to_lotus64 (const u8 c)
385 {
386 if (c < 10) return '0' + c;
387 else if (c < 36) return 'A' + c - 10;
388 else if (c < 62) return 'a' + c - 36;
389 else if (c == 62) return '+';
390 else if (c == 63) return '/';
391
392 return 0;
393 }
394
395 u8 lotus64_to_int (const u8 c)
396 {
397 if ((c >= '0') && (c <= '9')) return c - '0';
398 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
399 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
400 else if (c == '+') return 62;
401 else if (c == '/') return 63;
402 else
403
404 return 0;
405 }
406
407 int base32_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
408 {
409 const u8 *in_ptr = in_buf;
410
411 u8 *out_ptr = out_buf;
412
413 for (int i = 0; i < in_len; i += 8)
414 {
415 const u8 out_val0 = f (in_ptr[0] & 0x7f);
416 const u8 out_val1 = f (in_ptr[1] & 0x7f);
417 const u8 out_val2 = f (in_ptr[2] & 0x7f);
418 const u8 out_val3 = f (in_ptr[3] & 0x7f);
419 const u8 out_val4 = f (in_ptr[4] & 0x7f);
420 const u8 out_val5 = f (in_ptr[5] & 0x7f);
421 const u8 out_val6 = f (in_ptr[6] & 0x7f);
422 const u8 out_val7 = f (in_ptr[7] & 0x7f);
423
424 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
425 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
426 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
427 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
428 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
429
430 in_ptr += 8;
431 out_ptr += 5;
432 }
433
434 for (int i = 0; i < in_len; i++)
435 {
436 if (in_buf[i] != '=') continue;
437
438 in_len = i;
439 }
440
441 int out_len = (in_len * 5) / 8;
442
443 return out_len;
444 }
445
446 int base32_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
447 {
448 const u8 *in_ptr = in_buf;
449
450 u8 *out_ptr = out_buf;
451
452 for (int i = 0; i < in_len; i += 5)
453 {
454 const u8 out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
455 const u8 out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
456 const u8 out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
457 const u8 out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
458 const u8 out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
459 const u8 out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
460 const u8 out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
461 const u8 out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
462
463 out_ptr[0] = out_val0 & 0x7f;
464 out_ptr[1] = out_val1 & 0x7f;
465 out_ptr[2] = out_val2 & 0x7f;
466 out_ptr[3] = out_val3 & 0x7f;
467 out_ptr[4] = out_val4 & 0x7f;
468 out_ptr[5] = out_val5 & 0x7f;
469 out_ptr[6] = out_val6 & 0x7f;
470 out_ptr[7] = out_val7 & 0x7f;
471
472 in_ptr += 5;
473 out_ptr += 8;
474 }
475
476 int out_len = (int) (((0.5 + (float) in_len) * 8) / 5); // ceil (in_len * 8 / 5)
477
478 while (out_len % 8)
479 {
480 out_buf[out_len] = '=';
481
482 out_len++;
483 }
484
485 return out_len;
486 }
487
488 int base64_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
489 {
490 const u8 *in_ptr = in_buf;
491
492 u8 *out_ptr = out_buf;
493
494 for (int i = 0; i < in_len; i += 4)
495 {
496 const u8 out_val0 = f (in_ptr[0] & 0x7f);
497 const u8 out_val1 = f (in_ptr[1] & 0x7f);
498 const u8 out_val2 = f (in_ptr[2] & 0x7f);
499 const u8 out_val3 = f (in_ptr[3] & 0x7f);
500
501 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
502 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
503 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
504
505 in_ptr += 4;
506 out_ptr += 3;
507 }
508
509 for (int i = 0; i < in_len; i++)
510 {
511 if (in_buf[i] != '=') continue;
512
513 in_len = i;
514 }
515
516 int out_len = (in_len * 6) / 8;
517
518 return out_len;
519 }
520
521 int base64_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
522 {
523 const u8 *in_ptr = in_buf;
524
525 u8 *out_ptr = out_buf;
526
527 for (int i = 0; i < in_len; i += 3)
528 {
529 const u8 out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
530 const u8 out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
531 const u8 out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
532 const u8 out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
533
534 out_ptr[0] = out_val0 & 0x7f;
535 out_ptr[1] = out_val1 & 0x7f;
536 out_ptr[2] = out_val2 & 0x7f;
537 out_ptr[3] = out_val3 & 0x7f;
538
539 in_ptr += 3;
540 out_ptr += 4;
541 }
542
543 int out_len = (int) (((0.5 + (float) in_len) * 8) / 6); // ceil (in_len * 8 / 6)
544
545 while (out_len % 4)
546 {
547 out_buf[out_len] = '=';
548
549 out_len++;
550 }
551
552 return out_len;
553 }
554
555 int is_valid_hex_char (const u8 c)
556 {
557 if ((c >= '0') && (c <= '9')) return 1;
558 if ((c >= 'A') && (c <= 'F')) return 1;
559 if ((c >= 'a') && (c <= 'f')) return 1;
560
561 return 0;
562 }
563
564 u8 hex_convert (const u8 c)
565 {
566 return (c & 15) + (c >> 6) * 9;
567 }
568
569 u8 hex_to_u8 (const u8 hex[2])
570 {
571 u8 v = 0;
572
573 v |= (hex_convert (hex[1]) << 0);
574 v |= (hex_convert (hex[0]) << 4);
575
576 return (v);
577 }
578
579 u32 hex_to_u32 (const u8 hex[8])
580 {
581 u32 v = 0;
582
583 v |= ((u32) hex_convert (hex[7])) << 0;
584 v |= ((u32) hex_convert (hex[6])) << 4;
585 v |= ((u32) hex_convert (hex[5])) << 8;
586 v |= ((u32) hex_convert (hex[4])) << 12;
587 v |= ((u32) hex_convert (hex[3])) << 16;
588 v |= ((u32) hex_convert (hex[2])) << 20;
589 v |= ((u32) hex_convert (hex[1])) << 24;
590 v |= ((u32) hex_convert (hex[0])) << 28;
591
592 return (v);
593 }
594
595 u64 hex_to_u64 (const u8 hex[16])
596 {
597 u64 v = 0;
598
599 v |= ((u64) hex_convert (hex[15]) << 0);
600 v |= ((u64) hex_convert (hex[14]) << 4);
601 v |= ((u64) hex_convert (hex[13]) << 8);
602 v |= ((u64) hex_convert (hex[12]) << 12);
603 v |= ((u64) hex_convert (hex[11]) << 16);
604 v |= ((u64) hex_convert (hex[10]) << 20);
605 v |= ((u64) hex_convert (hex[ 9]) << 24);
606 v |= ((u64) hex_convert (hex[ 8]) << 28);
607 v |= ((u64) hex_convert (hex[ 7]) << 32);
608 v |= ((u64) hex_convert (hex[ 6]) << 36);
609 v |= ((u64) hex_convert (hex[ 5]) << 40);
610 v |= ((u64) hex_convert (hex[ 4]) << 44);
611 v |= ((u64) hex_convert (hex[ 3]) << 48);
612 v |= ((u64) hex_convert (hex[ 2]) << 52);
613 v |= ((u64) hex_convert (hex[ 1]) << 56);
614 v |= ((u64) hex_convert (hex[ 0]) << 60);
615
616 return (v);
617 }
618
619 void bin_to_hex_lower (const u32 v, u8 hex[8])
620 {
621 hex[0] = v >> 28 & 15;
622 hex[1] = v >> 24 & 15;
623 hex[2] = v >> 20 & 15;
624 hex[3] = v >> 16 & 15;
625 hex[4] = v >> 12 & 15;
626 hex[5] = v >> 8 & 15;
627 hex[6] = v >> 4 & 15;
628 hex[7] = v >> 0 & 15;
629
630 u32 add;
631
632 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
633 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
634 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
635 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
636 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
637 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
638 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
639 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
640 }
641
642 /**
643 * decoder
644 */
645
646 static void AES128_decrypt_cbc (const u32 key[4], const u32 iv[4], const u32 in[16], u32 out[16])
647 {
648 AES_KEY skey;
649
650 AES_set_decrypt_key ((const u8 *) key, 128, &skey);
651
652 u32 _iv[4] = { 0 };
653
654 _iv[0] = iv[0];
655 _iv[1] = iv[1];
656 _iv[2] = iv[2];
657 _iv[3] = iv[3];
658
659 for (int i = 0; i < 16; i += 4)
660 {
661 u32 _in[4] = { 0 };
662 u32 _out[4] = { 0 };
663
664 _in[0] = in[i + 0];
665 _in[1] = in[i + 1];
666 _in[2] = in[i + 2];
667 _in[3] = in[i + 3];
668
669 AES_decrypt (&skey, (const u8 *) _in, (u8 *) _out);
670
671 _out[0] ^= _iv[0];
672 _out[1] ^= _iv[1];
673 _out[2] ^= _iv[2];
674 _out[3] ^= _iv[3];
675
676 out[i + 0] = _out[0];
677 out[i + 1] = _out[1];
678 out[i + 2] = _out[2];
679 out[i + 3] = _out[3];
680
681 _iv[0] = _in[0];
682 _iv[1] = _in[1];
683 _iv[2] = _in[2];
684 _iv[3] = _in[3];
685 }
686 }
687
688 static void juniper_decrypt_hash (char *in, char *out)
689 {
690 // base64 decode
691
692 u8 base64_buf[100] = { 0 };
693
694 base64_decode (base64_to_int, (const u8 *) in, DISPLAY_LEN_MIN_501, base64_buf);
695
696 // iv stuff
697
698 u32 juniper_iv[4] = { 0 };
699
700 memcpy (juniper_iv, base64_buf, 12);
701
702 memcpy (out, juniper_iv, 12);
703
704 // reversed key
705
706 u32 juniper_key[4] = { 0 };
707
708 juniper_key[0] = byte_swap_32 (0xa6707a7e);
709 juniper_key[1] = byte_swap_32 (0x8df91059);
710 juniper_key[2] = byte_swap_32 (0xdea70ae5);
711 juniper_key[3] = byte_swap_32 (0x2f9c2442);
712
713 // AES decrypt
714
715 u32 *in_ptr = (u32 *) (base64_buf + 12);
716 u32 *out_ptr = (u32 *) (out + 12);
717
718 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
719 }
720
721 void phpass_decode (u8 digest[16], u8 buf[22])
722 {
723 int l;
724
725 l = itoa64_to_int (buf[ 0]) << 0;
726 l |= itoa64_to_int (buf[ 1]) << 6;
727 l |= itoa64_to_int (buf[ 2]) << 12;
728 l |= itoa64_to_int (buf[ 3]) << 18;
729
730 digest[ 0] = (l >> 0) & 0xff;
731 digest[ 1] = (l >> 8) & 0xff;
732 digest[ 2] = (l >> 16) & 0xff;
733
734 l = itoa64_to_int (buf[ 4]) << 0;
735 l |= itoa64_to_int (buf[ 5]) << 6;
736 l |= itoa64_to_int (buf[ 6]) << 12;
737 l |= itoa64_to_int (buf[ 7]) << 18;
738
739 digest[ 3] = (l >> 0) & 0xff;
740 digest[ 4] = (l >> 8) & 0xff;
741 digest[ 5] = (l >> 16) & 0xff;
742
743 l = itoa64_to_int (buf[ 8]) << 0;
744 l |= itoa64_to_int (buf[ 9]) << 6;
745 l |= itoa64_to_int (buf[10]) << 12;
746 l |= itoa64_to_int (buf[11]) << 18;
747
748 digest[ 6] = (l >> 0) & 0xff;
749 digest[ 7] = (l >> 8) & 0xff;
750 digest[ 8] = (l >> 16) & 0xff;
751
752 l = itoa64_to_int (buf[12]) << 0;
753 l |= itoa64_to_int (buf[13]) << 6;
754 l |= itoa64_to_int (buf[14]) << 12;
755 l |= itoa64_to_int (buf[15]) << 18;
756
757 digest[ 9] = (l >> 0) & 0xff;
758 digest[10] = (l >> 8) & 0xff;
759 digest[11] = (l >> 16) & 0xff;
760
761 l = itoa64_to_int (buf[16]) << 0;
762 l |= itoa64_to_int (buf[17]) << 6;
763 l |= itoa64_to_int (buf[18]) << 12;
764 l |= itoa64_to_int (buf[19]) << 18;
765
766 digest[12] = (l >> 0) & 0xff;
767 digest[13] = (l >> 8) & 0xff;
768 digest[14] = (l >> 16) & 0xff;
769
770 l = itoa64_to_int (buf[20]) << 0;
771 l |= itoa64_to_int (buf[21]) << 6;
772
773 digest[15] = (l >> 0) & 0xff;
774 }
775
776 void phpass_encode (u8 digest[16], u8 buf[22])
777 {
778 int l;
779
780 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
781
782 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
783 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
784 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
785 buf[ 3] = int_to_itoa64 (l & 0x3f);
786
787 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
788
789 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
790 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
791 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
792 buf[ 7] = int_to_itoa64 (l & 0x3f);
793
794 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
795
796 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
797 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
798 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
799 buf[11] = int_to_itoa64 (l & 0x3f);
800
801 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
802
803 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
804 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
805 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
806 buf[15] = int_to_itoa64 (l & 0x3f);
807
808 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
809
810 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
811 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
812 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
813 buf[19] = int_to_itoa64 (l & 0x3f);
814
815 l = (digest[15] << 0);
816
817 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
818 buf[21] = int_to_itoa64 (l & 0x3f);
819 }
820
821 void md5crypt_decode (u8 digest[16], u8 buf[22])
822 {
823 int l;
824
825 l = itoa64_to_int (buf[ 0]) << 0;
826 l |= itoa64_to_int (buf[ 1]) << 6;
827 l |= itoa64_to_int (buf[ 2]) << 12;
828 l |= itoa64_to_int (buf[ 3]) << 18;
829
830 digest[ 0] = (l >> 16) & 0xff;
831 digest[ 6] = (l >> 8) & 0xff;
832 digest[12] = (l >> 0) & 0xff;
833
834 l = itoa64_to_int (buf[ 4]) << 0;
835 l |= itoa64_to_int (buf[ 5]) << 6;
836 l |= itoa64_to_int (buf[ 6]) << 12;
837 l |= itoa64_to_int (buf[ 7]) << 18;
838
839 digest[ 1] = (l >> 16) & 0xff;
840 digest[ 7] = (l >> 8) & 0xff;
841 digest[13] = (l >> 0) & 0xff;
842
843 l = itoa64_to_int (buf[ 8]) << 0;
844 l |= itoa64_to_int (buf[ 9]) << 6;
845 l |= itoa64_to_int (buf[10]) << 12;
846 l |= itoa64_to_int (buf[11]) << 18;
847
848 digest[ 2] = (l >> 16) & 0xff;
849 digest[ 8] = (l >> 8) & 0xff;
850 digest[14] = (l >> 0) & 0xff;
851
852 l = itoa64_to_int (buf[12]) << 0;
853 l |= itoa64_to_int (buf[13]) << 6;
854 l |= itoa64_to_int (buf[14]) << 12;
855 l |= itoa64_to_int (buf[15]) << 18;
856
857 digest[ 3] = (l >> 16) & 0xff;
858 digest[ 9] = (l >> 8) & 0xff;
859 digest[15] = (l >> 0) & 0xff;
860
861 l = itoa64_to_int (buf[16]) << 0;
862 l |= itoa64_to_int (buf[17]) << 6;
863 l |= itoa64_to_int (buf[18]) << 12;
864 l |= itoa64_to_int (buf[19]) << 18;
865
866 digest[ 4] = (l >> 16) & 0xff;
867 digest[10] = (l >> 8) & 0xff;
868 digest[ 5] = (l >> 0) & 0xff;
869
870 l = itoa64_to_int (buf[20]) << 0;
871 l |= itoa64_to_int (buf[21]) << 6;
872
873 digest[11] = (l >> 0) & 0xff;
874 }
875
876 void md5crypt_encode (u8 digest[16], u8 buf[22])
877 {
878 int l;
879
880 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
881
882 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
883 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
884 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
885 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
886
887 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
888
889 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
890 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
891 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
892 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
893
894 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
895
896 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
897 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
898 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
899 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
900
901 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
902
903 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
904 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
905 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
906 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
907
908 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
909
910 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
911 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
912 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
913 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
914
915 l = (digest[11] << 0);
916
917 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
918 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
919 }
920
921 void sha512crypt_decode (u8 digest[64], u8 buf[86])
922 {
923 int l;
924
925 l = itoa64_to_int (buf[ 0]) << 0;
926 l |= itoa64_to_int (buf[ 1]) << 6;
927 l |= itoa64_to_int (buf[ 2]) << 12;
928 l |= itoa64_to_int (buf[ 3]) << 18;
929
930 digest[ 0] = (l >> 16) & 0xff;
931 digest[21] = (l >> 8) & 0xff;
932 digest[42] = (l >> 0) & 0xff;
933
934 l = itoa64_to_int (buf[ 4]) << 0;
935 l |= itoa64_to_int (buf[ 5]) << 6;
936 l |= itoa64_to_int (buf[ 6]) << 12;
937 l |= itoa64_to_int (buf[ 7]) << 18;
938
939 digest[22] = (l >> 16) & 0xff;
940 digest[43] = (l >> 8) & 0xff;
941 digest[ 1] = (l >> 0) & 0xff;
942
943 l = itoa64_to_int (buf[ 8]) << 0;
944 l |= itoa64_to_int (buf[ 9]) << 6;
945 l |= itoa64_to_int (buf[10]) << 12;
946 l |= itoa64_to_int (buf[11]) << 18;
947
948 digest[44] = (l >> 16) & 0xff;
949 digest[ 2] = (l >> 8) & 0xff;
950 digest[23] = (l >> 0) & 0xff;
951
952 l = itoa64_to_int (buf[12]) << 0;
953 l |= itoa64_to_int (buf[13]) << 6;
954 l |= itoa64_to_int (buf[14]) << 12;
955 l |= itoa64_to_int (buf[15]) << 18;
956
957 digest[ 3] = (l >> 16) & 0xff;
958 digest[24] = (l >> 8) & 0xff;
959 digest[45] = (l >> 0) & 0xff;
960
961 l = itoa64_to_int (buf[16]) << 0;
962 l |= itoa64_to_int (buf[17]) << 6;
963 l |= itoa64_to_int (buf[18]) << 12;
964 l |= itoa64_to_int (buf[19]) << 18;
965
966 digest[25] = (l >> 16) & 0xff;
967 digest[46] = (l >> 8) & 0xff;
968 digest[ 4] = (l >> 0) & 0xff;
969
970 l = itoa64_to_int (buf[20]) << 0;
971 l |= itoa64_to_int (buf[21]) << 6;
972 l |= itoa64_to_int (buf[22]) << 12;
973 l |= itoa64_to_int (buf[23]) << 18;
974
975 digest[47] = (l >> 16) & 0xff;
976 digest[ 5] = (l >> 8) & 0xff;
977 digest[26] = (l >> 0) & 0xff;
978
979 l = itoa64_to_int (buf[24]) << 0;
980 l |= itoa64_to_int (buf[25]) << 6;
981 l |= itoa64_to_int (buf[26]) << 12;
982 l |= itoa64_to_int (buf[27]) << 18;
983
984 digest[ 6] = (l >> 16) & 0xff;
985 digest[27] = (l >> 8) & 0xff;
986 digest[48] = (l >> 0) & 0xff;
987
988 l = itoa64_to_int (buf[28]) << 0;
989 l |= itoa64_to_int (buf[29]) << 6;
990 l |= itoa64_to_int (buf[30]) << 12;
991 l |= itoa64_to_int (buf[31]) << 18;
992
993 digest[28] = (l >> 16) & 0xff;
994 digest[49] = (l >> 8) & 0xff;
995 digest[ 7] = (l >> 0) & 0xff;
996
997 l = itoa64_to_int (buf[32]) << 0;
998 l |= itoa64_to_int (buf[33]) << 6;
999 l |= itoa64_to_int (buf[34]) << 12;
1000 l |= itoa64_to_int (buf[35]) << 18;
1001
1002 digest[50] = (l >> 16) & 0xff;
1003 digest[ 8] = (l >> 8) & 0xff;
1004 digest[29] = (l >> 0) & 0xff;
1005
1006 l = itoa64_to_int (buf[36]) << 0;
1007 l |= itoa64_to_int (buf[37]) << 6;
1008 l |= itoa64_to_int (buf[38]) << 12;
1009 l |= itoa64_to_int (buf[39]) << 18;
1010
1011 digest[ 9] = (l >> 16) & 0xff;
1012 digest[30] = (l >> 8) & 0xff;
1013 digest[51] = (l >> 0) & 0xff;
1014
1015 l = itoa64_to_int (buf[40]) << 0;
1016 l |= itoa64_to_int (buf[41]) << 6;
1017 l |= itoa64_to_int (buf[42]) << 12;
1018 l |= itoa64_to_int (buf[43]) << 18;
1019
1020 digest[31] = (l >> 16) & 0xff;
1021 digest[52] = (l >> 8) & 0xff;
1022 digest[10] = (l >> 0) & 0xff;
1023
1024 l = itoa64_to_int (buf[44]) << 0;
1025 l |= itoa64_to_int (buf[45]) << 6;
1026 l |= itoa64_to_int (buf[46]) << 12;
1027 l |= itoa64_to_int (buf[47]) << 18;
1028
1029 digest[53] = (l >> 16) & 0xff;
1030 digest[11] = (l >> 8) & 0xff;
1031 digest[32] = (l >> 0) & 0xff;
1032
1033 l = itoa64_to_int (buf[48]) << 0;
1034 l |= itoa64_to_int (buf[49]) << 6;
1035 l |= itoa64_to_int (buf[50]) << 12;
1036 l |= itoa64_to_int (buf[51]) << 18;
1037
1038 digest[12] = (l >> 16) & 0xff;
1039 digest[33] = (l >> 8) & 0xff;
1040 digest[54] = (l >> 0) & 0xff;
1041
1042 l = itoa64_to_int (buf[52]) << 0;
1043 l |= itoa64_to_int (buf[53]) << 6;
1044 l |= itoa64_to_int (buf[54]) << 12;
1045 l |= itoa64_to_int (buf[55]) << 18;
1046
1047 digest[34] = (l >> 16) & 0xff;
1048 digest[55] = (l >> 8) & 0xff;
1049 digest[13] = (l >> 0) & 0xff;
1050
1051 l = itoa64_to_int (buf[56]) << 0;
1052 l |= itoa64_to_int (buf[57]) << 6;
1053 l |= itoa64_to_int (buf[58]) << 12;
1054 l |= itoa64_to_int (buf[59]) << 18;
1055
1056 digest[56] = (l >> 16) & 0xff;
1057 digest[14] = (l >> 8) & 0xff;
1058 digest[35] = (l >> 0) & 0xff;
1059
1060 l = itoa64_to_int (buf[60]) << 0;
1061 l |= itoa64_to_int (buf[61]) << 6;
1062 l |= itoa64_to_int (buf[62]) << 12;
1063 l |= itoa64_to_int (buf[63]) << 18;
1064
1065 digest[15] = (l >> 16) & 0xff;
1066 digest[36] = (l >> 8) & 0xff;
1067 digest[57] = (l >> 0) & 0xff;
1068
1069 l = itoa64_to_int (buf[64]) << 0;
1070 l |= itoa64_to_int (buf[65]) << 6;
1071 l |= itoa64_to_int (buf[66]) << 12;
1072 l |= itoa64_to_int (buf[67]) << 18;
1073
1074 digest[37] = (l >> 16) & 0xff;
1075 digest[58] = (l >> 8) & 0xff;
1076 digest[16] = (l >> 0) & 0xff;
1077
1078 l = itoa64_to_int (buf[68]) << 0;
1079 l |= itoa64_to_int (buf[69]) << 6;
1080 l |= itoa64_to_int (buf[70]) << 12;
1081 l |= itoa64_to_int (buf[71]) << 18;
1082
1083 digest[59] = (l >> 16) & 0xff;
1084 digest[17] = (l >> 8) & 0xff;
1085 digest[38] = (l >> 0) & 0xff;
1086
1087 l = itoa64_to_int (buf[72]) << 0;
1088 l |= itoa64_to_int (buf[73]) << 6;
1089 l |= itoa64_to_int (buf[74]) << 12;
1090 l |= itoa64_to_int (buf[75]) << 18;
1091
1092 digest[18] = (l >> 16) & 0xff;
1093 digest[39] = (l >> 8) & 0xff;
1094 digest[60] = (l >> 0) & 0xff;
1095
1096 l = itoa64_to_int (buf[76]) << 0;
1097 l |= itoa64_to_int (buf[77]) << 6;
1098 l |= itoa64_to_int (buf[78]) << 12;
1099 l |= itoa64_to_int (buf[79]) << 18;
1100
1101 digest[40] = (l >> 16) & 0xff;
1102 digest[61] = (l >> 8) & 0xff;
1103 digest[19] = (l >> 0) & 0xff;
1104
1105 l = itoa64_to_int (buf[80]) << 0;
1106 l |= itoa64_to_int (buf[81]) << 6;
1107 l |= itoa64_to_int (buf[82]) << 12;
1108 l |= itoa64_to_int (buf[83]) << 18;
1109
1110 digest[62] = (l >> 16) & 0xff;
1111 digest[20] = (l >> 8) & 0xff;
1112 digest[41] = (l >> 0) & 0xff;
1113
1114 l = itoa64_to_int (buf[84]) << 0;
1115 l |= itoa64_to_int (buf[85]) << 6;
1116
1117 digest[63] = (l >> 0) & 0xff;
1118 }
1119
1120 void sha512crypt_encode (u8 digest[64], u8 buf[86])
1121 {
1122 int l;
1123
1124 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1125
1126 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1127 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1128 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1129 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1130
1131 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1132
1133 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1134 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1135 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1136 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1137
1138 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1139
1140 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1141 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1142 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1143 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1144
1145 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1146
1147 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1148 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1149 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1150 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1151
1152 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1153
1154 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1155 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1156 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1157 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1158
1159 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1160
1161 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1162 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1163 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1164 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1165
1166 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1167
1168 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1169 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1170 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1171 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1172
1173 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1174
1175 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1176 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1177 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1178 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1179
1180 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1181
1182 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1183 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1184 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1185 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1186
1187 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1188
1189 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1190 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1191 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1192 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1193
1194 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1195
1196 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1197 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1198 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1199 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1200
1201 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1202
1203 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1204 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1205 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1206 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1207
1208 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1209
1210 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1211 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1212 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1213 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1214
1215 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1216
1217 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1218 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1219 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1220 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1221
1222 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1223
1224 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1225 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1226 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1227 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1228
1229 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1230
1231 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1232 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1233 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1234 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1235
1236 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1237
1238 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1239 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1240 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1241 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1242
1243 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1244
1245 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1246 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1247 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1248 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1249
1250 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1251
1252 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1253 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1254 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1255 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1256
1257 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1258
1259 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1260 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1261 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1262 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1263
1264 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1265
1266 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1267 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1268 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1269 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1270
1271 l = 0 | 0 | (digest[63] << 0);
1272
1273 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1274 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1275 }
1276
1277 void sha1aix_decode (u8 digest[20], u8 buf[27])
1278 {
1279 int l;
1280
1281 l = itoa64_to_int (buf[ 0]) << 0;
1282 l |= itoa64_to_int (buf[ 1]) << 6;
1283 l |= itoa64_to_int (buf[ 2]) << 12;
1284 l |= itoa64_to_int (buf[ 3]) << 18;
1285
1286 digest[ 2] = (l >> 0) & 0xff;
1287 digest[ 1] = (l >> 8) & 0xff;
1288 digest[ 0] = (l >> 16) & 0xff;
1289
1290 l = itoa64_to_int (buf[ 4]) << 0;
1291 l |= itoa64_to_int (buf[ 5]) << 6;
1292 l |= itoa64_to_int (buf[ 6]) << 12;
1293 l |= itoa64_to_int (buf[ 7]) << 18;
1294
1295 digest[ 5] = (l >> 0) & 0xff;
1296 digest[ 4] = (l >> 8) & 0xff;
1297 digest[ 3] = (l >> 16) & 0xff;
1298
1299 l = itoa64_to_int (buf[ 8]) << 0;
1300 l |= itoa64_to_int (buf[ 9]) << 6;
1301 l |= itoa64_to_int (buf[10]) << 12;
1302 l |= itoa64_to_int (buf[11]) << 18;
1303
1304 digest[ 8] = (l >> 0) & 0xff;
1305 digest[ 7] = (l >> 8) & 0xff;
1306 digest[ 6] = (l >> 16) & 0xff;
1307
1308 l = itoa64_to_int (buf[12]) << 0;
1309 l |= itoa64_to_int (buf[13]) << 6;
1310 l |= itoa64_to_int (buf[14]) << 12;
1311 l |= itoa64_to_int (buf[15]) << 18;
1312
1313 digest[11] = (l >> 0) & 0xff;
1314 digest[10] = (l >> 8) & 0xff;
1315 digest[ 9] = (l >> 16) & 0xff;
1316
1317 l = itoa64_to_int (buf[16]) << 0;
1318 l |= itoa64_to_int (buf[17]) << 6;
1319 l |= itoa64_to_int (buf[18]) << 12;
1320 l |= itoa64_to_int (buf[19]) << 18;
1321
1322 digest[14] = (l >> 0) & 0xff;
1323 digest[13] = (l >> 8) & 0xff;
1324 digest[12] = (l >> 16) & 0xff;
1325
1326 l = itoa64_to_int (buf[20]) << 0;
1327 l |= itoa64_to_int (buf[21]) << 6;
1328 l |= itoa64_to_int (buf[22]) << 12;
1329 l |= itoa64_to_int (buf[23]) << 18;
1330
1331 digest[17] = (l >> 0) & 0xff;
1332 digest[16] = (l >> 8) & 0xff;
1333 digest[15] = (l >> 16) & 0xff;
1334
1335 l = itoa64_to_int (buf[24]) << 0;
1336 l |= itoa64_to_int (buf[25]) << 6;
1337 l |= itoa64_to_int (buf[26]) << 12;
1338
1339 digest[19] = (l >> 8) & 0xff;
1340 digest[18] = (l >> 16) & 0xff;
1341 }
1342
1343 void sha1aix_encode (u8 digest[20], u8 buf[27])
1344 {
1345 int l;
1346
1347 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1348
1349 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1350 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1351 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1352 buf[ 3] = int_to_itoa64 (l & 0x3f);
1353
1354 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1355
1356 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1357 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1358 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1359 buf[ 7] = int_to_itoa64 (l & 0x3f);
1360
1361 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1362
1363 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1364 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1365 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1366 buf[11] = int_to_itoa64 (l & 0x3f);
1367
1368 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1369
1370 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1371 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1372 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1373 buf[15] = int_to_itoa64 (l & 0x3f);
1374
1375 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1376
1377 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1378 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1379 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1380 buf[19] = int_to_itoa64 (l & 0x3f);
1381
1382 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1383
1384 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1385 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1386 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1387 buf[23] = int_to_itoa64 (l & 0x3f);
1388
1389 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1390
1391 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1392 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1393 buf[26] = int_to_itoa64 (l & 0x3f);
1394 }
1395
1396 void sha256aix_decode (u8 digest[32], u8 buf[43])
1397 {
1398 int l;
1399
1400 l = itoa64_to_int (buf[ 0]) << 0;
1401 l |= itoa64_to_int (buf[ 1]) << 6;
1402 l |= itoa64_to_int (buf[ 2]) << 12;
1403 l |= itoa64_to_int (buf[ 3]) << 18;
1404
1405 digest[ 2] = (l >> 0) & 0xff;
1406 digest[ 1] = (l >> 8) & 0xff;
1407 digest[ 0] = (l >> 16) & 0xff;
1408
1409 l = itoa64_to_int (buf[ 4]) << 0;
1410 l |= itoa64_to_int (buf[ 5]) << 6;
1411 l |= itoa64_to_int (buf[ 6]) << 12;
1412 l |= itoa64_to_int (buf[ 7]) << 18;
1413
1414 digest[ 5] = (l >> 0) & 0xff;
1415 digest[ 4] = (l >> 8) & 0xff;
1416 digest[ 3] = (l >> 16) & 0xff;
1417
1418 l = itoa64_to_int (buf[ 8]) << 0;
1419 l |= itoa64_to_int (buf[ 9]) << 6;
1420 l |= itoa64_to_int (buf[10]) << 12;
1421 l |= itoa64_to_int (buf[11]) << 18;
1422
1423 digest[ 8] = (l >> 0) & 0xff;
1424 digest[ 7] = (l >> 8) & 0xff;
1425 digest[ 6] = (l >> 16) & 0xff;
1426
1427 l = itoa64_to_int (buf[12]) << 0;
1428 l |= itoa64_to_int (buf[13]) << 6;
1429 l |= itoa64_to_int (buf[14]) << 12;
1430 l |= itoa64_to_int (buf[15]) << 18;
1431
1432 digest[11] = (l >> 0) & 0xff;
1433 digest[10] = (l >> 8) & 0xff;
1434 digest[ 9] = (l >> 16) & 0xff;
1435
1436 l = itoa64_to_int (buf[16]) << 0;
1437 l |= itoa64_to_int (buf[17]) << 6;
1438 l |= itoa64_to_int (buf[18]) << 12;
1439 l |= itoa64_to_int (buf[19]) << 18;
1440
1441 digest[14] = (l >> 0) & 0xff;
1442 digest[13] = (l >> 8) & 0xff;
1443 digest[12] = (l >> 16) & 0xff;
1444
1445 l = itoa64_to_int (buf[20]) << 0;
1446 l |= itoa64_to_int (buf[21]) << 6;
1447 l |= itoa64_to_int (buf[22]) << 12;
1448 l |= itoa64_to_int (buf[23]) << 18;
1449
1450 digest[17] = (l >> 0) & 0xff;
1451 digest[16] = (l >> 8) & 0xff;
1452 digest[15] = (l >> 16) & 0xff;
1453
1454 l = itoa64_to_int (buf[24]) << 0;
1455 l |= itoa64_to_int (buf[25]) << 6;
1456 l |= itoa64_to_int (buf[26]) << 12;
1457 l |= itoa64_to_int (buf[27]) << 18;
1458
1459 digest[20] = (l >> 0) & 0xff;
1460 digest[19] = (l >> 8) & 0xff;
1461 digest[18] = (l >> 16) & 0xff;
1462
1463 l = itoa64_to_int (buf[28]) << 0;
1464 l |= itoa64_to_int (buf[29]) << 6;
1465 l |= itoa64_to_int (buf[30]) << 12;
1466 l |= itoa64_to_int (buf[31]) << 18;
1467
1468 digest[23] = (l >> 0) & 0xff;
1469 digest[22] = (l >> 8) & 0xff;
1470 digest[21] = (l >> 16) & 0xff;
1471
1472 l = itoa64_to_int (buf[32]) << 0;
1473 l |= itoa64_to_int (buf[33]) << 6;
1474 l |= itoa64_to_int (buf[34]) << 12;
1475 l |= itoa64_to_int (buf[35]) << 18;
1476
1477 digest[26] = (l >> 0) & 0xff;
1478 digest[25] = (l >> 8) & 0xff;
1479 digest[24] = (l >> 16) & 0xff;
1480
1481 l = itoa64_to_int (buf[36]) << 0;
1482 l |= itoa64_to_int (buf[37]) << 6;
1483 l |= itoa64_to_int (buf[38]) << 12;
1484 l |= itoa64_to_int (buf[39]) << 18;
1485
1486 digest[29] = (l >> 0) & 0xff;
1487 digest[28] = (l >> 8) & 0xff;
1488 digest[27] = (l >> 16) & 0xff;
1489
1490 l = itoa64_to_int (buf[40]) << 0;
1491 l |= itoa64_to_int (buf[41]) << 6;
1492 l |= itoa64_to_int (buf[42]) << 12;
1493
1494 //digest[32] = (l >> 0) & 0xff;
1495 digest[31] = (l >> 8) & 0xff;
1496 digest[30] = (l >> 16) & 0xff;
1497 }
1498
1499 void sha256aix_encode (u8 digest[32], u8 buf[43])
1500 {
1501 int l;
1502
1503 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1504
1505 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1506 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1507 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1508 buf[ 3] = int_to_itoa64 (l & 0x3f);
1509
1510 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1511
1512 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1513 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1514 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1515 buf[ 7] = int_to_itoa64 (l & 0x3f);
1516
1517 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1518
1519 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1520 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1521 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1522 buf[11] = int_to_itoa64 (l & 0x3f);
1523
1524 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1525
1526 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1527 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1528 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1529 buf[15] = int_to_itoa64 (l & 0x3f);
1530
1531 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1532
1533 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1534 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1535 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1536 buf[19] = int_to_itoa64 (l & 0x3f);
1537
1538 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1539
1540 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1541 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1542 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1543 buf[23] = int_to_itoa64 (l & 0x3f);
1544
1545 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1546
1547 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1548 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1549 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1550 buf[27] = int_to_itoa64 (l & 0x3f);
1551
1552 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1553
1554 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1555 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1556 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1557 buf[31] = int_to_itoa64 (l & 0x3f);
1558
1559 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1560
1561 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1562 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1563 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1564 buf[35] = int_to_itoa64 (l & 0x3f);
1565
1566 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1567
1568 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1569 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1570 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1571 buf[39] = int_to_itoa64 (l & 0x3f);
1572
1573 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1574
1575 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1576 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1577 buf[42] = int_to_itoa64 (l & 0x3f);
1578 }
1579
1580 void sha512aix_decode (u8 digest[64], u8 buf[86])
1581 {
1582 int l;
1583
1584 l = itoa64_to_int (buf[ 0]) << 0;
1585 l |= itoa64_to_int (buf[ 1]) << 6;
1586 l |= itoa64_to_int (buf[ 2]) << 12;
1587 l |= itoa64_to_int (buf[ 3]) << 18;
1588
1589 digest[ 2] = (l >> 0) & 0xff;
1590 digest[ 1] = (l >> 8) & 0xff;
1591 digest[ 0] = (l >> 16) & 0xff;
1592
1593 l = itoa64_to_int (buf[ 4]) << 0;
1594 l |= itoa64_to_int (buf[ 5]) << 6;
1595 l |= itoa64_to_int (buf[ 6]) << 12;
1596 l |= itoa64_to_int (buf[ 7]) << 18;
1597
1598 digest[ 5] = (l >> 0) & 0xff;
1599 digest[ 4] = (l >> 8) & 0xff;
1600 digest[ 3] = (l >> 16) & 0xff;
1601
1602 l = itoa64_to_int (buf[ 8]) << 0;
1603 l |= itoa64_to_int (buf[ 9]) << 6;
1604 l |= itoa64_to_int (buf[10]) << 12;
1605 l |= itoa64_to_int (buf[11]) << 18;
1606
1607 digest[ 8] = (l >> 0) & 0xff;
1608 digest[ 7] = (l >> 8) & 0xff;
1609 digest[ 6] = (l >> 16) & 0xff;
1610
1611 l = itoa64_to_int (buf[12]) << 0;
1612 l |= itoa64_to_int (buf[13]) << 6;
1613 l |= itoa64_to_int (buf[14]) << 12;
1614 l |= itoa64_to_int (buf[15]) << 18;
1615
1616 digest[11] = (l >> 0) & 0xff;
1617 digest[10] = (l >> 8) & 0xff;
1618 digest[ 9] = (l >> 16) & 0xff;
1619
1620 l = itoa64_to_int (buf[16]) << 0;
1621 l |= itoa64_to_int (buf[17]) << 6;
1622 l |= itoa64_to_int (buf[18]) << 12;
1623 l |= itoa64_to_int (buf[19]) << 18;
1624
1625 digest[14] = (l >> 0) & 0xff;
1626 digest[13] = (l >> 8) & 0xff;
1627 digest[12] = (l >> 16) & 0xff;
1628
1629 l = itoa64_to_int (buf[20]) << 0;
1630 l |= itoa64_to_int (buf[21]) << 6;
1631 l |= itoa64_to_int (buf[22]) << 12;
1632 l |= itoa64_to_int (buf[23]) << 18;
1633
1634 digest[17] = (l >> 0) & 0xff;
1635 digest[16] = (l >> 8) & 0xff;
1636 digest[15] = (l >> 16) & 0xff;
1637
1638 l = itoa64_to_int (buf[24]) << 0;
1639 l |= itoa64_to_int (buf[25]) << 6;
1640 l |= itoa64_to_int (buf[26]) << 12;
1641 l |= itoa64_to_int (buf[27]) << 18;
1642
1643 digest[20] = (l >> 0) & 0xff;
1644 digest[19] = (l >> 8) & 0xff;
1645 digest[18] = (l >> 16) & 0xff;
1646
1647 l = itoa64_to_int (buf[28]) << 0;
1648 l |= itoa64_to_int (buf[29]) << 6;
1649 l |= itoa64_to_int (buf[30]) << 12;
1650 l |= itoa64_to_int (buf[31]) << 18;
1651
1652 digest[23] = (l >> 0) & 0xff;
1653 digest[22] = (l >> 8) & 0xff;
1654 digest[21] = (l >> 16) & 0xff;
1655
1656 l = itoa64_to_int (buf[32]) << 0;
1657 l |= itoa64_to_int (buf[33]) << 6;
1658 l |= itoa64_to_int (buf[34]) << 12;
1659 l |= itoa64_to_int (buf[35]) << 18;
1660
1661 digest[26] = (l >> 0) & 0xff;
1662 digest[25] = (l >> 8) & 0xff;
1663 digest[24] = (l >> 16) & 0xff;
1664
1665 l = itoa64_to_int (buf[36]) << 0;
1666 l |= itoa64_to_int (buf[37]) << 6;
1667 l |= itoa64_to_int (buf[38]) << 12;
1668 l |= itoa64_to_int (buf[39]) << 18;
1669
1670 digest[29] = (l >> 0) & 0xff;
1671 digest[28] = (l >> 8) & 0xff;
1672 digest[27] = (l >> 16) & 0xff;
1673
1674 l = itoa64_to_int (buf[40]) << 0;
1675 l |= itoa64_to_int (buf[41]) << 6;
1676 l |= itoa64_to_int (buf[42]) << 12;
1677 l |= itoa64_to_int (buf[43]) << 18;
1678
1679 digest[32] = (l >> 0) & 0xff;
1680 digest[31] = (l >> 8) & 0xff;
1681 digest[30] = (l >> 16) & 0xff;
1682
1683 l = itoa64_to_int (buf[44]) << 0;
1684 l |= itoa64_to_int (buf[45]) << 6;
1685 l |= itoa64_to_int (buf[46]) << 12;
1686 l |= itoa64_to_int (buf[47]) << 18;
1687
1688 digest[35] = (l >> 0) & 0xff;
1689 digest[34] = (l >> 8) & 0xff;
1690 digest[33] = (l >> 16) & 0xff;
1691
1692 l = itoa64_to_int (buf[48]) << 0;
1693 l |= itoa64_to_int (buf[49]) << 6;
1694 l |= itoa64_to_int (buf[50]) << 12;
1695 l |= itoa64_to_int (buf[51]) << 18;
1696
1697 digest[38] = (l >> 0) & 0xff;
1698 digest[37] = (l >> 8) & 0xff;
1699 digest[36] = (l >> 16) & 0xff;
1700
1701 l = itoa64_to_int (buf[52]) << 0;
1702 l |= itoa64_to_int (buf[53]) << 6;
1703 l |= itoa64_to_int (buf[54]) << 12;
1704 l |= itoa64_to_int (buf[55]) << 18;
1705
1706 digest[41] = (l >> 0) & 0xff;
1707 digest[40] = (l >> 8) & 0xff;
1708 digest[39] = (l >> 16) & 0xff;
1709
1710 l = itoa64_to_int (buf[56]) << 0;
1711 l |= itoa64_to_int (buf[57]) << 6;
1712 l |= itoa64_to_int (buf[58]) << 12;
1713 l |= itoa64_to_int (buf[59]) << 18;
1714
1715 digest[44] = (l >> 0) & 0xff;
1716 digest[43] = (l >> 8) & 0xff;
1717 digest[42] = (l >> 16) & 0xff;
1718
1719 l = itoa64_to_int (buf[60]) << 0;
1720 l |= itoa64_to_int (buf[61]) << 6;
1721 l |= itoa64_to_int (buf[62]) << 12;
1722 l |= itoa64_to_int (buf[63]) << 18;
1723
1724 digest[47] = (l >> 0) & 0xff;
1725 digest[46] = (l >> 8) & 0xff;
1726 digest[45] = (l >> 16) & 0xff;
1727
1728 l = itoa64_to_int (buf[64]) << 0;
1729 l |= itoa64_to_int (buf[65]) << 6;
1730 l |= itoa64_to_int (buf[66]) << 12;
1731 l |= itoa64_to_int (buf[67]) << 18;
1732
1733 digest[50] = (l >> 0) & 0xff;
1734 digest[49] = (l >> 8) & 0xff;
1735 digest[48] = (l >> 16) & 0xff;
1736
1737 l = itoa64_to_int (buf[68]) << 0;
1738 l |= itoa64_to_int (buf[69]) << 6;
1739 l |= itoa64_to_int (buf[70]) << 12;
1740 l |= itoa64_to_int (buf[71]) << 18;
1741
1742 digest[53] = (l >> 0) & 0xff;
1743 digest[52] = (l >> 8) & 0xff;
1744 digest[51] = (l >> 16) & 0xff;
1745
1746 l = itoa64_to_int (buf[72]) << 0;
1747 l |= itoa64_to_int (buf[73]) << 6;
1748 l |= itoa64_to_int (buf[74]) << 12;
1749 l |= itoa64_to_int (buf[75]) << 18;
1750
1751 digest[56] = (l >> 0) & 0xff;
1752 digest[55] = (l >> 8) & 0xff;
1753 digest[54] = (l >> 16) & 0xff;
1754
1755 l = itoa64_to_int (buf[76]) << 0;
1756 l |= itoa64_to_int (buf[77]) << 6;
1757 l |= itoa64_to_int (buf[78]) << 12;
1758 l |= itoa64_to_int (buf[79]) << 18;
1759
1760 digest[59] = (l >> 0) & 0xff;
1761 digest[58] = (l >> 8) & 0xff;
1762 digest[57] = (l >> 16) & 0xff;
1763
1764 l = itoa64_to_int (buf[80]) << 0;
1765 l |= itoa64_to_int (buf[81]) << 6;
1766 l |= itoa64_to_int (buf[82]) << 12;
1767 l |= itoa64_to_int (buf[83]) << 18;
1768
1769 digest[62] = (l >> 0) & 0xff;
1770 digest[61] = (l >> 8) & 0xff;
1771 digest[60] = (l >> 16) & 0xff;
1772
1773 l = itoa64_to_int (buf[84]) << 0;
1774 l |= itoa64_to_int (buf[85]) << 6;
1775
1776 digest[63] = (l >> 16) & 0xff;
1777 }
1778
1779 void sha512aix_encode (u8 digest[64], u8 buf[86])
1780 {
1781 int l;
1782
1783 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1784
1785 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1786 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1787 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1788 buf[ 3] = int_to_itoa64 (l & 0x3f);
1789
1790 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1791
1792 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1793 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1794 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1795 buf[ 7] = int_to_itoa64 (l & 0x3f);
1796
1797 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1798
1799 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1800 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1801 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1802 buf[11] = int_to_itoa64 (l & 0x3f);
1803
1804 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1805
1806 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1807 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1808 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1809 buf[15] = int_to_itoa64 (l & 0x3f);
1810
1811 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1812
1813 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1814 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1815 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1816 buf[19] = int_to_itoa64 (l & 0x3f);
1817
1818 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1819
1820 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1821 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1822 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1823 buf[23] = int_to_itoa64 (l & 0x3f);
1824
1825 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1826
1827 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1828 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1829 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1830 buf[27] = int_to_itoa64 (l & 0x3f);
1831
1832 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1833
1834 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1835 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1836 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1837 buf[31] = int_to_itoa64 (l & 0x3f);
1838
1839 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1840
1841 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1842 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1843 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1844 buf[35] = int_to_itoa64 (l & 0x3f);
1845
1846 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1847
1848 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1849 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1850 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1851 buf[39] = int_to_itoa64 (l & 0x3f);
1852
1853 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1854
1855 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1856 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1857 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1858 buf[43] = int_to_itoa64 (l & 0x3f);
1859
1860 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1861
1862 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1863 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1864 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1865 buf[47] = int_to_itoa64 (l & 0x3f);
1866
1867 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1868
1869 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1870 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1871 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1872 buf[51] = int_to_itoa64 (l & 0x3f);
1873
1874 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1875
1876 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1877 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1878 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1879 buf[55] = int_to_itoa64 (l & 0x3f);
1880
1881 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1882
1883 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1884 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1885 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1886 buf[59] = int_to_itoa64 (l & 0x3f);
1887
1888 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1889
1890 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1891 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1892 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1893 buf[63] = int_to_itoa64 (l & 0x3f);
1894
1895 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1896
1897 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1898 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1899 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1900 buf[67] = int_to_itoa64 (l & 0x3f);
1901
1902 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1903
1904 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1905 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1906 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1907 buf[71] = int_to_itoa64 (l & 0x3f);
1908
1909 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1910
1911 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1912 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1913 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1914 buf[75] = int_to_itoa64 (l & 0x3f);
1915
1916 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1917
1918 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1919 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1920 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1921 buf[79] = int_to_itoa64 (l & 0x3f);
1922
1923 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1924
1925 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1926 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1927 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1928 buf[83] = int_to_itoa64 (l & 0x3f);
1929
1930 l = 0 | 0 | (digest[63] << 16);
1931
1932 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1933 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1934 }
1935
1936 void sha256crypt_decode (u8 digest[32], u8 buf[43])
1937 {
1938 int l;
1939
1940 l = itoa64_to_int (buf[ 0]) << 0;
1941 l |= itoa64_to_int (buf[ 1]) << 6;
1942 l |= itoa64_to_int (buf[ 2]) << 12;
1943 l |= itoa64_to_int (buf[ 3]) << 18;
1944
1945 digest[ 0] = (l >> 16) & 0xff;
1946 digest[10] = (l >> 8) & 0xff;
1947 digest[20] = (l >> 0) & 0xff;
1948
1949 l = itoa64_to_int (buf[ 4]) << 0;
1950 l |= itoa64_to_int (buf[ 5]) << 6;
1951 l |= itoa64_to_int (buf[ 6]) << 12;
1952 l |= itoa64_to_int (buf[ 7]) << 18;
1953
1954 digest[21] = (l >> 16) & 0xff;
1955 digest[ 1] = (l >> 8) & 0xff;
1956 digest[11] = (l >> 0) & 0xff;
1957
1958 l = itoa64_to_int (buf[ 8]) << 0;
1959 l |= itoa64_to_int (buf[ 9]) << 6;
1960 l |= itoa64_to_int (buf[10]) << 12;
1961 l |= itoa64_to_int (buf[11]) << 18;
1962
1963 digest[12] = (l >> 16) & 0xff;
1964 digest[22] = (l >> 8) & 0xff;
1965 digest[ 2] = (l >> 0) & 0xff;
1966
1967 l = itoa64_to_int (buf[12]) << 0;
1968 l |= itoa64_to_int (buf[13]) << 6;
1969 l |= itoa64_to_int (buf[14]) << 12;
1970 l |= itoa64_to_int (buf[15]) << 18;
1971
1972 digest[ 3] = (l >> 16) & 0xff;
1973 digest[13] = (l >> 8) & 0xff;
1974 digest[23] = (l >> 0) & 0xff;
1975
1976 l = itoa64_to_int (buf[16]) << 0;
1977 l |= itoa64_to_int (buf[17]) << 6;
1978 l |= itoa64_to_int (buf[18]) << 12;
1979 l |= itoa64_to_int (buf[19]) << 18;
1980
1981 digest[24] = (l >> 16) & 0xff;
1982 digest[ 4] = (l >> 8) & 0xff;
1983 digest[14] = (l >> 0) & 0xff;
1984
1985 l = itoa64_to_int (buf[20]) << 0;
1986 l |= itoa64_to_int (buf[21]) << 6;
1987 l |= itoa64_to_int (buf[22]) << 12;
1988 l |= itoa64_to_int (buf[23]) << 18;
1989
1990 digest[15] = (l >> 16) & 0xff;
1991 digest[25] = (l >> 8) & 0xff;
1992 digest[ 5] = (l >> 0) & 0xff;
1993
1994 l = itoa64_to_int (buf[24]) << 0;
1995 l |= itoa64_to_int (buf[25]) << 6;
1996 l |= itoa64_to_int (buf[26]) << 12;
1997 l |= itoa64_to_int (buf[27]) << 18;
1998
1999 digest[ 6] = (l >> 16) & 0xff;
2000 digest[16] = (l >> 8) & 0xff;
2001 digest[26] = (l >> 0) & 0xff;
2002
2003 l = itoa64_to_int (buf[28]) << 0;
2004 l |= itoa64_to_int (buf[29]) << 6;
2005 l |= itoa64_to_int (buf[30]) << 12;
2006 l |= itoa64_to_int (buf[31]) << 18;
2007
2008 digest[27] = (l >> 16) & 0xff;
2009 digest[ 7] = (l >> 8) & 0xff;
2010 digest[17] = (l >> 0) & 0xff;
2011
2012 l = itoa64_to_int (buf[32]) << 0;
2013 l |= itoa64_to_int (buf[33]) << 6;
2014 l |= itoa64_to_int (buf[34]) << 12;
2015 l |= itoa64_to_int (buf[35]) << 18;
2016
2017 digest[18] = (l >> 16) & 0xff;
2018 digest[28] = (l >> 8) & 0xff;
2019 digest[ 8] = (l >> 0) & 0xff;
2020
2021 l = itoa64_to_int (buf[36]) << 0;
2022 l |= itoa64_to_int (buf[37]) << 6;
2023 l |= itoa64_to_int (buf[38]) << 12;
2024 l |= itoa64_to_int (buf[39]) << 18;
2025
2026 digest[ 9] = (l >> 16) & 0xff;
2027 digest[19] = (l >> 8) & 0xff;
2028 digest[29] = (l >> 0) & 0xff;
2029
2030 l = itoa64_to_int (buf[40]) << 0;
2031 l |= itoa64_to_int (buf[41]) << 6;
2032 l |= itoa64_to_int (buf[42]) << 12;
2033
2034 digest[31] = (l >> 8) & 0xff;
2035 digest[30] = (l >> 0) & 0xff;
2036 }
2037
2038 void sha256crypt_encode (u8 digest[32], u8 buf[43])
2039 {
2040 int l;
2041
2042 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2043
2044 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2045 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2046 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2047 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2048
2049 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2050
2051 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2052 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2053 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2054 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2055
2056 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2057
2058 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2059 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2060 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2061 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2062
2063 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2064
2065 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2066 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2067 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2068 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2069
2070 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2071
2072 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2073 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2074 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2075 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2076
2077 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2078
2079 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2080 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2081 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2082 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2083
2084 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2085
2086 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2087 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2088 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2089 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2090
2091 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2092
2093 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2094 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2095 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2096 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2097
2098 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2099
2100 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2101 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2102 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2103 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2104
2105 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2106
2107 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2108 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2109 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2110 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2111
2112 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2113
2114 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2115 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2116 buf[42] = int_to_itoa64 (l & 0x3f);
2117 }
2118
2119 void drupal7_decode (u8 digest[64], u8 buf[44])
2120 {
2121 int l;
2122
2123 l = itoa64_to_int (buf[ 0]) << 0;
2124 l |= itoa64_to_int (buf[ 1]) << 6;
2125 l |= itoa64_to_int (buf[ 2]) << 12;
2126 l |= itoa64_to_int (buf[ 3]) << 18;
2127
2128 digest[ 0] = (l >> 0) & 0xff;
2129 digest[ 1] = (l >> 8) & 0xff;
2130 digest[ 2] = (l >> 16) & 0xff;
2131
2132 l = itoa64_to_int (buf[ 4]) << 0;
2133 l |= itoa64_to_int (buf[ 5]) << 6;
2134 l |= itoa64_to_int (buf[ 6]) << 12;
2135 l |= itoa64_to_int (buf[ 7]) << 18;
2136
2137 digest[ 3] = (l >> 0) & 0xff;
2138 digest[ 4] = (l >> 8) & 0xff;
2139 digest[ 5] = (l >> 16) & 0xff;
2140
2141 l = itoa64_to_int (buf[ 8]) << 0;
2142 l |= itoa64_to_int (buf[ 9]) << 6;
2143 l |= itoa64_to_int (buf[10]) << 12;
2144 l |= itoa64_to_int (buf[11]) << 18;
2145
2146 digest[ 6] = (l >> 0) & 0xff;
2147 digest[ 7] = (l >> 8) & 0xff;
2148 digest[ 8] = (l >> 16) & 0xff;
2149
2150 l = itoa64_to_int (buf[12]) << 0;
2151 l |= itoa64_to_int (buf[13]) << 6;
2152 l |= itoa64_to_int (buf[14]) << 12;
2153 l |= itoa64_to_int (buf[15]) << 18;
2154
2155 digest[ 9] = (l >> 0) & 0xff;
2156 digest[10] = (l >> 8) & 0xff;
2157 digest[11] = (l >> 16) & 0xff;
2158
2159 l = itoa64_to_int (buf[16]) << 0;
2160 l |= itoa64_to_int (buf[17]) << 6;
2161 l |= itoa64_to_int (buf[18]) << 12;
2162 l |= itoa64_to_int (buf[19]) << 18;
2163
2164 digest[12] = (l >> 0) & 0xff;
2165 digest[13] = (l >> 8) & 0xff;
2166 digest[14] = (l >> 16) & 0xff;
2167
2168 l = itoa64_to_int (buf[20]) << 0;
2169 l |= itoa64_to_int (buf[21]) << 6;
2170 l |= itoa64_to_int (buf[22]) << 12;
2171 l |= itoa64_to_int (buf[23]) << 18;
2172
2173 digest[15] = (l >> 0) & 0xff;
2174 digest[16] = (l >> 8) & 0xff;
2175 digest[17] = (l >> 16) & 0xff;
2176
2177 l = itoa64_to_int (buf[24]) << 0;
2178 l |= itoa64_to_int (buf[25]) << 6;
2179 l |= itoa64_to_int (buf[26]) << 12;
2180 l |= itoa64_to_int (buf[27]) << 18;
2181
2182 digest[18] = (l >> 0) & 0xff;
2183 digest[19] = (l >> 8) & 0xff;
2184 digest[20] = (l >> 16) & 0xff;
2185
2186 l = itoa64_to_int (buf[28]) << 0;
2187 l |= itoa64_to_int (buf[29]) << 6;
2188 l |= itoa64_to_int (buf[30]) << 12;
2189 l |= itoa64_to_int (buf[31]) << 18;
2190
2191 digest[21] = (l >> 0) & 0xff;
2192 digest[22] = (l >> 8) & 0xff;
2193 digest[23] = (l >> 16) & 0xff;
2194
2195 l = itoa64_to_int (buf[32]) << 0;
2196 l |= itoa64_to_int (buf[33]) << 6;
2197 l |= itoa64_to_int (buf[34]) << 12;
2198 l |= itoa64_to_int (buf[35]) << 18;
2199
2200 digest[24] = (l >> 0) & 0xff;
2201 digest[25] = (l >> 8) & 0xff;
2202 digest[26] = (l >> 16) & 0xff;
2203
2204 l = itoa64_to_int (buf[36]) << 0;
2205 l |= itoa64_to_int (buf[37]) << 6;
2206 l |= itoa64_to_int (buf[38]) << 12;
2207 l |= itoa64_to_int (buf[39]) << 18;
2208
2209 digest[27] = (l >> 0) & 0xff;
2210 digest[28] = (l >> 8) & 0xff;
2211 digest[29] = (l >> 16) & 0xff;
2212
2213 l = itoa64_to_int (buf[40]) << 0;
2214 l |= itoa64_to_int (buf[41]) << 6;
2215 l |= itoa64_to_int (buf[42]) << 12;
2216 l |= itoa64_to_int (buf[43]) << 18;
2217
2218 digest[30] = (l >> 0) & 0xff;
2219 digest[31] = (l >> 8) & 0xff;
2220 digest[32] = (l >> 16) & 0xff;
2221
2222 digest[33] = 0;
2223 digest[34] = 0;
2224 digest[35] = 0;
2225 digest[36] = 0;
2226 digest[37] = 0;
2227 digest[38] = 0;
2228 digest[39] = 0;
2229 digest[40] = 0;
2230 digest[41] = 0;
2231 digest[42] = 0;
2232 digest[43] = 0;
2233 digest[44] = 0;
2234 digest[45] = 0;
2235 digest[46] = 0;
2236 digest[47] = 0;
2237 digest[48] = 0;
2238 digest[49] = 0;
2239 digest[50] = 0;
2240 digest[51] = 0;
2241 digest[52] = 0;
2242 digest[53] = 0;
2243 digest[54] = 0;
2244 digest[55] = 0;
2245 digest[56] = 0;
2246 digest[57] = 0;
2247 digest[58] = 0;
2248 digest[59] = 0;
2249 digest[60] = 0;
2250 digest[61] = 0;
2251 digest[62] = 0;
2252 digest[63] = 0;
2253 }
2254
2255 void drupal7_encode (u8 digest[64], u8 buf[43])
2256 {
2257 int l;
2258
2259 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2260
2261 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2262 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2263 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2264 buf[ 3] = int_to_itoa64 (l & 0x3f);
2265
2266 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2267
2268 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2269 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2270 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2271 buf[ 7] = int_to_itoa64 (l & 0x3f);
2272
2273 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2274
2275 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2276 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2277 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2278 buf[11] = int_to_itoa64 (l & 0x3f);
2279
2280 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2281
2282 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2283 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2284 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2285 buf[15] = int_to_itoa64 (l & 0x3f);
2286
2287 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2288
2289 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2290 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2291 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2292 buf[19] = int_to_itoa64 (l & 0x3f);
2293
2294 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2295
2296 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2297 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2298 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2299 buf[23] = int_to_itoa64 (l & 0x3f);
2300
2301 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2302
2303 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2304 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2305 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2306 buf[27] = int_to_itoa64 (l & 0x3f);
2307
2308 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2309
2310 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2311 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2312 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2313 buf[31] = int_to_itoa64 (l & 0x3f);
2314
2315 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2316
2317 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2318 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2319 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2320 buf[35] = int_to_itoa64 (l & 0x3f);
2321
2322 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2323
2324 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2325 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2326 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2327 buf[39] = int_to_itoa64 (l & 0x3f);
2328
2329 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2330
2331 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2332 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2333 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2334 //buf[43] = int_to_itoa64 (l & 0x3f);
2335 }
2336
2337 /**
2338 * tty
2339 */
2340
2341 #ifdef LINUX
2342 static struct termios savemodes;
2343 static int havemodes = 0;
2344
2345 int tty_break()
2346 {
2347 struct termios modmodes;
2348
2349 if (tcgetattr (fileno (stdin), &savemodes) < 0) return -1;
2350
2351 havemodes = 1;
2352
2353 modmodes = savemodes;
2354 modmodes.c_lflag &= ~ICANON;
2355 modmodes.c_cc[VMIN] = 1;
2356 modmodes.c_cc[VTIME] = 0;
2357
2358 return tcsetattr (fileno (stdin), TCSANOW, &modmodes);
2359 }
2360
2361 int tty_getchar()
2362 {
2363 fd_set rfds;
2364
2365 FD_ZERO (&rfds);
2366
2367 FD_SET (fileno (stdin), &rfds);
2368
2369 struct timeval tv;
2370
2371 tv.tv_sec = 1;
2372 tv.tv_usec = 0;
2373
2374 int retval = select (1, &rfds, NULL, NULL, &tv);
2375
2376 if (retval == 0) return 0;
2377 if (retval == -1) return -1;
2378
2379 return getchar();
2380 }
2381
2382 int tty_fix()
2383 {
2384 if (!havemodes) return 0;
2385
2386 return tcsetattr (fileno (stdin), TCSADRAIN, &savemodes);
2387 }
2388 #endif
2389
2390 #ifdef DARWIN
2391 static struct termios savemodes;
2392 static int havemodes = 0;
2393
2394 int tty_break()
2395 {
2396 struct termios modmodes;
2397
2398 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2399
2400 havemodes = 1;
2401
2402 modmodes = savemodes;
2403 modmodes.c_lflag &= ~ICANON;
2404 modmodes.c_cc[VMIN] = 1;
2405 modmodes.c_cc[VTIME] = 0;
2406
2407 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2408 }
2409
2410 int tty_getchar()
2411 {
2412 fd_set rfds;
2413
2414 FD_ZERO (&rfds);
2415
2416 FD_SET (fileno (stdin), &rfds);
2417
2418 struct timeval tv;
2419
2420 tv.tv_sec = 1;
2421 tv.tv_usec = 0;
2422
2423 int retval = select (1, &rfds, NULL, NULL, &tv);
2424
2425 if (retval == 0) return 0;
2426 if (retval == -1) return -1;
2427
2428 return getchar();
2429 }
2430
2431 int tty_fix()
2432 {
2433 if (!havemodes) return 0;
2434
2435 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2436 }
2437 #endif
2438
2439 #ifdef WIN
2440 static DWORD saveMode = 0;
2441
2442 int tty_break()
2443 {
2444 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2445
2446 GetConsoleMode (stdinHandle, &saveMode);
2447 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2448
2449 return 0;
2450 }
2451
2452 int tty_getchar()
2453 {
2454 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2455
2456 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2457
2458 if (rc == WAIT_TIMEOUT) return 0;
2459 if (rc == WAIT_ABANDONED) return -1;
2460 if (rc == WAIT_FAILED) return -1;
2461
2462 // The whole ReadConsoleInput () part is a workaround.
2463 // For some unknown reason, maybe a mingw bug, a random signal
2464 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2465 // Then it wants to read with getche () a keyboard input
2466 // which has never been made.
2467
2468 INPUT_RECORD buf[100];
2469
2470 DWORD num = 0;
2471
2472 memset (buf, 0, sizeof (buf));
2473
2474 ReadConsoleInput (stdinHandle, buf, 100, &num);
2475
2476 FlushConsoleInputBuffer (stdinHandle);
2477
2478 for (uint i = 0; i < num; i++)
2479 {
2480 if (buf[i].EventType != KEY_EVENT) continue;
2481
2482 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2483
2484 if (KeyEvent.bKeyDown != TRUE) continue;
2485
2486 return KeyEvent.uChar.AsciiChar;
2487 }
2488
2489 return 0;
2490 }
2491
2492 int tty_fix()
2493 {
2494 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2495
2496 SetConsoleMode (stdinHandle, saveMode);
2497
2498 return 0;
2499 }
2500 #endif
2501
2502 /**
2503 * mem alloc
2504 */
2505
2506 #define MSG_ENOMEM "Insufficient memory available"
2507
2508 void *mycalloc (size_t nmemb, size_t size)
2509 {
2510 void *p = calloc (nmemb, size);
2511
2512 if (p == NULL)
2513 {
2514 log_error ("ERROR: %s", MSG_ENOMEM);
2515
2516 exit (-1);
2517 }
2518
2519 return (p);
2520 }
2521
2522 void *mymalloc (size_t size)
2523 {
2524 void *p = malloc (size);
2525
2526 if (p == NULL)
2527 {
2528 log_error ("ERROR: %s", MSG_ENOMEM);
2529
2530 exit (-1);
2531 }
2532
2533 memset (p, 0, size);
2534
2535 return (p);
2536 }
2537
2538 void myfree (void *ptr)
2539 {
2540 if (ptr == NULL) return;
2541
2542 free (ptr);
2543 }
2544
2545 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2546 {
2547 void *p = realloc (ptr, oldsz + add);
2548
2549 if (p == NULL)
2550 {
2551 log_error ("ERROR: %s", MSG_ENOMEM);
2552
2553 exit (-1);
2554 }
2555
2556 memset ((char *) p + oldsz, 0, add);
2557
2558 return (p);
2559 }
2560
2561 char *mystrdup (const char *s)
2562 {
2563 const size_t len = strlen (s);
2564
2565 char *b = (char *) mymalloc (len + 1);
2566
2567 memcpy (b, s, len);
2568
2569 return (b);
2570 }
2571
2572 FILE *logfile_open (char *logfile)
2573 {
2574 FILE *fp = fopen (logfile, "ab");
2575
2576 if (fp == NULL)
2577 {
2578 fp = stdout;
2579 }
2580
2581 return fp;
2582 }
2583
2584 void logfile_close (FILE *fp)
2585 {
2586 if (fp == stdout) return;
2587
2588 fclose (fp);
2589 }
2590
2591 void logfile_append (const char *fmt, ...)
2592 {
2593 if (data.logfile_disable == 1) return;
2594
2595 FILE *fp = logfile_open (data.logfile);
2596
2597 va_list ap;
2598
2599 va_start (ap, fmt);
2600
2601 vfprintf (fp, fmt, ap);
2602
2603 va_end (ap);
2604
2605 fputc ('\n', fp);
2606
2607 fflush (fp);
2608
2609 logfile_close (fp);
2610 }
2611
2612 int logfile_generate_id ()
2613 {
2614 const int n = rand ();
2615
2616 time_t t;
2617
2618 time (&t);
2619
2620 return t + n;
2621 }
2622
2623 char *logfile_generate_topid ()
2624 {
2625 const int id = logfile_generate_id ();
2626
2627 char *topid = (char *) mymalloc (1 + 16 + 1);
2628
2629 snprintf (topid, 1 + 16, "TOP%08x", id);
2630
2631 return topid;
2632 }
2633
2634 char *logfile_generate_subid ()
2635 {
2636 const int id = logfile_generate_id ();
2637
2638 char *subid = (char *) mymalloc (1 + 16 + 1);
2639
2640 snprintf (subid, 1 + 16, "SUB%08x", id);
2641
2642 return subid;
2643 }
2644
2645 /**
2646 * system
2647 */
2648
2649 #if F_SETLKW
2650 void lock_file (FILE *fp)
2651 {
2652 struct flock lock;
2653
2654 memset (&lock, 0, sizeof (struct flock));
2655
2656 lock.l_type = F_WRLCK;
2657 while (fcntl(fileno(fp), F_SETLKW, &lock))
2658 {
2659 if (errno != EINTR)
2660 {
2661 log_error ("ERROR: Failed acquiring write lock: %s", strerror (errno));
2662
2663 exit (-1);
2664 }
2665 }
2666 }
2667
2668 void unlock_file (FILE *fp)
2669 {
2670 struct flock lock;
2671
2672 memset (&lock, 0, sizeof (struct flock));
2673
2674 lock.l_type = F_UNLCK;
2675 fcntl(fileno(fp), F_SETLK, &lock);
2676 }
2677 #endif // F_SETLKW
2678
2679 #ifdef WIN
2680 void fsync (int fd)
2681 {
2682 HANDLE h = (HANDLE) _get_osfhandle (fd);
2683
2684 FlushFileBuffers (h);
2685 }
2686 #endif
2687
2688 /**
2689 * thermal
2690 */
2691
2692 #ifdef HAVE_HWMON
2693
2694 int get_adapters_num_adl (void *adl, int *iNumberAdapters)
2695 {
2696 if (hm_ADL_Adapter_NumberOfAdapters_Get ((ADL_PTR *) adl, iNumberAdapters) != ADL_OK) return -1;
2697
2698 if (iNumberAdapters == 0)
2699 {
2700 log_info ("WARN: No ADL adapters found.");
2701
2702 return -1;
2703 }
2704
2705 return 0;
2706 }
2707
2708 /*
2709 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2710 {
2711 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2712 ADLODParameters lpOdParameters;
2713
2714 lpOdParameters.iSize = sizeof (ADLODParameters);
2715 size_t plevels_size = 0;
2716
2717 if (hm_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2718
2719 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2720 __func__, iAdapterIndex,
2721 lpOdParameters.iNumberOfPerformanceLevels,
2722 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2723 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2724
2725 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2726
2727 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2728
2729 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2730
2731 if (hm_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2732
2733 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2734 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2735 __func__, iAdapterIndex, j,
2736 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2737
2738 myfree (lpOdPerformanceLevels);
2739
2740 return 0;
2741 }
2742 */
2743
2744 LPAdapterInfo hm_get_adapter_info_adl (void *adl, int iNumberAdapters)
2745 {
2746 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2747
2748 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2749
2750 if (hm_ADL_Adapter_AdapterInfo_Get ((ADL_PTR *) adl, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2751
2752 return lpAdapterInfo;
2753 }
2754
2755 int hm_get_adapter_index_nvapi (HM_ADAPTER_NVAPI nvapiGPUHandle[DEVICES_MAX])
2756 {
2757 NvU32 pGpuCount;
2758
2759 if (hm_NvAPI_EnumPhysicalGPUs (data.hm_nvapi, nvapiGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2760
2761 if (pGpuCount == 0)
2762 {
2763 log_info ("WARN: No NvAPI adapters found");
2764
2765 return (0);
2766 }
2767
2768 return (pGpuCount);
2769 }
2770
2771 int hm_get_adapter_index_nvml (HM_ADAPTER_NVML nvmlGPUHandle[DEVICES_MAX])
2772 {
2773 int pGpuCount = 0;
2774
2775 for (uint i = 0; i < DEVICES_MAX; i++)
2776 {
2777 if (hm_NVML_nvmlDeviceGetHandleByIndex (data.hm_nvml, 1, i, &nvmlGPUHandle[i]) != NVML_SUCCESS) break;
2778
2779 // can be used to determine if the device by index matches the cuda device by index
2780 // char name[100]; memset (name, 0, sizeof (name));
2781 // hm_NVML_nvmlDeviceGetName (data.hm_nvml, nvGPUHandle[i], name, sizeof (name) - 1);
2782
2783 pGpuCount++;
2784 }
2785
2786 if (pGpuCount == 0)
2787 {
2788 log_info ("WARN: No NVML adapters found");
2789
2790 return (0);
2791 }
2792
2793 return (pGpuCount);
2794 }
2795
2796 /*
2797 //
2798 // does not help at all, since ADL does not assign different bus id, device id when we have multi GPU setups
2799 //
2800
2801 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2802 {
2803 u32 idx = -1;
2804
2805 for (uint i = 0; i < num_adl_adapters; i++)
2806 {
2807 int opencl_bus_num = hm_device[i].busid;
2808 int opencl_dev_num = hm_device[i].devid;
2809
2810 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2811 {
2812 idx = i;
2813
2814 break;
2815 }
2816 }
2817
2818 if (idx >= DEVICES_MAX) return -1;
2819
2820 return idx;
2821 }
2822
2823 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2824 {
2825 for (uint i = 0; i < opencl_num_devices; i++)
2826 {
2827 cl_device_topology_amd device_topology;
2828
2829 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2830
2831 hm_device[i].busid = device_topology.pcie.bus;
2832 hm_device[i].devid = device_topology.pcie.device;
2833 }
2834 }
2835 */
2836
2837 void hm_sort_adl_adapters_by_busid_devid (u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2838 {
2839 // basically bubble sort
2840
2841 for (int i = 0; i < num_adl_adapters; i++)
2842 {
2843 for (int j = 0; j < num_adl_adapters - 1; j++)
2844 {
2845 // get info of adapter [x]
2846
2847 u32 adapter_index_x = valid_adl_device_list[j];
2848 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2849
2850 u32 bus_num_x = info_x.iBusNumber;
2851 u32 dev_num_x = info_x.iDeviceNumber;
2852
2853 // get info of adapter [y]
2854
2855 u32 adapter_index_y = valid_adl_device_list[j + 1];
2856 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2857
2858 u32 bus_num_y = info_y.iBusNumber;
2859 u32 dev_num_y = info_y.iDeviceNumber;
2860
2861 uint need_swap = 0;
2862
2863 if (bus_num_y < bus_num_x)
2864 {
2865 need_swap = 1;
2866 }
2867 else if (bus_num_y == bus_num_x)
2868 {
2869 if (dev_num_y < dev_num_x)
2870 {
2871 need_swap = 1;
2872 }
2873 }
2874
2875 if (need_swap == 1)
2876 {
2877 u32 temp = valid_adl_device_list[j + 1];
2878
2879 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2880 valid_adl_device_list[j + 0] = temp;
2881 }
2882 }
2883 }
2884 }
2885
2886 u32 *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2887 {
2888 *num_adl_adapters = 0;
2889
2890 u32 *adl_adapters = NULL;
2891
2892 int *bus_numbers = NULL;
2893 int *device_numbers = NULL;
2894
2895 for (int i = 0; i < iNumberAdapters; i++)
2896 {
2897 AdapterInfo info = lpAdapterInfo[i];
2898
2899 if (strlen (info.strUDID) < 1) continue;
2900
2901 #ifdef WIN
2902 if (info.iVendorID != 1002) continue;
2903 #else
2904 if (info.iVendorID != 0x1002) continue;
2905 #endif
2906
2907 if (info.iBusNumber < 0) continue;
2908 if (info.iDeviceNumber < 0) continue;
2909
2910 int found = 0;
2911
2912 for (int pos = 0; pos < *num_adl_adapters; pos++)
2913 {
2914 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2915 {
2916 found = 1;
2917 break;
2918 }
2919 }
2920
2921 if (found) continue;
2922
2923 // add it to the list
2924
2925 adl_adapters = (u32 *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2926
2927 adl_adapters[*num_adl_adapters] = i;
2928
2929 // rest is just bookkeeping
2930
2931 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2932 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2933
2934 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2935 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2936
2937 (*num_adl_adapters)++;
2938 }
2939
2940 myfree (bus_numbers);
2941 myfree (device_numbers);
2942
2943 // sort the list by increasing bus id, device id number
2944
2945 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2946
2947 return adl_adapters;
2948 }
2949
2950 int hm_check_fanspeed_control (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2951 {
2952 // loop through all valid devices
2953
2954 for (int i = 0; i < num_adl_adapters; i++)
2955 {
2956 u32 adapter_index = valid_adl_device_list[i];
2957
2958 // get AdapterInfo
2959
2960 AdapterInfo info = lpAdapterInfo[adapter_index];
2961
2962 // unfortunately this doesn't work since bus id and dev id are not unique
2963 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2964 // if (opencl_device_index == -1) continue;
2965
2966 int opencl_device_index = i;
2967
2968 // if (hm_show_performance_level (adl, info.iAdapterIndex) != 0) return -1;
2969
2970 // get fanspeed info
2971
2972 if (hm_device[opencl_device_index].od_version == 5)
2973 {
2974 ADLFanSpeedInfo FanSpeedInfo;
2975
2976 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2977
2978 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2979
2980 if (hm_ADL_Overdrive5_FanSpeedInfo_Get (adl, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2981
2982 // check read and write capability in fanspeedinfo
2983
2984 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2985 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2986 {
2987 hm_device[opencl_device_index].fan_get_supported = 1;
2988 }
2989 else
2990 {
2991 hm_device[opencl_device_index].fan_get_supported = 0;
2992 }
2993 }
2994 else // od_version == 6
2995 {
2996 ADLOD6FanSpeedInfo faninfo;
2997
2998 memset (&faninfo, 0, sizeof (faninfo));
2999
3000 if (hm_ADL_Overdrive6_FanSpeed_Get (adl, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
3001
3002 // check read capability in fanspeedinfo
3003
3004 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
3005 {
3006 hm_device[opencl_device_index].fan_get_supported = 1;
3007 }
3008 else
3009 {
3010 hm_device[opencl_device_index].fan_get_supported = 0;
3011 }
3012 }
3013 }
3014
3015 return 0;
3016 }
3017
3018 int hm_get_overdrive_version (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3019 {
3020 for (int i = 0; i < num_adl_adapters; i++)
3021 {
3022 u32 adapter_index = valid_adl_device_list[i];
3023
3024 // get AdapterInfo
3025
3026 AdapterInfo info = lpAdapterInfo[adapter_index];
3027
3028 // get overdrive version
3029
3030 int od_supported = 0;
3031 int od_enabled = 0;
3032 int od_version = 0;
3033
3034 if (hm_ADL_Overdrive_Caps (adl, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3035
3036 // store the overdrive version in hm_device
3037
3038 // unfortunately this doesn't work since bus id and dev id are not unique
3039 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3040 // if (opencl_device_index == -1) continue;
3041
3042 int opencl_device_index = i;
3043
3044 hm_device[opencl_device_index].od_version = od_version;
3045 }
3046
3047 return 0;
3048 }
3049
3050 int hm_get_adapter_index_adl (hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3051 {
3052 for (int i = 0; i < num_adl_adapters; i++)
3053 {
3054 u32 adapter_index = valid_adl_device_list[i];
3055
3056 // get AdapterInfo
3057
3058 AdapterInfo info = lpAdapterInfo[adapter_index];
3059
3060 // store the iAdapterIndex in hm_device
3061
3062 // unfortunately this doesn't work since bus id and dev id are not unique
3063 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3064 // if (opencl_device_index == -1) continue;
3065
3066 int opencl_device_index = i;
3067
3068 hm_device[opencl_device_index].adl = info.iAdapterIndex;
3069 }
3070
3071 return num_adl_adapters;
3072 }
3073
3074 int hm_get_threshold_slowdown_with_device_id (const uint device_id)
3075 {
3076 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3077
3078 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3079 {
3080 if (data.hm_adl)
3081 {
3082 if (data.hm_device[device_id].od_version == 5)
3083 {
3084
3085 }
3086 else if (data.hm_device[device_id].od_version == 6)
3087 {
3088 int CurrentValue = 0;
3089 int DefaultValue = 0;
3090
3091 if (hm_ADL_Overdrive6_TargetTemperatureData_Get (data.hm_adl, data.hm_device[device_id].adl, &CurrentValue, &DefaultValue) != ADL_OK) return -1;
3092
3093 // the return value has never been tested since hm_ADL_Overdrive6_TargetTemperatureData_Get() never worked on any system. expect problems.
3094
3095 return DefaultValue;
3096 }
3097 }
3098 }
3099
3100 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3101 {
3102 int target = 0;
3103
3104 if (hm_NVML_nvmlDeviceGetTemperatureThreshold (data.hm_nvml, 1, data.hm_device[device_id].nvml, NVML_TEMPERATURE_THRESHOLD_SLOWDOWN, (unsigned int *) &target) != NVML_SUCCESS) return -1;
3105
3106 return target;
3107 }
3108
3109 return -1;
3110 }
3111
3112 int hm_get_threshold_shutdown_with_device_id (const uint device_id)
3113 {
3114 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3115
3116 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3117 {
3118 if (data.hm_adl)
3119 {
3120 if (data.hm_device[device_id].od_version == 5)
3121 {
3122
3123 }
3124 else if (data.hm_device[device_id].od_version == 6)
3125 {
3126
3127 }
3128 }
3129 }
3130
3131 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3132 {
3133 int target = 0;
3134
3135 if (hm_NVML_nvmlDeviceGetTemperatureThreshold (data.hm_nvml, 1, data.hm_device[device_id].nvml, NVML_TEMPERATURE_THRESHOLD_SHUTDOWN, (unsigned int *) &target) != NVML_SUCCESS) return -1;
3136
3137 return target;
3138 }
3139
3140 return -1;
3141 }
3142
3143 int hm_get_temperature_with_device_id (const uint device_id)
3144 {
3145 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3146
3147 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3148 {
3149 if (data.hm_adl)
3150 {
3151 if (data.hm_device[device_id].od_version == 5)
3152 {
3153 ADLTemperature Temperature;
3154
3155 Temperature.iSize = sizeof (ADLTemperature);
3156
3157 if (hm_ADL_Overdrive5_Temperature_Get (data.hm_adl, data.hm_device[device_id].adl, 0, &Temperature) != ADL_OK) return -1;
3158
3159 return Temperature.iTemperature / 1000;
3160 }
3161 else if (data.hm_device[device_id].od_version == 6)
3162 {
3163 int Temperature = 0;
3164
3165 if (hm_ADL_Overdrive6_Temperature_Get (data.hm_adl, data.hm_device[device_id].adl, &Temperature) != ADL_OK) return -1;
3166
3167 return Temperature / 1000;
3168 }
3169 }
3170 }
3171
3172 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3173 {
3174 int temperature = 0;
3175
3176 if (hm_NVML_nvmlDeviceGetTemperature (data.hm_nvml, 1, data.hm_device[device_id].nvml, NVML_TEMPERATURE_GPU, (uint *) &temperature) != NVML_SUCCESS) return -1;
3177
3178 return temperature;
3179 }
3180
3181 return -1;
3182 }
3183
3184 int hm_get_fanpolicy_with_device_id (const uint device_id)
3185 {
3186 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3187
3188 if (data.hm_device[device_id].fan_get_supported == 1)
3189 {
3190 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3191 {
3192 if (data.hm_adl)
3193 {
3194 if (data.hm_device[device_id].od_version == 5)
3195 {
3196 ADLFanSpeedValue lpFanSpeedValue;
3197
3198 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3199
3200 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3201 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3202
3203 if (hm_ADL_Overdrive5_FanSpeed_Get (data.hm_adl, data.hm_device[device_id].adl, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3204
3205 return (lpFanSpeedValue.iFanSpeed & ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED) ? 0 : 1;
3206 }
3207 else // od_version == 6
3208 {
3209 return 1;
3210 }
3211 }
3212 }
3213
3214 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3215 {
3216 return 1;
3217 }
3218 }
3219
3220 return -1;
3221 }
3222
3223 int hm_get_fanspeed_with_device_id (const uint device_id)
3224 {
3225 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3226
3227 if (data.hm_device[device_id].fan_get_supported == 1)
3228 {
3229 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3230 {
3231 if (data.hm_adl)
3232 {
3233 if (data.hm_device[device_id].od_version == 5)
3234 {
3235 ADLFanSpeedValue lpFanSpeedValue;
3236
3237 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3238
3239 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3240 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3241 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3242
3243 if (hm_ADL_Overdrive5_FanSpeed_Get (data.hm_adl, data.hm_device[device_id].adl, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3244
3245 return lpFanSpeedValue.iFanSpeed;
3246 }
3247 else // od_version == 6
3248 {
3249 ADLOD6FanSpeedInfo faninfo;
3250
3251 memset (&faninfo, 0, sizeof (faninfo));
3252
3253 if (hm_ADL_Overdrive6_FanSpeed_Get (data.hm_adl, data.hm_device[device_id].adl, &faninfo) != ADL_OK) return -1;
3254
3255 return faninfo.iFanSpeedPercent;
3256 }
3257 }
3258 }
3259
3260 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3261 {
3262 int speed = 0;
3263
3264 if (hm_NVML_nvmlDeviceGetFanSpeed (data.hm_nvml, 0, data.hm_device[device_id].nvml, (uint *) &speed) != NVML_SUCCESS) return -1;
3265
3266 return speed;
3267 }
3268 }
3269
3270 return -1;
3271 }
3272
3273 int hm_get_buslanes_with_device_id (const uint device_id)
3274 {
3275 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3276
3277 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3278 {
3279 if (data.hm_adl)
3280 {
3281 ADLPMActivity PMActivity;
3282
3283 PMActivity.iSize = sizeof (ADLPMActivity);
3284
3285 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_adl, data.hm_device[device_id].adl, &PMActivity) != ADL_OK) return -1;
3286
3287 return PMActivity.iCurrentBusLanes;
3288 }
3289 }
3290
3291 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3292 {
3293 unsigned int currLinkWidth;
3294
3295 if (hm_NVML_nvmlDeviceGetCurrPcieLinkWidth (data.hm_nvml, 1, data.hm_device[device_id].nvml, &currLinkWidth) != NVML_SUCCESS) return -1;
3296
3297 return currLinkWidth;
3298 }
3299
3300 return -1;
3301 }
3302
3303 int hm_get_utilization_with_device_id (const uint device_id)
3304 {
3305 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3306
3307 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3308 {
3309 if (data.hm_adl)
3310 {
3311 ADLPMActivity PMActivity;
3312
3313 PMActivity.iSize = sizeof (ADLPMActivity);
3314
3315 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_adl, data.hm_device[device_id].adl, &PMActivity) != ADL_OK) return -1;
3316
3317 return PMActivity.iActivityPercent;
3318 }
3319 }
3320
3321 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3322 {
3323 nvmlUtilization_t utilization;
3324
3325 if (hm_NVML_nvmlDeviceGetUtilizationRates (data.hm_nvml, 1, data.hm_device[device_id].nvml, &utilization) != NVML_SUCCESS) return -1;
3326
3327 return utilization.gpu;
3328 }
3329
3330 return -1;
3331 }
3332
3333 int hm_get_memoryspeed_with_device_id (const uint device_id)
3334 {
3335 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3336
3337 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3338 {
3339 if (data.hm_adl)
3340 {
3341 ADLPMActivity PMActivity;
3342
3343 PMActivity.iSize = sizeof (ADLPMActivity);
3344
3345 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_adl, data.hm_device[device_id].adl, &PMActivity) != ADL_OK) return -1;
3346
3347 return PMActivity.iMemoryClock / 100;
3348 }
3349 }
3350
3351 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3352 {
3353 unsigned int clock;
3354
3355 if (hm_NVML_nvmlDeviceGetClockInfo (data.hm_nvml, 1, data.hm_device[device_id].nvml, NVML_CLOCK_MEM, &clock) != NVML_SUCCESS) return -1;
3356
3357 return clock;
3358 }
3359
3360 return -1;
3361 }
3362
3363 int hm_get_corespeed_with_device_id (const uint device_id)
3364 {
3365 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3366
3367 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3368 {
3369 if (data.hm_adl)
3370 {
3371 ADLPMActivity PMActivity;
3372
3373 PMActivity.iSize = sizeof (ADLPMActivity);
3374
3375 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_adl, data.hm_device[device_id].adl, &PMActivity) != ADL_OK) return -1;
3376
3377 return PMActivity.iEngineClock / 100;
3378 }
3379 }
3380
3381 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3382 {
3383 unsigned int clock;
3384
3385 if (hm_NVML_nvmlDeviceGetClockInfo (data.hm_nvml, 1, data.hm_device[device_id].nvml, NVML_CLOCK_SM, &clock) != NVML_SUCCESS) return -1;
3386
3387 return clock;
3388 }
3389
3390 return -1;
3391 }
3392
3393 int hm_get_throttle_with_device_id (const uint device_id)
3394 {
3395 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3396
3397 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3398 {
3399
3400 }
3401
3402 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3403 {
3404 unsigned long long clocksThrottleReasons = 0;
3405 unsigned long long supportedThrottleReasons = 0;
3406
3407 if (hm_NVML_nvmlDeviceGetCurrentClocksThrottleReasons (data.hm_nvml, 1, data.hm_device[device_id].nvml, &clocksThrottleReasons) != NVML_SUCCESS) return -1;
3408 if (hm_NVML_nvmlDeviceGetSupportedClocksThrottleReasons (data.hm_nvml, 1, data.hm_device[device_id].nvml, &supportedThrottleReasons) != NVML_SUCCESS) return -1;
3409
3410 clocksThrottleReasons &= supportedThrottleReasons;
3411 clocksThrottleReasons &= ~nvmlClocksThrottleReasonGpuIdle;
3412 clocksThrottleReasons &= ~nvmlClocksThrottleReasonApplicationsClocksSetting;
3413 clocksThrottleReasons &= ~nvmlClocksThrottleReasonUnknown;
3414
3415 if (data.kernel_power_final)
3416 {
3417 clocksThrottleReasons &= ~nvmlClocksThrottleReasonHwSlowdown;
3418 }
3419
3420 return (clocksThrottleReasons != nvmlClocksThrottleReasonNone);
3421 }
3422
3423 return -1;
3424 }
3425
3426 int hm_set_fanspeed_with_device_id_adl (const uint device_id, const int fanspeed, const int fanpolicy)
3427 {
3428 if (data.hm_device[device_id].fan_set_supported == 1)
3429 {
3430 if (data.hm_adl)
3431 {
3432 if (fanpolicy == 1)
3433 {
3434 if (data.hm_device[device_id].od_version == 5)
3435 {
3436 ADLFanSpeedValue lpFanSpeedValue;
3437
3438 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3439
3440 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3441 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3442 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3443 lpFanSpeedValue.iFanSpeed = fanspeed;
3444
3445 if (hm_ADL_Overdrive5_FanSpeed_Set (data.hm_adl, data.hm_device[device_id].adl, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3446
3447 return 0;
3448 }
3449 else // od_version == 6
3450 {
3451 ADLOD6FanSpeedValue fan_speed_value;
3452
3453 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3454
3455 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3456 fan_speed_value.iFanSpeed = fanspeed;
3457
3458 if (hm_ADL_Overdrive6_FanSpeed_Set (data.hm_adl, data.hm_device[device_id].adl, &fan_speed_value) != ADL_OK) return -1;
3459
3460 return 0;
3461 }
3462 }
3463 else
3464 {
3465 if (data.hm_device[device_id].od_version == 5)
3466 {
3467 if (hm_ADL_Overdrive5_FanSpeedToDefault_Set (data.hm_adl, data.hm_device[device_id].adl, 0) != ADL_OK) return -1;
3468
3469 return 0;
3470 }
3471 else // od_version == 6
3472 {
3473 if (hm_ADL_Overdrive6_FanSpeed_Reset (data.hm_adl, data.hm_device[device_id].adl) != ADL_OK) return -1;
3474
3475 return 0;
3476 }
3477 }
3478 }
3479 }
3480
3481 return -1;
3482 }
3483
3484 int hm_set_fanspeed_with_device_id_nvapi (const uint device_id, const int fanspeed, const int fanpolicy)
3485 {
3486 if (data.hm_device[device_id].fan_set_supported == 1)
3487 {
3488 if (data.hm_nvapi)
3489 {
3490 if (fanpolicy == 1)
3491 {
3492 NV_GPU_COOLER_LEVELS CoolerLevels = { 0 };
3493
3494 CoolerLevels.Version = GPU_COOLER_LEVELS_VER | sizeof (NV_GPU_COOLER_LEVELS);
3495
3496 CoolerLevels.Levels[0].Level = fanspeed;
3497 CoolerLevels.Levels[0].Policy = 1;
3498
3499 if (hm_NvAPI_GPU_SetCoolerLevels (data.hm_nvapi, data.hm_device[device_id].nvapi, 0, &CoolerLevels) != NVAPI_OK) return -1;
3500
3501 return 0;
3502 }
3503 else
3504 {
3505 if (hm_NvAPI_GPU_RestoreCoolerSettings (data.hm_nvapi, data.hm_device[device_id].nvapi, 0) != NVAPI_OK) return -1;
3506
3507 return 0;
3508 }
3509 }
3510 }
3511
3512 return -1;
3513 }
3514
3515 int hm_set_fanspeed_with_device_id_xnvctrl (const uint device_id, const int fanspeed)
3516 {
3517 if (data.hm_device[device_id].fan_set_supported == 1)
3518 {
3519 if (data.hm_xnvctrl)
3520 {
3521 if (set_fan_speed_target (data.hm_xnvctrl, data.hm_device[device_id].xnvctrl, fanspeed) != 0) return -1;
3522
3523 return 0;
3524 }
3525 }
3526
3527 return -1;
3528 }
3529
3530 #endif // HAVE_HWMON
3531
3532 /**
3533 * maskprocessor
3534 */
3535
3536 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3537 {
3538 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3539
3540 if (css_cnt > SP_PW_MAX)
3541 {
3542 log_error ("ERROR: Mask length is too long");
3543
3544 exit (-1);
3545 }
3546
3547 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3548 {
3549 uint *uniq_tbl = uniq_tbls[css_pos];
3550
3551 uint *cs_buf = css[css_pos].cs_buf;
3552 uint cs_len = css[css_pos].cs_len;
3553
3554 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3555 {
3556 uint c = cs_buf[cs_pos] & 0xff;
3557
3558 uniq_tbl[c] = 1;
3559 }
3560 }
3561 }
3562
3563 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3564 {
3565 cs_t *cs = &css[css_cnt];
3566
3567 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3568
3569 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3570
3571 size_t i;
3572
3573 for (i = 0; i < cs->cs_len; i++)
3574 {
3575 const uint u = cs->cs_buf[i];
3576
3577 css_uniq[u] = 1;
3578 }
3579
3580 for (i = 0; i < in_len; i++)
3581 {
3582 uint u = in_buf[i] & 0xff;
3583
3584 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3585
3586 if (css_uniq[u] == 1) continue;
3587
3588 css_uniq[u] = 1;
3589
3590 cs->cs_buf[cs->cs_len] = u;
3591
3592 cs->cs_len++;
3593 }
3594
3595 myfree (css_uniq);
3596 }
3597
3598 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3599 {
3600 size_t in_pos;
3601
3602 for (in_pos = 0; in_pos < in_len; in_pos++)
3603 {
3604 uint p0 = in_buf[in_pos] & 0xff;
3605
3606 if (interpret == 1 && p0 == '?')
3607 {
3608 in_pos++;
3609
3610 if (in_pos == in_len) break;
3611
3612 uint p1 = in_buf[in_pos] & 0xff;
3613
3614 switch (p1)
3615 {
3616 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3617 break;
3618 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3619 break;
3620 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3621 break;
3622 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3623 break;
3624 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3625 break;
3626 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3627 break;
3628 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3629 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3630 break;
3631 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3632 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3633 break;
3634 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3635 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3636 break;
3637 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3638 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3639 break;
3640 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3641 break;
3642 default: log_error ("Syntax error: %s", in_buf);
3643 exit (-1);
3644 }
3645 }
3646 else
3647 {
3648 if (data.hex_charset)
3649 {
3650 in_pos++;
3651
3652 if (in_pos == in_len)
3653 {
3654 log_error ("ERROR: The hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3655
3656 exit (-1);
3657 }
3658
3659 uint p1 = in_buf[in_pos] & 0xff;
3660
3661 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3662 {
3663 log_error ("ERROR: Invalid hex character detected in mask %s", in_buf);
3664
3665 exit (-1);
3666 }
3667
3668 uint chr = 0;
3669
3670 chr = hex_convert (p1) << 0;
3671 chr |= hex_convert (p0) << 4;
3672
3673 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3674 }
3675 else
3676 {
3677 uint chr = p0;
3678
3679 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3680 }
3681 }
3682 }
3683 }
3684
3685 u64 mp_get_sum (uint css_cnt, cs_t *css)
3686 {
3687 u64 sum = 1;
3688
3689 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3690 {
3691 sum *= css[css_pos].cs_len;
3692 }
3693
3694 return (sum);
3695 }
3696
3697 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3698 {
3699 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3700
3701 uint mask_pos;
3702 uint css_pos;
3703
3704 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3705 {
3706 char p0 = mask_buf[mask_pos];
3707
3708 if (p0 == '?')
3709 {
3710 mask_pos++;
3711
3712 if (mask_pos == mask_len) break;
3713
3714 char p1 = mask_buf[mask_pos];
3715
3716 uint chr = p1;
3717
3718 switch (p1)
3719 {
3720 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3721 break;
3722 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3723 break;
3724 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3725 break;
3726 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3727 break;
3728 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3729 break;
3730 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3731 break;
3732 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3733 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3734 break;
3735 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3736 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3737 break;
3738 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3739 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3740 break;
3741 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3742 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3743 break;
3744 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3745 break;
3746 default: log_error ("ERROR: Syntax error: %s", mask_buf);
3747 exit (-1);
3748 }
3749 }
3750 else
3751 {
3752 if (data.hex_charset)
3753 {
3754 mask_pos++;
3755
3756 // if there is no 2nd hex character, show an error:
3757
3758 if (mask_pos == mask_len)
3759 {
3760 log_error ("ERROR: The hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3761
3762 exit (-1);
3763 }
3764
3765 char p1 = mask_buf[mask_pos];
3766
3767 // if they are not valid hex character, show an error:
3768
3769 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3770 {
3771 log_error ("ERROR: Invalid hex character detected in mask %s", mask_buf);
3772
3773 exit (-1);
3774 }
3775
3776 uint chr = 0;
3777
3778 chr |= hex_convert (p1) << 0;
3779 chr |= hex_convert (p0) << 4;
3780
3781 mp_add_cs_buf (&chr, 1, css, css_pos);
3782 }
3783 else
3784 {
3785 uint chr = p0;
3786
3787 mp_add_cs_buf (&chr, 1, css, css_pos);
3788 }
3789 }
3790 }
3791
3792 if (css_pos == 0)
3793 {
3794 log_error ("ERROR: Invalid mask length (0)");
3795
3796 exit (-1);
3797 }
3798
3799 *css_cnt = css_pos;
3800
3801 return (css);
3802 }
3803
3804 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3805 {
3806 for (int i = 0; i < css_cnt; i++)
3807 {
3808 uint len = css[i].cs_len;
3809 u64 next = val / len;
3810 uint pos = val % len;
3811 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3812 val = next;
3813 }
3814 }
3815
3816 void mp_cut_at (char *mask, uint max)
3817 {
3818 uint i;
3819 uint j;
3820 uint mask_len = strlen (mask);
3821
3822 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3823 {
3824 if (mask[i] == '?') i++;
3825 }
3826
3827 mask[i] = 0;
3828 }
3829
3830 void mp_setup_sys (cs_t *mp_sys)
3831 {
3832 uint pos;
3833 uint chr;
3834 uint donec[CHARSIZ] = { 0 };
3835
3836 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3837 mp_sys[0].cs_buf[pos++] = chr;
3838 mp_sys[0].cs_len = pos; }
3839
3840 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3841 mp_sys[1].cs_buf[pos++] = chr;
3842 mp_sys[1].cs_len = pos; }
3843
3844 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3845 mp_sys[2].cs_buf[pos++] = chr;
3846 mp_sys[2].cs_len = pos; }
3847
3848 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3849 mp_sys[3].cs_buf[pos++] = chr;
3850 mp_sys[3].cs_len = pos; }
3851
3852 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3853 mp_sys[4].cs_len = pos; }
3854
3855 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3856 mp_sys[5].cs_len = pos; }
3857 }
3858
3859 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3860 {
3861 FILE *fp = fopen (buf, "rb");
3862
3863 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3864 {
3865 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3866 }
3867 else
3868 {
3869 char mp_file[1024] = { 0 };
3870
3871 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3872
3873 fclose (fp);
3874
3875 len = in_superchop (mp_file);
3876
3877 if (len == 0)
3878 {
3879 log_info ("WARNING: Charset file corrupted");
3880
3881 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3882 }
3883 else
3884 {
3885 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3886 }
3887 }
3888 }
3889
3890 void mp_reset_usr (cs_t *mp_usr, uint index)
3891 {
3892 mp_usr[index].cs_len = 0;
3893
3894 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3895 }
3896
3897 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3898 {
3899 char *new_mask_buf = (char *) mymalloc (256);
3900
3901 uint mask_pos;
3902
3903 uint css_pos;
3904
3905 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3906 {
3907 if (css_pos == len) break;
3908
3909 char p0 = mask_buf[mask_pos];
3910
3911 new_mask_buf[mask_pos] = p0;
3912
3913 if (p0 == '?')
3914 {
3915 mask_pos++;
3916
3917 if (mask_pos == mask_len) break;
3918
3919 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3920 }
3921 else
3922 {
3923 if (data.hex_charset)
3924 {
3925 mask_pos++;
3926
3927 if (mask_pos == mask_len)
3928 {
3929 log_error ("ERROR: The hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3930
3931 exit (-1);
3932 }
3933
3934 char p1 = mask_buf[mask_pos];
3935
3936 // if they are not valid hex character, show an error:
3937
3938 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3939 {
3940 log_error ("ERROR: Invalid hex character detected in mask: %s", mask_buf);
3941
3942 exit (-1);
3943 }
3944
3945 new_mask_buf[mask_pos] = p1;
3946 }
3947 }
3948 }
3949
3950 if (css_pos == len) return (new_mask_buf);
3951
3952 myfree (new_mask_buf);
3953
3954 return (NULL);
3955 }
3956
3957 /**
3958 * statprocessor
3959 */
3960
3961 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3962 {
3963 u64 sum = 1;
3964
3965 uint i;
3966
3967 for (i = start; i < stop; i++)
3968 {
3969 sum *= root_css_buf[i].cs_len;
3970 }
3971
3972 return (sum);
3973 }
3974
3975 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3976 {
3977 u64 v = ctx;
3978
3979 cs_t *cs = &root_css_buf[start];
3980
3981 uint i;
3982
3983 for (i = start; i < stop; i++)
3984 {
3985 const u64 m = v % cs->cs_len;
3986 const u64 d = v / cs->cs_len;
3987
3988 v = d;
3989
3990 const uint k = cs->cs_buf[m];
3991
3992 pw_buf[i - start] = (char) k;
3993
3994 cs = &markov_css_buf[(i * CHARSIZ) + k];
3995 }
3996 }
3997
3998 int sp_comp_val (const void *p1, const void *p2)
3999 {
4000 hcstat_table_t *b1 = (hcstat_table_t *) p1;
4001 hcstat_table_t *b2 = (hcstat_table_t *) p2;
4002
4003 return b2->val - b1->val;
4004 }
4005
4006 void sp_setup_tbl (const char *shared_dir, char *hcstat, uint disable, uint classic, hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf)
4007 {
4008 uint i;
4009 uint j;
4010 uint k;
4011
4012 /**
4013 * Initialize hcstats
4014 */
4015
4016 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
4017
4018 u64 *root_stats_ptr = root_stats_buf;
4019
4020 u64 *root_stats_buf_by_pos[SP_PW_MAX];
4021
4022 for (i = 0; i < SP_PW_MAX; i++)
4023 {
4024 root_stats_buf_by_pos[i] = root_stats_ptr;
4025
4026 root_stats_ptr += CHARSIZ;
4027 }
4028
4029 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
4030
4031 u64 *markov_stats_ptr = markov_stats_buf;
4032
4033 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
4034
4035 for (i = 0; i < SP_PW_MAX; i++)
4036 {
4037 for (j = 0; j < CHARSIZ; j++)
4038 {
4039 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
4040
4041 markov_stats_ptr += CHARSIZ;
4042 }
4043 }
4044
4045 /**
4046 * Load hcstats File
4047 */
4048
4049 if (hcstat == NULL)
4050 {
4051 char hcstat_tmp[256] = { 0 };
4052
4053 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
4054
4055 hcstat = hcstat_tmp;
4056 }
4057
4058 FILE *fd = fopen (hcstat, "rb");
4059
4060 if (fd == NULL)
4061 {
4062 log_error ("%s: %s", hcstat, strerror (errno));
4063
4064 exit (-1);
4065 }
4066
4067 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
4068 {
4069 log_error ("%s: Could not load data", hcstat);
4070
4071 fclose (fd);
4072
4073 exit (-1);
4074 }
4075
4076 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
4077 {
4078 log_error ("%s: Could not load data", hcstat);
4079
4080 fclose (fd);
4081
4082 exit (-1);
4083 }
4084
4085 fclose (fd);
4086
4087 /**
4088 * Markov modifier of hcstat_table on user request
4089 */
4090
4091 if (disable)
4092 {
4093 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
4094 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
4095 }
4096
4097 if (classic)
4098 {
4099 /* Add all stats to first position */
4100
4101 for (i = 1; i < SP_PW_MAX; i++)
4102 {
4103 u64 *out = root_stats_buf_by_pos[0];
4104 u64 *in = root_stats_buf_by_pos[i];
4105
4106 for (j = 0; j < CHARSIZ; j++)
4107 {
4108 *out++ += *in++;
4109 }
4110 }
4111
4112 for (i = 1; i < SP_PW_MAX; i++)
4113 {
4114 u64 *out = markov_stats_buf_by_key[0][0];
4115 u64 *in = markov_stats_buf_by_key[i][0];
4116
4117 for (j = 0; j < CHARSIZ; j++)
4118 {
4119 for (k = 0; k < CHARSIZ; k++)
4120 {
4121 *out++ += *in++;
4122 }
4123 }
4124 }
4125
4126 /* copy them to all pw_positions */
4127
4128 for (i = 1; i < SP_PW_MAX; i++)
4129 {
4130 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
4131 }
4132
4133 for (i = 1; i < SP_PW_MAX; i++)
4134 {
4135 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
4136 }
4137 }
4138
4139 /**
4140 * Initialize tables
4141 */
4142
4143 hcstat_table_t *root_table_ptr = root_table_buf;
4144
4145 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
4146
4147 for (i = 0; i < SP_PW_MAX; i++)
4148 {
4149 root_table_buf_by_pos[i] = root_table_ptr;
4150
4151 root_table_ptr += CHARSIZ;
4152 }
4153
4154 hcstat_table_t *markov_table_ptr = markov_table_buf;
4155
4156 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
4157
4158 for (i = 0; i < SP_PW_MAX; i++)
4159 {
4160 for (j = 0; j < CHARSIZ; j++)
4161 {
4162 markov_table_buf_by_key[i][j] = markov_table_ptr;
4163
4164 markov_table_ptr += CHARSIZ;
4165 }
4166 }
4167
4168 /**
4169 * Convert hcstat to tables
4170 */
4171
4172 for (i = 0; i < SP_ROOT_CNT; i++)
4173 {
4174 uint key = i % CHARSIZ;
4175
4176 root_table_buf[i].key = key;
4177 root_table_buf[i].val = root_stats_buf[i];
4178 }
4179
4180 for (i = 0; i < SP_MARKOV_CNT; i++)
4181 {
4182 uint key = i % CHARSIZ;
4183
4184 markov_table_buf[i].key = key;
4185 markov_table_buf[i].val = markov_stats_buf[i];
4186 }
4187
4188 myfree (root_stats_buf);
4189 myfree (markov_stats_buf);
4190
4191 /**
4192 * Finally sort them
4193 */
4194
4195 for (i = 0; i < SP_PW_MAX; i++)
4196 {
4197 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4198 }
4199
4200 for (i = 0; i < SP_PW_MAX; i++)
4201 {
4202 for (j = 0; j < CHARSIZ; j++)
4203 {
4204 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4205 }
4206 }
4207 }
4208
4209 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])
4210 {
4211 /**
4212 * Convert tables to css
4213 */
4214
4215 for (uint i = 0; i < SP_ROOT_CNT; i++)
4216 {
4217 uint pw_pos = i / CHARSIZ;
4218
4219 cs_t *cs = &root_css_buf[pw_pos];
4220
4221 if (cs->cs_len == threshold) continue;
4222
4223 uint key = root_table_buf[i].key;
4224
4225 if (uniq_tbls[pw_pos][key] == 0) continue;
4226
4227 cs->cs_buf[cs->cs_len] = key;
4228
4229 cs->cs_len++;
4230 }
4231
4232 /**
4233 * Convert table to css
4234 */
4235
4236 for (uint i = 0; i < SP_MARKOV_CNT; i++)
4237 {
4238 uint c = i / CHARSIZ;
4239
4240 cs_t *cs = &markov_css_buf[c];
4241
4242 if (cs->cs_len == threshold) continue;
4243
4244 uint pw_pos = c / CHARSIZ;
4245
4246 uint key = markov_table_buf[i].key;
4247
4248 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4249
4250 cs->cs_buf[cs->cs_len] = key;
4251
4252 cs->cs_len++;
4253 }
4254
4255 /*
4256 for (uint i = 0; i < 8; i++)
4257 {
4258 for (uint j = 0x20; j < 0x80; j++)
4259 {
4260 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4261
4262 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4263
4264 for (uint k = 0; k < 10; k++)
4265 {
4266 printf (" %u\n", ptr->cs_buf[k]);
4267 }
4268 }
4269 }
4270 */
4271 }
4272
4273 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4274 {
4275 for (uint i = 0; i < SP_PW_MAX; i += 2)
4276 {
4277 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4278
4279 out += CHARSIZ;
4280 in += CHARSIZ;
4281
4282 out->key = 0;
4283 out->val = 1;
4284
4285 out++;
4286
4287 for (uint j = 1; j < CHARSIZ; j++)
4288 {
4289 out->key = j;
4290 out->val = 0;
4291
4292 out++;
4293 }
4294 }
4295 }
4296
4297 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4298 {
4299 for (uint i = 0; i < SP_PW_MAX; i += 2)
4300 {
4301 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4302
4303 out += CHARSIZ * CHARSIZ;
4304 in += CHARSIZ * CHARSIZ;
4305
4306 for (uint j = 0; j < CHARSIZ; j++)
4307 {
4308 out->key = 0;
4309 out->val = 1;
4310
4311 out++;
4312
4313 for (uint k = 1; k < CHARSIZ; k++)
4314 {
4315 out->key = k;
4316 out->val = 0;
4317
4318 out++;
4319 }
4320 }
4321 }
4322 }
4323
4324 /**
4325 * mixed shared functions
4326 */
4327
4328 void dump_hex (const u8 *s, const int sz)
4329 {
4330 for (int i = 0; i < sz; i++)
4331 {
4332 log_info_nn ("%02x ", s[i]);
4333 }
4334
4335 log_info ("");
4336 }
4337
4338 void usage_mini_print (const char *progname)
4339 {
4340 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4341 }
4342
4343 void usage_big_print (const char *progname)
4344 {
4345 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4346 }
4347
4348 char *get_exec_path ()
4349 {
4350 int exec_path_len = 1024;
4351
4352 char *exec_path = (char *) mymalloc (exec_path_len);
4353
4354 #ifdef LINUX
4355
4356 char tmp[32] = { 0 };
4357
4358 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4359
4360 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4361
4362 #elif WIN
4363
4364 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4365
4366 #elif DARWIN
4367
4368 uint size = exec_path_len;
4369
4370 if (_NSGetExecutablePath (exec_path, &size) != 0)
4371 {
4372 log_error("! executable path buffer too small\n");
4373
4374 exit (-1);
4375 }
4376
4377 const int len = strlen (exec_path);
4378
4379 #elif __FreeBSD__
4380
4381 #include <sys/sysctl.h>
4382
4383 int mib[4];
4384 mib[0] = CTL_KERN;
4385 mib[1] = KERN_PROC;
4386 mib[2] = KERN_PROC_PATHNAME;
4387 mib[3] = -1;
4388
4389 size_t size = sizeof(exec_path);
4390
4391 const int len = sysctl(mib, 4, exec_path, &size, NULL, 0);
4392
4393 #else
4394 #error Your Operating System is not supported or detected
4395 #endif
4396
4397 exec_path[len] = 0;
4398
4399 return exec_path;
4400 }
4401
4402 char *get_install_dir (const char *progname)
4403 {
4404 char *install_dir = mystrdup (progname);
4405 char *last_slash = NULL;
4406
4407 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4408 {
4409 *last_slash = 0;
4410 }
4411 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4412 {
4413 *last_slash = 0;
4414 }
4415 else
4416 {
4417 install_dir[0] = '.';
4418 install_dir[1] = 0;
4419 }
4420
4421 return (install_dir);
4422 }
4423
4424 char *get_profile_dir (const char *homedir)
4425 {
4426 #define DOT_HASHCAT ".hashcat"
4427
4428 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4429
4430 char *profile_dir = (char *) mymalloc (len + 1);
4431
4432 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4433
4434 return profile_dir;
4435 }
4436
4437 char *get_session_dir (const char *profile_dir)
4438 {
4439 #define SESSIONS_FOLDER "sessions"
4440
4441 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4442
4443 char *session_dir = (char *) mymalloc (len + 1);
4444
4445 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4446
4447 return session_dir;
4448 }
4449
4450 uint count_lines (FILE *fd)
4451 {
4452 uint cnt = 0;
4453
4454 char *buf = (char *) mymalloc (HCBUFSIZ + 1);
4455
4456 char prev = '\n';
4457
4458 while (!feof (fd))
4459 {
4460 size_t nread = fread (buf, sizeof (char), HCBUFSIZ, fd);
4461
4462 if (nread < 1) continue;
4463
4464 size_t i;
4465
4466 for (i = 0; i < nread; i++)
4467 {
4468 if (prev == '\n') cnt++;
4469
4470 prev = buf[i];
4471 }
4472 }
4473
4474 myfree (buf);
4475
4476 return cnt;
4477 }
4478
4479 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4480 {
4481 uint crc = ~0;
4482
4483 FILE *fd = fopen (filename, "rb");
4484
4485 if (fd == NULL)
4486 {
4487 log_error ("%s: %s", filename, strerror (errno));
4488
4489 exit (-1);
4490 }
4491
4492 #define MAX_KEY_SIZE (1024 * 1024)
4493
4494 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4495
4496 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4497
4498 fclose (fd);
4499
4500 int kpos = 0;
4501
4502 for (int fpos = 0; fpos < nread; fpos++)
4503 {
4504 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4505
4506 keytab[kpos++] += (crc >> 24) & 0xff;
4507 keytab[kpos++] += (crc >> 16) & 0xff;
4508 keytab[kpos++] += (crc >> 8) & 0xff;
4509 keytab[kpos++] += (crc >> 0) & 0xff;
4510
4511 if (kpos >= 64) kpos = 0;
4512 }
4513
4514 myfree (buf);
4515 }
4516
4517 #ifdef DARWIN
4518 int pthread_setaffinity_np (pthread_t thread, size_t cpu_size, cpu_set_t *cpu_set)
4519 {
4520 int core;
4521
4522 for (core = 0; core < (8 * (int)cpu_size); core++)
4523 if (CPU_ISSET(core, cpu_set)) break;
4524
4525 thread_affinity_policy_data_t policy = { core };
4526
4527 const int rc = thread_policy_set (pthread_mach_thread_np (thread), THREAD_AFFINITY_POLICY, (thread_policy_t) &policy, 1);
4528
4529 if (data.quiet == 0)
4530 {
4531 if (rc != KERN_SUCCESS)
4532 {
4533 log_error ("ERROR: %s : %d", "thread_policy_set()", rc);
4534 }
4535 }
4536
4537 return rc;
4538 }
4539 #endif
4540
4541 void set_cpu_affinity (char *cpu_affinity)
4542 {
4543 #ifdef _WIN
4544 DWORD_PTR aff_mask = 0;
4545 #elif __FreeBSD__
4546 cpuset_t cpuset;
4547 CPU_ZERO (&cpuset);
4548 #elif _POSIX
4549 cpu_set_t cpuset;
4550 CPU_ZERO (&cpuset);
4551 #endif
4552
4553 if (cpu_affinity)
4554 {
4555 char *devices = strdup (cpu_affinity);
4556
4557 char *next = strtok (devices, ",");
4558
4559 do
4560 {
4561 uint cpu_id = atoi (next);
4562
4563 if (cpu_id == 0)
4564 {
4565 #ifdef _WIN
4566 aff_mask = 0;
4567 #elif _POSIX
4568 CPU_ZERO (&cpuset);
4569 #endif
4570
4571 break;
4572 }
4573
4574 if (cpu_id > 32)
4575 {
4576 log_error ("ERROR: Invalid cpu_id %u specified", cpu_id);
4577
4578 exit (-1);
4579 }
4580
4581 #ifdef _WIN
4582 aff_mask |= 1 << (cpu_id - 1);
4583 #elif _POSIX
4584 CPU_SET ((cpu_id - 1), &cpuset);
4585 #endif
4586
4587 } while ((next = strtok (NULL, ",")) != NULL);
4588
4589 free (devices);
4590 }
4591
4592 #ifdef _WIN
4593 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4594 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4595 #elif __FreeBSD__
4596 pthread_t thread = pthread_self ();
4597 pthread_setaffinity_np (thread, sizeof (cpuset_t), &cpuset);
4598 #elif _POSIX
4599 pthread_t thread = pthread_self ();
4600 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4601 #endif
4602 }
4603
4604 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4605 {
4606 char *element, *end;
4607
4608 end = (char *) base + nmemb * size;
4609
4610 for (element = (char *) base; element < end; element += size)
4611 if (!compar (element, key))
4612 return element;
4613
4614 return NULL;
4615 }
4616
4617 int sort_by_u32 (const void *v1, const void *v2)
4618 {
4619 const u32 *s1 = (const u32 *) v1;
4620 const u32 *s2 = (const u32 *) v2;
4621
4622 return *s1 - *s2;
4623 }
4624
4625 int sort_by_salt (const void *v1, const void *v2)
4626 {
4627 const salt_t *s1 = (const salt_t *) v1;
4628 const salt_t *s2 = (const salt_t *) v2;
4629
4630 const int res1 = s1->salt_len - s2->salt_len;
4631
4632 if (res1 != 0) return (res1);
4633
4634 const int res2 = s1->salt_iter - s2->salt_iter;
4635
4636 if (res2 != 0) return (res2);
4637
4638 uint n;
4639
4640 n = 16;
4641
4642 while (n--)
4643 {
4644 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4645 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4646 }
4647
4648 n = 8;
4649
4650 while (n--)
4651 {
4652 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4653 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4654 }
4655
4656 return (0);
4657 }
4658
4659 int sort_by_salt_buf (const void *v1, const void *v2)
4660 {
4661 const pot_t *p1 = (const pot_t *) v1;
4662 const pot_t *p2 = (const pot_t *) v2;
4663
4664 const hash_t *h1 = &p1->hash;
4665 const hash_t *h2 = &p2->hash;
4666
4667 const salt_t *s1 = h1->salt;
4668 const salt_t *s2 = h2->salt;
4669
4670 uint n = 16;
4671
4672 while (n--)
4673 {
4674 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4675 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4676 }
4677
4678 return 0;
4679 }
4680
4681 int sort_by_hash_t_salt (const void *v1, const void *v2)
4682 {
4683 const hash_t *h1 = (const hash_t *) v1;
4684 const hash_t *h2 = (const hash_t *) v2;
4685
4686 const salt_t *s1 = h1->salt;
4687 const salt_t *s2 = h2->salt;
4688
4689 // testphase: this should work
4690 uint n = 16;
4691
4692 while (n--)
4693 {
4694 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4695 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4696 }
4697
4698 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4699 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4700 if (s1->salt_len > s2->salt_len) return ( 1);
4701 if (s1->salt_len < s2->salt_len) return (-1);
4702
4703 uint n = s1->salt_len;
4704
4705 while (n--)
4706 {
4707 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4708 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4709 }
4710 */
4711
4712 return 0;
4713 }
4714
4715 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4716 {
4717 const hash_t *h1 = (const hash_t *) v1;
4718 const hash_t *h2 = (const hash_t *) v2;
4719
4720 const salt_t *s1 = h1->salt;
4721 const salt_t *s2 = h2->salt;
4722
4723 // 16 - 2 (since last 2 uints contain the digest)
4724 uint n = 14;
4725
4726 while (n--)
4727 {
4728 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4729 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4730 }
4731
4732 return 0;
4733 }
4734
4735 int sort_by_hash_no_salt (const void *v1, const void *v2)
4736 {
4737 const hash_t *h1 = (const hash_t *) v1;
4738 const hash_t *h2 = (const hash_t *) v2;
4739
4740 const void *d1 = h1->digest;
4741 const void *d2 = h2->digest;
4742
4743 return data.sort_by_digest (d1, d2);
4744 }
4745
4746 int sort_by_hash (const void *v1, const void *v2)
4747 {
4748 const hash_t *h1 = (const hash_t *) v1;
4749 const hash_t *h2 = (const hash_t *) v2;
4750
4751 if (data.isSalted)
4752 {
4753 const salt_t *s1 = h1->salt;
4754 const salt_t *s2 = h2->salt;
4755
4756 int res = sort_by_salt (s1, s2);
4757
4758 if (res != 0) return (res);
4759 }
4760
4761 const void *d1 = h1->digest;
4762 const void *d2 = h2->digest;
4763
4764 return data.sort_by_digest (d1, d2);
4765 }
4766
4767 int sort_by_pot (const void *v1, const void *v2)
4768 {
4769 const pot_t *p1 = (const pot_t *) v1;
4770 const pot_t *p2 = (const pot_t *) v2;
4771
4772 const hash_t *h1 = &p1->hash;
4773 const hash_t *h2 = &p2->hash;
4774
4775 return sort_by_hash (h1, h2);
4776 }
4777
4778 int sort_by_mtime (const void *p1, const void *p2)
4779 {
4780 const char **f1 = (const char **) p1;
4781 const char **f2 = (const char **) p2;
4782
4783 struct stat s1; stat (*f1, &s1);
4784 struct stat s2; stat (*f2, &s2);
4785
4786 return s2.st_mtime - s1.st_mtime;
4787 }
4788
4789 int sort_by_cpu_rule (const void *p1, const void *p2)
4790 {
4791 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4792 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4793
4794 return memcmp (r1, r2, sizeof (cpu_rule_t));
4795 }
4796
4797 int sort_by_kernel_rule (const void *p1, const void *p2)
4798 {
4799 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4800 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4801
4802 return memcmp (r1, r2, sizeof (kernel_rule_t));
4803 }
4804
4805 int sort_by_stringptr (const void *p1, const void *p2)
4806 {
4807 const char **s1 = (const char **) p1;
4808 const char **s2 = (const char **) p2;
4809
4810 return strcmp (*s1, *s2);
4811 }
4812
4813 int sort_by_dictstat (const void *s1, const void *s2)
4814 {
4815 dictstat_t *d1 = (dictstat_t *) s1;
4816 dictstat_t *d2 = (dictstat_t *) s2;
4817
4818 #ifdef _LINUX
4819 d2->stat.st_atim = d1->stat.st_atim;
4820 #else
4821 d2->stat.st_atime = d1->stat.st_atime;
4822 #endif
4823
4824 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4825 }
4826
4827 int sort_by_bitmap (const void *p1, const void *p2)
4828 {
4829 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4830 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4831
4832 return b1->collisions - b2->collisions;
4833 }
4834
4835 int sort_by_digest_4_2 (const void *v1, const void *v2)
4836 {
4837 const u32 *d1 = (const u32 *) v1;
4838 const u32 *d2 = (const u32 *) v2;
4839
4840 uint n = 2;
4841
4842 while (n--)
4843 {
4844 if (d1[n] > d2[n]) return ( 1);
4845 if (d1[n] < d2[n]) return (-1);
4846 }
4847
4848 return (0);
4849 }
4850
4851 int sort_by_digest_4_4 (const void *v1, const void *v2)
4852 {
4853 const u32 *d1 = (const u32 *) v1;
4854 const u32 *d2 = (const u32 *) v2;
4855
4856 uint n = 4;
4857
4858 while (n--)
4859 {
4860 if (d1[n] > d2[n]) return ( 1);
4861 if (d1[n] < d2[n]) return (-1);
4862 }
4863
4864 return (0);
4865 }
4866
4867 int sort_by_digest_4_5 (const void *v1, const void *v2)
4868 {
4869 const u32 *d1 = (const u32 *) v1;
4870 const u32 *d2 = (const u32 *) v2;
4871
4872 uint n = 5;
4873
4874 while (n--)
4875 {
4876 if (d1[n] > d2[n]) return ( 1);
4877 if (d1[n] < d2[n]) return (-1);
4878 }
4879
4880 return (0);
4881 }
4882
4883 int sort_by_digest_4_6 (const void *v1, const void *v2)
4884 {
4885 const u32 *d1 = (const u32 *) v1;
4886 const u32 *d2 = (const u32 *) v2;
4887
4888 uint n = 6;
4889
4890 while (n--)
4891 {
4892 if (d1[n] > d2[n]) return ( 1);
4893 if (d1[n] < d2[n]) return (-1);
4894 }
4895
4896 return (0);
4897 }
4898
4899 int sort_by_digest_4_8 (const void *v1, const void *v2)
4900 {
4901 const u32 *d1 = (const u32 *) v1;
4902 const u32 *d2 = (const u32 *) v2;
4903
4904 uint n = 8;
4905
4906 while (n--)
4907 {
4908 if (d1[n] > d2[n]) return ( 1);
4909 if (d1[n] < d2[n]) return (-1);
4910 }
4911
4912 return (0);
4913 }
4914
4915 int sort_by_digest_4_16 (const void *v1, const void *v2)
4916 {
4917 const u32 *d1 = (const u32 *) v1;
4918 const u32 *d2 = (const u32 *) v2;
4919
4920 uint n = 16;
4921
4922 while (n--)
4923 {
4924 if (d1[n] > d2[n]) return ( 1);
4925 if (d1[n] < d2[n]) return (-1);
4926 }
4927
4928 return (0);
4929 }
4930
4931 int sort_by_digest_4_32 (const void *v1, const void *v2)
4932 {
4933 const u32 *d1 = (const u32 *) v1;
4934 const u32 *d2 = (const u32 *) v2;
4935
4936 uint n = 32;
4937
4938 while (n--)
4939 {
4940 if (d1[n] > d2[n]) return ( 1);
4941 if (d1[n] < d2[n]) return (-1);
4942 }
4943
4944 return (0);
4945 }
4946
4947 int sort_by_digest_4_64 (const void *v1, const void *v2)
4948 {
4949 const u32 *d1 = (const u32 *) v1;
4950 const u32 *d2 = (const u32 *) v2;
4951
4952 uint n = 64;
4953
4954 while (n--)
4955 {
4956 if (d1[n] > d2[n]) return ( 1);
4957 if (d1[n] < d2[n]) return (-1);
4958 }
4959
4960 return (0);
4961 }
4962
4963 int sort_by_digest_8_8 (const void *v1, const void *v2)
4964 {
4965 const u64 *d1 = (const u64 *) v1;
4966 const u64 *d2 = (const u64 *) v2;
4967
4968 uint n = 8;
4969
4970 while (n--)
4971 {
4972 if (d1[n] > d2[n]) return ( 1);
4973 if (d1[n] < d2[n]) return (-1);
4974 }
4975
4976 return (0);
4977 }
4978
4979 int sort_by_digest_8_16 (const void *v1, const void *v2)
4980 {
4981 const u64 *d1 = (const u64 *) v1;
4982 const u64 *d2 = (const u64 *) v2;
4983
4984 uint n = 16;
4985
4986 while (n--)
4987 {
4988 if (d1[n] > d2[n]) return ( 1);
4989 if (d1[n] < d2[n]) return (-1);
4990 }
4991
4992 return (0);
4993 }
4994
4995 int sort_by_digest_8_25 (const void *v1, const void *v2)
4996 {
4997 const u64 *d1 = (const u64 *) v1;
4998 const u64 *d2 = (const u64 *) v2;
4999
5000 uint n = 25;
5001
5002 while (n--)
5003 {
5004 if (d1[n] > d2[n]) return ( 1);
5005 if (d1[n] < d2[n]) return (-1);
5006 }
5007
5008 return (0);
5009 }
5010
5011 int sort_by_digest_p0p1 (const void *v1, const void *v2)
5012 {
5013 const u32 *d1 = (const u32 *) v1;
5014 const u32 *d2 = (const u32 *) v2;
5015
5016 const uint dgst_pos0 = data.dgst_pos0;
5017 const uint dgst_pos1 = data.dgst_pos1;
5018 const uint dgst_pos2 = data.dgst_pos2;
5019 const uint dgst_pos3 = data.dgst_pos3;
5020
5021 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
5022 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
5023 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
5024 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
5025 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
5026 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
5027 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
5028 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
5029
5030 return (0);
5031 }
5032
5033 int sort_by_tuning_db_alias (const void *v1, const void *v2)
5034 {
5035 const tuning_db_alias_t *t1 = (const tuning_db_alias_t *) v1;
5036 const tuning_db_alias_t *t2 = (const tuning_db_alias_t *) v2;
5037
5038 const int res1 = strcmp (t1->device_name, t2->device_name);
5039
5040 if (res1 != 0) return (res1);
5041
5042 return 0;
5043 }
5044
5045 int sort_by_tuning_db_entry (const void *v1, const void *v2)
5046 {
5047 const tuning_db_entry_t *t1 = (const tuning_db_entry_t *) v1;
5048 const tuning_db_entry_t *t2 = (const tuning_db_entry_t *) v2;
5049
5050 const int res1 = strcmp (t1->device_name, t2->device_name);
5051
5052 if (res1 != 0) return (res1);
5053
5054 const int res2 = t1->attack_mode
5055 - t2->attack_mode;
5056
5057 if (res2 != 0) return (res2);
5058
5059 const int res3 = t1->hash_type
5060 - t2->hash_type;
5061
5062 if (res3 != 0) return (res3);
5063
5064 return 0;
5065 }
5066
5067 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)
5068 {
5069 uint outfile_autohex = data.outfile_autohex;
5070
5071 unsigned char *rule_ptr = (unsigned char *) rule_buf;
5072
5073 FILE *debug_fp = NULL;
5074
5075 if (debug_file != NULL)
5076 {
5077 debug_fp = fopen (debug_file, "ab");
5078
5079 lock_file (debug_fp);
5080 }
5081 else
5082 {
5083 debug_fp = stderr;
5084 }
5085
5086 if (debug_fp == NULL)
5087 {
5088 log_info ("WARNING: Could not open debug-file for writing");
5089 }
5090 else
5091 {
5092 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
5093 {
5094 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
5095
5096 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
5097 }
5098
5099 fwrite (rule_ptr, rule_len, 1, debug_fp);
5100
5101 if (debug_mode == 4)
5102 {
5103 fputc (':', debug_fp);
5104
5105 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
5106 }
5107
5108 fputc ('\n', debug_fp);
5109
5110 if (debug_file != NULL) fclose (debug_fp);
5111 }
5112 }
5113
5114 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
5115 {
5116 int needs_hexify = 0;
5117
5118 if (outfile_autohex == 1)
5119 {
5120 for (uint i = 0; i < plain_len; i++)
5121 {
5122 if (plain_ptr[i] < 0x20)
5123 {
5124 needs_hexify = 1;
5125
5126 break;
5127 }
5128
5129 if (plain_ptr[i] > 0x7f)
5130 {
5131 needs_hexify = 1;
5132
5133 break;
5134 }
5135 }
5136 }
5137
5138 if (needs_hexify == 1)
5139 {
5140 fprintf (fp, "$HEX[");
5141
5142 for (uint i = 0; i < plain_len; i++)
5143 {
5144 fprintf (fp, "%02x", plain_ptr[i]);
5145 }
5146
5147 fprintf (fp, "]");
5148 }
5149 else
5150 {
5151 fwrite (plain_ptr, plain_len, 1, fp);
5152 }
5153 }
5154
5155 void format_output (FILE *out_fp, char *out_buf, unsigned char *plain_ptr, const uint plain_len, const u64 crackpos, unsigned char *username, const uint user_len)
5156 {
5157 uint outfile_format = data.outfile_format;
5158
5159 char separator = data.separator;
5160
5161 if (outfile_format & OUTFILE_FMT_HASH)
5162 {
5163 fprintf (out_fp, "%s", out_buf);
5164
5165 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5166 {
5167 fputc (separator, out_fp);
5168 }
5169 }
5170 else if (data.username)
5171 {
5172 if (username != NULL)
5173 {
5174 for (uint i = 0; i < user_len; i++)
5175 {
5176 fprintf (out_fp, "%c", username[i]);
5177 }
5178
5179 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5180 {
5181 fputc (separator, out_fp);
5182 }
5183 }
5184 }
5185
5186 if (outfile_format & OUTFILE_FMT_PLAIN)
5187 {
5188 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
5189
5190 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5191 {
5192 fputc (separator, out_fp);
5193 }
5194 }
5195
5196 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
5197 {
5198 for (uint i = 0; i < plain_len; i++)
5199 {
5200 fprintf (out_fp, "%02x", plain_ptr[i]);
5201 }
5202
5203 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
5204 {
5205 fputc (separator, out_fp);
5206 }
5207 }
5208
5209 if (outfile_format & OUTFILE_FMT_CRACKPOS)
5210 {
5211 #ifdef _WIN
5212 __mingw_fprintf (out_fp, "%llu", crackpos);
5213 #endif
5214
5215 #ifdef _POSIX
5216 #ifdef __x86_64__
5217 fprintf (out_fp, "%lu", (unsigned long) crackpos);
5218 #else
5219 fprintf (out_fp, "%llu", crackpos);
5220 #endif
5221 #endif
5222 }
5223
5224 fputc ('\n', out_fp);
5225 }
5226
5227 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)
5228 {
5229 pot_t pot_key;
5230
5231 pot_key.hash.salt = hashes_buf->salt;
5232 pot_key.hash.digest = hashes_buf->digest;
5233
5234 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5235
5236 if (pot_ptr)
5237 {
5238 log_info_nn ("");
5239
5240 input_buf[input_len] = 0;
5241
5242 // user
5243 unsigned char *username = NULL;
5244 uint user_len = 0;
5245
5246 if (data.username)
5247 {
5248 user_t *user = hashes_buf->hash_info->user;
5249
5250 if (user)
5251 {
5252 username = (unsigned char *) (user->user_name);
5253
5254 user_len = user->user_len;
5255 }
5256 }
5257
5258 // do output the line
5259 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
5260 }
5261 }
5262
5263 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
5264 #define LM_MASKED_PLAIN "[notfound]"
5265
5266 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)
5267 {
5268 // left
5269
5270 pot_t pot_left_key;
5271
5272 pot_left_key.hash.salt = hash_left->salt;
5273 pot_left_key.hash.digest = hash_left->digest;
5274
5275 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5276
5277 // right
5278
5279 uint weak_hash_found = 0;
5280
5281 pot_t pot_right_key;
5282
5283 pot_right_key.hash.salt = hash_right->salt;
5284 pot_right_key.hash.digest = hash_right->digest;
5285
5286 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5287
5288 if (pot_right_ptr == NULL)
5289 {
5290 // special case, if "weak hash"
5291
5292 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5293 {
5294 weak_hash_found = 1;
5295
5296 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5297
5298 // in theory this is not needed, but we are paranoia:
5299
5300 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5301 pot_right_ptr->plain_len = 0;
5302 }
5303 }
5304
5305 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
5306 {
5307 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
5308
5309 return;
5310 }
5311
5312 // at least one half was found:
5313
5314 log_info_nn ("");
5315
5316 input_buf[input_len] = 0;
5317
5318 // user
5319
5320 unsigned char *username = NULL;
5321 uint user_len = 0;
5322
5323 if (data.username)
5324 {
5325 user_t *user = hash_left->hash_info->user;
5326
5327 if (user)
5328 {
5329 username = (unsigned char *) (user->user_name);
5330
5331 user_len = user->user_len;
5332 }
5333 }
5334
5335 // mask the part which was not found
5336
5337 uint left_part_masked = 0;
5338 uint right_part_masked = 0;
5339
5340 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5341
5342 if (pot_left_ptr == NULL)
5343 {
5344 left_part_masked = 1;
5345
5346 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5347
5348 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5349
5350 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5351 pot_left_ptr->plain_len = mask_plain_len;
5352 }
5353
5354 if (pot_right_ptr == NULL)
5355 {
5356 right_part_masked = 1;
5357
5358 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5359
5360 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5361
5362 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5363 pot_right_ptr->plain_len = mask_plain_len;
5364 }
5365
5366 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5367
5368 pot_t pot_ptr;
5369
5370 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5371
5372 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5373
5374 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5375
5376 // do output the line
5377
5378 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5379
5380 if (weak_hash_found == 1) myfree (pot_right_ptr);
5381
5382 if (left_part_masked == 1) myfree (pot_left_ptr);
5383 if (right_part_masked == 1) myfree (pot_right_ptr);
5384 }
5385
5386 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)
5387 {
5388 pot_t pot_key;
5389
5390 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5391
5392 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5393
5394 if (pot_ptr == NULL)
5395 {
5396 log_info_nn ("");
5397
5398 input_buf[input_len] = 0;
5399
5400 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5401 }
5402 }
5403
5404 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)
5405 {
5406 // left
5407
5408 pot_t pot_left_key;
5409
5410 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5411
5412 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5413
5414 // right
5415
5416 pot_t pot_right_key;
5417
5418 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5419
5420 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5421
5422 uint weak_hash_found = 0;
5423
5424 if (pot_right_ptr == NULL)
5425 {
5426 // special case, if "weak hash"
5427
5428 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5429 {
5430 weak_hash_found = 1;
5431
5432 // we just need that pot_right_ptr is not a NULL pointer
5433
5434 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5435 }
5436 }
5437
5438 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5439 {
5440 if (weak_hash_found == 1) myfree (pot_right_ptr);
5441
5442 return;
5443 }
5444
5445 // ... at least one part was not cracked
5446
5447 log_info_nn ("");
5448
5449 input_buf[input_len] = 0;
5450
5451 // only show the hash part which is still not cracked
5452
5453 uint user_len = input_len - 32;
5454
5455 char *hash_output = (char *) mymalloc (33);
5456
5457 memcpy (hash_output, input_buf, input_len);
5458
5459 if (pot_left_ptr != NULL)
5460 {
5461 // only show right part (because left part was already found)
5462
5463 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5464
5465 hash_output[user_len + 16] = 0;
5466 }
5467
5468 if (pot_right_ptr != NULL)
5469 {
5470 // only show left part (because right part was already found)
5471
5472 memcpy (hash_output + user_len, input_buf + user_len, 16);
5473
5474 hash_output[user_len + 16] = 0;
5475 }
5476
5477 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5478
5479 myfree (hash_output);
5480
5481 if (weak_hash_found == 1) myfree (pot_right_ptr);
5482 }
5483
5484 uint setup_opencl_platforms_filter (char *opencl_platforms)
5485 {
5486 uint opencl_platforms_filter = 0;
5487
5488 if (opencl_platforms)
5489 {
5490 char *platforms = strdup (opencl_platforms);
5491
5492 char *next = strtok (platforms, ",");
5493
5494 do
5495 {
5496 int platform = atoi (next);
5497
5498 if (platform < 1 || platform > 32)
5499 {
5500 log_error ("ERROR: Invalid OpenCL platform %u specified", platform);
5501
5502 exit (-1);
5503 }
5504
5505 opencl_platforms_filter |= 1 << (platform - 1);
5506
5507 } while ((next = strtok (NULL, ",")) != NULL);
5508
5509 free (platforms);
5510 }
5511 else
5512 {
5513 opencl_platforms_filter = -1;
5514 }
5515
5516 return opencl_platforms_filter;
5517 }
5518
5519 u32 setup_devices_filter (char *opencl_devices)
5520 {
5521 u32 devices_filter = 0;
5522
5523 if (opencl_devices)
5524 {
5525 char *devices = strdup (opencl_devices);
5526
5527 char *next = strtok (devices, ",");
5528
5529 do
5530 {
5531 int device_id = atoi (next);
5532
5533 if (device_id < 1 || device_id > 32)
5534 {
5535 log_error ("ERROR: Invalid device_id %u specified", device_id);
5536
5537 exit (-1);
5538 }
5539
5540 devices_filter |= 1 << (device_id - 1);
5541
5542 } while ((next = strtok (NULL, ",")) != NULL);
5543
5544 free (devices);
5545 }
5546 else
5547 {
5548 devices_filter = -1;
5549 }
5550
5551 return devices_filter;
5552 }
5553
5554 cl_device_type setup_device_types_filter (char *opencl_device_types)
5555 {
5556 cl_device_type device_types_filter = 0;
5557
5558 if (opencl_device_types)
5559 {
5560 char *device_types = strdup (opencl_device_types);
5561
5562 char *next = strtok (device_types, ",");
5563
5564 do
5565 {
5566 int device_type = atoi (next);
5567
5568 if (device_type < 1 || device_type > 3)
5569 {
5570 log_error ("ERROR: Invalid device_type %u specified", device_type);
5571
5572 exit (-1);
5573 }
5574
5575 device_types_filter |= 1 << device_type;
5576
5577 } while ((next = strtok (NULL, ",")) != NULL);
5578
5579 free (device_types);
5580 }
5581 else
5582 {
5583 // Do not use CPU by default, this often reduces GPU performance because
5584 // the CPU is too busy to handle GPU synchronization
5585
5586 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5587 }
5588
5589 return device_types_filter;
5590 }
5591
5592 u32 get_random_num (const u32 min, const u32 max)
5593 {
5594 if (min == max) return (min);
5595
5596 return ((rand () % (max - min)) + min);
5597 }
5598
5599 u32 mydivc32 (const u32 dividend, const u32 divisor)
5600 {
5601 u32 quotient = dividend / divisor;
5602
5603 if (dividend % divisor) quotient++;
5604
5605 return quotient;
5606 }
5607
5608 u64 mydivc64 (const u64 dividend, const u64 divisor)
5609 {
5610 u64 quotient = dividend / divisor;
5611
5612 if (dividend % divisor) quotient++;
5613
5614 return quotient;
5615 }
5616
5617 void format_timer_display (struct tm *tm, char *buf, size_t len)
5618 {
5619 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5620 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5621
5622 if (tm->tm_year - 70)
5623 {
5624 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5625 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5626
5627 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5628 }
5629 else if (tm->tm_yday)
5630 {
5631 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5632 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5633
5634 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5635 }
5636 else if (tm->tm_hour)
5637 {
5638 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5639 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5640
5641 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5642 }
5643 else if (tm->tm_min)
5644 {
5645 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5646 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5647
5648 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5649 }
5650 else
5651 {
5652 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5653
5654 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5655 }
5656 }
5657
5658 void format_speed_display (float val, char *buf, size_t len)
5659 {
5660 if (val <= 0)
5661 {
5662 buf[0] = '0';
5663 buf[1] = ' ';
5664 buf[2] = 0;
5665
5666 return;
5667 }
5668
5669 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5670
5671 uint level = 0;
5672
5673 while (val > 99999)
5674 {
5675 val /= 1000;
5676
5677 level++;
5678 }
5679
5680 /* generate output */
5681
5682 if (level == 0)
5683 {
5684 snprintf (buf, len - 1, "%.0f ", val);
5685 }
5686 else
5687 {
5688 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5689 }
5690 }
5691
5692 void lowercase (u8 *buf, int len)
5693 {
5694 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5695 }
5696
5697 void uppercase (u8 *buf, int len)
5698 {
5699 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5700 }
5701
5702 int fgetl (FILE *fp, char *line_buf)
5703 {
5704 int line_len = 0;
5705
5706 while (!feof (fp))
5707 {
5708 const int c = fgetc (fp);
5709
5710 if (c == EOF) break;
5711
5712 line_buf[line_len] = (char) c;
5713
5714 line_len++;
5715
5716 if (line_len == HCBUFSIZ) line_len--;
5717
5718 if (c == '\n') break;
5719 }
5720
5721 if (line_len == 0) return 0;
5722
5723 if (line_buf[line_len - 1] == '\n')
5724 {
5725 line_len--;
5726
5727 line_buf[line_len] = 0;
5728 }
5729
5730 if (line_len == 0) return 0;
5731
5732 if (line_buf[line_len - 1] == '\r')
5733 {
5734 line_len--;
5735
5736 line_buf[line_len] = 0;
5737 }
5738
5739 return (line_len);
5740 }
5741
5742 int in_superchop (char *buf)
5743 {
5744 int len = strlen (buf);
5745
5746 while (len)
5747 {
5748 if (buf[len - 1] == '\n')
5749 {
5750 len--;
5751
5752 continue;
5753 }
5754
5755 if (buf[len - 1] == '\r')
5756 {
5757 len--;
5758
5759 continue;
5760 }
5761
5762 break;
5763 }
5764
5765 buf[len] = 0;
5766
5767 return len;
5768 }
5769
5770 char **scan_directory (const char *path)
5771 {
5772 char *tmp_path = mystrdup (path);
5773
5774 size_t tmp_path_len = strlen (tmp_path);
5775
5776 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5777 {
5778 tmp_path[tmp_path_len - 1] = 0;
5779
5780 tmp_path_len = strlen (tmp_path);
5781 }
5782
5783 char **files = NULL;
5784
5785 int num_files = 0;
5786
5787 DIR *d = NULL;
5788
5789 if ((d = opendir (tmp_path)) != NULL)
5790 {
5791 #ifdef DARWIN
5792 struct dirent e;
5793
5794 for (;;) {
5795 memset (&e, 0, sizeof (e));
5796 struct dirent *de = NULL;
5797
5798 if (readdir_r (d, &e, &de) != 0)
5799 {
5800 log_error ("ERROR: readdir_r() failed");
5801
5802 break;
5803 }
5804
5805 if (de == NULL) break;
5806 #else
5807 struct dirent *de;
5808
5809 while ((de = readdir (d)) != NULL)
5810 {
5811 #endif
5812 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5813
5814 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5815
5816 char *path_file = (char *) mymalloc (path_size + 1);
5817
5818 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5819
5820 path_file[path_size] = 0;
5821
5822 DIR *d_test;
5823
5824 if ((d_test = opendir (path_file)) != NULL)
5825 {
5826 closedir (d_test);
5827
5828 myfree (path_file);
5829 }
5830 else
5831 {
5832 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5833
5834 num_files++;
5835
5836 files[num_files - 1] = path_file;
5837 }
5838 }
5839
5840 closedir (d);
5841 }
5842 else if (errno == ENOTDIR)
5843 {
5844 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5845
5846 num_files++;
5847
5848 files[num_files - 1] = mystrdup (path);
5849 }
5850
5851 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5852
5853 num_files++;
5854
5855 files[num_files - 1] = NULL;
5856
5857 myfree (tmp_path);
5858
5859 return (files);
5860 }
5861
5862 int count_dictionaries (char **dictionary_files)
5863 {
5864 if (dictionary_files == NULL) return 0;
5865
5866 int cnt = 0;
5867
5868 for (int d = 0; dictionary_files[d] != NULL; d++)
5869 {
5870 cnt++;
5871 }
5872
5873 return (cnt);
5874 }
5875
5876 char *stroptitype (const uint opti_type)
5877 {
5878 switch (opti_type)
5879 {
5880 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5881 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5882 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5883 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5884 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5885 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5886 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5887 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5888 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5889 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5890 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5891 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5892 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5893 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5894 case OPTI_TYPE_SLOW_HASH_SIMD: return ((char *) OPTI_STR_SLOW_HASH_SIMD); break;
5895 case OPTI_TYPE_USES_BITS_8: return ((char *) OPTI_STR_USES_BITS_8); break;
5896 case OPTI_TYPE_USES_BITS_16: return ((char *) OPTI_STR_USES_BITS_16); break;
5897 case OPTI_TYPE_USES_BITS_32: return ((char *) OPTI_STR_USES_BITS_32); break;
5898 case OPTI_TYPE_USES_BITS_64: return ((char *) OPTI_STR_USES_BITS_64); break;
5899 }
5900
5901 return (NULL);
5902 }
5903
5904 char *strparser (const uint parser_status)
5905 {
5906 switch (parser_status)
5907 {
5908 case PARSER_OK: return ((char *) PA_000); break;
5909 case PARSER_COMMENT: return ((char *) PA_001); break;
5910 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5911 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5912 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5913 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5914 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5915 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5916 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5917 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5918 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5919 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5920 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5921 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5922 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5923 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5924 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5925 }
5926
5927 return ((char *) PA_255);
5928 }
5929
5930 char *strhashtype (const uint hash_mode)
5931 {
5932 switch (hash_mode)
5933 {
5934 case 0: return ((char *) HT_00000); break;
5935 case 10: return ((char *) HT_00010); break;
5936 case 11: return ((char *) HT_00011); break;
5937 case 12: return ((char *) HT_00012); break;
5938 case 20: return ((char *) HT_00020); break;
5939 case 21: return ((char *) HT_00021); break;
5940 case 22: return ((char *) HT_00022); break;
5941 case 23: return ((char *) HT_00023); break;
5942 case 30: return ((char *) HT_00030); break;
5943 case 40: return ((char *) HT_00040); break;
5944 case 50: return ((char *) HT_00050); break;
5945 case 60: return ((char *) HT_00060); break;
5946 case 100: return ((char *) HT_00100); break;
5947 case 101: return ((char *) HT_00101); break;
5948 case 110: return ((char *) HT_00110); break;
5949 case 111: return ((char *) HT_00111); break;
5950 case 112: return ((char *) HT_00112); break;
5951 case 120: return ((char *) HT_00120); break;
5952 case 121: return ((char *) HT_00121); break;
5953 case 122: return ((char *) HT_00122); break;
5954 case 124: return ((char *) HT_00124); break;
5955 case 125: return ((char *) HT_00125); break;
5956 case 130: return ((char *) HT_00130); break;
5957 case 131: return ((char *) HT_00131); break;
5958 case 132: return ((char *) HT_00132); break;
5959 case 133: return ((char *) HT_00133); break;
5960 case 140: return ((char *) HT_00140); break;
5961 case 141: return ((char *) HT_00141); break;
5962 case 150: return ((char *) HT_00150); break;
5963 case 160: return ((char *) HT_00160); break;
5964 case 200: return ((char *) HT_00200); break;
5965 case 300: return ((char *) HT_00300); break;
5966 case 400: return ((char *) HT_00400); break;
5967 case 500: return ((char *) HT_00500); break;
5968 case 501: return ((char *) HT_00501); break;
5969 case 900: return ((char *) HT_00900); break;
5970 case 910: return ((char *) HT_00910); break;
5971 case 1000: return ((char *) HT_01000); break;
5972 case 1100: return ((char *) HT_01100); break;
5973 case 1400: return ((char *) HT_01400); break;
5974 case 1410: return ((char *) HT_01410); break;
5975 case 1420: return ((char *) HT_01420); break;
5976 case 1421: return ((char *) HT_01421); break;
5977 case 1430: return ((char *) HT_01430); break;
5978 case 1440: return ((char *) HT_01440); break;
5979 case 1441: return ((char *) HT_01441); break;
5980 case 1450: return ((char *) HT_01450); break;
5981 case 1460: return ((char *) HT_01460); break;
5982 case 1500: return ((char *) HT_01500); break;
5983 case 1600: return ((char *) HT_01600); break;
5984 case 1700: return ((char *) HT_01700); break;
5985 case 1710: return ((char *) HT_01710); break;
5986 case 1711: return ((char *) HT_01711); break;
5987 case 1720: return ((char *) HT_01720); break;
5988 case 1722: return ((char *) HT_01722); break;
5989 case 1730: return ((char *) HT_01730); break;
5990 case 1731: return ((char *) HT_01731); break;
5991 case 1740: return ((char *) HT_01740); break;
5992 case 1750: return ((char *) HT_01750); break;
5993 case 1760: return ((char *) HT_01760); break;
5994 case 1800: return ((char *) HT_01800); break;
5995 case 2100: return ((char *) HT_02100); break;
5996 case 2400: return ((char *) HT_02400); break;
5997 case 2410: return ((char *) HT_02410); break;
5998 case 2500: return ((char *) HT_02500); break;
5999 case 2600: return ((char *) HT_02600); break;
6000 case 2611: return ((char *) HT_02611); break;
6001 case 2612: return ((char *) HT_02612); break;
6002 case 2711: return ((char *) HT_02711); break;
6003 case 2811: return ((char *) HT_02811); break;
6004 case 3000: return ((char *) HT_03000); break;
6005 case 3100: return ((char *) HT_03100); break;
6006 case 3200: return ((char *) HT_03200); break;
6007 case 3710: return ((char *) HT_03710); break;
6008 case 3711: return ((char *) HT_03711); break;
6009 case 3800: return ((char *) HT_03800); break;
6010 case 4300: return ((char *) HT_04300); break;
6011 case 4400: return ((char *) HT_04400); break;
6012 case 4500: return ((char *) HT_04500); break;
6013 case 4700: return ((char *) HT_04700); break;
6014 case 4800: return ((char *) HT_04800); break;
6015 case 4900: return ((char *) HT_04900); break;
6016 case 5000: return ((char *) HT_05000); break;
6017 case 5100: return ((char *) HT_05100); break;
6018 case 5200: return ((char *) HT_05200); break;
6019 case 5300: return ((char *) HT_05300); break;
6020 case 5400: return ((char *) HT_05400); break;
6021 case 5500: return ((char *) HT_05500); break;
6022 case 5600: return ((char *) HT_05600); break;
6023 case 5700: return ((char *) HT_05700); break;
6024 case 5800: return ((char *) HT_05800); break;
6025 case 6000: return ((char *) HT_06000); break;
6026 case 6100: return ((char *) HT_06100); break;
6027 case 6211: return ((char *) HT_06211); break;
6028 case 6212: return ((char *) HT_06212); break;
6029 case 6213: return ((char *) HT_06213); break;
6030 case 6221: return ((char *) HT_06221); break;
6031 case 6222: return ((char *) HT_06222); break;
6032 case 6223: return ((char *) HT_06223); break;
6033 case 6231: return ((char *) HT_06231); break;
6034 case 6232: return ((char *) HT_06232); break;
6035 case 6233: return ((char *) HT_06233); break;
6036 case 6241: return ((char *) HT_06241); break;
6037 case 6242: return ((char *) HT_06242); break;
6038 case 6243: return ((char *) HT_06243); break;
6039 case 6300: return ((char *) HT_06300); break;
6040 case 6400: return ((char *) HT_06400); break;
6041 case 6500: return ((char *) HT_06500); break;
6042 case 6600: return ((char *) HT_06600); break;
6043 case 6700: return ((char *) HT_06700); break;
6044 case 6800: return ((char *) HT_06800); break;
6045 case 6900: return ((char *) HT_06900); break;
6046 case 7100: return ((char *) HT_07100); break;
6047 case 7200: return ((char *) HT_07200); break;
6048 case 7300: return ((char *) HT_07300); break;
6049 case 7400: return ((char *) HT_07400); break;
6050 case 7500: return ((char *) HT_07500); break;
6051 case 7600: return ((char *) HT_07600); break;
6052 case 7700: return ((char *) HT_07700); break;
6053 case 7800: return ((char *) HT_07800); break;
6054 case 7900: return ((char *) HT_07900); break;
6055 case 8000: return ((char *) HT_08000); break;
6056 case 8100: return ((char *) HT_08100); break;
6057 case 8200: return ((char *) HT_08200); break;
6058 case 8300: return ((char *) HT_08300); break;
6059 case 8400: return ((char *) HT_08400); break;
6060 case 8500: return ((char *) HT_08500); break;
6061 case 8600: return ((char *) HT_08600); break;
6062 case 8700: return ((char *) HT_08700); break;
6063 case 8800: return ((char *) HT_08800); break;
6064 case 8900: return ((char *) HT_08900); break;
6065 case 9000: return ((char *) HT_09000); break;
6066 case 9100: return ((char *) HT_09100); break;
6067 case 9200: return ((char *) HT_09200); break;
6068 case 9300: return ((char *) HT_09300); break;
6069 case 9400: return ((char *) HT_09400); break;
6070 case 9500: return ((char *) HT_09500); break;
6071 case 9600: return ((char *) HT_09600); break;
6072 case 9700: return ((char *) HT_09700); break;
6073 case 9710: return ((char *) HT_09710); break;
6074 case 9720: return ((char *) HT_09720); break;
6075 case 9800: return ((char *) HT_09800); break;
6076 case 9810: return ((char *) HT_09810); break;
6077 case 9820: return ((char *) HT_09820); break;
6078 case 9900: return ((char *) HT_09900); break;
6079 case 10000: return ((char *) HT_10000); break;
6080 case 10100: return ((char *) HT_10100); break;
6081 case 10200: return ((char *) HT_10200); break;
6082 case 10300: return ((char *) HT_10300); break;
6083 case 10400: return ((char *) HT_10400); break;
6084 case 10410: return ((char *) HT_10410); break;
6085 case 10420: return ((char *) HT_10420); break;
6086 case 10500: return ((char *) HT_10500); break;
6087 case 10600: return ((char *) HT_10600); break;
6088 case 10700: return ((char *) HT_10700); break;
6089 case 10800: return ((char *) HT_10800); break;
6090 case 10900: return ((char *) HT_10900); break;
6091 case 11000: return ((char *) HT_11000); break;
6092 case 11100: return ((char *) HT_11100); break;
6093 case 11200: return ((char *) HT_11200); break;
6094 case 11300: return ((char *) HT_11300); break;
6095 case 11400: return ((char *) HT_11400); break;
6096 case 11500: return ((char *) HT_11500); break;
6097 case 11600: return ((char *) HT_11600); break;
6098 case 11700: return ((char *) HT_11700); break;
6099 case 11800: return ((char *) HT_11800); break;
6100 case 11900: return ((char *) HT_11900); break;
6101 case 12000: return ((char *) HT_12000); break;
6102 case 12100: return ((char *) HT_12100); break;
6103 case 12200: return ((char *) HT_12200); break;
6104 case 12300: return ((char *) HT_12300); break;
6105 case 12400: return ((char *) HT_12400); break;
6106 case 12500: return ((char *) HT_12500); break;
6107 case 12600: return ((char *) HT_12600); break;
6108 case 12700: return ((char *) HT_12700); break;
6109 case 12800: return ((char *) HT_12800); break;
6110 case 12900: return ((char *) HT_12900); break;
6111 case 13000: return ((char *) HT_13000); break;
6112 case 13100: return ((char *) HT_13100); break;
6113 case 13200: return ((char *) HT_13200); break;
6114 case 13300: return ((char *) HT_13300); break;
6115 case 13400: return ((char *) HT_13400); break;
6116 case 13500: return ((char *) HT_13500); break;
6117 case 13600: return ((char *) HT_13600); break;
6118 case 13711: return ((char *) HT_13711); break;
6119 case 13712: return ((char *) HT_13712); break;
6120 case 13713: return ((char *) HT_13713); break;
6121 case 13721: return ((char *) HT_13721); break;
6122 case 13722: return ((char *) HT_13722); break;
6123 case 13723: return ((char *) HT_13723); break;
6124 case 13731: return ((char *) HT_13731); break;
6125 case 13732: return ((char *) HT_13732); break;
6126 case 13733: return ((char *) HT_13733); break;
6127 case 13741: return ((char *) HT_13741); break;
6128 case 13742: return ((char *) HT_13742); break;
6129 case 13743: return ((char *) HT_13743); break;
6130 case 13751: return ((char *) HT_13751); break;
6131 case 13752: return ((char *) HT_13752); break;
6132 case 13753: return ((char *) HT_13753); break;
6133 case 13761: return ((char *) HT_13761); break;
6134 case 13762: return ((char *) HT_13762); break;
6135 case 13763: return ((char *) HT_13763); break;
6136 case 13800: return ((char *) HT_13800); break;
6137 }
6138
6139 return ((char *) "Unknown");
6140 }
6141
6142 char *strstatus (const uint devices_status)
6143 {
6144 switch (devices_status)
6145 {
6146 case STATUS_INIT: return ((char *) ST_0000); break;
6147 case STATUS_STARTING: return ((char *) ST_0001); break;
6148 case STATUS_RUNNING: return ((char *) ST_0002); break;
6149 case STATUS_PAUSED: return ((char *) ST_0003); break;
6150 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
6151 case STATUS_CRACKED: return ((char *) ST_0005); break;
6152 case STATUS_ABORTED: return ((char *) ST_0006); break;
6153 case STATUS_QUIT: return ((char *) ST_0007); break;
6154 case STATUS_BYPASS: return ((char *) ST_0008); break;
6155 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
6156 case STATUS_AUTOTUNE: return ((char *) ST_0010); break;
6157 }
6158
6159 return ((char *) "Unknown");
6160 }
6161
6162 void ascii_digest (char *out_buf, uint salt_pos, uint digest_pos)
6163 {
6164 uint hash_type = data.hash_type;
6165 uint hash_mode = data.hash_mode;
6166 uint salt_type = data.salt_type;
6167 uint opts_type = data.opts_type;
6168 uint opti_type = data.opti_type;
6169 uint dgst_size = data.dgst_size;
6170
6171 char *hashfile = data.hashfile;
6172
6173 uint len = 4096;
6174
6175 uint digest_buf[64] = { 0 };
6176
6177 u64 *digest_buf64 = (u64 *) digest_buf;
6178
6179 char *digests_buf_ptr = (char *) data.digests_buf;
6180
6181 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
6182
6183 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6184 {
6185 uint tt;
6186
6187 switch (hash_type)
6188 {
6189 case HASH_TYPE_DESCRYPT:
6190 FP (digest_buf[1], digest_buf[0], tt);
6191 break;
6192
6193 case HASH_TYPE_DESRACF:
6194 digest_buf[0] = rotl32 (digest_buf[0], 29);
6195 digest_buf[1] = rotl32 (digest_buf[1], 29);
6196
6197 FP (digest_buf[1], digest_buf[0], tt);
6198 break;
6199
6200 case HASH_TYPE_LM:
6201 FP (digest_buf[1], digest_buf[0], tt);
6202 break;
6203
6204 case HASH_TYPE_NETNTLM:
6205 digest_buf[0] = rotl32 (digest_buf[0], 29);
6206 digest_buf[1] = rotl32 (digest_buf[1], 29);
6207 digest_buf[2] = rotl32 (digest_buf[2], 29);
6208 digest_buf[3] = rotl32 (digest_buf[3], 29);
6209
6210 FP (digest_buf[1], digest_buf[0], tt);
6211 FP (digest_buf[3], digest_buf[2], tt);
6212 break;
6213
6214 case HASH_TYPE_BSDICRYPT:
6215 digest_buf[0] = rotl32 (digest_buf[0], 31);
6216 digest_buf[1] = rotl32 (digest_buf[1], 31);
6217
6218 FP (digest_buf[1], digest_buf[0], tt);
6219 break;
6220 }
6221 }
6222
6223 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
6224 {
6225 switch (hash_type)
6226 {
6227 case HASH_TYPE_MD4:
6228 digest_buf[0] += MD4M_A;
6229 digest_buf[1] += MD4M_B;
6230 digest_buf[2] += MD4M_C;
6231 digest_buf[3] += MD4M_D;
6232 break;
6233
6234 case HASH_TYPE_MD5:
6235 digest_buf[0] += MD5M_A;
6236 digest_buf[1] += MD5M_B;
6237 digest_buf[2] += MD5M_C;
6238 digest_buf[3] += MD5M_D;
6239 break;
6240
6241 case HASH_TYPE_SHA1:
6242 digest_buf[0] += SHA1M_A;
6243 digest_buf[1] += SHA1M_B;
6244 digest_buf[2] += SHA1M_C;
6245 digest_buf[3] += SHA1M_D;
6246 digest_buf[4] += SHA1M_E;
6247 break;
6248
6249 case HASH_TYPE_SHA256:
6250 digest_buf[0] += SHA256M_A;
6251 digest_buf[1] += SHA256M_B;
6252 digest_buf[2] += SHA256M_C;
6253 digest_buf[3] += SHA256M_D;
6254 digest_buf[4] += SHA256M_E;
6255 digest_buf[5] += SHA256M_F;
6256 digest_buf[6] += SHA256M_G;
6257 digest_buf[7] += SHA256M_H;
6258 break;
6259
6260 case HASH_TYPE_SHA384:
6261 digest_buf64[0] += SHA384M_A;
6262 digest_buf64[1] += SHA384M_B;
6263 digest_buf64[2] += SHA384M_C;
6264 digest_buf64[3] += SHA384M_D;
6265 digest_buf64[4] += SHA384M_E;
6266 digest_buf64[5] += SHA384M_F;
6267 digest_buf64[6] += 0;
6268 digest_buf64[7] += 0;
6269 break;
6270
6271 case HASH_TYPE_SHA512:
6272 digest_buf64[0] += SHA512M_A;
6273 digest_buf64[1] += SHA512M_B;
6274 digest_buf64[2] += SHA512M_C;
6275 digest_buf64[3] += SHA512M_D;
6276 digest_buf64[4] += SHA512M_E;
6277 digest_buf64[5] += SHA512M_F;
6278 digest_buf64[6] += SHA512M_G;
6279 digest_buf64[7] += SHA512M_H;
6280 break;
6281 }
6282 }
6283
6284 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
6285 {
6286 if (dgst_size == DGST_SIZE_4_2)
6287 {
6288 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6289 }
6290 else if (dgst_size == DGST_SIZE_4_4)
6291 {
6292 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6293 }
6294 else if (dgst_size == DGST_SIZE_4_5)
6295 {
6296 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6297 }
6298 else if (dgst_size == DGST_SIZE_4_6)
6299 {
6300 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6301 }
6302 else if (dgst_size == DGST_SIZE_4_8)
6303 {
6304 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6305 }
6306 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
6307 {
6308 if (hash_type == HASH_TYPE_WHIRLPOOL)
6309 {
6310 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6311 }
6312 else if (hash_type == HASH_TYPE_SHA384)
6313 {
6314 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6315 }
6316 else if (hash_type == HASH_TYPE_SHA512)
6317 {
6318 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6319 }
6320 else if (hash_type == HASH_TYPE_GOST)
6321 {
6322 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6323 }
6324 }
6325 else if (dgst_size == DGST_SIZE_4_64)
6326 {
6327 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6328 }
6329 else if (dgst_size == DGST_SIZE_8_25)
6330 {
6331 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6332 }
6333 }
6334
6335 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
6336 | (data.salt_type == SALT_TYPE_EXTERN)
6337 | (data.salt_type == SALT_TYPE_EMBEDDED));
6338
6339 salt_t salt;
6340
6341 if (isSalted)
6342 {
6343 memset (&salt, 0, sizeof (salt_t));
6344
6345 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
6346
6347 char *ptr = (char *) salt.salt_buf;
6348
6349 uint len = salt.salt_len;
6350
6351 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6352 {
6353 uint tt;
6354
6355 switch (hash_type)
6356 {
6357 case HASH_TYPE_NETNTLM:
6358
6359 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6360 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6361
6362 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6363
6364 break;
6365 }
6366 }
6367
6368 if (opts_type & OPTS_TYPE_ST_UNICODE)
6369 {
6370 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6371 {
6372 ptr[i] = ptr[j];
6373 }
6374
6375 len = len / 2;
6376 }
6377
6378 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6379 {
6380 uint max = salt.salt_len / 4;
6381
6382 if (len % 4) max++;
6383
6384 for (uint i = 0; i < max; i++)
6385 {
6386 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6387 }
6388 }
6389
6390 if (opts_type & OPTS_TYPE_ST_HEX)
6391 {
6392 char tmp[64] = { 0 };
6393
6394 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6395 {
6396 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6397 }
6398
6399 len = len * 2;
6400
6401 memcpy (ptr, tmp, len);
6402 }
6403
6404 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6405
6406 memset (ptr + len, 0, memset_size);
6407
6408 salt.salt_len = len;
6409 }
6410
6411 //
6412 // some modes require special encoding
6413 //
6414
6415 uint out_buf_plain[256] = { 0 };
6416 uint out_buf_salt[256] = { 0 };
6417
6418 char tmp_buf[1024] = { 0 };
6419
6420 char *ptr_plain = (char *) out_buf_plain;
6421 char *ptr_salt = (char *) out_buf_salt;
6422
6423 if (hash_mode == 22)
6424 {
6425 char username[30] = { 0 };
6426
6427 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6428
6429 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6430
6431 u16 *ptr = (u16 *) digest_buf;
6432
6433 tmp_buf[ 0] = sig[0];
6434 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6435 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6436 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6437 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6438 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6439 tmp_buf[ 6] = sig[1];
6440 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6441 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6442 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6443 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6444 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6445 tmp_buf[12] = sig[2];
6446 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6447 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6448 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6449 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6450 tmp_buf[17] = sig[3];
6451 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6452 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6453 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6454 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6455 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6456 tmp_buf[23] = sig[4];
6457 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6458 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6459 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6460 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6461 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6462 tmp_buf[29] = sig[5];
6463
6464 snprintf (out_buf, len-1, "%s:%s",
6465 tmp_buf,
6466 username);
6467 }
6468 else if (hash_mode == 23)
6469 {
6470 // do not show the skyper part in output
6471
6472 char *salt_buf_ptr = (char *) salt.salt_buf;
6473
6474 salt_buf_ptr[salt.salt_len - 8] = 0;
6475
6476 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6477 digest_buf[0],
6478 digest_buf[1],
6479 digest_buf[2],
6480 digest_buf[3],
6481 salt_buf_ptr);
6482 }
6483 else if (hash_mode == 101)
6484 {
6485 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6486
6487 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6488 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6489 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6490 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6491 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6492
6493 memcpy (tmp_buf, digest_buf, 20);
6494
6495 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6496
6497 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6498 }
6499 else if (hash_mode == 111)
6500 {
6501 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6502
6503 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6504 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6505 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6506 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6507 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6508
6509 memcpy (tmp_buf, digest_buf, 20);
6510 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6511
6512 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6513
6514 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6515 }
6516 else if ((hash_mode == 122) || (hash_mode == 125))
6517 {
6518 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6519 (char *) salt.salt_buf,
6520 digest_buf[0],
6521 digest_buf[1],
6522 digest_buf[2],
6523 digest_buf[3],
6524 digest_buf[4]);
6525 }
6526 else if (hash_mode == 124)
6527 {
6528 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6529 (char *) salt.salt_buf,
6530 digest_buf[0],
6531 digest_buf[1],
6532 digest_buf[2],
6533 digest_buf[3],
6534 digest_buf[4]);
6535 }
6536 else if (hash_mode == 131)
6537 {
6538 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6539 (char *) salt.salt_buf,
6540 0, 0, 0, 0, 0,
6541 digest_buf[0],
6542 digest_buf[1],
6543 digest_buf[2],
6544 digest_buf[3],
6545 digest_buf[4]);
6546 }
6547 else if (hash_mode == 132)
6548 {
6549 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6550 (char *) salt.salt_buf,
6551 digest_buf[0],
6552 digest_buf[1],
6553 digest_buf[2],
6554 digest_buf[3],
6555 digest_buf[4]);
6556 }
6557 else if (hash_mode == 133)
6558 {
6559 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6560
6561 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6562 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6563 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6564 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6565 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6566
6567 memcpy (tmp_buf, digest_buf, 20);
6568
6569 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6570
6571 snprintf (out_buf, len-1, "%s", ptr_plain);
6572 }
6573 else if (hash_mode == 141)
6574 {
6575 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6576
6577 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6578
6579 memset (tmp_buf, 0, sizeof (tmp_buf));
6580
6581 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6582
6583 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6584 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6585 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6586 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6587 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6588
6589 memcpy (tmp_buf, digest_buf, 20);
6590
6591 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6592
6593 ptr_plain[27] = 0;
6594
6595 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6596 }
6597 else if (hash_mode == 400)
6598 {
6599 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6600
6601 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6602 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6603 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6604 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6605
6606 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6607
6608 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6609 }
6610 else if (hash_mode == 500)
6611 {
6612 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6613
6614 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6615 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6616 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6617 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6618
6619 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6620
6621 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6622 {
6623 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6624 }
6625 else
6626 {
6627 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6628 }
6629 }
6630 else if (hash_mode == 501)
6631 {
6632 uint digest_idx = salt.digests_offset + digest_pos;
6633
6634 hashinfo_t **hashinfo_ptr = data.hash_info;
6635 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6636
6637 snprintf (out_buf, len-1, "%s", hash_buf);
6638 }
6639 else if (hash_mode == 1421)
6640 {
6641 u8 *salt_ptr = (u8 *) salt.salt_buf;
6642
6643 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6644 salt_ptr[0],
6645 salt_ptr[1],
6646 salt_ptr[2],
6647 salt_ptr[3],
6648 salt_ptr[4],
6649 salt_ptr[5],
6650 digest_buf[0],
6651 digest_buf[1],
6652 digest_buf[2],
6653 digest_buf[3],
6654 digest_buf[4],
6655 digest_buf[5],
6656 digest_buf[6],
6657 digest_buf[7]);
6658 }
6659 else if (hash_mode == 1441)
6660 {
6661 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6662
6663 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6664
6665 memset (tmp_buf, 0, sizeof (tmp_buf));
6666
6667 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6668
6669 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6670 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6671 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6672 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6673 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6674 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6675 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6676 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6677
6678 memcpy (tmp_buf, digest_buf, 32);
6679
6680 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6681
6682 ptr_plain[43] = 0;
6683
6684 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6685 }
6686 else if (hash_mode == 1500)
6687 {
6688 out_buf[0] = salt.salt_sign[0] & 0xff;
6689 out_buf[1] = salt.salt_sign[1] & 0xff;
6690 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6691 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6692 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6693
6694 memset (tmp_buf, 0, sizeof (tmp_buf));
6695
6696 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6697
6698 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6699 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6700
6701 memcpy (tmp_buf, digest_buf, 8);
6702
6703 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6704
6705 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6706
6707 out_buf[13] = 0;
6708 }
6709 else if (hash_mode == 1600)
6710 {
6711 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6712
6713 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6714 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6715 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6716 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6717
6718 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6719
6720 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6721 {
6722 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6723 }
6724 else
6725 {
6726 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6727 }
6728 }
6729 else if (hash_mode == 1711)
6730 {
6731 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6732
6733 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6734 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6735 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6736 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6737 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6738 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6739 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6740 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6741
6742 memcpy (tmp_buf, digest_buf, 64);
6743 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6744
6745 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6746
6747 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6748 }
6749 else if (hash_mode == 1722)
6750 {
6751 uint *ptr = digest_buf;
6752
6753 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6754 (unsigned char *) salt.salt_buf,
6755 ptr[ 1], ptr[ 0],
6756 ptr[ 3], ptr[ 2],
6757 ptr[ 5], ptr[ 4],
6758 ptr[ 7], ptr[ 6],
6759 ptr[ 9], ptr[ 8],
6760 ptr[11], ptr[10],
6761 ptr[13], ptr[12],
6762 ptr[15], ptr[14]);
6763 }
6764 else if (hash_mode == 1731)
6765 {
6766 uint *ptr = digest_buf;
6767
6768 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6769 (unsigned char *) salt.salt_buf,
6770 ptr[ 1], ptr[ 0],
6771 ptr[ 3], ptr[ 2],
6772 ptr[ 5], ptr[ 4],
6773 ptr[ 7], ptr[ 6],
6774 ptr[ 9], ptr[ 8],
6775 ptr[11], ptr[10],
6776 ptr[13], ptr[12],
6777 ptr[15], ptr[14]);
6778 }
6779 else if (hash_mode == 1800)
6780 {
6781 // temp workaround
6782
6783 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6784 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6785 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6786 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6787 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6788 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6789 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6790 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6791
6792 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6793
6794 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6795 {
6796 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6797 }
6798 else
6799 {
6800 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6801 }
6802 }
6803 else if (hash_mode == 2100)
6804 {
6805 uint pos = 0;
6806
6807 snprintf (out_buf + pos, len-1, "%s%i#",
6808 SIGNATURE_DCC2,
6809 salt.salt_iter + 1);
6810
6811 uint signature_len = strlen (out_buf);
6812
6813 pos += signature_len;
6814 len -= signature_len;
6815
6816 char *salt_ptr = (char *) salt.salt_buf;
6817
6818 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6819
6820 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6821 byte_swap_32 (digest_buf[0]),
6822 byte_swap_32 (digest_buf[1]),
6823 byte_swap_32 (digest_buf[2]),
6824 byte_swap_32 (digest_buf[3]));
6825 }
6826 else if ((hash_mode == 2400) || (hash_mode == 2410))
6827 {
6828 memcpy (tmp_buf, digest_buf, 16);
6829
6830 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6831
6832 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6833 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6834 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6835 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6836
6837 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6838 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6839 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6840 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6841
6842 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6843 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6844 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6845 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6846
6847 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6848 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6849 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6850 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6851
6852 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6853 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6854 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6855 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6856
6857 out_buf[16] = 0;
6858 }
6859 else if (hash_mode == 2500)
6860 {
6861 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6862
6863 wpa_t *wpa = &wpas[salt_pos];
6864
6865 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6866 (char *) salt.salt_buf,
6867 wpa->orig_mac1[0],
6868 wpa->orig_mac1[1],
6869 wpa->orig_mac1[2],
6870 wpa->orig_mac1[3],
6871 wpa->orig_mac1[4],
6872 wpa->orig_mac1[5],
6873 wpa->orig_mac2[0],
6874 wpa->orig_mac2[1],
6875 wpa->orig_mac2[2],
6876 wpa->orig_mac2[3],
6877 wpa->orig_mac2[4],
6878 wpa->orig_mac2[5]);
6879 }
6880 else if (hash_mode == 4400)
6881 {
6882 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6883 byte_swap_32 (digest_buf[0]),
6884 byte_swap_32 (digest_buf[1]),
6885 byte_swap_32 (digest_buf[2]),
6886 byte_swap_32 (digest_buf[3]));
6887 }
6888 else if (hash_mode == 4700)
6889 {
6890 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6891 byte_swap_32 (digest_buf[0]),
6892 byte_swap_32 (digest_buf[1]),
6893 byte_swap_32 (digest_buf[2]),
6894 byte_swap_32 (digest_buf[3]),
6895 byte_swap_32 (digest_buf[4]));
6896 }
6897 else if (hash_mode == 4800)
6898 {
6899 u8 chap_id_byte = (u8) salt.salt_buf[4];
6900
6901 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6902 digest_buf[0],
6903 digest_buf[1],
6904 digest_buf[2],
6905 digest_buf[3],
6906 byte_swap_32 (salt.salt_buf[0]),
6907 byte_swap_32 (salt.salt_buf[1]),
6908 byte_swap_32 (salt.salt_buf[2]),
6909 byte_swap_32 (salt.salt_buf[3]),
6910 chap_id_byte);
6911 }
6912 else if (hash_mode == 4900)
6913 {
6914 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6915 byte_swap_32 (digest_buf[0]),
6916 byte_swap_32 (digest_buf[1]),
6917 byte_swap_32 (digest_buf[2]),
6918 byte_swap_32 (digest_buf[3]),
6919 byte_swap_32 (digest_buf[4]));
6920 }
6921 else if (hash_mode == 5100)
6922 {
6923 snprintf (out_buf, len-1, "%08x%08x",
6924 digest_buf[0],
6925 digest_buf[1]);
6926 }
6927 else if (hash_mode == 5200)
6928 {
6929 snprintf (out_buf, len-1, "%s", hashfile);
6930 }
6931 else if (hash_mode == 5300)
6932 {
6933 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6934
6935 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6936
6937 int buf_len = len -1;
6938
6939 // msg_buf
6940
6941 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6942
6943 for (uint i = 0; i < ikepsk_msg_len; i++)
6944 {
6945 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6946 {
6947 snprintf (out_buf, buf_len, ":");
6948
6949 buf_len--;
6950 out_buf++;
6951 }
6952
6953 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6954
6955 buf_len -= 8;
6956 out_buf += 8;
6957 }
6958
6959 // nr_buf
6960
6961 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6962
6963 for (uint i = 0; i < ikepsk_nr_len; i++)
6964 {
6965 if ((i == 0) || (i == 5))
6966 {
6967 snprintf (out_buf, buf_len, ":");
6968
6969 buf_len--;
6970 out_buf++;
6971 }
6972
6973 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6974
6975 buf_len -= 8;
6976 out_buf += 8;
6977 }
6978
6979 // digest_buf
6980
6981 for (uint i = 0; i < 4; i++)
6982 {
6983 if (i == 0)
6984 {
6985 snprintf (out_buf, buf_len, ":");
6986
6987 buf_len--;
6988 out_buf++;
6989 }
6990
6991 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6992
6993 buf_len -= 8;
6994 out_buf += 8;
6995 }
6996 }
6997 else if (hash_mode == 5400)
6998 {
6999 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
7000
7001 ikepsk_t *ikepsk = &ikepsks[salt_pos];
7002
7003 int buf_len = len -1;
7004
7005 // msg_buf
7006
7007 uint ikepsk_msg_len = ikepsk->msg_len / 4;
7008
7009 for (uint i = 0; i < ikepsk_msg_len; i++)
7010 {
7011 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
7012 {
7013 snprintf (out_buf, buf_len, ":");
7014
7015 buf_len--;
7016 out_buf++;
7017 }
7018
7019 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
7020
7021 buf_len -= 8;
7022 out_buf += 8;
7023 }
7024
7025 // nr_buf
7026
7027 uint ikepsk_nr_len = ikepsk->nr_len / 4;
7028
7029 for (uint i = 0; i < ikepsk_nr_len; i++)
7030 {
7031 if ((i == 0) || (i == 5))
7032 {
7033 snprintf (out_buf, buf_len, ":");
7034
7035 buf_len--;
7036 out_buf++;
7037 }
7038
7039 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
7040
7041 buf_len -= 8;
7042 out_buf += 8;
7043 }
7044
7045 // digest_buf
7046
7047 for (uint i = 0; i < 5; i++)
7048 {
7049 if (i == 0)
7050 {
7051 snprintf (out_buf, buf_len, ":");
7052
7053 buf_len--;
7054 out_buf++;
7055 }
7056
7057 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
7058
7059 buf_len -= 8;
7060 out_buf += 8;
7061 }
7062 }
7063 else if (hash_mode == 5500)
7064 {
7065 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
7066
7067 netntlm_t *netntlm = &netntlms[salt_pos];
7068
7069 char user_buf[64] = { 0 };
7070 char domain_buf[64] = { 0 };
7071 char srvchall_buf[1024] = { 0 };
7072 char clichall_buf[1024] = { 0 };
7073
7074 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
7075 {
7076 char *ptr = (char *) netntlm->userdomain_buf;
7077
7078 user_buf[i] = ptr[j];
7079 }
7080
7081 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
7082 {
7083 char *ptr = (char *) netntlm->userdomain_buf;
7084
7085 domain_buf[i] = ptr[netntlm->user_len + j];
7086 }
7087
7088 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
7089 {
7090 u8 *ptr = (u8 *) netntlm->chall_buf;
7091
7092 sprintf (srvchall_buf + j, "%02x", ptr[i]);
7093 }
7094
7095 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
7096 {
7097 u8 *ptr = (u8 *) netntlm->chall_buf;
7098
7099 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
7100 }
7101
7102 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
7103 user_buf,
7104 domain_buf,
7105 srvchall_buf,
7106 digest_buf[0],
7107 digest_buf[1],
7108 digest_buf[2],
7109 digest_buf[3],
7110 byte_swap_32 (salt.salt_buf_pc[0]),
7111 byte_swap_32 (salt.salt_buf_pc[1]),
7112 clichall_buf);
7113 }
7114 else if (hash_mode == 5600)
7115 {
7116 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
7117
7118 netntlm_t *netntlm = &netntlms[salt_pos];
7119
7120 char user_buf[64] = { 0 };
7121 char domain_buf[64] = { 0 };
7122 char srvchall_buf[1024] = { 0 };
7123 char clichall_buf[1024] = { 0 };
7124
7125 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
7126 {
7127 char *ptr = (char *) netntlm->userdomain_buf;
7128
7129 user_buf[i] = ptr[j];
7130 }
7131
7132 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
7133 {
7134 char *ptr = (char *) netntlm->userdomain_buf;
7135
7136 domain_buf[i] = ptr[netntlm->user_len + j];
7137 }
7138
7139 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
7140 {
7141 u8 *ptr = (u8 *) netntlm->chall_buf;
7142
7143 sprintf (srvchall_buf + j, "%02x", ptr[i]);
7144 }
7145
7146 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
7147 {
7148 u8 *ptr = (u8 *) netntlm->chall_buf;
7149
7150 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
7151 }
7152
7153 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
7154 user_buf,
7155 domain_buf,
7156 srvchall_buf,
7157 digest_buf[0],
7158 digest_buf[1],
7159 digest_buf[2],
7160 digest_buf[3],
7161 clichall_buf);
7162 }
7163 else if (hash_mode == 5700)
7164 {
7165 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7166
7167 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7168 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7169 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7170 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7171 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7172 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7173 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7174 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7175
7176 memcpy (tmp_buf, digest_buf, 32);
7177
7178 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
7179
7180 ptr_plain[43] = 0;
7181
7182 snprintf (out_buf, len-1, "%s", ptr_plain);
7183 }
7184 else if (hash_mode == 5800)
7185 {
7186 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7187 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7188 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7189 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7190 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7191
7192 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
7193 digest_buf[0],
7194 digest_buf[1],
7195 digest_buf[2],
7196 digest_buf[3],
7197 digest_buf[4]);
7198 }
7199 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
7200 {
7201 snprintf (out_buf, len-1, "%s", hashfile);
7202 }
7203 else if (hash_mode == 6300)
7204 {
7205 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7206
7207 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7208 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7209 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7210 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7211
7212 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7213
7214 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7215 }
7216 else if (hash_mode == 6400)
7217 {
7218 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7219
7220 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7221 }
7222 else if (hash_mode == 6500)
7223 {
7224 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7225
7226 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7227 }
7228 else if (hash_mode == 6600)
7229 {
7230 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
7231
7232 agilekey_t *agilekey = &agilekeys[salt_pos];
7233
7234 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7235 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7236
7237 uint buf_len = len - 1;
7238
7239 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
7240 buf_len -= 22;
7241
7242 for (uint i = 0, j = off; i < 1040; i++, j += 2)
7243 {
7244 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
7245
7246 buf_len -= 2;
7247 }
7248 }
7249 else if (hash_mode == 6700)
7250 {
7251 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7252
7253 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7254 }
7255 else if (hash_mode == 6800)
7256 {
7257 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
7258 }
7259 else if (hash_mode == 7100)
7260 {
7261 uint *ptr = digest_buf;
7262
7263 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7264
7265 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7266
7267 uint esalt[8] = { 0 };
7268
7269 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
7270 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
7271 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
7272 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
7273 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
7274 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
7275 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
7276 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
7277
7278 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",
7279 SIGNATURE_SHA512OSX,
7280 salt.salt_iter + 1,
7281 esalt[ 0], esalt[ 1],
7282 esalt[ 2], esalt[ 3],
7283 esalt[ 4], esalt[ 5],
7284 esalt[ 6], esalt[ 7],
7285 ptr [ 1], ptr [ 0],
7286 ptr [ 3], ptr [ 2],
7287 ptr [ 5], ptr [ 4],
7288 ptr [ 7], ptr [ 6],
7289 ptr [ 9], ptr [ 8],
7290 ptr [11], ptr [10],
7291 ptr [13], ptr [12],
7292 ptr [15], ptr [14]);
7293 }
7294 else if (hash_mode == 7200)
7295 {
7296 uint *ptr = digest_buf;
7297
7298 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7299
7300 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7301
7302 uint len_used = 0;
7303
7304 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
7305
7306 len_used = strlen (out_buf);
7307
7308 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
7309
7310 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
7311 {
7312 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
7313 }
7314
7315 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",
7316 ptr [ 1], ptr [ 0],
7317 ptr [ 3], ptr [ 2],
7318 ptr [ 5], ptr [ 4],
7319 ptr [ 7], ptr [ 6],
7320 ptr [ 9], ptr [ 8],
7321 ptr [11], ptr [10],
7322 ptr [13], ptr [12],
7323 ptr [15], ptr [14]);
7324 }
7325 else if (hash_mode == 7300)
7326 {
7327 rakp_t *rakps = (rakp_t *) data.esalts_buf;
7328
7329 rakp_t *rakp = &rakps[salt_pos];
7330
7331 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
7332 {
7333 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
7334 }
7335
7336 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7337 digest_buf[0],
7338 digest_buf[1],
7339 digest_buf[2],
7340 digest_buf[3],
7341 digest_buf[4]);
7342 }
7343 else if (hash_mode == 7400)
7344 {
7345 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7346
7347 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7348 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7349 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7350 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7351 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7352 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7353 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7354 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7355
7356 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7357
7358 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7359 {
7360 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7361 }
7362 else
7363 {
7364 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7365 }
7366 }
7367 else if (hash_mode == 7500)
7368 {
7369 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7370
7371 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7372
7373 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7374 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7375
7376 char data[128] = { 0 };
7377
7378 char *ptr_data = data;
7379
7380 for (uint i = 0; i < 36; i++, ptr_data += 2)
7381 {
7382 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7383 }
7384
7385 for (uint i = 0; i < 16; i++, ptr_data += 2)
7386 {
7387 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7388 }
7389
7390 *ptr_data = 0;
7391
7392 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7393 SIGNATURE_KRB5PA,
7394 (char *) krb5pa->user,
7395 (char *) krb5pa->realm,
7396 (char *) krb5pa->salt,
7397 data);
7398 }
7399 else if (hash_mode == 7700)
7400 {
7401 snprintf (out_buf, len-1, "%s$%08X%08X",
7402 (char *) salt.salt_buf,
7403 digest_buf[0],
7404 digest_buf[1]);
7405 }
7406 else if (hash_mode == 7800)
7407 {
7408 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7409 (char *) salt.salt_buf,
7410 digest_buf[0],
7411 digest_buf[1],
7412 digest_buf[2],
7413 digest_buf[3],
7414 digest_buf[4]);
7415 }
7416 else if (hash_mode == 7900)
7417 {
7418 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7419
7420 // ugly hack start
7421
7422 char *tmp = (char *) salt.salt_buf_pc;
7423
7424 ptr_plain[42] = tmp[0];
7425
7426 // ugly hack end
7427
7428 ptr_plain[43] = 0;
7429
7430 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7431 }
7432 else if (hash_mode == 8000)
7433 {
7434 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7435 (unsigned char *) salt.salt_buf,
7436 digest_buf[0],
7437 digest_buf[1],
7438 digest_buf[2],
7439 digest_buf[3],
7440 digest_buf[4],
7441 digest_buf[5],
7442 digest_buf[6],
7443 digest_buf[7]);
7444 }
7445 else if (hash_mode == 8100)
7446 {
7447 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7448 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7449
7450 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7451 (unsigned char *) salt.salt_buf,
7452 digest_buf[0],
7453 digest_buf[1],
7454 digest_buf[2],
7455 digest_buf[3],
7456 digest_buf[4]);
7457 }
7458 else if (hash_mode == 8200)
7459 {
7460 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7461
7462 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7463
7464 char data_buf[4096] = { 0 };
7465
7466 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7467 {
7468 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7469 }
7470
7471 data_buf[cloudkey->data_len * 2] = 0;
7472
7473 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7474 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7475 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7476 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7477 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7478 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7479 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7480 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7481
7482 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7483 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7484 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7485 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7486
7487 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7488 digest_buf[0],
7489 digest_buf[1],
7490 digest_buf[2],
7491 digest_buf[3],
7492 digest_buf[4],
7493 digest_buf[5],
7494 digest_buf[6],
7495 digest_buf[7],
7496 salt.salt_buf[0],
7497 salt.salt_buf[1],
7498 salt.salt_buf[2],
7499 salt.salt_buf[3],
7500 salt.salt_iter + 1,
7501 data_buf);
7502 }
7503 else if (hash_mode == 8300)
7504 {
7505 char digest_buf_c[34] = { 0 };
7506
7507 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7508 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7509 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7510 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7511 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7512
7513 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7514
7515 digest_buf_c[32] = 0;
7516
7517 // domain
7518
7519 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7520
7521 char domain_buf_c[33] = { 0 };
7522
7523 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7524
7525 for (uint i = 0; i < salt_pc_len; i++)
7526 {
7527 const char next = domain_buf_c[i];
7528
7529 domain_buf_c[i] = '.';
7530
7531 i += next;
7532 }
7533
7534 domain_buf_c[salt_pc_len] = 0;
7535
7536 // final
7537
7538 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7539 }
7540 else if (hash_mode == 8500)
7541 {
7542 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7543 }
7544 else if (hash_mode == 2612)
7545 {
7546 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7547 SIGNATURE_PHPS,
7548 (char *) salt.salt_buf,
7549 digest_buf[0],
7550 digest_buf[1],
7551 digest_buf[2],
7552 digest_buf[3]);
7553 }
7554 else if (hash_mode == 3711)
7555 {
7556 char *salt_ptr = (char *) salt.salt_buf;
7557
7558 salt_ptr[salt.salt_len - 1] = 0;
7559
7560 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7561 SIGNATURE_MEDIAWIKI_B,
7562 salt_ptr,
7563 digest_buf[0],
7564 digest_buf[1],
7565 digest_buf[2],
7566 digest_buf[3]);
7567 }
7568 else if (hash_mode == 8800)
7569 {
7570 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7571
7572 androidfde_t *androidfde = &androidfdes[salt_pos];
7573
7574 char tmp[3073] = { 0 };
7575
7576 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7577 {
7578 sprintf (tmp + j, "%08x", androidfde->data[i]);
7579 }
7580
7581 tmp[3072] = 0;
7582
7583 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7584 SIGNATURE_ANDROIDFDE,
7585 byte_swap_32 (salt.salt_buf[0]),
7586 byte_swap_32 (salt.salt_buf[1]),
7587 byte_swap_32 (salt.salt_buf[2]),
7588 byte_swap_32 (salt.salt_buf[3]),
7589 byte_swap_32 (digest_buf[0]),
7590 byte_swap_32 (digest_buf[1]),
7591 byte_swap_32 (digest_buf[2]),
7592 byte_swap_32 (digest_buf[3]),
7593 tmp);
7594 }
7595 else if (hash_mode == 8900)
7596 {
7597 uint N = salt.scrypt_N;
7598 uint r = salt.scrypt_r;
7599 uint p = salt.scrypt_p;
7600
7601 char base64_salt[32] = { 0 };
7602
7603 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7604
7605 memset (tmp_buf, 0, 46);
7606
7607 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7608 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7609 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7610 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7611 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7612 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7613 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7614 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7615 digest_buf[8] = 0; // needed for base64_encode ()
7616
7617 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7618
7619 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7620 SIGNATURE_SCRYPT,
7621 N,
7622 r,
7623 p,
7624 base64_salt,
7625 tmp_buf);
7626 }
7627 else if (hash_mode == 9000)
7628 {
7629 snprintf (out_buf, len-1, "%s", hashfile);
7630 }
7631 else if (hash_mode == 9200)
7632 {
7633 // salt
7634
7635 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7636
7637 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7638
7639 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7640
7641 // hash
7642
7643 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7644 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7645 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7646 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7647 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7648 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7649 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7650 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7651 digest_buf[8] = 0; // needed for base64_encode ()
7652
7653 char tmp_buf[64] = { 0 };
7654
7655 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7656 tmp_buf[43] = 0; // cut it here
7657
7658 // output
7659
7660 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7661 }
7662 else if (hash_mode == 9300)
7663 {
7664 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7665 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7666 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7667 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7668 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7669 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7670 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7671 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7672 digest_buf[8] = 0; // needed for base64_encode ()
7673
7674 char tmp_buf[64] = { 0 };
7675
7676 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7677 tmp_buf[43] = 0; // cut it here
7678
7679 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7680
7681 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7682 }
7683 else if (hash_mode == 9400)
7684 {
7685 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7686
7687 office2007_t *office2007 = &office2007s[salt_pos];
7688
7689 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7690 SIGNATURE_OFFICE2007,
7691 2007,
7692 20,
7693 office2007->keySize,
7694 16,
7695 salt.salt_buf[0],
7696 salt.salt_buf[1],
7697 salt.salt_buf[2],
7698 salt.salt_buf[3],
7699 office2007->encryptedVerifier[0],
7700 office2007->encryptedVerifier[1],
7701 office2007->encryptedVerifier[2],
7702 office2007->encryptedVerifier[3],
7703 office2007->encryptedVerifierHash[0],
7704 office2007->encryptedVerifierHash[1],
7705 office2007->encryptedVerifierHash[2],
7706 office2007->encryptedVerifierHash[3],
7707 office2007->encryptedVerifierHash[4]);
7708 }
7709 else if (hash_mode == 9500)
7710 {
7711 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7712
7713 office2010_t *office2010 = &office2010s[salt_pos];
7714
7715 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,
7716
7717 salt.salt_buf[0],
7718 salt.salt_buf[1],
7719 salt.salt_buf[2],
7720 salt.salt_buf[3],
7721 office2010->encryptedVerifier[0],
7722 office2010->encryptedVerifier[1],
7723 office2010->encryptedVerifier[2],
7724 office2010->encryptedVerifier[3],
7725 office2010->encryptedVerifierHash[0],
7726 office2010->encryptedVerifierHash[1],
7727 office2010->encryptedVerifierHash[2],
7728 office2010->encryptedVerifierHash[3],
7729 office2010->encryptedVerifierHash[4],
7730 office2010->encryptedVerifierHash[5],
7731 office2010->encryptedVerifierHash[6],
7732 office2010->encryptedVerifierHash[7]);
7733 }
7734 else if (hash_mode == 9600)
7735 {
7736 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7737
7738 office2013_t *office2013 = &office2013s[salt_pos];
7739
7740 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,
7741
7742 salt.salt_buf[0],
7743 salt.salt_buf[1],
7744 salt.salt_buf[2],
7745 salt.salt_buf[3],
7746 office2013->encryptedVerifier[0],
7747 office2013->encryptedVerifier[1],
7748 office2013->encryptedVerifier[2],
7749 office2013->encryptedVerifier[3],
7750 office2013->encryptedVerifierHash[0],
7751 office2013->encryptedVerifierHash[1],
7752 office2013->encryptedVerifierHash[2],
7753 office2013->encryptedVerifierHash[3],
7754 office2013->encryptedVerifierHash[4],
7755 office2013->encryptedVerifierHash[5],
7756 office2013->encryptedVerifierHash[6],
7757 office2013->encryptedVerifierHash[7]);
7758 }
7759 else if (hash_mode == 9700)
7760 {
7761 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7762
7763 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7764
7765 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7766 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7767 byte_swap_32 (salt.salt_buf[0]),
7768 byte_swap_32 (salt.salt_buf[1]),
7769 byte_swap_32 (salt.salt_buf[2]),
7770 byte_swap_32 (salt.salt_buf[3]),
7771 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7772 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7773 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7774 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7775 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7776 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7777 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7778 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7779 }
7780 else if (hash_mode == 9710)
7781 {
7782 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7783
7784 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7785
7786 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7787 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7788 byte_swap_32 (salt.salt_buf[0]),
7789 byte_swap_32 (salt.salt_buf[1]),
7790 byte_swap_32 (salt.salt_buf[2]),
7791 byte_swap_32 (salt.salt_buf[3]),
7792 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7793 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7794 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7795 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7796 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7797 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7798 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7799 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7800 }
7801 else if (hash_mode == 9720)
7802 {
7803 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7804
7805 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7806
7807 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7808
7809 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7810 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7811 byte_swap_32 (salt.salt_buf[0]),
7812 byte_swap_32 (salt.salt_buf[1]),
7813 byte_swap_32 (salt.salt_buf[2]),
7814 byte_swap_32 (salt.salt_buf[3]),
7815 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7816 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7817 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7818 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7819 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7820 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7821 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7822 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7823 rc4key[0],
7824 rc4key[1],
7825 rc4key[2],
7826 rc4key[3],
7827 rc4key[4]);
7828 }
7829 else if (hash_mode == 9800)
7830 {
7831 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7832
7833 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7834
7835 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7836 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7837 salt.salt_buf[0],
7838 salt.salt_buf[1],
7839 salt.salt_buf[2],
7840 salt.salt_buf[3],
7841 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7842 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7843 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7844 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7845 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7846 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7847 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7848 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7849 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7850 }
7851 else if (hash_mode == 9810)
7852 {
7853 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7854
7855 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7856
7857 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7858 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7859 salt.salt_buf[0],
7860 salt.salt_buf[1],
7861 salt.salt_buf[2],
7862 salt.salt_buf[3],
7863 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7864 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7865 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7866 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7867 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7868 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7869 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7870 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7871 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7872 }
7873 else if (hash_mode == 9820)
7874 {
7875 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7876
7877 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7878
7879 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7880
7881 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7882 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7883 salt.salt_buf[0],
7884 salt.salt_buf[1],
7885 salt.salt_buf[2],
7886 salt.salt_buf[3],
7887 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7888 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7889 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7890 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7891 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7892 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7893 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7894 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7895 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7896 rc4key[0],
7897 rc4key[1],
7898 rc4key[2],
7899 rc4key[3],
7900 rc4key[4]);
7901 }
7902 else if (hash_mode == 10000)
7903 {
7904 // salt
7905
7906 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7907
7908 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7909
7910 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7911
7912 // hash
7913
7914 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7915 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7916 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7917 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7918 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7919 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7920 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7921 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7922 digest_buf[8] = 0; // needed for base64_encode ()
7923
7924 char tmp_buf[64] = { 0 };
7925
7926 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7927
7928 // output
7929
7930 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7931 }
7932 else if (hash_mode == 10100)
7933 {
7934 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7935 digest_buf[0],
7936 digest_buf[1],
7937 2,
7938 4,
7939 byte_swap_32 (salt.salt_buf[0]),
7940 byte_swap_32 (salt.salt_buf[1]),
7941 byte_swap_32 (salt.salt_buf[2]),
7942 byte_swap_32 (salt.salt_buf[3]));
7943 }
7944 else if (hash_mode == 10200)
7945 {
7946 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7947
7948 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7949
7950 // challenge
7951
7952 char challenge[100] = { 0 };
7953
7954 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7955
7956 // response
7957
7958 char tmp_buf[100] = { 0 };
7959
7960 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7961 (char *) cram_md5->user,
7962 digest_buf[0],
7963 digest_buf[1],
7964 digest_buf[2],
7965 digest_buf[3]);
7966
7967 char response[100] = { 0 };
7968
7969 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7970
7971 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7972 }
7973 else if (hash_mode == 10300)
7974 {
7975 char tmp_buf[100] = { 0 };
7976
7977 memcpy (tmp_buf + 0, digest_buf, 20);
7978 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7979
7980 uint tmp_len = 20 + salt.salt_len;
7981
7982 // base64 encode it
7983
7984 char base64_encoded[100] = { 0 };
7985
7986 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7987
7988 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7989 }
7990 else if (hash_mode == 10400)
7991 {
7992 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7993
7994 pdf_t *pdf = &pdfs[salt_pos];
7995
7996 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",
7997
7998 pdf->V,
7999 pdf->R,
8000 40,
8001 pdf->P,
8002 pdf->enc_md,
8003 pdf->id_len,
8004 byte_swap_32 (pdf->id_buf[0]),
8005 byte_swap_32 (pdf->id_buf[1]),
8006 byte_swap_32 (pdf->id_buf[2]),
8007 byte_swap_32 (pdf->id_buf[3]),
8008 pdf->u_len,
8009 byte_swap_32 (pdf->u_buf[0]),
8010 byte_swap_32 (pdf->u_buf[1]),
8011 byte_swap_32 (pdf->u_buf[2]),
8012 byte_swap_32 (pdf->u_buf[3]),
8013 byte_swap_32 (pdf->u_buf[4]),
8014 byte_swap_32 (pdf->u_buf[5]),
8015 byte_swap_32 (pdf->u_buf[6]),
8016 byte_swap_32 (pdf->u_buf[7]),
8017 pdf->o_len,
8018 byte_swap_32 (pdf->o_buf[0]),
8019 byte_swap_32 (pdf->o_buf[1]),
8020 byte_swap_32 (pdf->o_buf[2]),
8021 byte_swap_32 (pdf->o_buf[3]),
8022 byte_swap_32 (pdf->o_buf[4]),
8023 byte_swap_32 (pdf->o_buf[5]),
8024 byte_swap_32 (pdf->o_buf[6]),
8025 byte_swap_32 (pdf->o_buf[7])
8026 );
8027 }
8028 else if (hash_mode == 10410)
8029 {
8030 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
8031
8032 pdf_t *pdf = &pdfs[salt_pos];
8033
8034 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",
8035
8036 pdf->V,
8037 pdf->R,
8038 40,
8039 pdf->P,
8040 pdf->enc_md,
8041 pdf->id_len,
8042 byte_swap_32 (pdf->id_buf[0]),
8043 byte_swap_32 (pdf->id_buf[1]),
8044 byte_swap_32 (pdf->id_buf[2]),
8045 byte_swap_32 (pdf->id_buf[3]),
8046 pdf->u_len,
8047 byte_swap_32 (pdf->u_buf[0]),
8048 byte_swap_32 (pdf->u_buf[1]),
8049 byte_swap_32 (pdf->u_buf[2]),
8050 byte_swap_32 (pdf->u_buf[3]),
8051 byte_swap_32 (pdf->u_buf[4]),
8052 byte_swap_32 (pdf->u_buf[5]),
8053 byte_swap_32 (pdf->u_buf[6]),
8054 byte_swap_32 (pdf->u_buf[7]),
8055 pdf->o_len,
8056 byte_swap_32 (pdf->o_buf[0]),
8057 byte_swap_32 (pdf->o_buf[1]),
8058 byte_swap_32 (pdf->o_buf[2]),
8059 byte_swap_32 (pdf->o_buf[3]),
8060 byte_swap_32 (pdf->o_buf[4]),
8061 byte_swap_32 (pdf->o_buf[5]),
8062 byte_swap_32 (pdf->o_buf[6]),
8063 byte_swap_32 (pdf->o_buf[7])
8064 );
8065 }
8066 else if (hash_mode == 10420)
8067 {
8068 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
8069
8070 pdf_t *pdf = &pdfs[salt_pos];
8071
8072 u8 *rc4key = (u8 *) pdf->rc4key;
8073
8074 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",
8075
8076 pdf->V,
8077 pdf->R,
8078 40,
8079 pdf->P,
8080 pdf->enc_md,
8081 pdf->id_len,
8082 byte_swap_32 (pdf->id_buf[0]),
8083 byte_swap_32 (pdf->id_buf[1]),
8084 byte_swap_32 (pdf->id_buf[2]),
8085 byte_swap_32 (pdf->id_buf[3]),
8086 pdf->u_len,
8087 byte_swap_32 (pdf->u_buf[0]),
8088 byte_swap_32 (pdf->u_buf[1]),
8089 byte_swap_32 (pdf->u_buf[2]),
8090 byte_swap_32 (pdf->u_buf[3]),
8091 byte_swap_32 (pdf->u_buf[4]),
8092 byte_swap_32 (pdf->u_buf[5]),
8093 byte_swap_32 (pdf->u_buf[6]),
8094 byte_swap_32 (pdf->u_buf[7]),
8095 pdf->o_len,
8096 byte_swap_32 (pdf->o_buf[0]),
8097 byte_swap_32 (pdf->o_buf[1]),
8098 byte_swap_32 (pdf->o_buf[2]),
8099 byte_swap_32 (pdf->o_buf[3]),
8100 byte_swap_32 (pdf->o_buf[4]),
8101 byte_swap_32 (pdf->o_buf[5]),
8102 byte_swap_32 (pdf->o_buf[6]),
8103 byte_swap_32 (pdf->o_buf[7]),
8104 rc4key[0],
8105 rc4key[1],
8106 rc4key[2],
8107 rc4key[3],
8108 rc4key[4]
8109 );
8110 }
8111 else if (hash_mode == 10500)
8112 {
8113 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
8114
8115 pdf_t *pdf = &pdfs[salt_pos];
8116
8117 if (pdf->id_len == 32)
8118 {
8119 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",
8120
8121 pdf->V,
8122 pdf->R,
8123 128,
8124 pdf->P,
8125 pdf->enc_md,
8126 pdf->id_len,
8127 byte_swap_32 (pdf->id_buf[0]),
8128 byte_swap_32 (pdf->id_buf[1]),
8129 byte_swap_32 (pdf->id_buf[2]),
8130 byte_swap_32 (pdf->id_buf[3]),
8131 byte_swap_32 (pdf->id_buf[4]),
8132 byte_swap_32 (pdf->id_buf[5]),
8133 byte_swap_32 (pdf->id_buf[6]),
8134 byte_swap_32 (pdf->id_buf[7]),
8135 pdf->u_len,
8136 byte_swap_32 (pdf->u_buf[0]),
8137 byte_swap_32 (pdf->u_buf[1]),
8138 byte_swap_32 (pdf->u_buf[2]),
8139 byte_swap_32 (pdf->u_buf[3]),
8140 byte_swap_32 (pdf->u_buf[4]),
8141 byte_swap_32 (pdf->u_buf[5]),
8142 byte_swap_32 (pdf->u_buf[6]),
8143 byte_swap_32 (pdf->u_buf[7]),
8144 pdf->o_len,
8145 byte_swap_32 (pdf->o_buf[0]),
8146 byte_swap_32 (pdf->o_buf[1]),
8147 byte_swap_32 (pdf->o_buf[2]),
8148 byte_swap_32 (pdf->o_buf[3]),
8149 byte_swap_32 (pdf->o_buf[4]),
8150 byte_swap_32 (pdf->o_buf[5]),
8151 byte_swap_32 (pdf->o_buf[6]),
8152 byte_swap_32 (pdf->o_buf[7])
8153 );
8154 }
8155 else
8156 {
8157 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",
8158
8159 pdf->V,
8160 pdf->R,
8161 128,
8162 pdf->P,
8163 pdf->enc_md,
8164 pdf->id_len,
8165 byte_swap_32 (pdf->id_buf[0]),
8166 byte_swap_32 (pdf->id_buf[1]),
8167 byte_swap_32 (pdf->id_buf[2]),
8168 byte_swap_32 (pdf->id_buf[3]),
8169 pdf->u_len,
8170 byte_swap_32 (pdf->u_buf[0]),
8171 byte_swap_32 (pdf->u_buf[1]),
8172 byte_swap_32 (pdf->u_buf[2]),
8173 byte_swap_32 (pdf->u_buf[3]),
8174 byte_swap_32 (pdf->u_buf[4]),
8175 byte_swap_32 (pdf->u_buf[5]),
8176 byte_swap_32 (pdf->u_buf[6]),
8177 byte_swap_32 (pdf->u_buf[7]),
8178 pdf->o_len,
8179 byte_swap_32 (pdf->o_buf[0]),
8180 byte_swap_32 (pdf->o_buf[1]),
8181 byte_swap_32 (pdf->o_buf[2]),
8182 byte_swap_32 (pdf->o_buf[3]),
8183 byte_swap_32 (pdf->o_buf[4]),
8184 byte_swap_32 (pdf->o_buf[5]),
8185 byte_swap_32 (pdf->o_buf[6]),
8186 byte_swap_32 (pdf->o_buf[7])
8187 );
8188 }
8189 }
8190 else if (hash_mode == 10600)
8191 {
8192 uint digest_idx = salt.digests_offset + digest_pos;
8193
8194 hashinfo_t **hashinfo_ptr = data.hash_info;
8195 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8196
8197 snprintf (out_buf, len-1, "%s", hash_buf);
8198 }
8199 else if (hash_mode == 10700)
8200 {
8201 uint digest_idx = salt.digests_offset + digest_pos;
8202
8203 hashinfo_t **hashinfo_ptr = data.hash_info;
8204 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8205
8206 snprintf (out_buf, len-1, "%s", hash_buf);
8207 }
8208 else if (hash_mode == 10900)
8209 {
8210 uint digest_idx = salt.digests_offset + digest_pos;
8211
8212 hashinfo_t **hashinfo_ptr = data.hash_info;
8213 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8214
8215 snprintf (out_buf, len-1, "%s", hash_buf);
8216 }
8217 else if (hash_mode == 11100)
8218 {
8219 u32 salt_challenge = salt.salt_buf[0];
8220
8221 salt_challenge = byte_swap_32 (salt_challenge);
8222
8223 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
8224
8225 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
8226 SIGNATURE_POSTGRESQL_AUTH,
8227 user_name,
8228 salt_challenge,
8229 digest_buf[0],
8230 digest_buf[1],
8231 digest_buf[2],
8232 digest_buf[3]);
8233 }
8234 else if (hash_mode == 11200)
8235 {
8236 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
8237 SIGNATURE_MYSQL_AUTH,
8238 (unsigned char *) salt.salt_buf,
8239 digest_buf[0],
8240 digest_buf[1],
8241 digest_buf[2],
8242 digest_buf[3],
8243 digest_buf[4]);
8244 }
8245 else if (hash_mode == 11300)
8246 {
8247 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
8248
8249 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
8250
8251 const uint cry_master_len = bitcoin_wallet->cry_master_len;
8252 const uint ckey_len = bitcoin_wallet->ckey_len;
8253 const uint public_key_len = bitcoin_wallet->public_key_len;
8254
8255 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
8256 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
8257 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
8258
8259 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
8260 {
8261 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
8262
8263 sprintf (cry_master_buf + j, "%02x", ptr[i]);
8264 }
8265
8266 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
8267 {
8268 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
8269
8270 sprintf (ckey_buf + j, "%02x", ptr[i]);
8271 }
8272
8273 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
8274 {
8275 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
8276
8277 sprintf (public_key_buf + j, "%02x", ptr[i]);
8278 }
8279
8280 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
8281 SIGNATURE_BITCOIN_WALLET,
8282 cry_master_len * 2,
8283 cry_master_buf,
8284 salt.salt_len,
8285 (unsigned char *) salt.salt_buf,
8286 salt.salt_iter + 1,
8287 ckey_len * 2,
8288 ckey_buf,
8289 public_key_len * 2,
8290 public_key_buf
8291 );
8292
8293 free (cry_master_buf);
8294 free (ckey_buf);
8295 free (public_key_buf);
8296 }
8297 else if (hash_mode == 11400)
8298 {
8299 uint digest_idx = salt.digests_offset + digest_pos;
8300
8301 hashinfo_t **hashinfo_ptr = data.hash_info;
8302 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8303
8304 snprintf (out_buf, len-1, "%s", hash_buf);
8305 }
8306 else if (hash_mode == 11600)
8307 {
8308 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
8309
8310 seven_zip_t *seven_zip = &seven_zips[salt_pos];
8311
8312 const uint data_len = seven_zip->data_len;
8313
8314 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
8315
8316 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8317 {
8318 const u8 *ptr = (const u8 *) seven_zip->data_buf;
8319
8320 sprintf (data_buf + j, "%02x", ptr[i]);
8321 }
8322
8323 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
8324 SIGNATURE_SEVEN_ZIP,
8325 0,
8326 salt.salt_sign[0],
8327 0,
8328 (char *) seven_zip->salt_buf,
8329 seven_zip->iv_len,
8330 seven_zip->iv_buf[0],
8331 seven_zip->iv_buf[1],
8332 seven_zip->iv_buf[2],
8333 seven_zip->iv_buf[3],
8334 seven_zip->crc,
8335 seven_zip->data_len,
8336 seven_zip->unpack_size,
8337 data_buf);
8338
8339 free (data_buf);
8340 }
8341 else if (hash_mode == 11700)
8342 {
8343 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8344 digest_buf[0],
8345 digest_buf[1],
8346 digest_buf[2],
8347 digest_buf[3],
8348 digest_buf[4],
8349 digest_buf[5],
8350 digest_buf[6],
8351 digest_buf[7]);
8352 }
8353 else if (hash_mode == 11800)
8354 {
8355 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8356 digest_buf[ 0],
8357 digest_buf[ 1],
8358 digest_buf[ 2],
8359 digest_buf[ 3],
8360 digest_buf[ 4],
8361 digest_buf[ 5],
8362 digest_buf[ 6],
8363 digest_buf[ 7],
8364 digest_buf[ 8],
8365 digest_buf[ 9],
8366 digest_buf[10],
8367 digest_buf[11],
8368 digest_buf[12],
8369 digest_buf[13],
8370 digest_buf[14],
8371 digest_buf[15]);
8372 }
8373 else if (hash_mode == 11900)
8374 {
8375 uint digest_idx = salt.digests_offset + digest_pos;
8376
8377 hashinfo_t **hashinfo_ptr = data.hash_info;
8378 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8379
8380 snprintf (out_buf, len-1, "%s", hash_buf);
8381 }
8382 else if (hash_mode == 12000)
8383 {
8384 uint digest_idx = salt.digests_offset + digest_pos;
8385
8386 hashinfo_t **hashinfo_ptr = data.hash_info;
8387 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8388
8389 snprintf (out_buf, len-1, "%s", hash_buf);
8390 }
8391 else if (hash_mode == 12100)
8392 {
8393 uint digest_idx = salt.digests_offset + digest_pos;
8394
8395 hashinfo_t **hashinfo_ptr = data.hash_info;
8396 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8397
8398 snprintf (out_buf, len-1, "%s", hash_buf);
8399 }
8400 else if (hash_mode == 12200)
8401 {
8402 uint *ptr_digest = digest_buf;
8403 uint *ptr_salt = salt.salt_buf;
8404
8405 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8406 SIGNATURE_ECRYPTFS,
8407 ptr_salt[0],
8408 ptr_salt[1],
8409 ptr_digest[0],
8410 ptr_digest[1]);
8411 }
8412 else if (hash_mode == 12300)
8413 {
8414 uint *ptr_digest = digest_buf;
8415 uint *ptr_salt = salt.salt_buf;
8416
8417 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",
8418 ptr_digest[ 0], ptr_digest[ 1],
8419 ptr_digest[ 2], ptr_digest[ 3],
8420 ptr_digest[ 4], ptr_digest[ 5],
8421 ptr_digest[ 6], ptr_digest[ 7],
8422 ptr_digest[ 8], ptr_digest[ 9],
8423 ptr_digest[10], ptr_digest[11],
8424 ptr_digest[12], ptr_digest[13],
8425 ptr_digest[14], ptr_digest[15],
8426 ptr_salt[0],
8427 ptr_salt[1],
8428 ptr_salt[2],
8429 ptr_salt[3]);
8430 }
8431 else if (hash_mode == 12400)
8432 {
8433 // encode iteration count
8434
8435 char salt_iter[5] = { 0 };
8436
8437 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8438 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8439 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8440 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8441 salt_iter[4] = 0;
8442
8443 // encode salt
8444
8445 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8446 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8447 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8448 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8449 ptr_salt[4] = 0;
8450
8451 // encode digest
8452
8453 memset (tmp_buf, 0, sizeof (tmp_buf));
8454
8455 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8456 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8457
8458 memcpy (tmp_buf, digest_buf, 8);
8459
8460 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8461
8462 ptr_plain[11] = 0;
8463
8464 // fill the resulting buffer
8465
8466 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8467 }
8468 else if (hash_mode == 12500)
8469 {
8470 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8471 SIGNATURE_RAR3,
8472 byte_swap_32 (salt.salt_buf[0]),
8473 byte_swap_32 (salt.salt_buf[1]),
8474 salt.salt_buf[2],
8475 salt.salt_buf[3],
8476 salt.salt_buf[4],
8477 salt.salt_buf[5]);
8478 }
8479 else if (hash_mode == 12600)
8480 {
8481 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8482 digest_buf[0] + salt.salt_buf_pc[0],
8483 digest_buf[1] + salt.salt_buf_pc[1],
8484 digest_buf[2] + salt.salt_buf_pc[2],
8485 digest_buf[3] + salt.salt_buf_pc[3],
8486 digest_buf[4] + salt.salt_buf_pc[4],
8487 digest_buf[5] + salt.salt_buf_pc[5],
8488 digest_buf[6] + salt.salt_buf_pc[6],
8489 digest_buf[7] + salt.salt_buf_pc[7]);
8490 }
8491 else if (hash_mode == 12700)
8492 {
8493 uint digest_idx = salt.digests_offset + digest_pos;
8494
8495 hashinfo_t **hashinfo_ptr = data.hash_info;
8496 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8497
8498 snprintf (out_buf, len-1, "%s", hash_buf);
8499 }
8500 else if (hash_mode == 12800)
8501 {
8502 const u8 *ptr = (const u8 *) salt.salt_buf;
8503
8504 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",
8505 SIGNATURE_MS_DRSR,
8506 ptr[0],
8507 ptr[1],
8508 ptr[2],
8509 ptr[3],
8510 ptr[4],
8511 ptr[5],
8512 ptr[6],
8513 ptr[7],
8514 ptr[8],
8515 ptr[9],
8516 salt.salt_iter + 1,
8517 byte_swap_32 (digest_buf[0]),
8518 byte_swap_32 (digest_buf[1]),
8519 byte_swap_32 (digest_buf[2]),
8520 byte_swap_32 (digest_buf[3]),
8521 byte_swap_32 (digest_buf[4]),
8522 byte_swap_32 (digest_buf[5]),
8523 byte_swap_32 (digest_buf[6]),
8524 byte_swap_32 (digest_buf[7])
8525 );
8526 }
8527 else if (hash_mode == 12900)
8528 {
8529 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",
8530 salt.salt_buf[ 4],
8531 salt.salt_buf[ 5],
8532 salt.salt_buf[ 6],
8533 salt.salt_buf[ 7],
8534 salt.salt_buf[ 8],
8535 salt.salt_buf[ 9],
8536 salt.salt_buf[10],
8537 salt.salt_buf[11],
8538 byte_swap_32 (digest_buf[0]),
8539 byte_swap_32 (digest_buf[1]),
8540 byte_swap_32 (digest_buf[2]),
8541 byte_swap_32 (digest_buf[3]),
8542 byte_swap_32 (digest_buf[4]),
8543 byte_swap_32 (digest_buf[5]),
8544 byte_swap_32 (digest_buf[6]),
8545 byte_swap_32 (digest_buf[7]),
8546 salt.salt_buf[ 0],
8547 salt.salt_buf[ 1],
8548 salt.salt_buf[ 2],
8549 salt.salt_buf[ 3]
8550 );
8551 }
8552 else if (hash_mode == 13000)
8553 {
8554 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8555
8556 rar5_t *rar5 = &rar5s[salt_pos];
8557
8558 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8559 salt.salt_buf[0],
8560 salt.salt_buf[1],
8561 salt.salt_buf[2],
8562 salt.salt_buf[3],
8563 salt.salt_sign[0],
8564 rar5->iv[0],
8565 rar5->iv[1],
8566 rar5->iv[2],
8567 rar5->iv[3],
8568 byte_swap_32 (digest_buf[0]),
8569 byte_swap_32 (digest_buf[1])
8570 );
8571 }
8572 else if (hash_mode == 13100)
8573 {
8574 krb5tgs_t *krb5tgss = (krb5tgs_t *) data.esalts_buf;
8575
8576 krb5tgs_t *krb5tgs = &krb5tgss[salt_pos];
8577
8578 u8 *ptr_checksum = (u8 *) krb5tgs->checksum;
8579 u8 *ptr_edata2 = (u8 *) krb5tgs->edata2;
8580
8581 char data[2560 * 4 * 2] = { 0 };
8582
8583 char *ptr_data = data;
8584
8585 for (uint i = 0; i < 16; i++, ptr_data += 2)
8586 sprintf (ptr_data, "%02x", ptr_checksum[i]);
8587
8588 /* skip '$' */
8589 ptr_data++;
8590
8591 for (uint i = 0; i < krb5tgs->edata2_len; i++, ptr_data += 2)
8592 sprintf (ptr_data, "%02x", ptr_edata2[i]);
8593
8594 snprintf (out_buf, len-1, "%s$%s$%s$%s",
8595 SIGNATURE_KRB5TGS,
8596 (char *) krb5tgs->account_info,
8597 data,
8598 data + 33);
8599 }
8600 else if (hash_mode == 13200)
8601 {
8602 snprintf (out_buf, len-1, "%s*%d*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x",
8603 SIGNATURE_AXCRYPT,
8604 salt.salt_iter,
8605 salt.salt_buf[0],
8606 salt.salt_buf[1],
8607 salt.salt_buf[2],
8608 salt.salt_buf[3],
8609 salt.salt_buf[4],
8610 salt.salt_buf[5],
8611 salt.salt_buf[6],
8612 salt.salt_buf[7],
8613 salt.salt_buf[8],
8614 salt.salt_buf[9]);
8615 }
8616 else if (hash_mode == 13300)
8617 {
8618 snprintf (out_buf, len-1, "%s$%08x%08x%08x%08x",
8619 SIGNATURE_AXCRYPT_SHA1,
8620 digest_buf[0],
8621 digest_buf[1],
8622 digest_buf[2],
8623 digest_buf[3]);
8624 }
8625 else if (hash_mode == 13400)
8626 {
8627 keepass_t *keepasss = (keepass_t *) data.esalts_buf;
8628
8629 keepass_t *keepass = &keepasss[salt_pos];
8630
8631 u32 version = (u32) keepass->version;
8632 u32 rounds = salt.salt_iter;
8633 u32 algorithm = (u32) keepass->algorithm;
8634 u32 keyfile_len = (u32) keepass->keyfile_len;
8635
8636 u32 *ptr_final_random_seed = (u32 *) keepass->final_random_seed ;
8637 u32 *ptr_transf_random_seed = (u32 *) keepass->transf_random_seed ;
8638 u32 *ptr_enc_iv = (u32 *) keepass->enc_iv ;
8639 u32 *ptr_contents_hash = (u32 *) keepass->contents_hash ;
8640 u32 *ptr_keyfile = (u32 *) keepass->keyfile ;
8641
8642 /* specific to version 1 */
8643 u32 contents_len;
8644 u32 *ptr_contents;
8645
8646 /* specific to version 2 */
8647 u32 expected_bytes_len;
8648 u32 *ptr_expected_bytes;
8649
8650 u32 final_random_seed_len;
8651 u32 transf_random_seed_len;
8652 u32 enc_iv_len;
8653 u32 contents_hash_len;
8654
8655 transf_random_seed_len = 8;
8656 enc_iv_len = 4;
8657 contents_hash_len = 8;
8658 final_random_seed_len = 8;
8659
8660 if (version == 1)
8661 final_random_seed_len = 4;
8662
8663 snprintf (out_buf, len-1, "%s*%d*%d*%d",
8664 SIGNATURE_KEEPASS,
8665 version,
8666 rounds,
8667 algorithm);
8668
8669 char *ptr_data = out_buf;
8670
8671 ptr_data += strlen(out_buf);
8672
8673 *ptr_data = '*';
8674 ptr_data++;
8675
8676 for (uint i = 0; i < final_random_seed_len; i++, ptr_data += 8)
8677 sprintf (ptr_data, "%08x", ptr_final_random_seed[i]);
8678
8679 *ptr_data = '*';
8680 ptr_data++;
8681
8682 for (uint i = 0; i < transf_random_seed_len; i++, ptr_data += 8)
8683 sprintf (ptr_data, "%08x", ptr_transf_random_seed[i]);
8684
8685 *ptr_data = '*';
8686 ptr_data++;
8687
8688 for (uint i = 0; i < enc_iv_len; i++, ptr_data += 8)
8689 sprintf (ptr_data, "%08x", ptr_enc_iv[i]);
8690
8691 *ptr_data = '*';
8692 ptr_data++;
8693
8694 if (version == 1)
8695 {
8696 contents_len = (u32) keepass->contents_len;
8697 ptr_contents = (u32 *) keepass->contents;
8698
8699 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8700 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8701
8702 *ptr_data = '*';
8703 ptr_data++;
8704
8705 /* inline flag */
8706 *ptr_data = '1';
8707 ptr_data++;
8708
8709 *ptr_data = '*';
8710 ptr_data++;
8711
8712 char ptr_contents_len[10] = { 0 };
8713
8714 sprintf ((char*) ptr_contents_len, "%d", contents_len);
8715
8716 sprintf (ptr_data, "%d", contents_len);
8717
8718 ptr_data += strlen(ptr_contents_len);
8719
8720 *ptr_data = '*';
8721 ptr_data++;
8722
8723 for (uint i = 0; i < contents_len / 4; i++, ptr_data += 8)
8724 sprintf (ptr_data, "%08x", ptr_contents[i]);
8725 }
8726 else if (version == 2)
8727 {
8728 expected_bytes_len = 8;
8729 ptr_expected_bytes = (u32 *) keepass->expected_bytes ;
8730
8731 for (uint i = 0; i < expected_bytes_len; i++, ptr_data += 8)
8732 sprintf (ptr_data, "%08x", ptr_expected_bytes[i]);
8733
8734 *ptr_data = '*';
8735 ptr_data++;
8736
8737 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8738 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8739 }
8740 if (keyfile_len)
8741 {
8742 *ptr_data = '*';
8743 ptr_data++;
8744
8745 /* inline flag */
8746 *ptr_data = '1';
8747 ptr_data++;
8748
8749 *ptr_data = '*';
8750 ptr_data++;
8751
8752 sprintf (ptr_data, "%d", keyfile_len);
8753
8754 ptr_data += 2;
8755
8756 *ptr_data = '*';
8757 ptr_data++;
8758
8759 for (uint i = 0; i < 8; i++, ptr_data += 8)
8760 sprintf (ptr_data, "%08x", ptr_keyfile[i]);
8761 }
8762 }
8763 else if (hash_mode == 13500)
8764 {
8765 pstoken_t *pstokens = (pstoken_t *) data.esalts_buf;
8766
8767 pstoken_t *pstoken = &pstokens[salt_pos];
8768
8769 const u32 salt_len = (pstoken->salt_len > 512) ? 512 : pstoken->salt_len;
8770
8771 char pstoken_tmp[1024 + 1] = { 0 };
8772
8773 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8774 {
8775 const u8 *ptr = (const u8 *) pstoken->salt_buf;
8776
8777 sprintf (pstoken_tmp + j, "%02x", ptr[i]);
8778 }
8779
8780 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x:%s",
8781 digest_buf[0],
8782 digest_buf[1],
8783 digest_buf[2],
8784 digest_buf[3],
8785 digest_buf[4],
8786 pstoken_tmp);
8787 }
8788 else if (hash_mode == 13600)
8789 {
8790 zip2_t *zip2s = (zip2_t *) data.esalts_buf;
8791
8792 zip2_t *zip2 = &zip2s[salt_pos];
8793
8794 const u32 salt_len = zip2->salt_len;
8795
8796 char salt_tmp[32 + 1] = { 0 };
8797
8798 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8799 {
8800 const u8 *ptr = (const u8 *) zip2->salt_buf;
8801
8802 sprintf (salt_tmp + j, "%02x", ptr[i]);
8803 }
8804
8805 const u32 data_len = zip2->data_len;
8806
8807 char data_tmp[8192 + 1] = { 0 };
8808
8809 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8810 {
8811 const u8 *ptr = (const u8 *) zip2->data_buf;
8812
8813 sprintf (data_tmp + j, "%02x", ptr[i]);
8814 }
8815
8816 const u32 auth_len = zip2->auth_len;
8817
8818 char auth_tmp[20 + 1] = { 0 };
8819
8820 for (uint i = 0, j = 0; i < auth_len; i += 1, j += 2)
8821 {
8822 const u8 *ptr = (const u8 *) zip2->auth_buf;
8823
8824 sprintf (auth_tmp + j, "%02x", ptr[i]);
8825 }
8826
8827 snprintf (out_buf, 255, "%s*%u*%u*%u*%s*%x*%u*%s*%s*%s",
8828 SIGNATURE_ZIP2_START,
8829 zip2->type,
8830 zip2->mode,
8831 zip2->magic,
8832 salt_tmp,
8833 zip2->verify_bytes,
8834 zip2->compress_length,
8835 data_tmp,
8836 auth_tmp,
8837 SIGNATURE_ZIP2_STOP);
8838 }
8839 else if ((hash_mode >= 13700) && (hash_mode <= 13799))
8840 {
8841 snprintf (out_buf, len-1, "%s", hashfile);
8842 }
8843 else if (hash_mode == 13800)
8844 {
8845 win8phone_t *esalts = (win8phone_t *) data.esalts_buf;
8846
8847 win8phone_t *esalt = &esalts[salt_pos];
8848
8849 char buf[256 + 1] = { 0 };
8850
8851 for (int i = 0, j = 0; i < 32; i += 1, j += 8)
8852 {
8853 sprintf (buf + j, "%08x", esalt->salt_buf[i]);
8854 }
8855
8856 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%s",
8857 digest_buf[0],
8858 digest_buf[1],
8859 digest_buf[2],
8860 digest_buf[3],
8861 digest_buf[4],
8862 digest_buf[5],
8863 digest_buf[6],
8864 digest_buf[7],
8865 buf);
8866 }
8867 else
8868 {
8869 if (hash_type == HASH_TYPE_MD4)
8870 {
8871 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8872 digest_buf[0],
8873 digest_buf[1],
8874 digest_buf[2],
8875 digest_buf[3]);
8876 }
8877 else if (hash_type == HASH_TYPE_MD5)
8878 {
8879 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8880 digest_buf[0],
8881 digest_buf[1],
8882 digest_buf[2],
8883 digest_buf[3]);
8884 }
8885 else if (hash_type == HASH_TYPE_SHA1)
8886 {
8887 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8888 digest_buf[0],
8889 digest_buf[1],
8890 digest_buf[2],
8891 digest_buf[3],
8892 digest_buf[4]);
8893 }
8894 else if (hash_type == HASH_TYPE_SHA256)
8895 {
8896 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8897 digest_buf[0],
8898 digest_buf[1],
8899 digest_buf[2],
8900 digest_buf[3],
8901 digest_buf[4],
8902 digest_buf[5],
8903 digest_buf[6],
8904 digest_buf[7]);
8905 }
8906 else if (hash_type == HASH_TYPE_SHA384)
8907 {
8908 uint *ptr = digest_buf;
8909
8910 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8911 ptr[ 1], ptr[ 0],
8912 ptr[ 3], ptr[ 2],
8913 ptr[ 5], ptr[ 4],
8914 ptr[ 7], ptr[ 6],
8915 ptr[ 9], ptr[ 8],
8916 ptr[11], ptr[10]);
8917 }
8918 else if (hash_type == HASH_TYPE_SHA512)
8919 {
8920 uint *ptr = digest_buf;
8921
8922 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8923 ptr[ 1], ptr[ 0],
8924 ptr[ 3], ptr[ 2],
8925 ptr[ 5], ptr[ 4],
8926 ptr[ 7], ptr[ 6],
8927 ptr[ 9], ptr[ 8],
8928 ptr[11], ptr[10],
8929 ptr[13], ptr[12],
8930 ptr[15], ptr[14]);
8931 }
8932 else if (hash_type == HASH_TYPE_LM)
8933 {
8934 snprintf (out_buf, len-1, "%08x%08x",
8935 digest_buf[0],
8936 digest_buf[1]);
8937 }
8938 else if (hash_type == HASH_TYPE_ORACLEH)
8939 {
8940 snprintf (out_buf, len-1, "%08X%08X",
8941 digest_buf[0],
8942 digest_buf[1]);
8943 }
8944 else if (hash_type == HASH_TYPE_BCRYPT)
8945 {
8946 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8947 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8948
8949 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8950
8951 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8952 }
8953 else if (hash_type == HASH_TYPE_KECCAK)
8954 {
8955 uint *ptr = digest_buf;
8956
8957 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",
8958 ptr[ 1], ptr[ 0],
8959 ptr[ 3], ptr[ 2],
8960 ptr[ 5], ptr[ 4],
8961 ptr[ 7], ptr[ 6],
8962 ptr[ 9], ptr[ 8],
8963 ptr[11], ptr[10],
8964 ptr[13], ptr[12],
8965 ptr[15], ptr[14],
8966 ptr[17], ptr[16],
8967 ptr[19], ptr[18],
8968 ptr[21], ptr[20],
8969 ptr[23], ptr[22],
8970 ptr[25], ptr[24],
8971 ptr[27], ptr[26],
8972 ptr[29], ptr[28],
8973 ptr[31], ptr[30],
8974 ptr[33], ptr[32],
8975 ptr[35], ptr[34],
8976 ptr[37], ptr[36],
8977 ptr[39], ptr[38],
8978 ptr[41], ptr[30],
8979 ptr[43], ptr[42],
8980 ptr[45], ptr[44],
8981 ptr[47], ptr[46],
8982 ptr[49], ptr[48]
8983 );
8984
8985 out_buf[salt.keccak_mdlen * 2] = 0;
8986 }
8987 else if (hash_type == HASH_TYPE_RIPEMD160)
8988 {
8989 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8990 digest_buf[0],
8991 digest_buf[1],
8992 digest_buf[2],
8993 digest_buf[3],
8994 digest_buf[4]);
8995 }
8996 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8997 {
8998 digest_buf[ 0] = digest_buf[ 0];
8999 digest_buf[ 1] = digest_buf[ 1];
9000 digest_buf[ 2] = digest_buf[ 2];
9001 digest_buf[ 3] = digest_buf[ 3];
9002 digest_buf[ 4] = digest_buf[ 4];
9003 digest_buf[ 5] = digest_buf[ 5];
9004 digest_buf[ 6] = digest_buf[ 6];
9005 digest_buf[ 7] = digest_buf[ 7];
9006 digest_buf[ 8] = digest_buf[ 8];
9007 digest_buf[ 9] = digest_buf[ 9];
9008 digest_buf[10] = digest_buf[10];
9009 digest_buf[11] = digest_buf[11];
9010 digest_buf[12] = digest_buf[12];
9011 digest_buf[13] = digest_buf[13];
9012 digest_buf[14] = digest_buf[14];
9013 digest_buf[15] = digest_buf[15];
9014
9015 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
9016 digest_buf[ 0],
9017 digest_buf[ 1],
9018 digest_buf[ 2],
9019 digest_buf[ 3],
9020 digest_buf[ 4],
9021 digest_buf[ 5],
9022 digest_buf[ 6],
9023 digest_buf[ 7],
9024 digest_buf[ 8],
9025 digest_buf[ 9],
9026 digest_buf[10],
9027 digest_buf[11],
9028 digest_buf[12],
9029 digest_buf[13],
9030 digest_buf[14],
9031 digest_buf[15]);
9032 }
9033 else if (hash_type == HASH_TYPE_GOST)
9034 {
9035 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
9036 digest_buf[0],
9037 digest_buf[1],
9038 digest_buf[2],
9039 digest_buf[3],
9040 digest_buf[4],
9041 digest_buf[5],
9042 digest_buf[6],
9043 digest_buf[7]);
9044 }
9045 else if (hash_type == HASH_TYPE_MYSQL)
9046 {
9047 snprintf (out_buf, len-1, "%08x%08x",
9048 digest_buf[0],
9049 digest_buf[1]);
9050 }
9051 else if (hash_type == HASH_TYPE_LOTUS5)
9052 {
9053 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
9054 digest_buf[0],
9055 digest_buf[1],
9056 digest_buf[2],
9057 digest_buf[3]);
9058 }
9059 else if (hash_type == HASH_TYPE_LOTUS6)
9060 {
9061 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
9062 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
9063 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
9064 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
9065
9066 char buf[16] = { 0 };
9067
9068 memcpy (buf + 0, salt.salt_buf, 5);
9069 memcpy (buf + 5, digest_buf, 9);
9070
9071 buf[3] -= -4;
9072
9073 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
9074
9075 tmp_buf[18] = salt.salt_buf_pc[7];
9076 tmp_buf[19] = 0;
9077
9078 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
9079 }
9080 else if (hash_type == HASH_TYPE_LOTUS8)
9081 {
9082 char buf[52] = { 0 };
9083
9084 // salt
9085
9086 memcpy (buf + 0, salt.salt_buf, 16);
9087
9088 buf[3] -= -4;
9089
9090 // iteration
9091
9092 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
9093
9094 // chars
9095
9096 buf[26] = salt.salt_buf_pc[0];
9097 buf[27] = salt.salt_buf_pc[1];
9098
9099 // digest
9100
9101 memcpy (buf + 28, digest_buf, 8);
9102
9103 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
9104
9105 tmp_buf[49] = 0;
9106
9107 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
9108 }
9109 else if (hash_type == HASH_TYPE_CRC32)
9110 {
9111 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
9112 }
9113 }
9114
9115 if (salt_type == SALT_TYPE_INTERN)
9116 {
9117 size_t pos = strlen (out_buf);
9118
9119 out_buf[pos] = data.separator;
9120
9121 char *ptr = (char *) salt.salt_buf;
9122
9123 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
9124
9125 out_buf[pos + 1 + salt.salt_len] = 0;
9126 }
9127 }
9128
9129 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
9130 {
9131 memset (hccap, 0, sizeof (hccap_t));
9132
9133 salt_t *salt = &data.salts_buf[salt_pos];
9134
9135 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
9136
9137 wpa_t *wpas = (wpa_t *) data.esalts_buf;
9138 wpa_t *wpa = &wpas[salt_pos];
9139
9140 hccap->keyver = wpa->keyver;
9141
9142 hccap->eapol_size = wpa->eapol_size;
9143
9144 if (wpa->keyver != 1)
9145 {
9146 uint eapol_tmp[64] = { 0 };
9147
9148 for (uint i = 0; i < 64; i++)
9149 {
9150 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
9151 }
9152
9153 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
9154 }
9155 else
9156 {
9157 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
9158 }
9159
9160 memcpy (hccap->mac1, wpa->orig_mac1, 6);
9161 memcpy (hccap->mac2, wpa->orig_mac2, 6);
9162 memcpy (hccap->nonce1, wpa->orig_nonce1, 32);
9163 memcpy (hccap->nonce2, wpa->orig_nonce2, 32);
9164
9165 char *digests_buf_ptr = (char *) data.digests_buf;
9166
9167 uint dgst_size = data.dgst_size;
9168
9169 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
9170
9171 if (wpa->keyver != 1)
9172 {
9173 uint digest_tmp[4] = { 0 };
9174
9175 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
9176 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
9177 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
9178 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
9179
9180 memcpy (hccap->keymic, digest_tmp, 16);
9181 }
9182 else
9183 {
9184 memcpy (hccap->keymic, digest_ptr, 16);
9185 }
9186 }
9187
9188 void SuspendThreads ()
9189 {
9190 if (data.devices_status != STATUS_RUNNING) return;
9191
9192 hc_timer_set (&data.timer_paused);
9193
9194 data.devices_status = STATUS_PAUSED;
9195
9196 log_info ("Paused");
9197 }
9198
9199 void ResumeThreads ()
9200 {
9201 if (data.devices_status != STATUS_PAUSED) return;
9202
9203 double ms_paused;
9204
9205 hc_timer_get (data.timer_paused, ms_paused);
9206
9207 data.ms_paused += ms_paused;
9208
9209 data.devices_status = STATUS_RUNNING;
9210
9211 log_info ("Resumed");
9212 }
9213
9214 void bypass ()
9215 {
9216 data.devices_status = STATUS_BYPASS;
9217
9218 log_info ("Next dictionary / mask in queue selected, bypassing current one");
9219 }
9220
9221 void stop_at_checkpoint ()
9222 {
9223 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9224 {
9225 if (data.devices_status != STATUS_RUNNING) return;
9226 }
9227
9228 // this feature only makes sense if --restore-disable was not specified
9229
9230 if (data.restore_disable == 1)
9231 {
9232 log_info ("WARNING: This feature is disabled when --restore-disable is specified");
9233
9234 return;
9235 }
9236
9237 // check if monitoring of Restore Point updates should be enabled or disabled
9238
9239 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9240 {
9241 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
9242
9243 // save the current restore point value
9244
9245 data.checkpoint_cur_words = get_lowest_words_done ();
9246
9247 log_info ("Checkpoint enabled: Will quit at next Restore Point update");
9248 }
9249 else
9250 {
9251 data.devices_status = STATUS_RUNNING;
9252
9253 // reset the global value for checkpoint checks
9254
9255 data.checkpoint_cur_words = 0;
9256
9257 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
9258 }
9259 }
9260
9261 void myabort ()
9262 {
9263 data.devices_status = STATUS_ABORTED;
9264 }
9265
9266 void myquit ()
9267 {
9268 data.devices_status = STATUS_QUIT;
9269 }
9270
9271 void naive_replace (char *s, const u8 key_char, const u8 replace_char)
9272 {
9273 const size_t len = strlen (s);
9274
9275 for (size_t in = 0; in < len; in++)
9276 {
9277 const u8 c = s[in];
9278
9279 if (c == key_char)
9280 {
9281 s[in] = replace_char;
9282 }
9283 }
9284 }
9285
9286 void naive_escape (char *s, size_t s_max, const u8 key_char, const u8 escape_char)
9287 {
9288 char s_escaped[1024] = { 0 };
9289
9290 size_t s_escaped_max = sizeof (s_escaped);
9291
9292 const size_t len = strlen (s);
9293
9294 for (size_t in = 0, out = 0; in < len; in++, out++)
9295 {
9296 const u8 c = s[in];
9297
9298 if (c == key_char)
9299 {
9300 s_escaped[out] = escape_char;
9301
9302 out++;
9303 }
9304
9305 if (out == s_escaped_max - 2) break;
9306
9307 s_escaped[out] = c;
9308 }
9309
9310 strncpy (s, s_escaped, s_max - 1);
9311 }
9312
9313 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
9314 {
9315 FILE *fp = fopen (kernel_file, "rb");
9316
9317 if (fp != NULL)
9318 {
9319 struct stat st;
9320
9321 memset (&st, 0, sizeof (st));
9322
9323 stat (kernel_file, &st);
9324
9325 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
9326
9327 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
9328
9329 if (num_read != (size_t) st.st_size)
9330 {
9331 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9332
9333 exit (-1);
9334 }
9335
9336 fclose (fp);
9337
9338 buf[st.st_size] = 0;
9339
9340 for (int i = 0; i < num_devices; i++)
9341 {
9342 kernel_lengths[i] = (size_t) st.st_size;
9343
9344 kernel_sources[i] = buf;
9345 }
9346 }
9347 else
9348 {
9349 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9350
9351 exit (-1);
9352 }
9353
9354 return;
9355 }
9356
9357 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
9358 {
9359 if (binary_size > 0)
9360 {
9361 FILE *fp = fopen (dst, "wb");
9362
9363 lock_file (fp);
9364 fwrite (binary, sizeof (u8), binary_size, fp);
9365
9366 fflush (fp);
9367 fclose (fp);
9368 }
9369 }
9370
9371 /**
9372 * restore
9373 */
9374
9375 restore_data_t *init_restore (int argc, char **argv)
9376 {
9377 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
9378
9379 if (data.restore_disable == 0)
9380 {
9381 FILE *fp = fopen (data.eff_restore_file, "rb");
9382
9383 if (fp)
9384 {
9385 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
9386
9387 if (nread != 1)
9388 {
9389 log_error ("ERROR: Cannot read %s", data.eff_restore_file);
9390
9391 exit (-1);
9392 }
9393
9394 fclose (fp);
9395
9396 if (rd->pid)
9397 {
9398 char *pidbin = (char *) mymalloc (HCBUFSIZ);
9399
9400 int pidbin_len = -1;
9401
9402 #ifdef _POSIX
9403 snprintf (pidbin, HCBUFSIZ - 1, "/proc/%d/cmdline", rd->pid);
9404
9405 FILE *fd = fopen (pidbin, "rb");
9406
9407 if (fd)
9408 {
9409 pidbin_len = fread (pidbin, 1, HCBUFSIZ, fd);
9410
9411 pidbin[pidbin_len] = 0;
9412
9413 fclose (fd);
9414
9415 char *argv0_r = strrchr (argv[0], '/');
9416
9417 char *pidbin_r = strrchr (pidbin, '/');
9418
9419 if (argv0_r == NULL) argv0_r = argv[0];
9420
9421 if (pidbin_r == NULL) pidbin_r = pidbin;
9422
9423 if (strcmp (argv0_r, pidbin_r) == 0)
9424 {
9425 log_error ("ERROR: Already an instance %s running on pid %d", pidbin, rd->pid);
9426
9427 exit (-1);
9428 }
9429 }
9430
9431 #elif _WIN
9432 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
9433
9434 char *pidbin2 = (char *) mymalloc (HCBUFSIZ);
9435
9436 int pidbin2_len = -1;
9437
9438 pidbin_len = GetModuleFileName (NULL, pidbin, HCBUFSIZ);
9439 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, HCBUFSIZ);
9440
9441 pidbin[pidbin_len] = 0;
9442 pidbin2[pidbin2_len] = 0;
9443
9444 if (pidbin2_len)
9445 {
9446 if (strcmp (pidbin, pidbin2) == 0)
9447 {
9448 log_error ("ERROR: Already an instance %s running on pid %d", pidbin2, rd->pid);
9449
9450 exit (-1);
9451 }
9452 }
9453
9454 myfree (pidbin2);
9455
9456 #endif
9457
9458 myfree (pidbin);
9459 }
9460
9461 if (rd->version_bin < RESTORE_MIN)
9462 {
9463 log_error ("ERROR: Cannot use outdated %s. Please remove it.", data.eff_restore_file);
9464
9465 exit (-1);
9466 }
9467 }
9468 }
9469
9470 memset (rd, 0, sizeof (restore_data_t));
9471
9472 rd->version_bin = VERSION_BIN;
9473
9474 #ifdef _POSIX
9475 rd->pid = getpid ();
9476 #elif _WIN
9477 rd->pid = GetCurrentProcessId ();
9478 #endif
9479
9480 if (getcwd (rd->cwd, 255) == NULL)
9481 {
9482 myfree (rd);
9483
9484 return (NULL);
9485 }
9486
9487 rd->argc = argc;
9488 rd->argv = argv;
9489
9490 return (rd);
9491 }
9492
9493 void read_restore (const char *eff_restore_file, restore_data_t *rd)
9494 {
9495 FILE *fp = fopen (eff_restore_file, "rb");
9496
9497 if (fp == NULL)
9498 {
9499 log_error ("ERROR: Restore file '%s': %s", eff_restore_file, strerror (errno));
9500
9501 exit (-1);
9502 }
9503
9504 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
9505 {
9506 log_error ("ERROR: Can't read %s", eff_restore_file);
9507
9508 exit (-1);
9509 }
9510
9511 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
9512
9513 char *buf = (char *) mymalloc (HCBUFSIZ);
9514
9515 for (uint i = 0; i < rd->argc; i++)
9516 {
9517 if (fgets (buf, HCBUFSIZ - 1, fp) == NULL)
9518 {
9519 log_error ("ERROR: Can't read %s", eff_restore_file);
9520
9521 exit (-1);
9522 }
9523
9524 size_t len = strlen (buf);
9525
9526 if (len) buf[len - 1] = 0;
9527
9528 rd->argv[i] = mystrdup (buf);
9529 }
9530
9531 myfree (buf);
9532
9533 fclose (fp);
9534
9535 log_info ("INFO: Changing current working directory to the path found within the .restore file: '%s'", rd->cwd);
9536
9537 if (chdir (rd->cwd))
9538 {
9539 log_error ("ERROR: The directory '%s' does not exist. It is needed to restore (--restore) the session.\n"
9540 " You could either create this directory (or link it) or update the .restore file using e.g. the analyze_hc_restore.pl tool:\n"
9541 " https://github.com/philsmd/analyze_hc_restore\n"
9542 " The directory must be relative to (or contain) all files/folders mentioned within the command line.", rd->cwd);
9543
9544 exit (-1);
9545 }
9546 }
9547
9548 u64 get_lowest_words_done ()
9549 {
9550 u64 words_cur = -1;
9551
9552 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
9553 {
9554 hc_device_param_t *device_param = &data.devices_param[device_id];
9555
9556 if (device_param->skipped) continue;
9557
9558 const u64 words_done = device_param->words_done;
9559
9560 if (words_done < words_cur) words_cur = words_done;
9561 }
9562
9563 // It's possible that a device's workload isn't finished right after a restore-case.
9564 // In that case, this function would return 0 and overwrite the real restore point
9565 // There's also data.words_cur which is set to rd->words_cur but it changes while
9566 // the attack is running therefore we should stick to rd->words_cur.
9567 // Note that -s influences rd->words_cur we should keep a close look on that.
9568
9569 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
9570
9571 return words_cur;
9572 }
9573
9574 void write_restore (const char *new_restore_file, restore_data_t *rd)
9575 {
9576 u64 words_cur = get_lowest_words_done ();
9577
9578 rd->words_cur = words_cur;
9579
9580 FILE *fp = fopen (new_restore_file, "wb");
9581
9582 if (fp == NULL)
9583 {
9584 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
9585
9586 exit (-1);
9587 }
9588
9589 if (setvbuf (fp, NULL, _IONBF, 0))
9590 {
9591 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
9592
9593 exit (-1);
9594 }
9595
9596 fwrite (rd, sizeof (restore_data_t), 1, fp);
9597
9598 for (uint i = 0; i < rd->argc; i++)
9599 {
9600 fprintf (fp, "%s", rd->argv[i]);
9601 fputc ('\n', fp);
9602 }
9603
9604 fflush (fp);
9605
9606 fsync (fileno (fp));
9607
9608 fclose (fp);
9609 }
9610
9611 void cycle_restore ()
9612 {
9613 const char *eff_restore_file = data.eff_restore_file;
9614 const char *new_restore_file = data.new_restore_file;
9615
9616 restore_data_t *rd = data.rd;
9617
9618 write_restore (new_restore_file, rd);
9619
9620 struct stat st;
9621
9622 memset (&st, 0, sizeof(st));
9623
9624 if (stat (eff_restore_file, &st) == 0)
9625 {
9626 if (unlink (eff_restore_file))
9627 {
9628 log_info ("WARN: Unlink file '%s': %s", eff_restore_file, strerror (errno));
9629 }
9630 }
9631
9632 if (rename (new_restore_file, eff_restore_file))
9633 {
9634 log_info ("WARN: Rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
9635 }
9636 }
9637
9638 void check_checkpoint ()
9639 {
9640 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9641
9642 u64 words_cur = get_lowest_words_done ();
9643
9644 if (words_cur != data.checkpoint_cur_words)
9645 {
9646 myabort ();
9647 }
9648 }
9649
9650 /**
9651 * tuning db
9652 */
9653
9654 void tuning_db_destroy (tuning_db_t *tuning_db)
9655 {
9656 int i;
9657
9658 for (i = 0; i < tuning_db->alias_cnt; i++)
9659 {
9660 tuning_db_alias_t *alias = &tuning_db->alias_buf[i];
9661
9662 myfree (alias->device_name);
9663 myfree (alias->alias_name);
9664 }
9665
9666 for (i = 0; i < tuning_db->entry_cnt; i++)
9667 {
9668 tuning_db_entry_t *entry = &tuning_db->entry_buf[i];
9669
9670 myfree (entry->device_name);
9671 }
9672
9673 myfree (tuning_db->alias_buf);
9674 myfree (tuning_db->entry_buf);
9675
9676 myfree (tuning_db);
9677 }
9678
9679 tuning_db_t *tuning_db_alloc (FILE *fp)
9680 {
9681 tuning_db_t *tuning_db = (tuning_db_t *) mymalloc (sizeof (tuning_db_t));
9682
9683 int num_lines = count_lines (fp);
9684
9685 // a bit over-allocated
9686
9687 tuning_db->alias_buf = (tuning_db_alias_t *) mycalloc (num_lines + 1, sizeof (tuning_db_alias_t));
9688 tuning_db->alias_cnt = 0;
9689
9690 tuning_db->entry_buf = (tuning_db_entry_t *) mycalloc (num_lines + 1, sizeof (tuning_db_entry_t));
9691 tuning_db->entry_cnt = 0;
9692
9693 return tuning_db;
9694 }
9695
9696 tuning_db_t *tuning_db_init (const char *tuning_db_file)
9697 {
9698 FILE *fp = fopen (tuning_db_file, "rb");
9699
9700 if (fp == NULL)
9701 {
9702 log_error ("%s: %s", tuning_db_file, strerror (errno));
9703
9704 exit (-1);
9705 }
9706
9707 tuning_db_t *tuning_db = tuning_db_alloc (fp);
9708
9709 rewind (fp);
9710
9711 int line_num = 0;
9712
9713 char *buf = (char *) mymalloc (HCBUFSIZ);
9714
9715 while (!feof (fp))
9716 {
9717 char *line_buf = fgets (buf, HCBUFSIZ - 1, fp);
9718
9719 if (line_buf == NULL) break;
9720
9721 line_num++;
9722
9723 const int line_len = in_superchop (line_buf);
9724
9725 if (line_len == 0) continue;
9726
9727 if (line_buf[0] == '#') continue;
9728
9729 // start processing
9730
9731 char *token_ptr[7] = { NULL };
9732
9733 int token_cnt = 0;
9734
9735 char *next = strtok (line_buf, "\t ");
9736
9737 token_ptr[token_cnt] = next;
9738
9739 token_cnt++;
9740
9741 while ((next = strtok (NULL, "\t ")) != NULL)
9742 {
9743 token_ptr[token_cnt] = next;
9744
9745 token_cnt++;
9746 }
9747
9748 if (token_cnt == 2)
9749 {
9750 char *device_name = token_ptr[0];
9751 char *alias_name = token_ptr[1];
9752
9753 tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt];
9754
9755 alias->device_name = mystrdup (device_name);
9756 alias->alias_name = mystrdup (alias_name);
9757
9758 tuning_db->alias_cnt++;
9759 }
9760 else if (token_cnt == 6)
9761 {
9762 if ((token_ptr[1][0] != '0') &&
9763 (token_ptr[1][0] != '1') &&
9764 (token_ptr[1][0] != '3') &&
9765 (token_ptr[1][0] != '*'))
9766 {
9767 log_info ("WARNING: Tuning-db: Invalid attack_mode '%c' in Line '%u'", token_ptr[1][0], line_num);
9768
9769 continue;
9770 }
9771
9772 if ((token_ptr[3][0] != '1') &&
9773 (token_ptr[3][0] != '2') &&
9774 (token_ptr[3][0] != '4') &&
9775 (token_ptr[3][0] != '8') &&
9776 (token_ptr[3][0] != 'N'))
9777 {
9778 log_info ("WARNING: Tuning-db: Invalid vector_width '%c' in Line '%u'", token_ptr[3][0], line_num);
9779
9780 continue;
9781 }
9782
9783 char *device_name = token_ptr[0];
9784
9785 int attack_mode = -1;
9786 int hash_type = -1;
9787 int vector_width = -1;
9788 int kernel_accel = -1;
9789 int kernel_loops = -1;
9790
9791 if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]);
9792 if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]);
9793 if (token_ptr[3][0] != 'N') vector_width = atoi (token_ptr[3]);
9794
9795 if (token_ptr[4][0] != 'A')
9796 {
9797 kernel_accel = atoi (token_ptr[4]);
9798
9799 if ((kernel_accel < 1) || (kernel_accel > 1024))
9800 {
9801 log_info ("WARNING: Tuning-db: Invalid kernel_accel '%d' in Line '%u'", kernel_accel, line_num);
9802
9803 continue;
9804 }
9805 }
9806 else
9807 {
9808 kernel_accel = 0;
9809 }
9810
9811 if (token_ptr[5][0] != 'A')
9812 {
9813 kernel_loops = atoi (token_ptr[5]);
9814
9815 if ((kernel_loops < 1) || (kernel_loops > 1024))
9816 {
9817 log_info ("WARNING: Tuning-db: Invalid kernel_loops '%d' in Line '%u'", kernel_loops, line_num);
9818
9819 continue;
9820 }
9821 }
9822 else
9823 {
9824 kernel_loops = 0;
9825 }
9826
9827 tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt];
9828
9829 entry->device_name = mystrdup (device_name);
9830 entry->attack_mode = attack_mode;
9831 entry->hash_type = hash_type;
9832 entry->vector_width = vector_width;
9833 entry->kernel_accel = kernel_accel;
9834 entry->kernel_loops = kernel_loops;
9835
9836 tuning_db->entry_cnt++;
9837 }
9838 else
9839 {
9840 log_info ("WARNING: Tuning-db: Invalid number of token in Line '%u'", line_num);
9841
9842 continue;
9843 }
9844 }
9845
9846 myfree (buf);
9847
9848 fclose (fp);
9849
9850 // todo: print loaded 'cnt' message
9851
9852 // sort the database
9853
9854 qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9855 qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9856
9857 return tuning_db;
9858 }
9859
9860 tuning_db_entry_t *tuning_db_search (tuning_db_t *tuning_db, hc_device_param_t *device_param, int attack_mode, int hash_type)
9861 {
9862 static tuning_db_entry_t s;
9863
9864 // first we need to convert all spaces in the device_name to underscore
9865
9866 char *device_name_nospace = strdup (device_param->device_name);
9867
9868 int device_name_length = strlen (device_name_nospace);
9869
9870 int i;
9871
9872 for (i = 0; i < device_name_length; i++)
9873 {
9874 if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_';
9875 }
9876
9877 // find out if there's an alias configured
9878
9879 tuning_db_alias_t a;
9880
9881 a.device_name = device_name_nospace;
9882
9883 tuning_db_alias_t *alias = bsearch (&a, tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9884
9885 char *alias_name = (alias == NULL) ? NULL : alias->alias_name;
9886
9887 // attack-mode 6 and 7 are attack-mode 1 basically
9888
9889 if (attack_mode == 6) attack_mode = 1;
9890 if (attack_mode == 7) attack_mode = 1;
9891
9892 // bsearch is not ideal but fast enough
9893
9894 s.device_name = device_name_nospace;
9895 s.attack_mode = attack_mode;
9896 s.hash_type = hash_type;
9897
9898 tuning_db_entry_t *entry = NULL;
9899
9900 // this will produce all 2^3 combinations required
9901
9902 for (i = 0; i < 8; i++)
9903 {
9904 s.device_name = (i & 1) ? "*" : device_name_nospace;
9905 s.attack_mode = (i & 2) ? -1 : attack_mode;
9906 s.hash_type = (i & 4) ? -1 : hash_type;
9907
9908 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9909
9910 if (entry != NULL) break;
9911
9912 // in non-wildcard mode do some additional checks:
9913
9914 if ((i & 1) == 0)
9915 {
9916 // in case we have an alias-name
9917
9918 if (alias_name != NULL)
9919 {
9920 s.device_name = alias_name;
9921
9922 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9923
9924 if (entry != NULL) break;
9925 }
9926
9927 // or by device type
9928
9929 if (device_param->device_type & CL_DEVICE_TYPE_CPU)
9930 {
9931 s.device_name = "DEVICE_TYPE_CPU";
9932 }
9933 else if (device_param->device_type & CL_DEVICE_TYPE_GPU)
9934 {
9935 s.device_name = "DEVICE_TYPE_GPU";
9936 }
9937 else if (device_param->device_type & CL_DEVICE_TYPE_ACCELERATOR)
9938 {
9939 s.device_name = "DEVICE_TYPE_ACCELERATOR";
9940 }
9941
9942 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9943
9944 if (entry != NULL) break;
9945 }
9946 }
9947
9948 // free converted device_name
9949
9950 myfree (device_name_nospace);
9951
9952 return entry;
9953 }
9954
9955 /**
9956 * parser
9957 */
9958
9959 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9960 {
9961 u8 tmp[256] = { 0 };
9962
9963 if (salt_len > sizeof (tmp))
9964 {
9965 return UINT_MAX;
9966 }
9967
9968 memcpy (tmp, in, salt_len);
9969
9970 if (data.opts_type & OPTS_TYPE_ST_HEX)
9971 {
9972 if ((salt_len % 2) == 0)
9973 {
9974 u32 new_salt_len = salt_len / 2;
9975
9976 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9977 {
9978 u8 p0 = tmp[j + 0];
9979 u8 p1 = tmp[j + 1];
9980
9981 tmp[i] = hex_convert (p1) << 0;
9982 tmp[i] |= hex_convert (p0) << 4;
9983 }
9984
9985 salt_len = new_salt_len;
9986 }
9987 else
9988 {
9989 return UINT_MAX;
9990 }
9991 }
9992 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9993 {
9994 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9995 }
9996
9997 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9998
9999 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
10000 {
10001 if (salt_len < 20)
10002 {
10003 u32 *tmp_uint = (u32 *) tmp;
10004
10005 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
10006 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
10007 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
10008 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
10009 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
10010 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
10011 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
10012 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
10013 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
10014 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
10015
10016 salt_len = salt_len * 2;
10017 }
10018 else
10019 {
10020 return UINT_MAX;
10021 }
10022 }
10023
10024 if (data.opts_type & OPTS_TYPE_ST_LOWER)
10025 {
10026 lowercase (tmp, salt_len);
10027 }
10028
10029 if (data.opts_type & OPTS_TYPE_ST_UPPER)
10030 {
10031 uppercase (tmp, salt_len);
10032 }
10033
10034 u32 len = salt_len;
10035
10036 if (data.opts_type & OPTS_TYPE_ST_ADD80)
10037 {
10038 tmp[len++] = 0x80;
10039 }
10040
10041 if (data.opts_type & OPTS_TYPE_ST_ADD01)
10042 {
10043 tmp[len++] = 0x01;
10044 }
10045
10046 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
10047 {
10048 u32 *tmp_uint = (uint *) tmp;
10049
10050 u32 max = len / 4;
10051
10052 if (len % 4) max++;
10053
10054 for (u32 i = 0; i < max; i++)
10055 {
10056 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
10057 }
10058
10059 // Important: we may need to increase the length of memcpy since
10060 // we don't want to "loose" some swapped bytes (could happen if
10061 // they do not perfectly fit in the 4-byte blocks)
10062 // Memcpy does always copy the bytes in the BE order, but since
10063 // we swapped them, some important bytes could be in positions
10064 // we normally skip with the original len
10065
10066 if (len % 4) len += 4 - (len % 4);
10067 }
10068
10069 memcpy (out, tmp, len);
10070
10071 return (salt_len);
10072 }
10073
10074 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10075 {
10076 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
10077
10078 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
10079
10080 u32 *digest = (u32 *) hash_buf->digest;
10081
10082 salt_t *salt = hash_buf->salt;
10083
10084 memcpy ((char *) salt->salt_sign, input_buf, 6);
10085
10086 char *iter_pos = input_buf + 4;
10087
10088 salt->salt_iter = 1 << atoi (iter_pos);
10089
10090 char *salt_pos = strchr (iter_pos, '$');
10091
10092 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10093
10094 salt_pos++;
10095
10096 uint salt_len = 16;
10097
10098 salt->salt_len = salt_len;
10099
10100 u8 tmp_buf[100] = { 0 };
10101
10102 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
10103
10104 char *salt_buf_ptr = (char *) salt->salt_buf;
10105
10106 memcpy (salt_buf_ptr, tmp_buf, 16);
10107
10108 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
10109 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
10110 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
10111 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
10112
10113 char *hash_pos = salt_pos + 22;
10114
10115 memset (tmp_buf, 0, sizeof (tmp_buf));
10116
10117 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
10118
10119 memcpy (digest, tmp_buf, 24);
10120
10121 digest[0] = byte_swap_32 (digest[0]);
10122 digest[1] = byte_swap_32 (digest[1]);
10123 digest[2] = byte_swap_32 (digest[2]);
10124 digest[3] = byte_swap_32 (digest[3]);
10125 digest[4] = byte_swap_32 (digest[4]);
10126 digest[5] = byte_swap_32 (digest[5]);
10127
10128 digest[5] &= ~0xff; // its just 23 not 24 !
10129
10130 return (PARSER_OK);
10131 }
10132
10133 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10134 {
10135 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
10136
10137 u32 *digest = (u32 *) hash_buf->digest;
10138
10139 u8 tmp_buf[100] = { 0 };
10140
10141 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
10142
10143 memcpy (digest, tmp_buf, 32);
10144
10145 digest[0] = byte_swap_32 (digest[0]);
10146 digest[1] = byte_swap_32 (digest[1]);
10147 digest[2] = byte_swap_32 (digest[2]);
10148 digest[3] = byte_swap_32 (digest[3]);
10149 digest[4] = byte_swap_32 (digest[4]);
10150 digest[5] = byte_swap_32 (digest[5]);
10151 digest[6] = byte_swap_32 (digest[6]);
10152 digest[7] = byte_swap_32 (digest[7]);
10153
10154 digest[0] -= SHA256M_A;
10155 digest[1] -= SHA256M_B;
10156 digest[2] -= SHA256M_C;
10157 digest[3] -= SHA256M_D;
10158 digest[4] -= SHA256M_E;
10159 digest[5] -= SHA256M_F;
10160 digest[6] -= SHA256M_G;
10161 digest[7] -= SHA256M_H;
10162
10163 return (PARSER_OK);
10164 }
10165
10166 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10167 {
10168 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
10169
10170 u32 *digest = (u32 *) hash_buf->digest;
10171
10172 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10173 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10174
10175 digest[0] = byte_swap_32 (digest[0]);
10176 digest[1] = byte_swap_32 (digest[1]);
10177
10178 uint tt;
10179
10180 IP (digest[0], digest[1], tt);
10181
10182 digest[0] = digest[0];
10183 digest[1] = digest[1];
10184 digest[2] = 0;
10185 digest[3] = 0;
10186
10187 return (PARSER_OK);
10188 }
10189
10190 int arubaos_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10191 {
10192 if ((input_len < DISPLAY_LEN_MIN_125) || (input_len > DISPLAY_LEN_MAX_125)) return (PARSER_GLOBAL_LENGTH);
10193
10194 if ((input_buf[8] != '0') || (input_buf[9] != '1')) return (PARSER_SIGNATURE_UNMATCHED);
10195
10196 u32 *digest = (u32 *) hash_buf->digest;
10197
10198 salt_t *salt = hash_buf->salt;
10199
10200 char *hash_pos = input_buf + 10;
10201
10202 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10203 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10204 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10205 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10206 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10207
10208 digest[0] -= SHA1M_A;
10209 digest[1] -= SHA1M_B;
10210 digest[2] -= SHA1M_C;
10211 digest[3] -= SHA1M_D;
10212 digest[4] -= SHA1M_E;
10213
10214 uint salt_len = 10;
10215
10216 char *salt_buf_ptr = (char *) salt->salt_buf;
10217
10218 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10219
10220 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10221
10222 salt->salt_len = salt_len;
10223
10224 return (PARSER_OK);
10225 }
10226
10227 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10228 {
10229 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
10230
10231 u32 *digest = (u32 *) hash_buf->digest;
10232
10233 salt_t *salt = hash_buf->salt;
10234
10235 char *hash_pos = input_buf + 8;
10236
10237 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10238 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10239 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10240 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10241 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10242
10243 digest[0] -= SHA1M_A;
10244 digest[1] -= SHA1M_B;
10245 digest[2] -= SHA1M_C;
10246 digest[3] -= SHA1M_D;
10247 digest[4] -= SHA1M_E;
10248
10249 uint salt_len = 8;
10250
10251 char *salt_buf_ptr = (char *) salt->salt_buf;
10252
10253 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10254
10255 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10256
10257 salt->salt_len = salt_len;
10258
10259 return (PARSER_OK);
10260 }
10261
10262 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10263 {
10264 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
10265
10266 u64 *digest = (u64 *) hash_buf->digest;
10267
10268 salt_t *salt = hash_buf->salt;
10269
10270 char *hash_pos = input_buf + 8;
10271
10272 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
10273 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
10274 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
10275 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
10276 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
10277 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
10278 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
10279 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
10280
10281 digest[0] -= SHA512M_A;
10282 digest[1] -= SHA512M_B;
10283 digest[2] -= SHA512M_C;
10284 digest[3] -= SHA512M_D;
10285 digest[4] -= SHA512M_E;
10286 digest[5] -= SHA512M_F;
10287 digest[6] -= SHA512M_G;
10288 digest[7] -= SHA512M_H;
10289
10290 uint salt_len = 8;
10291
10292 char *salt_buf_ptr = (char *) salt->salt_buf;
10293
10294 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10295
10296 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10297
10298 salt->salt_len = salt_len;
10299
10300 return (PARSER_OK);
10301 }
10302
10303 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10304 {
10305 if (data.opts_type & OPTS_TYPE_ST_HEX)
10306 {
10307 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
10308 }
10309 else
10310 {
10311 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
10312 }
10313
10314 u32 *digest = (u32 *) hash_buf->digest;
10315
10316 salt_t *salt = hash_buf->salt;
10317
10318 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10319 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10320 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10321 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10322
10323 digest[0] = byte_swap_32 (digest[0]);
10324 digest[1] = byte_swap_32 (digest[1]);
10325 digest[2] = byte_swap_32 (digest[2]);
10326 digest[3] = byte_swap_32 (digest[3]);
10327
10328 digest[0] -= MD5M_A;
10329 digest[1] -= MD5M_B;
10330 digest[2] -= MD5M_C;
10331 digest[3] -= MD5M_D;
10332
10333 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10334
10335 uint salt_len = input_len - 32 - 1;
10336
10337 char *salt_buf = input_buf + 32 + 1;
10338
10339 char *salt_buf_ptr = (char *) salt->salt_buf;
10340
10341 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10342
10343 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10344
10345 salt->salt_len = salt_len;
10346
10347 return (PARSER_OK);
10348 }
10349
10350 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10351 {
10352 if (data.opts_type & OPTS_TYPE_ST_HEX)
10353 {
10354 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
10355 }
10356 else
10357 {
10358 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
10359 }
10360
10361 // unscramble
10362
10363 char clean_input_buf[32] = { 0 };
10364
10365 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
10366 int pos[6] = { 0, 6, 12, 17, 23, 29 };
10367
10368 for (int i = 0, j = 0, k = 0; i < 30; i++)
10369 {
10370 if (i == pos[j])
10371 {
10372 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
10373
10374 j++;
10375 }
10376 else
10377 {
10378 clean_input_buf[k] = input_buf[i];
10379
10380 k++;
10381 }
10382 }
10383
10384 // base64 decode
10385
10386 u32 *digest = (u32 *) hash_buf->digest;
10387
10388 salt_t *salt = hash_buf->salt;
10389
10390 u32 a, b, c, d, e, f;
10391
10392 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
10393 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
10394 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
10395 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
10396 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
10397 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
10398
10399 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
10400 | (((d << 12) | (e << 6) | (f)) << 0);
10401
10402 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
10403 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
10404 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
10405 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
10406 e = base64_to_int (clean_input_buf[10] & 0x7f);
10407 f = base64_to_int (clean_input_buf[11] & 0x7f);
10408
10409 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
10410 | (((d << 12) | (e << 6) | (f)) << 0);
10411
10412 a = base64_to_int (clean_input_buf[12] & 0x7f);
10413 b = base64_to_int (clean_input_buf[13] & 0x7f);
10414 c = base64_to_int (clean_input_buf[14] & 0x7f);
10415 d = base64_to_int (clean_input_buf[15] & 0x7f);
10416 e = base64_to_int (clean_input_buf[16] & 0x7f);
10417 f = base64_to_int (clean_input_buf[17] & 0x7f);
10418
10419 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
10420 | (((d << 12) | (e << 6) | (f)) << 0);
10421
10422 a = base64_to_int (clean_input_buf[18] & 0x7f);
10423 b = base64_to_int (clean_input_buf[19] & 0x7f);
10424 c = base64_to_int (clean_input_buf[20] & 0x7f);
10425 d = base64_to_int (clean_input_buf[21] & 0x7f);
10426 e = base64_to_int (clean_input_buf[22] & 0x7f);
10427 f = base64_to_int (clean_input_buf[23] & 0x7f);
10428
10429 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
10430 | (((d << 12) | (e << 6) | (f)) << 0);
10431
10432 digest[0] = byte_swap_32 (digest[0]);
10433 digest[1] = byte_swap_32 (digest[1]);
10434 digest[2] = byte_swap_32 (digest[2]);
10435 digest[3] = byte_swap_32 (digest[3]);
10436
10437 digest[0] -= MD5M_A;
10438 digest[1] -= MD5M_B;
10439 digest[2] -= MD5M_C;
10440 digest[3] -= MD5M_D;
10441
10442 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
10443
10444 uint salt_len = input_len - 30 - 1;
10445
10446 char *salt_buf = input_buf + 30 + 1;
10447
10448 char *salt_buf_ptr = (char *) salt->salt_buf;
10449
10450 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10451
10452 // max. salt length: 55 (max for MD5) - 22 (":Administration Tools:") - 1 (0x80) = 32
10453 // 32 - 4 bytes (to fit w0lr for all attack modes) = 28
10454
10455 if (salt_len > 28) return (PARSER_SALT_LENGTH);
10456
10457 salt->salt_len = salt_len;
10458
10459 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
10460
10461 salt->salt_len += 22;
10462
10463 return (PARSER_OK);
10464 }
10465
10466 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10467 {
10468 if (data.opts_type & OPTS_TYPE_ST_HEX)
10469 {
10470 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
10471 }
10472 else
10473 {
10474 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
10475 }
10476
10477 u32 *digest = (u32 *) hash_buf->digest;
10478
10479 salt_t *salt = hash_buf->salt;
10480
10481 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10482 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10483 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10484 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10485 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
10486
10487 digest[0] -= SHA1M_A;
10488 digest[1] -= SHA1M_B;
10489 digest[2] -= SHA1M_C;
10490 digest[3] -= SHA1M_D;
10491 digest[4] -= SHA1M_E;
10492
10493 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10494
10495 uint salt_len = input_len - 40 - 1;
10496
10497 char *salt_buf = input_buf + 40 + 1;
10498
10499 char *salt_buf_ptr = (char *) salt->salt_buf;
10500
10501 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10502
10503 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10504
10505 salt->salt_len = salt_len;
10506
10507 return (PARSER_OK);
10508 }
10509
10510 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10511 {
10512 if (data.opts_type & OPTS_TYPE_ST_HEX)
10513 {
10514 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
10515 }
10516 else
10517 {
10518 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
10519 }
10520
10521 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10522
10523 char *iter_pos = input_buf + 6;
10524
10525 salt_t *salt = hash_buf->salt;
10526
10527 uint iter = atoi (iter_pos);
10528
10529 if (iter < 1)
10530 {
10531 iter = ROUNDS_DCC2;
10532 }
10533
10534 salt->salt_iter = iter - 1;
10535
10536 char *salt_pos = strchr (iter_pos, '#');
10537
10538 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10539
10540 salt_pos++;
10541
10542 char *digest_pos = strchr (salt_pos, '#');
10543
10544 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10545
10546 digest_pos++;
10547
10548 uint salt_len = digest_pos - salt_pos - 1;
10549
10550 u32 *digest = (u32 *) hash_buf->digest;
10551
10552 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
10553 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
10554 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
10555 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
10556
10557 char *salt_buf_ptr = (char *) salt->salt_buf;
10558
10559 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10560
10561 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10562
10563 salt->salt_len = salt_len;
10564
10565 return (PARSER_OK);
10566 }
10567
10568 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10569 {
10570 u32 *digest = (u32 *) hash_buf->digest;
10571
10572 salt_t *salt = hash_buf->salt;
10573
10574 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
10575
10576 hccap_t in;
10577
10578 memcpy (&in, input_buf, input_len);
10579
10580 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
10581
10582 memcpy (digest, in.keymic, 16);
10583
10584 /*
10585 http://www.one-net.eu/jsw/j_sec/m_ptype.html
10586 The phrase "Pairwise key expansion"
10587 Access Point Address (referred to as Authenticator Address AA)
10588 Supplicant Address (referred to as Supplicant Address SA)
10589 Access Point Nonce (referred to as Authenticator Anonce)
10590 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
10591 */
10592
10593 uint salt_len = strlen (in.essid);
10594
10595 if (salt_len > 36)
10596 {
10597 log_info ("WARNING: The ESSID length is too long, the hccap file may be invalid or corrupted");
10598
10599 return (PARSER_SALT_LENGTH);
10600 }
10601
10602 memcpy (salt->salt_buf, in.essid, salt_len);
10603
10604 salt->salt_len = salt_len;
10605
10606 salt->salt_iter = ROUNDS_WPA2 - 1;
10607
10608 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
10609
10610 memcpy (pke_ptr, "Pairwise key expansion", 23);
10611
10612 if (memcmp (in.mac1, in.mac2, 6) < 0)
10613 {
10614 memcpy (pke_ptr + 23, in.mac1, 6);
10615 memcpy (pke_ptr + 29, in.mac2, 6);
10616 }
10617 else
10618 {
10619 memcpy (pke_ptr + 23, in.mac2, 6);
10620 memcpy (pke_ptr + 29, in.mac1, 6);
10621 }
10622
10623 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10624 {
10625 memcpy (pke_ptr + 35, in.nonce1, 32);
10626 memcpy (pke_ptr + 67, in.nonce2, 32);
10627 }
10628 else
10629 {
10630 memcpy (pke_ptr + 35, in.nonce2, 32);
10631 memcpy (pke_ptr + 67, in.nonce1, 32);
10632 }
10633
10634 for (int i = 0; i < 25; i++)
10635 {
10636 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10637 }
10638
10639 memcpy (wpa->orig_mac1, in.mac1, 6);
10640 memcpy (wpa->orig_mac2, in.mac2, 6);
10641 memcpy (wpa->orig_nonce1, in.nonce1, 32);
10642 memcpy (wpa->orig_nonce2, in.nonce2, 32);
10643
10644 wpa->keyver = in.keyver;
10645
10646 if (wpa->keyver > 255)
10647 {
10648 log_info ("ATTENTION!");
10649 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10650 log_info (" This could be due to a recent aircrack-ng bug.");
10651 log_info (" The key version was automatically reset to a reasonable value.");
10652 log_info ("");
10653
10654 wpa->keyver &= 0xff;
10655 }
10656
10657 wpa->eapol_size = in.eapol_size;
10658
10659 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10660
10661 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10662
10663 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10664
10665 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10666
10667 if (wpa->keyver == 1)
10668 {
10669 // nothing to do
10670 }
10671 else
10672 {
10673 digest[0] = byte_swap_32 (digest[0]);
10674 digest[1] = byte_swap_32 (digest[1]);
10675 digest[2] = byte_swap_32 (digest[2]);
10676 digest[3] = byte_swap_32 (digest[3]);
10677
10678 for (int i = 0; i < 64; i++)
10679 {
10680 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10681 }
10682 }
10683
10684 uint32_t *p0 = (uint32_t *) in.essid;
10685 uint32_t c0 = 0;
10686 uint32_t c1 = 0;
10687
10688 for (uint i = 0; i < sizeof (in.essid) / sizeof (uint32_t); i++) c0 ^= *p0++;
10689 for (uint i = 0; i < sizeof (wpa->pke) / sizeof (wpa->pke[0]); i++) c1 ^= wpa->pke[i];
10690
10691 salt->salt_buf[10] = c0;
10692 salt->salt_buf[11] = c1;
10693
10694 return (PARSER_OK);
10695 }
10696
10697 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10698 {
10699 u32 *digest = (u32 *) hash_buf->digest;
10700
10701 salt_t *salt = hash_buf->salt;
10702
10703 if (input_len == 0)
10704 {
10705 log_error ("Password Safe v2 container not specified");
10706
10707 exit (-1);
10708 }
10709
10710 FILE *fp = fopen (input_buf, "rb");
10711
10712 if (fp == NULL)
10713 {
10714 log_error ("%s: %s", input_buf, strerror (errno));
10715
10716 exit (-1);
10717 }
10718
10719 psafe2_hdr buf;
10720
10721 memset (&buf, 0, sizeof (psafe2_hdr));
10722
10723 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10724
10725 fclose (fp);
10726
10727 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10728
10729 salt->salt_buf[0] = buf.random[0];
10730 salt->salt_buf[1] = buf.random[1];
10731
10732 salt->salt_len = 8;
10733 salt->salt_iter = 1000;
10734
10735 digest[0] = byte_swap_32 (buf.hash[0]);
10736 digest[1] = byte_swap_32 (buf.hash[1]);
10737 digest[2] = byte_swap_32 (buf.hash[2]);
10738 digest[3] = byte_swap_32 (buf.hash[3]);
10739 digest[4] = byte_swap_32 (buf.hash[4]);
10740
10741 return (PARSER_OK);
10742 }
10743
10744 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10745 {
10746 u32 *digest = (u32 *) hash_buf->digest;
10747
10748 salt_t *salt = hash_buf->salt;
10749
10750 if (input_len == 0)
10751 {
10752 log_error (".psafe3 not specified");
10753
10754 exit (-1);
10755 }
10756
10757 FILE *fp = fopen (input_buf, "rb");
10758
10759 if (fp == NULL)
10760 {
10761 log_error ("%s: %s", input_buf, strerror (errno));
10762
10763 exit (-1);
10764 }
10765
10766 psafe3_t in;
10767
10768 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10769
10770 fclose (fp);
10771
10772 data.hashfile = input_buf; // we will need this in case it gets cracked
10773
10774 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10775
10776 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10777
10778 salt->salt_iter = in.iterations + 1;
10779
10780 salt->salt_buf[0] = in.salt_buf[0];
10781 salt->salt_buf[1] = in.salt_buf[1];
10782 salt->salt_buf[2] = in.salt_buf[2];
10783 salt->salt_buf[3] = in.salt_buf[3];
10784 salt->salt_buf[4] = in.salt_buf[4];
10785 salt->salt_buf[5] = in.salt_buf[5];
10786 salt->salt_buf[6] = in.salt_buf[6];
10787 salt->salt_buf[7] = in.salt_buf[7];
10788
10789 salt->salt_len = 32;
10790
10791 digest[0] = in.hash_buf[0];
10792 digest[1] = in.hash_buf[1];
10793 digest[2] = in.hash_buf[2];
10794 digest[3] = in.hash_buf[3];
10795 digest[4] = in.hash_buf[4];
10796 digest[5] = in.hash_buf[5];
10797 digest[6] = in.hash_buf[6];
10798 digest[7] = in.hash_buf[7];
10799
10800 digest[0] = byte_swap_32 (digest[0]);
10801 digest[1] = byte_swap_32 (digest[1]);
10802 digest[2] = byte_swap_32 (digest[2]);
10803 digest[3] = byte_swap_32 (digest[3]);
10804 digest[4] = byte_swap_32 (digest[4]);
10805 digest[5] = byte_swap_32 (digest[5]);
10806 digest[6] = byte_swap_32 (digest[6]);
10807 digest[7] = byte_swap_32 (digest[7]);
10808
10809 return (PARSER_OK);
10810 }
10811
10812 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10813 {
10814 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10815
10816 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10817
10818 u32 *digest = (u32 *) hash_buf->digest;
10819
10820 salt_t *salt = hash_buf->salt;
10821
10822 char *iter_pos = input_buf + 3;
10823
10824 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10825
10826 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10827
10828 memcpy ((char *) salt->salt_sign, input_buf, 4);
10829
10830 salt->salt_iter = salt_iter;
10831
10832 char *salt_pos = iter_pos + 1;
10833
10834 uint salt_len = 8;
10835
10836 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10837
10838 salt->salt_len = salt_len;
10839
10840 char *hash_pos = salt_pos + salt_len;
10841
10842 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10843
10844 return (PARSER_OK);
10845 }
10846
10847 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10848 {
10849 if (input_len < DISPLAY_LEN_MIN_500) return (PARSER_GLOBAL_LENGTH);
10850
10851 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10852
10853 u32 *digest = (u32 *) hash_buf->digest;
10854
10855 salt_t *salt = hash_buf->salt;
10856
10857 char *salt_pos = input_buf + 3;
10858
10859 uint iterations_len = 0;
10860
10861 if (memcmp (salt_pos, "rounds=", 7) == 0)
10862 {
10863 salt_pos += 7;
10864
10865 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10866
10867 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10868 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10869
10870 salt_pos[0] = 0x0;
10871
10872 salt->salt_iter = atoi (salt_pos - iterations_len);
10873
10874 salt_pos += 1;
10875
10876 iterations_len += 8;
10877 }
10878 else
10879 {
10880 salt->salt_iter = ROUNDS_MD5CRYPT;
10881 }
10882
10883 if (input_len > (DISPLAY_LEN_MAX_500 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10884
10885 char *hash_pos = strchr (salt_pos, '$');
10886
10887 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10888
10889 uint salt_len = hash_pos - salt_pos;
10890
10891 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10892
10893 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10894
10895 salt->salt_len = salt_len;
10896
10897 hash_pos++;
10898
10899 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10900
10901 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10902
10903 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10904
10905 return (PARSER_OK);
10906 }
10907
10908 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10909 {
10910 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10911
10912 u32 *digest = (u32 *) hash_buf->digest;
10913
10914 salt_t *salt = hash_buf->salt;
10915
10916 char *salt_pos = input_buf + 6;
10917
10918 uint iterations_len = 0;
10919
10920 if (memcmp (salt_pos, "rounds=", 7) == 0)
10921 {
10922 salt_pos += 7;
10923
10924 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10925
10926 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10927 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10928
10929 salt_pos[0] = 0x0;
10930
10931 salt->salt_iter = atoi (salt_pos - iterations_len);
10932
10933 salt_pos += 1;
10934
10935 iterations_len += 8;
10936 }
10937 else
10938 {
10939 salt->salt_iter = ROUNDS_MD5CRYPT;
10940 }
10941
10942 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10943
10944 char *hash_pos = strchr (salt_pos, '$');
10945
10946 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10947
10948 uint salt_len = hash_pos - salt_pos;
10949
10950 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10951
10952 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10953
10954 salt->salt_len = salt_len;
10955
10956 hash_pos++;
10957
10958 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10959
10960 return (PARSER_OK);
10961 }
10962
10963 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10964 {
10965 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10966
10967 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10968
10969 u32 *digest = (u32 *) hash_buf->digest;
10970
10971 salt_t *salt = hash_buf->salt;
10972
10973 char *salt_pos = input_buf + 14;
10974
10975 char *hash_pos = strchr (salt_pos, '*');
10976
10977 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10978
10979 hash_pos++;
10980
10981 uint salt_len = hash_pos - salt_pos - 1;
10982
10983 char *salt_buf_ptr = (char *) salt->salt_buf;
10984
10985 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10986
10987 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10988
10989 salt->salt_len = salt_len;
10990
10991 u8 tmp_buf[100] = { 0 };
10992
10993 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10994
10995 memcpy (digest, tmp_buf, 20);
10996
10997 digest[0] = byte_swap_32 (digest[0]);
10998 digest[1] = byte_swap_32 (digest[1]);
10999 digest[2] = byte_swap_32 (digest[2]);
11000 digest[3] = byte_swap_32 (digest[3]);
11001 digest[4] = byte_swap_32 (digest[4]);
11002
11003 digest[0] -= SHA1M_A;
11004 digest[1] -= SHA1M_B;
11005 digest[2] -= SHA1M_C;
11006 digest[3] -= SHA1M_D;
11007 digest[4] -= SHA1M_E;
11008
11009 return (PARSER_OK);
11010 }
11011
11012 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11013 {
11014 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
11015
11016 unsigned char c12 = itoa64_to_int (input_buf[12]);
11017
11018 if (c12 & 3) return (PARSER_HASH_VALUE);
11019
11020 u32 *digest = (u32 *) hash_buf->digest;
11021
11022 salt_t *salt = hash_buf->salt;
11023
11024 // for ascii_digest
11025 salt->salt_sign[0] = input_buf[0];
11026 salt->salt_sign[1] = input_buf[1];
11027
11028 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
11029 | itoa64_to_int (input_buf[1]) << 6;
11030
11031 salt->salt_len = 2;
11032
11033 u8 tmp_buf[100] = { 0 };
11034
11035 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
11036
11037 memcpy (digest, tmp_buf, 8);
11038
11039 uint tt;
11040
11041 IP (digest[0], digest[1], tt);
11042
11043 digest[2] = 0;
11044 digest[3] = 0;
11045
11046 return (PARSER_OK);
11047 }
11048
11049 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11050 {
11051 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
11052
11053 u32 *digest = (u32 *) hash_buf->digest;
11054
11055 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11056 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11057 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11058 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11059
11060 digest[0] = byte_swap_32 (digest[0]);
11061 digest[1] = byte_swap_32 (digest[1]);
11062 digest[2] = byte_swap_32 (digest[2]);
11063 digest[3] = byte_swap_32 (digest[3]);
11064
11065 digest[0] -= MD4M_A;
11066 digest[1] -= MD4M_B;
11067 digest[2] -= MD4M_C;
11068 digest[3] -= MD4M_D;
11069
11070 return (PARSER_OK);
11071 }
11072
11073 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11074 {
11075 if (data.opts_type & OPTS_TYPE_ST_HEX)
11076 {
11077 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
11078 }
11079 else
11080 {
11081 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
11082 }
11083
11084 u32 *digest = (u32 *) hash_buf->digest;
11085
11086 salt_t *salt = hash_buf->salt;
11087
11088 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11089 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11090 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11091 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11092
11093 digest[0] = byte_swap_32 (digest[0]);
11094 digest[1] = byte_swap_32 (digest[1]);
11095 digest[2] = byte_swap_32 (digest[2]);
11096 digest[3] = byte_swap_32 (digest[3]);
11097
11098 digest[0] -= MD4M_A;
11099 digest[1] -= MD4M_B;
11100 digest[2] -= MD4M_C;
11101 digest[3] -= MD4M_D;
11102
11103 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11104
11105 uint salt_len = input_len - 32 - 1;
11106
11107 char *salt_buf = input_buf + 32 + 1;
11108
11109 char *salt_buf_ptr = (char *) salt->salt_buf;
11110
11111 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11112
11113 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11114
11115 salt->salt_len = salt_len;
11116
11117 return (PARSER_OK);
11118 }
11119
11120 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11121 {
11122 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
11123
11124 u32 *digest = (u32 *) hash_buf->digest;
11125
11126 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11127 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11128 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11129 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11130
11131 digest[0] = byte_swap_32 (digest[0]);
11132 digest[1] = byte_swap_32 (digest[1]);
11133 digest[2] = byte_swap_32 (digest[2]);
11134 digest[3] = byte_swap_32 (digest[3]);
11135
11136 digest[0] -= MD5M_A;
11137 digest[1] -= MD5M_B;
11138 digest[2] -= MD5M_C;
11139 digest[3] -= MD5M_D;
11140
11141 return (PARSER_OK);
11142 }
11143
11144 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11145 {
11146 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
11147
11148 u32 *digest = (u32 *) hash_buf->digest;
11149
11150 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
11151 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
11152 digest[2] = 0;
11153 digest[3] = 0;
11154
11155 digest[0] = byte_swap_32 (digest[0]);
11156 digest[1] = byte_swap_32 (digest[1]);
11157
11158 return (PARSER_OK);
11159 }
11160
11161 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11162 {
11163 if (data.opts_type & OPTS_TYPE_ST_HEX)
11164 {
11165 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
11166 }
11167 else
11168 {
11169 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
11170 }
11171
11172 u32 *digest = (u32 *) hash_buf->digest;
11173
11174 salt_t *salt = hash_buf->salt;
11175
11176 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11177 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11178 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11179 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11180
11181 digest[0] = byte_swap_32 (digest[0]);
11182 digest[1] = byte_swap_32 (digest[1]);
11183 digest[2] = byte_swap_32 (digest[2]);
11184 digest[3] = byte_swap_32 (digest[3]);
11185
11186 digest[0] -= MD5M_A;
11187 digest[1] -= MD5M_B;
11188 digest[2] -= MD5M_C;
11189 digest[3] -= MD5M_D;
11190
11191 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11192
11193 uint salt_len = input_len - 32 - 1;
11194
11195 char *salt_buf = input_buf + 32 + 1;
11196
11197 char *salt_buf_ptr = (char *) salt->salt_buf;
11198
11199 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11200
11201 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11202
11203 salt->salt_len = salt_len;
11204
11205 return (PARSER_OK);
11206 }
11207
11208 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11209 {
11210 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
11211
11212 u32 *digest = (u32 *) hash_buf->digest;
11213
11214 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11215 | itoa64_to_int (input_buf[ 1]) << 6
11216 | itoa64_to_int (input_buf[ 2]) << 12
11217 | itoa64_to_int (input_buf[ 3]) << 18;
11218 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11219 | itoa64_to_int (input_buf[ 5]) << 6
11220 | itoa64_to_int (input_buf[ 6]) << 12
11221 | itoa64_to_int (input_buf[ 7]) << 18;
11222 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11223 | itoa64_to_int (input_buf[ 9]) << 6
11224 | itoa64_to_int (input_buf[10]) << 12
11225 | itoa64_to_int (input_buf[11]) << 18;
11226 digest[3] = itoa64_to_int (input_buf[12]) << 0
11227 | itoa64_to_int (input_buf[13]) << 6
11228 | itoa64_to_int (input_buf[14]) << 12
11229 | itoa64_to_int (input_buf[15]) << 18;
11230
11231 digest[0] -= MD5M_A;
11232 digest[1] -= MD5M_B;
11233 digest[2] -= MD5M_C;
11234 digest[3] -= MD5M_D;
11235
11236 digest[0] &= 0x00ffffff;
11237 digest[1] &= 0x00ffffff;
11238 digest[2] &= 0x00ffffff;
11239 digest[3] &= 0x00ffffff;
11240
11241 return (PARSER_OK);
11242 }
11243
11244 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11245 {
11246 if (data.opts_type & OPTS_TYPE_ST_HEX)
11247 {
11248 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
11249 }
11250 else
11251 {
11252 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
11253 }
11254
11255 u32 *digest = (u32 *) hash_buf->digest;
11256
11257 salt_t *salt = hash_buf->salt;
11258
11259 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11260 | itoa64_to_int (input_buf[ 1]) << 6
11261 | itoa64_to_int (input_buf[ 2]) << 12
11262 | itoa64_to_int (input_buf[ 3]) << 18;
11263 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11264 | itoa64_to_int (input_buf[ 5]) << 6
11265 | itoa64_to_int (input_buf[ 6]) << 12
11266 | itoa64_to_int (input_buf[ 7]) << 18;
11267 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11268 | itoa64_to_int (input_buf[ 9]) << 6
11269 | itoa64_to_int (input_buf[10]) << 12
11270 | itoa64_to_int (input_buf[11]) << 18;
11271 digest[3] = itoa64_to_int (input_buf[12]) << 0
11272 | itoa64_to_int (input_buf[13]) << 6
11273 | itoa64_to_int (input_buf[14]) << 12
11274 | itoa64_to_int (input_buf[15]) << 18;
11275
11276 digest[0] -= MD5M_A;
11277 digest[1] -= MD5M_B;
11278 digest[2] -= MD5M_C;
11279 digest[3] -= MD5M_D;
11280
11281 digest[0] &= 0x00ffffff;
11282 digest[1] &= 0x00ffffff;
11283 digest[2] &= 0x00ffffff;
11284 digest[3] &= 0x00ffffff;
11285
11286 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11287
11288 uint salt_len = input_len - 16 - 1;
11289
11290 char *salt_buf = input_buf + 16 + 1;
11291
11292 char *salt_buf_ptr = (char *) salt->salt_buf;
11293
11294 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11295
11296 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11297
11298 salt->salt_len = salt_len;
11299
11300 return (PARSER_OK);
11301 }
11302
11303 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
11304 {
11305 key[0] = (nthash[0] >> 0);
11306 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
11307 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
11308 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
11309 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
11310 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
11311 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
11312 key[7] = (nthash[6] << 1);
11313
11314 key[0] |= 0x01;
11315 key[1] |= 0x01;
11316 key[2] |= 0x01;
11317 key[3] |= 0x01;
11318 key[4] |= 0x01;
11319 key[5] |= 0x01;
11320 key[6] |= 0x01;
11321 key[7] |= 0x01;
11322 }
11323
11324 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11325 {
11326 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
11327
11328 u32 *digest = (u32 *) hash_buf->digest;
11329
11330 salt_t *salt = hash_buf->salt;
11331
11332 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11333
11334 /**
11335 * parse line
11336 */
11337
11338 char *user_pos = input_buf;
11339
11340 char *unused_pos = strchr (user_pos, ':');
11341
11342 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11343
11344 uint user_len = unused_pos - user_pos;
11345
11346 if (user_len > 60) return (PARSER_SALT_LENGTH);
11347
11348 unused_pos++;
11349
11350 char *domain_pos = strchr (unused_pos, ':');
11351
11352 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11353
11354 uint unused_len = domain_pos - unused_pos;
11355
11356 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11357
11358 domain_pos++;
11359
11360 char *srvchall_pos = strchr (domain_pos, ':');
11361
11362 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11363
11364 uint domain_len = srvchall_pos - domain_pos;
11365
11366 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11367
11368 srvchall_pos++;
11369
11370 char *hash_pos = strchr (srvchall_pos, ':');
11371
11372 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11373
11374 uint srvchall_len = hash_pos - srvchall_pos;
11375
11376 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
11377
11378 hash_pos++;
11379
11380 char *clichall_pos = strchr (hash_pos, ':');
11381
11382 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11383
11384 uint hash_len = clichall_pos - hash_pos;
11385
11386 if (hash_len != 48) return (PARSER_HASH_LENGTH);
11387
11388 clichall_pos++;
11389
11390 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11391
11392 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
11393
11394 /**
11395 * store some data for later use
11396 */
11397
11398 netntlm->user_len = user_len * 2;
11399 netntlm->domain_len = domain_len * 2;
11400 netntlm->srvchall_len = srvchall_len / 2;
11401 netntlm->clichall_len = clichall_len / 2;
11402
11403 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11404 char *chall_ptr = (char *) netntlm->chall_buf;
11405
11406 /**
11407 * handle username and domainname
11408 */
11409
11410 for (uint i = 0; i < user_len; i++)
11411 {
11412 *userdomain_ptr++ = user_pos[i];
11413 *userdomain_ptr++ = 0;
11414 }
11415
11416 for (uint i = 0; i < domain_len; i++)
11417 {
11418 *userdomain_ptr++ = domain_pos[i];
11419 *userdomain_ptr++ = 0;
11420 }
11421
11422 /**
11423 * handle server challenge encoding
11424 */
11425
11426 for (uint i = 0; i < srvchall_len; i += 2)
11427 {
11428 const char p0 = srvchall_pos[i + 0];
11429 const char p1 = srvchall_pos[i + 1];
11430
11431 *chall_ptr++ = hex_convert (p1) << 0
11432 | hex_convert (p0) << 4;
11433 }
11434
11435 /**
11436 * handle client challenge encoding
11437 */
11438
11439 for (uint i = 0; i < clichall_len; i += 2)
11440 {
11441 const char p0 = clichall_pos[i + 0];
11442 const char p1 = clichall_pos[i + 1];
11443
11444 *chall_ptr++ = hex_convert (p1) << 0
11445 | hex_convert (p0) << 4;
11446 }
11447
11448 /**
11449 * store data
11450 */
11451
11452 char *salt_buf_ptr = (char *) salt->salt_buf;
11453
11454 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
11455
11456 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11457
11458 salt->salt_len = salt_len;
11459
11460 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11461 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11462 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11463 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11464
11465 digest[0] = byte_swap_32 (digest[0]);
11466 digest[1] = byte_swap_32 (digest[1]);
11467 digest[2] = byte_swap_32 (digest[2]);
11468 digest[3] = byte_swap_32 (digest[3]);
11469
11470 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
11471
11472 uint digest_tmp[2] = { 0 };
11473
11474 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11475 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
11476
11477 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
11478 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
11479
11480 /* special case 2: ESS */
11481
11482 if (srvchall_len == 48)
11483 {
11484 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
11485 {
11486 uint w[16] = { 0 };
11487
11488 w[ 0] = netntlm->chall_buf[6];
11489 w[ 1] = netntlm->chall_buf[7];
11490 w[ 2] = netntlm->chall_buf[0];
11491 w[ 3] = netntlm->chall_buf[1];
11492 w[ 4] = 0x80;
11493 w[14] = 16 * 8;
11494
11495 uint dgst[4] = { 0 };
11496
11497 dgst[0] = MAGIC_A;
11498 dgst[1] = MAGIC_B;
11499 dgst[2] = MAGIC_C;
11500 dgst[3] = MAGIC_D;
11501
11502 md5_64 (w, dgst);
11503
11504 salt->salt_buf[0] = dgst[0];
11505 salt->salt_buf[1] = dgst[1];
11506 }
11507 }
11508
11509 /* precompute netntlmv1 exploit start */
11510
11511 for (uint i = 0; i < 0x10000; i++)
11512 {
11513 uint key_md4[2] = { i, 0 };
11514 uint key_des[2] = { 0, 0 };
11515
11516 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
11517
11518 uint Kc[16] = { 0 };
11519 uint Kd[16] = { 0 };
11520
11521 _des_keysetup (key_des, Kc, Kd, c_skb);
11522
11523 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
11524
11525 _des_encrypt (data3, Kc, Kd, c_SPtrans);
11526
11527 if (data3[0] != digest_tmp[0]) continue;
11528 if (data3[1] != digest_tmp[1]) continue;
11529
11530 salt->salt_buf[2] = i;
11531
11532 salt->salt_len = 24;
11533
11534 break;
11535 }
11536
11537 salt->salt_buf_pc[0] = digest_tmp[0];
11538 salt->salt_buf_pc[1] = digest_tmp[1];
11539
11540 /* precompute netntlmv1 exploit stop */
11541
11542 u32 tt;
11543
11544 IP (digest[0], digest[1], tt);
11545 IP (digest[2], digest[3], tt);
11546
11547 digest[0] = rotr32 (digest[0], 29);
11548 digest[1] = rotr32 (digest[1], 29);
11549 digest[2] = rotr32 (digest[2], 29);
11550 digest[3] = rotr32 (digest[3], 29);
11551
11552 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
11553
11554 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
11555 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
11556
11557 return (PARSER_OK);
11558 }
11559
11560 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11561 {
11562 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
11563
11564 u32 *digest = (u32 *) hash_buf->digest;
11565
11566 salt_t *salt = hash_buf->salt;
11567
11568 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11569
11570 /**
11571 * parse line
11572 */
11573
11574 char *user_pos = input_buf;
11575
11576 char *unused_pos = strchr (user_pos, ':');
11577
11578 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11579
11580 uint user_len = unused_pos - user_pos;
11581
11582 if (user_len > 60) return (PARSER_SALT_LENGTH);
11583
11584 unused_pos++;
11585
11586 char *domain_pos = strchr (unused_pos, ':');
11587
11588 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11589
11590 uint unused_len = domain_pos - unused_pos;
11591
11592 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11593
11594 domain_pos++;
11595
11596 char *srvchall_pos = strchr (domain_pos, ':');
11597
11598 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11599
11600 uint domain_len = srvchall_pos - domain_pos;
11601
11602 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11603
11604 srvchall_pos++;
11605
11606 char *hash_pos = strchr (srvchall_pos, ':');
11607
11608 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11609
11610 uint srvchall_len = hash_pos - srvchall_pos;
11611
11612 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
11613
11614 hash_pos++;
11615
11616 char *clichall_pos = strchr (hash_pos, ':');
11617
11618 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11619
11620 uint hash_len = clichall_pos - hash_pos;
11621
11622 if (hash_len != 32) return (PARSER_HASH_LENGTH);
11623
11624 clichall_pos++;
11625
11626 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11627
11628 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
11629
11630 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11631
11632 /**
11633 * store some data for later use
11634 */
11635
11636 netntlm->user_len = user_len * 2;
11637 netntlm->domain_len = domain_len * 2;
11638 netntlm->srvchall_len = srvchall_len / 2;
11639 netntlm->clichall_len = clichall_len / 2;
11640
11641 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11642 char *chall_ptr = (char *) netntlm->chall_buf;
11643
11644 /**
11645 * handle username and domainname
11646 */
11647
11648 for (uint i = 0; i < user_len; i++)
11649 {
11650 *userdomain_ptr++ = toupper (user_pos[i]);
11651 *userdomain_ptr++ = 0;
11652 }
11653
11654 for (uint i = 0; i < domain_len; i++)
11655 {
11656 *userdomain_ptr++ = domain_pos[i];
11657 *userdomain_ptr++ = 0;
11658 }
11659
11660 *userdomain_ptr++ = 0x80;
11661
11662 /**
11663 * handle server challenge encoding
11664 */
11665
11666 for (uint i = 0; i < srvchall_len; i += 2)
11667 {
11668 const char p0 = srvchall_pos[i + 0];
11669 const char p1 = srvchall_pos[i + 1];
11670
11671 *chall_ptr++ = hex_convert (p1) << 0
11672 | hex_convert (p0) << 4;
11673 }
11674
11675 /**
11676 * handle client challenge encoding
11677 */
11678
11679 for (uint i = 0; i < clichall_len; i += 2)
11680 {
11681 const char p0 = clichall_pos[i + 0];
11682 const char p1 = clichall_pos[i + 1];
11683
11684 *chall_ptr++ = hex_convert (p1) << 0
11685 | hex_convert (p0) << 4;
11686 }
11687
11688 *chall_ptr++ = 0x80;
11689
11690 /**
11691 * handle hash itself
11692 */
11693
11694 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11695 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11696 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11697 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11698
11699 digest[0] = byte_swap_32 (digest[0]);
11700 digest[1] = byte_swap_32 (digest[1]);
11701 digest[2] = byte_swap_32 (digest[2]);
11702 digest[3] = byte_swap_32 (digest[3]);
11703
11704 /**
11705 * reuse challange data as salt_buf, its the buffer that is most likely unique
11706 */
11707
11708 salt->salt_buf[0] = 0;
11709 salt->salt_buf[1] = 0;
11710 salt->salt_buf[2] = 0;
11711 salt->salt_buf[3] = 0;
11712 salt->salt_buf[4] = 0;
11713 salt->salt_buf[5] = 0;
11714 salt->salt_buf[6] = 0;
11715 salt->salt_buf[7] = 0;
11716
11717 uint *uptr;
11718
11719 uptr = (uint *) netntlm->userdomain_buf;
11720
11721 for (uint i = 0; i < 16; i += 16)
11722 {
11723 md5_64 (uptr, salt->salt_buf);
11724 }
11725
11726 uptr = (uint *) netntlm->chall_buf;
11727
11728 for (uint i = 0; i < 256; i += 16)
11729 {
11730 md5_64 (uptr, salt->salt_buf);
11731 }
11732
11733 salt->salt_len = 16;
11734
11735 return (PARSER_OK);
11736 }
11737
11738 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11739 {
11740 if (data.opts_type & OPTS_TYPE_ST_HEX)
11741 {
11742 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11743 }
11744 else
11745 {
11746 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11747 }
11748
11749 u32 *digest = (u32 *) hash_buf->digest;
11750
11751 salt_t *salt = hash_buf->salt;
11752
11753 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11754 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11755 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11756 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11757
11758 digest[0] = byte_swap_32 (digest[0]);
11759 digest[1] = byte_swap_32 (digest[1]);
11760 digest[2] = byte_swap_32 (digest[2]);
11761 digest[3] = byte_swap_32 (digest[3]);
11762
11763 digest[0] -= MD5M_A;
11764 digest[1] -= MD5M_B;
11765 digest[2] -= MD5M_C;
11766 digest[3] -= MD5M_D;
11767
11768 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11769
11770 uint salt_len = input_len - 32 - 1;
11771
11772 char *salt_buf = input_buf + 32 + 1;
11773
11774 char *salt_buf_ptr = (char *) salt->salt_buf;
11775
11776 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11777
11778 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11779
11780 salt->salt_len = salt_len;
11781
11782 return (PARSER_OK);
11783 }
11784
11785 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11786 {
11787 if (data.opts_type & OPTS_TYPE_ST_HEX)
11788 {
11789 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11790 }
11791 else
11792 {
11793 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11794 }
11795
11796 u32 *digest = (u32 *) hash_buf->digest;
11797
11798 salt_t *salt = hash_buf->salt;
11799
11800 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11801 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11802 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11803 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11804
11805 digest[0] = byte_swap_32 (digest[0]);
11806 digest[1] = byte_swap_32 (digest[1]);
11807 digest[2] = byte_swap_32 (digest[2]);
11808 digest[3] = byte_swap_32 (digest[3]);
11809
11810 digest[0] -= MD5M_A;
11811 digest[1] -= MD5M_B;
11812 digest[2] -= MD5M_C;
11813 digest[3] -= MD5M_D;
11814
11815 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11816
11817 uint salt_len = input_len - 32 - 1;
11818
11819 char *salt_buf = input_buf + 32 + 1;
11820
11821 char *salt_buf_ptr = (char *) salt->salt_buf;
11822
11823 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11824
11825 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11826
11827 salt->salt_len = salt_len;
11828
11829 return (PARSER_OK);
11830 }
11831
11832 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11833 {
11834 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11835
11836 u32 *digest = (u32 *) hash_buf->digest;
11837
11838 salt_t *salt = hash_buf->salt;
11839
11840 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11841 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11842 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11843 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11844
11845 digest[0] = byte_swap_32 (digest[0]);
11846 digest[1] = byte_swap_32 (digest[1]);
11847 digest[2] = byte_swap_32 (digest[2]);
11848 digest[3] = byte_swap_32 (digest[3]);
11849
11850 digest[0] -= MD5M_A;
11851 digest[1] -= MD5M_B;
11852 digest[2] -= MD5M_C;
11853 digest[3] -= MD5M_D;
11854
11855 /**
11856 * This is a virtual salt. While the algorithm is basically not salted
11857 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11858 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11859 */
11860
11861 char *salt_buf_ptr = (char *) salt->salt_buf;
11862
11863 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11864
11865 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11866
11867 salt->salt_len = salt_len;
11868
11869 return (PARSER_OK);
11870 }
11871
11872 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11873 {
11874 if (data.opts_type & OPTS_TYPE_ST_HEX)
11875 {
11876 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11877 }
11878 else
11879 {
11880 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11881 }
11882
11883 u32 *digest = (u32 *) hash_buf->digest;
11884
11885 salt_t *salt = hash_buf->salt;
11886
11887 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11888 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11889 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11890 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11891
11892 digest[0] = byte_swap_32 (digest[0]);
11893 digest[1] = byte_swap_32 (digest[1]);
11894 digest[2] = byte_swap_32 (digest[2]);
11895 digest[3] = byte_swap_32 (digest[3]);
11896
11897 digest[0] -= MD5M_A;
11898 digest[1] -= MD5M_B;
11899 digest[2] -= MD5M_C;
11900 digest[3] -= MD5M_D;
11901
11902 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11903
11904 uint salt_len = input_len - 32 - 1;
11905
11906 char *salt_buf = input_buf + 32 + 1;
11907
11908 char *salt_buf_ptr = (char *) salt->salt_buf;
11909
11910 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11911
11912 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11913
11914 salt->salt_len = salt_len;
11915
11916 return (PARSER_OK);
11917 }
11918
11919 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11920 {
11921 if (data.opts_type & OPTS_TYPE_ST_HEX)
11922 {
11923 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11924 }
11925 else
11926 {
11927 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11928 }
11929
11930 u32 *digest = (u32 *) hash_buf->digest;
11931
11932 salt_t *salt = hash_buf->salt;
11933
11934 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11935 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11936 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11937 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11938
11939 digest[0] = byte_swap_32 (digest[0]);
11940 digest[1] = byte_swap_32 (digest[1]);
11941 digest[2] = byte_swap_32 (digest[2]);
11942 digest[3] = byte_swap_32 (digest[3]);
11943
11944 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11945
11946 uint salt_len = input_len - 32 - 1;
11947
11948 char *salt_buf = input_buf + 32 + 1;
11949
11950 char *salt_buf_ptr = (char *) salt->salt_buf;
11951
11952 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11953
11954 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11955
11956 salt->salt_len = salt_len;
11957
11958 return (PARSER_OK);
11959 }
11960
11961 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11962 {
11963 if (data.opts_type & OPTS_TYPE_ST_HEX)
11964 {
11965 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11966 }
11967 else
11968 {
11969 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11970 }
11971
11972 u32 *digest = (u32 *) hash_buf->digest;
11973
11974 salt_t *salt = hash_buf->salt;
11975
11976 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11977 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11978 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11979 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11980
11981 digest[0] = byte_swap_32 (digest[0]);
11982 digest[1] = byte_swap_32 (digest[1]);
11983 digest[2] = byte_swap_32 (digest[2]);
11984 digest[3] = byte_swap_32 (digest[3]);
11985
11986 digest[0] -= MD4M_A;
11987 digest[1] -= MD4M_B;
11988 digest[2] -= MD4M_C;
11989 digest[3] -= MD4M_D;
11990
11991 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11992
11993 uint salt_len = input_len - 32 - 1;
11994
11995 char *salt_buf = input_buf + 32 + 1;
11996
11997 char *salt_buf_ptr = (char *) salt->salt_buf;
11998
11999 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12000
12001 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12002
12003 salt->salt_len = salt_len;
12004
12005 return (PARSER_OK);
12006 }
12007
12008 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12009 {
12010 if (data.opts_type & OPTS_TYPE_ST_HEX)
12011 {
12012 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
12013 }
12014 else
12015 {
12016 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
12017 }
12018
12019 u32 *digest = (u32 *) hash_buf->digest;
12020
12021 salt_t *salt = hash_buf->salt;
12022
12023 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12024 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12025 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12026 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12027
12028 digest[0] = byte_swap_32 (digest[0]);
12029 digest[1] = byte_swap_32 (digest[1]);
12030 digest[2] = byte_swap_32 (digest[2]);
12031 digest[3] = byte_swap_32 (digest[3]);
12032
12033 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12034
12035 uint salt_len = input_len - 32 - 1;
12036
12037 char *salt_buf = input_buf + 32 + 1;
12038
12039 uint salt_pc_block[16] = { 0 };
12040
12041 char *salt_pc_block_ptr = (char *) salt_pc_block;
12042
12043 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
12044
12045 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12046
12047 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
12048
12049 salt_pc_block[14] = salt_len * 8;
12050
12051 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
12052
12053 md5_64 (salt_pc_block, salt_pc_digest);
12054
12055 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
12056 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
12057 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
12058 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
12059
12060 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
12061
12062 memcpy (salt_buf_ptr, salt_buf, salt_len);
12063
12064 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
12065
12066 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
12067 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
12068 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
12069 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
12070
12071 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
12072
12073 return (PARSER_OK);
12074 }
12075
12076 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12077 {
12078 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
12079
12080 u32 *digest = (u32 *) hash_buf->digest;
12081
12082 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12083 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12084 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12085 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12086 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12087
12088 digest[0] -= SHA1M_A;
12089 digest[1] -= SHA1M_B;
12090 digest[2] -= SHA1M_C;
12091 digest[3] -= SHA1M_D;
12092 digest[4] -= SHA1M_E;
12093
12094 return (PARSER_OK);
12095 }
12096
12097 int sha1axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12098 {
12099 if ((input_len < DISPLAY_LEN_MIN_13300) || (input_len > DISPLAY_LEN_MAX_13300)) return (PARSER_GLOBAL_LENGTH);
12100
12101 if (memcmp (SIGNATURE_AXCRYPT_SHA1, input_buf, 13)) return (PARSER_SIGNATURE_UNMATCHED);
12102
12103 u32 *digest = (u32 *) hash_buf->digest;
12104
12105 input_buf += 14;
12106
12107 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12108 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12109 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12110 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12111 digest[4] = 0;
12112
12113 return (PARSER_OK);
12114 }
12115
12116 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12117 {
12118 if (data.opts_type & OPTS_TYPE_ST_HEX)
12119 {
12120 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
12121 }
12122 else
12123 {
12124 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
12125 }
12126
12127 u32 *digest = (u32 *) hash_buf->digest;
12128
12129 salt_t *salt = hash_buf->salt;
12130
12131 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12132 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12133 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12134 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12135 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12136
12137 digest[0] -= SHA1M_A;
12138 digest[1] -= SHA1M_B;
12139 digest[2] -= SHA1M_C;
12140 digest[3] -= SHA1M_D;
12141 digest[4] -= SHA1M_E;
12142
12143 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12144
12145 uint salt_len = input_len - 40 - 1;
12146
12147 char *salt_buf = input_buf + 40 + 1;
12148
12149 char *salt_buf_ptr = (char *) salt->salt_buf;
12150
12151 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12152
12153 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12154
12155 salt->salt_len = salt_len;
12156
12157 return (PARSER_OK);
12158 }
12159
12160 int pstoken_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12161 {
12162 if ((input_len < DISPLAY_LEN_MIN_13500) || (input_len > DISPLAY_LEN_MAX_13500)) return (PARSER_GLOBAL_LENGTH);
12163
12164 u32 *digest = (u32 *) hash_buf->digest;
12165
12166 salt_t *salt = hash_buf->salt;
12167
12168 pstoken_t *pstoken = (pstoken_t *) hash_buf->esalt;
12169
12170 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12171 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12172 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12173 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12174 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12175
12176 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12177
12178 uint salt_len = input_len - 40 - 1;
12179
12180 char *salt_buf = input_buf + 40 + 1;
12181
12182 if (salt_len == UINT_MAX || salt_len % 2 != 0) return (PARSER_SALT_LENGTH);
12183
12184 u8 *pstoken_ptr = (u8 *) pstoken->salt_buf;
12185
12186 for (uint i = 0, j = 0; i < salt_len; i += 2, j += 1)
12187 {
12188 pstoken_ptr[j] = hex_to_u8 ((const u8 *) &salt_buf[i]);
12189 }
12190
12191 pstoken->salt_len = salt_len / 2;
12192
12193 /* some fake salt for the sorting mechanisms */
12194
12195 salt->salt_buf[0] = pstoken->salt_buf[0];
12196 salt->salt_buf[1] = pstoken->salt_buf[1];
12197 salt->salt_buf[2] = pstoken->salt_buf[2];
12198 salt->salt_buf[3] = pstoken->salt_buf[3];
12199 salt->salt_buf[4] = pstoken->salt_buf[4];
12200 salt->salt_buf[5] = pstoken->salt_buf[5];
12201 salt->salt_buf[6] = pstoken->salt_buf[6];
12202 salt->salt_buf[7] = pstoken->salt_buf[7];
12203
12204 salt->salt_len = 32;
12205
12206 /* we need to check if we can precompute some of the data --
12207 this is possible since the scheme is badly designed */
12208
12209 pstoken->pc_digest[0] = SHA1M_A;
12210 pstoken->pc_digest[1] = SHA1M_B;
12211 pstoken->pc_digest[2] = SHA1M_C;
12212 pstoken->pc_digest[3] = SHA1M_D;
12213 pstoken->pc_digest[4] = SHA1M_E;
12214
12215 pstoken->pc_offset = 0;
12216
12217 for (int i = 0; i < (int) pstoken->salt_len - 63; i += 64)
12218 {
12219 uint w[16];
12220
12221 w[ 0] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 0]);
12222 w[ 1] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 1]);
12223 w[ 2] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 2]);
12224 w[ 3] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 3]);
12225 w[ 4] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 4]);
12226 w[ 5] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 5]);
12227 w[ 6] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 6]);
12228 w[ 7] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 7]);
12229 w[ 8] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 8]);
12230 w[ 9] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 9]);
12231 w[10] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 10]);
12232 w[11] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 11]);
12233 w[12] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 12]);
12234 w[13] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 13]);
12235 w[14] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 14]);
12236 w[15] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 15]);
12237
12238 sha1_64 (w, pstoken->pc_digest);
12239
12240 pstoken->pc_offset += 16;
12241 }
12242
12243 return (PARSER_OK);
12244 }
12245
12246 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12247 {
12248 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
12249
12250 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
12251
12252 u32 *digest = (u32 *) hash_buf->digest;
12253
12254 u8 tmp_buf[100] = { 0 };
12255
12256 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
12257
12258 memcpy (digest, tmp_buf, 20);
12259
12260 digest[0] = byte_swap_32 (digest[0]);
12261 digest[1] = byte_swap_32 (digest[1]);
12262 digest[2] = byte_swap_32 (digest[2]);
12263 digest[3] = byte_swap_32 (digest[3]);
12264 digest[4] = byte_swap_32 (digest[4]);
12265
12266 digest[0] -= SHA1M_A;
12267 digest[1] -= SHA1M_B;
12268 digest[2] -= SHA1M_C;
12269 digest[3] -= SHA1M_D;
12270 digest[4] -= SHA1M_E;
12271
12272 return (PARSER_OK);
12273 }
12274
12275 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12276 {
12277 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
12278
12279 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12280
12281 u32 *digest = (u32 *) hash_buf->digest;
12282
12283 salt_t *salt = hash_buf->salt;
12284
12285 u8 tmp_buf[100] = { 0 };
12286
12287 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
12288
12289 if (tmp_len < 20) return (PARSER_HASH_LENGTH);
12290
12291 memcpy (digest, tmp_buf, 20);
12292
12293 int salt_len = tmp_len - 20;
12294
12295 if (salt_len < 0) return (PARSER_SALT_LENGTH);
12296
12297 salt->salt_len = salt_len;
12298
12299 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
12300
12301 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12302 {
12303 char *ptr = (char *) salt->salt_buf;
12304
12305 ptr[salt->salt_len] = 0x80;
12306 }
12307
12308 digest[0] = byte_swap_32 (digest[0]);
12309 digest[1] = byte_swap_32 (digest[1]);
12310 digest[2] = byte_swap_32 (digest[2]);
12311 digest[3] = byte_swap_32 (digest[3]);
12312 digest[4] = byte_swap_32 (digest[4]);
12313
12314 digest[0] -= SHA1M_A;
12315 digest[1] -= SHA1M_B;
12316 digest[2] -= SHA1M_C;
12317 digest[3] -= SHA1M_D;
12318 digest[4] -= SHA1M_E;
12319
12320 return (PARSER_OK);
12321 }
12322
12323 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12324 {
12325 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
12326
12327 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12328
12329 u32 *digest = (u32 *) hash_buf->digest;
12330
12331 salt_t *salt = hash_buf->salt;
12332
12333 char *salt_buf = input_buf + 6;
12334
12335 uint salt_len = 8;
12336
12337 char *salt_buf_ptr = (char *) salt->salt_buf;
12338
12339 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12340
12341 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12342
12343 salt->salt_len = salt_len;
12344
12345 char *hash_pos = input_buf + 6 + 8 + 40;
12346
12347 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12348 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12349 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12350 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12351 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12352
12353 digest[0] -= SHA1M_A;
12354 digest[1] -= SHA1M_B;
12355 digest[2] -= SHA1M_C;
12356 digest[3] -= SHA1M_D;
12357 digest[4] -= SHA1M_E;
12358
12359 return (PARSER_OK);
12360 }
12361
12362 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12363 {
12364 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
12365
12366 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12367
12368 u32 *digest = (u32 *) hash_buf->digest;
12369
12370 salt_t *salt = hash_buf->salt;
12371
12372 char *salt_buf = input_buf + 6;
12373
12374 uint salt_len = 8;
12375
12376 char *salt_buf_ptr = (char *) salt->salt_buf;
12377
12378 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12379
12380 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12381
12382 salt->salt_len = salt_len;
12383
12384 char *hash_pos = input_buf + 6 + 8;
12385
12386 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12387 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12388 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12389 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12390 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12391
12392 digest[0] -= SHA1M_A;
12393 digest[1] -= SHA1M_B;
12394 digest[2] -= SHA1M_C;
12395 digest[3] -= SHA1M_D;
12396 digest[4] -= SHA1M_E;
12397
12398 return (PARSER_OK);
12399 }
12400
12401 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12402 {
12403 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
12404
12405 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12406
12407 u64 *digest = (u64 *) hash_buf->digest;
12408
12409 salt_t *salt = hash_buf->salt;
12410
12411 char *salt_buf = input_buf + 6;
12412
12413 uint salt_len = 8;
12414
12415 char *salt_buf_ptr = (char *) salt->salt_buf;
12416
12417 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12418
12419 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12420
12421 salt->salt_len = salt_len;
12422
12423 char *hash_pos = input_buf + 6 + 8;
12424
12425 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12426 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12427 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12428 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12429 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12430 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12431 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12432 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12433
12434 digest[0] -= SHA512M_A;
12435 digest[1] -= SHA512M_B;
12436 digest[2] -= SHA512M_C;
12437 digest[3] -= SHA512M_D;
12438 digest[4] -= SHA512M_E;
12439 digest[5] -= SHA512M_F;
12440 digest[6] -= SHA512M_G;
12441 digest[7] -= SHA512M_H;
12442
12443 return (PARSER_OK);
12444 }
12445
12446 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12447 {
12448 if (data.opts_type & OPTS_TYPE_ST_HEX)
12449 {
12450 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
12451 }
12452 else
12453 {
12454 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
12455 }
12456
12457 u32 *digest = (u32 *) hash_buf->digest;
12458
12459 salt_t *salt = hash_buf->salt;
12460
12461 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12462 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12463 digest[2] = 0;
12464 digest[3] = 0;
12465
12466 digest[0] = byte_swap_32 (digest[0]);
12467 digest[1] = byte_swap_32 (digest[1]);
12468
12469 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12470
12471 uint salt_len = input_len - 16 - 1;
12472
12473 char *salt_buf = input_buf + 16 + 1;
12474
12475 char *salt_buf_ptr = (char *) salt->salt_buf;
12476
12477 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12478
12479 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12480
12481 salt->salt_len = salt_len;
12482
12483 return (PARSER_OK);
12484 }
12485
12486 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12487 {
12488 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
12489
12490 u32 *digest = (u32 *) hash_buf->digest;
12491
12492 salt_t *salt = hash_buf->salt;
12493
12494 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12495 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12496 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12497 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12498 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12499
12500 digest[0] -= SHA1M_A;
12501 digest[1] -= SHA1M_B;
12502 digest[2] -= SHA1M_C;
12503 digest[3] -= SHA1M_D;
12504 digest[4] -= SHA1M_E;
12505
12506 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12507
12508 uint salt_len = input_len - 40 - 1;
12509
12510 char *salt_buf = input_buf + 40 + 1;
12511
12512 char *salt_buf_ptr = (char *) salt->salt_buf;
12513
12514 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12515
12516 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12517
12518 salt->salt_len = salt_len;
12519
12520 return (PARSER_OK);
12521 }
12522
12523 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12524 {
12525 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
12526
12527 u32 *digest = (u32 *) hash_buf->digest;
12528
12529 salt_t *salt = hash_buf->salt;
12530
12531 char *hash_pos = input_buf;
12532
12533 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12534 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12535 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
12536 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
12537 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
12538 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
12539 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
12540 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
12541 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
12542 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
12543 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
12544 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
12545 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
12546 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
12547 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
12548 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
12549
12550 char *salt_pos = input_buf + 128;
12551
12552 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12553 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12554 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12555 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12556
12557 salt->salt_iter = ROUNDS_ORACLET - 1;
12558 salt->salt_len = 16;
12559
12560 return (PARSER_OK);
12561 }
12562
12563 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12564 {
12565 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
12566
12567 u32 *digest = (u32 *) hash_buf->digest;
12568
12569 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12570 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12571 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12572 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12573 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12574 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12575 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12576 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12577
12578 digest[0] -= SHA256M_A;
12579 digest[1] -= SHA256M_B;
12580 digest[2] -= SHA256M_C;
12581 digest[3] -= SHA256M_D;
12582 digest[4] -= SHA256M_E;
12583 digest[5] -= SHA256M_F;
12584 digest[6] -= SHA256M_G;
12585 digest[7] -= SHA256M_H;
12586
12587 return (PARSER_OK);
12588 }
12589
12590 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12591 {
12592 if (data.opts_type & OPTS_TYPE_ST_HEX)
12593 {
12594 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
12595 }
12596 else
12597 {
12598 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
12599 }
12600
12601 u32 *digest = (u32 *) hash_buf->digest;
12602
12603 salt_t *salt = hash_buf->salt;
12604
12605 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12606 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12607 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12608 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12609 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12610 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12611 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12612 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12613
12614 digest[0] -= SHA256M_A;
12615 digest[1] -= SHA256M_B;
12616 digest[2] -= SHA256M_C;
12617 digest[3] -= SHA256M_D;
12618 digest[4] -= SHA256M_E;
12619 digest[5] -= SHA256M_F;
12620 digest[6] -= SHA256M_G;
12621 digest[7] -= SHA256M_H;
12622
12623 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12624
12625 uint salt_len = input_len - 64 - 1;
12626
12627 char *salt_buf = input_buf + 64 + 1;
12628
12629 char *salt_buf_ptr = (char *) salt->salt_buf;
12630
12631 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12632
12633 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12634
12635 salt->salt_len = salt_len;
12636
12637 return (PARSER_OK);
12638 }
12639
12640 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12641 {
12642 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
12643
12644 u64 *digest = (u64 *) hash_buf->digest;
12645
12646 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12647 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12648 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12649 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12650 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12651 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12652 digest[6] = 0;
12653 digest[7] = 0;
12654
12655 digest[0] -= SHA384M_A;
12656 digest[1] -= SHA384M_B;
12657 digest[2] -= SHA384M_C;
12658 digest[3] -= SHA384M_D;
12659 digest[4] -= SHA384M_E;
12660 digest[5] -= SHA384M_F;
12661 digest[6] -= 0;
12662 digest[7] -= 0;
12663
12664 return (PARSER_OK);
12665 }
12666
12667 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12668 {
12669 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
12670
12671 u64 *digest = (u64 *) hash_buf->digest;
12672
12673 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12674 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12675 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12676 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12677 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12678 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12679 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12680 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12681
12682 digest[0] -= SHA512M_A;
12683 digest[1] -= SHA512M_B;
12684 digest[2] -= SHA512M_C;
12685 digest[3] -= SHA512M_D;
12686 digest[4] -= SHA512M_E;
12687 digest[5] -= SHA512M_F;
12688 digest[6] -= SHA512M_G;
12689 digest[7] -= SHA512M_H;
12690
12691 return (PARSER_OK);
12692 }
12693
12694 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12695 {
12696 if (data.opts_type & OPTS_TYPE_ST_HEX)
12697 {
12698 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
12699 }
12700 else
12701 {
12702 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
12703 }
12704
12705 u64 *digest = (u64 *) hash_buf->digest;
12706
12707 salt_t *salt = hash_buf->salt;
12708
12709 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12710 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12711 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12712 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12713 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12714 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12715 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12716 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12717
12718 digest[0] -= SHA512M_A;
12719 digest[1] -= SHA512M_B;
12720 digest[2] -= SHA512M_C;
12721 digest[3] -= SHA512M_D;
12722 digest[4] -= SHA512M_E;
12723 digest[5] -= SHA512M_F;
12724 digest[6] -= SHA512M_G;
12725 digest[7] -= SHA512M_H;
12726
12727 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12728
12729 uint salt_len = input_len - 128 - 1;
12730
12731 char *salt_buf = input_buf + 128 + 1;
12732
12733 char *salt_buf_ptr = (char *) salt->salt_buf;
12734
12735 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12736
12737 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12738
12739 salt->salt_len = salt_len;
12740
12741 return (PARSER_OK);
12742 }
12743
12744 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12745 {
12746 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12747
12748 u64 *digest = (u64 *) hash_buf->digest;
12749
12750 salt_t *salt = hash_buf->salt;
12751
12752 char *salt_pos = input_buf + 3;
12753
12754 uint iterations_len = 0;
12755
12756 if (memcmp (salt_pos, "rounds=", 7) == 0)
12757 {
12758 salt_pos += 7;
12759
12760 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12761
12762 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12763 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12764
12765 salt_pos[0] = 0x0;
12766
12767 salt->salt_iter = atoi (salt_pos - iterations_len);
12768
12769 salt_pos += 1;
12770
12771 iterations_len += 8;
12772 }
12773 else
12774 {
12775 salt->salt_iter = ROUNDS_SHA512CRYPT;
12776 }
12777
12778 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12779
12780 char *hash_pos = strchr (salt_pos, '$');
12781
12782 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12783
12784 uint salt_len = hash_pos - salt_pos;
12785
12786 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12787
12788 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12789
12790 salt->salt_len = salt_len;
12791
12792 hash_pos++;
12793
12794 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12795
12796 return (PARSER_OK);
12797 }
12798
12799 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12800 {
12801 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12802
12803 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12804
12805 u64 *digest = (u64 *) hash_buf->digest;
12806
12807 salt_t *salt = hash_buf->salt;
12808
12809 uint keccak_mdlen = input_len / 2;
12810
12811 for (uint i = 0; i < keccak_mdlen / 8; i++)
12812 {
12813 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12814
12815 digest[i] = byte_swap_64 (digest[i]);
12816 }
12817
12818 salt->keccak_mdlen = keccak_mdlen;
12819
12820 return (PARSER_OK);
12821 }
12822
12823 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12824 {
12825 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12826
12827 u32 *digest = (u32 *) hash_buf->digest;
12828
12829 salt_t *salt = hash_buf->salt;
12830
12831 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12832
12833 /**
12834 * Parse that strange long line
12835 */
12836
12837 char *in_off[9];
12838
12839 size_t in_len[9] = { 0 };
12840
12841 in_off[0] = strtok (input_buf, ":");
12842
12843 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12844
12845 in_len[0] = strlen (in_off[0]);
12846
12847 size_t i;
12848
12849 for (i = 1; i < 9; i++)
12850 {
12851 in_off[i] = strtok (NULL, ":");
12852
12853 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12854
12855 in_len[i] = strlen (in_off[i]);
12856 }
12857
12858 char *ptr = (char *) ikepsk->msg_buf;
12859
12860 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12861 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12862 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12863 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12864 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12865 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12866
12867 *ptr = 0x80;
12868
12869 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12870
12871 ptr = (char *) ikepsk->nr_buf;
12872
12873 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12874 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12875
12876 *ptr = 0x80;
12877
12878 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12879
12880 /**
12881 * Store to database
12882 */
12883
12884 ptr = in_off[8];
12885
12886 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12887 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12888 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12889 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12890
12891 digest[0] = byte_swap_32 (digest[0]);
12892 digest[1] = byte_swap_32 (digest[1]);
12893 digest[2] = byte_swap_32 (digest[2]);
12894 digest[3] = byte_swap_32 (digest[3]);
12895
12896 salt->salt_len = 32;
12897
12898 salt->salt_buf[0] = ikepsk->nr_buf[0];
12899 salt->salt_buf[1] = ikepsk->nr_buf[1];
12900 salt->salt_buf[2] = ikepsk->nr_buf[2];
12901 salt->salt_buf[3] = ikepsk->nr_buf[3];
12902 salt->salt_buf[4] = ikepsk->nr_buf[4];
12903 salt->salt_buf[5] = ikepsk->nr_buf[5];
12904 salt->salt_buf[6] = ikepsk->nr_buf[6];
12905 salt->salt_buf[7] = ikepsk->nr_buf[7];
12906
12907 return (PARSER_OK);
12908 }
12909
12910 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12911 {
12912 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12913
12914 u32 *digest = (u32 *) hash_buf->digest;
12915
12916 salt_t *salt = hash_buf->salt;
12917
12918 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12919
12920 /**
12921 * Parse that strange long line
12922 */
12923
12924 char *in_off[9];
12925
12926 size_t in_len[9] = { 0 };
12927
12928 in_off[0] = strtok (input_buf, ":");
12929
12930 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12931
12932 in_len[0] = strlen (in_off[0]);
12933
12934 size_t i;
12935
12936 for (i = 1; i < 9; i++)
12937 {
12938 in_off[i] = strtok (NULL, ":");
12939
12940 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12941
12942 in_len[i] = strlen (in_off[i]);
12943 }
12944
12945 char *ptr = (char *) ikepsk->msg_buf;
12946
12947 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12948 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12949 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12950 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12951 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12952 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12953
12954 *ptr = 0x80;
12955
12956 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12957
12958 ptr = (char *) ikepsk->nr_buf;
12959
12960 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12961 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12962
12963 *ptr = 0x80;
12964
12965 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12966
12967 /**
12968 * Store to database
12969 */
12970
12971 ptr = in_off[8];
12972
12973 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12974 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12975 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12976 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12977 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12978
12979 salt->salt_len = 32;
12980
12981 salt->salt_buf[0] = ikepsk->nr_buf[0];
12982 salt->salt_buf[1] = ikepsk->nr_buf[1];
12983 salt->salt_buf[2] = ikepsk->nr_buf[2];
12984 salt->salt_buf[3] = ikepsk->nr_buf[3];
12985 salt->salt_buf[4] = ikepsk->nr_buf[4];
12986 salt->salt_buf[5] = ikepsk->nr_buf[5];
12987 salt->salt_buf[6] = ikepsk->nr_buf[6];
12988 salt->salt_buf[7] = ikepsk->nr_buf[7];
12989
12990 return (PARSER_OK);
12991 }
12992
12993 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12994 {
12995 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12996
12997 u32 *digest = (u32 *) hash_buf->digest;
12998
12999 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13000 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13001 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13002 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13003 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13004
13005 digest[0] = byte_swap_32 (digest[0]);
13006 digest[1] = byte_swap_32 (digest[1]);
13007 digest[2] = byte_swap_32 (digest[2]);
13008 digest[3] = byte_swap_32 (digest[3]);
13009 digest[4] = byte_swap_32 (digest[4]);
13010
13011 return (PARSER_OK);
13012 }
13013
13014 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13015 {
13016 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
13017
13018 u32 *digest = (u32 *) hash_buf->digest;
13019
13020 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13021 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13022 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
13023 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
13024 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
13025 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
13026 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
13027 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
13028 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
13029 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
13030 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
13031 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
13032 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
13033 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
13034 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
13035 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
13036
13037 return (PARSER_OK);
13038 }
13039
13040 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13041 {
13042 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
13043
13044 u32 *digest = (u32 *) hash_buf->digest;
13045
13046 salt_t *salt = hash_buf->salt;
13047
13048 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13049 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13050 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13051 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13052 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13053
13054 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13055
13056 uint salt_len = input_len - 40 - 1;
13057
13058 char *salt_buf = input_buf + 40 + 1;
13059
13060 char *salt_buf_ptr = (char *) salt->salt_buf;
13061
13062 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13063
13064 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13065
13066 salt->salt_len = salt_len;
13067
13068 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
13069
13070 return (PARSER_OK);
13071 }
13072
13073 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
13074 {
13075 u32 *digest = (u32 *) hash_buf->digest;
13076
13077 salt_t *salt = hash_buf->salt;
13078
13079 tc_t *tc = (tc_t *) hash_buf->esalt;
13080
13081 if (input_len == 0)
13082 {
13083 log_error ("TrueCrypt container not specified");
13084
13085 exit (-1);
13086 }
13087
13088 FILE *fp = fopen (input_buf, "rb");
13089
13090 if (fp == NULL)
13091 {
13092 log_error ("%s: %s", input_buf, strerror (errno));
13093
13094 exit (-1);
13095 }
13096
13097 char buf[512] = { 0 };
13098
13099 int n = fread (buf, 1, sizeof (buf), fp);
13100
13101 fclose (fp);
13102
13103 if (n != 512) return (PARSER_TC_FILE_SIZE);
13104
13105 memcpy (tc->salt_buf, buf, 64);
13106
13107 memcpy (tc->data_buf, buf + 64, 512 - 64);
13108
13109 salt->salt_buf[0] = tc->salt_buf[0];
13110
13111 salt->salt_len = 4;
13112
13113 salt->salt_iter = ROUNDS_TRUECRYPT_1K - 1;
13114
13115 tc->signature = 0x45555254; // "TRUE"
13116
13117 digest[0] = tc->data_buf[0];
13118
13119 return (PARSER_OK);
13120 }
13121
13122 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
13123 {
13124 u32 *digest = (u32 *) hash_buf->digest;
13125
13126 salt_t *salt = hash_buf->salt;
13127
13128 tc_t *tc = (tc_t *) hash_buf->esalt;
13129
13130 if (input_len == 0)
13131 {
13132 log_error ("TrueCrypt container not specified");
13133
13134 exit (-1);
13135 }
13136
13137 FILE *fp = fopen (input_buf, "rb");
13138
13139 if (fp == NULL)
13140 {
13141 log_error ("%s: %s", input_buf, strerror (errno));
13142
13143 exit (-1);
13144 }
13145
13146 char buf[512] = { 0 };
13147
13148 int n = fread (buf, 1, sizeof (buf), fp);
13149
13150 fclose (fp);
13151
13152 if (n != 512) return (PARSER_TC_FILE_SIZE);
13153
13154 memcpy (tc->salt_buf, buf, 64);
13155
13156 memcpy (tc->data_buf, buf + 64, 512 - 64);
13157
13158 salt->salt_buf[0] = tc->salt_buf[0];
13159
13160 salt->salt_len = 4;
13161
13162 salt->salt_iter = ROUNDS_TRUECRYPT_2K - 1;
13163
13164 tc->signature = 0x45555254; // "TRUE"
13165
13166 digest[0] = tc->data_buf[0];
13167
13168 return (PARSER_OK);
13169 }
13170
13171 int veracrypt_parse_hash_200000 (char *input_buf, uint input_len, hash_t *hash_buf)
13172 {
13173 u32 *digest = (u32 *) hash_buf->digest;
13174
13175 salt_t *salt = hash_buf->salt;
13176
13177 tc_t *tc = (tc_t *) hash_buf->esalt;
13178
13179 if (input_len == 0)
13180 {
13181 log_error ("VeraCrypt container not specified");
13182
13183 exit (-1);
13184 }
13185
13186 FILE *fp = fopen (input_buf, "rb");
13187
13188 if (fp == NULL)
13189 {
13190 log_error ("%s: %s", input_buf, strerror (errno));
13191
13192 exit (-1);
13193 }
13194
13195 char buf[512] = { 0 };
13196
13197 int n = fread (buf, 1, sizeof (buf), fp);
13198
13199 fclose (fp);
13200
13201 if (n != 512) return (PARSER_VC_FILE_SIZE);
13202
13203 memcpy (tc->salt_buf, buf, 64);
13204
13205 memcpy (tc->data_buf, buf + 64, 512 - 64);
13206
13207 salt->salt_buf[0] = tc->salt_buf[0];
13208
13209 salt->salt_len = 4;
13210
13211 salt->salt_iter = ROUNDS_VERACRYPT_200000 - 1;
13212
13213 tc->signature = 0x41524556; // "VERA"
13214
13215 digest[0] = tc->data_buf[0];
13216
13217 return (PARSER_OK);
13218 }
13219
13220 int veracrypt_parse_hash_500000 (char *input_buf, uint input_len, hash_t *hash_buf)
13221 {
13222 u32 *digest = (u32 *) hash_buf->digest;
13223
13224 salt_t *salt = hash_buf->salt;
13225
13226 tc_t *tc = (tc_t *) hash_buf->esalt;
13227
13228 if (input_len == 0)
13229 {
13230 log_error ("VeraCrypt container not specified");
13231
13232 exit (-1);
13233 }
13234
13235 FILE *fp = fopen (input_buf, "rb");
13236
13237 if (fp == NULL)
13238 {
13239 log_error ("%s: %s", input_buf, strerror (errno));
13240
13241 exit (-1);
13242 }
13243
13244 char buf[512] = { 0 };
13245
13246 int n = fread (buf, 1, sizeof (buf), fp);
13247
13248 fclose (fp);
13249
13250 if (n != 512) return (PARSER_VC_FILE_SIZE);
13251
13252 memcpy (tc->salt_buf, buf, 64);
13253
13254 memcpy (tc->data_buf, buf + 64, 512 - 64);
13255
13256 salt->salt_buf[0] = tc->salt_buf[0];
13257
13258 salt->salt_len = 4;
13259
13260 salt->salt_iter = ROUNDS_VERACRYPT_500000 - 1;
13261
13262 tc->signature = 0x41524556; // "VERA"
13263
13264 digest[0] = tc->data_buf[0];
13265
13266 return (PARSER_OK);
13267 }
13268
13269 int veracrypt_parse_hash_327661 (char *input_buf, uint input_len, hash_t *hash_buf)
13270 {
13271 u32 *digest = (u32 *) hash_buf->digest;
13272
13273 salt_t *salt = hash_buf->salt;
13274
13275 tc_t *tc = (tc_t *) hash_buf->esalt;
13276
13277 if (input_len == 0)
13278 {
13279 log_error ("VeraCrypt container not specified");
13280
13281 exit (-1);
13282 }
13283
13284 FILE *fp = fopen (input_buf, "rb");
13285
13286 if (fp == NULL)
13287 {
13288 log_error ("%s: %s", input_buf, strerror (errno));
13289
13290 exit (-1);
13291 }
13292
13293 char buf[512] = { 0 };
13294
13295 int n = fread (buf, 1, sizeof (buf), fp);
13296
13297 fclose (fp);
13298
13299 if (n != 512) return (PARSER_VC_FILE_SIZE);
13300
13301 memcpy (tc->salt_buf, buf, 64);
13302
13303 memcpy (tc->data_buf, buf + 64, 512 - 64);
13304
13305 salt->salt_buf[0] = tc->salt_buf[0];
13306
13307 salt->salt_len = 4;
13308
13309 salt->salt_iter = ROUNDS_VERACRYPT_327661 - 1;
13310
13311 tc->signature = 0x41524556; // "VERA"
13312
13313 digest[0] = tc->data_buf[0];
13314
13315 return (PARSER_OK);
13316 }
13317
13318 int veracrypt_parse_hash_655331 (char *input_buf, uint input_len, hash_t *hash_buf)
13319 {
13320 u32 *digest = (u32 *) hash_buf->digest;
13321
13322 salt_t *salt = hash_buf->salt;
13323
13324 tc_t *tc = (tc_t *) hash_buf->esalt;
13325
13326 if (input_len == 0)
13327 {
13328 log_error ("VeraCrypt container not specified");
13329
13330 exit (-1);
13331 }
13332
13333 FILE *fp = fopen (input_buf, "rb");
13334
13335 if (fp == NULL)
13336 {
13337 log_error ("%s: %s", input_buf, strerror (errno));
13338
13339 exit (-1);
13340 }
13341
13342 char buf[512] = { 0 };
13343
13344 int n = fread (buf, 1, sizeof (buf), fp);
13345
13346 fclose (fp);
13347
13348 if (n != 512) return (PARSER_VC_FILE_SIZE);
13349
13350 memcpy (tc->salt_buf, buf, 64);
13351
13352 memcpy (tc->data_buf, buf + 64, 512 - 64);
13353
13354 salt->salt_buf[0] = tc->salt_buf[0];
13355
13356 salt->salt_len = 4;
13357
13358 salt->salt_iter = ROUNDS_VERACRYPT_655331 - 1;
13359
13360 tc->signature = 0x41524556; // "VERA"
13361
13362 digest[0] = tc->data_buf[0];
13363
13364 return (PARSER_OK);
13365 }
13366
13367 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13368 {
13369 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
13370
13371 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13372
13373 u32 *digest = (u32 *) hash_buf->digest;
13374
13375 salt_t *salt = hash_buf->salt;
13376
13377 char *salt_pos = input_buf + 6;
13378
13379 char *hash_pos = strchr (salt_pos, '$');
13380
13381 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13382
13383 uint salt_len = hash_pos - salt_pos;
13384
13385 if (salt_len < 8) return (PARSER_SALT_LENGTH);
13386
13387 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13388
13389 salt->salt_len = salt_len;
13390
13391 salt->salt_iter = 1000;
13392
13393 hash_pos++;
13394
13395 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13396
13397 return (PARSER_OK);
13398 }
13399
13400 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13401 {
13402 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
13403
13404 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
13405
13406 u32 *digest = (u32 *) hash_buf->digest;
13407
13408 salt_t *salt = hash_buf->salt;
13409
13410 char *iter_pos = input_buf + 7;
13411
13412 char *salt_pos = strchr (iter_pos, '$');
13413
13414 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13415
13416 salt_pos++;
13417
13418 char *hash_pos = strchr (salt_pos, '$');
13419
13420 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13421
13422 uint salt_len = hash_pos - salt_pos;
13423
13424 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13425
13426 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13427
13428 salt->salt_len = salt_len;
13429
13430 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13431
13432 salt->salt_sign[0] = atoi (salt_iter);
13433
13434 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13435
13436 hash_pos++;
13437
13438 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13439
13440 digest[0] = byte_swap_32 (digest[0]);
13441 digest[1] = byte_swap_32 (digest[1]);
13442 digest[2] = byte_swap_32 (digest[2]);
13443 digest[3] = byte_swap_32 (digest[3]);
13444 digest[4] = byte_swap_32 (digest[4]);
13445
13446 return (PARSER_OK);
13447 }
13448
13449 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13450 {
13451 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
13452
13453 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13454
13455 u32 *digest = (u32 *) hash_buf->digest;
13456
13457 salt_t *salt = hash_buf->salt;
13458
13459 char *iter_pos = input_buf + 9;
13460
13461 char *salt_pos = strchr (iter_pos, '$');
13462
13463 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13464
13465 salt_pos++;
13466
13467 char *hash_pos = strchr (salt_pos, '$');
13468
13469 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13470
13471 uint salt_len = hash_pos - salt_pos;
13472
13473 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13474
13475 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13476
13477 salt->salt_len = salt_len;
13478
13479 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13480
13481 salt->salt_sign[0] = atoi (salt_iter);
13482
13483 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13484
13485 hash_pos++;
13486
13487 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13488
13489 digest[0] = byte_swap_32 (digest[0]);
13490 digest[1] = byte_swap_32 (digest[1]);
13491 digest[2] = byte_swap_32 (digest[2]);
13492 digest[3] = byte_swap_32 (digest[3]);
13493 digest[4] = byte_swap_32 (digest[4]);
13494 digest[5] = byte_swap_32 (digest[5]);
13495 digest[6] = byte_swap_32 (digest[6]);
13496 digest[7] = byte_swap_32 (digest[7]);
13497
13498 return (PARSER_OK);
13499 }
13500
13501 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13502 {
13503 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
13504
13505 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13506
13507 u64 *digest = (u64 *) hash_buf->digest;
13508
13509 salt_t *salt = hash_buf->salt;
13510
13511 char *iter_pos = input_buf + 9;
13512
13513 char *salt_pos = strchr (iter_pos, '$');
13514
13515 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13516
13517 salt_pos++;
13518
13519 char *hash_pos = strchr (salt_pos, '$');
13520
13521 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13522
13523 uint salt_len = hash_pos - salt_pos;
13524
13525 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13526
13527 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13528
13529 salt->salt_len = salt_len;
13530
13531 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13532
13533 salt->salt_sign[0] = atoi (salt_iter);
13534
13535 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13536
13537 hash_pos++;
13538
13539 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13540
13541 digest[0] = byte_swap_64 (digest[0]);
13542 digest[1] = byte_swap_64 (digest[1]);
13543 digest[2] = byte_swap_64 (digest[2]);
13544 digest[3] = byte_swap_64 (digest[3]);
13545 digest[4] = byte_swap_64 (digest[4]);
13546 digest[5] = byte_swap_64 (digest[5]);
13547 digest[6] = byte_swap_64 (digest[6]);
13548 digest[7] = byte_swap_64 (digest[7]);
13549
13550 return (PARSER_OK);
13551 }
13552
13553 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13554 {
13555 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
13556
13557 u32 *digest = (u32 *) hash_buf->digest;
13558
13559 salt_t *salt = hash_buf->salt;
13560
13561 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
13562
13563 /**
13564 * parse line
13565 */
13566
13567 char *iterations_pos = input_buf;
13568
13569 char *saltbuf_pos = strchr (iterations_pos, ':');
13570
13571 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13572
13573 uint iterations_len = saltbuf_pos - iterations_pos;
13574
13575 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
13576
13577 saltbuf_pos++;
13578
13579 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
13580
13581 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13582
13583 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
13584
13585 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
13586
13587 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
13588
13589 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
13590
13591 cipherbuf_pos++;
13592
13593 /**
13594 * pbkdf2 iterations
13595 */
13596
13597 salt->salt_iter = atoi (iterations_pos) - 1;
13598
13599 /**
13600 * handle salt encoding
13601 */
13602
13603 char *saltbuf_ptr = (char *) salt->salt_buf;
13604
13605 for (uint i = 0; i < saltbuf_len; i += 2)
13606 {
13607 const char p0 = saltbuf_pos[i + 0];
13608 const char p1 = saltbuf_pos[i + 1];
13609
13610 *saltbuf_ptr++ = hex_convert (p1) << 0
13611 | hex_convert (p0) << 4;
13612 }
13613
13614 salt->salt_len = saltbuf_len / 2;
13615
13616 /**
13617 * handle cipher encoding
13618 */
13619
13620 uint *tmp = (uint *) mymalloc (32);
13621
13622 char *cipherbuf_ptr = (char *) tmp;
13623
13624 for (uint i = 2016; i < cipherbuf_len; i += 2)
13625 {
13626 const char p0 = cipherbuf_pos[i + 0];
13627 const char p1 = cipherbuf_pos[i + 1];
13628
13629 *cipherbuf_ptr++ = hex_convert (p1) << 0
13630 | hex_convert (p0) << 4;
13631 }
13632
13633 // iv is stored at salt_buf 4 (length 16)
13634 // data is stored at salt_buf 8 (length 16)
13635
13636 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
13637 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
13638 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
13639 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
13640
13641 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
13642 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
13643 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
13644 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
13645
13646 free (tmp);
13647
13648 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
13649 {
13650 const char p0 = cipherbuf_pos[j + 0];
13651 const char p1 = cipherbuf_pos[j + 1];
13652
13653 agilekey->cipher[i] = hex_convert (p1) << 0
13654 | hex_convert (p0) << 4;
13655 }
13656
13657 /**
13658 * digest buf
13659 */
13660
13661 digest[0] = 0x10101010;
13662 digest[1] = 0x10101010;
13663 digest[2] = 0x10101010;
13664 digest[3] = 0x10101010;
13665
13666 return (PARSER_OK);
13667 }
13668
13669 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13670 {
13671 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
13672
13673 u32 *digest = (u32 *) hash_buf->digest;
13674
13675 salt_t *salt = hash_buf->salt;
13676
13677 char *hashbuf_pos = input_buf;
13678
13679 char *iterations_pos = strchr (hashbuf_pos, ':');
13680
13681 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13682
13683 uint hash_len = iterations_pos - hashbuf_pos;
13684
13685 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
13686
13687 iterations_pos++;
13688
13689 char *saltbuf_pos = strchr (iterations_pos, ':');
13690
13691 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13692
13693 uint iterations_len = saltbuf_pos - iterations_pos;
13694
13695 saltbuf_pos++;
13696
13697 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
13698
13699 if (salt_len > 32) return (PARSER_SALT_LENGTH);
13700
13701 char *salt_buf_ptr = (char *) salt->salt_buf;
13702
13703 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
13704
13705 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13706
13707 salt->salt_len = salt_len;
13708
13709 salt->salt_iter = atoi (iterations_pos) - 1;
13710
13711 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13712 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13713 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13714 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13715
13716 return (PARSER_OK);
13717 }
13718
13719 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13720 {
13721 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
13722
13723 u32 *digest = (u32 *) hash_buf->digest;
13724
13725 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13726 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13727 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13728 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13729 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13730 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13731 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13732 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13733
13734 digest[0] = byte_swap_32 (digest[0]);
13735 digest[1] = byte_swap_32 (digest[1]);
13736 digest[2] = byte_swap_32 (digest[2]);
13737 digest[3] = byte_swap_32 (digest[3]);
13738 digest[4] = byte_swap_32 (digest[4]);
13739 digest[5] = byte_swap_32 (digest[5]);
13740 digest[6] = byte_swap_32 (digest[6]);
13741 digest[7] = byte_swap_32 (digest[7]);
13742
13743 return (PARSER_OK);
13744 }
13745
13746 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13747 {
13748 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13749
13750 u32 *digest = (u32 *) hash_buf->digest;
13751
13752 salt_t *salt = hash_buf->salt;
13753
13754 char *salt_pos = input_buf + 3;
13755
13756 uint iterations_len = 0;
13757
13758 if (memcmp (salt_pos, "rounds=", 7) == 0)
13759 {
13760 salt_pos += 7;
13761
13762 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
13763
13764 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
13765 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
13766
13767 salt_pos[0] = 0x0;
13768
13769 salt->salt_iter = atoi (salt_pos - iterations_len);
13770
13771 salt_pos += 1;
13772
13773 iterations_len += 8;
13774 }
13775 else
13776 {
13777 salt->salt_iter = ROUNDS_SHA256CRYPT;
13778 }
13779
13780 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
13781
13782 char *hash_pos = strchr (salt_pos, '$');
13783
13784 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13785
13786 uint salt_len = hash_pos - salt_pos;
13787
13788 if (salt_len > 16) return (PARSER_SALT_LENGTH);
13789
13790 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13791
13792 salt->salt_len = salt_len;
13793
13794 hash_pos++;
13795
13796 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13797
13798 return (PARSER_OK);
13799 }
13800
13801 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13802 {
13803 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
13804
13805 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13806
13807 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
13808
13809 u64 *digest = (u64 *) hash_buf->digest;
13810
13811 salt_t *salt = hash_buf->salt;
13812
13813 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13814
13815 char *iter_pos = input_buf + 4;
13816
13817 char *salt_pos = strchr (iter_pos, '$');
13818
13819 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13820
13821 salt_pos++;
13822
13823 char *hash_pos = strchr (salt_pos, '$');
13824
13825 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13826
13827 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13828
13829 hash_pos++;
13830
13831 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13832 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13833 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13834 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13835 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13836 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13837 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13838 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13839
13840 uint salt_len = hash_pos - salt_pos - 1;
13841
13842 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
13843
13844 salt->salt_len = salt_len / 2;
13845
13846 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
13847 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
13848 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
13849 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
13850 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
13851 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
13852 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
13853 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
13854
13855 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
13856 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
13857 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
13858 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
13859 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
13860 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
13861 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
13862 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
13863 pbkdf2_sha512->salt_buf[8] = 0x01000000;
13864 pbkdf2_sha512->salt_buf[9] = 0x80;
13865
13866 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13867
13868 salt->salt_iter = atoi (iter_pos) - 1;
13869
13870 return (PARSER_OK);
13871 }
13872
13873 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13874 {
13875 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
13876
13877 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
13878
13879 u32 *digest = (u32 *) hash_buf->digest;
13880
13881 salt_t *salt = hash_buf->salt;
13882
13883 char *salt_pos = input_buf + 14;
13884
13885 char *hash_pos = strchr (salt_pos, '*');
13886
13887 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13888
13889 hash_pos++;
13890
13891 uint salt_len = hash_pos - salt_pos - 1;
13892
13893 char *salt_buf_ptr = (char *) salt->salt_buf;
13894
13895 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13896
13897 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13898
13899 salt->salt_len = salt_len;
13900
13901 u8 tmp_buf[100] = { 0 };
13902
13903 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
13904
13905 memcpy (digest, tmp_buf, 32);
13906
13907 digest[0] = byte_swap_32 (digest[0]);
13908 digest[1] = byte_swap_32 (digest[1]);
13909 digest[2] = byte_swap_32 (digest[2]);
13910 digest[3] = byte_swap_32 (digest[3]);
13911 digest[4] = byte_swap_32 (digest[4]);
13912 digest[5] = byte_swap_32 (digest[5]);
13913 digest[6] = byte_swap_32 (digest[6]);
13914 digest[7] = byte_swap_32 (digest[7]);
13915
13916 digest[0] -= SHA256M_A;
13917 digest[1] -= SHA256M_B;
13918 digest[2] -= SHA256M_C;
13919 digest[3] -= SHA256M_D;
13920 digest[4] -= SHA256M_E;
13921 digest[5] -= SHA256M_F;
13922 digest[6] -= SHA256M_G;
13923 digest[7] -= SHA256M_H;
13924
13925 return (PARSER_OK);
13926 }
13927
13928 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13929 {
13930 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13931
13932 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13933
13934 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13935
13936 u64 *digest = (u64 *) hash_buf->digest;
13937
13938 salt_t *salt = hash_buf->salt;
13939
13940 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13941
13942 char *iter_pos = input_buf + 19;
13943
13944 char *salt_pos = strchr (iter_pos, '.');
13945
13946 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13947
13948 salt_pos++;
13949
13950 char *hash_pos = strchr (salt_pos, '.');
13951
13952 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13953
13954 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13955
13956 hash_pos++;
13957
13958 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13959 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13960 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13961 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13962 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13963 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13964 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13965 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13966
13967 uint salt_len = hash_pos - salt_pos - 1;
13968
13969 salt_len /= 2;
13970
13971 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13972
13973 uint i;
13974
13975 for (i = 0; i < salt_len; i++)
13976 {
13977 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13978 }
13979
13980 salt_buf_ptr[salt_len + 3] = 0x01;
13981 salt_buf_ptr[salt_len + 4] = 0x80;
13982
13983 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13984
13985 salt->salt_len = salt_len;
13986
13987 salt->salt_iter = atoi (iter_pos) - 1;
13988
13989 return (PARSER_OK);
13990 }
13991
13992 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13993 {
13994 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13995
13996 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13997
13998 u64 *digest = (u64 *) hash_buf->digest;
13999
14000 salt_t *salt = hash_buf->salt;
14001
14002 u8 tmp_buf[120] = { 0 };
14003
14004 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
14005
14006 if (tmp_len < 64) return (PARSER_HASH_LENGTH);
14007
14008 memcpy (digest, tmp_buf, 64);
14009
14010 digest[0] = byte_swap_64 (digest[0]);
14011 digest[1] = byte_swap_64 (digest[1]);
14012 digest[2] = byte_swap_64 (digest[2]);
14013 digest[3] = byte_swap_64 (digest[3]);
14014 digest[4] = byte_swap_64 (digest[4]);
14015 digest[5] = byte_swap_64 (digest[5]);
14016 digest[6] = byte_swap_64 (digest[6]);
14017 digest[7] = byte_swap_64 (digest[7]);
14018
14019 digest[0] -= SHA512M_A;
14020 digest[1] -= SHA512M_B;
14021 digest[2] -= SHA512M_C;
14022 digest[3] -= SHA512M_D;
14023 digest[4] -= SHA512M_E;
14024 digest[5] -= SHA512M_F;
14025 digest[6] -= SHA512M_G;
14026 digest[7] -= SHA512M_H;
14027
14028 int salt_len = tmp_len - 64;
14029
14030 if (salt_len < 0) return (PARSER_SALT_LENGTH);
14031
14032 salt->salt_len = salt_len;
14033
14034 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
14035
14036 if (data.opts_type & OPTS_TYPE_ST_ADD80)
14037 {
14038 char *ptr = (char *) salt->salt_buf;
14039
14040 ptr[salt->salt_len] = 0x80;
14041 }
14042
14043 return (PARSER_OK);
14044 }
14045
14046 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14047 {
14048 if (data.opts_type & OPTS_TYPE_ST_HEX)
14049 {
14050 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
14051 }
14052 else
14053 {
14054 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
14055 }
14056
14057 u32 *digest = (u32 *) hash_buf->digest;
14058
14059 salt_t *salt = hash_buf->salt;
14060
14061 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14062 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14063 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14064 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14065
14066 digest[0] = byte_swap_32 (digest[0]);
14067 digest[1] = byte_swap_32 (digest[1]);
14068 digest[2] = byte_swap_32 (digest[2]);
14069 digest[3] = byte_swap_32 (digest[3]);
14070
14071 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14072
14073 uint salt_len = input_len - 32 - 1;
14074
14075 char *salt_buf = input_buf + 32 + 1;
14076
14077 char *salt_buf_ptr = (char *) salt->salt_buf;
14078
14079 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14080
14081 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14082
14083 salt->salt_len = salt_len;
14084
14085 return (PARSER_OK);
14086 }
14087
14088 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14089 {
14090 if (data.opts_type & OPTS_TYPE_ST_HEX)
14091 {
14092 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
14093 }
14094 else
14095 {
14096 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
14097 }
14098
14099 u32 *digest = (u32 *) hash_buf->digest;
14100
14101 salt_t *salt = hash_buf->salt;
14102
14103 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14104 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14105 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14106 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14107 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14108
14109 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14110
14111 uint salt_len = input_len - 40 - 1;
14112
14113 char *salt_buf = input_buf + 40 + 1;
14114
14115 char *salt_buf_ptr = (char *) salt->salt_buf;
14116
14117 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14118
14119 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14120
14121 salt->salt_len = salt_len;
14122
14123 return (PARSER_OK);
14124 }
14125
14126 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14127 {
14128 if (data.opts_type & OPTS_TYPE_ST_HEX)
14129 {
14130 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
14131 }
14132 else
14133 {
14134 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
14135 }
14136
14137 u32 *digest = (u32 *) hash_buf->digest;
14138
14139 salt_t *salt = hash_buf->salt;
14140
14141 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14142 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14143 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14144 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14145 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14146 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
14147 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
14148 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
14149
14150 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14151
14152 uint salt_len = input_len - 64 - 1;
14153
14154 char *salt_buf = input_buf + 64 + 1;
14155
14156 char *salt_buf_ptr = (char *) salt->salt_buf;
14157
14158 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14159
14160 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14161
14162 salt->salt_len = salt_len;
14163
14164 return (PARSER_OK);
14165 }
14166
14167 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14168 {
14169 if (data.opts_type & OPTS_TYPE_ST_HEX)
14170 {
14171 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
14172 }
14173 else
14174 {
14175 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
14176 }
14177
14178 u64 *digest = (u64 *) hash_buf->digest;
14179
14180 salt_t *salt = hash_buf->salt;
14181
14182 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
14183 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
14184 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
14185 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
14186 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
14187 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
14188 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
14189 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
14190
14191 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14192
14193 uint salt_len = input_len - 128 - 1;
14194
14195 char *salt_buf = input_buf + 128 + 1;
14196
14197 char *salt_buf_ptr = (char *) salt->salt_buf;
14198
14199 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14200
14201 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14202
14203 salt->salt_len = salt_len;
14204
14205 return (PARSER_OK);
14206 }
14207
14208 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14209 {
14210 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
14211
14212 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
14213
14214 u32 *digest = (u32 *) hash_buf->digest;
14215
14216 salt_t *salt = hash_buf->salt;
14217
14218 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
14219
14220 /**
14221 * parse line
14222 */
14223
14224 char *user_pos = input_buf + 10 + 1;
14225
14226 char *realm_pos = strchr (user_pos, '$');
14227
14228 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14229
14230 uint user_len = realm_pos - user_pos;
14231
14232 if (user_len >= 64) return (PARSER_SALT_LENGTH);
14233
14234 realm_pos++;
14235
14236 char *salt_pos = strchr (realm_pos, '$');
14237
14238 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14239
14240 uint realm_len = salt_pos - realm_pos;
14241
14242 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
14243
14244 salt_pos++;
14245
14246 char *data_pos = strchr (salt_pos, '$');
14247
14248 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14249
14250 uint salt_len = data_pos - salt_pos;
14251
14252 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
14253
14254 data_pos++;
14255
14256 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
14257
14258 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
14259
14260 /**
14261 * copy data
14262 */
14263
14264 memcpy (krb5pa->user, user_pos, user_len);
14265 memcpy (krb5pa->realm, realm_pos, realm_len);
14266 memcpy (krb5pa->salt, salt_pos, salt_len);
14267
14268 char *timestamp_ptr = (char *) krb5pa->timestamp;
14269
14270 for (uint i = 0; i < (36 * 2); i += 2)
14271 {
14272 const char p0 = data_pos[i + 0];
14273 const char p1 = data_pos[i + 1];
14274
14275 *timestamp_ptr++ = hex_convert (p1) << 0
14276 | hex_convert (p0) << 4;
14277 }
14278
14279 char *checksum_ptr = (char *) krb5pa->checksum;
14280
14281 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
14282 {
14283 const char p0 = data_pos[i + 0];
14284 const char p1 = data_pos[i + 1];
14285
14286 *checksum_ptr++ = hex_convert (p1) << 0
14287 | hex_convert (p0) << 4;
14288 }
14289
14290 /**
14291 * copy some data to generic buffers to make sorting happy
14292 */
14293
14294 salt->salt_buf[0] = krb5pa->timestamp[0];
14295 salt->salt_buf[1] = krb5pa->timestamp[1];
14296 salt->salt_buf[2] = krb5pa->timestamp[2];
14297 salt->salt_buf[3] = krb5pa->timestamp[3];
14298 salt->salt_buf[4] = krb5pa->timestamp[4];
14299 salt->salt_buf[5] = krb5pa->timestamp[5];
14300 salt->salt_buf[6] = krb5pa->timestamp[6];
14301 salt->salt_buf[7] = krb5pa->timestamp[7];
14302 salt->salt_buf[8] = krb5pa->timestamp[8];
14303
14304 salt->salt_len = 36;
14305
14306 digest[0] = krb5pa->checksum[0];
14307 digest[1] = krb5pa->checksum[1];
14308 digest[2] = krb5pa->checksum[2];
14309 digest[3] = krb5pa->checksum[3];
14310
14311 return (PARSER_OK);
14312 }
14313
14314 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14315 {
14316 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
14317
14318 u32 *digest = (u32 *) hash_buf->digest;
14319
14320 salt_t *salt = hash_buf->salt;
14321
14322 /**
14323 * parse line
14324 */
14325
14326 char *salt_pos = input_buf;
14327
14328 char *hash_pos = strchr (salt_pos, '$');
14329
14330 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14331
14332 uint salt_len = hash_pos - salt_pos;
14333
14334 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14335
14336 hash_pos++;
14337
14338 uint hash_len = input_len - 1 - salt_len;
14339
14340 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14341
14342 /**
14343 * valid some data
14344 */
14345
14346 uint user_len = 0;
14347
14348 for (uint i = 0; i < salt_len; i++)
14349 {
14350 if (salt_pos[i] == ' ') continue;
14351
14352 user_len++;
14353 }
14354
14355 // SAP user names cannot be longer than 12 characters
14356 if (user_len > 12) return (PARSER_SALT_LENGTH);
14357
14358 // SAP user name cannot start with ! or ?
14359 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14360
14361 /**
14362 * copy data
14363 */
14364
14365 char *salt_buf_ptr = (char *) salt->salt_buf;
14366
14367 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14368
14369 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14370
14371 salt->salt_len = salt_len;
14372
14373 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
14374 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
14375 digest[2] = 0;
14376 digest[3] = 0;
14377
14378 digest[0] = byte_swap_32 (digest[0]);
14379 digest[1] = byte_swap_32 (digest[1]);
14380
14381 return (PARSER_OK);
14382 }
14383
14384 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14385 {
14386 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
14387
14388 u32 *digest = (u32 *) hash_buf->digest;
14389
14390 salt_t *salt = hash_buf->salt;
14391
14392 /**
14393 * parse line
14394 */
14395
14396 char *salt_pos = input_buf;
14397
14398 char *hash_pos = strchr (salt_pos, '$');
14399
14400 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14401
14402 uint salt_len = hash_pos - salt_pos;
14403
14404 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14405
14406 hash_pos++;
14407
14408 uint hash_len = input_len - 1 - salt_len;
14409
14410 if (hash_len != 40) return (PARSER_HASH_LENGTH);
14411
14412 /**
14413 * valid some data
14414 */
14415
14416 uint user_len = 0;
14417
14418 for (uint i = 0; i < salt_len; i++)
14419 {
14420 if (salt_pos[i] == ' ') continue;
14421
14422 user_len++;
14423 }
14424
14425 // SAP user names cannot be longer than 12 characters
14426 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
14427 // so far nobody complained so we stay with this because it helps in optimization
14428 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
14429
14430 if (user_len > 12) return (PARSER_SALT_LENGTH);
14431
14432 // SAP user name cannot start with ! or ?
14433 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14434
14435 /**
14436 * copy data
14437 */
14438
14439 char *salt_buf_ptr = (char *) salt->salt_buf;
14440
14441 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14442
14443 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14444
14445 salt->salt_len = salt_len;
14446
14447 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14448 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14449 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14450 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14451 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14452
14453 return (PARSER_OK);
14454 }
14455
14456 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14457 {
14458 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
14459
14460 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14461
14462 u64 *digest = (u64 *) hash_buf->digest;
14463
14464 salt_t *salt = hash_buf->salt;
14465
14466 char *iter_pos = input_buf + 3;
14467
14468 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
14469
14470 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
14471
14472 memcpy ((char *) salt->salt_sign, input_buf, 4);
14473
14474 salt->salt_iter = salt_iter;
14475
14476 char *salt_pos = iter_pos + 1;
14477
14478 uint salt_len = 8;
14479
14480 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
14481
14482 salt->salt_len = salt_len;
14483
14484 char *hash_pos = salt_pos + salt_len;
14485
14486 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14487
14488 // ugly hack start
14489
14490 char *tmp = (char *) salt->salt_buf_pc;
14491
14492 tmp[0] = hash_pos[42];
14493
14494 // ugly hack end
14495
14496 digest[ 0] = byte_swap_64 (digest[ 0]);
14497 digest[ 1] = byte_swap_64 (digest[ 1]);
14498 digest[ 2] = byte_swap_64 (digest[ 2]);
14499 digest[ 3] = byte_swap_64 (digest[ 3]);
14500 digest[ 4] = 0;
14501 digest[ 5] = 0;
14502 digest[ 6] = 0;
14503 digest[ 7] = 0;
14504
14505 return (PARSER_OK);
14506 }
14507
14508 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14509 {
14510 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
14511
14512 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14513
14514 u32 *digest = (u32 *) hash_buf->digest;
14515
14516 salt_t *salt = hash_buf->salt;
14517
14518 char *salt_buf = input_buf + 6;
14519
14520 uint salt_len = 16;
14521
14522 char *salt_buf_ptr = (char *) salt->salt_buf;
14523
14524 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14525
14526 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14527
14528 salt->salt_len = salt_len;
14529
14530 char *hash_pos = input_buf + 6 + 16;
14531
14532 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14533 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14534 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14535 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14536 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14537 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
14538 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
14539 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
14540
14541 return (PARSER_OK);
14542 }
14543
14544 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14545 {
14546 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
14547
14548 u32 *digest = (u32 *) hash_buf->digest;
14549
14550 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14551 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14552 digest[2] = 0;
14553 digest[3] = 0;
14554
14555 return (PARSER_OK);
14556 }
14557
14558 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14559 {
14560 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
14561
14562 u32 *digest = (u32 *) hash_buf->digest;
14563
14564 salt_t *salt = hash_buf->salt;
14565
14566 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
14567
14568 char *saltbuf_pos = input_buf;
14569
14570 char *hashbuf_pos = strchr (saltbuf_pos, ':');
14571
14572 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14573
14574 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
14575
14576 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
14577 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
14578
14579 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
14580
14581 hashbuf_pos++;
14582
14583 uint hashbuf_len = input_len - saltbuf_len - 1;
14584
14585 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
14586
14587 char *salt_ptr = (char *) saltbuf_pos;
14588 char *rakp_ptr = (char *) rakp->salt_buf;
14589
14590 uint i;
14591 uint j;
14592
14593 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
14594 {
14595 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
14596 }
14597
14598 rakp_ptr[j] = 0x80;
14599
14600 rakp->salt_len = j;
14601
14602 for (i = 0; i < 64; i++)
14603 {
14604 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
14605 }
14606
14607 salt->salt_buf[0] = rakp->salt_buf[0];
14608 salt->salt_buf[1] = rakp->salt_buf[1];
14609 salt->salt_buf[2] = rakp->salt_buf[2];
14610 salt->salt_buf[3] = rakp->salt_buf[3];
14611 salt->salt_buf[4] = rakp->salt_buf[4];
14612 salt->salt_buf[5] = rakp->salt_buf[5];
14613 salt->salt_buf[6] = rakp->salt_buf[6];
14614 salt->salt_buf[7] = rakp->salt_buf[7];
14615
14616 salt->salt_len = 32; // muss min. 32 haben
14617
14618 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14619 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14620 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14621 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14622 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14623
14624 return (PARSER_OK);
14625 }
14626
14627 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14628 {
14629 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
14630
14631 u32 *digest = (u32 *) hash_buf->digest;
14632
14633 salt_t *salt = hash_buf->salt;
14634
14635 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
14636
14637 char *salt_pos = input_buf + 1;
14638
14639 memcpy (salt->salt_buf, salt_pos, 8);
14640
14641 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14642 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14643
14644 salt->salt_len = 8;
14645
14646 char *hash_pos = salt_pos + 8;
14647
14648 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14649 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14650 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14651 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14652 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14653
14654 digest[0] -= SHA1M_A;
14655 digest[1] -= SHA1M_B;
14656 digest[2] -= SHA1M_C;
14657 digest[3] -= SHA1M_D;
14658 digest[4] -= SHA1M_E;
14659
14660 return (PARSER_OK);
14661 }
14662
14663 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14664 {
14665 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
14666
14667 u32 *digest = (u32 *) hash_buf->digest;
14668
14669 salt_t *salt = hash_buf->salt;
14670
14671 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14672 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14673 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14674 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14675
14676 digest[0] = byte_swap_32 (digest[0]);
14677 digest[1] = byte_swap_32 (digest[1]);
14678 digest[2] = byte_swap_32 (digest[2]);
14679 digest[3] = byte_swap_32 (digest[3]);
14680
14681 digest[0] -= MD5M_A;
14682 digest[1] -= MD5M_B;
14683 digest[2] -= MD5M_C;
14684 digest[3] -= MD5M_D;
14685
14686 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14687
14688 char *salt_buf_ptr = input_buf + 32 + 1;
14689
14690 u32 *salt_buf = salt->salt_buf;
14691
14692 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
14693 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
14694 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
14695 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
14696
14697 salt_buf[0] = byte_swap_32 (salt_buf[0]);
14698 salt_buf[1] = byte_swap_32 (salt_buf[1]);
14699 salt_buf[2] = byte_swap_32 (salt_buf[2]);
14700 salt_buf[3] = byte_swap_32 (salt_buf[3]);
14701
14702 salt->salt_len = 16 + 1;
14703
14704 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14705
14706 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
14707
14708 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
14709
14710 return (PARSER_OK);
14711 }
14712
14713 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14714 {
14715 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
14716
14717 u32 *digest = (u32 *) hash_buf->digest;
14718
14719 salt_t *salt = hash_buf->salt;
14720
14721 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
14722
14723 /**
14724 * parse line
14725 */
14726
14727 char *hashbuf_pos = input_buf;
14728
14729 char *saltbuf_pos = strchr (hashbuf_pos, ':');
14730
14731 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14732
14733 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
14734
14735 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
14736
14737 saltbuf_pos++;
14738
14739 char *iteration_pos = strchr (saltbuf_pos, ':');
14740
14741 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14742
14743 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14744
14745 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14746
14747 iteration_pos++;
14748
14749 char *databuf_pos = strchr (iteration_pos, ':');
14750
14751 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14752
14753 const uint iteration_len = databuf_pos - iteration_pos;
14754
14755 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14756 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
14757
14758 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
14759
14760 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
14761 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
14762
14763 databuf_pos++;
14764
14765 // digest
14766
14767 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14768 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14769 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14770 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14771 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14772 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
14773 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
14774 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
14775
14776 // salt
14777
14778 char *saltbuf_ptr = (char *) salt->salt_buf;
14779
14780 for (uint i = 0; i < saltbuf_len; i += 2)
14781 {
14782 const char p0 = saltbuf_pos[i + 0];
14783 const char p1 = saltbuf_pos[i + 1];
14784
14785 *saltbuf_ptr++ = hex_convert (p1) << 0
14786 | hex_convert (p0) << 4;
14787 }
14788
14789 salt->salt_buf[4] = 0x01000000;
14790 salt->salt_buf[5] = 0x80;
14791
14792 salt->salt_len = saltbuf_len / 2;
14793
14794 // iteration
14795
14796 salt->salt_iter = atoi (iteration_pos) - 1;
14797
14798 // data
14799
14800 char *databuf_ptr = (char *) cloudkey->data_buf;
14801
14802 for (uint i = 0; i < databuf_len; i += 2)
14803 {
14804 const char p0 = databuf_pos[i + 0];
14805 const char p1 = databuf_pos[i + 1];
14806
14807 *databuf_ptr++ = hex_convert (p1) << 0
14808 | hex_convert (p0) << 4;
14809 }
14810
14811 *databuf_ptr++ = 0x80;
14812
14813 for (uint i = 0; i < 512; i++)
14814 {
14815 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
14816 }
14817
14818 cloudkey->data_len = databuf_len / 2;
14819
14820 return (PARSER_OK);
14821 }
14822
14823 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14824 {
14825 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
14826
14827 u32 *digest = (u32 *) hash_buf->digest;
14828
14829 salt_t *salt = hash_buf->salt;
14830
14831 /**
14832 * parse line
14833 */
14834
14835 char *hashbuf_pos = input_buf;
14836
14837 char *domainbuf_pos = strchr (hashbuf_pos, ':');
14838
14839 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14840
14841 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
14842
14843 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
14844
14845 domainbuf_pos++;
14846
14847 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
14848
14849 char *saltbuf_pos = strchr (domainbuf_pos, ':');
14850
14851 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14852
14853 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
14854
14855 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
14856
14857 saltbuf_pos++;
14858
14859 char *iteration_pos = strchr (saltbuf_pos, ':');
14860
14861 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14862
14863 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14864
14865 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
14866
14867 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
14868
14869 iteration_pos++;
14870
14871 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
14872
14873 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14874 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
14875
14876 // ok, the plan for this algorithm is the following:
14877 // we have 2 salts here, the domain-name and a random salt
14878 // while both are used in the initial transformation,
14879 // only the random salt is used in the following iterations
14880 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
14881 // and one that includes only the real salt (stored into salt_buf[]).
14882 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
14883
14884 u8 tmp_buf[100] = { 0 };
14885
14886 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
14887
14888 memcpy (digest, tmp_buf, 20);
14889
14890 digest[0] = byte_swap_32 (digest[0]);
14891 digest[1] = byte_swap_32 (digest[1]);
14892 digest[2] = byte_swap_32 (digest[2]);
14893 digest[3] = byte_swap_32 (digest[3]);
14894 digest[4] = byte_swap_32 (digest[4]);
14895
14896 // domain
14897
14898 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14899
14900 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
14901
14902 char *len_ptr = NULL;
14903
14904 for (uint i = 0; i < domainbuf_len; i++)
14905 {
14906 if (salt_buf_pc_ptr[i] == '.')
14907 {
14908 len_ptr = &salt_buf_pc_ptr[i];
14909
14910 *len_ptr = 0;
14911 }
14912 else
14913 {
14914 *len_ptr += 1;
14915 }
14916 }
14917
14918 salt->salt_buf_pc[7] = domainbuf_len;
14919
14920 // "real" salt
14921
14922 char *salt_buf_ptr = (char *) salt->salt_buf;
14923
14924 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
14925
14926 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14927
14928 salt->salt_len = salt_len;
14929
14930 // iteration
14931
14932 salt->salt_iter = atoi (iteration_pos);
14933
14934 return (PARSER_OK);
14935 }
14936
14937 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14938 {
14939 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14940
14941 u32 *digest = (u32 *) hash_buf->digest;
14942
14943 salt_t *salt = hash_buf->salt;
14944
14945 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14946 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14947 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14948 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14949 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14950
14951 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14952
14953 uint salt_len = input_len - 40 - 1;
14954
14955 char *salt_buf = input_buf + 40 + 1;
14956
14957 char *salt_buf_ptr = (char *) salt->salt_buf;
14958
14959 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14960
14961 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14962
14963 salt->salt_len = salt_len;
14964
14965 return (PARSER_OK);
14966 }
14967
14968 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14969 {
14970 const u8 ascii_to_ebcdic[] =
14971 {
14972 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14973 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14974 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14975 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14976 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14977 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14978 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14979 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14980 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14981 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14982 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14983 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14984 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14985 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14986 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14987 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14988 };
14989
14990 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14991
14992 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14993
14994 u32 *digest = (u32 *) hash_buf->digest;
14995
14996 salt_t *salt = hash_buf->salt;
14997
14998 char *salt_pos = input_buf + 6 + 1;
14999
15000 char *digest_pos = strchr (salt_pos, '*');
15001
15002 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15003
15004 uint salt_len = digest_pos - salt_pos;
15005
15006 if (salt_len > 8) return (PARSER_SALT_LENGTH);
15007
15008 uint hash_len = input_len - 1 - salt_len - 1 - 6;
15009
15010 if (hash_len != 16) return (PARSER_HASH_LENGTH);
15011
15012 digest_pos++;
15013
15014 char *salt_buf_ptr = (char *) salt->salt_buf;
15015 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
15016
15017 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
15018
15019 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15020
15021 salt->salt_len = salt_len;
15022
15023 for (uint i = 0; i < salt_len; i++)
15024 {
15025 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
15026 }
15027 for (uint i = salt_len; i < 8; i++)
15028 {
15029 salt_buf_pc_ptr[i] = 0x40;
15030 }
15031
15032 uint tt;
15033
15034 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
15035
15036 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
15037 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
15038
15039 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
15040 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
15041
15042 digest[0] = byte_swap_32 (digest[0]);
15043 digest[1] = byte_swap_32 (digest[1]);
15044
15045 IP (digest[0], digest[1], tt);
15046
15047 digest[0] = rotr32 (digest[0], 29);
15048 digest[1] = rotr32 (digest[1], 29);
15049 digest[2] = 0;
15050 digest[3] = 0;
15051
15052 return (PARSER_OK);
15053 }
15054
15055 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15056 {
15057 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
15058
15059 u32 *digest = (u32 *) hash_buf->digest;
15060
15061 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15062 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15063 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15064 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15065
15066 digest[0] = byte_swap_32 (digest[0]);
15067 digest[1] = byte_swap_32 (digest[1]);
15068 digest[2] = byte_swap_32 (digest[2]);
15069 digest[3] = byte_swap_32 (digest[3]);
15070
15071 return (PARSER_OK);
15072 }
15073
15074 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15075 {
15076 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
15077
15078 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
15079
15080 u32 *digest = (u32 *) hash_buf->digest;
15081
15082 salt_t *salt = hash_buf->salt;
15083
15084 u8 tmp_buf[120] = { 0 };
15085
15086 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
15087
15088 tmp_buf[3] += -4; // dont ask!
15089
15090 memcpy (salt->salt_buf, tmp_buf, 5);
15091
15092 salt->salt_len = 5;
15093
15094 memcpy (digest, tmp_buf + 5, 9);
15095
15096 // yes, only 9 byte are needed to crack, but 10 to display
15097
15098 salt->salt_buf_pc[7] = input_buf[20];
15099
15100 return (PARSER_OK);
15101 }
15102
15103 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15104 {
15105 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
15106
15107 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
15108
15109 u32 *digest = (u32 *) hash_buf->digest;
15110
15111 salt_t *salt = hash_buf->salt;
15112
15113 u8 tmp_buf[120] = { 0 };
15114
15115 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
15116
15117 tmp_buf[3] += -4; // dont ask!
15118
15119 // salt
15120
15121 memcpy (salt->salt_buf, tmp_buf, 16);
15122
15123 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)
15124
15125 // iteration
15126
15127 char tmp_iter_buf[11] = { 0 };
15128
15129 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
15130
15131 tmp_iter_buf[10] = 0;
15132
15133 salt->salt_iter = atoi (tmp_iter_buf);
15134
15135 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
15136 {
15137 return (PARSER_SALT_ITERATION);
15138 }
15139
15140 salt->salt_iter--; // first round in init
15141
15142 // 2 additional bytes for display only
15143
15144 salt->salt_buf_pc[0] = tmp_buf[26];
15145 salt->salt_buf_pc[1] = tmp_buf[27];
15146
15147 // digest
15148
15149 memcpy (digest, tmp_buf + 28, 8);
15150
15151 digest[0] = byte_swap_32 (digest[0]);
15152 digest[1] = byte_swap_32 (digest[1]);
15153 digest[2] = 0;
15154 digest[3] = 0;
15155
15156 return (PARSER_OK);
15157 }
15158
15159 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15160 {
15161 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
15162
15163 u32 *digest = (u32 *) hash_buf->digest;
15164
15165 salt_t *salt = hash_buf->salt;
15166
15167 char *salt_buf_pos = input_buf;
15168
15169 char *hash_buf_pos = salt_buf_pos + 6;
15170
15171 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
15172 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
15173 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
15174 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
15175 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
15176 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
15177 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
15178 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
15179
15180 digest[0] -= SHA256M_A;
15181 digest[1] -= SHA256M_B;
15182 digest[2] -= SHA256M_C;
15183 digest[3] -= SHA256M_D;
15184 digest[4] -= SHA256M_E;
15185 digest[5] -= SHA256M_F;
15186 digest[6] -= SHA256M_G;
15187 digest[7] -= SHA256M_H;
15188
15189 char *salt_buf_ptr = (char *) salt->salt_buf;
15190
15191 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
15192
15193 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15194
15195 salt->salt_len = salt_len;
15196
15197 return (PARSER_OK);
15198 }
15199
15200 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15201 {
15202 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
15203
15204 u32 *digest = (u32 *) hash_buf->digest;
15205
15206 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15207
15208 salt_t *salt = hash_buf->salt;
15209
15210 char *salt_buf = input_buf + 6;
15211
15212 char *digest_buf = strchr (salt_buf, '$');
15213
15214 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15215
15216 uint salt_len = digest_buf - salt_buf;
15217
15218 digest_buf++; // skip the '$' symbol
15219
15220 char *salt_buf_ptr = (char *) salt->salt_buf;
15221
15222 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15223
15224 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15225
15226 salt->salt_len = salt_len;
15227
15228 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15229 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15230 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15231 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15232
15233 digest[0] = byte_swap_32 (digest[0]);
15234 digest[1] = byte_swap_32 (digest[1]);
15235 digest[2] = byte_swap_32 (digest[2]);
15236 digest[3] = byte_swap_32 (digest[3]);
15237
15238 digest[0] -= MD5M_A;
15239 digest[1] -= MD5M_B;
15240 digest[2] -= MD5M_C;
15241 digest[3] -= MD5M_D;
15242
15243 return (PARSER_OK);
15244 }
15245
15246 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15247 {
15248 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
15249
15250 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15251
15252 u32 *digest = (u32 *) hash_buf->digest;
15253
15254 salt_t *salt = hash_buf->salt;
15255
15256 char *salt_buf = input_buf + 3;
15257
15258 char *digest_buf = strchr (salt_buf, '$');
15259
15260 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15261
15262 uint salt_len = digest_buf - salt_buf;
15263
15264 digest_buf++; // skip the '$' symbol
15265
15266 char *salt_buf_ptr = (char *) salt->salt_buf;
15267
15268 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15269
15270 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15271
15272 salt_buf_ptr[salt_len] = 0x2d;
15273
15274 salt->salt_len = salt_len + 1;
15275
15276 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15277 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15278 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15279 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15280
15281 digest[0] = byte_swap_32 (digest[0]);
15282 digest[1] = byte_swap_32 (digest[1]);
15283 digest[2] = byte_swap_32 (digest[2]);
15284 digest[3] = byte_swap_32 (digest[3]);
15285
15286 digest[0] -= MD5M_A;
15287 digest[1] -= MD5M_B;
15288 digest[2] -= MD5M_C;
15289 digest[3] -= MD5M_D;
15290
15291 return (PARSER_OK);
15292 }
15293
15294 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15295 {
15296 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
15297
15298 u32 *digest = (u32 *) hash_buf->digest;
15299
15300 salt_t *salt = hash_buf->salt;
15301
15302 u8 tmp_buf[100] = { 0 };
15303
15304 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
15305
15306 memcpy (digest, tmp_buf, 20);
15307
15308 digest[0] = byte_swap_32 (digest[0]);
15309 digest[1] = byte_swap_32 (digest[1]);
15310 digest[2] = byte_swap_32 (digest[2]);
15311 digest[3] = byte_swap_32 (digest[3]);
15312 digest[4] = byte_swap_32 (digest[4]);
15313
15314 digest[0] -= SHA1M_A;
15315 digest[1] -= SHA1M_B;
15316 digest[2] -= SHA1M_C;
15317 digest[3] -= SHA1M_D;
15318 digest[4] -= SHA1M_E;
15319
15320 salt->salt_buf[0] = 0x80;
15321
15322 salt->salt_len = 0;
15323
15324 return (PARSER_OK);
15325 }
15326
15327 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15328 {
15329 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
15330
15331 u32 *digest = (u32 *) hash_buf->digest;
15332
15333 salt_t *salt = hash_buf->salt;
15334
15335 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15336 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15337 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15338 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15339
15340 digest[0] = byte_swap_32 (digest[0]);
15341 digest[1] = byte_swap_32 (digest[1]);
15342 digest[2] = byte_swap_32 (digest[2]);
15343 digest[3] = byte_swap_32 (digest[3]);
15344
15345 digest[0] -= MD5M_A;
15346 digest[1] -= MD5M_B;
15347 digest[2] -= MD5M_C;
15348 digest[3] -= MD5M_D;
15349
15350 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15351
15352 uint salt_len = input_len - 32 - 1;
15353
15354 char *salt_buf = input_buf + 32 + 1;
15355
15356 char *salt_buf_ptr = (char *) salt->salt_buf;
15357
15358 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15359
15360 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15361
15362 /*
15363 * add static "salt" part
15364 */
15365
15366 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
15367
15368 salt_len += 8;
15369
15370 salt->salt_len = salt_len;
15371
15372 return (PARSER_OK);
15373 }
15374
15375 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15376 {
15377 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
15378
15379 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
15380
15381 u32 *digest = (u32 *) hash_buf->digest;
15382
15383 salt_t *salt = hash_buf->salt;
15384
15385 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
15386
15387 /**
15388 * parse line
15389 */
15390
15391 char *saltlen_pos = input_buf + 1 + 3 + 1;
15392
15393 char *saltbuf_pos = strchr (saltlen_pos, '$');
15394
15395 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15396
15397 uint saltlen_len = saltbuf_pos - saltlen_pos;
15398
15399 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
15400
15401 saltbuf_pos++;
15402
15403 char *keylen_pos = strchr (saltbuf_pos, '$');
15404
15405 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15406
15407 uint saltbuf_len = keylen_pos - saltbuf_pos;
15408
15409 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
15410
15411 keylen_pos++;
15412
15413 char *keybuf_pos = strchr (keylen_pos, '$');
15414
15415 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15416
15417 uint keylen_len = keybuf_pos - keylen_pos;
15418
15419 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
15420
15421 keybuf_pos++;
15422
15423 char *databuf_pos = strchr (keybuf_pos, '$');
15424
15425 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15426
15427 uint keybuf_len = databuf_pos - keybuf_pos;
15428
15429 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
15430
15431 databuf_pos++;
15432
15433 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
15434
15435 if (data_len != 3072) return (PARSER_SALT_LENGTH);
15436
15437 /**
15438 * copy data
15439 */
15440
15441 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
15442 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
15443 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
15444 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
15445
15446 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
15447 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
15448 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
15449 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
15450
15451 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15452 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15453 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15454 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15455
15456 salt->salt_len = 16;
15457 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
15458
15459 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
15460 {
15461 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
15462 }
15463
15464 return (PARSER_OK);
15465 }
15466
15467 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15468 {
15469 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
15470
15471 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15472
15473 u32 *digest = (u32 *) hash_buf->digest;
15474
15475 salt_t *salt = hash_buf->salt;
15476
15477 /**
15478 * parse line
15479 */
15480
15481 // first is the N salt parameter
15482
15483 char *N_pos = input_buf + 6;
15484
15485 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15486
15487 N_pos++;
15488
15489 salt->scrypt_N = atoi (N_pos);
15490
15491 // r
15492
15493 char *r_pos = strchr (N_pos, ':');
15494
15495 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15496
15497 r_pos++;
15498
15499 salt->scrypt_r = atoi (r_pos);
15500
15501 // p
15502
15503 char *p_pos = strchr (r_pos, ':');
15504
15505 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15506
15507 p_pos++;
15508
15509 salt->scrypt_p = atoi (p_pos);
15510
15511 // salt
15512
15513 char *saltbuf_pos = strchr (p_pos, ':');
15514
15515 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15516
15517 saltbuf_pos++;
15518
15519 char *hash_pos = strchr (saltbuf_pos, ':');
15520
15521 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15522
15523 hash_pos++;
15524
15525 // base64 decode
15526
15527 int salt_len_base64 = hash_pos - saltbuf_pos;
15528
15529 if (salt_len_base64 > 45) return (PARSER_SALT_LENGTH);
15530
15531 u8 tmp_buf[33] = { 0 };
15532
15533 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, salt_len_base64, tmp_buf);
15534
15535 char *salt_buf_ptr = (char *) salt->salt_buf;
15536
15537 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
15538
15539 salt->salt_len = tmp_len;
15540 salt->salt_iter = 1;
15541
15542 // digest - base64 decode
15543
15544 memset (tmp_buf, 0, sizeof (tmp_buf));
15545
15546 tmp_len = input_len - (hash_pos - input_buf);
15547
15548 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
15549
15550 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
15551
15552 memcpy (digest, tmp_buf, 32);
15553
15554 return (PARSER_OK);
15555 }
15556
15557 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15558 {
15559 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
15560
15561 u32 *digest = (u32 *) hash_buf->digest;
15562
15563 salt_t *salt = hash_buf->salt;
15564
15565 /**
15566 * parse line
15567 */
15568
15569 char decrypted[76] = { 0 }; // iv + hash
15570
15571 juniper_decrypt_hash (input_buf, decrypted);
15572
15573 char *md5crypt_hash = decrypted + 12;
15574
15575 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
15576
15577 salt->salt_iter = ROUNDS_MD5CRYPT;
15578
15579 char *salt_pos = md5crypt_hash + 3;
15580
15581 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
15582
15583 salt->salt_len = hash_pos - salt_pos; // should be 8
15584
15585 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
15586
15587 hash_pos++;
15588
15589 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
15590
15591 return (PARSER_OK);
15592 }
15593
15594 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15595 {
15596 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
15597
15598 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15599
15600 u32 *digest = (u32 *) hash_buf->digest;
15601
15602 salt_t *salt = hash_buf->salt;
15603
15604 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15605
15606 /**
15607 * parse line
15608 */
15609
15610 // first is *raw* salt
15611
15612 char *salt_pos = input_buf + 3;
15613
15614 char *hash_pos = strchr (salt_pos, '$');
15615
15616 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15617
15618 uint salt_len = hash_pos - salt_pos;
15619
15620 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15621
15622 hash_pos++;
15623
15624 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15625
15626 memcpy (salt_buf_ptr, salt_pos, 14);
15627
15628 salt_buf_ptr[17] = 0x01;
15629 salt_buf_ptr[18] = 0x80;
15630
15631 // add some stuff to normal salt to make sorted happy
15632
15633 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15634 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15635 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15636 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15637
15638 salt->salt_len = salt_len;
15639 salt->salt_iter = ROUNDS_CISCO8 - 1;
15640
15641 // base64 decode hash
15642
15643 u8 tmp_buf[100] = { 0 };
15644
15645 uint hash_len = input_len - 3 - salt_len - 1;
15646
15647 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15648
15649 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15650
15651 memcpy (digest, tmp_buf, 32);
15652
15653 digest[0] = byte_swap_32 (digest[0]);
15654 digest[1] = byte_swap_32 (digest[1]);
15655 digest[2] = byte_swap_32 (digest[2]);
15656 digest[3] = byte_swap_32 (digest[3]);
15657 digest[4] = byte_swap_32 (digest[4]);
15658 digest[5] = byte_swap_32 (digest[5]);
15659 digest[6] = byte_swap_32 (digest[6]);
15660 digest[7] = byte_swap_32 (digest[7]);
15661
15662 return (PARSER_OK);
15663 }
15664
15665 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15666 {
15667 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
15668
15669 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15670
15671 u32 *digest = (u32 *) hash_buf->digest;
15672
15673 salt_t *salt = hash_buf->salt;
15674
15675 /**
15676 * parse line
15677 */
15678
15679 // first is *raw* salt
15680
15681 char *salt_pos = input_buf + 3;
15682
15683 char *hash_pos = strchr (salt_pos, '$');
15684
15685 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15686
15687 uint salt_len = hash_pos - salt_pos;
15688
15689 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15690
15691 salt->salt_len = salt_len;
15692 hash_pos++;
15693
15694 char *salt_buf_ptr = (char *) salt->salt_buf;
15695
15696 memcpy (salt_buf_ptr, salt_pos, salt_len);
15697 salt_buf_ptr[salt_len] = 0;
15698
15699 // base64 decode hash
15700
15701 u8 tmp_buf[100] = { 0 };
15702
15703 uint hash_len = input_len - 3 - salt_len - 1;
15704
15705 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15706
15707 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15708
15709 memcpy (digest, tmp_buf, 32);
15710
15711 // fixed:
15712 salt->scrypt_N = 16384;
15713 salt->scrypt_r = 1;
15714 salt->scrypt_p = 1;
15715 salt->salt_iter = 1;
15716
15717 return (PARSER_OK);
15718 }
15719
15720 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15721 {
15722 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
15723
15724 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15725
15726 u32 *digest = (u32 *) hash_buf->digest;
15727
15728 salt_t *salt = hash_buf->salt;
15729
15730 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
15731
15732 /**
15733 * parse line
15734 */
15735
15736 char *version_pos = input_buf + 8 + 1;
15737
15738 char *verifierHashSize_pos = strchr (version_pos, '*');
15739
15740 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15741
15742 u32 version_len = verifierHashSize_pos - version_pos;
15743
15744 if (version_len != 4) return (PARSER_SALT_LENGTH);
15745
15746 verifierHashSize_pos++;
15747
15748 char *keySize_pos = strchr (verifierHashSize_pos, '*');
15749
15750 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15751
15752 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
15753
15754 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
15755
15756 keySize_pos++;
15757
15758 char *saltSize_pos = strchr (keySize_pos, '*');
15759
15760 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15761
15762 u32 keySize_len = saltSize_pos - keySize_pos;
15763
15764 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15765
15766 saltSize_pos++;
15767
15768 char *osalt_pos = strchr (saltSize_pos, '*');
15769
15770 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15771
15772 u32 saltSize_len = osalt_pos - saltSize_pos;
15773
15774 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15775
15776 osalt_pos++;
15777
15778 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15779
15780 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15781
15782 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15783
15784 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15785
15786 encryptedVerifier_pos++;
15787
15788 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15789
15790 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15791
15792 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15793
15794 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15795
15796 encryptedVerifierHash_pos++;
15797
15798 u32 encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - verifierHashSize_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15799
15800 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15801
15802 const uint version = atoi (version_pos);
15803
15804 if (version != 2007) return (PARSER_SALT_VALUE);
15805
15806 const uint verifierHashSize = atoi (verifierHashSize_pos);
15807
15808 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
15809
15810 const uint keySize = atoi (keySize_pos);
15811
15812 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
15813
15814 office2007->keySize = keySize;
15815
15816 const uint saltSize = atoi (saltSize_pos);
15817
15818 if (saltSize != 16) return (PARSER_SALT_VALUE);
15819
15820 /**
15821 * salt
15822 */
15823
15824 salt->salt_len = 16;
15825 salt->salt_iter = ROUNDS_OFFICE2007;
15826
15827 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15828 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15829 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15830 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15831
15832 /**
15833 * esalt
15834 */
15835
15836 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15837 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15838 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15839 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15840
15841 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15842 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15843 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15844 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15845 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15846
15847 /**
15848 * digest
15849 */
15850
15851 digest[0] = office2007->encryptedVerifierHash[0];
15852 digest[1] = office2007->encryptedVerifierHash[1];
15853 digest[2] = office2007->encryptedVerifierHash[2];
15854 digest[3] = office2007->encryptedVerifierHash[3];
15855
15856 return (PARSER_OK);
15857 }
15858
15859 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15860 {
15861 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
15862
15863 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15864
15865 u32 *digest = (u32 *) hash_buf->digest;
15866
15867 salt_t *salt = hash_buf->salt;
15868
15869 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
15870
15871 /**
15872 * parse line
15873 */
15874
15875 char *version_pos = input_buf + 8 + 1;
15876
15877 char *spinCount_pos = strchr (version_pos, '*');
15878
15879 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15880
15881 u32 version_len = spinCount_pos - version_pos;
15882
15883 if (version_len != 4) return (PARSER_SALT_LENGTH);
15884
15885 spinCount_pos++;
15886
15887 char *keySize_pos = strchr (spinCount_pos, '*');
15888
15889 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15890
15891 u32 spinCount_len = keySize_pos - spinCount_pos;
15892
15893 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15894
15895 keySize_pos++;
15896
15897 char *saltSize_pos = strchr (keySize_pos, '*');
15898
15899 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15900
15901 u32 keySize_len = saltSize_pos - keySize_pos;
15902
15903 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15904
15905 saltSize_pos++;
15906
15907 char *osalt_pos = strchr (saltSize_pos, '*');
15908
15909 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15910
15911 u32 saltSize_len = osalt_pos - saltSize_pos;
15912
15913 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15914
15915 osalt_pos++;
15916
15917 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15918
15919 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15920
15921 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15922
15923 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15924
15925 encryptedVerifier_pos++;
15926
15927 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15928
15929 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15930
15931 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15932
15933 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15934
15935 encryptedVerifierHash_pos++;
15936
15937 u32 encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - spinCount_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15938
15939 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15940
15941 const uint version = atoi (version_pos);
15942
15943 if (version != 2010) return (PARSER_SALT_VALUE);
15944
15945 const uint spinCount = atoi (spinCount_pos);
15946
15947 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15948
15949 const uint keySize = atoi (keySize_pos);
15950
15951 if (keySize != 128) return (PARSER_SALT_VALUE);
15952
15953 const uint saltSize = atoi (saltSize_pos);
15954
15955 if (saltSize != 16) return (PARSER_SALT_VALUE);
15956
15957 /**
15958 * salt
15959 */
15960
15961 salt->salt_len = 16;
15962 salt->salt_iter = spinCount;
15963
15964 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15965 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15966 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15967 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15968
15969 /**
15970 * esalt
15971 */
15972
15973 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15974 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15975 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15976 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15977
15978 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15979 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15980 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15981 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15982 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15983 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15984 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15985 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15986
15987 /**
15988 * digest
15989 */
15990
15991 digest[0] = office2010->encryptedVerifierHash[0];
15992 digest[1] = office2010->encryptedVerifierHash[1];
15993 digest[2] = office2010->encryptedVerifierHash[2];
15994 digest[3] = office2010->encryptedVerifierHash[3];
15995
15996 return (PARSER_OK);
15997 }
15998
15999 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16000 {
16001 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
16002
16003 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
16004
16005 u32 *digest = (u32 *) hash_buf->digest;
16006
16007 salt_t *salt = hash_buf->salt;
16008
16009 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
16010
16011 /**
16012 * parse line
16013 */
16014
16015 char *version_pos = input_buf + 8 + 1;
16016
16017 char *spinCount_pos = strchr (version_pos, '*');
16018
16019 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16020
16021 u32 version_len = spinCount_pos - version_pos;
16022
16023 if (version_len != 4) return (PARSER_SALT_LENGTH);
16024
16025 spinCount_pos++;
16026
16027 char *keySize_pos = strchr (spinCount_pos, '*');
16028
16029 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16030
16031 u32 spinCount_len = keySize_pos - spinCount_pos;
16032
16033 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
16034
16035 keySize_pos++;
16036
16037 char *saltSize_pos = strchr (keySize_pos, '*');
16038
16039 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16040
16041 u32 keySize_len = saltSize_pos - keySize_pos;
16042
16043 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
16044
16045 saltSize_pos++;
16046
16047 char *osalt_pos = strchr (saltSize_pos, '*');
16048
16049 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16050
16051 u32 saltSize_len = osalt_pos - saltSize_pos;
16052
16053 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
16054
16055 osalt_pos++;
16056
16057 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16058
16059 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16060
16061 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16062
16063 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16064
16065 encryptedVerifier_pos++;
16066
16067 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16068
16069 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16070
16071 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16072
16073 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16074
16075 encryptedVerifierHash_pos++;
16076
16077 u32 encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - spinCount_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16078
16079 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
16080
16081 const uint version = atoi (version_pos);
16082
16083 if (version != 2013) return (PARSER_SALT_VALUE);
16084
16085 const uint spinCount = atoi (spinCount_pos);
16086
16087 if (spinCount != 100000) return (PARSER_SALT_VALUE);
16088
16089 const uint keySize = atoi (keySize_pos);
16090
16091 if (keySize != 256) return (PARSER_SALT_VALUE);
16092
16093 const uint saltSize = atoi (saltSize_pos);
16094
16095 if (saltSize != 16) return (PARSER_SALT_VALUE);
16096
16097 /**
16098 * salt
16099 */
16100
16101 salt->salt_len = 16;
16102 salt->salt_iter = spinCount;
16103
16104 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16105 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16106 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16107 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16108
16109 /**
16110 * esalt
16111 */
16112
16113 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16114 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16115 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16116 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16117
16118 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16119 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16120 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16121 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16122 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16123 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
16124 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
16125 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
16126
16127 /**
16128 * digest
16129 */
16130
16131 digest[0] = office2013->encryptedVerifierHash[0];
16132 digest[1] = office2013->encryptedVerifierHash[1];
16133 digest[2] = office2013->encryptedVerifierHash[2];
16134 digest[3] = office2013->encryptedVerifierHash[3];
16135
16136 return (PARSER_OK);
16137 }
16138
16139 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16140 {
16141 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
16142
16143 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16144
16145 u32 *digest = (u32 *) hash_buf->digest;
16146
16147 salt_t *salt = hash_buf->salt;
16148
16149 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
16150
16151 /**
16152 * parse line
16153 */
16154
16155 char *version_pos = input_buf + 11;
16156
16157 char *osalt_pos = strchr (version_pos, '*');
16158
16159 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16160
16161 u32 version_len = osalt_pos - version_pos;
16162
16163 if (version_len != 1) return (PARSER_SALT_LENGTH);
16164
16165 osalt_pos++;
16166
16167 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16168
16169 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16170
16171 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16172
16173 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16174
16175 encryptedVerifier_pos++;
16176
16177 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16178
16179 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16180
16181 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16182
16183 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16184
16185 encryptedVerifierHash_pos++;
16186
16187 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16188
16189 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16190
16191 const uint version = *version_pos - 0x30;
16192
16193 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16194
16195 /**
16196 * esalt
16197 */
16198
16199 oldoffice01->version = version;
16200
16201 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16202 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16203 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16204 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16205
16206 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16207 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16208 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16209 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16210
16211 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16212 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16213 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16214 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16215
16216 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16217 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16218 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16219 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16220
16221 /**
16222 * salt
16223 */
16224
16225 salt->salt_len = 16;
16226
16227 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16228 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16229 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16230 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16231
16232 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16233 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16234 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16235 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16236
16237 // this is a workaround as office produces multiple documents with the same salt
16238
16239 salt->salt_len += 32;
16240
16241 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16242 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16243 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16244 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16245 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16246 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16247 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16248 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16249
16250 /**
16251 * digest
16252 */
16253
16254 digest[0] = oldoffice01->encryptedVerifierHash[0];
16255 digest[1] = oldoffice01->encryptedVerifierHash[1];
16256 digest[2] = oldoffice01->encryptedVerifierHash[2];
16257 digest[3] = oldoffice01->encryptedVerifierHash[3];
16258
16259 return (PARSER_OK);
16260 }
16261
16262 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16263 {
16264 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
16265 }
16266
16267 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16268 {
16269 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
16270
16271 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16272
16273 u32 *digest = (u32 *) hash_buf->digest;
16274
16275 salt_t *salt = hash_buf->salt;
16276
16277 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
16278
16279 /**
16280 * parse line
16281 */
16282
16283 char *version_pos = input_buf + 11;
16284
16285 char *osalt_pos = strchr (version_pos, '*');
16286
16287 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16288
16289 u32 version_len = osalt_pos - version_pos;
16290
16291 if (version_len != 1) return (PARSER_SALT_LENGTH);
16292
16293 osalt_pos++;
16294
16295 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16296
16297 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16298
16299 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16300
16301 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16302
16303 encryptedVerifier_pos++;
16304
16305 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16306
16307 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16308
16309 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16310
16311 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16312
16313 encryptedVerifierHash_pos++;
16314
16315 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16316
16317 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16318
16319 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16320
16321 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16322
16323 rc4key_pos++;
16324
16325 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16326
16327 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16328
16329 const uint version = *version_pos - 0x30;
16330
16331 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16332
16333 /**
16334 * esalt
16335 */
16336
16337 oldoffice01->version = version;
16338
16339 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16340 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16341 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16342 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16343
16344 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16345 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16346 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16347 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16348
16349 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16350 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16351 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16352 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16353
16354 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16355 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16356 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16357 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16358
16359 oldoffice01->rc4key[1] = 0;
16360 oldoffice01->rc4key[0] = 0;
16361
16362 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16363 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16364 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16365 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16366 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16367 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16368 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16369 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16370 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16371 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16372
16373 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
16374 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
16375
16376 /**
16377 * salt
16378 */
16379
16380 salt->salt_len = 16;
16381
16382 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16383 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16384 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16385 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16386
16387 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16388 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16389 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16390 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16391
16392 // this is a workaround as office produces multiple documents with the same salt
16393
16394 salt->salt_len += 32;
16395
16396 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16397 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16398 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16399 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16400 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16401 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16402 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16403 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16404
16405 /**
16406 * digest
16407 */
16408
16409 digest[0] = oldoffice01->rc4key[0];
16410 digest[1] = oldoffice01->rc4key[1];
16411 digest[2] = 0;
16412 digest[3] = 0;
16413
16414 return (PARSER_OK);
16415 }
16416
16417 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16418 {
16419 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
16420
16421 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16422
16423 u32 *digest = (u32 *) hash_buf->digest;
16424
16425 salt_t *salt = hash_buf->salt;
16426
16427 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16428
16429 /**
16430 * parse line
16431 */
16432
16433 char *version_pos = input_buf + 11;
16434
16435 char *osalt_pos = strchr (version_pos, '*');
16436
16437 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16438
16439 u32 version_len = osalt_pos - version_pos;
16440
16441 if (version_len != 1) return (PARSER_SALT_LENGTH);
16442
16443 osalt_pos++;
16444
16445 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16446
16447 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16448
16449 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16450
16451 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16452
16453 encryptedVerifier_pos++;
16454
16455 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16456
16457 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16458
16459 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16460
16461 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16462
16463 encryptedVerifierHash_pos++;
16464
16465 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16466
16467 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16468
16469 const uint version = *version_pos - 0x30;
16470
16471 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16472
16473 /**
16474 * esalt
16475 */
16476
16477 oldoffice34->version = version;
16478
16479 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16480 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16481 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16482 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16483
16484 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16485 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16486 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16487 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16488
16489 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16490 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16491 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16492 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16493 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16494
16495 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16496 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16497 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16498 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16499 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16500
16501 /**
16502 * salt
16503 */
16504
16505 salt->salt_len = 16;
16506
16507 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16508 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16509 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16510 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16511
16512 // this is a workaround as office produces multiple documents with the same salt
16513
16514 salt->salt_len += 32;
16515
16516 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16517 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16518 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16519 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16520 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16521 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16522 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16523 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16524
16525 /**
16526 * digest
16527 */
16528
16529 digest[0] = oldoffice34->encryptedVerifierHash[0];
16530 digest[1] = oldoffice34->encryptedVerifierHash[1];
16531 digest[2] = oldoffice34->encryptedVerifierHash[2];
16532 digest[3] = oldoffice34->encryptedVerifierHash[3];
16533
16534 return (PARSER_OK);
16535 }
16536
16537 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16538 {
16539 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16540
16541 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
16542 }
16543
16544 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16545 {
16546 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
16547
16548 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16549
16550 u32 *digest = (u32 *) hash_buf->digest;
16551
16552 salt_t *salt = hash_buf->salt;
16553
16554 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16555
16556 /**
16557 * parse line
16558 */
16559
16560 char *version_pos = input_buf + 11;
16561
16562 char *osalt_pos = strchr (version_pos, '*');
16563
16564 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16565
16566 u32 version_len = osalt_pos - version_pos;
16567
16568 if (version_len != 1) return (PARSER_SALT_LENGTH);
16569
16570 osalt_pos++;
16571
16572 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16573
16574 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16575
16576 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16577
16578 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16579
16580 encryptedVerifier_pos++;
16581
16582 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16583
16584 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16585
16586 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16587
16588 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16589
16590 encryptedVerifierHash_pos++;
16591
16592 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16593
16594 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16595
16596 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16597
16598 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16599
16600 rc4key_pos++;
16601
16602 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16603
16604 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16605
16606 const uint version = *version_pos - 0x30;
16607
16608 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16609
16610 /**
16611 * esalt
16612 */
16613
16614 oldoffice34->version = version;
16615
16616 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16617 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16618 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16619 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16620
16621 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16622 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16623 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16624 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16625
16626 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16627 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16628 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16629 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16630 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16631
16632 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16633 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16634 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16635 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16636 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16637
16638 oldoffice34->rc4key[1] = 0;
16639 oldoffice34->rc4key[0] = 0;
16640
16641 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16642 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16643 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16644 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16645 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16646 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16647 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16648 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16649 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16650 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16651
16652 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
16653 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
16654
16655 /**
16656 * salt
16657 */
16658
16659 salt->salt_len = 16;
16660
16661 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16662 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16663 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16664 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16665
16666 // this is a workaround as office produces multiple documents with the same salt
16667
16668 salt->salt_len += 32;
16669
16670 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16671 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16672 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16673 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16674 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16675 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16676 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16677 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16678
16679 /**
16680 * digest
16681 */
16682
16683 digest[0] = oldoffice34->rc4key[0];
16684 digest[1] = oldoffice34->rc4key[1];
16685 digest[2] = 0;
16686 digest[3] = 0;
16687
16688 return (PARSER_OK);
16689 }
16690
16691 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16692 {
16693 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
16694
16695 u32 *digest = (u32 *) hash_buf->digest;
16696
16697 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16698 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16699 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16700 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16701
16702 digest[0] = byte_swap_32 (digest[0]);
16703 digest[1] = byte_swap_32 (digest[1]);
16704 digest[2] = byte_swap_32 (digest[2]);
16705 digest[3] = byte_swap_32 (digest[3]);
16706
16707 return (PARSER_OK);
16708 }
16709
16710 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16711 {
16712 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
16713
16714 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16715
16716 u32 *digest = (u32 *) hash_buf->digest;
16717
16718 salt_t *salt = hash_buf->salt;
16719
16720 char *signature_pos = input_buf;
16721
16722 char *salt_pos = strchr (signature_pos, '$');
16723
16724 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16725
16726 u32 signature_len = salt_pos - signature_pos;
16727
16728 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
16729
16730 salt_pos++;
16731
16732 char *hash_pos = strchr (salt_pos, '$');
16733
16734 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16735
16736 u32 salt_len = hash_pos - salt_pos;
16737
16738 if (salt_len > 32) return (PARSER_SALT_LENGTH);
16739
16740 hash_pos++;
16741
16742 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
16743
16744 if (hash_len != 40) return (PARSER_SALT_LENGTH);
16745
16746 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
16747 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
16748 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
16749 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
16750 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
16751
16752 digest[0] -= SHA1M_A;
16753 digest[1] -= SHA1M_B;
16754 digest[2] -= SHA1M_C;
16755 digest[3] -= SHA1M_D;
16756 digest[4] -= SHA1M_E;
16757
16758 char *salt_buf_ptr = (char *) salt->salt_buf;
16759
16760 memcpy (salt_buf_ptr, salt_pos, salt_len);
16761
16762 salt->salt_len = salt_len;
16763
16764 return (PARSER_OK);
16765 }
16766
16767 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16768 {
16769 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
16770
16771 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
16772
16773 u32 *digest = (u32 *) hash_buf->digest;
16774
16775 salt_t *salt = hash_buf->salt;
16776
16777 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16778
16779 /**
16780 * parse line
16781 */
16782
16783 char *iter_pos = input_buf + 14;
16784
16785 const int iter = atoi (iter_pos);
16786
16787 if (iter < 1) return (PARSER_SALT_ITERATION);
16788
16789 salt->salt_iter = iter - 1;
16790
16791 char *salt_pos = strchr (iter_pos, '$');
16792
16793 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16794
16795 salt_pos++;
16796
16797 char *hash_pos = strchr (salt_pos, '$');
16798
16799 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16800
16801 const uint salt_len = hash_pos - salt_pos;
16802
16803 hash_pos++;
16804
16805 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16806
16807 memcpy (salt_buf_ptr, salt_pos, salt_len);
16808
16809 salt->salt_len = salt_len;
16810
16811 salt_buf_ptr[salt_len + 3] = 0x01;
16812 salt_buf_ptr[salt_len + 4] = 0x80;
16813
16814 // add some stuff to normal salt to make sorted happy
16815
16816 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16817 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16818 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16819 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16820 salt->salt_buf[4] = salt->salt_iter;
16821
16822 // base64 decode hash
16823
16824 u8 tmp_buf[100] = { 0 };
16825
16826 uint hash_len = input_len - (hash_pos - input_buf);
16827
16828 if (hash_len != 44) return (PARSER_HASH_LENGTH);
16829
16830 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16831
16832 memcpy (digest, tmp_buf, 32);
16833
16834 digest[0] = byte_swap_32 (digest[0]);
16835 digest[1] = byte_swap_32 (digest[1]);
16836 digest[2] = byte_swap_32 (digest[2]);
16837 digest[3] = byte_swap_32 (digest[3]);
16838 digest[4] = byte_swap_32 (digest[4]);
16839 digest[5] = byte_swap_32 (digest[5]);
16840 digest[6] = byte_swap_32 (digest[6]);
16841 digest[7] = byte_swap_32 (digest[7]);
16842
16843 return (PARSER_OK);
16844 }
16845
16846 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16847 {
16848 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
16849
16850 u32 *digest = (u32 *) hash_buf->digest;
16851
16852 salt_t *salt = hash_buf->salt;
16853
16854 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16855 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16856 digest[2] = 0;
16857 digest[3] = 0;
16858
16859 digest[0] = byte_swap_32 (digest[0]);
16860 digest[1] = byte_swap_32 (digest[1]);
16861
16862 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16863 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16864 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16865
16866 char iter_c = input_buf[17];
16867 char iter_d = input_buf[19];
16868
16869 // atm only defaults, let's see if there's more request
16870 if (iter_c != '2') return (PARSER_SALT_ITERATION);
16871 if (iter_d != '4') return (PARSER_SALT_ITERATION);
16872
16873 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
16874
16875 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
16876 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
16877 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
16878 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
16879
16880 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16881 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16882 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16883 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16884
16885 salt->salt_len = 16;
16886
16887 return (PARSER_OK);
16888 }
16889
16890 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16891 {
16892 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
16893
16894 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16895
16896 u32 *digest = (u32 *) hash_buf->digest;
16897
16898 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
16899
16900 salt_t *salt = hash_buf->salt;
16901
16902 char *salt_pos = input_buf + 10;
16903
16904 char *hash_pos = strchr (salt_pos, '$');
16905
16906 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16907
16908 uint salt_len = hash_pos - salt_pos;
16909
16910 hash_pos++;
16911
16912 uint hash_len = input_len - 10 - salt_len - 1;
16913
16914 // base64 decode salt
16915
16916 if (salt_len > 133) return (PARSER_SALT_LENGTH);
16917
16918 u8 tmp_buf[100] = { 0 };
16919
16920 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
16921
16922 if (salt_len > 55) return (PARSER_SALT_LENGTH);
16923
16924 tmp_buf[salt_len] = 0x80;
16925
16926 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
16927
16928 salt->salt_len = salt_len;
16929
16930 // base64 decode hash
16931
16932 if (hash_len > 133) return (PARSER_HASH_LENGTH);
16933
16934 memset (tmp_buf, 0, sizeof (tmp_buf));
16935
16936 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16937
16938 if (hash_len < 32 + 1) return (PARSER_SALT_LENGTH);
16939
16940 uint user_len = hash_len - 32;
16941
16942 const u8 *tmp_hash = tmp_buf + user_len;
16943
16944 user_len--; // skip the trailing space
16945
16946 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16947 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16948 digest[2] = hex_to_u32 (&tmp_hash[16]);
16949 digest[3] = hex_to_u32 (&tmp_hash[24]);
16950
16951 digest[0] = byte_swap_32 (digest[0]);
16952 digest[1] = byte_swap_32 (digest[1]);
16953 digest[2] = byte_swap_32 (digest[2]);
16954 digest[3] = byte_swap_32 (digest[3]);
16955
16956 // store username for host only (output hash if cracked)
16957
16958 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16959 memcpy (cram_md5->user, tmp_buf, user_len);
16960
16961 return (PARSER_OK);
16962 }
16963
16964 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16965 {
16966 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16967
16968 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16969
16970 u32 *digest = (u32 *) hash_buf->digest;
16971
16972 salt_t *salt = hash_buf->salt;
16973
16974 char *iter_pos = input_buf + 10;
16975
16976 u32 iter = atoi (iter_pos);
16977
16978 if (iter < 1)
16979 {
16980 return (PARSER_SALT_ITERATION);
16981 }
16982
16983 iter--; // first iteration is special
16984
16985 salt->salt_iter = iter;
16986
16987 char *base64_pos = strchr (iter_pos, '}');
16988
16989 if (base64_pos == NULL)
16990 {
16991 return (PARSER_SIGNATURE_UNMATCHED);
16992 }
16993
16994 base64_pos++;
16995
16996 // base64 decode salt
16997
16998 u32 base64_len = input_len - (base64_pos - input_buf);
16999
17000 u8 tmp_buf[100] = { 0 };
17001
17002 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
17003
17004 if (decoded_len < 24)
17005 {
17006 return (PARSER_SALT_LENGTH);
17007 }
17008
17009 // copy the salt
17010
17011 uint salt_len = decoded_len - 20;
17012
17013 if (salt_len < 4) return (PARSER_SALT_LENGTH);
17014 if (salt_len > 16) return (PARSER_SALT_LENGTH);
17015
17016 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
17017
17018 salt->salt_len = salt_len;
17019
17020 // set digest
17021
17022 u32 *digest_ptr = (u32*) tmp_buf;
17023
17024 digest[0] = byte_swap_32 (digest_ptr[0]);
17025 digest[1] = byte_swap_32 (digest_ptr[1]);
17026 digest[2] = byte_swap_32 (digest_ptr[2]);
17027 digest[3] = byte_swap_32 (digest_ptr[3]);
17028 digest[4] = byte_swap_32 (digest_ptr[4]);
17029
17030 return (PARSER_OK);
17031 }
17032
17033 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17034 {
17035 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
17036
17037 u32 *digest = (u32 *) hash_buf->digest;
17038
17039 salt_t *salt = hash_buf->salt;
17040
17041 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17042 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17043 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17044 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17045 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
17046
17047 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17048
17049 uint salt_len = input_len - 40 - 1;
17050
17051 char *salt_buf = input_buf + 40 + 1;
17052
17053 char *salt_buf_ptr = (char *) salt->salt_buf;
17054
17055 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17056
17057 if (salt_len != 32) return (PARSER_SALT_LENGTH);
17058
17059 salt->salt_len = salt_len;
17060
17061 return (PARSER_OK);
17062 }
17063
17064 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17065 {
17066 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
17067
17068 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17069
17070 u32 *digest = (u32 *) hash_buf->digest;
17071
17072 salt_t *salt = hash_buf->salt;
17073
17074 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17075
17076 /**
17077 * parse line
17078 */
17079
17080 char *V_pos = input_buf + 5;
17081
17082 char *R_pos = strchr (V_pos, '*');
17083
17084 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17085
17086 u32 V_len = R_pos - V_pos;
17087
17088 R_pos++;
17089
17090 char *bits_pos = strchr (R_pos, '*');
17091
17092 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17093
17094 u32 R_len = bits_pos - R_pos;
17095
17096 bits_pos++;
17097
17098 char *P_pos = strchr (bits_pos, '*');
17099
17100 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17101
17102 u32 bits_len = P_pos - bits_pos;
17103
17104 P_pos++;
17105
17106 char *enc_md_pos = strchr (P_pos, '*');
17107
17108 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17109
17110 u32 P_len = enc_md_pos - P_pos;
17111
17112 enc_md_pos++;
17113
17114 char *id_len_pos = strchr (enc_md_pos, '*');
17115
17116 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17117
17118 u32 enc_md_len = id_len_pos - enc_md_pos;
17119
17120 id_len_pos++;
17121
17122 char *id_buf_pos = strchr (id_len_pos, '*');
17123
17124 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17125
17126 u32 id_len_len = id_buf_pos - id_len_pos;
17127
17128 id_buf_pos++;
17129
17130 char *u_len_pos = strchr (id_buf_pos, '*');
17131
17132 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17133
17134 u32 id_buf_len = u_len_pos - id_buf_pos;
17135
17136 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
17137
17138 u_len_pos++;
17139
17140 char *u_buf_pos = strchr (u_len_pos, '*');
17141
17142 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17143
17144 u32 u_len_len = u_buf_pos - u_len_pos;
17145
17146 u_buf_pos++;
17147
17148 char *o_len_pos = strchr (u_buf_pos, '*');
17149
17150 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17151
17152 u32 u_buf_len = o_len_pos - u_buf_pos;
17153
17154 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17155
17156 o_len_pos++;
17157
17158 char *o_buf_pos = strchr (o_len_pos, '*');
17159
17160 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17161
17162 u32 o_len_len = o_buf_pos - o_len_pos;
17163
17164 o_buf_pos++;
17165
17166 u32 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;
17167
17168 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17169
17170 // validate data
17171
17172 const int V = atoi (V_pos);
17173 const int R = atoi (R_pos);
17174 const int P = atoi (P_pos);
17175
17176 if (V != 1) return (PARSER_SALT_VALUE);
17177 if (R != 2) return (PARSER_SALT_VALUE);
17178
17179 const int enc_md = atoi (enc_md_pos);
17180
17181 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17182
17183 const int id_len = atoi (id_len_pos);
17184 const int u_len = atoi (u_len_pos);
17185 const int o_len = atoi (o_len_pos);
17186
17187 if (id_len != 16) return (PARSER_SALT_VALUE);
17188 if (u_len != 32) return (PARSER_SALT_VALUE);
17189 if (o_len != 32) return (PARSER_SALT_VALUE);
17190
17191 const int bits = atoi (bits_pos);
17192
17193 if (bits != 40) return (PARSER_SALT_VALUE);
17194
17195 // copy data to esalt
17196
17197 pdf->V = V;
17198 pdf->R = R;
17199 pdf->P = P;
17200
17201 pdf->enc_md = enc_md;
17202
17203 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17204 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17205 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17206 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17207 pdf->id_len = id_len;
17208
17209 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17210 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17211 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17212 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17213 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17214 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17215 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17216 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17217 pdf->u_len = u_len;
17218
17219 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17220 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17221 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17222 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17223 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17224 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17225 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17226 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17227 pdf->o_len = o_len;
17228
17229 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17230 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17231 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17232 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17233
17234 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17235 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17236 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17237 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17238 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17239 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17240 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17241 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17242
17243 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17244 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17245 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17246 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17247 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17248 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17249 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17250 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17251
17252 // we use ID for salt, maybe needs to change, we will see...
17253
17254 salt->salt_buf[0] = pdf->id_buf[0];
17255 salt->salt_buf[1] = pdf->id_buf[1];
17256 salt->salt_buf[2] = pdf->id_buf[2];
17257 salt->salt_buf[3] = pdf->id_buf[3];
17258 salt->salt_len = pdf->id_len;
17259
17260 digest[0] = pdf->u_buf[0];
17261 digest[1] = pdf->u_buf[1];
17262 digest[2] = pdf->u_buf[2];
17263 digest[3] = pdf->u_buf[3];
17264
17265 return (PARSER_OK);
17266 }
17267
17268 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17269 {
17270 return pdf11_parse_hash (input_buf, input_len, hash_buf);
17271 }
17272
17273 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17274 {
17275 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
17276
17277 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17278
17279 u32 *digest = (u32 *) hash_buf->digest;
17280
17281 salt_t *salt = hash_buf->salt;
17282
17283 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17284
17285 /**
17286 * parse line
17287 */
17288
17289 char *V_pos = input_buf + 5;
17290
17291 char *R_pos = strchr (V_pos, '*');
17292
17293 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17294
17295 u32 V_len = R_pos - V_pos;
17296
17297 R_pos++;
17298
17299 char *bits_pos = strchr (R_pos, '*');
17300
17301 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17302
17303 u32 R_len = bits_pos - R_pos;
17304
17305 bits_pos++;
17306
17307 char *P_pos = strchr (bits_pos, '*');
17308
17309 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17310
17311 u32 bits_len = P_pos - bits_pos;
17312
17313 P_pos++;
17314
17315 char *enc_md_pos = strchr (P_pos, '*');
17316
17317 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17318
17319 u32 P_len = enc_md_pos - P_pos;
17320
17321 enc_md_pos++;
17322
17323 char *id_len_pos = strchr (enc_md_pos, '*');
17324
17325 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17326
17327 u32 enc_md_len = id_len_pos - enc_md_pos;
17328
17329 id_len_pos++;
17330
17331 char *id_buf_pos = strchr (id_len_pos, '*');
17332
17333 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17334
17335 u32 id_len_len = id_buf_pos - id_len_pos;
17336
17337 id_buf_pos++;
17338
17339 char *u_len_pos = strchr (id_buf_pos, '*');
17340
17341 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17342
17343 u32 id_buf_len = u_len_pos - id_buf_pos;
17344
17345 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
17346
17347 u_len_pos++;
17348
17349 char *u_buf_pos = strchr (u_len_pos, '*');
17350
17351 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17352
17353 u32 u_len_len = u_buf_pos - u_len_pos;
17354
17355 u_buf_pos++;
17356
17357 char *o_len_pos = strchr (u_buf_pos, '*');
17358
17359 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17360
17361 u32 u_buf_len = o_len_pos - u_buf_pos;
17362
17363 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17364
17365 o_len_pos++;
17366
17367 char *o_buf_pos = strchr (o_len_pos, '*');
17368
17369 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17370
17371 u32 o_len_len = o_buf_pos - o_len_pos;
17372
17373 o_buf_pos++;
17374
17375 char *rc4key_pos = strchr (o_buf_pos, ':');
17376
17377 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17378
17379 u32 o_buf_len = rc4key_pos - o_buf_pos;
17380
17381 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17382
17383 rc4key_pos++;
17384
17385 u32 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;
17386
17387 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
17388
17389 // validate data
17390
17391 const int V = atoi (V_pos);
17392 const int R = atoi (R_pos);
17393 const int P = atoi (P_pos);
17394
17395 if (V != 1) return (PARSER_SALT_VALUE);
17396 if (R != 2) return (PARSER_SALT_VALUE);
17397
17398 const int enc_md = atoi (enc_md_pos);
17399
17400 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17401
17402 const int id_len = atoi (id_len_pos);
17403 const int u_len = atoi (u_len_pos);
17404 const int o_len = atoi (o_len_pos);
17405
17406 if (id_len != 16) return (PARSER_SALT_VALUE);
17407 if (u_len != 32) return (PARSER_SALT_VALUE);
17408 if (o_len != 32) return (PARSER_SALT_VALUE);
17409
17410 const int bits = atoi (bits_pos);
17411
17412 if (bits != 40) return (PARSER_SALT_VALUE);
17413
17414 // copy data to esalt
17415
17416 pdf->V = V;
17417 pdf->R = R;
17418 pdf->P = P;
17419
17420 pdf->enc_md = enc_md;
17421
17422 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17423 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17424 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17425 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17426 pdf->id_len = id_len;
17427
17428 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17429 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17430 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17431 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17432 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17433 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17434 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17435 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17436 pdf->u_len = u_len;
17437
17438 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17439 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17440 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17441 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17442 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17443 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17444 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17445 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17446 pdf->o_len = o_len;
17447
17448 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17449 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17450 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17451 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17452
17453 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17454 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17455 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17456 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17457 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17458 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17459 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17460 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17461
17462 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17463 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17464 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17465 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17466 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17467 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17468 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17469 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17470
17471 pdf->rc4key[1] = 0;
17472 pdf->rc4key[0] = 0;
17473
17474 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
17475 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
17476 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
17477 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
17478 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
17479 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
17480 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
17481 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
17482 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
17483 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
17484
17485 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
17486 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
17487
17488 // we use ID for salt, maybe needs to change, we will see...
17489
17490 salt->salt_buf[0] = pdf->id_buf[0];
17491 salt->salt_buf[1] = pdf->id_buf[1];
17492 salt->salt_buf[2] = pdf->id_buf[2];
17493 salt->salt_buf[3] = pdf->id_buf[3];
17494 salt->salt_buf[4] = pdf->u_buf[0];
17495 salt->salt_buf[5] = pdf->u_buf[1];
17496 salt->salt_buf[6] = pdf->o_buf[0];
17497 salt->salt_buf[7] = pdf->o_buf[1];
17498 salt->salt_len = pdf->id_len + 16;
17499
17500 digest[0] = pdf->rc4key[0];
17501 digest[1] = pdf->rc4key[1];
17502 digest[2] = 0;
17503 digest[3] = 0;
17504
17505 return (PARSER_OK);
17506 }
17507
17508 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17509 {
17510 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
17511
17512 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17513
17514 u32 *digest = (u32 *) hash_buf->digest;
17515
17516 salt_t *salt = hash_buf->salt;
17517
17518 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17519
17520 /**
17521 * parse line
17522 */
17523
17524 char *V_pos = input_buf + 5;
17525
17526 char *R_pos = strchr (V_pos, '*');
17527
17528 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17529
17530 u32 V_len = R_pos - V_pos;
17531
17532 R_pos++;
17533
17534 char *bits_pos = strchr (R_pos, '*');
17535
17536 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17537
17538 u32 R_len = bits_pos - R_pos;
17539
17540 bits_pos++;
17541
17542 char *P_pos = strchr (bits_pos, '*');
17543
17544 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17545
17546 u32 bits_len = P_pos - bits_pos;
17547
17548 P_pos++;
17549
17550 char *enc_md_pos = strchr (P_pos, '*');
17551
17552 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17553
17554 u32 P_len = enc_md_pos - P_pos;
17555
17556 enc_md_pos++;
17557
17558 char *id_len_pos = strchr (enc_md_pos, '*');
17559
17560 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17561
17562 u32 enc_md_len = id_len_pos - enc_md_pos;
17563
17564 id_len_pos++;
17565
17566 char *id_buf_pos = strchr (id_len_pos, '*');
17567
17568 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17569
17570 u32 id_len_len = id_buf_pos - id_len_pos;
17571
17572 id_buf_pos++;
17573
17574 char *u_len_pos = strchr (id_buf_pos, '*');
17575
17576 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17577
17578 u32 id_buf_len = u_len_pos - id_buf_pos;
17579
17580 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
17581
17582 u_len_pos++;
17583
17584 char *u_buf_pos = strchr (u_len_pos, '*');
17585
17586 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17587
17588 u32 u_len_len = u_buf_pos - u_len_pos;
17589
17590 u_buf_pos++;
17591
17592 char *o_len_pos = strchr (u_buf_pos, '*');
17593
17594 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17595
17596 u32 u_buf_len = o_len_pos - u_buf_pos;
17597
17598 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17599
17600 o_len_pos++;
17601
17602 char *o_buf_pos = strchr (o_len_pos, '*');
17603
17604 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17605
17606 u32 o_len_len = o_buf_pos - o_len_pos;
17607
17608 o_buf_pos++;
17609
17610 u32 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;
17611
17612 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17613
17614 // validate data
17615
17616 const int V = atoi (V_pos);
17617 const int R = atoi (R_pos);
17618 const int P = atoi (P_pos);
17619
17620 int vr_ok = 0;
17621
17622 if ((V == 2) && (R == 3)) vr_ok = 1;
17623 if ((V == 4) && (R == 4)) vr_ok = 1;
17624
17625 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17626
17627 const int id_len = atoi (id_len_pos);
17628 const int u_len = atoi (u_len_pos);
17629 const int o_len = atoi (o_len_pos);
17630
17631 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
17632
17633 if (u_len != 32) return (PARSER_SALT_VALUE);
17634 if (o_len != 32) return (PARSER_SALT_VALUE);
17635
17636 const int bits = atoi (bits_pos);
17637
17638 if (bits != 128) return (PARSER_SALT_VALUE);
17639
17640 int enc_md = 1;
17641
17642 if (R >= 4)
17643 {
17644 enc_md = atoi (enc_md_pos);
17645 }
17646
17647 // copy data to esalt
17648
17649 pdf->V = V;
17650 pdf->R = R;
17651 pdf->P = P;
17652
17653 pdf->enc_md = enc_md;
17654
17655 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17656 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17657 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17658 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17659
17660 if (id_len == 32)
17661 {
17662 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
17663 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
17664 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
17665 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
17666 }
17667
17668 pdf->id_len = id_len;
17669
17670 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17671 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17672 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17673 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17674 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17675 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17676 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17677 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17678 pdf->u_len = u_len;
17679
17680 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17681 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17682 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17683 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17684 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17685 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17686 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17687 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17688 pdf->o_len = o_len;
17689
17690 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17691 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17692 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17693 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17694
17695 if (id_len == 32)
17696 {
17697 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
17698 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
17699 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
17700 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
17701 }
17702
17703 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17704 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17705 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17706 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17707 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17708 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17709 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17710 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17711
17712 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17713 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17714 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17715 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17716 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17717 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17718 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17719 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17720
17721 // precompute rc4 data for later use
17722
17723 uint padding[8] =
17724 {
17725 0x5e4ebf28,
17726 0x418a754e,
17727 0x564e0064,
17728 0x0801faff,
17729 0xb6002e2e,
17730 0x803e68d0,
17731 0xfea90c2f,
17732 0x7a695364
17733 };
17734
17735 // md5
17736
17737 uint salt_pc_block[32] = { 0 };
17738
17739 char *salt_pc_ptr = (char *) salt_pc_block;
17740
17741 memcpy (salt_pc_ptr, padding, 32);
17742 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
17743
17744 uint salt_pc_digest[4] = { 0 };
17745
17746 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
17747
17748 pdf->rc4data[0] = salt_pc_digest[0];
17749 pdf->rc4data[1] = salt_pc_digest[1];
17750
17751 // we use ID for salt, maybe needs to change, we will see...
17752
17753 salt->salt_buf[0] = pdf->id_buf[0];
17754 salt->salt_buf[1] = pdf->id_buf[1];
17755 salt->salt_buf[2] = pdf->id_buf[2];
17756 salt->salt_buf[3] = pdf->id_buf[3];
17757 salt->salt_buf[4] = pdf->u_buf[0];
17758 salt->salt_buf[5] = pdf->u_buf[1];
17759 salt->salt_buf[6] = pdf->o_buf[0];
17760 salt->salt_buf[7] = pdf->o_buf[1];
17761 salt->salt_len = pdf->id_len + 16;
17762
17763 salt->salt_iter = ROUNDS_PDF14;
17764
17765 digest[0] = pdf->u_buf[0];
17766 digest[1] = pdf->u_buf[1];
17767 digest[2] = 0;
17768 digest[3] = 0;
17769
17770 return (PARSER_OK);
17771 }
17772
17773 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17774 {
17775 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
17776
17777 if (ret != PARSER_OK)
17778 {
17779 return ret;
17780 }
17781
17782 u32 *digest = (u32 *) hash_buf->digest;
17783
17784 salt_t *salt = hash_buf->salt;
17785
17786 digest[0] -= SHA256M_A;
17787 digest[1] -= SHA256M_B;
17788 digest[2] -= SHA256M_C;
17789 digest[3] -= SHA256M_D;
17790 digest[4] -= SHA256M_E;
17791 digest[5] -= SHA256M_F;
17792 digest[6] -= SHA256M_G;
17793 digest[7] -= SHA256M_H;
17794
17795 salt->salt_buf[2] = 0x80;
17796
17797 return (PARSER_OK);
17798 }
17799
17800 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17801 {
17802 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
17803
17804 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17805
17806 u32 *digest = (u32 *) hash_buf->digest;
17807
17808 salt_t *salt = hash_buf->salt;
17809
17810 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17811
17812 /**
17813 * parse line
17814 */
17815
17816 char *V_pos = input_buf + 5;
17817
17818 char *R_pos = strchr (V_pos, '*');
17819
17820 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17821
17822 u32 V_len = R_pos - V_pos;
17823
17824 R_pos++;
17825
17826 char *bits_pos = strchr (R_pos, '*');
17827
17828 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17829
17830 u32 R_len = bits_pos - R_pos;
17831
17832 bits_pos++;
17833
17834 char *P_pos = strchr (bits_pos, '*');
17835
17836 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17837
17838 u32 bits_len = P_pos - bits_pos;
17839
17840 P_pos++;
17841
17842 char *enc_md_pos = strchr (P_pos, '*');
17843
17844 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17845
17846 u32 P_len = enc_md_pos - P_pos;
17847
17848 enc_md_pos++;
17849
17850 char *id_len_pos = strchr (enc_md_pos, '*');
17851
17852 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17853
17854 u32 enc_md_len = id_len_pos - enc_md_pos;
17855
17856 id_len_pos++;
17857
17858 char *id_buf_pos = strchr (id_len_pos, '*');
17859
17860 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17861
17862 u32 id_len_len = id_buf_pos - id_len_pos;
17863
17864 id_buf_pos++;
17865
17866 char *u_len_pos = strchr (id_buf_pos, '*');
17867
17868 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17869
17870 u32 id_buf_len = u_len_pos - id_buf_pos;
17871
17872 u_len_pos++;
17873
17874 char *u_buf_pos = strchr (u_len_pos, '*');
17875
17876 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17877
17878 u32 u_len_len = u_buf_pos - u_len_pos;
17879
17880 u_buf_pos++;
17881
17882 char *o_len_pos = strchr (u_buf_pos, '*');
17883
17884 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17885
17886 u32 u_buf_len = o_len_pos - u_buf_pos;
17887
17888 o_len_pos++;
17889
17890 char *o_buf_pos = strchr (o_len_pos, '*');
17891
17892 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17893
17894 u32 o_len_len = o_buf_pos - o_len_pos;
17895
17896 o_buf_pos++;
17897
17898 char *last = strchr (o_buf_pos, '*');
17899
17900 if (last == NULL) last = input_buf + input_len;
17901
17902 u32 o_buf_len = last - o_buf_pos;
17903
17904 // validate data
17905
17906 const int V = atoi (V_pos);
17907 const int R = atoi (R_pos);
17908
17909 int vr_ok = 0;
17910
17911 if ((V == 5) && (R == 5)) vr_ok = 1;
17912 if ((V == 5) && (R == 6)) vr_ok = 1;
17913
17914 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17915
17916 const int bits = atoi (bits_pos);
17917
17918 if (bits != 256) return (PARSER_SALT_VALUE);
17919
17920 int enc_md = atoi (enc_md_pos);
17921
17922 if (enc_md != 1) return (PARSER_SALT_VALUE);
17923
17924 const uint id_len = atoi (id_len_pos);
17925 const uint u_len = atoi (u_len_pos);
17926 const uint o_len = atoi (o_len_pos);
17927
17928 if (V_len > 6) return (PARSER_SALT_LENGTH);
17929 if (R_len > 6) return (PARSER_SALT_LENGTH);
17930 if (P_len > 6) return (PARSER_SALT_LENGTH);
17931 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
17932 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
17933 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
17934 if (bits_len > 6) return (PARSER_SALT_LENGTH);
17935 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17936
17937 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17938 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17939 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17940
17941 // copy data to esalt
17942
17943 if (u_len < 40) return (PARSER_SALT_VALUE);
17944
17945 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17946 {
17947 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17948 }
17949
17950 salt->salt_buf[0] = pdf->u_buf[8];
17951 salt->salt_buf[1] = pdf->u_buf[9];
17952
17953 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17954 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17955
17956 salt->salt_len = 8;
17957 salt->salt_iter = ROUNDS_PDF17L8;
17958
17959 digest[0] = pdf->u_buf[0];
17960 digest[1] = pdf->u_buf[1];
17961 digest[2] = pdf->u_buf[2];
17962 digest[3] = pdf->u_buf[3];
17963 digest[4] = pdf->u_buf[4];
17964 digest[5] = pdf->u_buf[5];
17965 digest[6] = pdf->u_buf[6];
17966 digest[7] = pdf->u_buf[7];
17967
17968 return (PARSER_OK);
17969 }
17970
17971 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17972 {
17973 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17974
17975 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17976
17977 u32 *digest = (u32 *) hash_buf->digest;
17978
17979 salt_t *salt = hash_buf->salt;
17980
17981 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17982
17983 /**
17984 * parse line
17985 */
17986
17987 // iterations
17988
17989 char *iter_pos = input_buf + 7;
17990
17991 u32 iter = atoi (iter_pos);
17992
17993 if (iter < 1) return (PARSER_SALT_ITERATION);
17994 if (iter > 999999) return (PARSER_SALT_ITERATION);
17995
17996 // first is *raw* salt
17997
17998 char *salt_pos = strchr (iter_pos, ':');
17999
18000 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18001
18002 salt_pos++;
18003
18004 char *hash_pos = strchr (salt_pos, ':');
18005
18006 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18007
18008 u32 salt_len = hash_pos - salt_pos;
18009
18010 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18011
18012 hash_pos++;
18013
18014 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18015
18016 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18017
18018 // decode salt
18019
18020 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
18021
18022 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18023
18024 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18025
18026 salt_buf_ptr[salt_len + 3] = 0x01;
18027 salt_buf_ptr[salt_len + 4] = 0x80;
18028
18029 salt->salt_len = salt_len;
18030 salt->salt_iter = iter - 1;
18031
18032 // decode hash
18033
18034 u8 tmp_buf[100] = { 0 };
18035
18036 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18037
18038 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18039
18040 memcpy (digest, tmp_buf, 16);
18041
18042 digest[0] = byte_swap_32 (digest[0]);
18043 digest[1] = byte_swap_32 (digest[1]);
18044 digest[2] = byte_swap_32 (digest[2]);
18045 digest[3] = byte_swap_32 (digest[3]);
18046
18047 // add some stuff to normal salt to make sorted happy
18048
18049 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
18050 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
18051 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
18052 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
18053 salt->salt_buf[4] = salt->salt_iter;
18054
18055 return (PARSER_OK);
18056 }
18057
18058 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18059 {
18060 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
18061
18062 u32 *digest = (u32 *) hash_buf->digest;
18063
18064 salt_t *salt = hash_buf->salt;
18065
18066 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18067 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18068 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18069 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18070
18071 digest[0] = byte_swap_32 (digest[0]);
18072 digest[1] = byte_swap_32 (digest[1]);
18073 digest[2] = byte_swap_32 (digest[2]);
18074 digest[3] = byte_swap_32 (digest[3]);
18075
18076 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18077
18078 uint salt_len = input_len - 32 - 1;
18079
18080 char *salt_buf = input_buf + 32 + 1;
18081
18082 char *salt_buf_ptr = (char *) salt->salt_buf;
18083
18084 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18085
18086 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18087
18088 salt->salt_len = salt_len;
18089
18090 return (PARSER_OK);
18091 }
18092
18093 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18094 {
18095 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
18096
18097 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18098
18099 u32 *digest = (u32 *) hash_buf->digest;
18100
18101 salt_t *salt = hash_buf->salt;
18102
18103 char *user_pos = input_buf + 10;
18104
18105 char *salt_pos = strchr (user_pos, '*');
18106
18107 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18108
18109 salt_pos++;
18110
18111 char *hash_pos = strchr (salt_pos, '*');
18112
18113 hash_pos++;
18114
18115 uint hash_len = input_len - (hash_pos - input_buf);
18116
18117 if (hash_len != 32) return (PARSER_HASH_LENGTH);
18118
18119 uint user_len = salt_pos - user_pos - 1;
18120
18121 uint salt_len = hash_pos - salt_pos - 1;
18122
18123 if (salt_len != 8) return (PARSER_SALT_LENGTH);
18124
18125 /*
18126 * store digest
18127 */
18128
18129 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18130 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18131 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18132 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18133
18134 digest[0] = byte_swap_32 (digest[0]);
18135 digest[1] = byte_swap_32 (digest[1]);
18136 digest[2] = byte_swap_32 (digest[2]);
18137 digest[3] = byte_swap_32 (digest[3]);
18138
18139 digest[0] -= MD5M_A;
18140 digest[1] -= MD5M_B;
18141 digest[2] -= MD5M_C;
18142 digest[3] -= MD5M_D;
18143
18144 /*
18145 * store salt
18146 */
18147
18148 char *salt_buf_ptr = (char *) salt->salt_buf;
18149
18150 // first 4 bytes are the "challenge"
18151
18152 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
18153 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
18154 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
18155 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
18156
18157 // append the user name
18158
18159 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
18160
18161 salt->salt_len = 4 + user_len;
18162
18163 return (PARSER_OK);
18164 }
18165
18166 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18167 {
18168 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
18169
18170 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18171
18172 u32 *digest = (u32 *) hash_buf->digest;
18173
18174 salt_t *salt = hash_buf->salt;
18175
18176 char *salt_pos = input_buf + 9;
18177
18178 char *hash_pos = strchr (salt_pos, '*');
18179
18180 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18181
18182 hash_pos++;
18183
18184 uint hash_len = input_len - (hash_pos - input_buf);
18185
18186 if (hash_len != 40) return (PARSER_HASH_LENGTH);
18187
18188 uint salt_len = hash_pos - salt_pos - 1;
18189
18190 if (salt_len != 40) return (PARSER_SALT_LENGTH);
18191
18192 /*
18193 * store digest
18194 */
18195
18196 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18197 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18198 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18199 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18200 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18201
18202 /*
18203 * store salt
18204 */
18205
18206 char *salt_buf_ptr = (char *) salt->salt_buf;
18207
18208 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18209
18210 salt->salt_len = salt_len;
18211
18212 return (PARSER_OK);
18213 }
18214
18215 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18216 {
18217 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
18218
18219 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18220
18221 u32 *digest = (u32 *) hash_buf->digest;
18222
18223 salt_t *salt = hash_buf->salt;
18224
18225 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
18226
18227 /**
18228 * parse line
18229 */
18230
18231 char *cry_master_len_pos = input_buf + 9;
18232
18233 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
18234
18235 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18236
18237 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
18238
18239 cry_master_buf_pos++;
18240
18241 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
18242
18243 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18244
18245 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
18246
18247 cry_salt_len_pos++;
18248
18249 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
18250
18251 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18252
18253 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
18254
18255 cry_salt_buf_pos++;
18256
18257 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
18258
18259 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18260
18261 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
18262
18263 cry_rounds_pos++;
18264
18265 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
18266
18267 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18268
18269 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
18270
18271 ckey_len_pos++;
18272
18273 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
18274
18275 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18276
18277 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
18278
18279 ckey_buf_pos++;
18280
18281 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
18282
18283 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18284
18285 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
18286
18287 public_key_len_pos++;
18288
18289 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
18290
18291 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18292
18293 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
18294
18295 public_key_buf_pos++;
18296
18297 u32 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;
18298
18299 const uint cry_master_len = atoi (cry_master_len_pos);
18300 const uint cry_salt_len = atoi (cry_salt_len_pos);
18301 const uint ckey_len = atoi (ckey_len_pos);
18302 const uint public_key_len = atoi (public_key_len_pos);
18303
18304 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
18305 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
18306 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
18307 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
18308
18309 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
18310 {
18311 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
18312
18313 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
18314 }
18315
18316 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
18317 {
18318 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
18319
18320 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
18321 }
18322
18323 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
18324 {
18325 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
18326
18327 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
18328 }
18329
18330 bitcoin_wallet->cry_master_len = cry_master_len / 2;
18331 bitcoin_wallet->ckey_len = ckey_len / 2;
18332 bitcoin_wallet->public_key_len = public_key_len / 2;
18333
18334 /*
18335 * store digest (should be unique enought, hopefully)
18336 */
18337
18338 digest[0] = bitcoin_wallet->cry_master_buf[0];
18339 digest[1] = bitcoin_wallet->cry_master_buf[1];
18340 digest[2] = bitcoin_wallet->cry_master_buf[2];
18341 digest[3] = bitcoin_wallet->cry_master_buf[3];
18342
18343 /*
18344 * store salt
18345 */
18346
18347 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
18348
18349 const uint cry_rounds = atoi (cry_rounds_pos);
18350
18351 salt->salt_iter = cry_rounds - 1;
18352
18353 char *salt_buf_ptr = (char *) salt->salt_buf;
18354
18355 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
18356
18357 salt->salt_len = salt_len;
18358
18359 return (PARSER_OK);
18360 }
18361
18362 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18363 {
18364 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
18365
18366 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18367
18368 u32 *digest = (u32 *) hash_buf->digest;
18369
18370 salt_t *salt = hash_buf->salt;
18371
18372 sip_t *sip = (sip_t *) hash_buf->esalt;
18373
18374 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
18375
18376 char *temp_input_buf = (char *) mymalloc (input_len + 1);
18377
18378 memcpy (temp_input_buf, input_buf, input_len);
18379
18380 // URI_server:
18381
18382 char *URI_server_pos = temp_input_buf + 6;
18383
18384 char *URI_client_pos = strchr (URI_server_pos, '*');
18385
18386 if (URI_client_pos == NULL)
18387 {
18388 myfree (temp_input_buf);
18389
18390 return (PARSER_SEPARATOR_UNMATCHED);
18391 }
18392
18393 URI_client_pos[0] = 0;
18394 URI_client_pos++;
18395
18396 uint URI_server_len = strlen (URI_server_pos);
18397
18398 if (URI_server_len > 512)
18399 {
18400 myfree (temp_input_buf);
18401
18402 return (PARSER_SALT_LENGTH);
18403 }
18404
18405 // URI_client:
18406
18407 char *user_pos = strchr (URI_client_pos, '*');
18408
18409 if (user_pos == NULL)
18410 {
18411 myfree (temp_input_buf);
18412
18413 return (PARSER_SEPARATOR_UNMATCHED);
18414 }
18415
18416 user_pos[0] = 0;
18417 user_pos++;
18418
18419 uint URI_client_len = strlen (URI_client_pos);
18420
18421 if (URI_client_len > 512)
18422 {
18423 myfree (temp_input_buf);
18424
18425 return (PARSER_SALT_LENGTH);
18426 }
18427
18428 // user:
18429
18430 char *realm_pos = strchr (user_pos, '*');
18431
18432 if (realm_pos == NULL)
18433 {
18434 myfree (temp_input_buf);
18435
18436 return (PARSER_SEPARATOR_UNMATCHED);
18437 }
18438
18439 realm_pos[0] = 0;
18440 realm_pos++;
18441
18442 uint user_len = strlen (user_pos);
18443
18444 if (user_len > 116)
18445 {
18446 myfree (temp_input_buf);
18447
18448 return (PARSER_SALT_LENGTH);
18449 }
18450
18451 // realm:
18452
18453 char *method_pos = strchr (realm_pos, '*');
18454
18455 if (method_pos == NULL)
18456 {
18457 myfree (temp_input_buf);
18458
18459 return (PARSER_SEPARATOR_UNMATCHED);
18460 }
18461
18462 method_pos[0] = 0;
18463 method_pos++;
18464
18465 uint realm_len = strlen (realm_pos);
18466
18467 if (realm_len > 116)
18468 {
18469 myfree (temp_input_buf);
18470
18471 return (PARSER_SALT_LENGTH);
18472 }
18473
18474 // method:
18475
18476 char *URI_prefix_pos = strchr (method_pos, '*');
18477
18478 if (URI_prefix_pos == NULL)
18479 {
18480 myfree (temp_input_buf);
18481
18482 return (PARSER_SEPARATOR_UNMATCHED);
18483 }
18484
18485 URI_prefix_pos[0] = 0;
18486 URI_prefix_pos++;
18487
18488 uint method_len = strlen (method_pos);
18489
18490 if (method_len > 246)
18491 {
18492 myfree (temp_input_buf);
18493
18494 return (PARSER_SALT_LENGTH);
18495 }
18496
18497 // URI_prefix:
18498
18499 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
18500
18501 if (URI_resource_pos == NULL)
18502 {
18503 myfree (temp_input_buf);
18504
18505 return (PARSER_SEPARATOR_UNMATCHED);
18506 }
18507
18508 URI_resource_pos[0] = 0;
18509 URI_resource_pos++;
18510
18511 uint URI_prefix_len = strlen (URI_prefix_pos);
18512
18513 if (URI_prefix_len > 245)
18514 {
18515 myfree (temp_input_buf);
18516
18517 return (PARSER_SALT_LENGTH);
18518 }
18519
18520 // URI_resource:
18521
18522 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
18523
18524 if (URI_suffix_pos == NULL)
18525 {
18526 myfree (temp_input_buf);
18527
18528 return (PARSER_SEPARATOR_UNMATCHED);
18529 }
18530
18531 URI_suffix_pos[0] = 0;
18532 URI_suffix_pos++;
18533
18534 uint URI_resource_len = strlen (URI_resource_pos);
18535
18536 if (URI_resource_len < 1 || URI_resource_len > 246)
18537 {
18538 myfree (temp_input_buf);
18539
18540 return (PARSER_SALT_LENGTH);
18541 }
18542
18543 // URI_suffix:
18544
18545 char *nonce_pos = strchr (URI_suffix_pos, '*');
18546
18547 if (nonce_pos == NULL)
18548 {
18549 myfree (temp_input_buf);
18550
18551 return (PARSER_SEPARATOR_UNMATCHED);
18552 }
18553
18554 nonce_pos[0] = 0;
18555 nonce_pos++;
18556
18557 uint URI_suffix_len = strlen (URI_suffix_pos);
18558
18559 if (URI_suffix_len > 245)
18560 {
18561 myfree (temp_input_buf);
18562
18563 return (PARSER_SALT_LENGTH);
18564 }
18565
18566 // nonce:
18567
18568 char *nonce_client_pos = strchr (nonce_pos, '*');
18569
18570 if (nonce_client_pos == NULL)
18571 {
18572 myfree (temp_input_buf);
18573
18574 return (PARSER_SEPARATOR_UNMATCHED);
18575 }
18576
18577 nonce_client_pos[0] = 0;
18578 nonce_client_pos++;
18579
18580 uint nonce_len = strlen (nonce_pos);
18581
18582 if (nonce_len < 1 || nonce_len > 50)
18583 {
18584 myfree (temp_input_buf);
18585
18586 return (PARSER_SALT_LENGTH);
18587 }
18588
18589 // nonce_client:
18590
18591 char *nonce_count_pos = strchr (nonce_client_pos, '*');
18592
18593 if (nonce_count_pos == NULL)
18594 {
18595 myfree (temp_input_buf);
18596
18597 return (PARSER_SEPARATOR_UNMATCHED);
18598 }
18599
18600 nonce_count_pos[0] = 0;
18601 nonce_count_pos++;
18602
18603 uint nonce_client_len = strlen (nonce_client_pos);
18604
18605 if (nonce_client_len > 50)
18606 {
18607 myfree (temp_input_buf);
18608
18609 return (PARSER_SALT_LENGTH);
18610 }
18611
18612 // nonce_count:
18613
18614 char *qop_pos = strchr (nonce_count_pos, '*');
18615
18616 if (qop_pos == NULL)
18617 {
18618 myfree (temp_input_buf);
18619
18620 return (PARSER_SEPARATOR_UNMATCHED);
18621 }
18622
18623 qop_pos[0] = 0;
18624 qop_pos++;
18625
18626 uint nonce_count_len = strlen (nonce_count_pos);
18627
18628 if (nonce_count_len > 50)
18629 {
18630 myfree (temp_input_buf);
18631
18632 return (PARSER_SALT_LENGTH);
18633 }
18634
18635 // qop:
18636
18637 char *directive_pos = strchr (qop_pos, '*');
18638
18639 if (directive_pos == NULL)
18640 {
18641 myfree (temp_input_buf);
18642
18643 return (PARSER_SEPARATOR_UNMATCHED);
18644 }
18645
18646 directive_pos[0] = 0;
18647 directive_pos++;
18648
18649 uint qop_len = strlen (qop_pos);
18650
18651 if (qop_len > 50)
18652 {
18653 myfree (temp_input_buf);
18654
18655 return (PARSER_SALT_LENGTH);
18656 }
18657
18658 // directive
18659
18660 char *digest_pos = strchr (directive_pos, '*');
18661
18662 if (digest_pos == NULL)
18663 {
18664 myfree (temp_input_buf);
18665
18666 return (PARSER_SEPARATOR_UNMATCHED);
18667 }
18668
18669 digest_pos[0] = 0;
18670 digest_pos++;
18671
18672 uint directive_len = strlen (directive_pos);
18673
18674 if (directive_len != 3)
18675 {
18676 myfree (temp_input_buf);
18677
18678 return (PARSER_SALT_LENGTH);
18679 }
18680
18681 if (memcmp (directive_pos, "MD5", 3))
18682 {
18683 log_info ("ERROR: Only the MD5 directive is currently supported\n");
18684
18685 myfree (temp_input_buf);
18686
18687 return (PARSER_SIP_AUTH_DIRECTIVE);
18688 }
18689
18690 /*
18691 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
18692 */
18693
18694 uint md5_len = 0;
18695
18696 uint md5_max_len = 4 * 64;
18697
18698 uint md5_remaining_len = md5_max_len;
18699
18700 uint tmp_md5_buf[64] = { 0 };
18701
18702 char *tmp_md5_ptr = (char *) tmp_md5_buf;
18703
18704 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
18705
18706 md5_len += method_len + 1;
18707 tmp_md5_ptr += method_len + 1;
18708
18709 if (URI_prefix_len > 0)
18710 {
18711 md5_remaining_len = md5_max_len - md5_len;
18712
18713 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
18714
18715 md5_len += URI_prefix_len + 1;
18716 tmp_md5_ptr += URI_prefix_len + 1;
18717 }
18718
18719 md5_remaining_len = md5_max_len - md5_len;
18720
18721 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
18722
18723 md5_len += URI_resource_len;
18724 tmp_md5_ptr += URI_resource_len;
18725
18726 if (URI_suffix_len > 0)
18727 {
18728 md5_remaining_len = md5_max_len - md5_len;
18729
18730 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
18731
18732 md5_len += 1 + URI_suffix_len;
18733 }
18734
18735 uint tmp_digest[4] = { 0 };
18736
18737 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
18738
18739 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
18740 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
18741 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
18742 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
18743
18744 /*
18745 * esalt
18746 */
18747
18748 char *esalt_buf_ptr = (char *) sip->esalt_buf;
18749
18750 uint esalt_len = 0;
18751
18752 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
18753
18754 // there are 2 possibilities for the esalt:
18755
18756 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
18757 {
18758 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
18759
18760 if (esalt_len > max_esalt_len)
18761 {
18762 myfree (temp_input_buf);
18763
18764 return (PARSER_SALT_LENGTH);
18765 }
18766
18767 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
18768 nonce_pos,
18769 nonce_count_pos,
18770 nonce_client_pos,
18771 qop_pos,
18772 tmp_digest[0],
18773 tmp_digest[1],
18774 tmp_digest[2],
18775 tmp_digest[3]);
18776 }
18777 else
18778 {
18779 esalt_len = 1 + nonce_len + 1 + 32;
18780
18781 if (esalt_len > max_esalt_len)
18782 {
18783 myfree (temp_input_buf);
18784
18785 return (PARSER_SALT_LENGTH);
18786 }
18787
18788 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
18789 nonce_pos,
18790 tmp_digest[0],
18791 tmp_digest[1],
18792 tmp_digest[2],
18793 tmp_digest[3]);
18794 }
18795
18796 // add 0x80 to esalt
18797
18798 esalt_buf_ptr[esalt_len] = 0x80;
18799
18800 sip->esalt_len = esalt_len;
18801
18802 /*
18803 * actual salt
18804 */
18805
18806 char *sip_salt_ptr = (char *) sip->salt_buf;
18807
18808 uint salt_len = user_len + 1 + realm_len + 1;
18809
18810 uint max_salt_len = 119;
18811
18812 if (salt_len > max_salt_len)
18813 {
18814 myfree (temp_input_buf);
18815
18816 return (PARSER_SALT_LENGTH);
18817 }
18818
18819 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18820
18821 sip->salt_len = salt_len;
18822
18823 /*
18824 * fake salt (for sorting)
18825 */
18826
18827 char *salt_buf_ptr = (char *) salt->salt_buf;
18828
18829 max_salt_len = 55;
18830
18831 uint fake_salt_len = salt_len;
18832
18833 if (fake_salt_len > max_salt_len)
18834 {
18835 fake_salt_len = max_salt_len;
18836 }
18837
18838 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18839
18840 salt->salt_len = fake_salt_len;
18841
18842 /*
18843 * digest
18844 */
18845
18846 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
18847 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
18848 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
18849 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
18850
18851 digest[0] = byte_swap_32 (digest[0]);
18852 digest[1] = byte_swap_32 (digest[1]);
18853 digest[2] = byte_swap_32 (digest[2]);
18854 digest[3] = byte_swap_32 (digest[3]);
18855
18856 myfree (temp_input_buf);
18857
18858 return (PARSER_OK);
18859 }
18860
18861 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18862 {
18863 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
18864
18865 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18866
18867 u32 *digest = (u32 *) hash_buf->digest;
18868
18869 salt_t *salt = hash_buf->salt;
18870
18871 // digest
18872
18873 char *digest_pos = input_buf;
18874
18875 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
18876 digest[1] = 0;
18877 digest[2] = 0;
18878 digest[3] = 0;
18879
18880 // salt
18881
18882 char *salt_buf = input_buf + 8 + 1;
18883
18884 uint salt_len = 8;
18885
18886 char *salt_buf_ptr = (char *) salt->salt_buf;
18887
18888 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18889
18890 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18891
18892 salt->salt_len = salt_len;
18893
18894 return (PARSER_OK);
18895 }
18896
18897 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18898 {
18899 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
18900
18901 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18902
18903 u32 *digest = (u32 *) hash_buf->digest;
18904
18905 salt_t *salt = hash_buf->salt;
18906
18907 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
18908
18909 /**
18910 * parse line
18911 */
18912
18913 char *p_buf_pos = input_buf + 4;
18914
18915 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
18916
18917 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18918
18919 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
18920
18921 NumCyclesPower_pos++;
18922
18923 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
18924
18925 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18926
18927 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
18928
18929 salt_len_pos++;
18930
18931 char *salt_buf_pos = strchr (salt_len_pos, '$');
18932
18933 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18934
18935 u32 salt_len_len = salt_buf_pos - salt_len_pos;
18936
18937 salt_buf_pos++;
18938
18939 char *iv_len_pos = strchr (salt_buf_pos, '$');
18940
18941 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18942
18943 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
18944
18945 iv_len_pos++;
18946
18947 char *iv_buf_pos = strchr (iv_len_pos, '$');
18948
18949 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18950
18951 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18952
18953 iv_buf_pos++;
18954
18955 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18956
18957 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18958
18959 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18960
18961 crc_buf_pos++;
18962
18963 char *data_len_pos = strchr (crc_buf_pos, '$');
18964
18965 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18966
18967 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18968
18969 data_len_pos++;
18970
18971 char *unpack_size_pos = strchr (data_len_pos, '$');
18972
18973 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18974
18975 u32 data_len_len = unpack_size_pos - data_len_pos;
18976
18977 unpack_size_pos++;
18978
18979 char *data_buf_pos = strchr (unpack_size_pos, '$');
18980
18981 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18982
18983 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18984
18985 data_buf_pos++;
18986
18987 u32 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;
18988
18989 const uint iter = atoi (NumCyclesPower_pos);
18990 const uint crc = atoi (crc_buf_pos);
18991 const uint p_buf = atoi (p_buf_pos);
18992 const uint salt_len = atoi (salt_len_pos);
18993 const uint iv_len = atoi (iv_len_pos);
18994 const uint unpack_size = atoi (unpack_size_pos);
18995 const uint data_len = atoi (data_len_pos);
18996
18997 /**
18998 * verify some data
18999 */
19000
19001 if (p_buf != 0) return (PARSER_SALT_VALUE);
19002 if (salt_len != 0) return (PARSER_SALT_VALUE);
19003
19004 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
19005
19006 if (data_len > 384) return (PARSER_SALT_VALUE);
19007
19008 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
19009
19010 /**
19011 * store data
19012 */
19013
19014 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
19015 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
19016 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
19017 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
19018
19019 seven_zip->iv_len = iv_len;
19020
19021 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
19022
19023 seven_zip->salt_len = 0;
19024
19025 seven_zip->crc = crc;
19026
19027 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
19028 {
19029 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
19030
19031 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
19032 }
19033
19034 seven_zip->data_len = data_len;
19035
19036 seven_zip->unpack_size = unpack_size;
19037
19038 // real salt
19039
19040 salt->salt_buf[0] = seven_zip->data_buf[0];
19041 salt->salt_buf[1] = seven_zip->data_buf[1];
19042 salt->salt_buf[2] = seven_zip->data_buf[2];
19043 salt->salt_buf[3] = seven_zip->data_buf[3];
19044
19045 salt->salt_len = 16;
19046
19047 salt->salt_sign[0] = iter;
19048
19049 salt->salt_iter = 1 << iter;
19050
19051 /**
19052 * digest
19053 */
19054
19055 digest[0] = crc;
19056 digest[1] = 0;
19057 digest[2] = 0;
19058 digest[3] = 0;
19059
19060 return (PARSER_OK);
19061 }
19062
19063 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19064 {
19065 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
19066
19067 u32 *digest = (u32 *) hash_buf->digest;
19068
19069 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
19070 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
19071 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
19072 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
19073 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
19074 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
19075 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
19076 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
19077
19078 digest[0] = byte_swap_32 (digest[0]);
19079 digest[1] = byte_swap_32 (digest[1]);
19080 digest[2] = byte_swap_32 (digest[2]);
19081 digest[3] = byte_swap_32 (digest[3]);
19082 digest[4] = byte_swap_32 (digest[4]);
19083 digest[5] = byte_swap_32 (digest[5]);
19084 digest[6] = byte_swap_32 (digest[6]);
19085 digest[7] = byte_swap_32 (digest[7]);
19086
19087 return (PARSER_OK);
19088 }
19089
19090 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19091 {
19092 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
19093
19094 u32 *digest = (u32 *) hash_buf->digest;
19095
19096 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
19097 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
19098 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
19099 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
19100 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
19101 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
19102 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
19103 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
19104 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
19105 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
19106 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
19107 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
19108 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
19109 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
19110 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
19111 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
19112
19113 digest[ 0] = byte_swap_32 (digest[ 0]);
19114 digest[ 1] = byte_swap_32 (digest[ 1]);
19115 digest[ 2] = byte_swap_32 (digest[ 2]);
19116 digest[ 3] = byte_swap_32 (digest[ 3]);
19117 digest[ 4] = byte_swap_32 (digest[ 4]);
19118 digest[ 5] = byte_swap_32 (digest[ 5]);
19119 digest[ 6] = byte_swap_32 (digest[ 6]);
19120 digest[ 7] = byte_swap_32 (digest[ 7]);
19121 digest[ 8] = byte_swap_32 (digest[ 8]);
19122 digest[ 9] = byte_swap_32 (digest[ 9]);
19123 digest[10] = byte_swap_32 (digest[10]);
19124 digest[11] = byte_swap_32 (digest[11]);
19125 digest[12] = byte_swap_32 (digest[12]);
19126 digest[13] = byte_swap_32 (digest[13]);
19127 digest[14] = byte_swap_32 (digest[14]);
19128 digest[15] = byte_swap_32 (digest[15]);
19129
19130 return (PARSER_OK);
19131 }
19132
19133 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19134 {
19135 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
19136
19137 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
19138
19139 u32 *digest = (u32 *) hash_buf->digest;
19140
19141 salt_t *salt = hash_buf->salt;
19142
19143 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
19144
19145 /**
19146 * parse line
19147 */
19148
19149 // iterations
19150
19151 char *iter_pos = input_buf + 4;
19152
19153 u32 iter = atoi (iter_pos);
19154
19155 if (iter < 1) return (PARSER_SALT_ITERATION);
19156 if (iter > 999999) return (PARSER_SALT_ITERATION);
19157
19158 // first is *raw* salt
19159
19160 char *salt_pos = strchr (iter_pos, ':');
19161
19162 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19163
19164 salt_pos++;
19165
19166 char *hash_pos = strchr (salt_pos, ':');
19167
19168 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19169
19170 u32 salt_len = hash_pos - salt_pos;
19171
19172 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19173
19174 hash_pos++;
19175
19176 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19177
19178 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19179
19180 // decode salt
19181
19182 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
19183
19184 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19185
19186 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19187
19188 salt_buf_ptr[salt_len + 3] = 0x01;
19189 salt_buf_ptr[salt_len + 4] = 0x80;
19190
19191 salt->salt_len = salt_len;
19192 salt->salt_iter = iter - 1;
19193
19194 // decode hash
19195
19196 u8 tmp_buf[100] = { 0 };
19197
19198 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19199
19200 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19201
19202 memcpy (digest, tmp_buf, 16);
19203
19204 // add some stuff to normal salt to make sorted happy
19205
19206 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
19207 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
19208 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
19209 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
19210 salt->salt_buf[4] = salt->salt_iter;
19211
19212 return (PARSER_OK);
19213 }
19214
19215 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19216 {
19217 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
19218
19219 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
19220
19221 u32 *digest = (u32 *) hash_buf->digest;
19222
19223 salt_t *salt = hash_buf->salt;
19224
19225 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
19226
19227 /**
19228 * parse line
19229 */
19230
19231 // iterations
19232
19233 char *iter_pos = input_buf + 5;
19234
19235 u32 iter = atoi (iter_pos);
19236
19237 if (iter < 1) return (PARSER_SALT_ITERATION);
19238 if (iter > 999999) return (PARSER_SALT_ITERATION);
19239
19240 // first is *raw* salt
19241
19242 char *salt_pos = strchr (iter_pos, ':');
19243
19244 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19245
19246 salt_pos++;
19247
19248 char *hash_pos = strchr (salt_pos, ':');
19249
19250 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19251
19252 u32 salt_len = hash_pos - salt_pos;
19253
19254 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19255
19256 hash_pos++;
19257
19258 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19259
19260 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19261
19262 // decode salt
19263
19264 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
19265
19266 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19267
19268 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19269
19270 salt_buf_ptr[salt_len + 3] = 0x01;
19271 salt_buf_ptr[salt_len + 4] = 0x80;
19272
19273 salt->salt_len = salt_len;
19274 salt->salt_iter = iter - 1;
19275
19276 // decode hash
19277
19278 u8 tmp_buf[100] = { 0 };
19279
19280 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19281
19282 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19283
19284 memcpy (digest, tmp_buf, 16);
19285
19286 digest[0] = byte_swap_32 (digest[0]);
19287 digest[1] = byte_swap_32 (digest[1]);
19288 digest[2] = byte_swap_32 (digest[2]);
19289 digest[3] = byte_swap_32 (digest[3]);
19290
19291 // add some stuff to normal salt to make sorted happy
19292
19293 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
19294 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
19295 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
19296 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
19297 salt->salt_buf[4] = salt->salt_iter;
19298
19299 return (PARSER_OK);
19300 }
19301
19302 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19303 {
19304 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
19305
19306 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
19307
19308 u64 *digest = (u64 *) hash_buf->digest;
19309
19310 salt_t *salt = hash_buf->salt;
19311
19312 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
19313
19314 /**
19315 * parse line
19316 */
19317
19318 // iterations
19319
19320 char *iter_pos = input_buf + 7;
19321
19322 u32 iter = atoi (iter_pos);
19323
19324 if (iter < 1) return (PARSER_SALT_ITERATION);
19325 if (iter > 999999) return (PARSER_SALT_ITERATION);
19326
19327 // first is *raw* salt
19328
19329 char *salt_pos = strchr (iter_pos, ':');
19330
19331 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19332
19333 salt_pos++;
19334
19335 char *hash_pos = strchr (salt_pos, ':');
19336
19337 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19338
19339 u32 salt_len = hash_pos - salt_pos;
19340
19341 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19342
19343 hash_pos++;
19344
19345 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19346
19347 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19348
19349 // decode salt
19350
19351 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
19352
19353 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19354
19355 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19356
19357 salt_buf_ptr[salt_len + 3] = 0x01;
19358 salt_buf_ptr[salt_len + 4] = 0x80;
19359
19360 salt->salt_len = salt_len;
19361 salt->salt_iter = iter - 1;
19362
19363 // decode hash
19364
19365 u8 tmp_buf[100] = { 0 };
19366
19367 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19368
19369 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19370
19371 memcpy (digest, tmp_buf, 64);
19372
19373 digest[0] = byte_swap_64 (digest[0]);
19374 digest[1] = byte_swap_64 (digest[1]);
19375 digest[2] = byte_swap_64 (digest[2]);
19376 digest[3] = byte_swap_64 (digest[3]);
19377 digest[4] = byte_swap_64 (digest[4]);
19378 digest[5] = byte_swap_64 (digest[5]);
19379 digest[6] = byte_swap_64 (digest[6]);
19380 digest[7] = byte_swap_64 (digest[7]);
19381
19382 // add some stuff to normal salt to make sorted happy
19383
19384 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
19385 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
19386 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
19387 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
19388 salt->salt_buf[4] = salt->salt_iter;
19389
19390 return (PARSER_OK);
19391 }
19392
19393 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19394 {
19395 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
19396
19397 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
19398
19399 uint *digest = (uint *) hash_buf->digest;
19400
19401 salt_t *salt = hash_buf->salt;
19402
19403 /**
19404 * parse line
19405 */
19406
19407 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
19408
19409 char *hash_pos = strchr (salt_pos, '$');
19410
19411 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19412
19413 u32 salt_len = hash_pos - salt_pos;
19414
19415 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19416
19417 hash_pos++;
19418
19419 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
19420
19421 if (hash_len != 16) return (PARSER_HASH_LENGTH);
19422
19423 // decode hash
19424
19425 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
19426 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
19427 digest[ 2] = 0;
19428 digest[ 3] = 0;
19429 digest[ 4] = 0;
19430 digest[ 5] = 0;
19431 digest[ 6] = 0;
19432 digest[ 7] = 0;
19433 digest[ 8] = 0;
19434 digest[ 9] = 0;
19435 digest[10] = 0;
19436 digest[11] = 0;
19437 digest[12] = 0;
19438 digest[13] = 0;
19439 digest[14] = 0;
19440 digest[15] = 0;
19441
19442 // decode salt
19443
19444 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19445 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19446
19447 salt->salt_iter = ROUNDS_ECRYPTFS;
19448 salt->salt_len = 8;
19449
19450 return (PARSER_OK);
19451 }
19452
19453 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19454 {
19455 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
19456
19457 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
19458
19459 unsigned char c19 = itoa64_to_int (input_buf[19]);
19460
19461 if (c19 & 3) return (PARSER_HASH_VALUE);
19462
19463 salt_t *salt = hash_buf->salt;
19464
19465 u32 *digest = (u32 *) hash_buf->digest;
19466
19467 // iteration count
19468
19469 salt->salt_iter = itoa64_to_int (input_buf[1])
19470 | itoa64_to_int (input_buf[2]) << 6
19471 | itoa64_to_int (input_buf[3]) << 12
19472 | itoa64_to_int (input_buf[4]) << 18;
19473
19474 // set salt
19475
19476 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
19477 | itoa64_to_int (input_buf[6]) << 6
19478 | itoa64_to_int (input_buf[7]) << 12
19479 | itoa64_to_int (input_buf[8]) << 18;
19480
19481 salt->salt_len = 4;
19482
19483 u8 tmp_buf[100] = { 0 };
19484
19485 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
19486
19487 memcpy (digest, tmp_buf, 8);
19488
19489 uint tt;
19490
19491 IP (digest[0], digest[1], tt);
19492
19493 digest[0] = rotr32 (digest[0], 31);
19494 digest[1] = rotr32 (digest[1], 31);
19495 digest[2] = 0;
19496 digest[3] = 0;
19497
19498 return (PARSER_OK);
19499 }
19500
19501 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19502 {
19503 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
19504
19505 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
19506
19507 u32 *digest = (u32 *) hash_buf->digest;
19508
19509 salt_t *salt = hash_buf->salt;
19510
19511 /**
19512 * parse line
19513 */
19514
19515 char *type_pos = input_buf + 6 + 1;
19516
19517 char *salt_pos = strchr (type_pos, '*');
19518
19519 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19520
19521 u32 type_len = salt_pos - type_pos;
19522
19523 if (type_len != 1) return (PARSER_SALT_LENGTH);
19524
19525 salt_pos++;
19526
19527 char *crypted_pos = strchr (salt_pos, '*');
19528
19529 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19530
19531 u32 salt_len = crypted_pos - salt_pos;
19532
19533 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19534
19535 crypted_pos++;
19536
19537 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
19538
19539 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
19540
19541 /**
19542 * copy data
19543 */
19544
19545 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19546 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19547
19548 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19549 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19550
19551 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
19552 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
19553 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
19554 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
19555
19556 salt->salt_len = 24;
19557 salt->salt_iter = ROUNDS_RAR3;
19558
19559 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
19560 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
19561
19562 digest[0] = 0xc43d7b00;
19563 digest[1] = 0x40070000;
19564 digest[2] = 0;
19565 digest[3] = 0;
19566
19567 return (PARSER_OK);
19568 }
19569
19570 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19571 {
19572 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
19573
19574 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
19575
19576 u32 *digest = (u32 *) hash_buf->digest;
19577
19578 salt_t *salt = hash_buf->salt;
19579
19580 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
19581
19582 /**
19583 * parse line
19584 */
19585
19586 char *param0_pos = input_buf + 1 + 4 + 1;
19587
19588 char *param1_pos = strchr (param0_pos, '$');
19589
19590 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19591
19592 u32 param0_len = param1_pos - param0_pos;
19593
19594 param1_pos++;
19595
19596 char *param2_pos = strchr (param1_pos, '$');
19597
19598 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19599
19600 u32 param1_len = param2_pos - param1_pos;
19601
19602 param2_pos++;
19603
19604 char *param3_pos = strchr (param2_pos, '$');
19605
19606 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19607
19608 u32 param2_len = param3_pos - param2_pos;
19609
19610 param3_pos++;
19611
19612 char *param4_pos = strchr (param3_pos, '$');
19613
19614 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19615
19616 u32 param3_len = param4_pos - param3_pos;
19617
19618 param4_pos++;
19619
19620 char *param5_pos = strchr (param4_pos, '$');
19621
19622 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19623
19624 u32 param4_len = param5_pos - param4_pos;
19625
19626 param5_pos++;
19627
19628 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
19629
19630 char *salt_buf = param1_pos;
19631 char *iv = param3_pos;
19632 char *pswcheck = param5_pos;
19633
19634 const uint salt_len = atoi (param0_pos);
19635 const uint iterations = atoi (param2_pos);
19636 const uint pswcheck_len = atoi (param4_pos);
19637
19638 /**
19639 * verify some data
19640 */
19641
19642 if (param1_len != 32) return (PARSER_SALT_VALUE);
19643 if (param3_len != 32) return (PARSER_SALT_VALUE);
19644 if (param5_len != 16) return (PARSER_SALT_VALUE);
19645
19646 if (salt_len != 16) return (PARSER_SALT_VALUE);
19647 if (iterations == 0) return (PARSER_SALT_VALUE);
19648 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
19649
19650 /**
19651 * store data
19652 */
19653
19654 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
19655 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
19656 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
19657 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
19658
19659 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
19660 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
19661 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
19662 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
19663
19664 salt->salt_len = 16;
19665
19666 salt->salt_sign[0] = iterations;
19667
19668 salt->salt_iter = ((1 << iterations) + 32) - 1;
19669
19670 /**
19671 * digest buf
19672 */
19673
19674 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
19675 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
19676 digest[2] = 0;
19677 digest[3] = 0;
19678
19679 return (PARSER_OK);
19680 }
19681
19682 int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19683 {
19684 if ((input_len < DISPLAY_LEN_MIN_13100) || (input_len > DISPLAY_LEN_MAX_13100)) return (PARSER_GLOBAL_LENGTH);
19685
19686 if (memcmp (SIGNATURE_KRB5TGS, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19687
19688 u32 *digest = (u32 *) hash_buf->digest;
19689
19690 salt_t *salt = hash_buf->salt;
19691
19692 krb5tgs_t *krb5tgs = (krb5tgs_t *) hash_buf->esalt;
19693
19694 /**
19695 * parse line
19696 */
19697
19698 /* Skip '$' */
19699 char *account_pos = input_buf + 11 + 1;
19700
19701 char *data_pos;
19702
19703 uint data_len;
19704
19705 if (account_pos[0] == '*')
19706 {
19707 account_pos++;
19708
19709 data_pos = strchr (account_pos, '*');
19710
19711 /* Skip '*' */
19712 data_pos++;
19713
19714 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19715
19716 uint account_len = data_pos - account_pos + 1;
19717
19718 if (account_len >= 512) return (PARSER_SALT_LENGTH);
19719
19720 /* Skip '$' */
19721 data_pos++;
19722
19723 data_len = input_len - 11 - 1 - account_len - 2;
19724
19725 memcpy (krb5tgs->account_info, account_pos - 1, account_len);
19726 }
19727 else
19728 {
19729 /* assume $krb5tgs$23$checksum$edata2 */
19730 data_pos = account_pos;
19731
19732 memcpy (krb5tgs->account_info, "**", 3);
19733
19734 data_len = input_len - 11 - 1 - 1;
19735 }
19736
19737 if (data_len < ((16 + 32) * 2)) return (PARSER_SALT_LENGTH);
19738
19739 char *checksum_ptr = (char *) krb5tgs->checksum;
19740
19741 for (uint i = 0; i < 16 * 2; i += 2)
19742 {
19743 const char p0 = data_pos[i + 0];
19744 const char p1 = data_pos[i + 1];
19745
19746 *checksum_ptr++ = hex_convert (p1) << 0
19747 | hex_convert (p0) << 4;
19748 }
19749
19750 char *edata_ptr = (char *) krb5tgs->edata2;
19751
19752 krb5tgs->edata2_len = (data_len - 32) / 2 ;
19753
19754 /* skip '$' */
19755 for (uint i = 16 * 2 + 1; i < (krb5tgs->edata2_len * 2) + (16 * 2 + 1); i += 2)
19756 {
19757 const char p0 = data_pos[i + 0];
19758 const char p1 = data_pos[i + 1];
19759 *edata_ptr++ = hex_convert (p1) << 0
19760 | hex_convert (p0) << 4;
19761 }
19762
19763 /* this is needed for hmac_md5 */
19764 *edata_ptr++ = 0x80;
19765
19766 salt->salt_buf[0] = krb5tgs->checksum[0];
19767 salt->salt_buf[1] = krb5tgs->checksum[1];
19768 salt->salt_buf[2] = krb5tgs->checksum[2];
19769 salt->salt_buf[3] = krb5tgs->checksum[3];
19770
19771 salt->salt_len = 32;
19772
19773 digest[0] = krb5tgs->checksum[0];
19774 digest[1] = krb5tgs->checksum[1];
19775 digest[2] = krb5tgs->checksum[2];
19776 digest[3] = krb5tgs->checksum[3];
19777
19778 return (PARSER_OK);
19779 }
19780
19781 int axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19782 {
19783 if ((input_len < DISPLAY_LEN_MIN_13200) || (input_len > DISPLAY_LEN_MAX_13200)) return (PARSER_GLOBAL_LENGTH);
19784
19785 if (memcmp (SIGNATURE_AXCRYPT, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19786
19787 u32 *digest = (u32 *) hash_buf->digest;
19788
19789 salt_t *salt = hash_buf->salt;
19790
19791 /**
19792 * parse line
19793 */
19794
19795 /* Skip '*' */
19796 char *wrapping_rounds_pos = input_buf + 11 + 1;
19797
19798 char *salt_pos;
19799
19800 char *wrapped_key_pos;
19801
19802 char *data_pos;
19803
19804 salt->salt_iter = atoi (wrapping_rounds_pos);
19805
19806 salt_pos = strchr (wrapping_rounds_pos, '*');
19807
19808 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19809
19810 uint wrapping_rounds_len = salt_pos - wrapping_rounds_pos;
19811
19812 /* Skip '*' */
19813 salt_pos++;
19814
19815 data_pos = salt_pos;
19816
19817 wrapped_key_pos = strchr (salt_pos, '*');
19818
19819 if (wrapped_key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19820
19821 uint salt_len = wrapped_key_pos - salt_pos;
19822
19823 if (salt_len != 32) return (PARSER_SALT_LENGTH);
19824
19825 /* Skip '*' */
19826 wrapped_key_pos++;
19827
19828 uint wrapped_key_len = input_len - 11 - 1 - wrapping_rounds_len - 1 - salt_len - 1;
19829
19830 if (wrapped_key_len != 48) return (PARSER_SALT_LENGTH);
19831
19832 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19833 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19834 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &data_pos[16]);
19835 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &data_pos[24]);
19836
19837 data_pos += 33;
19838
19839 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19840 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19841 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &data_pos[16]);
19842 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &data_pos[24]);
19843 salt->salt_buf[8] = hex_to_u32 ((const u8 *) &data_pos[32]);
19844 salt->salt_buf[9] = hex_to_u32 ((const u8 *) &data_pos[40]);
19845
19846 salt->salt_len = 40;
19847
19848 digest[0] = salt->salt_buf[0];
19849 digest[1] = salt->salt_buf[1];
19850 digest[2] = salt->salt_buf[2];
19851 digest[3] = salt->salt_buf[3];
19852
19853 return (PARSER_OK);
19854 }
19855
19856 int keepass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19857 {
19858 if ((input_len < DISPLAY_LEN_MIN_13400) || (input_len > DISPLAY_LEN_MAX_13400)) return (PARSER_GLOBAL_LENGTH);
19859
19860 if (memcmp (SIGNATURE_KEEPASS, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
19861
19862 u32 *digest = (u32 *) hash_buf->digest;
19863
19864 salt_t *salt = hash_buf->salt;
19865
19866 keepass_t *keepass = (keepass_t *) hash_buf->esalt;
19867
19868 /**
19869 * parse line
19870 */
19871
19872 char *version_pos;
19873
19874 char *rounds_pos;
19875
19876 char *algorithm_pos;
19877
19878 char *final_random_seed_pos;
19879 u32 final_random_seed_len;
19880
19881 char *transf_random_seed_pos;
19882 u32 transf_random_seed_len;
19883
19884 char *enc_iv_pos;
19885 u32 enc_iv_len;
19886
19887 /* default is no keyfile provided */
19888 char *keyfile_len_pos;
19889 u32 keyfile_len = 0;
19890 u32 is_keyfile_present = 0;
19891 char *keyfile_inline_pos;
19892 char *keyfile_pos;
19893
19894 /* specific to version 1 */
19895 char *contents_len_pos;
19896 u32 contents_len;
19897 char *contents_pos;
19898
19899 /* specific to version 2 */
19900 char *expected_bytes_pos;
19901 u32 expected_bytes_len;
19902
19903 char *contents_hash_pos;
19904 u32 contents_hash_len;
19905
19906 version_pos = input_buf + 8 + 1 + 1;
19907
19908 keepass->version = atoi (version_pos);
19909
19910 rounds_pos = strchr (version_pos, '*');
19911
19912 if (rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19913
19914 rounds_pos++;
19915
19916 salt->salt_iter = (atoi (rounds_pos));
19917
19918 algorithm_pos = strchr (rounds_pos, '*');
19919
19920 if (algorithm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19921
19922 algorithm_pos++;
19923
19924 keepass->algorithm = atoi (algorithm_pos);
19925
19926 final_random_seed_pos = strchr (algorithm_pos, '*');
19927
19928 if (final_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19929
19930 final_random_seed_pos++;
19931
19932 keepass->final_random_seed[0] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 0]);
19933 keepass->final_random_seed[1] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 8]);
19934 keepass->final_random_seed[2] = hex_to_u32 ((const u8 *) &final_random_seed_pos[16]);
19935 keepass->final_random_seed[3] = hex_to_u32 ((const u8 *) &final_random_seed_pos[24]);
19936
19937 if (keepass->version == 2)
19938 {
19939 keepass->final_random_seed[4] = hex_to_u32 ((const u8 *) &final_random_seed_pos[32]);
19940 keepass->final_random_seed[5] = hex_to_u32 ((const u8 *) &final_random_seed_pos[40]);
19941 keepass->final_random_seed[6] = hex_to_u32 ((const u8 *) &final_random_seed_pos[48]);
19942 keepass->final_random_seed[7] = hex_to_u32 ((const u8 *) &final_random_seed_pos[56]);
19943 }
19944
19945 transf_random_seed_pos = strchr (final_random_seed_pos, '*');
19946
19947 if (transf_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19948
19949 final_random_seed_len = transf_random_seed_pos - final_random_seed_pos;
19950
19951 if (keepass->version == 1 && final_random_seed_len != 32) return (PARSER_SALT_LENGTH);
19952 if (keepass->version == 2 && final_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19953
19954 transf_random_seed_pos++;
19955
19956 keepass->transf_random_seed[0] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 0]);
19957 keepass->transf_random_seed[1] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 8]);
19958 keepass->transf_random_seed[2] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[16]);
19959 keepass->transf_random_seed[3] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[24]);
19960 keepass->transf_random_seed[4] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[32]);
19961 keepass->transf_random_seed[5] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[40]);
19962 keepass->transf_random_seed[6] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[48]);
19963 keepass->transf_random_seed[7] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[56]);
19964
19965 enc_iv_pos = strchr (transf_random_seed_pos, '*');
19966
19967 if (enc_iv_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19968
19969 transf_random_seed_len = enc_iv_pos - transf_random_seed_pos;
19970
19971 if (transf_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19972
19973 enc_iv_pos++;
19974
19975 keepass->enc_iv[0] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 0]);
19976 keepass->enc_iv[1] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 8]);
19977 keepass->enc_iv[2] = hex_to_u32 ((const u8 *) &enc_iv_pos[16]);
19978 keepass->enc_iv[3] = hex_to_u32 ((const u8 *) &enc_iv_pos[24]);
19979
19980 if (keepass->version == 1)
19981 {
19982 contents_hash_pos = strchr (enc_iv_pos, '*');
19983
19984 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19985
19986 enc_iv_len = contents_hash_pos - enc_iv_pos;
19987
19988 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19989
19990 contents_hash_pos++;
19991
19992 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19993 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19994 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19995 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19996 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
19997 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
19998 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
19999 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
20000
20001 /* get length of contents following */
20002 char *inline_flag_pos = strchr (contents_hash_pos, '*');
20003
20004 if (inline_flag_pos == NULL) return (PARSER_SALT_LENGTH);
20005
20006 contents_hash_len = inline_flag_pos - contents_hash_pos;
20007
20008 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
20009
20010 inline_flag_pos++;
20011
20012 u32 inline_flag = atoi (inline_flag_pos);
20013
20014 if (inline_flag != 1) return (PARSER_SALT_LENGTH);
20015
20016 contents_len_pos = strchr (inline_flag_pos, '*');
20017
20018 if (contents_len_pos == NULL) return (PARSER_SALT_LENGTH);
20019
20020 contents_len_pos++;
20021
20022 contents_len = atoi (contents_len_pos);
20023
20024 if (contents_len > 50000) return (PARSER_SALT_LENGTH);
20025
20026 contents_pos = strchr (contents_len_pos, '*');
20027
20028 if (contents_pos == NULL) return (PARSER_SALT_LENGTH);
20029
20030 contents_pos++;
20031
20032 u32 i;
20033
20034 keepass->contents_len = contents_len;
20035
20036 contents_len = contents_len / 4;
20037
20038 keyfile_inline_pos = strchr (contents_pos, '*');
20039
20040 u32 real_contents_len;
20041
20042 if (keyfile_inline_pos == NULL)
20043 real_contents_len = input_len - (contents_pos - input_buf);
20044 else
20045 {
20046 real_contents_len = keyfile_inline_pos - contents_pos;
20047 keyfile_inline_pos++;
20048 is_keyfile_present = 1;
20049 }
20050
20051 if (real_contents_len != keepass->contents_len * 2) return (PARSER_SALT_LENGTH);
20052
20053 for (i = 0; i < contents_len; i++)
20054 keepass->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]);
20055 }
20056 else if (keepass->version == 2)
20057 {
20058 expected_bytes_pos = strchr (enc_iv_pos, '*');
20059
20060 if (expected_bytes_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20061
20062 enc_iv_len = expected_bytes_pos - enc_iv_pos;
20063
20064 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
20065
20066 expected_bytes_pos++;
20067
20068 keepass->expected_bytes[0] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 0]);
20069 keepass->expected_bytes[1] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 8]);
20070 keepass->expected_bytes[2] = hex_to_u32 ((const u8 *) &expected_bytes_pos[16]);
20071 keepass->expected_bytes[3] = hex_to_u32 ((const u8 *) &expected_bytes_pos[24]);
20072 keepass->expected_bytes[4] = hex_to_u32 ((const u8 *) &expected_bytes_pos[32]);
20073 keepass->expected_bytes[5] = hex_to_u32 ((const u8 *) &expected_bytes_pos[40]);
20074 keepass->expected_bytes[6] = hex_to_u32 ((const u8 *) &expected_bytes_pos[48]);
20075 keepass->expected_bytes[7] = hex_to_u32 ((const u8 *) &expected_bytes_pos[56]);
20076
20077 contents_hash_pos = strchr (expected_bytes_pos, '*');
20078
20079 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20080
20081 expected_bytes_len = contents_hash_pos - expected_bytes_pos;
20082
20083 if (expected_bytes_len != 64) return (PARSER_SALT_LENGTH);
20084
20085 contents_hash_pos++;
20086
20087 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
20088 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
20089 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
20090 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
20091 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
20092 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
20093 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
20094 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
20095
20096 keyfile_inline_pos = strchr (contents_hash_pos, '*');
20097
20098 if (keyfile_inline_pos == NULL)
20099 contents_hash_len = input_len - (int) (contents_hash_pos - input_buf);
20100 else
20101 {
20102 contents_hash_len = keyfile_inline_pos - contents_hash_pos;
20103 keyfile_inline_pos++;
20104 is_keyfile_present = 1;
20105 }
20106 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
20107 }
20108
20109 if (is_keyfile_present != 0)
20110 {
20111 keyfile_len_pos = strchr (keyfile_inline_pos, '*');
20112
20113 keyfile_len_pos++;
20114
20115 keyfile_len = atoi (keyfile_len_pos);
20116
20117 keepass->keyfile_len = keyfile_len;
20118
20119 if (keyfile_len != 64) return (PARSER_SALT_LENGTH);
20120
20121 keyfile_pos = strchr (keyfile_len_pos, '*');
20122
20123 if (keyfile_pos == NULL) return (PARSER_SALT_LENGTH);
20124
20125 keyfile_pos++;
20126
20127 u32 real_keyfile_len = input_len - (keyfile_pos - input_buf);
20128
20129 if (real_keyfile_len != 64) return (PARSER_SALT_LENGTH);
20130
20131 keepass->keyfile[0] = hex_to_u32 ((const u8 *) &keyfile_pos[ 0]);
20132 keepass->keyfile[1] = hex_to_u32 ((const u8 *) &keyfile_pos[ 8]);
20133 keepass->keyfile[2] = hex_to_u32 ((const u8 *) &keyfile_pos[16]);
20134 keepass->keyfile[3] = hex_to_u32 ((const u8 *) &keyfile_pos[24]);
20135 keepass->keyfile[4] = hex_to_u32 ((const u8 *) &keyfile_pos[32]);
20136 keepass->keyfile[5] = hex_to_u32 ((const u8 *) &keyfile_pos[40]);
20137 keepass->keyfile[6] = hex_to_u32 ((const u8 *) &keyfile_pos[48]);
20138 keepass->keyfile[7] = hex_to_u32 ((const u8 *) &keyfile_pos[56]);
20139 }
20140
20141 digest[0] = keepass->enc_iv[0];
20142 digest[1] = keepass->enc_iv[1];
20143 digest[2] = keepass->enc_iv[2];
20144 digest[3] = keepass->enc_iv[3];
20145
20146 salt->salt_buf[0] = keepass->transf_random_seed[0];
20147 salt->salt_buf[1] = keepass->transf_random_seed[1];
20148 salt->salt_buf[2] = keepass->transf_random_seed[2];
20149 salt->salt_buf[3] = keepass->transf_random_seed[3];
20150 salt->salt_buf[4] = keepass->transf_random_seed[4];
20151 salt->salt_buf[5] = keepass->transf_random_seed[5];
20152 salt->salt_buf[6] = keepass->transf_random_seed[6];
20153 salt->salt_buf[7] = keepass->transf_random_seed[7];
20154
20155 return (PARSER_OK);
20156 }
20157
20158 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20159 {
20160 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
20161
20162 u32 *digest = (u32 *) hash_buf->digest;
20163
20164 salt_t *salt = hash_buf->salt;
20165
20166 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
20167 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
20168 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
20169 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
20170 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
20171 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
20172 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
20173 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
20174
20175 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
20176
20177 uint salt_len = input_len - 64 - 1;
20178
20179 char *salt_buf = input_buf + 64 + 1;
20180
20181 char *salt_buf_ptr = (char *) salt->salt_buf;
20182
20183 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
20184
20185 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
20186
20187 salt->salt_len = salt_len;
20188
20189 /**
20190 * we can precompute the first sha256 transform
20191 */
20192
20193 uint w[16] = { 0 };
20194
20195 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
20196 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
20197 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
20198 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
20199 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
20200 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
20201 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
20202 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
20203 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
20204 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
20205 w[10] = byte_swap_32 (salt->salt_buf[10]);
20206 w[11] = byte_swap_32 (salt->salt_buf[11]);
20207 w[12] = byte_swap_32 (salt->salt_buf[12]);
20208 w[13] = byte_swap_32 (salt->salt_buf[13]);
20209 w[14] = byte_swap_32 (salt->salt_buf[14]);
20210 w[15] = byte_swap_32 (salt->salt_buf[15]);
20211
20212 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
20213
20214 sha256_64 (w, pc256);
20215
20216 salt->salt_buf_pc[0] = pc256[0];
20217 salt->salt_buf_pc[1] = pc256[1];
20218 salt->salt_buf_pc[2] = pc256[2];
20219 salt->salt_buf_pc[3] = pc256[3];
20220 salt->salt_buf_pc[4] = pc256[4];
20221 salt->salt_buf_pc[5] = pc256[5];
20222 salt->salt_buf_pc[6] = pc256[6];
20223 salt->salt_buf_pc[7] = pc256[7];
20224
20225 digest[0] -= pc256[0];
20226 digest[1] -= pc256[1];
20227 digest[2] -= pc256[2];
20228 digest[3] -= pc256[3];
20229 digest[4] -= pc256[4];
20230 digest[5] -= pc256[5];
20231 digest[6] -= pc256[6];
20232 digest[7] -= pc256[7];
20233
20234 return (PARSER_OK);
20235 }
20236
20237 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20238 {
20239 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
20240
20241 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
20242
20243 u32 *digest = (u32 *) hash_buf->digest;
20244
20245 salt_t *salt = hash_buf->salt;
20246
20247 /**
20248 * parse line
20249 */
20250
20251 char *data_len_pos = input_buf + 1 + 10 + 1;
20252
20253 char *data_buf_pos = strchr (data_len_pos, '$');
20254
20255 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20256
20257 u32 data_len_len = data_buf_pos - data_len_pos;
20258
20259 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
20260 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
20261
20262 data_buf_pos++;
20263
20264 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
20265
20266 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
20267
20268 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
20269
20270 u32 data_len = atoi (data_len_pos);
20271
20272 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
20273
20274 /**
20275 * salt
20276 */
20277
20278 char *salt_pos = data_buf_pos;
20279
20280 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20281 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20282 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
20283 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
20284
20285 // this is actually the CT, which is also the hash later (if matched)
20286
20287 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
20288 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
20289 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
20290 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
20291
20292 salt->salt_len = 32; // note we need to fix this to 16 in kernel
20293
20294 salt->salt_iter = 10 - 1;
20295
20296 /**
20297 * digest buf
20298 */
20299
20300 digest[0] = salt->salt_buf[4];
20301 digest[1] = salt->salt_buf[5];
20302 digest[2] = salt->salt_buf[6];
20303 digest[3] = salt->salt_buf[7];
20304
20305 return (PARSER_OK);
20306 }
20307
20308 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20309 {
20310 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
20311
20312 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
20313
20314 u32 *digest = (u32 *) hash_buf->digest;
20315
20316 salt_t *salt = hash_buf->salt;
20317
20318 /**
20319 * parse line
20320 */
20321
20322 char *salt_pos = input_buf + 11 + 1;
20323
20324 char *iter_pos = strchr (salt_pos, ',');
20325
20326 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20327
20328 u32 salt_len = iter_pos - salt_pos;
20329
20330 if (salt_len != 20) return (PARSER_SALT_LENGTH);
20331
20332 iter_pos++;
20333
20334 char *hash_pos = strchr (iter_pos, ',');
20335
20336 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20337
20338 u32 iter_len = hash_pos - iter_pos;
20339
20340 if (iter_len > 5) return (PARSER_SALT_LENGTH);
20341
20342 hash_pos++;
20343
20344 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
20345
20346 if (hash_len != 64) return (PARSER_HASH_LENGTH);
20347
20348 /**
20349 * salt
20350 */
20351
20352 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20353 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20354 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
20355 salt->salt_buf[3] = 0x00018000;
20356
20357 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
20358 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
20359 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
20360 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
20361
20362 salt->salt_len = salt_len / 2;
20363
20364 salt->salt_iter = atoi (iter_pos) - 1;
20365
20366 /**
20367 * digest buf
20368 */
20369
20370 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20371 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20372 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20373 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20374 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20375 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20376 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20377 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20378
20379 return (PARSER_OK);
20380 }
20381
20382 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20383 {
20384 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
20385
20386 u32 *digest = (u32 *) hash_buf->digest;
20387
20388 salt_t *salt = hash_buf->salt;
20389
20390 /**
20391 * parse line
20392 */
20393
20394 char *hash_pos = input_buf + 64;
20395 char *salt1_pos = input_buf + 128;
20396 char *salt2_pos = input_buf;
20397
20398 /**
20399 * salt
20400 */
20401
20402 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
20403 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
20404 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
20405 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
20406
20407 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
20408 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
20409 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
20410 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
20411
20412 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
20413 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
20414 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
20415 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
20416
20417 salt->salt_len = 48;
20418
20419 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
20420
20421 /**
20422 * digest buf
20423 */
20424
20425 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20426 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20427 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20428 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20429 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20430 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20431 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20432 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20433
20434 return (PARSER_OK);
20435 }
20436
20437 int zip2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20438 {
20439 if ((input_len < DISPLAY_LEN_MIN_13600) || (input_len > DISPLAY_LEN_MAX_13600)) return (PARSER_GLOBAL_LENGTH);
20440
20441 if (memcmp (SIGNATURE_ZIP2_START, input_buf , 6)) return (PARSER_SIGNATURE_UNMATCHED);
20442 if (memcmp (SIGNATURE_ZIP2_STOP , input_buf + input_len - 7, 7)) return (PARSER_SIGNATURE_UNMATCHED);
20443
20444 u32 *digest = (u32 *) hash_buf->digest;
20445
20446 salt_t *salt = hash_buf->salt;
20447
20448 zip2_t *zip2 = (zip2_t *) hash_buf->esalt;
20449
20450 /**
20451 * parse line
20452 */
20453
20454 char *param0_pos = input_buf + 6 + 1;
20455
20456 char *param1_pos = strchr (param0_pos, '*');
20457
20458 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20459
20460 u32 param0_len = param1_pos - param0_pos;
20461
20462 param1_pos++;
20463
20464 char *param2_pos = strchr (param1_pos, '*');
20465
20466 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20467
20468 u32 param1_len = param2_pos - param1_pos;
20469
20470 param2_pos++;
20471
20472 char *param3_pos = strchr (param2_pos, '*');
20473
20474 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20475
20476 u32 param2_len = param3_pos - param2_pos;
20477
20478 param3_pos++;
20479
20480 char *param4_pos = strchr (param3_pos, '*');
20481
20482 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20483
20484 u32 param3_len = param4_pos - param3_pos;
20485
20486 param4_pos++;
20487
20488 char *param5_pos = strchr (param4_pos, '*');
20489
20490 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20491
20492 u32 param4_len = param5_pos - param4_pos;
20493
20494 param5_pos++;
20495
20496 char *param6_pos = strchr (param5_pos, '*');
20497
20498 if (param6_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20499
20500 u32 param5_len = param6_pos - param5_pos;
20501
20502 param6_pos++;
20503
20504 char *param7_pos = strchr (param6_pos, '*');
20505
20506 if (param7_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20507
20508 u32 param6_len = param7_pos - param6_pos;
20509
20510 param7_pos++;
20511
20512 char *param8_pos = strchr (param7_pos, '*');
20513
20514 if (param8_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20515
20516 u32 param7_len = param8_pos - param7_pos;
20517
20518 param8_pos++;
20519
20520 const uint type = atoi (param0_pos);
20521 const uint mode = atoi (param1_pos);
20522 const uint magic = atoi (param2_pos);
20523
20524 char *salt_buf = param3_pos;
20525
20526 uint verify_bytes; sscanf (param4_pos, "%4x*", &verify_bytes);
20527
20528 const uint compress_length = atoi (param5_pos);
20529
20530 char *data_buf = param6_pos;
20531 char *auth = param7_pos;
20532
20533 /**
20534 * verify some data
20535 */
20536
20537 if (param0_len != 1) return (PARSER_SALT_VALUE);
20538
20539 if (param1_len != 1) return (PARSER_SALT_VALUE);
20540
20541 if (param2_len != 1) return (PARSER_SALT_VALUE);
20542
20543 if ((param3_len != 16) && (param3_len != 24) && (param3_len != 32)) return (PARSER_SALT_VALUE);
20544
20545 if (param4_len >= 5) return (PARSER_SALT_VALUE);
20546
20547 if (param5_len >= 5) return (PARSER_SALT_VALUE);
20548
20549 if (param6_len >= 8192) return (PARSER_SALT_VALUE);
20550
20551 if (param6_len & 1) return (PARSER_SALT_VALUE);
20552
20553 if (param7_len != 20) return (PARSER_SALT_VALUE);
20554
20555 if (type != 0) return (PARSER_SALT_VALUE);
20556
20557 if ((mode != 1) && (mode != 2) && (mode != 3)) return (PARSER_SALT_VALUE);
20558
20559 if (magic != 0) return (PARSER_SALT_VALUE);
20560
20561 if (verify_bytes >= 0x10000) return (PARSER_SALT_VALUE);
20562
20563 /**
20564 * store data
20565 */
20566
20567 zip2->type = type;
20568 zip2->mode = mode;
20569 zip2->magic = magic;
20570
20571 if (mode == 1)
20572 {
20573 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20574 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20575 zip2->salt_buf[2] = 0;
20576 zip2->salt_buf[3] = 0;
20577
20578 zip2->salt_len = 8;
20579 }
20580 else if (mode == 2)
20581 {
20582 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20583 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20584 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20585 zip2->salt_buf[3] = 0;
20586
20587 zip2->salt_len = 12;
20588 }
20589 else if (mode == 3)
20590 {
20591 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20592 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20593 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20594 zip2->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
20595
20596 zip2->salt_len = 16;
20597 }
20598
20599 zip2->salt_buf[0] = byte_swap_32 (zip2->salt_buf[0]);
20600 zip2->salt_buf[1] = byte_swap_32 (zip2->salt_buf[1]);
20601 zip2->salt_buf[2] = byte_swap_32 (zip2->salt_buf[2]);
20602 zip2->salt_buf[3] = byte_swap_32 (zip2->salt_buf[3]);
20603
20604 zip2->verify_bytes = verify_bytes;
20605
20606 zip2->compress_length = compress_length;
20607
20608 char *data_buf_ptr = (char *) zip2->data_buf;
20609
20610 for (uint i = 0; i < param6_len; i += 2)
20611 {
20612 const char p0 = data_buf[i + 0];
20613 const char p1 = data_buf[i + 1];
20614
20615 *data_buf_ptr++ = hex_convert (p1) << 0
20616 | hex_convert (p0) << 4;
20617
20618 zip2->data_len++;
20619 }
20620
20621 *data_buf_ptr = 0x80;
20622
20623 char *auth_ptr = (char *) zip2->auth_buf;
20624
20625 for (uint i = 0; i < param7_len; i += 2)
20626 {
20627 const char p0 = auth[i + 0];
20628 const char p1 = auth[i + 1];
20629
20630 *auth_ptr++ = hex_convert (p1) << 0
20631 | hex_convert (p0) << 4;
20632
20633 zip2->auth_len++;
20634 }
20635
20636 /**
20637 * salt buf (fake)
20638 */
20639
20640 salt->salt_buf[0] = zip2->salt_buf[0];
20641 salt->salt_buf[1] = zip2->salt_buf[1];
20642 salt->salt_buf[2] = zip2->salt_buf[2];
20643 salt->salt_buf[3] = zip2->salt_buf[3];
20644 salt->salt_buf[4] = zip2->data_buf[0];
20645 salt->salt_buf[5] = zip2->data_buf[1];
20646 salt->salt_buf[6] = zip2->data_buf[2];
20647 salt->salt_buf[7] = zip2->data_buf[3];
20648
20649 salt->salt_len = 32;
20650
20651 salt->salt_iter = ROUNDS_ZIP2 - 1;
20652
20653 /**
20654 * digest buf (fake)
20655 */
20656
20657 digest[0] = zip2->auth_buf[0];
20658 digest[1] = zip2->auth_buf[1];
20659 digest[2] = zip2->auth_buf[2];
20660 digest[3] = zip2->auth_buf[3];
20661
20662 return (PARSER_OK);
20663 }
20664
20665 int win8phone_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20666 {
20667 if ((input_len < DISPLAY_LEN_MIN_13800) || (input_len > DISPLAY_LEN_MAX_13800)) return (PARSER_GLOBAL_LENGTH);
20668
20669 u32 *digest = (u32 *) hash_buf->digest;
20670
20671 salt_t *salt = hash_buf->salt;
20672
20673 win8phone_t *esalt = hash_buf->esalt;
20674
20675 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
20676 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
20677 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
20678 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
20679 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
20680 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
20681 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
20682 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
20683
20684 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
20685
20686 char *salt_buf_ptr = input_buf + 64 + 1;
20687
20688 u32 *salt_buf = esalt->salt_buf;
20689
20690 for (int i = 0, j = 0; i < 32; i += 1, j += 8)
20691 {
20692 salt_buf[i] = hex_to_u32 ((const u8 *) &salt_buf_ptr[j]);
20693 }
20694
20695 salt->salt_buf[0] = salt_buf[0];
20696 salt->salt_buf[1] = salt_buf[1];
20697 salt->salt_buf[2] = salt_buf[2];
20698 salt->salt_buf[3] = salt_buf[3];
20699 salt->salt_buf[4] = salt_buf[4];
20700 salt->salt_buf[5] = salt_buf[5];
20701 salt->salt_buf[6] = salt_buf[6];
20702 salt->salt_buf[7] = salt_buf[7];
20703
20704 salt->salt_len = 64;
20705
20706 return (PARSER_OK);
20707 }
20708
20709 /**
20710 * parallel running threads
20711 */
20712
20713 #ifdef WIN
20714
20715 BOOL WINAPI sigHandler_default (DWORD sig)
20716 {
20717 switch (sig)
20718 {
20719 case CTRL_CLOSE_EVENT:
20720
20721 /*
20722 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
20723 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
20724 * function otherwise it is too late (e.g. after returning from this function)
20725 */
20726
20727 myabort ();
20728
20729 SetConsoleCtrlHandler (NULL, TRUE);
20730
20731 hc_sleep (10);
20732
20733 return TRUE;
20734
20735 case CTRL_C_EVENT:
20736 case CTRL_LOGOFF_EVENT:
20737 case CTRL_SHUTDOWN_EVENT:
20738
20739 myabort ();
20740
20741 SetConsoleCtrlHandler (NULL, TRUE);
20742
20743 return TRUE;
20744 }
20745
20746 return FALSE;
20747 }
20748
20749 BOOL WINAPI sigHandler_benchmark (DWORD sig)
20750 {
20751 switch (sig)
20752 {
20753 case CTRL_CLOSE_EVENT:
20754
20755 myquit ();
20756
20757 SetConsoleCtrlHandler (NULL, TRUE);
20758
20759 hc_sleep (10);
20760
20761 return TRUE;
20762
20763 case CTRL_C_EVENT:
20764 case CTRL_LOGOFF_EVENT:
20765 case CTRL_SHUTDOWN_EVENT:
20766
20767 myquit ();
20768
20769 SetConsoleCtrlHandler (NULL, TRUE);
20770
20771 return TRUE;
20772 }
20773
20774 return FALSE;
20775 }
20776
20777 void hc_signal (BOOL WINAPI (callback) (DWORD))
20778 {
20779 if (callback == NULL)
20780 {
20781 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
20782 }
20783 else
20784 {
20785 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
20786 }
20787 }
20788
20789 #else
20790
20791 void sigHandler_default (int sig)
20792 {
20793 myabort ();
20794
20795 signal (sig, NULL);
20796 }
20797
20798 void sigHandler_benchmark (int sig)
20799 {
20800 myquit ();
20801
20802 signal (sig, NULL);
20803 }
20804
20805 void hc_signal (void (callback) (int))
20806 {
20807 if (callback == NULL) callback = SIG_DFL;
20808
20809 signal (SIGINT, callback);
20810 signal (SIGTERM, callback);
20811 signal (SIGABRT, callback);
20812 }
20813
20814 #endif
20815
20816 void status_display ();
20817
20818 void *thread_keypress (void *p)
20819 {
20820 uint quiet = data.quiet;
20821
20822 tty_break();
20823
20824 while (data.shutdown_outer == 0)
20825 {
20826 int ch = tty_getchar();
20827
20828 if (ch == -1) break;
20829
20830 if (ch == 0) continue;
20831
20832 //https://github.com/hashcat/hashcat/issues/302
20833 //#ifdef _POSIX
20834 //if (ch != '\n')
20835 //#endif
20836
20837 hc_thread_mutex_lock (mux_display);
20838
20839 log_info ("");
20840
20841 switch (ch)
20842 {
20843 case 's':
20844 case '\r':
20845 case '\n':
20846
20847 log_info ("");
20848
20849 status_display ();
20850
20851 log_info ("");
20852
20853 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20854 if (quiet == 0) fflush (stdout);
20855
20856 break;
20857
20858 case 'b':
20859
20860 log_info ("");
20861
20862 bypass ();
20863
20864 log_info ("");
20865
20866 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20867 if (quiet == 0) fflush (stdout);
20868
20869 break;
20870
20871 case 'p':
20872
20873 log_info ("");
20874
20875 SuspendThreads ();
20876
20877 log_info ("");
20878
20879 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20880 if (quiet == 0) fflush (stdout);
20881
20882 break;
20883
20884 case 'r':
20885
20886 log_info ("");
20887
20888 ResumeThreads ();
20889
20890 log_info ("");
20891
20892 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20893 if (quiet == 0) fflush (stdout);
20894
20895 break;
20896
20897 case 'c':
20898
20899 log_info ("");
20900
20901 stop_at_checkpoint ();
20902
20903 log_info ("");
20904
20905 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20906 if (quiet == 0) fflush (stdout);
20907
20908 break;
20909
20910 case 'q':
20911
20912 log_info ("");
20913
20914 myabort ();
20915
20916 break;
20917 }
20918
20919 //https://github.com/hashcat/hashcat/issues/302
20920 //#ifdef _POSIX
20921 //if (ch != '\n')
20922 //#endif
20923
20924 hc_thread_mutex_unlock (mux_display);
20925 }
20926
20927 tty_fix();
20928
20929 return (p);
20930 }
20931
20932 /**
20933 * rules common
20934 */
20935
20936 bool class_num (const u8 c)
20937 {
20938 return ((c >= '0') && (c <= '9'));
20939 }
20940
20941 bool class_lower (const u8 c)
20942 {
20943 return ((c >= 'a') && (c <= 'z'));
20944 }
20945
20946 bool class_upper (const u8 c)
20947 {
20948 return ((c >= 'A') && (c <= 'Z'));
20949 }
20950
20951 bool class_alpha (const u8 c)
20952 {
20953 return (class_lower (c) || class_upper (c));
20954 }
20955
20956 int conv_ctoi (const u8 c)
20957 {
20958 if (class_num (c))
20959 {
20960 return c - '0';
20961 }
20962 else if (class_upper (c))
20963 {
20964 return c - 'A' + 10;
20965 }
20966
20967 return -1;
20968 }
20969
20970 int conv_itoc (const u8 c)
20971 {
20972 if (c < 10)
20973 {
20974 return c + '0';
20975 }
20976 else if (c < 37)
20977 {
20978 return c + 'A' - 10;
20979 }
20980
20981 return -1;
20982 }
20983
20984 /**
20985 * device rules
20986 */
20987
20988 #define INCR_POS if (++rule_pos == rule_len) return (-1)
20989 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
20990 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
20991 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
20992 #define MAX_KERNEL_RULES 255
20993 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
20994 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20995 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20996
20997 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
20998 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
20999 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
21000 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
21001
21002 int cpu_rule_to_kernel_rule (char *rule_buf, uint rule_len, kernel_rule_t *rule)
21003 {
21004 uint rule_pos;
21005 uint rule_cnt;
21006
21007 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
21008 {
21009 switch (rule_buf[rule_pos])
21010 {
21011 case ' ':
21012 rule_cnt--;
21013 break;
21014
21015 case RULE_OP_MANGLE_NOOP:
21016 SET_NAME (rule, rule_buf[rule_pos]);
21017 break;
21018
21019 case RULE_OP_MANGLE_LREST:
21020 SET_NAME (rule, rule_buf[rule_pos]);
21021 break;
21022
21023 case RULE_OP_MANGLE_UREST:
21024 SET_NAME (rule, rule_buf[rule_pos]);
21025 break;
21026
21027 case RULE_OP_MANGLE_LREST_UFIRST:
21028 SET_NAME (rule, rule_buf[rule_pos]);
21029 break;
21030
21031 case RULE_OP_MANGLE_UREST_LFIRST:
21032 SET_NAME (rule, rule_buf[rule_pos]);
21033 break;
21034
21035 case RULE_OP_MANGLE_TREST:
21036 SET_NAME (rule, rule_buf[rule_pos]);
21037 break;
21038
21039 case RULE_OP_MANGLE_TOGGLE_AT:
21040 SET_NAME (rule, rule_buf[rule_pos]);
21041 SET_P0_CONV (rule, rule_buf[rule_pos]);
21042 break;
21043
21044 case RULE_OP_MANGLE_REVERSE:
21045 SET_NAME (rule, rule_buf[rule_pos]);
21046 break;
21047
21048 case RULE_OP_MANGLE_DUPEWORD:
21049 SET_NAME (rule, rule_buf[rule_pos]);
21050 break;
21051
21052 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21053 SET_NAME (rule, rule_buf[rule_pos]);
21054 SET_P0_CONV (rule, rule_buf[rule_pos]);
21055 break;
21056
21057 case RULE_OP_MANGLE_REFLECT:
21058 SET_NAME (rule, rule_buf[rule_pos]);
21059 break;
21060
21061 case RULE_OP_MANGLE_ROTATE_LEFT:
21062 SET_NAME (rule, rule_buf[rule_pos]);
21063 break;
21064
21065 case RULE_OP_MANGLE_ROTATE_RIGHT:
21066 SET_NAME (rule, rule_buf[rule_pos]);
21067 break;
21068
21069 case RULE_OP_MANGLE_APPEND:
21070 SET_NAME (rule, rule_buf[rule_pos]);
21071 SET_P0 (rule, rule_buf[rule_pos]);
21072 break;
21073
21074 case RULE_OP_MANGLE_PREPEND:
21075 SET_NAME (rule, rule_buf[rule_pos]);
21076 SET_P0 (rule, rule_buf[rule_pos]);
21077 break;
21078
21079 case RULE_OP_MANGLE_DELETE_FIRST:
21080 SET_NAME (rule, rule_buf[rule_pos]);
21081 break;
21082
21083 case RULE_OP_MANGLE_DELETE_LAST:
21084 SET_NAME (rule, rule_buf[rule_pos]);
21085 break;
21086
21087 case RULE_OP_MANGLE_DELETE_AT:
21088 SET_NAME (rule, rule_buf[rule_pos]);
21089 SET_P0_CONV (rule, rule_buf[rule_pos]);
21090 break;
21091
21092 case RULE_OP_MANGLE_EXTRACT:
21093 SET_NAME (rule, rule_buf[rule_pos]);
21094 SET_P0_CONV (rule, rule_buf[rule_pos]);
21095 SET_P1_CONV (rule, rule_buf[rule_pos]);
21096 break;
21097
21098 case RULE_OP_MANGLE_OMIT:
21099 SET_NAME (rule, rule_buf[rule_pos]);
21100 SET_P0_CONV (rule, rule_buf[rule_pos]);
21101 SET_P1_CONV (rule, rule_buf[rule_pos]);
21102 break;
21103
21104 case RULE_OP_MANGLE_INSERT:
21105 SET_NAME (rule, rule_buf[rule_pos]);
21106 SET_P0_CONV (rule, rule_buf[rule_pos]);
21107 SET_P1 (rule, rule_buf[rule_pos]);
21108 break;
21109
21110 case RULE_OP_MANGLE_OVERSTRIKE:
21111 SET_NAME (rule, rule_buf[rule_pos]);
21112 SET_P0_CONV (rule, rule_buf[rule_pos]);
21113 SET_P1 (rule, rule_buf[rule_pos]);
21114 break;
21115
21116 case RULE_OP_MANGLE_TRUNCATE_AT:
21117 SET_NAME (rule, rule_buf[rule_pos]);
21118 SET_P0_CONV (rule, rule_buf[rule_pos]);
21119 break;
21120
21121 case RULE_OP_MANGLE_REPLACE:
21122 SET_NAME (rule, rule_buf[rule_pos]);
21123 SET_P0 (rule, rule_buf[rule_pos]);
21124 SET_P1 (rule, rule_buf[rule_pos]);
21125 break;
21126
21127 case RULE_OP_MANGLE_PURGECHAR:
21128 return (-1);
21129 break;
21130
21131 case RULE_OP_MANGLE_TOGGLECASE_REC:
21132 return (-1);
21133 break;
21134
21135 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21136 SET_NAME (rule, rule_buf[rule_pos]);
21137 SET_P0_CONV (rule, rule_buf[rule_pos]);
21138 break;
21139
21140 case RULE_OP_MANGLE_DUPECHAR_LAST:
21141 SET_NAME (rule, rule_buf[rule_pos]);
21142 SET_P0_CONV (rule, rule_buf[rule_pos]);
21143 break;
21144
21145 case RULE_OP_MANGLE_DUPECHAR_ALL:
21146 SET_NAME (rule, rule_buf[rule_pos]);
21147 break;
21148
21149 case RULE_OP_MANGLE_SWITCH_FIRST:
21150 SET_NAME (rule, rule_buf[rule_pos]);
21151 break;
21152
21153 case RULE_OP_MANGLE_SWITCH_LAST:
21154 SET_NAME (rule, rule_buf[rule_pos]);
21155 break;
21156
21157 case RULE_OP_MANGLE_SWITCH_AT:
21158 SET_NAME (rule, rule_buf[rule_pos]);
21159 SET_P0_CONV (rule, rule_buf[rule_pos]);
21160 SET_P1_CONV (rule, rule_buf[rule_pos]);
21161 break;
21162
21163 case RULE_OP_MANGLE_CHR_SHIFTL:
21164 SET_NAME (rule, rule_buf[rule_pos]);
21165 SET_P0_CONV (rule, rule_buf[rule_pos]);
21166 break;
21167
21168 case RULE_OP_MANGLE_CHR_SHIFTR:
21169 SET_NAME (rule, rule_buf[rule_pos]);
21170 SET_P0_CONV (rule, rule_buf[rule_pos]);
21171 break;
21172
21173 case RULE_OP_MANGLE_CHR_INCR:
21174 SET_NAME (rule, rule_buf[rule_pos]);
21175 SET_P0_CONV (rule, rule_buf[rule_pos]);
21176 break;
21177
21178 case RULE_OP_MANGLE_CHR_DECR:
21179 SET_NAME (rule, rule_buf[rule_pos]);
21180 SET_P0_CONV (rule, rule_buf[rule_pos]);
21181 break;
21182
21183 case RULE_OP_MANGLE_REPLACE_NP1:
21184 SET_NAME (rule, rule_buf[rule_pos]);
21185 SET_P0_CONV (rule, rule_buf[rule_pos]);
21186 break;
21187
21188 case RULE_OP_MANGLE_REPLACE_NM1:
21189 SET_NAME (rule, rule_buf[rule_pos]);
21190 SET_P0_CONV (rule, rule_buf[rule_pos]);
21191 break;
21192
21193 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21194 SET_NAME (rule, rule_buf[rule_pos]);
21195 SET_P0_CONV (rule, rule_buf[rule_pos]);
21196 break;
21197
21198 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21199 SET_NAME (rule, rule_buf[rule_pos]);
21200 SET_P0_CONV (rule, rule_buf[rule_pos]);
21201 break;
21202
21203 case RULE_OP_MANGLE_TITLE:
21204 SET_NAME (rule, rule_buf[rule_pos]);
21205 break;
21206
21207 default:
21208 return (-1);
21209 break;
21210 }
21211 }
21212
21213 if (rule_pos < rule_len) return (-1);
21214
21215 return (0);
21216 }
21217
21218 int kernel_rule_to_cpu_rule (char *rule_buf, kernel_rule_t *rule)
21219 {
21220 uint rule_cnt;
21221 uint rule_pos;
21222 uint rule_len = HCBUFSIZ - 1; // maximum possible len
21223
21224 char rule_cmd;
21225
21226 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
21227 {
21228 GET_NAME (rule);
21229
21230 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
21231
21232 switch (rule_cmd)
21233 {
21234 case RULE_OP_MANGLE_NOOP:
21235 rule_buf[rule_pos] = rule_cmd;
21236 break;
21237
21238 case RULE_OP_MANGLE_LREST:
21239 rule_buf[rule_pos] = rule_cmd;
21240 break;
21241
21242 case RULE_OP_MANGLE_UREST:
21243 rule_buf[rule_pos] = rule_cmd;
21244 break;
21245
21246 case RULE_OP_MANGLE_LREST_UFIRST:
21247 rule_buf[rule_pos] = rule_cmd;
21248 break;
21249
21250 case RULE_OP_MANGLE_UREST_LFIRST:
21251 rule_buf[rule_pos] = rule_cmd;
21252 break;
21253
21254 case RULE_OP_MANGLE_TREST:
21255 rule_buf[rule_pos] = rule_cmd;
21256 break;
21257
21258 case RULE_OP_MANGLE_TOGGLE_AT:
21259 rule_buf[rule_pos] = rule_cmd;
21260 GET_P0_CONV (rule);
21261 break;
21262
21263 case RULE_OP_MANGLE_REVERSE:
21264 rule_buf[rule_pos] = rule_cmd;
21265 break;
21266
21267 case RULE_OP_MANGLE_DUPEWORD:
21268 rule_buf[rule_pos] = rule_cmd;
21269 break;
21270
21271 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21272 rule_buf[rule_pos] = rule_cmd;
21273 GET_P0_CONV (rule);
21274 break;
21275
21276 case RULE_OP_MANGLE_REFLECT:
21277 rule_buf[rule_pos] = rule_cmd;
21278 break;
21279
21280 case RULE_OP_MANGLE_ROTATE_LEFT:
21281 rule_buf[rule_pos] = rule_cmd;
21282 break;
21283
21284 case RULE_OP_MANGLE_ROTATE_RIGHT:
21285 rule_buf[rule_pos] = rule_cmd;
21286 break;
21287
21288 case RULE_OP_MANGLE_APPEND:
21289 rule_buf[rule_pos] = rule_cmd;
21290 GET_P0 (rule);
21291 break;
21292
21293 case RULE_OP_MANGLE_PREPEND:
21294 rule_buf[rule_pos] = rule_cmd;
21295 GET_P0 (rule);
21296 break;
21297
21298 case RULE_OP_MANGLE_DELETE_FIRST:
21299 rule_buf[rule_pos] = rule_cmd;
21300 break;
21301
21302 case RULE_OP_MANGLE_DELETE_LAST:
21303 rule_buf[rule_pos] = rule_cmd;
21304 break;
21305
21306 case RULE_OP_MANGLE_DELETE_AT:
21307 rule_buf[rule_pos] = rule_cmd;
21308 GET_P0_CONV (rule);
21309 break;
21310
21311 case RULE_OP_MANGLE_EXTRACT:
21312 rule_buf[rule_pos] = rule_cmd;
21313 GET_P0_CONV (rule);
21314 GET_P1_CONV (rule);
21315 break;
21316
21317 case RULE_OP_MANGLE_OMIT:
21318 rule_buf[rule_pos] = rule_cmd;
21319 GET_P0_CONV (rule);
21320 GET_P1_CONV (rule);
21321 break;
21322
21323 case RULE_OP_MANGLE_INSERT:
21324 rule_buf[rule_pos] = rule_cmd;
21325 GET_P0_CONV (rule);
21326 GET_P1 (rule);
21327 break;
21328
21329 case RULE_OP_MANGLE_OVERSTRIKE:
21330 rule_buf[rule_pos] = rule_cmd;
21331 GET_P0_CONV (rule);
21332 GET_P1 (rule);
21333 break;
21334
21335 case RULE_OP_MANGLE_TRUNCATE_AT:
21336 rule_buf[rule_pos] = rule_cmd;
21337 GET_P0_CONV (rule);
21338 break;
21339
21340 case RULE_OP_MANGLE_REPLACE:
21341 rule_buf[rule_pos] = rule_cmd;
21342 GET_P0 (rule);
21343 GET_P1 (rule);
21344 break;
21345
21346 case RULE_OP_MANGLE_PURGECHAR:
21347 return (-1);
21348 break;
21349
21350 case RULE_OP_MANGLE_TOGGLECASE_REC:
21351 return (-1);
21352 break;
21353
21354 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21355 rule_buf[rule_pos] = rule_cmd;
21356 GET_P0_CONV (rule);
21357 break;
21358
21359 case RULE_OP_MANGLE_DUPECHAR_LAST:
21360 rule_buf[rule_pos] = rule_cmd;
21361 GET_P0_CONV (rule);
21362 break;
21363
21364 case RULE_OP_MANGLE_DUPECHAR_ALL:
21365 rule_buf[rule_pos] = rule_cmd;
21366 break;
21367
21368 case RULE_OP_MANGLE_SWITCH_FIRST:
21369 rule_buf[rule_pos] = rule_cmd;
21370 break;
21371
21372 case RULE_OP_MANGLE_SWITCH_LAST:
21373 rule_buf[rule_pos] = rule_cmd;
21374 break;
21375
21376 case RULE_OP_MANGLE_SWITCH_AT:
21377 rule_buf[rule_pos] = rule_cmd;
21378 GET_P0_CONV (rule);
21379 GET_P1_CONV (rule);
21380 break;
21381
21382 case RULE_OP_MANGLE_CHR_SHIFTL:
21383 rule_buf[rule_pos] = rule_cmd;
21384 GET_P0_CONV (rule);
21385 break;
21386
21387 case RULE_OP_MANGLE_CHR_SHIFTR:
21388 rule_buf[rule_pos] = rule_cmd;
21389 GET_P0_CONV (rule);
21390 break;
21391
21392 case RULE_OP_MANGLE_CHR_INCR:
21393 rule_buf[rule_pos] = rule_cmd;
21394 GET_P0_CONV (rule);
21395 break;
21396
21397 case RULE_OP_MANGLE_CHR_DECR:
21398 rule_buf[rule_pos] = rule_cmd;
21399 GET_P0_CONV (rule);
21400 break;
21401
21402 case RULE_OP_MANGLE_REPLACE_NP1:
21403 rule_buf[rule_pos] = rule_cmd;
21404 GET_P0_CONV (rule);
21405 break;
21406
21407 case RULE_OP_MANGLE_REPLACE_NM1:
21408 rule_buf[rule_pos] = rule_cmd;
21409 GET_P0_CONV (rule);
21410 break;
21411
21412 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21413 rule_buf[rule_pos] = rule_cmd;
21414 GET_P0_CONV (rule);
21415 break;
21416
21417 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21418 rule_buf[rule_pos] = rule_cmd;
21419 GET_P0_CONV (rule);
21420 break;
21421
21422 case RULE_OP_MANGLE_TITLE:
21423 rule_buf[rule_pos] = rule_cmd;
21424 break;
21425
21426 case 0:
21427 return rule_pos - 1;
21428 break;
21429
21430 default:
21431 return (-1);
21432 break;
21433 }
21434 }
21435
21436 if (rule_cnt > 0)
21437 {
21438 return rule_pos;
21439 }
21440
21441 return (-1);
21442 }
21443
21444 /**
21445 * CPU rules : this is from hashcat sources, cpu based rules
21446 */
21447
21448 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
21449 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
21450
21451 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
21452 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
21453 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
21454
21455 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
21456 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
21457 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
21458
21459 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
21460 {
21461 int pos;
21462
21463 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
21464
21465 return (arr_len);
21466 }
21467
21468 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
21469 {
21470 int pos;
21471
21472 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
21473
21474 return (arr_len);
21475 }
21476
21477 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
21478 {
21479 int pos;
21480
21481 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
21482
21483 return (arr_len);
21484 }
21485
21486 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
21487 {
21488 int l;
21489 int r;
21490
21491 for (l = 0; l < arr_len; l++)
21492 {
21493 r = arr_len - 1 - l;
21494
21495 if (l >= r) break;
21496
21497 MANGLE_SWITCH (arr, l, r);
21498 }
21499
21500 return (arr_len);
21501 }
21502
21503 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
21504 {
21505 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21506
21507 memcpy (&arr[arr_len], arr, (size_t) arr_len);
21508
21509 return (arr_len * 2);
21510 }
21511
21512 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
21513 {
21514 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
21515
21516 int orig_len = arr_len;
21517
21518 int i;
21519
21520 for (i = 0; i < times; i++)
21521 {
21522 memcpy (&arr[arr_len], arr, orig_len);
21523
21524 arr_len += orig_len;
21525 }
21526
21527 return (arr_len);
21528 }
21529
21530 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
21531 {
21532 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21533
21534 mangle_double (arr, arr_len);
21535
21536 mangle_reverse (arr + arr_len, arr_len);
21537
21538 return (arr_len * 2);
21539 }
21540
21541 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
21542 {
21543 int l;
21544 int r;
21545
21546 for (l = 0, r = arr_len - 1; r > 0; r--)
21547 {
21548 MANGLE_SWITCH (arr, l, r);
21549 }
21550
21551 return (arr_len);
21552 }
21553
21554 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
21555 {
21556 int l;
21557 int r;
21558
21559 for (l = 0, r = arr_len - 1; l < r; l++)
21560 {
21561 MANGLE_SWITCH (arr, l, r);
21562 }
21563
21564 return (arr_len);
21565 }
21566
21567 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
21568 {
21569 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21570
21571 arr[arr_len] = c;
21572
21573 return (arr_len + 1);
21574 }
21575
21576 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
21577 {
21578 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21579
21580 int arr_pos;
21581
21582 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21583 {
21584 arr[arr_pos + 1] = arr[arr_pos];
21585 }
21586
21587 arr[0] = c;
21588
21589 return (arr_len + 1);
21590 }
21591
21592 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21593 {
21594 if (upos >= arr_len) return (arr_len);
21595
21596 int arr_pos;
21597
21598 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
21599 {
21600 arr[arr_pos] = arr[arr_pos + 1];
21601 }
21602
21603 return (arr_len - 1);
21604 }
21605
21606 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21607 {
21608 if (upos >= arr_len) return (arr_len);
21609
21610 if ((upos + ulen) > arr_len) return (arr_len);
21611
21612 int arr_pos;
21613
21614 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
21615 {
21616 arr[arr_pos] = arr[upos + arr_pos];
21617 }
21618
21619 return (ulen);
21620 }
21621
21622 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21623 {
21624 if (upos >= arr_len) return (arr_len);
21625
21626 if ((upos + ulen) >= arr_len) return (arr_len);
21627
21628 int arr_pos;
21629
21630 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
21631 {
21632 arr[arr_pos] = arr[arr_pos + ulen];
21633 }
21634
21635 return (arr_len - ulen);
21636 }
21637
21638 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21639 {
21640 if (upos >= arr_len) return (arr_len);
21641
21642 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21643
21644 int arr_pos;
21645
21646 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
21647 {
21648 arr[arr_pos + 1] = arr[arr_pos];
21649 }
21650
21651 arr[upos] = c;
21652
21653 return (arr_len + 1);
21654 }
21655
21656 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)
21657 {
21658 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21659
21660 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
21661
21662 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
21663
21664 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
21665
21666 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
21667
21668 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
21669
21670 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
21671
21672 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
21673
21674 return (arr_len + arr2_cpy);
21675 }
21676
21677 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21678 {
21679 if (upos >= arr_len) return (arr_len);
21680
21681 arr[upos] = c;
21682
21683 return (arr_len);
21684 }
21685
21686 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21687 {
21688 if (upos >= arr_len) return (arr_len);
21689
21690 memset (arr + upos, 0, arr_len - upos);
21691
21692 return (upos);
21693 }
21694
21695 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
21696 {
21697 int arr_pos;
21698
21699 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
21700 {
21701 if (arr[arr_pos] != oldc) continue;
21702
21703 arr[arr_pos] = newc;
21704 }
21705
21706 return (arr_len);
21707 }
21708
21709 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
21710 {
21711 int arr_pos;
21712
21713 int ret_len;
21714
21715 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
21716 {
21717 if (arr[arr_pos] == c) continue;
21718
21719 arr[ret_len] = arr[arr_pos];
21720
21721 ret_len++;
21722 }
21723
21724 return (ret_len);
21725 }
21726
21727 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
21728 {
21729 if (ulen > arr_len) return (arr_len);
21730
21731 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21732
21733 char cs[100] = { 0 };
21734
21735 memcpy (cs, arr, ulen);
21736
21737 int i;
21738
21739 for (i = 0; i < ulen; i++)
21740 {
21741 char c = cs[i];
21742
21743 arr_len = mangle_insert (arr, arr_len, i, c);
21744 }
21745
21746 return (arr_len);
21747 }
21748
21749 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
21750 {
21751 if (ulen > arr_len) return (arr_len);
21752
21753 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21754
21755 int upos = arr_len - ulen;
21756
21757 int i;
21758
21759 for (i = 0; i < ulen; i++)
21760 {
21761 char c = arr[upos + i];
21762
21763 arr_len = mangle_append (arr, arr_len, c);
21764 }
21765
21766 return (arr_len);
21767 }
21768
21769 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21770 {
21771 if ( arr_len == 0) return (arr_len);
21772 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21773
21774 char c = arr[upos];
21775
21776 int i;
21777
21778 for (i = 0; i < ulen; i++)
21779 {
21780 arr_len = mangle_insert (arr, arr_len, upos, c);
21781 }
21782
21783 return (arr_len);
21784 }
21785
21786 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
21787 {
21788 if ( arr_len == 0) return (arr_len);
21789 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
21790
21791 int arr_pos;
21792
21793 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21794 {
21795 int new_pos = arr_pos * 2;
21796
21797 arr[new_pos] = arr[arr_pos];
21798
21799 arr[new_pos + 1] = arr[arr_pos];
21800 }
21801
21802 return (arr_len * 2);
21803 }
21804
21805 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21806 {
21807 if (upos >= arr_len) return (arr_len);
21808 if (upos2 >= arr_len) return (arr_len);
21809
21810 MANGLE_SWITCH (arr, upos, upos2);
21811
21812 return (arr_len);
21813 }
21814
21815 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21816 {
21817 MANGLE_SWITCH (arr, upos, upos2);
21818
21819 return (arr_len);
21820 }
21821
21822 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
21823 {
21824 if (upos >= arr_len) return (arr_len);
21825
21826 arr[upos] <<= 1;
21827
21828 return (arr_len);
21829 }
21830
21831 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
21832 {
21833 if (upos >= arr_len) return (arr_len);
21834
21835 arr[upos] >>= 1;
21836
21837 return (arr_len);
21838 }
21839
21840 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
21841 {
21842 if (upos >= arr_len) return (arr_len);
21843
21844 arr[upos] += 1;
21845
21846 return (arr_len);
21847 }
21848
21849 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
21850 {
21851 if (upos >= arr_len) return (arr_len);
21852
21853 arr[upos] -= 1;
21854
21855 return (arr_len);
21856 }
21857
21858 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
21859 {
21860 int upper_next = 1;
21861
21862 int pos;
21863
21864 for (pos = 0; pos < arr_len; pos++)
21865 {
21866 if (arr[pos] == ' ')
21867 {
21868 upper_next = 1;
21869
21870 continue;
21871 }
21872
21873 if (upper_next)
21874 {
21875 upper_next = 0;
21876
21877 MANGLE_UPPER_AT (arr, pos);
21878 }
21879 else
21880 {
21881 MANGLE_LOWER_AT (arr, pos);
21882 }
21883 }
21884
21885 return (arr_len);
21886 }
21887
21888 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
21889 {
21890 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
21891
21892 u32 j;
21893
21894 u32 rule_pos = 0;
21895
21896 for (j = 0; j < rp_gen_num; j++)
21897 {
21898 u32 r = 0;
21899 u32 p1 = 0;
21900 u32 p2 = 0;
21901 u32 p3 = 0;
21902
21903 switch ((char) get_random_num (0, 9))
21904 {
21905 case 0:
21906 r = get_random_num (0, sizeof (grp_op_nop));
21907 rule_buf[rule_pos++] = grp_op_nop[r];
21908 break;
21909
21910 case 1:
21911 r = get_random_num (0, sizeof (grp_op_pos_p0));
21912 rule_buf[rule_pos++] = grp_op_pos_p0[r];
21913 p1 = get_random_num (0, sizeof (grp_pos));
21914 rule_buf[rule_pos++] = grp_pos[p1];
21915 break;
21916
21917 case 2:
21918 r = get_random_num (0, sizeof (grp_op_pos_p1));
21919 rule_buf[rule_pos++] = grp_op_pos_p1[r];
21920 p1 = get_random_num (1, 6);
21921 rule_buf[rule_pos++] = grp_pos[p1];
21922 break;
21923
21924 case 3:
21925 r = get_random_num (0, sizeof (grp_op_chr));
21926 rule_buf[rule_pos++] = grp_op_chr[r];
21927 p1 = get_random_num (0x20, 0x7e);
21928 rule_buf[rule_pos++] = (char) p1;
21929 break;
21930
21931 case 4:
21932 r = get_random_num (0, sizeof (grp_op_chr_chr));
21933 rule_buf[rule_pos++] = grp_op_chr_chr[r];
21934 p1 = get_random_num (0x20, 0x7e);
21935 rule_buf[rule_pos++] = (char) p1;
21936 p2 = get_random_num (0x20, 0x7e);
21937 while (p1 == p2)
21938 p2 = get_random_num (0x20, 0x7e);
21939 rule_buf[rule_pos++] = (char) p2;
21940 break;
21941
21942 case 5:
21943 r = get_random_num (0, sizeof (grp_op_pos_chr));
21944 rule_buf[rule_pos++] = grp_op_pos_chr[r];
21945 p1 = get_random_num (0, sizeof (grp_pos));
21946 rule_buf[rule_pos++] = grp_pos[p1];
21947 p2 = get_random_num (0x20, 0x7e);
21948 rule_buf[rule_pos++] = (char) p2;
21949 break;
21950
21951 case 6:
21952 r = get_random_num (0, sizeof (grp_op_pos_pos0));
21953 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
21954 p1 = get_random_num (0, sizeof (grp_pos));
21955 rule_buf[rule_pos++] = grp_pos[p1];
21956 p2 = get_random_num (0, sizeof (grp_pos));
21957 while (p1 == p2)
21958 p2 = get_random_num (0, sizeof (grp_pos));
21959 rule_buf[rule_pos++] = grp_pos[p2];
21960 break;
21961
21962 case 7:
21963 r = get_random_num (0, sizeof (grp_op_pos_pos1));
21964 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
21965 p1 = get_random_num (0, sizeof (grp_pos));
21966 rule_buf[rule_pos++] = grp_pos[p1];
21967 p2 = get_random_num (1, sizeof (grp_pos));
21968 while (p1 == p2)
21969 p2 = get_random_num (1, sizeof (grp_pos));
21970 rule_buf[rule_pos++] = grp_pos[p2];
21971 break;
21972
21973 case 8:
21974 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
21975 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
21976 p1 = get_random_num (0, sizeof (grp_pos));
21977 rule_buf[rule_pos++] = grp_pos[p1];
21978 p2 = get_random_num (1, sizeof (grp_pos));
21979 rule_buf[rule_pos++] = grp_pos[p1];
21980 p3 = get_random_num (0, sizeof (grp_pos));
21981 rule_buf[rule_pos++] = grp_pos[p3];
21982 break;
21983 }
21984 }
21985
21986 return (rule_pos);
21987 }
21988
21989 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
21990 {
21991 char mem[BLOCK_SIZE] = { 0 };
21992
21993 if (in == NULL) return (RULE_RC_REJECT_ERROR);
21994
21995 if (out == NULL) return (RULE_RC_REJECT_ERROR);
21996
21997 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21998
21999 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
22000
22001 int out_len = in_len;
22002 int mem_len = in_len;
22003
22004 memcpy (out, in, out_len);
22005
22006 int rule_pos;
22007
22008 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
22009 {
22010 int upos, upos2;
22011 int ulen;
22012
22013 switch (rule[rule_pos])
22014 {
22015 case ' ':
22016 break;
22017
22018 case RULE_OP_MANGLE_NOOP:
22019 break;
22020
22021 case RULE_OP_MANGLE_LREST:
22022 out_len = mangle_lrest (out, out_len);
22023 break;
22024
22025 case RULE_OP_MANGLE_UREST:
22026 out_len = mangle_urest (out, out_len);
22027 break;
22028
22029 case RULE_OP_MANGLE_LREST_UFIRST:
22030 out_len = mangle_lrest (out, out_len);
22031 if (out_len) MANGLE_UPPER_AT (out, 0);
22032 break;
22033
22034 case RULE_OP_MANGLE_UREST_LFIRST:
22035 out_len = mangle_urest (out, out_len);
22036 if (out_len) MANGLE_LOWER_AT (out, 0);
22037 break;
22038
22039 case RULE_OP_MANGLE_TREST:
22040 out_len = mangle_trest (out, out_len);
22041 break;
22042
22043 case RULE_OP_MANGLE_TOGGLE_AT:
22044 NEXT_RULEPOS (rule_pos);
22045 NEXT_RPTOI (rule, rule_pos, upos);
22046 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
22047 break;
22048
22049 case RULE_OP_MANGLE_REVERSE:
22050 out_len = mangle_reverse (out, out_len);
22051 break;
22052
22053 case RULE_OP_MANGLE_DUPEWORD:
22054 out_len = mangle_double (out, out_len);
22055 break;
22056
22057 case RULE_OP_MANGLE_DUPEWORD_TIMES:
22058 NEXT_RULEPOS (rule_pos);
22059 NEXT_RPTOI (rule, rule_pos, ulen);
22060 out_len = mangle_double_times (out, out_len, ulen);
22061 break;
22062
22063 case RULE_OP_MANGLE_REFLECT:
22064 out_len = mangle_reflect (out, out_len);
22065 break;
22066
22067 case RULE_OP_MANGLE_ROTATE_LEFT:
22068 mangle_rotate_left (out, out_len);
22069 break;
22070
22071 case RULE_OP_MANGLE_ROTATE_RIGHT:
22072 mangle_rotate_right (out, out_len);
22073 break;
22074
22075 case RULE_OP_MANGLE_APPEND:
22076 NEXT_RULEPOS (rule_pos);
22077 out_len = mangle_append (out, out_len, rule[rule_pos]);
22078 break;
22079
22080 case RULE_OP_MANGLE_PREPEND:
22081 NEXT_RULEPOS (rule_pos);
22082 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
22083 break;
22084
22085 case RULE_OP_MANGLE_DELETE_FIRST:
22086 out_len = mangle_delete_at (out, out_len, 0);
22087 break;
22088
22089 case RULE_OP_MANGLE_DELETE_LAST:
22090 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
22091 break;
22092
22093 case RULE_OP_MANGLE_DELETE_AT:
22094 NEXT_RULEPOS (rule_pos);
22095 NEXT_RPTOI (rule, rule_pos, upos);
22096 out_len = mangle_delete_at (out, out_len, upos);
22097 break;
22098
22099 case RULE_OP_MANGLE_EXTRACT:
22100 NEXT_RULEPOS (rule_pos);
22101 NEXT_RPTOI (rule, rule_pos, upos);
22102 NEXT_RULEPOS (rule_pos);
22103 NEXT_RPTOI (rule, rule_pos, ulen);
22104 out_len = mangle_extract (out, out_len, upos, ulen);
22105 break;
22106
22107 case RULE_OP_MANGLE_OMIT:
22108 NEXT_RULEPOS (rule_pos);
22109 NEXT_RPTOI (rule, rule_pos, upos);
22110 NEXT_RULEPOS (rule_pos);
22111 NEXT_RPTOI (rule, rule_pos, ulen);
22112 out_len = mangle_omit (out, out_len, upos, ulen);
22113 break;
22114
22115 case RULE_OP_MANGLE_INSERT:
22116 NEXT_RULEPOS (rule_pos);
22117 NEXT_RPTOI (rule, rule_pos, upos);
22118 NEXT_RULEPOS (rule_pos);
22119 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
22120 break;
22121
22122 case RULE_OP_MANGLE_OVERSTRIKE:
22123 NEXT_RULEPOS (rule_pos);
22124 NEXT_RPTOI (rule, rule_pos, upos);
22125 NEXT_RULEPOS (rule_pos);
22126 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
22127 break;
22128
22129 case RULE_OP_MANGLE_TRUNCATE_AT:
22130 NEXT_RULEPOS (rule_pos);
22131 NEXT_RPTOI (rule, rule_pos, upos);
22132 out_len = mangle_truncate_at (out, out_len, upos);
22133 break;
22134
22135 case RULE_OP_MANGLE_REPLACE:
22136 NEXT_RULEPOS (rule_pos);
22137 NEXT_RULEPOS (rule_pos);
22138 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
22139 break;
22140
22141 case RULE_OP_MANGLE_PURGECHAR:
22142 NEXT_RULEPOS (rule_pos);
22143 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
22144 break;
22145
22146 case RULE_OP_MANGLE_TOGGLECASE_REC:
22147 /* todo */
22148 break;
22149
22150 case RULE_OP_MANGLE_DUPECHAR_FIRST:
22151 NEXT_RULEPOS (rule_pos);
22152 NEXT_RPTOI (rule, rule_pos, ulen);
22153 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
22154 break;
22155
22156 case RULE_OP_MANGLE_DUPECHAR_LAST:
22157 NEXT_RULEPOS (rule_pos);
22158 NEXT_RPTOI (rule, rule_pos, ulen);
22159 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
22160 break;
22161
22162 case RULE_OP_MANGLE_DUPECHAR_ALL:
22163 out_len = mangle_dupechar (out, out_len);
22164 break;
22165
22166 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
22167 NEXT_RULEPOS (rule_pos);
22168 NEXT_RPTOI (rule, rule_pos, ulen);
22169 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
22170 break;
22171
22172 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
22173 NEXT_RULEPOS (rule_pos);
22174 NEXT_RPTOI (rule, rule_pos, ulen);
22175 out_len = mangle_dupeblock_append (out, out_len, ulen);
22176 break;
22177
22178 case RULE_OP_MANGLE_SWITCH_FIRST:
22179 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
22180 break;
22181
22182 case RULE_OP_MANGLE_SWITCH_LAST:
22183 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
22184 break;
22185
22186 case RULE_OP_MANGLE_SWITCH_AT:
22187 NEXT_RULEPOS (rule_pos);
22188 NEXT_RPTOI (rule, rule_pos, upos);
22189 NEXT_RULEPOS (rule_pos);
22190 NEXT_RPTOI (rule, rule_pos, upos2);
22191 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
22192 break;
22193
22194 case RULE_OP_MANGLE_CHR_SHIFTL:
22195 NEXT_RULEPOS (rule_pos);
22196 NEXT_RPTOI (rule, rule_pos, upos);
22197 mangle_chr_shiftl (out, out_len, upos);
22198 break;
22199
22200 case RULE_OP_MANGLE_CHR_SHIFTR:
22201 NEXT_RULEPOS (rule_pos);
22202 NEXT_RPTOI (rule, rule_pos, upos);
22203 mangle_chr_shiftr (out, out_len, upos);
22204 break;
22205
22206 case RULE_OP_MANGLE_CHR_INCR:
22207 NEXT_RULEPOS (rule_pos);
22208 NEXT_RPTOI (rule, rule_pos, upos);
22209 mangle_chr_incr (out, out_len, upos);
22210 break;
22211
22212 case RULE_OP_MANGLE_CHR_DECR:
22213 NEXT_RULEPOS (rule_pos);
22214 NEXT_RPTOI (rule, rule_pos, upos);
22215 mangle_chr_decr (out, out_len, upos);
22216 break;
22217
22218 case RULE_OP_MANGLE_REPLACE_NP1:
22219 NEXT_RULEPOS (rule_pos);
22220 NEXT_RPTOI (rule, rule_pos, upos);
22221 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
22222 break;
22223
22224 case RULE_OP_MANGLE_REPLACE_NM1:
22225 NEXT_RULEPOS (rule_pos);
22226 NEXT_RPTOI (rule, rule_pos, upos);
22227 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
22228 break;
22229
22230 case RULE_OP_MANGLE_TITLE:
22231 out_len = mangle_title (out, out_len);
22232 break;
22233
22234 case RULE_OP_MANGLE_EXTRACT_MEMORY:
22235 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22236 NEXT_RULEPOS (rule_pos);
22237 NEXT_RPTOI (rule, rule_pos, upos);
22238 NEXT_RULEPOS (rule_pos);
22239 NEXT_RPTOI (rule, rule_pos, ulen);
22240 NEXT_RULEPOS (rule_pos);
22241 NEXT_RPTOI (rule, rule_pos, upos2);
22242 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
22243 break;
22244
22245 case RULE_OP_MANGLE_APPEND_MEMORY:
22246 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22247 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22248 memcpy (out + out_len, mem, mem_len);
22249 out_len += mem_len;
22250 break;
22251
22252 case RULE_OP_MANGLE_PREPEND_MEMORY:
22253 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22254 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22255 memcpy (mem + mem_len, out, out_len);
22256 out_len += mem_len;
22257 memcpy (out, mem, out_len);
22258 break;
22259
22260 case RULE_OP_MEMORIZE_WORD:
22261 memcpy (mem, out, out_len);
22262 mem_len = out_len;
22263 break;
22264
22265 case RULE_OP_REJECT_LESS:
22266 NEXT_RULEPOS (rule_pos);
22267 NEXT_RPTOI (rule, rule_pos, upos);
22268 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
22269 break;
22270
22271 case RULE_OP_REJECT_GREATER:
22272 NEXT_RULEPOS (rule_pos);
22273 NEXT_RPTOI (rule, rule_pos, upos);
22274 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
22275 break;
22276
22277 case RULE_OP_REJECT_CONTAIN:
22278 NEXT_RULEPOS (rule_pos);
22279 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
22280 break;
22281
22282 case RULE_OP_REJECT_NOT_CONTAIN:
22283 NEXT_RULEPOS (rule_pos);
22284 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
22285 break;
22286
22287 case RULE_OP_REJECT_EQUAL_FIRST:
22288 NEXT_RULEPOS (rule_pos);
22289 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22290 break;
22291
22292 case RULE_OP_REJECT_EQUAL_LAST:
22293 NEXT_RULEPOS (rule_pos);
22294 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22295 break;
22296
22297 case RULE_OP_REJECT_EQUAL_AT:
22298 NEXT_RULEPOS (rule_pos);
22299 NEXT_RPTOI (rule, rule_pos, upos);
22300 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22301 NEXT_RULEPOS (rule_pos);
22302 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22303 break;
22304
22305 case RULE_OP_REJECT_CONTAINS:
22306 NEXT_RULEPOS (rule_pos);
22307 NEXT_RPTOI (rule, rule_pos, upos);
22308 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22309 NEXT_RULEPOS (rule_pos);
22310 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
22311 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
22312 break;
22313
22314 case RULE_OP_REJECT_MEMORY:
22315 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
22316 break;
22317
22318 default:
22319 return (RULE_RC_SYNTAX_ERROR);
22320 break;
22321 }
22322 }
22323
22324 memset (out + out_len, 0, BLOCK_SIZE - out_len);
22325
22326 return (out_len);
22327 }