fix get_path_exe: not sure what I was thinking
[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 #if defined(DARWIN) || defined(__FreeBSD__)
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 char tmp[32] = { 0 };
4390
4391 size_t size = exec_path_len;
4392 sysctl(mib, 4, exec_path, &size, NULL, 0);
4393
4394 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4395
4396 #else
4397 #error Your Operating System is not supported or detected
4398 #endif
4399
4400 exec_path[len] = 0;
4401
4402 return exec_path;
4403 }
4404
4405 char *get_install_dir (const char *progname)
4406 {
4407 char *install_dir = mystrdup (progname);
4408 char *last_slash = NULL;
4409
4410 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4411 {
4412 *last_slash = 0;
4413 }
4414 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4415 {
4416 *last_slash = 0;
4417 }
4418 else
4419 {
4420 install_dir[0] = '.';
4421 install_dir[1] = 0;
4422 }
4423
4424 return (install_dir);
4425 }
4426
4427 char *get_profile_dir (const char *homedir)
4428 {
4429 #define DOT_HASHCAT ".hashcat"
4430
4431 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4432
4433 char *profile_dir = (char *) mymalloc (len + 1);
4434
4435 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4436
4437 return profile_dir;
4438 }
4439
4440 char *get_session_dir (const char *profile_dir)
4441 {
4442 #define SESSIONS_FOLDER "sessions"
4443
4444 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4445
4446 char *session_dir = (char *) mymalloc (len + 1);
4447
4448 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4449
4450 return session_dir;
4451 }
4452
4453 uint count_lines (FILE *fd)
4454 {
4455 uint cnt = 0;
4456
4457 char *buf = (char *) mymalloc (HCBUFSIZ + 1);
4458
4459 char prev = '\n';
4460
4461 while (!feof (fd))
4462 {
4463 size_t nread = fread (buf, sizeof (char), HCBUFSIZ, fd);
4464
4465 if (nread < 1) continue;
4466
4467 size_t i;
4468
4469 for (i = 0; i < nread; i++)
4470 {
4471 if (prev == '\n') cnt++;
4472
4473 prev = buf[i];
4474 }
4475 }
4476
4477 myfree (buf);
4478
4479 return cnt;
4480 }
4481
4482 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4483 {
4484 uint crc = ~0;
4485
4486 FILE *fd = fopen (filename, "rb");
4487
4488 if (fd == NULL)
4489 {
4490 log_error ("%s: %s", filename, strerror (errno));
4491
4492 exit (-1);
4493 }
4494
4495 #define MAX_KEY_SIZE (1024 * 1024)
4496
4497 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4498
4499 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4500
4501 fclose (fd);
4502
4503 int kpos = 0;
4504
4505 for (int fpos = 0; fpos < nread; fpos++)
4506 {
4507 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4508
4509 keytab[kpos++] += (crc >> 24) & 0xff;
4510 keytab[kpos++] += (crc >> 16) & 0xff;
4511 keytab[kpos++] += (crc >> 8) & 0xff;
4512 keytab[kpos++] += (crc >> 0) & 0xff;
4513
4514 if (kpos >= 64) kpos = 0;
4515 }
4516
4517 myfree (buf);
4518 }
4519
4520 #ifdef DARWIN
4521 int pthread_setaffinity_np (pthread_t thread, size_t cpu_size, cpu_set_t *cpu_set)
4522 {
4523 int core;
4524
4525 for (core = 0; core < (8 * (int)cpu_size); core++)
4526 if (CPU_ISSET(core, cpu_set)) break;
4527
4528 thread_affinity_policy_data_t policy = { core };
4529
4530 const int rc = thread_policy_set (pthread_mach_thread_np (thread), THREAD_AFFINITY_POLICY, (thread_policy_t) &policy, 1);
4531
4532 if (data.quiet == 0)
4533 {
4534 if (rc != KERN_SUCCESS)
4535 {
4536 log_error ("ERROR: %s : %d", "thread_policy_set()", rc);
4537 }
4538 }
4539
4540 return rc;
4541 }
4542 #endif
4543
4544 void set_cpu_affinity (char *cpu_affinity)
4545 {
4546 #ifdef _WIN
4547 DWORD_PTR aff_mask = 0;
4548 #elif __FreeBSD__
4549 cpuset_t cpuset;
4550 CPU_ZERO (&cpuset);
4551 #elif _POSIX
4552 cpu_set_t cpuset;
4553 CPU_ZERO (&cpuset);
4554 #endif
4555
4556 if (cpu_affinity)
4557 {
4558 char *devices = strdup (cpu_affinity);
4559
4560 char *next = strtok (devices, ",");
4561
4562 do
4563 {
4564 uint cpu_id = atoi (next);
4565
4566 if (cpu_id == 0)
4567 {
4568 #ifdef _WIN
4569 aff_mask = 0;
4570 #elif _POSIX
4571 CPU_ZERO (&cpuset);
4572 #endif
4573
4574 break;
4575 }
4576
4577 if (cpu_id > 32)
4578 {
4579 log_error ("ERROR: Invalid cpu_id %u specified", cpu_id);
4580
4581 exit (-1);
4582 }
4583
4584 #ifdef _WIN
4585 aff_mask |= 1 << (cpu_id - 1);
4586 #elif _POSIX
4587 CPU_SET ((cpu_id - 1), &cpuset);
4588 #endif
4589
4590 } while ((next = strtok (NULL, ",")) != NULL);
4591
4592 free (devices);
4593 }
4594
4595 #ifdef _WIN
4596 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4597 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4598 #elif __FreeBSD__
4599 pthread_t thread = pthread_self ();
4600 pthread_setaffinity_np (thread, sizeof (cpuset_t), &cpuset);
4601 #elif _POSIX
4602 pthread_t thread = pthread_self ();
4603 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4604 #endif
4605 }
4606
4607 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4608 {
4609 char *element, *end;
4610
4611 end = (char *) base + nmemb * size;
4612
4613 for (element = (char *) base; element < end; element += size)
4614 if (!compar (element, key))
4615 return element;
4616
4617 return NULL;
4618 }
4619
4620 int sort_by_u32 (const void *v1, const void *v2)
4621 {
4622 const u32 *s1 = (const u32 *) v1;
4623 const u32 *s2 = (const u32 *) v2;
4624
4625 return *s1 - *s2;
4626 }
4627
4628 int sort_by_salt (const void *v1, const void *v2)
4629 {
4630 const salt_t *s1 = (const salt_t *) v1;
4631 const salt_t *s2 = (const salt_t *) v2;
4632
4633 const int res1 = s1->salt_len - s2->salt_len;
4634
4635 if (res1 != 0) return (res1);
4636
4637 const int res2 = s1->salt_iter - s2->salt_iter;
4638
4639 if (res2 != 0) return (res2);
4640
4641 uint n;
4642
4643 n = 16;
4644
4645 while (n--)
4646 {
4647 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4648 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4649 }
4650
4651 n = 8;
4652
4653 while (n--)
4654 {
4655 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4656 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4657 }
4658
4659 return (0);
4660 }
4661
4662 int sort_by_salt_buf (const void *v1, const void *v2)
4663 {
4664 const pot_t *p1 = (const pot_t *) v1;
4665 const pot_t *p2 = (const pot_t *) v2;
4666
4667 const hash_t *h1 = &p1->hash;
4668 const hash_t *h2 = &p2->hash;
4669
4670 const salt_t *s1 = h1->salt;
4671 const salt_t *s2 = h2->salt;
4672
4673 uint n = 16;
4674
4675 while (n--)
4676 {
4677 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4678 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4679 }
4680
4681 return 0;
4682 }
4683
4684 int sort_by_hash_t_salt (const void *v1, const void *v2)
4685 {
4686 const hash_t *h1 = (const hash_t *) v1;
4687 const hash_t *h2 = (const hash_t *) v2;
4688
4689 const salt_t *s1 = h1->salt;
4690 const salt_t *s2 = h2->salt;
4691
4692 // testphase: this should work
4693 uint n = 16;
4694
4695 while (n--)
4696 {
4697 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4698 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4699 }
4700
4701 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4702 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4703 if (s1->salt_len > s2->salt_len) return ( 1);
4704 if (s1->salt_len < s2->salt_len) return (-1);
4705
4706 uint n = s1->salt_len;
4707
4708 while (n--)
4709 {
4710 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4711 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4712 }
4713 */
4714
4715 return 0;
4716 }
4717
4718 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4719 {
4720 const hash_t *h1 = (const hash_t *) v1;
4721 const hash_t *h2 = (const hash_t *) v2;
4722
4723 const salt_t *s1 = h1->salt;
4724 const salt_t *s2 = h2->salt;
4725
4726 // 16 - 2 (since last 2 uints contain the digest)
4727 uint n = 14;
4728
4729 while (n--)
4730 {
4731 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4732 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4733 }
4734
4735 return 0;
4736 }
4737
4738 int sort_by_hash_no_salt (const void *v1, const void *v2)
4739 {
4740 const hash_t *h1 = (const hash_t *) v1;
4741 const hash_t *h2 = (const hash_t *) v2;
4742
4743 const void *d1 = h1->digest;
4744 const void *d2 = h2->digest;
4745
4746 return data.sort_by_digest (d1, d2);
4747 }
4748
4749 int sort_by_hash (const void *v1, const void *v2)
4750 {
4751 const hash_t *h1 = (const hash_t *) v1;
4752 const hash_t *h2 = (const hash_t *) v2;
4753
4754 if (data.isSalted)
4755 {
4756 const salt_t *s1 = h1->salt;
4757 const salt_t *s2 = h2->salt;
4758
4759 int res = sort_by_salt (s1, s2);
4760
4761 if (res != 0) return (res);
4762 }
4763
4764 const void *d1 = h1->digest;
4765 const void *d2 = h2->digest;
4766
4767 return data.sort_by_digest (d1, d2);
4768 }
4769
4770 int sort_by_pot (const void *v1, const void *v2)
4771 {
4772 const pot_t *p1 = (const pot_t *) v1;
4773 const pot_t *p2 = (const pot_t *) v2;
4774
4775 const hash_t *h1 = &p1->hash;
4776 const hash_t *h2 = &p2->hash;
4777
4778 return sort_by_hash (h1, h2);
4779 }
4780
4781 int sort_by_mtime (const void *p1, const void *p2)
4782 {
4783 const char **f1 = (const char **) p1;
4784 const char **f2 = (const char **) p2;
4785
4786 struct stat s1; stat (*f1, &s1);
4787 struct stat s2; stat (*f2, &s2);
4788
4789 return s2.st_mtime - s1.st_mtime;
4790 }
4791
4792 int sort_by_cpu_rule (const void *p1, const void *p2)
4793 {
4794 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4795 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4796
4797 return memcmp (r1, r2, sizeof (cpu_rule_t));
4798 }
4799
4800 int sort_by_kernel_rule (const void *p1, const void *p2)
4801 {
4802 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4803 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4804
4805 return memcmp (r1, r2, sizeof (kernel_rule_t));
4806 }
4807
4808 int sort_by_stringptr (const void *p1, const void *p2)
4809 {
4810 const char **s1 = (const char **) p1;
4811 const char **s2 = (const char **) p2;
4812
4813 return strcmp (*s1, *s2);
4814 }
4815
4816 int sort_by_dictstat (const void *s1, const void *s2)
4817 {
4818 dictstat_t *d1 = (dictstat_t *) s1;
4819 dictstat_t *d2 = (dictstat_t *) s2;
4820
4821 #ifdef _LINUX
4822 d2->stat.st_atim = d1->stat.st_atim;
4823 #else
4824 d2->stat.st_atime = d1->stat.st_atime;
4825 #endif
4826
4827 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4828 }
4829
4830 int sort_by_bitmap (const void *p1, const void *p2)
4831 {
4832 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4833 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4834
4835 return b1->collisions - b2->collisions;
4836 }
4837
4838 int sort_by_digest_4_2 (const void *v1, const void *v2)
4839 {
4840 const u32 *d1 = (const u32 *) v1;
4841 const u32 *d2 = (const u32 *) v2;
4842
4843 uint n = 2;
4844
4845 while (n--)
4846 {
4847 if (d1[n] > d2[n]) return ( 1);
4848 if (d1[n] < d2[n]) return (-1);
4849 }
4850
4851 return (0);
4852 }
4853
4854 int sort_by_digest_4_4 (const void *v1, const void *v2)
4855 {
4856 const u32 *d1 = (const u32 *) v1;
4857 const u32 *d2 = (const u32 *) v2;
4858
4859 uint n = 4;
4860
4861 while (n--)
4862 {
4863 if (d1[n] > d2[n]) return ( 1);
4864 if (d1[n] < d2[n]) return (-1);
4865 }
4866
4867 return (0);
4868 }
4869
4870 int sort_by_digest_4_5 (const void *v1, const void *v2)
4871 {
4872 const u32 *d1 = (const u32 *) v1;
4873 const u32 *d2 = (const u32 *) v2;
4874
4875 uint n = 5;
4876
4877 while (n--)
4878 {
4879 if (d1[n] > d2[n]) return ( 1);
4880 if (d1[n] < d2[n]) return (-1);
4881 }
4882
4883 return (0);
4884 }
4885
4886 int sort_by_digest_4_6 (const void *v1, const void *v2)
4887 {
4888 const u32 *d1 = (const u32 *) v1;
4889 const u32 *d2 = (const u32 *) v2;
4890
4891 uint n = 6;
4892
4893 while (n--)
4894 {
4895 if (d1[n] > d2[n]) return ( 1);
4896 if (d1[n] < d2[n]) return (-1);
4897 }
4898
4899 return (0);
4900 }
4901
4902 int sort_by_digest_4_8 (const void *v1, const void *v2)
4903 {
4904 const u32 *d1 = (const u32 *) v1;
4905 const u32 *d2 = (const u32 *) v2;
4906
4907 uint n = 8;
4908
4909 while (n--)
4910 {
4911 if (d1[n] > d2[n]) return ( 1);
4912 if (d1[n] < d2[n]) return (-1);
4913 }
4914
4915 return (0);
4916 }
4917
4918 int sort_by_digest_4_16 (const void *v1, const void *v2)
4919 {
4920 const u32 *d1 = (const u32 *) v1;
4921 const u32 *d2 = (const u32 *) v2;
4922
4923 uint n = 16;
4924
4925 while (n--)
4926 {
4927 if (d1[n] > d2[n]) return ( 1);
4928 if (d1[n] < d2[n]) return (-1);
4929 }
4930
4931 return (0);
4932 }
4933
4934 int sort_by_digest_4_32 (const void *v1, const void *v2)
4935 {
4936 const u32 *d1 = (const u32 *) v1;
4937 const u32 *d2 = (const u32 *) v2;
4938
4939 uint n = 32;
4940
4941 while (n--)
4942 {
4943 if (d1[n] > d2[n]) return ( 1);
4944 if (d1[n] < d2[n]) return (-1);
4945 }
4946
4947 return (0);
4948 }
4949
4950 int sort_by_digest_4_64 (const void *v1, const void *v2)
4951 {
4952 const u32 *d1 = (const u32 *) v1;
4953 const u32 *d2 = (const u32 *) v2;
4954
4955 uint n = 64;
4956
4957 while (n--)
4958 {
4959 if (d1[n] > d2[n]) return ( 1);
4960 if (d1[n] < d2[n]) return (-1);
4961 }
4962
4963 return (0);
4964 }
4965
4966 int sort_by_digest_8_8 (const void *v1, const void *v2)
4967 {
4968 const u64 *d1 = (const u64 *) v1;
4969 const u64 *d2 = (const u64 *) v2;
4970
4971 uint n = 8;
4972
4973 while (n--)
4974 {
4975 if (d1[n] > d2[n]) return ( 1);
4976 if (d1[n] < d2[n]) return (-1);
4977 }
4978
4979 return (0);
4980 }
4981
4982 int sort_by_digest_8_16 (const void *v1, const void *v2)
4983 {
4984 const u64 *d1 = (const u64 *) v1;
4985 const u64 *d2 = (const u64 *) v2;
4986
4987 uint n = 16;
4988
4989 while (n--)
4990 {
4991 if (d1[n] > d2[n]) return ( 1);
4992 if (d1[n] < d2[n]) return (-1);
4993 }
4994
4995 return (0);
4996 }
4997
4998 int sort_by_digest_8_25 (const void *v1, const void *v2)
4999 {
5000 const u64 *d1 = (const u64 *) v1;
5001 const u64 *d2 = (const u64 *) v2;
5002
5003 uint n = 25;
5004
5005 while (n--)
5006 {
5007 if (d1[n] > d2[n]) return ( 1);
5008 if (d1[n] < d2[n]) return (-1);
5009 }
5010
5011 return (0);
5012 }
5013
5014 int sort_by_digest_p0p1 (const void *v1, const void *v2)
5015 {
5016 const u32 *d1 = (const u32 *) v1;
5017 const u32 *d2 = (const u32 *) v2;
5018
5019 const uint dgst_pos0 = data.dgst_pos0;
5020 const uint dgst_pos1 = data.dgst_pos1;
5021 const uint dgst_pos2 = data.dgst_pos2;
5022 const uint dgst_pos3 = data.dgst_pos3;
5023
5024 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
5025 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
5026 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
5027 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
5028 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
5029 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
5030 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
5031 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
5032
5033 return (0);
5034 }
5035
5036 int sort_by_tuning_db_alias (const void *v1, const void *v2)
5037 {
5038 const tuning_db_alias_t *t1 = (const tuning_db_alias_t *) v1;
5039 const tuning_db_alias_t *t2 = (const tuning_db_alias_t *) v2;
5040
5041 const int res1 = strcmp (t1->device_name, t2->device_name);
5042
5043 if (res1 != 0) return (res1);
5044
5045 return 0;
5046 }
5047
5048 int sort_by_tuning_db_entry (const void *v1, const void *v2)
5049 {
5050 const tuning_db_entry_t *t1 = (const tuning_db_entry_t *) v1;
5051 const tuning_db_entry_t *t2 = (const tuning_db_entry_t *) v2;
5052
5053 const int res1 = strcmp (t1->device_name, t2->device_name);
5054
5055 if (res1 != 0) return (res1);
5056
5057 const int res2 = t1->attack_mode
5058 - t2->attack_mode;
5059
5060 if (res2 != 0) return (res2);
5061
5062 const int res3 = t1->hash_type
5063 - t2->hash_type;
5064
5065 if (res3 != 0) return (res3);
5066
5067 return 0;
5068 }
5069
5070 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)
5071 {
5072 uint outfile_autohex = data.outfile_autohex;
5073
5074 unsigned char *rule_ptr = (unsigned char *) rule_buf;
5075
5076 FILE *debug_fp = NULL;
5077
5078 if (debug_file != NULL)
5079 {
5080 debug_fp = fopen (debug_file, "ab");
5081
5082 lock_file (debug_fp);
5083 }
5084 else
5085 {
5086 debug_fp = stderr;
5087 }
5088
5089 if (debug_fp == NULL)
5090 {
5091 log_info ("WARNING: Could not open debug-file for writing");
5092 }
5093 else
5094 {
5095 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
5096 {
5097 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
5098
5099 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
5100 }
5101
5102 fwrite (rule_ptr, rule_len, 1, debug_fp);
5103
5104 if (debug_mode == 4)
5105 {
5106 fputc (':', debug_fp);
5107
5108 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
5109 }
5110
5111 fputc ('\n', debug_fp);
5112
5113 if (debug_file != NULL) fclose (debug_fp);
5114 }
5115 }
5116
5117 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
5118 {
5119 int needs_hexify = 0;
5120
5121 if (outfile_autohex == 1)
5122 {
5123 for (uint i = 0; i < plain_len; i++)
5124 {
5125 if (plain_ptr[i] < 0x20)
5126 {
5127 needs_hexify = 1;
5128
5129 break;
5130 }
5131
5132 if (plain_ptr[i] > 0x7f)
5133 {
5134 needs_hexify = 1;
5135
5136 break;
5137 }
5138 }
5139 }
5140
5141 if (needs_hexify == 1)
5142 {
5143 fprintf (fp, "$HEX[");
5144
5145 for (uint i = 0; i < plain_len; i++)
5146 {
5147 fprintf (fp, "%02x", plain_ptr[i]);
5148 }
5149
5150 fprintf (fp, "]");
5151 }
5152 else
5153 {
5154 fwrite (plain_ptr, plain_len, 1, fp);
5155 }
5156 }
5157
5158 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)
5159 {
5160 uint outfile_format = data.outfile_format;
5161
5162 char separator = data.separator;
5163
5164 if (outfile_format & OUTFILE_FMT_HASH)
5165 {
5166 fprintf (out_fp, "%s", out_buf);
5167
5168 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5169 {
5170 fputc (separator, out_fp);
5171 }
5172 }
5173 else if (data.username)
5174 {
5175 if (username != NULL)
5176 {
5177 for (uint i = 0; i < user_len; i++)
5178 {
5179 fprintf (out_fp, "%c", username[i]);
5180 }
5181
5182 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5183 {
5184 fputc (separator, out_fp);
5185 }
5186 }
5187 }
5188
5189 if (outfile_format & OUTFILE_FMT_PLAIN)
5190 {
5191 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
5192
5193 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5194 {
5195 fputc (separator, out_fp);
5196 }
5197 }
5198
5199 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
5200 {
5201 for (uint i = 0; i < plain_len; i++)
5202 {
5203 fprintf (out_fp, "%02x", plain_ptr[i]);
5204 }
5205
5206 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
5207 {
5208 fputc (separator, out_fp);
5209 }
5210 }
5211
5212 if (outfile_format & OUTFILE_FMT_CRACKPOS)
5213 {
5214 #ifdef _WIN
5215 __mingw_fprintf (out_fp, "%llu", crackpos);
5216 #endif
5217
5218 #ifdef _POSIX
5219 #ifdef __x86_64__
5220 fprintf (out_fp, "%lu", (unsigned long) crackpos);
5221 #else
5222 fprintf (out_fp, "%llu", crackpos);
5223 #endif
5224 #endif
5225 }
5226
5227 fputc ('\n', out_fp);
5228 }
5229
5230 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)
5231 {
5232 pot_t pot_key;
5233
5234 pot_key.hash.salt = hashes_buf->salt;
5235 pot_key.hash.digest = hashes_buf->digest;
5236
5237 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5238
5239 if (pot_ptr)
5240 {
5241 log_info_nn ("");
5242
5243 input_buf[input_len] = 0;
5244
5245 // user
5246 unsigned char *username = NULL;
5247 uint user_len = 0;
5248
5249 if (data.username)
5250 {
5251 user_t *user = hashes_buf->hash_info->user;
5252
5253 if (user)
5254 {
5255 username = (unsigned char *) (user->user_name);
5256
5257 user_len = user->user_len;
5258 }
5259 }
5260
5261 // do output the line
5262 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
5263 }
5264 }
5265
5266 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
5267 #define LM_MASKED_PLAIN "[notfound]"
5268
5269 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)
5270 {
5271 // left
5272
5273 pot_t pot_left_key;
5274
5275 pot_left_key.hash.salt = hash_left->salt;
5276 pot_left_key.hash.digest = hash_left->digest;
5277
5278 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5279
5280 // right
5281
5282 uint weak_hash_found = 0;
5283
5284 pot_t pot_right_key;
5285
5286 pot_right_key.hash.salt = hash_right->salt;
5287 pot_right_key.hash.digest = hash_right->digest;
5288
5289 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5290
5291 if (pot_right_ptr == NULL)
5292 {
5293 // special case, if "weak hash"
5294
5295 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5296 {
5297 weak_hash_found = 1;
5298
5299 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5300
5301 // in theory this is not needed, but we are paranoia:
5302
5303 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5304 pot_right_ptr->plain_len = 0;
5305 }
5306 }
5307
5308 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
5309 {
5310 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
5311
5312 return;
5313 }
5314
5315 // at least one half was found:
5316
5317 log_info_nn ("");
5318
5319 input_buf[input_len] = 0;
5320
5321 // user
5322
5323 unsigned char *username = NULL;
5324 uint user_len = 0;
5325
5326 if (data.username)
5327 {
5328 user_t *user = hash_left->hash_info->user;
5329
5330 if (user)
5331 {
5332 username = (unsigned char *) (user->user_name);
5333
5334 user_len = user->user_len;
5335 }
5336 }
5337
5338 // mask the part which was not found
5339
5340 uint left_part_masked = 0;
5341 uint right_part_masked = 0;
5342
5343 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5344
5345 if (pot_left_ptr == NULL)
5346 {
5347 left_part_masked = 1;
5348
5349 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5350
5351 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5352
5353 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5354 pot_left_ptr->plain_len = mask_plain_len;
5355 }
5356
5357 if (pot_right_ptr == NULL)
5358 {
5359 right_part_masked = 1;
5360
5361 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5362
5363 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5364
5365 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5366 pot_right_ptr->plain_len = mask_plain_len;
5367 }
5368
5369 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5370
5371 pot_t pot_ptr;
5372
5373 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5374
5375 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5376
5377 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5378
5379 // do output the line
5380
5381 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5382
5383 if (weak_hash_found == 1) myfree (pot_right_ptr);
5384
5385 if (left_part_masked == 1) myfree (pot_left_ptr);
5386 if (right_part_masked == 1) myfree (pot_right_ptr);
5387 }
5388
5389 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)
5390 {
5391 pot_t pot_key;
5392
5393 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5394
5395 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5396
5397 if (pot_ptr == NULL)
5398 {
5399 log_info_nn ("");
5400
5401 input_buf[input_len] = 0;
5402
5403 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5404 }
5405 }
5406
5407 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)
5408 {
5409 // left
5410
5411 pot_t pot_left_key;
5412
5413 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5414
5415 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5416
5417 // right
5418
5419 pot_t pot_right_key;
5420
5421 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5422
5423 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5424
5425 uint weak_hash_found = 0;
5426
5427 if (pot_right_ptr == NULL)
5428 {
5429 // special case, if "weak hash"
5430
5431 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5432 {
5433 weak_hash_found = 1;
5434
5435 // we just need that pot_right_ptr is not a NULL pointer
5436
5437 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5438 }
5439 }
5440
5441 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5442 {
5443 if (weak_hash_found == 1) myfree (pot_right_ptr);
5444
5445 return;
5446 }
5447
5448 // ... at least one part was not cracked
5449
5450 log_info_nn ("");
5451
5452 input_buf[input_len] = 0;
5453
5454 // only show the hash part which is still not cracked
5455
5456 uint user_len = input_len - 32;
5457
5458 char *hash_output = (char *) mymalloc (33);
5459
5460 memcpy (hash_output, input_buf, input_len);
5461
5462 if (pot_left_ptr != NULL)
5463 {
5464 // only show right part (because left part was already found)
5465
5466 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5467
5468 hash_output[user_len + 16] = 0;
5469 }
5470
5471 if (pot_right_ptr != NULL)
5472 {
5473 // only show left part (because right part was already found)
5474
5475 memcpy (hash_output + user_len, input_buf + user_len, 16);
5476
5477 hash_output[user_len + 16] = 0;
5478 }
5479
5480 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5481
5482 myfree (hash_output);
5483
5484 if (weak_hash_found == 1) myfree (pot_right_ptr);
5485 }
5486
5487 uint setup_opencl_platforms_filter (char *opencl_platforms)
5488 {
5489 uint opencl_platforms_filter = 0;
5490
5491 if (opencl_platforms)
5492 {
5493 char *platforms = strdup (opencl_platforms);
5494
5495 char *next = strtok (platforms, ",");
5496
5497 do
5498 {
5499 int platform = atoi (next);
5500
5501 if (platform < 1 || platform > 32)
5502 {
5503 log_error ("ERROR: Invalid OpenCL platform %u specified", platform);
5504
5505 exit (-1);
5506 }
5507
5508 opencl_platforms_filter |= 1 << (platform - 1);
5509
5510 } while ((next = strtok (NULL, ",")) != NULL);
5511
5512 free (platforms);
5513 }
5514 else
5515 {
5516 opencl_platforms_filter = -1;
5517 }
5518
5519 return opencl_platforms_filter;
5520 }
5521
5522 u32 setup_devices_filter (char *opencl_devices)
5523 {
5524 u32 devices_filter = 0;
5525
5526 if (opencl_devices)
5527 {
5528 char *devices = strdup (opencl_devices);
5529
5530 char *next = strtok (devices, ",");
5531
5532 do
5533 {
5534 int device_id = atoi (next);
5535
5536 if (device_id < 1 || device_id > 32)
5537 {
5538 log_error ("ERROR: Invalid device_id %u specified", device_id);
5539
5540 exit (-1);
5541 }
5542
5543 devices_filter |= 1 << (device_id - 1);
5544
5545 } while ((next = strtok (NULL, ",")) != NULL);
5546
5547 free (devices);
5548 }
5549 else
5550 {
5551 devices_filter = -1;
5552 }
5553
5554 return devices_filter;
5555 }
5556
5557 cl_device_type setup_device_types_filter (char *opencl_device_types)
5558 {
5559 cl_device_type device_types_filter = 0;
5560
5561 if (opencl_device_types)
5562 {
5563 char *device_types = strdup (opencl_device_types);
5564
5565 char *next = strtok (device_types, ",");
5566
5567 do
5568 {
5569 int device_type = atoi (next);
5570
5571 if (device_type < 1 || device_type > 3)
5572 {
5573 log_error ("ERROR: Invalid device_type %u specified", device_type);
5574
5575 exit (-1);
5576 }
5577
5578 device_types_filter |= 1 << device_type;
5579
5580 } while ((next = strtok (NULL, ",")) != NULL);
5581
5582 free (device_types);
5583 }
5584 else
5585 {
5586 // Do not use CPU by default, this often reduces GPU performance because
5587 // the CPU is too busy to handle GPU synchronization
5588
5589 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5590 }
5591
5592 return device_types_filter;
5593 }
5594
5595 u32 get_random_num (const u32 min, const u32 max)
5596 {
5597 if (min == max) return (min);
5598
5599 return ((rand () % (max - min)) + min);
5600 }
5601
5602 u32 mydivc32 (const u32 dividend, const u32 divisor)
5603 {
5604 u32 quotient = dividend / divisor;
5605
5606 if (dividend % divisor) quotient++;
5607
5608 return quotient;
5609 }
5610
5611 u64 mydivc64 (const u64 dividend, const u64 divisor)
5612 {
5613 u64 quotient = dividend / divisor;
5614
5615 if (dividend % divisor) quotient++;
5616
5617 return quotient;
5618 }
5619
5620 void format_timer_display (struct tm *tm, char *buf, size_t len)
5621 {
5622 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5623 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5624
5625 if (tm->tm_year - 70)
5626 {
5627 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5628 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5629
5630 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5631 }
5632 else if (tm->tm_yday)
5633 {
5634 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5635 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5636
5637 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5638 }
5639 else if (tm->tm_hour)
5640 {
5641 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5642 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5643
5644 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5645 }
5646 else if (tm->tm_min)
5647 {
5648 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5649 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5650
5651 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5652 }
5653 else
5654 {
5655 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5656
5657 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5658 }
5659 }
5660
5661 void format_speed_display (float val, char *buf, size_t len)
5662 {
5663 if (val <= 0)
5664 {
5665 buf[0] = '0';
5666 buf[1] = ' ';
5667 buf[2] = 0;
5668
5669 return;
5670 }
5671
5672 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5673
5674 uint level = 0;
5675
5676 while (val > 99999)
5677 {
5678 val /= 1000;
5679
5680 level++;
5681 }
5682
5683 /* generate output */
5684
5685 if (level == 0)
5686 {
5687 snprintf (buf, len - 1, "%.0f ", val);
5688 }
5689 else
5690 {
5691 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5692 }
5693 }
5694
5695 void lowercase (u8 *buf, int len)
5696 {
5697 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5698 }
5699
5700 void uppercase (u8 *buf, int len)
5701 {
5702 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5703 }
5704
5705 int fgetl (FILE *fp, char *line_buf)
5706 {
5707 int line_len = 0;
5708
5709 while (!feof (fp))
5710 {
5711 const int c = fgetc (fp);
5712
5713 if (c == EOF) break;
5714
5715 line_buf[line_len] = (char) c;
5716
5717 line_len++;
5718
5719 if (line_len == HCBUFSIZ) line_len--;
5720
5721 if (c == '\n') break;
5722 }
5723
5724 if (line_len == 0) return 0;
5725
5726 if (line_buf[line_len - 1] == '\n')
5727 {
5728 line_len--;
5729
5730 line_buf[line_len] = 0;
5731 }
5732
5733 if (line_len == 0) return 0;
5734
5735 if (line_buf[line_len - 1] == '\r')
5736 {
5737 line_len--;
5738
5739 line_buf[line_len] = 0;
5740 }
5741
5742 return (line_len);
5743 }
5744
5745 int in_superchop (char *buf)
5746 {
5747 int len = strlen (buf);
5748
5749 while (len)
5750 {
5751 if (buf[len - 1] == '\n')
5752 {
5753 len--;
5754
5755 continue;
5756 }
5757
5758 if (buf[len - 1] == '\r')
5759 {
5760 len--;
5761
5762 continue;
5763 }
5764
5765 break;
5766 }
5767
5768 buf[len] = 0;
5769
5770 return len;
5771 }
5772
5773 char **scan_directory (const char *path)
5774 {
5775 char *tmp_path = mystrdup (path);
5776
5777 size_t tmp_path_len = strlen (tmp_path);
5778
5779 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5780 {
5781 tmp_path[tmp_path_len - 1] = 0;
5782
5783 tmp_path_len = strlen (tmp_path);
5784 }
5785
5786 char **files = NULL;
5787
5788 int num_files = 0;
5789
5790 DIR *d = NULL;
5791
5792 if ((d = opendir (tmp_path)) != NULL)
5793 {
5794 #ifdef DARWIN
5795 struct dirent e;
5796
5797 for (;;) {
5798 memset (&e, 0, sizeof (e));
5799 struct dirent *de = NULL;
5800
5801 if (readdir_r (d, &e, &de) != 0)
5802 {
5803 log_error ("ERROR: readdir_r() failed");
5804
5805 break;
5806 }
5807
5808 if (de == NULL) break;
5809 #else
5810 struct dirent *de;
5811
5812 while ((de = readdir (d)) != NULL)
5813 {
5814 #endif
5815 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5816
5817 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5818
5819 char *path_file = (char *) mymalloc (path_size + 1);
5820
5821 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5822
5823 path_file[path_size] = 0;
5824
5825 DIR *d_test;
5826
5827 if ((d_test = opendir (path_file)) != NULL)
5828 {
5829 closedir (d_test);
5830
5831 myfree (path_file);
5832 }
5833 else
5834 {
5835 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5836
5837 num_files++;
5838
5839 files[num_files - 1] = path_file;
5840 }
5841 }
5842
5843 closedir (d);
5844 }
5845 else if (errno == ENOTDIR)
5846 {
5847 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5848
5849 num_files++;
5850
5851 files[num_files - 1] = mystrdup (path);
5852 }
5853
5854 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5855
5856 num_files++;
5857
5858 files[num_files - 1] = NULL;
5859
5860 myfree (tmp_path);
5861
5862 return (files);
5863 }
5864
5865 int count_dictionaries (char **dictionary_files)
5866 {
5867 if (dictionary_files == NULL) return 0;
5868
5869 int cnt = 0;
5870
5871 for (int d = 0; dictionary_files[d] != NULL; d++)
5872 {
5873 cnt++;
5874 }
5875
5876 return (cnt);
5877 }
5878
5879 char *stroptitype (const uint opti_type)
5880 {
5881 switch (opti_type)
5882 {
5883 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5884 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5885 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5886 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5887 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5888 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5889 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5890 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5891 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5892 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5893 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5894 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5895 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5896 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5897 case OPTI_TYPE_SLOW_HASH_SIMD: return ((char *) OPTI_STR_SLOW_HASH_SIMD); break;
5898 case OPTI_TYPE_USES_BITS_8: return ((char *) OPTI_STR_USES_BITS_8); break;
5899 case OPTI_TYPE_USES_BITS_16: return ((char *) OPTI_STR_USES_BITS_16); break;
5900 case OPTI_TYPE_USES_BITS_32: return ((char *) OPTI_STR_USES_BITS_32); break;
5901 case OPTI_TYPE_USES_BITS_64: return ((char *) OPTI_STR_USES_BITS_64); break;
5902 }
5903
5904 return (NULL);
5905 }
5906
5907 char *strparser (const uint parser_status)
5908 {
5909 switch (parser_status)
5910 {
5911 case PARSER_OK: return ((char *) PA_000); break;
5912 case PARSER_COMMENT: return ((char *) PA_001); break;
5913 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5914 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5915 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5916 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5917 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5918 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5919 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5920 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5921 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5922 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5923 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5924 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5925 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5926 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5927 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5928 }
5929
5930 return ((char *) PA_255);
5931 }
5932
5933 char *strhashtype (const uint hash_mode)
5934 {
5935 switch (hash_mode)
5936 {
5937 case 0: return ((char *) HT_00000); break;
5938 case 10: return ((char *) HT_00010); break;
5939 case 11: return ((char *) HT_00011); break;
5940 case 12: return ((char *) HT_00012); break;
5941 case 20: return ((char *) HT_00020); break;
5942 case 21: return ((char *) HT_00021); break;
5943 case 22: return ((char *) HT_00022); break;
5944 case 23: return ((char *) HT_00023); break;
5945 case 30: return ((char *) HT_00030); break;
5946 case 40: return ((char *) HT_00040); break;
5947 case 50: return ((char *) HT_00050); break;
5948 case 60: return ((char *) HT_00060); break;
5949 case 100: return ((char *) HT_00100); break;
5950 case 101: return ((char *) HT_00101); break;
5951 case 110: return ((char *) HT_00110); break;
5952 case 111: return ((char *) HT_00111); break;
5953 case 112: return ((char *) HT_00112); break;
5954 case 120: return ((char *) HT_00120); break;
5955 case 121: return ((char *) HT_00121); break;
5956 case 122: return ((char *) HT_00122); break;
5957 case 124: return ((char *) HT_00124); break;
5958 case 125: return ((char *) HT_00125); break;
5959 case 130: return ((char *) HT_00130); break;
5960 case 131: return ((char *) HT_00131); break;
5961 case 132: return ((char *) HT_00132); break;
5962 case 133: return ((char *) HT_00133); break;
5963 case 140: return ((char *) HT_00140); break;
5964 case 141: return ((char *) HT_00141); break;
5965 case 150: return ((char *) HT_00150); break;
5966 case 160: return ((char *) HT_00160); break;
5967 case 200: return ((char *) HT_00200); break;
5968 case 300: return ((char *) HT_00300); break;
5969 case 400: return ((char *) HT_00400); break;
5970 case 500: return ((char *) HT_00500); break;
5971 case 501: return ((char *) HT_00501); break;
5972 case 900: return ((char *) HT_00900); break;
5973 case 910: return ((char *) HT_00910); break;
5974 case 1000: return ((char *) HT_01000); break;
5975 case 1100: return ((char *) HT_01100); break;
5976 case 1400: return ((char *) HT_01400); break;
5977 case 1410: return ((char *) HT_01410); break;
5978 case 1420: return ((char *) HT_01420); break;
5979 case 1421: return ((char *) HT_01421); break;
5980 case 1430: return ((char *) HT_01430); break;
5981 case 1440: return ((char *) HT_01440); break;
5982 case 1441: return ((char *) HT_01441); break;
5983 case 1450: return ((char *) HT_01450); break;
5984 case 1460: return ((char *) HT_01460); break;
5985 case 1500: return ((char *) HT_01500); break;
5986 case 1600: return ((char *) HT_01600); break;
5987 case 1700: return ((char *) HT_01700); break;
5988 case 1710: return ((char *) HT_01710); break;
5989 case 1711: return ((char *) HT_01711); break;
5990 case 1720: return ((char *) HT_01720); break;
5991 case 1722: return ((char *) HT_01722); break;
5992 case 1730: return ((char *) HT_01730); break;
5993 case 1731: return ((char *) HT_01731); break;
5994 case 1740: return ((char *) HT_01740); break;
5995 case 1750: return ((char *) HT_01750); break;
5996 case 1760: return ((char *) HT_01760); break;
5997 case 1800: return ((char *) HT_01800); break;
5998 case 2100: return ((char *) HT_02100); break;
5999 case 2400: return ((char *) HT_02400); break;
6000 case 2410: return ((char *) HT_02410); break;
6001 case 2500: return ((char *) HT_02500); break;
6002 case 2600: return ((char *) HT_02600); break;
6003 case 2611: return ((char *) HT_02611); break;
6004 case 2612: return ((char *) HT_02612); break;
6005 case 2711: return ((char *) HT_02711); break;
6006 case 2811: return ((char *) HT_02811); break;
6007 case 3000: return ((char *) HT_03000); break;
6008 case 3100: return ((char *) HT_03100); break;
6009 case 3200: return ((char *) HT_03200); break;
6010 case 3710: return ((char *) HT_03710); break;
6011 case 3711: return ((char *) HT_03711); break;
6012 case 3800: return ((char *) HT_03800); break;
6013 case 4300: return ((char *) HT_04300); break;
6014 case 4400: return ((char *) HT_04400); break;
6015 case 4500: return ((char *) HT_04500); break;
6016 case 4700: return ((char *) HT_04700); break;
6017 case 4800: return ((char *) HT_04800); break;
6018 case 4900: return ((char *) HT_04900); break;
6019 case 5000: return ((char *) HT_05000); break;
6020 case 5100: return ((char *) HT_05100); break;
6021 case 5200: return ((char *) HT_05200); break;
6022 case 5300: return ((char *) HT_05300); break;
6023 case 5400: return ((char *) HT_05400); break;
6024 case 5500: return ((char *) HT_05500); break;
6025 case 5600: return ((char *) HT_05600); break;
6026 case 5700: return ((char *) HT_05700); break;
6027 case 5800: return ((char *) HT_05800); break;
6028 case 6000: return ((char *) HT_06000); break;
6029 case 6100: return ((char *) HT_06100); break;
6030 case 6211: return ((char *) HT_06211); break;
6031 case 6212: return ((char *) HT_06212); break;
6032 case 6213: return ((char *) HT_06213); break;
6033 case 6221: return ((char *) HT_06221); break;
6034 case 6222: return ((char *) HT_06222); break;
6035 case 6223: return ((char *) HT_06223); break;
6036 case 6231: return ((char *) HT_06231); break;
6037 case 6232: return ((char *) HT_06232); break;
6038 case 6233: return ((char *) HT_06233); break;
6039 case 6241: return ((char *) HT_06241); break;
6040 case 6242: return ((char *) HT_06242); break;
6041 case 6243: return ((char *) HT_06243); break;
6042 case 6300: return ((char *) HT_06300); break;
6043 case 6400: return ((char *) HT_06400); break;
6044 case 6500: return ((char *) HT_06500); break;
6045 case 6600: return ((char *) HT_06600); break;
6046 case 6700: return ((char *) HT_06700); break;
6047 case 6800: return ((char *) HT_06800); break;
6048 case 6900: return ((char *) HT_06900); break;
6049 case 7100: return ((char *) HT_07100); break;
6050 case 7200: return ((char *) HT_07200); break;
6051 case 7300: return ((char *) HT_07300); break;
6052 case 7400: return ((char *) HT_07400); break;
6053 case 7500: return ((char *) HT_07500); break;
6054 case 7600: return ((char *) HT_07600); break;
6055 case 7700: return ((char *) HT_07700); break;
6056 case 7800: return ((char *) HT_07800); break;
6057 case 7900: return ((char *) HT_07900); break;
6058 case 8000: return ((char *) HT_08000); break;
6059 case 8100: return ((char *) HT_08100); break;
6060 case 8200: return ((char *) HT_08200); break;
6061 case 8300: return ((char *) HT_08300); break;
6062 case 8400: return ((char *) HT_08400); break;
6063 case 8500: return ((char *) HT_08500); break;
6064 case 8600: return ((char *) HT_08600); break;
6065 case 8700: return ((char *) HT_08700); break;
6066 case 8800: return ((char *) HT_08800); break;
6067 case 8900: return ((char *) HT_08900); break;
6068 case 9000: return ((char *) HT_09000); break;
6069 case 9100: return ((char *) HT_09100); break;
6070 case 9200: return ((char *) HT_09200); break;
6071 case 9300: return ((char *) HT_09300); break;
6072 case 9400: return ((char *) HT_09400); break;
6073 case 9500: return ((char *) HT_09500); break;
6074 case 9600: return ((char *) HT_09600); break;
6075 case 9700: return ((char *) HT_09700); break;
6076 case 9710: return ((char *) HT_09710); break;
6077 case 9720: return ((char *) HT_09720); break;
6078 case 9800: return ((char *) HT_09800); break;
6079 case 9810: return ((char *) HT_09810); break;
6080 case 9820: return ((char *) HT_09820); break;
6081 case 9900: return ((char *) HT_09900); break;
6082 case 10000: return ((char *) HT_10000); break;
6083 case 10100: return ((char *) HT_10100); break;
6084 case 10200: return ((char *) HT_10200); break;
6085 case 10300: return ((char *) HT_10300); break;
6086 case 10400: return ((char *) HT_10400); break;
6087 case 10410: return ((char *) HT_10410); break;
6088 case 10420: return ((char *) HT_10420); break;
6089 case 10500: return ((char *) HT_10500); break;
6090 case 10600: return ((char *) HT_10600); break;
6091 case 10700: return ((char *) HT_10700); break;
6092 case 10800: return ((char *) HT_10800); break;
6093 case 10900: return ((char *) HT_10900); break;
6094 case 11000: return ((char *) HT_11000); break;
6095 case 11100: return ((char *) HT_11100); break;
6096 case 11200: return ((char *) HT_11200); break;
6097 case 11300: return ((char *) HT_11300); break;
6098 case 11400: return ((char *) HT_11400); break;
6099 case 11500: return ((char *) HT_11500); break;
6100 case 11600: return ((char *) HT_11600); break;
6101 case 11700: return ((char *) HT_11700); break;
6102 case 11800: return ((char *) HT_11800); break;
6103 case 11900: return ((char *) HT_11900); break;
6104 case 12000: return ((char *) HT_12000); break;
6105 case 12100: return ((char *) HT_12100); break;
6106 case 12200: return ((char *) HT_12200); break;
6107 case 12300: return ((char *) HT_12300); break;
6108 case 12400: return ((char *) HT_12400); break;
6109 case 12500: return ((char *) HT_12500); break;
6110 case 12600: return ((char *) HT_12600); break;
6111 case 12700: return ((char *) HT_12700); break;
6112 case 12800: return ((char *) HT_12800); break;
6113 case 12900: return ((char *) HT_12900); break;
6114 case 13000: return ((char *) HT_13000); break;
6115 case 13100: return ((char *) HT_13100); break;
6116 case 13200: return ((char *) HT_13200); break;
6117 case 13300: return ((char *) HT_13300); break;
6118 case 13400: return ((char *) HT_13400); break;
6119 case 13500: return ((char *) HT_13500); break;
6120 case 13600: return ((char *) HT_13600); break;
6121 case 13711: return ((char *) HT_13711); break;
6122 case 13712: return ((char *) HT_13712); break;
6123 case 13713: return ((char *) HT_13713); break;
6124 case 13721: return ((char *) HT_13721); break;
6125 case 13722: return ((char *) HT_13722); break;
6126 case 13723: return ((char *) HT_13723); break;
6127 case 13731: return ((char *) HT_13731); break;
6128 case 13732: return ((char *) HT_13732); break;
6129 case 13733: return ((char *) HT_13733); break;
6130 case 13741: return ((char *) HT_13741); break;
6131 case 13742: return ((char *) HT_13742); break;
6132 case 13743: return ((char *) HT_13743); break;
6133 case 13751: return ((char *) HT_13751); break;
6134 case 13752: return ((char *) HT_13752); break;
6135 case 13753: return ((char *) HT_13753); break;
6136 case 13761: return ((char *) HT_13761); break;
6137 case 13762: return ((char *) HT_13762); break;
6138 case 13763: return ((char *) HT_13763); break;
6139 case 13800: return ((char *) HT_13800); break;
6140 }
6141
6142 return ((char *) "Unknown");
6143 }
6144
6145 char *strstatus (const uint devices_status)
6146 {
6147 switch (devices_status)
6148 {
6149 case STATUS_INIT: return ((char *) ST_0000); break;
6150 case STATUS_STARTING: return ((char *) ST_0001); break;
6151 case STATUS_RUNNING: return ((char *) ST_0002); break;
6152 case STATUS_PAUSED: return ((char *) ST_0003); break;
6153 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
6154 case STATUS_CRACKED: return ((char *) ST_0005); break;
6155 case STATUS_ABORTED: return ((char *) ST_0006); break;
6156 case STATUS_QUIT: return ((char *) ST_0007); break;
6157 case STATUS_BYPASS: return ((char *) ST_0008); break;
6158 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
6159 case STATUS_AUTOTUNE: return ((char *) ST_0010); break;
6160 }
6161
6162 return ((char *) "Unknown");
6163 }
6164
6165 void ascii_digest (char *out_buf, uint salt_pos, uint digest_pos)
6166 {
6167 uint hash_type = data.hash_type;
6168 uint hash_mode = data.hash_mode;
6169 uint salt_type = data.salt_type;
6170 uint opts_type = data.opts_type;
6171 uint opti_type = data.opti_type;
6172 uint dgst_size = data.dgst_size;
6173
6174 char *hashfile = data.hashfile;
6175
6176 uint len = 4096;
6177
6178 uint digest_buf[64] = { 0 };
6179
6180 u64 *digest_buf64 = (u64 *) digest_buf;
6181
6182 char *digests_buf_ptr = (char *) data.digests_buf;
6183
6184 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
6185
6186 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6187 {
6188 uint tt;
6189
6190 switch (hash_type)
6191 {
6192 case HASH_TYPE_DESCRYPT:
6193 FP (digest_buf[1], digest_buf[0], tt);
6194 break;
6195
6196 case HASH_TYPE_DESRACF:
6197 digest_buf[0] = rotl32 (digest_buf[0], 29);
6198 digest_buf[1] = rotl32 (digest_buf[1], 29);
6199
6200 FP (digest_buf[1], digest_buf[0], tt);
6201 break;
6202
6203 case HASH_TYPE_LM:
6204 FP (digest_buf[1], digest_buf[0], tt);
6205 break;
6206
6207 case HASH_TYPE_NETNTLM:
6208 digest_buf[0] = rotl32 (digest_buf[0], 29);
6209 digest_buf[1] = rotl32 (digest_buf[1], 29);
6210 digest_buf[2] = rotl32 (digest_buf[2], 29);
6211 digest_buf[3] = rotl32 (digest_buf[3], 29);
6212
6213 FP (digest_buf[1], digest_buf[0], tt);
6214 FP (digest_buf[3], digest_buf[2], tt);
6215 break;
6216
6217 case HASH_TYPE_BSDICRYPT:
6218 digest_buf[0] = rotl32 (digest_buf[0], 31);
6219 digest_buf[1] = rotl32 (digest_buf[1], 31);
6220
6221 FP (digest_buf[1], digest_buf[0], tt);
6222 break;
6223 }
6224 }
6225
6226 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
6227 {
6228 switch (hash_type)
6229 {
6230 case HASH_TYPE_MD4:
6231 digest_buf[0] += MD4M_A;
6232 digest_buf[1] += MD4M_B;
6233 digest_buf[2] += MD4M_C;
6234 digest_buf[3] += MD4M_D;
6235 break;
6236
6237 case HASH_TYPE_MD5:
6238 digest_buf[0] += MD5M_A;
6239 digest_buf[1] += MD5M_B;
6240 digest_buf[2] += MD5M_C;
6241 digest_buf[3] += MD5M_D;
6242 break;
6243
6244 case HASH_TYPE_SHA1:
6245 digest_buf[0] += SHA1M_A;
6246 digest_buf[1] += SHA1M_B;
6247 digest_buf[2] += SHA1M_C;
6248 digest_buf[3] += SHA1M_D;
6249 digest_buf[4] += SHA1M_E;
6250 break;
6251
6252 case HASH_TYPE_SHA256:
6253 digest_buf[0] += SHA256M_A;
6254 digest_buf[1] += SHA256M_B;
6255 digest_buf[2] += SHA256M_C;
6256 digest_buf[3] += SHA256M_D;
6257 digest_buf[4] += SHA256M_E;
6258 digest_buf[5] += SHA256M_F;
6259 digest_buf[6] += SHA256M_G;
6260 digest_buf[7] += SHA256M_H;
6261 break;
6262
6263 case HASH_TYPE_SHA384:
6264 digest_buf64[0] += SHA384M_A;
6265 digest_buf64[1] += SHA384M_B;
6266 digest_buf64[2] += SHA384M_C;
6267 digest_buf64[3] += SHA384M_D;
6268 digest_buf64[4] += SHA384M_E;
6269 digest_buf64[5] += SHA384M_F;
6270 digest_buf64[6] += 0;
6271 digest_buf64[7] += 0;
6272 break;
6273
6274 case HASH_TYPE_SHA512:
6275 digest_buf64[0] += SHA512M_A;
6276 digest_buf64[1] += SHA512M_B;
6277 digest_buf64[2] += SHA512M_C;
6278 digest_buf64[3] += SHA512M_D;
6279 digest_buf64[4] += SHA512M_E;
6280 digest_buf64[5] += SHA512M_F;
6281 digest_buf64[6] += SHA512M_G;
6282 digest_buf64[7] += SHA512M_H;
6283 break;
6284 }
6285 }
6286
6287 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
6288 {
6289 if (dgst_size == DGST_SIZE_4_2)
6290 {
6291 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6292 }
6293 else if (dgst_size == DGST_SIZE_4_4)
6294 {
6295 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6296 }
6297 else if (dgst_size == DGST_SIZE_4_5)
6298 {
6299 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6300 }
6301 else if (dgst_size == DGST_SIZE_4_6)
6302 {
6303 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6304 }
6305 else if (dgst_size == DGST_SIZE_4_8)
6306 {
6307 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6308 }
6309 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
6310 {
6311 if (hash_type == HASH_TYPE_WHIRLPOOL)
6312 {
6313 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6314 }
6315 else if (hash_type == HASH_TYPE_SHA384)
6316 {
6317 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6318 }
6319 else if (hash_type == HASH_TYPE_SHA512)
6320 {
6321 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6322 }
6323 else if (hash_type == HASH_TYPE_GOST)
6324 {
6325 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6326 }
6327 }
6328 else if (dgst_size == DGST_SIZE_4_64)
6329 {
6330 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6331 }
6332 else if (dgst_size == DGST_SIZE_8_25)
6333 {
6334 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6335 }
6336 }
6337
6338 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
6339 | (data.salt_type == SALT_TYPE_EXTERN)
6340 | (data.salt_type == SALT_TYPE_EMBEDDED));
6341
6342 salt_t salt;
6343
6344 if (isSalted)
6345 {
6346 memset (&salt, 0, sizeof (salt_t));
6347
6348 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
6349
6350 char *ptr = (char *) salt.salt_buf;
6351
6352 uint len = salt.salt_len;
6353
6354 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6355 {
6356 uint tt;
6357
6358 switch (hash_type)
6359 {
6360 case HASH_TYPE_NETNTLM:
6361
6362 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6363 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6364
6365 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6366
6367 break;
6368 }
6369 }
6370
6371 if (opts_type & OPTS_TYPE_ST_UNICODE)
6372 {
6373 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6374 {
6375 ptr[i] = ptr[j];
6376 }
6377
6378 len = len / 2;
6379 }
6380
6381 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6382 {
6383 uint max = salt.salt_len / 4;
6384
6385 if (len % 4) max++;
6386
6387 for (uint i = 0; i < max; i++)
6388 {
6389 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6390 }
6391 }
6392
6393 if (opts_type & OPTS_TYPE_ST_HEX)
6394 {
6395 char tmp[64] = { 0 };
6396
6397 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6398 {
6399 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6400 }
6401
6402 len = len * 2;
6403
6404 memcpy (ptr, tmp, len);
6405 }
6406
6407 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6408
6409 memset (ptr + len, 0, memset_size);
6410
6411 salt.salt_len = len;
6412 }
6413
6414 //
6415 // some modes require special encoding
6416 //
6417
6418 uint out_buf_plain[256] = { 0 };
6419 uint out_buf_salt[256] = { 0 };
6420
6421 char tmp_buf[1024] = { 0 };
6422
6423 char *ptr_plain = (char *) out_buf_plain;
6424 char *ptr_salt = (char *) out_buf_salt;
6425
6426 if (hash_mode == 22)
6427 {
6428 char username[30] = { 0 };
6429
6430 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6431
6432 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6433
6434 u16 *ptr = (u16 *) digest_buf;
6435
6436 tmp_buf[ 0] = sig[0];
6437 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6438 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6439 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6440 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6441 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6442 tmp_buf[ 6] = sig[1];
6443 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6444 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6445 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6446 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6447 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6448 tmp_buf[12] = sig[2];
6449 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6450 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6451 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6452 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6453 tmp_buf[17] = sig[3];
6454 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6455 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6456 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6457 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6458 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6459 tmp_buf[23] = sig[4];
6460 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6461 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6462 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6463 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6464 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6465 tmp_buf[29] = sig[5];
6466
6467 snprintf (out_buf, len-1, "%s:%s",
6468 tmp_buf,
6469 username);
6470 }
6471 else if (hash_mode == 23)
6472 {
6473 // do not show the skyper part in output
6474
6475 char *salt_buf_ptr = (char *) salt.salt_buf;
6476
6477 salt_buf_ptr[salt.salt_len - 8] = 0;
6478
6479 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6480 digest_buf[0],
6481 digest_buf[1],
6482 digest_buf[2],
6483 digest_buf[3],
6484 salt_buf_ptr);
6485 }
6486 else if (hash_mode == 101)
6487 {
6488 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6489
6490 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6491 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6492 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6493 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6494 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6495
6496 memcpy (tmp_buf, digest_buf, 20);
6497
6498 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6499
6500 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6501 }
6502 else if (hash_mode == 111)
6503 {
6504 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6505
6506 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6507 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6508 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6509 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6510 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6511
6512 memcpy (tmp_buf, digest_buf, 20);
6513 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6514
6515 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6516
6517 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6518 }
6519 else if ((hash_mode == 122) || (hash_mode == 125))
6520 {
6521 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6522 (char *) salt.salt_buf,
6523 digest_buf[0],
6524 digest_buf[1],
6525 digest_buf[2],
6526 digest_buf[3],
6527 digest_buf[4]);
6528 }
6529 else if (hash_mode == 124)
6530 {
6531 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6532 (char *) salt.salt_buf,
6533 digest_buf[0],
6534 digest_buf[1],
6535 digest_buf[2],
6536 digest_buf[3],
6537 digest_buf[4]);
6538 }
6539 else if (hash_mode == 131)
6540 {
6541 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6542 (char *) salt.salt_buf,
6543 0, 0, 0, 0, 0,
6544 digest_buf[0],
6545 digest_buf[1],
6546 digest_buf[2],
6547 digest_buf[3],
6548 digest_buf[4]);
6549 }
6550 else if (hash_mode == 132)
6551 {
6552 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6553 (char *) salt.salt_buf,
6554 digest_buf[0],
6555 digest_buf[1],
6556 digest_buf[2],
6557 digest_buf[3],
6558 digest_buf[4]);
6559 }
6560 else if (hash_mode == 133)
6561 {
6562 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6563
6564 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6565 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6566 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6567 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6568 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6569
6570 memcpy (tmp_buf, digest_buf, 20);
6571
6572 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6573
6574 snprintf (out_buf, len-1, "%s", ptr_plain);
6575 }
6576 else if (hash_mode == 141)
6577 {
6578 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6579
6580 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6581
6582 memset (tmp_buf, 0, sizeof (tmp_buf));
6583
6584 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6585
6586 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6587 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6588 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6589 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6590 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6591
6592 memcpy (tmp_buf, digest_buf, 20);
6593
6594 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6595
6596 ptr_plain[27] = 0;
6597
6598 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6599 }
6600 else if (hash_mode == 400)
6601 {
6602 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6603
6604 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6605 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6606 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6607 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6608
6609 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6610
6611 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6612 }
6613 else if (hash_mode == 500)
6614 {
6615 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6616
6617 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6618 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6619 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6620 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6621
6622 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6623
6624 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6625 {
6626 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6627 }
6628 else
6629 {
6630 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6631 }
6632 }
6633 else if (hash_mode == 501)
6634 {
6635 uint digest_idx = salt.digests_offset + digest_pos;
6636
6637 hashinfo_t **hashinfo_ptr = data.hash_info;
6638 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6639
6640 snprintf (out_buf, len-1, "%s", hash_buf);
6641 }
6642 else if (hash_mode == 1421)
6643 {
6644 u8 *salt_ptr = (u8 *) salt.salt_buf;
6645
6646 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6647 salt_ptr[0],
6648 salt_ptr[1],
6649 salt_ptr[2],
6650 salt_ptr[3],
6651 salt_ptr[4],
6652 salt_ptr[5],
6653 digest_buf[0],
6654 digest_buf[1],
6655 digest_buf[2],
6656 digest_buf[3],
6657 digest_buf[4],
6658 digest_buf[5],
6659 digest_buf[6],
6660 digest_buf[7]);
6661 }
6662 else if (hash_mode == 1441)
6663 {
6664 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6665
6666 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6667
6668 memset (tmp_buf, 0, sizeof (tmp_buf));
6669
6670 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6671
6672 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6673 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6674 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6675 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6676 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6677 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6678 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6679 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6680
6681 memcpy (tmp_buf, digest_buf, 32);
6682
6683 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6684
6685 ptr_plain[43] = 0;
6686
6687 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6688 }
6689 else if (hash_mode == 1500)
6690 {
6691 out_buf[0] = salt.salt_sign[0] & 0xff;
6692 out_buf[1] = salt.salt_sign[1] & 0xff;
6693 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6694 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6695 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6696
6697 memset (tmp_buf, 0, sizeof (tmp_buf));
6698
6699 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6700
6701 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6702 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6703
6704 memcpy (tmp_buf, digest_buf, 8);
6705
6706 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6707
6708 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6709
6710 out_buf[13] = 0;
6711 }
6712 else if (hash_mode == 1600)
6713 {
6714 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6715
6716 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6717 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6718 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6719 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6720
6721 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6722
6723 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6724 {
6725 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6726 }
6727 else
6728 {
6729 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6730 }
6731 }
6732 else if (hash_mode == 1711)
6733 {
6734 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6735
6736 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6737 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6738 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6739 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6740 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6741 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6742 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6743 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6744
6745 memcpy (tmp_buf, digest_buf, 64);
6746 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6747
6748 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6749
6750 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6751 }
6752 else if (hash_mode == 1722)
6753 {
6754 uint *ptr = digest_buf;
6755
6756 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6757 (unsigned char *) salt.salt_buf,
6758 ptr[ 1], ptr[ 0],
6759 ptr[ 3], ptr[ 2],
6760 ptr[ 5], ptr[ 4],
6761 ptr[ 7], ptr[ 6],
6762 ptr[ 9], ptr[ 8],
6763 ptr[11], ptr[10],
6764 ptr[13], ptr[12],
6765 ptr[15], ptr[14]);
6766 }
6767 else if (hash_mode == 1731)
6768 {
6769 uint *ptr = digest_buf;
6770
6771 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6772 (unsigned char *) salt.salt_buf,
6773 ptr[ 1], ptr[ 0],
6774 ptr[ 3], ptr[ 2],
6775 ptr[ 5], ptr[ 4],
6776 ptr[ 7], ptr[ 6],
6777 ptr[ 9], ptr[ 8],
6778 ptr[11], ptr[10],
6779 ptr[13], ptr[12],
6780 ptr[15], ptr[14]);
6781 }
6782 else if (hash_mode == 1800)
6783 {
6784 // temp workaround
6785
6786 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6787 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6788 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6789 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6790 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6791 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6792 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6793 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6794
6795 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6796
6797 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6798 {
6799 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6800 }
6801 else
6802 {
6803 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6804 }
6805 }
6806 else if (hash_mode == 2100)
6807 {
6808 uint pos = 0;
6809
6810 snprintf (out_buf + pos, len-1, "%s%i#",
6811 SIGNATURE_DCC2,
6812 salt.salt_iter + 1);
6813
6814 uint signature_len = strlen (out_buf);
6815
6816 pos += signature_len;
6817 len -= signature_len;
6818
6819 char *salt_ptr = (char *) salt.salt_buf;
6820
6821 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6822
6823 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6824 byte_swap_32 (digest_buf[0]),
6825 byte_swap_32 (digest_buf[1]),
6826 byte_swap_32 (digest_buf[2]),
6827 byte_swap_32 (digest_buf[3]));
6828 }
6829 else if ((hash_mode == 2400) || (hash_mode == 2410))
6830 {
6831 memcpy (tmp_buf, digest_buf, 16);
6832
6833 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6834
6835 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6836 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6837 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6838 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6839
6840 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6841 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6842 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6843 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6844
6845 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6846 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6847 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6848 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6849
6850 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6851 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6852 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6853 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6854
6855 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6856 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6857 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6858 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6859
6860 out_buf[16] = 0;
6861 }
6862 else if (hash_mode == 2500)
6863 {
6864 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6865
6866 wpa_t *wpa = &wpas[salt_pos];
6867
6868 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6869 (char *) salt.salt_buf,
6870 wpa->orig_mac1[0],
6871 wpa->orig_mac1[1],
6872 wpa->orig_mac1[2],
6873 wpa->orig_mac1[3],
6874 wpa->orig_mac1[4],
6875 wpa->orig_mac1[5],
6876 wpa->orig_mac2[0],
6877 wpa->orig_mac2[1],
6878 wpa->orig_mac2[2],
6879 wpa->orig_mac2[3],
6880 wpa->orig_mac2[4],
6881 wpa->orig_mac2[5]);
6882 }
6883 else if (hash_mode == 4400)
6884 {
6885 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6886 byte_swap_32 (digest_buf[0]),
6887 byte_swap_32 (digest_buf[1]),
6888 byte_swap_32 (digest_buf[2]),
6889 byte_swap_32 (digest_buf[3]));
6890 }
6891 else if (hash_mode == 4700)
6892 {
6893 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6894 byte_swap_32 (digest_buf[0]),
6895 byte_swap_32 (digest_buf[1]),
6896 byte_swap_32 (digest_buf[2]),
6897 byte_swap_32 (digest_buf[3]),
6898 byte_swap_32 (digest_buf[4]));
6899 }
6900 else if (hash_mode == 4800)
6901 {
6902 u8 chap_id_byte = (u8) salt.salt_buf[4];
6903
6904 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6905 digest_buf[0],
6906 digest_buf[1],
6907 digest_buf[2],
6908 digest_buf[3],
6909 byte_swap_32 (salt.salt_buf[0]),
6910 byte_swap_32 (salt.salt_buf[1]),
6911 byte_swap_32 (salt.salt_buf[2]),
6912 byte_swap_32 (salt.salt_buf[3]),
6913 chap_id_byte);
6914 }
6915 else if (hash_mode == 4900)
6916 {
6917 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6918 byte_swap_32 (digest_buf[0]),
6919 byte_swap_32 (digest_buf[1]),
6920 byte_swap_32 (digest_buf[2]),
6921 byte_swap_32 (digest_buf[3]),
6922 byte_swap_32 (digest_buf[4]));
6923 }
6924 else if (hash_mode == 5100)
6925 {
6926 snprintf (out_buf, len-1, "%08x%08x",
6927 digest_buf[0],
6928 digest_buf[1]);
6929 }
6930 else if (hash_mode == 5200)
6931 {
6932 snprintf (out_buf, len-1, "%s", hashfile);
6933 }
6934 else if (hash_mode == 5300)
6935 {
6936 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6937
6938 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6939
6940 int buf_len = len -1;
6941
6942 // msg_buf
6943
6944 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6945
6946 for (uint i = 0; i < ikepsk_msg_len; i++)
6947 {
6948 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6949 {
6950 snprintf (out_buf, buf_len, ":");
6951
6952 buf_len--;
6953 out_buf++;
6954 }
6955
6956 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6957
6958 buf_len -= 8;
6959 out_buf += 8;
6960 }
6961
6962 // nr_buf
6963
6964 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6965
6966 for (uint i = 0; i < ikepsk_nr_len; i++)
6967 {
6968 if ((i == 0) || (i == 5))
6969 {
6970 snprintf (out_buf, buf_len, ":");
6971
6972 buf_len--;
6973 out_buf++;
6974 }
6975
6976 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6977
6978 buf_len -= 8;
6979 out_buf += 8;
6980 }
6981
6982 // digest_buf
6983
6984 for (uint i = 0; i < 4; i++)
6985 {
6986 if (i == 0)
6987 {
6988 snprintf (out_buf, buf_len, ":");
6989
6990 buf_len--;
6991 out_buf++;
6992 }
6993
6994 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6995
6996 buf_len -= 8;
6997 out_buf += 8;
6998 }
6999 }
7000 else if (hash_mode == 5400)
7001 {
7002 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
7003
7004 ikepsk_t *ikepsk = &ikepsks[salt_pos];
7005
7006 int buf_len = len -1;
7007
7008 // msg_buf
7009
7010 uint ikepsk_msg_len = ikepsk->msg_len / 4;
7011
7012 for (uint i = 0; i < ikepsk_msg_len; i++)
7013 {
7014 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
7015 {
7016 snprintf (out_buf, buf_len, ":");
7017
7018 buf_len--;
7019 out_buf++;
7020 }
7021
7022 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
7023
7024 buf_len -= 8;
7025 out_buf += 8;
7026 }
7027
7028 // nr_buf
7029
7030 uint ikepsk_nr_len = ikepsk->nr_len / 4;
7031
7032 for (uint i = 0; i < ikepsk_nr_len; i++)
7033 {
7034 if ((i == 0) || (i == 5))
7035 {
7036 snprintf (out_buf, buf_len, ":");
7037
7038 buf_len--;
7039 out_buf++;
7040 }
7041
7042 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
7043
7044 buf_len -= 8;
7045 out_buf += 8;
7046 }
7047
7048 // digest_buf
7049
7050 for (uint i = 0; i < 5; i++)
7051 {
7052 if (i == 0)
7053 {
7054 snprintf (out_buf, buf_len, ":");
7055
7056 buf_len--;
7057 out_buf++;
7058 }
7059
7060 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
7061
7062 buf_len -= 8;
7063 out_buf += 8;
7064 }
7065 }
7066 else if (hash_mode == 5500)
7067 {
7068 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
7069
7070 netntlm_t *netntlm = &netntlms[salt_pos];
7071
7072 char user_buf[64] = { 0 };
7073 char domain_buf[64] = { 0 };
7074 char srvchall_buf[1024] = { 0 };
7075 char clichall_buf[1024] = { 0 };
7076
7077 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
7078 {
7079 char *ptr = (char *) netntlm->userdomain_buf;
7080
7081 user_buf[i] = ptr[j];
7082 }
7083
7084 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
7085 {
7086 char *ptr = (char *) netntlm->userdomain_buf;
7087
7088 domain_buf[i] = ptr[netntlm->user_len + j];
7089 }
7090
7091 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
7092 {
7093 u8 *ptr = (u8 *) netntlm->chall_buf;
7094
7095 sprintf (srvchall_buf + j, "%02x", ptr[i]);
7096 }
7097
7098 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
7099 {
7100 u8 *ptr = (u8 *) netntlm->chall_buf;
7101
7102 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
7103 }
7104
7105 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
7106 user_buf,
7107 domain_buf,
7108 srvchall_buf,
7109 digest_buf[0],
7110 digest_buf[1],
7111 digest_buf[2],
7112 digest_buf[3],
7113 byte_swap_32 (salt.salt_buf_pc[0]),
7114 byte_swap_32 (salt.salt_buf_pc[1]),
7115 clichall_buf);
7116 }
7117 else if (hash_mode == 5600)
7118 {
7119 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
7120
7121 netntlm_t *netntlm = &netntlms[salt_pos];
7122
7123 char user_buf[64] = { 0 };
7124 char domain_buf[64] = { 0 };
7125 char srvchall_buf[1024] = { 0 };
7126 char clichall_buf[1024] = { 0 };
7127
7128 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
7129 {
7130 char *ptr = (char *) netntlm->userdomain_buf;
7131
7132 user_buf[i] = ptr[j];
7133 }
7134
7135 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
7136 {
7137 char *ptr = (char *) netntlm->userdomain_buf;
7138
7139 domain_buf[i] = ptr[netntlm->user_len + j];
7140 }
7141
7142 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
7143 {
7144 u8 *ptr = (u8 *) netntlm->chall_buf;
7145
7146 sprintf (srvchall_buf + j, "%02x", ptr[i]);
7147 }
7148
7149 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
7150 {
7151 u8 *ptr = (u8 *) netntlm->chall_buf;
7152
7153 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
7154 }
7155
7156 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
7157 user_buf,
7158 domain_buf,
7159 srvchall_buf,
7160 digest_buf[0],
7161 digest_buf[1],
7162 digest_buf[2],
7163 digest_buf[3],
7164 clichall_buf);
7165 }
7166 else if (hash_mode == 5700)
7167 {
7168 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7169
7170 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7171 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7172 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7173 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7174 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7175 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7176 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7177 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7178
7179 memcpy (tmp_buf, digest_buf, 32);
7180
7181 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
7182
7183 ptr_plain[43] = 0;
7184
7185 snprintf (out_buf, len-1, "%s", ptr_plain);
7186 }
7187 else if (hash_mode == 5800)
7188 {
7189 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7190 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7191 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7192 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7193 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7194
7195 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
7196 digest_buf[0],
7197 digest_buf[1],
7198 digest_buf[2],
7199 digest_buf[3],
7200 digest_buf[4]);
7201 }
7202 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
7203 {
7204 snprintf (out_buf, len-1, "%s", hashfile);
7205 }
7206 else if (hash_mode == 6300)
7207 {
7208 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7209
7210 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7211 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7212 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7213 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7214
7215 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7216
7217 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7218 }
7219 else if (hash_mode == 6400)
7220 {
7221 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7222
7223 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7224 }
7225 else if (hash_mode == 6500)
7226 {
7227 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7228
7229 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7230 }
7231 else if (hash_mode == 6600)
7232 {
7233 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
7234
7235 agilekey_t *agilekey = &agilekeys[salt_pos];
7236
7237 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7238 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7239
7240 uint buf_len = len - 1;
7241
7242 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
7243 buf_len -= 22;
7244
7245 for (uint i = 0, j = off; i < 1040; i++, j += 2)
7246 {
7247 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
7248
7249 buf_len -= 2;
7250 }
7251 }
7252 else if (hash_mode == 6700)
7253 {
7254 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7255
7256 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7257 }
7258 else if (hash_mode == 6800)
7259 {
7260 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
7261 }
7262 else if (hash_mode == 7100)
7263 {
7264 uint *ptr = digest_buf;
7265
7266 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7267
7268 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7269
7270 uint esalt[8] = { 0 };
7271
7272 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
7273 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
7274 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
7275 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
7276 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
7277 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
7278 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
7279 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
7280
7281 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",
7282 SIGNATURE_SHA512OSX,
7283 salt.salt_iter + 1,
7284 esalt[ 0], esalt[ 1],
7285 esalt[ 2], esalt[ 3],
7286 esalt[ 4], esalt[ 5],
7287 esalt[ 6], esalt[ 7],
7288 ptr [ 1], ptr [ 0],
7289 ptr [ 3], ptr [ 2],
7290 ptr [ 5], ptr [ 4],
7291 ptr [ 7], ptr [ 6],
7292 ptr [ 9], ptr [ 8],
7293 ptr [11], ptr [10],
7294 ptr [13], ptr [12],
7295 ptr [15], ptr [14]);
7296 }
7297 else if (hash_mode == 7200)
7298 {
7299 uint *ptr = digest_buf;
7300
7301 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7302
7303 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7304
7305 uint len_used = 0;
7306
7307 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
7308
7309 len_used = strlen (out_buf);
7310
7311 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
7312
7313 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
7314 {
7315 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
7316 }
7317
7318 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",
7319 ptr [ 1], ptr [ 0],
7320 ptr [ 3], ptr [ 2],
7321 ptr [ 5], ptr [ 4],
7322 ptr [ 7], ptr [ 6],
7323 ptr [ 9], ptr [ 8],
7324 ptr [11], ptr [10],
7325 ptr [13], ptr [12],
7326 ptr [15], ptr [14]);
7327 }
7328 else if (hash_mode == 7300)
7329 {
7330 rakp_t *rakps = (rakp_t *) data.esalts_buf;
7331
7332 rakp_t *rakp = &rakps[salt_pos];
7333
7334 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
7335 {
7336 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
7337 }
7338
7339 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7340 digest_buf[0],
7341 digest_buf[1],
7342 digest_buf[2],
7343 digest_buf[3],
7344 digest_buf[4]);
7345 }
7346 else if (hash_mode == 7400)
7347 {
7348 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7349
7350 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7351 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7352 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7353 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7354 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7355 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7356 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7357 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7358
7359 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7360
7361 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7362 {
7363 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7364 }
7365 else
7366 {
7367 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7368 }
7369 }
7370 else if (hash_mode == 7500)
7371 {
7372 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7373
7374 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7375
7376 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7377 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7378
7379 char data[128] = { 0 };
7380
7381 char *ptr_data = data;
7382
7383 for (uint i = 0; i < 36; i++, ptr_data += 2)
7384 {
7385 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7386 }
7387
7388 for (uint i = 0; i < 16; i++, ptr_data += 2)
7389 {
7390 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7391 }
7392
7393 *ptr_data = 0;
7394
7395 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7396 SIGNATURE_KRB5PA,
7397 (char *) krb5pa->user,
7398 (char *) krb5pa->realm,
7399 (char *) krb5pa->salt,
7400 data);
7401 }
7402 else if (hash_mode == 7700)
7403 {
7404 snprintf (out_buf, len-1, "%s$%08X%08X",
7405 (char *) salt.salt_buf,
7406 digest_buf[0],
7407 digest_buf[1]);
7408 }
7409 else if (hash_mode == 7800)
7410 {
7411 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7412 (char *) salt.salt_buf,
7413 digest_buf[0],
7414 digest_buf[1],
7415 digest_buf[2],
7416 digest_buf[3],
7417 digest_buf[4]);
7418 }
7419 else if (hash_mode == 7900)
7420 {
7421 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7422
7423 // ugly hack start
7424
7425 char *tmp = (char *) salt.salt_buf_pc;
7426
7427 ptr_plain[42] = tmp[0];
7428
7429 // ugly hack end
7430
7431 ptr_plain[43] = 0;
7432
7433 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7434 }
7435 else if (hash_mode == 8000)
7436 {
7437 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7438 (unsigned char *) salt.salt_buf,
7439 digest_buf[0],
7440 digest_buf[1],
7441 digest_buf[2],
7442 digest_buf[3],
7443 digest_buf[4],
7444 digest_buf[5],
7445 digest_buf[6],
7446 digest_buf[7]);
7447 }
7448 else if (hash_mode == 8100)
7449 {
7450 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7451 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7452
7453 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7454 (unsigned char *) salt.salt_buf,
7455 digest_buf[0],
7456 digest_buf[1],
7457 digest_buf[2],
7458 digest_buf[3],
7459 digest_buf[4]);
7460 }
7461 else if (hash_mode == 8200)
7462 {
7463 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7464
7465 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7466
7467 char data_buf[4096] = { 0 };
7468
7469 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7470 {
7471 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7472 }
7473
7474 data_buf[cloudkey->data_len * 2] = 0;
7475
7476 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7477 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7478 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7479 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7480 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7481 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7482 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7483 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7484
7485 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7486 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7487 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7488 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7489
7490 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7491 digest_buf[0],
7492 digest_buf[1],
7493 digest_buf[2],
7494 digest_buf[3],
7495 digest_buf[4],
7496 digest_buf[5],
7497 digest_buf[6],
7498 digest_buf[7],
7499 salt.salt_buf[0],
7500 salt.salt_buf[1],
7501 salt.salt_buf[2],
7502 salt.salt_buf[3],
7503 salt.salt_iter + 1,
7504 data_buf);
7505 }
7506 else if (hash_mode == 8300)
7507 {
7508 char digest_buf_c[34] = { 0 };
7509
7510 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7511 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7512 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7513 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7514 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7515
7516 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7517
7518 digest_buf_c[32] = 0;
7519
7520 // domain
7521
7522 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7523
7524 char domain_buf_c[33] = { 0 };
7525
7526 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7527
7528 for (uint i = 0; i < salt_pc_len; i++)
7529 {
7530 const char next = domain_buf_c[i];
7531
7532 domain_buf_c[i] = '.';
7533
7534 i += next;
7535 }
7536
7537 domain_buf_c[salt_pc_len] = 0;
7538
7539 // final
7540
7541 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7542 }
7543 else if (hash_mode == 8500)
7544 {
7545 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7546 }
7547 else if (hash_mode == 2612)
7548 {
7549 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7550 SIGNATURE_PHPS,
7551 (char *) salt.salt_buf,
7552 digest_buf[0],
7553 digest_buf[1],
7554 digest_buf[2],
7555 digest_buf[3]);
7556 }
7557 else if (hash_mode == 3711)
7558 {
7559 char *salt_ptr = (char *) salt.salt_buf;
7560
7561 salt_ptr[salt.salt_len - 1] = 0;
7562
7563 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7564 SIGNATURE_MEDIAWIKI_B,
7565 salt_ptr,
7566 digest_buf[0],
7567 digest_buf[1],
7568 digest_buf[2],
7569 digest_buf[3]);
7570 }
7571 else if (hash_mode == 8800)
7572 {
7573 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7574
7575 androidfde_t *androidfde = &androidfdes[salt_pos];
7576
7577 char tmp[3073] = { 0 };
7578
7579 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7580 {
7581 sprintf (tmp + j, "%08x", androidfde->data[i]);
7582 }
7583
7584 tmp[3072] = 0;
7585
7586 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7587 SIGNATURE_ANDROIDFDE,
7588 byte_swap_32 (salt.salt_buf[0]),
7589 byte_swap_32 (salt.salt_buf[1]),
7590 byte_swap_32 (salt.salt_buf[2]),
7591 byte_swap_32 (salt.salt_buf[3]),
7592 byte_swap_32 (digest_buf[0]),
7593 byte_swap_32 (digest_buf[1]),
7594 byte_swap_32 (digest_buf[2]),
7595 byte_swap_32 (digest_buf[3]),
7596 tmp);
7597 }
7598 else if (hash_mode == 8900)
7599 {
7600 uint N = salt.scrypt_N;
7601 uint r = salt.scrypt_r;
7602 uint p = salt.scrypt_p;
7603
7604 char base64_salt[32] = { 0 };
7605
7606 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7607
7608 memset (tmp_buf, 0, 46);
7609
7610 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7611 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7612 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7613 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7614 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7615 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7616 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7617 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7618 digest_buf[8] = 0; // needed for base64_encode ()
7619
7620 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7621
7622 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7623 SIGNATURE_SCRYPT,
7624 N,
7625 r,
7626 p,
7627 base64_salt,
7628 tmp_buf);
7629 }
7630 else if (hash_mode == 9000)
7631 {
7632 snprintf (out_buf, len-1, "%s", hashfile);
7633 }
7634 else if (hash_mode == 9200)
7635 {
7636 // salt
7637
7638 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7639
7640 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7641
7642 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7643
7644 // hash
7645
7646 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7647 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7648 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7649 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7650 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7651 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7652 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7653 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7654 digest_buf[8] = 0; // needed for base64_encode ()
7655
7656 char tmp_buf[64] = { 0 };
7657
7658 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7659 tmp_buf[43] = 0; // cut it here
7660
7661 // output
7662
7663 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7664 }
7665 else if (hash_mode == 9300)
7666 {
7667 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7668 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7669 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7670 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7671 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7672 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7673 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7674 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7675 digest_buf[8] = 0; // needed for base64_encode ()
7676
7677 char tmp_buf[64] = { 0 };
7678
7679 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7680 tmp_buf[43] = 0; // cut it here
7681
7682 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7683
7684 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7685 }
7686 else if (hash_mode == 9400)
7687 {
7688 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7689
7690 office2007_t *office2007 = &office2007s[salt_pos];
7691
7692 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7693 SIGNATURE_OFFICE2007,
7694 2007,
7695 20,
7696 office2007->keySize,
7697 16,
7698 salt.salt_buf[0],
7699 salt.salt_buf[1],
7700 salt.salt_buf[2],
7701 salt.salt_buf[3],
7702 office2007->encryptedVerifier[0],
7703 office2007->encryptedVerifier[1],
7704 office2007->encryptedVerifier[2],
7705 office2007->encryptedVerifier[3],
7706 office2007->encryptedVerifierHash[0],
7707 office2007->encryptedVerifierHash[1],
7708 office2007->encryptedVerifierHash[2],
7709 office2007->encryptedVerifierHash[3],
7710 office2007->encryptedVerifierHash[4]);
7711 }
7712 else if (hash_mode == 9500)
7713 {
7714 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7715
7716 office2010_t *office2010 = &office2010s[salt_pos];
7717
7718 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,
7719
7720 salt.salt_buf[0],
7721 salt.salt_buf[1],
7722 salt.salt_buf[2],
7723 salt.salt_buf[3],
7724 office2010->encryptedVerifier[0],
7725 office2010->encryptedVerifier[1],
7726 office2010->encryptedVerifier[2],
7727 office2010->encryptedVerifier[3],
7728 office2010->encryptedVerifierHash[0],
7729 office2010->encryptedVerifierHash[1],
7730 office2010->encryptedVerifierHash[2],
7731 office2010->encryptedVerifierHash[3],
7732 office2010->encryptedVerifierHash[4],
7733 office2010->encryptedVerifierHash[5],
7734 office2010->encryptedVerifierHash[6],
7735 office2010->encryptedVerifierHash[7]);
7736 }
7737 else if (hash_mode == 9600)
7738 {
7739 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7740
7741 office2013_t *office2013 = &office2013s[salt_pos];
7742
7743 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,
7744
7745 salt.salt_buf[0],
7746 salt.salt_buf[1],
7747 salt.salt_buf[2],
7748 salt.salt_buf[3],
7749 office2013->encryptedVerifier[0],
7750 office2013->encryptedVerifier[1],
7751 office2013->encryptedVerifier[2],
7752 office2013->encryptedVerifier[3],
7753 office2013->encryptedVerifierHash[0],
7754 office2013->encryptedVerifierHash[1],
7755 office2013->encryptedVerifierHash[2],
7756 office2013->encryptedVerifierHash[3],
7757 office2013->encryptedVerifierHash[4],
7758 office2013->encryptedVerifierHash[5],
7759 office2013->encryptedVerifierHash[6],
7760 office2013->encryptedVerifierHash[7]);
7761 }
7762 else if (hash_mode == 9700)
7763 {
7764 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7765
7766 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7767
7768 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7769 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7770 byte_swap_32 (salt.salt_buf[0]),
7771 byte_swap_32 (salt.salt_buf[1]),
7772 byte_swap_32 (salt.salt_buf[2]),
7773 byte_swap_32 (salt.salt_buf[3]),
7774 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7775 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7776 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7777 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7778 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7779 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7780 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7781 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7782 }
7783 else if (hash_mode == 9710)
7784 {
7785 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7786
7787 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7788
7789 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7790 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7791 byte_swap_32 (salt.salt_buf[0]),
7792 byte_swap_32 (salt.salt_buf[1]),
7793 byte_swap_32 (salt.salt_buf[2]),
7794 byte_swap_32 (salt.salt_buf[3]),
7795 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7796 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7797 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7798 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7799 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7800 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7801 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7802 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7803 }
7804 else if (hash_mode == 9720)
7805 {
7806 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7807
7808 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7809
7810 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7811
7812 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7813 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7814 byte_swap_32 (salt.salt_buf[0]),
7815 byte_swap_32 (salt.salt_buf[1]),
7816 byte_swap_32 (salt.salt_buf[2]),
7817 byte_swap_32 (salt.salt_buf[3]),
7818 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7819 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7820 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7821 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7822 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7823 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7824 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7825 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7826 rc4key[0],
7827 rc4key[1],
7828 rc4key[2],
7829 rc4key[3],
7830 rc4key[4]);
7831 }
7832 else if (hash_mode == 9800)
7833 {
7834 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7835
7836 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7837
7838 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7839 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7840 salt.salt_buf[0],
7841 salt.salt_buf[1],
7842 salt.salt_buf[2],
7843 salt.salt_buf[3],
7844 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7845 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7846 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7847 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7848 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7849 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7850 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7851 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7852 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7853 }
7854 else if (hash_mode == 9810)
7855 {
7856 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7857
7858 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7859
7860 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7861 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7862 salt.salt_buf[0],
7863 salt.salt_buf[1],
7864 salt.salt_buf[2],
7865 salt.salt_buf[3],
7866 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7867 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7868 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7869 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7870 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7871 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7872 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7873 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7874 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7875 }
7876 else if (hash_mode == 9820)
7877 {
7878 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7879
7880 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7881
7882 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7883
7884 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7885 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7886 salt.salt_buf[0],
7887 salt.salt_buf[1],
7888 salt.salt_buf[2],
7889 salt.salt_buf[3],
7890 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7891 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7892 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7893 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7894 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7895 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7896 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7897 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7898 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7899 rc4key[0],
7900 rc4key[1],
7901 rc4key[2],
7902 rc4key[3],
7903 rc4key[4]);
7904 }
7905 else if (hash_mode == 10000)
7906 {
7907 // salt
7908
7909 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7910
7911 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7912
7913 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7914
7915 // hash
7916
7917 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7918 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7919 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7920 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7921 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7922 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7923 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7924 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7925 digest_buf[8] = 0; // needed for base64_encode ()
7926
7927 char tmp_buf[64] = { 0 };
7928
7929 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7930
7931 // output
7932
7933 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7934 }
7935 else if (hash_mode == 10100)
7936 {
7937 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7938 digest_buf[0],
7939 digest_buf[1],
7940 2,
7941 4,
7942 byte_swap_32 (salt.salt_buf[0]),
7943 byte_swap_32 (salt.salt_buf[1]),
7944 byte_swap_32 (salt.salt_buf[2]),
7945 byte_swap_32 (salt.salt_buf[3]));
7946 }
7947 else if (hash_mode == 10200)
7948 {
7949 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7950
7951 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7952
7953 // challenge
7954
7955 char challenge[100] = { 0 };
7956
7957 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7958
7959 // response
7960
7961 char tmp_buf[100] = { 0 };
7962
7963 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7964 (char *) cram_md5->user,
7965 digest_buf[0],
7966 digest_buf[1],
7967 digest_buf[2],
7968 digest_buf[3]);
7969
7970 char response[100] = { 0 };
7971
7972 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7973
7974 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7975 }
7976 else if (hash_mode == 10300)
7977 {
7978 char tmp_buf[100] = { 0 };
7979
7980 memcpy (tmp_buf + 0, digest_buf, 20);
7981 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7982
7983 uint tmp_len = 20 + salt.salt_len;
7984
7985 // base64 encode it
7986
7987 char base64_encoded[100] = { 0 };
7988
7989 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7990
7991 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7992 }
7993 else if (hash_mode == 10400)
7994 {
7995 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7996
7997 pdf_t *pdf = &pdfs[salt_pos];
7998
7999 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",
8000
8001 pdf->V,
8002 pdf->R,
8003 40,
8004 pdf->P,
8005 pdf->enc_md,
8006 pdf->id_len,
8007 byte_swap_32 (pdf->id_buf[0]),
8008 byte_swap_32 (pdf->id_buf[1]),
8009 byte_swap_32 (pdf->id_buf[2]),
8010 byte_swap_32 (pdf->id_buf[3]),
8011 pdf->u_len,
8012 byte_swap_32 (pdf->u_buf[0]),
8013 byte_swap_32 (pdf->u_buf[1]),
8014 byte_swap_32 (pdf->u_buf[2]),
8015 byte_swap_32 (pdf->u_buf[3]),
8016 byte_swap_32 (pdf->u_buf[4]),
8017 byte_swap_32 (pdf->u_buf[5]),
8018 byte_swap_32 (pdf->u_buf[6]),
8019 byte_swap_32 (pdf->u_buf[7]),
8020 pdf->o_len,
8021 byte_swap_32 (pdf->o_buf[0]),
8022 byte_swap_32 (pdf->o_buf[1]),
8023 byte_swap_32 (pdf->o_buf[2]),
8024 byte_swap_32 (pdf->o_buf[3]),
8025 byte_swap_32 (pdf->o_buf[4]),
8026 byte_swap_32 (pdf->o_buf[5]),
8027 byte_swap_32 (pdf->o_buf[6]),
8028 byte_swap_32 (pdf->o_buf[7])
8029 );
8030 }
8031 else if (hash_mode == 10410)
8032 {
8033 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
8034
8035 pdf_t *pdf = &pdfs[salt_pos];
8036
8037 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",
8038
8039 pdf->V,
8040 pdf->R,
8041 40,
8042 pdf->P,
8043 pdf->enc_md,
8044 pdf->id_len,
8045 byte_swap_32 (pdf->id_buf[0]),
8046 byte_swap_32 (pdf->id_buf[1]),
8047 byte_swap_32 (pdf->id_buf[2]),
8048 byte_swap_32 (pdf->id_buf[3]),
8049 pdf->u_len,
8050 byte_swap_32 (pdf->u_buf[0]),
8051 byte_swap_32 (pdf->u_buf[1]),
8052 byte_swap_32 (pdf->u_buf[2]),
8053 byte_swap_32 (pdf->u_buf[3]),
8054 byte_swap_32 (pdf->u_buf[4]),
8055 byte_swap_32 (pdf->u_buf[5]),
8056 byte_swap_32 (pdf->u_buf[6]),
8057 byte_swap_32 (pdf->u_buf[7]),
8058 pdf->o_len,
8059 byte_swap_32 (pdf->o_buf[0]),
8060 byte_swap_32 (pdf->o_buf[1]),
8061 byte_swap_32 (pdf->o_buf[2]),
8062 byte_swap_32 (pdf->o_buf[3]),
8063 byte_swap_32 (pdf->o_buf[4]),
8064 byte_swap_32 (pdf->o_buf[5]),
8065 byte_swap_32 (pdf->o_buf[6]),
8066 byte_swap_32 (pdf->o_buf[7])
8067 );
8068 }
8069 else if (hash_mode == 10420)
8070 {
8071 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
8072
8073 pdf_t *pdf = &pdfs[salt_pos];
8074
8075 u8 *rc4key = (u8 *) pdf->rc4key;
8076
8077 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",
8078
8079 pdf->V,
8080 pdf->R,
8081 40,
8082 pdf->P,
8083 pdf->enc_md,
8084 pdf->id_len,
8085 byte_swap_32 (pdf->id_buf[0]),
8086 byte_swap_32 (pdf->id_buf[1]),
8087 byte_swap_32 (pdf->id_buf[2]),
8088 byte_swap_32 (pdf->id_buf[3]),
8089 pdf->u_len,
8090 byte_swap_32 (pdf->u_buf[0]),
8091 byte_swap_32 (pdf->u_buf[1]),
8092 byte_swap_32 (pdf->u_buf[2]),
8093 byte_swap_32 (pdf->u_buf[3]),
8094 byte_swap_32 (pdf->u_buf[4]),
8095 byte_swap_32 (pdf->u_buf[5]),
8096 byte_swap_32 (pdf->u_buf[6]),
8097 byte_swap_32 (pdf->u_buf[7]),
8098 pdf->o_len,
8099 byte_swap_32 (pdf->o_buf[0]),
8100 byte_swap_32 (pdf->o_buf[1]),
8101 byte_swap_32 (pdf->o_buf[2]),
8102 byte_swap_32 (pdf->o_buf[3]),
8103 byte_swap_32 (pdf->o_buf[4]),
8104 byte_swap_32 (pdf->o_buf[5]),
8105 byte_swap_32 (pdf->o_buf[6]),
8106 byte_swap_32 (pdf->o_buf[7]),
8107 rc4key[0],
8108 rc4key[1],
8109 rc4key[2],
8110 rc4key[3],
8111 rc4key[4]
8112 );
8113 }
8114 else if (hash_mode == 10500)
8115 {
8116 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
8117
8118 pdf_t *pdf = &pdfs[salt_pos];
8119
8120 if (pdf->id_len == 32)
8121 {
8122 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",
8123
8124 pdf->V,
8125 pdf->R,
8126 128,
8127 pdf->P,
8128 pdf->enc_md,
8129 pdf->id_len,
8130 byte_swap_32 (pdf->id_buf[0]),
8131 byte_swap_32 (pdf->id_buf[1]),
8132 byte_swap_32 (pdf->id_buf[2]),
8133 byte_swap_32 (pdf->id_buf[3]),
8134 byte_swap_32 (pdf->id_buf[4]),
8135 byte_swap_32 (pdf->id_buf[5]),
8136 byte_swap_32 (pdf->id_buf[6]),
8137 byte_swap_32 (pdf->id_buf[7]),
8138 pdf->u_len,
8139 byte_swap_32 (pdf->u_buf[0]),
8140 byte_swap_32 (pdf->u_buf[1]),
8141 byte_swap_32 (pdf->u_buf[2]),
8142 byte_swap_32 (pdf->u_buf[3]),
8143 byte_swap_32 (pdf->u_buf[4]),
8144 byte_swap_32 (pdf->u_buf[5]),
8145 byte_swap_32 (pdf->u_buf[6]),
8146 byte_swap_32 (pdf->u_buf[7]),
8147 pdf->o_len,
8148 byte_swap_32 (pdf->o_buf[0]),
8149 byte_swap_32 (pdf->o_buf[1]),
8150 byte_swap_32 (pdf->o_buf[2]),
8151 byte_swap_32 (pdf->o_buf[3]),
8152 byte_swap_32 (pdf->o_buf[4]),
8153 byte_swap_32 (pdf->o_buf[5]),
8154 byte_swap_32 (pdf->o_buf[6]),
8155 byte_swap_32 (pdf->o_buf[7])
8156 );
8157 }
8158 else
8159 {
8160 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",
8161
8162 pdf->V,
8163 pdf->R,
8164 128,
8165 pdf->P,
8166 pdf->enc_md,
8167 pdf->id_len,
8168 byte_swap_32 (pdf->id_buf[0]),
8169 byte_swap_32 (pdf->id_buf[1]),
8170 byte_swap_32 (pdf->id_buf[2]),
8171 byte_swap_32 (pdf->id_buf[3]),
8172 pdf->u_len,
8173 byte_swap_32 (pdf->u_buf[0]),
8174 byte_swap_32 (pdf->u_buf[1]),
8175 byte_swap_32 (pdf->u_buf[2]),
8176 byte_swap_32 (pdf->u_buf[3]),
8177 byte_swap_32 (pdf->u_buf[4]),
8178 byte_swap_32 (pdf->u_buf[5]),
8179 byte_swap_32 (pdf->u_buf[6]),
8180 byte_swap_32 (pdf->u_buf[7]),
8181 pdf->o_len,
8182 byte_swap_32 (pdf->o_buf[0]),
8183 byte_swap_32 (pdf->o_buf[1]),
8184 byte_swap_32 (pdf->o_buf[2]),
8185 byte_swap_32 (pdf->o_buf[3]),
8186 byte_swap_32 (pdf->o_buf[4]),
8187 byte_swap_32 (pdf->o_buf[5]),
8188 byte_swap_32 (pdf->o_buf[6]),
8189 byte_swap_32 (pdf->o_buf[7])
8190 );
8191 }
8192 }
8193 else if (hash_mode == 10600)
8194 {
8195 uint digest_idx = salt.digests_offset + digest_pos;
8196
8197 hashinfo_t **hashinfo_ptr = data.hash_info;
8198 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8199
8200 snprintf (out_buf, len-1, "%s", hash_buf);
8201 }
8202 else if (hash_mode == 10700)
8203 {
8204 uint digest_idx = salt.digests_offset + digest_pos;
8205
8206 hashinfo_t **hashinfo_ptr = data.hash_info;
8207 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8208
8209 snprintf (out_buf, len-1, "%s", hash_buf);
8210 }
8211 else if (hash_mode == 10900)
8212 {
8213 uint digest_idx = salt.digests_offset + digest_pos;
8214
8215 hashinfo_t **hashinfo_ptr = data.hash_info;
8216 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8217
8218 snprintf (out_buf, len-1, "%s", hash_buf);
8219 }
8220 else if (hash_mode == 11100)
8221 {
8222 u32 salt_challenge = salt.salt_buf[0];
8223
8224 salt_challenge = byte_swap_32 (salt_challenge);
8225
8226 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
8227
8228 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
8229 SIGNATURE_POSTGRESQL_AUTH,
8230 user_name,
8231 salt_challenge,
8232 digest_buf[0],
8233 digest_buf[1],
8234 digest_buf[2],
8235 digest_buf[3]);
8236 }
8237 else if (hash_mode == 11200)
8238 {
8239 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
8240 SIGNATURE_MYSQL_AUTH,
8241 (unsigned char *) salt.salt_buf,
8242 digest_buf[0],
8243 digest_buf[1],
8244 digest_buf[2],
8245 digest_buf[3],
8246 digest_buf[4]);
8247 }
8248 else if (hash_mode == 11300)
8249 {
8250 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
8251
8252 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
8253
8254 const uint cry_master_len = bitcoin_wallet->cry_master_len;
8255 const uint ckey_len = bitcoin_wallet->ckey_len;
8256 const uint public_key_len = bitcoin_wallet->public_key_len;
8257
8258 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
8259 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
8260 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
8261
8262 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
8263 {
8264 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
8265
8266 sprintf (cry_master_buf + j, "%02x", ptr[i]);
8267 }
8268
8269 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
8270 {
8271 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
8272
8273 sprintf (ckey_buf + j, "%02x", ptr[i]);
8274 }
8275
8276 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
8277 {
8278 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
8279
8280 sprintf (public_key_buf + j, "%02x", ptr[i]);
8281 }
8282
8283 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
8284 SIGNATURE_BITCOIN_WALLET,
8285 cry_master_len * 2,
8286 cry_master_buf,
8287 salt.salt_len,
8288 (unsigned char *) salt.salt_buf,
8289 salt.salt_iter + 1,
8290 ckey_len * 2,
8291 ckey_buf,
8292 public_key_len * 2,
8293 public_key_buf
8294 );
8295
8296 free (cry_master_buf);
8297 free (ckey_buf);
8298 free (public_key_buf);
8299 }
8300 else if (hash_mode == 11400)
8301 {
8302 uint digest_idx = salt.digests_offset + digest_pos;
8303
8304 hashinfo_t **hashinfo_ptr = data.hash_info;
8305 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8306
8307 snprintf (out_buf, len-1, "%s", hash_buf);
8308 }
8309 else if (hash_mode == 11600)
8310 {
8311 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
8312
8313 seven_zip_t *seven_zip = &seven_zips[salt_pos];
8314
8315 const uint data_len = seven_zip->data_len;
8316
8317 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
8318
8319 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8320 {
8321 const u8 *ptr = (const u8 *) seven_zip->data_buf;
8322
8323 sprintf (data_buf + j, "%02x", ptr[i]);
8324 }
8325
8326 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
8327 SIGNATURE_SEVEN_ZIP,
8328 0,
8329 salt.salt_sign[0],
8330 0,
8331 (char *) seven_zip->salt_buf,
8332 seven_zip->iv_len,
8333 seven_zip->iv_buf[0],
8334 seven_zip->iv_buf[1],
8335 seven_zip->iv_buf[2],
8336 seven_zip->iv_buf[3],
8337 seven_zip->crc,
8338 seven_zip->data_len,
8339 seven_zip->unpack_size,
8340 data_buf);
8341
8342 free (data_buf);
8343 }
8344 else if (hash_mode == 11700)
8345 {
8346 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8347 digest_buf[0],
8348 digest_buf[1],
8349 digest_buf[2],
8350 digest_buf[3],
8351 digest_buf[4],
8352 digest_buf[5],
8353 digest_buf[6],
8354 digest_buf[7]);
8355 }
8356 else if (hash_mode == 11800)
8357 {
8358 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8359 digest_buf[ 0],
8360 digest_buf[ 1],
8361 digest_buf[ 2],
8362 digest_buf[ 3],
8363 digest_buf[ 4],
8364 digest_buf[ 5],
8365 digest_buf[ 6],
8366 digest_buf[ 7],
8367 digest_buf[ 8],
8368 digest_buf[ 9],
8369 digest_buf[10],
8370 digest_buf[11],
8371 digest_buf[12],
8372 digest_buf[13],
8373 digest_buf[14],
8374 digest_buf[15]);
8375 }
8376 else if (hash_mode == 11900)
8377 {
8378 uint digest_idx = salt.digests_offset + digest_pos;
8379
8380 hashinfo_t **hashinfo_ptr = data.hash_info;
8381 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8382
8383 snprintf (out_buf, len-1, "%s", hash_buf);
8384 }
8385 else if (hash_mode == 12000)
8386 {
8387 uint digest_idx = salt.digests_offset + digest_pos;
8388
8389 hashinfo_t **hashinfo_ptr = data.hash_info;
8390 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8391
8392 snprintf (out_buf, len-1, "%s", hash_buf);
8393 }
8394 else if (hash_mode == 12100)
8395 {
8396 uint digest_idx = salt.digests_offset + digest_pos;
8397
8398 hashinfo_t **hashinfo_ptr = data.hash_info;
8399 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8400
8401 snprintf (out_buf, len-1, "%s", hash_buf);
8402 }
8403 else if (hash_mode == 12200)
8404 {
8405 uint *ptr_digest = digest_buf;
8406 uint *ptr_salt = salt.salt_buf;
8407
8408 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8409 SIGNATURE_ECRYPTFS,
8410 ptr_salt[0],
8411 ptr_salt[1],
8412 ptr_digest[0],
8413 ptr_digest[1]);
8414 }
8415 else if (hash_mode == 12300)
8416 {
8417 uint *ptr_digest = digest_buf;
8418 uint *ptr_salt = salt.salt_buf;
8419
8420 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",
8421 ptr_digest[ 0], ptr_digest[ 1],
8422 ptr_digest[ 2], ptr_digest[ 3],
8423 ptr_digest[ 4], ptr_digest[ 5],
8424 ptr_digest[ 6], ptr_digest[ 7],
8425 ptr_digest[ 8], ptr_digest[ 9],
8426 ptr_digest[10], ptr_digest[11],
8427 ptr_digest[12], ptr_digest[13],
8428 ptr_digest[14], ptr_digest[15],
8429 ptr_salt[0],
8430 ptr_salt[1],
8431 ptr_salt[2],
8432 ptr_salt[3]);
8433 }
8434 else if (hash_mode == 12400)
8435 {
8436 // encode iteration count
8437
8438 char salt_iter[5] = { 0 };
8439
8440 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8441 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8442 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8443 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8444 salt_iter[4] = 0;
8445
8446 // encode salt
8447
8448 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8449 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8450 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8451 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8452 ptr_salt[4] = 0;
8453
8454 // encode digest
8455
8456 memset (tmp_buf, 0, sizeof (tmp_buf));
8457
8458 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8459 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8460
8461 memcpy (tmp_buf, digest_buf, 8);
8462
8463 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8464
8465 ptr_plain[11] = 0;
8466
8467 // fill the resulting buffer
8468
8469 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8470 }
8471 else if (hash_mode == 12500)
8472 {
8473 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8474 SIGNATURE_RAR3,
8475 byte_swap_32 (salt.salt_buf[0]),
8476 byte_swap_32 (salt.salt_buf[1]),
8477 salt.salt_buf[2],
8478 salt.salt_buf[3],
8479 salt.salt_buf[4],
8480 salt.salt_buf[5]);
8481 }
8482 else if (hash_mode == 12600)
8483 {
8484 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8485 digest_buf[0] + salt.salt_buf_pc[0],
8486 digest_buf[1] + salt.salt_buf_pc[1],
8487 digest_buf[2] + salt.salt_buf_pc[2],
8488 digest_buf[3] + salt.salt_buf_pc[3],
8489 digest_buf[4] + salt.salt_buf_pc[4],
8490 digest_buf[5] + salt.salt_buf_pc[5],
8491 digest_buf[6] + salt.salt_buf_pc[6],
8492 digest_buf[7] + salt.salt_buf_pc[7]);
8493 }
8494 else if (hash_mode == 12700)
8495 {
8496 uint digest_idx = salt.digests_offset + digest_pos;
8497
8498 hashinfo_t **hashinfo_ptr = data.hash_info;
8499 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8500
8501 snprintf (out_buf, len-1, "%s", hash_buf);
8502 }
8503 else if (hash_mode == 12800)
8504 {
8505 const u8 *ptr = (const u8 *) salt.salt_buf;
8506
8507 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",
8508 SIGNATURE_MS_DRSR,
8509 ptr[0],
8510 ptr[1],
8511 ptr[2],
8512 ptr[3],
8513 ptr[4],
8514 ptr[5],
8515 ptr[6],
8516 ptr[7],
8517 ptr[8],
8518 ptr[9],
8519 salt.salt_iter + 1,
8520 byte_swap_32 (digest_buf[0]),
8521 byte_swap_32 (digest_buf[1]),
8522 byte_swap_32 (digest_buf[2]),
8523 byte_swap_32 (digest_buf[3]),
8524 byte_swap_32 (digest_buf[4]),
8525 byte_swap_32 (digest_buf[5]),
8526 byte_swap_32 (digest_buf[6]),
8527 byte_swap_32 (digest_buf[7])
8528 );
8529 }
8530 else if (hash_mode == 12900)
8531 {
8532 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",
8533 salt.salt_buf[ 4],
8534 salt.salt_buf[ 5],
8535 salt.salt_buf[ 6],
8536 salt.salt_buf[ 7],
8537 salt.salt_buf[ 8],
8538 salt.salt_buf[ 9],
8539 salt.salt_buf[10],
8540 salt.salt_buf[11],
8541 byte_swap_32 (digest_buf[0]),
8542 byte_swap_32 (digest_buf[1]),
8543 byte_swap_32 (digest_buf[2]),
8544 byte_swap_32 (digest_buf[3]),
8545 byte_swap_32 (digest_buf[4]),
8546 byte_swap_32 (digest_buf[5]),
8547 byte_swap_32 (digest_buf[6]),
8548 byte_swap_32 (digest_buf[7]),
8549 salt.salt_buf[ 0],
8550 salt.salt_buf[ 1],
8551 salt.salt_buf[ 2],
8552 salt.salt_buf[ 3]
8553 );
8554 }
8555 else if (hash_mode == 13000)
8556 {
8557 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8558
8559 rar5_t *rar5 = &rar5s[salt_pos];
8560
8561 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8562 salt.salt_buf[0],
8563 salt.salt_buf[1],
8564 salt.salt_buf[2],
8565 salt.salt_buf[3],
8566 salt.salt_sign[0],
8567 rar5->iv[0],
8568 rar5->iv[1],
8569 rar5->iv[2],
8570 rar5->iv[3],
8571 byte_swap_32 (digest_buf[0]),
8572 byte_swap_32 (digest_buf[1])
8573 );
8574 }
8575 else if (hash_mode == 13100)
8576 {
8577 krb5tgs_t *krb5tgss = (krb5tgs_t *) data.esalts_buf;
8578
8579 krb5tgs_t *krb5tgs = &krb5tgss[salt_pos];
8580
8581 u8 *ptr_checksum = (u8 *) krb5tgs->checksum;
8582 u8 *ptr_edata2 = (u8 *) krb5tgs->edata2;
8583
8584 char data[2560 * 4 * 2] = { 0 };
8585
8586 char *ptr_data = data;
8587
8588 for (uint i = 0; i < 16; i++, ptr_data += 2)
8589 sprintf (ptr_data, "%02x", ptr_checksum[i]);
8590
8591 /* skip '$' */
8592 ptr_data++;
8593
8594 for (uint i = 0; i < krb5tgs->edata2_len; i++, ptr_data += 2)
8595 sprintf (ptr_data, "%02x", ptr_edata2[i]);
8596
8597 snprintf (out_buf, len-1, "%s$%s$%s$%s",
8598 SIGNATURE_KRB5TGS,
8599 (char *) krb5tgs->account_info,
8600 data,
8601 data + 33);
8602 }
8603 else if (hash_mode == 13200)
8604 {
8605 snprintf (out_buf, len-1, "%s*%d*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x",
8606 SIGNATURE_AXCRYPT,
8607 salt.salt_iter,
8608 salt.salt_buf[0],
8609 salt.salt_buf[1],
8610 salt.salt_buf[2],
8611 salt.salt_buf[3],
8612 salt.salt_buf[4],
8613 salt.salt_buf[5],
8614 salt.salt_buf[6],
8615 salt.salt_buf[7],
8616 salt.salt_buf[8],
8617 salt.salt_buf[9]);
8618 }
8619 else if (hash_mode == 13300)
8620 {
8621 snprintf (out_buf, len-1, "%s$%08x%08x%08x%08x",
8622 SIGNATURE_AXCRYPT_SHA1,
8623 digest_buf[0],
8624 digest_buf[1],
8625 digest_buf[2],
8626 digest_buf[3]);
8627 }
8628 else if (hash_mode == 13400)
8629 {
8630 keepass_t *keepasss = (keepass_t *) data.esalts_buf;
8631
8632 keepass_t *keepass = &keepasss[salt_pos];
8633
8634 u32 version = (u32) keepass->version;
8635 u32 rounds = salt.salt_iter;
8636 u32 algorithm = (u32) keepass->algorithm;
8637 u32 keyfile_len = (u32) keepass->keyfile_len;
8638
8639 u32 *ptr_final_random_seed = (u32 *) keepass->final_random_seed ;
8640 u32 *ptr_transf_random_seed = (u32 *) keepass->transf_random_seed ;
8641 u32 *ptr_enc_iv = (u32 *) keepass->enc_iv ;
8642 u32 *ptr_contents_hash = (u32 *) keepass->contents_hash ;
8643 u32 *ptr_keyfile = (u32 *) keepass->keyfile ;
8644
8645 /* specific to version 1 */
8646 u32 contents_len;
8647 u32 *ptr_contents;
8648
8649 /* specific to version 2 */
8650 u32 expected_bytes_len;
8651 u32 *ptr_expected_bytes;
8652
8653 u32 final_random_seed_len;
8654 u32 transf_random_seed_len;
8655 u32 enc_iv_len;
8656 u32 contents_hash_len;
8657
8658 transf_random_seed_len = 8;
8659 enc_iv_len = 4;
8660 contents_hash_len = 8;
8661 final_random_seed_len = 8;
8662
8663 if (version == 1)
8664 final_random_seed_len = 4;
8665
8666 snprintf (out_buf, len-1, "%s*%d*%d*%d",
8667 SIGNATURE_KEEPASS,
8668 version,
8669 rounds,
8670 algorithm);
8671
8672 char *ptr_data = out_buf;
8673
8674 ptr_data += strlen(out_buf);
8675
8676 *ptr_data = '*';
8677 ptr_data++;
8678
8679 for (uint i = 0; i < final_random_seed_len; i++, ptr_data += 8)
8680 sprintf (ptr_data, "%08x", ptr_final_random_seed[i]);
8681
8682 *ptr_data = '*';
8683 ptr_data++;
8684
8685 for (uint i = 0; i < transf_random_seed_len; i++, ptr_data += 8)
8686 sprintf (ptr_data, "%08x", ptr_transf_random_seed[i]);
8687
8688 *ptr_data = '*';
8689 ptr_data++;
8690
8691 for (uint i = 0; i < enc_iv_len; i++, ptr_data += 8)
8692 sprintf (ptr_data, "%08x", ptr_enc_iv[i]);
8693
8694 *ptr_data = '*';
8695 ptr_data++;
8696
8697 if (version == 1)
8698 {
8699 contents_len = (u32) keepass->contents_len;
8700 ptr_contents = (u32 *) keepass->contents;
8701
8702 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8703 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8704
8705 *ptr_data = '*';
8706 ptr_data++;
8707
8708 /* inline flag */
8709 *ptr_data = '1';
8710 ptr_data++;
8711
8712 *ptr_data = '*';
8713 ptr_data++;
8714
8715 char ptr_contents_len[10] = { 0 };
8716
8717 sprintf ((char*) ptr_contents_len, "%d", contents_len);
8718
8719 sprintf (ptr_data, "%d", contents_len);
8720
8721 ptr_data += strlen(ptr_contents_len);
8722
8723 *ptr_data = '*';
8724 ptr_data++;
8725
8726 for (uint i = 0; i < contents_len / 4; i++, ptr_data += 8)
8727 sprintf (ptr_data, "%08x", ptr_contents[i]);
8728 }
8729 else if (version == 2)
8730 {
8731 expected_bytes_len = 8;
8732 ptr_expected_bytes = (u32 *) keepass->expected_bytes ;
8733
8734 for (uint i = 0; i < expected_bytes_len; i++, ptr_data += 8)
8735 sprintf (ptr_data, "%08x", ptr_expected_bytes[i]);
8736
8737 *ptr_data = '*';
8738 ptr_data++;
8739
8740 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8741 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8742 }
8743 if (keyfile_len)
8744 {
8745 *ptr_data = '*';
8746 ptr_data++;
8747
8748 /* inline flag */
8749 *ptr_data = '1';
8750 ptr_data++;
8751
8752 *ptr_data = '*';
8753 ptr_data++;
8754
8755 sprintf (ptr_data, "%d", keyfile_len);
8756
8757 ptr_data += 2;
8758
8759 *ptr_data = '*';
8760 ptr_data++;
8761
8762 for (uint i = 0; i < 8; i++, ptr_data += 8)
8763 sprintf (ptr_data, "%08x", ptr_keyfile[i]);
8764 }
8765 }
8766 else if (hash_mode == 13500)
8767 {
8768 pstoken_t *pstokens = (pstoken_t *) data.esalts_buf;
8769
8770 pstoken_t *pstoken = &pstokens[salt_pos];
8771
8772 const u32 salt_len = (pstoken->salt_len > 512) ? 512 : pstoken->salt_len;
8773
8774 char pstoken_tmp[1024 + 1] = { 0 };
8775
8776 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8777 {
8778 const u8 *ptr = (const u8 *) pstoken->salt_buf;
8779
8780 sprintf (pstoken_tmp + j, "%02x", ptr[i]);
8781 }
8782
8783 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x:%s",
8784 digest_buf[0],
8785 digest_buf[1],
8786 digest_buf[2],
8787 digest_buf[3],
8788 digest_buf[4],
8789 pstoken_tmp);
8790 }
8791 else if (hash_mode == 13600)
8792 {
8793 zip2_t *zip2s = (zip2_t *) data.esalts_buf;
8794
8795 zip2_t *zip2 = &zip2s[salt_pos];
8796
8797 const u32 salt_len = zip2->salt_len;
8798
8799 char salt_tmp[32 + 1] = { 0 };
8800
8801 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8802 {
8803 const u8 *ptr = (const u8 *) zip2->salt_buf;
8804
8805 sprintf (salt_tmp + j, "%02x", ptr[i]);
8806 }
8807
8808 const u32 data_len = zip2->data_len;
8809
8810 char data_tmp[8192 + 1] = { 0 };
8811
8812 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8813 {
8814 const u8 *ptr = (const u8 *) zip2->data_buf;
8815
8816 sprintf (data_tmp + j, "%02x", ptr[i]);
8817 }
8818
8819 const u32 auth_len = zip2->auth_len;
8820
8821 char auth_tmp[20 + 1] = { 0 };
8822
8823 for (uint i = 0, j = 0; i < auth_len; i += 1, j += 2)
8824 {
8825 const u8 *ptr = (const u8 *) zip2->auth_buf;
8826
8827 sprintf (auth_tmp + j, "%02x", ptr[i]);
8828 }
8829
8830 snprintf (out_buf, 255, "%s*%u*%u*%u*%s*%x*%u*%s*%s*%s",
8831 SIGNATURE_ZIP2_START,
8832 zip2->type,
8833 zip2->mode,
8834 zip2->magic,
8835 salt_tmp,
8836 zip2->verify_bytes,
8837 zip2->compress_length,
8838 data_tmp,
8839 auth_tmp,
8840 SIGNATURE_ZIP2_STOP);
8841 }
8842 else if ((hash_mode >= 13700) && (hash_mode <= 13799))
8843 {
8844 snprintf (out_buf, len-1, "%s", hashfile);
8845 }
8846 else if (hash_mode == 13800)
8847 {
8848 win8phone_t *esalts = (win8phone_t *) data.esalts_buf;
8849
8850 win8phone_t *esalt = &esalts[salt_pos];
8851
8852 char buf[256 + 1] = { 0 };
8853
8854 for (int i = 0, j = 0; i < 32; i += 1, j += 8)
8855 {
8856 sprintf (buf + j, "%08x", esalt->salt_buf[i]);
8857 }
8858
8859 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%s",
8860 digest_buf[0],
8861 digest_buf[1],
8862 digest_buf[2],
8863 digest_buf[3],
8864 digest_buf[4],
8865 digest_buf[5],
8866 digest_buf[6],
8867 digest_buf[7],
8868 buf);
8869 }
8870 else
8871 {
8872 if (hash_type == HASH_TYPE_MD4)
8873 {
8874 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8875 digest_buf[0],
8876 digest_buf[1],
8877 digest_buf[2],
8878 digest_buf[3]);
8879 }
8880 else if (hash_type == HASH_TYPE_MD5)
8881 {
8882 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8883 digest_buf[0],
8884 digest_buf[1],
8885 digest_buf[2],
8886 digest_buf[3]);
8887 }
8888 else if (hash_type == HASH_TYPE_SHA1)
8889 {
8890 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8891 digest_buf[0],
8892 digest_buf[1],
8893 digest_buf[2],
8894 digest_buf[3],
8895 digest_buf[4]);
8896 }
8897 else if (hash_type == HASH_TYPE_SHA256)
8898 {
8899 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8900 digest_buf[0],
8901 digest_buf[1],
8902 digest_buf[2],
8903 digest_buf[3],
8904 digest_buf[4],
8905 digest_buf[5],
8906 digest_buf[6],
8907 digest_buf[7]);
8908 }
8909 else if (hash_type == HASH_TYPE_SHA384)
8910 {
8911 uint *ptr = digest_buf;
8912
8913 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8914 ptr[ 1], ptr[ 0],
8915 ptr[ 3], ptr[ 2],
8916 ptr[ 5], ptr[ 4],
8917 ptr[ 7], ptr[ 6],
8918 ptr[ 9], ptr[ 8],
8919 ptr[11], ptr[10]);
8920 }
8921 else if (hash_type == HASH_TYPE_SHA512)
8922 {
8923 uint *ptr = digest_buf;
8924
8925 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8926 ptr[ 1], ptr[ 0],
8927 ptr[ 3], ptr[ 2],
8928 ptr[ 5], ptr[ 4],
8929 ptr[ 7], ptr[ 6],
8930 ptr[ 9], ptr[ 8],
8931 ptr[11], ptr[10],
8932 ptr[13], ptr[12],
8933 ptr[15], ptr[14]);
8934 }
8935 else if (hash_type == HASH_TYPE_LM)
8936 {
8937 snprintf (out_buf, len-1, "%08x%08x",
8938 digest_buf[0],
8939 digest_buf[1]);
8940 }
8941 else if (hash_type == HASH_TYPE_ORACLEH)
8942 {
8943 snprintf (out_buf, len-1, "%08X%08X",
8944 digest_buf[0],
8945 digest_buf[1]);
8946 }
8947 else if (hash_type == HASH_TYPE_BCRYPT)
8948 {
8949 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8950 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8951
8952 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8953
8954 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8955 }
8956 else if (hash_type == HASH_TYPE_KECCAK)
8957 {
8958 uint *ptr = digest_buf;
8959
8960 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",
8961 ptr[ 1], ptr[ 0],
8962 ptr[ 3], ptr[ 2],
8963 ptr[ 5], ptr[ 4],
8964 ptr[ 7], ptr[ 6],
8965 ptr[ 9], ptr[ 8],
8966 ptr[11], ptr[10],
8967 ptr[13], ptr[12],
8968 ptr[15], ptr[14],
8969 ptr[17], ptr[16],
8970 ptr[19], ptr[18],
8971 ptr[21], ptr[20],
8972 ptr[23], ptr[22],
8973 ptr[25], ptr[24],
8974 ptr[27], ptr[26],
8975 ptr[29], ptr[28],
8976 ptr[31], ptr[30],
8977 ptr[33], ptr[32],
8978 ptr[35], ptr[34],
8979 ptr[37], ptr[36],
8980 ptr[39], ptr[38],
8981 ptr[41], ptr[30],
8982 ptr[43], ptr[42],
8983 ptr[45], ptr[44],
8984 ptr[47], ptr[46],
8985 ptr[49], ptr[48]
8986 );
8987
8988 out_buf[salt.keccak_mdlen * 2] = 0;
8989 }
8990 else if (hash_type == HASH_TYPE_RIPEMD160)
8991 {
8992 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8993 digest_buf[0],
8994 digest_buf[1],
8995 digest_buf[2],
8996 digest_buf[3],
8997 digest_buf[4]);
8998 }
8999 else if (hash_type == HASH_TYPE_WHIRLPOOL)
9000 {
9001 digest_buf[ 0] = digest_buf[ 0];
9002 digest_buf[ 1] = digest_buf[ 1];
9003 digest_buf[ 2] = digest_buf[ 2];
9004 digest_buf[ 3] = digest_buf[ 3];
9005 digest_buf[ 4] = digest_buf[ 4];
9006 digest_buf[ 5] = digest_buf[ 5];
9007 digest_buf[ 6] = digest_buf[ 6];
9008 digest_buf[ 7] = digest_buf[ 7];
9009 digest_buf[ 8] = digest_buf[ 8];
9010 digest_buf[ 9] = digest_buf[ 9];
9011 digest_buf[10] = digest_buf[10];
9012 digest_buf[11] = digest_buf[11];
9013 digest_buf[12] = digest_buf[12];
9014 digest_buf[13] = digest_buf[13];
9015 digest_buf[14] = digest_buf[14];
9016 digest_buf[15] = digest_buf[15];
9017
9018 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
9019 digest_buf[ 0],
9020 digest_buf[ 1],
9021 digest_buf[ 2],
9022 digest_buf[ 3],
9023 digest_buf[ 4],
9024 digest_buf[ 5],
9025 digest_buf[ 6],
9026 digest_buf[ 7],
9027 digest_buf[ 8],
9028 digest_buf[ 9],
9029 digest_buf[10],
9030 digest_buf[11],
9031 digest_buf[12],
9032 digest_buf[13],
9033 digest_buf[14],
9034 digest_buf[15]);
9035 }
9036 else if (hash_type == HASH_TYPE_GOST)
9037 {
9038 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
9039 digest_buf[0],
9040 digest_buf[1],
9041 digest_buf[2],
9042 digest_buf[3],
9043 digest_buf[4],
9044 digest_buf[5],
9045 digest_buf[6],
9046 digest_buf[7]);
9047 }
9048 else if (hash_type == HASH_TYPE_MYSQL)
9049 {
9050 snprintf (out_buf, len-1, "%08x%08x",
9051 digest_buf[0],
9052 digest_buf[1]);
9053 }
9054 else if (hash_type == HASH_TYPE_LOTUS5)
9055 {
9056 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
9057 digest_buf[0],
9058 digest_buf[1],
9059 digest_buf[2],
9060 digest_buf[3]);
9061 }
9062 else if (hash_type == HASH_TYPE_LOTUS6)
9063 {
9064 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
9065 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
9066 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
9067 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
9068
9069 char buf[16] = { 0 };
9070
9071 memcpy (buf + 0, salt.salt_buf, 5);
9072 memcpy (buf + 5, digest_buf, 9);
9073
9074 buf[3] -= -4;
9075
9076 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
9077
9078 tmp_buf[18] = salt.salt_buf_pc[7];
9079 tmp_buf[19] = 0;
9080
9081 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
9082 }
9083 else if (hash_type == HASH_TYPE_LOTUS8)
9084 {
9085 char buf[52] = { 0 };
9086
9087 // salt
9088
9089 memcpy (buf + 0, salt.salt_buf, 16);
9090
9091 buf[3] -= -4;
9092
9093 // iteration
9094
9095 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
9096
9097 // chars
9098
9099 buf[26] = salt.salt_buf_pc[0];
9100 buf[27] = salt.salt_buf_pc[1];
9101
9102 // digest
9103
9104 memcpy (buf + 28, digest_buf, 8);
9105
9106 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
9107
9108 tmp_buf[49] = 0;
9109
9110 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
9111 }
9112 else if (hash_type == HASH_TYPE_CRC32)
9113 {
9114 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
9115 }
9116 }
9117
9118 if (salt_type == SALT_TYPE_INTERN)
9119 {
9120 size_t pos = strlen (out_buf);
9121
9122 out_buf[pos] = data.separator;
9123
9124 char *ptr = (char *) salt.salt_buf;
9125
9126 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
9127
9128 out_buf[pos + 1 + salt.salt_len] = 0;
9129 }
9130 }
9131
9132 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
9133 {
9134 memset (hccap, 0, sizeof (hccap_t));
9135
9136 salt_t *salt = &data.salts_buf[salt_pos];
9137
9138 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
9139
9140 wpa_t *wpas = (wpa_t *) data.esalts_buf;
9141 wpa_t *wpa = &wpas[salt_pos];
9142
9143 hccap->keyver = wpa->keyver;
9144
9145 hccap->eapol_size = wpa->eapol_size;
9146
9147 if (wpa->keyver != 1)
9148 {
9149 uint eapol_tmp[64] = { 0 };
9150
9151 for (uint i = 0; i < 64; i++)
9152 {
9153 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
9154 }
9155
9156 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
9157 }
9158 else
9159 {
9160 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
9161 }
9162
9163 memcpy (hccap->mac1, wpa->orig_mac1, 6);
9164 memcpy (hccap->mac2, wpa->orig_mac2, 6);
9165 memcpy (hccap->nonce1, wpa->orig_nonce1, 32);
9166 memcpy (hccap->nonce2, wpa->orig_nonce2, 32);
9167
9168 char *digests_buf_ptr = (char *) data.digests_buf;
9169
9170 uint dgst_size = data.dgst_size;
9171
9172 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
9173
9174 if (wpa->keyver != 1)
9175 {
9176 uint digest_tmp[4] = { 0 };
9177
9178 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
9179 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
9180 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
9181 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
9182
9183 memcpy (hccap->keymic, digest_tmp, 16);
9184 }
9185 else
9186 {
9187 memcpy (hccap->keymic, digest_ptr, 16);
9188 }
9189 }
9190
9191 void SuspendThreads ()
9192 {
9193 if (data.devices_status != STATUS_RUNNING) return;
9194
9195 hc_timer_set (&data.timer_paused);
9196
9197 data.devices_status = STATUS_PAUSED;
9198
9199 log_info ("Paused");
9200 }
9201
9202 void ResumeThreads ()
9203 {
9204 if (data.devices_status != STATUS_PAUSED) return;
9205
9206 double ms_paused;
9207
9208 hc_timer_get (data.timer_paused, ms_paused);
9209
9210 data.ms_paused += ms_paused;
9211
9212 data.devices_status = STATUS_RUNNING;
9213
9214 log_info ("Resumed");
9215 }
9216
9217 void bypass ()
9218 {
9219 data.devices_status = STATUS_BYPASS;
9220
9221 log_info ("Next dictionary / mask in queue selected, bypassing current one");
9222 }
9223
9224 void stop_at_checkpoint ()
9225 {
9226 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9227 {
9228 if (data.devices_status != STATUS_RUNNING) return;
9229 }
9230
9231 // this feature only makes sense if --restore-disable was not specified
9232
9233 if (data.restore_disable == 1)
9234 {
9235 log_info ("WARNING: This feature is disabled when --restore-disable is specified");
9236
9237 return;
9238 }
9239
9240 // check if monitoring of Restore Point updates should be enabled or disabled
9241
9242 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9243 {
9244 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
9245
9246 // save the current restore point value
9247
9248 data.checkpoint_cur_words = get_lowest_words_done ();
9249
9250 log_info ("Checkpoint enabled: Will quit at next Restore Point update");
9251 }
9252 else
9253 {
9254 data.devices_status = STATUS_RUNNING;
9255
9256 // reset the global value for checkpoint checks
9257
9258 data.checkpoint_cur_words = 0;
9259
9260 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
9261 }
9262 }
9263
9264 void myabort ()
9265 {
9266 data.devices_status = STATUS_ABORTED;
9267 }
9268
9269 void myquit ()
9270 {
9271 data.devices_status = STATUS_QUIT;
9272 }
9273
9274 void naive_replace (char *s, const u8 key_char, const u8 replace_char)
9275 {
9276 const size_t len = strlen (s);
9277
9278 for (size_t in = 0; in < len; in++)
9279 {
9280 const u8 c = s[in];
9281
9282 if (c == key_char)
9283 {
9284 s[in] = replace_char;
9285 }
9286 }
9287 }
9288
9289 void naive_escape (char *s, size_t s_max, const u8 key_char, const u8 escape_char)
9290 {
9291 char s_escaped[1024] = { 0 };
9292
9293 size_t s_escaped_max = sizeof (s_escaped);
9294
9295 const size_t len = strlen (s);
9296
9297 for (size_t in = 0, out = 0; in < len; in++, out++)
9298 {
9299 const u8 c = s[in];
9300
9301 if (c == key_char)
9302 {
9303 s_escaped[out] = escape_char;
9304
9305 out++;
9306 }
9307
9308 if (out == s_escaped_max - 2) break;
9309
9310 s_escaped[out] = c;
9311 }
9312
9313 strncpy (s, s_escaped, s_max - 1);
9314 }
9315
9316 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
9317 {
9318 FILE *fp = fopen (kernel_file, "rb");
9319
9320 if (fp != NULL)
9321 {
9322 struct stat st;
9323
9324 memset (&st, 0, sizeof (st));
9325
9326 stat (kernel_file, &st);
9327
9328 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
9329
9330 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
9331
9332 if (num_read != (size_t) st.st_size)
9333 {
9334 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9335
9336 exit (-1);
9337 }
9338
9339 fclose (fp);
9340
9341 buf[st.st_size] = 0;
9342
9343 for (int i = 0; i < num_devices; i++)
9344 {
9345 kernel_lengths[i] = (size_t) st.st_size;
9346
9347 kernel_sources[i] = buf;
9348 }
9349 }
9350 else
9351 {
9352 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9353
9354 exit (-1);
9355 }
9356
9357 return;
9358 }
9359
9360 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
9361 {
9362 if (binary_size > 0)
9363 {
9364 FILE *fp = fopen (dst, "wb");
9365
9366 lock_file (fp);
9367 fwrite (binary, sizeof (u8), binary_size, fp);
9368
9369 fflush (fp);
9370 fclose (fp);
9371 }
9372 }
9373
9374 /**
9375 * restore
9376 */
9377
9378 restore_data_t *init_restore (int argc, char **argv)
9379 {
9380 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
9381
9382 if (data.restore_disable == 0)
9383 {
9384 FILE *fp = fopen (data.eff_restore_file, "rb");
9385
9386 if (fp)
9387 {
9388 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
9389
9390 if (nread != 1)
9391 {
9392 log_error ("ERROR: Cannot read %s", data.eff_restore_file);
9393
9394 exit (-1);
9395 }
9396
9397 fclose (fp);
9398
9399 if (rd->pid)
9400 {
9401 char *pidbin = (char *) mymalloc (HCBUFSIZ);
9402
9403 int pidbin_len = -1;
9404
9405 #ifdef _POSIX
9406 snprintf (pidbin, HCBUFSIZ - 1, "/proc/%d/cmdline", rd->pid);
9407
9408 FILE *fd = fopen (pidbin, "rb");
9409
9410 if (fd)
9411 {
9412 pidbin_len = fread (pidbin, 1, HCBUFSIZ, fd);
9413
9414 pidbin[pidbin_len] = 0;
9415
9416 fclose (fd);
9417
9418 char *argv0_r = strrchr (argv[0], '/');
9419
9420 char *pidbin_r = strrchr (pidbin, '/');
9421
9422 if (argv0_r == NULL) argv0_r = argv[0];
9423
9424 if (pidbin_r == NULL) pidbin_r = pidbin;
9425
9426 if (strcmp (argv0_r, pidbin_r) == 0)
9427 {
9428 log_error ("ERROR: Already an instance %s running on pid %d", pidbin, rd->pid);
9429
9430 exit (-1);
9431 }
9432 }
9433
9434 #elif _WIN
9435 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
9436
9437 char *pidbin2 = (char *) mymalloc (HCBUFSIZ);
9438
9439 int pidbin2_len = -1;
9440
9441 pidbin_len = GetModuleFileName (NULL, pidbin, HCBUFSIZ);
9442 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, HCBUFSIZ);
9443
9444 pidbin[pidbin_len] = 0;
9445 pidbin2[pidbin2_len] = 0;
9446
9447 if (pidbin2_len)
9448 {
9449 if (strcmp (pidbin, pidbin2) == 0)
9450 {
9451 log_error ("ERROR: Already an instance %s running on pid %d", pidbin2, rd->pid);
9452
9453 exit (-1);
9454 }
9455 }
9456
9457 myfree (pidbin2);
9458
9459 #endif
9460
9461 myfree (pidbin);
9462 }
9463
9464 if (rd->version_bin < RESTORE_MIN)
9465 {
9466 log_error ("ERROR: Cannot use outdated %s. Please remove it.", data.eff_restore_file);
9467
9468 exit (-1);
9469 }
9470 }
9471 }
9472
9473 memset (rd, 0, sizeof (restore_data_t));
9474
9475 rd->version_bin = VERSION_BIN;
9476
9477 #ifdef _POSIX
9478 rd->pid = getpid ();
9479 #elif _WIN
9480 rd->pid = GetCurrentProcessId ();
9481 #endif
9482
9483 if (getcwd (rd->cwd, 255) == NULL)
9484 {
9485 myfree (rd);
9486
9487 return (NULL);
9488 }
9489
9490 rd->argc = argc;
9491 rd->argv = argv;
9492
9493 return (rd);
9494 }
9495
9496 void read_restore (const char *eff_restore_file, restore_data_t *rd)
9497 {
9498 FILE *fp = fopen (eff_restore_file, "rb");
9499
9500 if (fp == NULL)
9501 {
9502 log_error ("ERROR: Restore file '%s': %s", eff_restore_file, strerror (errno));
9503
9504 exit (-1);
9505 }
9506
9507 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
9508 {
9509 log_error ("ERROR: Can't read %s", eff_restore_file);
9510
9511 exit (-1);
9512 }
9513
9514 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
9515
9516 char *buf = (char *) mymalloc (HCBUFSIZ);
9517
9518 for (uint i = 0; i < rd->argc; i++)
9519 {
9520 if (fgets (buf, HCBUFSIZ - 1, fp) == NULL)
9521 {
9522 log_error ("ERROR: Can't read %s", eff_restore_file);
9523
9524 exit (-1);
9525 }
9526
9527 size_t len = strlen (buf);
9528
9529 if (len) buf[len - 1] = 0;
9530
9531 rd->argv[i] = mystrdup (buf);
9532 }
9533
9534 myfree (buf);
9535
9536 fclose (fp);
9537
9538 log_info ("INFO: Changing current working directory to the path found within the .restore file: '%s'", rd->cwd);
9539
9540 if (chdir (rd->cwd))
9541 {
9542 log_error ("ERROR: The directory '%s' does not exist. It is needed to restore (--restore) the session.\n"
9543 " You could either create this directory (or link it) or update the .restore file using e.g. the analyze_hc_restore.pl tool:\n"
9544 " https://github.com/philsmd/analyze_hc_restore\n"
9545 " The directory must be relative to (or contain) all files/folders mentioned within the command line.", rd->cwd);
9546
9547 exit (-1);
9548 }
9549 }
9550
9551 u64 get_lowest_words_done ()
9552 {
9553 u64 words_cur = -1;
9554
9555 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
9556 {
9557 hc_device_param_t *device_param = &data.devices_param[device_id];
9558
9559 if (device_param->skipped) continue;
9560
9561 const u64 words_done = device_param->words_done;
9562
9563 if (words_done < words_cur) words_cur = words_done;
9564 }
9565
9566 // It's possible that a device's workload isn't finished right after a restore-case.
9567 // In that case, this function would return 0 and overwrite the real restore point
9568 // There's also data.words_cur which is set to rd->words_cur but it changes while
9569 // the attack is running therefore we should stick to rd->words_cur.
9570 // Note that -s influences rd->words_cur we should keep a close look on that.
9571
9572 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
9573
9574 return words_cur;
9575 }
9576
9577 void write_restore (const char *new_restore_file, restore_data_t *rd)
9578 {
9579 u64 words_cur = get_lowest_words_done ();
9580
9581 rd->words_cur = words_cur;
9582
9583 FILE *fp = fopen (new_restore_file, "wb");
9584
9585 if (fp == NULL)
9586 {
9587 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
9588
9589 exit (-1);
9590 }
9591
9592 if (setvbuf (fp, NULL, _IONBF, 0))
9593 {
9594 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
9595
9596 exit (-1);
9597 }
9598
9599 fwrite (rd, sizeof (restore_data_t), 1, fp);
9600
9601 for (uint i = 0; i < rd->argc; i++)
9602 {
9603 fprintf (fp, "%s", rd->argv[i]);
9604 fputc ('\n', fp);
9605 }
9606
9607 fflush (fp);
9608
9609 fsync (fileno (fp));
9610
9611 fclose (fp);
9612 }
9613
9614 void cycle_restore ()
9615 {
9616 const char *eff_restore_file = data.eff_restore_file;
9617 const char *new_restore_file = data.new_restore_file;
9618
9619 restore_data_t *rd = data.rd;
9620
9621 write_restore (new_restore_file, rd);
9622
9623 struct stat st;
9624
9625 memset (&st, 0, sizeof(st));
9626
9627 if (stat (eff_restore_file, &st) == 0)
9628 {
9629 if (unlink (eff_restore_file))
9630 {
9631 log_info ("WARN: Unlink file '%s': %s", eff_restore_file, strerror (errno));
9632 }
9633 }
9634
9635 if (rename (new_restore_file, eff_restore_file))
9636 {
9637 log_info ("WARN: Rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
9638 }
9639 }
9640
9641 void check_checkpoint ()
9642 {
9643 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9644
9645 u64 words_cur = get_lowest_words_done ();
9646
9647 if (words_cur != data.checkpoint_cur_words)
9648 {
9649 myabort ();
9650 }
9651 }
9652
9653 /**
9654 * tuning db
9655 */
9656
9657 void tuning_db_destroy (tuning_db_t *tuning_db)
9658 {
9659 int i;
9660
9661 for (i = 0; i < tuning_db->alias_cnt; i++)
9662 {
9663 tuning_db_alias_t *alias = &tuning_db->alias_buf[i];
9664
9665 myfree (alias->device_name);
9666 myfree (alias->alias_name);
9667 }
9668
9669 for (i = 0; i < tuning_db->entry_cnt; i++)
9670 {
9671 tuning_db_entry_t *entry = &tuning_db->entry_buf[i];
9672
9673 myfree (entry->device_name);
9674 }
9675
9676 myfree (tuning_db->alias_buf);
9677 myfree (tuning_db->entry_buf);
9678
9679 myfree (tuning_db);
9680 }
9681
9682 tuning_db_t *tuning_db_alloc (FILE *fp)
9683 {
9684 tuning_db_t *tuning_db = (tuning_db_t *) mymalloc (sizeof (tuning_db_t));
9685
9686 int num_lines = count_lines (fp);
9687
9688 // a bit over-allocated
9689
9690 tuning_db->alias_buf = (tuning_db_alias_t *) mycalloc (num_lines + 1, sizeof (tuning_db_alias_t));
9691 tuning_db->alias_cnt = 0;
9692
9693 tuning_db->entry_buf = (tuning_db_entry_t *) mycalloc (num_lines + 1, sizeof (tuning_db_entry_t));
9694 tuning_db->entry_cnt = 0;
9695
9696 return tuning_db;
9697 }
9698
9699 tuning_db_t *tuning_db_init (const char *tuning_db_file)
9700 {
9701 FILE *fp = fopen (tuning_db_file, "rb");
9702
9703 if (fp == NULL)
9704 {
9705 log_error ("%s: %s", tuning_db_file, strerror (errno));
9706
9707 exit (-1);
9708 }
9709
9710 tuning_db_t *tuning_db = tuning_db_alloc (fp);
9711
9712 rewind (fp);
9713
9714 int line_num = 0;
9715
9716 char *buf = (char *) mymalloc (HCBUFSIZ);
9717
9718 while (!feof (fp))
9719 {
9720 char *line_buf = fgets (buf, HCBUFSIZ - 1, fp);
9721
9722 if (line_buf == NULL) break;
9723
9724 line_num++;
9725
9726 const int line_len = in_superchop (line_buf);
9727
9728 if (line_len == 0) continue;
9729
9730 if (line_buf[0] == '#') continue;
9731
9732 // start processing
9733
9734 char *token_ptr[7] = { NULL };
9735
9736 int token_cnt = 0;
9737
9738 char *next = strtok (line_buf, "\t ");
9739
9740 token_ptr[token_cnt] = next;
9741
9742 token_cnt++;
9743
9744 while ((next = strtok (NULL, "\t ")) != NULL)
9745 {
9746 token_ptr[token_cnt] = next;
9747
9748 token_cnt++;
9749 }
9750
9751 if (token_cnt == 2)
9752 {
9753 char *device_name = token_ptr[0];
9754 char *alias_name = token_ptr[1];
9755
9756 tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt];
9757
9758 alias->device_name = mystrdup (device_name);
9759 alias->alias_name = mystrdup (alias_name);
9760
9761 tuning_db->alias_cnt++;
9762 }
9763 else if (token_cnt == 6)
9764 {
9765 if ((token_ptr[1][0] != '0') &&
9766 (token_ptr[1][0] != '1') &&
9767 (token_ptr[1][0] != '3') &&
9768 (token_ptr[1][0] != '*'))
9769 {
9770 log_info ("WARNING: Tuning-db: Invalid attack_mode '%c' in Line '%u'", token_ptr[1][0], line_num);
9771
9772 continue;
9773 }
9774
9775 if ((token_ptr[3][0] != '1') &&
9776 (token_ptr[3][0] != '2') &&
9777 (token_ptr[3][0] != '4') &&
9778 (token_ptr[3][0] != '8') &&
9779 (token_ptr[3][0] != 'N'))
9780 {
9781 log_info ("WARNING: Tuning-db: Invalid vector_width '%c' in Line '%u'", token_ptr[3][0], line_num);
9782
9783 continue;
9784 }
9785
9786 char *device_name = token_ptr[0];
9787
9788 int attack_mode = -1;
9789 int hash_type = -1;
9790 int vector_width = -1;
9791 int kernel_accel = -1;
9792 int kernel_loops = -1;
9793
9794 if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]);
9795 if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]);
9796 if (token_ptr[3][0] != 'N') vector_width = atoi (token_ptr[3]);
9797
9798 if (token_ptr[4][0] != 'A')
9799 {
9800 kernel_accel = atoi (token_ptr[4]);
9801
9802 if ((kernel_accel < 1) || (kernel_accel > 1024))
9803 {
9804 log_info ("WARNING: Tuning-db: Invalid kernel_accel '%d' in Line '%u'", kernel_accel, line_num);
9805
9806 continue;
9807 }
9808 }
9809 else
9810 {
9811 kernel_accel = 0;
9812 }
9813
9814 if (token_ptr[5][0] != 'A')
9815 {
9816 kernel_loops = atoi (token_ptr[5]);
9817
9818 if ((kernel_loops < 1) || (kernel_loops > 1024))
9819 {
9820 log_info ("WARNING: Tuning-db: Invalid kernel_loops '%d' in Line '%u'", kernel_loops, line_num);
9821
9822 continue;
9823 }
9824 }
9825 else
9826 {
9827 kernel_loops = 0;
9828 }
9829
9830 tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt];
9831
9832 entry->device_name = mystrdup (device_name);
9833 entry->attack_mode = attack_mode;
9834 entry->hash_type = hash_type;
9835 entry->vector_width = vector_width;
9836 entry->kernel_accel = kernel_accel;
9837 entry->kernel_loops = kernel_loops;
9838
9839 tuning_db->entry_cnt++;
9840 }
9841 else
9842 {
9843 log_info ("WARNING: Tuning-db: Invalid number of token in Line '%u'", line_num);
9844
9845 continue;
9846 }
9847 }
9848
9849 myfree (buf);
9850
9851 fclose (fp);
9852
9853 // todo: print loaded 'cnt' message
9854
9855 // sort the database
9856
9857 qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9858 qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9859
9860 return tuning_db;
9861 }
9862
9863 tuning_db_entry_t *tuning_db_search (tuning_db_t *tuning_db, hc_device_param_t *device_param, int attack_mode, int hash_type)
9864 {
9865 static tuning_db_entry_t s;
9866
9867 // first we need to convert all spaces in the device_name to underscore
9868
9869 char *device_name_nospace = strdup (device_param->device_name);
9870
9871 int device_name_length = strlen (device_name_nospace);
9872
9873 int i;
9874
9875 for (i = 0; i < device_name_length; i++)
9876 {
9877 if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_';
9878 }
9879
9880 // find out if there's an alias configured
9881
9882 tuning_db_alias_t a;
9883
9884 a.device_name = device_name_nospace;
9885
9886 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);
9887
9888 char *alias_name = (alias == NULL) ? NULL : alias->alias_name;
9889
9890 // attack-mode 6 and 7 are attack-mode 1 basically
9891
9892 if (attack_mode == 6) attack_mode = 1;
9893 if (attack_mode == 7) attack_mode = 1;
9894
9895 // bsearch is not ideal but fast enough
9896
9897 s.device_name = device_name_nospace;
9898 s.attack_mode = attack_mode;
9899 s.hash_type = hash_type;
9900
9901 tuning_db_entry_t *entry = NULL;
9902
9903 // this will produce all 2^3 combinations required
9904
9905 for (i = 0; i < 8; i++)
9906 {
9907 s.device_name = (i & 1) ? "*" : device_name_nospace;
9908 s.attack_mode = (i & 2) ? -1 : attack_mode;
9909 s.hash_type = (i & 4) ? -1 : hash_type;
9910
9911 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9912
9913 if (entry != NULL) break;
9914
9915 // in non-wildcard mode do some additional checks:
9916
9917 if ((i & 1) == 0)
9918 {
9919 // in case we have an alias-name
9920
9921 if (alias_name != NULL)
9922 {
9923 s.device_name = alias_name;
9924
9925 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9926
9927 if (entry != NULL) break;
9928 }
9929
9930 // or by device type
9931
9932 if (device_param->device_type & CL_DEVICE_TYPE_CPU)
9933 {
9934 s.device_name = "DEVICE_TYPE_CPU";
9935 }
9936 else if (device_param->device_type & CL_DEVICE_TYPE_GPU)
9937 {
9938 s.device_name = "DEVICE_TYPE_GPU";
9939 }
9940 else if (device_param->device_type & CL_DEVICE_TYPE_ACCELERATOR)
9941 {
9942 s.device_name = "DEVICE_TYPE_ACCELERATOR";
9943 }
9944
9945 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9946
9947 if (entry != NULL) break;
9948 }
9949 }
9950
9951 // free converted device_name
9952
9953 myfree (device_name_nospace);
9954
9955 return entry;
9956 }
9957
9958 /**
9959 * parser
9960 */
9961
9962 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9963 {
9964 u8 tmp[256] = { 0 };
9965
9966 if (salt_len > sizeof (tmp))
9967 {
9968 return UINT_MAX;
9969 }
9970
9971 memcpy (tmp, in, salt_len);
9972
9973 if (data.opts_type & OPTS_TYPE_ST_HEX)
9974 {
9975 if ((salt_len % 2) == 0)
9976 {
9977 u32 new_salt_len = salt_len / 2;
9978
9979 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9980 {
9981 u8 p0 = tmp[j + 0];
9982 u8 p1 = tmp[j + 1];
9983
9984 tmp[i] = hex_convert (p1) << 0;
9985 tmp[i] |= hex_convert (p0) << 4;
9986 }
9987
9988 salt_len = new_salt_len;
9989 }
9990 else
9991 {
9992 return UINT_MAX;
9993 }
9994 }
9995 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9996 {
9997 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9998 }
9999
10000 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
10001
10002 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
10003 {
10004 if (salt_len < 20)
10005 {
10006 u32 *tmp_uint = (u32 *) tmp;
10007
10008 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
10009 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
10010 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
10011 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
10012 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
10013 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
10014 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
10015 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
10016 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
10017 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
10018
10019 salt_len = salt_len * 2;
10020 }
10021 else
10022 {
10023 return UINT_MAX;
10024 }
10025 }
10026
10027 if (data.opts_type & OPTS_TYPE_ST_LOWER)
10028 {
10029 lowercase (tmp, salt_len);
10030 }
10031
10032 if (data.opts_type & OPTS_TYPE_ST_UPPER)
10033 {
10034 uppercase (tmp, salt_len);
10035 }
10036
10037 u32 len = salt_len;
10038
10039 if (data.opts_type & OPTS_TYPE_ST_ADD80)
10040 {
10041 tmp[len++] = 0x80;
10042 }
10043
10044 if (data.opts_type & OPTS_TYPE_ST_ADD01)
10045 {
10046 tmp[len++] = 0x01;
10047 }
10048
10049 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
10050 {
10051 u32 *tmp_uint = (uint *) tmp;
10052
10053 u32 max = len / 4;
10054
10055 if (len % 4) max++;
10056
10057 for (u32 i = 0; i < max; i++)
10058 {
10059 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
10060 }
10061
10062 // Important: we may need to increase the length of memcpy since
10063 // we don't want to "loose" some swapped bytes (could happen if
10064 // they do not perfectly fit in the 4-byte blocks)
10065 // Memcpy does always copy the bytes in the BE order, but since
10066 // we swapped them, some important bytes could be in positions
10067 // we normally skip with the original len
10068
10069 if (len % 4) len += 4 - (len % 4);
10070 }
10071
10072 memcpy (out, tmp, len);
10073
10074 return (salt_len);
10075 }
10076
10077 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10078 {
10079 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
10080
10081 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
10082
10083 u32 *digest = (u32 *) hash_buf->digest;
10084
10085 salt_t *salt = hash_buf->salt;
10086
10087 memcpy ((char *) salt->salt_sign, input_buf, 6);
10088
10089 char *iter_pos = input_buf + 4;
10090
10091 salt->salt_iter = 1 << atoi (iter_pos);
10092
10093 char *salt_pos = strchr (iter_pos, '$');
10094
10095 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10096
10097 salt_pos++;
10098
10099 uint salt_len = 16;
10100
10101 salt->salt_len = salt_len;
10102
10103 u8 tmp_buf[100] = { 0 };
10104
10105 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
10106
10107 char *salt_buf_ptr = (char *) salt->salt_buf;
10108
10109 memcpy (salt_buf_ptr, tmp_buf, 16);
10110
10111 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
10112 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
10113 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
10114 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
10115
10116 char *hash_pos = salt_pos + 22;
10117
10118 memset (tmp_buf, 0, sizeof (tmp_buf));
10119
10120 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
10121
10122 memcpy (digest, tmp_buf, 24);
10123
10124 digest[0] = byte_swap_32 (digest[0]);
10125 digest[1] = byte_swap_32 (digest[1]);
10126 digest[2] = byte_swap_32 (digest[2]);
10127 digest[3] = byte_swap_32 (digest[3]);
10128 digest[4] = byte_swap_32 (digest[4]);
10129 digest[5] = byte_swap_32 (digest[5]);
10130
10131 digest[5] &= ~0xff; // its just 23 not 24 !
10132
10133 return (PARSER_OK);
10134 }
10135
10136 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10137 {
10138 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
10139
10140 u32 *digest = (u32 *) hash_buf->digest;
10141
10142 u8 tmp_buf[100] = { 0 };
10143
10144 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
10145
10146 memcpy (digest, tmp_buf, 32);
10147
10148 digest[0] = byte_swap_32 (digest[0]);
10149 digest[1] = byte_swap_32 (digest[1]);
10150 digest[2] = byte_swap_32 (digest[2]);
10151 digest[3] = byte_swap_32 (digest[3]);
10152 digest[4] = byte_swap_32 (digest[4]);
10153 digest[5] = byte_swap_32 (digest[5]);
10154 digest[6] = byte_swap_32 (digest[6]);
10155 digest[7] = byte_swap_32 (digest[7]);
10156
10157 digest[0] -= SHA256M_A;
10158 digest[1] -= SHA256M_B;
10159 digest[2] -= SHA256M_C;
10160 digest[3] -= SHA256M_D;
10161 digest[4] -= SHA256M_E;
10162 digest[5] -= SHA256M_F;
10163 digest[6] -= SHA256M_G;
10164 digest[7] -= SHA256M_H;
10165
10166 return (PARSER_OK);
10167 }
10168
10169 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10170 {
10171 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
10172
10173 u32 *digest = (u32 *) hash_buf->digest;
10174
10175 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10176 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10177
10178 digest[0] = byte_swap_32 (digest[0]);
10179 digest[1] = byte_swap_32 (digest[1]);
10180
10181 uint tt;
10182
10183 IP (digest[0], digest[1], tt);
10184
10185 digest[0] = digest[0];
10186 digest[1] = digest[1];
10187 digest[2] = 0;
10188 digest[3] = 0;
10189
10190 return (PARSER_OK);
10191 }
10192
10193 int arubaos_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10194 {
10195 if ((input_len < DISPLAY_LEN_MIN_125) || (input_len > DISPLAY_LEN_MAX_125)) return (PARSER_GLOBAL_LENGTH);
10196
10197 if ((input_buf[8] != '0') || (input_buf[9] != '1')) return (PARSER_SIGNATURE_UNMATCHED);
10198
10199 u32 *digest = (u32 *) hash_buf->digest;
10200
10201 salt_t *salt = hash_buf->salt;
10202
10203 char *hash_pos = input_buf + 10;
10204
10205 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10206 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10207 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10208 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10209 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10210
10211 digest[0] -= SHA1M_A;
10212 digest[1] -= SHA1M_B;
10213 digest[2] -= SHA1M_C;
10214 digest[3] -= SHA1M_D;
10215 digest[4] -= SHA1M_E;
10216
10217 uint salt_len = 10;
10218
10219 char *salt_buf_ptr = (char *) salt->salt_buf;
10220
10221 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10222
10223 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10224
10225 salt->salt_len = salt_len;
10226
10227 return (PARSER_OK);
10228 }
10229
10230 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10231 {
10232 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
10233
10234 u32 *digest = (u32 *) hash_buf->digest;
10235
10236 salt_t *salt = hash_buf->salt;
10237
10238 char *hash_pos = input_buf + 8;
10239
10240 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10241 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10242 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10243 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10244 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10245
10246 digest[0] -= SHA1M_A;
10247 digest[1] -= SHA1M_B;
10248 digest[2] -= SHA1M_C;
10249 digest[3] -= SHA1M_D;
10250 digest[4] -= SHA1M_E;
10251
10252 uint salt_len = 8;
10253
10254 char *salt_buf_ptr = (char *) salt->salt_buf;
10255
10256 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10257
10258 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10259
10260 salt->salt_len = salt_len;
10261
10262 return (PARSER_OK);
10263 }
10264
10265 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10266 {
10267 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
10268
10269 u64 *digest = (u64 *) hash_buf->digest;
10270
10271 salt_t *salt = hash_buf->salt;
10272
10273 char *hash_pos = input_buf + 8;
10274
10275 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
10276 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
10277 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
10278 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
10279 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
10280 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
10281 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
10282 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
10283
10284 digest[0] -= SHA512M_A;
10285 digest[1] -= SHA512M_B;
10286 digest[2] -= SHA512M_C;
10287 digest[3] -= SHA512M_D;
10288 digest[4] -= SHA512M_E;
10289 digest[5] -= SHA512M_F;
10290 digest[6] -= SHA512M_G;
10291 digest[7] -= SHA512M_H;
10292
10293 uint salt_len = 8;
10294
10295 char *salt_buf_ptr = (char *) salt->salt_buf;
10296
10297 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10298
10299 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10300
10301 salt->salt_len = salt_len;
10302
10303 return (PARSER_OK);
10304 }
10305
10306 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10307 {
10308 if (data.opts_type & OPTS_TYPE_ST_HEX)
10309 {
10310 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
10311 }
10312 else
10313 {
10314 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
10315 }
10316
10317 u32 *digest = (u32 *) hash_buf->digest;
10318
10319 salt_t *salt = hash_buf->salt;
10320
10321 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10322 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10323 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10324 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10325
10326 digest[0] = byte_swap_32 (digest[0]);
10327 digest[1] = byte_swap_32 (digest[1]);
10328 digest[2] = byte_swap_32 (digest[2]);
10329 digest[3] = byte_swap_32 (digest[3]);
10330
10331 digest[0] -= MD5M_A;
10332 digest[1] -= MD5M_B;
10333 digest[2] -= MD5M_C;
10334 digest[3] -= MD5M_D;
10335
10336 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10337
10338 uint salt_len = input_len - 32 - 1;
10339
10340 char *salt_buf = input_buf + 32 + 1;
10341
10342 char *salt_buf_ptr = (char *) salt->salt_buf;
10343
10344 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10345
10346 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10347
10348 salt->salt_len = salt_len;
10349
10350 return (PARSER_OK);
10351 }
10352
10353 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10354 {
10355 if (data.opts_type & OPTS_TYPE_ST_HEX)
10356 {
10357 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
10358 }
10359 else
10360 {
10361 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
10362 }
10363
10364 // unscramble
10365
10366 char clean_input_buf[32] = { 0 };
10367
10368 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
10369 int pos[6] = { 0, 6, 12, 17, 23, 29 };
10370
10371 for (int i = 0, j = 0, k = 0; i < 30; i++)
10372 {
10373 if (i == pos[j])
10374 {
10375 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
10376
10377 j++;
10378 }
10379 else
10380 {
10381 clean_input_buf[k] = input_buf[i];
10382
10383 k++;
10384 }
10385 }
10386
10387 // base64 decode
10388
10389 u32 *digest = (u32 *) hash_buf->digest;
10390
10391 salt_t *salt = hash_buf->salt;
10392
10393 u32 a, b, c, d, e, f;
10394
10395 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
10396 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
10397 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
10398 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
10399 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
10400 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
10401
10402 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
10403 | (((d << 12) | (e << 6) | (f)) << 0);
10404
10405 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
10406 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
10407 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
10408 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
10409 e = base64_to_int (clean_input_buf[10] & 0x7f);
10410 f = base64_to_int (clean_input_buf[11] & 0x7f);
10411
10412 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
10413 | (((d << 12) | (e << 6) | (f)) << 0);
10414
10415 a = base64_to_int (clean_input_buf[12] & 0x7f);
10416 b = base64_to_int (clean_input_buf[13] & 0x7f);
10417 c = base64_to_int (clean_input_buf[14] & 0x7f);
10418 d = base64_to_int (clean_input_buf[15] & 0x7f);
10419 e = base64_to_int (clean_input_buf[16] & 0x7f);
10420 f = base64_to_int (clean_input_buf[17] & 0x7f);
10421
10422 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
10423 | (((d << 12) | (e << 6) | (f)) << 0);
10424
10425 a = base64_to_int (clean_input_buf[18] & 0x7f);
10426 b = base64_to_int (clean_input_buf[19] & 0x7f);
10427 c = base64_to_int (clean_input_buf[20] & 0x7f);
10428 d = base64_to_int (clean_input_buf[21] & 0x7f);
10429 e = base64_to_int (clean_input_buf[22] & 0x7f);
10430 f = base64_to_int (clean_input_buf[23] & 0x7f);
10431
10432 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
10433 | (((d << 12) | (e << 6) | (f)) << 0);
10434
10435 digest[0] = byte_swap_32 (digest[0]);
10436 digest[1] = byte_swap_32 (digest[1]);
10437 digest[2] = byte_swap_32 (digest[2]);
10438 digest[3] = byte_swap_32 (digest[3]);
10439
10440 digest[0] -= MD5M_A;
10441 digest[1] -= MD5M_B;
10442 digest[2] -= MD5M_C;
10443 digest[3] -= MD5M_D;
10444
10445 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
10446
10447 uint salt_len = input_len - 30 - 1;
10448
10449 char *salt_buf = input_buf + 30 + 1;
10450
10451 char *salt_buf_ptr = (char *) salt->salt_buf;
10452
10453 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10454
10455 // max. salt length: 55 (max for MD5) - 22 (":Administration Tools:") - 1 (0x80) = 32
10456 // 32 - 4 bytes (to fit w0lr for all attack modes) = 28
10457
10458 if (salt_len > 28) return (PARSER_SALT_LENGTH);
10459
10460 salt->salt_len = salt_len;
10461
10462 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
10463
10464 salt->salt_len += 22;
10465
10466 return (PARSER_OK);
10467 }
10468
10469 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10470 {
10471 if (data.opts_type & OPTS_TYPE_ST_HEX)
10472 {
10473 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
10474 }
10475 else
10476 {
10477 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
10478 }
10479
10480 u32 *digest = (u32 *) hash_buf->digest;
10481
10482 salt_t *salt = hash_buf->salt;
10483
10484 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10485 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10486 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10487 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10488 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
10489
10490 digest[0] -= SHA1M_A;
10491 digest[1] -= SHA1M_B;
10492 digest[2] -= SHA1M_C;
10493 digest[3] -= SHA1M_D;
10494 digest[4] -= SHA1M_E;
10495
10496 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10497
10498 uint salt_len = input_len - 40 - 1;
10499
10500 char *salt_buf = input_buf + 40 + 1;
10501
10502 char *salt_buf_ptr = (char *) salt->salt_buf;
10503
10504 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10505
10506 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10507
10508 salt->salt_len = salt_len;
10509
10510 return (PARSER_OK);
10511 }
10512
10513 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10514 {
10515 if (data.opts_type & OPTS_TYPE_ST_HEX)
10516 {
10517 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
10518 }
10519 else
10520 {
10521 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
10522 }
10523
10524 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10525
10526 char *iter_pos = input_buf + 6;
10527
10528 salt_t *salt = hash_buf->salt;
10529
10530 uint iter = atoi (iter_pos);
10531
10532 if (iter < 1)
10533 {
10534 iter = ROUNDS_DCC2;
10535 }
10536
10537 salt->salt_iter = iter - 1;
10538
10539 char *salt_pos = strchr (iter_pos, '#');
10540
10541 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10542
10543 salt_pos++;
10544
10545 char *digest_pos = strchr (salt_pos, '#');
10546
10547 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10548
10549 digest_pos++;
10550
10551 uint salt_len = digest_pos - salt_pos - 1;
10552
10553 u32 *digest = (u32 *) hash_buf->digest;
10554
10555 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
10556 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
10557 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
10558 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
10559
10560 char *salt_buf_ptr = (char *) salt->salt_buf;
10561
10562 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10563
10564 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10565
10566 salt->salt_len = salt_len;
10567
10568 return (PARSER_OK);
10569 }
10570
10571 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10572 {
10573 u32 *digest = (u32 *) hash_buf->digest;
10574
10575 salt_t *salt = hash_buf->salt;
10576
10577 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
10578
10579 hccap_t in;
10580
10581 memcpy (&in, input_buf, input_len);
10582
10583 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
10584
10585 memcpy (digest, in.keymic, 16);
10586
10587 /*
10588 http://www.one-net.eu/jsw/j_sec/m_ptype.html
10589 The phrase "Pairwise key expansion"
10590 Access Point Address (referred to as Authenticator Address AA)
10591 Supplicant Address (referred to as Supplicant Address SA)
10592 Access Point Nonce (referred to as Authenticator Anonce)
10593 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
10594 */
10595
10596 uint salt_len = strlen (in.essid);
10597
10598 if (salt_len > 36)
10599 {
10600 log_info ("WARNING: The ESSID length is too long, the hccap file may be invalid or corrupted");
10601
10602 return (PARSER_SALT_LENGTH);
10603 }
10604
10605 memcpy (salt->salt_buf, in.essid, salt_len);
10606
10607 salt->salt_len = salt_len;
10608
10609 salt->salt_iter = ROUNDS_WPA2 - 1;
10610
10611 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
10612
10613 memcpy (pke_ptr, "Pairwise key expansion", 23);
10614
10615 if (memcmp (in.mac1, in.mac2, 6) < 0)
10616 {
10617 memcpy (pke_ptr + 23, in.mac1, 6);
10618 memcpy (pke_ptr + 29, in.mac2, 6);
10619 }
10620 else
10621 {
10622 memcpy (pke_ptr + 23, in.mac2, 6);
10623 memcpy (pke_ptr + 29, in.mac1, 6);
10624 }
10625
10626 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10627 {
10628 memcpy (pke_ptr + 35, in.nonce1, 32);
10629 memcpy (pke_ptr + 67, in.nonce2, 32);
10630 }
10631 else
10632 {
10633 memcpy (pke_ptr + 35, in.nonce2, 32);
10634 memcpy (pke_ptr + 67, in.nonce1, 32);
10635 }
10636
10637 for (int i = 0; i < 25; i++)
10638 {
10639 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10640 }
10641
10642 memcpy (wpa->orig_mac1, in.mac1, 6);
10643 memcpy (wpa->orig_mac2, in.mac2, 6);
10644 memcpy (wpa->orig_nonce1, in.nonce1, 32);
10645 memcpy (wpa->orig_nonce2, in.nonce2, 32);
10646
10647 wpa->keyver = in.keyver;
10648
10649 if (wpa->keyver > 255)
10650 {
10651 log_info ("ATTENTION!");
10652 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10653 log_info (" This could be due to a recent aircrack-ng bug.");
10654 log_info (" The key version was automatically reset to a reasonable value.");
10655 log_info ("");
10656
10657 wpa->keyver &= 0xff;
10658 }
10659
10660 wpa->eapol_size = in.eapol_size;
10661
10662 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10663
10664 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10665
10666 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10667
10668 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10669
10670 if (wpa->keyver == 1)
10671 {
10672 // nothing to do
10673 }
10674 else
10675 {
10676 digest[0] = byte_swap_32 (digest[0]);
10677 digest[1] = byte_swap_32 (digest[1]);
10678 digest[2] = byte_swap_32 (digest[2]);
10679 digest[3] = byte_swap_32 (digest[3]);
10680
10681 for (int i = 0; i < 64; i++)
10682 {
10683 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10684 }
10685 }
10686
10687 uint32_t *p0 = (uint32_t *) in.essid;
10688 uint32_t c0 = 0;
10689 uint32_t c1 = 0;
10690
10691 for (uint i = 0; i < sizeof (in.essid) / sizeof (uint32_t); i++) c0 ^= *p0++;
10692 for (uint i = 0; i < sizeof (wpa->pke) / sizeof (wpa->pke[0]); i++) c1 ^= wpa->pke[i];
10693
10694 salt->salt_buf[10] = c0;
10695 salt->salt_buf[11] = c1;
10696
10697 return (PARSER_OK);
10698 }
10699
10700 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10701 {
10702 u32 *digest = (u32 *) hash_buf->digest;
10703
10704 salt_t *salt = hash_buf->salt;
10705
10706 if (input_len == 0)
10707 {
10708 log_error ("Password Safe v2 container not specified");
10709
10710 exit (-1);
10711 }
10712
10713 FILE *fp = fopen (input_buf, "rb");
10714
10715 if (fp == NULL)
10716 {
10717 log_error ("%s: %s", input_buf, strerror (errno));
10718
10719 exit (-1);
10720 }
10721
10722 psafe2_hdr buf;
10723
10724 memset (&buf, 0, sizeof (psafe2_hdr));
10725
10726 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10727
10728 fclose (fp);
10729
10730 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10731
10732 salt->salt_buf[0] = buf.random[0];
10733 salt->salt_buf[1] = buf.random[1];
10734
10735 salt->salt_len = 8;
10736 salt->salt_iter = 1000;
10737
10738 digest[0] = byte_swap_32 (buf.hash[0]);
10739 digest[1] = byte_swap_32 (buf.hash[1]);
10740 digest[2] = byte_swap_32 (buf.hash[2]);
10741 digest[3] = byte_swap_32 (buf.hash[3]);
10742 digest[4] = byte_swap_32 (buf.hash[4]);
10743
10744 return (PARSER_OK);
10745 }
10746
10747 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10748 {
10749 u32 *digest = (u32 *) hash_buf->digest;
10750
10751 salt_t *salt = hash_buf->salt;
10752
10753 if (input_len == 0)
10754 {
10755 log_error (".psafe3 not specified");
10756
10757 exit (-1);
10758 }
10759
10760 FILE *fp = fopen (input_buf, "rb");
10761
10762 if (fp == NULL)
10763 {
10764 log_error ("%s: %s", input_buf, strerror (errno));
10765
10766 exit (-1);
10767 }
10768
10769 psafe3_t in;
10770
10771 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10772
10773 fclose (fp);
10774
10775 data.hashfile = input_buf; // we will need this in case it gets cracked
10776
10777 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10778
10779 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10780
10781 salt->salt_iter = in.iterations + 1;
10782
10783 salt->salt_buf[0] = in.salt_buf[0];
10784 salt->salt_buf[1] = in.salt_buf[1];
10785 salt->salt_buf[2] = in.salt_buf[2];
10786 salt->salt_buf[3] = in.salt_buf[3];
10787 salt->salt_buf[4] = in.salt_buf[4];
10788 salt->salt_buf[5] = in.salt_buf[5];
10789 salt->salt_buf[6] = in.salt_buf[6];
10790 salt->salt_buf[7] = in.salt_buf[7];
10791
10792 salt->salt_len = 32;
10793
10794 digest[0] = in.hash_buf[0];
10795 digest[1] = in.hash_buf[1];
10796 digest[2] = in.hash_buf[2];
10797 digest[3] = in.hash_buf[3];
10798 digest[4] = in.hash_buf[4];
10799 digest[5] = in.hash_buf[5];
10800 digest[6] = in.hash_buf[6];
10801 digest[7] = in.hash_buf[7];
10802
10803 digest[0] = byte_swap_32 (digest[0]);
10804 digest[1] = byte_swap_32 (digest[1]);
10805 digest[2] = byte_swap_32 (digest[2]);
10806 digest[3] = byte_swap_32 (digest[3]);
10807 digest[4] = byte_swap_32 (digest[4]);
10808 digest[5] = byte_swap_32 (digest[5]);
10809 digest[6] = byte_swap_32 (digest[6]);
10810 digest[7] = byte_swap_32 (digest[7]);
10811
10812 return (PARSER_OK);
10813 }
10814
10815 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10816 {
10817 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10818
10819 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10820
10821 u32 *digest = (u32 *) hash_buf->digest;
10822
10823 salt_t *salt = hash_buf->salt;
10824
10825 char *iter_pos = input_buf + 3;
10826
10827 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10828
10829 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10830
10831 memcpy ((char *) salt->salt_sign, input_buf, 4);
10832
10833 salt->salt_iter = salt_iter;
10834
10835 char *salt_pos = iter_pos + 1;
10836
10837 uint salt_len = 8;
10838
10839 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10840
10841 salt->salt_len = salt_len;
10842
10843 char *hash_pos = salt_pos + salt_len;
10844
10845 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10846
10847 return (PARSER_OK);
10848 }
10849
10850 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10851 {
10852 if (input_len < DISPLAY_LEN_MIN_500) return (PARSER_GLOBAL_LENGTH);
10853
10854 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10855
10856 u32 *digest = (u32 *) hash_buf->digest;
10857
10858 salt_t *salt = hash_buf->salt;
10859
10860 char *salt_pos = input_buf + 3;
10861
10862 uint iterations_len = 0;
10863
10864 if (memcmp (salt_pos, "rounds=", 7) == 0)
10865 {
10866 salt_pos += 7;
10867
10868 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10869
10870 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10871 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10872
10873 salt_pos[0] = 0x0;
10874
10875 salt->salt_iter = atoi (salt_pos - iterations_len);
10876
10877 salt_pos += 1;
10878
10879 iterations_len += 8;
10880 }
10881 else
10882 {
10883 salt->salt_iter = ROUNDS_MD5CRYPT;
10884 }
10885
10886 if (input_len > (DISPLAY_LEN_MAX_500 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10887
10888 char *hash_pos = strchr (salt_pos, '$');
10889
10890 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10891
10892 uint salt_len = hash_pos - salt_pos;
10893
10894 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10895
10896 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10897
10898 salt->salt_len = salt_len;
10899
10900 hash_pos++;
10901
10902 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10903
10904 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10905
10906 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10907
10908 return (PARSER_OK);
10909 }
10910
10911 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10912 {
10913 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10914
10915 u32 *digest = (u32 *) hash_buf->digest;
10916
10917 salt_t *salt = hash_buf->salt;
10918
10919 char *salt_pos = input_buf + 6;
10920
10921 uint iterations_len = 0;
10922
10923 if (memcmp (salt_pos, "rounds=", 7) == 0)
10924 {
10925 salt_pos += 7;
10926
10927 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10928
10929 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10930 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10931
10932 salt_pos[0] = 0x0;
10933
10934 salt->salt_iter = atoi (salt_pos - iterations_len);
10935
10936 salt_pos += 1;
10937
10938 iterations_len += 8;
10939 }
10940 else
10941 {
10942 salt->salt_iter = ROUNDS_MD5CRYPT;
10943 }
10944
10945 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10946
10947 char *hash_pos = strchr (salt_pos, '$');
10948
10949 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10950
10951 uint salt_len = hash_pos - salt_pos;
10952
10953 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10954
10955 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10956
10957 salt->salt_len = salt_len;
10958
10959 hash_pos++;
10960
10961 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10962
10963 return (PARSER_OK);
10964 }
10965
10966 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10967 {
10968 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10969
10970 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10971
10972 u32 *digest = (u32 *) hash_buf->digest;
10973
10974 salt_t *salt = hash_buf->salt;
10975
10976 char *salt_pos = input_buf + 14;
10977
10978 char *hash_pos = strchr (salt_pos, '*');
10979
10980 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10981
10982 hash_pos++;
10983
10984 uint salt_len = hash_pos - salt_pos - 1;
10985
10986 char *salt_buf_ptr = (char *) salt->salt_buf;
10987
10988 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10989
10990 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10991
10992 salt->salt_len = salt_len;
10993
10994 u8 tmp_buf[100] = { 0 };
10995
10996 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10997
10998 memcpy (digest, tmp_buf, 20);
10999
11000 digest[0] = byte_swap_32 (digest[0]);
11001 digest[1] = byte_swap_32 (digest[1]);
11002 digest[2] = byte_swap_32 (digest[2]);
11003 digest[3] = byte_swap_32 (digest[3]);
11004 digest[4] = byte_swap_32 (digest[4]);
11005
11006 digest[0] -= SHA1M_A;
11007 digest[1] -= SHA1M_B;
11008 digest[2] -= SHA1M_C;
11009 digest[3] -= SHA1M_D;
11010 digest[4] -= SHA1M_E;
11011
11012 return (PARSER_OK);
11013 }
11014
11015 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11016 {
11017 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
11018
11019 unsigned char c12 = itoa64_to_int (input_buf[12]);
11020
11021 if (c12 & 3) return (PARSER_HASH_VALUE);
11022
11023 u32 *digest = (u32 *) hash_buf->digest;
11024
11025 salt_t *salt = hash_buf->salt;
11026
11027 // for ascii_digest
11028 salt->salt_sign[0] = input_buf[0];
11029 salt->salt_sign[1] = input_buf[1];
11030
11031 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
11032 | itoa64_to_int (input_buf[1]) << 6;
11033
11034 salt->salt_len = 2;
11035
11036 u8 tmp_buf[100] = { 0 };
11037
11038 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
11039
11040 memcpy (digest, tmp_buf, 8);
11041
11042 uint tt;
11043
11044 IP (digest[0], digest[1], tt);
11045
11046 digest[2] = 0;
11047 digest[3] = 0;
11048
11049 return (PARSER_OK);
11050 }
11051
11052 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11053 {
11054 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
11055
11056 u32 *digest = (u32 *) hash_buf->digest;
11057
11058 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11059 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11060 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11061 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11062
11063 digest[0] = byte_swap_32 (digest[0]);
11064 digest[1] = byte_swap_32 (digest[1]);
11065 digest[2] = byte_swap_32 (digest[2]);
11066 digest[3] = byte_swap_32 (digest[3]);
11067
11068 digest[0] -= MD4M_A;
11069 digest[1] -= MD4M_B;
11070 digest[2] -= MD4M_C;
11071 digest[3] -= MD4M_D;
11072
11073 return (PARSER_OK);
11074 }
11075
11076 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11077 {
11078 if (data.opts_type & OPTS_TYPE_ST_HEX)
11079 {
11080 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
11081 }
11082 else
11083 {
11084 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
11085 }
11086
11087 u32 *digest = (u32 *) hash_buf->digest;
11088
11089 salt_t *salt = hash_buf->salt;
11090
11091 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11092 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11093 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11094 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11095
11096 digest[0] = byte_swap_32 (digest[0]);
11097 digest[1] = byte_swap_32 (digest[1]);
11098 digest[2] = byte_swap_32 (digest[2]);
11099 digest[3] = byte_swap_32 (digest[3]);
11100
11101 digest[0] -= MD4M_A;
11102 digest[1] -= MD4M_B;
11103 digest[2] -= MD4M_C;
11104 digest[3] -= MD4M_D;
11105
11106 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11107
11108 uint salt_len = input_len - 32 - 1;
11109
11110 char *salt_buf = input_buf + 32 + 1;
11111
11112 char *salt_buf_ptr = (char *) salt->salt_buf;
11113
11114 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11115
11116 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11117
11118 salt->salt_len = salt_len;
11119
11120 return (PARSER_OK);
11121 }
11122
11123 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11124 {
11125 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
11126
11127 u32 *digest = (u32 *) hash_buf->digest;
11128
11129 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11130 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11131 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11132 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11133
11134 digest[0] = byte_swap_32 (digest[0]);
11135 digest[1] = byte_swap_32 (digest[1]);
11136 digest[2] = byte_swap_32 (digest[2]);
11137 digest[3] = byte_swap_32 (digest[3]);
11138
11139 digest[0] -= MD5M_A;
11140 digest[1] -= MD5M_B;
11141 digest[2] -= MD5M_C;
11142 digest[3] -= MD5M_D;
11143
11144 return (PARSER_OK);
11145 }
11146
11147 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11148 {
11149 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
11150
11151 u32 *digest = (u32 *) hash_buf->digest;
11152
11153 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
11154 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
11155 digest[2] = 0;
11156 digest[3] = 0;
11157
11158 digest[0] = byte_swap_32 (digest[0]);
11159 digest[1] = byte_swap_32 (digest[1]);
11160
11161 return (PARSER_OK);
11162 }
11163
11164 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11165 {
11166 if (data.opts_type & OPTS_TYPE_ST_HEX)
11167 {
11168 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
11169 }
11170 else
11171 {
11172 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
11173 }
11174
11175 u32 *digest = (u32 *) hash_buf->digest;
11176
11177 salt_t *salt = hash_buf->salt;
11178
11179 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11180 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11181 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11182 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11183
11184 digest[0] = byte_swap_32 (digest[0]);
11185 digest[1] = byte_swap_32 (digest[1]);
11186 digest[2] = byte_swap_32 (digest[2]);
11187 digest[3] = byte_swap_32 (digest[3]);
11188
11189 digest[0] -= MD5M_A;
11190 digest[1] -= MD5M_B;
11191 digest[2] -= MD5M_C;
11192 digest[3] -= MD5M_D;
11193
11194 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11195
11196 uint salt_len = input_len - 32 - 1;
11197
11198 char *salt_buf = input_buf + 32 + 1;
11199
11200 char *salt_buf_ptr = (char *) salt->salt_buf;
11201
11202 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11203
11204 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11205
11206 salt->salt_len = salt_len;
11207
11208 return (PARSER_OK);
11209 }
11210
11211 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11212 {
11213 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
11214
11215 u32 *digest = (u32 *) hash_buf->digest;
11216
11217 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11218 | itoa64_to_int (input_buf[ 1]) << 6
11219 | itoa64_to_int (input_buf[ 2]) << 12
11220 | itoa64_to_int (input_buf[ 3]) << 18;
11221 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11222 | itoa64_to_int (input_buf[ 5]) << 6
11223 | itoa64_to_int (input_buf[ 6]) << 12
11224 | itoa64_to_int (input_buf[ 7]) << 18;
11225 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11226 | itoa64_to_int (input_buf[ 9]) << 6
11227 | itoa64_to_int (input_buf[10]) << 12
11228 | itoa64_to_int (input_buf[11]) << 18;
11229 digest[3] = itoa64_to_int (input_buf[12]) << 0
11230 | itoa64_to_int (input_buf[13]) << 6
11231 | itoa64_to_int (input_buf[14]) << 12
11232 | itoa64_to_int (input_buf[15]) << 18;
11233
11234 digest[0] -= MD5M_A;
11235 digest[1] -= MD5M_B;
11236 digest[2] -= MD5M_C;
11237 digest[3] -= MD5M_D;
11238
11239 digest[0] &= 0x00ffffff;
11240 digest[1] &= 0x00ffffff;
11241 digest[2] &= 0x00ffffff;
11242 digest[3] &= 0x00ffffff;
11243
11244 return (PARSER_OK);
11245 }
11246
11247 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11248 {
11249 if (data.opts_type & OPTS_TYPE_ST_HEX)
11250 {
11251 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
11252 }
11253 else
11254 {
11255 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
11256 }
11257
11258 u32 *digest = (u32 *) hash_buf->digest;
11259
11260 salt_t *salt = hash_buf->salt;
11261
11262 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11263 | itoa64_to_int (input_buf[ 1]) << 6
11264 | itoa64_to_int (input_buf[ 2]) << 12
11265 | itoa64_to_int (input_buf[ 3]) << 18;
11266 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11267 | itoa64_to_int (input_buf[ 5]) << 6
11268 | itoa64_to_int (input_buf[ 6]) << 12
11269 | itoa64_to_int (input_buf[ 7]) << 18;
11270 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11271 | itoa64_to_int (input_buf[ 9]) << 6
11272 | itoa64_to_int (input_buf[10]) << 12
11273 | itoa64_to_int (input_buf[11]) << 18;
11274 digest[3] = itoa64_to_int (input_buf[12]) << 0
11275 | itoa64_to_int (input_buf[13]) << 6
11276 | itoa64_to_int (input_buf[14]) << 12
11277 | itoa64_to_int (input_buf[15]) << 18;
11278
11279 digest[0] -= MD5M_A;
11280 digest[1] -= MD5M_B;
11281 digest[2] -= MD5M_C;
11282 digest[3] -= MD5M_D;
11283
11284 digest[0] &= 0x00ffffff;
11285 digest[1] &= 0x00ffffff;
11286 digest[2] &= 0x00ffffff;
11287 digest[3] &= 0x00ffffff;
11288
11289 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11290
11291 uint salt_len = input_len - 16 - 1;
11292
11293 char *salt_buf = input_buf + 16 + 1;
11294
11295 char *salt_buf_ptr = (char *) salt->salt_buf;
11296
11297 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11298
11299 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11300
11301 salt->salt_len = salt_len;
11302
11303 return (PARSER_OK);
11304 }
11305
11306 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
11307 {
11308 key[0] = (nthash[0] >> 0);
11309 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
11310 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
11311 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
11312 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
11313 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
11314 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
11315 key[7] = (nthash[6] << 1);
11316
11317 key[0] |= 0x01;
11318 key[1] |= 0x01;
11319 key[2] |= 0x01;
11320 key[3] |= 0x01;
11321 key[4] |= 0x01;
11322 key[5] |= 0x01;
11323 key[6] |= 0x01;
11324 key[7] |= 0x01;
11325 }
11326
11327 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11328 {
11329 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
11330
11331 u32 *digest = (u32 *) hash_buf->digest;
11332
11333 salt_t *salt = hash_buf->salt;
11334
11335 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11336
11337 /**
11338 * parse line
11339 */
11340
11341 char *user_pos = input_buf;
11342
11343 char *unused_pos = strchr (user_pos, ':');
11344
11345 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11346
11347 uint user_len = unused_pos - user_pos;
11348
11349 if (user_len > 60) return (PARSER_SALT_LENGTH);
11350
11351 unused_pos++;
11352
11353 char *domain_pos = strchr (unused_pos, ':');
11354
11355 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11356
11357 uint unused_len = domain_pos - unused_pos;
11358
11359 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11360
11361 domain_pos++;
11362
11363 char *srvchall_pos = strchr (domain_pos, ':');
11364
11365 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11366
11367 uint domain_len = srvchall_pos - domain_pos;
11368
11369 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11370
11371 srvchall_pos++;
11372
11373 char *hash_pos = strchr (srvchall_pos, ':');
11374
11375 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11376
11377 uint srvchall_len = hash_pos - srvchall_pos;
11378
11379 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
11380
11381 hash_pos++;
11382
11383 char *clichall_pos = strchr (hash_pos, ':');
11384
11385 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11386
11387 uint hash_len = clichall_pos - hash_pos;
11388
11389 if (hash_len != 48) return (PARSER_HASH_LENGTH);
11390
11391 clichall_pos++;
11392
11393 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11394
11395 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
11396
11397 /**
11398 * store some data for later use
11399 */
11400
11401 netntlm->user_len = user_len * 2;
11402 netntlm->domain_len = domain_len * 2;
11403 netntlm->srvchall_len = srvchall_len / 2;
11404 netntlm->clichall_len = clichall_len / 2;
11405
11406 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11407 char *chall_ptr = (char *) netntlm->chall_buf;
11408
11409 /**
11410 * handle username and domainname
11411 */
11412
11413 for (uint i = 0; i < user_len; i++)
11414 {
11415 *userdomain_ptr++ = user_pos[i];
11416 *userdomain_ptr++ = 0;
11417 }
11418
11419 for (uint i = 0; i < domain_len; i++)
11420 {
11421 *userdomain_ptr++ = domain_pos[i];
11422 *userdomain_ptr++ = 0;
11423 }
11424
11425 /**
11426 * handle server challenge encoding
11427 */
11428
11429 for (uint i = 0; i < srvchall_len; i += 2)
11430 {
11431 const char p0 = srvchall_pos[i + 0];
11432 const char p1 = srvchall_pos[i + 1];
11433
11434 *chall_ptr++ = hex_convert (p1) << 0
11435 | hex_convert (p0) << 4;
11436 }
11437
11438 /**
11439 * handle client challenge encoding
11440 */
11441
11442 for (uint i = 0; i < clichall_len; i += 2)
11443 {
11444 const char p0 = clichall_pos[i + 0];
11445 const char p1 = clichall_pos[i + 1];
11446
11447 *chall_ptr++ = hex_convert (p1) << 0
11448 | hex_convert (p0) << 4;
11449 }
11450
11451 /**
11452 * store data
11453 */
11454
11455 char *salt_buf_ptr = (char *) salt->salt_buf;
11456
11457 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
11458
11459 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11460
11461 salt->salt_len = salt_len;
11462
11463 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11464 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11465 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11466 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11467
11468 digest[0] = byte_swap_32 (digest[0]);
11469 digest[1] = byte_swap_32 (digest[1]);
11470 digest[2] = byte_swap_32 (digest[2]);
11471 digest[3] = byte_swap_32 (digest[3]);
11472
11473 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
11474
11475 uint digest_tmp[2] = { 0 };
11476
11477 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11478 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
11479
11480 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
11481 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
11482
11483 /* special case 2: ESS */
11484
11485 if (srvchall_len == 48)
11486 {
11487 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
11488 {
11489 uint w[16] = { 0 };
11490
11491 w[ 0] = netntlm->chall_buf[6];
11492 w[ 1] = netntlm->chall_buf[7];
11493 w[ 2] = netntlm->chall_buf[0];
11494 w[ 3] = netntlm->chall_buf[1];
11495 w[ 4] = 0x80;
11496 w[14] = 16 * 8;
11497
11498 uint dgst[4] = { 0 };
11499
11500 dgst[0] = MAGIC_A;
11501 dgst[1] = MAGIC_B;
11502 dgst[2] = MAGIC_C;
11503 dgst[3] = MAGIC_D;
11504
11505 md5_64 (w, dgst);
11506
11507 salt->salt_buf[0] = dgst[0];
11508 salt->salt_buf[1] = dgst[1];
11509 }
11510 }
11511
11512 /* precompute netntlmv1 exploit start */
11513
11514 for (uint i = 0; i < 0x10000; i++)
11515 {
11516 uint key_md4[2] = { i, 0 };
11517 uint key_des[2] = { 0, 0 };
11518
11519 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
11520
11521 uint Kc[16] = { 0 };
11522 uint Kd[16] = { 0 };
11523
11524 _des_keysetup (key_des, Kc, Kd, c_skb);
11525
11526 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
11527
11528 _des_encrypt (data3, Kc, Kd, c_SPtrans);
11529
11530 if (data3[0] != digest_tmp[0]) continue;
11531 if (data3[1] != digest_tmp[1]) continue;
11532
11533 salt->salt_buf[2] = i;
11534
11535 salt->salt_len = 24;
11536
11537 break;
11538 }
11539
11540 salt->salt_buf_pc[0] = digest_tmp[0];
11541 salt->salt_buf_pc[1] = digest_tmp[1];
11542
11543 /* precompute netntlmv1 exploit stop */
11544
11545 u32 tt;
11546
11547 IP (digest[0], digest[1], tt);
11548 IP (digest[2], digest[3], tt);
11549
11550 digest[0] = rotr32 (digest[0], 29);
11551 digest[1] = rotr32 (digest[1], 29);
11552 digest[2] = rotr32 (digest[2], 29);
11553 digest[3] = rotr32 (digest[3], 29);
11554
11555 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
11556
11557 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
11558 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
11559
11560 return (PARSER_OK);
11561 }
11562
11563 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11564 {
11565 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
11566
11567 u32 *digest = (u32 *) hash_buf->digest;
11568
11569 salt_t *salt = hash_buf->salt;
11570
11571 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11572
11573 /**
11574 * parse line
11575 */
11576
11577 char *user_pos = input_buf;
11578
11579 char *unused_pos = strchr (user_pos, ':');
11580
11581 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11582
11583 uint user_len = unused_pos - user_pos;
11584
11585 if (user_len > 60) return (PARSER_SALT_LENGTH);
11586
11587 unused_pos++;
11588
11589 char *domain_pos = strchr (unused_pos, ':');
11590
11591 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11592
11593 uint unused_len = domain_pos - unused_pos;
11594
11595 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11596
11597 domain_pos++;
11598
11599 char *srvchall_pos = strchr (domain_pos, ':');
11600
11601 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11602
11603 uint domain_len = srvchall_pos - domain_pos;
11604
11605 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11606
11607 srvchall_pos++;
11608
11609 char *hash_pos = strchr (srvchall_pos, ':');
11610
11611 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11612
11613 uint srvchall_len = hash_pos - srvchall_pos;
11614
11615 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
11616
11617 hash_pos++;
11618
11619 char *clichall_pos = strchr (hash_pos, ':');
11620
11621 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11622
11623 uint hash_len = clichall_pos - hash_pos;
11624
11625 if (hash_len != 32) return (PARSER_HASH_LENGTH);
11626
11627 clichall_pos++;
11628
11629 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11630
11631 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
11632
11633 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11634
11635 /**
11636 * store some data for later use
11637 */
11638
11639 netntlm->user_len = user_len * 2;
11640 netntlm->domain_len = domain_len * 2;
11641 netntlm->srvchall_len = srvchall_len / 2;
11642 netntlm->clichall_len = clichall_len / 2;
11643
11644 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11645 char *chall_ptr = (char *) netntlm->chall_buf;
11646
11647 /**
11648 * handle username and domainname
11649 */
11650
11651 for (uint i = 0; i < user_len; i++)
11652 {
11653 *userdomain_ptr++ = toupper (user_pos[i]);
11654 *userdomain_ptr++ = 0;
11655 }
11656
11657 for (uint i = 0; i < domain_len; i++)
11658 {
11659 *userdomain_ptr++ = domain_pos[i];
11660 *userdomain_ptr++ = 0;
11661 }
11662
11663 *userdomain_ptr++ = 0x80;
11664
11665 /**
11666 * handle server challenge encoding
11667 */
11668
11669 for (uint i = 0; i < srvchall_len; i += 2)
11670 {
11671 const char p0 = srvchall_pos[i + 0];
11672 const char p1 = srvchall_pos[i + 1];
11673
11674 *chall_ptr++ = hex_convert (p1) << 0
11675 | hex_convert (p0) << 4;
11676 }
11677
11678 /**
11679 * handle client challenge encoding
11680 */
11681
11682 for (uint i = 0; i < clichall_len; i += 2)
11683 {
11684 const char p0 = clichall_pos[i + 0];
11685 const char p1 = clichall_pos[i + 1];
11686
11687 *chall_ptr++ = hex_convert (p1) << 0
11688 | hex_convert (p0) << 4;
11689 }
11690
11691 *chall_ptr++ = 0x80;
11692
11693 /**
11694 * handle hash itself
11695 */
11696
11697 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11698 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11699 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11700 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11701
11702 digest[0] = byte_swap_32 (digest[0]);
11703 digest[1] = byte_swap_32 (digest[1]);
11704 digest[2] = byte_swap_32 (digest[2]);
11705 digest[3] = byte_swap_32 (digest[3]);
11706
11707 /**
11708 * reuse challange data as salt_buf, its the buffer that is most likely unique
11709 */
11710
11711 salt->salt_buf[0] = 0;
11712 salt->salt_buf[1] = 0;
11713 salt->salt_buf[2] = 0;
11714 salt->salt_buf[3] = 0;
11715 salt->salt_buf[4] = 0;
11716 salt->salt_buf[5] = 0;
11717 salt->salt_buf[6] = 0;
11718 salt->salt_buf[7] = 0;
11719
11720 uint *uptr;
11721
11722 uptr = (uint *) netntlm->userdomain_buf;
11723
11724 for (uint i = 0; i < 16; i += 16)
11725 {
11726 md5_64 (uptr, salt->salt_buf);
11727 }
11728
11729 uptr = (uint *) netntlm->chall_buf;
11730
11731 for (uint i = 0; i < 256; i += 16)
11732 {
11733 md5_64 (uptr, salt->salt_buf);
11734 }
11735
11736 salt->salt_len = 16;
11737
11738 return (PARSER_OK);
11739 }
11740
11741 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11742 {
11743 if (data.opts_type & OPTS_TYPE_ST_HEX)
11744 {
11745 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11746 }
11747 else
11748 {
11749 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11750 }
11751
11752 u32 *digest = (u32 *) hash_buf->digest;
11753
11754 salt_t *salt = hash_buf->salt;
11755
11756 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11757 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11758 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11759 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11760
11761 digest[0] = byte_swap_32 (digest[0]);
11762 digest[1] = byte_swap_32 (digest[1]);
11763 digest[2] = byte_swap_32 (digest[2]);
11764 digest[3] = byte_swap_32 (digest[3]);
11765
11766 digest[0] -= MD5M_A;
11767 digest[1] -= MD5M_B;
11768 digest[2] -= MD5M_C;
11769 digest[3] -= MD5M_D;
11770
11771 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11772
11773 uint salt_len = input_len - 32 - 1;
11774
11775 char *salt_buf = input_buf + 32 + 1;
11776
11777 char *salt_buf_ptr = (char *) salt->salt_buf;
11778
11779 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11780
11781 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11782
11783 salt->salt_len = salt_len;
11784
11785 return (PARSER_OK);
11786 }
11787
11788 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11789 {
11790 if (data.opts_type & OPTS_TYPE_ST_HEX)
11791 {
11792 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11793 }
11794 else
11795 {
11796 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11797 }
11798
11799 u32 *digest = (u32 *) hash_buf->digest;
11800
11801 salt_t *salt = hash_buf->salt;
11802
11803 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11804 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11805 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11806 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11807
11808 digest[0] = byte_swap_32 (digest[0]);
11809 digest[1] = byte_swap_32 (digest[1]);
11810 digest[2] = byte_swap_32 (digest[2]);
11811 digest[3] = byte_swap_32 (digest[3]);
11812
11813 digest[0] -= MD5M_A;
11814 digest[1] -= MD5M_B;
11815 digest[2] -= MD5M_C;
11816 digest[3] -= MD5M_D;
11817
11818 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11819
11820 uint salt_len = input_len - 32 - 1;
11821
11822 char *salt_buf = input_buf + 32 + 1;
11823
11824 char *salt_buf_ptr = (char *) salt->salt_buf;
11825
11826 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11827
11828 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11829
11830 salt->salt_len = salt_len;
11831
11832 return (PARSER_OK);
11833 }
11834
11835 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11836 {
11837 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11838
11839 u32 *digest = (u32 *) hash_buf->digest;
11840
11841 salt_t *salt = hash_buf->salt;
11842
11843 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11844 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11845 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11846 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11847
11848 digest[0] = byte_swap_32 (digest[0]);
11849 digest[1] = byte_swap_32 (digest[1]);
11850 digest[2] = byte_swap_32 (digest[2]);
11851 digest[3] = byte_swap_32 (digest[3]);
11852
11853 digest[0] -= MD5M_A;
11854 digest[1] -= MD5M_B;
11855 digest[2] -= MD5M_C;
11856 digest[3] -= MD5M_D;
11857
11858 /**
11859 * This is a virtual salt. While the algorithm is basically not salted
11860 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11861 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11862 */
11863
11864 char *salt_buf_ptr = (char *) salt->salt_buf;
11865
11866 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11867
11868 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11869
11870 salt->salt_len = salt_len;
11871
11872 return (PARSER_OK);
11873 }
11874
11875 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11876 {
11877 if (data.opts_type & OPTS_TYPE_ST_HEX)
11878 {
11879 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11880 }
11881 else
11882 {
11883 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11884 }
11885
11886 u32 *digest = (u32 *) hash_buf->digest;
11887
11888 salt_t *salt = hash_buf->salt;
11889
11890 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11891 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11892 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11893 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11894
11895 digest[0] = byte_swap_32 (digest[0]);
11896 digest[1] = byte_swap_32 (digest[1]);
11897 digest[2] = byte_swap_32 (digest[2]);
11898 digest[3] = byte_swap_32 (digest[3]);
11899
11900 digest[0] -= MD5M_A;
11901 digest[1] -= MD5M_B;
11902 digest[2] -= MD5M_C;
11903 digest[3] -= MD5M_D;
11904
11905 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11906
11907 uint salt_len = input_len - 32 - 1;
11908
11909 char *salt_buf = input_buf + 32 + 1;
11910
11911 char *salt_buf_ptr = (char *) salt->salt_buf;
11912
11913 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11914
11915 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11916
11917 salt->salt_len = salt_len;
11918
11919 return (PARSER_OK);
11920 }
11921
11922 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11923 {
11924 if (data.opts_type & OPTS_TYPE_ST_HEX)
11925 {
11926 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11927 }
11928 else
11929 {
11930 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11931 }
11932
11933 u32 *digest = (u32 *) hash_buf->digest;
11934
11935 salt_t *salt = hash_buf->salt;
11936
11937 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11938 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11939 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11940 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11941
11942 digest[0] = byte_swap_32 (digest[0]);
11943 digest[1] = byte_swap_32 (digest[1]);
11944 digest[2] = byte_swap_32 (digest[2]);
11945 digest[3] = byte_swap_32 (digest[3]);
11946
11947 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11948
11949 uint salt_len = input_len - 32 - 1;
11950
11951 char *salt_buf = input_buf + 32 + 1;
11952
11953 char *salt_buf_ptr = (char *) salt->salt_buf;
11954
11955 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11956
11957 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11958
11959 salt->salt_len = salt_len;
11960
11961 return (PARSER_OK);
11962 }
11963
11964 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11965 {
11966 if (data.opts_type & OPTS_TYPE_ST_HEX)
11967 {
11968 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11969 }
11970 else
11971 {
11972 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11973 }
11974
11975 u32 *digest = (u32 *) hash_buf->digest;
11976
11977 salt_t *salt = hash_buf->salt;
11978
11979 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11980 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11981 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11982 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11983
11984 digest[0] = byte_swap_32 (digest[0]);
11985 digest[1] = byte_swap_32 (digest[1]);
11986 digest[2] = byte_swap_32 (digest[2]);
11987 digest[3] = byte_swap_32 (digest[3]);
11988
11989 digest[0] -= MD4M_A;
11990 digest[1] -= MD4M_B;
11991 digest[2] -= MD4M_C;
11992 digest[3] -= MD4M_D;
11993
11994 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11995
11996 uint salt_len = input_len - 32 - 1;
11997
11998 char *salt_buf = input_buf + 32 + 1;
11999
12000 char *salt_buf_ptr = (char *) salt->salt_buf;
12001
12002 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12003
12004 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12005
12006 salt->salt_len = salt_len;
12007
12008 return (PARSER_OK);
12009 }
12010
12011 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12012 {
12013 if (data.opts_type & OPTS_TYPE_ST_HEX)
12014 {
12015 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
12016 }
12017 else
12018 {
12019 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
12020 }
12021
12022 u32 *digest = (u32 *) hash_buf->digest;
12023
12024 salt_t *salt = hash_buf->salt;
12025
12026 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12027 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12028 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12029 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12030
12031 digest[0] = byte_swap_32 (digest[0]);
12032 digest[1] = byte_swap_32 (digest[1]);
12033 digest[2] = byte_swap_32 (digest[2]);
12034 digest[3] = byte_swap_32 (digest[3]);
12035
12036 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12037
12038 uint salt_len = input_len - 32 - 1;
12039
12040 char *salt_buf = input_buf + 32 + 1;
12041
12042 uint salt_pc_block[16] = { 0 };
12043
12044 char *salt_pc_block_ptr = (char *) salt_pc_block;
12045
12046 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
12047
12048 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12049
12050 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
12051
12052 salt_pc_block[14] = salt_len * 8;
12053
12054 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
12055
12056 md5_64 (salt_pc_block, salt_pc_digest);
12057
12058 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
12059 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
12060 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
12061 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
12062
12063 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
12064
12065 memcpy (salt_buf_ptr, salt_buf, salt_len);
12066
12067 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
12068
12069 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
12070 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
12071 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
12072 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
12073
12074 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
12075
12076 return (PARSER_OK);
12077 }
12078
12079 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12080 {
12081 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
12082
12083 u32 *digest = (u32 *) hash_buf->digest;
12084
12085 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12086 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12087 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12088 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12089 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12090
12091 digest[0] -= SHA1M_A;
12092 digest[1] -= SHA1M_B;
12093 digest[2] -= SHA1M_C;
12094 digest[3] -= SHA1M_D;
12095 digest[4] -= SHA1M_E;
12096
12097 return (PARSER_OK);
12098 }
12099
12100 int sha1axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12101 {
12102 if ((input_len < DISPLAY_LEN_MIN_13300) || (input_len > DISPLAY_LEN_MAX_13300)) return (PARSER_GLOBAL_LENGTH);
12103
12104 if (memcmp (SIGNATURE_AXCRYPT_SHA1, input_buf, 13)) return (PARSER_SIGNATURE_UNMATCHED);
12105
12106 u32 *digest = (u32 *) hash_buf->digest;
12107
12108 input_buf += 14;
12109
12110 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12111 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12112 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12113 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12114 digest[4] = 0;
12115
12116 return (PARSER_OK);
12117 }
12118
12119 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12120 {
12121 if (data.opts_type & OPTS_TYPE_ST_HEX)
12122 {
12123 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
12124 }
12125 else
12126 {
12127 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
12128 }
12129
12130 u32 *digest = (u32 *) hash_buf->digest;
12131
12132 salt_t *salt = hash_buf->salt;
12133
12134 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12135 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12136 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12137 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12138 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12139
12140 digest[0] -= SHA1M_A;
12141 digest[1] -= SHA1M_B;
12142 digest[2] -= SHA1M_C;
12143 digest[3] -= SHA1M_D;
12144 digest[4] -= SHA1M_E;
12145
12146 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12147
12148 uint salt_len = input_len - 40 - 1;
12149
12150 char *salt_buf = input_buf + 40 + 1;
12151
12152 char *salt_buf_ptr = (char *) salt->salt_buf;
12153
12154 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12155
12156 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12157
12158 salt->salt_len = salt_len;
12159
12160 return (PARSER_OK);
12161 }
12162
12163 int pstoken_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12164 {
12165 if ((input_len < DISPLAY_LEN_MIN_13500) || (input_len > DISPLAY_LEN_MAX_13500)) return (PARSER_GLOBAL_LENGTH);
12166
12167 u32 *digest = (u32 *) hash_buf->digest;
12168
12169 salt_t *salt = hash_buf->salt;
12170
12171 pstoken_t *pstoken = (pstoken_t *) hash_buf->esalt;
12172
12173 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12174 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12175 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12176 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12177 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12178
12179 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12180
12181 uint salt_len = input_len - 40 - 1;
12182
12183 char *salt_buf = input_buf + 40 + 1;
12184
12185 if (salt_len == UINT_MAX || salt_len % 2 != 0) return (PARSER_SALT_LENGTH);
12186
12187 u8 *pstoken_ptr = (u8 *) pstoken->salt_buf;
12188
12189 for (uint i = 0, j = 0; i < salt_len; i += 2, j += 1)
12190 {
12191 pstoken_ptr[j] = hex_to_u8 ((const u8 *) &salt_buf[i]);
12192 }
12193
12194 pstoken->salt_len = salt_len / 2;
12195
12196 /* some fake salt for the sorting mechanisms */
12197
12198 salt->salt_buf[0] = pstoken->salt_buf[0];
12199 salt->salt_buf[1] = pstoken->salt_buf[1];
12200 salt->salt_buf[2] = pstoken->salt_buf[2];
12201 salt->salt_buf[3] = pstoken->salt_buf[3];
12202 salt->salt_buf[4] = pstoken->salt_buf[4];
12203 salt->salt_buf[5] = pstoken->salt_buf[5];
12204 salt->salt_buf[6] = pstoken->salt_buf[6];
12205 salt->salt_buf[7] = pstoken->salt_buf[7];
12206
12207 salt->salt_len = 32;
12208
12209 /* we need to check if we can precompute some of the data --
12210 this is possible since the scheme is badly designed */
12211
12212 pstoken->pc_digest[0] = SHA1M_A;
12213 pstoken->pc_digest[1] = SHA1M_B;
12214 pstoken->pc_digest[2] = SHA1M_C;
12215 pstoken->pc_digest[3] = SHA1M_D;
12216 pstoken->pc_digest[4] = SHA1M_E;
12217
12218 pstoken->pc_offset = 0;
12219
12220 for (int i = 0; i < (int) pstoken->salt_len - 63; i += 64)
12221 {
12222 uint w[16];
12223
12224 w[ 0] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 0]);
12225 w[ 1] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 1]);
12226 w[ 2] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 2]);
12227 w[ 3] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 3]);
12228 w[ 4] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 4]);
12229 w[ 5] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 5]);
12230 w[ 6] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 6]);
12231 w[ 7] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 7]);
12232 w[ 8] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 8]);
12233 w[ 9] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 9]);
12234 w[10] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 10]);
12235 w[11] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 11]);
12236 w[12] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 12]);
12237 w[13] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 13]);
12238 w[14] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 14]);
12239 w[15] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 15]);
12240
12241 sha1_64 (w, pstoken->pc_digest);
12242
12243 pstoken->pc_offset += 16;
12244 }
12245
12246 return (PARSER_OK);
12247 }
12248
12249 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12250 {
12251 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
12252
12253 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
12254
12255 u32 *digest = (u32 *) hash_buf->digest;
12256
12257 u8 tmp_buf[100] = { 0 };
12258
12259 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
12260
12261 memcpy (digest, tmp_buf, 20);
12262
12263 digest[0] = byte_swap_32 (digest[0]);
12264 digest[1] = byte_swap_32 (digest[1]);
12265 digest[2] = byte_swap_32 (digest[2]);
12266 digest[3] = byte_swap_32 (digest[3]);
12267 digest[4] = byte_swap_32 (digest[4]);
12268
12269 digest[0] -= SHA1M_A;
12270 digest[1] -= SHA1M_B;
12271 digest[2] -= SHA1M_C;
12272 digest[3] -= SHA1M_D;
12273 digest[4] -= SHA1M_E;
12274
12275 return (PARSER_OK);
12276 }
12277
12278 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12279 {
12280 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
12281
12282 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12283
12284 u32 *digest = (u32 *) hash_buf->digest;
12285
12286 salt_t *salt = hash_buf->salt;
12287
12288 u8 tmp_buf[100] = { 0 };
12289
12290 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
12291
12292 if (tmp_len < 20) return (PARSER_HASH_LENGTH);
12293
12294 memcpy (digest, tmp_buf, 20);
12295
12296 int salt_len = tmp_len - 20;
12297
12298 if (salt_len < 0) return (PARSER_SALT_LENGTH);
12299
12300 salt->salt_len = salt_len;
12301
12302 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
12303
12304 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12305 {
12306 char *ptr = (char *) salt->salt_buf;
12307
12308 ptr[salt->salt_len] = 0x80;
12309 }
12310
12311 digest[0] = byte_swap_32 (digest[0]);
12312 digest[1] = byte_swap_32 (digest[1]);
12313 digest[2] = byte_swap_32 (digest[2]);
12314 digest[3] = byte_swap_32 (digest[3]);
12315 digest[4] = byte_swap_32 (digest[4]);
12316
12317 digest[0] -= SHA1M_A;
12318 digest[1] -= SHA1M_B;
12319 digest[2] -= SHA1M_C;
12320 digest[3] -= SHA1M_D;
12321 digest[4] -= SHA1M_E;
12322
12323 return (PARSER_OK);
12324 }
12325
12326 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12327 {
12328 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
12329
12330 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12331
12332 u32 *digest = (u32 *) hash_buf->digest;
12333
12334 salt_t *salt = hash_buf->salt;
12335
12336 char *salt_buf = input_buf + 6;
12337
12338 uint salt_len = 8;
12339
12340 char *salt_buf_ptr = (char *) salt->salt_buf;
12341
12342 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12343
12344 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12345
12346 salt->salt_len = salt_len;
12347
12348 char *hash_pos = input_buf + 6 + 8 + 40;
12349
12350 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12351 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12352 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12353 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12354 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12355
12356 digest[0] -= SHA1M_A;
12357 digest[1] -= SHA1M_B;
12358 digest[2] -= SHA1M_C;
12359 digest[3] -= SHA1M_D;
12360 digest[4] -= SHA1M_E;
12361
12362 return (PARSER_OK);
12363 }
12364
12365 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12366 {
12367 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
12368
12369 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12370
12371 u32 *digest = (u32 *) hash_buf->digest;
12372
12373 salt_t *salt = hash_buf->salt;
12374
12375 char *salt_buf = input_buf + 6;
12376
12377 uint salt_len = 8;
12378
12379 char *salt_buf_ptr = (char *) salt->salt_buf;
12380
12381 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12382
12383 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12384
12385 salt->salt_len = salt_len;
12386
12387 char *hash_pos = input_buf + 6 + 8;
12388
12389 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12390 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12391 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12392 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12393 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12394
12395 digest[0] -= SHA1M_A;
12396 digest[1] -= SHA1M_B;
12397 digest[2] -= SHA1M_C;
12398 digest[3] -= SHA1M_D;
12399 digest[4] -= SHA1M_E;
12400
12401 return (PARSER_OK);
12402 }
12403
12404 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12405 {
12406 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
12407
12408 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12409
12410 u64 *digest = (u64 *) hash_buf->digest;
12411
12412 salt_t *salt = hash_buf->salt;
12413
12414 char *salt_buf = input_buf + 6;
12415
12416 uint salt_len = 8;
12417
12418 char *salt_buf_ptr = (char *) salt->salt_buf;
12419
12420 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12421
12422 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12423
12424 salt->salt_len = salt_len;
12425
12426 char *hash_pos = input_buf + 6 + 8;
12427
12428 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12429 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12430 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12431 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12432 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12433 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12434 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12435 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12436
12437 digest[0] -= SHA512M_A;
12438 digest[1] -= SHA512M_B;
12439 digest[2] -= SHA512M_C;
12440 digest[3] -= SHA512M_D;
12441 digest[4] -= SHA512M_E;
12442 digest[5] -= SHA512M_F;
12443 digest[6] -= SHA512M_G;
12444 digest[7] -= SHA512M_H;
12445
12446 return (PARSER_OK);
12447 }
12448
12449 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12450 {
12451 if (data.opts_type & OPTS_TYPE_ST_HEX)
12452 {
12453 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
12454 }
12455 else
12456 {
12457 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
12458 }
12459
12460 u32 *digest = (u32 *) hash_buf->digest;
12461
12462 salt_t *salt = hash_buf->salt;
12463
12464 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12465 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12466 digest[2] = 0;
12467 digest[3] = 0;
12468
12469 digest[0] = byte_swap_32 (digest[0]);
12470 digest[1] = byte_swap_32 (digest[1]);
12471
12472 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12473
12474 uint salt_len = input_len - 16 - 1;
12475
12476 char *salt_buf = input_buf + 16 + 1;
12477
12478 char *salt_buf_ptr = (char *) salt->salt_buf;
12479
12480 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12481
12482 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12483
12484 salt->salt_len = salt_len;
12485
12486 return (PARSER_OK);
12487 }
12488
12489 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12490 {
12491 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
12492
12493 u32 *digest = (u32 *) hash_buf->digest;
12494
12495 salt_t *salt = hash_buf->salt;
12496
12497 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12498 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12499 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12500 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12501 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12502
12503 digest[0] -= SHA1M_A;
12504 digest[1] -= SHA1M_B;
12505 digest[2] -= SHA1M_C;
12506 digest[3] -= SHA1M_D;
12507 digest[4] -= SHA1M_E;
12508
12509 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12510
12511 uint salt_len = input_len - 40 - 1;
12512
12513 char *salt_buf = input_buf + 40 + 1;
12514
12515 char *salt_buf_ptr = (char *) salt->salt_buf;
12516
12517 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12518
12519 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12520
12521 salt->salt_len = salt_len;
12522
12523 return (PARSER_OK);
12524 }
12525
12526 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12527 {
12528 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
12529
12530 u32 *digest = (u32 *) hash_buf->digest;
12531
12532 salt_t *salt = hash_buf->salt;
12533
12534 char *hash_pos = input_buf;
12535
12536 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12537 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12538 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
12539 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
12540 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
12541 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
12542 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
12543 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
12544 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
12545 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
12546 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
12547 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
12548 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
12549 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
12550 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
12551 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
12552
12553 char *salt_pos = input_buf + 128;
12554
12555 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12556 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12557 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12558 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12559
12560 salt->salt_iter = ROUNDS_ORACLET - 1;
12561 salt->salt_len = 16;
12562
12563 return (PARSER_OK);
12564 }
12565
12566 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12567 {
12568 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
12569
12570 u32 *digest = (u32 *) hash_buf->digest;
12571
12572 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12573 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12574 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12575 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12576 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12577 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12578 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12579 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12580
12581 digest[0] -= SHA256M_A;
12582 digest[1] -= SHA256M_B;
12583 digest[2] -= SHA256M_C;
12584 digest[3] -= SHA256M_D;
12585 digest[4] -= SHA256M_E;
12586 digest[5] -= SHA256M_F;
12587 digest[6] -= SHA256M_G;
12588 digest[7] -= SHA256M_H;
12589
12590 return (PARSER_OK);
12591 }
12592
12593 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12594 {
12595 if (data.opts_type & OPTS_TYPE_ST_HEX)
12596 {
12597 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
12598 }
12599 else
12600 {
12601 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
12602 }
12603
12604 u32 *digest = (u32 *) hash_buf->digest;
12605
12606 salt_t *salt = hash_buf->salt;
12607
12608 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12609 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12610 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12611 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12612 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12613 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12614 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12615 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12616
12617 digest[0] -= SHA256M_A;
12618 digest[1] -= SHA256M_B;
12619 digest[2] -= SHA256M_C;
12620 digest[3] -= SHA256M_D;
12621 digest[4] -= SHA256M_E;
12622 digest[5] -= SHA256M_F;
12623 digest[6] -= SHA256M_G;
12624 digest[7] -= SHA256M_H;
12625
12626 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12627
12628 uint salt_len = input_len - 64 - 1;
12629
12630 char *salt_buf = input_buf + 64 + 1;
12631
12632 char *salt_buf_ptr = (char *) salt->salt_buf;
12633
12634 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12635
12636 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12637
12638 salt->salt_len = salt_len;
12639
12640 return (PARSER_OK);
12641 }
12642
12643 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12644 {
12645 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
12646
12647 u64 *digest = (u64 *) hash_buf->digest;
12648
12649 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12650 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12651 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12652 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12653 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12654 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12655 digest[6] = 0;
12656 digest[7] = 0;
12657
12658 digest[0] -= SHA384M_A;
12659 digest[1] -= SHA384M_B;
12660 digest[2] -= SHA384M_C;
12661 digest[3] -= SHA384M_D;
12662 digest[4] -= SHA384M_E;
12663 digest[5] -= SHA384M_F;
12664 digest[6] -= 0;
12665 digest[7] -= 0;
12666
12667 return (PARSER_OK);
12668 }
12669
12670 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12671 {
12672 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
12673
12674 u64 *digest = (u64 *) hash_buf->digest;
12675
12676 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12677 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12678 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12679 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12680 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12681 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12682 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12683 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12684
12685 digest[0] -= SHA512M_A;
12686 digest[1] -= SHA512M_B;
12687 digest[2] -= SHA512M_C;
12688 digest[3] -= SHA512M_D;
12689 digest[4] -= SHA512M_E;
12690 digest[5] -= SHA512M_F;
12691 digest[6] -= SHA512M_G;
12692 digest[7] -= SHA512M_H;
12693
12694 return (PARSER_OK);
12695 }
12696
12697 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12698 {
12699 if (data.opts_type & OPTS_TYPE_ST_HEX)
12700 {
12701 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
12702 }
12703 else
12704 {
12705 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
12706 }
12707
12708 u64 *digest = (u64 *) hash_buf->digest;
12709
12710 salt_t *salt = hash_buf->salt;
12711
12712 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12713 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12714 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12715 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12716 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12717 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12718 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12719 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12720
12721 digest[0] -= SHA512M_A;
12722 digest[1] -= SHA512M_B;
12723 digest[2] -= SHA512M_C;
12724 digest[3] -= SHA512M_D;
12725 digest[4] -= SHA512M_E;
12726 digest[5] -= SHA512M_F;
12727 digest[6] -= SHA512M_G;
12728 digest[7] -= SHA512M_H;
12729
12730 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12731
12732 uint salt_len = input_len - 128 - 1;
12733
12734 char *salt_buf = input_buf + 128 + 1;
12735
12736 char *salt_buf_ptr = (char *) salt->salt_buf;
12737
12738 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12739
12740 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12741
12742 salt->salt_len = salt_len;
12743
12744 return (PARSER_OK);
12745 }
12746
12747 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12748 {
12749 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12750
12751 u64 *digest = (u64 *) hash_buf->digest;
12752
12753 salt_t *salt = hash_buf->salt;
12754
12755 char *salt_pos = input_buf + 3;
12756
12757 uint iterations_len = 0;
12758
12759 if (memcmp (salt_pos, "rounds=", 7) == 0)
12760 {
12761 salt_pos += 7;
12762
12763 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12764
12765 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12766 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12767
12768 salt_pos[0] = 0x0;
12769
12770 salt->salt_iter = atoi (salt_pos - iterations_len);
12771
12772 salt_pos += 1;
12773
12774 iterations_len += 8;
12775 }
12776 else
12777 {
12778 salt->salt_iter = ROUNDS_SHA512CRYPT;
12779 }
12780
12781 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12782
12783 char *hash_pos = strchr (salt_pos, '$');
12784
12785 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12786
12787 uint salt_len = hash_pos - salt_pos;
12788
12789 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12790
12791 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12792
12793 salt->salt_len = salt_len;
12794
12795 hash_pos++;
12796
12797 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12798
12799 return (PARSER_OK);
12800 }
12801
12802 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12803 {
12804 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12805
12806 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12807
12808 u64 *digest = (u64 *) hash_buf->digest;
12809
12810 salt_t *salt = hash_buf->salt;
12811
12812 uint keccak_mdlen = input_len / 2;
12813
12814 for (uint i = 0; i < keccak_mdlen / 8; i++)
12815 {
12816 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12817
12818 digest[i] = byte_swap_64 (digest[i]);
12819 }
12820
12821 salt->keccak_mdlen = keccak_mdlen;
12822
12823 return (PARSER_OK);
12824 }
12825
12826 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12827 {
12828 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12829
12830 u32 *digest = (u32 *) hash_buf->digest;
12831
12832 salt_t *salt = hash_buf->salt;
12833
12834 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12835
12836 /**
12837 * Parse that strange long line
12838 */
12839
12840 char *in_off[9];
12841
12842 size_t in_len[9] = { 0 };
12843
12844 in_off[0] = strtok (input_buf, ":");
12845
12846 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12847
12848 in_len[0] = strlen (in_off[0]);
12849
12850 size_t i;
12851
12852 for (i = 1; i < 9; i++)
12853 {
12854 in_off[i] = strtok (NULL, ":");
12855
12856 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12857
12858 in_len[i] = strlen (in_off[i]);
12859 }
12860
12861 char *ptr = (char *) ikepsk->msg_buf;
12862
12863 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12864 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12865 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12866 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12867 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12868 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12869
12870 *ptr = 0x80;
12871
12872 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12873
12874 ptr = (char *) ikepsk->nr_buf;
12875
12876 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12877 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12878
12879 *ptr = 0x80;
12880
12881 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12882
12883 /**
12884 * Store to database
12885 */
12886
12887 ptr = in_off[8];
12888
12889 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12890 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12891 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12892 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12893
12894 digest[0] = byte_swap_32 (digest[0]);
12895 digest[1] = byte_swap_32 (digest[1]);
12896 digest[2] = byte_swap_32 (digest[2]);
12897 digest[3] = byte_swap_32 (digest[3]);
12898
12899 salt->salt_len = 32;
12900
12901 salt->salt_buf[0] = ikepsk->nr_buf[0];
12902 salt->salt_buf[1] = ikepsk->nr_buf[1];
12903 salt->salt_buf[2] = ikepsk->nr_buf[2];
12904 salt->salt_buf[3] = ikepsk->nr_buf[3];
12905 salt->salt_buf[4] = ikepsk->nr_buf[4];
12906 salt->salt_buf[5] = ikepsk->nr_buf[5];
12907 salt->salt_buf[6] = ikepsk->nr_buf[6];
12908 salt->salt_buf[7] = ikepsk->nr_buf[7];
12909
12910 return (PARSER_OK);
12911 }
12912
12913 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12914 {
12915 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12916
12917 u32 *digest = (u32 *) hash_buf->digest;
12918
12919 salt_t *salt = hash_buf->salt;
12920
12921 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12922
12923 /**
12924 * Parse that strange long line
12925 */
12926
12927 char *in_off[9];
12928
12929 size_t in_len[9] = { 0 };
12930
12931 in_off[0] = strtok (input_buf, ":");
12932
12933 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12934
12935 in_len[0] = strlen (in_off[0]);
12936
12937 size_t i;
12938
12939 for (i = 1; i < 9; i++)
12940 {
12941 in_off[i] = strtok (NULL, ":");
12942
12943 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12944
12945 in_len[i] = strlen (in_off[i]);
12946 }
12947
12948 char *ptr = (char *) ikepsk->msg_buf;
12949
12950 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12951 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12952 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12953 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12954 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12955 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12956
12957 *ptr = 0x80;
12958
12959 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12960
12961 ptr = (char *) ikepsk->nr_buf;
12962
12963 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12964 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12965
12966 *ptr = 0x80;
12967
12968 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12969
12970 /**
12971 * Store to database
12972 */
12973
12974 ptr = in_off[8];
12975
12976 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12977 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12978 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12979 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12980 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12981
12982 salt->salt_len = 32;
12983
12984 salt->salt_buf[0] = ikepsk->nr_buf[0];
12985 salt->salt_buf[1] = ikepsk->nr_buf[1];
12986 salt->salt_buf[2] = ikepsk->nr_buf[2];
12987 salt->salt_buf[3] = ikepsk->nr_buf[3];
12988 salt->salt_buf[4] = ikepsk->nr_buf[4];
12989 salt->salt_buf[5] = ikepsk->nr_buf[5];
12990 salt->salt_buf[6] = ikepsk->nr_buf[6];
12991 salt->salt_buf[7] = ikepsk->nr_buf[7];
12992
12993 return (PARSER_OK);
12994 }
12995
12996 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12997 {
12998 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12999
13000 u32 *digest = (u32 *) hash_buf->digest;
13001
13002 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13003 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13004 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13005 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13006 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13007
13008 digest[0] = byte_swap_32 (digest[0]);
13009 digest[1] = byte_swap_32 (digest[1]);
13010 digest[2] = byte_swap_32 (digest[2]);
13011 digest[3] = byte_swap_32 (digest[3]);
13012 digest[4] = byte_swap_32 (digest[4]);
13013
13014 return (PARSER_OK);
13015 }
13016
13017 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13018 {
13019 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
13020
13021 u32 *digest = (u32 *) hash_buf->digest;
13022
13023 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13024 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13025 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
13026 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
13027 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
13028 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
13029 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
13030 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
13031 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
13032 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
13033 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
13034 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
13035 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
13036 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
13037 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
13038 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
13039
13040 return (PARSER_OK);
13041 }
13042
13043 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13044 {
13045 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
13046
13047 u32 *digest = (u32 *) hash_buf->digest;
13048
13049 salt_t *salt = hash_buf->salt;
13050
13051 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13052 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13053 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13054 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13055 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13056
13057 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13058
13059 uint salt_len = input_len - 40 - 1;
13060
13061 char *salt_buf = input_buf + 40 + 1;
13062
13063 char *salt_buf_ptr = (char *) salt->salt_buf;
13064
13065 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13066
13067 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13068
13069 salt->salt_len = salt_len;
13070
13071 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
13072
13073 return (PARSER_OK);
13074 }
13075
13076 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
13077 {
13078 u32 *digest = (u32 *) hash_buf->digest;
13079
13080 salt_t *salt = hash_buf->salt;
13081
13082 tc_t *tc = (tc_t *) hash_buf->esalt;
13083
13084 if (input_len == 0)
13085 {
13086 log_error ("TrueCrypt container not specified");
13087
13088 exit (-1);
13089 }
13090
13091 FILE *fp = fopen (input_buf, "rb");
13092
13093 if (fp == NULL)
13094 {
13095 log_error ("%s: %s", input_buf, strerror (errno));
13096
13097 exit (-1);
13098 }
13099
13100 char buf[512] = { 0 };
13101
13102 int n = fread (buf, 1, sizeof (buf), fp);
13103
13104 fclose (fp);
13105
13106 if (n != 512) return (PARSER_TC_FILE_SIZE);
13107
13108 memcpy (tc->salt_buf, buf, 64);
13109
13110 memcpy (tc->data_buf, buf + 64, 512 - 64);
13111
13112 salt->salt_buf[0] = tc->salt_buf[0];
13113
13114 salt->salt_len = 4;
13115
13116 salt->salt_iter = ROUNDS_TRUECRYPT_1K - 1;
13117
13118 tc->signature = 0x45555254; // "TRUE"
13119
13120 digest[0] = tc->data_buf[0];
13121
13122 return (PARSER_OK);
13123 }
13124
13125 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
13126 {
13127 u32 *digest = (u32 *) hash_buf->digest;
13128
13129 salt_t *salt = hash_buf->salt;
13130
13131 tc_t *tc = (tc_t *) hash_buf->esalt;
13132
13133 if (input_len == 0)
13134 {
13135 log_error ("TrueCrypt container not specified");
13136
13137 exit (-1);
13138 }
13139
13140 FILE *fp = fopen (input_buf, "rb");
13141
13142 if (fp == NULL)
13143 {
13144 log_error ("%s: %s", input_buf, strerror (errno));
13145
13146 exit (-1);
13147 }
13148
13149 char buf[512] = { 0 };
13150
13151 int n = fread (buf, 1, sizeof (buf), fp);
13152
13153 fclose (fp);
13154
13155 if (n != 512) return (PARSER_TC_FILE_SIZE);
13156
13157 memcpy (tc->salt_buf, buf, 64);
13158
13159 memcpy (tc->data_buf, buf + 64, 512 - 64);
13160
13161 salt->salt_buf[0] = tc->salt_buf[0];
13162
13163 salt->salt_len = 4;
13164
13165 salt->salt_iter = ROUNDS_TRUECRYPT_2K - 1;
13166
13167 tc->signature = 0x45555254; // "TRUE"
13168
13169 digest[0] = tc->data_buf[0];
13170
13171 return (PARSER_OK);
13172 }
13173
13174 int veracrypt_parse_hash_200000 (char *input_buf, uint input_len, hash_t *hash_buf)
13175 {
13176 u32 *digest = (u32 *) hash_buf->digest;
13177
13178 salt_t *salt = hash_buf->salt;
13179
13180 tc_t *tc = (tc_t *) hash_buf->esalt;
13181
13182 if (input_len == 0)
13183 {
13184 log_error ("VeraCrypt container not specified");
13185
13186 exit (-1);
13187 }
13188
13189 FILE *fp = fopen (input_buf, "rb");
13190
13191 if (fp == NULL)
13192 {
13193 log_error ("%s: %s", input_buf, strerror (errno));
13194
13195 exit (-1);
13196 }
13197
13198 char buf[512] = { 0 };
13199
13200 int n = fread (buf, 1, sizeof (buf), fp);
13201
13202 fclose (fp);
13203
13204 if (n != 512) return (PARSER_VC_FILE_SIZE);
13205
13206 memcpy (tc->salt_buf, buf, 64);
13207
13208 memcpy (tc->data_buf, buf + 64, 512 - 64);
13209
13210 salt->salt_buf[0] = tc->salt_buf[0];
13211
13212 salt->salt_len = 4;
13213
13214 salt->salt_iter = ROUNDS_VERACRYPT_200000 - 1;
13215
13216 tc->signature = 0x41524556; // "VERA"
13217
13218 digest[0] = tc->data_buf[0];
13219
13220 return (PARSER_OK);
13221 }
13222
13223 int veracrypt_parse_hash_500000 (char *input_buf, uint input_len, hash_t *hash_buf)
13224 {
13225 u32 *digest = (u32 *) hash_buf->digest;
13226
13227 salt_t *salt = hash_buf->salt;
13228
13229 tc_t *tc = (tc_t *) hash_buf->esalt;
13230
13231 if (input_len == 0)
13232 {
13233 log_error ("VeraCrypt container not specified");
13234
13235 exit (-1);
13236 }
13237
13238 FILE *fp = fopen (input_buf, "rb");
13239
13240 if (fp == NULL)
13241 {
13242 log_error ("%s: %s", input_buf, strerror (errno));
13243
13244 exit (-1);
13245 }
13246
13247 char buf[512] = { 0 };
13248
13249 int n = fread (buf, 1, sizeof (buf), fp);
13250
13251 fclose (fp);
13252
13253 if (n != 512) return (PARSER_VC_FILE_SIZE);
13254
13255 memcpy (tc->salt_buf, buf, 64);
13256
13257 memcpy (tc->data_buf, buf + 64, 512 - 64);
13258
13259 salt->salt_buf[0] = tc->salt_buf[0];
13260
13261 salt->salt_len = 4;
13262
13263 salt->salt_iter = ROUNDS_VERACRYPT_500000 - 1;
13264
13265 tc->signature = 0x41524556; // "VERA"
13266
13267 digest[0] = tc->data_buf[0];
13268
13269 return (PARSER_OK);
13270 }
13271
13272 int veracrypt_parse_hash_327661 (char *input_buf, uint input_len, hash_t *hash_buf)
13273 {
13274 u32 *digest = (u32 *) hash_buf->digest;
13275
13276 salt_t *salt = hash_buf->salt;
13277
13278 tc_t *tc = (tc_t *) hash_buf->esalt;
13279
13280 if (input_len == 0)
13281 {
13282 log_error ("VeraCrypt container not specified");
13283
13284 exit (-1);
13285 }
13286
13287 FILE *fp = fopen (input_buf, "rb");
13288
13289 if (fp == NULL)
13290 {
13291 log_error ("%s: %s", input_buf, strerror (errno));
13292
13293 exit (-1);
13294 }
13295
13296 char buf[512] = { 0 };
13297
13298 int n = fread (buf, 1, sizeof (buf), fp);
13299
13300 fclose (fp);
13301
13302 if (n != 512) return (PARSER_VC_FILE_SIZE);
13303
13304 memcpy (tc->salt_buf, buf, 64);
13305
13306 memcpy (tc->data_buf, buf + 64, 512 - 64);
13307
13308 salt->salt_buf[0] = tc->salt_buf[0];
13309
13310 salt->salt_len = 4;
13311
13312 salt->salt_iter = ROUNDS_VERACRYPT_327661 - 1;
13313
13314 tc->signature = 0x41524556; // "VERA"
13315
13316 digest[0] = tc->data_buf[0];
13317
13318 return (PARSER_OK);
13319 }
13320
13321 int veracrypt_parse_hash_655331 (char *input_buf, uint input_len, hash_t *hash_buf)
13322 {
13323 u32 *digest = (u32 *) hash_buf->digest;
13324
13325 salt_t *salt = hash_buf->salt;
13326
13327 tc_t *tc = (tc_t *) hash_buf->esalt;
13328
13329 if (input_len == 0)
13330 {
13331 log_error ("VeraCrypt container not specified");
13332
13333 exit (-1);
13334 }
13335
13336 FILE *fp = fopen (input_buf, "rb");
13337
13338 if (fp == NULL)
13339 {
13340 log_error ("%s: %s", input_buf, strerror (errno));
13341
13342 exit (-1);
13343 }
13344
13345 char buf[512] = { 0 };
13346
13347 int n = fread (buf, 1, sizeof (buf), fp);
13348
13349 fclose (fp);
13350
13351 if (n != 512) return (PARSER_VC_FILE_SIZE);
13352
13353 memcpy (tc->salt_buf, buf, 64);
13354
13355 memcpy (tc->data_buf, buf + 64, 512 - 64);
13356
13357 salt->salt_buf[0] = tc->salt_buf[0];
13358
13359 salt->salt_len = 4;
13360
13361 salt->salt_iter = ROUNDS_VERACRYPT_655331 - 1;
13362
13363 tc->signature = 0x41524556; // "VERA"
13364
13365 digest[0] = tc->data_buf[0];
13366
13367 return (PARSER_OK);
13368 }
13369
13370 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13371 {
13372 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
13373
13374 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13375
13376 u32 *digest = (u32 *) hash_buf->digest;
13377
13378 salt_t *salt = hash_buf->salt;
13379
13380 char *salt_pos = input_buf + 6;
13381
13382 char *hash_pos = strchr (salt_pos, '$');
13383
13384 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13385
13386 uint salt_len = hash_pos - salt_pos;
13387
13388 if (salt_len < 8) return (PARSER_SALT_LENGTH);
13389
13390 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13391
13392 salt->salt_len = salt_len;
13393
13394 salt->salt_iter = 1000;
13395
13396 hash_pos++;
13397
13398 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13399
13400 return (PARSER_OK);
13401 }
13402
13403 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13404 {
13405 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
13406
13407 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
13408
13409 u32 *digest = (u32 *) hash_buf->digest;
13410
13411 salt_t *salt = hash_buf->salt;
13412
13413 char *iter_pos = input_buf + 7;
13414
13415 char *salt_pos = strchr (iter_pos, '$');
13416
13417 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13418
13419 salt_pos++;
13420
13421 char *hash_pos = strchr (salt_pos, '$');
13422
13423 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13424
13425 uint salt_len = hash_pos - salt_pos;
13426
13427 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13428
13429 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13430
13431 salt->salt_len = salt_len;
13432
13433 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13434
13435 salt->salt_sign[0] = atoi (salt_iter);
13436
13437 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13438
13439 hash_pos++;
13440
13441 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13442
13443 digest[0] = byte_swap_32 (digest[0]);
13444 digest[1] = byte_swap_32 (digest[1]);
13445 digest[2] = byte_swap_32 (digest[2]);
13446 digest[3] = byte_swap_32 (digest[3]);
13447 digest[4] = byte_swap_32 (digest[4]);
13448
13449 return (PARSER_OK);
13450 }
13451
13452 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13453 {
13454 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
13455
13456 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13457
13458 u32 *digest = (u32 *) hash_buf->digest;
13459
13460 salt_t *salt = hash_buf->salt;
13461
13462 char *iter_pos = input_buf + 9;
13463
13464 char *salt_pos = strchr (iter_pos, '$');
13465
13466 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13467
13468 salt_pos++;
13469
13470 char *hash_pos = strchr (salt_pos, '$');
13471
13472 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13473
13474 uint salt_len = hash_pos - salt_pos;
13475
13476 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13477
13478 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13479
13480 salt->salt_len = salt_len;
13481
13482 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13483
13484 salt->salt_sign[0] = atoi (salt_iter);
13485
13486 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13487
13488 hash_pos++;
13489
13490 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13491
13492 digest[0] = byte_swap_32 (digest[0]);
13493 digest[1] = byte_swap_32 (digest[1]);
13494 digest[2] = byte_swap_32 (digest[2]);
13495 digest[3] = byte_swap_32 (digest[3]);
13496 digest[4] = byte_swap_32 (digest[4]);
13497 digest[5] = byte_swap_32 (digest[5]);
13498 digest[6] = byte_swap_32 (digest[6]);
13499 digest[7] = byte_swap_32 (digest[7]);
13500
13501 return (PARSER_OK);
13502 }
13503
13504 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13505 {
13506 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
13507
13508 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13509
13510 u64 *digest = (u64 *) hash_buf->digest;
13511
13512 salt_t *salt = hash_buf->salt;
13513
13514 char *iter_pos = input_buf + 9;
13515
13516 char *salt_pos = strchr (iter_pos, '$');
13517
13518 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13519
13520 salt_pos++;
13521
13522 char *hash_pos = strchr (salt_pos, '$');
13523
13524 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13525
13526 uint salt_len = hash_pos - salt_pos;
13527
13528 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13529
13530 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13531
13532 salt->salt_len = salt_len;
13533
13534 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13535
13536 salt->salt_sign[0] = atoi (salt_iter);
13537
13538 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13539
13540 hash_pos++;
13541
13542 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13543
13544 digest[0] = byte_swap_64 (digest[0]);
13545 digest[1] = byte_swap_64 (digest[1]);
13546 digest[2] = byte_swap_64 (digest[2]);
13547 digest[3] = byte_swap_64 (digest[3]);
13548 digest[4] = byte_swap_64 (digest[4]);
13549 digest[5] = byte_swap_64 (digest[5]);
13550 digest[6] = byte_swap_64 (digest[6]);
13551 digest[7] = byte_swap_64 (digest[7]);
13552
13553 return (PARSER_OK);
13554 }
13555
13556 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13557 {
13558 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
13559
13560 u32 *digest = (u32 *) hash_buf->digest;
13561
13562 salt_t *salt = hash_buf->salt;
13563
13564 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
13565
13566 /**
13567 * parse line
13568 */
13569
13570 char *iterations_pos = input_buf;
13571
13572 char *saltbuf_pos = strchr (iterations_pos, ':');
13573
13574 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13575
13576 uint iterations_len = saltbuf_pos - iterations_pos;
13577
13578 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
13579
13580 saltbuf_pos++;
13581
13582 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
13583
13584 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13585
13586 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
13587
13588 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
13589
13590 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
13591
13592 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
13593
13594 cipherbuf_pos++;
13595
13596 /**
13597 * pbkdf2 iterations
13598 */
13599
13600 salt->salt_iter = atoi (iterations_pos) - 1;
13601
13602 /**
13603 * handle salt encoding
13604 */
13605
13606 char *saltbuf_ptr = (char *) salt->salt_buf;
13607
13608 for (uint i = 0; i < saltbuf_len; i += 2)
13609 {
13610 const char p0 = saltbuf_pos[i + 0];
13611 const char p1 = saltbuf_pos[i + 1];
13612
13613 *saltbuf_ptr++ = hex_convert (p1) << 0
13614 | hex_convert (p0) << 4;
13615 }
13616
13617 salt->salt_len = saltbuf_len / 2;
13618
13619 /**
13620 * handle cipher encoding
13621 */
13622
13623 uint *tmp = (uint *) mymalloc (32);
13624
13625 char *cipherbuf_ptr = (char *) tmp;
13626
13627 for (uint i = 2016; i < cipherbuf_len; i += 2)
13628 {
13629 const char p0 = cipherbuf_pos[i + 0];
13630 const char p1 = cipherbuf_pos[i + 1];
13631
13632 *cipherbuf_ptr++ = hex_convert (p1) << 0
13633 | hex_convert (p0) << 4;
13634 }
13635
13636 // iv is stored at salt_buf 4 (length 16)
13637 // data is stored at salt_buf 8 (length 16)
13638
13639 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
13640 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
13641 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
13642 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
13643
13644 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
13645 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
13646 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
13647 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
13648
13649 free (tmp);
13650
13651 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
13652 {
13653 const char p0 = cipherbuf_pos[j + 0];
13654 const char p1 = cipherbuf_pos[j + 1];
13655
13656 agilekey->cipher[i] = hex_convert (p1) << 0
13657 | hex_convert (p0) << 4;
13658 }
13659
13660 /**
13661 * digest buf
13662 */
13663
13664 digest[0] = 0x10101010;
13665 digest[1] = 0x10101010;
13666 digest[2] = 0x10101010;
13667 digest[3] = 0x10101010;
13668
13669 return (PARSER_OK);
13670 }
13671
13672 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13673 {
13674 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
13675
13676 u32 *digest = (u32 *) hash_buf->digest;
13677
13678 salt_t *salt = hash_buf->salt;
13679
13680 char *hashbuf_pos = input_buf;
13681
13682 char *iterations_pos = strchr (hashbuf_pos, ':');
13683
13684 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13685
13686 uint hash_len = iterations_pos - hashbuf_pos;
13687
13688 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
13689
13690 iterations_pos++;
13691
13692 char *saltbuf_pos = strchr (iterations_pos, ':');
13693
13694 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13695
13696 uint iterations_len = saltbuf_pos - iterations_pos;
13697
13698 saltbuf_pos++;
13699
13700 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
13701
13702 if (salt_len > 32) return (PARSER_SALT_LENGTH);
13703
13704 char *salt_buf_ptr = (char *) salt->salt_buf;
13705
13706 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
13707
13708 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13709
13710 salt->salt_len = salt_len;
13711
13712 salt->salt_iter = atoi (iterations_pos) - 1;
13713
13714 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13715 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13716 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13717 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13718
13719 return (PARSER_OK);
13720 }
13721
13722 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13723 {
13724 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
13725
13726 u32 *digest = (u32 *) hash_buf->digest;
13727
13728 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13729 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13730 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13731 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13732 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13733 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13734 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13735 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13736
13737 digest[0] = byte_swap_32 (digest[0]);
13738 digest[1] = byte_swap_32 (digest[1]);
13739 digest[2] = byte_swap_32 (digest[2]);
13740 digest[3] = byte_swap_32 (digest[3]);
13741 digest[4] = byte_swap_32 (digest[4]);
13742 digest[5] = byte_swap_32 (digest[5]);
13743 digest[6] = byte_swap_32 (digest[6]);
13744 digest[7] = byte_swap_32 (digest[7]);
13745
13746 return (PARSER_OK);
13747 }
13748
13749 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13750 {
13751 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13752
13753 u32 *digest = (u32 *) hash_buf->digest;
13754
13755 salt_t *salt = hash_buf->salt;
13756
13757 char *salt_pos = input_buf + 3;
13758
13759 uint iterations_len = 0;
13760
13761 if (memcmp (salt_pos, "rounds=", 7) == 0)
13762 {
13763 salt_pos += 7;
13764
13765 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
13766
13767 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
13768 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
13769
13770 salt_pos[0] = 0x0;
13771
13772 salt->salt_iter = atoi (salt_pos - iterations_len);
13773
13774 salt_pos += 1;
13775
13776 iterations_len += 8;
13777 }
13778 else
13779 {
13780 salt->salt_iter = ROUNDS_SHA256CRYPT;
13781 }
13782
13783 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
13784
13785 char *hash_pos = strchr (salt_pos, '$');
13786
13787 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13788
13789 uint salt_len = hash_pos - salt_pos;
13790
13791 if (salt_len > 16) return (PARSER_SALT_LENGTH);
13792
13793 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13794
13795 salt->salt_len = salt_len;
13796
13797 hash_pos++;
13798
13799 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13800
13801 return (PARSER_OK);
13802 }
13803
13804 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13805 {
13806 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
13807
13808 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13809
13810 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
13811
13812 u64 *digest = (u64 *) hash_buf->digest;
13813
13814 salt_t *salt = hash_buf->salt;
13815
13816 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13817
13818 char *iter_pos = input_buf + 4;
13819
13820 char *salt_pos = strchr (iter_pos, '$');
13821
13822 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13823
13824 salt_pos++;
13825
13826 char *hash_pos = strchr (salt_pos, '$');
13827
13828 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13829
13830 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13831
13832 hash_pos++;
13833
13834 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13835 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13836 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13837 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13838 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13839 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13840 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13841 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13842
13843 uint salt_len = hash_pos - salt_pos - 1;
13844
13845 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
13846
13847 salt->salt_len = salt_len / 2;
13848
13849 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
13850 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
13851 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
13852 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
13853 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
13854 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
13855 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
13856 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
13857
13858 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
13859 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
13860 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
13861 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
13862 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
13863 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
13864 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
13865 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
13866 pbkdf2_sha512->salt_buf[8] = 0x01000000;
13867 pbkdf2_sha512->salt_buf[9] = 0x80;
13868
13869 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13870
13871 salt->salt_iter = atoi (iter_pos) - 1;
13872
13873 return (PARSER_OK);
13874 }
13875
13876 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13877 {
13878 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
13879
13880 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
13881
13882 u32 *digest = (u32 *) hash_buf->digest;
13883
13884 salt_t *salt = hash_buf->salt;
13885
13886 char *salt_pos = input_buf + 14;
13887
13888 char *hash_pos = strchr (salt_pos, '*');
13889
13890 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13891
13892 hash_pos++;
13893
13894 uint salt_len = hash_pos - salt_pos - 1;
13895
13896 char *salt_buf_ptr = (char *) salt->salt_buf;
13897
13898 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13899
13900 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13901
13902 salt->salt_len = salt_len;
13903
13904 u8 tmp_buf[100] = { 0 };
13905
13906 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
13907
13908 memcpy (digest, tmp_buf, 32);
13909
13910 digest[0] = byte_swap_32 (digest[0]);
13911 digest[1] = byte_swap_32 (digest[1]);
13912 digest[2] = byte_swap_32 (digest[2]);
13913 digest[3] = byte_swap_32 (digest[3]);
13914 digest[4] = byte_swap_32 (digest[4]);
13915 digest[5] = byte_swap_32 (digest[5]);
13916 digest[6] = byte_swap_32 (digest[6]);
13917 digest[7] = byte_swap_32 (digest[7]);
13918
13919 digest[0] -= SHA256M_A;
13920 digest[1] -= SHA256M_B;
13921 digest[2] -= SHA256M_C;
13922 digest[3] -= SHA256M_D;
13923 digest[4] -= SHA256M_E;
13924 digest[5] -= SHA256M_F;
13925 digest[6] -= SHA256M_G;
13926 digest[7] -= SHA256M_H;
13927
13928 return (PARSER_OK);
13929 }
13930
13931 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13932 {
13933 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13934
13935 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13936
13937 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13938
13939 u64 *digest = (u64 *) hash_buf->digest;
13940
13941 salt_t *salt = hash_buf->salt;
13942
13943 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13944
13945 char *iter_pos = input_buf + 19;
13946
13947 char *salt_pos = strchr (iter_pos, '.');
13948
13949 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13950
13951 salt_pos++;
13952
13953 char *hash_pos = strchr (salt_pos, '.');
13954
13955 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13956
13957 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13958
13959 hash_pos++;
13960
13961 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13962 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13963 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13964 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13965 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13966 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13967 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13968 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13969
13970 uint salt_len = hash_pos - salt_pos - 1;
13971
13972 salt_len /= 2;
13973
13974 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13975
13976 uint i;
13977
13978 for (i = 0; i < salt_len; i++)
13979 {
13980 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13981 }
13982
13983 salt_buf_ptr[salt_len + 3] = 0x01;
13984 salt_buf_ptr[salt_len + 4] = 0x80;
13985
13986 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13987
13988 salt->salt_len = salt_len;
13989
13990 salt->salt_iter = atoi (iter_pos) - 1;
13991
13992 return (PARSER_OK);
13993 }
13994
13995 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13996 {
13997 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13998
13999 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
14000
14001 u64 *digest = (u64 *) hash_buf->digest;
14002
14003 salt_t *salt = hash_buf->salt;
14004
14005 u8 tmp_buf[120] = { 0 };
14006
14007 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
14008
14009 if (tmp_len < 64) return (PARSER_HASH_LENGTH);
14010
14011 memcpy (digest, tmp_buf, 64);
14012
14013 digest[0] = byte_swap_64 (digest[0]);
14014 digest[1] = byte_swap_64 (digest[1]);
14015 digest[2] = byte_swap_64 (digest[2]);
14016 digest[3] = byte_swap_64 (digest[3]);
14017 digest[4] = byte_swap_64 (digest[4]);
14018 digest[5] = byte_swap_64 (digest[5]);
14019 digest[6] = byte_swap_64 (digest[6]);
14020 digest[7] = byte_swap_64 (digest[7]);
14021
14022 digest[0] -= SHA512M_A;
14023 digest[1] -= SHA512M_B;
14024 digest[2] -= SHA512M_C;
14025 digest[3] -= SHA512M_D;
14026 digest[4] -= SHA512M_E;
14027 digest[5] -= SHA512M_F;
14028 digest[6] -= SHA512M_G;
14029 digest[7] -= SHA512M_H;
14030
14031 int salt_len = tmp_len - 64;
14032
14033 if (salt_len < 0) return (PARSER_SALT_LENGTH);
14034
14035 salt->salt_len = salt_len;
14036
14037 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
14038
14039 if (data.opts_type & OPTS_TYPE_ST_ADD80)
14040 {
14041 char *ptr = (char *) salt->salt_buf;
14042
14043 ptr[salt->salt_len] = 0x80;
14044 }
14045
14046 return (PARSER_OK);
14047 }
14048
14049 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14050 {
14051 if (data.opts_type & OPTS_TYPE_ST_HEX)
14052 {
14053 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
14054 }
14055 else
14056 {
14057 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
14058 }
14059
14060 u32 *digest = (u32 *) hash_buf->digest;
14061
14062 salt_t *salt = hash_buf->salt;
14063
14064 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14065 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14066 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14067 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14068
14069 digest[0] = byte_swap_32 (digest[0]);
14070 digest[1] = byte_swap_32 (digest[1]);
14071 digest[2] = byte_swap_32 (digest[2]);
14072 digest[3] = byte_swap_32 (digest[3]);
14073
14074 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14075
14076 uint salt_len = input_len - 32 - 1;
14077
14078 char *salt_buf = input_buf + 32 + 1;
14079
14080 char *salt_buf_ptr = (char *) salt->salt_buf;
14081
14082 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14083
14084 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14085
14086 salt->salt_len = salt_len;
14087
14088 return (PARSER_OK);
14089 }
14090
14091 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14092 {
14093 if (data.opts_type & OPTS_TYPE_ST_HEX)
14094 {
14095 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
14096 }
14097 else
14098 {
14099 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
14100 }
14101
14102 u32 *digest = (u32 *) hash_buf->digest;
14103
14104 salt_t *salt = hash_buf->salt;
14105
14106 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14107 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14108 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14109 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14110 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14111
14112 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14113
14114 uint salt_len = input_len - 40 - 1;
14115
14116 char *salt_buf = input_buf + 40 + 1;
14117
14118 char *salt_buf_ptr = (char *) salt->salt_buf;
14119
14120 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14121
14122 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14123
14124 salt->salt_len = salt_len;
14125
14126 return (PARSER_OK);
14127 }
14128
14129 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14130 {
14131 if (data.opts_type & OPTS_TYPE_ST_HEX)
14132 {
14133 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
14134 }
14135 else
14136 {
14137 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
14138 }
14139
14140 u32 *digest = (u32 *) hash_buf->digest;
14141
14142 salt_t *salt = hash_buf->salt;
14143
14144 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14145 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14146 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14147 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14148 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14149 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
14150 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
14151 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
14152
14153 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14154
14155 uint salt_len = input_len - 64 - 1;
14156
14157 char *salt_buf = input_buf + 64 + 1;
14158
14159 char *salt_buf_ptr = (char *) salt->salt_buf;
14160
14161 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14162
14163 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14164
14165 salt->salt_len = salt_len;
14166
14167 return (PARSER_OK);
14168 }
14169
14170 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14171 {
14172 if (data.opts_type & OPTS_TYPE_ST_HEX)
14173 {
14174 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
14175 }
14176 else
14177 {
14178 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
14179 }
14180
14181 u64 *digest = (u64 *) hash_buf->digest;
14182
14183 salt_t *salt = hash_buf->salt;
14184
14185 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
14186 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
14187 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
14188 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
14189 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
14190 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
14191 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
14192 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
14193
14194 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14195
14196 uint salt_len = input_len - 128 - 1;
14197
14198 char *salt_buf = input_buf + 128 + 1;
14199
14200 char *salt_buf_ptr = (char *) salt->salt_buf;
14201
14202 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14203
14204 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14205
14206 salt->salt_len = salt_len;
14207
14208 return (PARSER_OK);
14209 }
14210
14211 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14212 {
14213 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
14214
14215 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
14216
14217 u32 *digest = (u32 *) hash_buf->digest;
14218
14219 salt_t *salt = hash_buf->salt;
14220
14221 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
14222
14223 /**
14224 * parse line
14225 */
14226
14227 char *user_pos = input_buf + 10 + 1;
14228
14229 char *realm_pos = strchr (user_pos, '$');
14230
14231 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14232
14233 uint user_len = realm_pos - user_pos;
14234
14235 if (user_len >= 64) return (PARSER_SALT_LENGTH);
14236
14237 realm_pos++;
14238
14239 char *salt_pos = strchr (realm_pos, '$');
14240
14241 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14242
14243 uint realm_len = salt_pos - realm_pos;
14244
14245 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
14246
14247 salt_pos++;
14248
14249 char *data_pos = strchr (salt_pos, '$');
14250
14251 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14252
14253 uint salt_len = data_pos - salt_pos;
14254
14255 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
14256
14257 data_pos++;
14258
14259 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
14260
14261 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
14262
14263 /**
14264 * copy data
14265 */
14266
14267 memcpy (krb5pa->user, user_pos, user_len);
14268 memcpy (krb5pa->realm, realm_pos, realm_len);
14269 memcpy (krb5pa->salt, salt_pos, salt_len);
14270
14271 char *timestamp_ptr = (char *) krb5pa->timestamp;
14272
14273 for (uint i = 0; i < (36 * 2); i += 2)
14274 {
14275 const char p0 = data_pos[i + 0];
14276 const char p1 = data_pos[i + 1];
14277
14278 *timestamp_ptr++ = hex_convert (p1) << 0
14279 | hex_convert (p0) << 4;
14280 }
14281
14282 char *checksum_ptr = (char *) krb5pa->checksum;
14283
14284 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
14285 {
14286 const char p0 = data_pos[i + 0];
14287 const char p1 = data_pos[i + 1];
14288
14289 *checksum_ptr++ = hex_convert (p1) << 0
14290 | hex_convert (p0) << 4;
14291 }
14292
14293 /**
14294 * copy some data to generic buffers to make sorting happy
14295 */
14296
14297 salt->salt_buf[0] = krb5pa->timestamp[0];
14298 salt->salt_buf[1] = krb5pa->timestamp[1];
14299 salt->salt_buf[2] = krb5pa->timestamp[2];
14300 salt->salt_buf[3] = krb5pa->timestamp[3];
14301 salt->salt_buf[4] = krb5pa->timestamp[4];
14302 salt->salt_buf[5] = krb5pa->timestamp[5];
14303 salt->salt_buf[6] = krb5pa->timestamp[6];
14304 salt->salt_buf[7] = krb5pa->timestamp[7];
14305 salt->salt_buf[8] = krb5pa->timestamp[8];
14306
14307 salt->salt_len = 36;
14308
14309 digest[0] = krb5pa->checksum[0];
14310 digest[1] = krb5pa->checksum[1];
14311 digest[2] = krb5pa->checksum[2];
14312 digest[3] = krb5pa->checksum[3];
14313
14314 return (PARSER_OK);
14315 }
14316
14317 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14318 {
14319 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
14320
14321 u32 *digest = (u32 *) hash_buf->digest;
14322
14323 salt_t *salt = hash_buf->salt;
14324
14325 /**
14326 * parse line
14327 */
14328
14329 char *salt_pos = input_buf;
14330
14331 char *hash_pos = strchr (salt_pos, '$');
14332
14333 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14334
14335 uint salt_len = hash_pos - salt_pos;
14336
14337 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14338
14339 hash_pos++;
14340
14341 uint hash_len = input_len - 1 - salt_len;
14342
14343 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14344
14345 /**
14346 * valid some data
14347 */
14348
14349 uint user_len = 0;
14350
14351 for (uint i = 0; i < salt_len; i++)
14352 {
14353 if (salt_pos[i] == ' ') continue;
14354
14355 user_len++;
14356 }
14357
14358 // SAP user names cannot be longer than 12 characters
14359 if (user_len > 12) return (PARSER_SALT_LENGTH);
14360
14361 // SAP user name cannot start with ! or ?
14362 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14363
14364 /**
14365 * copy data
14366 */
14367
14368 char *salt_buf_ptr = (char *) salt->salt_buf;
14369
14370 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14371
14372 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14373
14374 salt->salt_len = salt_len;
14375
14376 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
14377 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
14378 digest[2] = 0;
14379 digest[3] = 0;
14380
14381 digest[0] = byte_swap_32 (digest[0]);
14382 digest[1] = byte_swap_32 (digest[1]);
14383
14384 return (PARSER_OK);
14385 }
14386
14387 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14388 {
14389 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
14390
14391 u32 *digest = (u32 *) hash_buf->digest;
14392
14393 salt_t *salt = hash_buf->salt;
14394
14395 /**
14396 * parse line
14397 */
14398
14399 char *salt_pos = input_buf;
14400
14401 char *hash_pos = strchr (salt_pos, '$');
14402
14403 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14404
14405 uint salt_len = hash_pos - salt_pos;
14406
14407 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14408
14409 hash_pos++;
14410
14411 uint hash_len = input_len - 1 - salt_len;
14412
14413 if (hash_len != 40) return (PARSER_HASH_LENGTH);
14414
14415 /**
14416 * valid some data
14417 */
14418
14419 uint user_len = 0;
14420
14421 for (uint i = 0; i < salt_len; i++)
14422 {
14423 if (salt_pos[i] == ' ') continue;
14424
14425 user_len++;
14426 }
14427
14428 // SAP user names cannot be longer than 12 characters
14429 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
14430 // so far nobody complained so we stay with this because it helps in optimization
14431 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
14432
14433 if (user_len > 12) return (PARSER_SALT_LENGTH);
14434
14435 // SAP user name cannot start with ! or ?
14436 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14437
14438 /**
14439 * copy data
14440 */
14441
14442 char *salt_buf_ptr = (char *) salt->salt_buf;
14443
14444 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14445
14446 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14447
14448 salt->salt_len = salt_len;
14449
14450 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14451 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14452 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14453 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14454 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14455
14456 return (PARSER_OK);
14457 }
14458
14459 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14460 {
14461 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
14462
14463 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14464
14465 u64 *digest = (u64 *) hash_buf->digest;
14466
14467 salt_t *salt = hash_buf->salt;
14468
14469 char *iter_pos = input_buf + 3;
14470
14471 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
14472
14473 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
14474
14475 memcpy ((char *) salt->salt_sign, input_buf, 4);
14476
14477 salt->salt_iter = salt_iter;
14478
14479 char *salt_pos = iter_pos + 1;
14480
14481 uint salt_len = 8;
14482
14483 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
14484
14485 salt->salt_len = salt_len;
14486
14487 char *hash_pos = salt_pos + salt_len;
14488
14489 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14490
14491 // ugly hack start
14492
14493 char *tmp = (char *) salt->salt_buf_pc;
14494
14495 tmp[0] = hash_pos[42];
14496
14497 // ugly hack end
14498
14499 digest[ 0] = byte_swap_64 (digest[ 0]);
14500 digest[ 1] = byte_swap_64 (digest[ 1]);
14501 digest[ 2] = byte_swap_64 (digest[ 2]);
14502 digest[ 3] = byte_swap_64 (digest[ 3]);
14503 digest[ 4] = 0;
14504 digest[ 5] = 0;
14505 digest[ 6] = 0;
14506 digest[ 7] = 0;
14507
14508 return (PARSER_OK);
14509 }
14510
14511 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14512 {
14513 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
14514
14515 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14516
14517 u32 *digest = (u32 *) hash_buf->digest;
14518
14519 salt_t *salt = hash_buf->salt;
14520
14521 char *salt_buf = input_buf + 6;
14522
14523 uint salt_len = 16;
14524
14525 char *salt_buf_ptr = (char *) salt->salt_buf;
14526
14527 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14528
14529 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14530
14531 salt->salt_len = salt_len;
14532
14533 char *hash_pos = input_buf + 6 + 16;
14534
14535 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14536 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14537 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14538 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14539 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14540 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
14541 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
14542 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
14543
14544 return (PARSER_OK);
14545 }
14546
14547 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14548 {
14549 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
14550
14551 u32 *digest = (u32 *) hash_buf->digest;
14552
14553 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14554 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14555 digest[2] = 0;
14556 digest[3] = 0;
14557
14558 return (PARSER_OK);
14559 }
14560
14561 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14562 {
14563 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
14564
14565 u32 *digest = (u32 *) hash_buf->digest;
14566
14567 salt_t *salt = hash_buf->salt;
14568
14569 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
14570
14571 char *saltbuf_pos = input_buf;
14572
14573 char *hashbuf_pos = strchr (saltbuf_pos, ':');
14574
14575 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14576
14577 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
14578
14579 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
14580 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
14581
14582 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
14583
14584 hashbuf_pos++;
14585
14586 uint hashbuf_len = input_len - saltbuf_len - 1;
14587
14588 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
14589
14590 char *salt_ptr = (char *) saltbuf_pos;
14591 char *rakp_ptr = (char *) rakp->salt_buf;
14592
14593 uint i;
14594 uint j;
14595
14596 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
14597 {
14598 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
14599 }
14600
14601 rakp_ptr[j] = 0x80;
14602
14603 rakp->salt_len = j;
14604
14605 for (i = 0; i < 64; i++)
14606 {
14607 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
14608 }
14609
14610 salt->salt_buf[0] = rakp->salt_buf[0];
14611 salt->salt_buf[1] = rakp->salt_buf[1];
14612 salt->salt_buf[2] = rakp->salt_buf[2];
14613 salt->salt_buf[3] = rakp->salt_buf[3];
14614 salt->salt_buf[4] = rakp->salt_buf[4];
14615 salt->salt_buf[5] = rakp->salt_buf[5];
14616 salt->salt_buf[6] = rakp->salt_buf[6];
14617 salt->salt_buf[7] = rakp->salt_buf[7];
14618
14619 salt->salt_len = 32; // muss min. 32 haben
14620
14621 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14622 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14623 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14624 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14625 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14626
14627 return (PARSER_OK);
14628 }
14629
14630 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14631 {
14632 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
14633
14634 u32 *digest = (u32 *) hash_buf->digest;
14635
14636 salt_t *salt = hash_buf->salt;
14637
14638 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
14639
14640 char *salt_pos = input_buf + 1;
14641
14642 memcpy (salt->salt_buf, salt_pos, 8);
14643
14644 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14645 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14646
14647 salt->salt_len = 8;
14648
14649 char *hash_pos = salt_pos + 8;
14650
14651 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14652 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14653 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14654 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14655 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14656
14657 digest[0] -= SHA1M_A;
14658 digest[1] -= SHA1M_B;
14659 digest[2] -= SHA1M_C;
14660 digest[3] -= SHA1M_D;
14661 digest[4] -= SHA1M_E;
14662
14663 return (PARSER_OK);
14664 }
14665
14666 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14667 {
14668 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
14669
14670 u32 *digest = (u32 *) hash_buf->digest;
14671
14672 salt_t *salt = hash_buf->salt;
14673
14674 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14675 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14676 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14677 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14678
14679 digest[0] = byte_swap_32 (digest[0]);
14680 digest[1] = byte_swap_32 (digest[1]);
14681 digest[2] = byte_swap_32 (digest[2]);
14682 digest[3] = byte_swap_32 (digest[3]);
14683
14684 digest[0] -= MD5M_A;
14685 digest[1] -= MD5M_B;
14686 digest[2] -= MD5M_C;
14687 digest[3] -= MD5M_D;
14688
14689 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14690
14691 char *salt_buf_ptr = input_buf + 32 + 1;
14692
14693 u32 *salt_buf = salt->salt_buf;
14694
14695 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
14696 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
14697 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
14698 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
14699
14700 salt_buf[0] = byte_swap_32 (salt_buf[0]);
14701 salt_buf[1] = byte_swap_32 (salt_buf[1]);
14702 salt_buf[2] = byte_swap_32 (salt_buf[2]);
14703 salt_buf[3] = byte_swap_32 (salt_buf[3]);
14704
14705 salt->salt_len = 16 + 1;
14706
14707 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14708
14709 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
14710
14711 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
14712
14713 return (PARSER_OK);
14714 }
14715
14716 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14717 {
14718 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
14719
14720 u32 *digest = (u32 *) hash_buf->digest;
14721
14722 salt_t *salt = hash_buf->salt;
14723
14724 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
14725
14726 /**
14727 * parse line
14728 */
14729
14730 char *hashbuf_pos = input_buf;
14731
14732 char *saltbuf_pos = strchr (hashbuf_pos, ':');
14733
14734 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14735
14736 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
14737
14738 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
14739
14740 saltbuf_pos++;
14741
14742 char *iteration_pos = strchr (saltbuf_pos, ':');
14743
14744 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14745
14746 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14747
14748 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14749
14750 iteration_pos++;
14751
14752 char *databuf_pos = strchr (iteration_pos, ':');
14753
14754 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14755
14756 const uint iteration_len = databuf_pos - iteration_pos;
14757
14758 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14759 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
14760
14761 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
14762
14763 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
14764 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
14765
14766 databuf_pos++;
14767
14768 // digest
14769
14770 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14771 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14772 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14773 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14774 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14775 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
14776 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
14777 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
14778
14779 // salt
14780
14781 char *saltbuf_ptr = (char *) salt->salt_buf;
14782
14783 for (uint i = 0; i < saltbuf_len; i += 2)
14784 {
14785 const char p0 = saltbuf_pos[i + 0];
14786 const char p1 = saltbuf_pos[i + 1];
14787
14788 *saltbuf_ptr++ = hex_convert (p1) << 0
14789 | hex_convert (p0) << 4;
14790 }
14791
14792 salt->salt_buf[4] = 0x01000000;
14793 salt->salt_buf[5] = 0x80;
14794
14795 salt->salt_len = saltbuf_len / 2;
14796
14797 // iteration
14798
14799 salt->salt_iter = atoi (iteration_pos) - 1;
14800
14801 // data
14802
14803 char *databuf_ptr = (char *) cloudkey->data_buf;
14804
14805 for (uint i = 0; i < databuf_len; i += 2)
14806 {
14807 const char p0 = databuf_pos[i + 0];
14808 const char p1 = databuf_pos[i + 1];
14809
14810 *databuf_ptr++ = hex_convert (p1) << 0
14811 | hex_convert (p0) << 4;
14812 }
14813
14814 *databuf_ptr++ = 0x80;
14815
14816 for (uint i = 0; i < 512; i++)
14817 {
14818 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
14819 }
14820
14821 cloudkey->data_len = databuf_len / 2;
14822
14823 return (PARSER_OK);
14824 }
14825
14826 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14827 {
14828 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
14829
14830 u32 *digest = (u32 *) hash_buf->digest;
14831
14832 salt_t *salt = hash_buf->salt;
14833
14834 /**
14835 * parse line
14836 */
14837
14838 char *hashbuf_pos = input_buf;
14839
14840 char *domainbuf_pos = strchr (hashbuf_pos, ':');
14841
14842 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14843
14844 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
14845
14846 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
14847
14848 domainbuf_pos++;
14849
14850 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
14851
14852 char *saltbuf_pos = strchr (domainbuf_pos, ':');
14853
14854 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14855
14856 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
14857
14858 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
14859
14860 saltbuf_pos++;
14861
14862 char *iteration_pos = strchr (saltbuf_pos, ':');
14863
14864 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14865
14866 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14867
14868 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
14869
14870 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
14871
14872 iteration_pos++;
14873
14874 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
14875
14876 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14877 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
14878
14879 // ok, the plan for this algorithm is the following:
14880 // we have 2 salts here, the domain-name and a random salt
14881 // while both are used in the initial transformation,
14882 // only the random salt is used in the following iterations
14883 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
14884 // and one that includes only the real salt (stored into salt_buf[]).
14885 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
14886
14887 u8 tmp_buf[100] = { 0 };
14888
14889 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
14890
14891 memcpy (digest, tmp_buf, 20);
14892
14893 digest[0] = byte_swap_32 (digest[0]);
14894 digest[1] = byte_swap_32 (digest[1]);
14895 digest[2] = byte_swap_32 (digest[2]);
14896 digest[3] = byte_swap_32 (digest[3]);
14897 digest[4] = byte_swap_32 (digest[4]);
14898
14899 // domain
14900
14901 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14902
14903 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
14904
14905 char *len_ptr = NULL;
14906
14907 for (uint i = 0; i < domainbuf_len; i++)
14908 {
14909 if (salt_buf_pc_ptr[i] == '.')
14910 {
14911 len_ptr = &salt_buf_pc_ptr[i];
14912
14913 *len_ptr = 0;
14914 }
14915 else
14916 {
14917 *len_ptr += 1;
14918 }
14919 }
14920
14921 salt->salt_buf_pc[7] = domainbuf_len;
14922
14923 // "real" salt
14924
14925 char *salt_buf_ptr = (char *) salt->salt_buf;
14926
14927 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
14928
14929 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14930
14931 salt->salt_len = salt_len;
14932
14933 // iteration
14934
14935 salt->salt_iter = atoi (iteration_pos);
14936
14937 return (PARSER_OK);
14938 }
14939
14940 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14941 {
14942 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14943
14944 u32 *digest = (u32 *) hash_buf->digest;
14945
14946 salt_t *salt = hash_buf->salt;
14947
14948 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14949 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14950 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14951 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14952 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14953
14954 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14955
14956 uint salt_len = input_len - 40 - 1;
14957
14958 char *salt_buf = input_buf + 40 + 1;
14959
14960 char *salt_buf_ptr = (char *) salt->salt_buf;
14961
14962 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14963
14964 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14965
14966 salt->salt_len = salt_len;
14967
14968 return (PARSER_OK);
14969 }
14970
14971 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14972 {
14973 const u8 ascii_to_ebcdic[] =
14974 {
14975 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14976 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14977 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14978 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14979 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14980 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14981 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14982 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14983 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14984 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14985 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14986 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14987 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14988 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14989 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14990 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14991 };
14992
14993 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14994
14995 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14996
14997 u32 *digest = (u32 *) hash_buf->digest;
14998
14999 salt_t *salt = hash_buf->salt;
15000
15001 char *salt_pos = input_buf + 6 + 1;
15002
15003 char *digest_pos = strchr (salt_pos, '*');
15004
15005 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15006
15007 uint salt_len = digest_pos - salt_pos;
15008
15009 if (salt_len > 8) return (PARSER_SALT_LENGTH);
15010
15011 uint hash_len = input_len - 1 - salt_len - 1 - 6;
15012
15013 if (hash_len != 16) return (PARSER_HASH_LENGTH);
15014
15015 digest_pos++;
15016
15017 char *salt_buf_ptr = (char *) salt->salt_buf;
15018 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
15019
15020 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
15021
15022 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15023
15024 salt->salt_len = salt_len;
15025
15026 for (uint i = 0; i < salt_len; i++)
15027 {
15028 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
15029 }
15030 for (uint i = salt_len; i < 8; i++)
15031 {
15032 salt_buf_pc_ptr[i] = 0x40;
15033 }
15034
15035 uint tt;
15036
15037 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
15038
15039 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
15040 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
15041
15042 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
15043 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
15044
15045 digest[0] = byte_swap_32 (digest[0]);
15046 digest[1] = byte_swap_32 (digest[1]);
15047
15048 IP (digest[0], digest[1], tt);
15049
15050 digest[0] = rotr32 (digest[0], 29);
15051 digest[1] = rotr32 (digest[1], 29);
15052 digest[2] = 0;
15053 digest[3] = 0;
15054
15055 return (PARSER_OK);
15056 }
15057
15058 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15059 {
15060 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
15061
15062 u32 *digest = (u32 *) hash_buf->digest;
15063
15064 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15065 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15066 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15067 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15068
15069 digest[0] = byte_swap_32 (digest[0]);
15070 digest[1] = byte_swap_32 (digest[1]);
15071 digest[2] = byte_swap_32 (digest[2]);
15072 digest[3] = byte_swap_32 (digest[3]);
15073
15074 return (PARSER_OK);
15075 }
15076
15077 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15078 {
15079 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
15080
15081 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
15082
15083 u32 *digest = (u32 *) hash_buf->digest;
15084
15085 salt_t *salt = hash_buf->salt;
15086
15087 u8 tmp_buf[120] = { 0 };
15088
15089 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
15090
15091 tmp_buf[3] += -4; // dont ask!
15092
15093 memcpy (salt->salt_buf, tmp_buf, 5);
15094
15095 salt->salt_len = 5;
15096
15097 memcpy (digest, tmp_buf + 5, 9);
15098
15099 // yes, only 9 byte are needed to crack, but 10 to display
15100
15101 salt->salt_buf_pc[7] = input_buf[20];
15102
15103 return (PARSER_OK);
15104 }
15105
15106 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15107 {
15108 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
15109
15110 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
15111
15112 u32 *digest = (u32 *) hash_buf->digest;
15113
15114 salt_t *salt = hash_buf->salt;
15115
15116 u8 tmp_buf[120] = { 0 };
15117
15118 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
15119
15120 tmp_buf[3] += -4; // dont ask!
15121
15122 // salt
15123
15124 memcpy (salt->salt_buf, tmp_buf, 16);
15125
15126 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)
15127
15128 // iteration
15129
15130 char tmp_iter_buf[11] = { 0 };
15131
15132 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
15133
15134 tmp_iter_buf[10] = 0;
15135
15136 salt->salt_iter = atoi (tmp_iter_buf);
15137
15138 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
15139 {
15140 return (PARSER_SALT_ITERATION);
15141 }
15142
15143 salt->salt_iter--; // first round in init
15144
15145 // 2 additional bytes for display only
15146
15147 salt->salt_buf_pc[0] = tmp_buf[26];
15148 salt->salt_buf_pc[1] = tmp_buf[27];
15149
15150 // digest
15151
15152 memcpy (digest, tmp_buf + 28, 8);
15153
15154 digest[0] = byte_swap_32 (digest[0]);
15155 digest[1] = byte_swap_32 (digest[1]);
15156 digest[2] = 0;
15157 digest[3] = 0;
15158
15159 return (PARSER_OK);
15160 }
15161
15162 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15163 {
15164 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
15165
15166 u32 *digest = (u32 *) hash_buf->digest;
15167
15168 salt_t *salt = hash_buf->salt;
15169
15170 char *salt_buf_pos = input_buf;
15171
15172 char *hash_buf_pos = salt_buf_pos + 6;
15173
15174 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
15175 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
15176 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
15177 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
15178 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
15179 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
15180 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
15181 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
15182
15183 digest[0] -= SHA256M_A;
15184 digest[1] -= SHA256M_B;
15185 digest[2] -= SHA256M_C;
15186 digest[3] -= SHA256M_D;
15187 digest[4] -= SHA256M_E;
15188 digest[5] -= SHA256M_F;
15189 digest[6] -= SHA256M_G;
15190 digest[7] -= SHA256M_H;
15191
15192 char *salt_buf_ptr = (char *) salt->salt_buf;
15193
15194 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
15195
15196 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15197
15198 salt->salt_len = salt_len;
15199
15200 return (PARSER_OK);
15201 }
15202
15203 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15204 {
15205 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
15206
15207 u32 *digest = (u32 *) hash_buf->digest;
15208
15209 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15210
15211 salt_t *salt = hash_buf->salt;
15212
15213 char *salt_buf = input_buf + 6;
15214
15215 char *digest_buf = strchr (salt_buf, '$');
15216
15217 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15218
15219 uint salt_len = digest_buf - salt_buf;
15220
15221 digest_buf++; // skip the '$' symbol
15222
15223 char *salt_buf_ptr = (char *) salt->salt_buf;
15224
15225 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15226
15227 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15228
15229 salt->salt_len = salt_len;
15230
15231 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15232 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15233 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15234 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15235
15236 digest[0] = byte_swap_32 (digest[0]);
15237 digest[1] = byte_swap_32 (digest[1]);
15238 digest[2] = byte_swap_32 (digest[2]);
15239 digest[3] = byte_swap_32 (digest[3]);
15240
15241 digest[0] -= MD5M_A;
15242 digest[1] -= MD5M_B;
15243 digest[2] -= MD5M_C;
15244 digest[3] -= MD5M_D;
15245
15246 return (PARSER_OK);
15247 }
15248
15249 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15250 {
15251 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
15252
15253 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15254
15255 u32 *digest = (u32 *) hash_buf->digest;
15256
15257 salt_t *salt = hash_buf->salt;
15258
15259 char *salt_buf = input_buf + 3;
15260
15261 char *digest_buf = strchr (salt_buf, '$');
15262
15263 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15264
15265 uint salt_len = digest_buf - salt_buf;
15266
15267 digest_buf++; // skip the '$' symbol
15268
15269 char *salt_buf_ptr = (char *) salt->salt_buf;
15270
15271 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15272
15273 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15274
15275 salt_buf_ptr[salt_len] = 0x2d;
15276
15277 salt->salt_len = salt_len + 1;
15278
15279 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15280 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15281 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15282 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15283
15284 digest[0] = byte_swap_32 (digest[0]);
15285 digest[1] = byte_swap_32 (digest[1]);
15286 digest[2] = byte_swap_32 (digest[2]);
15287 digest[3] = byte_swap_32 (digest[3]);
15288
15289 digest[0] -= MD5M_A;
15290 digest[1] -= MD5M_B;
15291 digest[2] -= MD5M_C;
15292 digest[3] -= MD5M_D;
15293
15294 return (PARSER_OK);
15295 }
15296
15297 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15298 {
15299 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
15300
15301 u32 *digest = (u32 *) hash_buf->digest;
15302
15303 salt_t *salt = hash_buf->salt;
15304
15305 u8 tmp_buf[100] = { 0 };
15306
15307 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
15308
15309 memcpy (digest, tmp_buf, 20);
15310
15311 digest[0] = byte_swap_32 (digest[0]);
15312 digest[1] = byte_swap_32 (digest[1]);
15313 digest[2] = byte_swap_32 (digest[2]);
15314 digest[3] = byte_swap_32 (digest[3]);
15315 digest[4] = byte_swap_32 (digest[4]);
15316
15317 digest[0] -= SHA1M_A;
15318 digest[1] -= SHA1M_B;
15319 digest[2] -= SHA1M_C;
15320 digest[3] -= SHA1M_D;
15321 digest[4] -= SHA1M_E;
15322
15323 salt->salt_buf[0] = 0x80;
15324
15325 salt->salt_len = 0;
15326
15327 return (PARSER_OK);
15328 }
15329
15330 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15331 {
15332 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
15333
15334 u32 *digest = (u32 *) hash_buf->digest;
15335
15336 salt_t *salt = hash_buf->salt;
15337
15338 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15339 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15340 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15341 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15342
15343 digest[0] = byte_swap_32 (digest[0]);
15344 digest[1] = byte_swap_32 (digest[1]);
15345 digest[2] = byte_swap_32 (digest[2]);
15346 digest[3] = byte_swap_32 (digest[3]);
15347
15348 digest[0] -= MD5M_A;
15349 digest[1] -= MD5M_B;
15350 digest[2] -= MD5M_C;
15351 digest[3] -= MD5M_D;
15352
15353 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15354
15355 uint salt_len = input_len - 32 - 1;
15356
15357 char *salt_buf = input_buf + 32 + 1;
15358
15359 char *salt_buf_ptr = (char *) salt->salt_buf;
15360
15361 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15362
15363 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15364
15365 /*
15366 * add static "salt" part
15367 */
15368
15369 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
15370
15371 salt_len += 8;
15372
15373 salt->salt_len = salt_len;
15374
15375 return (PARSER_OK);
15376 }
15377
15378 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15379 {
15380 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
15381
15382 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
15383
15384 u32 *digest = (u32 *) hash_buf->digest;
15385
15386 salt_t *salt = hash_buf->salt;
15387
15388 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
15389
15390 /**
15391 * parse line
15392 */
15393
15394 char *saltlen_pos = input_buf + 1 + 3 + 1;
15395
15396 char *saltbuf_pos = strchr (saltlen_pos, '$');
15397
15398 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15399
15400 uint saltlen_len = saltbuf_pos - saltlen_pos;
15401
15402 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
15403
15404 saltbuf_pos++;
15405
15406 char *keylen_pos = strchr (saltbuf_pos, '$');
15407
15408 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15409
15410 uint saltbuf_len = keylen_pos - saltbuf_pos;
15411
15412 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
15413
15414 keylen_pos++;
15415
15416 char *keybuf_pos = strchr (keylen_pos, '$');
15417
15418 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15419
15420 uint keylen_len = keybuf_pos - keylen_pos;
15421
15422 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
15423
15424 keybuf_pos++;
15425
15426 char *databuf_pos = strchr (keybuf_pos, '$');
15427
15428 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15429
15430 uint keybuf_len = databuf_pos - keybuf_pos;
15431
15432 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
15433
15434 databuf_pos++;
15435
15436 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
15437
15438 if (data_len != 3072) return (PARSER_SALT_LENGTH);
15439
15440 /**
15441 * copy data
15442 */
15443
15444 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
15445 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
15446 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
15447 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
15448
15449 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
15450 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
15451 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
15452 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
15453
15454 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15455 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15456 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15457 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15458
15459 salt->salt_len = 16;
15460 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
15461
15462 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
15463 {
15464 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
15465 }
15466
15467 return (PARSER_OK);
15468 }
15469
15470 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15471 {
15472 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
15473
15474 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15475
15476 u32 *digest = (u32 *) hash_buf->digest;
15477
15478 salt_t *salt = hash_buf->salt;
15479
15480 /**
15481 * parse line
15482 */
15483
15484 // first is the N salt parameter
15485
15486 char *N_pos = input_buf + 6;
15487
15488 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15489
15490 N_pos++;
15491
15492 salt->scrypt_N = atoi (N_pos);
15493
15494 // r
15495
15496 char *r_pos = strchr (N_pos, ':');
15497
15498 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15499
15500 r_pos++;
15501
15502 salt->scrypt_r = atoi (r_pos);
15503
15504 // p
15505
15506 char *p_pos = strchr (r_pos, ':');
15507
15508 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15509
15510 p_pos++;
15511
15512 salt->scrypt_p = atoi (p_pos);
15513
15514 // salt
15515
15516 char *saltbuf_pos = strchr (p_pos, ':');
15517
15518 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15519
15520 saltbuf_pos++;
15521
15522 char *hash_pos = strchr (saltbuf_pos, ':');
15523
15524 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15525
15526 hash_pos++;
15527
15528 // base64 decode
15529
15530 int salt_len_base64 = hash_pos - saltbuf_pos;
15531
15532 if (salt_len_base64 > 45) return (PARSER_SALT_LENGTH);
15533
15534 u8 tmp_buf[33] = { 0 };
15535
15536 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, salt_len_base64, tmp_buf);
15537
15538 char *salt_buf_ptr = (char *) salt->salt_buf;
15539
15540 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
15541
15542 salt->salt_len = tmp_len;
15543 salt->salt_iter = 1;
15544
15545 // digest - base64 decode
15546
15547 memset (tmp_buf, 0, sizeof (tmp_buf));
15548
15549 tmp_len = input_len - (hash_pos - input_buf);
15550
15551 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
15552
15553 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
15554
15555 memcpy (digest, tmp_buf, 32);
15556
15557 return (PARSER_OK);
15558 }
15559
15560 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15561 {
15562 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
15563
15564 u32 *digest = (u32 *) hash_buf->digest;
15565
15566 salt_t *salt = hash_buf->salt;
15567
15568 /**
15569 * parse line
15570 */
15571
15572 char decrypted[76] = { 0 }; // iv + hash
15573
15574 juniper_decrypt_hash (input_buf, decrypted);
15575
15576 char *md5crypt_hash = decrypted + 12;
15577
15578 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
15579
15580 salt->salt_iter = ROUNDS_MD5CRYPT;
15581
15582 char *salt_pos = md5crypt_hash + 3;
15583
15584 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
15585
15586 salt->salt_len = hash_pos - salt_pos; // should be 8
15587
15588 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
15589
15590 hash_pos++;
15591
15592 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
15593
15594 return (PARSER_OK);
15595 }
15596
15597 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15598 {
15599 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
15600
15601 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15602
15603 u32 *digest = (u32 *) hash_buf->digest;
15604
15605 salt_t *salt = hash_buf->salt;
15606
15607 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15608
15609 /**
15610 * parse line
15611 */
15612
15613 // first is *raw* salt
15614
15615 char *salt_pos = input_buf + 3;
15616
15617 char *hash_pos = strchr (salt_pos, '$');
15618
15619 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15620
15621 uint salt_len = hash_pos - salt_pos;
15622
15623 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15624
15625 hash_pos++;
15626
15627 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15628
15629 memcpy (salt_buf_ptr, salt_pos, 14);
15630
15631 salt_buf_ptr[17] = 0x01;
15632 salt_buf_ptr[18] = 0x80;
15633
15634 // add some stuff to normal salt to make sorted happy
15635
15636 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15637 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15638 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15639 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15640
15641 salt->salt_len = salt_len;
15642 salt->salt_iter = ROUNDS_CISCO8 - 1;
15643
15644 // base64 decode hash
15645
15646 u8 tmp_buf[100] = { 0 };
15647
15648 uint hash_len = input_len - 3 - salt_len - 1;
15649
15650 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15651
15652 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15653
15654 memcpy (digest, tmp_buf, 32);
15655
15656 digest[0] = byte_swap_32 (digest[0]);
15657 digest[1] = byte_swap_32 (digest[1]);
15658 digest[2] = byte_swap_32 (digest[2]);
15659 digest[3] = byte_swap_32 (digest[3]);
15660 digest[4] = byte_swap_32 (digest[4]);
15661 digest[5] = byte_swap_32 (digest[5]);
15662 digest[6] = byte_swap_32 (digest[6]);
15663 digest[7] = byte_swap_32 (digest[7]);
15664
15665 return (PARSER_OK);
15666 }
15667
15668 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15669 {
15670 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
15671
15672 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15673
15674 u32 *digest = (u32 *) hash_buf->digest;
15675
15676 salt_t *salt = hash_buf->salt;
15677
15678 /**
15679 * parse line
15680 */
15681
15682 // first is *raw* salt
15683
15684 char *salt_pos = input_buf + 3;
15685
15686 char *hash_pos = strchr (salt_pos, '$');
15687
15688 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15689
15690 uint salt_len = hash_pos - salt_pos;
15691
15692 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15693
15694 salt->salt_len = salt_len;
15695 hash_pos++;
15696
15697 char *salt_buf_ptr = (char *) salt->salt_buf;
15698
15699 memcpy (salt_buf_ptr, salt_pos, salt_len);
15700 salt_buf_ptr[salt_len] = 0;
15701
15702 // base64 decode hash
15703
15704 u8 tmp_buf[100] = { 0 };
15705
15706 uint hash_len = input_len - 3 - salt_len - 1;
15707
15708 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15709
15710 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15711
15712 memcpy (digest, tmp_buf, 32);
15713
15714 // fixed:
15715 salt->scrypt_N = 16384;
15716 salt->scrypt_r = 1;
15717 salt->scrypt_p = 1;
15718 salt->salt_iter = 1;
15719
15720 return (PARSER_OK);
15721 }
15722
15723 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15724 {
15725 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
15726
15727 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15728
15729 u32 *digest = (u32 *) hash_buf->digest;
15730
15731 salt_t *salt = hash_buf->salt;
15732
15733 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
15734
15735 /**
15736 * parse line
15737 */
15738
15739 char *version_pos = input_buf + 8 + 1;
15740
15741 char *verifierHashSize_pos = strchr (version_pos, '*');
15742
15743 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15744
15745 u32 version_len = verifierHashSize_pos - version_pos;
15746
15747 if (version_len != 4) return (PARSER_SALT_LENGTH);
15748
15749 verifierHashSize_pos++;
15750
15751 char *keySize_pos = strchr (verifierHashSize_pos, '*');
15752
15753 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15754
15755 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
15756
15757 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
15758
15759 keySize_pos++;
15760
15761 char *saltSize_pos = strchr (keySize_pos, '*');
15762
15763 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15764
15765 u32 keySize_len = saltSize_pos - keySize_pos;
15766
15767 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15768
15769 saltSize_pos++;
15770
15771 char *osalt_pos = strchr (saltSize_pos, '*');
15772
15773 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15774
15775 u32 saltSize_len = osalt_pos - saltSize_pos;
15776
15777 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15778
15779 osalt_pos++;
15780
15781 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15782
15783 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15784
15785 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15786
15787 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15788
15789 encryptedVerifier_pos++;
15790
15791 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15792
15793 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15794
15795 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15796
15797 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15798
15799 encryptedVerifierHash_pos++;
15800
15801 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;
15802
15803 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15804
15805 const uint version = atoi (version_pos);
15806
15807 if (version != 2007) return (PARSER_SALT_VALUE);
15808
15809 const uint verifierHashSize = atoi (verifierHashSize_pos);
15810
15811 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
15812
15813 const uint keySize = atoi (keySize_pos);
15814
15815 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
15816
15817 office2007->keySize = keySize;
15818
15819 const uint saltSize = atoi (saltSize_pos);
15820
15821 if (saltSize != 16) return (PARSER_SALT_VALUE);
15822
15823 /**
15824 * salt
15825 */
15826
15827 salt->salt_len = 16;
15828 salt->salt_iter = ROUNDS_OFFICE2007;
15829
15830 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15831 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15832 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15833 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15834
15835 /**
15836 * esalt
15837 */
15838
15839 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15840 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15841 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15842 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15843
15844 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15845 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15846 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15847 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15848 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15849
15850 /**
15851 * digest
15852 */
15853
15854 digest[0] = office2007->encryptedVerifierHash[0];
15855 digest[1] = office2007->encryptedVerifierHash[1];
15856 digest[2] = office2007->encryptedVerifierHash[2];
15857 digest[3] = office2007->encryptedVerifierHash[3];
15858
15859 return (PARSER_OK);
15860 }
15861
15862 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15863 {
15864 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
15865
15866 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15867
15868 u32 *digest = (u32 *) hash_buf->digest;
15869
15870 salt_t *salt = hash_buf->salt;
15871
15872 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
15873
15874 /**
15875 * parse line
15876 */
15877
15878 char *version_pos = input_buf + 8 + 1;
15879
15880 char *spinCount_pos = strchr (version_pos, '*');
15881
15882 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15883
15884 u32 version_len = spinCount_pos - version_pos;
15885
15886 if (version_len != 4) return (PARSER_SALT_LENGTH);
15887
15888 spinCount_pos++;
15889
15890 char *keySize_pos = strchr (spinCount_pos, '*');
15891
15892 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15893
15894 u32 spinCount_len = keySize_pos - spinCount_pos;
15895
15896 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15897
15898 keySize_pos++;
15899
15900 char *saltSize_pos = strchr (keySize_pos, '*');
15901
15902 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15903
15904 u32 keySize_len = saltSize_pos - keySize_pos;
15905
15906 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15907
15908 saltSize_pos++;
15909
15910 char *osalt_pos = strchr (saltSize_pos, '*');
15911
15912 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15913
15914 u32 saltSize_len = osalt_pos - saltSize_pos;
15915
15916 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15917
15918 osalt_pos++;
15919
15920 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15921
15922 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15923
15924 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15925
15926 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15927
15928 encryptedVerifier_pos++;
15929
15930 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15931
15932 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15933
15934 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15935
15936 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15937
15938 encryptedVerifierHash_pos++;
15939
15940 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;
15941
15942 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15943
15944 const uint version = atoi (version_pos);
15945
15946 if (version != 2010) return (PARSER_SALT_VALUE);
15947
15948 const uint spinCount = atoi (spinCount_pos);
15949
15950 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15951
15952 const uint keySize = atoi (keySize_pos);
15953
15954 if (keySize != 128) return (PARSER_SALT_VALUE);
15955
15956 const uint saltSize = atoi (saltSize_pos);
15957
15958 if (saltSize != 16) return (PARSER_SALT_VALUE);
15959
15960 /**
15961 * salt
15962 */
15963
15964 salt->salt_len = 16;
15965 salt->salt_iter = spinCount;
15966
15967 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15968 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15969 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15970 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15971
15972 /**
15973 * esalt
15974 */
15975
15976 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15977 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15978 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15979 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15980
15981 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15982 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15983 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15984 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15985 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15986 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15987 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15988 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15989
15990 /**
15991 * digest
15992 */
15993
15994 digest[0] = office2010->encryptedVerifierHash[0];
15995 digest[1] = office2010->encryptedVerifierHash[1];
15996 digest[2] = office2010->encryptedVerifierHash[2];
15997 digest[3] = office2010->encryptedVerifierHash[3];
15998
15999 return (PARSER_OK);
16000 }
16001
16002 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16003 {
16004 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
16005
16006 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
16007
16008 u32 *digest = (u32 *) hash_buf->digest;
16009
16010 salt_t *salt = hash_buf->salt;
16011
16012 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
16013
16014 /**
16015 * parse line
16016 */
16017
16018 char *version_pos = input_buf + 8 + 1;
16019
16020 char *spinCount_pos = strchr (version_pos, '*');
16021
16022 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16023
16024 u32 version_len = spinCount_pos - version_pos;
16025
16026 if (version_len != 4) return (PARSER_SALT_LENGTH);
16027
16028 spinCount_pos++;
16029
16030 char *keySize_pos = strchr (spinCount_pos, '*');
16031
16032 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16033
16034 u32 spinCount_len = keySize_pos - spinCount_pos;
16035
16036 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
16037
16038 keySize_pos++;
16039
16040 char *saltSize_pos = strchr (keySize_pos, '*');
16041
16042 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16043
16044 u32 keySize_len = saltSize_pos - keySize_pos;
16045
16046 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
16047
16048 saltSize_pos++;
16049
16050 char *osalt_pos = strchr (saltSize_pos, '*');
16051
16052 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16053
16054 u32 saltSize_len = osalt_pos - saltSize_pos;
16055
16056 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
16057
16058 osalt_pos++;
16059
16060 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16061
16062 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16063
16064 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16065
16066 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16067
16068 encryptedVerifier_pos++;
16069
16070 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16071
16072 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16073
16074 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16075
16076 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16077
16078 encryptedVerifierHash_pos++;
16079
16080 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;
16081
16082 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
16083
16084 const uint version = atoi (version_pos);
16085
16086 if (version != 2013) return (PARSER_SALT_VALUE);
16087
16088 const uint spinCount = atoi (spinCount_pos);
16089
16090 if (spinCount != 100000) return (PARSER_SALT_VALUE);
16091
16092 const uint keySize = atoi (keySize_pos);
16093
16094 if (keySize != 256) return (PARSER_SALT_VALUE);
16095
16096 const uint saltSize = atoi (saltSize_pos);
16097
16098 if (saltSize != 16) return (PARSER_SALT_VALUE);
16099
16100 /**
16101 * salt
16102 */
16103
16104 salt->salt_len = 16;
16105 salt->salt_iter = spinCount;
16106
16107 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16108 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16109 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16110 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16111
16112 /**
16113 * esalt
16114 */
16115
16116 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16117 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16118 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16119 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16120
16121 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16122 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16123 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16124 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16125 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16126 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
16127 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
16128 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
16129
16130 /**
16131 * digest
16132 */
16133
16134 digest[0] = office2013->encryptedVerifierHash[0];
16135 digest[1] = office2013->encryptedVerifierHash[1];
16136 digest[2] = office2013->encryptedVerifierHash[2];
16137 digest[3] = office2013->encryptedVerifierHash[3];
16138
16139 return (PARSER_OK);
16140 }
16141
16142 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16143 {
16144 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
16145
16146 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16147
16148 u32 *digest = (u32 *) hash_buf->digest;
16149
16150 salt_t *salt = hash_buf->salt;
16151
16152 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
16153
16154 /**
16155 * parse line
16156 */
16157
16158 char *version_pos = input_buf + 11;
16159
16160 char *osalt_pos = strchr (version_pos, '*');
16161
16162 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16163
16164 u32 version_len = osalt_pos - version_pos;
16165
16166 if (version_len != 1) return (PARSER_SALT_LENGTH);
16167
16168 osalt_pos++;
16169
16170 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16171
16172 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16173
16174 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16175
16176 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16177
16178 encryptedVerifier_pos++;
16179
16180 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16181
16182 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16183
16184 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16185
16186 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16187
16188 encryptedVerifierHash_pos++;
16189
16190 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16191
16192 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16193
16194 const uint version = *version_pos - 0x30;
16195
16196 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16197
16198 /**
16199 * esalt
16200 */
16201
16202 oldoffice01->version = version;
16203
16204 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16205 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16206 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16207 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16208
16209 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16210 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16211 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16212 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16213
16214 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16215 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16216 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16217 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16218
16219 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16220 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16221 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16222 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16223
16224 /**
16225 * salt
16226 */
16227
16228 salt->salt_len = 16;
16229
16230 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16231 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16232 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16233 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16234
16235 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16236 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16237 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16238 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16239
16240 // this is a workaround as office produces multiple documents with the same salt
16241
16242 salt->salt_len += 32;
16243
16244 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16245 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16246 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16247 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16248 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16249 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16250 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16251 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16252
16253 /**
16254 * digest
16255 */
16256
16257 digest[0] = oldoffice01->encryptedVerifierHash[0];
16258 digest[1] = oldoffice01->encryptedVerifierHash[1];
16259 digest[2] = oldoffice01->encryptedVerifierHash[2];
16260 digest[3] = oldoffice01->encryptedVerifierHash[3];
16261
16262 return (PARSER_OK);
16263 }
16264
16265 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16266 {
16267 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
16268 }
16269
16270 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16271 {
16272 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
16273
16274 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16275
16276 u32 *digest = (u32 *) hash_buf->digest;
16277
16278 salt_t *salt = hash_buf->salt;
16279
16280 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
16281
16282 /**
16283 * parse line
16284 */
16285
16286 char *version_pos = input_buf + 11;
16287
16288 char *osalt_pos = strchr (version_pos, '*');
16289
16290 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16291
16292 u32 version_len = osalt_pos - version_pos;
16293
16294 if (version_len != 1) return (PARSER_SALT_LENGTH);
16295
16296 osalt_pos++;
16297
16298 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16299
16300 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16301
16302 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16303
16304 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16305
16306 encryptedVerifier_pos++;
16307
16308 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16309
16310 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16311
16312 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16313
16314 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16315
16316 encryptedVerifierHash_pos++;
16317
16318 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16319
16320 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16321
16322 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16323
16324 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16325
16326 rc4key_pos++;
16327
16328 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16329
16330 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16331
16332 const uint version = *version_pos - 0x30;
16333
16334 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16335
16336 /**
16337 * esalt
16338 */
16339
16340 oldoffice01->version = version;
16341
16342 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16343 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16344 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16345 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16346
16347 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16348 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16349 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16350 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16351
16352 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16353 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16354 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16355 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16356
16357 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16358 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16359 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16360 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16361
16362 oldoffice01->rc4key[1] = 0;
16363 oldoffice01->rc4key[0] = 0;
16364
16365 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16366 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16367 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16368 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16369 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16370 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16371 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16372 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16373 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16374 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16375
16376 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
16377 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
16378
16379 /**
16380 * salt
16381 */
16382
16383 salt->salt_len = 16;
16384
16385 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16386 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16387 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16388 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16389
16390 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16391 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16392 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16393 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16394
16395 // this is a workaround as office produces multiple documents with the same salt
16396
16397 salt->salt_len += 32;
16398
16399 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16400 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16401 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16402 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16403 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16404 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16405 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16406 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16407
16408 /**
16409 * digest
16410 */
16411
16412 digest[0] = oldoffice01->rc4key[0];
16413 digest[1] = oldoffice01->rc4key[1];
16414 digest[2] = 0;
16415 digest[3] = 0;
16416
16417 return (PARSER_OK);
16418 }
16419
16420 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16421 {
16422 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
16423
16424 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16425
16426 u32 *digest = (u32 *) hash_buf->digest;
16427
16428 salt_t *salt = hash_buf->salt;
16429
16430 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16431
16432 /**
16433 * parse line
16434 */
16435
16436 char *version_pos = input_buf + 11;
16437
16438 char *osalt_pos = strchr (version_pos, '*');
16439
16440 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16441
16442 u32 version_len = osalt_pos - version_pos;
16443
16444 if (version_len != 1) return (PARSER_SALT_LENGTH);
16445
16446 osalt_pos++;
16447
16448 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16449
16450 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16451
16452 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16453
16454 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16455
16456 encryptedVerifier_pos++;
16457
16458 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16459
16460 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16461
16462 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16463
16464 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16465
16466 encryptedVerifierHash_pos++;
16467
16468 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16469
16470 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16471
16472 const uint version = *version_pos - 0x30;
16473
16474 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16475
16476 /**
16477 * esalt
16478 */
16479
16480 oldoffice34->version = version;
16481
16482 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16483 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16484 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16485 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16486
16487 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16488 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16489 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16490 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16491
16492 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16493 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16494 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16495 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16496 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16497
16498 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16499 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16500 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16501 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16502 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16503
16504 /**
16505 * salt
16506 */
16507
16508 salt->salt_len = 16;
16509
16510 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16511 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16512 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16513 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16514
16515 // this is a workaround as office produces multiple documents with the same salt
16516
16517 salt->salt_len += 32;
16518
16519 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16520 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16521 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16522 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16523 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16524 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16525 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16526 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16527
16528 /**
16529 * digest
16530 */
16531
16532 digest[0] = oldoffice34->encryptedVerifierHash[0];
16533 digest[1] = oldoffice34->encryptedVerifierHash[1];
16534 digest[2] = oldoffice34->encryptedVerifierHash[2];
16535 digest[3] = oldoffice34->encryptedVerifierHash[3];
16536
16537 return (PARSER_OK);
16538 }
16539
16540 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16541 {
16542 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16543
16544 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
16545 }
16546
16547 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16548 {
16549 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
16550
16551 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16552
16553 u32 *digest = (u32 *) hash_buf->digest;
16554
16555 salt_t *salt = hash_buf->salt;
16556
16557 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16558
16559 /**
16560 * parse line
16561 */
16562
16563 char *version_pos = input_buf + 11;
16564
16565 char *osalt_pos = strchr (version_pos, '*');
16566
16567 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16568
16569 u32 version_len = osalt_pos - version_pos;
16570
16571 if (version_len != 1) return (PARSER_SALT_LENGTH);
16572
16573 osalt_pos++;
16574
16575 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16576
16577 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16578
16579 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16580
16581 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16582
16583 encryptedVerifier_pos++;
16584
16585 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16586
16587 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16588
16589 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16590
16591 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16592
16593 encryptedVerifierHash_pos++;
16594
16595 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16596
16597 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16598
16599 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16600
16601 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16602
16603 rc4key_pos++;
16604
16605 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16606
16607 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16608
16609 const uint version = *version_pos - 0x30;
16610
16611 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16612
16613 /**
16614 * esalt
16615 */
16616
16617 oldoffice34->version = version;
16618
16619 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16620 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16621 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16622 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16623
16624 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16625 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16626 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16627 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16628
16629 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16630 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16631 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16632 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16633 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16634
16635 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16636 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16637 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16638 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16639 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16640
16641 oldoffice34->rc4key[1] = 0;
16642 oldoffice34->rc4key[0] = 0;
16643
16644 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16645 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16646 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16647 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16648 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16649 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16650 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16651 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16652 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16653 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16654
16655 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
16656 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
16657
16658 /**
16659 * salt
16660 */
16661
16662 salt->salt_len = 16;
16663
16664 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16665 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16666 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16667 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16668
16669 // this is a workaround as office produces multiple documents with the same salt
16670
16671 salt->salt_len += 32;
16672
16673 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16674 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16675 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16676 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16677 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16678 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16679 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16680 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16681
16682 /**
16683 * digest
16684 */
16685
16686 digest[0] = oldoffice34->rc4key[0];
16687 digest[1] = oldoffice34->rc4key[1];
16688 digest[2] = 0;
16689 digest[3] = 0;
16690
16691 return (PARSER_OK);
16692 }
16693
16694 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16695 {
16696 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
16697
16698 u32 *digest = (u32 *) hash_buf->digest;
16699
16700 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16701 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16702 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16703 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16704
16705 digest[0] = byte_swap_32 (digest[0]);
16706 digest[1] = byte_swap_32 (digest[1]);
16707 digest[2] = byte_swap_32 (digest[2]);
16708 digest[3] = byte_swap_32 (digest[3]);
16709
16710 return (PARSER_OK);
16711 }
16712
16713 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16714 {
16715 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
16716
16717 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16718
16719 u32 *digest = (u32 *) hash_buf->digest;
16720
16721 salt_t *salt = hash_buf->salt;
16722
16723 char *signature_pos = input_buf;
16724
16725 char *salt_pos = strchr (signature_pos, '$');
16726
16727 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16728
16729 u32 signature_len = salt_pos - signature_pos;
16730
16731 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
16732
16733 salt_pos++;
16734
16735 char *hash_pos = strchr (salt_pos, '$');
16736
16737 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16738
16739 u32 salt_len = hash_pos - salt_pos;
16740
16741 if (salt_len > 32) return (PARSER_SALT_LENGTH);
16742
16743 hash_pos++;
16744
16745 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
16746
16747 if (hash_len != 40) return (PARSER_SALT_LENGTH);
16748
16749 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
16750 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
16751 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
16752 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
16753 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
16754
16755 digest[0] -= SHA1M_A;
16756 digest[1] -= SHA1M_B;
16757 digest[2] -= SHA1M_C;
16758 digest[3] -= SHA1M_D;
16759 digest[4] -= SHA1M_E;
16760
16761 char *salt_buf_ptr = (char *) salt->salt_buf;
16762
16763 memcpy (salt_buf_ptr, salt_pos, salt_len);
16764
16765 salt->salt_len = salt_len;
16766
16767 return (PARSER_OK);
16768 }
16769
16770 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16771 {
16772 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
16773
16774 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
16775
16776 u32 *digest = (u32 *) hash_buf->digest;
16777
16778 salt_t *salt = hash_buf->salt;
16779
16780 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16781
16782 /**
16783 * parse line
16784 */
16785
16786 char *iter_pos = input_buf + 14;
16787
16788 const int iter = atoi (iter_pos);
16789
16790 if (iter < 1) return (PARSER_SALT_ITERATION);
16791
16792 salt->salt_iter = iter - 1;
16793
16794 char *salt_pos = strchr (iter_pos, '$');
16795
16796 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16797
16798 salt_pos++;
16799
16800 char *hash_pos = strchr (salt_pos, '$');
16801
16802 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16803
16804 const uint salt_len = hash_pos - salt_pos;
16805
16806 hash_pos++;
16807
16808 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16809
16810 memcpy (salt_buf_ptr, salt_pos, salt_len);
16811
16812 salt->salt_len = salt_len;
16813
16814 salt_buf_ptr[salt_len + 3] = 0x01;
16815 salt_buf_ptr[salt_len + 4] = 0x80;
16816
16817 // add some stuff to normal salt to make sorted happy
16818
16819 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16820 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16821 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16822 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16823 salt->salt_buf[4] = salt->salt_iter;
16824
16825 // base64 decode hash
16826
16827 u8 tmp_buf[100] = { 0 };
16828
16829 uint hash_len = input_len - (hash_pos - input_buf);
16830
16831 if (hash_len != 44) return (PARSER_HASH_LENGTH);
16832
16833 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16834
16835 memcpy (digest, tmp_buf, 32);
16836
16837 digest[0] = byte_swap_32 (digest[0]);
16838 digest[1] = byte_swap_32 (digest[1]);
16839 digest[2] = byte_swap_32 (digest[2]);
16840 digest[3] = byte_swap_32 (digest[3]);
16841 digest[4] = byte_swap_32 (digest[4]);
16842 digest[5] = byte_swap_32 (digest[5]);
16843 digest[6] = byte_swap_32 (digest[6]);
16844 digest[7] = byte_swap_32 (digest[7]);
16845
16846 return (PARSER_OK);
16847 }
16848
16849 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16850 {
16851 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
16852
16853 u32 *digest = (u32 *) hash_buf->digest;
16854
16855 salt_t *salt = hash_buf->salt;
16856
16857 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16858 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16859 digest[2] = 0;
16860 digest[3] = 0;
16861
16862 digest[0] = byte_swap_32 (digest[0]);
16863 digest[1] = byte_swap_32 (digest[1]);
16864
16865 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16866 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16867 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16868
16869 char iter_c = input_buf[17];
16870 char iter_d = input_buf[19];
16871
16872 // atm only defaults, let's see if there's more request
16873 if (iter_c != '2') return (PARSER_SALT_ITERATION);
16874 if (iter_d != '4') return (PARSER_SALT_ITERATION);
16875
16876 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
16877
16878 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
16879 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
16880 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
16881 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
16882
16883 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16884 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16885 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16886 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16887
16888 salt->salt_len = 16;
16889
16890 return (PARSER_OK);
16891 }
16892
16893 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16894 {
16895 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
16896
16897 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16898
16899 u32 *digest = (u32 *) hash_buf->digest;
16900
16901 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
16902
16903 salt_t *salt = hash_buf->salt;
16904
16905 char *salt_pos = input_buf + 10;
16906
16907 char *hash_pos = strchr (salt_pos, '$');
16908
16909 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16910
16911 uint salt_len = hash_pos - salt_pos;
16912
16913 hash_pos++;
16914
16915 uint hash_len = input_len - 10 - salt_len - 1;
16916
16917 // base64 decode salt
16918
16919 if (salt_len > 133) return (PARSER_SALT_LENGTH);
16920
16921 u8 tmp_buf[100] = { 0 };
16922
16923 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
16924
16925 if (salt_len > 55) return (PARSER_SALT_LENGTH);
16926
16927 tmp_buf[salt_len] = 0x80;
16928
16929 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
16930
16931 salt->salt_len = salt_len;
16932
16933 // base64 decode hash
16934
16935 if (hash_len > 133) return (PARSER_HASH_LENGTH);
16936
16937 memset (tmp_buf, 0, sizeof (tmp_buf));
16938
16939 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16940
16941 if (hash_len < 32 + 1) return (PARSER_SALT_LENGTH);
16942
16943 uint user_len = hash_len - 32;
16944
16945 const u8 *tmp_hash = tmp_buf + user_len;
16946
16947 user_len--; // skip the trailing space
16948
16949 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16950 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16951 digest[2] = hex_to_u32 (&tmp_hash[16]);
16952 digest[3] = hex_to_u32 (&tmp_hash[24]);
16953
16954 digest[0] = byte_swap_32 (digest[0]);
16955 digest[1] = byte_swap_32 (digest[1]);
16956 digest[2] = byte_swap_32 (digest[2]);
16957 digest[3] = byte_swap_32 (digest[3]);
16958
16959 // store username for host only (output hash if cracked)
16960
16961 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16962 memcpy (cram_md5->user, tmp_buf, user_len);
16963
16964 return (PARSER_OK);
16965 }
16966
16967 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16968 {
16969 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16970
16971 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16972
16973 u32 *digest = (u32 *) hash_buf->digest;
16974
16975 salt_t *salt = hash_buf->salt;
16976
16977 char *iter_pos = input_buf + 10;
16978
16979 u32 iter = atoi (iter_pos);
16980
16981 if (iter < 1)
16982 {
16983 return (PARSER_SALT_ITERATION);
16984 }
16985
16986 iter--; // first iteration is special
16987
16988 salt->salt_iter = iter;
16989
16990 char *base64_pos = strchr (iter_pos, '}');
16991
16992 if (base64_pos == NULL)
16993 {
16994 return (PARSER_SIGNATURE_UNMATCHED);
16995 }
16996
16997 base64_pos++;
16998
16999 // base64 decode salt
17000
17001 u32 base64_len = input_len - (base64_pos - input_buf);
17002
17003 u8 tmp_buf[100] = { 0 };
17004
17005 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
17006
17007 if (decoded_len < 24)
17008 {
17009 return (PARSER_SALT_LENGTH);
17010 }
17011
17012 // copy the salt
17013
17014 uint salt_len = decoded_len - 20;
17015
17016 if (salt_len < 4) return (PARSER_SALT_LENGTH);
17017 if (salt_len > 16) return (PARSER_SALT_LENGTH);
17018
17019 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
17020
17021 salt->salt_len = salt_len;
17022
17023 // set digest
17024
17025 u32 *digest_ptr = (u32*) tmp_buf;
17026
17027 digest[0] = byte_swap_32 (digest_ptr[0]);
17028 digest[1] = byte_swap_32 (digest_ptr[1]);
17029 digest[2] = byte_swap_32 (digest_ptr[2]);
17030 digest[3] = byte_swap_32 (digest_ptr[3]);
17031 digest[4] = byte_swap_32 (digest_ptr[4]);
17032
17033 return (PARSER_OK);
17034 }
17035
17036 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17037 {
17038 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
17039
17040 u32 *digest = (u32 *) hash_buf->digest;
17041
17042 salt_t *salt = hash_buf->salt;
17043
17044 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17045 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17046 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17047 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17048 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
17049
17050 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17051
17052 uint salt_len = input_len - 40 - 1;
17053
17054 char *salt_buf = input_buf + 40 + 1;
17055
17056 char *salt_buf_ptr = (char *) salt->salt_buf;
17057
17058 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17059
17060 if (salt_len != 32) return (PARSER_SALT_LENGTH);
17061
17062 salt->salt_len = salt_len;
17063
17064 return (PARSER_OK);
17065 }
17066
17067 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17068 {
17069 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
17070
17071 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17072
17073 u32 *digest = (u32 *) hash_buf->digest;
17074
17075 salt_t *salt = hash_buf->salt;
17076
17077 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17078
17079 /**
17080 * parse line
17081 */
17082
17083 char *V_pos = input_buf + 5;
17084
17085 char *R_pos = strchr (V_pos, '*');
17086
17087 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17088
17089 u32 V_len = R_pos - V_pos;
17090
17091 R_pos++;
17092
17093 char *bits_pos = strchr (R_pos, '*');
17094
17095 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17096
17097 u32 R_len = bits_pos - R_pos;
17098
17099 bits_pos++;
17100
17101 char *P_pos = strchr (bits_pos, '*');
17102
17103 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17104
17105 u32 bits_len = P_pos - bits_pos;
17106
17107 P_pos++;
17108
17109 char *enc_md_pos = strchr (P_pos, '*');
17110
17111 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17112
17113 u32 P_len = enc_md_pos - P_pos;
17114
17115 enc_md_pos++;
17116
17117 char *id_len_pos = strchr (enc_md_pos, '*');
17118
17119 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17120
17121 u32 enc_md_len = id_len_pos - enc_md_pos;
17122
17123 id_len_pos++;
17124
17125 char *id_buf_pos = strchr (id_len_pos, '*');
17126
17127 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17128
17129 u32 id_len_len = id_buf_pos - id_len_pos;
17130
17131 id_buf_pos++;
17132
17133 char *u_len_pos = strchr (id_buf_pos, '*');
17134
17135 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17136
17137 u32 id_buf_len = u_len_pos - id_buf_pos;
17138
17139 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
17140
17141 u_len_pos++;
17142
17143 char *u_buf_pos = strchr (u_len_pos, '*');
17144
17145 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17146
17147 u32 u_len_len = u_buf_pos - u_len_pos;
17148
17149 u_buf_pos++;
17150
17151 char *o_len_pos = strchr (u_buf_pos, '*');
17152
17153 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17154
17155 u32 u_buf_len = o_len_pos - u_buf_pos;
17156
17157 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17158
17159 o_len_pos++;
17160
17161 char *o_buf_pos = strchr (o_len_pos, '*');
17162
17163 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17164
17165 u32 o_len_len = o_buf_pos - o_len_pos;
17166
17167 o_buf_pos++;
17168
17169 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;
17170
17171 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17172
17173 // validate data
17174
17175 const int V = atoi (V_pos);
17176 const int R = atoi (R_pos);
17177 const int P = atoi (P_pos);
17178
17179 if (V != 1) return (PARSER_SALT_VALUE);
17180 if (R != 2) return (PARSER_SALT_VALUE);
17181
17182 const int enc_md = atoi (enc_md_pos);
17183
17184 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17185
17186 const int id_len = atoi (id_len_pos);
17187 const int u_len = atoi (u_len_pos);
17188 const int o_len = atoi (o_len_pos);
17189
17190 if (id_len != 16) return (PARSER_SALT_VALUE);
17191 if (u_len != 32) return (PARSER_SALT_VALUE);
17192 if (o_len != 32) return (PARSER_SALT_VALUE);
17193
17194 const int bits = atoi (bits_pos);
17195
17196 if (bits != 40) return (PARSER_SALT_VALUE);
17197
17198 // copy data to esalt
17199
17200 pdf->V = V;
17201 pdf->R = R;
17202 pdf->P = P;
17203
17204 pdf->enc_md = enc_md;
17205
17206 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17207 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17208 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17209 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17210 pdf->id_len = id_len;
17211
17212 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17213 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17214 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17215 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17216 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17217 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17218 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17219 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17220 pdf->u_len = u_len;
17221
17222 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17223 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17224 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17225 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17226 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17227 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17228 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17229 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17230 pdf->o_len = o_len;
17231
17232 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17233 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17234 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17235 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17236
17237 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17238 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17239 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17240 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17241 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17242 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17243 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17244 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17245
17246 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17247 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17248 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17249 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17250 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17251 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17252 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17253 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17254
17255 // we use ID for salt, maybe needs to change, we will see...
17256
17257 salt->salt_buf[0] = pdf->id_buf[0];
17258 salt->salt_buf[1] = pdf->id_buf[1];
17259 salt->salt_buf[2] = pdf->id_buf[2];
17260 salt->salt_buf[3] = pdf->id_buf[3];
17261 salt->salt_len = pdf->id_len;
17262
17263 digest[0] = pdf->u_buf[0];
17264 digest[1] = pdf->u_buf[1];
17265 digest[2] = pdf->u_buf[2];
17266 digest[3] = pdf->u_buf[3];
17267
17268 return (PARSER_OK);
17269 }
17270
17271 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17272 {
17273 return pdf11_parse_hash (input_buf, input_len, hash_buf);
17274 }
17275
17276 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17277 {
17278 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
17279
17280 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17281
17282 u32 *digest = (u32 *) hash_buf->digest;
17283
17284 salt_t *salt = hash_buf->salt;
17285
17286 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17287
17288 /**
17289 * parse line
17290 */
17291
17292 char *V_pos = input_buf + 5;
17293
17294 char *R_pos = strchr (V_pos, '*');
17295
17296 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17297
17298 u32 V_len = R_pos - V_pos;
17299
17300 R_pos++;
17301
17302 char *bits_pos = strchr (R_pos, '*');
17303
17304 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17305
17306 u32 R_len = bits_pos - R_pos;
17307
17308 bits_pos++;
17309
17310 char *P_pos = strchr (bits_pos, '*');
17311
17312 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17313
17314 u32 bits_len = P_pos - bits_pos;
17315
17316 P_pos++;
17317
17318 char *enc_md_pos = strchr (P_pos, '*');
17319
17320 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17321
17322 u32 P_len = enc_md_pos - P_pos;
17323
17324 enc_md_pos++;
17325
17326 char *id_len_pos = strchr (enc_md_pos, '*');
17327
17328 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17329
17330 u32 enc_md_len = id_len_pos - enc_md_pos;
17331
17332 id_len_pos++;
17333
17334 char *id_buf_pos = strchr (id_len_pos, '*');
17335
17336 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17337
17338 u32 id_len_len = id_buf_pos - id_len_pos;
17339
17340 id_buf_pos++;
17341
17342 char *u_len_pos = strchr (id_buf_pos, '*');
17343
17344 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17345
17346 u32 id_buf_len = u_len_pos - id_buf_pos;
17347
17348 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
17349
17350 u_len_pos++;
17351
17352 char *u_buf_pos = strchr (u_len_pos, '*');
17353
17354 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17355
17356 u32 u_len_len = u_buf_pos - u_len_pos;
17357
17358 u_buf_pos++;
17359
17360 char *o_len_pos = strchr (u_buf_pos, '*');
17361
17362 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17363
17364 u32 u_buf_len = o_len_pos - u_buf_pos;
17365
17366 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17367
17368 o_len_pos++;
17369
17370 char *o_buf_pos = strchr (o_len_pos, '*');
17371
17372 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17373
17374 u32 o_len_len = o_buf_pos - o_len_pos;
17375
17376 o_buf_pos++;
17377
17378 char *rc4key_pos = strchr (o_buf_pos, ':');
17379
17380 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17381
17382 u32 o_buf_len = rc4key_pos - o_buf_pos;
17383
17384 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17385
17386 rc4key_pos++;
17387
17388 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;
17389
17390 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
17391
17392 // validate data
17393
17394 const int V = atoi (V_pos);
17395 const int R = atoi (R_pos);
17396 const int P = atoi (P_pos);
17397
17398 if (V != 1) return (PARSER_SALT_VALUE);
17399 if (R != 2) return (PARSER_SALT_VALUE);
17400
17401 const int enc_md = atoi (enc_md_pos);
17402
17403 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17404
17405 const int id_len = atoi (id_len_pos);
17406 const int u_len = atoi (u_len_pos);
17407 const int o_len = atoi (o_len_pos);
17408
17409 if (id_len != 16) return (PARSER_SALT_VALUE);
17410 if (u_len != 32) return (PARSER_SALT_VALUE);
17411 if (o_len != 32) return (PARSER_SALT_VALUE);
17412
17413 const int bits = atoi (bits_pos);
17414
17415 if (bits != 40) return (PARSER_SALT_VALUE);
17416
17417 // copy data to esalt
17418
17419 pdf->V = V;
17420 pdf->R = R;
17421 pdf->P = P;
17422
17423 pdf->enc_md = enc_md;
17424
17425 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17426 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17427 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17428 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17429 pdf->id_len = id_len;
17430
17431 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17432 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17433 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17434 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17435 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17436 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17437 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17438 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17439 pdf->u_len = u_len;
17440
17441 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17442 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17443 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17444 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17445 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17446 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17447 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17448 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17449 pdf->o_len = o_len;
17450
17451 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17452 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17453 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17454 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17455
17456 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17457 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17458 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17459 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17460 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17461 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17462 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17463 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17464
17465 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17466 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17467 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17468 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17469 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17470 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17471 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17472 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17473
17474 pdf->rc4key[1] = 0;
17475 pdf->rc4key[0] = 0;
17476
17477 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
17478 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
17479 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
17480 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
17481 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
17482 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
17483 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
17484 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
17485 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
17486 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
17487
17488 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
17489 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
17490
17491 // we use ID for salt, maybe needs to change, we will see...
17492
17493 salt->salt_buf[0] = pdf->id_buf[0];
17494 salt->salt_buf[1] = pdf->id_buf[1];
17495 salt->salt_buf[2] = pdf->id_buf[2];
17496 salt->salt_buf[3] = pdf->id_buf[3];
17497 salt->salt_buf[4] = pdf->u_buf[0];
17498 salt->salt_buf[5] = pdf->u_buf[1];
17499 salt->salt_buf[6] = pdf->o_buf[0];
17500 salt->salt_buf[7] = pdf->o_buf[1];
17501 salt->salt_len = pdf->id_len + 16;
17502
17503 digest[0] = pdf->rc4key[0];
17504 digest[1] = pdf->rc4key[1];
17505 digest[2] = 0;
17506 digest[3] = 0;
17507
17508 return (PARSER_OK);
17509 }
17510
17511 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17512 {
17513 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
17514
17515 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17516
17517 u32 *digest = (u32 *) hash_buf->digest;
17518
17519 salt_t *salt = hash_buf->salt;
17520
17521 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17522
17523 /**
17524 * parse line
17525 */
17526
17527 char *V_pos = input_buf + 5;
17528
17529 char *R_pos = strchr (V_pos, '*');
17530
17531 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17532
17533 u32 V_len = R_pos - V_pos;
17534
17535 R_pos++;
17536
17537 char *bits_pos = strchr (R_pos, '*');
17538
17539 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17540
17541 u32 R_len = bits_pos - R_pos;
17542
17543 bits_pos++;
17544
17545 char *P_pos = strchr (bits_pos, '*');
17546
17547 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17548
17549 u32 bits_len = P_pos - bits_pos;
17550
17551 P_pos++;
17552
17553 char *enc_md_pos = strchr (P_pos, '*');
17554
17555 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17556
17557 u32 P_len = enc_md_pos - P_pos;
17558
17559 enc_md_pos++;
17560
17561 char *id_len_pos = strchr (enc_md_pos, '*');
17562
17563 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17564
17565 u32 enc_md_len = id_len_pos - enc_md_pos;
17566
17567 id_len_pos++;
17568
17569 char *id_buf_pos = strchr (id_len_pos, '*');
17570
17571 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17572
17573 u32 id_len_len = id_buf_pos - id_len_pos;
17574
17575 id_buf_pos++;
17576
17577 char *u_len_pos = strchr (id_buf_pos, '*');
17578
17579 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17580
17581 u32 id_buf_len = u_len_pos - id_buf_pos;
17582
17583 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
17584
17585 u_len_pos++;
17586
17587 char *u_buf_pos = strchr (u_len_pos, '*');
17588
17589 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17590
17591 u32 u_len_len = u_buf_pos - u_len_pos;
17592
17593 u_buf_pos++;
17594
17595 char *o_len_pos = strchr (u_buf_pos, '*');
17596
17597 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17598
17599 u32 u_buf_len = o_len_pos - u_buf_pos;
17600
17601 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17602
17603 o_len_pos++;
17604
17605 char *o_buf_pos = strchr (o_len_pos, '*');
17606
17607 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17608
17609 u32 o_len_len = o_buf_pos - o_len_pos;
17610
17611 o_buf_pos++;
17612
17613 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;
17614
17615 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17616
17617 // validate data
17618
17619 const int V = atoi (V_pos);
17620 const int R = atoi (R_pos);
17621 const int P = atoi (P_pos);
17622
17623 int vr_ok = 0;
17624
17625 if ((V == 2) && (R == 3)) vr_ok = 1;
17626 if ((V == 4) && (R == 4)) vr_ok = 1;
17627
17628 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17629
17630 const int id_len = atoi (id_len_pos);
17631 const int u_len = atoi (u_len_pos);
17632 const int o_len = atoi (o_len_pos);
17633
17634 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
17635
17636 if (u_len != 32) return (PARSER_SALT_VALUE);
17637 if (o_len != 32) return (PARSER_SALT_VALUE);
17638
17639 const int bits = atoi (bits_pos);
17640
17641 if (bits != 128) return (PARSER_SALT_VALUE);
17642
17643 int enc_md = 1;
17644
17645 if (R >= 4)
17646 {
17647 enc_md = atoi (enc_md_pos);
17648 }
17649
17650 // copy data to esalt
17651
17652 pdf->V = V;
17653 pdf->R = R;
17654 pdf->P = P;
17655
17656 pdf->enc_md = enc_md;
17657
17658 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17659 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17660 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17661 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17662
17663 if (id_len == 32)
17664 {
17665 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
17666 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
17667 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
17668 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
17669 }
17670
17671 pdf->id_len = id_len;
17672
17673 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17674 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17675 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17676 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17677 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17678 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17679 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17680 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17681 pdf->u_len = u_len;
17682
17683 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17684 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17685 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17686 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17687 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17688 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17689 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17690 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17691 pdf->o_len = o_len;
17692
17693 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17694 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17695 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17696 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17697
17698 if (id_len == 32)
17699 {
17700 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
17701 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
17702 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
17703 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
17704 }
17705
17706 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17707 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17708 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17709 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17710 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17711 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17712 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17713 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17714
17715 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17716 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17717 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17718 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17719 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17720 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17721 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17722 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17723
17724 // precompute rc4 data for later use
17725
17726 uint padding[8] =
17727 {
17728 0x5e4ebf28,
17729 0x418a754e,
17730 0x564e0064,
17731 0x0801faff,
17732 0xb6002e2e,
17733 0x803e68d0,
17734 0xfea90c2f,
17735 0x7a695364
17736 };
17737
17738 // md5
17739
17740 uint salt_pc_block[32] = { 0 };
17741
17742 char *salt_pc_ptr = (char *) salt_pc_block;
17743
17744 memcpy (salt_pc_ptr, padding, 32);
17745 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
17746
17747 uint salt_pc_digest[4] = { 0 };
17748
17749 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
17750
17751 pdf->rc4data[0] = salt_pc_digest[0];
17752 pdf->rc4data[1] = salt_pc_digest[1];
17753
17754 // we use ID for salt, maybe needs to change, we will see...
17755
17756 salt->salt_buf[0] = pdf->id_buf[0];
17757 salt->salt_buf[1] = pdf->id_buf[1];
17758 salt->salt_buf[2] = pdf->id_buf[2];
17759 salt->salt_buf[3] = pdf->id_buf[3];
17760 salt->salt_buf[4] = pdf->u_buf[0];
17761 salt->salt_buf[5] = pdf->u_buf[1];
17762 salt->salt_buf[6] = pdf->o_buf[0];
17763 salt->salt_buf[7] = pdf->o_buf[1];
17764 salt->salt_len = pdf->id_len + 16;
17765
17766 salt->salt_iter = ROUNDS_PDF14;
17767
17768 digest[0] = pdf->u_buf[0];
17769 digest[1] = pdf->u_buf[1];
17770 digest[2] = 0;
17771 digest[3] = 0;
17772
17773 return (PARSER_OK);
17774 }
17775
17776 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17777 {
17778 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
17779
17780 if (ret != PARSER_OK)
17781 {
17782 return ret;
17783 }
17784
17785 u32 *digest = (u32 *) hash_buf->digest;
17786
17787 salt_t *salt = hash_buf->salt;
17788
17789 digest[0] -= SHA256M_A;
17790 digest[1] -= SHA256M_B;
17791 digest[2] -= SHA256M_C;
17792 digest[3] -= SHA256M_D;
17793 digest[4] -= SHA256M_E;
17794 digest[5] -= SHA256M_F;
17795 digest[6] -= SHA256M_G;
17796 digest[7] -= SHA256M_H;
17797
17798 salt->salt_buf[2] = 0x80;
17799
17800 return (PARSER_OK);
17801 }
17802
17803 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17804 {
17805 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
17806
17807 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17808
17809 u32 *digest = (u32 *) hash_buf->digest;
17810
17811 salt_t *salt = hash_buf->salt;
17812
17813 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17814
17815 /**
17816 * parse line
17817 */
17818
17819 char *V_pos = input_buf + 5;
17820
17821 char *R_pos = strchr (V_pos, '*');
17822
17823 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17824
17825 u32 V_len = R_pos - V_pos;
17826
17827 R_pos++;
17828
17829 char *bits_pos = strchr (R_pos, '*');
17830
17831 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17832
17833 u32 R_len = bits_pos - R_pos;
17834
17835 bits_pos++;
17836
17837 char *P_pos = strchr (bits_pos, '*');
17838
17839 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17840
17841 u32 bits_len = P_pos - bits_pos;
17842
17843 P_pos++;
17844
17845 char *enc_md_pos = strchr (P_pos, '*');
17846
17847 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17848
17849 u32 P_len = enc_md_pos - P_pos;
17850
17851 enc_md_pos++;
17852
17853 char *id_len_pos = strchr (enc_md_pos, '*');
17854
17855 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17856
17857 u32 enc_md_len = id_len_pos - enc_md_pos;
17858
17859 id_len_pos++;
17860
17861 char *id_buf_pos = strchr (id_len_pos, '*');
17862
17863 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17864
17865 u32 id_len_len = id_buf_pos - id_len_pos;
17866
17867 id_buf_pos++;
17868
17869 char *u_len_pos = strchr (id_buf_pos, '*');
17870
17871 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17872
17873 u32 id_buf_len = u_len_pos - id_buf_pos;
17874
17875 u_len_pos++;
17876
17877 char *u_buf_pos = strchr (u_len_pos, '*');
17878
17879 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17880
17881 u32 u_len_len = u_buf_pos - u_len_pos;
17882
17883 u_buf_pos++;
17884
17885 char *o_len_pos = strchr (u_buf_pos, '*');
17886
17887 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17888
17889 u32 u_buf_len = o_len_pos - u_buf_pos;
17890
17891 o_len_pos++;
17892
17893 char *o_buf_pos = strchr (o_len_pos, '*');
17894
17895 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17896
17897 u32 o_len_len = o_buf_pos - o_len_pos;
17898
17899 o_buf_pos++;
17900
17901 char *last = strchr (o_buf_pos, '*');
17902
17903 if (last == NULL) last = input_buf + input_len;
17904
17905 u32 o_buf_len = last - o_buf_pos;
17906
17907 // validate data
17908
17909 const int V = atoi (V_pos);
17910 const int R = atoi (R_pos);
17911
17912 int vr_ok = 0;
17913
17914 if ((V == 5) && (R == 5)) vr_ok = 1;
17915 if ((V == 5) && (R == 6)) vr_ok = 1;
17916
17917 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17918
17919 const int bits = atoi (bits_pos);
17920
17921 if (bits != 256) return (PARSER_SALT_VALUE);
17922
17923 int enc_md = atoi (enc_md_pos);
17924
17925 if (enc_md != 1) return (PARSER_SALT_VALUE);
17926
17927 const uint id_len = atoi (id_len_pos);
17928 const uint u_len = atoi (u_len_pos);
17929 const uint o_len = atoi (o_len_pos);
17930
17931 if (V_len > 6) return (PARSER_SALT_LENGTH);
17932 if (R_len > 6) return (PARSER_SALT_LENGTH);
17933 if (P_len > 6) return (PARSER_SALT_LENGTH);
17934 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
17935 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
17936 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
17937 if (bits_len > 6) return (PARSER_SALT_LENGTH);
17938 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17939
17940 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17941 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17942 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17943
17944 // copy data to esalt
17945
17946 if (u_len < 40) return (PARSER_SALT_VALUE);
17947
17948 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17949 {
17950 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17951 }
17952
17953 salt->salt_buf[0] = pdf->u_buf[8];
17954 salt->salt_buf[1] = pdf->u_buf[9];
17955
17956 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17957 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17958
17959 salt->salt_len = 8;
17960 salt->salt_iter = ROUNDS_PDF17L8;
17961
17962 digest[0] = pdf->u_buf[0];
17963 digest[1] = pdf->u_buf[1];
17964 digest[2] = pdf->u_buf[2];
17965 digest[3] = pdf->u_buf[3];
17966 digest[4] = pdf->u_buf[4];
17967 digest[5] = pdf->u_buf[5];
17968 digest[6] = pdf->u_buf[6];
17969 digest[7] = pdf->u_buf[7];
17970
17971 return (PARSER_OK);
17972 }
17973
17974 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17975 {
17976 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17977
17978 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17979
17980 u32 *digest = (u32 *) hash_buf->digest;
17981
17982 salt_t *salt = hash_buf->salt;
17983
17984 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17985
17986 /**
17987 * parse line
17988 */
17989
17990 // iterations
17991
17992 char *iter_pos = input_buf + 7;
17993
17994 u32 iter = atoi (iter_pos);
17995
17996 if (iter < 1) return (PARSER_SALT_ITERATION);
17997 if (iter > 999999) return (PARSER_SALT_ITERATION);
17998
17999 // first is *raw* salt
18000
18001 char *salt_pos = strchr (iter_pos, ':');
18002
18003 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18004
18005 salt_pos++;
18006
18007 char *hash_pos = strchr (salt_pos, ':');
18008
18009 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18010
18011 u32 salt_len = hash_pos - salt_pos;
18012
18013 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18014
18015 hash_pos++;
18016
18017 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18018
18019 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18020
18021 // decode salt
18022
18023 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
18024
18025 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18026
18027 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18028
18029 salt_buf_ptr[salt_len + 3] = 0x01;
18030 salt_buf_ptr[salt_len + 4] = 0x80;
18031
18032 salt->salt_len = salt_len;
18033 salt->salt_iter = iter - 1;
18034
18035 // decode hash
18036
18037 u8 tmp_buf[100] = { 0 };
18038
18039 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18040
18041 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18042
18043 memcpy (digest, tmp_buf, 16);
18044
18045 digest[0] = byte_swap_32 (digest[0]);
18046 digest[1] = byte_swap_32 (digest[1]);
18047 digest[2] = byte_swap_32 (digest[2]);
18048 digest[3] = byte_swap_32 (digest[3]);
18049
18050 // add some stuff to normal salt to make sorted happy
18051
18052 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
18053 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
18054 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
18055 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
18056 salt->salt_buf[4] = salt->salt_iter;
18057
18058 return (PARSER_OK);
18059 }
18060
18061 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18062 {
18063 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
18064
18065 u32 *digest = (u32 *) hash_buf->digest;
18066
18067 salt_t *salt = hash_buf->salt;
18068
18069 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18070 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18071 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18072 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18073
18074 digest[0] = byte_swap_32 (digest[0]);
18075 digest[1] = byte_swap_32 (digest[1]);
18076 digest[2] = byte_swap_32 (digest[2]);
18077 digest[3] = byte_swap_32 (digest[3]);
18078
18079 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18080
18081 uint salt_len = input_len - 32 - 1;
18082
18083 char *salt_buf = input_buf + 32 + 1;
18084
18085 char *salt_buf_ptr = (char *) salt->salt_buf;
18086
18087 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18088
18089 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18090
18091 salt->salt_len = salt_len;
18092
18093 return (PARSER_OK);
18094 }
18095
18096 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18097 {
18098 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
18099
18100 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18101
18102 u32 *digest = (u32 *) hash_buf->digest;
18103
18104 salt_t *salt = hash_buf->salt;
18105
18106 char *user_pos = input_buf + 10;
18107
18108 char *salt_pos = strchr (user_pos, '*');
18109
18110 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18111
18112 salt_pos++;
18113
18114 char *hash_pos = strchr (salt_pos, '*');
18115
18116 hash_pos++;
18117
18118 uint hash_len = input_len - (hash_pos - input_buf);
18119
18120 if (hash_len != 32) return (PARSER_HASH_LENGTH);
18121
18122 uint user_len = salt_pos - user_pos - 1;
18123
18124 uint salt_len = hash_pos - salt_pos - 1;
18125
18126 if (salt_len != 8) return (PARSER_SALT_LENGTH);
18127
18128 /*
18129 * store digest
18130 */
18131
18132 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18133 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18134 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18135 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18136
18137 digest[0] = byte_swap_32 (digest[0]);
18138 digest[1] = byte_swap_32 (digest[1]);
18139 digest[2] = byte_swap_32 (digest[2]);
18140 digest[3] = byte_swap_32 (digest[3]);
18141
18142 digest[0] -= MD5M_A;
18143 digest[1] -= MD5M_B;
18144 digest[2] -= MD5M_C;
18145 digest[3] -= MD5M_D;
18146
18147 /*
18148 * store salt
18149 */
18150
18151 char *salt_buf_ptr = (char *) salt->salt_buf;
18152
18153 // first 4 bytes are the "challenge"
18154
18155 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
18156 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
18157 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
18158 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
18159
18160 // append the user name
18161
18162 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
18163
18164 salt->salt_len = 4 + user_len;
18165
18166 return (PARSER_OK);
18167 }
18168
18169 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18170 {
18171 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
18172
18173 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18174
18175 u32 *digest = (u32 *) hash_buf->digest;
18176
18177 salt_t *salt = hash_buf->salt;
18178
18179 char *salt_pos = input_buf + 9;
18180
18181 char *hash_pos = strchr (salt_pos, '*');
18182
18183 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18184
18185 hash_pos++;
18186
18187 uint hash_len = input_len - (hash_pos - input_buf);
18188
18189 if (hash_len != 40) return (PARSER_HASH_LENGTH);
18190
18191 uint salt_len = hash_pos - salt_pos - 1;
18192
18193 if (salt_len != 40) return (PARSER_SALT_LENGTH);
18194
18195 /*
18196 * store digest
18197 */
18198
18199 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18200 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18201 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18202 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18203 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18204
18205 /*
18206 * store salt
18207 */
18208
18209 char *salt_buf_ptr = (char *) salt->salt_buf;
18210
18211 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18212
18213 salt->salt_len = salt_len;
18214
18215 return (PARSER_OK);
18216 }
18217
18218 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18219 {
18220 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
18221
18222 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18223
18224 u32 *digest = (u32 *) hash_buf->digest;
18225
18226 salt_t *salt = hash_buf->salt;
18227
18228 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
18229
18230 /**
18231 * parse line
18232 */
18233
18234 char *cry_master_len_pos = input_buf + 9;
18235
18236 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
18237
18238 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18239
18240 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
18241
18242 cry_master_buf_pos++;
18243
18244 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
18245
18246 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18247
18248 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
18249
18250 cry_salt_len_pos++;
18251
18252 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
18253
18254 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18255
18256 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
18257
18258 cry_salt_buf_pos++;
18259
18260 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
18261
18262 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18263
18264 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
18265
18266 cry_rounds_pos++;
18267
18268 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
18269
18270 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18271
18272 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
18273
18274 ckey_len_pos++;
18275
18276 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
18277
18278 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18279
18280 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
18281
18282 ckey_buf_pos++;
18283
18284 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
18285
18286 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18287
18288 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
18289
18290 public_key_len_pos++;
18291
18292 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
18293
18294 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18295
18296 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
18297
18298 public_key_buf_pos++;
18299
18300 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;
18301
18302 const uint cry_master_len = atoi (cry_master_len_pos);
18303 const uint cry_salt_len = atoi (cry_salt_len_pos);
18304 const uint ckey_len = atoi (ckey_len_pos);
18305 const uint public_key_len = atoi (public_key_len_pos);
18306
18307 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
18308 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
18309 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
18310 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
18311
18312 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
18313 {
18314 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
18315
18316 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
18317 }
18318
18319 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
18320 {
18321 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
18322
18323 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
18324 }
18325
18326 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
18327 {
18328 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
18329
18330 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
18331 }
18332
18333 bitcoin_wallet->cry_master_len = cry_master_len / 2;
18334 bitcoin_wallet->ckey_len = ckey_len / 2;
18335 bitcoin_wallet->public_key_len = public_key_len / 2;
18336
18337 /*
18338 * store digest (should be unique enought, hopefully)
18339 */
18340
18341 digest[0] = bitcoin_wallet->cry_master_buf[0];
18342 digest[1] = bitcoin_wallet->cry_master_buf[1];
18343 digest[2] = bitcoin_wallet->cry_master_buf[2];
18344 digest[3] = bitcoin_wallet->cry_master_buf[3];
18345
18346 /*
18347 * store salt
18348 */
18349
18350 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
18351
18352 const uint cry_rounds = atoi (cry_rounds_pos);
18353
18354 salt->salt_iter = cry_rounds - 1;
18355
18356 char *salt_buf_ptr = (char *) salt->salt_buf;
18357
18358 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
18359
18360 salt->salt_len = salt_len;
18361
18362 return (PARSER_OK);
18363 }
18364
18365 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18366 {
18367 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
18368
18369 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18370
18371 u32 *digest = (u32 *) hash_buf->digest;
18372
18373 salt_t *salt = hash_buf->salt;
18374
18375 sip_t *sip = (sip_t *) hash_buf->esalt;
18376
18377 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
18378
18379 char *temp_input_buf = (char *) mymalloc (input_len + 1);
18380
18381 memcpy (temp_input_buf, input_buf, input_len);
18382
18383 // URI_server:
18384
18385 char *URI_server_pos = temp_input_buf + 6;
18386
18387 char *URI_client_pos = strchr (URI_server_pos, '*');
18388
18389 if (URI_client_pos == NULL)
18390 {
18391 myfree (temp_input_buf);
18392
18393 return (PARSER_SEPARATOR_UNMATCHED);
18394 }
18395
18396 URI_client_pos[0] = 0;
18397 URI_client_pos++;
18398
18399 uint URI_server_len = strlen (URI_server_pos);
18400
18401 if (URI_server_len > 512)
18402 {
18403 myfree (temp_input_buf);
18404
18405 return (PARSER_SALT_LENGTH);
18406 }
18407
18408 // URI_client:
18409
18410 char *user_pos = strchr (URI_client_pos, '*');
18411
18412 if (user_pos == NULL)
18413 {
18414 myfree (temp_input_buf);
18415
18416 return (PARSER_SEPARATOR_UNMATCHED);
18417 }
18418
18419 user_pos[0] = 0;
18420 user_pos++;
18421
18422 uint URI_client_len = strlen (URI_client_pos);
18423
18424 if (URI_client_len > 512)
18425 {
18426 myfree (temp_input_buf);
18427
18428 return (PARSER_SALT_LENGTH);
18429 }
18430
18431 // user:
18432
18433 char *realm_pos = strchr (user_pos, '*');
18434
18435 if (realm_pos == NULL)
18436 {
18437 myfree (temp_input_buf);
18438
18439 return (PARSER_SEPARATOR_UNMATCHED);
18440 }
18441
18442 realm_pos[0] = 0;
18443 realm_pos++;
18444
18445 uint user_len = strlen (user_pos);
18446
18447 if (user_len > 116)
18448 {
18449 myfree (temp_input_buf);
18450
18451 return (PARSER_SALT_LENGTH);
18452 }
18453
18454 // realm:
18455
18456 char *method_pos = strchr (realm_pos, '*');
18457
18458 if (method_pos == NULL)
18459 {
18460 myfree (temp_input_buf);
18461
18462 return (PARSER_SEPARATOR_UNMATCHED);
18463 }
18464
18465 method_pos[0] = 0;
18466 method_pos++;
18467
18468 uint realm_len = strlen (realm_pos);
18469
18470 if (realm_len > 116)
18471 {
18472 myfree (temp_input_buf);
18473
18474 return (PARSER_SALT_LENGTH);
18475 }
18476
18477 // method:
18478
18479 char *URI_prefix_pos = strchr (method_pos, '*');
18480
18481 if (URI_prefix_pos == NULL)
18482 {
18483 myfree (temp_input_buf);
18484
18485 return (PARSER_SEPARATOR_UNMATCHED);
18486 }
18487
18488 URI_prefix_pos[0] = 0;
18489 URI_prefix_pos++;
18490
18491 uint method_len = strlen (method_pos);
18492
18493 if (method_len > 246)
18494 {
18495 myfree (temp_input_buf);
18496
18497 return (PARSER_SALT_LENGTH);
18498 }
18499
18500 // URI_prefix:
18501
18502 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
18503
18504 if (URI_resource_pos == NULL)
18505 {
18506 myfree (temp_input_buf);
18507
18508 return (PARSER_SEPARATOR_UNMATCHED);
18509 }
18510
18511 URI_resource_pos[0] = 0;
18512 URI_resource_pos++;
18513
18514 uint URI_prefix_len = strlen (URI_prefix_pos);
18515
18516 if (URI_prefix_len > 245)
18517 {
18518 myfree (temp_input_buf);
18519
18520 return (PARSER_SALT_LENGTH);
18521 }
18522
18523 // URI_resource:
18524
18525 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
18526
18527 if (URI_suffix_pos == NULL)
18528 {
18529 myfree (temp_input_buf);
18530
18531 return (PARSER_SEPARATOR_UNMATCHED);
18532 }
18533
18534 URI_suffix_pos[0] = 0;
18535 URI_suffix_pos++;
18536
18537 uint URI_resource_len = strlen (URI_resource_pos);
18538
18539 if (URI_resource_len < 1 || URI_resource_len > 246)
18540 {
18541 myfree (temp_input_buf);
18542
18543 return (PARSER_SALT_LENGTH);
18544 }
18545
18546 // URI_suffix:
18547
18548 char *nonce_pos = strchr (URI_suffix_pos, '*');
18549
18550 if (nonce_pos == NULL)
18551 {
18552 myfree (temp_input_buf);
18553
18554 return (PARSER_SEPARATOR_UNMATCHED);
18555 }
18556
18557 nonce_pos[0] = 0;
18558 nonce_pos++;
18559
18560 uint URI_suffix_len = strlen (URI_suffix_pos);
18561
18562 if (URI_suffix_len > 245)
18563 {
18564 myfree (temp_input_buf);
18565
18566 return (PARSER_SALT_LENGTH);
18567 }
18568
18569 // nonce:
18570
18571 char *nonce_client_pos = strchr (nonce_pos, '*');
18572
18573 if (nonce_client_pos == NULL)
18574 {
18575 myfree (temp_input_buf);
18576
18577 return (PARSER_SEPARATOR_UNMATCHED);
18578 }
18579
18580 nonce_client_pos[0] = 0;
18581 nonce_client_pos++;
18582
18583 uint nonce_len = strlen (nonce_pos);
18584
18585 if (nonce_len < 1 || nonce_len > 50)
18586 {
18587 myfree (temp_input_buf);
18588
18589 return (PARSER_SALT_LENGTH);
18590 }
18591
18592 // nonce_client:
18593
18594 char *nonce_count_pos = strchr (nonce_client_pos, '*');
18595
18596 if (nonce_count_pos == NULL)
18597 {
18598 myfree (temp_input_buf);
18599
18600 return (PARSER_SEPARATOR_UNMATCHED);
18601 }
18602
18603 nonce_count_pos[0] = 0;
18604 nonce_count_pos++;
18605
18606 uint nonce_client_len = strlen (nonce_client_pos);
18607
18608 if (nonce_client_len > 50)
18609 {
18610 myfree (temp_input_buf);
18611
18612 return (PARSER_SALT_LENGTH);
18613 }
18614
18615 // nonce_count:
18616
18617 char *qop_pos = strchr (nonce_count_pos, '*');
18618
18619 if (qop_pos == NULL)
18620 {
18621 myfree (temp_input_buf);
18622
18623 return (PARSER_SEPARATOR_UNMATCHED);
18624 }
18625
18626 qop_pos[0] = 0;
18627 qop_pos++;
18628
18629 uint nonce_count_len = strlen (nonce_count_pos);
18630
18631 if (nonce_count_len > 50)
18632 {
18633 myfree (temp_input_buf);
18634
18635 return (PARSER_SALT_LENGTH);
18636 }
18637
18638 // qop:
18639
18640 char *directive_pos = strchr (qop_pos, '*');
18641
18642 if (directive_pos == NULL)
18643 {
18644 myfree (temp_input_buf);
18645
18646 return (PARSER_SEPARATOR_UNMATCHED);
18647 }
18648
18649 directive_pos[0] = 0;
18650 directive_pos++;
18651
18652 uint qop_len = strlen (qop_pos);
18653
18654 if (qop_len > 50)
18655 {
18656 myfree (temp_input_buf);
18657
18658 return (PARSER_SALT_LENGTH);
18659 }
18660
18661 // directive
18662
18663 char *digest_pos = strchr (directive_pos, '*');
18664
18665 if (digest_pos == NULL)
18666 {
18667 myfree (temp_input_buf);
18668
18669 return (PARSER_SEPARATOR_UNMATCHED);
18670 }
18671
18672 digest_pos[0] = 0;
18673 digest_pos++;
18674
18675 uint directive_len = strlen (directive_pos);
18676
18677 if (directive_len != 3)
18678 {
18679 myfree (temp_input_buf);
18680
18681 return (PARSER_SALT_LENGTH);
18682 }
18683
18684 if (memcmp (directive_pos, "MD5", 3))
18685 {
18686 log_info ("ERROR: Only the MD5 directive is currently supported\n");
18687
18688 myfree (temp_input_buf);
18689
18690 return (PARSER_SIP_AUTH_DIRECTIVE);
18691 }
18692
18693 /*
18694 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
18695 */
18696
18697 uint md5_len = 0;
18698
18699 uint md5_max_len = 4 * 64;
18700
18701 uint md5_remaining_len = md5_max_len;
18702
18703 uint tmp_md5_buf[64] = { 0 };
18704
18705 char *tmp_md5_ptr = (char *) tmp_md5_buf;
18706
18707 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
18708
18709 md5_len += method_len + 1;
18710 tmp_md5_ptr += method_len + 1;
18711
18712 if (URI_prefix_len > 0)
18713 {
18714 md5_remaining_len = md5_max_len - md5_len;
18715
18716 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
18717
18718 md5_len += URI_prefix_len + 1;
18719 tmp_md5_ptr += URI_prefix_len + 1;
18720 }
18721
18722 md5_remaining_len = md5_max_len - md5_len;
18723
18724 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
18725
18726 md5_len += URI_resource_len;
18727 tmp_md5_ptr += URI_resource_len;
18728
18729 if (URI_suffix_len > 0)
18730 {
18731 md5_remaining_len = md5_max_len - md5_len;
18732
18733 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
18734
18735 md5_len += 1 + URI_suffix_len;
18736 }
18737
18738 uint tmp_digest[4] = { 0 };
18739
18740 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
18741
18742 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
18743 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
18744 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
18745 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
18746
18747 /*
18748 * esalt
18749 */
18750
18751 char *esalt_buf_ptr = (char *) sip->esalt_buf;
18752
18753 uint esalt_len = 0;
18754
18755 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
18756
18757 // there are 2 possibilities for the esalt:
18758
18759 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
18760 {
18761 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
18762
18763 if (esalt_len > max_esalt_len)
18764 {
18765 myfree (temp_input_buf);
18766
18767 return (PARSER_SALT_LENGTH);
18768 }
18769
18770 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
18771 nonce_pos,
18772 nonce_count_pos,
18773 nonce_client_pos,
18774 qop_pos,
18775 tmp_digest[0],
18776 tmp_digest[1],
18777 tmp_digest[2],
18778 tmp_digest[3]);
18779 }
18780 else
18781 {
18782 esalt_len = 1 + nonce_len + 1 + 32;
18783
18784 if (esalt_len > max_esalt_len)
18785 {
18786 myfree (temp_input_buf);
18787
18788 return (PARSER_SALT_LENGTH);
18789 }
18790
18791 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
18792 nonce_pos,
18793 tmp_digest[0],
18794 tmp_digest[1],
18795 tmp_digest[2],
18796 tmp_digest[3]);
18797 }
18798
18799 // add 0x80 to esalt
18800
18801 esalt_buf_ptr[esalt_len] = 0x80;
18802
18803 sip->esalt_len = esalt_len;
18804
18805 /*
18806 * actual salt
18807 */
18808
18809 char *sip_salt_ptr = (char *) sip->salt_buf;
18810
18811 uint salt_len = user_len + 1 + realm_len + 1;
18812
18813 uint max_salt_len = 119;
18814
18815 if (salt_len > max_salt_len)
18816 {
18817 myfree (temp_input_buf);
18818
18819 return (PARSER_SALT_LENGTH);
18820 }
18821
18822 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18823
18824 sip->salt_len = salt_len;
18825
18826 /*
18827 * fake salt (for sorting)
18828 */
18829
18830 char *salt_buf_ptr = (char *) salt->salt_buf;
18831
18832 max_salt_len = 55;
18833
18834 uint fake_salt_len = salt_len;
18835
18836 if (fake_salt_len > max_salt_len)
18837 {
18838 fake_salt_len = max_salt_len;
18839 }
18840
18841 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18842
18843 salt->salt_len = fake_salt_len;
18844
18845 /*
18846 * digest
18847 */
18848
18849 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
18850 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
18851 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
18852 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
18853
18854 digest[0] = byte_swap_32 (digest[0]);
18855 digest[1] = byte_swap_32 (digest[1]);
18856 digest[2] = byte_swap_32 (digest[2]);
18857 digest[3] = byte_swap_32 (digest[3]);
18858
18859 myfree (temp_input_buf);
18860
18861 return (PARSER_OK);
18862 }
18863
18864 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18865 {
18866 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
18867
18868 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18869
18870 u32 *digest = (u32 *) hash_buf->digest;
18871
18872 salt_t *salt = hash_buf->salt;
18873
18874 // digest
18875
18876 char *digest_pos = input_buf;
18877
18878 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
18879 digest[1] = 0;
18880 digest[2] = 0;
18881 digest[3] = 0;
18882
18883 // salt
18884
18885 char *salt_buf = input_buf + 8 + 1;
18886
18887 uint salt_len = 8;
18888
18889 char *salt_buf_ptr = (char *) salt->salt_buf;
18890
18891 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18892
18893 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18894
18895 salt->salt_len = salt_len;
18896
18897 return (PARSER_OK);
18898 }
18899
18900 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18901 {
18902 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
18903
18904 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18905
18906 u32 *digest = (u32 *) hash_buf->digest;
18907
18908 salt_t *salt = hash_buf->salt;
18909
18910 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
18911
18912 /**
18913 * parse line
18914 */
18915
18916 char *p_buf_pos = input_buf + 4;
18917
18918 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
18919
18920 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18921
18922 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
18923
18924 NumCyclesPower_pos++;
18925
18926 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
18927
18928 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18929
18930 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
18931
18932 salt_len_pos++;
18933
18934 char *salt_buf_pos = strchr (salt_len_pos, '$');
18935
18936 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18937
18938 u32 salt_len_len = salt_buf_pos - salt_len_pos;
18939
18940 salt_buf_pos++;
18941
18942 char *iv_len_pos = strchr (salt_buf_pos, '$');
18943
18944 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18945
18946 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
18947
18948 iv_len_pos++;
18949
18950 char *iv_buf_pos = strchr (iv_len_pos, '$');
18951
18952 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18953
18954 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18955
18956 iv_buf_pos++;
18957
18958 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18959
18960 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18961
18962 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18963
18964 crc_buf_pos++;
18965
18966 char *data_len_pos = strchr (crc_buf_pos, '$');
18967
18968 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18969
18970 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18971
18972 data_len_pos++;
18973
18974 char *unpack_size_pos = strchr (data_len_pos, '$');
18975
18976 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18977
18978 u32 data_len_len = unpack_size_pos - data_len_pos;
18979
18980 unpack_size_pos++;
18981
18982 char *data_buf_pos = strchr (unpack_size_pos, '$');
18983
18984 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18985
18986 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18987
18988 data_buf_pos++;
18989
18990 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;
18991
18992 const uint iter = atoi (NumCyclesPower_pos);
18993 const uint crc = atoi (crc_buf_pos);
18994 const uint p_buf = atoi (p_buf_pos);
18995 const uint salt_len = atoi (salt_len_pos);
18996 const uint iv_len = atoi (iv_len_pos);
18997 const uint unpack_size = atoi (unpack_size_pos);
18998 const uint data_len = atoi (data_len_pos);
18999
19000 /**
19001 * verify some data
19002 */
19003
19004 if (p_buf != 0) return (PARSER_SALT_VALUE);
19005 if (salt_len != 0) return (PARSER_SALT_VALUE);
19006
19007 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
19008
19009 if (data_len > 384) return (PARSER_SALT_VALUE);
19010
19011 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
19012
19013 /**
19014 * store data
19015 */
19016
19017 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
19018 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
19019 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
19020 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
19021
19022 seven_zip->iv_len = iv_len;
19023
19024 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
19025
19026 seven_zip->salt_len = 0;
19027
19028 seven_zip->crc = crc;
19029
19030 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
19031 {
19032 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
19033
19034 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
19035 }
19036
19037 seven_zip->data_len = data_len;
19038
19039 seven_zip->unpack_size = unpack_size;
19040
19041 // real salt
19042
19043 salt->salt_buf[0] = seven_zip->data_buf[0];
19044 salt->salt_buf[1] = seven_zip->data_buf[1];
19045 salt->salt_buf[2] = seven_zip->data_buf[2];
19046 salt->salt_buf[3] = seven_zip->data_buf[3];
19047
19048 salt->salt_len = 16;
19049
19050 salt->salt_sign[0] = iter;
19051
19052 salt->salt_iter = 1 << iter;
19053
19054 /**
19055 * digest
19056 */
19057
19058 digest[0] = crc;
19059 digest[1] = 0;
19060 digest[2] = 0;
19061 digest[3] = 0;
19062
19063 return (PARSER_OK);
19064 }
19065
19066 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19067 {
19068 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
19069
19070 u32 *digest = (u32 *) hash_buf->digest;
19071
19072 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
19073 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
19074 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
19075 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
19076 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
19077 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
19078 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
19079 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
19080
19081 digest[0] = byte_swap_32 (digest[0]);
19082 digest[1] = byte_swap_32 (digest[1]);
19083 digest[2] = byte_swap_32 (digest[2]);
19084 digest[3] = byte_swap_32 (digest[3]);
19085 digest[4] = byte_swap_32 (digest[4]);
19086 digest[5] = byte_swap_32 (digest[5]);
19087 digest[6] = byte_swap_32 (digest[6]);
19088 digest[7] = byte_swap_32 (digest[7]);
19089
19090 return (PARSER_OK);
19091 }
19092
19093 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19094 {
19095 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
19096
19097 u32 *digest = (u32 *) hash_buf->digest;
19098
19099 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
19100 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
19101 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
19102 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
19103 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
19104 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
19105 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
19106 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
19107 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
19108 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
19109 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
19110 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
19111 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
19112 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
19113 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
19114 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
19115
19116 digest[ 0] = byte_swap_32 (digest[ 0]);
19117 digest[ 1] = byte_swap_32 (digest[ 1]);
19118 digest[ 2] = byte_swap_32 (digest[ 2]);
19119 digest[ 3] = byte_swap_32 (digest[ 3]);
19120 digest[ 4] = byte_swap_32 (digest[ 4]);
19121 digest[ 5] = byte_swap_32 (digest[ 5]);
19122 digest[ 6] = byte_swap_32 (digest[ 6]);
19123 digest[ 7] = byte_swap_32 (digest[ 7]);
19124 digest[ 8] = byte_swap_32 (digest[ 8]);
19125 digest[ 9] = byte_swap_32 (digest[ 9]);
19126 digest[10] = byte_swap_32 (digest[10]);
19127 digest[11] = byte_swap_32 (digest[11]);
19128 digest[12] = byte_swap_32 (digest[12]);
19129 digest[13] = byte_swap_32 (digest[13]);
19130 digest[14] = byte_swap_32 (digest[14]);
19131 digest[15] = byte_swap_32 (digest[15]);
19132
19133 return (PARSER_OK);
19134 }
19135
19136 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19137 {
19138 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
19139
19140 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
19141
19142 u32 *digest = (u32 *) hash_buf->digest;
19143
19144 salt_t *salt = hash_buf->salt;
19145
19146 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
19147
19148 /**
19149 * parse line
19150 */
19151
19152 // iterations
19153
19154 char *iter_pos = input_buf + 4;
19155
19156 u32 iter = atoi (iter_pos);
19157
19158 if (iter < 1) return (PARSER_SALT_ITERATION);
19159 if (iter > 999999) return (PARSER_SALT_ITERATION);
19160
19161 // first is *raw* salt
19162
19163 char *salt_pos = strchr (iter_pos, ':');
19164
19165 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19166
19167 salt_pos++;
19168
19169 char *hash_pos = strchr (salt_pos, ':');
19170
19171 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19172
19173 u32 salt_len = hash_pos - salt_pos;
19174
19175 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19176
19177 hash_pos++;
19178
19179 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19180
19181 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19182
19183 // decode salt
19184
19185 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
19186
19187 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19188
19189 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19190
19191 salt_buf_ptr[salt_len + 3] = 0x01;
19192 salt_buf_ptr[salt_len + 4] = 0x80;
19193
19194 salt->salt_len = salt_len;
19195 salt->salt_iter = iter - 1;
19196
19197 // decode hash
19198
19199 u8 tmp_buf[100] = { 0 };
19200
19201 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19202
19203 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19204
19205 memcpy (digest, tmp_buf, 16);
19206
19207 // add some stuff to normal salt to make sorted happy
19208
19209 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
19210 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
19211 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
19212 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
19213 salt->salt_buf[4] = salt->salt_iter;
19214
19215 return (PARSER_OK);
19216 }
19217
19218 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19219 {
19220 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
19221
19222 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
19223
19224 u32 *digest = (u32 *) hash_buf->digest;
19225
19226 salt_t *salt = hash_buf->salt;
19227
19228 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
19229
19230 /**
19231 * parse line
19232 */
19233
19234 // iterations
19235
19236 char *iter_pos = input_buf + 5;
19237
19238 u32 iter = atoi (iter_pos);
19239
19240 if (iter < 1) return (PARSER_SALT_ITERATION);
19241 if (iter > 999999) return (PARSER_SALT_ITERATION);
19242
19243 // first is *raw* salt
19244
19245 char *salt_pos = strchr (iter_pos, ':');
19246
19247 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19248
19249 salt_pos++;
19250
19251 char *hash_pos = strchr (salt_pos, ':');
19252
19253 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19254
19255 u32 salt_len = hash_pos - salt_pos;
19256
19257 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19258
19259 hash_pos++;
19260
19261 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19262
19263 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19264
19265 // decode salt
19266
19267 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
19268
19269 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19270
19271 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19272
19273 salt_buf_ptr[salt_len + 3] = 0x01;
19274 salt_buf_ptr[salt_len + 4] = 0x80;
19275
19276 salt->salt_len = salt_len;
19277 salt->salt_iter = iter - 1;
19278
19279 // decode hash
19280
19281 u8 tmp_buf[100] = { 0 };
19282
19283 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19284
19285 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19286
19287 memcpy (digest, tmp_buf, 16);
19288
19289 digest[0] = byte_swap_32 (digest[0]);
19290 digest[1] = byte_swap_32 (digest[1]);
19291 digest[2] = byte_swap_32 (digest[2]);
19292 digest[3] = byte_swap_32 (digest[3]);
19293
19294 // add some stuff to normal salt to make sorted happy
19295
19296 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
19297 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
19298 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
19299 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
19300 salt->salt_buf[4] = salt->salt_iter;
19301
19302 return (PARSER_OK);
19303 }
19304
19305 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19306 {
19307 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
19308
19309 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
19310
19311 u64 *digest = (u64 *) hash_buf->digest;
19312
19313 salt_t *salt = hash_buf->salt;
19314
19315 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
19316
19317 /**
19318 * parse line
19319 */
19320
19321 // iterations
19322
19323 char *iter_pos = input_buf + 7;
19324
19325 u32 iter = atoi (iter_pos);
19326
19327 if (iter < 1) return (PARSER_SALT_ITERATION);
19328 if (iter > 999999) return (PARSER_SALT_ITERATION);
19329
19330 // first is *raw* salt
19331
19332 char *salt_pos = strchr (iter_pos, ':');
19333
19334 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19335
19336 salt_pos++;
19337
19338 char *hash_pos = strchr (salt_pos, ':');
19339
19340 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19341
19342 u32 salt_len = hash_pos - salt_pos;
19343
19344 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19345
19346 hash_pos++;
19347
19348 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19349
19350 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19351
19352 // decode salt
19353
19354 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
19355
19356 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19357
19358 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19359
19360 salt_buf_ptr[salt_len + 3] = 0x01;
19361 salt_buf_ptr[salt_len + 4] = 0x80;
19362
19363 salt->salt_len = salt_len;
19364 salt->salt_iter = iter - 1;
19365
19366 // decode hash
19367
19368 u8 tmp_buf[100] = { 0 };
19369
19370 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19371
19372 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19373
19374 memcpy (digest, tmp_buf, 64);
19375
19376 digest[0] = byte_swap_64 (digest[0]);
19377 digest[1] = byte_swap_64 (digest[1]);
19378 digest[2] = byte_swap_64 (digest[2]);
19379 digest[3] = byte_swap_64 (digest[3]);
19380 digest[4] = byte_swap_64 (digest[4]);
19381 digest[5] = byte_swap_64 (digest[5]);
19382 digest[6] = byte_swap_64 (digest[6]);
19383 digest[7] = byte_swap_64 (digest[7]);
19384
19385 // add some stuff to normal salt to make sorted happy
19386
19387 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
19388 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
19389 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
19390 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
19391 salt->salt_buf[4] = salt->salt_iter;
19392
19393 return (PARSER_OK);
19394 }
19395
19396 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19397 {
19398 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
19399
19400 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
19401
19402 uint *digest = (uint *) hash_buf->digest;
19403
19404 salt_t *salt = hash_buf->salt;
19405
19406 /**
19407 * parse line
19408 */
19409
19410 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
19411
19412 char *hash_pos = strchr (salt_pos, '$');
19413
19414 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19415
19416 u32 salt_len = hash_pos - salt_pos;
19417
19418 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19419
19420 hash_pos++;
19421
19422 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
19423
19424 if (hash_len != 16) return (PARSER_HASH_LENGTH);
19425
19426 // decode hash
19427
19428 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
19429 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
19430 digest[ 2] = 0;
19431 digest[ 3] = 0;
19432 digest[ 4] = 0;
19433 digest[ 5] = 0;
19434 digest[ 6] = 0;
19435 digest[ 7] = 0;
19436 digest[ 8] = 0;
19437 digest[ 9] = 0;
19438 digest[10] = 0;
19439 digest[11] = 0;
19440 digest[12] = 0;
19441 digest[13] = 0;
19442 digest[14] = 0;
19443 digest[15] = 0;
19444
19445 // decode salt
19446
19447 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19448 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19449
19450 salt->salt_iter = ROUNDS_ECRYPTFS;
19451 salt->salt_len = 8;
19452
19453 return (PARSER_OK);
19454 }
19455
19456 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19457 {
19458 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
19459
19460 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
19461
19462 unsigned char c19 = itoa64_to_int (input_buf[19]);
19463
19464 if (c19 & 3) return (PARSER_HASH_VALUE);
19465
19466 salt_t *salt = hash_buf->salt;
19467
19468 u32 *digest = (u32 *) hash_buf->digest;
19469
19470 // iteration count
19471
19472 salt->salt_iter = itoa64_to_int (input_buf[1])
19473 | itoa64_to_int (input_buf[2]) << 6
19474 | itoa64_to_int (input_buf[3]) << 12
19475 | itoa64_to_int (input_buf[4]) << 18;
19476
19477 // set salt
19478
19479 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
19480 | itoa64_to_int (input_buf[6]) << 6
19481 | itoa64_to_int (input_buf[7]) << 12
19482 | itoa64_to_int (input_buf[8]) << 18;
19483
19484 salt->salt_len = 4;
19485
19486 u8 tmp_buf[100] = { 0 };
19487
19488 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
19489
19490 memcpy (digest, tmp_buf, 8);
19491
19492 uint tt;
19493
19494 IP (digest[0], digest[1], tt);
19495
19496 digest[0] = rotr32 (digest[0], 31);
19497 digest[1] = rotr32 (digest[1], 31);
19498 digest[2] = 0;
19499 digest[3] = 0;
19500
19501 return (PARSER_OK);
19502 }
19503
19504 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19505 {
19506 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
19507
19508 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
19509
19510 u32 *digest = (u32 *) hash_buf->digest;
19511
19512 salt_t *salt = hash_buf->salt;
19513
19514 /**
19515 * parse line
19516 */
19517
19518 char *type_pos = input_buf + 6 + 1;
19519
19520 char *salt_pos = strchr (type_pos, '*');
19521
19522 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19523
19524 u32 type_len = salt_pos - type_pos;
19525
19526 if (type_len != 1) return (PARSER_SALT_LENGTH);
19527
19528 salt_pos++;
19529
19530 char *crypted_pos = strchr (salt_pos, '*');
19531
19532 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19533
19534 u32 salt_len = crypted_pos - salt_pos;
19535
19536 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19537
19538 crypted_pos++;
19539
19540 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
19541
19542 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
19543
19544 /**
19545 * copy data
19546 */
19547
19548 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19549 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19550
19551 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19552 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19553
19554 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
19555 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
19556 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
19557 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
19558
19559 salt->salt_len = 24;
19560 salt->salt_iter = ROUNDS_RAR3;
19561
19562 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
19563 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
19564
19565 digest[0] = 0xc43d7b00;
19566 digest[1] = 0x40070000;
19567 digest[2] = 0;
19568 digest[3] = 0;
19569
19570 return (PARSER_OK);
19571 }
19572
19573 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19574 {
19575 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
19576
19577 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
19578
19579 u32 *digest = (u32 *) hash_buf->digest;
19580
19581 salt_t *salt = hash_buf->salt;
19582
19583 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
19584
19585 /**
19586 * parse line
19587 */
19588
19589 char *param0_pos = input_buf + 1 + 4 + 1;
19590
19591 char *param1_pos = strchr (param0_pos, '$');
19592
19593 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19594
19595 u32 param0_len = param1_pos - param0_pos;
19596
19597 param1_pos++;
19598
19599 char *param2_pos = strchr (param1_pos, '$');
19600
19601 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19602
19603 u32 param1_len = param2_pos - param1_pos;
19604
19605 param2_pos++;
19606
19607 char *param3_pos = strchr (param2_pos, '$');
19608
19609 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19610
19611 u32 param2_len = param3_pos - param2_pos;
19612
19613 param3_pos++;
19614
19615 char *param4_pos = strchr (param3_pos, '$');
19616
19617 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19618
19619 u32 param3_len = param4_pos - param3_pos;
19620
19621 param4_pos++;
19622
19623 char *param5_pos = strchr (param4_pos, '$');
19624
19625 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19626
19627 u32 param4_len = param5_pos - param4_pos;
19628
19629 param5_pos++;
19630
19631 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
19632
19633 char *salt_buf = param1_pos;
19634 char *iv = param3_pos;
19635 char *pswcheck = param5_pos;
19636
19637 const uint salt_len = atoi (param0_pos);
19638 const uint iterations = atoi (param2_pos);
19639 const uint pswcheck_len = atoi (param4_pos);
19640
19641 /**
19642 * verify some data
19643 */
19644
19645 if (param1_len != 32) return (PARSER_SALT_VALUE);
19646 if (param3_len != 32) return (PARSER_SALT_VALUE);
19647 if (param5_len != 16) return (PARSER_SALT_VALUE);
19648
19649 if (salt_len != 16) return (PARSER_SALT_VALUE);
19650 if (iterations == 0) return (PARSER_SALT_VALUE);
19651 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
19652
19653 /**
19654 * store data
19655 */
19656
19657 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
19658 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
19659 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
19660 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
19661
19662 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
19663 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
19664 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
19665 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
19666
19667 salt->salt_len = 16;
19668
19669 salt->salt_sign[0] = iterations;
19670
19671 salt->salt_iter = ((1 << iterations) + 32) - 1;
19672
19673 /**
19674 * digest buf
19675 */
19676
19677 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
19678 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
19679 digest[2] = 0;
19680 digest[3] = 0;
19681
19682 return (PARSER_OK);
19683 }
19684
19685 int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19686 {
19687 if ((input_len < DISPLAY_LEN_MIN_13100) || (input_len > DISPLAY_LEN_MAX_13100)) return (PARSER_GLOBAL_LENGTH);
19688
19689 if (memcmp (SIGNATURE_KRB5TGS, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19690
19691 u32 *digest = (u32 *) hash_buf->digest;
19692
19693 salt_t *salt = hash_buf->salt;
19694
19695 krb5tgs_t *krb5tgs = (krb5tgs_t *) hash_buf->esalt;
19696
19697 /**
19698 * parse line
19699 */
19700
19701 /* Skip '$' */
19702 char *account_pos = input_buf + 11 + 1;
19703
19704 char *data_pos;
19705
19706 uint data_len;
19707
19708 if (account_pos[0] == '*')
19709 {
19710 account_pos++;
19711
19712 data_pos = strchr (account_pos, '*');
19713
19714 /* Skip '*' */
19715 data_pos++;
19716
19717 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19718
19719 uint account_len = data_pos - account_pos + 1;
19720
19721 if (account_len >= 512) return (PARSER_SALT_LENGTH);
19722
19723 /* Skip '$' */
19724 data_pos++;
19725
19726 data_len = input_len - 11 - 1 - account_len - 2;
19727
19728 memcpy (krb5tgs->account_info, account_pos - 1, account_len);
19729 }
19730 else
19731 {
19732 /* assume $krb5tgs$23$checksum$edata2 */
19733 data_pos = account_pos;
19734
19735 memcpy (krb5tgs->account_info, "**", 3);
19736
19737 data_len = input_len - 11 - 1 - 1;
19738 }
19739
19740 if (data_len < ((16 + 32) * 2)) return (PARSER_SALT_LENGTH);
19741
19742 char *checksum_ptr = (char *) krb5tgs->checksum;
19743
19744 for (uint i = 0; i < 16 * 2; i += 2)
19745 {
19746 const char p0 = data_pos[i + 0];
19747 const char p1 = data_pos[i + 1];
19748
19749 *checksum_ptr++ = hex_convert (p1) << 0
19750 | hex_convert (p0) << 4;
19751 }
19752
19753 char *edata_ptr = (char *) krb5tgs->edata2;
19754
19755 krb5tgs->edata2_len = (data_len - 32) / 2 ;
19756
19757 /* skip '$' */
19758 for (uint i = 16 * 2 + 1; i < (krb5tgs->edata2_len * 2) + (16 * 2 + 1); i += 2)
19759 {
19760 const char p0 = data_pos[i + 0];
19761 const char p1 = data_pos[i + 1];
19762 *edata_ptr++ = hex_convert (p1) << 0
19763 | hex_convert (p0) << 4;
19764 }
19765
19766 /* this is needed for hmac_md5 */
19767 *edata_ptr++ = 0x80;
19768
19769 salt->salt_buf[0] = krb5tgs->checksum[0];
19770 salt->salt_buf[1] = krb5tgs->checksum[1];
19771 salt->salt_buf[2] = krb5tgs->checksum[2];
19772 salt->salt_buf[3] = krb5tgs->checksum[3];
19773
19774 salt->salt_len = 32;
19775
19776 digest[0] = krb5tgs->checksum[0];
19777 digest[1] = krb5tgs->checksum[1];
19778 digest[2] = krb5tgs->checksum[2];
19779 digest[3] = krb5tgs->checksum[3];
19780
19781 return (PARSER_OK);
19782 }
19783
19784 int axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19785 {
19786 if ((input_len < DISPLAY_LEN_MIN_13200) || (input_len > DISPLAY_LEN_MAX_13200)) return (PARSER_GLOBAL_LENGTH);
19787
19788 if (memcmp (SIGNATURE_AXCRYPT, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19789
19790 u32 *digest = (u32 *) hash_buf->digest;
19791
19792 salt_t *salt = hash_buf->salt;
19793
19794 /**
19795 * parse line
19796 */
19797
19798 /* Skip '*' */
19799 char *wrapping_rounds_pos = input_buf + 11 + 1;
19800
19801 char *salt_pos;
19802
19803 char *wrapped_key_pos;
19804
19805 char *data_pos;
19806
19807 salt->salt_iter = atoi (wrapping_rounds_pos);
19808
19809 salt_pos = strchr (wrapping_rounds_pos, '*');
19810
19811 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19812
19813 uint wrapping_rounds_len = salt_pos - wrapping_rounds_pos;
19814
19815 /* Skip '*' */
19816 salt_pos++;
19817
19818 data_pos = salt_pos;
19819
19820 wrapped_key_pos = strchr (salt_pos, '*');
19821
19822 if (wrapped_key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19823
19824 uint salt_len = wrapped_key_pos - salt_pos;
19825
19826 if (salt_len != 32) return (PARSER_SALT_LENGTH);
19827
19828 /* Skip '*' */
19829 wrapped_key_pos++;
19830
19831 uint wrapped_key_len = input_len - 11 - 1 - wrapping_rounds_len - 1 - salt_len - 1;
19832
19833 if (wrapped_key_len != 48) return (PARSER_SALT_LENGTH);
19834
19835 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19836 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19837 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &data_pos[16]);
19838 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &data_pos[24]);
19839
19840 data_pos += 33;
19841
19842 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19843 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19844 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &data_pos[16]);
19845 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &data_pos[24]);
19846 salt->salt_buf[8] = hex_to_u32 ((const u8 *) &data_pos[32]);
19847 salt->salt_buf[9] = hex_to_u32 ((const u8 *) &data_pos[40]);
19848
19849 salt->salt_len = 40;
19850
19851 digest[0] = salt->salt_buf[0];
19852 digest[1] = salt->salt_buf[1];
19853 digest[2] = salt->salt_buf[2];
19854 digest[3] = salt->salt_buf[3];
19855
19856 return (PARSER_OK);
19857 }
19858
19859 int keepass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19860 {
19861 if ((input_len < DISPLAY_LEN_MIN_13400) || (input_len > DISPLAY_LEN_MAX_13400)) return (PARSER_GLOBAL_LENGTH);
19862
19863 if (memcmp (SIGNATURE_KEEPASS, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
19864
19865 u32 *digest = (u32 *) hash_buf->digest;
19866
19867 salt_t *salt = hash_buf->salt;
19868
19869 keepass_t *keepass = (keepass_t *) hash_buf->esalt;
19870
19871 /**
19872 * parse line
19873 */
19874
19875 char *version_pos;
19876
19877 char *rounds_pos;
19878
19879 char *algorithm_pos;
19880
19881 char *final_random_seed_pos;
19882 u32 final_random_seed_len;
19883
19884 char *transf_random_seed_pos;
19885 u32 transf_random_seed_len;
19886
19887 char *enc_iv_pos;
19888 u32 enc_iv_len;
19889
19890 /* default is no keyfile provided */
19891 char *keyfile_len_pos;
19892 u32 keyfile_len = 0;
19893 u32 is_keyfile_present = 0;
19894 char *keyfile_inline_pos;
19895 char *keyfile_pos;
19896
19897 /* specific to version 1 */
19898 char *contents_len_pos;
19899 u32 contents_len;
19900 char *contents_pos;
19901
19902 /* specific to version 2 */
19903 char *expected_bytes_pos;
19904 u32 expected_bytes_len;
19905
19906 char *contents_hash_pos;
19907 u32 contents_hash_len;
19908
19909 version_pos = input_buf + 8 + 1 + 1;
19910
19911 keepass->version = atoi (version_pos);
19912
19913 rounds_pos = strchr (version_pos, '*');
19914
19915 if (rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19916
19917 rounds_pos++;
19918
19919 salt->salt_iter = (atoi (rounds_pos));
19920
19921 algorithm_pos = strchr (rounds_pos, '*');
19922
19923 if (algorithm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19924
19925 algorithm_pos++;
19926
19927 keepass->algorithm = atoi (algorithm_pos);
19928
19929 final_random_seed_pos = strchr (algorithm_pos, '*');
19930
19931 if (final_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19932
19933 final_random_seed_pos++;
19934
19935 keepass->final_random_seed[0] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 0]);
19936 keepass->final_random_seed[1] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 8]);
19937 keepass->final_random_seed[2] = hex_to_u32 ((const u8 *) &final_random_seed_pos[16]);
19938 keepass->final_random_seed[3] = hex_to_u32 ((const u8 *) &final_random_seed_pos[24]);
19939
19940 if (keepass->version == 2)
19941 {
19942 keepass->final_random_seed[4] = hex_to_u32 ((const u8 *) &final_random_seed_pos[32]);
19943 keepass->final_random_seed[5] = hex_to_u32 ((const u8 *) &final_random_seed_pos[40]);
19944 keepass->final_random_seed[6] = hex_to_u32 ((const u8 *) &final_random_seed_pos[48]);
19945 keepass->final_random_seed[7] = hex_to_u32 ((const u8 *) &final_random_seed_pos[56]);
19946 }
19947
19948 transf_random_seed_pos = strchr (final_random_seed_pos, '*');
19949
19950 if (transf_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19951
19952 final_random_seed_len = transf_random_seed_pos - final_random_seed_pos;
19953
19954 if (keepass->version == 1 && final_random_seed_len != 32) return (PARSER_SALT_LENGTH);
19955 if (keepass->version == 2 && final_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19956
19957 transf_random_seed_pos++;
19958
19959 keepass->transf_random_seed[0] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 0]);
19960 keepass->transf_random_seed[1] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 8]);
19961 keepass->transf_random_seed[2] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[16]);
19962 keepass->transf_random_seed[3] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[24]);
19963 keepass->transf_random_seed[4] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[32]);
19964 keepass->transf_random_seed[5] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[40]);
19965 keepass->transf_random_seed[6] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[48]);
19966 keepass->transf_random_seed[7] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[56]);
19967
19968 enc_iv_pos = strchr (transf_random_seed_pos, '*');
19969
19970 if (enc_iv_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19971
19972 transf_random_seed_len = enc_iv_pos - transf_random_seed_pos;
19973
19974 if (transf_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19975
19976 enc_iv_pos++;
19977
19978 keepass->enc_iv[0] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 0]);
19979 keepass->enc_iv[1] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 8]);
19980 keepass->enc_iv[2] = hex_to_u32 ((const u8 *) &enc_iv_pos[16]);
19981 keepass->enc_iv[3] = hex_to_u32 ((const u8 *) &enc_iv_pos[24]);
19982
19983 if (keepass->version == 1)
19984 {
19985 contents_hash_pos = strchr (enc_iv_pos, '*');
19986
19987 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19988
19989 enc_iv_len = contents_hash_pos - enc_iv_pos;
19990
19991 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19992
19993 contents_hash_pos++;
19994
19995 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19996 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19997 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19998 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19999 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
20000 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
20001 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
20002 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
20003
20004 /* get length of contents following */
20005 char *inline_flag_pos = strchr (contents_hash_pos, '*');
20006
20007 if (inline_flag_pos == NULL) return (PARSER_SALT_LENGTH);
20008
20009 contents_hash_len = inline_flag_pos - contents_hash_pos;
20010
20011 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
20012
20013 inline_flag_pos++;
20014
20015 u32 inline_flag = atoi (inline_flag_pos);
20016
20017 if (inline_flag != 1) return (PARSER_SALT_LENGTH);
20018
20019 contents_len_pos = strchr (inline_flag_pos, '*');
20020
20021 if (contents_len_pos == NULL) return (PARSER_SALT_LENGTH);
20022
20023 contents_len_pos++;
20024
20025 contents_len = atoi (contents_len_pos);
20026
20027 if (contents_len > 50000) return (PARSER_SALT_LENGTH);
20028
20029 contents_pos = strchr (contents_len_pos, '*');
20030
20031 if (contents_pos == NULL) return (PARSER_SALT_LENGTH);
20032
20033 contents_pos++;
20034
20035 u32 i;
20036
20037 keepass->contents_len = contents_len;
20038
20039 contents_len = contents_len / 4;
20040
20041 keyfile_inline_pos = strchr (contents_pos, '*');
20042
20043 u32 real_contents_len;
20044
20045 if (keyfile_inline_pos == NULL)
20046 real_contents_len = input_len - (contents_pos - input_buf);
20047 else
20048 {
20049 real_contents_len = keyfile_inline_pos - contents_pos;
20050 keyfile_inline_pos++;
20051 is_keyfile_present = 1;
20052 }
20053
20054 if (real_contents_len != keepass->contents_len * 2) return (PARSER_SALT_LENGTH);
20055
20056 for (i = 0; i < contents_len; i++)
20057 keepass->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]);
20058 }
20059 else if (keepass->version == 2)
20060 {
20061 expected_bytes_pos = strchr (enc_iv_pos, '*');
20062
20063 if (expected_bytes_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20064
20065 enc_iv_len = expected_bytes_pos - enc_iv_pos;
20066
20067 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
20068
20069 expected_bytes_pos++;
20070
20071 keepass->expected_bytes[0] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 0]);
20072 keepass->expected_bytes[1] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 8]);
20073 keepass->expected_bytes[2] = hex_to_u32 ((const u8 *) &expected_bytes_pos[16]);
20074 keepass->expected_bytes[3] = hex_to_u32 ((const u8 *) &expected_bytes_pos[24]);
20075 keepass->expected_bytes[4] = hex_to_u32 ((const u8 *) &expected_bytes_pos[32]);
20076 keepass->expected_bytes[5] = hex_to_u32 ((const u8 *) &expected_bytes_pos[40]);
20077 keepass->expected_bytes[6] = hex_to_u32 ((const u8 *) &expected_bytes_pos[48]);
20078 keepass->expected_bytes[7] = hex_to_u32 ((const u8 *) &expected_bytes_pos[56]);
20079
20080 contents_hash_pos = strchr (expected_bytes_pos, '*');
20081
20082 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20083
20084 expected_bytes_len = contents_hash_pos - expected_bytes_pos;
20085
20086 if (expected_bytes_len != 64) return (PARSER_SALT_LENGTH);
20087
20088 contents_hash_pos++;
20089
20090 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
20091 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
20092 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
20093 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
20094 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
20095 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
20096 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
20097 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
20098
20099 keyfile_inline_pos = strchr (contents_hash_pos, '*');
20100
20101 if (keyfile_inline_pos == NULL)
20102 contents_hash_len = input_len - (int) (contents_hash_pos - input_buf);
20103 else
20104 {
20105 contents_hash_len = keyfile_inline_pos - contents_hash_pos;
20106 keyfile_inline_pos++;
20107 is_keyfile_present = 1;
20108 }
20109 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
20110 }
20111
20112 if (is_keyfile_present != 0)
20113 {
20114 keyfile_len_pos = strchr (keyfile_inline_pos, '*');
20115
20116 keyfile_len_pos++;
20117
20118 keyfile_len = atoi (keyfile_len_pos);
20119
20120 keepass->keyfile_len = keyfile_len;
20121
20122 if (keyfile_len != 64) return (PARSER_SALT_LENGTH);
20123
20124 keyfile_pos = strchr (keyfile_len_pos, '*');
20125
20126 if (keyfile_pos == NULL) return (PARSER_SALT_LENGTH);
20127
20128 keyfile_pos++;
20129
20130 u32 real_keyfile_len = input_len - (keyfile_pos - input_buf);
20131
20132 if (real_keyfile_len != 64) return (PARSER_SALT_LENGTH);
20133
20134 keepass->keyfile[0] = hex_to_u32 ((const u8 *) &keyfile_pos[ 0]);
20135 keepass->keyfile[1] = hex_to_u32 ((const u8 *) &keyfile_pos[ 8]);
20136 keepass->keyfile[2] = hex_to_u32 ((const u8 *) &keyfile_pos[16]);
20137 keepass->keyfile[3] = hex_to_u32 ((const u8 *) &keyfile_pos[24]);
20138 keepass->keyfile[4] = hex_to_u32 ((const u8 *) &keyfile_pos[32]);
20139 keepass->keyfile[5] = hex_to_u32 ((const u8 *) &keyfile_pos[40]);
20140 keepass->keyfile[6] = hex_to_u32 ((const u8 *) &keyfile_pos[48]);
20141 keepass->keyfile[7] = hex_to_u32 ((const u8 *) &keyfile_pos[56]);
20142 }
20143
20144 digest[0] = keepass->enc_iv[0];
20145 digest[1] = keepass->enc_iv[1];
20146 digest[2] = keepass->enc_iv[2];
20147 digest[3] = keepass->enc_iv[3];
20148
20149 salt->salt_buf[0] = keepass->transf_random_seed[0];
20150 salt->salt_buf[1] = keepass->transf_random_seed[1];
20151 salt->salt_buf[2] = keepass->transf_random_seed[2];
20152 salt->salt_buf[3] = keepass->transf_random_seed[3];
20153 salt->salt_buf[4] = keepass->transf_random_seed[4];
20154 salt->salt_buf[5] = keepass->transf_random_seed[5];
20155 salt->salt_buf[6] = keepass->transf_random_seed[6];
20156 salt->salt_buf[7] = keepass->transf_random_seed[7];
20157
20158 return (PARSER_OK);
20159 }
20160
20161 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20162 {
20163 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
20164
20165 u32 *digest = (u32 *) hash_buf->digest;
20166
20167 salt_t *salt = hash_buf->salt;
20168
20169 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
20170 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
20171 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
20172 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
20173 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
20174 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
20175 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
20176 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
20177
20178 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
20179
20180 uint salt_len = input_len - 64 - 1;
20181
20182 char *salt_buf = input_buf + 64 + 1;
20183
20184 char *salt_buf_ptr = (char *) salt->salt_buf;
20185
20186 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
20187
20188 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
20189
20190 salt->salt_len = salt_len;
20191
20192 /**
20193 * we can precompute the first sha256 transform
20194 */
20195
20196 uint w[16] = { 0 };
20197
20198 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
20199 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
20200 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
20201 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
20202 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
20203 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
20204 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
20205 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
20206 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
20207 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
20208 w[10] = byte_swap_32 (salt->salt_buf[10]);
20209 w[11] = byte_swap_32 (salt->salt_buf[11]);
20210 w[12] = byte_swap_32 (salt->salt_buf[12]);
20211 w[13] = byte_swap_32 (salt->salt_buf[13]);
20212 w[14] = byte_swap_32 (salt->salt_buf[14]);
20213 w[15] = byte_swap_32 (salt->salt_buf[15]);
20214
20215 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
20216
20217 sha256_64 (w, pc256);
20218
20219 salt->salt_buf_pc[0] = pc256[0];
20220 salt->salt_buf_pc[1] = pc256[1];
20221 salt->salt_buf_pc[2] = pc256[2];
20222 salt->salt_buf_pc[3] = pc256[3];
20223 salt->salt_buf_pc[4] = pc256[4];
20224 salt->salt_buf_pc[5] = pc256[5];
20225 salt->salt_buf_pc[6] = pc256[6];
20226 salt->salt_buf_pc[7] = pc256[7];
20227
20228 digest[0] -= pc256[0];
20229 digest[1] -= pc256[1];
20230 digest[2] -= pc256[2];
20231 digest[3] -= pc256[3];
20232 digest[4] -= pc256[4];
20233 digest[5] -= pc256[5];
20234 digest[6] -= pc256[6];
20235 digest[7] -= pc256[7];
20236
20237 return (PARSER_OK);
20238 }
20239
20240 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20241 {
20242 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
20243
20244 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
20245
20246 u32 *digest = (u32 *) hash_buf->digest;
20247
20248 salt_t *salt = hash_buf->salt;
20249
20250 /**
20251 * parse line
20252 */
20253
20254 char *data_len_pos = input_buf + 1 + 10 + 1;
20255
20256 char *data_buf_pos = strchr (data_len_pos, '$');
20257
20258 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20259
20260 u32 data_len_len = data_buf_pos - data_len_pos;
20261
20262 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
20263 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
20264
20265 data_buf_pos++;
20266
20267 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
20268
20269 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
20270
20271 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
20272
20273 u32 data_len = atoi (data_len_pos);
20274
20275 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
20276
20277 /**
20278 * salt
20279 */
20280
20281 char *salt_pos = data_buf_pos;
20282
20283 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20284 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20285 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
20286 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
20287
20288 // this is actually the CT, which is also the hash later (if matched)
20289
20290 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
20291 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
20292 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
20293 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
20294
20295 salt->salt_len = 32; // note we need to fix this to 16 in kernel
20296
20297 salt->salt_iter = 10 - 1;
20298
20299 /**
20300 * digest buf
20301 */
20302
20303 digest[0] = salt->salt_buf[4];
20304 digest[1] = salt->salt_buf[5];
20305 digest[2] = salt->salt_buf[6];
20306 digest[3] = salt->salt_buf[7];
20307
20308 return (PARSER_OK);
20309 }
20310
20311 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20312 {
20313 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
20314
20315 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
20316
20317 u32 *digest = (u32 *) hash_buf->digest;
20318
20319 salt_t *salt = hash_buf->salt;
20320
20321 /**
20322 * parse line
20323 */
20324
20325 char *salt_pos = input_buf + 11 + 1;
20326
20327 char *iter_pos = strchr (salt_pos, ',');
20328
20329 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20330
20331 u32 salt_len = iter_pos - salt_pos;
20332
20333 if (salt_len != 20) return (PARSER_SALT_LENGTH);
20334
20335 iter_pos++;
20336
20337 char *hash_pos = strchr (iter_pos, ',');
20338
20339 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20340
20341 u32 iter_len = hash_pos - iter_pos;
20342
20343 if (iter_len > 5) return (PARSER_SALT_LENGTH);
20344
20345 hash_pos++;
20346
20347 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
20348
20349 if (hash_len != 64) return (PARSER_HASH_LENGTH);
20350
20351 /**
20352 * salt
20353 */
20354
20355 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20356 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20357 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
20358 salt->salt_buf[3] = 0x00018000;
20359
20360 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
20361 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
20362 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
20363 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
20364
20365 salt->salt_len = salt_len / 2;
20366
20367 salt->salt_iter = atoi (iter_pos) - 1;
20368
20369 /**
20370 * digest buf
20371 */
20372
20373 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20374 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20375 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20376 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20377 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20378 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20379 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20380 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20381
20382 return (PARSER_OK);
20383 }
20384
20385 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20386 {
20387 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
20388
20389 u32 *digest = (u32 *) hash_buf->digest;
20390
20391 salt_t *salt = hash_buf->salt;
20392
20393 /**
20394 * parse line
20395 */
20396
20397 char *hash_pos = input_buf + 64;
20398 char *salt1_pos = input_buf + 128;
20399 char *salt2_pos = input_buf;
20400
20401 /**
20402 * salt
20403 */
20404
20405 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
20406 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
20407 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
20408 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
20409
20410 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
20411 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
20412 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
20413 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
20414
20415 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
20416 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
20417 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
20418 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
20419
20420 salt->salt_len = 48;
20421
20422 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
20423
20424 /**
20425 * digest buf
20426 */
20427
20428 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20429 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20430 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20431 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20432 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20433 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20434 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20435 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20436
20437 return (PARSER_OK);
20438 }
20439
20440 int zip2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20441 {
20442 if ((input_len < DISPLAY_LEN_MIN_13600) || (input_len > DISPLAY_LEN_MAX_13600)) return (PARSER_GLOBAL_LENGTH);
20443
20444 if (memcmp (SIGNATURE_ZIP2_START, input_buf , 6)) return (PARSER_SIGNATURE_UNMATCHED);
20445 if (memcmp (SIGNATURE_ZIP2_STOP , input_buf + input_len - 7, 7)) return (PARSER_SIGNATURE_UNMATCHED);
20446
20447 u32 *digest = (u32 *) hash_buf->digest;
20448
20449 salt_t *salt = hash_buf->salt;
20450
20451 zip2_t *zip2 = (zip2_t *) hash_buf->esalt;
20452
20453 /**
20454 * parse line
20455 */
20456
20457 char *param0_pos = input_buf + 6 + 1;
20458
20459 char *param1_pos = strchr (param0_pos, '*');
20460
20461 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20462
20463 u32 param0_len = param1_pos - param0_pos;
20464
20465 param1_pos++;
20466
20467 char *param2_pos = strchr (param1_pos, '*');
20468
20469 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20470
20471 u32 param1_len = param2_pos - param1_pos;
20472
20473 param2_pos++;
20474
20475 char *param3_pos = strchr (param2_pos, '*');
20476
20477 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20478
20479 u32 param2_len = param3_pos - param2_pos;
20480
20481 param3_pos++;
20482
20483 char *param4_pos = strchr (param3_pos, '*');
20484
20485 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20486
20487 u32 param3_len = param4_pos - param3_pos;
20488
20489 param4_pos++;
20490
20491 char *param5_pos = strchr (param4_pos, '*');
20492
20493 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20494
20495 u32 param4_len = param5_pos - param4_pos;
20496
20497 param5_pos++;
20498
20499 char *param6_pos = strchr (param5_pos, '*');
20500
20501 if (param6_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20502
20503 u32 param5_len = param6_pos - param5_pos;
20504
20505 param6_pos++;
20506
20507 char *param7_pos = strchr (param6_pos, '*');
20508
20509 if (param7_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20510
20511 u32 param6_len = param7_pos - param6_pos;
20512
20513 param7_pos++;
20514
20515 char *param8_pos = strchr (param7_pos, '*');
20516
20517 if (param8_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20518
20519 u32 param7_len = param8_pos - param7_pos;
20520
20521 param8_pos++;
20522
20523 const uint type = atoi (param0_pos);
20524 const uint mode = atoi (param1_pos);
20525 const uint magic = atoi (param2_pos);
20526
20527 char *salt_buf = param3_pos;
20528
20529 uint verify_bytes; sscanf (param4_pos, "%4x*", &verify_bytes);
20530
20531 const uint compress_length = atoi (param5_pos);
20532
20533 char *data_buf = param6_pos;
20534 char *auth = param7_pos;
20535
20536 /**
20537 * verify some data
20538 */
20539
20540 if (param0_len != 1) return (PARSER_SALT_VALUE);
20541
20542 if (param1_len != 1) return (PARSER_SALT_VALUE);
20543
20544 if (param2_len != 1) return (PARSER_SALT_VALUE);
20545
20546 if ((param3_len != 16) && (param3_len != 24) && (param3_len != 32)) return (PARSER_SALT_VALUE);
20547
20548 if (param4_len >= 5) return (PARSER_SALT_VALUE);
20549
20550 if (param5_len >= 5) return (PARSER_SALT_VALUE);
20551
20552 if (param6_len >= 8192) return (PARSER_SALT_VALUE);
20553
20554 if (param6_len & 1) return (PARSER_SALT_VALUE);
20555
20556 if (param7_len != 20) return (PARSER_SALT_VALUE);
20557
20558 if (type != 0) return (PARSER_SALT_VALUE);
20559
20560 if ((mode != 1) && (mode != 2) && (mode != 3)) return (PARSER_SALT_VALUE);
20561
20562 if (magic != 0) return (PARSER_SALT_VALUE);
20563
20564 if (verify_bytes >= 0x10000) return (PARSER_SALT_VALUE);
20565
20566 /**
20567 * store data
20568 */
20569
20570 zip2->type = type;
20571 zip2->mode = mode;
20572 zip2->magic = magic;
20573
20574 if (mode == 1)
20575 {
20576 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20577 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20578 zip2->salt_buf[2] = 0;
20579 zip2->salt_buf[3] = 0;
20580
20581 zip2->salt_len = 8;
20582 }
20583 else if (mode == 2)
20584 {
20585 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20586 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20587 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20588 zip2->salt_buf[3] = 0;
20589
20590 zip2->salt_len = 12;
20591 }
20592 else if (mode == 3)
20593 {
20594 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20595 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20596 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20597 zip2->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
20598
20599 zip2->salt_len = 16;
20600 }
20601
20602 zip2->salt_buf[0] = byte_swap_32 (zip2->salt_buf[0]);
20603 zip2->salt_buf[1] = byte_swap_32 (zip2->salt_buf[1]);
20604 zip2->salt_buf[2] = byte_swap_32 (zip2->salt_buf[2]);
20605 zip2->salt_buf[3] = byte_swap_32 (zip2->salt_buf[3]);
20606
20607 zip2->verify_bytes = verify_bytes;
20608
20609 zip2->compress_length = compress_length;
20610
20611 char *data_buf_ptr = (char *) zip2->data_buf;
20612
20613 for (uint i = 0; i < param6_len; i += 2)
20614 {
20615 const char p0 = data_buf[i + 0];
20616 const char p1 = data_buf[i + 1];
20617
20618 *data_buf_ptr++ = hex_convert (p1) << 0
20619 | hex_convert (p0) << 4;
20620
20621 zip2->data_len++;
20622 }
20623
20624 *data_buf_ptr = 0x80;
20625
20626 char *auth_ptr = (char *) zip2->auth_buf;
20627
20628 for (uint i = 0; i < param7_len; i += 2)
20629 {
20630 const char p0 = auth[i + 0];
20631 const char p1 = auth[i + 1];
20632
20633 *auth_ptr++ = hex_convert (p1) << 0
20634 | hex_convert (p0) << 4;
20635
20636 zip2->auth_len++;
20637 }
20638
20639 /**
20640 * salt buf (fake)
20641 */
20642
20643 salt->salt_buf[0] = zip2->salt_buf[0];
20644 salt->salt_buf[1] = zip2->salt_buf[1];
20645 salt->salt_buf[2] = zip2->salt_buf[2];
20646 salt->salt_buf[3] = zip2->salt_buf[3];
20647 salt->salt_buf[4] = zip2->data_buf[0];
20648 salt->salt_buf[5] = zip2->data_buf[1];
20649 salt->salt_buf[6] = zip2->data_buf[2];
20650 salt->salt_buf[7] = zip2->data_buf[3];
20651
20652 salt->salt_len = 32;
20653
20654 salt->salt_iter = ROUNDS_ZIP2 - 1;
20655
20656 /**
20657 * digest buf (fake)
20658 */
20659
20660 digest[0] = zip2->auth_buf[0];
20661 digest[1] = zip2->auth_buf[1];
20662 digest[2] = zip2->auth_buf[2];
20663 digest[3] = zip2->auth_buf[3];
20664
20665 return (PARSER_OK);
20666 }
20667
20668 int win8phone_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20669 {
20670 if ((input_len < DISPLAY_LEN_MIN_13800) || (input_len > DISPLAY_LEN_MAX_13800)) return (PARSER_GLOBAL_LENGTH);
20671
20672 u32 *digest = (u32 *) hash_buf->digest;
20673
20674 salt_t *salt = hash_buf->salt;
20675
20676 win8phone_t *esalt = hash_buf->esalt;
20677
20678 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
20679 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
20680 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
20681 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
20682 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
20683 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
20684 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
20685 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
20686
20687 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
20688
20689 char *salt_buf_ptr = input_buf + 64 + 1;
20690
20691 u32 *salt_buf = esalt->salt_buf;
20692
20693 for (int i = 0, j = 0; i < 32; i += 1, j += 8)
20694 {
20695 salt_buf[i] = hex_to_u32 ((const u8 *) &salt_buf_ptr[j]);
20696 }
20697
20698 salt->salt_buf[0] = salt_buf[0];
20699 salt->salt_buf[1] = salt_buf[1];
20700 salt->salt_buf[2] = salt_buf[2];
20701 salt->salt_buf[3] = salt_buf[3];
20702 salt->salt_buf[4] = salt_buf[4];
20703 salt->salt_buf[5] = salt_buf[5];
20704 salt->salt_buf[6] = salt_buf[6];
20705 salt->salt_buf[7] = salt_buf[7];
20706
20707 salt->salt_len = 64;
20708
20709 return (PARSER_OK);
20710 }
20711
20712 /**
20713 * parallel running threads
20714 */
20715
20716 #ifdef WIN
20717
20718 BOOL WINAPI sigHandler_default (DWORD sig)
20719 {
20720 switch (sig)
20721 {
20722 case CTRL_CLOSE_EVENT:
20723
20724 /*
20725 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
20726 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
20727 * function otherwise it is too late (e.g. after returning from this function)
20728 */
20729
20730 myabort ();
20731
20732 SetConsoleCtrlHandler (NULL, TRUE);
20733
20734 hc_sleep (10);
20735
20736 return TRUE;
20737
20738 case CTRL_C_EVENT:
20739 case CTRL_LOGOFF_EVENT:
20740 case CTRL_SHUTDOWN_EVENT:
20741
20742 myabort ();
20743
20744 SetConsoleCtrlHandler (NULL, TRUE);
20745
20746 return TRUE;
20747 }
20748
20749 return FALSE;
20750 }
20751
20752 BOOL WINAPI sigHandler_benchmark (DWORD sig)
20753 {
20754 switch (sig)
20755 {
20756 case CTRL_CLOSE_EVENT:
20757
20758 myquit ();
20759
20760 SetConsoleCtrlHandler (NULL, TRUE);
20761
20762 hc_sleep (10);
20763
20764 return TRUE;
20765
20766 case CTRL_C_EVENT:
20767 case CTRL_LOGOFF_EVENT:
20768 case CTRL_SHUTDOWN_EVENT:
20769
20770 myquit ();
20771
20772 SetConsoleCtrlHandler (NULL, TRUE);
20773
20774 return TRUE;
20775 }
20776
20777 return FALSE;
20778 }
20779
20780 void hc_signal (BOOL WINAPI (callback) (DWORD))
20781 {
20782 if (callback == NULL)
20783 {
20784 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
20785 }
20786 else
20787 {
20788 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
20789 }
20790 }
20791
20792 #else
20793
20794 void sigHandler_default (int sig)
20795 {
20796 myabort ();
20797
20798 signal (sig, NULL);
20799 }
20800
20801 void sigHandler_benchmark (int sig)
20802 {
20803 myquit ();
20804
20805 signal (sig, NULL);
20806 }
20807
20808 void hc_signal (void (callback) (int))
20809 {
20810 if (callback == NULL) callback = SIG_DFL;
20811
20812 signal (SIGINT, callback);
20813 signal (SIGTERM, callback);
20814 signal (SIGABRT, callback);
20815 }
20816
20817 #endif
20818
20819 void status_display ();
20820
20821 void *thread_keypress (void *p)
20822 {
20823 uint quiet = data.quiet;
20824
20825 tty_break();
20826
20827 while (data.shutdown_outer == 0)
20828 {
20829 int ch = tty_getchar();
20830
20831 if (ch == -1) break;
20832
20833 if (ch == 0) continue;
20834
20835 //https://github.com/hashcat/hashcat/issues/302
20836 //#ifdef _POSIX
20837 //if (ch != '\n')
20838 //#endif
20839
20840 hc_thread_mutex_lock (mux_display);
20841
20842 log_info ("");
20843
20844 switch (ch)
20845 {
20846 case 's':
20847 case '\r':
20848 case '\n':
20849
20850 log_info ("");
20851
20852 status_display ();
20853
20854 log_info ("");
20855
20856 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20857 if (quiet == 0) fflush (stdout);
20858
20859 break;
20860
20861 case 'b':
20862
20863 log_info ("");
20864
20865 bypass ();
20866
20867 log_info ("");
20868
20869 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20870 if (quiet == 0) fflush (stdout);
20871
20872 break;
20873
20874 case 'p':
20875
20876 log_info ("");
20877
20878 SuspendThreads ();
20879
20880 log_info ("");
20881
20882 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20883 if (quiet == 0) fflush (stdout);
20884
20885 break;
20886
20887 case 'r':
20888
20889 log_info ("");
20890
20891 ResumeThreads ();
20892
20893 log_info ("");
20894
20895 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20896 if (quiet == 0) fflush (stdout);
20897
20898 break;
20899
20900 case 'c':
20901
20902 log_info ("");
20903
20904 stop_at_checkpoint ();
20905
20906 log_info ("");
20907
20908 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20909 if (quiet == 0) fflush (stdout);
20910
20911 break;
20912
20913 case 'q':
20914
20915 log_info ("");
20916
20917 myabort ();
20918
20919 break;
20920 }
20921
20922 //https://github.com/hashcat/hashcat/issues/302
20923 //#ifdef _POSIX
20924 //if (ch != '\n')
20925 //#endif
20926
20927 hc_thread_mutex_unlock (mux_display);
20928 }
20929
20930 tty_fix();
20931
20932 return (p);
20933 }
20934
20935 /**
20936 * rules common
20937 */
20938
20939 bool class_num (const u8 c)
20940 {
20941 return ((c >= '0') && (c <= '9'));
20942 }
20943
20944 bool class_lower (const u8 c)
20945 {
20946 return ((c >= 'a') && (c <= 'z'));
20947 }
20948
20949 bool class_upper (const u8 c)
20950 {
20951 return ((c >= 'A') && (c <= 'Z'));
20952 }
20953
20954 bool class_alpha (const u8 c)
20955 {
20956 return (class_lower (c) || class_upper (c));
20957 }
20958
20959 int conv_ctoi (const u8 c)
20960 {
20961 if (class_num (c))
20962 {
20963 return c - '0';
20964 }
20965 else if (class_upper (c))
20966 {
20967 return c - 'A' + 10;
20968 }
20969
20970 return -1;
20971 }
20972
20973 int conv_itoc (const u8 c)
20974 {
20975 if (c < 10)
20976 {
20977 return c + '0';
20978 }
20979 else if (c < 37)
20980 {
20981 return c + 'A' - 10;
20982 }
20983
20984 return -1;
20985 }
20986
20987 /**
20988 * device rules
20989 */
20990
20991 #define INCR_POS if (++rule_pos == rule_len) return (-1)
20992 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
20993 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
20994 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
20995 #define MAX_KERNEL_RULES 255
20996 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
20997 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20998 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20999
21000 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
21001 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
21002 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
21003 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
21004
21005 int cpu_rule_to_kernel_rule (char *rule_buf, uint rule_len, kernel_rule_t *rule)
21006 {
21007 uint rule_pos;
21008 uint rule_cnt;
21009
21010 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
21011 {
21012 switch (rule_buf[rule_pos])
21013 {
21014 case ' ':
21015 rule_cnt--;
21016 break;
21017
21018 case RULE_OP_MANGLE_NOOP:
21019 SET_NAME (rule, rule_buf[rule_pos]);
21020 break;
21021
21022 case RULE_OP_MANGLE_LREST:
21023 SET_NAME (rule, rule_buf[rule_pos]);
21024 break;
21025
21026 case RULE_OP_MANGLE_UREST:
21027 SET_NAME (rule, rule_buf[rule_pos]);
21028 break;
21029
21030 case RULE_OP_MANGLE_LREST_UFIRST:
21031 SET_NAME (rule, rule_buf[rule_pos]);
21032 break;
21033
21034 case RULE_OP_MANGLE_UREST_LFIRST:
21035 SET_NAME (rule, rule_buf[rule_pos]);
21036 break;
21037
21038 case RULE_OP_MANGLE_TREST:
21039 SET_NAME (rule, rule_buf[rule_pos]);
21040 break;
21041
21042 case RULE_OP_MANGLE_TOGGLE_AT:
21043 SET_NAME (rule, rule_buf[rule_pos]);
21044 SET_P0_CONV (rule, rule_buf[rule_pos]);
21045 break;
21046
21047 case RULE_OP_MANGLE_REVERSE:
21048 SET_NAME (rule, rule_buf[rule_pos]);
21049 break;
21050
21051 case RULE_OP_MANGLE_DUPEWORD:
21052 SET_NAME (rule, rule_buf[rule_pos]);
21053 break;
21054
21055 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21056 SET_NAME (rule, rule_buf[rule_pos]);
21057 SET_P0_CONV (rule, rule_buf[rule_pos]);
21058 break;
21059
21060 case RULE_OP_MANGLE_REFLECT:
21061 SET_NAME (rule, rule_buf[rule_pos]);
21062 break;
21063
21064 case RULE_OP_MANGLE_ROTATE_LEFT:
21065 SET_NAME (rule, rule_buf[rule_pos]);
21066 break;
21067
21068 case RULE_OP_MANGLE_ROTATE_RIGHT:
21069 SET_NAME (rule, rule_buf[rule_pos]);
21070 break;
21071
21072 case RULE_OP_MANGLE_APPEND:
21073 SET_NAME (rule, rule_buf[rule_pos]);
21074 SET_P0 (rule, rule_buf[rule_pos]);
21075 break;
21076
21077 case RULE_OP_MANGLE_PREPEND:
21078 SET_NAME (rule, rule_buf[rule_pos]);
21079 SET_P0 (rule, rule_buf[rule_pos]);
21080 break;
21081
21082 case RULE_OP_MANGLE_DELETE_FIRST:
21083 SET_NAME (rule, rule_buf[rule_pos]);
21084 break;
21085
21086 case RULE_OP_MANGLE_DELETE_LAST:
21087 SET_NAME (rule, rule_buf[rule_pos]);
21088 break;
21089
21090 case RULE_OP_MANGLE_DELETE_AT:
21091 SET_NAME (rule, rule_buf[rule_pos]);
21092 SET_P0_CONV (rule, rule_buf[rule_pos]);
21093 break;
21094
21095 case RULE_OP_MANGLE_EXTRACT:
21096 SET_NAME (rule, rule_buf[rule_pos]);
21097 SET_P0_CONV (rule, rule_buf[rule_pos]);
21098 SET_P1_CONV (rule, rule_buf[rule_pos]);
21099 break;
21100
21101 case RULE_OP_MANGLE_OMIT:
21102 SET_NAME (rule, rule_buf[rule_pos]);
21103 SET_P0_CONV (rule, rule_buf[rule_pos]);
21104 SET_P1_CONV (rule, rule_buf[rule_pos]);
21105 break;
21106
21107 case RULE_OP_MANGLE_INSERT:
21108 SET_NAME (rule, rule_buf[rule_pos]);
21109 SET_P0_CONV (rule, rule_buf[rule_pos]);
21110 SET_P1 (rule, rule_buf[rule_pos]);
21111 break;
21112
21113 case RULE_OP_MANGLE_OVERSTRIKE:
21114 SET_NAME (rule, rule_buf[rule_pos]);
21115 SET_P0_CONV (rule, rule_buf[rule_pos]);
21116 SET_P1 (rule, rule_buf[rule_pos]);
21117 break;
21118
21119 case RULE_OP_MANGLE_TRUNCATE_AT:
21120 SET_NAME (rule, rule_buf[rule_pos]);
21121 SET_P0_CONV (rule, rule_buf[rule_pos]);
21122 break;
21123
21124 case RULE_OP_MANGLE_REPLACE:
21125 SET_NAME (rule, rule_buf[rule_pos]);
21126 SET_P0 (rule, rule_buf[rule_pos]);
21127 SET_P1 (rule, rule_buf[rule_pos]);
21128 break;
21129
21130 case RULE_OP_MANGLE_PURGECHAR:
21131 return (-1);
21132 break;
21133
21134 case RULE_OP_MANGLE_TOGGLECASE_REC:
21135 return (-1);
21136 break;
21137
21138 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21139 SET_NAME (rule, rule_buf[rule_pos]);
21140 SET_P0_CONV (rule, rule_buf[rule_pos]);
21141 break;
21142
21143 case RULE_OP_MANGLE_DUPECHAR_LAST:
21144 SET_NAME (rule, rule_buf[rule_pos]);
21145 SET_P0_CONV (rule, rule_buf[rule_pos]);
21146 break;
21147
21148 case RULE_OP_MANGLE_DUPECHAR_ALL:
21149 SET_NAME (rule, rule_buf[rule_pos]);
21150 break;
21151
21152 case RULE_OP_MANGLE_SWITCH_FIRST:
21153 SET_NAME (rule, rule_buf[rule_pos]);
21154 break;
21155
21156 case RULE_OP_MANGLE_SWITCH_LAST:
21157 SET_NAME (rule, rule_buf[rule_pos]);
21158 break;
21159
21160 case RULE_OP_MANGLE_SWITCH_AT:
21161 SET_NAME (rule, rule_buf[rule_pos]);
21162 SET_P0_CONV (rule, rule_buf[rule_pos]);
21163 SET_P1_CONV (rule, rule_buf[rule_pos]);
21164 break;
21165
21166 case RULE_OP_MANGLE_CHR_SHIFTL:
21167 SET_NAME (rule, rule_buf[rule_pos]);
21168 SET_P0_CONV (rule, rule_buf[rule_pos]);
21169 break;
21170
21171 case RULE_OP_MANGLE_CHR_SHIFTR:
21172 SET_NAME (rule, rule_buf[rule_pos]);
21173 SET_P0_CONV (rule, rule_buf[rule_pos]);
21174 break;
21175
21176 case RULE_OP_MANGLE_CHR_INCR:
21177 SET_NAME (rule, rule_buf[rule_pos]);
21178 SET_P0_CONV (rule, rule_buf[rule_pos]);
21179 break;
21180
21181 case RULE_OP_MANGLE_CHR_DECR:
21182 SET_NAME (rule, rule_buf[rule_pos]);
21183 SET_P0_CONV (rule, rule_buf[rule_pos]);
21184 break;
21185
21186 case RULE_OP_MANGLE_REPLACE_NP1:
21187 SET_NAME (rule, rule_buf[rule_pos]);
21188 SET_P0_CONV (rule, rule_buf[rule_pos]);
21189 break;
21190
21191 case RULE_OP_MANGLE_REPLACE_NM1:
21192 SET_NAME (rule, rule_buf[rule_pos]);
21193 SET_P0_CONV (rule, rule_buf[rule_pos]);
21194 break;
21195
21196 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21197 SET_NAME (rule, rule_buf[rule_pos]);
21198 SET_P0_CONV (rule, rule_buf[rule_pos]);
21199 break;
21200
21201 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21202 SET_NAME (rule, rule_buf[rule_pos]);
21203 SET_P0_CONV (rule, rule_buf[rule_pos]);
21204 break;
21205
21206 case RULE_OP_MANGLE_TITLE:
21207 SET_NAME (rule, rule_buf[rule_pos]);
21208 break;
21209
21210 default:
21211 return (-1);
21212 break;
21213 }
21214 }
21215
21216 if (rule_pos < rule_len) return (-1);
21217
21218 return (0);
21219 }
21220
21221 int kernel_rule_to_cpu_rule (char *rule_buf, kernel_rule_t *rule)
21222 {
21223 uint rule_cnt;
21224 uint rule_pos;
21225 uint rule_len = HCBUFSIZ - 1; // maximum possible len
21226
21227 char rule_cmd;
21228
21229 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
21230 {
21231 GET_NAME (rule);
21232
21233 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
21234
21235 switch (rule_cmd)
21236 {
21237 case RULE_OP_MANGLE_NOOP:
21238 rule_buf[rule_pos] = rule_cmd;
21239 break;
21240
21241 case RULE_OP_MANGLE_LREST:
21242 rule_buf[rule_pos] = rule_cmd;
21243 break;
21244
21245 case RULE_OP_MANGLE_UREST:
21246 rule_buf[rule_pos] = rule_cmd;
21247 break;
21248
21249 case RULE_OP_MANGLE_LREST_UFIRST:
21250 rule_buf[rule_pos] = rule_cmd;
21251 break;
21252
21253 case RULE_OP_MANGLE_UREST_LFIRST:
21254 rule_buf[rule_pos] = rule_cmd;
21255 break;
21256
21257 case RULE_OP_MANGLE_TREST:
21258 rule_buf[rule_pos] = rule_cmd;
21259 break;
21260
21261 case RULE_OP_MANGLE_TOGGLE_AT:
21262 rule_buf[rule_pos] = rule_cmd;
21263 GET_P0_CONV (rule);
21264 break;
21265
21266 case RULE_OP_MANGLE_REVERSE:
21267 rule_buf[rule_pos] = rule_cmd;
21268 break;
21269
21270 case RULE_OP_MANGLE_DUPEWORD:
21271 rule_buf[rule_pos] = rule_cmd;
21272 break;
21273
21274 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21275 rule_buf[rule_pos] = rule_cmd;
21276 GET_P0_CONV (rule);
21277 break;
21278
21279 case RULE_OP_MANGLE_REFLECT:
21280 rule_buf[rule_pos] = rule_cmd;
21281 break;
21282
21283 case RULE_OP_MANGLE_ROTATE_LEFT:
21284 rule_buf[rule_pos] = rule_cmd;
21285 break;
21286
21287 case RULE_OP_MANGLE_ROTATE_RIGHT:
21288 rule_buf[rule_pos] = rule_cmd;
21289 break;
21290
21291 case RULE_OP_MANGLE_APPEND:
21292 rule_buf[rule_pos] = rule_cmd;
21293 GET_P0 (rule);
21294 break;
21295
21296 case RULE_OP_MANGLE_PREPEND:
21297 rule_buf[rule_pos] = rule_cmd;
21298 GET_P0 (rule);
21299 break;
21300
21301 case RULE_OP_MANGLE_DELETE_FIRST:
21302 rule_buf[rule_pos] = rule_cmd;
21303 break;
21304
21305 case RULE_OP_MANGLE_DELETE_LAST:
21306 rule_buf[rule_pos] = rule_cmd;
21307 break;
21308
21309 case RULE_OP_MANGLE_DELETE_AT:
21310 rule_buf[rule_pos] = rule_cmd;
21311 GET_P0_CONV (rule);
21312 break;
21313
21314 case RULE_OP_MANGLE_EXTRACT:
21315 rule_buf[rule_pos] = rule_cmd;
21316 GET_P0_CONV (rule);
21317 GET_P1_CONV (rule);
21318 break;
21319
21320 case RULE_OP_MANGLE_OMIT:
21321 rule_buf[rule_pos] = rule_cmd;
21322 GET_P0_CONV (rule);
21323 GET_P1_CONV (rule);
21324 break;
21325
21326 case RULE_OP_MANGLE_INSERT:
21327 rule_buf[rule_pos] = rule_cmd;
21328 GET_P0_CONV (rule);
21329 GET_P1 (rule);
21330 break;
21331
21332 case RULE_OP_MANGLE_OVERSTRIKE:
21333 rule_buf[rule_pos] = rule_cmd;
21334 GET_P0_CONV (rule);
21335 GET_P1 (rule);
21336 break;
21337
21338 case RULE_OP_MANGLE_TRUNCATE_AT:
21339 rule_buf[rule_pos] = rule_cmd;
21340 GET_P0_CONV (rule);
21341 break;
21342
21343 case RULE_OP_MANGLE_REPLACE:
21344 rule_buf[rule_pos] = rule_cmd;
21345 GET_P0 (rule);
21346 GET_P1 (rule);
21347 break;
21348
21349 case RULE_OP_MANGLE_PURGECHAR:
21350 return (-1);
21351 break;
21352
21353 case RULE_OP_MANGLE_TOGGLECASE_REC:
21354 return (-1);
21355 break;
21356
21357 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21358 rule_buf[rule_pos] = rule_cmd;
21359 GET_P0_CONV (rule);
21360 break;
21361
21362 case RULE_OP_MANGLE_DUPECHAR_LAST:
21363 rule_buf[rule_pos] = rule_cmd;
21364 GET_P0_CONV (rule);
21365 break;
21366
21367 case RULE_OP_MANGLE_DUPECHAR_ALL:
21368 rule_buf[rule_pos] = rule_cmd;
21369 break;
21370
21371 case RULE_OP_MANGLE_SWITCH_FIRST:
21372 rule_buf[rule_pos] = rule_cmd;
21373 break;
21374
21375 case RULE_OP_MANGLE_SWITCH_LAST:
21376 rule_buf[rule_pos] = rule_cmd;
21377 break;
21378
21379 case RULE_OP_MANGLE_SWITCH_AT:
21380 rule_buf[rule_pos] = rule_cmd;
21381 GET_P0_CONV (rule);
21382 GET_P1_CONV (rule);
21383 break;
21384
21385 case RULE_OP_MANGLE_CHR_SHIFTL:
21386 rule_buf[rule_pos] = rule_cmd;
21387 GET_P0_CONV (rule);
21388 break;
21389
21390 case RULE_OP_MANGLE_CHR_SHIFTR:
21391 rule_buf[rule_pos] = rule_cmd;
21392 GET_P0_CONV (rule);
21393 break;
21394
21395 case RULE_OP_MANGLE_CHR_INCR:
21396 rule_buf[rule_pos] = rule_cmd;
21397 GET_P0_CONV (rule);
21398 break;
21399
21400 case RULE_OP_MANGLE_CHR_DECR:
21401 rule_buf[rule_pos] = rule_cmd;
21402 GET_P0_CONV (rule);
21403 break;
21404
21405 case RULE_OP_MANGLE_REPLACE_NP1:
21406 rule_buf[rule_pos] = rule_cmd;
21407 GET_P0_CONV (rule);
21408 break;
21409
21410 case RULE_OP_MANGLE_REPLACE_NM1:
21411 rule_buf[rule_pos] = rule_cmd;
21412 GET_P0_CONV (rule);
21413 break;
21414
21415 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21416 rule_buf[rule_pos] = rule_cmd;
21417 GET_P0_CONV (rule);
21418 break;
21419
21420 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21421 rule_buf[rule_pos] = rule_cmd;
21422 GET_P0_CONV (rule);
21423 break;
21424
21425 case RULE_OP_MANGLE_TITLE:
21426 rule_buf[rule_pos] = rule_cmd;
21427 break;
21428
21429 case 0:
21430 return rule_pos - 1;
21431 break;
21432
21433 default:
21434 return (-1);
21435 break;
21436 }
21437 }
21438
21439 if (rule_cnt > 0)
21440 {
21441 return rule_pos;
21442 }
21443
21444 return (-1);
21445 }
21446
21447 /**
21448 * CPU rules : this is from hashcat sources, cpu based rules
21449 */
21450
21451 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
21452 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
21453
21454 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
21455 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
21456 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
21457
21458 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
21459 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
21460 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
21461
21462 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
21463 {
21464 int pos;
21465
21466 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
21467
21468 return (arr_len);
21469 }
21470
21471 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
21472 {
21473 int pos;
21474
21475 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
21476
21477 return (arr_len);
21478 }
21479
21480 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
21481 {
21482 int pos;
21483
21484 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
21485
21486 return (arr_len);
21487 }
21488
21489 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
21490 {
21491 int l;
21492 int r;
21493
21494 for (l = 0; l < arr_len; l++)
21495 {
21496 r = arr_len - 1 - l;
21497
21498 if (l >= r) break;
21499
21500 MANGLE_SWITCH (arr, l, r);
21501 }
21502
21503 return (arr_len);
21504 }
21505
21506 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
21507 {
21508 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21509
21510 memcpy (&arr[arr_len], arr, (size_t) arr_len);
21511
21512 return (arr_len * 2);
21513 }
21514
21515 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
21516 {
21517 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
21518
21519 int orig_len = arr_len;
21520
21521 int i;
21522
21523 for (i = 0; i < times; i++)
21524 {
21525 memcpy (&arr[arr_len], arr, orig_len);
21526
21527 arr_len += orig_len;
21528 }
21529
21530 return (arr_len);
21531 }
21532
21533 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
21534 {
21535 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21536
21537 mangle_double (arr, arr_len);
21538
21539 mangle_reverse (arr + arr_len, arr_len);
21540
21541 return (arr_len * 2);
21542 }
21543
21544 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
21545 {
21546 int l;
21547 int r;
21548
21549 for (l = 0, r = arr_len - 1; r > 0; r--)
21550 {
21551 MANGLE_SWITCH (arr, l, r);
21552 }
21553
21554 return (arr_len);
21555 }
21556
21557 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
21558 {
21559 int l;
21560 int r;
21561
21562 for (l = 0, r = arr_len - 1; l < r; l++)
21563 {
21564 MANGLE_SWITCH (arr, l, r);
21565 }
21566
21567 return (arr_len);
21568 }
21569
21570 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
21571 {
21572 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21573
21574 arr[arr_len] = c;
21575
21576 return (arr_len + 1);
21577 }
21578
21579 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
21580 {
21581 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21582
21583 int arr_pos;
21584
21585 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21586 {
21587 arr[arr_pos + 1] = arr[arr_pos];
21588 }
21589
21590 arr[0] = c;
21591
21592 return (arr_len + 1);
21593 }
21594
21595 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21596 {
21597 if (upos >= arr_len) return (arr_len);
21598
21599 int arr_pos;
21600
21601 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
21602 {
21603 arr[arr_pos] = arr[arr_pos + 1];
21604 }
21605
21606 return (arr_len - 1);
21607 }
21608
21609 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21610 {
21611 if (upos >= arr_len) return (arr_len);
21612
21613 if ((upos + ulen) > arr_len) return (arr_len);
21614
21615 int arr_pos;
21616
21617 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
21618 {
21619 arr[arr_pos] = arr[upos + arr_pos];
21620 }
21621
21622 return (ulen);
21623 }
21624
21625 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21626 {
21627 if (upos >= arr_len) return (arr_len);
21628
21629 if ((upos + ulen) >= arr_len) return (arr_len);
21630
21631 int arr_pos;
21632
21633 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
21634 {
21635 arr[arr_pos] = arr[arr_pos + ulen];
21636 }
21637
21638 return (arr_len - ulen);
21639 }
21640
21641 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21642 {
21643 if (upos >= arr_len) return (arr_len);
21644
21645 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21646
21647 int arr_pos;
21648
21649 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
21650 {
21651 arr[arr_pos + 1] = arr[arr_pos];
21652 }
21653
21654 arr[upos] = c;
21655
21656 return (arr_len + 1);
21657 }
21658
21659 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)
21660 {
21661 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21662
21663 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
21664
21665 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
21666
21667 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
21668
21669 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
21670
21671 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
21672
21673 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
21674
21675 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
21676
21677 return (arr_len + arr2_cpy);
21678 }
21679
21680 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21681 {
21682 if (upos >= arr_len) return (arr_len);
21683
21684 arr[upos] = c;
21685
21686 return (arr_len);
21687 }
21688
21689 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21690 {
21691 if (upos >= arr_len) return (arr_len);
21692
21693 memset (arr + upos, 0, arr_len - upos);
21694
21695 return (upos);
21696 }
21697
21698 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
21699 {
21700 int arr_pos;
21701
21702 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
21703 {
21704 if (arr[arr_pos] != oldc) continue;
21705
21706 arr[arr_pos] = newc;
21707 }
21708
21709 return (arr_len);
21710 }
21711
21712 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
21713 {
21714 int arr_pos;
21715
21716 int ret_len;
21717
21718 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
21719 {
21720 if (arr[arr_pos] == c) continue;
21721
21722 arr[ret_len] = arr[arr_pos];
21723
21724 ret_len++;
21725 }
21726
21727 return (ret_len);
21728 }
21729
21730 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
21731 {
21732 if (ulen > arr_len) return (arr_len);
21733
21734 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21735
21736 char cs[100] = { 0 };
21737
21738 memcpy (cs, arr, ulen);
21739
21740 int i;
21741
21742 for (i = 0; i < ulen; i++)
21743 {
21744 char c = cs[i];
21745
21746 arr_len = mangle_insert (arr, arr_len, i, c);
21747 }
21748
21749 return (arr_len);
21750 }
21751
21752 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
21753 {
21754 if (ulen > arr_len) return (arr_len);
21755
21756 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21757
21758 int upos = arr_len - ulen;
21759
21760 int i;
21761
21762 for (i = 0; i < ulen; i++)
21763 {
21764 char c = arr[upos + i];
21765
21766 arr_len = mangle_append (arr, arr_len, c);
21767 }
21768
21769 return (arr_len);
21770 }
21771
21772 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21773 {
21774 if ( arr_len == 0) return (arr_len);
21775 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21776
21777 char c = arr[upos];
21778
21779 int i;
21780
21781 for (i = 0; i < ulen; i++)
21782 {
21783 arr_len = mangle_insert (arr, arr_len, upos, c);
21784 }
21785
21786 return (arr_len);
21787 }
21788
21789 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
21790 {
21791 if ( arr_len == 0) return (arr_len);
21792 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
21793
21794 int arr_pos;
21795
21796 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21797 {
21798 int new_pos = arr_pos * 2;
21799
21800 arr[new_pos] = arr[arr_pos];
21801
21802 arr[new_pos + 1] = arr[arr_pos];
21803 }
21804
21805 return (arr_len * 2);
21806 }
21807
21808 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21809 {
21810 if (upos >= arr_len) return (arr_len);
21811 if (upos2 >= arr_len) return (arr_len);
21812
21813 MANGLE_SWITCH (arr, upos, upos2);
21814
21815 return (arr_len);
21816 }
21817
21818 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21819 {
21820 MANGLE_SWITCH (arr, upos, upos2);
21821
21822 return (arr_len);
21823 }
21824
21825 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
21826 {
21827 if (upos >= arr_len) return (arr_len);
21828
21829 arr[upos] <<= 1;
21830
21831 return (arr_len);
21832 }
21833
21834 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
21835 {
21836 if (upos >= arr_len) return (arr_len);
21837
21838 arr[upos] >>= 1;
21839
21840 return (arr_len);
21841 }
21842
21843 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
21844 {
21845 if (upos >= arr_len) return (arr_len);
21846
21847 arr[upos] += 1;
21848
21849 return (arr_len);
21850 }
21851
21852 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
21853 {
21854 if (upos >= arr_len) return (arr_len);
21855
21856 arr[upos] -= 1;
21857
21858 return (arr_len);
21859 }
21860
21861 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
21862 {
21863 int upper_next = 1;
21864
21865 int pos;
21866
21867 for (pos = 0; pos < arr_len; pos++)
21868 {
21869 if (arr[pos] == ' ')
21870 {
21871 upper_next = 1;
21872
21873 continue;
21874 }
21875
21876 if (upper_next)
21877 {
21878 upper_next = 0;
21879
21880 MANGLE_UPPER_AT (arr, pos);
21881 }
21882 else
21883 {
21884 MANGLE_LOWER_AT (arr, pos);
21885 }
21886 }
21887
21888 return (arr_len);
21889 }
21890
21891 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
21892 {
21893 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
21894
21895 u32 j;
21896
21897 u32 rule_pos = 0;
21898
21899 for (j = 0; j < rp_gen_num; j++)
21900 {
21901 u32 r = 0;
21902 u32 p1 = 0;
21903 u32 p2 = 0;
21904 u32 p3 = 0;
21905
21906 switch ((char) get_random_num (0, 9))
21907 {
21908 case 0:
21909 r = get_random_num (0, sizeof (grp_op_nop));
21910 rule_buf[rule_pos++] = grp_op_nop[r];
21911 break;
21912
21913 case 1:
21914 r = get_random_num (0, sizeof (grp_op_pos_p0));
21915 rule_buf[rule_pos++] = grp_op_pos_p0[r];
21916 p1 = get_random_num (0, sizeof (grp_pos));
21917 rule_buf[rule_pos++] = grp_pos[p1];
21918 break;
21919
21920 case 2:
21921 r = get_random_num (0, sizeof (grp_op_pos_p1));
21922 rule_buf[rule_pos++] = grp_op_pos_p1[r];
21923 p1 = get_random_num (1, 6);
21924 rule_buf[rule_pos++] = grp_pos[p1];
21925 break;
21926
21927 case 3:
21928 r = get_random_num (0, sizeof (grp_op_chr));
21929 rule_buf[rule_pos++] = grp_op_chr[r];
21930 p1 = get_random_num (0x20, 0x7e);
21931 rule_buf[rule_pos++] = (char) p1;
21932 break;
21933
21934 case 4:
21935 r = get_random_num (0, sizeof (grp_op_chr_chr));
21936 rule_buf[rule_pos++] = grp_op_chr_chr[r];
21937 p1 = get_random_num (0x20, 0x7e);
21938 rule_buf[rule_pos++] = (char) p1;
21939 p2 = get_random_num (0x20, 0x7e);
21940 while (p1 == p2)
21941 p2 = get_random_num (0x20, 0x7e);
21942 rule_buf[rule_pos++] = (char) p2;
21943 break;
21944
21945 case 5:
21946 r = get_random_num (0, sizeof (grp_op_pos_chr));
21947 rule_buf[rule_pos++] = grp_op_pos_chr[r];
21948 p1 = get_random_num (0, sizeof (grp_pos));
21949 rule_buf[rule_pos++] = grp_pos[p1];
21950 p2 = get_random_num (0x20, 0x7e);
21951 rule_buf[rule_pos++] = (char) p2;
21952 break;
21953
21954 case 6:
21955 r = get_random_num (0, sizeof (grp_op_pos_pos0));
21956 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
21957 p1 = get_random_num (0, sizeof (grp_pos));
21958 rule_buf[rule_pos++] = grp_pos[p1];
21959 p2 = get_random_num (0, sizeof (grp_pos));
21960 while (p1 == p2)
21961 p2 = get_random_num (0, sizeof (grp_pos));
21962 rule_buf[rule_pos++] = grp_pos[p2];
21963 break;
21964
21965 case 7:
21966 r = get_random_num (0, sizeof (grp_op_pos_pos1));
21967 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
21968 p1 = get_random_num (0, sizeof (grp_pos));
21969 rule_buf[rule_pos++] = grp_pos[p1];
21970 p2 = get_random_num (1, sizeof (grp_pos));
21971 while (p1 == p2)
21972 p2 = get_random_num (1, sizeof (grp_pos));
21973 rule_buf[rule_pos++] = grp_pos[p2];
21974 break;
21975
21976 case 8:
21977 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
21978 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
21979 p1 = get_random_num (0, sizeof (grp_pos));
21980 rule_buf[rule_pos++] = grp_pos[p1];
21981 p2 = get_random_num (1, sizeof (grp_pos));
21982 rule_buf[rule_pos++] = grp_pos[p1];
21983 p3 = get_random_num (0, sizeof (grp_pos));
21984 rule_buf[rule_pos++] = grp_pos[p3];
21985 break;
21986 }
21987 }
21988
21989 return (rule_pos);
21990 }
21991
21992 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
21993 {
21994 char mem[BLOCK_SIZE] = { 0 };
21995
21996 if (in == NULL) return (RULE_RC_REJECT_ERROR);
21997
21998 if (out == NULL) return (RULE_RC_REJECT_ERROR);
21999
22000 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22001
22002 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
22003
22004 int out_len = in_len;
22005 int mem_len = in_len;
22006
22007 memcpy (out, in, out_len);
22008
22009 int rule_pos;
22010
22011 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
22012 {
22013 int upos, upos2;
22014 int ulen;
22015
22016 switch (rule[rule_pos])
22017 {
22018 case ' ':
22019 break;
22020
22021 case RULE_OP_MANGLE_NOOP:
22022 break;
22023
22024 case RULE_OP_MANGLE_LREST:
22025 out_len = mangle_lrest (out, out_len);
22026 break;
22027
22028 case RULE_OP_MANGLE_UREST:
22029 out_len = mangle_urest (out, out_len);
22030 break;
22031
22032 case RULE_OP_MANGLE_LREST_UFIRST:
22033 out_len = mangle_lrest (out, out_len);
22034 if (out_len) MANGLE_UPPER_AT (out, 0);
22035 break;
22036
22037 case RULE_OP_MANGLE_UREST_LFIRST:
22038 out_len = mangle_urest (out, out_len);
22039 if (out_len) MANGLE_LOWER_AT (out, 0);
22040 break;
22041
22042 case RULE_OP_MANGLE_TREST:
22043 out_len = mangle_trest (out, out_len);
22044 break;
22045
22046 case RULE_OP_MANGLE_TOGGLE_AT:
22047 NEXT_RULEPOS (rule_pos);
22048 NEXT_RPTOI (rule, rule_pos, upos);
22049 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
22050 break;
22051
22052 case RULE_OP_MANGLE_REVERSE:
22053 out_len = mangle_reverse (out, out_len);
22054 break;
22055
22056 case RULE_OP_MANGLE_DUPEWORD:
22057 out_len = mangle_double (out, out_len);
22058 break;
22059
22060 case RULE_OP_MANGLE_DUPEWORD_TIMES:
22061 NEXT_RULEPOS (rule_pos);
22062 NEXT_RPTOI (rule, rule_pos, ulen);
22063 out_len = mangle_double_times (out, out_len, ulen);
22064 break;
22065
22066 case RULE_OP_MANGLE_REFLECT:
22067 out_len = mangle_reflect (out, out_len);
22068 break;
22069
22070 case RULE_OP_MANGLE_ROTATE_LEFT:
22071 mangle_rotate_left (out, out_len);
22072 break;
22073
22074 case RULE_OP_MANGLE_ROTATE_RIGHT:
22075 mangle_rotate_right (out, out_len);
22076 break;
22077
22078 case RULE_OP_MANGLE_APPEND:
22079 NEXT_RULEPOS (rule_pos);
22080 out_len = mangle_append (out, out_len, rule[rule_pos]);
22081 break;
22082
22083 case RULE_OP_MANGLE_PREPEND:
22084 NEXT_RULEPOS (rule_pos);
22085 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
22086 break;
22087
22088 case RULE_OP_MANGLE_DELETE_FIRST:
22089 out_len = mangle_delete_at (out, out_len, 0);
22090 break;
22091
22092 case RULE_OP_MANGLE_DELETE_LAST:
22093 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
22094 break;
22095
22096 case RULE_OP_MANGLE_DELETE_AT:
22097 NEXT_RULEPOS (rule_pos);
22098 NEXT_RPTOI (rule, rule_pos, upos);
22099 out_len = mangle_delete_at (out, out_len, upos);
22100 break;
22101
22102 case RULE_OP_MANGLE_EXTRACT:
22103 NEXT_RULEPOS (rule_pos);
22104 NEXT_RPTOI (rule, rule_pos, upos);
22105 NEXT_RULEPOS (rule_pos);
22106 NEXT_RPTOI (rule, rule_pos, ulen);
22107 out_len = mangle_extract (out, out_len, upos, ulen);
22108 break;
22109
22110 case RULE_OP_MANGLE_OMIT:
22111 NEXT_RULEPOS (rule_pos);
22112 NEXT_RPTOI (rule, rule_pos, upos);
22113 NEXT_RULEPOS (rule_pos);
22114 NEXT_RPTOI (rule, rule_pos, ulen);
22115 out_len = mangle_omit (out, out_len, upos, ulen);
22116 break;
22117
22118 case RULE_OP_MANGLE_INSERT:
22119 NEXT_RULEPOS (rule_pos);
22120 NEXT_RPTOI (rule, rule_pos, upos);
22121 NEXT_RULEPOS (rule_pos);
22122 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
22123 break;
22124
22125 case RULE_OP_MANGLE_OVERSTRIKE:
22126 NEXT_RULEPOS (rule_pos);
22127 NEXT_RPTOI (rule, rule_pos, upos);
22128 NEXT_RULEPOS (rule_pos);
22129 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
22130 break;
22131
22132 case RULE_OP_MANGLE_TRUNCATE_AT:
22133 NEXT_RULEPOS (rule_pos);
22134 NEXT_RPTOI (rule, rule_pos, upos);
22135 out_len = mangle_truncate_at (out, out_len, upos);
22136 break;
22137
22138 case RULE_OP_MANGLE_REPLACE:
22139 NEXT_RULEPOS (rule_pos);
22140 NEXT_RULEPOS (rule_pos);
22141 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
22142 break;
22143
22144 case RULE_OP_MANGLE_PURGECHAR:
22145 NEXT_RULEPOS (rule_pos);
22146 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
22147 break;
22148
22149 case RULE_OP_MANGLE_TOGGLECASE_REC:
22150 /* todo */
22151 break;
22152
22153 case RULE_OP_MANGLE_DUPECHAR_FIRST:
22154 NEXT_RULEPOS (rule_pos);
22155 NEXT_RPTOI (rule, rule_pos, ulen);
22156 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
22157 break;
22158
22159 case RULE_OP_MANGLE_DUPECHAR_LAST:
22160 NEXT_RULEPOS (rule_pos);
22161 NEXT_RPTOI (rule, rule_pos, ulen);
22162 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
22163 break;
22164
22165 case RULE_OP_MANGLE_DUPECHAR_ALL:
22166 out_len = mangle_dupechar (out, out_len);
22167 break;
22168
22169 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
22170 NEXT_RULEPOS (rule_pos);
22171 NEXT_RPTOI (rule, rule_pos, ulen);
22172 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
22173 break;
22174
22175 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
22176 NEXT_RULEPOS (rule_pos);
22177 NEXT_RPTOI (rule, rule_pos, ulen);
22178 out_len = mangle_dupeblock_append (out, out_len, ulen);
22179 break;
22180
22181 case RULE_OP_MANGLE_SWITCH_FIRST:
22182 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
22183 break;
22184
22185 case RULE_OP_MANGLE_SWITCH_LAST:
22186 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
22187 break;
22188
22189 case RULE_OP_MANGLE_SWITCH_AT:
22190 NEXT_RULEPOS (rule_pos);
22191 NEXT_RPTOI (rule, rule_pos, upos);
22192 NEXT_RULEPOS (rule_pos);
22193 NEXT_RPTOI (rule, rule_pos, upos2);
22194 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
22195 break;
22196
22197 case RULE_OP_MANGLE_CHR_SHIFTL:
22198 NEXT_RULEPOS (rule_pos);
22199 NEXT_RPTOI (rule, rule_pos, upos);
22200 mangle_chr_shiftl (out, out_len, upos);
22201 break;
22202
22203 case RULE_OP_MANGLE_CHR_SHIFTR:
22204 NEXT_RULEPOS (rule_pos);
22205 NEXT_RPTOI (rule, rule_pos, upos);
22206 mangle_chr_shiftr (out, out_len, upos);
22207 break;
22208
22209 case RULE_OP_MANGLE_CHR_INCR:
22210 NEXT_RULEPOS (rule_pos);
22211 NEXT_RPTOI (rule, rule_pos, upos);
22212 mangle_chr_incr (out, out_len, upos);
22213 break;
22214
22215 case RULE_OP_MANGLE_CHR_DECR:
22216 NEXT_RULEPOS (rule_pos);
22217 NEXT_RPTOI (rule, rule_pos, upos);
22218 mangle_chr_decr (out, out_len, upos);
22219 break;
22220
22221 case RULE_OP_MANGLE_REPLACE_NP1:
22222 NEXT_RULEPOS (rule_pos);
22223 NEXT_RPTOI (rule, rule_pos, upos);
22224 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
22225 break;
22226
22227 case RULE_OP_MANGLE_REPLACE_NM1:
22228 NEXT_RULEPOS (rule_pos);
22229 NEXT_RPTOI (rule, rule_pos, upos);
22230 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
22231 break;
22232
22233 case RULE_OP_MANGLE_TITLE:
22234 out_len = mangle_title (out, out_len);
22235 break;
22236
22237 case RULE_OP_MANGLE_EXTRACT_MEMORY:
22238 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22239 NEXT_RULEPOS (rule_pos);
22240 NEXT_RPTOI (rule, rule_pos, upos);
22241 NEXT_RULEPOS (rule_pos);
22242 NEXT_RPTOI (rule, rule_pos, ulen);
22243 NEXT_RULEPOS (rule_pos);
22244 NEXT_RPTOI (rule, rule_pos, upos2);
22245 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
22246 break;
22247
22248 case RULE_OP_MANGLE_APPEND_MEMORY:
22249 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22250 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22251 memcpy (out + out_len, mem, mem_len);
22252 out_len += mem_len;
22253 break;
22254
22255 case RULE_OP_MANGLE_PREPEND_MEMORY:
22256 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22257 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22258 memcpy (mem + mem_len, out, out_len);
22259 out_len += mem_len;
22260 memcpy (out, mem, out_len);
22261 break;
22262
22263 case RULE_OP_MEMORIZE_WORD:
22264 memcpy (mem, out, out_len);
22265 mem_len = out_len;
22266 break;
22267
22268 case RULE_OP_REJECT_LESS:
22269 NEXT_RULEPOS (rule_pos);
22270 NEXT_RPTOI (rule, rule_pos, upos);
22271 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
22272 break;
22273
22274 case RULE_OP_REJECT_GREATER:
22275 NEXT_RULEPOS (rule_pos);
22276 NEXT_RPTOI (rule, rule_pos, upos);
22277 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
22278 break;
22279
22280 case RULE_OP_REJECT_CONTAIN:
22281 NEXT_RULEPOS (rule_pos);
22282 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
22283 break;
22284
22285 case RULE_OP_REJECT_NOT_CONTAIN:
22286 NEXT_RULEPOS (rule_pos);
22287 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
22288 break;
22289
22290 case RULE_OP_REJECT_EQUAL_FIRST:
22291 NEXT_RULEPOS (rule_pos);
22292 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22293 break;
22294
22295 case RULE_OP_REJECT_EQUAL_LAST:
22296 NEXT_RULEPOS (rule_pos);
22297 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22298 break;
22299
22300 case RULE_OP_REJECT_EQUAL_AT:
22301 NEXT_RULEPOS (rule_pos);
22302 NEXT_RPTOI (rule, rule_pos, upos);
22303 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22304 NEXT_RULEPOS (rule_pos);
22305 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22306 break;
22307
22308 case RULE_OP_REJECT_CONTAINS:
22309 NEXT_RULEPOS (rule_pos);
22310 NEXT_RPTOI (rule, rule_pos, upos);
22311 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22312 NEXT_RULEPOS (rule_pos);
22313 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
22314 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
22315 break;
22316
22317 case RULE_OP_REJECT_MEMORY:
22318 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
22319 break;
22320
22321 default:
22322 return (RULE_RC_SYNTAX_ERROR);
22323 break;
22324 }
22325 }
22326
22327 memset (out + out_len, 0, BLOCK_SIZE - out_len);
22328
22329 return (out_len);
22330 }