Add --mangle switch for mangling password before hashing
[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 __APPLE__
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(__APPLE__) || 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;
3493
3494 memset (&CoolerLevels, 0, sizeof (NV_GPU_COOLER_LEVELS));
3495
3496 CoolerLevels.Version = GPU_COOLER_LEVELS_VER | sizeof (NV_GPU_COOLER_LEVELS);
3497
3498 CoolerLevels.Levels[0].Level = fanspeed;
3499 CoolerLevels.Levels[0].Policy = 1;
3500
3501 if (hm_NvAPI_GPU_SetCoolerLevels (data.hm_nvapi, data.hm_device[device_id].nvapi, 0, &CoolerLevels) != NVAPI_OK) return -1;
3502
3503 return 0;
3504 }
3505 else
3506 {
3507 if (hm_NvAPI_GPU_RestoreCoolerSettings (data.hm_nvapi, data.hm_device[device_id].nvapi, 0) != NVAPI_OK) return -1;
3508
3509 return 0;
3510 }
3511 }
3512 }
3513
3514 return -1;
3515 }
3516
3517 int hm_set_fanspeed_with_device_id_xnvctrl (const uint device_id, const int fanspeed)
3518 {
3519 if (data.hm_device[device_id].fan_set_supported == 1)
3520 {
3521 if (data.hm_xnvctrl)
3522 {
3523 if (set_fan_speed_target (data.hm_xnvctrl, data.hm_device[device_id].xnvctrl, fanspeed) != 0) return -1;
3524
3525 return 0;
3526 }
3527 }
3528
3529 return -1;
3530 }
3531
3532 #endif // HAVE_HWMON
3533
3534 /**
3535 * maskprocessor
3536 */
3537
3538 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3539 {
3540 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3541
3542 if (css_cnt > SP_PW_MAX)
3543 {
3544 log_error ("ERROR: Mask length is too long");
3545
3546 exit (-1);
3547 }
3548
3549 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3550 {
3551 uint *uniq_tbl = uniq_tbls[css_pos];
3552
3553 uint *cs_buf = css[css_pos].cs_buf;
3554 uint cs_len = css[css_pos].cs_len;
3555
3556 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3557 {
3558 uint c = cs_buf[cs_pos] & 0xff;
3559
3560 uniq_tbl[c] = 1;
3561 }
3562 }
3563 }
3564
3565 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3566 {
3567 cs_t *cs = &css[css_cnt];
3568
3569 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3570
3571 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3572
3573 size_t i;
3574
3575 for (i = 0; i < cs->cs_len; i++)
3576 {
3577 const uint u = cs->cs_buf[i];
3578
3579 css_uniq[u] = 1;
3580 }
3581
3582 for (i = 0; i < in_len; i++)
3583 {
3584 uint u = in_buf[i] & 0xff;
3585
3586 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3587
3588 if (css_uniq[u] == 1) continue;
3589
3590 css_uniq[u] = 1;
3591
3592 cs->cs_buf[cs->cs_len] = u;
3593
3594 cs->cs_len++;
3595 }
3596
3597 myfree (css_uniq);
3598 }
3599
3600 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3601 {
3602 size_t in_pos;
3603
3604 for (in_pos = 0; in_pos < in_len; in_pos++)
3605 {
3606 uint p0 = in_buf[in_pos] & 0xff;
3607
3608 if (interpret == 1 && p0 == '?')
3609 {
3610 in_pos++;
3611
3612 if (in_pos == in_len) break;
3613
3614 uint p1 = in_buf[in_pos] & 0xff;
3615
3616 switch (p1)
3617 {
3618 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3619 break;
3620 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3621 break;
3622 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3623 break;
3624 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3625 break;
3626 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3627 break;
3628 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3629 break;
3630 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3631 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3632 break;
3633 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3634 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3635 break;
3636 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3637 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3638 break;
3639 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3640 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3641 break;
3642 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3643 break;
3644 default: log_error ("Syntax error: %s", in_buf);
3645 exit (-1);
3646 }
3647 }
3648 else
3649 {
3650 if (data.hex_charset)
3651 {
3652 in_pos++;
3653
3654 if (in_pos == in_len)
3655 {
3656 log_error ("ERROR: The hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3657
3658 exit (-1);
3659 }
3660
3661 uint p1 = in_buf[in_pos] & 0xff;
3662
3663 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3664 {
3665 log_error ("ERROR: Invalid hex character detected in mask %s", in_buf);
3666
3667 exit (-1);
3668 }
3669
3670 uint chr = 0;
3671
3672 chr = hex_convert (p1) << 0;
3673 chr |= hex_convert (p0) << 4;
3674
3675 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3676 }
3677 else
3678 {
3679 uint chr = p0;
3680
3681 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3682 }
3683 }
3684 }
3685 }
3686
3687 u64 mp_get_sum (uint css_cnt, cs_t *css)
3688 {
3689 u64 sum = 1;
3690
3691 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3692 {
3693 sum *= css[css_pos].cs_len;
3694 }
3695
3696 return (sum);
3697 }
3698
3699 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3700 {
3701 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3702
3703 uint mask_pos;
3704 uint css_pos;
3705
3706 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3707 {
3708 char p0 = mask_buf[mask_pos];
3709
3710 if (p0 == '?')
3711 {
3712 mask_pos++;
3713
3714 if (mask_pos == mask_len) break;
3715
3716 char p1 = mask_buf[mask_pos];
3717
3718 uint chr = p1;
3719
3720 switch (p1)
3721 {
3722 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3723 break;
3724 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3725 break;
3726 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3727 break;
3728 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3729 break;
3730 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3731 break;
3732 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3733 break;
3734 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3735 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3736 break;
3737 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3738 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3739 break;
3740 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3741 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3742 break;
3743 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3744 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3745 break;
3746 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3747 break;
3748 default: log_error ("ERROR: Syntax error: %s", mask_buf);
3749 exit (-1);
3750 }
3751 }
3752 else
3753 {
3754 if (data.hex_charset)
3755 {
3756 mask_pos++;
3757
3758 // if there is no 2nd hex character, show an error:
3759
3760 if (mask_pos == mask_len)
3761 {
3762 log_error ("ERROR: The hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3763
3764 exit (-1);
3765 }
3766
3767 char p1 = mask_buf[mask_pos];
3768
3769 // if they are not valid hex character, show an error:
3770
3771 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3772 {
3773 log_error ("ERROR: Invalid hex character detected in mask %s", mask_buf);
3774
3775 exit (-1);
3776 }
3777
3778 uint chr = 0;
3779
3780 chr |= hex_convert (p1) << 0;
3781 chr |= hex_convert (p0) << 4;
3782
3783 mp_add_cs_buf (&chr, 1, css, css_pos);
3784 }
3785 else
3786 {
3787 uint chr = p0;
3788
3789 mp_add_cs_buf (&chr, 1, css, css_pos);
3790 }
3791 }
3792 }
3793
3794 if (css_pos == 0)
3795 {
3796 log_error ("ERROR: Invalid mask length (0)");
3797
3798 exit (-1);
3799 }
3800
3801 *css_cnt = css_pos;
3802
3803 return (css);
3804 }
3805
3806 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3807 {
3808 for (int i = 0; i < css_cnt; i++)
3809 {
3810 uint len = css[i].cs_len;
3811 u64 next = val / len;
3812 uint pos = val % len;
3813 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3814 val = next;
3815 }
3816 }
3817
3818 void mp_cut_at (char *mask, uint max)
3819 {
3820 uint i;
3821 uint j;
3822 uint mask_len = strlen (mask);
3823
3824 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3825 {
3826 if (mask[i] == '?') i++;
3827 }
3828
3829 mask[i] = 0;
3830 }
3831
3832 void mp_setup_sys (cs_t *mp_sys)
3833 {
3834 uint pos;
3835 uint chr;
3836 uint donec[CHARSIZ] = { 0 };
3837
3838 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3839 mp_sys[0].cs_buf[pos++] = chr;
3840 mp_sys[0].cs_len = pos; }
3841
3842 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3843 mp_sys[1].cs_buf[pos++] = chr;
3844 mp_sys[1].cs_len = pos; }
3845
3846 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3847 mp_sys[2].cs_buf[pos++] = chr;
3848 mp_sys[2].cs_len = pos; }
3849
3850 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3851 mp_sys[3].cs_buf[pos++] = chr;
3852 mp_sys[3].cs_len = pos; }
3853
3854 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3855 mp_sys[4].cs_len = pos; }
3856
3857 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3858 mp_sys[5].cs_len = pos; }
3859 }
3860
3861 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3862 {
3863 FILE *fp = fopen (buf, "rb");
3864
3865 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3866 {
3867 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3868 }
3869 else
3870 {
3871 char mp_file[1024] = { 0 };
3872
3873 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3874
3875 fclose (fp);
3876
3877 len = in_superchop (mp_file);
3878
3879 if (len == 0)
3880 {
3881 log_info ("WARNING: Charset file corrupted");
3882
3883 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3884 }
3885 else
3886 {
3887 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3888 }
3889 }
3890 }
3891
3892 void mp_reset_usr (cs_t *mp_usr, uint index)
3893 {
3894 mp_usr[index].cs_len = 0;
3895
3896 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3897 }
3898
3899 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3900 {
3901 char *new_mask_buf = (char *) mymalloc (256);
3902
3903 uint mask_pos;
3904
3905 uint css_pos;
3906
3907 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3908 {
3909 if (css_pos == len) break;
3910
3911 char p0 = mask_buf[mask_pos];
3912
3913 new_mask_buf[mask_pos] = p0;
3914
3915 if (p0 == '?')
3916 {
3917 mask_pos++;
3918
3919 if (mask_pos == mask_len) break;
3920
3921 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3922 }
3923 else
3924 {
3925 if (data.hex_charset)
3926 {
3927 mask_pos++;
3928
3929 if (mask_pos == mask_len)
3930 {
3931 log_error ("ERROR: The hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3932
3933 exit (-1);
3934 }
3935
3936 char p1 = mask_buf[mask_pos];
3937
3938 // if they are not valid hex character, show an error:
3939
3940 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3941 {
3942 log_error ("ERROR: Invalid hex character detected in mask: %s", mask_buf);
3943
3944 exit (-1);
3945 }
3946
3947 new_mask_buf[mask_pos] = p1;
3948 }
3949 }
3950 }
3951
3952 if (css_pos == len) return (new_mask_buf);
3953
3954 myfree (new_mask_buf);
3955
3956 return (NULL);
3957 }
3958
3959 /**
3960 * statprocessor
3961 */
3962
3963 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3964 {
3965 u64 sum = 1;
3966
3967 uint i;
3968
3969 for (i = start; i < stop; i++)
3970 {
3971 sum *= root_css_buf[i].cs_len;
3972 }
3973
3974 return (sum);
3975 }
3976
3977 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3978 {
3979 u64 v = ctx;
3980
3981 cs_t *cs = &root_css_buf[start];
3982
3983 uint i;
3984
3985 for (i = start; i < stop; i++)
3986 {
3987 const u64 m = v % cs->cs_len;
3988 const u64 d = v / cs->cs_len;
3989
3990 v = d;
3991
3992 const uint k = cs->cs_buf[m];
3993
3994 pw_buf[i - start] = (char) k;
3995
3996 cs = &markov_css_buf[(i * CHARSIZ) + k];
3997 }
3998 }
3999
4000 int sp_comp_val (const void *p1, const void *p2)
4001 {
4002 hcstat_table_t *b1 = (hcstat_table_t *) p1;
4003 hcstat_table_t *b2 = (hcstat_table_t *) p2;
4004
4005 return b2->val - b1->val;
4006 }
4007
4008 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)
4009 {
4010 uint i;
4011 uint j;
4012 uint k;
4013
4014 /**
4015 * Initialize hcstats
4016 */
4017
4018 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
4019
4020 u64 *root_stats_ptr = root_stats_buf;
4021
4022 u64 *root_stats_buf_by_pos[SP_PW_MAX];
4023
4024 for (i = 0; i < SP_PW_MAX; i++)
4025 {
4026 root_stats_buf_by_pos[i] = root_stats_ptr;
4027
4028 root_stats_ptr += CHARSIZ;
4029 }
4030
4031 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
4032
4033 u64 *markov_stats_ptr = markov_stats_buf;
4034
4035 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
4036
4037 for (i = 0; i < SP_PW_MAX; i++)
4038 {
4039 for (j = 0; j < CHARSIZ; j++)
4040 {
4041 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
4042
4043 markov_stats_ptr += CHARSIZ;
4044 }
4045 }
4046
4047 /**
4048 * Load hcstats File
4049 */
4050
4051 if (hcstat == NULL)
4052 {
4053 char hcstat_tmp[256] = { 0 };
4054
4055 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
4056
4057 hcstat = hcstat_tmp;
4058 }
4059
4060 FILE *fd = fopen (hcstat, "rb");
4061
4062 if (fd == NULL)
4063 {
4064 log_error ("%s: %s", hcstat, strerror (errno));
4065
4066 exit (-1);
4067 }
4068
4069 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
4070 {
4071 log_error ("%s: Could not load data", hcstat);
4072
4073 fclose (fd);
4074
4075 exit (-1);
4076 }
4077
4078 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
4079 {
4080 log_error ("%s: Could not load data", hcstat);
4081
4082 fclose (fd);
4083
4084 exit (-1);
4085 }
4086
4087 fclose (fd);
4088
4089 /**
4090 * Markov modifier of hcstat_table on user request
4091 */
4092
4093 if (disable)
4094 {
4095 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
4096 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
4097 }
4098
4099 if (classic)
4100 {
4101 /* Add all stats to first position */
4102
4103 for (i = 1; i < SP_PW_MAX; i++)
4104 {
4105 u64 *out = root_stats_buf_by_pos[0];
4106 u64 *in = root_stats_buf_by_pos[i];
4107
4108 for (j = 0; j < CHARSIZ; j++)
4109 {
4110 *out++ += *in++;
4111 }
4112 }
4113
4114 for (i = 1; i < SP_PW_MAX; i++)
4115 {
4116 u64 *out = markov_stats_buf_by_key[0][0];
4117 u64 *in = markov_stats_buf_by_key[i][0];
4118
4119 for (j = 0; j < CHARSIZ; j++)
4120 {
4121 for (k = 0; k < CHARSIZ; k++)
4122 {
4123 *out++ += *in++;
4124 }
4125 }
4126 }
4127
4128 /* copy them to all pw_positions */
4129
4130 for (i = 1; i < SP_PW_MAX; i++)
4131 {
4132 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
4133 }
4134
4135 for (i = 1; i < SP_PW_MAX; i++)
4136 {
4137 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
4138 }
4139 }
4140
4141 /**
4142 * Initialize tables
4143 */
4144
4145 hcstat_table_t *root_table_ptr = root_table_buf;
4146
4147 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
4148
4149 for (i = 0; i < SP_PW_MAX; i++)
4150 {
4151 root_table_buf_by_pos[i] = root_table_ptr;
4152
4153 root_table_ptr += CHARSIZ;
4154 }
4155
4156 hcstat_table_t *markov_table_ptr = markov_table_buf;
4157
4158 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
4159
4160 for (i = 0; i < SP_PW_MAX; i++)
4161 {
4162 for (j = 0; j < CHARSIZ; j++)
4163 {
4164 markov_table_buf_by_key[i][j] = markov_table_ptr;
4165
4166 markov_table_ptr += CHARSIZ;
4167 }
4168 }
4169
4170 /**
4171 * Convert hcstat to tables
4172 */
4173
4174 for (i = 0; i < SP_ROOT_CNT; i++)
4175 {
4176 uint key = i % CHARSIZ;
4177
4178 root_table_buf[i].key = key;
4179 root_table_buf[i].val = root_stats_buf[i];
4180 }
4181
4182 for (i = 0; i < SP_MARKOV_CNT; i++)
4183 {
4184 uint key = i % CHARSIZ;
4185
4186 markov_table_buf[i].key = key;
4187 markov_table_buf[i].val = markov_stats_buf[i];
4188 }
4189
4190 myfree (root_stats_buf);
4191 myfree (markov_stats_buf);
4192
4193 /**
4194 * Finally sort them
4195 */
4196
4197 for (i = 0; i < SP_PW_MAX; i++)
4198 {
4199 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4200 }
4201
4202 for (i = 0; i < SP_PW_MAX; i++)
4203 {
4204 for (j = 0; j < CHARSIZ; j++)
4205 {
4206 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4207 }
4208 }
4209 }
4210
4211 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])
4212 {
4213 /**
4214 * Convert tables to css
4215 */
4216
4217 for (uint i = 0; i < SP_ROOT_CNT; i++)
4218 {
4219 uint pw_pos = i / CHARSIZ;
4220
4221 cs_t *cs = &root_css_buf[pw_pos];
4222
4223 if (cs->cs_len == threshold) continue;
4224
4225 uint key = root_table_buf[i].key;
4226
4227 if (uniq_tbls[pw_pos][key] == 0) continue;
4228
4229 cs->cs_buf[cs->cs_len] = key;
4230
4231 cs->cs_len++;
4232 }
4233
4234 /**
4235 * Convert table to css
4236 */
4237
4238 for (uint i = 0; i < SP_MARKOV_CNT; i++)
4239 {
4240 uint c = i / CHARSIZ;
4241
4242 cs_t *cs = &markov_css_buf[c];
4243
4244 if (cs->cs_len == threshold) continue;
4245
4246 uint pw_pos = c / CHARSIZ;
4247
4248 uint key = markov_table_buf[i].key;
4249
4250 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4251
4252 cs->cs_buf[cs->cs_len] = key;
4253
4254 cs->cs_len++;
4255 }
4256
4257 /*
4258 for (uint i = 0; i < 8; i++)
4259 {
4260 for (uint j = 0x20; j < 0x80; j++)
4261 {
4262 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4263
4264 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4265
4266 for (uint k = 0; k < 10; k++)
4267 {
4268 printf (" %u\n", ptr->cs_buf[k]);
4269 }
4270 }
4271 }
4272 */
4273 }
4274
4275 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4276 {
4277 for (uint i = 0; i < SP_PW_MAX; i += 2)
4278 {
4279 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4280
4281 out += CHARSIZ;
4282 in += CHARSIZ;
4283
4284 out->key = 0;
4285 out->val = 1;
4286
4287 out++;
4288
4289 for (uint j = 1; j < CHARSIZ; j++)
4290 {
4291 out->key = j;
4292 out->val = 0;
4293
4294 out++;
4295 }
4296 }
4297 }
4298
4299 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4300 {
4301 for (uint i = 0; i < SP_PW_MAX; i += 2)
4302 {
4303 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4304
4305 out += CHARSIZ * CHARSIZ;
4306 in += CHARSIZ * CHARSIZ;
4307
4308 for (uint j = 0; j < CHARSIZ; j++)
4309 {
4310 out->key = 0;
4311 out->val = 1;
4312
4313 out++;
4314
4315 for (uint k = 1; k < CHARSIZ; k++)
4316 {
4317 out->key = k;
4318 out->val = 0;
4319
4320 out++;
4321 }
4322 }
4323 }
4324 }
4325
4326 /**
4327 * mixed shared functions
4328 */
4329
4330 void dump_hex (const u8 *s, const int sz)
4331 {
4332 for (int i = 0; i < sz; i++)
4333 {
4334 log_info_nn ("%02x ", s[i]);
4335 }
4336
4337 log_info ("");
4338 }
4339
4340 void usage_mini_print (const char *progname)
4341 {
4342 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4343 }
4344
4345 void usage_big_print (const char *progname)
4346 {
4347 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4348 }
4349
4350 char *get_exec_path ()
4351 {
4352 int exec_path_len = 1024;
4353
4354 char *exec_path = (char *) mymalloc (exec_path_len);
4355
4356 #ifdef __linux__
4357
4358 char tmp[32] = { 0 };
4359
4360 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4361
4362 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4363
4364 #elif WIN
4365
4366 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4367
4368 #elif __APPLE__
4369
4370 uint size = exec_path_len;
4371
4372 if (_NSGetExecutablePath (exec_path, &size) != 0)
4373 {
4374 log_error("! executable path buffer too small\n");
4375
4376 exit (-1);
4377 }
4378
4379 const int len = strlen (exec_path);
4380
4381 #elif __FreeBSD__
4382
4383 #include <sys/sysctl.h>
4384
4385 int mib[4];
4386 mib[0] = CTL_KERN;
4387 mib[1] = KERN_PROC;
4388 mib[2] = KERN_PROC_PATHNAME;
4389 mib[3] = -1;
4390
4391 char tmp[32] = { 0 };
4392
4393 size_t size = exec_path_len;
4394 sysctl(mib, 4, exec_path, &size, NULL, 0);
4395
4396 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4397
4398 #else
4399 #error Your Operating System is not supported or detected
4400 #endif
4401
4402 exec_path[len] = 0;
4403
4404 return exec_path;
4405 }
4406
4407 char *get_install_dir (const char *progname)
4408 {
4409 char *install_dir = mystrdup (progname);
4410 char *last_slash = NULL;
4411
4412 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4413 {
4414 *last_slash = 0;
4415 }
4416 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4417 {
4418 *last_slash = 0;
4419 }
4420 else
4421 {
4422 install_dir[0] = '.';
4423 install_dir[1] = 0;
4424 }
4425
4426 return (install_dir);
4427 }
4428
4429 char *get_profile_dir (const char *homedir)
4430 {
4431 #define DOT_HASHCAT ".hashcat"
4432
4433 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4434
4435 char *profile_dir = (char *) mymalloc (len + 1);
4436
4437 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4438
4439 return profile_dir;
4440 }
4441
4442 char *get_session_dir (const char *profile_dir)
4443 {
4444 #define SESSIONS_FOLDER "sessions"
4445
4446 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4447
4448 char *session_dir = (char *) mymalloc (len + 1);
4449
4450 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4451
4452 return session_dir;
4453 }
4454
4455 uint count_lines (FILE *fd)
4456 {
4457 uint cnt = 0;
4458
4459 char *buf = (char *) mymalloc (HCBUFSIZ + 1);
4460
4461 char prev = '\n';
4462
4463 while (!feof (fd))
4464 {
4465 size_t nread = fread (buf, sizeof (char), HCBUFSIZ, fd);
4466
4467 if (nread < 1) continue;
4468
4469 size_t i;
4470
4471 for (i = 0; i < nread; i++)
4472 {
4473 if (prev == '\n') cnt++;
4474
4475 prev = buf[i];
4476 }
4477 }
4478
4479 myfree (buf);
4480
4481 return cnt;
4482 }
4483
4484 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4485 {
4486 uint crc = ~0;
4487
4488 FILE *fd = fopen (filename, "rb");
4489
4490 if (fd == NULL)
4491 {
4492 log_error ("%s: %s", filename, strerror (errno));
4493
4494 exit (-1);
4495 }
4496
4497 #define MAX_KEY_SIZE (1024 * 1024)
4498
4499 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4500
4501 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4502
4503 fclose (fd);
4504
4505 int kpos = 0;
4506
4507 for (int fpos = 0; fpos < nread; fpos++)
4508 {
4509 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4510
4511 keytab[kpos++] += (crc >> 24) & 0xff;
4512 keytab[kpos++] += (crc >> 16) & 0xff;
4513 keytab[kpos++] += (crc >> 8) & 0xff;
4514 keytab[kpos++] += (crc >> 0) & 0xff;
4515
4516 if (kpos >= 64) kpos = 0;
4517 }
4518
4519 myfree (buf);
4520 }
4521
4522 #ifdef __APPLE__
4523 int pthread_setaffinity_np (pthread_t thread, size_t cpu_size, cpu_set_t *cpu_set)
4524 {
4525 int core;
4526
4527 for (core = 0; core < (8 * (int)cpu_size); core++)
4528 if (CPU_ISSET(core, cpu_set)) break;
4529
4530 thread_affinity_policy_data_t policy = { core };
4531
4532 const int rc = thread_policy_set (pthread_mach_thread_np (thread), THREAD_AFFINITY_POLICY, (thread_policy_t) &policy, 1);
4533
4534 if (data.quiet == 0)
4535 {
4536 if (rc != KERN_SUCCESS)
4537 {
4538 log_error ("ERROR: %s : %d", "thread_policy_set()", rc);
4539 }
4540 }
4541
4542 return rc;
4543 }
4544 #endif
4545
4546 void set_cpu_affinity (char *cpu_affinity)
4547 {
4548 #ifdef _WIN
4549 DWORD_PTR aff_mask = 0;
4550 #elif __FreeBSD__
4551 cpuset_t cpuset;
4552 CPU_ZERO (&cpuset);
4553 #elif _POSIX
4554 cpu_set_t cpuset;
4555 CPU_ZERO (&cpuset);
4556 #endif
4557
4558 if (cpu_affinity)
4559 {
4560 char *devices = strdup (cpu_affinity);
4561
4562 char *next = strtok (devices, ",");
4563
4564 do
4565 {
4566 uint cpu_id = atoi (next);
4567
4568 if (cpu_id == 0)
4569 {
4570 #ifdef _WIN
4571 aff_mask = 0;
4572 #elif _POSIX
4573 CPU_ZERO (&cpuset);
4574 #endif
4575
4576 break;
4577 }
4578
4579 if (cpu_id > 32)
4580 {
4581 log_error ("ERROR: Invalid cpu_id %u specified", cpu_id);
4582
4583 exit (-1);
4584 }
4585
4586 #ifdef _WIN
4587 aff_mask |= 1u << (cpu_id - 1);
4588 #elif _POSIX
4589 CPU_SET ((cpu_id - 1), &cpuset);
4590 #endif
4591
4592 } while ((next = strtok (NULL, ",")) != NULL);
4593
4594 free (devices);
4595 }
4596
4597 #ifdef _WIN
4598 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4599 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4600 #elif __FreeBSD__
4601 pthread_t thread = pthread_self ();
4602 pthread_setaffinity_np (thread, sizeof (cpuset_t), &cpuset);
4603 #elif _POSIX
4604 pthread_t thread = pthread_self ();
4605 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4606 #endif
4607 }
4608
4609 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4610 {
4611 char *element, *end;
4612
4613 end = (char *) base + nmemb * size;
4614
4615 for (element = (char *) base; element < end; element += size)
4616 if (!compar (element, key))
4617 return element;
4618
4619 return NULL;
4620 }
4621
4622 int sort_by_u32 (const void *v1, const void *v2)
4623 {
4624 const u32 *s1 = (const u32 *) v1;
4625 const u32 *s2 = (const u32 *) v2;
4626
4627 return *s1 - *s2;
4628 }
4629
4630 int sort_by_salt (const void *v1, const void *v2)
4631 {
4632 const salt_t *s1 = (const salt_t *) v1;
4633 const salt_t *s2 = (const salt_t *) v2;
4634
4635 const int res1 = s1->salt_len - s2->salt_len;
4636
4637 if (res1 != 0) return (res1);
4638
4639 const int res2 = s1->salt_iter - s2->salt_iter;
4640
4641 if (res2 != 0) return (res2);
4642
4643 uint n;
4644
4645 n = 16;
4646
4647 while (n--)
4648 {
4649 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4650 if (s1->salt_buf[n] < s2->salt_buf[n]) return -1;
4651 }
4652
4653 n = 8;
4654
4655 while (n--)
4656 {
4657 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4658 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return -1;
4659 }
4660
4661 return 0;
4662 }
4663
4664 int sort_by_salt_buf (const void *v1, const void *v2)
4665 {
4666 const pot_t *p1 = (const pot_t *) v1;
4667 const pot_t *p2 = (const pot_t *) v2;
4668
4669 const hash_t *h1 = &p1->hash;
4670 const hash_t *h2 = &p2->hash;
4671
4672 const salt_t *s1 = h1->salt;
4673 const salt_t *s2 = h2->salt;
4674
4675 uint n = 16;
4676
4677 while (n--)
4678 {
4679 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4680 if (s1->salt_buf[n] < s2->salt_buf[n]) return -1;
4681 }
4682
4683 return 0;
4684 }
4685
4686 int sort_by_hash_t_salt (const void *v1, const void *v2)
4687 {
4688 const hash_t *h1 = (const hash_t *) v1;
4689 const hash_t *h2 = (const hash_t *) v2;
4690
4691 const salt_t *s1 = h1->salt;
4692 const salt_t *s2 = h2->salt;
4693
4694 // testphase: this should work
4695 uint n = 16;
4696
4697 while (n--)
4698 {
4699 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4700 if (s1->salt_buf[n] < s2->salt_buf[n]) return -1;
4701 }
4702
4703 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4704 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4705 if (s1->salt_len > s2->salt_len) return ( 1);
4706 if (s1->salt_len < s2->salt_len) return -1;
4707
4708 uint n = s1->salt_len;
4709
4710 while (n--)
4711 {
4712 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4713 if (s1->salt_buf[n] < s2->salt_buf[n]) return -1;
4714 }
4715 */
4716
4717 return 0;
4718 }
4719
4720 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4721 {
4722 const hash_t *h1 = (const hash_t *) v1;
4723 const hash_t *h2 = (const hash_t *) v2;
4724
4725 const salt_t *s1 = h1->salt;
4726 const salt_t *s2 = h2->salt;
4727
4728 // last 2: salt_buf[10] and salt_buf[11] contain the digest (skip them)
4729
4730 uint n = 9; // 9 * 4 = 36 bytes (max length of ESSID)
4731
4732 while (n--)
4733 {
4734 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4735 if (s1->salt_buf[n] < s2->salt_buf[n]) return -1;
4736 }
4737
4738 return 0;
4739 }
4740
4741 int sort_by_hash_no_salt (const void *v1, const void *v2)
4742 {
4743 const hash_t *h1 = (const hash_t *) v1;
4744 const hash_t *h2 = (const hash_t *) v2;
4745
4746 const void *d1 = h1->digest;
4747 const void *d2 = h2->digest;
4748
4749 return data.sort_by_digest (d1, d2);
4750 }
4751
4752 int sort_by_hash (const void *v1, const void *v2)
4753 {
4754 const hash_t *h1 = (const hash_t *) v1;
4755 const hash_t *h2 = (const hash_t *) v2;
4756
4757 if (data.isSalted)
4758 {
4759 const salt_t *s1 = h1->salt;
4760 const salt_t *s2 = h2->salt;
4761
4762 int res = sort_by_salt (s1, s2);
4763
4764 if (res != 0) return (res);
4765 }
4766
4767 const void *d1 = h1->digest;
4768 const void *d2 = h2->digest;
4769
4770 return data.sort_by_digest (d1, d2);
4771 }
4772
4773 int sort_by_pot (const void *v1, const void *v2)
4774 {
4775 const pot_t *p1 = (const pot_t *) v1;
4776 const pot_t *p2 = (const pot_t *) v2;
4777
4778 const hash_t *h1 = &p1->hash;
4779 const hash_t *h2 = &p2->hash;
4780
4781 return sort_by_hash (h1, h2);
4782 }
4783
4784 int sort_by_mtime (const void *p1, const void *p2)
4785 {
4786 const char **f1 = (const char **) p1;
4787 const char **f2 = (const char **) p2;
4788
4789 struct stat s1; stat (*f1, &s1);
4790 struct stat s2; stat (*f2, &s2);
4791
4792 return s2.st_mtime - s1.st_mtime;
4793 }
4794
4795 int sort_by_cpu_rule (const void *p1, const void *p2)
4796 {
4797 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4798 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4799
4800 return memcmp (r1, r2, sizeof (cpu_rule_t));
4801 }
4802
4803 int sort_by_kernel_rule (const void *p1, const void *p2)
4804 {
4805 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4806 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4807
4808 return memcmp (r1, r2, sizeof (kernel_rule_t));
4809 }
4810
4811 int sort_by_stringptr (const void *p1, const void *p2)
4812 {
4813 const char **s1 = (const char **) p1;
4814 const char **s2 = (const char **) p2;
4815
4816 return strcmp (*s1, *s2);
4817 }
4818
4819 int sort_by_dictstat (const void *s1, const void *s2)
4820 {
4821 dictstat_t *d1 = (dictstat_t *) s1;
4822 dictstat_t *d2 = (dictstat_t *) s2;
4823
4824 #ifdef __linux__
4825 d2->stat.st_atim = d1->stat.st_atim;
4826 #else
4827 d2->stat.st_atime = d1->stat.st_atime;
4828 #endif
4829
4830 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4831 }
4832
4833 int sort_by_bitmap (const void *p1, const void *p2)
4834 {
4835 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4836 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4837
4838 return b1->collisions - b2->collisions;
4839 }
4840
4841 int sort_by_digest_4_2 (const void *v1, const void *v2)
4842 {
4843 const u32 *d1 = (const u32 *) v1;
4844 const u32 *d2 = (const u32 *) v2;
4845
4846 uint n = 2;
4847
4848 while (n--)
4849 {
4850 if (d1[n] > d2[n]) return ( 1);
4851 if (d1[n] < d2[n]) return -1;
4852 }
4853
4854 return 0;
4855 }
4856
4857 int sort_by_digest_4_4 (const void *v1, const void *v2)
4858 {
4859 const u32 *d1 = (const u32 *) v1;
4860 const u32 *d2 = (const u32 *) v2;
4861
4862 uint n = 4;
4863
4864 while (n--)
4865 {
4866 if (d1[n] > d2[n]) return ( 1);
4867 if (d1[n] < d2[n]) return -1;
4868 }
4869
4870 return 0;
4871 }
4872
4873 int sort_by_digest_4_5 (const void *v1, const void *v2)
4874 {
4875 const u32 *d1 = (const u32 *) v1;
4876 const u32 *d2 = (const u32 *) v2;
4877
4878 uint n = 5;
4879
4880 while (n--)
4881 {
4882 if (d1[n] > d2[n]) return ( 1);
4883 if (d1[n] < d2[n]) return -1;
4884 }
4885
4886 return 0;
4887 }
4888
4889 int sort_by_digest_4_6 (const void *v1, const void *v2)
4890 {
4891 const u32 *d1 = (const u32 *) v1;
4892 const u32 *d2 = (const u32 *) v2;
4893
4894 uint n = 6;
4895
4896 while (n--)
4897 {
4898 if (d1[n] > d2[n]) return ( 1);
4899 if (d1[n] < d2[n]) return -1;
4900 }
4901
4902 return 0;
4903 }
4904
4905 int sort_by_digest_4_8 (const void *v1, const void *v2)
4906 {
4907 const u32 *d1 = (const u32 *) v1;
4908 const u32 *d2 = (const u32 *) v2;
4909
4910 uint n = 8;
4911
4912 while (n--)
4913 {
4914 if (d1[n] > d2[n]) return ( 1);
4915 if (d1[n] < d2[n]) return -1;
4916 }
4917
4918 return 0;
4919 }
4920
4921 int sort_by_digest_4_16 (const void *v1, const void *v2)
4922 {
4923 const u32 *d1 = (const u32 *) v1;
4924 const u32 *d2 = (const u32 *) v2;
4925
4926 uint n = 16;
4927
4928 while (n--)
4929 {
4930 if (d1[n] > d2[n]) return ( 1);
4931 if (d1[n] < d2[n]) return -1;
4932 }
4933
4934 return 0;
4935 }
4936
4937 int sort_by_digest_4_32 (const void *v1, const void *v2)
4938 {
4939 const u32 *d1 = (const u32 *) v1;
4940 const u32 *d2 = (const u32 *) v2;
4941
4942 uint n = 32;
4943
4944 while (n--)
4945 {
4946 if (d1[n] > d2[n]) return ( 1);
4947 if (d1[n] < d2[n]) return -1;
4948 }
4949
4950 return 0;
4951 }
4952
4953 int sort_by_digest_4_64 (const void *v1, const void *v2)
4954 {
4955 const u32 *d1 = (const u32 *) v1;
4956 const u32 *d2 = (const u32 *) v2;
4957
4958 uint n = 64;
4959
4960 while (n--)
4961 {
4962 if (d1[n] > d2[n]) return ( 1);
4963 if (d1[n] < d2[n]) return -1;
4964 }
4965
4966 return 0;
4967 }
4968
4969 int sort_by_digest_8_8 (const void *v1, const void *v2)
4970 {
4971 const u64 *d1 = (const u64 *) v1;
4972 const u64 *d2 = (const u64 *) v2;
4973
4974 uint n = 8;
4975
4976 while (n--)
4977 {
4978 if (d1[n] > d2[n]) return ( 1);
4979 if (d1[n] < d2[n]) return -1;
4980 }
4981
4982 return 0;
4983 }
4984
4985 int sort_by_digest_8_16 (const void *v1, const void *v2)
4986 {
4987 const u64 *d1 = (const u64 *) v1;
4988 const u64 *d2 = (const u64 *) v2;
4989
4990 uint n = 16;
4991
4992 while (n--)
4993 {
4994 if (d1[n] > d2[n]) return ( 1);
4995 if (d1[n] < d2[n]) return -1;
4996 }
4997
4998 return 0;
4999 }
5000
5001 int sort_by_digest_8_25 (const void *v1, const void *v2)
5002 {
5003 const u64 *d1 = (const u64 *) v1;
5004 const u64 *d2 = (const u64 *) v2;
5005
5006 uint n = 25;
5007
5008 while (n--)
5009 {
5010 if (d1[n] > d2[n]) return ( 1);
5011 if (d1[n] < d2[n]) return -1;
5012 }
5013
5014 return 0;
5015 }
5016
5017 int sort_by_digest_p0p1 (const void *v1, const void *v2)
5018 {
5019 const u32 *d1 = (const u32 *) v1;
5020 const u32 *d2 = (const u32 *) v2;
5021
5022 const uint dgst_pos0 = data.dgst_pos0;
5023 const uint dgst_pos1 = data.dgst_pos1;
5024 const uint dgst_pos2 = data.dgst_pos2;
5025 const uint dgst_pos3 = data.dgst_pos3;
5026
5027 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
5028 if (d1[dgst_pos3] < d2[dgst_pos3]) return -1;
5029 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
5030 if (d1[dgst_pos2] < d2[dgst_pos2]) return -1;
5031 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
5032 if (d1[dgst_pos1] < d2[dgst_pos1]) return -1;
5033 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
5034 if (d1[dgst_pos0] < d2[dgst_pos0]) return -1;
5035
5036 return 0;
5037 }
5038
5039 int sort_by_tuning_db_alias (const void *v1, const void *v2)
5040 {
5041 const tuning_db_alias_t *t1 = (const tuning_db_alias_t *) v1;
5042 const tuning_db_alias_t *t2 = (const tuning_db_alias_t *) v2;
5043
5044 const int res1 = strcmp (t1->device_name, t2->device_name);
5045
5046 if (res1 != 0) return (res1);
5047
5048 return 0;
5049 }
5050
5051 int sort_by_tuning_db_entry (const void *v1, const void *v2)
5052 {
5053 const tuning_db_entry_t *t1 = (const tuning_db_entry_t *) v1;
5054 const tuning_db_entry_t *t2 = (const tuning_db_entry_t *) v2;
5055
5056 const int res1 = strcmp (t1->device_name, t2->device_name);
5057
5058 if (res1 != 0) return (res1);
5059
5060 const int res2 = t1->attack_mode
5061 - t2->attack_mode;
5062
5063 if (res2 != 0) return (res2);
5064
5065 const int res3 = t1->hash_type
5066 - t2->hash_type;
5067
5068 if (res3 != 0) return (res3);
5069
5070 return 0;
5071 }
5072
5073 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)
5074 {
5075 uint outfile_autohex = data.outfile_autohex;
5076
5077 unsigned char *rule_ptr = (unsigned char *) rule_buf;
5078
5079 FILE *debug_fp = NULL;
5080
5081 if (debug_file != NULL)
5082 {
5083 debug_fp = fopen (debug_file, "ab");
5084
5085 lock_file (debug_fp);
5086 }
5087 else
5088 {
5089 debug_fp = stderr;
5090 }
5091
5092 if (debug_fp == NULL)
5093 {
5094 log_info ("WARNING: Could not open debug-file for writing");
5095 }
5096 else
5097 {
5098 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
5099 {
5100 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
5101
5102 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
5103 }
5104
5105 fwrite (rule_ptr, rule_len, 1, debug_fp);
5106
5107 if (debug_mode == 4)
5108 {
5109 fputc (':', debug_fp);
5110
5111 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
5112 }
5113
5114 fputc ('\n', debug_fp);
5115
5116 if (debug_file != NULL) fclose (debug_fp);
5117 }
5118 }
5119
5120 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
5121 {
5122 int needs_hexify = 0;
5123
5124 if (outfile_autohex == 1)
5125 {
5126 for (uint i = 0; i < plain_len; i++)
5127 {
5128 if (plain_ptr[i] < 0x20)
5129 {
5130 needs_hexify = 1;
5131
5132 break;
5133 }
5134
5135 if (plain_ptr[i] > 0x7f)
5136 {
5137 needs_hexify = 1;
5138
5139 break;
5140 }
5141 }
5142 }
5143
5144 if (needs_hexify == 1)
5145 {
5146 fprintf (fp, "$HEX[");
5147
5148 for (uint i = 0; i < plain_len; i++)
5149 {
5150 fprintf (fp, "%02x", plain_ptr[i]);
5151 }
5152
5153 fprintf (fp, "]");
5154 }
5155 else
5156 {
5157 fwrite (plain_ptr, plain_len, 1, fp);
5158 }
5159 }
5160
5161 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)
5162 {
5163 uint outfile_format = data.outfile_format;
5164
5165 char separator = data.separator;
5166
5167 if (outfile_format & OUTFILE_FMT_HASH)
5168 {
5169 fprintf (out_fp, "%s", out_buf);
5170
5171 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5172 {
5173 fputc (separator, out_fp);
5174 }
5175 }
5176 else if (data.username)
5177 {
5178 if (username != NULL)
5179 {
5180 for (uint i = 0; i < user_len; i++)
5181 {
5182 fprintf (out_fp, "%c", username[i]);
5183 }
5184
5185 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5186 {
5187 fputc (separator, out_fp);
5188 }
5189 }
5190 }
5191
5192 if (outfile_format & OUTFILE_FMT_PLAIN)
5193 {
5194 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
5195
5196 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5197 {
5198 fputc (separator, out_fp);
5199 }
5200 }
5201
5202 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
5203 {
5204 for (uint i = 0; i < plain_len; i++)
5205 {
5206 fprintf (out_fp, "%02x", plain_ptr[i]);
5207 }
5208
5209 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
5210 {
5211 fputc (separator, out_fp);
5212 }
5213 }
5214
5215 if (outfile_format & OUTFILE_FMT_CRACKPOS)
5216 {
5217 #ifdef _WIN
5218 __mingw_fprintf (out_fp, "%llu", crackpos);
5219 #endif
5220
5221 #ifdef _POSIX
5222 #ifdef __x86_64__
5223 fprintf (out_fp, "%lu", (unsigned long) crackpos);
5224 #else
5225 fprintf (out_fp, "%llu", crackpos);
5226 #endif
5227 #endif
5228 }
5229
5230 fputs (EOL, out_fp);
5231 }
5232
5233 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)
5234 {
5235 pot_t pot_key;
5236
5237 pot_key.hash.salt = hashes_buf->salt;
5238 pot_key.hash.digest = hashes_buf->digest;
5239
5240 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5241
5242 if (pot_ptr)
5243 {
5244 log_info_nn ("");
5245
5246 input_buf[input_len] = 0;
5247
5248 // user
5249 unsigned char *username = NULL;
5250 uint user_len = 0;
5251
5252 if (data.username)
5253 {
5254 user_t *user = hashes_buf->hash_info->user;
5255
5256 if (user)
5257 {
5258 username = (unsigned char *) (user->user_name);
5259
5260 user_len = user->user_len;
5261 }
5262 }
5263
5264 // do output the line
5265 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
5266 }
5267 }
5268
5269 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
5270 #define LM_MASKED_PLAIN "[notfound]"
5271
5272 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)
5273 {
5274 // left
5275
5276 pot_t pot_left_key;
5277
5278 pot_left_key.hash.salt = hash_left->salt;
5279 pot_left_key.hash.digest = hash_left->digest;
5280
5281 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5282
5283 // right
5284
5285 uint weak_hash_found = 0;
5286
5287 pot_t pot_right_key;
5288
5289 pot_right_key.hash.salt = hash_right->salt;
5290 pot_right_key.hash.digest = hash_right->digest;
5291
5292 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5293
5294 if (pot_right_ptr == NULL)
5295 {
5296 // special case, if "weak hash"
5297
5298 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5299 {
5300 weak_hash_found = 1;
5301
5302 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5303
5304 // in theory this is not needed, but we are paranoia:
5305
5306 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5307 pot_right_ptr->plain_len = 0;
5308 }
5309 }
5310
5311 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
5312 {
5313 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
5314
5315 return;
5316 }
5317
5318 // at least one half was found:
5319
5320 log_info_nn ("");
5321
5322 input_buf[input_len] = 0;
5323
5324 // user
5325
5326 unsigned char *username = NULL;
5327 uint user_len = 0;
5328
5329 if (data.username)
5330 {
5331 user_t *user = hash_left->hash_info->user;
5332
5333 if (user)
5334 {
5335 username = (unsigned char *) (user->user_name);
5336
5337 user_len = user->user_len;
5338 }
5339 }
5340
5341 // mask the part which was not found
5342
5343 uint left_part_masked = 0;
5344 uint right_part_masked = 0;
5345
5346 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5347
5348 if (pot_left_ptr == NULL)
5349 {
5350 left_part_masked = 1;
5351
5352 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5353
5354 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5355
5356 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5357 pot_left_ptr->plain_len = mask_plain_len;
5358 }
5359
5360 if (pot_right_ptr == NULL)
5361 {
5362 right_part_masked = 1;
5363
5364 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5365
5366 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5367
5368 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5369 pot_right_ptr->plain_len = mask_plain_len;
5370 }
5371
5372 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5373
5374 pot_t pot_ptr;
5375
5376 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5377
5378 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5379
5380 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5381
5382 // do output the line
5383
5384 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5385
5386 if (weak_hash_found == 1) myfree (pot_right_ptr);
5387
5388 if (left_part_masked == 1) myfree (pot_left_ptr);
5389 if (right_part_masked == 1) myfree (pot_right_ptr);
5390 }
5391
5392 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)
5393 {
5394 pot_t pot_key;
5395
5396 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5397
5398 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5399
5400 if (pot_ptr == NULL)
5401 {
5402 log_info_nn ("");
5403
5404 input_buf[input_len] = 0;
5405
5406 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5407 }
5408 }
5409
5410 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)
5411 {
5412 // left
5413
5414 pot_t pot_left_key;
5415
5416 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5417
5418 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5419
5420 // right
5421
5422 pot_t pot_right_key;
5423
5424 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5425
5426 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5427
5428 uint weak_hash_found = 0;
5429
5430 if (pot_right_ptr == NULL)
5431 {
5432 // special case, if "weak hash"
5433
5434 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5435 {
5436 weak_hash_found = 1;
5437
5438 // we just need that pot_right_ptr is not a NULL pointer
5439
5440 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5441 }
5442 }
5443
5444 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5445 {
5446 if (weak_hash_found == 1) myfree (pot_right_ptr);
5447
5448 return;
5449 }
5450
5451 // ... at least one part was not cracked
5452
5453 log_info_nn ("");
5454
5455 input_buf[input_len] = 0;
5456
5457 // only show the hash part which is still not cracked
5458
5459 uint user_len = input_len - 32;
5460
5461 char *hash_output = (char *) mymalloc (33);
5462
5463 memcpy (hash_output, input_buf, input_len);
5464
5465 if (pot_left_ptr != NULL)
5466 {
5467 // only show right part (because left part was already found)
5468
5469 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5470
5471 hash_output[user_len + 16] = 0;
5472 }
5473
5474 if (pot_right_ptr != NULL)
5475 {
5476 // only show left part (because right part was already found)
5477
5478 memcpy (hash_output + user_len, input_buf + user_len, 16);
5479
5480 hash_output[user_len + 16] = 0;
5481 }
5482
5483 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5484
5485 myfree (hash_output);
5486
5487 if (weak_hash_found == 1) myfree (pot_right_ptr);
5488 }
5489
5490 uint setup_opencl_platforms_filter (char *opencl_platforms)
5491 {
5492 uint opencl_platforms_filter = 0;
5493
5494 if (opencl_platforms)
5495 {
5496 char *platforms = strdup (opencl_platforms);
5497
5498 char *next = strtok (platforms, ",");
5499
5500 do
5501 {
5502 int platform = atoi (next);
5503
5504 if (platform < 1 || platform > 32)
5505 {
5506 log_error ("ERROR: Invalid OpenCL platform %u specified", platform);
5507
5508 exit (-1);
5509 }
5510
5511 opencl_platforms_filter |= 1u << (platform - 1);
5512
5513 } while ((next = strtok (NULL, ",")) != NULL);
5514
5515 free (platforms);
5516 }
5517 else
5518 {
5519 opencl_platforms_filter = -1;
5520 }
5521
5522 return opencl_platforms_filter;
5523 }
5524
5525 u32 setup_devices_filter (char *opencl_devices)
5526 {
5527 u32 devices_filter = 0;
5528
5529 if (opencl_devices)
5530 {
5531 char *devices = strdup (opencl_devices);
5532
5533 char *next = strtok (devices, ",");
5534
5535 do
5536 {
5537 int device_id = atoi (next);
5538
5539 if (device_id < 1 || device_id > 32)
5540 {
5541 log_error ("ERROR: Invalid device_id %u specified", device_id);
5542
5543 exit (-1);
5544 }
5545
5546 devices_filter |= 1u << (device_id - 1);
5547
5548 } while ((next = strtok (NULL, ",")) != NULL);
5549
5550 free (devices);
5551 }
5552 else
5553 {
5554 devices_filter = -1;
5555 }
5556
5557 return devices_filter;
5558 }
5559
5560 cl_device_type setup_device_types_filter (char *opencl_device_types)
5561 {
5562 cl_device_type device_types_filter = 0;
5563
5564 if (opencl_device_types)
5565 {
5566 char *device_types = strdup (opencl_device_types);
5567
5568 char *next = strtok (device_types, ",");
5569
5570 do
5571 {
5572 int device_type = atoi (next);
5573
5574 if (device_type < 1 || device_type > 3)
5575 {
5576 log_error ("ERROR: Invalid device_type %u specified", device_type);
5577
5578 exit (-1);
5579 }
5580
5581 device_types_filter |= 1u << device_type;
5582
5583 } while ((next = strtok (NULL, ",")) != NULL);
5584
5585 free (device_types);
5586 }
5587 else
5588 {
5589 // Do not use CPU by default, this often reduces GPU performance because
5590 // the CPU is too busy to handle GPU synchronization
5591
5592 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5593 }
5594
5595 return device_types_filter;
5596 }
5597
5598 u32 get_random_num (const u32 min, const u32 max)
5599 {
5600 if (min == max) return (min);
5601
5602 return ((rand () % (max - min)) + min);
5603 }
5604
5605 u32 mydivc32 (const u32 dividend, const u32 divisor)
5606 {
5607 u32 quotient = dividend / divisor;
5608
5609 if (dividend % divisor) quotient++;
5610
5611 return quotient;
5612 }
5613
5614 u64 mydivc64 (const u64 dividend, const u64 divisor)
5615 {
5616 u64 quotient = dividend / divisor;
5617
5618 if (dividend % divisor) quotient++;
5619
5620 return quotient;
5621 }
5622
5623 void format_timer_display (struct tm *tm, char *buf, size_t len)
5624 {
5625 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5626 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5627
5628 if (tm->tm_year - 70)
5629 {
5630 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5631 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5632
5633 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5634 }
5635 else if (tm->tm_yday)
5636 {
5637 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5638 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5639
5640 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5641 }
5642 else if (tm->tm_hour)
5643 {
5644 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5645 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5646
5647 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5648 }
5649 else if (tm->tm_min)
5650 {
5651 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5652 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5653
5654 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5655 }
5656 else
5657 {
5658 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5659
5660 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5661 }
5662 }
5663
5664 void format_speed_display (float val, char *buf, size_t len)
5665 {
5666 if (val <= 0)
5667 {
5668 buf[0] = '0';
5669 buf[1] = ' ';
5670 buf[2] = 0;
5671
5672 return;
5673 }
5674
5675 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5676
5677 uint level = 0;
5678
5679 while (val > 99999)
5680 {
5681 val /= 1000;
5682
5683 level++;
5684 }
5685
5686 /* generate output */
5687
5688 if (level == 0)
5689 {
5690 snprintf (buf, len - 1, "%.0f ", val);
5691 }
5692 else
5693 {
5694 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5695 }
5696 }
5697
5698 void lowercase (u8 *buf, int len)
5699 {
5700 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5701 }
5702
5703 void uppercase (u8 *buf, int len)
5704 {
5705 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5706 }
5707
5708 int fgetl (FILE *fp, char *line_buf)
5709 {
5710 int line_len = 0;
5711
5712 while (!feof (fp))
5713 {
5714 const int c = fgetc (fp);
5715
5716 if (c == EOF) break;
5717
5718 line_buf[line_len] = (char) c;
5719
5720 line_len++;
5721
5722 if (line_len == HCBUFSIZ) line_len--;
5723
5724 if (c == '\n') break;
5725 }
5726
5727 if (line_len == 0) return 0;
5728
5729 if (line_buf[line_len - 1] == '\n')
5730 {
5731 line_len--;
5732
5733 line_buf[line_len] = 0;
5734 }
5735
5736 if (line_len == 0) return 0;
5737
5738 if (line_buf[line_len - 1] == '\r')
5739 {
5740 line_len--;
5741
5742 line_buf[line_len] = 0;
5743 }
5744
5745 return (line_len);
5746 }
5747
5748 int in_superchop (char *buf)
5749 {
5750 int len = strlen (buf);
5751
5752 while (len)
5753 {
5754 if (buf[len - 1] == '\n')
5755 {
5756 len--;
5757
5758 continue;
5759 }
5760
5761 if (buf[len - 1] == '\r')
5762 {
5763 len--;
5764
5765 continue;
5766 }
5767
5768 break;
5769 }
5770
5771 buf[len] = 0;
5772
5773 return len;
5774 }
5775
5776 char **scan_directory (const char *path)
5777 {
5778 char *tmp_path = mystrdup (path);
5779
5780 size_t tmp_path_len = strlen (tmp_path);
5781
5782 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5783 {
5784 tmp_path[tmp_path_len - 1] = 0;
5785
5786 tmp_path_len = strlen (tmp_path);
5787 }
5788
5789 char **files = NULL;
5790
5791 int num_files = 0;
5792
5793 DIR *d = NULL;
5794
5795 if ((d = opendir (tmp_path)) != NULL)
5796 {
5797 #ifdef __APPLE__
5798
5799 struct dirent e;
5800
5801 for (;;)
5802 {
5803 memset (&e, 0, sizeof (e));
5804
5805 struct dirent *de = NULL;
5806
5807 if (readdir_r (d, &e, &de) != 0)
5808 {
5809 log_error ("ERROR: readdir_r() failed");
5810
5811 break;
5812 }
5813
5814 if (de == NULL) break;
5815
5816 #else
5817
5818 struct dirent *de;
5819
5820 while ((de = readdir (d)) != NULL)
5821 {
5822
5823 #endif
5824
5825 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5826
5827 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5828
5829 char *path_file = (char *) mymalloc (path_size + 1);
5830
5831 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5832
5833 path_file[path_size] = 0;
5834
5835 DIR *d_test;
5836
5837 if ((d_test = opendir (path_file)) != NULL)
5838 {
5839 closedir (d_test);
5840
5841 myfree (path_file);
5842 }
5843 else
5844 {
5845 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5846
5847 num_files++;
5848
5849 files[num_files - 1] = path_file;
5850 }
5851 }
5852
5853 closedir (d);
5854 }
5855 else if (errno == ENOTDIR)
5856 {
5857 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5858
5859 num_files++;
5860
5861 files[num_files - 1] = mystrdup (path);
5862 }
5863
5864 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5865
5866 num_files++;
5867
5868 files[num_files - 1] = NULL;
5869
5870 myfree (tmp_path);
5871
5872 return (files);
5873 }
5874
5875 int count_dictionaries (char **dictionary_files)
5876 {
5877 if (dictionary_files == NULL) return 0;
5878
5879 int cnt = 0;
5880
5881 for (int d = 0; dictionary_files[d] != NULL; d++)
5882 {
5883 cnt++;
5884 }
5885
5886 return (cnt);
5887 }
5888
5889 char *stroptitype (const uint opti_type)
5890 {
5891 switch (opti_type)
5892 {
5893 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5894 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5895 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5896 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5897 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5898 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5899 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5900 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5901 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5902 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5903 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5904 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5905 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5906 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5907 case OPTI_TYPE_SLOW_HASH_SIMD: return ((char *) OPTI_STR_SLOW_HASH_SIMD); break;
5908 case OPTI_TYPE_USES_BITS_8: return ((char *) OPTI_STR_USES_BITS_8); break;
5909 case OPTI_TYPE_USES_BITS_16: return ((char *) OPTI_STR_USES_BITS_16); break;
5910 case OPTI_TYPE_USES_BITS_32: return ((char *) OPTI_STR_USES_BITS_32); break;
5911 case OPTI_TYPE_USES_BITS_64: return ((char *) OPTI_STR_USES_BITS_64); break;
5912 }
5913
5914 return (NULL);
5915 }
5916
5917 char *strparser (const uint parser_status)
5918 {
5919 switch (parser_status)
5920 {
5921 case PARSER_OK: return ((char *) PA_000); break;
5922 case PARSER_COMMENT: return ((char *) PA_001); break;
5923 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5924 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5925 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5926 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5927 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5928 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5929 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5930 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5931 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5932 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5933 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5934 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5935 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5936 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5937 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5938 }
5939
5940 return ((char *) PA_255);
5941 }
5942
5943 char *strhashtype (const uint hash_mode)
5944 {
5945 switch (hash_mode)
5946 {
5947 case 0: return ((char *) HT_00000); break;
5948 case 10: return ((char *) HT_00010); break;
5949 case 11: return ((char *) HT_00011); break;
5950 case 12: return ((char *) HT_00012); break;
5951 case 20: return ((char *) HT_00020); break;
5952 case 21: return ((char *) HT_00021); break;
5953 case 22: return ((char *) HT_00022); break;
5954 case 23: return ((char *) HT_00023); break;
5955 case 30: return ((char *) HT_00030); break;
5956 case 40: return ((char *) HT_00040); break;
5957 case 50: return ((char *) HT_00050); break;
5958 case 60: return ((char *) HT_00060); break;
5959 case 100: return ((char *) HT_00100); break;
5960 case 101: return ((char *) HT_00101); break;
5961 case 110: return ((char *) HT_00110); break;
5962 case 111: return ((char *) HT_00111); break;
5963 case 112: return ((char *) HT_00112); break;
5964 case 120: return ((char *) HT_00120); break;
5965 case 121: return ((char *) HT_00121); break;
5966 case 122: return ((char *) HT_00122); break;
5967 case 124: return ((char *) HT_00124); break;
5968 case 125: return ((char *) HT_00125); break;
5969 case 130: return ((char *) HT_00130); break;
5970 case 131: return ((char *) HT_00131); break;
5971 case 132: return ((char *) HT_00132); break;
5972 case 133: return ((char *) HT_00133); break;
5973 case 140: return ((char *) HT_00140); break;
5974 case 141: return ((char *) HT_00141); break;
5975 case 150: return ((char *) HT_00150); break;
5976 case 160: return ((char *) HT_00160); break;
5977 case 200: return ((char *) HT_00200); break;
5978 case 300: return ((char *) HT_00300); break;
5979 case 400: return ((char *) HT_00400); break;
5980 case 500: return ((char *) HT_00500); break;
5981 case 501: return ((char *) HT_00501); break;
5982 case 900: return ((char *) HT_00900); break;
5983 case 910: return ((char *) HT_00910); break;
5984 case 1000: return ((char *) HT_01000); break;
5985 case 1100: return ((char *) HT_01100); break;
5986 case 1400: return ((char *) HT_01400); break;
5987 case 1410: return ((char *) HT_01410); break;
5988 case 1420: return ((char *) HT_01420); break;
5989 case 1421: return ((char *) HT_01421); break;
5990 case 1430: return ((char *) HT_01430); break;
5991 case 1440: return ((char *) HT_01440); break;
5992 case 1441: return ((char *) HT_01441); break;
5993 case 1450: return ((char *) HT_01450); break;
5994 case 1460: return ((char *) HT_01460); break;
5995 case 1500: return ((char *) HT_01500); break;
5996 case 1600: return ((char *) HT_01600); break;
5997 case 1700: return ((char *) HT_01700); break;
5998 case 1710: return ((char *) HT_01710); break;
5999 case 1711: return ((char *) HT_01711); break;
6000 case 1720: return ((char *) HT_01720); break;
6001 case 1722: return ((char *) HT_01722); break;
6002 case 1730: return ((char *) HT_01730); break;
6003 case 1731: return ((char *) HT_01731); break;
6004 case 1740: return ((char *) HT_01740); break;
6005 case 1750: return ((char *) HT_01750); break;
6006 case 1760: return ((char *) HT_01760); break;
6007 case 1800: return ((char *) HT_01800); break;
6008 case 2100: return ((char *) HT_02100); break;
6009 case 2400: return ((char *) HT_02400); break;
6010 case 2410: return ((char *) HT_02410); break;
6011 case 2500: return ((char *) HT_02500); break;
6012 case 2600: return ((char *) HT_02600); break;
6013 case 2611: return ((char *) HT_02611); break;
6014 case 2612: return ((char *) HT_02612); break;
6015 case 2711: return ((char *) HT_02711); break;
6016 case 2811: return ((char *) HT_02811); break;
6017 case 3000: return ((char *) HT_03000); break;
6018 case 3100: return ((char *) HT_03100); break;
6019 case 3200: return ((char *) HT_03200); break;
6020 case 3710: return ((char *) HT_03710); break;
6021 case 3711: return ((char *) HT_03711); break;
6022 case 3800: return ((char *) HT_03800); break;
6023 case 4300: return ((char *) HT_04300); break;
6024 case 4400: return ((char *) HT_04400); break;
6025 case 4500: return ((char *) HT_04500); break;
6026 case 4700: return ((char *) HT_04700); break;
6027 case 4800: return ((char *) HT_04800); break;
6028 case 4900: return ((char *) HT_04900); break;
6029 case 5000: return ((char *) HT_05000); break;
6030 case 5100: return ((char *) HT_05100); break;
6031 case 5200: return ((char *) HT_05200); break;
6032 case 5300: return ((char *) HT_05300); break;
6033 case 5400: return ((char *) HT_05400); break;
6034 case 5500: return ((char *) HT_05500); break;
6035 case 5600: return ((char *) HT_05600); break;
6036 case 5700: return ((char *) HT_05700); break;
6037 case 5800: return ((char *) HT_05800); break;
6038 case 6000: return ((char *) HT_06000); break;
6039 case 6100: return ((char *) HT_06100); break;
6040 case 6211: return ((char *) HT_06211); break;
6041 case 6212: return ((char *) HT_06212); break;
6042 case 6213: return ((char *) HT_06213); break;
6043 case 6221: return ((char *) HT_06221); break;
6044 case 6222: return ((char *) HT_06222); break;
6045 case 6223: return ((char *) HT_06223); break;
6046 case 6231: return ((char *) HT_06231); break;
6047 case 6232: return ((char *) HT_06232); break;
6048 case 6233: return ((char *) HT_06233); break;
6049 case 6241: return ((char *) HT_06241); break;
6050 case 6242: return ((char *) HT_06242); break;
6051 case 6243: return ((char *) HT_06243); break;
6052 case 6300: return ((char *) HT_06300); break;
6053 case 6400: return ((char *) HT_06400); break;
6054 case 6500: return ((char *) HT_06500); break;
6055 case 6600: return ((char *) HT_06600); break;
6056 case 6700: return ((char *) HT_06700); break;
6057 case 6800: return ((char *) HT_06800); break;
6058 case 6900: return ((char *) HT_06900); break;
6059 case 7100: return ((char *) HT_07100); break;
6060 case 7200: return ((char *) HT_07200); break;
6061 case 7300: return ((char *) HT_07300); break;
6062 case 7400: return ((char *) HT_07400); break;
6063 case 7500: return ((char *) HT_07500); break;
6064 case 7600: return ((char *) HT_07600); break;
6065 case 7700: return ((char *) HT_07700); break;
6066 case 7800: return ((char *) HT_07800); break;
6067 case 7900: return ((char *) HT_07900); break;
6068 case 8000: return ((char *) HT_08000); break;
6069 case 8100: return ((char *) HT_08100); break;
6070 case 8200: return ((char *) HT_08200); break;
6071 case 8300: return ((char *) HT_08300); break;
6072 case 8400: return ((char *) HT_08400); break;
6073 case 8500: return ((char *) HT_08500); break;
6074 case 8600: return ((char *) HT_08600); break;
6075 case 8700: return ((char *) HT_08700); break;
6076 case 8800: return ((char *) HT_08800); break;
6077 case 8900: return ((char *) HT_08900); break;
6078 case 9000: return ((char *) HT_09000); break;
6079 case 9100: return ((char *) HT_09100); break;
6080 case 9200: return ((char *) HT_09200); break;
6081 case 9300: return ((char *) HT_09300); break;
6082 case 9400: return ((char *) HT_09400); break;
6083 case 9500: return ((char *) HT_09500); break;
6084 case 9600: return ((char *) HT_09600); break;
6085 case 9700: return ((char *) HT_09700); break;
6086 case 9710: return ((char *) HT_09710); break;
6087 case 9720: return ((char *) HT_09720); break;
6088 case 9800: return ((char *) HT_09800); break;
6089 case 9810: return ((char *) HT_09810); break;
6090 case 9820: return ((char *) HT_09820); break;
6091 case 9900: return ((char *) HT_09900); break;
6092 case 10000: return ((char *) HT_10000); break;
6093 case 10100: return ((char *) HT_10100); break;
6094 case 10200: return ((char *) HT_10200); break;
6095 case 10300: return ((char *) HT_10300); break;
6096 case 10400: return ((char *) HT_10400); break;
6097 case 10410: return ((char *) HT_10410); break;
6098 case 10420: return ((char *) HT_10420); break;
6099 case 10500: return ((char *) HT_10500); break;
6100 case 10600: return ((char *) HT_10600); break;
6101 case 10700: return ((char *) HT_10700); break;
6102 case 10800: return ((char *) HT_10800); break;
6103 case 10900: return ((char *) HT_10900); break;
6104 case 11000: return ((char *) HT_11000); break;
6105 case 11100: return ((char *) HT_11100); break;
6106 case 11200: return ((char *) HT_11200); break;
6107 case 11300: return ((char *) HT_11300); break;
6108 case 11400: return ((char *) HT_11400); break;
6109 case 11500: return ((char *) HT_11500); break;
6110 case 11600: return ((char *) HT_11600); break;
6111 case 11700: return ((char *) HT_11700); break;
6112 case 11800: return ((char *) HT_11800); break;
6113 case 11900: return ((char *) HT_11900); break;
6114 case 12000: return ((char *) HT_12000); break;
6115 case 12100: return ((char *) HT_12100); break;
6116 case 12200: return ((char *) HT_12200); break;
6117 case 12300: return ((char *) HT_12300); break;
6118 case 12400: return ((char *) HT_12400); break;
6119 case 12500: return ((char *) HT_12500); break;
6120 case 12600: return ((char *) HT_12600); break;
6121 case 12700: return ((char *) HT_12700); break;
6122 case 12800: return ((char *) HT_12800); break;
6123 case 12900: return ((char *) HT_12900); break;
6124 case 13000: return ((char *) HT_13000); break;
6125 case 13100: return ((char *) HT_13100); break;
6126 case 13200: return ((char *) HT_13200); break;
6127 case 13300: return ((char *) HT_13300); break;
6128 case 13400: return ((char *) HT_13400); break;
6129 case 13500: return ((char *) HT_13500); break;
6130 case 13600: return ((char *) HT_13600); break;
6131 case 13711: return ((char *) HT_13711); break;
6132 case 13712: return ((char *) HT_13712); break;
6133 case 13713: return ((char *) HT_13713); break;
6134 case 13721: return ((char *) HT_13721); break;
6135 case 13722: return ((char *) HT_13722); break;
6136 case 13723: return ((char *) HT_13723); break;
6137 case 13731: return ((char *) HT_13731); break;
6138 case 13732: return ((char *) HT_13732); break;
6139 case 13733: return ((char *) HT_13733); break;
6140 case 13741: return ((char *) HT_13741); break;
6141 case 13742: return ((char *) HT_13742); break;
6142 case 13743: return ((char *) HT_13743); break;
6143 case 13751: return ((char *) HT_13751); break;
6144 case 13752: return ((char *) HT_13752); break;
6145 case 13753: return ((char *) HT_13753); break;
6146 case 13761: return ((char *) HT_13761); break;
6147 case 13762: return ((char *) HT_13762); break;
6148 case 13763: return ((char *) HT_13763); break;
6149 case 13800: return ((char *) HT_13800); break;
6150 }
6151
6152 return ((char *) "Unknown");
6153 }
6154
6155 char *strstatus (const uint devices_status)
6156 {
6157 switch (devices_status)
6158 {
6159 case STATUS_INIT: return ((char *) ST_0000); break;
6160 case STATUS_STARTING: return ((char *) ST_0001); break;
6161 case STATUS_RUNNING: return ((char *) ST_0002); break;
6162 case STATUS_PAUSED: return ((char *) ST_0003); break;
6163 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
6164 case STATUS_CRACKED: return ((char *) ST_0005); break;
6165 case STATUS_ABORTED: return ((char *) ST_0006); break;
6166 case STATUS_QUIT: return ((char *) ST_0007); break;
6167 case STATUS_BYPASS: return ((char *) ST_0008); break;
6168 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
6169 case STATUS_AUTOTUNE: return ((char *) ST_0010); break;
6170 }
6171
6172 return ((char *) "Unknown");
6173 }
6174
6175 void ascii_digest (char *out_buf, uint salt_pos, uint digest_pos)
6176 {
6177 uint hash_type = data.hash_type;
6178 uint hash_mode = data.hash_mode;
6179 uint salt_type = data.salt_type;
6180 uint opts_type = data.opts_type;
6181 uint opti_type = data.opti_type;
6182 uint dgst_size = data.dgst_size;
6183
6184 char *hashfile = data.hashfile;
6185
6186 uint len = 4096;
6187
6188 u8 datax[256] = { 0 };
6189
6190 u64 *digest_buf64 = (u64 *) datax;
6191 u32 *digest_buf = (u32 *) datax;
6192
6193 char *digests_buf_ptr = (char *) data.digests_buf;
6194
6195 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
6196
6197 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6198 {
6199 uint tt;
6200
6201 switch (hash_type)
6202 {
6203 case HASH_TYPE_DESCRYPT:
6204 FP (digest_buf[1], digest_buf[0], tt);
6205 break;
6206
6207 case HASH_TYPE_DESRACF:
6208 digest_buf[0] = rotl32 (digest_buf[0], 29);
6209 digest_buf[1] = rotl32 (digest_buf[1], 29);
6210
6211 FP (digest_buf[1], digest_buf[0], tt);
6212 break;
6213
6214 case HASH_TYPE_LM:
6215 FP (digest_buf[1], digest_buf[0], tt);
6216 break;
6217
6218 case HASH_TYPE_NETNTLM:
6219 digest_buf[0] = rotl32 (digest_buf[0], 29);
6220 digest_buf[1] = rotl32 (digest_buf[1], 29);
6221 digest_buf[2] = rotl32 (digest_buf[2], 29);
6222 digest_buf[3] = rotl32 (digest_buf[3], 29);
6223
6224 FP (digest_buf[1], digest_buf[0], tt);
6225 FP (digest_buf[3], digest_buf[2], tt);
6226 break;
6227
6228 case HASH_TYPE_BSDICRYPT:
6229 digest_buf[0] = rotl32 (digest_buf[0], 31);
6230 digest_buf[1] = rotl32 (digest_buf[1], 31);
6231
6232 FP (digest_buf[1], digest_buf[0], tt);
6233 break;
6234 }
6235 }
6236
6237 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
6238 {
6239 switch (hash_type)
6240 {
6241 case HASH_TYPE_MD4:
6242 digest_buf[0] += MD4M_A;
6243 digest_buf[1] += MD4M_B;
6244 digest_buf[2] += MD4M_C;
6245 digest_buf[3] += MD4M_D;
6246 break;
6247
6248 case HASH_TYPE_MD5:
6249 digest_buf[0] += MD5M_A;
6250 digest_buf[1] += MD5M_B;
6251 digest_buf[2] += MD5M_C;
6252 digest_buf[3] += MD5M_D;
6253 break;
6254
6255 case HASH_TYPE_SHA1:
6256 digest_buf[0] += SHA1M_A;
6257 digest_buf[1] += SHA1M_B;
6258 digest_buf[2] += SHA1M_C;
6259 digest_buf[3] += SHA1M_D;
6260 digest_buf[4] += SHA1M_E;
6261 break;
6262
6263 case HASH_TYPE_SHA256:
6264 digest_buf[0] += SHA256M_A;
6265 digest_buf[1] += SHA256M_B;
6266 digest_buf[2] += SHA256M_C;
6267 digest_buf[3] += SHA256M_D;
6268 digest_buf[4] += SHA256M_E;
6269 digest_buf[5] += SHA256M_F;
6270 digest_buf[6] += SHA256M_G;
6271 digest_buf[7] += SHA256M_H;
6272 break;
6273
6274 case HASH_TYPE_SHA384:
6275 digest_buf64[0] += SHA384M_A;
6276 digest_buf64[1] += SHA384M_B;
6277 digest_buf64[2] += SHA384M_C;
6278 digest_buf64[3] += SHA384M_D;
6279 digest_buf64[4] += SHA384M_E;
6280 digest_buf64[5] += SHA384M_F;
6281 digest_buf64[6] += 0;
6282 digest_buf64[7] += 0;
6283 break;
6284
6285 case HASH_TYPE_SHA512:
6286 digest_buf64[0] += SHA512M_A;
6287 digest_buf64[1] += SHA512M_B;
6288 digest_buf64[2] += SHA512M_C;
6289 digest_buf64[3] += SHA512M_D;
6290 digest_buf64[4] += SHA512M_E;
6291 digest_buf64[5] += SHA512M_F;
6292 digest_buf64[6] += SHA512M_G;
6293 digest_buf64[7] += SHA512M_H;
6294 break;
6295 }
6296 }
6297
6298 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
6299 {
6300 if (dgst_size == DGST_SIZE_4_2)
6301 {
6302 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6303 }
6304 else if (dgst_size == DGST_SIZE_4_4)
6305 {
6306 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6307 }
6308 else if (dgst_size == DGST_SIZE_4_5)
6309 {
6310 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6311 }
6312 else if (dgst_size == DGST_SIZE_4_6)
6313 {
6314 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6315 }
6316 else if (dgst_size == DGST_SIZE_4_8)
6317 {
6318 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6319 }
6320 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
6321 {
6322 if (hash_type == HASH_TYPE_WHIRLPOOL)
6323 {
6324 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6325 }
6326 else if (hash_type == HASH_TYPE_SHA384)
6327 {
6328 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6329 }
6330 else if (hash_type == HASH_TYPE_SHA512)
6331 {
6332 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6333 }
6334 else if (hash_type == HASH_TYPE_GOST)
6335 {
6336 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6337 }
6338 }
6339 else if (dgst_size == DGST_SIZE_4_64)
6340 {
6341 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6342 }
6343 else if (dgst_size == DGST_SIZE_8_25)
6344 {
6345 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6346 }
6347 }
6348
6349 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
6350 | (data.salt_type == SALT_TYPE_EXTERN)
6351 | (data.salt_type == SALT_TYPE_EMBEDDED));
6352
6353 salt_t salt;
6354
6355 if (isSalted)
6356 {
6357 memset (&salt, 0, sizeof (salt_t));
6358
6359 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
6360
6361 char *ptr = (char *) salt.salt_buf;
6362
6363 uint len = salt.salt_len;
6364
6365 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6366 {
6367 uint tt;
6368
6369 switch (hash_type)
6370 {
6371 case HASH_TYPE_NETNTLM:
6372
6373 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6374 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6375
6376 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6377
6378 break;
6379 }
6380 }
6381
6382 if (opts_type & OPTS_TYPE_ST_UNICODE)
6383 {
6384 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6385 {
6386 ptr[i] = ptr[j];
6387 }
6388
6389 len = len / 2;
6390 }
6391
6392 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6393 {
6394 uint max = salt.salt_len / 4;
6395
6396 if (len % 4) max++;
6397
6398 for (uint i = 0; i < max; i++)
6399 {
6400 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6401 }
6402 }
6403
6404 if (opts_type & OPTS_TYPE_ST_HEX)
6405 {
6406 char tmp[64] = { 0 };
6407
6408 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6409 {
6410 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6411 }
6412
6413 len = len * 2;
6414
6415 memcpy (ptr, tmp, len);
6416 }
6417
6418 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6419
6420 memset (ptr + len, 0, memset_size);
6421
6422 salt.salt_len = len;
6423 }
6424
6425 //
6426 // some modes require special encoding
6427 //
6428
6429 uint out_buf_plain[256] = { 0 };
6430 uint out_buf_salt[256] = { 0 };
6431
6432 char tmp_buf[1024] = { 0 };
6433
6434 char *ptr_plain = (char *) out_buf_plain;
6435 char *ptr_salt = (char *) out_buf_salt;
6436
6437 if (hash_mode == 22)
6438 {
6439 char username[30] = { 0 };
6440
6441 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6442
6443 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6444
6445 u16 *ptr = (u16 *) digest_buf;
6446
6447 tmp_buf[ 0] = sig[0];
6448 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6449 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6450 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6451 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6452 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6453 tmp_buf[ 6] = sig[1];
6454 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6455 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6456 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6457 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6458 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6459 tmp_buf[12] = sig[2];
6460 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6461 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6462 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6463 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6464 tmp_buf[17] = sig[3];
6465 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6466 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6467 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6468 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6469 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6470 tmp_buf[23] = sig[4];
6471 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6472 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6473 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6474 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6475 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6476 tmp_buf[29] = sig[5];
6477
6478 snprintf (out_buf, len-1, "%s:%s",
6479 tmp_buf,
6480 username);
6481 }
6482 else if (hash_mode == 23)
6483 {
6484 // do not show the skyper part in output
6485
6486 char *salt_buf_ptr = (char *) salt.salt_buf;
6487
6488 salt_buf_ptr[salt.salt_len - 8] = 0;
6489
6490 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6491 digest_buf[0],
6492 digest_buf[1],
6493 digest_buf[2],
6494 digest_buf[3],
6495 salt_buf_ptr);
6496 }
6497 else if (hash_mode == 101)
6498 {
6499 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6500
6501 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6502 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6503 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6504 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6505 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6506
6507 memcpy (tmp_buf, digest_buf, 20);
6508
6509 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6510
6511 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6512 }
6513 else if (hash_mode == 111)
6514 {
6515 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6516
6517 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6518 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6519 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6520 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6521 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6522
6523 memcpy (tmp_buf, digest_buf, 20);
6524 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6525
6526 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6527
6528 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6529 }
6530 else if ((hash_mode == 122) || (hash_mode == 125))
6531 {
6532 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6533 (char *) salt.salt_buf,
6534 digest_buf[0],
6535 digest_buf[1],
6536 digest_buf[2],
6537 digest_buf[3],
6538 digest_buf[4]);
6539 }
6540 else if (hash_mode == 124)
6541 {
6542 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6543 (char *) salt.salt_buf,
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 == 131)
6551 {
6552 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6553 (char *) salt.salt_buf,
6554 0, 0, 0, 0, 0,
6555 digest_buf[0],
6556 digest_buf[1],
6557 digest_buf[2],
6558 digest_buf[3],
6559 digest_buf[4]);
6560 }
6561 else if (hash_mode == 132)
6562 {
6563 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6564 (char *) salt.salt_buf,
6565 digest_buf[0],
6566 digest_buf[1],
6567 digest_buf[2],
6568 digest_buf[3],
6569 digest_buf[4]);
6570 }
6571 else if (hash_mode == 133)
6572 {
6573 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6574
6575 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6576 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6577 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6578 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6579 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6580
6581 memcpy (tmp_buf, digest_buf, 20);
6582
6583 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6584
6585 snprintf (out_buf, len-1, "%s", ptr_plain);
6586 }
6587 else if (hash_mode == 141)
6588 {
6589 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6590
6591 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6592
6593 memset (tmp_buf, 0, sizeof (tmp_buf));
6594
6595 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6596
6597 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6598 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6599 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6600 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6601 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6602
6603 memcpy (tmp_buf, digest_buf, 20);
6604
6605 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6606
6607 ptr_plain[27] = 0;
6608
6609 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6610 }
6611 else if (hash_mode == 400)
6612 {
6613 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6614
6615 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6616 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6617 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6618 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6619
6620 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6621
6622 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6623 }
6624 else if (hash_mode == 500)
6625 {
6626 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6627
6628 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6629 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6630 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6631 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6632
6633 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6634
6635 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6636 {
6637 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6638 }
6639 else
6640 {
6641 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6642 }
6643 }
6644 else if (hash_mode == 501)
6645 {
6646 uint digest_idx = salt.digests_offset + digest_pos;
6647
6648 hashinfo_t **hashinfo_ptr = data.hash_info;
6649 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6650
6651 snprintf (out_buf, len-1, "%s", hash_buf);
6652 }
6653 else if (hash_mode == 1421)
6654 {
6655 u8 *salt_ptr = (u8 *) salt.salt_buf;
6656
6657 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6658 salt_ptr[0],
6659 salt_ptr[1],
6660 salt_ptr[2],
6661 salt_ptr[3],
6662 salt_ptr[4],
6663 salt_ptr[5],
6664 digest_buf[0],
6665 digest_buf[1],
6666 digest_buf[2],
6667 digest_buf[3],
6668 digest_buf[4],
6669 digest_buf[5],
6670 digest_buf[6],
6671 digest_buf[7]);
6672 }
6673 else if (hash_mode == 1441)
6674 {
6675 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6676
6677 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6678
6679 memset (tmp_buf, 0, sizeof (tmp_buf));
6680
6681 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6682
6683 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6684 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6685 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6686 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6687 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6688 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6689 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6690 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6691
6692 memcpy (tmp_buf, digest_buf, 32);
6693
6694 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6695
6696 ptr_plain[43] = 0;
6697
6698 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6699 }
6700 else if (hash_mode == 1500)
6701 {
6702 out_buf[0] = salt.salt_sign[0] & 0xff;
6703 out_buf[1] = salt.salt_sign[1] & 0xff;
6704 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6705 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6706 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6707
6708 memset (tmp_buf, 0, sizeof (tmp_buf));
6709
6710 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6711
6712 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6713 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6714
6715 memcpy (tmp_buf, digest_buf, 8);
6716
6717 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6718
6719 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6720
6721 out_buf[13] = 0;
6722 }
6723 else if (hash_mode == 1600)
6724 {
6725 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6726
6727 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6728 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6729 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6730 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6731
6732 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6733
6734 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6735 {
6736 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6737 }
6738 else
6739 {
6740 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6741 }
6742 }
6743 else if (hash_mode == 1711)
6744 {
6745 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6746
6747 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6748 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6749 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6750 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6751 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6752 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6753 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6754 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6755
6756 memcpy (tmp_buf, digest_buf, 64);
6757 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6758
6759 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6760
6761 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6762 }
6763 else if (hash_mode == 1722)
6764 {
6765 uint *ptr = digest_buf;
6766
6767 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6768 (unsigned char *) salt.salt_buf,
6769 ptr[ 1], ptr[ 0],
6770 ptr[ 3], ptr[ 2],
6771 ptr[ 5], ptr[ 4],
6772 ptr[ 7], ptr[ 6],
6773 ptr[ 9], ptr[ 8],
6774 ptr[11], ptr[10],
6775 ptr[13], ptr[12],
6776 ptr[15], ptr[14]);
6777 }
6778 else if (hash_mode == 1731)
6779 {
6780 uint *ptr = digest_buf;
6781
6782 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6783 (unsigned char *) salt.salt_buf,
6784 ptr[ 1], ptr[ 0],
6785 ptr[ 3], ptr[ 2],
6786 ptr[ 5], ptr[ 4],
6787 ptr[ 7], ptr[ 6],
6788 ptr[ 9], ptr[ 8],
6789 ptr[11], ptr[10],
6790 ptr[13], ptr[12],
6791 ptr[15], ptr[14]);
6792 }
6793 else if (hash_mode == 1800)
6794 {
6795 // temp workaround
6796
6797 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6798 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6799 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6800 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6801 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6802 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6803 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6804 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6805
6806 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6807
6808 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6809 {
6810 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6811 }
6812 else
6813 {
6814 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6815 }
6816 }
6817 else if (hash_mode == 2100)
6818 {
6819 uint pos = 0;
6820
6821 snprintf (out_buf + pos, len-1, "%s%i#",
6822 SIGNATURE_DCC2,
6823 salt.salt_iter + 1);
6824
6825 uint signature_len = strlen (out_buf);
6826
6827 pos += signature_len;
6828 len -= signature_len;
6829
6830 char *salt_ptr = (char *) salt.salt_buf;
6831
6832 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6833
6834 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6835 byte_swap_32 (digest_buf[0]),
6836 byte_swap_32 (digest_buf[1]),
6837 byte_swap_32 (digest_buf[2]),
6838 byte_swap_32 (digest_buf[3]));
6839 }
6840 else if ((hash_mode == 2400) || (hash_mode == 2410))
6841 {
6842 memcpy (tmp_buf, digest_buf, 16);
6843
6844 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6845
6846 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6847 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6848 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6849 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6850
6851 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6852 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6853 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6854 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6855
6856 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6857 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6858 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6859 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6860
6861 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6862 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6863 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6864 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6865
6866 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6867 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6868 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6869 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6870
6871 out_buf[16] = 0;
6872 }
6873 else if (hash_mode == 2500)
6874 {
6875 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6876
6877 wpa_t *wpa = &wpas[salt_pos];
6878
6879 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6880 (char *) salt.salt_buf,
6881 wpa->orig_mac1[0],
6882 wpa->orig_mac1[1],
6883 wpa->orig_mac1[2],
6884 wpa->orig_mac1[3],
6885 wpa->orig_mac1[4],
6886 wpa->orig_mac1[5],
6887 wpa->orig_mac2[0],
6888 wpa->orig_mac2[1],
6889 wpa->orig_mac2[2],
6890 wpa->orig_mac2[3],
6891 wpa->orig_mac2[4],
6892 wpa->orig_mac2[5]);
6893 }
6894 else if (hash_mode == 4400)
6895 {
6896 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6897 byte_swap_32 (digest_buf[0]),
6898 byte_swap_32 (digest_buf[1]),
6899 byte_swap_32 (digest_buf[2]),
6900 byte_swap_32 (digest_buf[3]));
6901 }
6902 else if (hash_mode == 4700)
6903 {
6904 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6905 byte_swap_32 (digest_buf[0]),
6906 byte_swap_32 (digest_buf[1]),
6907 byte_swap_32 (digest_buf[2]),
6908 byte_swap_32 (digest_buf[3]),
6909 byte_swap_32 (digest_buf[4]));
6910 }
6911 else if (hash_mode == 4800)
6912 {
6913 u8 chap_id_byte = (u8) salt.salt_buf[4];
6914
6915 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6916 digest_buf[0],
6917 digest_buf[1],
6918 digest_buf[2],
6919 digest_buf[3],
6920 byte_swap_32 (salt.salt_buf[0]),
6921 byte_swap_32 (salt.salt_buf[1]),
6922 byte_swap_32 (salt.salt_buf[2]),
6923 byte_swap_32 (salt.salt_buf[3]),
6924 chap_id_byte);
6925 }
6926 else if (hash_mode == 4900)
6927 {
6928 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6929 byte_swap_32 (digest_buf[0]),
6930 byte_swap_32 (digest_buf[1]),
6931 byte_swap_32 (digest_buf[2]),
6932 byte_swap_32 (digest_buf[3]),
6933 byte_swap_32 (digest_buf[4]));
6934 }
6935 else if (hash_mode == 5100)
6936 {
6937 snprintf (out_buf, len-1, "%08x%08x",
6938 digest_buf[0],
6939 digest_buf[1]);
6940 }
6941 else if (hash_mode == 5200)
6942 {
6943 snprintf (out_buf, len-1, "%s", hashfile);
6944 }
6945 else if (hash_mode == 5300)
6946 {
6947 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6948
6949 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6950
6951 int buf_len = len -1;
6952
6953 // msg_buf
6954
6955 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6956
6957 for (uint i = 0; i < ikepsk_msg_len; i++)
6958 {
6959 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6960 {
6961 snprintf (out_buf, buf_len, ":");
6962
6963 buf_len--;
6964 out_buf++;
6965 }
6966
6967 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6968
6969 buf_len -= 8;
6970 out_buf += 8;
6971 }
6972
6973 // nr_buf
6974
6975 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6976
6977 for (uint i = 0; i < ikepsk_nr_len; i++)
6978 {
6979 if ((i == 0) || (i == 5))
6980 {
6981 snprintf (out_buf, buf_len, ":");
6982
6983 buf_len--;
6984 out_buf++;
6985 }
6986
6987 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6988
6989 buf_len -= 8;
6990 out_buf += 8;
6991 }
6992
6993 // digest_buf
6994
6995 for (uint i = 0; i < 4; i++)
6996 {
6997 if (i == 0)
6998 {
6999 snprintf (out_buf, buf_len, ":");
7000
7001 buf_len--;
7002 out_buf++;
7003 }
7004
7005 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
7006
7007 buf_len -= 8;
7008 out_buf += 8;
7009 }
7010 }
7011 else if (hash_mode == 5400)
7012 {
7013 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
7014
7015 ikepsk_t *ikepsk = &ikepsks[salt_pos];
7016
7017 int buf_len = len -1;
7018
7019 // msg_buf
7020
7021 uint ikepsk_msg_len = ikepsk->msg_len / 4;
7022
7023 for (uint i = 0; i < ikepsk_msg_len; i++)
7024 {
7025 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
7026 {
7027 snprintf (out_buf, buf_len, ":");
7028
7029 buf_len--;
7030 out_buf++;
7031 }
7032
7033 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
7034
7035 buf_len -= 8;
7036 out_buf += 8;
7037 }
7038
7039 // nr_buf
7040
7041 uint ikepsk_nr_len = ikepsk->nr_len / 4;
7042
7043 for (uint i = 0; i < ikepsk_nr_len; i++)
7044 {
7045 if ((i == 0) || (i == 5))
7046 {
7047 snprintf (out_buf, buf_len, ":");
7048
7049 buf_len--;
7050 out_buf++;
7051 }
7052
7053 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
7054
7055 buf_len -= 8;
7056 out_buf += 8;
7057 }
7058
7059 // digest_buf
7060
7061 for (uint i = 0; i < 5; i++)
7062 {
7063 if (i == 0)
7064 {
7065 snprintf (out_buf, buf_len, ":");
7066
7067 buf_len--;
7068 out_buf++;
7069 }
7070
7071 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
7072
7073 buf_len -= 8;
7074 out_buf += 8;
7075 }
7076 }
7077 else if (hash_mode == 5500)
7078 {
7079 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
7080
7081 netntlm_t *netntlm = &netntlms[salt_pos];
7082
7083 char user_buf[64] = { 0 };
7084 char domain_buf[64] = { 0 };
7085 char srvchall_buf[1024] = { 0 };
7086 char clichall_buf[1024] = { 0 };
7087
7088 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
7089 {
7090 char *ptr = (char *) netntlm->userdomain_buf;
7091
7092 user_buf[i] = ptr[j];
7093 }
7094
7095 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
7096 {
7097 char *ptr = (char *) netntlm->userdomain_buf;
7098
7099 domain_buf[i] = ptr[netntlm->user_len + j];
7100 }
7101
7102 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
7103 {
7104 u8 *ptr = (u8 *) netntlm->chall_buf;
7105
7106 sprintf (srvchall_buf + j, "%02x", ptr[i]);
7107 }
7108
7109 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
7110 {
7111 u8 *ptr = (u8 *) netntlm->chall_buf;
7112
7113 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
7114 }
7115
7116 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
7117 user_buf,
7118 domain_buf,
7119 srvchall_buf,
7120 digest_buf[0],
7121 digest_buf[1],
7122 digest_buf[2],
7123 digest_buf[3],
7124 byte_swap_32 (salt.salt_buf_pc[0]),
7125 byte_swap_32 (salt.salt_buf_pc[1]),
7126 clichall_buf);
7127 }
7128 else if (hash_mode == 5600)
7129 {
7130 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
7131
7132 netntlm_t *netntlm = &netntlms[salt_pos];
7133
7134 char user_buf[64] = { 0 };
7135 char domain_buf[64] = { 0 };
7136 char srvchall_buf[1024] = { 0 };
7137 char clichall_buf[1024] = { 0 };
7138
7139 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
7140 {
7141 char *ptr = (char *) netntlm->userdomain_buf;
7142
7143 user_buf[i] = ptr[j];
7144 }
7145
7146 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
7147 {
7148 char *ptr = (char *) netntlm->userdomain_buf;
7149
7150 domain_buf[i] = ptr[netntlm->user_len + j];
7151 }
7152
7153 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
7154 {
7155 u8 *ptr = (u8 *) netntlm->chall_buf;
7156
7157 sprintf (srvchall_buf + j, "%02x", ptr[i]);
7158 }
7159
7160 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
7161 {
7162 u8 *ptr = (u8 *) netntlm->chall_buf;
7163
7164 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
7165 }
7166
7167 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
7168 user_buf,
7169 domain_buf,
7170 srvchall_buf,
7171 digest_buf[0],
7172 digest_buf[1],
7173 digest_buf[2],
7174 digest_buf[3],
7175 clichall_buf);
7176 }
7177 else if (hash_mode == 5700)
7178 {
7179 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7180
7181 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7182 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7183 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7184 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7185 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7186 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7187 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7188 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7189
7190 memcpy (tmp_buf, digest_buf, 32);
7191
7192 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
7193
7194 ptr_plain[43] = 0;
7195
7196 snprintf (out_buf, len-1, "%s", ptr_plain);
7197 }
7198 else if (hash_mode == 5800)
7199 {
7200 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7201 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7202 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7203 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7204 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7205
7206 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
7207 digest_buf[0],
7208 digest_buf[1],
7209 digest_buf[2],
7210 digest_buf[3],
7211 digest_buf[4]);
7212 }
7213 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
7214 {
7215 snprintf (out_buf, len-1, "%s", hashfile);
7216 }
7217 else if (hash_mode == 6300)
7218 {
7219 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7220
7221 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7222 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7223 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7224 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7225
7226 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7227
7228 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7229 }
7230 else if (hash_mode == 6400)
7231 {
7232 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7233
7234 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7235 }
7236 else if (hash_mode == 6500)
7237 {
7238 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7239
7240 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7241 }
7242 else if (hash_mode == 6600)
7243 {
7244 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
7245
7246 agilekey_t *agilekey = &agilekeys[salt_pos];
7247
7248 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7249 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7250
7251 uint buf_len = len - 1;
7252
7253 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
7254 buf_len -= 22;
7255
7256 for (uint i = 0, j = off; i < 1040; i++, j += 2)
7257 {
7258 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
7259
7260 buf_len -= 2;
7261 }
7262 }
7263 else if (hash_mode == 6700)
7264 {
7265 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7266
7267 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7268 }
7269 else if (hash_mode == 6800)
7270 {
7271 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
7272 }
7273 else if (hash_mode == 7100)
7274 {
7275 uint *ptr = digest_buf;
7276
7277 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7278
7279 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7280
7281 uint esalt[8] = { 0 };
7282
7283 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
7284 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
7285 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
7286 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
7287 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
7288 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
7289 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
7290 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
7291
7292 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",
7293 SIGNATURE_SHA512OSX,
7294 salt.salt_iter + 1,
7295 esalt[ 0], esalt[ 1],
7296 esalt[ 2], esalt[ 3],
7297 esalt[ 4], esalt[ 5],
7298 esalt[ 6], esalt[ 7],
7299 ptr [ 1], ptr [ 0],
7300 ptr [ 3], ptr [ 2],
7301 ptr [ 5], ptr [ 4],
7302 ptr [ 7], ptr [ 6],
7303 ptr [ 9], ptr [ 8],
7304 ptr [11], ptr [10],
7305 ptr [13], ptr [12],
7306 ptr [15], ptr [14]);
7307 }
7308 else if (hash_mode == 7200)
7309 {
7310 uint *ptr = digest_buf;
7311
7312 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7313
7314 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7315
7316 uint len_used = 0;
7317
7318 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
7319
7320 len_used = strlen (out_buf);
7321
7322 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
7323
7324 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
7325 {
7326 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
7327 }
7328
7329 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",
7330 ptr [ 1], ptr [ 0],
7331 ptr [ 3], ptr [ 2],
7332 ptr [ 5], ptr [ 4],
7333 ptr [ 7], ptr [ 6],
7334 ptr [ 9], ptr [ 8],
7335 ptr [11], ptr [10],
7336 ptr [13], ptr [12],
7337 ptr [15], ptr [14]);
7338 }
7339 else if (hash_mode == 7300)
7340 {
7341 rakp_t *rakps = (rakp_t *) data.esalts_buf;
7342
7343 rakp_t *rakp = &rakps[salt_pos];
7344
7345 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
7346 {
7347 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
7348 }
7349
7350 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7351 digest_buf[0],
7352 digest_buf[1],
7353 digest_buf[2],
7354 digest_buf[3],
7355 digest_buf[4]);
7356 }
7357 else if (hash_mode == 7400)
7358 {
7359 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7360
7361 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7362 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7363 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7364 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7365 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7366 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7367 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7368 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7369
7370 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7371
7372 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7373 {
7374 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7375 }
7376 else
7377 {
7378 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7379 }
7380 }
7381 else if (hash_mode == 7500)
7382 {
7383 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7384
7385 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7386
7387 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7388 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7389
7390 char data[128] = { 0 };
7391
7392 char *ptr_data = data;
7393
7394 for (uint i = 0; i < 36; i++, ptr_data += 2)
7395 {
7396 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7397 }
7398
7399 for (uint i = 0; i < 16; i++, ptr_data += 2)
7400 {
7401 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7402 }
7403
7404 *ptr_data = 0;
7405
7406 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7407 SIGNATURE_KRB5PA,
7408 (char *) krb5pa->user,
7409 (char *) krb5pa->realm,
7410 (char *) krb5pa->salt,
7411 data);
7412 }
7413 else if (hash_mode == 7700)
7414 {
7415 snprintf (out_buf, len-1, "%s$%08X%08X",
7416 (char *) salt.salt_buf,
7417 digest_buf[0],
7418 digest_buf[1]);
7419 }
7420 else if (hash_mode == 7800)
7421 {
7422 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7423 (char *) salt.salt_buf,
7424 digest_buf[0],
7425 digest_buf[1],
7426 digest_buf[2],
7427 digest_buf[3],
7428 digest_buf[4]);
7429 }
7430 else if (hash_mode == 7900)
7431 {
7432 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7433
7434 // ugly hack start
7435
7436 char *tmp = (char *) salt.salt_buf_pc;
7437
7438 ptr_plain[42] = tmp[0];
7439
7440 // ugly hack end
7441
7442 ptr_plain[43] = 0;
7443
7444 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7445 }
7446 else if (hash_mode == 8000)
7447 {
7448 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7449 (unsigned char *) salt.salt_buf,
7450 digest_buf[0],
7451 digest_buf[1],
7452 digest_buf[2],
7453 digest_buf[3],
7454 digest_buf[4],
7455 digest_buf[5],
7456 digest_buf[6],
7457 digest_buf[7]);
7458 }
7459 else if (hash_mode == 8100)
7460 {
7461 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7462 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7463
7464 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7465 (unsigned char *) salt.salt_buf,
7466 digest_buf[0],
7467 digest_buf[1],
7468 digest_buf[2],
7469 digest_buf[3],
7470 digest_buf[4]);
7471 }
7472 else if (hash_mode == 8200)
7473 {
7474 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7475
7476 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7477
7478 char data_buf[4096] = { 0 };
7479
7480 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7481 {
7482 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7483 }
7484
7485 data_buf[cloudkey->data_len * 2] = 0;
7486
7487 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7488 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7489 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7490 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7491 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7492 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7493 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7494 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7495
7496 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7497 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7498 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7499 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7500
7501 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7502 digest_buf[0],
7503 digest_buf[1],
7504 digest_buf[2],
7505 digest_buf[3],
7506 digest_buf[4],
7507 digest_buf[5],
7508 digest_buf[6],
7509 digest_buf[7],
7510 salt.salt_buf[0],
7511 salt.salt_buf[1],
7512 salt.salt_buf[2],
7513 salt.salt_buf[3],
7514 salt.salt_iter + 1,
7515 data_buf);
7516 }
7517 else if (hash_mode == 8300)
7518 {
7519 char digest_buf_c[34] = { 0 };
7520
7521 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7522 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7523 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7524 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7525 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7526
7527 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7528
7529 digest_buf_c[32] = 0;
7530
7531 // domain
7532
7533 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7534
7535 char domain_buf_c[33] = { 0 };
7536
7537 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7538
7539 for (uint i = 0; i < salt_pc_len; i++)
7540 {
7541 const char next = domain_buf_c[i];
7542
7543 domain_buf_c[i] = '.';
7544
7545 i += next;
7546 }
7547
7548 domain_buf_c[salt_pc_len] = 0;
7549
7550 // final
7551
7552 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7553 }
7554 else if (hash_mode == 8500)
7555 {
7556 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7557 }
7558 else if (hash_mode == 2612)
7559 {
7560 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7561 SIGNATURE_PHPS,
7562 (char *) salt.salt_buf,
7563 digest_buf[0],
7564 digest_buf[1],
7565 digest_buf[2],
7566 digest_buf[3]);
7567 }
7568 else if (hash_mode == 3711)
7569 {
7570 char *salt_ptr = (char *) salt.salt_buf;
7571
7572 salt_ptr[salt.salt_len - 1] = 0;
7573
7574 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7575 SIGNATURE_MEDIAWIKI_B,
7576 salt_ptr,
7577 digest_buf[0],
7578 digest_buf[1],
7579 digest_buf[2],
7580 digest_buf[3]);
7581 }
7582 else if (hash_mode == 8800)
7583 {
7584 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7585
7586 androidfde_t *androidfde = &androidfdes[salt_pos];
7587
7588 char tmp[3073] = { 0 };
7589
7590 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7591 {
7592 sprintf (tmp + j, "%08x", androidfde->data[i]);
7593 }
7594
7595 tmp[3072] = 0;
7596
7597 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7598 SIGNATURE_ANDROIDFDE,
7599 byte_swap_32 (salt.salt_buf[0]),
7600 byte_swap_32 (salt.salt_buf[1]),
7601 byte_swap_32 (salt.salt_buf[2]),
7602 byte_swap_32 (salt.salt_buf[3]),
7603 byte_swap_32 (digest_buf[0]),
7604 byte_swap_32 (digest_buf[1]),
7605 byte_swap_32 (digest_buf[2]),
7606 byte_swap_32 (digest_buf[3]),
7607 tmp);
7608 }
7609 else if (hash_mode == 8900)
7610 {
7611 uint N = salt.scrypt_N;
7612 uint r = salt.scrypt_r;
7613 uint p = salt.scrypt_p;
7614
7615 char base64_salt[32] = { 0 };
7616
7617 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7618
7619 memset (tmp_buf, 0, 46);
7620
7621 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7622 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7623 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7624 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7625 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7626 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7627 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7628 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7629 digest_buf[8] = 0; // needed for base64_encode ()
7630
7631 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7632
7633 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7634 SIGNATURE_SCRYPT,
7635 N,
7636 r,
7637 p,
7638 base64_salt,
7639 tmp_buf);
7640 }
7641 else if (hash_mode == 9000)
7642 {
7643 snprintf (out_buf, len-1, "%s", hashfile);
7644 }
7645 else if (hash_mode == 9200)
7646 {
7647 // salt
7648
7649 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7650
7651 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7652
7653 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7654
7655 // hash
7656
7657 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7658 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7659 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7660 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7661 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7662 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7663 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7664 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7665 digest_buf[8] = 0; // needed for base64_encode ()
7666
7667 char tmp_buf[64] = { 0 };
7668
7669 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7670 tmp_buf[43] = 0; // cut it here
7671
7672 // output
7673
7674 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7675 }
7676 else if (hash_mode == 9300)
7677 {
7678 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7679 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7680 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7681 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7682 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7683 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7684 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7685 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7686 digest_buf[8] = 0; // needed for base64_encode ()
7687
7688 char tmp_buf[64] = { 0 };
7689
7690 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7691 tmp_buf[43] = 0; // cut it here
7692
7693 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7694
7695 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7696 }
7697 else if (hash_mode == 9400)
7698 {
7699 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7700
7701 office2007_t *office2007 = &office2007s[salt_pos];
7702
7703 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7704 SIGNATURE_OFFICE2007,
7705 2007,
7706 20,
7707 office2007->keySize,
7708 16,
7709 salt.salt_buf[0],
7710 salt.salt_buf[1],
7711 salt.salt_buf[2],
7712 salt.salt_buf[3],
7713 office2007->encryptedVerifier[0],
7714 office2007->encryptedVerifier[1],
7715 office2007->encryptedVerifier[2],
7716 office2007->encryptedVerifier[3],
7717 office2007->encryptedVerifierHash[0],
7718 office2007->encryptedVerifierHash[1],
7719 office2007->encryptedVerifierHash[2],
7720 office2007->encryptedVerifierHash[3],
7721 office2007->encryptedVerifierHash[4]);
7722 }
7723 else if (hash_mode == 9500)
7724 {
7725 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7726
7727 office2010_t *office2010 = &office2010s[salt_pos];
7728
7729 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,
7730
7731 salt.salt_buf[0],
7732 salt.salt_buf[1],
7733 salt.salt_buf[2],
7734 salt.salt_buf[3],
7735 office2010->encryptedVerifier[0],
7736 office2010->encryptedVerifier[1],
7737 office2010->encryptedVerifier[2],
7738 office2010->encryptedVerifier[3],
7739 office2010->encryptedVerifierHash[0],
7740 office2010->encryptedVerifierHash[1],
7741 office2010->encryptedVerifierHash[2],
7742 office2010->encryptedVerifierHash[3],
7743 office2010->encryptedVerifierHash[4],
7744 office2010->encryptedVerifierHash[5],
7745 office2010->encryptedVerifierHash[6],
7746 office2010->encryptedVerifierHash[7]);
7747 }
7748 else if (hash_mode == 9600)
7749 {
7750 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7751
7752 office2013_t *office2013 = &office2013s[salt_pos];
7753
7754 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,
7755
7756 salt.salt_buf[0],
7757 salt.salt_buf[1],
7758 salt.salt_buf[2],
7759 salt.salt_buf[3],
7760 office2013->encryptedVerifier[0],
7761 office2013->encryptedVerifier[1],
7762 office2013->encryptedVerifier[2],
7763 office2013->encryptedVerifier[3],
7764 office2013->encryptedVerifierHash[0],
7765 office2013->encryptedVerifierHash[1],
7766 office2013->encryptedVerifierHash[2],
7767 office2013->encryptedVerifierHash[3],
7768 office2013->encryptedVerifierHash[4],
7769 office2013->encryptedVerifierHash[5],
7770 office2013->encryptedVerifierHash[6],
7771 office2013->encryptedVerifierHash[7]);
7772 }
7773 else if (hash_mode == 9700)
7774 {
7775 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7776
7777 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7778
7779 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7780 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7781 byte_swap_32 (salt.salt_buf[0]),
7782 byte_swap_32 (salt.salt_buf[1]),
7783 byte_swap_32 (salt.salt_buf[2]),
7784 byte_swap_32 (salt.salt_buf[3]),
7785 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7786 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7787 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7788 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7789 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7790 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7791 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7792 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7793 }
7794 else if (hash_mode == 9710)
7795 {
7796 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7797
7798 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7799
7800 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7801 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7802 byte_swap_32 (salt.salt_buf[0]),
7803 byte_swap_32 (salt.salt_buf[1]),
7804 byte_swap_32 (salt.salt_buf[2]),
7805 byte_swap_32 (salt.salt_buf[3]),
7806 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7807 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7808 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7809 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7810 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7811 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7812 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7813 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7814 }
7815 else if (hash_mode == 9720)
7816 {
7817 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7818
7819 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7820
7821 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7822
7823 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7824 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7825 byte_swap_32 (salt.salt_buf[0]),
7826 byte_swap_32 (salt.salt_buf[1]),
7827 byte_swap_32 (salt.salt_buf[2]),
7828 byte_swap_32 (salt.salt_buf[3]),
7829 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7830 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7831 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7832 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7833 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7834 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7835 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7836 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7837 rc4key[0],
7838 rc4key[1],
7839 rc4key[2],
7840 rc4key[3],
7841 rc4key[4]);
7842 }
7843 else if (hash_mode == 9800)
7844 {
7845 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7846
7847 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7848
7849 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7850 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7851 salt.salt_buf[0],
7852 salt.salt_buf[1],
7853 salt.salt_buf[2],
7854 salt.salt_buf[3],
7855 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7856 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7857 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7858 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7859 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7860 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7861 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7862 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7863 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7864 }
7865 else if (hash_mode == 9810)
7866 {
7867 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7868
7869 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7870
7871 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7872 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7873 salt.salt_buf[0],
7874 salt.salt_buf[1],
7875 salt.salt_buf[2],
7876 salt.salt_buf[3],
7877 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7878 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7879 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7880 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7881 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7882 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7883 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7884 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7885 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7886 }
7887 else if (hash_mode == 9820)
7888 {
7889 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7890
7891 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7892
7893 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7894
7895 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7896 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7897 salt.salt_buf[0],
7898 salt.salt_buf[1],
7899 salt.salt_buf[2],
7900 salt.salt_buf[3],
7901 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7902 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7903 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7904 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7905 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7906 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7907 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7908 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7909 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7910 rc4key[0],
7911 rc4key[1],
7912 rc4key[2],
7913 rc4key[3],
7914 rc4key[4]);
7915 }
7916 else if (hash_mode == 10000)
7917 {
7918 // salt
7919
7920 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7921
7922 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7923
7924 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7925
7926 // hash
7927
7928 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7929 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7930 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7931 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7932 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7933 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7934 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7935 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7936 digest_buf[8] = 0; // needed for base64_encode ()
7937
7938 char tmp_buf[64] = { 0 };
7939
7940 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7941
7942 // output
7943
7944 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7945 }
7946 else if (hash_mode == 10100)
7947 {
7948 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7949 digest_buf[0],
7950 digest_buf[1],
7951 2,
7952 4,
7953 byte_swap_32 (salt.salt_buf[0]),
7954 byte_swap_32 (salt.salt_buf[1]),
7955 byte_swap_32 (salt.salt_buf[2]),
7956 byte_swap_32 (salt.salt_buf[3]));
7957 }
7958 else if (hash_mode == 10200)
7959 {
7960 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7961
7962 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7963
7964 // challenge
7965
7966 char challenge[100] = { 0 };
7967
7968 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7969
7970 // response
7971
7972 char tmp_buf[100] = { 0 };
7973
7974 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7975 (char *) cram_md5->user,
7976 digest_buf[0],
7977 digest_buf[1],
7978 digest_buf[2],
7979 digest_buf[3]);
7980
7981 char response[100] = { 0 };
7982
7983 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7984
7985 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7986 }
7987 else if (hash_mode == 10300)
7988 {
7989 char tmp_buf[100] = { 0 };
7990
7991 memcpy (tmp_buf + 0, digest_buf, 20);
7992 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7993
7994 uint tmp_len = 20 + salt.salt_len;
7995
7996 // base64 encode it
7997
7998 char base64_encoded[100] = { 0 };
7999
8000 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
8001
8002 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
8003 }
8004 else if (hash_mode == 10400)
8005 {
8006 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
8007
8008 pdf_t *pdf = &pdfs[salt_pos];
8009
8010 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",
8011
8012 pdf->V,
8013 pdf->R,
8014 40,
8015 pdf->P,
8016 pdf->enc_md,
8017 pdf->id_len,
8018 byte_swap_32 (pdf->id_buf[0]),
8019 byte_swap_32 (pdf->id_buf[1]),
8020 byte_swap_32 (pdf->id_buf[2]),
8021 byte_swap_32 (pdf->id_buf[3]),
8022 pdf->u_len,
8023 byte_swap_32 (pdf->u_buf[0]),
8024 byte_swap_32 (pdf->u_buf[1]),
8025 byte_swap_32 (pdf->u_buf[2]),
8026 byte_swap_32 (pdf->u_buf[3]),
8027 byte_swap_32 (pdf->u_buf[4]),
8028 byte_swap_32 (pdf->u_buf[5]),
8029 byte_swap_32 (pdf->u_buf[6]),
8030 byte_swap_32 (pdf->u_buf[7]),
8031 pdf->o_len,
8032 byte_swap_32 (pdf->o_buf[0]),
8033 byte_swap_32 (pdf->o_buf[1]),
8034 byte_swap_32 (pdf->o_buf[2]),
8035 byte_swap_32 (pdf->o_buf[3]),
8036 byte_swap_32 (pdf->o_buf[4]),
8037 byte_swap_32 (pdf->o_buf[5]),
8038 byte_swap_32 (pdf->o_buf[6]),
8039 byte_swap_32 (pdf->o_buf[7])
8040 );
8041 }
8042 else if (hash_mode == 10410)
8043 {
8044 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
8045
8046 pdf_t *pdf = &pdfs[salt_pos];
8047
8048 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",
8049
8050 pdf->V,
8051 pdf->R,
8052 40,
8053 pdf->P,
8054 pdf->enc_md,
8055 pdf->id_len,
8056 byte_swap_32 (pdf->id_buf[0]),
8057 byte_swap_32 (pdf->id_buf[1]),
8058 byte_swap_32 (pdf->id_buf[2]),
8059 byte_swap_32 (pdf->id_buf[3]),
8060 pdf->u_len,
8061 byte_swap_32 (pdf->u_buf[0]),
8062 byte_swap_32 (pdf->u_buf[1]),
8063 byte_swap_32 (pdf->u_buf[2]),
8064 byte_swap_32 (pdf->u_buf[3]),
8065 byte_swap_32 (pdf->u_buf[4]),
8066 byte_swap_32 (pdf->u_buf[5]),
8067 byte_swap_32 (pdf->u_buf[6]),
8068 byte_swap_32 (pdf->u_buf[7]),
8069 pdf->o_len,
8070 byte_swap_32 (pdf->o_buf[0]),
8071 byte_swap_32 (pdf->o_buf[1]),
8072 byte_swap_32 (pdf->o_buf[2]),
8073 byte_swap_32 (pdf->o_buf[3]),
8074 byte_swap_32 (pdf->o_buf[4]),
8075 byte_swap_32 (pdf->o_buf[5]),
8076 byte_swap_32 (pdf->o_buf[6]),
8077 byte_swap_32 (pdf->o_buf[7])
8078 );
8079 }
8080 else if (hash_mode == 10420)
8081 {
8082 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
8083
8084 pdf_t *pdf = &pdfs[salt_pos];
8085
8086 u8 *rc4key = (u8 *) pdf->rc4key;
8087
8088 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",
8089
8090 pdf->V,
8091 pdf->R,
8092 40,
8093 pdf->P,
8094 pdf->enc_md,
8095 pdf->id_len,
8096 byte_swap_32 (pdf->id_buf[0]),
8097 byte_swap_32 (pdf->id_buf[1]),
8098 byte_swap_32 (pdf->id_buf[2]),
8099 byte_swap_32 (pdf->id_buf[3]),
8100 pdf->u_len,
8101 byte_swap_32 (pdf->u_buf[0]),
8102 byte_swap_32 (pdf->u_buf[1]),
8103 byte_swap_32 (pdf->u_buf[2]),
8104 byte_swap_32 (pdf->u_buf[3]),
8105 byte_swap_32 (pdf->u_buf[4]),
8106 byte_swap_32 (pdf->u_buf[5]),
8107 byte_swap_32 (pdf->u_buf[6]),
8108 byte_swap_32 (pdf->u_buf[7]),
8109 pdf->o_len,
8110 byte_swap_32 (pdf->o_buf[0]),
8111 byte_swap_32 (pdf->o_buf[1]),
8112 byte_swap_32 (pdf->o_buf[2]),
8113 byte_swap_32 (pdf->o_buf[3]),
8114 byte_swap_32 (pdf->o_buf[4]),
8115 byte_swap_32 (pdf->o_buf[5]),
8116 byte_swap_32 (pdf->o_buf[6]),
8117 byte_swap_32 (pdf->o_buf[7]),
8118 rc4key[0],
8119 rc4key[1],
8120 rc4key[2],
8121 rc4key[3],
8122 rc4key[4]
8123 );
8124 }
8125 else if (hash_mode == 10500)
8126 {
8127 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
8128
8129 pdf_t *pdf = &pdfs[salt_pos];
8130
8131 if (pdf->id_len == 32)
8132 {
8133 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",
8134
8135 pdf->V,
8136 pdf->R,
8137 128,
8138 pdf->P,
8139 pdf->enc_md,
8140 pdf->id_len,
8141 byte_swap_32 (pdf->id_buf[0]),
8142 byte_swap_32 (pdf->id_buf[1]),
8143 byte_swap_32 (pdf->id_buf[2]),
8144 byte_swap_32 (pdf->id_buf[3]),
8145 byte_swap_32 (pdf->id_buf[4]),
8146 byte_swap_32 (pdf->id_buf[5]),
8147 byte_swap_32 (pdf->id_buf[6]),
8148 byte_swap_32 (pdf->id_buf[7]),
8149 pdf->u_len,
8150 byte_swap_32 (pdf->u_buf[0]),
8151 byte_swap_32 (pdf->u_buf[1]),
8152 byte_swap_32 (pdf->u_buf[2]),
8153 byte_swap_32 (pdf->u_buf[3]),
8154 byte_swap_32 (pdf->u_buf[4]),
8155 byte_swap_32 (pdf->u_buf[5]),
8156 byte_swap_32 (pdf->u_buf[6]),
8157 byte_swap_32 (pdf->u_buf[7]),
8158 pdf->o_len,
8159 byte_swap_32 (pdf->o_buf[0]),
8160 byte_swap_32 (pdf->o_buf[1]),
8161 byte_swap_32 (pdf->o_buf[2]),
8162 byte_swap_32 (pdf->o_buf[3]),
8163 byte_swap_32 (pdf->o_buf[4]),
8164 byte_swap_32 (pdf->o_buf[5]),
8165 byte_swap_32 (pdf->o_buf[6]),
8166 byte_swap_32 (pdf->o_buf[7])
8167 );
8168 }
8169 else
8170 {
8171 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",
8172
8173 pdf->V,
8174 pdf->R,
8175 128,
8176 pdf->P,
8177 pdf->enc_md,
8178 pdf->id_len,
8179 byte_swap_32 (pdf->id_buf[0]),
8180 byte_swap_32 (pdf->id_buf[1]),
8181 byte_swap_32 (pdf->id_buf[2]),
8182 byte_swap_32 (pdf->id_buf[3]),
8183 pdf->u_len,
8184 byte_swap_32 (pdf->u_buf[0]),
8185 byte_swap_32 (pdf->u_buf[1]),
8186 byte_swap_32 (pdf->u_buf[2]),
8187 byte_swap_32 (pdf->u_buf[3]),
8188 byte_swap_32 (pdf->u_buf[4]),
8189 byte_swap_32 (pdf->u_buf[5]),
8190 byte_swap_32 (pdf->u_buf[6]),
8191 byte_swap_32 (pdf->u_buf[7]),
8192 pdf->o_len,
8193 byte_swap_32 (pdf->o_buf[0]),
8194 byte_swap_32 (pdf->o_buf[1]),
8195 byte_swap_32 (pdf->o_buf[2]),
8196 byte_swap_32 (pdf->o_buf[3]),
8197 byte_swap_32 (pdf->o_buf[4]),
8198 byte_swap_32 (pdf->o_buf[5]),
8199 byte_swap_32 (pdf->o_buf[6]),
8200 byte_swap_32 (pdf->o_buf[7])
8201 );
8202 }
8203 }
8204 else if (hash_mode == 10600)
8205 {
8206 uint digest_idx = salt.digests_offset + digest_pos;
8207
8208 hashinfo_t **hashinfo_ptr = data.hash_info;
8209 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8210
8211 snprintf (out_buf, len-1, "%s", hash_buf);
8212 }
8213 else if (hash_mode == 10700)
8214 {
8215 uint digest_idx = salt.digests_offset + digest_pos;
8216
8217 hashinfo_t **hashinfo_ptr = data.hash_info;
8218 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8219
8220 snprintf (out_buf, len-1, "%s", hash_buf);
8221 }
8222 else if (hash_mode == 10900)
8223 {
8224 uint digest_idx = salt.digests_offset + digest_pos;
8225
8226 hashinfo_t **hashinfo_ptr = data.hash_info;
8227 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8228
8229 snprintf (out_buf, len-1, "%s", hash_buf);
8230 }
8231 else if (hash_mode == 11100)
8232 {
8233 u32 salt_challenge = salt.salt_buf[0];
8234
8235 salt_challenge = byte_swap_32 (salt_challenge);
8236
8237 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
8238
8239 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
8240 SIGNATURE_POSTGRESQL_AUTH,
8241 user_name,
8242 salt_challenge,
8243 digest_buf[0],
8244 digest_buf[1],
8245 digest_buf[2],
8246 digest_buf[3]);
8247 }
8248 else if (hash_mode == 11200)
8249 {
8250 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
8251 SIGNATURE_MYSQL_AUTH,
8252 (unsigned char *) salt.salt_buf,
8253 digest_buf[0],
8254 digest_buf[1],
8255 digest_buf[2],
8256 digest_buf[3],
8257 digest_buf[4]);
8258 }
8259 else if (hash_mode == 11300)
8260 {
8261 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
8262
8263 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
8264
8265 const uint cry_master_len = bitcoin_wallet->cry_master_len;
8266 const uint ckey_len = bitcoin_wallet->ckey_len;
8267 const uint public_key_len = bitcoin_wallet->public_key_len;
8268
8269 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
8270 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
8271 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
8272
8273 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
8274 {
8275 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
8276
8277 sprintf (cry_master_buf + j, "%02x", ptr[i]);
8278 }
8279
8280 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
8281 {
8282 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
8283
8284 sprintf (ckey_buf + j, "%02x", ptr[i]);
8285 }
8286
8287 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
8288 {
8289 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
8290
8291 sprintf (public_key_buf + j, "%02x", ptr[i]);
8292 }
8293
8294 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
8295 SIGNATURE_BITCOIN_WALLET,
8296 cry_master_len * 2,
8297 cry_master_buf,
8298 salt.salt_len,
8299 (unsigned char *) salt.salt_buf,
8300 salt.salt_iter + 1,
8301 ckey_len * 2,
8302 ckey_buf,
8303 public_key_len * 2,
8304 public_key_buf
8305 );
8306
8307 free (cry_master_buf);
8308 free (ckey_buf);
8309 free (public_key_buf);
8310 }
8311 else if (hash_mode == 11400)
8312 {
8313 uint digest_idx = salt.digests_offset + digest_pos;
8314
8315 hashinfo_t **hashinfo_ptr = data.hash_info;
8316 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8317
8318 snprintf (out_buf, len-1, "%s", hash_buf);
8319 }
8320 else if (hash_mode == 11600)
8321 {
8322 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
8323
8324 seven_zip_t *seven_zip = &seven_zips[salt_pos];
8325
8326 const uint data_len = seven_zip->data_len;
8327
8328 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
8329
8330 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8331 {
8332 const u8 *ptr = (const u8 *) seven_zip->data_buf;
8333
8334 sprintf (data_buf + j, "%02x", ptr[i]);
8335 }
8336
8337 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
8338 SIGNATURE_SEVEN_ZIP,
8339 0,
8340 salt.salt_sign[0],
8341 0,
8342 (char *) seven_zip->salt_buf,
8343 seven_zip->iv_len,
8344 seven_zip->iv_buf[0],
8345 seven_zip->iv_buf[1],
8346 seven_zip->iv_buf[2],
8347 seven_zip->iv_buf[3],
8348 seven_zip->crc,
8349 seven_zip->data_len,
8350 seven_zip->unpack_size,
8351 data_buf);
8352
8353 free (data_buf);
8354 }
8355 else if (hash_mode == 11700)
8356 {
8357 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8358 digest_buf[0],
8359 digest_buf[1],
8360 digest_buf[2],
8361 digest_buf[3],
8362 digest_buf[4],
8363 digest_buf[5],
8364 digest_buf[6],
8365 digest_buf[7]);
8366 }
8367 else if (hash_mode == 11800)
8368 {
8369 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8370 digest_buf[ 0],
8371 digest_buf[ 1],
8372 digest_buf[ 2],
8373 digest_buf[ 3],
8374 digest_buf[ 4],
8375 digest_buf[ 5],
8376 digest_buf[ 6],
8377 digest_buf[ 7],
8378 digest_buf[ 8],
8379 digest_buf[ 9],
8380 digest_buf[10],
8381 digest_buf[11],
8382 digest_buf[12],
8383 digest_buf[13],
8384 digest_buf[14],
8385 digest_buf[15]);
8386 }
8387 else if (hash_mode == 11900)
8388 {
8389 uint digest_idx = salt.digests_offset + digest_pos;
8390
8391 hashinfo_t **hashinfo_ptr = data.hash_info;
8392 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8393
8394 snprintf (out_buf, len-1, "%s", hash_buf);
8395 }
8396 else if (hash_mode == 12000)
8397 {
8398 uint digest_idx = salt.digests_offset + digest_pos;
8399
8400 hashinfo_t **hashinfo_ptr = data.hash_info;
8401 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8402
8403 snprintf (out_buf, len-1, "%s", hash_buf);
8404 }
8405 else if (hash_mode == 12100)
8406 {
8407 uint digest_idx = salt.digests_offset + digest_pos;
8408
8409 hashinfo_t **hashinfo_ptr = data.hash_info;
8410 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8411
8412 snprintf (out_buf, len-1, "%s", hash_buf);
8413 }
8414 else if (hash_mode == 12200)
8415 {
8416 uint *ptr_digest = digest_buf;
8417 uint *ptr_salt = salt.salt_buf;
8418
8419 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8420 SIGNATURE_ECRYPTFS,
8421 ptr_salt[0],
8422 ptr_salt[1],
8423 ptr_digest[0],
8424 ptr_digest[1]);
8425 }
8426 else if (hash_mode == 12300)
8427 {
8428 uint *ptr_digest = digest_buf;
8429 uint *ptr_salt = salt.salt_buf;
8430
8431 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",
8432 ptr_digest[ 0], ptr_digest[ 1],
8433 ptr_digest[ 2], ptr_digest[ 3],
8434 ptr_digest[ 4], ptr_digest[ 5],
8435 ptr_digest[ 6], ptr_digest[ 7],
8436 ptr_digest[ 8], ptr_digest[ 9],
8437 ptr_digest[10], ptr_digest[11],
8438 ptr_digest[12], ptr_digest[13],
8439 ptr_digest[14], ptr_digest[15],
8440 ptr_salt[0],
8441 ptr_salt[1],
8442 ptr_salt[2],
8443 ptr_salt[3]);
8444 }
8445 else if (hash_mode == 12400)
8446 {
8447 // encode iteration count
8448
8449 char salt_iter[5] = { 0 };
8450
8451 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8452 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8453 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8454 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8455 salt_iter[4] = 0;
8456
8457 // encode salt
8458
8459 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8460 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8461 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8462 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8463 ptr_salt[4] = 0;
8464
8465 // encode digest
8466
8467 memset (tmp_buf, 0, sizeof (tmp_buf));
8468
8469 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8470 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8471
8472 memcpy (tmp_buf, digest_buf, 8);
8473
8474 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8475
8476 ptr_plain[11] = 0;
8477
8478 // fill the resulting buffer
8479
8480 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8481 }
8482 else if (hash_mode == 12500)
8483 {
8484 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8485 SIGNATURE_RAR3,
8486 byte_swap_32 (salt.salt_buf[0]),
8487 byte_swap_32 (salt.salt_buf[1]),
8488 salt.salt_buf[2],
8489 salt.salt_buf[3],
8490 salt.salt_buf[4],
8491 salt.salt_buf[5]);
8492 }
8493 else if (hash_mode == 12600)
8494 {
8495 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8496 digest_buf[0] + salt.salt_buf_pc[0],
8497 digest_buf[1] + salt.salt_buf_pc[1],
8498 digest_buf[2] + salt.salt_buf_pc[2],
8499 digest_buf[3] + salt.salt_buf_pc[3],
8500 digest_buf[4] + salt.salt_buf_pc[4],
8501 digest_buf[5] + salt.salt_buf_pc[5],
8502 digest_buf[6] + salt.salt_buf_pc[6],
8503 digest_buf[7] + salt.salt_buf_pc[7]);
8504 }
8505 else if (hash_mode == 12700)
8506 {
8507 uint digest_idx = salt.digests_offset + digest_pos;
8508
8509 hashinfo_t **hashinfo_ptr = data.hash_info;
8510 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8511
8512 snprintf (out_buf, len-1, "%s", hash_buf);
8513 }
8514 else if (hash_mode == 12800)
8515 {
8516 const u8 *ptr = (const u8 *) salt.salt_buf;
8517
8518 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",
8519 SIGNATURE_MS_DRSR,
8520 ptr[0],
8521 ptr[1],
8522 ptr[2],
8523 ptr[3],
8524 ptr[4],
8525 ptr[5],
8526 ptr[6],
8527 ptr[7],
8528 ptr[8],
8529 ptr[9],
8530 salt.salt_iter + 1,
8531 byte_swap_32 (digest_buf[0]),
8532 byte_swap_32 (digest_buf[1]),
8533 byte_swap_32 (digest_buf[2]),
8534 byte_swap_32 (digest_buf[3]),
8535 byte_swap_32 (digest_buf[4]),
8536 byte_swap_32 (digest_buf[5]),
8537 byte_swap_32 (digest_buf[6]),
8538 byte_swap_32 (digest_buf[7])
8539 );
8540 }
8541 else if (hash_mode == 12900)
8542 {
8543 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",
8544 salt.salt_buf[ 4],
8545 salt.salt_buf[ 5],
8546 salt.salt_buf[ 6],
8547 salt.salt_buf[ 7],
8548 salt.salt_buf[ 8],
8549 salt.salt_buf[ 9],
8550 salt.salt_buf[10],
8551 salt.salt_buf[11],
8552 byte_swap_32 (digest_buf[0]),
8553 byte_swap_32 (digest_buf[1]),
8554 byte_swap_32 (digest_buf[2]),
8555 byte_swap_32 (digest_buf[3]),
8556 byte_swap_32 (digest_buf[4]),
8557 byte_swap_32 (digest_buf[5]),
8558 byte_swap_32 (digest_buf[6]),
8559 byte_swap_32 (digest_buf[7]),
8560 salt.salt_buf[ 0],
8561 salt.salt_buf[ 1],
8562 salt.salt_buf[ 2],
8563 salt.salt_buf[ 3]
8564 );
8565 }
8566 else if (hash_mode == 13000)
8567 {
8568 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8569
8570 rar5_t *rar5 = &rar5s[salt_pos];
8571
8572 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8573 salt.salt_buf[0],
8574 salt.salt_buf[1],
8575 salt.salt_buf[2],
8576 salt.salt_buf[3],
8577 salt.salt_sign[0],
8578 rar5->iv[0],
8579 rar5->iv[1],
8580 rar5->iv[2],
8581 rar5->iv[3],
8582 byte_swap_32 (digest_buf[0]),
8583 byte_swap_32 (digest_buf[1])
8584 );
8585 }
8586 else if (hash_mode == 13100)
8587 {
8588 krb5tgs_t *krb5tgss = (krb5tgs_t *) data.esalts_buf;
8589
8590 krb5tgs_t *krb5tgs = &krb5tgss[salt_pos];
8591
8592 u8 *ptr_checksum = (u8 *) krb5tgs->checksum;
8593 u8 *ptr_edata2 = (u8 *) krb5tgs->edata2;
8594
8595 char data[2560 * 4 * 2] = { 0 };
8596
8597 char *ptr_data = data;
8598
8599 for (uint i = 0; i < 16; i++, ptr_data += 2)
8600 sprintf (ptr_data, "%02x", ptr_checksum[i]);
8601
8602 /* skip '$' */
8603 ptr_data++;
8604
8605 for (uint i = 0; i < krb5tgs->edata2_len; i++, ptr_data += 2)
8606 sprintf (ptr_data, "%02x", ptr_edata2[i]);
8607
8608 snprintf (out_buf, len-1, "%s$%s$%s$%s",
8609 SIGNATURE_KRB5TGS,
8610 (char *) krb5tgs->account_info,
8611 data,
8612 data + 33);
8613 }
8614 else if (hash_mode == 13200)
8615 {
8616 snprintf (out_buf, len-1, "%s*%d*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x",
8617 SIGNATURE_AXCRYPT,
8618 salt.salt_iter,
8619 salt.salt_buf[0],
8620 salt.salt_buf[1],
8621 salt.salt_buf[2],
8622 salt.salt_buf[3],
8623 salt.salt_buf[4],
8624 salt.salt_buf[5],
8625 salt.salt_buf[6],
8626 salt.salt_buf[7],
8627 salt.salt_buf[8],
8628 salt.salt_buf[9]);
8629 }
8630 else if (hash_mode == 13300)
8631 {
8632 snprintf (out_buf, len-1, "%s$%08x%08x%08x%08x",
8633 SIGNATURE_AXCRYPT_SHA1,
8634 digest_buf[0],
8635 digest_buf[1],
8636 digest_buf[2],
8637 digest_buf[3]);
8638 }
8639 else if (hash_mode == 13400)
8640 {
8641 keepass_t *keepasss = (keepass_t *) data.esalts_buf;
8642
8643 keepass_t *keepass = &keepasss[salt_pos];
8644
8645 u32 version = (u32) keepass->version;
8646 u32 rounds = salt.salt_iter;
8647 u32 algorithm = (u32) keepass->algorithm;
8648 u32 keyfile_len = (u32) keepass->keyfile_len;
8649
8650 u32 *ptr_final_random_seed = (u32 *) keepass->final_random_seed ;
8651 u32 *ptr_transf_random_seed = (u32 *) keepass->transf_random_seed ;
8652 u32 *ptr_enc_iv = (u32 *) keepass->enc_iv ;
8653 u32 *ptr_contents_hash = (u32 *) keepass->contents_hash ;
8654 u32 *ptr_keyfile = (u32 *) keepass->keyfile ;
8655
8656 /* specific to version 1 */
8657 u32 contents_len;
8658 u32 *ptr_contents;
8659
8660 /* specific to version 2 */
8661 u32 expected_bytes_len;
8662 u32 *ptr_expected_bytes;
8663
8664 u32 final_random_seed_len;
8665 u32 transf_random_seed_len;
8666 u32 enc_iv_len;
8667 u32 contents_hash_len;
8668
8669 transf_random_seed_len = 8;
8670 enc_iv_len = 4;
8671 contents_hash_len = 8;
8672 final_random_seed_len = 8;
8673
8674 if (version == 1)
8675 final_random_seed_len = 4;
8676
8677 snprintf (out_buf, len-1, "%s*%d*%d*%d",
8678 SIGNATURE_KEEPASS,
8679 version,
8680 rounds,
8681 algorithm);
8682
8683 char *ptr_data = out_buf;
8684
8685 ptr_data += strlen(out_buf);
8686
8687 *ptr_data = '*';
8688 ptr_data++;
8689
8690 for (uint i = 0; i < final_random_seed_len; i++, ptr_data += 8)
8691 sprintf (ptr_data, "%08x", ptr_final_random_seed[i]);
8692
8693 *ptr_data = '*';
8694 ptr_data++;
8695
8696 for (uint i = 0; i < transf_random_seed_len; i++, ptr_data += 8)
8697 sprintf (ptr_data, "%08x", ptr_transf_random_seed[i]);
8698
8699 *ptr_data = '*';
8700 ptr_data++;
8701
8702 for (uint i = 0; i < enc_iv_len; i++, ptr_data += 8)
8703 sprintf (ptr_data, "%08x", ptr_enc_iv[i]);
8704
8705 *ptr_data = '*';
8706 ptr_data++;
8707
8708 if (version == 1)
8709 {
8710 contents_len = (u32) keepass->contents_len;
8711 ptr_contents = (u32 *) keepass->contents;
8712
8713 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8714 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8715
8716 *ptr_data = '*';
8717 ptr_data++;
8718
8719 /* inline flag */
8720 *ptr_data = '1';
8721 ptr_data++;
8722
8723 *ptr_data = '*';
8724 ptr_data++;
8725
8726 char ptr_contents_len[10] = { 0 };
8727
8728 sprintf ((char*) ptr_contents_len, "%d", contents_len);
8729
8730 sprintf (ptr_data, "%d", contents_len);
8731
8732 ptr_data += strlen(ptr_contents_len);
8733
8734 *ptr_data = '*';
8735 ptr_data++;
8736
8737 for (uint i = 0; i < contents_len / 4; i++, ptr_data += 8)
8738 sprintf (ptr_data, "%08x", ptr_contents[i]);
8739 }
8740 else if (version == 2)
8741 {
8742 expected_bytes_len = 8;
8743 ptr_expected_bytes = (u32 *) keepass->expected_bytes ;
8744
8745 for (uint i = 0; i < expected_bytes_len; i++, ptr_data += 8)
8746 sprintf (ptr_data, "%08x", ptr_expected_bytes[i]);
8747
8748 *ptr_data = '*';
8749 ptr_data++;
8750
8751 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8752 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8753 }
8754 if (keyfile_len)
8755 {
8756 *ptr_data = '*';
8757 ptr_data++;
8758
8759 /* inline flag */
8760 *ptr_data = '1';
8761 ptr_data++;
8762
8763 *ptr_data = '*';
8764 ptr_data++;
8765
8766 sprintf (ptr_data, "%d", keyfile_len);
8767
8768 ptr_data += 2;
8769
8770 *ptr_data = '*';
8771 ptr_data++;
8772
8773 for (uint i = 0; i < 8; i++, ptr_data += 8)
8774 sprintf (ptr_data, "%08x", ptr_keyfile[i]);
8775 }
8776 }
8777 else if (hash_mode == 13500)
8778 {
8779 pstoken_t *pstokens = (pstoken_t *) data.esalts_buf;
8780
8781 pstoken_t *pstoken = &pstokens[salt_pos];
8782
8783 const u32 salt_len = (pstoken->salt_len > 512) ? 512 : pstoken->salt_len;
8784
8785 char pstoken_tmp[1024 + 1] = { 0 };
8786
8787 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8788 {
8789 const u8 *ptr = (const u8 *) pstoken->salt_buf;
8790
8791 sprintf (pstoken_tmp + j, "%02x", ptr[i]);
8792 }
8793
8794 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x:%s",
8795 digest_buf[0],
8796 digest_buf[1],
8797 digest_buf[2],
8798 digest_buf[3],
8799 digest_buf[4],
8800 pstoken_tmp);
8801 }
8802 else if (hash_mode == 13600)
8803 {
8804 zip2_t *zip2s = (zip2_t *) data.esalts_buf;
8805
8806 zip2_t *zip2 = &zip2s[salt_pos];
8807
8808 const u32 salt_len = zip2->salt_len;
8809
8810 char salt_tmp[32 + 1] = { 0 };
8811
8812 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8813 {
8814 const u8 *ptr = (const u8 *) zip2->salt_buf;
8815
8816 sprintf (salt_tmp + j, "%02x", ptr[i]);
8817 }
8818
8819 const u32 data_len = zip2->data_len;
8820
8821 char data_tmp[8192 + 1] = { 0 };
8822
8823 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8824 {
8825 const u8 *ptr = (const u8 *) zip2->data_buf;
8826
8827 sprintf (data_tmp + j, "%02x", ptr[i]);
8828 }
8829
8830 const u32 auth_len = zip2->auth_len;
8831
8832 char auth_tmp[20 + 1] = { 0 };
8833
8834 for (uint i = 0, j = 0; i < auth_len; i += 1, j += 2)
8835 {
8836 const u8 *ptr = (const u8 *) zip2->auth_buf;
8837
8838 sprintf (auth_tmp + j, "%02x", ptr[i]);
8839 }
8840
8841 snprintf (out_buf, 255, "%s*%u*%u*%u*%s*%x*%u*%s*%s*%s",
8842 SIGNATURE_ZIP2_START,
8843 zip2->type,
8844 zip2->mode,
8845 zip2->magic,
8846 salt_tmp,
8847 zip2->verify_bytes,
8848 zip2->compress_length,
8849 data_tmp,
8850 auth_tmp,
8851 SIGNATURE_ZIP2_STOP);
8852 }
8853 else if ((hash_mode >= 13700) && (hash_mode <= 13799))
8854 {
8855 snprintf (out_buf, len-1, "%s", hashfile);
8856 }
8857 else if (hash_mode == 13800)
8858 {
8859 win8phone_t *esalts = (win8phone_t *) data.esalts_buf;
8860
8861 win8phone_t *esalt = &esalts[salt_pos];
8862
8863 char buf[256 + 1] = { 0 };
8864
8865 for (int i = 0, j = 0; i < 32; i += 1, j += 8)
8866 {
8867 sprintf (buf + j, "%08x", esalt->salt_buf[i]);
8868 }
8869
8870 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%s",
8871 digest_buf[0],
8872 digest_buf[1],
8873 digest_buf[2],
8874 digest_buf[3],
8875 digest_buf[4],
8876 digest_buf[5],
8877 digest_buf[6],
8878 digest_buf[7],
8879 buf);
8880 }
8881 else
8882 {
8883 if (hash_type == HASH_TYPE_MD4)
8884 {
8885 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8886 digest_buf[0],
8887 digest_buf[1],
8888 digest_buf[2],
8889 digest_buf[3]);
8890 }
8891 else if (hash_type == HASH_TYPE_MD5)
8892 {
8893 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8894 digest_buf[0],
8895 digest_buf[1],
8896 digest_buf[2],
8897 digest_buf[3]);
8898 }
8899 else if (hash_type == HASH_TYPE_SHA1)
8900 {
8901 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8902 digest_buf[0],
8903 digest_buf[1],
8904 digest_buf[2],
8905 digest_buf[3],
8906 digest_buf[4]);
8907 }
8908 else if (hash_type == HASH_TYPE_SHA256)
8909 {
8910 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8911 digest_buf[0],
8912 digest_buf[1],
8913 digest_buf[2],
8914 digest_buf[3],
8915 digest_buf[4],
8916 digest_buf[5],
8917 digest_buf[6],
8918 digest_buf[7]);
8919 }
8920 else if (hash_type == HASH_TYPE_SHA384)
8921 {
8922 uint *ptr = digest_buf;
8923
8924 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8925 ptr[ 1], ptr[ 0],
8926 ptr[ 3], ptr[ 2],
8927 ptr[ 5], ptr[ 4],
8928 ptr[ 7], ptr[ 6],
8929 ptr[ 9], ptr[ 8],
8930 ptr[11], ptr[10]);
8931 }
8932 else if (hash_type == HASH_TYPE_SHA512)
8933 {
8934 uint *ptr = digest_buf;
8935
8936 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8937 ptr[ 1], ptr[ 0],
8938 ptr[ 3], ptr[ 2],
8939 ptr[ 5], ptr[ 4],
8940 ptr[ 7], ptr[ 6],
8941 ptr[ 9], ptr[ 8],
8942 ptr[11], ptr[10],
8943 ptr[13], ptr[12],
8944 ptr[15], ptr[14]);
8945 }
8946 else if (hash_type == HASH_TYPE_LM)
8947 {
8948 snprintf (out_buf, len-1, "%08x%08x",
8949 digest_buf[0],
8950 digest_buf[1]);
8951 }
8952 else if (hash_type == HASH_TYPE_ORACLEH)
8953 {
8954 snprintf (out_buf, len-1, "%08X%08X",
8955 digest_buf[0],
8956 digest_buf[1]);
8957 }
8958 else if (hash_type == HASH_TYPE_BCRYPT)
8959 {
8960 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8961 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8962
8963 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8964
8965 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8966 }
8967 else if (hash_type == HASH_TYPE_KECCAK)
8968 {
8969 uint *ptr = digest_buf;
8970
8971 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",
8972 ptr[ 1], ptr[ 0],
8973 ptr[ 3], ptr[ 2],
8974 ptr[ 5], ptr[ 4],
8975 ptr[ 7], ptr[ 6],
8976 ptr[ 9], ptr[ 8],
8977 ptr[11], ptr[10],
8978 ptr[13], ptr[12],
8979 ptr[15], ptr[14],
8980 ptr[17], ptr[16],
8981 ptr[19], ptr[18],
8982 ptr[21], ptr[20],
8983 ptr[23], ptr[22],
8984 ptr[25], ptr[24],
8985 ptr[27], ptr[26],
8986 ptr[29], ptr[28],
8987 ptr[31], ptr[30],
8988 ptr[33], ptr[32],
8989 ptr[35], ptr[34],
8990 ptr[37], ptr[36],
8991 ptr[39], ptr[38],
8992 ptr[41], ptr[30],
8993 ptr[43], ptr[42],
8994 ptr[45], ptr[44],
8995 ptr[47], ptr[46],
8996 ptr[49], ptr[48]
8997 );
8998
8999 out_buf[salt.keccak_mdlen * 2] = 0;
9000 }
9001 else if (hash_type == HASH_TYPE_RIPEMD160)
9002 {
9003 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
9004 digest_buf[0],
9005 digest_buf[1],
9006 digest_buf[2],
9007 digest_buf[3],
9008 digest_buf[4]);
9009 }
9010 else if (hash_type == HASH_TYPE_WHIRLPOOL)
9011 {
9012 digest_buf[ 0] = digest_buf[ 0];
9013 digest_buf[ 1] = digest_buf[ 1];
9014 digest_buf[ 2] = digest_buf[ 2];
9015 digest_buf[ 3] = digest_buf[ 3];
9016 digest_buf[ 4] = digest_buf[ 4];
9017 digest_buf[ 5] = digest_buf[ 5];
9018 digest_buf[ 6] = digest_buf[ 6];
9019 digest_buf[ 7] = digest_buf[ 7];
9020 digest_buf[ 8] = digest_buf[ 8];
9021 digest_buf[ 9] = digest_buf[ 9];
9022 digest_buf[10] = digest_buf[10];
9023 digest_buf[11] = digest_buf[11];
9024 digest_buf[12] = digest_buf[12];
9025 digest_buf[13] = digest_buf[13];
9026 digest_buf[14] = digest_buf[14];
9027 digest_buf[15] = digest_buf[15];
9028
9029 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
9030 digest_buf[ 0],
9031 digest_buf[ 1],
9032 digest_buf[ 2],
9033 digest_buf[ 3],
9034 digest_buf[ 4],
9035 digest_buf[ 5],
9036 digest_buf[ 6],
9037 digest_buf[ 7],
9038 digest_buf[ 8],
9039 digest_buf[ 9],
9040 digest_buf[10],
9041 digest_buf[11],
9042 digest_buf[12],
9043 digest_buf[13],
9044 digest_buf[14],
9045 digest_buf[15]);
9046 }
9047 else if (hash_type == HASH_TYPE_GOST)
9048 {
9049 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
9050 digest_buf[0],
9051 digest_buf[1],
9052 digest_buf[2],
9053 digest_buf[3],
9054 digest_buf[4],
9055 digest_buf[5],
9056 digest_buf[6],
9057 digest_buf[7]);
9058 }
9059 else if (hash_type == HASH_TYPE_MYSQL)
9060 {
9061 snprintf (out_buf, len-1, "%08x%08x",
9062 digest_buf[0],
9063 digest_buf[1]);
9064 }
9065 else if (hash_type == HASH_TYPE_LOTUS5)
9066 {
9067 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
9068 digest_buf[0],
9069 digest_buf[1],
9070 digest_buf[2],
9071 digest_buf[3]);
9072 }
9073 else if (hash_type == HASH_TYPE_LOTUS6)
9074 {
9075 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
9076 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
9077 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
9078 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
9079
9080 char buf[16] = { 0 };
9081
9082 memcpy (buf + 0, salt.salt_buf, 5);
9083 memcpy (buf + 5, digest_buf, 9);
9084
9085 buf[3] -= -4;
9086
9087 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
9088
9089 tmp_buf[18] = salt.salt_buf_pc[7];
9090 tmp_buf[19] = 0;
9091
9092 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
9093 }
9094 else if (hash_type == HASH_TYPE_LOTUS8)
9095 {
9096 char buf[52] = { 0 };
9097
9098 // salt
9099
9100 memcpy (buf + 0, salt.salt_buf, 16);
9101
9102 buf[3] -= -4;
9103
9104 // iteration
9105
9106 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
9107
9108 // chars
9109
9110 buf[26] = salt.salt_buf_pc[0];
9111 buf[27] = salt.salt_buf_pc[1];
9112
9113 // digest
9114
9115 memcpy (buf + 28, digest_buf, 8);
9116
9117 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
9118
9119 tmp_buf[49] = 0;
9120
9121 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
9122 }
9123 else if (hash_type == HASH_TYPE_CRC32)
9124 {
9125 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
9126 }
9127 }
9128
9129 if (salt_type == SALT_TYPE_INTERN)
9130 {
9131 size_t pos = strlen (out_buf);
9132
9133 out_buf[pos] = data.separator;
9134
9135 char *ptr = (char *) salt.salt_buf;
9136
9137 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
9138
9139 out_buf[pos + 1 + salt.salt_len] = 0;
9140 }
9141 }
9142
9143 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
9144 {
9145 memset (hccap, 0, sizeof (hccap_t));
9146
9147 salt_t *salt = &data.salts_buf[salt_pos];
9148
9149 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
9150
9151 wpa_t *wpas = (wpa_t *) data.esalts_buf;
9152 wpa_t *wpa = &wpas[salt_pos];
9153
9154 hccap->keyver = wpa->keyver;
9155
9156 hccap->eapol_size = wpa->eapol_size;
9157
9158 if (wpa->keyver != 1)
9159 {
9160 uint eapol_tmp[64] = { 0 };
9161
9162 for (uint i = 0; i < 64; i++)
9163 {
9164 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
9165 }
9166
9167 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
9168 }
9169 else
9170 {
9171 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
9172 }
9173
9174 memcpy (hccap->mac1, wpa->orig_mac1, 6);
9175 memcpy (hccap->mac2, wpa->orig_mac2, 6);
9176 memcpy (hccap->nonce1, wpa->orig_nonce1, 32);
9177 memcpy (hccap->nonce2, wpa->orig_nonce2, 32);
9178
9179 char *digests_buf_ptr = (char *) data.digests_buf;
9180
9181 uint dgst_size = data.dgst_size;
9182
9183 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
9184
9185 if (wpa->keyver != 1)
9186 {
9187 uint digest_tmp[4] = { 0 };
9188
9189 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
9190 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
9191 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
9192 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
9193
9194 memcpy (hccap->keymic, digest_tmp, 16);
9195 }
9196 else
9197 {
9198 memcpy (hccap->keymic, digest_ptr, 16);
9199 }
9200 }
9201
9202 void SuspendThreads ()
9203 {
9204 if (data.devices_status != STATUS_RUNNING) return;
9205
9206 hc_timer_set (&data.timer_paused);
9207
9208 data.devices_status = STATUS_PAUSED;
9209
9210 log_info ("Paused");
9211 }
9212
9213 void ResumeThreads ()
9214 {
9215 if (data.devices_status != STATUS_PAUSED) return;
9216
9217 double ms_paused;
9218
9219 hc_timer_get (data.timer_paused, ms_paused);
9220
9221 data.ms_paused += ms_paused;
9222
9223 data.devices_status = STATUS_RUNNING;
9224
9225 log_info ("Resumed");
9226 }
9227
9228 void bypass ()
9229 {
9230 data.devices_status = STATUS_BYPASS;
9231
9232 log_info ("Next dictionary / mask in queue selected, bypassing current one");
9233 }
9234
9235 void stop_at_checkpoint ()
9236 {
9237 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9238 {
9239 if (data.devices_status != STATUS_RUNNING) return;
9240 }
9241
9242 // this feature only makes sense if --restore-disable was not specified
9243
9244 if (data.restore_disable == 1)
9245 {
9246 log_info ("WARNING: This feature is disabled when --restore-disable is specified");
9247
9248 return;
9249 }
9250
9251 // check if monitoring of Restore Point updates should be enabled or disabled
9252
9253 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9254 {
9255 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
9256
9257 // save the current restore point value
9258
9259 data.checkpoint_cur_words = get_lowest_words_done ();
9260
9261 log_info ("Checkpoint enabled: Will quit at next Restore Point update");
9262 }
9263 else
9264 {
9265 data.devices_status = STATUS_RUNNING;
9266
9267 // reset the global value for checkpoint checks
9268
9269 data.checkpoint_cur_words = 0;
9270
9271 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
9272 }
9273 }
9274
9275 void myabort ()
9276 {
9277 data.devices_status = STATUS_ABORTED;
9278 }
9279
9280 void myquit ()
9281 {
9282 data.devices_status = STATUS_QUIT;
9283 }
9284
9285 void naive_replace (char *s, const u8 key_char, const u8 replace_char)
9286 {
9287 const size_t len = strlen (s);
9288
9289 for (size_t in = 0; in < len; in++)
9290 {
9291 const u8 c = s[in];
9292
9293 if (c == key_char)
9294 {
9295 s[in] = replace_char;
9296 }
9297 }
9298 }
9299
9300 void naive_escape (char *s, size_t s_max, const u8 key_char, const u8 escape_char)
9301 {
9302 char s_escaped[1024] = { 0 };
9303
9304 size_t s_escaped_max = sizeof (s_escaped);
9305
9306 const size_t len = strlen (s);
9307
9308 for (size_t in = 0, out = 0; in < len; in++, out++)
9309 {
9310 const u8 c = s[in];
9311
9312 if (c == key_char)
9313 {
9314 s_escaped[out] = escape_char;
9315
9316 out++;
9317 }
9318
9319 if (out == s_escaped_max - 2) break;
9320
9321 s_escaped[out] = c;
9322 }
9323
9324 strncpy (s, s_escaped, s_max - 1);
9325 }
9326
9327 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
9328 {
9329 FILE *fp = fopen (kernel_file, "rb");
9330
9331 if (fp != NULL)
9332 {
9333 struct stat st;
9334
9335 memset (&st, 0, sizeof (st));
9336
9337 stat (kernel_file, &st);
9338
9339 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
9340
9341 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
9342
9343 if (num_read != (size_t) st.st_size)
9344 {
9345 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9346
9347 exit (-1);
9348 }
9349
9350 fclose (fp);
9351
9352 buf[st.st_size] = 0;
9353
9354 for (int i = 0; i < num_devices; i++)
9355 {
9356 kernel_lengths[i] = (size_t) st.st_size;
9357
9358 kernel_sources[i] = buf;
9359 }
9360 }
9361 else
9362 {
9363 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9364
9365 exit (-1);
9366 }
9367
9368 return;
9369 }
9370
9371 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
9372 {
9373 if (binary_size > 0)
9374 {
9375 FILE *fp = fopen (dst, "wb");
9376
9377 lock_file (fp);
9378 fwrite (binary, sizeof (u8), binary_size, fp);
9379
9380 fflush (fp);
9381 fclose (fp);
9382 }
9383 }
9384
9385 /**
9386 * restore
9387 */
9388
9389 restore_data_t *init_restore (int argc, char **argv)
9390 {
9391 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
9392
9393 if (data.restore_disable == 0)
9394 {
9395 FILE *fp = fopen (data.eff_restore_file, "rb");
9396
9397 if (fp)
9398 {
9399 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
9400
9401 if (nread != 1)
9402 {
9403 log_error ("ERROR: Cannot read %s", data.eff_restore_file);
9404
9405 exit (-1);
9406 }
9407
9408 fclose (fp);
9409
9410 if (rd->pid)
9411 {
9412 char *pidbin = (char *) mymalloc (HCBUFSIZ);
9413
9414 int pidbin_len = -1;
9415
9416 #ifdef _POSIX
9417 snprintf (pidbin, HCBUFSIZ - 1, "/proc/%d/cmdline", rd->pid);
9418
9419 FILE *fd = fopen (pidbin, "rb");
9420
9421 if (fd)
9422 {
9423 pidbin_len = fread (pidbin, 1, HCBUFSIZ, fd);
9424
9425 pidbin[pidbin_len] = 0;
9426
9427 fclose (fd);
9428
9429 char *argv0_r = strrchr (argv[0], '/');
9430
9431 char *pidbin_r = strrchr (pidbin, '/');
9432
9433 if (argv0_r == NULL) argv0_r = argv[0];
9434
9435 if (pidbin_r == NULL) pidbin_r = pidbin;
9436
9437 if (strcmp (argv0_r, pidbin_r) == 0)
9438 {
9439 log_error ("ERROR: Already an instance %s running on pid %d", pidbin, rd->pid);
9440
9441 exit (-1);
9442 }
9443 }
9444
9445 #elif _WIN
9446 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
9447
9448 char *pidbin2 = (char *) mymalloc (HCBUFSIZ);
9449
9450 int pidbin2_len = -1;
9451
9452 pidbin_len = GetModuleFileName (NULL, pidbin, HCBUFSIZ);
9453 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, HCBUFSIZ);
9454
9455 pidbin[pidbin_len] = 0;
9456 pidbin2[pidbin2_len] = 0;
9457
9458 if (pidbin2_len)
9459 {
9460 if (strcmp (pidbin, pidbin2) == 0)
9461 {
9462 log_error ("ERROR: Already an instance %s running on pid %d", pidbin2, rd->pid);
9463
9464 exit (-1);
9465 }
9466 }
9467
9468 myfree (pidbin2);
9469
9470 #endif
9471
9472 myfree (pidbin);
9473 }
9474
9475 if (rd->version_bin < RESTORE_MIN)
9476 {
9477 log_error ("ERROR: Cannot use outdated %s. Please remove it.", data.eff_restore_file);
9478
9479 exit (-1);
9480 }
9481 }
9482 }
9483
9484 memset (rd, 0, sizeof (restore_data_t));
9485
9486 rd->version_bin = VERSION_BIN;
9487
9488 #ifdef _POSIX
9489 rd->pid = getpid ();
9490 #elif _WIN
9491 rd->pid = GetCurrentProcessId ();
9492 #endif
9493
9494 if (getcwd (rd->cwd, 255) == NULL)
9495 {
9496 myfree (rd);
9497
9498 return (NULL);
9499 }
9500
9501 rd->argc = argc;
9502 rd->argv = argv;
9503
9504 return (rd);
9505 }
9506
9507 void read_restore (const char *eff_restore_file, restore_data_t *rd)
9508 {
9509 FILE *fp = fopen (eff_restore_file, "rb");
9510
9511 if (fp == NULL)
9512 {
9513 log_error ("ERROR: Restore file '%s': %s", eff_restore_file, strerror (errno));
9514
9515 exit (-1);
9516 }
9517
9518 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
9519 {
9520 log_error ("ERROR: Can't read %s", eff_restore_file);
9521
9522 exit (-1);
9523 }
9524
9525 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
9526
9527 char *buf = (char *) mymalloc (HCBUFSIZ);
9528
9529 for (uint i = 0; i < rd->argc; i++)
9530 {
9531 if (fgets (buf, HCBUFSIZ - 1, fp) == NULL)
9532 {
9533 log_error ("ERROR: Can't read %s", eff_restore_file);
9534
9535 exit (-1);
9536 }
9537
9538 size_t len = strlen (buf);
9539
9540 if (len) buf[len - 1] = 0;
9541
9542 rd->argv[i] = mystrdup (buf);
9543 }
9544
9545 myfree (buf);
9546
9547 fclose (fp);
9548
9549 log_info ("INFO: Changing current working directory to the path found within the .restore file: '%s'", rd->cwd);
9550
9551 if (chdir (rd->cwd))
9552 {
9553 log_error ("ERROR: The directory '%s' does not exist. It is needed to restore (--restore) the session.\n"
9554 " You could either create this directory (or link it) or update the .restore file using e.g. the analyze_hc_restore.pl tool:\n"
9555 " https://github.com/philsmd/analyze_hc_restore\n"
9556 " The directory must be relative to (or contain) all files/folders mentioned within the command line.", rd->cwd);
9557
9558 exit (-1);
9559 }
9560 }
9561
9562 u64 get_lowest_words_done ()
9563 {
9564 u64 words_cur = -1;
9565
9566 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
9567 {
9568 hc_device_param_t *device_param = &data.devices_param[device_id];
9569
9570 if (device_param->skipped) continue;
9571
9572 const u64 words_done = device_param->words_done;
9573
9574 if (words_done < words_cur) words_cur = words_done;
9575 }
9576
9577 // It's possible that a device's workload isn't finished right after a restore-case.
9578 // In that case, this function would return 0 and overwrite the real restore point
9579 // There's also data.words_cur which is set to rd->words_cur but it changes while
9580 // the attack is running therefore we should stick to rd->words_cur.
9581 // Note that -s influences rd->words_cur we should keep a close look on that.
9582
9583 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
9584
9585 return words_cur;
9586 }
9587
9588 void write_restore (const char *new_restore_file, restore_data_t *rd)
9589 {
9590 u64 words_cur = get_lowest_words_done ();
9591
9592 rd->words_cur = words_cur;
9593
9594 FILE *fp = fopen (new_restore_file, "wb");
9595
9596 if (fp == NULL)
9597 {
9598 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
9599
9600 exit (-1);
9601 }
9602
9603 if (setvbuf (fp, NULL, _IONBF, 0))
9604 {
9605 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
9606
9607 exit (-1);
9608 }
9609
9610 fwrite (rd, sizeof (restore_data_t), 1, fp);
9611
9612 for (uint i = 0; i < rd->argc; i++)
9613 {
9614 fprintf (fp, "%s", rd->argv[i]);
9615 fputc ('\n', fp);
9616 }
9617
9618 fflush (fp);
9619
9620 fsync (fileno (fp));
9621
9622 fclose (fp);
9623 }
9624
9625 void cycle_restore ()
9626 {
9627 const char *eff_restore_file = data.eff_restore_file;
9628 const char *new_restore_file = data.new_restore_file;
9629
9630 restore_data_t *rd = data.rd;
9631
9632 write_restore (new_restore_file, rd);
9633
9634 struct stat st;
9635
9636 memset (&st, 0, sizeof(st));
9637
9638 if (stat (eff_restore_file, &st) == 0)
9639 {
9640 if (unlink (eff_restore_file))
9641 {
9642 log_info ("WARN: Unlink file '%s': %s", eff_restore_file, strerror (errno));
9643 }
9644 }
9645
9646 if (rename (new_restore_file, eff_restore_file))
9647 {
9648 log_info ("WARN: Rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
9649 }
9650 }
9651
9652 void check_checkpoint ()
9653 {
9654 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9655
9656 u64 words_cur = get_lowest_words_done ();
9657
9658 if (words_cur != data.checkpoint_cur_words)
9659 {
9660 myabort ();
9661 }
9662 }
9663
9664 /**
9665 * tuning db
9666 */
9667
9668 void tuning_db_destroy (tuning_db_t *tuning_db)
9669 {
9670 int i;
9671
9672 for (i = 0; i < tuning_db->alias_cnt; i++)
9673 {
9674 tuning_db_alias_t *alias = &tuning_db->alias_buf[i];
9675
9676 myfree (alias->device_name);
9677 myfree (alias->alias_name);
9678 }
9679
9680 for (i = 0; i < tuning_db->entry_cnt; i++)
9681 {
9682 tuning_db_entry_t *entry = &tuning_db->entry_buf[i];
9683
9684 myfree (entry->device_name);
9685 }
9686
9687 myfree (tuning_db->alias_buf);
9688 myfree (tuning_db->entry_buf);
9689
9690 myfree (tuning_db);
9691 }
9692
9693 tuning_db_t *tuning_db_alloc (FILE *fp)
9694 {
9695 tuning_db_t *tuning_db = (tuning_db_t *) mymalloc (sizeof (tuning_db_t));
9696
9697 int num_lines = count_lines (fp);
9698
9699 // a bit over-allocated
9700
9701 tuning_db->alias_buf = (tuning_db_alias_t *) mycalloc (num_lines + 1, sizeof (tuning_db_alias_t));
9702 tuning_db->alias_cnt = 0;
9703
9704 tuning_db->entry_buf = (tuning_db_entry_t *) mycalloc (num_lines + 1, sizeof (tuning_db_entry_t));
9705 tuning_db->entry_cnt = 0;
9706
9707 return tuning_db;
9708 }
9709
9710 tuning_db_t *tuning_db_init (const char *tuning_db_file)
9711 {
9712 FILE *fp = fopen (tuning_db_file, "rb");
9713
9714 if (fp == NULL)
9715 {
9716 log_error ("%s: %s", tuning_db_file, strerror (errno));
9717
9718 exit (-1);
9719 }
9720
9721 tuning_db_t *tuning_db = tuning_db_alloc (fp);
9722
9723 rewind (fp);
9724
9725 int line_num = 0;
9726
9727 char *buf = (char *) mymalloc (HCBUFSIZ);
9728
9729 while (!feof (fp))
9730 {
9731 char *line_buf = fgets (buf, HCBUFSIZ - 1, fp);
9732
9733 if (line_buf == NULL) break;
9734
9735 line_num++;
9736
9737 const int line_len = in_superchop (line_buf);
9738
9739 if (line_len == 0) continue;
9740
9741 if (line_buf[0] == '#') continue;
9742
9743 // start processing
9744
9745 char *token_ptr[7] = { NULL };
9746
9747 int token_cnt = 0;
9748
9749 char *next = strtok (line_buf, "\t ");
9750
9751 token_ptr[token_cnt] = next;
9752
9753 token_cnt++;
9754
9755 while ((next = strtok (NULL, "\t ")) != NULL)
9756 {
9757 token_ptr[token_cnt] = next;
9758
9759 token_cnt++;
9760 }
9761
9762 if (token_cnt == 2)
9763 {
9764 char *device_name = token_ptr[0];
9765 char *alias_name = token_ptr[1];
9766
9767 tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt];
9768
9769 alias->device_name = mystrdup (device_name);
9770 alias->alias_name = mystrdup (alias_name);
9771
9772 tuning_db->alias_cnt++;
9773 }
9774 else if (token_cnt == 6)
9775 {
9776 if ((token_ptr[1][0] != '0') &&
9777 (token_ptr[1][0] != '1') &&
9778 (token_ptr[1][0] != '3') &&
9779 (token_ptr[1][0] != '*'))
9780 {
9781 log_info ("WARNING: Tuning-db: Invalid attack_mode '%c' in Line '%u'", token_ptr[1][0], line_num);
9782
9783 continue;
9784 }
9785
9786 if ((token_ptr[3][0] != '1') &&
9787 (token_ptr[3][0] != '2') &&
9788 (token_ptr[3][0] != '4') &&
9789 (token_ptr[3][0] != '8') &&
9790 (token_ptr[3][0] != 'N'))
9791 {
9792 log_info ("WARNING: Tuning-db: Invalid vector_width '%c' in Line '%u'", token_ptr[3][0], line_num);
9793
9794 continue;
9795 }
9796
9797 char *device_name = token_ptr[0];
9798
9799 int attack_mode = -1;
9800 int hash_type = -1;
9801 int vector_width = -1;
9802 int kernel_accel = -1;
9803 int kernel_loops = -1;
9804
9805 if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]);
9806 if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]);
9807 if (token_ptr[3][0] != 'N') vector_width = atoi (token_ptr[3]);
9808
9809 if (token_ptr[4][0] != 'A')
9810 {
9811 kernel_accel = atoi (token_ptr[4]);
9812
9813 if ((kernel_accel < 1) || (kernel_accel > 1024))
9814 {
9815 log_info ("WARNING: Tuning-db: Invalid kernel_accel '%d' in Line '%u'", kernel_accel, line_num);
9816
9817 continue;
9818 }
9819 }
9820 else
9821 {
9822 kernel_accel = 0;
9823 }
9824
9825 if (token_ptr[5][0] != 'A')
9826 {
9827 kernel_loops = atoi (token_ptr[5]);
9828
9829 if ((kernel_loops < 1) || (kernel_loops > 1024))
9830 {
9831 log_info ("WARNING: Tuning-db: Invalid kernel_loops '%d' in Line '%u'", kernel_loops, line_num);
9832
9833 continue;
9834 }
9835 }
9836 else
9837 {
9838 kernel_loops = 0;
9839 }
9840
9841 tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt];
9842
9843 entry->device_name = mystrdup (device_name);
9844 entry->attack_mode = attack_mode;
9845 entry->hash_type = hash_type;
9846 entry->vector_width = vector_width;
9847 entry->kernel_accel = kernel_accel;
9848 entry->kernel_loops = kernel_loops;
9849
9850 tuning_db->entry_cnt++;
9851 }
9852 else
9853 {
9854 log_info ("WARNING: Tuning-db: Invalid number of token in Line '%u'", line_num);
9855
9856 continue;
9857 }
9858 }
9859
9860 myfree (buf);
9861
9862 fclose (fp);
9863
9864 // todo: print loaded 'cnt' message
9865
9866 // sort the database
9867
9868 qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9869 qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9870
9871 return tuning_db;
9872 }
9873
9874 tuning_db_entry_t *tuning_db_search (tuning_db_t *tuning_db, hc_device_param_t *device_param, int attack_mode, int hash_type)
9875 {
9876 static tuning_db_entry_t s;
9877
9878 // first we need to convert all spaces in the device_name to underscore
9879
9880 char *device_name_nospace = strdup (device_param->device_name);
9881
9882 int device_name_length = strlen (device_name_nospace);
9883
9884 int i;
9885
9886 for (i = 0; i < device_name_length; i++)
9887 {
9888 if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_';
9889 }
9890
9891 // find out if there's an alias configured
9892
9893 tuning_db_alias_t a;
9894
9895 a.device_name = device_name_nospace;
9896
9897 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);
9898
9899 char *alias_name = (alias == NULL) ? NULL : alias->alias_name;
9900
9901 // attack-mode 6 and 7 are attack-mode 1 basically
9902
9903 if (attack_mode == 6) attack_mode = 1;
9904 if (attack_mode == 7) attack_mode = 1;
9905
9906 // bsearch is not ideal but fast enough
9907
9908 s.device_name = device_name_nospace;
9909 s.attack_mode = attack_mode;
9910 s.hash_type = hash_type;
9911
9912 tuning_db_entry_t *entry = NULL;
9913
9914 // this will produce all 2^3 combinations required
9915
9916 for (i = 0; i < 8; i++)
9917 {
9918 s.device_name = (i & 1) ? "*" : device_name_nospace;
9919 s.attack_mode = (i & 2) ? -1 : attack_mode;
9920 s.hash_type = (i & 4) ? -1 : hash_type;
9921
9922 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9923
9924 if (entry != NULL) break;
9925
9926 // in non-wildcard mode do some additional checks:
9927
9928 if ((i & 1) == 0)
9929 {
9930 // in case we have an alias-name
9931
9932 if (alias_name != NULL)
9933 {
9934 s.device_name = alias_name;
9935
9936 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9937
9938 if (entry != NULL) break;
9939 }
9940
9941 // or by device type
9942
9943 if (device_param->device_type & CL_DEVICE_TYPE_CPU)
9944 {
9945 s.device_name = "DEVICE_TYPE_CPU";
9946 }
9947 else if (device_param->device_type & CL_DEVICE_TYPE_GPU)
9948 {
9949 s.device_name = "DEVICE_TYPE_GPU";
9950 }
9951 else if (device_param->device_type & CL_DEVICE_TYPE_ACCELERATOR)
9952 {
9953 s.device_name = "DEVICE_TYPE_ACCELERATOR";
9954 }
9955
9956 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9957
9958 if (entry != NULL) break;
9959 }
9960 }
9961
9962 // free converted device_name
9963
9964 myfree (device_name_nospace);
9965
9966 return entry;
9967 }
9968
9969 /**
9970 * parser
9971 */
9972
9973 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9974 {
9975 u8 tmp[256] = { 0 };
9976
9977 if (salt_len > sizeof (tmp))
9978 {
9979 return UINT_MAX;
9980 }
9981
9982 memcpy (tmp, in, salt_len);
9983
9984 if (data.opts_type & OPTS_TYPE_ST_HEX)
9985 {
9986 if ((salt_len % 2) == 0)
9987 {
9988 u32 new_salt_len = salt_len / 2;
9989
9990 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9991 {
9992 u8 p0 = tmp[j + 0];
9993 u8 p1 = tmp[j + 1];
9994
9995 tmp[i] = hex_convert (p1) << 0;
9996 tmp[i] |= hex_convert (p0) << 4;
9997 }
9998
9999 salt_len = new_salt_len;
10000 }
10001 else
10002 {
10003 return UINT_MAX;
10004 }
10005 }
10006 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
10007 {
10008 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
10009 }
10010
10011 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
10012
10013 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
10014 {
10015 if (salt_len < 20)
10016 {
10017 u32 *tmp_uint = (u32 *) tmp;
10018
10019 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
10020 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
10021 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
10022 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
10023 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
10024 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
10025 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
10026 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
10027 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
10028 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
10029
10030 salt_len = salt_len * 2;
10031 }
10032 else
10033 {
10034 return UINT_MAX;
10035 }
10036 }
10037
10038 if (data.opts_type & OPTS_TYPE_ST_LOWER)
10039 {
10040 lowercase (tmp, salt_len);
10041 }
10042
10043 if (data.opts_type & OPTS_TYPE_ST_UPPER)
10044 {
10045 uppercase (tmp, salt_len);
10046 }
10047
10048 u32 len = salt_len;
10049
10050 if (data.opts_type & OPTS_TYPE_ST_ADD80)
10051 {
10052 tmp[len++] = 0x80;
10053 }
10054
10055 if (data.opts_type & OPTS_TYPE_ST_ADD01)
10056 {
10057 tmp[len++] = 0x01;
10058 }
10059
10060 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
10061 {
10062 u32 *tmp_uint = (uint *) tmp;
10063
10064 u32 max = len / 4;
10065
10066 if (len % 4) max++;
10067
10068 for (u32 i = 0; i < max; i++)
10069 {
10070 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
10071 }
10072
10073 // Important: we may need to increase the length of memcpy since
10074 // we don't want to "loose" some swapped bytes (could happen if
10075 // they do not perfectly fit in the 4-byte blocks)
10076 // Memcpy does always copy the bytes in the BE order, but since
10077 // we swapped them, some important bytes could be in positions
10078 // we normally skip with the original len
10079
10080 if (len % 4) len += 4 - (len % 4);
10081 }
10082
10083 memcpy (out, tmp, len);
10084
10085 return (salt_len);
10086 }
10087
10088 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10089 {
10090 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
10091
10092 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
10093
10094 u32 *digest = (u32 *) hash_buf->digest;
10095
10096 salt_t *salt = hash_buf->salt;
10097
10098 memcpy ((char *) salt->salt_sign, input_buf, 6);
10099
10100 char *iter_pos = input_buf + 4;
10101
10102 salt->salt_iter = 1u << atoi (iter_pos);
10103
10104 char *salt_pos = strchr (iter_pos, '$');
10105
10106 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10107
10108 salt_pos++;
10109
10110 uint salt_len = 16;
10111
10112 salt->salt_len = salt_len;
10113
10114 u8 tmp_buf[100] = { 0 };
10115
10116 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
10117
10118 char *salt_buf_ptr = (char *) salt->salt_buf;
10119
10120 memcpy (salt_buf_ptr, tmp_buf, 16);
10121
10122 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
10123 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
10124 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
10125 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
10126
10127 char *hash_pos = salt_pos + 22;
10128
10129 memset (tmp_buf, 0, sizeof (tmp_buf));
10130
10131 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
10132
10133 memcpy (digest, tmp_buf, 24);
10134
10135 digest[0] = byte_swap_32 (digest[0]);
10136 digest[1] = byte_swap_32 (digest[1]);
10137 digest[2] = byte_swap_32 (digest[2]);
10138 digest[3] = byte_swap_32 (digest[3]);
10139 digest[4] = byte_swap_32 (digest[4]);
10140 digest[5] = byte_swap_32 (digest[5]);
10141
10142 digest[5] &= ~0xff; // its just 23 not 24 !
10143
10144 return (PARSER_OK);
10145 }
10146
10147 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10148 {
10149 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
10150
10151 u32 *digest = (u32 *) hash_buf->digest;
10152
10153 u8 tmp_buf[100] = { 0 };
10154
10155 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
10156
10157 memcpy (digest, tmp_buf, 32);
10158
10159 digest[0] = byte_swap_32 (digest[0]);
10160 digest[1] = byte_swap_32 (digest[1]);
10161 digest[2] = byte_swap_32 (digest[2]);
10162 digest[3] = byte_swap_32 (digest[3]);
10163 digest[4] = byte_swap_32 (digest[4]);
10164 digest[5] = byte_swap_32 (digest[5]);
10165 digest[6] = byte_swap_32 (digest[6]);
10166 digest[7] = byte_swap_32 (digest[7]);
10167
10168 digest[0] -= SHA256M_A;
10169 digest[1] -= SHA256M_B;
10170 digest[2] -= SHA256M_C;
10171 digest[3] -= SHA256M_D;
10172 digest[4] -= SHA256M_E;
10173 digest[5] -= SHA256M_F;
10174 digest[6] -= SHA256M_G;
10175 digest[7] -= SHA256M_H;
10176
10177 return (PARSER_OK);
10178 }
10179
10180 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10181 {
10182 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
10183
10184 u32 *digest = (u32 *) hash_buf->digest;
10185
10186 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10187 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10188
10189 digest[0] = byte_swap_32 (digest[0]);
10190 digest[1] = byte_swap_32 (digest[1]);
10191
10192 uint tt;
10193
10194 IP (digest[0], digest[1], tt);
10195
10196 digest[0] = digest[0];
10197 digest[1] = digest[1];
10198 digest[2] = 0;
10199 digest[3] = 0;
10200
10201 return (PARSER_OK);
10202 }
10203
10204 int arubaos_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10205 {
10206 if ((input_len < DISPLAY_LEN_MIN_125) || (input_len > DISPLAY_LEN_MAX_125)) return (PARSER_GLOBAL_LENGTH);
10207
10208 if ((input_buf[8] != '0') || (input_buf[9] != '1')) return (PARSER_SIGNATURE_UNMATCHED);
10209
10210 u32 *digest = (u32 *) hash_buf->digest;
10211
10212 salt_t *salt = hash_buf->salt;
10213
10214 char *hash_pos = input_buf + 10;
10215
10216 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10217 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10218 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10219 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10220 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10221
10222 digest[0] -= SHA1M_A;
10223 digest[1] -= SHA1M_B;
10224 digest[2] -= SHA1M_C;
10225 digest[3] -= SHA1M_D;
10226 digest[4] -= SHA1M_E;
10227
10228 uint salt_len = 10;
10229
10230 char *salt_buf_ptr = (char *) salt->salt_buf;
10231
10232 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10233
10234 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10235
10236 salt->salt_len = salt_len;
10237
10238 return (PARSER_OK);
10239 }
10240
10241 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10242 {
10243 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
10244
10245 u32 *digest = (u32 *) hash_buf->digest;
10246
10247 salt_t *salt = hash_buf->salt;
10248
10249 char *hash_pos = input_buf + 8;
10250
10251 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10252 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10253 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10254 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10255 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10256
10257 digest[0] -= SHA1M_A;
10258 digest[1] -= SHA1M_B;
10259 digest[2] -= SHA1M_C;
10260 digest[3] -= SHA1M_D;
10261 digest[4] -= SHA1M_E;
10262
10263 uint salt_len = 8;
10264
10265 char *salt_buf_ptr = (char *) salt->salt_buf;
10266
10267 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10268
10269 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10270
10271 salt->salt_len = salt_len;
10272
10273 return (PARSER_OK);
10274 }
10275
10276 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10277 {
10278 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
10279
10280 u64 *digest = (u64 *) hash_buf->digest;
10281
10282 salt_t *salt = hash_buf->salt;
10283
10284 char *hash_pos = input_buf + 8;
10285
10286 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
10287 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
10288 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
10289 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
10290 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
10291 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
10292 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
10293 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
10294
10295 digest[0] -= SHA512M_A;
10296 digest[1] -= SHA512M_B;
10297 digest[2] -= SHA512M_C;
10298 digest[3] -= SHA512M_D;
10299 digest[4] -= SHA512M_E;
10300 digest[5] -= SHA512M_F;
10301 digest[6] -= SHA512M_G;
10302 digest[7] -= SHA512M_H;
10303
10304 uint salt_len = 8;
10305
10306 char *salt_buf_ptr = (char *) salt->salt_buf;
10307
10308 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10309
10310 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10311
10312 salt->salt_len = salt_len;
10313
10314 return (PARSER_OK);
10315 }
10316
10317 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10318 {
10319 if (data.opts_type & OPTS_TYPE_ST_HEX)
10320 {
10321 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
10322 }
10323 else
10324 {
10325 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
10326 }
10327
10328 u32 *digest = (u32 *) hash_buf->digest;
10329
10330 salt_t *salt = hash_buf->salt;
10331
10332 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10333 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10334 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10335 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10336
10337 digest[0] = byte_swap_32 (digest[0]);
10338 digest[1] = byte_swap_32 (digest[1]);
10339 digest[2] = byte_swap_32 (digest[2]);
10340 digest[3] = byte_swap_32 (digest[3]);
10341
10342 digest[0] -= MD5M_A;
10343 digest[1] -= MD5M_B;
10344 digest[2] -= MD5M_C;
10345 digest[3] -= MD5M_D;
10346
10347 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10348
10349 uint salt_len = input_len - 32 - 1;
10350
10351 char *salt_buf = input_buf + 32 + 1;
10352
10353 char *salt_buf_ptr = (char *) salt->salt_buf;
10354
10355 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10356
10357 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10358
10359 salt->salt_len = salt_len;
10360
10361 return (PARSER_OK);
10362 }
10363
10364 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10365 {
10366 if (data.opts_type & OPTS_TYPE_ST_HEX)
10367 {
10368 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
10369 }
10370 else
10371 {
10372 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
10373 }
10374
10375 // unscramble
10376
10377 char clean_input_buf[32] = { 0 };
10378
10379 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
10380 int pos[6] = { 0, 6, 12, 17, 23, 29 };
10381
10382 for (int i = 0, j = 0, k = 0; i < 30; i++)
10383 {
10384 if (i == pos[j])
10385 {
10386 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
10387
10388 j++;
10389 }
10390 else
10391 {
10392 clean_input_buf[k] = input_buf[i];
10393
10394 k++;
10395 }
10396 }
10397
10398 // base64 decode
10399
10400 u32 *digest = (u32 *) hash_buf->digest;
10401
10402 salt_t *salt = hash_buf->salt;
10403
10404 u32 a, b, c, d, e, f;
10405
10406 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
10407 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
10408 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
10409 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
10410 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
10411 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
10412
10413 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
10414 | (((d << 12) | (e << 6) | (f)) << 0);
10415
10416 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
10417 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
10418 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
10419 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
10420 e = base64_to_int (clean_input_buf[10] & 0x7f);
10421 f = base64_to_int (clean_input_buf[11] & 0x7f);
10422
10423 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
10424 | (((d << 12) | (e << 6) | (f)) << 0);
10425
10426 a = base64_to_int (clean_input_buf[12] & 0x7f);
10427 b = base64_to_int (clean_input_buf[13] & 0x7f);
10428 c = base64_to_int (clean_input_buf[14] & 0x7f);
10429 d = base64_to_int (clean_input_buf[15] & 0x7f);
10430 e = base64_to_int (clean_input_buf[16] & 0x7f);
10431 f = base64_to_int (clean_input_buf[17] & 0x7f);
10432
10433 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
10434 | (((d << 12) | (e << 6) | (f)) << 0);
10435
10436 a = base64_to_int (clean_input_buf[18] & 0x7f);
10437 b = base64_to_int (clean_input_buf[19] & 0x7f);
10438 c = base64_to_int (clean_input_buf[20] & 0x7f);
10439 d = base64_to_int (clean_input_buf[21] & 0x7f);
10440 e = base64_to_int (clean_input_buf[22] & 0x7f);
10441 f = base64_to_int (clean_input_buf[23] & 0x7f);
10442
10443 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
10444 | (((d << 12) | (e << 6) | (f)) << 0);
10445
10446 digest[0] = byte_swap_32 (digest[0]);
10447 digest[1] = byte_swap_32 (digest[1]);
10448 digest[2] = byte_swap_32 (digest[2]);
10449 digest[3] = byte_swap_32 (digest[3]);
10450
10451 digest[0] -= MD5M_A;
10452 digest[1] -= MD5M_B;
10453 digest[2] -= MD5M_C;
10454 digest[3] -= MD5M_D;
10455
10456 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
10457
10458 uint salt_len = input_len - 30 - 1;
10459
10460 char *salt_buf = input_buf + 30 + 1;
10461
10462 char *salt_buf_ptr = (char *) salt->salt_buf;
10463
10464 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10465
10466 // max. salt length: 55 (max for MD5) - 22 (":Administration Tools:") - 1 (0x80) = 32
10467 // 32 - 4 bytes (to fit w0lr for all attack modes) = 28
10468
10469 if (salt_len > 28) return (PARSER_SALT_LENGTH);
10470
10471 salt->salt_len = salt_len;
10472
10473 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
10474
10475 salt->salt_len += 22;
10476
10477 return (PARSER_OK);
10478 }
10479
10480 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10481 {
10482 if (data.opts_type & OPTS_TYPE_ST_HEX)
10483 {
10484 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
10485 }
10486 else
10487 {
10488 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
10489 }
10490
10491 u32 *digest = (u32 *) hash_buf->digest;
10492
10493 salt_t *salt = hash_buf->salt;
10494
10495 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10496 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10497 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10498 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10499 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
10500
10501 digest[0] -= SHA1M_A;
10502 digest[1] -= SHA1M_B;
10503 digest[2] -= SHA1M_C;
10504 digest[3] -= SHA1M_D;
10505 digest[4] -= SHA1M_E;
10506
10507 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10508
10509 uint salt_len = input_len - 40 - 1;
10510
10511 char *salt_buf = input_buf + 40 + 1;
10512
10513 char *salt_buf_ptr = (char *) salt->salt_buf;
10514
10515 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10516
10517 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10518
10519 salt->salt_len = salt_len;
10520
10521 return (PARSER_OK);
10522 }
10523
10524 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10525 {
10526 if (data.opts_type & OPTS_TYPE_ST_HEX)
10527 {
10528 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
10529 }
10530 else
10531 {
10532 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
10533 }
10534
10535 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10536
10537 char *iter_pos = input_buf + 6;
10538
10539 salt_t *salt = hash_buf->salt;
10540
10541 uint iter = atoi (iter_pos);
10542
10543 if (iter < 1)
10544 {
10545 iter = ROUNDS_DCC2;
10546 }
10547
10548 salt->salt_iter = iter - 1;
10549
10550 char *salt_pos = strchr (iter_pos, '#');
10551
10552 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10553
10554 salt_pos++;
10555
10556 char *digest_pos = strchr (salt_pos, '#');
10557
10558 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10559
10560 digest_pos++;
10561
10562 uint salt_len = digest_pos - salt_pos - 1;
10563
10564 u32 *digest = (u32 *) hash_buf->digest;
10565
10566 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
10567 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
10568 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
10569 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
10570
10571 char *salt_buf_ptr = (char *) salt->salt_buf;
10572
10573 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10574
10575 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10576
10577 salt->salt_len = salt_len;
10578
10579 return (PARSER_OK);
10580 }
10581
10582 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10583 {
10584 u32 *digest = (u32 *) hash_buf->digest;
10585
10586 salt_t *salt = hash_buf->salt;
10587
10588 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
10589
10590 hccap_t in;
10591
10592 memcpy (&in, input_buf, input_len);
10593
10594 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
10595
10596 memcpy (digest, in.keymic, 16);
10597
10598 /*
10599 http://www.one-net.eu/jsw/j_sec/m_ptype.html
10600 The phrase "Pairwise key expansion"
10601 Access Point Address (referred to as Authenticator Address AA)
10602 Supplicant Address (referred to as Supplicant Address SA)
10603 Access Point Nonce (referred to as Authenticator Anonce)
10604 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
10605 */
10606
10607 uint salt_len = strlen (in.essid);
10608
10609 if (salt_len > 36)
10610 {
10611 log_info ("WARNING: The ESSID length is too long, the hccap file may be invalid or corrupted");
10612
10613 return (PARSER_SALT_LENGTH);
10614 }
10615
10616 memcpy (salt->salt_buf, in.essid, salt_len);
10617
10618 salt->salt_len = salt_len;
10619
10620 salt->salt_iter = ROUNDS_WPA2 - 1;
10621
10622 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
10623
10624 memcpy (pke_ptr, "Pairwise key expansion", 23);
10625
10626 if (memcmp (in.mac1, in.mac2, 6) < 0)
10627 {
10628 memcpy (pke_ptr + 23, in.mac1, 6);
10629 memcpy (pke_ptr + 29, in.mac2, 6);
10630 }
10631 else
10632 {
10633 memcpy (pke_ptr + 23, in.mac2, 6);
10634 memcpy (pke_ptr + 29, in.mac1, 6);
10635 }
10636
10637 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10638 {
10639 memcpy (pke_ptr + 35, in.nonce1, 32);
10640 memcpy (pke_ptr + 67, in.nonce2, 32);
10641 }
10642 else
10643 {
10644 memcpy (pke_ptr + 35, in.nonce2, 32);
10645 memcpy (pke_ptr + 67, in.nonce1, 32);
10646 }
10647
10648 for (int i = 0; i < 25; i++)
10649 {
10650 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10651 }
10652
10653 memcpy (wpa->orig_mac1, in.mac1, 6);
10654 memcpy (wpa->orig_mac2, in.mac2, 6);
10655 memcpy (wpa->orig_nonce1, in.nonce1, 32);
10656 memcpy (wpa->orig_nonce2, in.nonce2, 32);
10657
10658 wpa->keyver = in.keyver;
10659
10660 if (wpa->keyver > 255)
10661 {
10662 log_info ("ATTENTION!");
10663 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10664 log_info (" This could be due to a recent aircrack-ng bug.");
10665 log_info (" The key version was automatically reset to a reasonable value.");
10666 log_info ("");
10667
10668 wpa->keyver &= 0xff;
10669 }
10670
10671 wpa->eapol_size = in.eapol_size;
10672
10673 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10674
10675 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10676
10677 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10678
10679 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10680
10681 if (wpa->keyver == 1)
10682 {
10683 // nothing to do
10684 }
10685 else
10686 {
10687 digest[0] = byte_swap_32 (digest[0]);
10688 digest[1] = byte_swap_32 (digest[1]);
10689 digest[2] = byte_swap_32 (digest[2]);
10690 digest[3] = byte_swap_32 (digest[3]);
10691
10692 for (int i = 0; i < 64; i++)
10693 {
10694 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10695 }
10696 }
10697
10698 uint32_t *p0 = (uint32_t *) in.essid;
10699 uint32_t c0 = 0;
10700 uint32_t c1 = 0;
10701
10702 for (uint i = 0; i < sizeof (in.essid) / sizeof (uint32_t); i++) c0 ^= *p0++;
10703 for (uint i = 0; i < sizeof (wpa->pke) / sizeof (wpa->pke[0]); i++) c1 ^= wpa->pke[i];
10704
10705 salt->salt_buf[10] = c0;
10706 salt->salt_buf[11] = c1;
10707
10708 return (PARSER_OK);
10709 }
10710
10711 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10712 {
10713 u32 *digest = (u32 *) hash_buf->digest;
10714
10715 salt_t *salt = hash_buf->salt;
10716
10717 if (input_len == 0)
10718 {
10719 log_error ("Password Safe v2 container not specified");
10720
10721 exit (-1);
10722 }
10723
10724 FILE *fp = fopen (input_buf, "rb");
10725
10726 if (fp == NULL)
10727 {
10728 log_error ("%s: %s", input_buf, strerror (errno));
10729
10730 exit (-1);
10731 }
10732
10733 psafe2_hdr buf;
10734
10735 memset (&buf, 0, sizeof (psafe2_hdr));
10736
10737 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10738
10739 fclose (fp);
10740
10741 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10742
10743 salt->salt_buf[0] = buf.random[0];
10744 salt->salt_buf[1] = buf.random[1];
10745
10746 salt->salt_len = 8;
10747 salt->salt_iter = 1000;
10748
10749 digest[0] = byte_swap_32 (buf.hash[0]);
10750 digest[1] = byte_swap_32 (buf.hash[1]);
10751 digest[2] = byte_swap_32 (buf.hash[2]);
10752 digest[3] = byte_swap_32 (buf.hash[3]);
10753 digest[4] = byte_swap_32 (buf.hash[4]);
10754
10755 return (PARSER_OK);
10756 }
10757
10758 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10759 {
10760 u32 *digest = (u32 *) hash_buf->digest;
10761
10762 salt_t *salt = hash_buf->salt;
10763
10764 if (input_len == 0)
10765 {
10766 log_error (".psafe3 not specified");
10767
10768 exit (-1);
10769 }
10770
10771 FILE *fp = fopen (input_buf, "rb");
10772
10773 if (fp == NULL)
10774 {
10775 log_error ("%s: %s", input_buf, strerror (errno));
10776
10777 exit (-1);
10778 }
10779
10780 psafe3_t in;
10781
10782 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10783
10784 fclose (fp);
10785
10786 data.hashfile = input_buf; // we will need this in case it gets cracked
10787
10788 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10789
10790 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10791
10792 salt->salt_iter = in.iterations + 1;
10793
10794 salt->salt_buf[0] = in.salt_buf[0];
10795 salt->salt_buf[1] = in.salt_buf[1];
10796 salt->salt_buf[2] = in.salt_buf[2];
10797 salt->salt_buf[3] = in.salt_buf[3];
10798 salt->salt_buf[4] = in.salt_buf[4];
10799 salt->salt_buf[5] = in.salt_buf[5];
10800 salt->salt_buf[6] = in.salt_buf[6];
10801 salt->salt_buf[7] = in.salt_buf[7];
10802
10803 salt->salt_len = 32;
10804
10805 digest[0] = in.hash_buf[0];
10806 digest[1] = in.hash_buf[1];
10807 digest[2] = in.hash_buf[2];
10808 digest[3] = in.hash_buf[3];
10809 digest[4] = in.hash_buf[4];
10810 digest[5] = in.hash_buf[5];
10811 digest[6] = in.hash_buf[6];
10812 digest[7] = in.hash_buf[7];
10813
10814 digest[0] = byte_swap_32 (digest[0]);
10815 digest[1] = byte_swap_32 (digest[1]);
10816 digest[2] = byte_swap_32 (digest[2]);
10817 digest[3] = byte_swap_32 (digest[3]);
10818 digest[4] = byte_swap_32 (digest[4]);
10819 digest[5] = byte_swap_32 (digest[5]);
10820 digest[6] = byte_swap_32 (digest[6]);
10821 digest[7] = byte_swap_32 (digest[7]);
10822
10823 return (PARSER_OK);
10824 }
10825
10826 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10827 {
10828 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10829
10830 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10831
10832 u32 *digest = (u32 *) hash_buf->digest;
10833
10834 salt_t *salt = hash_buf->salt;
10835
10836 char *iter_pos = input_buf + 3;
10837
10838 uint salt_iter = 1u << itoa64_to_int (iter_pos[0]);
10839
10840 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10841
10842 memcpy ((char *) salt->salt_sign, input_buf, 4);
10843
10844 salt->salt_iter = salt_iter;
10845
10846 char *salt_pos = iter_pos + 1;
10847
10848 uint salt_len = 8;
10849
10850 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10851
10852 salt->salt_len = salt_len;
10853
10854 char *hash_pos = salt_pos + salt_len;
10855
10856 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10857
10858 return (PARSER_OK);
10859 }
10860
10861 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10862 {
10863 if (input_len < DISPLAY_LEN_MIN_500) return (PARSER_GLOBAL_LENGTH);
10864
10865 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10866
10867 u32 *digest = (u32 *) hash_buf->digest;
10868
10869 salt_t *salt = hash_buf->salt;
10870
10871 char *salt_pos = input_buf + 3;
10872
10873 uint iterations_len = 0;
10874
10875 if (memcmp (salt_pos, "rounds=", 7) == 0)
10876 {
10877 salt_pos += 7;
10878
10879 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10880
10881 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10882 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10883
10884 salt_pos[0] = 0x0;
10885
10886 salt->salt_iter = atoi (salt_pos - iterations_len);
10887
10888 salt_pos += 1;
10889
10890 iterations_len += 8;
10891 }
10892 else
10893 {
10894 salt->salt_iter = ROUNDS_MD5CRYPT;
10895 }
10896
10897 if (input_len > (DISPLAY_LEN_MAX_500 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10898
10899 char *hash_pos = strchr (salt_pos, '$');
10900
10901 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10902
10903 uint salt_len = hash_pos - salt_pos;
10904
10905 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10906
10907 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10908
10909 salt->salt_len = salt_len;
10910
10911 hash_pos++;
10912
10913 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10914
10915 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10916
10917 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10918
10919 return (PARSER_OK);
10920 }
10921
10922 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10923 {
10924 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10925
10926 u32 *digest = (u32 *) hash_buf->digest;
10927
10928 salt_t *salt = hash_buf->salt;
10929
10930 char *salt_pos = input_buf + 6;
10931
10932 uint iterations_len = 0;
10933
10934 if (memcmp (salt_pos, "rounds=", 7) == 0)
10935 {
10936 salt_pos += 7;
10937
10938 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10939
10940 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10941 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10942
10943 salt_pos[0] = 0x0;
10944
10945 salt->salt_iter = atoi (salt_pos - iterations_len);
10946
10947 salt_pos += 1;
10948
10949 iterations_len += 8;
10950 }
10951 else
10952 {
10953 salt->salt_iter = ROUNDS_MD5CRYPT;
10954 }
10955
10956 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10957
10958 char *hash_pos = strchr (salt_pos, '$');
10959
10960 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10961
10962 uint salt_len = hash_pos - salt_pos;
10963
10964 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10965
10966 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10967
10968 salt->salt_len = salt_len;
10969
10970 hash_pos++;
10971
10972 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10973
10974 return (PARSER_OK);
10975 }
10976
10977 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10978 {
10979 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10980
10981 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10982
10983 u32 *digest = (u32 *) hash_buf->digest;
10984
10985 salt_t *salt = hash_buf->salt;
10986
10987 char *salt_pos = input_buf + 14;
10988
10989 char *hash_pos = strchr (salt_pos, '*');
10990
10991 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10992
10993 hash_pos++;
10994
10995 uint salt_len = hash_pos - salt_pos - 1;
10996
10997 char *salt_buf_ptr = (char *) salt->salt_buf;
10998
10999 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
11000
11001 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11002
11003 salt->salt_len = salt_len;
11004
11005 u8 tmp_buf[100] = { 0 };
11006
11007 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
11008
11009 memcpy (digest, tmp_buf, 20);
11010
11011 digest[0] = byte_swap_32 (digest[0]);
11012 digest[1] = byte_swap_32 (digest[1]);
11013 digest[2] = byte_swap_32 (digest[2]);
11014 digest[3] = byte_swap_32 (digest[3]);
11015 digest[4] = byte_swap_32 (digest[4]);
11016
11017 digest[0] -= SHA1M_A;
11018 digest[1] -= SHA1M_B;
11019 digest[2] -= SHA1M_C;
11020 digest[3] -= SHA1M_D;
11021 digest[4] -= SHA1M_E;
11022
11023 return (PARSER_OK);
11024 }
11025
11026 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11027 {
11028 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
11029
11030 unsigned char c12 = itoa64_to_int (input_buf[12]);
11031
11032 if (c12 & 3) return (PARSER_HASH_VALUE);
11033
11034 u32 *digest = (u32 *) hash_buf->digest;
11035
11036 salt_t *salt = hash_buf->salt;
11037
11038 // for ascii_digest
11039 salt->salt_sign[0] = input_buf[0];
11040 salt->salt_sign[1] = input_buf[1];
11041
11042 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
11043 | itoa64_to_int (input_buf[1]) << 6;
11044
11045 salt->salt_len = 2;
11046
11047 u8 tmp_buf[100] = { 0 };
11048
11049 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
11050
11051 memcpy (digest, tmp_buf, 8);
11052
11053 uint tt;
11054
11055 IP (digest[0], digest[1], tt);
11056
11057 digest[2] = 0;
11058 digest[3] = 0;
11059
11060 return (PARSER_OK);
11061 }
11062
11063 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11064 {
11065 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
11066
11067 u32 *digest = (u32 *) hash_buf->digest;
11068
11069 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11070 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11071 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11072 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11073
11074 digest[0] = byte_swap_32 (digest[0]);
11075 digest[1] = byte_swap_32 (digest[1]);
11076 digest[2] = byte_swap_32 (digest[2]);
11077 digest[3] = byte_swap_32 (digest[3]);
11078
11079 digest[0] -= MD4M_A;
11080 digest[1] -= MD4M_B;
11081 digest[2] -= MD4M_C;
11082 digest[3] -= MD4M_D;
11083
11084 return (PARSER_OK);
11085 }
11086
11087 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11088 {
11089 if (data.opts_type & OPTS_TYPE_ST_HEX)
11090 {
11091 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
11092 }
11093 else
11094 {
11095 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
11096 }
11097
11098 u32 *digest = (u32 *) hash_buf->digest;
11099
11100 salt_t *salt = hash_buf->salt;
11101
11102 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11103 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11104 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11105 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11106
11107 digest[0] = byte_swap_32 (digest[0]);
11108 digest[1] = byte_swap_32 (digest[1]);
11109 digest[2] = byte_swap_32 (digest[2]);
11110 digest[3] = byte_swap_32 (digest[3]);
11111
11112 digest[0] -= MD4M_A;
11113 digest[1] -= MD4M_B;
11114 digest[2] -= MD4M_C;
11115 digest[3] -= MD4M_D;
11116
11117 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11118
11119 uint salt_len = input_len - 32 - 1;
11120
11121 char *salt_buf = input_buf + 32 + 1;
11122
11123 char *salt_buf_ptr = (char *) salt->salt_buf;
11124
11125 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11126
11127 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11128
11129 salt->salt_len = salt_len;
11130
11131 return (PARSER_OK);
11132 }
11133
11134 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11135 {
11136 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
11137
11138 u32 *digest = (u32 *) hash_buf->digest;
11139
11140 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11141 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11142 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11143 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11144
11145 digest[0] = byte_swap_32 (digest[0]);
11146 digest[1] = byte_swap_32 (digest[1]);
11147 digest[2] = byte_swap_32 (digest[2]);
11148 digest[3] = byte_swap_32 (digest[3]);
11149
11150 digest[0] -= MD5M_A;
11151 digest[1] -= MD5M_B;
11152 digest[2] -= MD5M_C;
11153 digest[3] -= MD5M_D;
11154
11155 return (PARSER_OK);
11156 }
11157
11158 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11159 {
11160 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
11161
11162 u32 *digest = (u32 *) hash_buf->digest;
11163
11164 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
11165 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
11166 digest[2] = 0;
11167 digest[3] = 0;
11168
11169 digest[0] = byte_swap_32 (digest[0]);
11170 digest[1] = byte_swap_32 (digest[1]);
11171
11172 return (PARSER_OK);
11173 }
11174
11175 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11176 {
11177 if (data.opts_type & OPTS_TYPE_ST_HEX)
11178 {
11179 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
11180 }
11181 else
11182 {
11183 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
11184 }
11185
11186 u32 *digest = (u32 *) hash_buf->digest;
11187
11188 salt_t *salt = hash_buf->salt;
11189
11190 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11191 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11192 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11193 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11194
11195 digest[0] = byte_swap_32 (digest[0]);
11196 digest[1] = byte_swap_32 (digest[1]);
11197 digest[2] = byte_swap_32 (digest[2]);
11198 digest[3] = byte_swap_32 (digest[3]);
11199
11200 digest[0] -= MD5M_A;
11201 digest[1] -= MD5M_B;
11202 digest[2] -= MD5M_C;
11203 digest[3] -= MD5M_D;
11204
11205 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11206
11207 uint salt_len = input_len - 32 - 1;
11208
11209 char *salt_buf = input_buf + 32 + 1;
11210
11211 char *salt_buf_ptr = (char *) salt->salt_buf;
11212
11213 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11214
11215 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11216
11217 salt->salt_len = salt_len;
11218
11219 return (PARSER_OK);
11220 }
11221
11222 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11223 {
11224 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
11225
11226 u32 *digest = (u32 *) hash_buf->digest;
11227
11228 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11229 | itoa64_to_int (input_buf[ 1]) << 6
11230 | itoa64_to_int (input_buf[ 2]) << 12
11231 | itoa64_to_int (input_buf[ 3]) << 18;
11232 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11233 | itoa64_to_int (input_buf[ 5]) << 6
11234 | itoa64_to_int (input_buf[ 6]) << 12
11235 | itoa64_to_int (input_buf[ 7]) << 18;
11236 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11237 | itoa64_to_int (input_buf[ 9]) << 6
11238 | itoa64_to_int (input_buf[10]) << 12
11239 | itoa64_to_int (input_buf[11]) << 18;
11240 digest[3] = itoa64_to_int (input_buf[12]) << 0
11241 | itoa64_to_int (input_buf[13]) << 6
11242 | itoa64_to_int (input_buf[14]) << 12
11243 | itoa64_to_int (input_buf[15]) << 18;
11244
11245 digest[0] -= MD5M_A;
11246 digest[1] -= MD5M_B;
11247 digest[2] -= MD5M_C;
11248 digest[3] -= MD5M_D;
11249
11250 digest[0] &= 0x00ffffff;
11251 digest[1] &= 0x00ffffff;
11252 digest[2] &= 0x00ffffff;
11253 digest[3] &= 0x00ffffff;
11254
11255 return (PARSER_OK);
11256 }
11257
11258 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11259 {
11260 if (data.opts_type & OPTS_TYPE_ST_HEX)
11261 {
11262 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
11263 }
11264 else
11265 {
11266 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
11267 }
11268
11269 u32 *digest = (u32 *) hash_buf->digest;
11270
11271 salt_t *salt = hash_buf->salt;
11272
11273 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11274 | itoa64_to_int (input_buf[ 1]) << 6
11275 | itoa64_to_int (input_buf[ 2]) << 12
11276 | itoa64_to_int (input_buf[ 3]) << 18;
11277 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11278 | itoa64_to_int (input_buf[ 5]) << 6
11279 | itoa64_to_int (input_buf[ 6]) << 12
11280 | itoa64_to_int (input_buf[ 7]) << 18;
11281 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11282 | itoa64_to_int (input_buf[ 9]) << 6
11283 | itoa64_to_int (input_buf[10]) << 12
11284 | itoa64_to_int (input_buf[11]) << 18;
11285 digest[3] = itoa64_to_int (input_buf[12]) << 0
11286 | itoa64_to_int (input_buf[13]) << 6
11287 | itoa64_to_int (input_buf[14]) << 12
11288 | itoa64_to_int (input_buf[15]) << 18;
11289
11290 digest[0] -= MD5M_A;
11291 digest[1] -= MD5M_B;
11292 digest[2] -= MD5M_C;
11293 digest[3] -= MD5M_D;
11294
11295 digest[0] &= 0x00ffffff;
11296 digest[1] &= 0x00ffffff;
11297 digest[2] &= 0x00ffffff;
11298 digest[3] &= 0x00ffffff;
11299
11300 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11301
11302 uint salt_len = input_len - 16 - 1;
11303
11304 char *salt_buf = input_buf + 16 + 1;
11305
11306 char *salt_buf_ptr = (char *) salt->salt_buf;
11307
11308 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11309
11310 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11311
11312 salt->salt_len = salt_len;
11313
11314 return (PARSER_OK);
11315 }
11316
11317 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
11318 {
11319 key[0] = (nthash[0] >> 0);
11320 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
11321 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
11322 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
11323 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
11324 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
11325 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
11326 key[7] = (nthash[6] << 1);
11327
11328 key[0] |= 0x01;
11329 key[1] |= 0x01;
11330 key[2] |= 0x01;
11331 key[3] |= 0x01;
11332 key[4] |= 0x01;
11333 key[5] |= 0x01;
11334 key[6] |= 0x01;
11335 key[7] |= 0x01;
11336 }
11337
11338 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11339 {
11340 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
11341
11342 u32 *digest = (u32 *) hash_buf->digest;
11343
11344 salt_t *salt = hash_buf->salt;
11345
11346 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11347
11348 /**
11349 * parse line
11350 */
11351
11352 char *user_pos = input_buf;
11353
11354 char *unused_pos = strchr (user_pos, ':');
11355
11356 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11357
11358 uint user_len = unused_pos - user_pos;
11359
11360 if (user_len > 60) return (PARSER_SALT_LENGTH);
11361
11362 unused_pos++;
11363
11364 char *domain_pos = strchr (unused_pos, ':');
11365
11366 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11367
11368 uint unused_len = domain_pos - unused_pos;
11369
11370 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11371
11372 domain_pos++;
11373
11374 char *srvchall_pos = strchr (domain_pos, ':');
11375
11376 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11377
11378 uint domain_len = srvchall_pos - domain_pos;
11379
11380 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11381
11382 srvchall_pos++;
11383
11384 char *hash_pos = strchr (srvchall_pos, ':');
11385
11386 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11387
11388 uint srvchall_len = hash_pos - srvchall_pos;
11389
11390 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
11391
11392 hash_pos++;
11393
11394 char *clichall_pos = strchr (hash_pos, ':');
11395
11396 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11397
11398 uint hash_len = clichall_pos - hash_pos;
11399
11400 if (hash_len != 48) return (PARSER_HASH_LENGTH);
11401
11402 clichall_pos++;
11403
11404 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11405
11406 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
11407
11408 /**
11409 * store some data for later use
11410 */
11411
11412 netntlm->user_len = user_len * 2;
11413 netntlm->domain_len = domain_len * 2;
11414 netntlm->srvchall_len = srvchall_len / 2;
11415 netntlm->clichall_len = clichall_len / 2;
11416
11417 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11418 char *chall_ptr = (char *) netntlm->chall_buf;
11419
11420 /**
11421 * handle username and domainname
11422 */
11423
11424 for (uint i = 0; i < user_len; i++)
11425 {
11426 *userdomain_ptr++ = user_pos[i];
11427 *userdomain_ptr++ = 0;
11428 }
11429
11430 for (uint i = 0; i < domain_len; i++)
11431 {
11432 *userdomain_ptr++ = domain_pos[i];
11433 *userdomain_ptr++ = 0;
11434 }
11435
11436 /**
11437 * handle server challenge encoding
11438 */
11439
11440 for (uint i = 0; i < srvchall_len; i += 2)
11441 {
11442 const char p0 = srvchall_pos[i + 0];
11443 const char p1 = srvchall_pos[i + 1];
11444
11445 *chall_ptr++ = hex_convert (p1) << 0
11446 | hex_convert (p0) << 4;
11447 }
11448
11449 /**
11450 * handle client challenge encoding
11451 */
11452
11453 for (uint i = 0; i < clichall_len; i += 2)
11454 {
11455 const char p0 = clichall_pos[i + 0];
11456 const char p1 = clichall_pos[i + 1];
11457
11458 *chall_ptr++ = hex_convert (p1) << 0
11459 | hex_convert (p0) << 4;
11460 }
11461
11462 /**
11463 * store data
11464 */
11465
11466 char *salt_buf_ptr = (char *) salt->salt_buf;
11467
11468 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
11469
11470 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11471
11472 salt->salt_len = salt_len;
11473
11474 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11475 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11476 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11477 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11478
11479 digest[0] = byte_swap_32 (digest[0]);
11480 digest[1] = byte_swap_32 (digest[1]);
11481 digest[2] = byte_swap_32 (digest[2]);
11482 digest[3] = byte_swap_32 (digest[3]);
11483
11484 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
11485
11486 uint digest_tmp[2] = { 0 };
11487
11488 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11489 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
11490
11491 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
11492 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
11493
11494 /* special case 2: ESS */
11495
11496 if (srvchall_len == 48)
11497 {
11498 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
11499 {
11500 uint w[16] = { 0 };
11501
11502 w[ 0] = netntlm->chall_buf[6];
11503 w[ 1] = netntlm->chall_buf[7];
11504 w[ 2] = netntlm->chall_buf[0];
11505 w[ 3] = netntlm->chall_buf[1];
11506 w[ 4] = 0x80;
11507 w[14] = 16 * 8;
11508
11509 uint dgst[4] = { 0 };
11510
11511 dgst[0] = MAGIC_A;
11512 dgst[1] = MAGIC_B;
11513 dgst[2] = MAGIC_C;
11514 dgst[3] = MAGIC_D;
11515
11516 md5_64 (w, dgst);
11517
11518 salt->salt_buf[0] = dgst[0];
11519 salt->salt_buf[1] = dgst[1];
11520 }
11521 }
11522
11523 /* precompute netntlmv1 exploit start */
11524
11525 for (uint i = 0; i < 0x10000; i++)
11526 {
11527 uint key_md4[2] = { i, 0 };
11528 uint key_des[2] = { 0, 0 };
11529
11530 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
11531
11532 uint Kc[16] = { 0 };
11533 uint Kd[16] = { 0 };
11534
11535 _des_keysetup (key_des, Kc, Kd, c_skb);
11536
11537 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
11538
11539 _des_encrypt (data3, Kc, Kd, c_SPtrans);
11540
11541 if (data3[0] != digest_tmp[0]) continue;
11542 if (data3[1] != digest_tmp[1]) continue;
11543
11544 salt->salt_buf[2] = i;
11545
11546 salt->salt_len = 24;
11547
11548 break;
11549 }
11550
11551 salt->salt_buf_pc[0] = digest_tmp[0];
11552 salt->salt_buf_pc[1] = digest_tmp[1];
11553
11554 /* precompute netntlmv1 exploit stop */
11555
11556 u32 tt;
11557
11558 IP (digest[0], digest[1], tt);
11559 IP (digest[2], digest[3], tt);
11560
11561 digest[0] = rotr32 (digest[0], 29);
11562 digest[1] = rotr32 (digest[1], 29);
11563 digest[2] = rotr32 (digest[2], 29);
11564 digest[3] = rotr32 (digest[3], 29);
11565
11566 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
11567
11568 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
11569 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
11570
11571 return (PARSER_OK);
11572 }
11573
11574 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11575 {
11576 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
11577
11578 u32 *digest = (u32 *) hash_buf->digest;
11579
11580 salt_t *salt = hash_buf->salt;
11581
11582 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11583
11584 /**
11585 * parse line
11586 */
11587
11588 char *user_pos = input_buf;
11589
11590 char *unused_pos = strchr (user_pos, ':');
11591
11592 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11593
11594 uint user_len = unused_pos - user_pos;
11595
11596 if (user_len > 60) return (PARSER_SALT_LENGTH);
11597
11598 unused_pos++;
11599
11600 char *domain_pos = strchr (unused_pos, ':');
11601
11602 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11603
11604 uint unused_len = domain_pos - unused_pos;
11605
11606 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11607
11608 domain_pos++;
11609
11610 char *srvchall_pos = strchr (domain_pos, ':');
11611
11612 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11613
11614 uint domain_len = srvchall_pos - domain_pos;
11615
11616 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11617
11618 srvchall_pos++;
11619
11620 char *hash_pos = strchr (srvchall_pos, ':');
11621
11622 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11623
11624 uint srvchall_len = hash_pos - srvchall_pos;
11625
11626 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
11627
11628 hash_pos++;
11629
11630 char *clichall_pos = strchr (hash_pos, ':');
11631
11632 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11633
11634 uint hash_len = clichall_pos - hash_pos;
11635
11636 if (hash_len != 32) return (PARSER_HASH_LENGTH);
11637
11638 clichall_pos++;
11639
11640 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11641
11642 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
11643
11644 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11645
11646 /**
11647 * store some data for later use
11648 */
11649
11650 netntlm->user_len = user_len * 2;
11651 netntlm->domain_len = domain_len * 2;
11652 netntlm->srvchall_len = srvchall_len / 2;
11653 netntlm->clichall_len = clichall_len / 2;
11654
11655 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11656 char *chall_ptr = (char *) netntlm->chall_buf;
11657
11658 /**
11659 * handle username and domainname
11660 */
11661
11662 for (uint i = 0; i < user_len; i++)
11663 {
11664 *userdomain_ptr++ = toupper (user_pos[i]);
11665 *userdomain_ptr++ = 0;
11666 }
11667
11668 for (uint i = 0; i < domain_len; i++)
11669 {
11670 *userdomain_ptr++ = domain_pos[i];
11671 *userdomain_ptr++ = 0;
11672 }
11673
11674 *userdomain_ptr++ = 0x80;
11675
11676 /**
11677 * handle server challenge encoding
11678 */
11679
11680 for (uint i = 0; i < srvchall_len; i += 2)
11681 {
11682 const char p0 = srvchall_pos[i + 0];
11683 const char p1 = srvchall_pos[i + 1];
11684
11685 *chall_ptr++ = hex_convert (p1) << 0
11686 | hex_convert (p0) << 4;
11687 }
11688
11689 /**
11690 * handle client challenge encoding
11691 */
11692
11693 for (uint i = 0; i < clichall_len; i += 2)
11694 {
11695 const char p0 = clichall_pos[i + 0];
11696 const char p1 = clichall_pos[i + 1];
11697
11698 *chall_ptr++ = hex_convert (p1) << 0
11699 | hex_convert (p0) << 4;
11700 }
11701
11702 *chall_ptr++ = 0x80;
11703
11704 /**
11705 * handle hash itself
11706 */
11707
11708 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11709 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11710 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11711 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11712
11713 digest[0] = byte_swap_32 (digest[0]);
11714 digest[1] = byte_swap_32 (digest[1]);
11715 digest[2] = byte_swap_32 (digest[2]);
11716 digest[3] = byte_swap_32 (digest[3]);
11717
11718 /**
11719 * reuse challange data as salt_buf, its the buffer that is most likely unique
11720 */
11721
11722 salt->salt_buf[0] = 0;
11723 salt->salt_buf[1] = 0;
11724 salt->salt_buf[2] = 0;
11725 salt->salt_buf[3] = 0;
11726 salt->salt_buf[4] = 0;
11727 salt->salt_buf[5] = 0;
11728 salt->salt_buf[6] = 0;
11729 salt->salt_buf[7] = 0;
11730
11731 uint *uptr;
11732
11733 uptr = (uint *) netntlm->userdomain_buf;
11734
11735 for (uint i = 0; i < 16; i += 16)
11736 {
11737 md5_64 (uptr, salt->salt_buf);
11738 }
11739
11740 uptr = (uint *) netntlm->chall_buf;
11741
11742 for (uint i = 0; i < 256; i += 16)
11743 {
11744 md5_64 (uptr, salt->salt_buf);
11745 }
11746
11747 salt->salt_len = 16;
11748
11749 return (PARSER_OK);
11750 }
11751
11752 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11753 {
11754 if (data.opts_type & OPTS_TYPE_ST_HEX)
11755 {
11756 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11757 }
11758 else
11759 {
11760 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11761 }
11762
11763 u32 *digest = (u32 *) hash_buf->digest;
11764
11765 salt_t *salt = hash_buf->salt;
11766
11767 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11768 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11769 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11770 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11771
11772 digest[0] = byte_swap_32 (digest[0]);
11773 digest[1] = byte_swap_32 (digest[1]);
11774 digest[2] = byte_swap_32 (digest[2]);
11775 digest[3] = byte_swap_32 (digest[3]);
11776
11777 digest[0] -= MD5M_A;
11778 digest[1] -= MD5M_B;
11779 digest[2] -= MD5M_C;
11780 digest[3] -= MD5M_D;
11781
11782 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11783
11784 uint salt_len = input_len - 32 - 1;
11785
11786 char *salt_buf = input_buf + 32 + 1;
11787
11788 char *salt_buf_ptr = (char *) salt->salt_buf;
11789
11790 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11791
11792 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11793
11794 salt->salt_len = salt_len;
11795
11796 return (PARSER_OK);
11797 }
11798
11799 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11800 {
11801 if (data.opts_type & OPTS_TYPE_ST_HEX)
11802 {
11803 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11804 }
11805 else
11806 {
11807 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11808 }
11809
11810 u32 *digest = (u32 *) hash_buf->digest;
11811
11812 salt_t *salt = hash_buf->salt;
11813
11814 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11815 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11816 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11817 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11818
11819 digest[0] = byte_swap_32 (digest[0]);
11820 digest[1] = byte_swap_32 (digest[1]);
11821 digest[2] = byte_swap_32 (digest[2]);
11822 digest[3] = byte_swap_32 (digest[3]);
11823
11824 digest[0] -= MD5M_A;
11825 digest[1] -= MD5M_B;
11826 digest[2] -= MD5M_C;
11827 digest[3] -= MD5M_D;
11828
11829 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11830
11831 uint salt_len = input_len - 32 - 1;
11832
11833 char *salt_buf = input_buf + 32 + 1;
11834
11835 char *salt_buf_ptr = (char *) salt->salt_buf;
11836
11837 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11838
11839 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11840
11841 salt->salt_len = salt_len;
11842
11843 return (PARSER_OK);
11844 }
11845
11846 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11847 {
11848 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11849
11850 u32 *digest = (u32 *) hash_buf->digest;
11851
11852 salt_t *salt = hash_buf->salt;
11853
11854 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11855 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11856 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11857 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11858
11859 digest[0] = byte_swap_32 (digest[0]);
11860 digest[1] = byte_swap_32 (digest[1]);
11861 digest[2] = byte_swap_32 (digest[2]);
11862 digest[3] = byte_swap_32 (digest[3]);
11863
11864 digest[0] -= MD5M_A;
11865 digest[1] -= MD5M_B;
11866 digest[2] -= MD5M_C;
11867 digest[3] -= MD5M_D;
11868
11869 /**
11870 * This is a virtual salt. While the algorithm is basically not salted
11871 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11872 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11873 */
11874
11875 char *salt_buf_ptr = (char *) salt->salt_buf;
11876
11877 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11878
11879 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11880
11881 salt->salt_len = salt_len;
11882
11883 return (PARSER_OK);
11884 }
11885
11886 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11887 {
11888 if (data.opts_type & OPTS_TYPE_ST_HEX)
11889 {
11890 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11891 }
11892 else
11893 {
11894 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11895 }
11896
11897 u32 *digest = (u32 *) hash_buf->digest;
11898
11899 salt_t *salt = hash_buf->salt;
11900
11901 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11902 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11903 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11904 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11905
11906 digest[0] = byte_swap_32 (digest[0]);
11907 digest[1] = byte_swap_32 (digest[1]);
11908 digest[2] = byte_swap_32 (digest[2]);
11909 digest[3] = byte_swap_32 (digest[3]);
11910
11911 digest[0] -= MD5M_A;
11912 digest[1] -= MD5M_B;
11913 digest[2] -= MD5M_C;
11914 digest[3] -= MD5M_D;
11915
11916 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11917
11918 uint salt_len = input_len - 32 - 1;
11919
11920 char *salt_buf = input_buf + 32 + 1;
11921
11922 char *salt_buf_ptr = (char *) salt->salt_buf;
11923
11924 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11925
11926 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11927
11928 salt->salt_len = salt_len;
11929
11930 return (PARSER_OK);
11931 }
11932
11933 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11934 {
11935 if (data.opts_type & OPTS_TYPE_ST_HEX)
11936 {
11937 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11938 }
11939 else
11940 {
11941 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11942 }
11943
11944 u32 *digest = (u32 *) hash_buf->digest;
11945
11946 salt_t *salt = hash_buf->salt;
11947
11948 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11949 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11950 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11951 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11952
11953 digest[0] = byte_swap_32 (digest[0]);
11954 digest[1] = byte_swap_32 (digest[1]);
11955 digest[2] = byte_swap_32 (digest[2]);
11956 digest[3] = byte_swap_32 (digest[3]);
11957
11958 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11959
11960 uint salt_len = input_len - 32 - 1;
11961
11962 char *salt_buf = input_buf + 32 + 1;
11963
11964 char *salt_buf_ptr = (char *) salt->salt_buf;
11965
11966 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11967
11968 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11969
11970 salt->salt_len = salt_len;
11971
11972 return (PARSER_OK);
11973 }
11974
11975 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11976 {
11977 if (data.opts_type & OPTS_TYPE_ST_HEX)
11978 {
11979 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11980 }
11981 else
11982 {
11983 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11984 }
11985
11986 u32 *digest = (u32 *) hash_buf->digest;
11987
11988 salt_t *salt = hash_buf->salt;
11989
11990 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11991 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11992 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11993 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11994
11995 digest[0] = byte_swap_32 (digest[0]);
11996 digest[1] = byte_swap_32 (digest[1]);
11997 digest[2] = byte_swap_32 (digest[2]);
11998 digest[3] = byte_swap_32 (digest[3]);
11999
12000 digest[0] -= MD4M_A;
12001 digest[1] -= MD4M_B;
12002 digest[2] -= MD4M_C;
12003 digest[3] -= MD4M_D;
12004
12005 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12006
12007 uint salt_len = input_len - 32 - 1;
12008
12009 char *salt_buf = input_buf + 32 + 1;
12010
12011 char *salt_buf_ptr = (char *) salt->salt_buf;
12012
12013 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12014
12015 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12016
12017 salt->salt_len = salt_len;
12018
12019 return (PARSER_OK);
12020 }
12021
12022 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12023 {
12024 if (data.opts_type & OPTS_TYPE_ST_HEX)
12025 {
12026 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
12027 }
12028 else
12029 {
12030 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
12031 }
12032
12033 u32 *digest = (u32 *) hash_buf->digest;
12034
12035 salt_t *salt = hash_buf->salt;
12036
12037 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12038 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12039 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12040 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12041
12042 digest[0] = byte_swap_32 (digest[0]);
12043 digest[1] = byte_swap_32 (digest[1]);
12044 digest[2] = byte_swap_32 (digest[2]);
12045 digest[3] = byte_swap_32 (digest[3]);
12046
12047 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12048
12049 uint salt_len = input_len - 32 - 1;
12050
12051 char *salt_buf = input_buf + 32 + 1;
12052
12053 uint salt_pc_block[16] = { 0 };
12054
12055 char *salt_pc_block_ptr = (char *) salt_pc_block;
12056
12057 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
12058
12059 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12060
12061 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
12062
12063 salt_pc_block[14] = salt_len * 8;
12064
12065 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
12066
12067 md5_64 (salt_pc_block, salt_pc_digest);
12068
12069 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
12070 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
12071 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
12072 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
12073
12074 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
12075
12076 memcpy (salt_buf_ptr, salt_buf, salt_len);
12077
12078 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
12079
12080 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
12081 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
12082 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
12083 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
12084
12085 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
12086
12087 return (PARSER_OK);
12088 }
12089
12090 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12091 {
12092 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
12093
12094 u32 *digest = (u32 *) hash_buf->digest;
12095
12096 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12097 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12098 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12099 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12100 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12101
12102 digest[0] -= SHA1M_A;
12103 digest[1] -= SHA1M_B;
12104 digest[2] -= SHA1M_C;
12105 digest[3] -= SHA1M_D;
12106 digest[4] -= SHA1M_E;
12107
12108 return (PARSER_OK);
12109 }
12110
12111 int sha1axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12112 {
12113 if ((input_len < DISPLAY_LEN_MIN_13300) || (input_len > DISPLAY_LEN_MAX_13300)) return (PARSER_GLOBAL_LENGTH);
12114
12115 if (memcmp (SIGNATURE_AXCRYPT_SHA1, input_buf, 13)) return (PARSER_SIGNATURE_UNMATCHED);
12116
12117 u32 *digest = (u32 *) hash_buf->digest;
12118
12119 input_buf += 14;
12120
12121 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12122 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12123 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12124 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12125 digest[4] = 0;
12126
12127 return (PARSER_OK);
12128 }
12129
12130 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12131 {
12132 if (data.opts_type & OPTS_TYPE_ST_HEX)
12133 {
12134 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
12135 }
12136 else
12137 {
12138 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
12139 }
12140
12141 u32 *digest = (u32 *) hash_buf->digest;
12142
12143 salt_t *salt = hash_buf->salt;
12144
12145 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12146 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12147 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12148 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12149 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12150
12151 digest[0] -= SHA1M_A;
12152 digest[1] -= SHA1M_B;
12153 digest[2] -= SHA1M_C;
12154 digest[3] -= SHA1M_D;
12155 digest[4] -= SHA1M_E;
12156
12157 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12158
12159 uint salt_len = input_len - 40 - 1;
12160
12161 char *salt_buf = input_buf + 40 + 1;
12162
12163 char *salt_buf_ptr = (char *) salt->salt_buf;
12164
12165 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12166
12167 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12168
12169 salt->salt_len = salt_len;
12170
12171 return (PARSER_OK);
12172 }
12173
12174 int pstoken_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12175 {
12176 if ((input_len < DISPLAY_LEN_MIN_13500) || (input_len > DISPLAY_LEN_MAX_13500)) return (PARSER_GLOBAL_LENGTH);
12177
12178 u32 *digest = (u32 *) hash_buf->digest;
12179
12180 salt_t *salt = hash_buf->salt;
12181
12182 pstoken_t *pstoken = (pstoken_t *) hash_buf->esalt;
12183
12184 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12185 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12186 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12187 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12188 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12189
12190 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12191
12192 uint salt_len = input_len - 40 - 1;
12193
12194 char *salt_buf = input_buf + 40 + 1;
12195
12196 if (salt_len == UINT_MAX || salt_len % 2 != 0) return (PARSER_SALT_LENGTH);
12197
12198 u8 *pstoken_ptr = (u8 *) pstoken->salt_buf;
12199
12200 for (uint i = 0, j = 0; i < salt_len; i += 2, j += 1)
12201 {
12202 pstoken_ptr[j] = hex_to_u8 ((const u8 *) &salt_buf[i]);
12203 }
12204
12205 pstoken->salt_len = salt_len / 2;
12206
12207 /* some fake salt for the sorting mechanisms */
12208
12209 salt->salt_buf[0] = pstoken->salt_buf[0];
12210 salt->salt_buf[1] = pstoken->salt_buf[1];
12211 salt->salt_buf[2] = pstoken->salt_buf[2];
12212 salt->salt_buf[3] = pstoken->salt_buf[3];
12213 salt->salt_buf[4] = pstoken->salt_buf[4];
12214 salt->salt_buf[5] = pstoken->salt_buf[5];
12215 salt->salt_buf[6] = pstoken->salt_buf[6];
12216 salt->salt_buf[7] = pstoken->salt_buf[7];
12217
12218 salt->salt_len = 32;
12219
12220 /* we need to check if we can precompute some of the data --
12221 this is possible since the scheme is badly designed */
12222
12223 pstoken->pc_digest[0] = SHA1M_A;
12224 pstoken->pc_digest[1] = SHA1M_B;
12225 pstoken->pc_digest[2] = SHA1M_C;
12226 pstoken->pc_digest[3] = SHA1M_D;
12227 pstoken->pc_digest[4] = SHA1M_E;
12228
12229 pstoken->pc_offset = 0;
12230
12231 for (int i = 0; i < (int) pstoken->salt_len - 63; i += 64)
12232 {
12233 uint w[16];
12234
12235 w[ 0] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 0]);
12236 w[ 1] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 1]);
12237 w[ 2] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 2]);
12238 w[ 3] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 3]);
12239 w[ 4] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 4]);
12240 w[ 5] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 5]);
12241 w[ 6] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 6]);
12242 w[ 7] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 7]);
12243 w[ 8] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 8]);
12244 w[ 9] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 9]);
12245 w[10] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 10]);
12246 w[11] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 11]);
12247 w[12] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 12]);
12248 w[13] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 13]);
12249 w[14] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 14]);
12250 w[15] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 15]);
12251
12252 sha1_64 (w, pstoken->pc_digest);
12253
12254 pstoken->pc_offset += 16;
12255 }
12256
12257 return (PARSER_OK);
12258 }
12259
12260 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12261 {
12262 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
12263
12264 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
12265
12266 u32 *digest = (u32 *) hash_buf->digest;
12267
12268 u8 tmp_buf[100] = { 0 };
12269
12270 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
12271
12272 memcpy (digest, tmp_buf, 20);
12273
12274 digest[0] = byte_swap_32 (digest[0]);
12275 digest[1] = byte_swap_32 (digest[1]);
12276 digest[2] = byte_swap_32 (digest[2]);
12277 digest[3] = byte_swap_32 (digest[3]);
12278 digest[4] = byte_swap_32 (digest[4]);
12279
12280 digest[0] -= SHA1M_A;
12281 digest[1] -= SHA1M_B;
12282 digest[2] -= SHA1M_C;
12283 digest[3] -= SHA1M_D;
12284 digest[4] -= SHA1M_E;
12285
12286 return (PARSER_OK);
12287 }
12288
12289 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12290 {
12291 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
12292
12293 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12294
12295 u32 *digest = (u32 *) hash_buf->digest;
12296
12297 salt_t *salt = hash_buf->salt;
12298
12299 u8 tmp_buf[100] = { 0 };
12300
12301 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
12302
12303 if (tmp_len < 20) return (PARSER_HASH_LENGTH);
12304
12305 memcpy (digest, tmp_buf, 20);
12306
12307 int salt_len = tmp_len - 20;
12308
12309 if (salt_len < 0) return (PARSER_SALT_LENGTH);
12310
12311 salt->salt_len = salt_len;
12312
12313 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
12314
12315 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12316 {
12317 char *ptr = (char *) salt->salt_buf;
12318
12319 ptr[salt->salt_len] = 0x80;
12320 }
12321
12322 digest[0] = byte_swap_32 (digest[0]);
12323 digest[1] = byte_swap_32 (digest[1]);
12324 digest[2] = byte_swap_32 (digest[2]);
12325 digest[3] = byte_swap_32 (digest[3]);
12326 digest[4] = byte_swap_32 (digest[4]);
12327
12328 digest[0] -= SHA1M_A;
12329 digest[1] -= SHA1M_B;
12330 digest[2] -= SHA1M_C;
12331 digest[3] -= SHA1M_D;
12332 digest[4] -= SHA1M_E;
12333
12334 return (PARSER_OK);
12335 }
12336
12337 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12338 {
12339 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
12340
12341 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12342
12343 u32 *digest = (u32 *) hash_buf->digest;
12344
12345 salt_t *salt = hash_buf->salt;
12346
12347 char *salt_buf = input_buf + 6;
12348
12349 uint salt_len = 8;
12350
12351 char *salt_buf_ptr = (char *) salt->salt_buf;
12352
12353 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12354
12355 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12356
12357 salt->salt_len = salt_len;
12358
12359 char *hash_pos = input_buf + 6 + 8 + 40;
12360
12361 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12362 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12363 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12364 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12365 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12366
12367 digest[0] -= SHA1M_A;
12368 digest[1] -= SHA1M_B;
12369 digest[2] -= SHA1M_C;
12370 digest[3] -= SHA1M_D;
12371 digest[4] -= SHA1M_E;
12372
12373 return (PARSER_OK);
12374 }
12375
12376 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12377 {
12378 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
12379
12380 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12381
12382 u32 *digest = (u32 *) hash_buf->digest;
12383
12384 salt_t *salt = hash_buf->salt;
12385
12386 char *salt_buf = input_buf + 6;
12387
12388 uint salt_len = 8;
12389
12390 char *salt_buf_ptr = (char *) salt->salt_buf;
12391
12392 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12393
12394 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12395
12396 salt->salt_len = salt_len;
12397
12398 char *hash_pos = input_buf + 6 + 8;
12399
12400 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12401 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12402 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12403 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12404 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12405
12406 digest[0] -= SHA1M_A;
12407 digest[1] -= SHA1M_B;
12408 digest[2] -= SHA1M_C;
12409 digest[3] -= SHA1M_D;
12410 digest[4] -= SHA1M_E;
12411
12412 return (PARSER_OK);
12413 }
12414
12415 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12416 {
12417 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
12418
12419 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12420
12421 u64 *digest = (u64 *) hash_buf->digest;
12422
12423 salt_t *salt = hash_buf->salt;
12424
12425 char *salt_buf = input_buf + 6;
12426
12427 uint salt_len = 8;
12428
12429 char *salt_buf_ptr = (char *) salt->salt_buf;
12430
12431 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12432
12433 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12434
12435 salt->salt_len = salt_len;
12436
12437 char *hash_pos = input_buf + 6 + 8;
12438
12439 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12440 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12441 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12442 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12443 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12444 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12445 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12446 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12447
12448 digest[0] -= SHA512M_A;
12449 digest[1] -= SHA512M_B;
12450 digest[2] -= SHA512M_C;
12451 digest[3] -= SHA512M_D;
12452 digest[4] -= SHA512M_E;
12453 digest[5] -= SHA512M_F;
12454 digest[6] -= SHA512M_G;
12455 digest[7] -= SHA512M_H;
12456
12457 return (PARSER_OK);
12458 }
12459
12460 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12461 {
12462 if (data.opts_type & OPTS_TYPE_ST_HEX)
12463 {
12464 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
12465 }
12466 else
12467 {
12468 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
12469 }
12470
12471 u32 *digest = (u32 *) hash_buf->digest;
12472
12473 salt_t *salt = hash_buf->salt;
12474
12475 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12476 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12477 digest[2] = 0;
12478 digest[3] = 0;
12479
12480 digest[0] = byte_swap_32 (digest[0]);
12481 digest[1] = byte_swap_32 (digest[1]);
12482
12483 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12484
12485 uint salt_len = input_len - 16 - 1;
12486
12487 char *salt_buf = input_buf + 16 + 1;
12488
12489 char *salt_buf_ptr = (char *) salt->salt_buf;
12490
12491 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12492
12493 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12494
12495 salt->salt_len = salt_len;
12496
12497 return (PARSER_OK);
12498 }
12499
12500 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12501 {
12502 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
12503
12504 u32 *digest = (u32 *) hash_buf->digest;
12505
12506 salt_t *salt = hash_buf->salt;
12507
12508 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12509 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12510 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12511 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12512 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12513
12514 digest[0] -= SHA1M_A;
12515 digest[1] -= SHA1M_B;
12516 digest[2] -= SHA1M_C;
12517 digest[3] -= SHA1M_D;
12518 digest[4] -= SHA1M_E;
12519
12520 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12521
12522 uint salt_len = input_len - 40 - 1;
12523
12524 char *salt_buf = input_buf + 40 + 1;
12525
12526 char *salt_buf_ptr = (char *) salt->salt_buf;
12527
12528 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12529
12530 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12531
12532 salt->salt_len = salt_len;
12533
12534 return (PARSER_OK);
12535 }
12536
12537 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12538 {
12539 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
12540
12541 u32 *digest = (u32 *) hash_buf->digest;
12542
12543 salt_t *salt = hash_buf->salt;
12544
12545 char *hash_pos = input_buf;
12546
12547 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12548 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12549 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
12550 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
12551 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
12552 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
12553 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
12554 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
12555 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
12556 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
12557 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
12558 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
12559 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
12560 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
12561 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
12562 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
12563
12564 char *salt_pos = input_buf + 128;
12565
12566 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12567 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12568 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12569 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12570
12571 salt->salt_iter = ROUNDS_ORACLET - 1;
12572 salt->salt_len = 16;
12573
12574 return (PARSER_OK);
12575 }
12576
12577 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12578 {
12579 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
12580
12581 u32 *digest = (u32 *) hash_buf->digest;
12582
12583 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12584 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12585 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12586 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12587 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12588 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12589 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12590 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12591
12592 digest[0] -= SHA256M_A;
12593 digest[1] -= SHA256M_B;
12594 digest[2] -= SHA256M_C;
12595 digest[3] -= SHA256M_D;
12596 digest[4] -= SHA256M_E;
12597 digest[5] -= SHA256M_F;
12598 digest[6] -= SHA256M_G;
12599 digest[7] -= SHA256M_H;
12600
12601 return (PARSER_OK);
12602 }
12603
12604 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12605 {
12606 if (data.opts_type & OPTS_TYPE_ST_HEX)
12607 {
12608 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
12609 }
12610 else
12611 {
12612 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
12613 }
12614
12615 u32 *digest = (u32 *) hash_buf->digest;
12616
12617 salt_t *salt = hash_buf->salt;
12618
12619 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12620 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12621 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12622 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12623 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12624 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12625 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12626 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12627
12628 digest[0] -= SHA256M_A;
12629 digest[1] -= SHA256M_B;
12630 digest[2] -= SHA256M_C;
12631 digest[3] -= SHA256M_D;
12632 digest[4] -= SHA256M_E;
12633 digest[5] -= SHA256M_F;
12634 digest[6] -= SHA256M_G;
12635 digest[7] -= SHA256M_H;
12636
12637 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12638
12639 uint salt_len = input_len - 64 - 1;
12640
12641 char *salt_buf = input_buf + 64 + 1;
12642
12643 char *salt_buf_ptr = (char *) salt->salt_buf;
12644
12645 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12646
12647 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12648
12649 salt->salt_len = salt_len;
12650
12651 return (PARSER_OK);
12652 }
12653
12654 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12655 {
12656 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
12657
12658 u64 *digest = (u64 *) hash_buf->digest;
12659
12660 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12661 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12662 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12663 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12664 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12665 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12666 digest[6] = 0;
12667 digest[7] = 0;
12668
12669 digest[0] -= SHA384M_A;
12670 digest[1] -= SHA384M_B;
12671 digest[2] -= SHA384M_C;
12672 digest[3] -= SHA384M_D;
12673 digest[4] -= SHA384M_E;
12674 digest[5] -= SHA384M_F;
12675 digest[6] -= 0;
12676 digest[7] -= 0;
12677
12678 return (PARSER_OK);
12679 }
12680
12681 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12682 {
12683 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
12684
12685 u64 *digest = (u64 *) hash_buf->digest;
12686
12687 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12688 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12689 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12690 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12691 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12692 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12693 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12694 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12695
12696 digest[0] -= SHA512M_A;
12697 digest[1] -= SHA512M_B;
12698 digest[2] -= SHA512M_C;
12699 digest[3] -= SHA512M_D;
12700 digest[4] -= SHA512M_E;
12701 digest[5] -= SHA512M_F;
12702 digest[6] -= SHA512M_G;
12703 digest[7] -= SHA512M_H;
12704
12705 return (PARSER_OK);
12706 }
12707
12708 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12709 {
12710 if (data.opts_type & OPTS_TYPE_ST_HEX)
12711 {
12712 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
12713 }
12714 else
12715 {
12716 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
12717 }
12718
12719 u64 *digest = (u64 *) hash_buf->digest;
12720
12721 salt_t *salt = hash_buf->salt;
12722
12723 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12724 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12725 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12726 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12727 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12728 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12729 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12730 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12731
12732 digest[0] -= SHA512M_A;
12733 digest[1] -= SHA512M_B;
12734 digest[2] -= SHA512M_C;
12735 digest[3] -= SHA512M_D;
12736 digest[4] -= SHA512M_E;
12737 digest[5] -= SHA512M_F;
12738 digest[6] -= SHA512M_G;
12739 digest[7] -= SHA512M_H;
12740
12741 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12742
12743 uint salt_len = input_len - 128 - 1;
12744
12745 char *salt_buf = input_buf + 128 + 1;
12746
12747 char *salt_buf_ptr = (char *) salt->salt_buf;
12748
12749 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12750
12751 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12752
12753 salt->salt_len = salt_len;
12754
12755 return (PARSER_OK);
12756 }
12757
12758 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12759 {
12760 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12761
12762 u64 *digest = (u64 *) hash_buf->digest;
12763
12764 salt_t *salt = hash_buf->salt;
12765
12766 char *salt_pos = input_buf + 3;
12767
12768 uint iterations_len = 0;
12769
12770 if (memcmp (salt_pos, "rounds=", 7) == 0)
12771 {
12772 salt_pos += 7;
12773
12774 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12775
12776 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12777 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12778
12779 salt_pos[0] = 0x0;
12780
12781 salt->salt_iter = atoi (salt_pos - iterations_len);
12782
12783 salt_pos += 1;
12784
12785 iterations_len += 8;
12786 }
12787 else
12788 {
12789 salt->salt_iter = ROUNDS_SHA512CRYPT;
12790 }
12791
12792 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12793
12794 char *hash_pos = strchr (salt_pos, '$');
12795
12796 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12797
12798 uint salt_len = hash_pos - salt_pos;
12799
12800 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12801
12802 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12803
12804 salt->salt_len = salt_len;
12805
12806 hash_pos++;
12807
12808 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12809
12810 return (PARSER_OK);
12811 }
12812
12813 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12814 {
12815 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12816
12817 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12818
12819 u64 *digest = (u64 *) hash_buf->digest;
12820
12821 salt_t *salt = hash_buf->salt;
12822
12823 uint keccak_mdlen = input_len / 2;
12824
12825 for (uint i = 0; i < keccak_mdlen / 8; i++)
12826 {
12827 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12828
12829 digest[i] = byte_swap_64 (digest[i]);
12830 }
12831
12832 salt->keccak_mdlen = keccak_mdlen;
12833
12834 return (PARSER_OK);
12835 }
12836
12837 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12838 {
12839 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12840
12841 u32 *digest = (u32 *) hash_buf->digest;
12842
12843 salt_t *salt = hash_buf->salt;
12844
12845 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12846
12847 /**
12848 * Parse that strange long line
12849 */
12850
12851 char *in_off[9];
12852
12853 size_t in_len[9] = { 0 };
12854
12855 in_off[0] = strtok (input_buf, ":");
12856
12857 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12858
12859 in_len[0] = strlen (in_off[0]);
12860
12861 size_t i;
12862
12863 for (i = 1; i < 9; i++)
12864 {
12865 in_off[i] = strtok (NULL, ":");
12866
12867 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12868
12869 in_len[i] = strlen (in_off[i]);
12870 }
12871
12872 char *ptr = (char *) ikepsk->msg_buf;
12873
12874 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12875 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12876 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12877 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12878 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12879 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12880
12881 *ptr = 0x80;
12882
12883 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12884
12885 ptr = (char *) ikepsk->nr_buf;
12886
12887 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12888 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12889
12890 *ptr = 0x80;
12891
12892 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12893
12894 /**
12895 * Store to database
12896 */
12897
12898 ptr = in_off[8];
12899
12900 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12901 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12902 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12903 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12904
12905 digest[0] = byte_swap_32 (digest[0]);
12906 digest[1] = byte_swap_32 (digest[1]);
12907 digest[2] = byte_swap_32 (digest[2]);
12908 digest[3] = byte_swap_32 (digest[3]);
12909
12910 salt->salt_len = 32;
12911
12912 salt->salt_buf[0] = ikepsk->nr_buf[0];
12913 salt->salt_buf[1] = ikepsk->nr_buf[1];
12914 salt->salt_buf[2] = ikepsk->nr_buf[2];
12915 salt->salt_buf[3] = ikepsk->nr_buf[3];
12916 salt->salt_buf[4] = ikepsk->nr_buf[4];
12917 salt->salt_buf[5] = ikepsk->nr_buf[5];
12918 salt->salt_buf[6] = ikepsk->nr_buf[6];
12919 salt->salt_buf[7] = ikepsk->nr_buf[7];
12920
12921 return (PARSER_OK);
12922 }
12923
12924 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12925 {
12926 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12927
12928 u32 *digest = (u32 *) hash_buf->digest;
12929
12930 salt_t *salt = hash_buf->salt;
12931
12932 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12933
12934 /**
12935 * Parse that strange long line
12936 */
12937
12938 char *in_off[9];
12939
12940 size_t in_len[9] = { 0 };
12941
12942 in_off[0] = strtok (input_buf, ":");
12943
12944 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12945
12946 in_len[0] = strlen (in_off[0]);
12947
12948 size_t i;
12949
12950 for (i = 1; i < 9; i++)
12951 {
12952 in_off[i] = strtok (NULL, ":");
12953
12954 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12955
12956 in_len[i] = strlen (in_off[i]);
12957 }
12958
12959 char *ptr = (char *) ikepsk->msg_buf;
12960
12961 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12962 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12963 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12964 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12965 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12966 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12967
12968 *ptr = 0x80;
12969
12970 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12971
12972 ptr = (char *) ikepsk->nr_buf;
12973
12974 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12975 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12976
12977 *ptr = 0x80;
12978
12979 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12980
12981 /**
12982 * Store to database
12983 */
12984
12985 ptr = in_off[8];
12986
12987 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12988 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12989 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12990 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12991 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12992
12993 salt->salt_len = 32;
12994
12995 salt->salt_buf[0] = ikepsk->nr_buf[0];
12996 salt->salt_buf[1] = ikepsk->nr_buf[1];
12997 salt->salt_buf[2] = ikepsk->nr_buf[2];
12998 salt->salt_buf[3] = ikepsk->nr_buf[3];
12999 salt->salt_buf[4] = ikepsk->nr_buf[4];
13000 salt->salt_buf[5] = ikepsk->nr_buf[5];
13001 salt->salt_buf[6] = ikepsk->nr_buf[6];
13002 salt->salt_buf[7] = ikepsk->nr_buf[7];
13003
13004 return (PARSER_OK);
13005 }
13006
13007 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13008 {
13009 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
13010
13011 u32 *digest = (u32 *) hash_buf->digest;
13012
13013 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13014 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13015 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13016 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13017 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13018
13019 digest[0] = byte_swap_32 (digest[0]);
13020 digest[1] = byte_swap_32 (digest[1]);
13021 digest[2] = byte_swap_32 (digest[2]);
13022 digest[3] = byte_swap_32 (digest[3]);
13023 digest[4] = byte_swap_32 (digest[4]);
13024
13025 return (PARSER_OK);
13026 }
13027
13028 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13029 {
13030 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
13031
13032 u32 *digest = (u32 *) hash_buf->digest;
13033
13034 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13035 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13036 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
13037 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
13038 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
13039 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
13040 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
13041 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
13042 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
13043 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
13044 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
13045 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
13046 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
13047 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
13048 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
13049 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
13050
13051 return (PARSER_OK);
13052 }
13053
13054 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13055 {
13056 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
13057
13058 u32 *digest = (u32 *) hash_buf->digest;
13059
13060 salt_t *salt = hash_buf->salt;
13061
13062 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13063 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13064 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13065 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13066 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13067
13068 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13069
13070 uint salt_len = input_len - 40 - 1;
13071
13072 char *salt_buf = input_buf + 40 + 1;
13073
13074 char *salt_buf_ptr = (char *) salt->salt_buf;
13075
13076 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13077
13078 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13079
13080 salt->salt_len = salt_len;
13081
13082 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
13083
13084 return (PARSER_OK);
13085 }
13086
13087 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
13088 {
13089 u32 *digest = (u32 *) hash_buf->digest;
13090
13091 salt_t *salt = hash_buf->salt;
13092
13093 tc_t *tc = (tc_t *) hash_buf->esalt;
13094
13095 if (input_len == 0)
13096 {
13097 log_error ("TrueCrypt container not specified");
13098
13099 exit (-1);
13100 }
13101
13102 FILE *fp = fopen (input_buf, "rb");
13103
13104 if (fp == NULL)
13105 {
13106 log_error ("%s: %s", input_buf, strerror (errno));
13107
13108 exit (-1);
13109 }
13110
13111 char buf[512] = { 0 };
13112
13113 int n = fread (buf, 1, sizeof (buf), fp);
13114
13115 fclose (fp);
13116
13117 if (n != 512) return (PARSER_TC_FILE_SIZE);
13118
13119 memcpy (tc->salt_buf, buf, 64);
13120
13121 memcpy (tc->data_buf, buf + 64, 512 - 64);
13122
13123 salt->salt_buf[0] = tc->salt_buf[0];
13124
13125 salt->salt_len = 4;
13126
13127 salt->salt_iter = ROUNDS_TRUECRYPT_1K - 1;
13128
13129 tc->signature = 0x45555254; // "TRUE"
13130
13131 digest[0] = tc->data_buf[0];
13132
13133 return (PARSER_OK);
13134 }
13135
13136 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
13137 {
13138 u32 *digest = (u32 *) hash_buf->digest;
13139
13140 salt_t *salt = hash_buf->salt;
13141
13142 tc_t *tc = (tc_t *) hash_buf->esalt;
13143
13144 if (input_len == 0)
13145 {
13146 log_error ("TrueCrypt container not specified");
13147
13148 exit (-1);
13149 }
13150
13151 FILE *fp = fopen (input_buf, "rb");
13152
13153 if (fp == NULL)
13154 {
13155 log_error ("%s: %s", input_buf, strerror (errno));
13156
13157 exit (-1);
13158 }
13159
13160 char buf[512] = { 0 };
13161
13162 int n = fread (buf, 1, sizeof (buf), fp);
13163
13164 fclose (fp);
13165
13166 if (n != 512) return (PARSER_TC_FILE_SIZE);
13167
13168 memcpy (tc->salt_buf, buf, 64);
13169
13170 memcpy (tc->data_buf, buf + 64, 512 - 64);
13171
13172 salt->salt_buf[0] = tc->salt_buf[0];
13173
13174 salt->salt_len = 4;
13175
13176 salt->salt_iter = ROUNDS_TRUECRYPT_2K - 1;
13177
13178 tc->signature = 0x45555254; // "TRUE"
13179
13180 digest[0] = tc->data_buf[0];
13181
13182 return (PARSER_OK);
13183 }
13184
13185 int veracrypt_parse_hash_200000 (char *input_buf, uint input_len, hash_t *hash_buf)
13186 {
13187 u32 *digest = (u32 *) hash_buf->digest;
13188
13189 salt_t *salt = hash_buf->salt;
13190
13191 tc_t *tc = (tc_t *) hash_buf->esalt;
13192
13193 if (input_len == 0)
13194 {
13195 log_error ("VeraCrypt container not specified");
13196
13197 exit (-1);
13198 }
13199
13200 FILE *fp = fopen (input_buf, "rb");
13201
13202 if (fp == NULL)
13203 {
13204 log_error ("%s: %s", input_buf, strerror (errno));
13205
13206 exit (-1);
13207 }
13208
13209 char buf[512] = { 0 };
13210
13211 int n = fread (buf, 1, sizeof (buf), fp);
13212
13213 fclose (fp);
13214
13215 if (n != 512) return (PARSER_VC_FILE_SIZE);
13216
13217 memcpy (tc->salt_buf, buf, 64);
13218
13219 memcpy (tc->data_buf, buf + 64, 512 - 64);
13220
13221 salt->salt_buf[0] = tc->salt_buf[0];
13222
13223 salt->salt_len = 4;
13224
13225 salt->salt_iter = ROUNDS_VERACRYPT_200000 - 1;
13226
13227 tc->signature = 0x41524556; // "VERA"
13228
13229 digest[0] = tc->data_buf[0];
13230
13231 return (PARSER_OK);
13232 }
13233
13234 int veracrypt_parse_hash_500000 (char *input_buf, uint input_len, hash_t *hash_buf)
13235 {
13236 u32 *digest = (u32 *) hash_buf->digest;
13237
13238 salt_t *salt = hash_buf->salt;
13239
13240 tc_t *tc = (tc_t *) hash_buf->esalt;
13241
13242 if (input_len == 0)
13243 {
13244 log_error ("VeraCrypt container not specified");
13245
13246 exit (-1);
13247 }
13248
13249 FILE *fp = fopen (input_buf, "rb");
13250
13251 if (fp == NULL)
13252 {
13253 log_error ("%s: %s", input_buf, strerror (errno));
13254
13255 exit (-1);
13256 }
13257
13258 char buf[512] = { 0 };
13259
13260 int n = fread (buf, 1, sizeof (buf), fp);
13261
13262 fclose (fp);
13263
13264 if (n != 512) return (PARSER_VC_FILE_SIZE);
13265
13266 memcpy (tc->salt_buf, buf, 64);
13267
13268 memcpy (tc->data_buf, buf + 64, 512 - 64);
13269
13270 salt->salt_buf[0] = tc->salt_buf[0];
13271
13272 salt->salt_len = 4;
13273
13274 salt->salt_iter = ROUNDS_VERACRYPT_500000 - 1;
13275
13276 tc->signature = 0x41524556; // "VERA"
13277
13278 digest[0] = tc->data_buf[0];
13279
13280 return (PARSER_OK);
13281 }
13282
13283 int veracrypt_parse_hash_327661 (char *input_buf, uint input_len, hash_t *hash_buf)
13284 {
13285 u32 *digest = (u32 *) hash_buf->digest;
13286
13287 salt_t *salt = hash_buf->salt;
13288
13289 tc_t *tc = (tc_t *) hash_buf->esalt;
13290
13291 if (input_len == 0)
13292 {
13293 log_error ("VeraCrypt container not specified");
13294
13295 exit (-1);
13296 }
13297
13298 FILE *fp = fopen (input_buf, "rb");
13299
13300 if (fp == NULL)
13301 {
13302 log_error ("%s: %s", input_buf, strerror (errno));
13303
13304 exit (-1);
13305 }
13306
13307 char buf[512] = { 0 };
13308
13309 int n = fread (buf, 1, sizeof (buf), fp);
13310
13311 fclose (fp);
13312
13313 if (n != 512) return (PARSER_VC_FILE_SIZE);
13314
13315 memcpy (tc->salt_buf, buf, 64);
13316
13317 memcpy (tc->data_buf, buf + 64, 512 - 64);
13318
13319 salt->salt_buf[0] = tc->salt_buf[0];
13320
13321 salt->salt_len = 4;
13322
13323 salt->salt_iter = ROUNDS_VERACRYPT_327661 - 1;
13324
13325 tc->signature = 0x41524556; // "VERA"
13326
13327 digest[0] = tc->data_buf[0];
13328
13329 return (PARSER_OK);
13330 }
13331
13332 int veracrypt_parse_hash_655331 (char *input_buf, uint input_len, hash_t *hash_buf)
13333 {
13334 u32 *digest = (u32 *) hash_buf->digest;
13335
13336 salt_t *salt = hash_buf->salt;
13337
13338 tc_t *tc = (tc_t *) hash_buf->esalt;
13339
13340 if (input_len == 0)
13341 {
13342 log_error ("VeraCrypt container not specified");
13343
13344 exit (-1);
13345 }
13346
13347 FILE *fp = fopen (input_buf, "rb");
13348
13349 if (fp == NULL)
13350 {
13351 log_error ("%s: %s", input_buf, strerror (errno));
13352
13353 exit (-1);
13354 }
13355
13356 char buf[512] = { 0 };
13357
13358 int n = fread (buf, 1, sizeof (buf), fp);
13359
13360 fclose (fp);
13361
13362 if (n != 512) return (PARSER_VC_FILE_SIZE);
13363
13364 memcpy (tc->salt_buf, buf, 64);
13365
13366 memcpy (tc->data_buf, buf + 64, 512 - 64);
13367
13368 salt->salt_buf[0] = tc->salt_buf[0];
13369
13370 salt->salt_len = 4;
13371
13372 salt->salt_iter = ROUNDS_VERACRYPT_655331 - 1;
13373
13374 tc->signature = 0x41524556; // "VERA"
13375
13376 digest[0] = tc->data_buf[0];
13377
13378 return (PARSER_OK);
13379 }
13380
13381 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13382 {
13383 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
13384
13385 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13386
13387 u32 *digest = (u32 *) hash_buf->digest;
13388
13389 salt_t *salt = hash_buf->salt;
13390
13391 char *salt_pos = input_buf + 6;
13392
13393 char *hash_pos = strchr (salt_pos, '$');
13394
13395 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13396
13397 uint salt_len = hash_pos - salt_pos;
13398
13399 if (salt_len < 8) return (PARSER_SALT_LENGTH);
13400
13401 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13402
13403 salt->salt_len = salt_len;
13404
13405 salt->salt_iter = 1000;
13406
13407 hash_pos++;
13408
13409 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13410
13411 return (PARSER_OK);
13412 }
13413
13414 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13415 {
13416 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
13417
13418 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
13419
13420 u32 *digest = (u32 *) hash_buf->digest;
13421
13422 salt_t *salt = hash_buf->salt;
13423
13424 char *iter_pos = input_buf + 7;
13425
13426 char *salt_pos = strchr (iter_pos, '$');
13427
13428 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13429
13430 salt_pos++;
13431
13432 char *hash_pos = strchr (salt_pos, '$');
13433
13434 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13435
13436 uint salt_len = hash_pos - salt_pos;
13437
13438 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13439
13440 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13441
13442 salt->salt_len = salt_len;
13443
13444 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13445
13446 salt->salt_sign[0] = atoi (salt_iter);
13447
13448 salt->salt_iter = (1u << atoi (salt_iter)) - 1;
13449
13450 hash_pos++;
13451
13452 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13453
13454 digest[0] = byte_swap_32 (digest[0]);
13455 digest[1] = byte_swap_32 (digest[1]);
13456 digest[2] = byte_swap_32 (digest[2]);
13457 digest[3] = byte_swap_32 (digest[3]);
13458 digest[4] = byte_swap_32 (digest[4]);
13459
13460 return (PARSER_OK);
13461 }
13462
13463 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13464 {
13465 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
13466
13467 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13468
13469 u32 *digest = (u32 *) hash_buf->digest;
13470
13471 salt_t *salt = hash_buf->salt;
13472
13473 char *iter_pos = input_buf + 9;
13474
13475 char *salt_pos = strchr (iter_pos, '$');
13476
13477 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13478
13479 salt_pos++;
13480
13481 char *hash_pos = strchr (salt_pos, '$');
13482
13483 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13484
13485 uint salt_len = hash_pos - salt_pos;
13486
13487 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13488
13489 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13490
13491 salt->salt_len = salt_len;
13492
13493 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13494
13495 salt->salt_sign[0] = atoi (salt_iter);
13496
13497 salt->salt_iter = (1u << atoi (salt_iter)) - 1;
13498
13499 hash_pos++;
13500
13501 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13502
13503 digest[0] = byte_swap_32 (digest[0]);
13504 digest[1] = byte_swap_32 (digest[1]);
13505 digest[2] = byte_swap_32 (digest[2]);
13506 digest[3] = byte_swap_32 (digest[3]);
13507 digest[4] = byte_swap_32 (digest[4]);
13508 digest[5] = byte_swap_32 (digest[5]);
13509 digest[6] = byte_swap_32 (digest[6]);
13510 digest[7] = byte_swap_32 (digest[7]);
13511
13512 return (PARSER_OK);
13513 }
13514
13515 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13516 {
13517 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
13518
13519 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13520
13521 u64 *digest = (u64 *) hash_buf->digest;
13522
13523 salt_t *salt = hash_buf->salt;
13524
13525 char *iter_pos = input_buf + 9;
13526
13527 char *salt_pos = strchr (iter_pos, '$');
13528
13529 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13530
13531 salt_pos++;
13532
13533 char *hash_pos = strchr (salt_pos, '$');
13534
13535 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13536
13537 uint salt_len = hash_pos - salt_pos;
13538
13539 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13540
13541 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13542
13543 salt->salt_len = salt_len;
13544
13545 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13546
13547 salt->salt_sign[0] = atoi (salt_iter);
13548
13549 salt->salt_iter = (1u << atoi (salt_iter)) - 1;
13550
13551 hash_pos++;
13552
13553 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13554
13555 digest[0] = byte_swap_64 (digest[0]);
13556 digest[1] = byte_swap_64 (digest[1]);
13557 digest[2] = byte_swap_64 (digest[2]);
13558 digest[3] = byte_swap_64 (digest[3]);
13559 digest[4] = byte_swap_64 (digest[4]);
13560 digest[5] = byte_swap_64 (digest[5]);
13561 digest[6] = byte_swap_64 (digest[6]);
13562 digest[7] = byte_swap_64 (digest[7]);
13563
13564 return (PARSER_OK);
13565 }
13566
13567 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13568 {
13569 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
13570
13571 u32 *digest = (u32 *) hash_buf->digest;
13572
13573 salt_t *salt = hash_buf->salt;
13574
13575 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
13576
13577 /**
13578 * parse line
13579 */
13580
13581 char *iterations_pos = input_buf;
13582
13583 char *saltbuf_pos = strchr (iterations_pos, ':');
13584
13585 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13586
13587 uint iterations_len = saltbuf_pos - iterations_pos;
13588
13589 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
13590
13591 saltbuf_pos++;
13592
13593 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
13594
13595 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13596
13597 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
13598
13599 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
13600
13601 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
13602
13603 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
13604
13605 cipherbuf_pos++;
13606
13607 /**
13608 * pbkdf2 iterations
13609 */
13610
13611 salt->salt_iter = atoi (iterations_pos) - 1;
13612
13613 /**
13614 * handle salt encoding
13615 */
13616
13617 char *saltbuf_ptr = (char *) salt->salt_buf;
13618
13619 for (uint i = 0; i < saltbuf_len; i += 2)
13620 {
13621 const char p0 = saltbuf_pos[i + 0];
13622 const char p1 = saltbuf_pos[i + 1];
13623
13624 *saltbuf_ptr++ = hex_convert (p1) << 0
13625 | hex_convert (p0) << 4;
13626 }
13627
13628 salt->salt_len = saltbuf_len / 2;
13629
13630 /**
13631 * handle cipher encoding
13632 */
13633
13634 uint *tmp = (uint *) mymalloc (32);
13635
13636 char *cipherbuf_ptr = (char *) tmp;
13637
13638 for (uint i = 2016; i < cipherbuf_len; i += 2)
13639 {
13640 const char p0 = cipherbuf_pos[i + 0];
13641 const char p1 = cipherbuf_pos[i + 1];
13642
13643 *cipherbuf_ptr++ = hex_convert (p1) << 0
13644 | hex_convert (p0) << 4;
13645 }
13646
13647 // iv is stored at salt_buf 4 (length 16)
13648 // data is stored at salt_buf 8 (length 16)
13649
13650 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
13651 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
13652 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
13653 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
13654
13655 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
13656 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
13657 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
13658 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
13659
13660 free (tmp);
13661
13662 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
13663 {
13664 const char p0 = cipherbuf_pos[j + 0];
13665 const char p1 = cipherbuf_pos[j + 1];
13666
13667 agilekey->cipher[i] = hex_convert (p1) << 0
13668 | hex_convert (p0) << 4;
13669 }
13670
13671 /**
13672 * digest buf
13673 */
13674
13675 digest[0] = 0x10101010;
13676 digest[1] = 0x10101010;
13677 digest[2] = 0x10101010;
13678 digest[3] = 0x10101010;
13679
13680 return (PARSER_OK);
13681 }
13682
13683 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13684 {
13685 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
13686
13687 u32 *digest = (u32 *) hash_buf->digest;
13688
13689 salt_t *salt = hash_buf->salt;
13690
13691 char *hashbuf_pos = input_buf;
13692
13693 char *iterations_pos = strchr (hashbuf_pos, ':');
13694
13695 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13696
13697 uint hash_len = iterations_pos - hashbuf_pos;
13698
13699 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
13700
13701 iterations_pos++;
13702
13703 char *saltbuf_pos = strchr (iterations_pos, ':');
13704
13705 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13706
13707 uint iterations_len = saltbuf_pos - iterations_pos;
13708
13709 saltbuf_pos++;
13710
13711 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
13712
13713 if (salt_len > 32) return (PARSER_SALT_LENGTH);
13714
13715 char *salt_buf_ptr = (char *) salt->salt_buf;
13716
13717 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
13718
13719 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13720
13721 salt->salt_len = salt_len;
13722
13723 salt->salt_iter = atoi (iterations_pos) - 1;
13724
13725 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13726 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13727 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13728 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13729
13730 return (PARSER_OK);
13731 }
13732
13733 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13734 {
13735 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
13736
13737 u32 *digest = (u32 *) hash_buf->digest;
13738
13739 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13740 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13741 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13742 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13743 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13744 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13745 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13746 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13747
13748 digest[0] = byte_swap_32 (digest[0]);
13749 digest[1] = byte_swap_32 (digest[1]);
13750 digest[2] = byte_swap_32 (digest[2]);
13751 digest[3] = byte_swap_32 (digest[3]);
13752 digest[4] = byte_swap_32 (digest[4]);
13753 digest[5] = byte_swap_32 (digest[5]);
13754 digest[6] = byte_swap_32 (digest[6]);
13755 digest[7] = byte_swap_32 (digest[7]);
13756
13757 return (PARSER_OK);
13758 }
13759
13760 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13761 {
13762 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13763
13764 u32 *digest = (u32 *) hash_buf->digest;
13765
13766 salt_t *salt = hash_buf->salt;
13767
13768 char *salt_pos = input_buf + 3;
13769
13770 uint iterations_len = 0;
13771
13772 if (memcmp (salt_pos, "rounds=", 7) == 0)
13773 {
13774 salt_pos += 7;
13775
13776 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
13777
13778 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
13779 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
13780
13781 salt_pos[0] = 0x0;
13782
13783 salt->salt_iter = atoi (salt_pos - iterations_len);
13784
13785 salt_pos += 1;
13786
13787 iterations_len += 8;
13788 }
13789 else
13790 {
13791 salt->salt_iter = ROUNDS_SHA256CRYPT;
13792 }
13793
13794 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
13795
13796 char *hash_pos = strchr (salt_pos, '$');
13797
13798 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13799
13800 uint salt_len = hash_pos - salt_pos;
13801
13802 if (salt_len > 16) return (PARSER_SALT_LENGTH);
13803
13804 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13805
13806 salt->salt_len = salt_len;
13807
13808 hash_pos++;
13809
13810 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13811
13812 return (PARSER_OK);
13813 }
13814
13815 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13816 {
13817 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
13818
13819 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13820
13821 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
13822
13823 u64 *digest = (u64 *) hash_buf->digest;
13824
13825 salt_t *salt = hash_buf->salt;
13826
13827 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13828
13829 char *iter_pos = input_buf + 4;
13830
13831 char *salt_pos = strchr (iter_pos, '$');
13832
13833 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13834
13835 salt_pos++;
13836
13837 char *hash_pos = strchr (salt_pos, '$');
13838
13839 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13840
13841 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13842
13843 hash_pos++;
13844
13845 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13846 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13847 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13848 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13849 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13850 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13851 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13852 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13853
13854 uint salt_len = hash_pos - salt_pos - 1;
13855
13856 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
13857
13858 salt->salt_len = salt_len / 2;
13859
13860 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
13861 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
13862 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
13863 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
13864 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
13865 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
13866 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
13867 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
13868
13869 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
13870 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
13871 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
13872 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
13873 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
13874 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
13875 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
13876 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
13877 pbkdf2_sha512->salt_buf[8] = 0x01000000;
13878 pbkdf2_sha512->salt_buf[9] = 0x80;
13879
13880 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13881
13882 salt->salt_iter = atoi (iter_pos) - 1;
13883
13884 return (PARSER_OK);
13885 }
13886
13887 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13888 {
13889 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
13890
13891 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
13892
13893 u32 *digest = (u32 *) hash_buf->digest;
13894
13895 salt_t *salt = hash_buf->salt;
13896
13897 char *salt_pos = input_buf + 14;
13898
13899 char *hash_pos = strchr (salt_pos, '*');
13900
13901 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13902
13903 hash_pos++;
13904
13905 uint salt_len = hash_pos - salt_pos - 1;
13906
13907 char *salt_buf_ptr = (char *) salt->salt_buf;
13908
13909 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13910
13911 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13912
13913 salt->salt_len = salt_len;
13914
13915 u8 tmp_buf[100] = { 0 };
13916
13917 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
13918
13919 memcpy (digest, tmp_buf, 32);
13920
13921 digest[0] = byte_swap_32 (digest[0]);
13922 digest[1] = byte_swap_32 (digest[1]);
13923 digest[2] = byte_swap_32 (digest[2]);
13924 digest[3] = byte_swap_32 (digest[3]);
13925 digest[4] = byte_swap_32 (digest[4]);
13926 digest[5] = byte_swap_32 (digest[5]);
13927 digest[6] = byte_swap_32 (digest[6]);
13928 digest[7] = byte_swap_32 (digest[7]);
13929
13930 digest[0] -= SHA256M_A;
13931 digest[1] -= SHA256M_B;
13932 digest[2] -= SHA256M_C;
13933 digest[3] -= SHA256M_D;
13934 digest[4] -= SHA256M_E;
13935 digest[5] -= SHA256M_F;
13936 digest[6] -= SHA256M_G;
13937 digest[7] -= SHA256M_H;
13938
13939 return (PARSER_OK);
13940 }
13941
13942 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13943 {
13944 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13945
13946 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13947
13948 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13949
13950 u64 *digest = (u64 *) hash_buf->digest;
13951
13952 salt_t *salt = hash_buf->salt;
13953
13954 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13955
13956 char *iter_pos = input_buf + 19;
13957
13958 char *salt_pos = strchr (iter_pos, '.');
13959
13960 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13961
13962 salt_pos++;
13963
13964 char *hash_pos = strchr (salt_pos, '.');
13965
13966 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13967
13968 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13969
13970 hash_pos++;
13971
13972 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13973 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13974 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13975 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13976 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13977 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13978 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13979 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13980
13981 uint salt_len = hash_pos - salt_pos - 1;
13982
13983 salt_len /= 2;
13984
13985 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13986
13987 uint i;
13988
13989 for (i = 0; i < salt_len; i++)
13990 {
13991 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13992 }
13993
13994 salt_buf_ptr[salt_len + 3] = 0x01;
13995 salt_buf_ptr[salt_len + 4] = 0x80;
13996
13997 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13998
13999 salt->salt_len = salt_len;
14000
14001 salt->salt_iter = atoi (iter_pos) - 1;
14002
14003 return (PARSER_OK);
14004 }
14005
14006 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14007 {
14008 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
14009
14010 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
14011
14012 u64 *digest = (u64 *) hash_buf->digest;
14013
14014 salt_t *salt = hash_buf->salt;
14015
14016 u8 tmp_buf[120] = { 0 };
14017
14018 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
14019
14020 if (tmp_len < 64) return (PARSER_HASH_LENGTH);
14021
14022 memcpy (digest, tmp_buf, 64);
14023
14024 digest[0] = byte_swap_64 (digest[0]);
14025 digest[1] = byte_swap_64 (digest[1]);
14026 digest[2] = byte_swap_64 (digest[2]);
14027 digest[3] = byte_swap_64 (digest[3]);
14028 digest[4] = byte_swap_64 (digest[4]);
14029 digest[5] = byte_swap_64 (digest[5]);
14030 digest[6] = byte_swap_64 (digest[6]);
14031 digest[7] = byte_swap_64 (digest[7]);
14032
14033 digest[0] -= SHA512M_A;
14034 digest[1] -= SHA512M_B;
14035 digest[2] -= SHA512M_C;
14036 digest[3] -= SHA512M_D;
14037 digest[4] -= SHA512M_E;
14038 digest[5] -= SHA512M_F;
14039 digest[6] -= SHA512M_G;
14040 digest[7] -= SHA512M_H;
14041
14042 int salt_len = tmp_len - 64;
14043
14044 if (salt_len < 0) return (PARSER_SALT_LENGTH);
14045
14046 salt->salt_len = salt_len;
14047
14048 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
14049
14050 if (data.opts_type & OPTS_TYPE_ST_ADD80)
14051 {
14052 char *ptr = (char *) salt->salt_buf;
14053
14054 ptr[salt->salt_len] = 0x80;
14055 }
14056
14057 return (PARSER_OK);
14058 }
14059
14060 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14061 {
14062 if (data.opts_type & OPTS_TYPE_ST_HEX)
14063 {
14064 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
14065 }
14066 else
14067 {
14068 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
14069 }
14070
14071 u32 *digest = (u32 *) hash_buf->digest;
14072
14073 salt_t *salt = hash_buf->salt;
14074
14075 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14076 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14077 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14078 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14079
14080 digest[0] = byte_swap_32 (digest[0]);
14081 digest[1] = byte_swap_32 (digest[1]);
14082 digest[2] = byte_swap_32 (digest[2]);
14083 digest[3] = byte_swap_32 (digest[3]);
14084
14085 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14086
14087 uint salt_len = input_len - 32 - 1;
14088
14089 char *salt_buf = input_buf + 32 + 1;
14090
14091 char *salt_buf_ptr = (char *) salt->salt_buf;
14092
14093 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14094
14095 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14096
14097 salt->salt_len = salt_len;
14098
14099 return (PARSER_OK);
14100 }
14101
14102 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14103 {
14104 if (data.opts_type & OPTS_TYPE_ST_HEX)
14105 {
14106 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
14107 }
14108 else
14109 {
14110 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
14111 }
14112
14113 u32 *digest = (u32 *) hash_buf->digest;
14114
14115 salt_t *salt = hash_buf->salt;
14116
14117 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14118 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14119 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14120 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14121 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14122
14123 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14124
14125 uint salt_len = input_len - 40 - 1;
14126
14127 char *salt_buf = input_buf + 40 + 1;
14128
14129 char *salt_buf_ptr = (char *) salt->salt_buf;
14130
14131 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14132
14133 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14134
14135 salt->salt_len = salt_len;
14136
14137 return (PARSER_OK);
14138 }
14139
14140 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14141 {
14142 if (data.opts_type & OPTS_TYPE_ST_HEX)
14143 {
14144 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
14145 }
14146 else
14147 {
14148 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
14149 }
14150
14151 u32 *digest = (u32 *) hash_buf->digest;
14152
14153 salt_t *salt = hash_buf->salt;
14154
14155 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14156 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14157 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14158 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14159 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14160 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
14161 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
14162 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
14163
14164 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14165
14166 uint salt_len = input_len - 64 - 1;
14167
14168 char *salt_buf = input_buf + 64 + 1;
14169
14170 char *salt_buf_ptr = (char *) salt->salt_buf;
14171
14172 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14173
14174 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14175
14176 salt->salt_len = salt_len;
14177
14178 return (PARSER_OK);
14179 }
14180
14181 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14182 {
14183 if (data.opts_type & OPTS_TYPE_ST_HEX)
14184 {
14185 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
14186 }
14187 else
14188 {
14189 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
14190 }
14191
14192 u64 *digest = (u64 *) hash_buf->digest;
14193
14194 salt_t *salt = hash_buf->salt;
14195
14196 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
14197 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
14198 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
14199 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
14200 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
14201 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
14202 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
14203 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
14204
14205 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14206
14207 uint salt_len = input_len - 128 - 1;
14208
14209 char *salt_buf = input_buf + 128 + 1;
14210
14211 char *salt_buf_ptr = (char *) salt->salt_buf;
14212
14213 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14214
14215 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14216
14217 salt->salt_len = salt_len;
14218
14219 return (PARSER_OK);
14220 }
14221
14222 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14223 {
14224 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
14225
14226 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
14227
14228 u32 *digest = (u32 *) hash_buf->digest;
14229
14230 salt_t *salt = hash_buf->salt;
14231
14232 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
14233
14234 /**
14235 * parse line
14236 */
14237
14238 char *user_pos = input_buf + 10 + 1;
14239
14240 char *realm_pos = strchr (user_pos, '$');
14241
14242 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14243
14244 uint user_len = realm_pos - user_pos;
14245
14246 if (user_len >= 64) return (PARSER_SALT_LENGTH);
14247
14248 realm_pos++;
14249
14250 char *salt_pos = strchr (realm_pos, '$');
14251
14252 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14253
14254 uint realm_len = salt_pos - realm_pos;
14255
14256 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
14257
14258 salt_pos++;
14259
14260 char *data_pos = strchr (salt_pos, '$');
14261
14262 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14263
14264 uint salt_len = data_pos - salt_pos;
14265
14266 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
14267
14268 data_pos++;
14269
14270 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
14271
14272 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
14273
14274 /**
14275 * copy data
14276 */
14277
14278 memcpy (krb5pa->user, user_pos, user_len);
14279 memcpy (krb5pa->realm, realm_pos, realm_len);
14280 memcpy (krb5pa->salt, salt_pos, salt_len);
14281
14282 char *timestamp_ptr = (char *) krb5pa->timestamp;
14283
14284 for (uint i = 0; i < (36 * 2); i += 2)
14285 {
14286 const char p0 = data_pos[i + 0];
14287 const char p1 = data_pos[i + 1];
14288
14289 *timestamp_ptr++ = hex_convert (p1) << 0
14290 | hex_convert (p0) << 4;
14291 }
14292
14293 char *checksum_ptr = (char *) krb5pa->checksum;
14294
14295 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
14296 {
14297 const char p0 = data_pos[i + 0];
14298 const char p1 = data_pos[i + 1];
14299
14300 *checksum_ptr++ = hex_convert (p1) << 0
14301 | hex_convert (p0) << 4;
14302 }
14303
14304 /**
14305 * copy some data to generic buffers to make sorting happy
14306 */
14307
14308 salt->salt_buf[0] = krb5pa->timestamp[0];
14309 salt->salt_buf[1] = krb5pa->timestamp[1];
14310 salt->salt_buf[2] = krb5pa->timestamp[2];
14311 salt->salt_buf[3] = krb5pa->timestamp[3];
14312 salt->salt_buf[4] = krb5pa->timestamp[4];
14313 salt->salt_buf[5] = krb5pa->timestamp[5];
14314 salt->salt_buf[6] = krb5pa->timestamp[6];
14315 salt->salt_buf[7] = krb5pa->timestamp[7];
14316 salt->salt_buf[8] = krb5pa->timestamp[8];
14317
14318 salt->salt_len = 36;
14319
14320 digest[0] = krb5pa->checksum[0];
14321 digest[1] = krb5pa->checksum[1];
14322 digest[2] = krb5pa->checksum[2];
14323 digest[3] = krb5pa->checksum[3];
14324
14325 return (PARSER_OK);
14326 }
14327
14328 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14329 {
14330 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
14331
14332 u32 *digest = (u32 *) hash_buf->digest;
14333
14334 salt_t *salt = hash_buf->salt;
14335
14336 /**
14337 * parse line
14338 */
14339
14340 char *salt_pos = input_buf;
14341
14342 char *hash_pos = strchr (salt_pos, '$');
14343
14344 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14345
14346 uint salt_len = hash_pos - salt_pos;
14347
14348 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14349
14350 hash_pos++;
14351
14352 uint hash_len = input_len - 1 - salt_len;
14353
14354 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14355
14356 /**
14357 * valid some data
14358 */
14359
14360 uint user_len = 0;
14361
14362 for (uint i = 0; i < salt_len; i++)
14363 {
14364 if (salt_pos[i] == ' ') continue;
14365
14366 user_len++;
14367 }
14368
14369 // SAP user names cannot be longer than 12 characters
14370 if (user_len > 12) return (PARSER_SALT_LENGTH);
14371
14372 // SAP user name cannot start with ! or ?
14373 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14374
14375 /**
14376 * copy data
14377 */
14378
14379 char *salt_buf_ptr = (char *) salt->salt_buf;
14380
14381 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14382
14383 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14384
14385 salt->salt_len = salt_len;
14386
14387 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
14388 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
14389 digest[2] = 0;
14390 digest[3] = 0;
14391
14392 digest[0] = byte_swap_32 (digest[0]);
14393 digest[1] = byte_swap_32 (digest[1]);
14394
14395 return (PARSER_OK);
14396 }
14397
14398 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14399 {
14400 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
14401
14402 u32 *digest = (u32 *) hash_buf->digest;
14403
14404 salt_t *salt = hash_buf->salt;
14405
14406 /**
14407 * parse line
14408 */
14409
14410 char *salt_pos = input_buf;
14411
14412 char *hash_pos = strchr (salt_pos, '$');
14413
14414 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14415
14416 uint salt_len = hash_pos - salt_pos;
14417
14418 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14419
14420 hash_pos++;
14421
14422 uint hash_len = input_len - 1 - salt_len;
14423
14424 if (hash_len != 40) return (PARSER_HASH_LENGTH);
14425
14426 /**
14427 * valid some data
14428 */
14429
14430 uint user_len = 0;
14431
14432 for (uint i = 0; i < salt_len; i++)
14433 {
14434 if (salt_pos[i] == ' ') continue;
14435
14436 user_len++;
14437 }
14438
14439 // SAP user names cannot be longer than 12 characters
14440 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
14441 // so far nobody complained so we stay with this because it helps in optimization
14442 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
14443
14444 if (user_len > 12) return (PARSER_SALT_LENGTH);
14445
14446 // SAP user name cannot start with ! or ?
14447 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14448
14449 /**
14450 * copy data
14451 */
14452
14453 char *salt_buf_ptr = (char *) salt->salt_buf;
14454
14455 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14456
14457 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14458
14459 salt->salt_len = salt_len;
14460
14461 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14462 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14463 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14464 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14465 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14466
14467 return (PARSER_OK);
14468 }
14469
14470 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14471 {
14472 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
14473
14474 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14475
14476 u64 *digest = (u64 *) hash_buf->digest;
14477
14478 salt_t *salt = hash_buf->salt;
14479
14480 char *iter_pos = input_buf + 3;
14481
14482 uint salt_iter = 1u << itoa64_to_int (iter_pos[0]);
14483
14484 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
14485
14486 memcpy ((char *) salt->salt_sign, input_buf, 4);
14487
14488 salt->salt_iter = salt_iter;
14489
14490 char *salt_pos = iter_pos + 1;
14491
14492 uint salt_len = 8;
14493
14494 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
14495
14496 salt->salt_len = salt_len;
14497
14498 char *hash_pos = salt_pos + salt_len;
14499
14500 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14501
14502 // ugly hack start
14503
14504 char *tmp = (char *) salt->salt_buf_pc;
14505
14506 tmp[0] = hash_pos[42];
14507
14508 // ugly hack end
14509
14510 digest[ 0] = byte_swap_64 (digest[ 0]);
14511 digest[ 1] = byte_swap_64 (digest[ 1]);
14512 digest[ 2] = byte_swap_64 (digest[ 2]);
14513 digest[ 3] = byte_swap_64 (digest[ 3]);
14514 digest[ 4] = 0;
14515 digest[ 5] = 0;
14516 digest[ 6] = 0;
14517 digest[ 7] = 0;
14518
14519 return (PARSER_OK);
14520 }
14521
14522 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14523 {
14524 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
14525
14526 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14527
14528 u32 *digest = (u32 *) hash_buf->digest;
14529
14530 salt_t *salt = hash_buf->salt;
14531
14532 char *salt_buf = input_buf + 6;
14533
14534 uint salt_len = 16;
14535
14536 char *salt_buf_ptr = (char *) salt->salt_buf;
14537
14538 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14539
14540 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14541
14542 salt->salt_len = salt_len;
14543
14544 char *hash_pos = input_buf + 6 + 16;
14545
14546 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14547 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14548 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14549 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14550 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14551 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
14552 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
14553 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
14554
14555 return (PARSER_OK);
14556 }
14557
14558 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14559 {
14560 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
14561
14562 u32 *digest = (u32 *) hash_buf->digest;
14563
14564 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14565 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14566 digest[2] = 0;
14567 digest[3] = 0;
14568
14569 return (PARSER_OK);
14570 }
14571
14572 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14573 {
14574 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
14575
14576 u32 *digest = (u32 *) hash_buf->digest;
14577
14578 salt_t *salt = hash_buf->salt;
14579
14580 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
14581
14582 char *saltbuf_pos = input_buf;
14583
14584 char *hashbuf_pos = strchr (saltbuf_pos, ':');
14585
14586 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14587
14588 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
14589
14590 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
14591 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
14592
14593 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
14594
14595 hashbuf_pos++;
14596
14597 uint hashbuf_len = input_len - saltbuf_len - 1;
14598
14599 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
14600
14601 char *salt_ptr = (char *) saltbuf_pos;
14602 char *rakp_ptr = (char *) rakp->salt_buf;
14603
14604 uint i;
14605 uint j;
14606
14607 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
14608 {
14609 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
14610 }
14611
14612 rakp_ptr[j] = 0x80;
14613
14614 rakp->salt_len = j;
14615
14616 for (i = 0; i < 64; i++)
14617 {
14618 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
14619 }
14620
14621 salt->salt_buf[0] = rakp->salt_buf[0];
14622 salt->salt_buf[1] = rakp->salt_buf[1];
14623 salt->salt_buf[2] = rakp->salt_buf[2];
14624 salt->salt_buf[3] = rakp->salt_buf[3];
14625 salt->salt_buf[4] = rakp->salt_buf[4];
14626 salt->salt_buf[5] = rakp->salt_buf[5];
14627 salt->salt_buf[6] = rakp->salt_buf[6];
14628 salt->salt_buf[7] = rakp->salt_buf[7];
14629
14630 salt->salt_len = 32; // muss min. 32 haben
14631
14632 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14633 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14634 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14635 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14636 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14637
14638 return (PARSER_OK);
14639 }
14640
14641 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14642 {
14643 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
14644
14645 u32 *digest = (u32 *) hash_buf->digest;
14646
14647 salt_t *salt = hash_buf->salt;
14648
14649 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
14650
14651 char *salt_pos = input_buf + 1;
14652
14653 memcpy (salt->salt_buf, salt_pos, 8);
14654
14655 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14656 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14657
14658 salt->salt_len = 8;
14659
14660 char *hash_pos = salt_pos + 8;
14661
14662 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14663 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14664 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14665 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14666 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14667
14668 digest[0] -= SHA1M_A;
14669 digest[1] -= SHA1M_B;
14670 digest[2] -= SHA1M_C;
14671 digest[3] -= SHA1M_D;
14672 digest[4] -= SHA1M_E;
14673
14674 return (PARSER_OK);
14675 }
14676
14677 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14678 {
14679 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
14680
14681 u32 *digest = (u32 *) hash_buf->digest;
14682
14683 salt_t *salt = hash_buf->salt;
14684
14685 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14686 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14687 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14688 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14689
14690 digest[0] = byte_swap_32 (digest[0]);
14691 digest[1] = byte_swap_32 (digest[1]);
14692 digest[2] = byte_swap_32 (digest[2]);
14693 digest[3] = byte_swap_32 (digest[3]);
14694
14695 digest[0] -= MD5M_A;
14696 digest[1] -= MD5M_B;
14697 digest[2] -= MD5M_C;
14698 digest[3] -= MD5M_D;
14699
14700 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14701
14702 char *salt_buf_ptr = input_buf + 32 + 1;
14703
14704 u32 *salt_buf = salt->salt_buf;
14705
14706 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
14707 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
14708 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
14709 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
14710
14711 salt_buf[0] = byte_swap_32 (salt_buf[0]);
14712 salt_buf[1] = byte_swap_32 (salt_buf[1]);
14713 salt_buf[2] = byte_swap_32 (salt_buf[2]);
14714 salt_buf[3] = byte_swap_32 (salt_buf[3]);
14715
14716 salt->salt_len = 16 + 1;
14717
14718 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14719
14720 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
14721
14722 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
14723
14724 return (PARSER_OK);
14725 }
14726
14727 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14728 {
14729 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
14730
14731 u32 *digest = (u32 *) hash_buf->digest;
14732
14733 salt_t *salt = hash_buf->salt;
14734
14735 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
14736
14737 /**
14738 * parse line
14739 */
14740
14741 char *hashbuf_pos = input_buf;
14742
14743 char *saltbuf_pos = strchr (hashbuf_pos, ':');
14744
14745 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14746
14747 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
14748
14749 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
14750
14751 saltbuf_pos++;
14752
14753 char *iteration_pos = strchr (saltbuf_pos, ':');
14754
14755 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14756
14757 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14758
14759 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14760
14761 iteration_pos++;
14762
14763 char *databuf_pos = strchr (iteration_pos, ':');
14764
14765 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14766
14767 const uint iteration_len = databuf_pos - iteration_pos;
14768
14769 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14770 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
14771
14772 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
14773
14774 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
14775 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
14776
14777 databuf_pos++;
14778
14779 // digest
14780
14781 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14782 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14783 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14784 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14785 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14786 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
14787 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
14788 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
14789
14790 // salt
14791
14792 char *saltbuf_ptr = (char *) salt->salt_buf;
14793
14794 for (uint i = 0; i < saltbuf_len; i += 2)
14795 {
14796 const char p0 = saltbuf_pos[i + 0];
14797 const char p1 = saltbuf_pos[i + 1];
14798
14799 *saltbuf_ptr++ = hex_convert (p1) << 0
14800 | hex_convert (p0) << 4;
14801 }
14802
14803 salt->salt_buf[4] = 0x01000000;
14804 salt->salt_buf[5] = 0x80;
14805
14806 salt->salt_len = saltbuf_len / 2;
14807
14808 // iteration
14809
14810 salt->salt_iter = atoi (iteration_pos) - 1;
14811
14812 // data
14813
14814 char *databuf_ptr = (char *) cloudkey->data_buf;
14815
14816 for (uint i = 0; i < databuf_len; i += 2)
14817 {
14818 const char p0 = databuf_pos[i + 0];
14819 const char p1 = databuf_pos[i + 1];
14820
14821 *databuf_ptr++ = hex_convert (p1) << 0
14822 | hex_convert (p0) << 4;
14823 }
14824
14825 *databuf_ptr++ = 0x80;
14826
14827 for (uint i = 0; i < 512; i++)
14828 {
14829 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
14830 }
14831
14832 cloudkey->data_len = databuf_len / 2;
14833
14834 return (PARSER_OK);
14835 }
14836
14837 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14838 {
14839 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
14840
14841 u32 *digest = (u32 *) hash_buf->digest;
14842
14843 salt_t *salt = hash_buf->salt;
14844
14845 /**
14846 * parse line
14847 */
14848
14849 char *hashbuf_pos = input_buf;
14850
14851 char *domainbuf_pos = strchr (hashbuf_pos, ':');
14852
14853 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14854
14855 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
14856
14857 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
14858
14859 domainbuf_pos++;
14860
14861 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
14862
14863 char *saltbuf_pos = strchr (domainbuf_pos, ':');
14864
14865 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14866
14867 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
14868
14869 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
14870
14871 saltbuf_pos++;
14872
14873 char *iteration_pos = strchr (saltbuf_pos, ':');
14874
14875 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14876
14877 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14878
14879 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
14880
14881 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
14882
14883 iteration_pos++;
14884
14885 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
14886
14887 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14888 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
14889
14890 // ok, the plan for this algorithm is the following:
14891 // we have 2 salts here, the domain-name and a random salt
14892 // while both are used in the initial transformation,
14893 // only the random salt is used in the following iterations
14894 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
14895 // and one that includes only the real salt (stored into salt_buf[]).
14896 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
14897
14898 u8 tmp_buf[100] = { 0 };
14899
14900 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
14901
14902 memcpy (digest, tmp_buf, 20);
14903
14904 digest[0] = byte_swap_32 (digest[0]);
14905 digest[1] = byte_swap_32 (digest[1]);
14906 digest[2] = byte_swap_32 (digest[2]);
14907 digest[3] = byte_swap_32 (digest[3]);
14908 digest[4] = byte_swap_32 (digest[4]);
14909
14910 // domain
14911
14912 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14913
14914 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
14915
14916 char *len_ptr = NULL;
14917
14918 for (uint i = 0; i < domainbuf_len; i++)
14919 {
14920 if (salt_buf_pc_ptr[i] == '.')
14921 {
14922 len_ptr = &salt_buf_pc_ptr[i];
14923
14924 *len_ptr = 0;
14925 }
14926 else
14927 {
14928 *len_ptr += 1;
14929 }
14930 }
14931
14932 salt->salt_buf_pc[7] = domainbuf_len;
14933
14934 // "real" salt
14935
14936 char *salt_buf_ptr = (char *) salt->salt_buf;
14937
14938 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
14939
14940 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14941
14942 salt->salt_len = salt_len;
14943
14944 // iteration
14945
14946 salt->salt_iter = atoi (iteration_pos);
14947
14948 return (PARSER_OK);
14949 }
14950
14951 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14952 {
14953 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14954
14955 u32 *digest = (u32 *) hash_buf->digest;
14956
14957 salt_t *salt = hash_buf->salt;
14958
14959 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14960 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14961 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14962 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14963 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14964
14965 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14966
14967 uint salt_len = input_len - 40 - 1;
14968
14969 char *salt_buf = input_buf + 40 + 1;
14970
14971 char *salt_buf_ptr = (char *) salt->salt_buf;
14972
14973 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14974
14975 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14976
14977 salt->salt_len = salt_len;
14978
14979 return (PARSER_OK);
14980 }
14981
14982 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14983 {
14984 const u8 ascii_to_ebcdic[] =
14985 {
14986 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14987 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14988 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14989 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14990 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14991 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14992 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14993 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14994 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14995 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14996 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14997 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14998 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14999 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
15000 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
15001 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
15002 };
15003
15004 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
15005
15006 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15007
15008 u32 *digest = (u32 *) hash_buf->digest;
15009
15010 salt_t *salt = hash_buf->salt;
15011
15012 char *salt_pos = input_buf + 6 + 1;
15013
15014 char *digest_pos = strchr (salt_pos, '*');
15015
15016 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15017
15018 uint salt_len = digest_pos - salt_pos;
15019
15020 if (salt_len > 8) return (PARSER_SALT_LENGTH);
15021
15022 uint hash_len = input_len - 1 - salt_len - 1 - 6;
15023
15024 if (hash_len != 16) return (PARSER_HASH_LENGTH);
15025
15026 digest_pos++;
15027
15028 char *salt_buf_ptr = (char *) salt->salt_buf;
15029 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
15030
15031 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
15032
15033 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15034
15035 salt->salt_len = salt_len;
15036
15037 for (uint i = 0; i < salt_len; i++)
15038 {
15039 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
15040 }
15041 for (uint i = salt_len; i < 8; i++)
15042 {
15043 salt_buf_pc_ptr[i] = 0x40;
15044 }
15045
15046 uint tt;
15047
15048 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
15049
15050 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
15051 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
15052
15053 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
15054 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
15055
15056 digest[0] = byte_swap_32 (digest[0]);
15057 digest[1] = byte_swap_32 (digest[1]);
15058
15059 IP (digest[0], digest[1], tt);
15060
15061 digest[0] = rotr32 (digest[0], 29);
15062 digest[1] = rotr32 (digest[1], 29);
15063 digest[2] = 0;
15064 digest[3] = 0;
15065
15066 return (PARSER_OK);
15067 }
15068
15069 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15070 {
15071 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
15072
15073 u32 *digest = (u32 *) hash_buf->digest;
15074
15075 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15076 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15077 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15078 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15079
15080 digest[0] = byte_swap_32 (digest[0]);
15081 digest[1] = byte_swap_32 (digest[1]);
15082 digest[2] = byte_swap_32 (digest[2]);
15083 digest[3] = byte_swap_32 (digest[3]);
15084
15085 return (PARSER_OK);
15086 }
15087
15088 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15089 {
15090 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
15091
15092 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
15093
15094 u32 *digest = (u32 *) hash_buf->digest;
15095
15096 salt_t *salt = hash_buf->salt;
15097
15098 u8 tmp_buf[120] = { 0 };
15099
15100 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
15101
15102 tmp_buf[3] += -4; // dont ask!
15103
15104 memcpy (salt->salt_buf, tmp_buf, 5);
15105
15106 salt->salt_len = 5;
15107
15108 memcpy (digest, tmp_buf + 5, 9);
15109
15110 // yes, only 9 byte are needed to crack, but 10 to display
15111
15112 salt->salt_buf_pc[7] = input_buf[20];
15113
15114 return (PARSER_OK);
15115 }
15116
15117 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15118 {
15119 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
15120
15121 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
15122
15123 u32 *digest = (u32 *) hash_buf->digest;
15124
15125 salt_t *salt = hash_buf->salt;
15126
15127 u8 tmp_buf[120] = { 0 };
15128
15129 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
15130
15131 tmp_buf[3] += -4; // dont ask!
15132
15133 // salt
15134
15135 memcpy (salt->salt_buf, tmp_buf, 16);
15136
15137 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)
15138
15139 // iteration
15140
15141 char tmp_iter_buf[11] = { 0 };
15142
15143 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
15144
15145 tmp_iter_buf[10] = 0;
15146
15147 salt->salt_iter = atoi (tmp_iter_buf);
15148
15149 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
15150 {
15151 return (PARSER_SALT_ITERATION);
15152 }
15153
15154 salt->salt_iter--; // first round in init
15155
15156 // 2 additional bytes for display only
15157
15158 salt->salt_buf_pc[0] = tmp_buf[26];
15159 salt->salt_buf_pc[1] = tmp_buf[27];
15160
15161 // digest
15162
15163 memcpy (digest, tmp_buf + 28, 8);
15164
15165 digest[0] = byte_swap_32 (digest[0]);
15166 digest[1] = byte_swap_32 (digest[1]);
15167 digest[2] = 0;
15168 digest[3] = 0;
15169
15170 return (PARSER_OK);
15171 }
15172
15173 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15174 {
15175 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
15176
15177 u32 *digest = (u32 *) hash_buf->digest;
15178
15179 salt_t *salt = hash_buf->salt;
15180
15181 char *salt_buf_pos = input_buf;
15182
15183 char *hash_buf_pos = salt_buf_pos + 6;
15184
15185 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
15186 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
15187 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
15188 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
15189 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
15190 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
15191 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
15192 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
15193
15194 digest[0] -= SHA256M_A;
15195 digest[1] -= SHA256M_B;
15196 digest[2] -= SHA256M_C;
15197 digest[3] -= SHA256M_D;
15198 digest[4] -= SHA256M_E;
15199 digest[5] -= SHA256M_F;
15200 digest[6] -= SHA256M_G;
15201 digest[7] -= SHA256M_H;
15202
15203 char *salt_buf_ptr = (char *) salt->salt_buf;
15204
15205 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
15206
15207 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15208
15209 salt->salt_len = salt_len;
15210
15211 return (PARSER_OK);
15212 }
15213
15214 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15215 {
15216 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
15217
15218 u32 *digest = (u32 *) hash_buf->digest;
15219
15220 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15221
15222 salt_t *salt = hash_buf->salt;
15223
15224 char *salt_buf = input_buf + 6;
15225
15226 char *digest_buf = strchr (salt_buf, '$');
15227
15228 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15229
15230 uint salt_len = digest_buf - salt_buf;
15231
15232 digest_buf++; // skip the '$' symbol
15233
15234 char *salt_buf_ptr = (char *) salt->salt_buf;
15235
15236 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15237
15238 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15239
15240 salt->salt_len = salt_len;
15241
15242 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15243 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15244 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15245 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15246
15247 digest[0] = byte_swap_32 (digest[0]);
15248 digest[1] = byte_swap_32 (digest[1]);
15249 digest[2] = byte_swap_32 (digest[2]);
15250 digest[3] = byte_swap_32 (digest[3]);
15251
15252 digest[0] -= MD5M_A;
15253 digest[1] -= MD5M_B;
15254 digest[2] -= MD5M_C;
15255 digest[3] -= MD5M_D;
15256
15257 return (PARSER_OK);
15258 }
15259
15260 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15261 {
15262 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
15263
15264 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15265
15266 u32 *digest = (u32 *) hash_buf->digest;
15267
15268 salt_t *salt = hash_buf->salt;
15269
15270 char *salt_buf = input_buf + 3;
15271
15272 char *digest_buf = strchr (salt_buf, '$');
15273
15274 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15275
15276 uint salt_len = digest_buf - salt_buf;
15277
15278 digest_buf++; // skip the '$' symbol
15279
15280 char *salt_buf_ptr = (char *) salt->salt_buf;
15281
15282 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15283
15284 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15285
15286 salt_buf_ptr[salt_len] = 0x2d;
15287
15288 salt->salt_len = salt_len + 1;
15289
15290 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15291 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15292 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15293 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15294
15295 digest[0] = byte_swap_32 (digest[0]);
15296 digest[1] = byte_swap_32 (digest[1]);
15297 digest[2] = byte_swap_32 (digest[2]);
15298 digest[3] = byte_swap_32 (digest[3]);
15299
15300 digest[0] -= MD5M_A;
15301 digest[1] -= MD5M_B;
15302 digest[2] -= MD5M_C;
15303 digest[3] -= MD5M_D;
15304
15305 return (PARSER_OK);
15306 }
15307
15308 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15309 {
15310 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
15311
15312 u32 *digest = (u32 *) hash_buf->digest;
15313
15314 salt_t *salt = hash_buf->salt;
15315
15316 u8 tmp_buf[100] = { 0 };
15317
15318 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
15319
15320 memcpy (digest, tmp_buf, 20);
15321
15322 digest[0] = byte_swap_32 (digest[0]);
15323 digest[1] = byte_swap_32 (digest[1]);
15324 digest[2] = byte_swap_32 (digest[2]);
15325 digest[3] = byte_swap_32 (digest[3]);
15326 digest[4] = byte_swap_32 (digest[4]);
15327
15328 digest[0] -= SHA1M_A;
15329 digest[1] -= SHA1M_B;
15330 digest[2] -= SHA1M_C;
15331 digest[3] -= SHA1M_D;
15332 digest[4] -= SHA1M_E;
15333
15334 salt->salt_buf[0] = 0x80;
15335
15336 salt->salt_len = 0;
15337
15338 return (PARSER_OK);
15339 }
15340
15341 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15342 {
15343 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
15344
15345 u32 *digest = (u32 *) hash_buf->digest;
15346
15347 salt_t *salt = hash_buf->salt;
15348
15349 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15350 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15351 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15352 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15353
15354 digest[0] = byte_swap_32 (digest[0]);
15355 digest[1] = byte_swap_32 (digest[1]);
15356 digest[2] = byte_swap_32 (digest[2]);
15357 digest[3] = byte_swap_32 (digest[3]);
15358
15359 digest[0] -= MD5M_A;
15360 digest[1] -= MD5M_B;
15361 digest[2] -= MD5M_C;
15362 digest[3] -= MD5M_D;
15363
15364 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15365
15366 uint salt_len = input_len - 32 - 1;
15367
15368 char *salt_buf = input_buf + 32 + 1;
15369
15370 char *salt_buf_ptr = (char *) salt->salt_buf;
15371
15372 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15373
15374 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15375
15376 /*
15377 * add static "salt" part
15378 */
15379
15380 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
15381
15382 salt_len += 8;
15383
15384 salt->salt_len = salt_len;
15385
15386 return (PARSER_OK);
15387 }
15388
15389 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15390 {
15391 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
15392
15393 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
15394
15395 u32 *digest = (u32 *) hash_buf->digest;
15396
15397 salt_t *salt = hash_buf->salt;
15398
15399 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
15400
15401 /**
15402 * parse line
15403 */
15404
15405 char *saltlen_pos = input_buf + 1 + 3 + 1;
15406
15407 char *saltbuf_pos = strchr (saltlen_pos, '$');
15408
15409 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15410
15411 uint saltlen_len = saltbuf_pos - saltlen_pos;
15412
15413 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
15414
15415 saltbuf_pos++;
15416
15417 char *keylen_pos = strchr (saltbuf_pos, '$');
15418
15419 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15420
15421 uint saltbuf_len = keylen_pos - saltbuf_pos;
15422
15423 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
15424
15425 keylen_pos++;
15426
15427 char *keybuf_pos = strchr (keylen_pos, '$');
15428
15429 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15430
15431 uint keylen_len = keybuf_pos - keylen_pos;
15432
15433 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
15434
15435 keybuf_pos++;
15436
15437 char *databuf_pos = strchr (keybuf_pos, '$');
15438
15439 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15440
15441 uint keybuf_len = databuf_pos - keybuf_pos;
15442
15443 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
15444
15445 databuf_pos++;
15446
15447 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
15448
15449 if (data_len != 3072) return (PARSER_SALT_LENGTH);
15450
15451 /**
15452 * copy data
15453 */
15454
15455 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
15456 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
15457 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
15458 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
15459
15460 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
15461 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
15462 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
15463 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
15464
15465 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15466 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15467 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15468 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15469
15470 salt->salt_len = 16;
15471 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
15472
15473 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
15474 {
15475 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
15476 }
15477
15478 return (PARSER_OK);
15479 }
15480
15481 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15482 {
15483 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
15484
15485 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15486
15487 u32 *digest = (u32 *) hash_buf->digest;
15488
15489 salt_t *salt = hash_buf->salt;
15490
15491 /**
15492 * parse line
15493 */
15494
15495 // first is the N salt parameter
15496
15497 char *N_pos = input_buf + 6;
15498
15499 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15500
15501 N_pos++;
15502
15503 salt->scrypt_N = atoi (N_pos);
15504
15505 // r
15506
15507 char *r_pos = strchr (N_pos, ':');
15508
15509 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15510
15511 r_pos++;
15512
15513 salt->scrypt_r = atoi (r_pos);
15514
15515 // p
15516
15517 char *p_pos = strchr (r_pos, ':');
15518
15519 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15520
15521 p_pos++;
15522
15523 salt->scrypt_p = atoi (p_pos);
15524
15525 // salt
15526
15527 char *saltbuf_pos = strchr (p_pos, ':');
15528
15529 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15530
15531 saltbuf_pos++;
15532
15533 char *hash_pos = strchr (saltbuf_pos, ':');
15534
15535 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15536
15537 hash_pos++;
15538
15539 // base64 decode
15540
15541 int salt_len_base64 = hash_pos - saltbuf_pos;
15542
15543 if (salt_len_base64 > 45) return (PARSER_SALT_LENGTH);
15544
15545 u8 tmp_buf[33] = { 0 };
15546
15547 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, salt_len_base64, tmp_buf);
15548
15549 char *salt_buf_ptr = (char *) salt->salt_buf;
15550
15551 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
15552
15553 salt->salt_len = tmp_len;
15554 salt->salt_iter = 1;
15555
15556 // digest - base64 decode
15557
15558 memset (tmp_buf, 0, sizeof (tmp_buf));
15559
15560 tmp_len = input_len - (hash_pos - input_buf);
15561
15562 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
15563
15564 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
15565
15566 memcpy (digest, tmp_buf, 32);
15567
15568 return (PARSER_OK);
15569 }
15570
15571 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15572 {
15573 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
15574
15575 u32 *digest = (u32 *) hash_buf->digest;
15576
15577 salt_t *salt = hash_buf->salt;
15578
15579 /**
15580 * parse line
15581 */
15582
15583 char decrypted[76] = { 0 }; // iv + hash
15584
15585 juniper_decrypt_hash (input_buf, decrypted);
15586
15587 char *md5crypt_hash = decrypted + 12;
15588
15589 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
15590
15591 salt->salt_iter = ROUNDS_MD5CRYPT;
15592
15593 char *salt_pos = md5crypt_hash + 3;
15594
15595 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
15596
15597 salt->salt_len = hash_pos - salt_pos; // should be 8
15598
15599 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
15600
15601 hash_pos++;
15602
15603 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
15604
15605 return (PARSER_OK);
15606 }
15607
15608 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15609 {
15610 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
15611
15612 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15613
15614 u32 *digest = (u32 *) hash_buf->digest;
15615
15616 salt_t *salt = hash_buf->salt;
15617
15618 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15619
15620 /**
15621 * parse line
15622 */
15623
15624 // first is *raw* salt
15625
15626 char *salt_pos = input_buf + 3;
15627
15628 char *hash_pos = strchr (salt_pos, '$');
15629
15630 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15631
15632 uint salt_len = hash_pos - salt_pos;
15633
15634 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15635
15636 hash_pos++;
15637
15638 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15639
15640 memcpy (salt_buf_ptr, salt_pos, 14);
15641
15642 salt_buf_ptr[17] = 0x01;
15643 salt_buf_ptr[18] = 0x80;
15644
15645 // add some stuff to normal salt to make sorted happy
15646
15647 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15648 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15649 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15650 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15651
15652 salt->salt_len = salt_len;
15653 salt->salt_iter = ROUNDS_CISCO8 - 1;
15654
15655 // base64 decode hash
15656
15657 u8 tmp_buf[100] = { 0 };
15658
15659 uint hash_len = input_len - 3 - salt_len - 1;
15660
15661 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15662
15663 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15664
15665 memcpy (digest, tmp_buf, 32);
15666
15667 digest[0] = byte_swap_32 (digest[0]);
15668 digest[1] = byte_swap_32 (digest[1]);
15669 digest[2] = byte_swap_32 (digest[2]);
15670 digest[3] = byte_swap_32 (digest[3]);
15671 digest[4] = byte_swap_32 (digest[4]);
15672 digest[5] = byte_swap_32 (digest[5]);
15673 digest[6] = byte_swap_32 (digest[6]);
15674 digest[7] = byte_swap_32 (digest[7]);
15675
15676 return (PARSER_OK);
15677 }
15678
15679 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15680 {
15681 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
15682
15683 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15684
15685 u32 *digest = (u32 *) hash_buf->digest;
15686
15687 salt_t *salt = hash_buf->salt;
15688
15689 /**
15690 * parse line
15691 */
15692
15693 // first is *raw* salt
15694
15695 char *salt_pos = input_buf + 3;
15696
15697 char *hash_pos = strchr (salt_pos, '$');
15698
15699 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15700
15701 uint salt_len = hash_pos - salt_pos;
15702
15703 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15704
15705 salt->salt_len = salt_len;
15706 hash_pos++;
15707
15708 char *salt_buf_ptr = (char *) salt->salt_buf;
15709
15710 memcpy (salt_buf_ptr, salt_pos, salt_len);
15711 salt_buf_ptr[salt_len] = 0;
15712
15713 // base64 decode hash
15714
15715 u8 tmp_buf[100] = { 0 };
15716
15717 uint hash_len = input_len - 3 - salt_len - 1;
15718
15719 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15720
15721 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15722
15723 memcpy (digest, tmp_buf, 32);
15724
15725 // fixed:
15726 salt->scrypt_N = 16384;
15727 salt->scrypt_r = 1;
15728 salt->scrypt_p = 1;
15729 salt->salt_iter = 1;
15730
15731 return (PARSER_OK);
15732 }
15733
15734 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15735 {
15736 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
15737
15738 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15739
15740 u32 *digest = (u32 *) hash_buf->digest;
15741
15742 salt_t *salt = hash_buf->salt;
15743
15744 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
15745
15746 /**
15747 * parse line
15748 */
15749
15750 char *version_pos = input_buf + 8 + 1;
15751
15752 char *verifierHashSize_pos = strchr (version_pos, '*');
15753
15754 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15755
15756 u32 version_len = verifierHashSize_pos - version_pos;
15757
15758 if (version_len != 4) return (PARSER_SALT_LENGTH);
15759
15760 verifierHashSize_pos++;
15761
15762 char *keySize_pos = strchr (verifierHashSize_pos, '*');
15763
15764 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15765
15766 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
15767
15768 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
15769
15770 keySize_pos++;
15771
15772 char *saltSize_pos = strchr (keySize_pos, '*');
15773
15774 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15775
15776 u32 keySize_len = saltSize_pos - keySize_pos;
15777
15778 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15779
15780 saltSize_pos++;
15781
15782 char *osalt_pos = strchr (saltSize_pos, '*');
15783
15784 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15785
15786 u32 saltSize_len = osalt_pos - saltSize_pos;
15787
15788 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15789
15790 osalt_pos++;
15791
15792 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15793
15794 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15795
15796 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15797
15798 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15799
15800 encryptedVerifier_pos++;
15801
15802 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15803
15804 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15805
15806 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15807
15808 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15809
15810 encryptedVerifierHash_pos++;
15811
15812 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;
15813
15814 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15815
15816 const uint version = atoi (version_pos);
15817
15818 if (version != 2007) return (PARSER_SALT_VALUE);
15819
15820 const uint verifierHashSize = atoi (verifierHashSize_pos);
15821
15822 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
15823
15824 const uint keySize = atoi (keySize_pos);
15825
15826 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
15827
15828 office2007->keySize = keySize;
15829
15830 const uint saltSize = atoi (saltSize_pos);
15831
15832 if (saltSize != 16) return (PARSER_SALT_VALUE);
15833
15834 /**
15835 * salt
15836 */
15837
15838 salt->salt_len = 16;
15839 salt->salt_iter = ROUNDS_OFFICE2007;
15840
15841 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15842 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15843 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15844 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15845
15846 /**
15847 * esalt
15848 */
15849
15850 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15851 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15852 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15853 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15854
15855 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15856 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15857 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15858 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15859 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15860
15861 /**
15862 * digest
15863 */
15864
15865 digest[0] = office2007->encryptedVerifierHash[0];
15866 digest[1] = office2007->encryptedVerifierHash[1];
15867 digest[2] = office2007->encryptedVerifierHash[2];
15868 digest[3] = office2007->encryptedVerifierHash[3];
15869
15870 return (PARSER_OK);
15871 }
15872
15873 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15874 {
15875 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
15876
15877 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15878
15879 u32 *digest = (u32 *) hash_buf->digest;
15880
15881 salt_t *salt = hash_buf->salt;
15882
15883 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
15884
15885 /**
15886 * parse line
15887 */
15888
15889 char *version_pos = input_buf + 8 + 1;
15890
15891 char *spinCount_pos = strchr (version_pos, '*');
15892
15893 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15894
15895 u32 version_len = spinCount_pos - version_pos;
15896
15897 if (version_len != 4) return (PARSER_SALT_LENGTH);
15898
15899 spinCount_pos++;
15900
15901 char *keySize_pos = strchr (spinCount_pos, '*');
15902
15903 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15904
15905 u32 spinCount_len = keySize_pos - spinCount_pos;
15906
15907 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15908
15909 keySize_pos++;
15910
15911 char *saltSize_pos = strchr (keySize_pos, '*');
15912
15913 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15914
15915 u32 keySize_len = saltSize_pos - keySize_pos;
15916
15917 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15918
15919 saltSize_pos++;
15920
15921 char *osalt_pos = strchr (saltSize_pos, '*');
15922
15923 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15924
15925 u32 saltSize_len = osalt_pos - saltSize_pos;
15926
15927 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15928
15929 osalt_pos++;
15930
15931 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15932
15933 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15934
15935 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15936
15937 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15938
15939 encryptedVerifier_pos++;
15940
15941 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15942
15943 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15944
15945 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15946
15947 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15948
15949 encryptedVerifierHash_pos++;
15950
15951 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;
15952
15953 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15954
15955 const uint version = atoi (version_pos);
15956
15957 if (version != 2010) return (PARSER_SALT_VALUE);
15958
15959 const uint spinCount = atoi (spinCount_pos);
15960
15961 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15962
15963 const uint keySize = atoi (keySize_pos);
15964
15965 if (keySize != 128) return (PARSER_SALT_VALUE);
15966
15967 const uint saltSize = atoi (saltSize_pos);
15968
15969 if (saltSize != 16) return (PARSER_SALT_VALUE);
15970
15971 /**
15972 * salt
15973 */
15974
15975 salt->salt_len = 16;
15976 salt->salt_iter = spinCount;
15977
15978 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15979 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15980 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15981 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15982
15983 /**
15984 * esalt
15985 */
15986
15987 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15988 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15989 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15990 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15991
15992 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15993 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15994 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15995 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15996 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15997 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15998 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15999 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
16000
16001 /**
16002 * digest
16003 */
16004
16005 digest[0] = office2010->encryptedVerifierHash[0];
16006 digest[1] = office2010->encryptedVerifierHash[1];
16007 digest[2] = office2010->encryptedVerifierHash[2];
16008 digest[3] = office2010->encryptedVerifierHash[3];
16009
16010 return (PARSER_OK);
16011 }
16012
16013 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16014 {
16015 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
16016
16017 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
16018
16019 u32 *digest = (u32 *) hash_buf->digest;
16020
16021 salt_t *salt = hash_buf->salt;
16022
16023 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
16024
16025 /**
16026 * parse line
16027 */
16028
16029 char *version_pos = input_buf + 8 + 1;
16030
16031 char *spinCount_pos = strchr (version_pos, '*');
16032
16033 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16034
16035 u32 version_len = spinCount_pos - version_pos;
16036
16037 if (version_len != 4) return (PARSER_SALT_LENGTH);
16038
16039 spinCount_pos++;
16040
16041 char *keySize_pos = strchr (spinCount_pos, '*');
16042
16043 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16044
16045 u32 spinCount_len = keySize_pos - spinCount_pos;
16046
16047 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
16048
16049 keySize_pos++;
16050
16051 char *saltSize_pos = strchr (keySize_pos, '*');
16052
16053 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16054
16055 u32 keySize_len = saltSize_pos - keySize_pos;
16056
16057 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
16058
16059 saltSize_pos++;
16060
16061 char *osalt_pos = strchr (saltSize_pos, '*');
16062
16063 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16064
16065 u32 saltSize_len = osalt_pos - saltSize_pos;
16066
16067 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
16068
16069 osalt_pos++;
16070
16071 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16072
16073 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16074
16075 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16076
16077 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16078
16079 encryptedVerifier_pos++;
16080
16081 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16082
16083 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16084
16085 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16086
16087 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16088
16089 encryptedVerifierHash_pos++;
16090
16091 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;
16092
16093 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
16094
16095 const uint version = atoi (version_pos);
16096
16097 if (version != 2013) return (PARSER_SALT_VALUE);
16098
16099 const uint spinCount = atoi (spinCount_pos);
16100
16101 if (spinCount != 100000) return (PARSER_SALT_VALUE);
16102
16103 const uint keySize = atoi (keySize_pos);
16104
16105 if (keySize != 256) return (PARSER_SALT_VALUE);
16106
16107 const uint saltSize = atoi (saltSize_pos);
16108
16109 if (saltSize != 16) return (PARSER_SALT_VALUE);
16110
16111 /**
16112 * salt
16113 */
16114
16115 salt->salt_len = 16;
16116 salt->salt_iter = spinCount;
16117
16118 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16119 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16120 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16121 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16122
16123 /**
16124 * esalt
16125 */
16126
16127 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16128 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16129 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16130 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16131
16132 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16133 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16134 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16135 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16136 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16137 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
16138 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
16139 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
16140
16141 /**
16142 * digest
16143 */
16144
16145 digest[0] = office2013->encryptedVerifierHash[0];
16146 digest[1] = office2013->encryptedVerifierHash[1];
16147 digest[2] = office2013->encryptedVerifierHash[2];
16148 digest[3] = office2013->encryptedVerifierHash[3];
16149
16150 return (PARSER_OK);
16151 }
16152
16153 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16154 {
16155 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
16156
16157 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16158
16159 u32 *digest = (u32 *) hash_buf->digest;
16160
16161 salt_t *salt = hash_buf->salt;
16162
16163 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
16164
16165 /**
16166 * parse line
16167 */
16168
16169 char *version_pos = input_buf + 11;
16170
16171 char *osalt_pos = strchr (version_pos, '*');
16172
16173 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16174
16175 u32 version_len = osalt_pos - version_pos;
16176
16177 if (version_len != 1) return (PARSER_SALT_LENGTH);
16178
16179 osalt_pos++;
16180
16181 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16182
16183 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16184
16185 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16186
16187 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16188
16189 encryptedVerifier_pos++;
16190
16191 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16192
16193 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16194
16195 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16196
16197 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16198
16199 encryptedVerifierHash_pos++;
16200
16201 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16202
16203 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16204
16205 const uint version = *version_pos - 0x30;
16206
16207 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16208
16209 /**
16210 * esalt
16211 */
16212
16213 oldoffice01->version = version;
16214
16215 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16216 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16217 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16218 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16219
16220 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16221 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16222 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16223 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16224
16225 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16226 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16227 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16228 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16229
16230 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16231 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16232 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16233 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16234
16235 /**
16236 * salt
16237 */
16238
16239 salt->salt_len = 16;
16240
16241 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16242 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16243 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16244 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16245
16246 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16247 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16248 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16249 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16250
16251 // this is a workaround as office produces multiple documents with the same salt
16252
16253 salt->salt_len += 32;
16254
16255 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16256 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16257 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16258 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16259 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16260 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16261 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16262 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16263
16264 /**
16265 * digest
16266 */
16267
16268 digest[0] = oldoffice01->encryptedVerifierHash[0];
16269 digest[1] = oldoffice01->encryptedVerifierHash[1];
16270 digest[2] = oldoffice01->encryptedVerifierHash[2];
16271 digest[3] = oldoffice01->encryptedVerifierHash[3];
16272
16273 return (PARSER_OK);
16274 }
16275
16276 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16277 {
16278 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
16279 }
16280
16281 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16282 {
16283 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
16284
16285 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16286
16287 u32 *digest = (u32 *) hash_buf->digest;
16288
16289 salt_t *salt = hash_buf->salt;
16290
16291 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
16292
16293 /**
16294 * parse line
16295 */
16296
16297 char *version_pos = input_buf + 11;
16298
16299 char *osalt_pos = strchr (version_pos, '*');
16300
16301 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16302
16303 u32 version_len = osalt_pos - version_pos;
16304
16305 if (version_len != 1) return (PARSER_SALT_LENGTH);
16306
16307 osalt_pos++;
16308
16309 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16310
16311 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16312
16313 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16314
16315 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16316
16317 encryptedVerifier_pos++;
16318
16319 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16320
16321 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16322
16323 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16324
16325 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16326
16327 encryptedVerifierHash_pos++;
16328
16329 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16330
16331 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16332
16333 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16334
16335 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16336
16337 rc4key_pos++;
16338
16339 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16340
16341 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16342
16343 const uint version = *version_pos - 0x30;
16344
16345 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16346
16347 /**
16348 * esalt
16349 */
16350
16351 oldoffice01->version = version;
16352
16353 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16354 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16355 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16356 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16357
16358 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16359 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16360 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16361 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16362
16363 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16364 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16365 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16366 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16367
16368 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16369 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16370 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16371 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16372
16373 oldoffice01->rc4key[1] = 0;
16374 oldoffice01->rc4key[0] = 0;
16375
16376 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16377 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16378 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16379 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16380 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16381 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16382 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16383 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16384 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16385 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16386
16387 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
16388 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
16389
16390 /**
16391 * salt
16392 */
16393
16394 salt->salt_len = 16;
16395
16396 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16397 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16398 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16399 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16400
16401 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16402 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16403 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16404 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16405
16406 // this is a workaround as office produces multiple documents with the same salt
16407
16408 salt->salt_len += 32;
16409
16410 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16411 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16412 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16413 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16414 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16415 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16416 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16417 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16418
16419 /**
16420 * digest
16421 */
16422
16423 digest[0] = oldoffice01->rc4key[0];
16424 digest[1] = oldoffice01->rc4key[1];
16425 digest[2] = 0;
16426 digest[3] = 0;
16427
16428 return (PARSER_OK);
16429 }
16430
16431 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16432 {
16433 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
16434
16435 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16436
16437 u32 *digest = (u32 *) hash_buf->digest;
16438
16439 salt_t *salt = hash_buf->salt;
16440
16441 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16442
16443 /**
16444 * parse line
16445 */
16446
16447 char *version_pos = input_buf + 11;
16448
16449 char *osalt_pos = strchr (version_pos, '*');
16450
16451 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16452
16453 u32 version_len = osalt_pos - version_pos;
16454
16455 if (version_len != 1) return (PARSER_SALT_LENGTH);
16456
16457 osalt_pos++;
16458
16459 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16460
16461 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16462
16463 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16464
16465 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16466
16467 encryptedVerifier_pos++;
16468
16469 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16470
16471 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16472
16473 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16474
16475 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16476
16477 encryptedVerifierHash_pos++;
16478
16479 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16480
16481 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16482
16483 const uint version = *version_pos - 0x30;
16484
16485 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16486
16487 /**
16488 * esalt
16489 */
16490
16491 oldoffice34->version = version;
16492
16493 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16494 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16495 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16496 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16497
16498 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16499 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16500 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16501 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16502
16503 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16504 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16505 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16506 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16507 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16508
16509 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16510 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16511 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16512 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16513 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16514
16515 /**
16516 * salt
16517 */
16518
16519 salt->salt_len = 16;
16520
16521 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16522 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16523 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16524 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16525
16526 // this is a workaround as office produces multiple documents with the same salt
16527
16528 salt->salt_len += 32;
16529
16530 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16531 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16532 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16533 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16534 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16535 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16536 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16537 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16538
16539 /**
16540 * digest
16541 */
16542
16543 digest[0] = oldoffice34->encryptedVerifierHash[0];
16544 digest[1] = oldoffice34->encryptedVerifierHash[1];
16545 digest[2] = oldoffice34->encryptedVerifierHash[2];
16546 digest[3] = oldoffice34->encryptedVerifierHash[3];
16547
16548 return (PARSER_OK);
16549 }
16550
16551 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16552 {
16553 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16554
16555 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
16556 }
16557
16558 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16559 {
16560 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
16561
16562 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16563
16564 u32 *digest = (u32 *) hash_buf->digest;
16565
16566 salt_t *salt = hash_buf->salt;
16567
16568 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16569
16570 /**
16571 * parse line
16572 */
16573
16574 char *version_pos = input_buf + 11;
16575
16576 char *osalt_pos = strchr (version_pos, '*');
16577
16578 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16579
16580 u32 version_len = osalt_pos - version_pos;
16581
16582 if (version_len != 1) return (PARSER_SALT_LENGTH);
16583
16584 osalt_pos++;
16585
16586 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16587
16588 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16589
16590 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16591
16592 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16593
16594 encryptedVerifier_pos++;
16595
16596 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16597
16598 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16599
16600 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16601
16602 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16603
16604 encryptedVerifierHash_pos++;
16605
16606 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16607
16608 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16609
16610 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16611
16612 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16613
16614 rc4key_pos++;
16615
16616 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16617
16618 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16619
16620 const uint version = *version_pos - 0x30;
16621
16622 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16623
16624 /**
16625 * esalt
16626 */
16627
16628 oldoffice34->version = version;
16629
16630 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16631 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16632 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16633 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16634
16635 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16636 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16637 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16638 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16639
16640 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16641 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16642 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16643 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16644 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16645
16646 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16647 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16648 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16649 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16650 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16651
16652 oldoffice34->rc4key[1] = 0;
16653 oldoffice34->rc4key[0] = 0;
16654
16655 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16656 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16657 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16658 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16659 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16660 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16661 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16662 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16663 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16664 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16665
16666 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
16667 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
16668
16669 /**
16670 * salt
16671 */
16672
16673 salt->salt_len = 16;
16674
16675 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16676 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16677 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16678 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16679
16680 // this is a workaround as office produces multiple documents with the same salt
16681
16682 salt->salt_len += 32;
16683
16684 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16685 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16686 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16687 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16688 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16689 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16690 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16691 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16692
16693 /**
16694 * digest
16695 */
16696
16697 digest[0] = oldoffice34->rc4key[0];
16698 digest[1] = oldoffice34->rc4key[1];
16699 digest[2] = 0;
16700 digest[3] = 0;
16701
16702 return (PARSER_OK);
16703 }
16704
16705 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16706 {
16707 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
16708
16709 u32 *digest = (u32 *) hash_buf->digest;
16710
16711 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16712 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16713 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16714 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16715
16716 digest[0] = byte_swap_32 (digest[0]);
16717 digest[1] = byte_swap_32 (digest[1]);
16718 digest[2] = byte_swap_32 (digest[2]);
16719 digest[3] = byte_swap_32 (digest[3]);
16720
16721 return (PARSER_OK);
16722 }
16723
16724 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16725 {
16726 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
16727
16728 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16729
16730 u32 *digest = (u32 *) hash_buf->digest;
16731
16732 salt_t *salt = hash_buf->salt;
16733
16734 char *signature_pos = input_buf;
16735
16736 char *salt_pos = strchr (signature_pos, '$');
16737
16738 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16739
16740 u32 signature_len = salt_pos - signature_pos;
16741
16742 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
16743
16744 salt_pos++;
16745
16746 char *hash_pos = strchr (salt_pos, '$');
16747
16748 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16749
16750 u32 salt_len = hash_pos - salt_pos;
16751
16752 if (salt_len > 32) return (PARSER_SALT_LENGTH);
16753
16754 hash_pos++;
16755
16756 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
16757
16758 if (hash_len != 40) return (PARSER_SALT_LENGTH);
16759
16760 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
16761 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
16762 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
16763 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
16764 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
16765
16766 digest[0] -= SHA1M_A;
16767 digest[1] -= SHA1M_B;
16768 digest[2] -= SHA1M_C;
16769 digest[3] -= SHA1M_D;
16770 digest[4] -= SHA1M_E;
16771
16772 char *salt_buf_ptr = (char *) salt->salt_buf;
16773
16774 memcpy (salt_buf_ptr, salt_pos, salt_len);
16775
16776 salt->salt_len = salt_len;
16777
16778 return (PARSER_OK);
16779 }
16780
16781 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16782 {
16783 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
16784
16785 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
16786
16787 u32 *digest = (u32 *) hash_buf->digest;
16788
16789 salt_t *salt = hash_buf->salt;
16790
16791 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16792
16793 /**
16794 * parse line
16795 */
16796
16797 char *iter_pos = input_buf + 14;
16798
16799 const int iter = atoi (iter_pos);
16800
16801 if (iter < 1) return (PARSER_SALT_ITERATION);
16802
16803 salt->salt_iter = iter - 1;
16804
16805 char *salt_pos = strchr (iter_pos, '$');
16806
16807 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16808
16809 salt_pos++;
16810
16811 char *hash_pos = strchr (salt_pos, '$');
16812
16813 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16814
16815 const uint salt_len = hash_pos - salt_pos;
16816
16817 hash_pos++;
16818
16819 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16820
16821 memcpy (salt_buf_ptr, salt_pos, salt_len);
16822
16823 salt->salt_len = salt_len;
16824
16825 salt_buf_ptr[salt_len + 3] = 0x01;
16826 salt_buf_ptr[salt_len + 4] = 0x80;
16827
16828 // add some stuff to normal salt to make sorted happy
16829
16830 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16831 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16832 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16833 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16834 salt->salt_buf[4] = salt->salt_iter;
16835
16836 // base64 decode hash
16837
16838 u8 tmp_buf[100] = { 0 };
16839
16840 uint hash_len = input_len - (hash_pos - input_buf);
16841
16842 if (hash_len != 44) return (PARSER_HASH_LENGTH);
16843
16844 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16845
16846 memcpy (digest, tmp_buf, 32);
16847
16848 digest[0] = byte_swap_32 (digest[0]);
16849 digest[1] = byte_swap_32 (digest[1]);
16850 digest[2] = byte_swap_32 (digest[2]);
16851 digest[3] = byte_swap_32 (digest[3]);
16852 digest[4] = byte_swap_32 (digest[4]);
16853 digest[5] = byte_swap_32 (digest[5]);
16854 digest[6] = byte_swap_32 (digest[6]);
16855 digest[7] = byte_swap_32 (digest[7]);
16856
16857 return (PARSER_OK);
16858 }
16859
16860 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16861 {
16862 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
16863
16864 u32 *digest = (u32 *) hash_buf->digest;
16865
16866 salt_t *salt = hash_buf->salt;
16867
16868 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16869 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16870 digest[2] = 0;
16871 digest[3] = 0;
16872
16873 digest[0] = byte_swap_32 (digest[0]);
16874 digest[1] = byte_swap_32 (digest[1]);
16875
16876 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16877 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16878 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16879
16880 char iter_c = input_buf[17];
16881 char iter_d = input_buf[19];
16882
16883 // atm only defaults, let's see if there's more request
16884 if (iter_c != '2') return (PARSER_SALT_ITERATION);
16885 if (iter_d != '4') return (PARSER_SALT_ITERATION);
16886
16887 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
16888
16889 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
16890 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
16891 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
16892 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
16893
16894 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16895 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16896 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16897 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16898
16899 salt->salt_len = 16;
16900
16901 return (PARSER_OK);
16902 }
16903
16904 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16905 {
16906 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
16907
16908 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16909
16910 u32 *digest = (u32 *) hash_buf->digest;
16911
16912 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
16913
16914 salt_t *salt = hash_buf->salt;
16915
16916 char *salt_pos = input_buf + 10;
16917
16918 char *hash_pos = strchr (salt_pos, '$');
16919
16920 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16921
16922 uint salt_len = hash_pos - salt_pos;
16923
16924 hash_pos++;
16925
16926 uint hash_len = input_len - 10 - salt_len - 1;
16927
16928 // base64 decode salt
16929
16930 if (salt_len > 133) return (PARSER_SALT_LENGTH);
16931
16932 u8 tmp_buf[100] = { 0 };
16933
16934 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
16935
16936 if (salt_len > 55) return (PARSER_SALT_LENGTH);
16937
16938 tmp_buf[salt_len] = 0x80;
16939
16940 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
16941
16942 salt->salt_len = salt_len;
16943
16944 // base64 decode hash
16945
16946 if (hash_len > 133) return (PARSER_HASH_LENGTH);
16947
16948 memset (tmp_buf, 0, sizeof (tmp_buf));
16949
16950 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16951
16952 if (hash_len < 32 + 1) return (PARSER_SALT_LENGTH);
16953
16954 uint user_len = hash_len - 32;
16955
16956 const u8 *tmp_hash = tmp_buf + user_len;
16957
16958 user_len--; // skip the trailing space
16959
16960 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16961 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16962 digest[2] = hex_to_u32 (&tmp_hash[16]);
16963 digest[3] = hex_to_u32 (&tmp_hash[24]);
16964
16965 digest[0] = byte_swap_32 (digest[0]);
16966 digest[1] = byte_swap_32 (digest[1]);
16967 digest[2] = byte_swap_32 (digest[2]);
16968 digest[3] = byte_swap_32 (digest[3]);
16969
16970 // store username for host only (output hash if cracked)
16971
16972 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16973 memcpy (cram_md5->user, tmp_buf, user_len);
16974
16975 return (PARSER_OK);
16976 }
16977
16978 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16979 {
16980 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16981
16982 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16983
16984 u32 *digest = (u32 *) hash_buf->digest;
16985
16986 salt_t *salt = hash_buf->salt;
16987
16988 char *iter_pos = input_buf + 10;
16989
16990 u32 iter = atoi (iter_pos);
16991
16992 if (iter < 1)
16993 {
16994 return (PARSER_SALT_ITERATION);
16995 }
16996
16997 iter--; // first iteration is special
16998
16999 salt->salt_iter = iter;
17000
17001 char *base64_pos = strchr (iter_pos, '}');
17002
17003 if (base64_pos == NULL)
17004 {
17005 return (PARSER_SIGNATURE_UNMATCHED);
17006 }
17007
17008 base64_pos++;
17009
17010 // base64 decode salt
17011
17012 u32 base64_len = input_len - (base64_pos - input_buf);
17013
17014 u8 tmp_buf[100] = { 0 };
17015
17016 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
17017
17018 if (decoded_len < 24)
17019 {
17020 return (PARSER_SALT_LENGTH);
17021 }
17022
17023 // copy the salt
17024
17025 uint salt_len = decoded_len - 20;
17026
17027 if (salt_len < 4) return (PARSER_SALT_LENGTH);
17028 if (salt_len > 16) return (PARSER_SALT_LENGTH);
17029
17030 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
17031
17032 salt->salt_len = salt_len;
17033
17034 // set digest
17035
17036 u32 *digest_ptr = (u32*) tmp_buf;
17037
17038 digest[0] = byte_swap_32 (digest_ptr[0]);
17039 digest[1] = byte_swap_32 (digest_ptr[1]);
17040 digest[2] = byte_swap_32 (digest_ptr[2]);
17041 digest[3] = byte_swap_32 (digest_ptr[3]);
17042 digest[4] = byte_swap_32 (digest_ptr[4]);
17043
17044 return (PARSER_OK);
17045 }
17046
17047 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17048 {
17049 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
17050
17051 u32 *digest = (u32 *) hash_buf->digest;
17052
17053 salt_t *salt = hash_buf->salt;
17054
17055 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17056 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17057 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17058 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17059 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
17060
17061 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17062
17063 uint salt_len = input_len - 40 - 1;
17064
17065 char *salt_buf = input_buf + 40 + 1;
17066
17067 char *salt_buf_ptr = (char *) salt->salt_buf;
17068
17069 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17070
17071 if (salt_len != 32) return (PARSER_SALT_LENGTH);
17072
17073 salt->salt_len = salt_len;
17074
17075 return (PARSER_OK);
17076 }
17077
17078 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17079 {
17080 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
17081
17082 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17083
17084 u32 *digest = (u32 *) hash_buf->digest;
17085
17086 salt_t *salt = hash_buf->salt;
17087
17088 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17089
17090 /**
17091 * parse line
17092 */
17093
17094 char *V_pos = input_buf + 5;
17095
17096 char *R_pos = strchr (V_pos, '*');
17097
17098 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17099
17100 u32 V_len = R_pos - V_pos;
17101
17102 R_pos++;
17103
17104 char *bits_pos = strchr (R_pos, '*');
17105
17106 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17107
17108 u32 R_len = bits_pos - R_pos;
17109
17110 bits_pos++;
17111
17112 char *P_pos = strchr (bits_pos, '*');
17113
17114 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17115
17116 u32 bits_len = P_pos - bits_pos;
17117
17118 P_pos++;
17119
17120 char *enc_md_pos = strchr (P_pos, '*');
17121
17122 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17123
17124 u32 P_len = enc_md_pos - P_pos;
17125
17126 enc_md_pos++;
17127
17128 char *id_len_pos = strchr (enc_md_pos, '*');
17129
17130 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17131
17132 u32 enc_md_len = id_len_pos - enc_md_pos;
17133
17134 id_len_pos++;
17135
17136 char *id_buf_pos = strchr (id_len_pos, '*');
17137
17138 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17139
17140 u32 id_len_len = id_buf_pos - id_len_pos;
17141
17142 id_buf_pos++;
17143
17144 char *u_len_pos = strchr (id_buf_pos, '*');
17145
17146 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17147
17148 u32 id_buf_len = u_len_pos - id_buf_pos;
17149
17150 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
17151
17152 u_len_pos++;
17153
17154 char *u_buf_pos = strchr (u_len_pos, '*');
17155
17156 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17157
17158 u32 u_len_len = u_buf_pos - u_len_pos;
17159
17160 u_buf_pos++;
17161
17162 char *o_len_pos = strchr (u_buf_pos, '*');
17163
17164 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17165
17166 u32 u_buf_len = o_len_pos - u_buf_pos;
17167
17168 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17169
17170 o_len_pos++;
17171
17172 char *o_buf_pos = strchr (o_len_pos, '*');
17173
17174 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17175
17176 u32 o_len_len = o_buf_pos - o_len_pos;
17177
17178 o_buf_pos++;
17179
17180 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;
17181
17182 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17183
17184 // validate data
17185
17186 const int V = atoi (V_pos);
17187 const int R = atoi (R_pos);
17188 const int P = atoi (P_pos);
17189
17190 if (V != 1) return (PARSER_SALT_VALUE);
17191 if (R != 2) return (PARSER_SALT_VALUE);
17192
17193 const int enc_md = atoi (enc_md_pos);
17194
17195 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17196
17197 const int id_len = atoi (id_len_pos);
17198 const int u_len = atoi (u_len_pos);
17199 const int o_len = atoi (o_len_pos);
17200
17201 if (id_len != 16) return (PARSER_SALT_VALUE);
17202 if (u_len != 32) return (PARSER_SALT_VALUE);
17203 if (o_len != 32) return (PARSER_SALT_VALUE);
17204
17205 const int bits = atoi (bits_pos);
17206
17207 if (bits != 40) return (PARSER_SALT_VALUE);
17208
17209 // copy data to esalt
17210
17211 pdf->V = V;
17212 pdf->R = R;
17213 pdf->P = P;
17214
17215 pdf->enc_md = enc_md;
17216
17217 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17218 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17219 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17220 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17221 pdf->id_len = id_len;
17222
17223 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17224 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17225 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17226 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17227 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17228 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17229 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17230 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17231 pdf->u_len = u_len;
17232
17233 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17234 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17235 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17236 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17237 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17238 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17239 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17240 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17241 pdf->o_len = o_len;
17242
17243 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17244 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17245 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17246 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17247
17248 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17249 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17250 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17251 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17252 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17253 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17254 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17255 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17256
17257 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17258 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17259 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17260 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17261 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17262 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17263 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17264 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17265
17266 // we use ID for salt, maybe needs to change, we will see...
17267
17268 salt->salt_buf[0] = pdf->id_buf[0];
17269 salt->salt_buf[1] = pdf->id_buf[1];
17270 salt->salt_buf[2] = pdf->id_buf[2];
17271 salt->salt_buf[3] = pdf->id_buf[3];
17272 salt->salt_len = pdf->id_len;
17273
17274 digest[0] = pdf->u_buf[0];
17275 digest[1] = pdf->u_buf[1];
17276 digest[2] = pdf->u_buf[2];
17277 digest[3] = pdf->u_buf[3];
17278
17279 return (PARSER_OK);
17280 }
17281
17282 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17283 {
17284 return pdf11_parse_hash (input_buf, input_len, hash_buf);
17285 }
17286
17287 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17288 {
17289 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
17290
17291 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17292
17293 u32 *digest = (u32 *) hash_buf->digest;
17294
17295 salt_t *salt = hash_buf->salt;
17296
17297 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17298
17299 /**
17300 * parse line
17301 */
17302
17303 char *V_pos = input_buf + 5;
17304
17305 char *R_pos = strchr (V_pos, '*');
17306
17307 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17308
17309 u32 V_len = R_pos - V_pos;
17310
17311 R_pos++;
17312
17313 char *bits_pos = strchr (R_pos, '*');
17314
17315 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17316
17317 u32 R_len = bits_pos - R_pos;
17318
17319 bits_pos++;
17320
17321 char *P_pos = strchr (bits_pos, '*');
17322
17323 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17324
17325 u32 bits_len = P_pos - bits_pos;
17326
17327 P_pos++;
17328
17329 char *enc_md_pos = strchr (P_pos, '*');
17330
17331 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17332
17333 u32 P_len = enc_md_pos - P_pos;
17334
17335 enc_md_pos++;
17336
17337 char *id_len_pos = strchr (enc_md_pos, '*');
17338
17339 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17340
17341 u32 enc_md_len = id_len_pos - enc_md_pos;
17342
17343 id_len_pos++;
17344
17345 char *id_buf_pos = strchr (id_len_pos, '*');
17346
17347 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17348
17349 u32 id_len_len = id_buf_pos - id_len_pos;
17350
17351 id_buf_pos++;
17352
17353 char *u_len_pos = strchr (id_buf_pos, '*');
17354
17355 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17356
17357 u32 id_buf_len = u_len_pos - id_buf_pos;
17358
17359 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
17360
17361 u_len_pos++;
17362
17363 char *u_buf_pos = strchr (u_len_pos, '*');
17364
17365 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17366
17367 u32 u_len_len = u_buf_pos - u_len_pos;
17368
17369 u_buf_pos++;
17370
17371 char *o_len_pos = strchr (u_buf_pos, '*');
17372
17373 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17374
17375 u32 u_buf_len = o_len_pos - u_buf_pos;
17376
17377 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17378
17379 o_len_pos++;
17380
17381 char *o_buf_pos = strchr (o_len_pos, '*');
17382
17383 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17384
17385 u32 o_len_len = o_buf_pos - o_len_pos;
17386
17387 o_buf_pos++;
17388
17389 char *rc4key_pos = strchr (o_buf_pos, ':');
17390
17391 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17392
17393 u32 o_buf_len = rc4key_pos - o_buf_pos;
17394
17395 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17396
17397 rc4key_pos++;
17398
17399 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;
17400
17401 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
17402
17403 // validate data
17404
17405 const int V = atoi (V_pos);
17406 const int R = atoi (R_pos);
17407 const int P = atoi (P_pos);
17408
17409 if (V != 1) return (PARSER_SALT_VALUE);
17410 if (R != 2) return (PARSER_SALT_VALUE);
17411
17412 const int enc_md = atoi (enc_md_pos);
17413
17414 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17415
17416 const int id_len = atoi (id_len_pos);
17417 const int u_len = atoi (u_len_pos);
17418 const int o_len = atoi (o_len_pos);
17419
17420 if (id_len != 16) return (PARSER_SALT_VALUE);
17421 if (u_len != 32) return (PARSER_SALT_VALUE);
17422 if (o_len != 32) return (PARSER_SALT_VALUE);
17423
17424 const int bits = atoi (bits_pos);
17425
17426 if (bits != 40) return (PARSER_SALT_VALUE);
17427
17428 // copy data to esalt
17429
17430 pdf->V = V;
17431 pdf->R = R;
17432 pdf->P = P;
17433
17434 pdf->enc_md = enc_md;
17435
17436 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17437 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17438 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17439 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17440 pdf->id_len = id_len;
17441
17442 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17443 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17444 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17445 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17446 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17447 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17448 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17449 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17450 pdf->u_len = u_len;
17451
17452 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17453 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17454 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17455 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17456 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17457 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17458 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17459 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17460 pdf->o_len = o_len;
17461
17462 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17463 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17464 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17465 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17466
17467 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17468 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17469 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17470 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17471 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17472 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17473 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17474 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17475
17476 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17477 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17478 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17479 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17480 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17481 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17482 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17483 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17484
17485 pdf->rc4key[1] = 0;
17486 pdf->rc4key[0] = 0;
17487
17488 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
17489 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
17490 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
17491 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
17492 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
17493 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
17494 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
17495 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
17496 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
17497 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
17498
17499 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
17500 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
17501
17502 // we use ID for salt, maybe needs to change, we will see...
17503
17504 salt->salt_buf[0] = pdf->id_buf[0];
17505 salt->salt_buf[1] = pdf->id_buf[1];
17506 salt->salt_buf[2] = pdf->id_buf[2];
17507 salt->salt_buf[3] = pdf->id_buf[3];
17508 salt->salt_buf[4] = pdf->u_buf[0];
17509 salt->salt_buf[5] = pdf->u_buf[1];
17510 salt->salt_buf[6] = pdf->o_buf[0];
17511 salt->salt_buf[7] = pdf->o_buf[1];
17512 salt->salt_len = pdf->id_len + 16;
17513
17514 digest[0] = pdf->rc4key[0];
17515 digest[1] = pdf->rc4key[1];
17516 digest[2] = 0;
17517 digest[3] = 0;
17518
17519 return (PARSER_OK);
17520 }
17521
17522 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17523 {
17524 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
17525
17526 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17527
17528 u32 *digest = (u32 *) hash_buf->digest;
17529
17530 salt_t *salt = hash_buf->salt;
17531
17532 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17533
17534 /**
17535 * parse line
17536 */
17537
17538 char *V_pos = input_buf + 5;
17539
17540 char *R_pos = strchr (V_pos, '*');
17541
17542 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17543
17544 u32 V_len = R_pos - V_pos;
17545
17546 R_pos++;
17547
17548 char *bits_pos = strchr (R_pos, '*');
17549
17550 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17551
17552 u32 R_len = bits_pos - R_pos;
17553
17554 bits_pos++;
17555
17556 char *P_pos = strchr (bits_pos, '*');
17557
17558 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17559
17560 u32 bits_len = P_pos - bits_pos;
17561
17562 P_pos++;
17563
17564 char *enc_md_pos = strchr (P_pos, '*');
17565
17566 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17567
17568 u32 P_len = enc_md_pos - P_pos;
17569
17570 enc_md_pos++;
17571
17572 char *id_len_pos = strchr (enc_md_pos, '*');
17573
17574 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17575
17576 u32 enc_md_len = id_len_pos - enc_md_pos;
17577
17578 id_len_pos++;
17579
17580 char *id_buf_pos = strchr (id_len_pos, '*');
17581
17582 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17583
17584 u32 id_len_len = id_buf_pos - id_len_pos;
17585
17586 id_buf_pos++;
17587
17588 char *u_len_pos = strchr (id_buf_pos, '*');
17589
17590 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17591
17592 u32 id_buf_len = u_len_pos - id_buf_pos;
17593
17594 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
17595
17596 u_len_pos++;
17597
17598 char *u_buf_pos = strchr (u_len_pos, '*');
17599
17600 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17601
17602 u32 u_len_len = u_buf_pos - u_len_pos;
17603
17604 u_buf_pos++;
17605
17606 char *o_len_pos = strchr (u_buf_pos, '*');
17607
17608 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17609
17610 u32 u_buf_len = o_len_pos - u_buf_pos;
17611
17612 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17613
17614 o_len_pos++;
17615
17616 char *o_buf_pos = strchr (o_len_pos, '*');
17617
17618 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17619
17620 u32 o_len_len = o_buf_pos - o_len_pos;
17621
17622 o_buf_pos++;
17623
17624 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;
17625
17626 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17627
17628 // validate data
17629
17630 const int V = atoi (V_pos);
17631 const int R = atoi (R_pos);
17632 const int P = atoi (P_pos);
17633
17634 int vr_ok = 0;
17635
17636 if ((V == 2) && (R == 3)) vr_ok = 1;
17637 if ((V == 4) && (R == 4)) vr_ok = 1;
17638
17639 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17640
17641 const int id_len = atoi (id_len_pos);
17642 const int u_len = atoi (u_len_pos);
17643 const int o_len = atoi (o_len_pos);
17644
17645 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
17646
17647 if (u_len != 32) return (PARSER_SALT_VALUE);
17648 if (o_len != 32) return (PARSER_SALT_VALUE);
17649
17650 const int bits = atoi (bits_pos);
17651
17652 if (bits != 128) return (PARSER_SALT_VALUE);
17653
17654 int enc_md = 1;
17655
17656 if (R >= 4)
17657 {
17658 enc_md = atoi (enc_md_pos);
17659 }
17660
17661 // copy data to esalt
17662
17663 pdf->V = V;
17664 pdf->R = R;
17665 pdf->P = P;
17666
17667 pdf->enc_md = enc_md;
17668
17669 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17670 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17671 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17672 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17673
17674 if (id_len == 32)
17675 {
17676 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
17677 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
17678 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
17679 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
17680 }
17681
17682 pdf->id_len = id_len;
17683
17684 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17685 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17686 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17687 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17688 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17689 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17690 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17691 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17692 pdf->u_len = u_len;
17693
17694 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17695 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17696 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17697 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17698 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17699 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17700 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17701 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17702 pdf->o_len = o_len;
17703
17704 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17705 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17706 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17707 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17708
17709 if (id_len == 32)
17710 {
17711 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
17712 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
17713 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
17714 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
17715 }
17716
17717 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17718 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17719 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17720 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17721 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17722 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17723 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17724 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17725
17726 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17727 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17728 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17729 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17730 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17731 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17732 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17733 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17734
17735 // precompute rc4 data for later use
17736
17737 uint padding[8] =
17738 {
17739 0x5e4ebf28,
17740 0x418a754e,
17741 0x564e0064,
17742 0x0801faff,
17743 0xb6002e2e,
17744 0x803e68d0,
17745 0xfea90c2f,
17746 0x7a695364
17747 };
17748
17749 // md5
17750
17751 uint salt_pc_block[32] = { 0 };
17752
17753 char *salt_pc_ptr = (char *) salt_pc_block;
17754
17755 memcpy (salt_pc_ptr, padding, 32);
17756 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
17757
17758 uint salt_pc_digest[4] = { 0 };
17759
17760 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
17761
17762 pdf->rc4data[0] = salt_pc_digest[0];
17763 pdf->rc4data[1] = salt_pc_digest[1];
17764
17765 // we use ID for salt, maybe needs to change, we will see...
17766
17767 salt->salt_buf[0] = pdf->id_buf[0];
17768 salt->salt_buf[1] = pdf->id_buf[1];
17769 salt->salt_buf[2] = pdf->id_buf[2];
17770 salt->salt_buf[3] = pdf->id_buf[3];
17771 salt->salt_buf[4] = pdf->u_buf[0];
17772 salt->salt_buf[5] = pdf->u_buf[1];
17773 salt->salt_buf[6] = pdf->o_buf[0];
17774 salt->salt_buf[7] = pdf->o_buf[1];
17775 salt->salt_len = pdf->id_len + 16;
17776
17777 salt->salt_iter = ROUNDS_PDF14;
17778
17779 digest[0] = pdf->u_buf[0];
17780 digest[1] = pdf->u_buf[1];
17781 digest[2] = 0;
17782 digest[3] = 0;
17783
17784 return (PARSER_OK);
17785 }
17786
17787 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17788 {
17789 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
17790
17791 if (ret != PARSER_OK)
17792 {
17793 return ret;
17794 }
17795
17796 u32 *digest = (u32 *) hash_buf->digest;
17797
17798 salt_t *salt = hash_buf->salt;
17799
17800 digest[0] -= SHA256M_A;
17801 digest[1] -= SHA256M_B;
17802 digest[2] -= SHA256M_C;
17803 digest[3] -= SHA256M_D;
17804 digest[4] -= SHA256M_E;
17805 digest[5] -= SHA256M_F;
17806 digest[6] -= SHA256M_G;
17807 digest[7] -= SHA256M_H;
17808
17809 salt->salt_buf[2] = 0x80;
17810
17811 return (PARSER_OK);
17812 }
17813
17814 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17815 {
17816 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
17817
17818 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17819
17820 u32 *digest = (u32 *) hash_buf->digest;
17821
17822 salt_t *salt = hash_buf->salt;
17823
17824 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17825
17826 /**
17827 * parse line
17828 */
17829
17830 char *V_pos = input_buf + 5;
17831
17832 char *R_pos = strchr (V_pos, '*');
17833
17834 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17835
17836 u32 V_len = R_pos - V_pos;
17837
17838 R_pos++;
17839
17840 char *bits_pos = strchr (R_pos, '*');
17841
17842 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17843
17844 u32 R_len = bits_pos - R_pos;
17845
17846 bits_pos++;
17847
17848 char *P_pos = strchr (bits_pos, '*');
17849
17850 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17851
17852 u32 bits_len = P_pos - bits_pos;
17853
17854 P_pos++;
17855
17856 char *enc_md_pos = strchr (P_pos, '*');
17857
17858 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17859
17860 u32 P_len = enc_md_pos - P_pos;
17861
17862 enc_md_pos++;
17863
17864 char *id_len_pos = strchr (enc_md_pos, '*');
17865
17866 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17867
17868 u32 enc_md_len = id_len_pos - enc_md_pos;
17869
17870 id_len_pos++;
17871
17872 char *id_buf_pos = strchr (id_len_pos, '*');
17873
17874 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17875
17876 u32 id_len_len = id_buf_pos - id_len_pos;
17877
17878 id_buf_pos++;
17879
17880 char *u_len_pos = strchr (id_buf_pos, '*');
17881
17882 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17883
17884 u32 id_buf_len = u_len_pos - id_buf_pos;
17885
17886 u_len_pos++;
17887
17888 char *u_buf_pos = strchr (u_len_pos, '*');
17889
17890 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17891
17892 u32 u_len_len = u_buf_pos - u_len_pos;
17893
17894 u_buf_pos++;
17895
17896 char *o_len_pos = strchr (u_buf_pos, '*');
17897
17898 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17899
17900 u32 u_buf_len = o_len_pos - u_buf_pos;
17901
17902 o_len_pos++;
17903
17904 char *o_buf_pos = strchr (o_len_pos, '*');
17905
17906 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17907
17908 u32 o_len_len = o_buf_pos - o_len_pos;
17909
17910 o_buf_pos++;
17911
17912 char *last = strchr (o_buf_pos, '*');
17913
17914 if (last == NULL) last = input_buf + input_len;
17915
17916 u32 o_buf_len = last - o_buf_pos;
17917
17918 // validate data
17919
17920 const int V = atoi (V_pos);
17921 const int R = atoi (R_pos);
17922
17923 int vr_ok = 0;
17924
17925 if ((V == 5) && (R == 5)) vr_ok = 1;
17926 if ((V == 5) && (R == 6)) vr_ok = 1;
17927
17928 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17929
17930 const int bits = atoi (bits_pos);
17931
17932 if (bits != 256) return (PARSER_SALT_VALUE);
17933
17934 int enc_md = atoi (enc_md_pos);
17935
17936 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17937
17938 const uint id_len = atoi (id_len_pos);
17939 const uint u_len = atoi (u_len_pos);
17940 const uint o_len = atoi (o_len_pos);
17941
17942 if (V_len > 6) return (PARSER_SALT_LENGTH);
17943 if (R_len > 6) return (PARSER_SALT_LENGTH);
17944 if (P_len > 6) return (PARSER_SALT_LENGTH);
17945 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
17946 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
17947 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
17948 if (bits_len > 6) return (PARSER_SALT_LENGTH);
17949 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17950
17951 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17952 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17953 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17954
17955 // copy data to esalt
17956
17957 if (u_len < 40) return (PARSER_SALT_VALUE);
17958
17959 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17960 {
17961 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17962 }
17963
17964 salt->salt_buf[0] = pdf->u_buf[8];
17965 salt->salt_buf[1] = pdf->u_buf[9];
17966
17967 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17968 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17969
17970 salt->salt_len = 8;
17971 salt->salt_iter = ROUNDS_PDF17L8;
17972
17973 digest[0] = pdf->u_buf[0];
17974 digest[1] = pdf->u_buf[1];
17975 digest[2] = pdf->u_buf[2];
17976 digest[3] = pdf->u_buf[3];
17977 digest[4] = pdf->u_buf[4];
17978 digest[5] = pdf->u_buf[5];
17979 digest[6] = pdf->u_buf[6];
17980 digest[7] = pdf->u_buf[7];
17981
17982 return (PARSER_OK);
17983 }
17984
17985 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17986 {
17987 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17988
17989 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17990
17991 u32 *digest = (u32 *) hash_buf->digest;
17992
17993 salt_t *salt = hash_buf->salt;
17994
17995 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17996
17997 /**
17998 * parse line
17999 */
18000
18001 // iterations
18002
18003 char *iter_pos = input_buf + 7;
18004
18005 u32 iter = atoi (iter_pos);
18006
18007 if (iter < 1) return (PARSER_SALT_ITERATION);
18008 if (iter > 999999) return (PARSER_SALT_ITERATION);
18009
18010 // first is *raw* salt
18011
18012 char *salt_pos = strchr (iter_pos, ':');
18013
18014 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18015
18016 salt_pos++;
18017
18018 char *hash_pos = strchr (salt_pos, ':');
18019
18020 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18021
18022 u32 salt_len = hash_pos - salt_pos;
18023
18024 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18025
18026 hash_pos++;
18027
18028 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18029
18030 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18031
18032 // decode salt
18033
18034 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
18035
18036 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18037
18038 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18039
18040 salt_buf_ptr[salt_len + 3] = 0x01;
18041 salt_buf_ptr[salt_len + 4] = 0x80;
18042
18043 salt->salt_len = salt_len;
18044 salt->salt_iter = iter - 1;
18045
18046 // decode hash
18047
18048 u8 tmp_buf[100] = { 0 };
18049
18050 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18051
18052 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18053
18054 memcpy (digest, tmp_buf, 16);
18055
18056 digest[0] = byte_swap_32 (digest[0]);
18057 digest[1] = byte_swap_32 (digest[1]);
18058 digest[2] = byte_swap_32 (digest[2]);
18059 digest[3] = byte_swap_32 (digest[3]);
18060
18061 // add some stuff to normal salt to make sorted happy
18062
18063 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
18064 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
18065 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
18066 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
18067 salt->salt_buf[4] = salt->salt_iter;
18068
18069 return (PARSER_OK);
18070 }
18071
18072 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18073 {
18074 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
18075
18076 u32 *digest = (u32 *) hash_buf->digest;
18077
18078 salt_t *salt = hash_buf->salt;
18079
18080 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18081 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18082 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18083 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18084
18085 digest[0] = byte_swap_32 (digest[0]);
18086 digest[1] = byte_swap_32 (digest[1]);
18087 digest[2] = byte_swap_32 (digest[2]);
18088 digest[3] = byte_swap_32 (digest[3]);
18089
18090 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18091
18092 uint salt_len = input_len - 32 - 1;
18093
18094 char *salt_buf = input_buf + 32 + 1;
18095
18096 char *salt_buf_ptr = (char *) salt->salt_buf;
18097
18098 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18099
18100 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18101
18102 salt->salt_len = salt_len;
18103
18104 return (PARSER_OK);
18105 }
18106
18107 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18108 {
18109 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
18110
18111 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18112
18113 u32 *digest = (u32 *) hash_buf->digest;
18114
18115 salt_t *salt = hash_buf->salt;
18116
18117 char *user_pos = input_buf + 10;
18118
18119 char *salt_pos = strchr (user_pos, '*');
18120
18121 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18122
18123 salt_pos++;
18124
18125 char *hash_pos = strchr (salt_pos, '*');
18126
18127 hash_pos++;
18128
18129 uint hash_len = input_len - (hash_pos - input_buf);
18130
18131 if (hash_len != 32) return (PARSER_HASH_LENGTH);
18132
18133 uint user_len = salt_pos - user_pos - 1;
18134
18135 uint salt_len = hash_pos - salt_pos - 1;
18136
18137 if (salt_len != 8) return (PARSER_SALT_LENGTH);
18138
18139 /*
18140 * store digest
18141 */
18142
18143 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18144 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18145 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18146 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18147
18148 digest[0] = byte_swap_32 (digest[0]);
18149 digest[1] = byte_swap_32 (digest[1]);
18150 digest[2] = byte_swap_32 (digest[2]);
18151 digest[3] = byte_swap_32 (digest[3]);
18152
18153 digest[0] -= MD5M_A;
18154 digest[1] -= MD5M_B;
18155 digest[2] -= MD5M_C;
18156 digest[3] -= MD5M_D;
18157
18158 /*
18159 * store salt
18160 */
18161
18162 char *salt_buf_ptr = (char *) salt->salt_buf;
18163
18164 // first 4 bytes are the "challenge"
18165
18166 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
18167 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
18168 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
18169 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
18170
18171 // append the user name
18172
18173 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
18174
18175 salt->salt_len = 4 + user_len;
18176
18177 return (PARSER_OK);
18178 }
18179
18180 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18181 {
18182 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
18183
18184 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18185
18186 u32 *digest = (u32 *) hash_buf->digest;
18187
18188 salt_t *salt = hash_buf->salt;
18189
18190 char *salt_pos = input_buf + 9;
18191
18192 char *hash_pos = strchr (salt_pos, '*');
18193
18194 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18195
18196 hash_pos++;
18197
18198 uint hash_len = input_len - (hash_pos - input_buf);
18199
18200 if (hash_len != 40) return (PARSER_HASH_LENGTH);
18201
18202 uint salt_len = hash_pos - salt_pos - 1;
18203
18204 if (salt_len != 40) return (PARSER_SALT_LENGTH);
18205
18206 /*
18207 * store digest
18208 */
18209
18210 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18211 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18212 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18213 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18214 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18215
18216 /*
18217 * store salt
18218 */
18219
18220 char *salt_buf_ptr = (char *) salt->salt_buf;
18221
18222 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18223
18224 salt->salt_len = salt_len;
18225
18226 return (PARSER_OK);
18227 }
18228
18229 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18230 {
18231 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
18232
18233 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18234
18235 u32 *digest = (u32 *) hash_buf->digest;
18236
18237 salt_t *salt = hash_buf->salt;
18238
18239 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
18240
18241 /**
18242 * parse line
18243 */
18244
18245 char *cry_master_len_pos = input_buf + 9;
18246
18247 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
18248
18249 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18250
18251 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
18252
18253 cry_master_buf_pos++;
18254
18255 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
18256
18257 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18258
18259 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
18260
18261 cry_salt_len_pos++;
18262
18263 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
18264
18265 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18266
18267 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
18268
18269 cry_salt_buf_pos++;
18270
18271 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
18272
18273 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18274
18275 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
18276
18277 cry_rounds_pos++;
18278
18279 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
18280
18281 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18282
18283 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
18284
18285 ckey_len_pos++;
18286
18287 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
18288
18289 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18290
18291 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
18292
18293 ckey_buf_pos++;
18294
18295 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
18296
18297 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18298
18299 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
18300
18301 public_key_len_pos++;
18302
18303 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
18304
18305 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18306
18307 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
18308
18309 public_key_buf_pos++;
18310
18311 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;
18312
18313 const uint cry_master_len = atoi (cry_master_len_pos);
18314 const uint cry_salt_len = atoi (cry_salt_len_pos);
18315 const uint ckey_len = atoi (ckey_len_pos);
18316 const uint public_key_len = atoi (public_key_len_pos);
18317
18318 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
18319 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
18320 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
18321 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
18322
18323 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
18324 {
18325 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
18326
18327 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
18328 }
18329
18330 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
18331 {
18332 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
18333
18334 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
18335 }
18336
18337 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
18338 {
18339 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
18340
18341 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
18342 }
18343
18344 bitcoin_wallet->cry_master_len = cry_master_len / 2;
18345 bitcoin_wallet->ckey_len = ckey_len / 2;
18346 bitcoin_wallet->public_key_len = public_key_len / 2;
18347
18348 /*
18349 * store digest (should be unique enought, hopefully)
18350 */
18351
18352 digest[0] = bitcoin_wallet->cry_master_buf[0];
18353 digest[1] = bitcoin_wallet->cry_master_buf[1];
18354 digest[2] = bitcoin_wallet->cry_master_buf[2];
18355 digest[3] = bitcoin_wallet->cry_master_buf[3];
18356
18357 /*
18358 * store salt
18359 */
18360
18361 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
18362
18363 const uint cry_rounds = atoi (cry_rounds_pos);
18364
18365 salt->salt_iter = cry_rounds - 1;
18366
18367 char *salt_buf_ptr = (char *) salt->salt_buf;
18368
18369 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
18370
18371 salt->salt_len = salt_len;
18372
18373 return (PARSER_OK);
18374 }
18375
18376 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18377 {
18378 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
18379
18380 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18381
18382 u32 *digest = (u32 *) hash_buf->digest;
18383
18384 salt_t *salt = hash_buf->salt;
18385
18386 sip_t *sip = (sip_t *) hash_buf->esalt;
18387
18388 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
18389
18390 char *temp_input_buf = (char *) mymalloc (input_len + 1);
18391
18392 memcpy (temp_input_buf, input_buf, input_len);
18393
18394 // URI_server:
18395
18396 char *URI_server_pos = temp_input_buf + 6;
18397
18398 char *URI_client_pos = strchr (URI_server_pos, '*');
18399
18400 if (URI_client_pos == NULL)
18401 {
18402 myfree (temp_input_buf);
18403
18404 return (PARSER_SEPARATOR_UNMATCHED);
18405 }
18406
18407 URI_client_pos[0] = 0;
18408 URI_client_pos++;
18409
18410 uint URI_server_len = strlen (URI_server_pos);
18411
18412 if (URI_server_len > 512)
18413 {
18414 myfree (temp_input_buf);
18415
18416 return (PARSER_SALT_LENGTH);
18417 }
18418
18419 // URI_client:
18420
18421 char *user_pos = strchr (URI_client_pos, '*');
18422
18423 if (user_pos == NULL)
18424 {
18425 myfree (temp_input_buf);
18426
18427 return (PARSER_SEPARATOR_UNMATCHED);
18428 }
18429
18430 user_pos[0] = 0;
18431 user_pos++;
18432
18433 uint URI_client_len = strlen (URI_client_pos);
18434
18435 if (URI_client_len > 512)
18436 {
18437 myfree (temp_input_buf);
18438
18439 return (PARSER_SALT_LENGTH);
18440 }
18441
18442 // user:
18443
18444 char *realm_pos = strchr (user_pos, '*');
18445
18446 if (realm_pos == NULL)
18447 {
18448 myfree (temp_input_buf);
18449
18450 return (PARSER_SEPARATOR_UNMATCHED);
18451 }
18452
18453 realm_pos[0] = 0;
18454 realm_pos++;
18455
18456 uint user_len = strlen (user_pos);
18457
18458 if (user_len > 116)
18459 {
18460 myfree (temp_input_buf);
18461
18462 return (PARSER_SALT_LENGTH);
18463 }
18464
18465 // realm:
18466
18467 char *method_pos = strchr (realm_pos, '*');
18468
18469 if (method_pos == NULL)
18470 {
18471 myfree (temp_input_buf);
18472
18473 return (PARSER_SEPARATOR_UNMATCHED);
18474 }
18475
18476 method_pos[0] = 0;
18477 method_pos++;
18478
18479 uint realm_len = strlen (realm_pos);
18480
18481 if (realm_len > 116)
18482 {
18483 myfree (temp_input_buf);
18484
18485 return (PARSER_SALT_LENGTH);
18486 }
18487
18488 // method:
18489
18490 char *URI_prefix_pos = strchr (method_pos, '*');
18491
18492 if (URI_prefix_pos == NULL)
18493 {
18494 myfree (temp_input_buf);
18495
18496 return (PARSER_SEPARATOR_UNMATCHED);
18497 }
18498
18499 URI_prefix_pos[0] = 0;
18500 URI_prefix_pos++;
18501
18502 uint method_len = strlen (method_pos);
18503
18504 if (method_len > 246)
18505 {
18506 myfree (temp_input_buf);
18507
18508 return (PARSER_SALT_LENGTH);
18509 }
18510
18511 // URI_prefix:
18512
18513 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
18514
18515 if (URI_resource_pos == NULL)
18516 {
18517 myfree (temp_input_buf);
18518
18519 return (PARSER_SEPARATOR_UNMATCHED);
18520 }
18521
18522 URI_resource_pos[0] = 0;
18523 URI_resource_pos++;
18524
18525 uint URI_prefix_len = strlen (URI_prefix_pos);
18526
18527 if (URI_prefix_len > 245)
18528 {
18529 myfree (temp_input_buf);
18530
18531 return (PARSER_SALT_LENGTH);
18532 }
18533
18534 // URI_resource:
18535
18536 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
18537
18538 if (URI_suffix_pos == NULL)
18539 {
18540 myfree (temp_input_buf);
18541
18542 return (PARSER_SEPARATOR_UNMATCHED);
18543 }
18544
18545 URI_suffix_pos[0] = 0;
18546 URI_suffix_pos++;
18547
18548 uint URI_resource_len = strlen (URI_resource_pos);
18549
18550 if (URI_resource_len < 1 || URI_resource_len > 246)
18551 {
18552 myfree (temp_input_buf);
18553
18554 return (PARSER_SALT_LENGTH);
18555 }
18556
18557 // URI_suffix:
18558
18559 char *nonce_pos = strchr (URI_suffix_pos, '*');
18560
18561 if (nonce_pos == NULL)
18562 {
18563 myfree (temp_input_buf);
18564
18565 return (PARSER_SEPARATOR_UNMATCHED);
18566 }
18567
18568 nonce_pos[0] = 0;
18569 nonce_pos++;
18570
18571 uint URI_suffix_len = strlen (URI_suffix_pos);
18572
18573 if (URI_suffix_len > 245)
18574 {
18575 myfree (temp_input_buf);
18576
18577 return (PARSER_SALT_LENGTH);
18578 }
18579
18580 // nonce:
18581
18582 char *nonce_client_pos = strchr (nonce_pos, '*');
18583
18584 if (nonce_client_pos == NULL)
18585 {
18586 myfree (temp_input_buf);
18587
18588 return (PARSER_SEPARATOR_UNMATCHED);
18589 }
18590
18591 nonce_client_pos[0] = 0;
18592 nonce_client_pos++;
18593
18594 uint nonce_len = strlen (nonce_pos);
18595
18596 if (nonce_len < 1 || nonce_len > 50)
18597 {
18598 myfree (temp_input_buf);
18599
18600 return (PARSER_SALT_LENGTH);
18601 }
18602
18603 // nonce_client:
18604
18605 char *nonce_count_pos = strchr (nonce_client_pos, '*');
18606
18607 if (nonce_count_pos == NULL)
18608 {
18609 myfree (temp_input_buf);
18610
18611 return (PARSER_SEPARATOR_UNMATCHED);
18612 }
18613
18614 nonce_count_pos[0] = 0;
18615 nonce_count_pos++;
18616
18617 uint nonce_client_len = strlen (nonce_client_pos);
18618
18619 if (nonce_client_len > 50)
18620 {
18621 myfree (temp_input_buf);
18622
18623 return (PARSER_SALT_LENGTH);
18624 }
18625
18626 // nonce_count:
18627
18628 char *qop_pos = strchr (nonce_count_pos, '*');
18629
18630 if (qop_pos == NULL)
18631 {
18632 myfree (temp_input_buf);
18633
18634 return (PARSER_SEPARATOR_UNMATCHED);
18635 }
18636
18637 qop_pos[0] = 0;
18638 qop_pos++;
18639
18640 uint nonce_count_len = strlen (nonce_count_pos);
18641
18642 if (nonce_count_len > 50)
18643 {
18644 myfree (temp_input_buf);
18645
18646 return (PARSER_SALT_LENGTH);
18647 }
18648
18649 // qop:
18650
18651 char *directive_pos = strchr (qop_pos, '*');
18652
18653 if (directive_pos == NULL)
18654 {
18655 myfree (temp_input_buf);
18656
18657 return (PARSER_SEPARATOR_UNMATCHED);
18658 }
18659
18660 directive_pos[0] = 0;
18661 directive_pos++;
18662
18663 uint qop_len = strlen (qop_pos);
18664
18665 if (qop_len > 50)
18666 {
18667 myfree (temp_input_buf);
18668
18669 return (PARSER_SALT_LENGTH);
18670 }
18671
18672 // directive
18673
18674 char *digest_pos = strchr (directive_pos, '*');
18675
18676 if (digest_pos == NULL)
18677 {
18678 myfree (temp_input_buf);
18679
18680 return (PARSER_SEPARATOR_UNMATCHED);
18681 }
18682
18683 digest_pos[0] = 0;
18684 digest_pos++;
18685
18686 uint directive_len = strlen (directive_pos);
18687
18688 if (directive_len != 3)
18689 {
18690 myfree (temp_input_buf);
18691
18692 return (PARSER_SALT_LENGTH);
18693 }
18694
18695 if (memcmp (directive_pos, "MD5", 3))
18696 {
18697 log_info ("ERROR: Only the MD5 directive is currently supported\n");
18698
18699 myfree (temp_input_buf);
18700
18701 return (PARSER_SIP_AUTH_DIRECTIVE);
18702 }
18703
18704 /*
18705 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
18706 */
18707
18708 uint md5_len = 0;
18709
18710 uint md5_max_len = 4 * 64;
18711
18712 uint md5_remaining_len = md5_max_len;
18713
18714 uint tmp_md5_buf[64] = { 0 };
18715
18716 char *tmp_md5_ptr = (char *) tmp_md5_buf;
18717
18718 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
18719
18720 md5_len += method_len + 1;
18721 tmp_md5_ptr += method_len + 1;
18722
18723 if (URI_prefix_len > 0)
18724 {
18725 md5_remaining_len = md5_max_len - md5_len;
18726
18727 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
18728
18729 md5_len += URI_prefix_len + 1;
18730 tmp_md5_ptr += URI_prefix_len + 1;
18731 }
18732
18733 md5_remaining_len = md5_max_len - md5_len;
18734
18735 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
18736
18737 md5_len += URI_resource_len;
18738 tmp_md5_ptr += URI_resource_len;
18739
18740 if (URI_suffix_len > 0)
18741 {
18742 md5_remaining_len = md5_max_len - md5_len;
18743
18744 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
18745
18746 md5_len += 1 + URI_suffix_len;
18747 }
18748
18749 uint tmp_digest[4] = { 0 };
18750
18751 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
18752
18753 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
18754 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
18755 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
18756 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
18757
18758 /*
18759 * esalt
18760 */
18761
18762 char *esalt_buf_ptr = (char *) sip->esalt_buf;
18763
18764 uint esalt_len = 0;
18765
18766 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
18767
18768 // there are 2 possibilities for the esalt:
18769
18770 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
18771 {
18772 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
18773
18774 if (esalt_len > max_esalt_len)
18775 {
18776 myfree (temp_input_buf);
18777
18778 return (PARSER_SALT_LENGTH);
18779 }
18780
18781 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
18782 nonce_pos,
18783 nonce_count_pos,
18784 nonce_client_pos,
18785 qop_pos,
18786 tmp_digest[0],
18787 tmp_digest[1],
18788 tmp_digest[2],
18789 tmp_digest[3]);
18790 }
18791 else
18792 {
18793 esalt_len = 1 + nonce_len + 1 + 32;
18794
18795 if (esalt_len > max_esalt_len)
18796 {
18797 myfree (temp_input_buf);
18798
18799 return (PARSER_SALT_LENGTH);
18800 }
18801
18802 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
18803 nonce_pos,
18804 tmp_digest[0],
18805 tmp_digest[1],
18806 tmp_digest[2],
18807 tmp_digest[3]);
18808 }
18809
18810 // add 0x80 to esalt
18811
18812 esalt_buf_ptr[esalt_len] = 0x80;
18813
18814 sip->esalt_len = esalt_len;
18815
18816 /*
18817 * actual salt
18818 */
18819
18820 char *sip_salt_ptr = (char *) sip->salt_buf;
18821
18822 uint salt_len = user_len + 1 + realm_len + 1;
18823
18824 uint max_salt_len = 119;
18825
18826 if (salt_len > max_salt_len)
18827 {
18828 myfree (temp_input_buf);
18829
18830 return (PARSER_SALT_LENGTH);
18831 }
18832
18833 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18834
18835 sip->salt_len = salt_len;
18836
18837 /*
18838 * fake salt (for sorting)
18839 */
18840
18841 char *salt_buf_ptr = (char *) salt->salt_buf;
18842
18843 max_salt_len = 55;
18844
18845 uint fake_salt_len = salt_len;
18846
18847 if (fake_salt_len > max_salt_len)
18848 {
18849 fake_salt_len = max_salt_len;
18850 }
18851
18852 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18853
18854 salt->salt_len = fake_salt_len;
18855
18856 /*
18857 * digest
18858 */
18859
18860 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
18861 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
18862 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
18863 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
18864
18865 digest[0] = byte_swap_32 (digest[0]);
18866 digest[1] = byte_swap_32 (digest[1]);
18867 digest[2] = byte_swap_32 (digest[2]);
18868 digest[3] = byte_swap_32 (digest[3]);
18869
18870 myfree (temp_input_buf);
18871
18872 return (PARSER_OK);
18873 }
18874
18875 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18876 {
18877 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
18878
18879 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18880
18881 u32 *digest = (u32 *) hash_buf->digest;
18882
18883 salt_t *salt = hash_buf->salt;
18884
18885 // digest
18886
18887 char *digest_pos = input_buf;
18888
18889 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
18890 digest[1] = 0;
18891 digest[2] = 0;
18892 digest[3] = 0;
18893
18894 // salt
18895
18896 char *salt_buf = input_buf + 8 + 1;
18897
18898 uint salt_len = 8;
18899
18900 char *salt_buf_ptr = (char *) salt->salt_buf;
18901
18902 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18903
18904 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18905
18906 salt->salt_len = salt_len;
18907
18908 return (PARSER_OK);
18909 }
18910
18911 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18912 {
18913 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
18914
18915 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18916
18917 u32 *digest = (u32 *) hash_buf->digest;
18918
18919 salt_t *salt = hash_buf->salt;
18920
18921 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
18922
18923 /**
18924 * parse line
18925 */
18926
18927 char *p_buf_pos = input_buf + 4;
18928
18929 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
18930
18931 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18932
18933 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
18934
18935 NumCyclesPower_pos++;
18936
18937 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
18938
18939 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18940
18941 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
18942
18943 salt_len_pos++;
18944
18945 char *salt_buf_pos = strchr (salt_len_pos, '$');
18946
18947 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18948
18949 u32 salt_len_len = salt_buf_pos - salt_len_pos;
18950
18951 salt_buf_pos++;
18952
18953 char *iv_len_pos = strchr (salt_buf_pos, '$');
18954
18955 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18956
18957 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
18958
18959 iv_len_pos++;
18960
18961 char *iv_buf_pos = strchr (iv_len_pos, '$');
18962
18963 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18964
18965 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18966
18967 iv_buf_pos++;
18968
18969 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18970
18971 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18972
18973 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18974
18975 crc_buf_pos++;
18976
18977 char *data_len_pos = strchr (crc_buf_pos, '$');
18978
18979 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18980
18981 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18982
18983 data_len_pos++;
18984
18985 char *unpack_size_pos = strchr (data_len_pos, '$');
18986
18987 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18988
18989 u32 data_len_len = unpack_size_pos - data_len_pos;
18990
18991 unpack_size_pos++;
18992
18993 char *data_buf_pos = strchr (unpack_size_pos, '$');
18994
18995 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18996
18997 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18998
18999 data_buf_pos++;
19000
19001 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;
19002
19003 const uint iter = atoi (NumCyclesPower_pos);
19004 const uint crc = atoi (crc_buf_pos);
19005 const uint p_buf = atoi (p_buf_pos);
19006 const uint salt_len = atoi (salt_len_pos);
19007 const uint iv_len = atoi (iv_len_pos);
19008 const uint unpack_size = atoi (unpack_size_pos);
19009 const uint data_len = atoi (data_len_pos);
19010
19011 /**
19012 * verify some data
19013 */
19014
19015 if (p_buf != 0) return (PARSER_SALT_VALUE);
19016 if (salt_len != 0) return (PARSER_SALT_VALUE);
19017
19018 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
19019
19020 if (data_len > 384) return (PARSER_SALT_VALUE);
19021
19022 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
19023
19024 /**
19025 * store data
19026 */
19027
19028 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
19029 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
19030 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
19031 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
19032
19033 seven_zip->iv_len = iv_len;
19034
19035 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
19036
19037 seven_zip->salt_len = 0;
19038
19039 seven_zip->crc = crc;
19040
19041 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
19042 {
19043 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
19044
19045 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
19046 }
19047
19048 seven_zip->data_len = data_len;
19049
19050 seven_zip->unpack_size = unpack_size;
19051
19052 // real salt
19053
19054 salt->salt_buf[0] = seven_zip->data_buf[0];
19055 salt->salt_buf[1] = seven_zip->data_buf[1];
19056 salt->salt_buf[2] = seven_zip->data_buf[2];
19057 salt->salt_buf[3] = seven_zip->data_buf[3];
19058
19059 salt->salt_len = 16;
19060
19061 salt->salt_sign[0] = iter;
19062
19063 salt->salt_iter = 1u << iter;
19064
19065 /**
19066 * digest
19067 */
19068
19069 digest[0] = crc;
19070 digest[1] = 0;
19071 digest[2] = 0;
19072 digest[3] = 0;
19073
19074 return (PARSER_OK);
19075 }
19076
19077 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19078 {
19079 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
19080
19081 u32 *digest = (u32 *) hash_buf->digest;
19082
19083 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
19084 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
19085 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
19086 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
19087 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
19088 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
19089 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
19090 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
19091
19092 digest[0] = byte_swap_32 (digest[0]);
19093 digest[1] = byte_swap_32 (digest[1]);
19094 digest[2] = byte_swap_32 (digest[2]);
19095 digest[3] = byte_swap_32 (digest[3]);
19096 digest[4] = byte_swap_32 (digest[4]);
19097 digest[5] = byte_swap_32 (digest[5]);
19098 digest[6] = byte_swap_32 (digest[6]);
19099 digest[7] = byte_swap_32 (digest[7]);
19100
19101 return (PARSER_OK);
19102 }
19103
19104 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19105 {
19106 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
19107
19108 u32 *digest = (u32 *) hash_buf->digest;
19109
19110 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
19111 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
19112 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
19113 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
19114 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
19115 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
19116 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
19117 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
19118 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
19119 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
19120 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
19121 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
19122 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
19123 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
19124 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
19125 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
19126
19127 digest[ 0] = byte_swap_32 (digest[ 0]);
19128 digest[ 1] = byte_swap_32 (digest[ 1]);
19129 digest[ 2] = byte_swap_32 (digest[ 2]);
19130 digest[ 3] = byte_swap_32 (digest[ 3]);
19131 digest[ 4] = byte_swap_32 (digest[ 4]);
19132 digest[ 5] = byte_swap_32 (digest[ 5]);
19133 digest[ 6] = byte_swap_32 (digest[ 6]);
19134 digest[ 7] = byte_swap_32 (digest[ 7]);
19135 digest[ 8] = byte_swap_32 (digest[ 8]);
19136 digest[ 9] = byte_swap_32 (digest[ 9]);
19137 digest[10] = byte_swap_32 (digest[10]);
19138 digest[11] = byte_swap_32 (digest[11]);
19139 digest[12] = byte_swap_32 (digest[12]);
19140 digest[13] = byte_swap_32 (digest[13]);
19141 digest[14] = byte_swap_32 (digest[14]);
19142 digest[15] = byte_swap_32 (digest[15]);
19143
19144 return (PARSER_OK);
19145 }
19146
19147 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19148 {
19149 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
19150
19151 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
19152
19153 u32 *digest = (u32 *) hash_buf->digest;
19154
19155 salt_t *salt = hash_buf->salt;
19156
19157 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
19158
19159 /**
19160 * parse line
19161 */
19162
19163 // iterations
19164
19165 char *iter_pos = input_buf + 4;
19166
19167 u32 iter = atoi (iter_pos);
19168
19169 if (iter < 1) return (PARSER_SALT_ITERATION);
19170 if (iter > 999999) return (PARSER_SALT_ITERATION);
19171
19172 // first is *raw* salt
19173
19174 char *salt_pos = strchr (iter_pos, ':');
19175
19176 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19177
19178 salt_pos++;
19179
19180 char *hash_pos = strchr (salt_pos, ':');
19181
19182 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19183
19184 u32 salt_len = hash_pos - salt_pos;
19185
19186 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19187
19188 hash_pos++;
19189
19190 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19191
19192 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19193
19194 // decode salt
19195
19196 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
19197
19198 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19199
19200 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19201
19202 salt_buf_ptr[salt_len + 3] = 0x01;
19203 salt_buf_ptr[salt_len + 4] = 0x80;
19204
19205 salt->salt_len = salt_len;
19206 salt->salt_iter = iter - 1;
19207
19208 // decode hash
19209
19210 u8 tmp_buf[100] = { 0 };
19211
19212 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19213
19214 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19215
19216 memcpy (digest, tmp_buf, 16);
19217
19218 // add some stuff to normal salt to make sorted happy
19219
19220 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
19221 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
19222 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
19223 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
19224 salt->salt_buf[4] = salt->salt_iter;
19225
19226 return (PARSER_OK);
19227 }
19228
19229 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19230 {
19231 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
19232
19233 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
19234
19235 u32 *digest = (u32 *) hash_buf->digest;
19236
19237 salt_t *salt = hash_buf->salt;
19238
19239 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
19240
19241 /**
19242 * parse line
19243 */
19244
19245 // iterations
19246
19247 char *iter_pos = input_buf + 5;
19248
19249 u32 iter = atoi (iter_pos);
19250
19251 if (iter < 1) return (PARSER_SALT_ITERATION);
19252 if (iter > 999999) return (PARSER_SALT_ITERATION);
19253
19254 // first is *raw* salt
19255
19256 char *salt_pos = strchr (iter_pos, ':');
19257
19258 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19259
19260 salt_pos++;
19261
19262 char *hash_pos = strchr (salt_pos, ':');
19263
19264 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19265
19266 u32 salt_len = hash_pos - salt_pos;
19267
19268 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19269
19270 hash_pos++;
19271
19272 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19273
19274 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19275
19276 // decode salt
19277
19278 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
19279
19280 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19281
19282 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19283
19284 salt_buf_ptr[salt_len + 3] = 0x01;
19285 salt_buf_ptr[salt_len + 4] = 0x80;
19286
19287 salt->salt_len = salt_len;
19288 salt->salt_iter = iter - 1;
19289
19290 // decode hash
19291
19292 u8 tmp_buf[100] = { 0 };
19293
19294 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19295
19296 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19297
19298 memcpy (digest, tmp_buf, 16);
19299
19300 digest[0] = byte_swap_32 (digest[0]);
19301 digest[1] = byte_swap_32 (digest[1]);
19302 digest[2] = byte_swap_32 (digest[2]);
19303 digest[3] = byte_swap_32 (digest[3]);
19304
19305 // add some stuff to normal salt to make sorted happy
19306
19307 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
19308 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
19309 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
19310 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
19311 salt->salt_buf[4] = salt->salt_iter;
19312
19313 return (PARSER_OK);
19314 }
19315
19316 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19317 {
19318 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
19319
19320 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
19321
19322 u64 *digest = (u64 *) hash_buf->digest;
19323
19324 salt_t *salt = hash_buf->salt;
19325
19326 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
19327
19328 /**
19329 * parse line
19330 */
19331
19332 // iterations
19333
19334 char *iter_pos = input_buf + 7;
19335
19336 u32 iter = atoi (iter_pos);
19337
19338 if (iter < 1) return (PARSER_SALT_ITERATION);
19339 if (iter > 999999) return (PARSER_SALT_ITERATION);
19340
19341 // first is *raw* salt
19342
19343 char *salt_pos = strchr (iter_pos, ':');
19344
19345 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19346
19347 salt_pos++;
19348
19349 char *hash_pos = strchr (salt_pos, ':');
19350
19351 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19352
19353 u32 salt_len = hash_pos - salt_pos;
19354
19355 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19356
19357 hash_pos++;
19358
19359 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19360
19361 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19362
19363 // decode salt
19364
19365 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
19366
19367 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19368
19369 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19370
19371 salt_buf_ptr[salt_len + 3] = 0x01;
19372 salt_buf_ptr[salt_len + 4] = 0x80;
19373
19374 salt->salt_len = salt_len;
19375 salt->salt_iter = iter - 1;
19376
19377 // decode hash
19378
19379 u8 tmp_buf[100] = { 0 };
19380
19381 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19382
19383 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19384
19385 memcpy (digest, tmp_buf, 64);
19386
19387 digest[0] = byte_swap_64 (digest[0]);
19388 digest[1] = byte_swap_64 (digest[1]);
19389 digest[2] = byte_swap_64 (digest[2]);
19390 digest[3] = byte_swap_64 (digest[3]);
19391 digest[4] = byte_swap_64 (digest[4]);
19392 digest[5] = byte_swap_64 (digest[5]);
19393 digest[6] = byte_swap_64 (digest[6]);
19394 digest[7] = byte_swap_64 (digest[7]);
19395
19396 // add some stuff to normal salt to make sorted happy
19397
19398 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
19399 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
19400 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
19401 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
19402 salt->salt_buf[4] = salt->salt_iter;
19403
19404 return (PARSER_OK);
19405 }
19406
19407 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19408 {
19409 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
19410
19411 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
19412
19413 uint *digest = (uint *) hash_buf->digest;
19414
19415 salt_t *salt = hash_buf->salt;
19416
19417 /**
19418 * parse line
19419 */
19420
19421 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
19422
19423 char *hash_pos = strchr (salt_pos, '$');
19424
19425 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19426
19427 u32 salt_len = hash_pos - salt_pos;
19428
19429 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19430
19431 hash_pos++;
19432
19433 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
19434
19435 if (hash_len != 16) return (PARSER_HASH_LENGTH);
19436
19437 // decode hash
19438
19439 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
19440 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
19441 digest[ 2] = 0;
19442 digest[ 3] = 0;
19443 digest[ 4] = 0;
19444 digest[ 5] = 0;
19445 digest[ 6] = 0;
19446 digest[ 7] = 0;
19447 digest[ 8] = 0;
19448 digest[ 9] = 0;
19449 digest[10] = 0;
19450 digest[11] = 0;
19451 digest[12] = 0;
19452 digest[13] = 0;
19453 digest[14] = 0;
19454 digest[15] = 0;
19455
19456 // decode salt
19457
19458 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19459 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19460
19461 salt->salt_iter = ROUNDS_ECRYPTFS;
19462 salt->salt_len = 8;
19463
19464 return (PARSER_OK);
19465 }
19466
19467 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19468 {
19469 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
19470
19471 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
19472
19473 unsigned char c19 = itoa64_to_int (input_buf[19]);
19474
19475 if (c19 & 3) return (PARSER_HASH_VALUE);
19476
19477 salt_t *salt = hash_buf->salt;
19478
19479 u32 *digest = (u32 *) hash_buf->digest;
19480
19481 // iteration count
19482
19483 salt->salt_iter = itoa64_to_int (input_buf[1])
19484 | itoa64_to_int (input_buf[2]) << 6
19485 | itoa64_to_int (input_buf[3]) << 12
19486 | itoa64_to_int (input_buf[4]) << 18;
19487
19488 // set salt
19489
19490 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
19491 | itoa64_to_int (input_buf[6]) << 6
19492 | itoa64_to_int (input_buf[7]) << 12
19493 | itoa64_to_int (input_buf[8]) << 18;
19494
19495 salt->salt_len = 4;
19496
19497 u8 tmp_buf[100] = { 0 };
19498
19499 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
19500
19501 memcpy (digest, tmp_buf, 8);
19502
19503 uint tt;
19504
19505 IP (digest[0], digest[1], tt);
19506
19507 digest[0] = rotr32 (digest[0], 31);
19508 digest[1] = rotr32 (digest[1], 31);
19509 digest[2] = 0;
19510 digest[3] = 0;
19511
19512 return (PARSER_OK);
19513 }
19514
19515 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19516 {
19517 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
19518
19519 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
19520
19521 u32 *digest = (u32 *) hash_buf->digest;
19522
19523 salt_t *salt = hash_buf->salt;
19524
19525 /**
19526 * parse line
19527 */
19528
19529 char *type_pos = input_buf + 6 + 1;
19530
19531 char *salt_pos = strchr (type_pos, '*');
19532
19533 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19534
19535 u32 type_len = salt_pos - type_pos;
19536
19537 if (type_len != 1) return (PARSER_SALT_LENGTH);
19538
19539 salt_pos++;
19540
19541 char *crypted_pos = strchr (salt_pos, '*');
19542
19543 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19544
19545 u32 salt_len = crypted_pos - salt_pos;
19546
19547 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19548
19549 crypted_pos++;
19550
19551 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
19552
19553 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
19554
19555 /**
19556 * copy data
19557 */
19558
19559 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19560 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19561
19562 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19563 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19564
19565 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
19566 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
19567 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
19568 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
19569
19570 salt->salt_len = 24;
19571 salt->salt_iter = ROUNDS_RAR3;
19572
19573 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
19574 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
19575
19576 digest[0] = 0xc43d7b00;
19577 digest[1] = 0x40070000;
19578 digest[2] = 0;
19579 digest[3] = 0;
19580
19581 return (PARSER_OK);
19582 }
19583
19584 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19585 {
19586 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
19587
19588 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
19589
19590 u32 *digest = (u32 *) hash_buf->digest;
19591
19592 salt_t *salt = hash_buf->salt;
19593
19594 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
19595
19596 /**
19597 * parse line
19598 */
19599
19600 char *param0_pos = input_buf + 1 + 4 + 1;
19601
19602 char *param1_pos = strchr (param0_pos, '$');
19603
19604 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19605
19606 u32 param0_len = param1_pos - param0_pos;
19607
19608 param1_pos++;
19609
19610 char *param2_pos = strchr (param1_pos, '$');
19611
19612 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19613
19614 u32 param1_len = param2_pos - param1_pos;
19615
19616 param2_pos++;
19617
19618 char *param3_pos = strchr (param2_pos, '$');
19619
19620 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19621
19622 u32 param2_len = param3_pos - param2_pos;
19623
19624 param3_pos++;
19625
19626 char *param4_pos = strchr (param3_pos, '$');
19627
19628 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19629
19630 u32 param3_len = param4_pos - param3_pos;
19631
19632 param4_pos++;
19633
19634 char *param5_pos = strchr (param4_pos, '$');
19635
19636 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19637
19638 u32 param4_len = param5_pos - param4_pos;
19639
19640 param5_pos++;
19641
19642 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
19643
19644 char *salt_buf = param1_pos;
19645 char *iv = param3_pos;
19646 char *pswcheck = param5_pos;
19647
19648 const uint salt_len = atoi (param0_pos);
19649 const uint iterations = atoi (param2_pos);
19650 const uint pswcheck_len = atoi (param4_pos);
19651
19652 /**
19653 * verify some data
19654 */
19655
19656 if (param1_len != 32) return (PARSER_SALT_VALUE);
19657 if (param3_len != 32) return (PARSER_SALT_VALUE);
19658 if (param5_len != 16) return (PARSER_SALT_VALUE);
19659
19660 if (salt_len != 16) return (PARSER_SALT_VALUE);
19661 if (iterations == 0) return (PARSER_SALT_VALUE);
19662 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
19663
19664 /**
19665 * store data
19666 */
19667
19668 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
19669 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
19670 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
19671 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
19672
19673 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
19674 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
19675 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
19676 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
19677
19678 salt->salt_len = 16;
19679
19680 salt->salt_sign[0] = iterations;
19681
19682 salt->salt_iter = ((1u << iterations) + 32) - 1;
19683
19684 /**
19685 * digest buf
19686 */
19687
19688 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
19689 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
19690 digest[2] = 0;
19691 digest[3] = 0;
19692
19693 return (PARSER_OK);
19694 }
19695
19696 int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19697 {
19698 if ((input_len < DISPLAY_LEN_MIN_13100) || (input_len > DISPLAY_LEN_MAX_13100)) return (PARSER_GLOBAL_LENGTH);
19699
19700 if (memcmp (SIGNATURE_KRB5TGS, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19701
19702 u32 *digest = (u32 *) hash_buf->digest;
19703
19704 salt_t *salt = hash_buf->salt;
19705
19706 krb5tgs_t *krb5tgs = (krb5tgs_t *) hash_buf->esalt;
19707
19708 /**
19709 * parse line
19710 */
19711
19712 /* Skip '$' */
19713 char *account_pos = input_buf + 11 + 1;
19714
19715 char *data_pos;
19716
19717 uint data_len;
19718
19719 if (account_pos[0] == '*')
19720 {
19721 account_pos++;
19722
19723 data_pos = strchr (account_pos, '*');
19724
19725 /* Skip '*' */
19726 data_pos++;
19727
19728 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19729
19730 uint account_len = data_pos - account_pos + 1;
19731
19732 if (account_len >= 512) return (PARSER_SALT_LENGTH);
19733
19734 /* Skip '$' */
19735 data_pos++;
19736
19737 data_len = input_len - 11 - 1 - account_len - 2;
19738
19739 memcpy (krb5tgs->account_info, account_pos - 1, account_len);
19740 }
19741 else
19742 {
19743 /* assume $krb5tgs$23$checksum$edata2 */
19744 data_pos = account_pos;
19745
19746 memcpy (krb5tgs->account_info, "**", 3);
19747
19748 data_len = input_len - 11 - 1 - 1;
19749 }
19750
19751 if (data_len < ((16 + 32) * 2)) return (PARSER_SALT_LENGTH);
19752
19753 char *checksum_ptr = (char *) krb5tgs->checksum;
19754
19755 for (uint i = 0; i < 16 * 2; i += 2)
19756 {
19757 const char p0 = data_pos[i + 0];
19758 const char p1 = data_pos[i + 1];
19759
19760 *checksum_ptr++ = hex_convert (p1) << 0
19761 | hex_convert (p0) << 4;
19762 }
19763
19764 char *edata_ptr = (char *) krb5tgs->edata2;
19765
19766 krb5tgs->edata2_len = (data_len - 32) / 2 ;
19767
19768 /* skip '$' */
19769 for (uint i = 16 * 2 + 1; i < (krb5tgs->edata2_len * 2) + (16 * 2 + 1); i += 2)
19770 {
19771 const char p0 = data_pos[i + 0];
19772 const char p1 = data_pos[i + 1];
19773 *edata_ptr++ = hex_convert (p1) << 0
19774 | hex_convert (p0) << 4;
19775 }
19776
19777 /* this is needed for hmac_md5 */
19778 *edata_ptr++ = 0x80;
19779
19780 salt->salt_buf[0] = krb5tgs->checksum[0];
19781 salt->salt_buf[1] = krb5tgs->checksum[1];
19782 salt->salt_buf[2] = krb5tgs->checksum[2];
19783 salt->salt_buf[3] = krb5tgs->checksum[3];
19784
19785 salt->salt_len = 32;
19786
19787 digest[0] = krb5tgs->checksum[0];
19788 digest[1] = krb5tgs->checksum[1];
19789 digest[2] = krb5tgs->checksum[2];
19790 digest[3] = krb5tgs->checksum[3];
19791
19792 return (PARSER_OK);
19793 }
19794
19795 int axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19796 {
19797 if ((input_len < DISPLAY_LEN_MIN_13200) || (input_len > DISPLAY_LEN_MAX_13200)) return (PARSER_GLOBAL_LENGTH);
19798
19799 if (memcmp (SIGNATURE_AXCRYPT, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19800
19801 u32 *digest = (u32 *) hash_buf->digest;
19802
19803 salt_t *salt = hash_buf->salt;
19804
19805 /**
19806 * parse line
19807 */
19808
19809 /* Skip '*' */
19810 char *wrapping_rounds_pos = input_buf + 11 + 1;
19811
19812 char *salt_pos;
19813
19814 char *wrapped_key_pos;
19815
19816 char *data_pos;
19817
19818 salt->salt_iter = atoi (wrapping_rounds_pos);
19819
19820 salt_pos = strchr (wrapping_rounds_pos, '*');
19821
19822 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19823
19824 uint wrapping_rounds_len = salt_pos - wrapping_rounds_pos;
19825
19826 /* Skip '*' */
19827 salt_pos++;
19828
19829 data_pos = salt_pos;
19830
19831 wrapped_key_pos = strchr (salt_pos, '*');
19832
19833 if (wrapped_key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19834
19835 uint salt_len = wrapped_key_pos - salt_pos;
19836
19837 if (salt_len != 32) return (PARSER_SALT_LENGTH);
19838
19839 /* Skip '*' */
19840 wrapped_key_pos++;
19841
19842 uint wrapped_key_len = input_len - 11 - 1 - wrapping_rounds_len - 1 - salt_len - 1;
19843
19844 if (wrapped_key_len != 48) return (PARSER_SALT_LENGTH);
19845
19846 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19847 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19848 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &data_pos[16]);
19849 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &data_pos[24]);
19850
19851 data_pos += 33;
19852
19853 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19854 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19855 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &data_pos[16]);
19856 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &data_pos[24]);
19857 salt->salt_buf[8] = hex_to_u32 ((const u8 *) &data_pos[32]);
19858 salt->salt_buf[9] = hex_to_u32 ((const u8 *) &data_pos[40]);
19859
19860 salt->salt_len = 40;
19861
19862 digest[0] = salt->salt_buf[0];
19863 digest[1] = salt->salt_buf[1];
19864 digest[2] = salt->salt_buf[2];
19865 digest[3] = salt->salt_buf[3];
19866
19867 return (PARSER_OK);
19868 }
19869
19870 int keepass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19871 {
19872 if ((input_len < DISPLAY_LEN_MIN_13400) || (input_len > DISPLAY_LEN_MAX_13400)) return (PARSER_GLOBAL_LENGTH);
19873
19874 if (memcmp (SIGNATURE_KEEPASS, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
19875
19876 u32 *digest = (u32 *) hash_buf->digest;
19877
19878 salt_t *salt = hash_buf->salt;
19879
19880 keepass_t *keepass = (keepass_t *) hash_buf->esalt;
19881
19882 /**
19883 * parse line
19884 */
19885
19886 char *version_pos;
19887
19888 char *rounds_pos;
19889
19890 char *algorithm_pos;
19891
19892 char *final_random_seed_pos;
19893 u32 final_random_seed_len;
19894
19895 char *transf_random_seed_pos;
19896 u32 transf_random_seed_len;
19897
19898 char *enc_iv_pos;
19899 u32 enc_iv_len;
19900
19901 /* default is no keyfile provided */
19902 char *keyfile_len_pos;
19903 u32 keyfile_len = 0;
19904 u32 is_keyfile_present = 0;
19905 char *keyfile_inline_pos;
19906 char *keyfile_pos;
19907
19908 /* specific to version 1 */
19909 char *contents_len_pos;
19910 u32 contents_len;
19911 char *contents_pos;
19912
19913 /* specific to version 2 */
19914 char *expected_bytes_pos;
19915 u32 expected_bytes_len;
19916
19917 char *contents_hash_pos;
19918 u32 contents_hash_len;
19919
19920 version_pos = input_buf + 8 + 1 + 1;
19921
19922 keepass->version = atoi (version_pos);
19923
19924 rounds_pos = strchr (version_pos, '*');
19925
19926 if (rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19927
19928 rounds_pos++;
19929
19930 salt->salt_iter = (atoi (rounds_pos));
19931
19932 algorithm_pos = strchr (rounds_pos, '*');
19933
19934 if (algorithm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19935
19936 algorithm_pos++;
19937
19938 keepass->algorithm = atoi (algorithm_pos);
19939
19940 final_random_seed_pos = strchr (algorithm_pos, '*');
19941
19942 if (final_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19943
19944 final_random_seed_pos++;
19945
19946 keepass->final_random_seed[0] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 0]);
19947 keepass->final_random_seed[1] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 8]);
19948 keepass->final_random_seed[2] = hex_to_u32 ((const u8 *) &final_random_seed_pos[16]);
19949 keepass->final_random_seed[3] = hex_to_u32 ((const u8 *) &final_random_seed_pos[24]);
19950
19951 if (keepass->version == 2)
19952 {
19953 keepass->final_random_seed[4] = hex_to_u32 ((const u8 *) &final_random_seed_pos[32]);
19954 keepass->final_random_seed[5] = hex_to_u32 ((const u8 *) &final_random_seed_pos[40]);
19955 keepass->final_random_seed[6] = hex_to_u32 ((const u8 *) &final_random_seed_pos[48]);
19956 keepass->final_random_seed[7] = hex_to_u32 ((const u8 *) &final_random_seed_pos[56]);
19957 }
19958
19959 transf_random_seed_pos = strchr (final_random_seed_pos, '*');
19960
19961 if (transf_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19962
19963 final_random_seed_len = transf_random_seed_pos - final_random_seed_pos;
19964
19965 if (keepass->version == 1 && final_random_seed_len != 32) return (PARSER_SALT_LENGTH);
19966 if (keepass->version == 2 && final_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19967
19968 transf_random_seed_pos++;
19969
19970 keepass->transf_random_seed[0] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 0]);
19971 keepass->transf_random_seed[1] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 8]);
19972 keepass->transf_random_seed[2] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[16]);
19973 keepass->transf_random_seed[3] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[24]);
19974 keepass->transf_random_seed[4] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[32]);
19975 keepass->transf_random_seed[5] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[40]);
19976 keepass->transf_random_seed[6] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[48]);
19977 keepass->transf_random_seed[7] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[56]);
19978
19979 enc_iv_pos = strchr (transf_random_seed_pos, '*');
19980
19981 if (enc_iv_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19982
19983 transf_random_seed_len = enc_iv_pos - transf_random_seed_pos;
19984
19985 if (transf_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19986
19987 enc_iv_pos++;
19988
19989 keepass->enc_iv[0] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 0]);
19990 keepass->enc_iv[1] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 8]);
19991 keepass->enc_iv[2] = hex_to_u32 ((const u8 *) &enc_iv_pos[16]);
19992 keepass->enc_iv[3] = hex_to_u32 ((const u8 *) &enc_iv_pos[24]);
19993
19994 if (keepass->version == 1)
19995 {
19996 contents_hash_pos = strchr (enc_iv_pos, '*');
19997
19998 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19999
20000 enc_iv_len = contents_hash_pos - enc_iv_pos;
20001
20002 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
20003
20004 contents_hash_pos++;
20005
20006 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
20007 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
20008 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
20009 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
20010 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
20011 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
20012 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
20013 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
20014
20015 /* get length of contents following */
20016 char *inline_flag_pos = strchr (contents_hash_pos, '*');
20017
20018 if (inline_flag_pos == NULL) return (PARSER_SALT_LENGTH);
20019
20020 contents_hash_len = inline_flag_pos - contents_hash_pos;
20021
20022 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
20023
20024 inline_flag_pos++;
20025
20026 u32 inline_flag = atoi (inline_flag_pos);
20027
20028 if (inline_flag != 1) return (PARSER_SALT_LENGTH);
20029
20030 contents_len_pos = strchr (inline_flag_pos, '*');
20031
20032 if (contents_len_pos == NULL) return (PARSER_SALT_LENGTH);
20033
20034 contents_len_pos++;
20035
20036 contents_len = atoi (contents_len_pos);
20037
20038 if (contents_len > 50000) return (PARSER_SALT_LENGTH);
20039
20040 contents_pos = strchr (contents_len_pos, '*');
20041
20042 if (contents_pos == NULL) return (PARSER_SALT_LENGTH);
20043
20044 contents_pos++;
20045
20046 u32 i;
20047
20048 keepass->contents_len = contents_len;
20049
20050 contents_len = contents_len / 4;
20051
20052 keyfile_inline_pos = strchr (contents_pos, '*');
20053
20054 u32 real_contents_len;
20055
20056 if (keyfile_inline_pos == NULL)
20057 real_contents_len = input_len - (contents_pos - input_buf);
20058 else
20059 {
20060 real_contents_len = keyfile_inline_pos - contents_pos;
20061 keyfile_inline_pos++;
20062 is_keyfile_present = 1;
20063 }
20064
20065 if (real_contents_len != keepass->contents_len * 2) return (PARSER_SALT_LENGTH);
20066
20067 for (i = 0; i < contents_len; i++)
20068 keepass->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]);
20069 }
20070 else if (keepass->version == 2)
20071 {
20072 expected_bytes_pos = strchr (enc_iv_pos, '*');
20073
20074 if (expected_bytes_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20075
20076 enc_iv_len = expected_bytes_pos - enc_iv_pos;
20077
20078 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
20079
20080 expected_bytes_pos++;
20081
20082 keepass->expected_bytes[0] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 0]);
20083 keepass->expected_bytes[1] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 8]);
20084 keepass->expected_bytes[2] = hex_to_u32 ((const u8 *) &expected_bytes_pos[16]);
20085 keepass->expected_bytes[3] = hex_to_u32 ((const u8 *) &expected_bytes_pos[24]);
20086 keepass->expected_bytes[4] = hex_to_u32 ((const u8 *) &expected_bytes_pos[32]);
20087 keepass->expected_bytes[5] = hex_to_u32 ((const u8 *) &expected_bytes_pos[40]);
20088 keepass->expected_bytes[6] = hex_to_u32 ((const u8 *) &expected_bytes_pos[48]);
20089 keepass->expected_bytes[7] = hex_to_u32 ((const u8 *) &expected_bytes_pos[56]);
20090
20091 contents_hash_pos = strchr (expected_bytes_pos, '*');
20092
20093 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20094
20095 expected_bytes_len = contents_hash_pos - expected_bytes_pos;
20096
20097 if (expected_bytes_len != 64) return (PARSER_SALT_LENGTH);
20098
20099 contents_hash_pos++;
20100
20101 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
20102 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
20103 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
20104 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
20105 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
20106 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
20107 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
20108 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
20109
20110 keyfile_inline_pos = strchr (contents_hash_pos, '*');
20111
20112 if (keyfile_inline_pos == NULL)
20113 contents_hash_len = input_len - (int) (contents_hash_pos - input_buf);
20114 else
20115 {
20116 contents_hash_len = keyfile_inline_pos - contents_hash_pos;
20117 keyfile_inline_pos++;
20118 is_keyfile_present = 1;
20119 }
20120 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
20121 }
20122
20123 if (is_keyfile_present != 0)
20124 {
20125 keyfile_len_pos = strchr (keyfile_inline_pos, '*');
20126
20127 keyfile_len_pos++;
20128
20129 keyfile_len = atoi (keyfile_len_pos);
20130
20131 keepass->keyfile_len = keyfile_len;
20132
20133 if (keyfile_len != 64) return (PARSER_SALT_LENGTH);
20134
20135 keyfile_pos = strchr (keyfile_len_pos, '*');
20136
20137 if (keyfile_pos == NULL) return (PARSER_SALT_LENGTH);
20138
20139 keyfile_pos++;
20140
20141 u32 real_keyfile_len = input_len - (keyfile_pos - input_buf);
20142
20143 if (real_keyfile_len != 64) return (PARSER_SALT_LENGTH);
20144
20145 keepass->keyfile[0] = hex_to_u32 ((const u8 *) &keyfile_pos[ 0]);
20146 keepass->keyfile[1] = hex_to_u32 ((const u8 *) &keyfile_pos[ 8]);
20147 keepass->keyfile[2] = hex_to_u32 ((const u8 *) &keyfile_pos[16]);
20148 keepass->keyfile[3] = hex_to_u32 ((const u8 *) &keyfile_pos[24]);
20149 keepass->keyfile[4] = hex_to_u32 ((const u8 *) &keyfile_pos[32]);
20150 keepass->keyfile[5] = hex_to_u32 ((const u8 *) &keyfile_pos[40]);
20151 keepass->keyfile[6] = hex_to_u32 ((const u8 *) &keyfile_pos[48]);
20152 keepass->keyfile[7] = hex_to_u32 ((const u8 *) &keyfile_pos[56]);
20153 }
20154
20155 digest[0] = keepass->enc_iv[0];
20156 digest[1] = keepass->enc_iv[1];
20157 digest[2] = keepass->enc_iv[2];
20158 digest[3] = keepass->enc_iv[3];
20159
20160 salt->salt_buf[0] = keepass->transf_random_seed[0];
20161 salt->salt_buf[1] = keepass->transf_random_seed[1];
20162 salt->salt_buf[2] = keepass->transf_random_seed[2];
20163 salt->salt_buf[3] = keepass->transf_random_seed[3];
20164 salt->salt_buf[4] = keepass->transf_random_seed[4];
20165 salt->salt_buf[5] = keepass->transf_random_seed[5];
20166 salt->salt_buf[6] = keepass->transf_random_seed[6];
20167 salt->salt_buf[7] = keepass->transf_random_seed[7];
20168
20169 return (PARSER_OK);
20170 }
20171
20172 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20173 {
20174 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
20175
20176 u32 *digest = (u32 *) hash_buf->digest;
20177
20178 salt_t *salt = hash_buf->salt;
20179
20180 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
20181 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
20182 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
20183 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
20184 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
20185 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
20186 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
20187 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
20188
20189 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
20190
20191 uint salt_len = input_len - 64 - 1;
20192
20193 char *salt_buf = input_buf + 64 + 1;
20194
20195 char *salt_buf_ptr = (char *) salt->salt_buf;
20196
20197 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
20198
20199 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
20200
20201 salt->salt_len = salt_len;
20202
20203 /**
20204 * we can precompute the first sha256 transform
20205 */
20206
20207 uint w[16] = { 0 };
20208
20209 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
20210 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
20211 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
20212 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
20213 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
20214 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
20215 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
20216 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
20217 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
20218 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
20219 w[10] = byte_swap_32 (salt->salt_buf[10]);
20220 w[11] = byte_swap_32 (salt->salt_buf[11]);
20221 w[12] = byte_swap_32 (salt->salt_buf[12]);
20222 w[13] = byte_swap_32 (salt->salt_buf[13]);
20223 w[14] = byte_swap_32 (salt->salt_buf[14]);
20224 w[15] = byte_swap_32 (salt->salt_buf[15]);
20225
20226 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
20227
20228 sha256_64 (w, pc256);
20229
20230 salt->salt_buf_pc[0] = pc256[0];
20231 salt->salt_buf_pc[1] = pc256[1];
20232 salt->salt_buf_pc[2] = pc256[2];
20233 salt->salt_buf_pc[3] = pc256[3];
20234 salt->salt_buf_pc[4] = pc256[4];
20235 salt->salt_buf_pc[5] = pc256[5];
20236 salt->salt_buf_pc[6] = pc256[6];
20237 salt->salt_buf_pc[7] = pc256[7];
20238
20239 digest[0] -= pc256[0];
20240 digest[1] -= pc256[1];
20241 digest[2] -= pc256[2];
20242 digest[3] -= pc256[3];
20243 digest[4] -= pc256[4];
20244 digest[5] -= pc256[5];
20245 digest[6] -= pc256[6];
20246 digest[7] -= pc256[7];
20247
20248 return (PARSER_OK);
20249 }
20250
20251 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20252 {
20253 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
20254
20255 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
20256
20257 u32 *digest = (u32 *) hash_buf->digest;
20258
20259 salt_t *salt = hash_buf->salt;
20260
20261 /**
20262 * parse line
20263 */
20264
20265 char *data_len_pos = input_buf + 1 + 10 + 1;
20266
20267 char *data_buf_pos = strchr (data_len_pos, '$');
20268
20269 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20270
20271 u32 data_len_len = data_buf_pos - data_len_pos;
20272
20273 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
20274 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
20275
20276 data_buf_pos++;
20277
20278 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
20279
20280 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
20281
20282 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
20283
20284 u32 data_len = atoi (data_len_pos);
20285
20286 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
20287
20288 /**
20289 * salt
20290 */
20291
20292 char *salt_pos = data_buf_pos;
20293
20294 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20295 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20296 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
20297 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
20298
20299 // this is actually the CT, which is also the hash later (if matched)
20300
20301 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
20302 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
20303 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
20304 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
20305
20306 salt->salt_len = 32; // note we need to fix this to 16 in kernel
20307
20308 salt->salt_iter = 10 - 1;
20309
20310 /**
20311 * digest buf
20312 */
20313
20314 digest[0] = salt->salt_buf[4];
20315 digest[1] = salt->salt_buf[5];
20316 digest[2] = salt->salt_buf[6];
20317 digest[3] = salt->salt_buf[7];
20318
20319 return (PARSER_OK);
20320 }
20321
20322 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20323 {
20324 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
20325
20326 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
20327
20328 u32 *digest = (u32 *) hash_buf->digest;
20329
20330 salt_t *salt = hash_buf->salt;
20331
20332 /**
20333 * parse line
20334 */
20335
20336 char *salt_pos = input_buf + 11 + 1;
20337
20338 char *iter_pos = strchr (salt_pos, ',');
20339
20340 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20341
20342 u32 salt_len = iter_pos - salt_pos;
20343
20344 if (salt_len != 20) return (PARSER_SALT_LENGTH);
20345
20346 iter_pos++;
20347
20348 char *hash_pos = strchr (iter_pos, ',');
20349
20350 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20351
20352 u32 iter_len = hash_pos - iter_pos;
20353
20354 if (iter_len > 5) return (PARSER_SALT_LENGTH);
20355
20356 hash_pos++;
20357
20358 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
20359
20360 if (hash_len != 64) return (PARSER_HASH_LENGTH);
20361
20362 /**
20363 * salt
20364 */
20365
20366 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20367 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20368 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
20369 salt->salt_buf[3] = 0x00018000;
20370
20371 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
20372 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
20373 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
20374 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
20375
20376 salt->salt_len = salt_len / 2;
20377
20378 salt->salt_iter = atoi (iter_pos) - 1;
20379
20380 /**
20381 * digest buf
20382 */
20383
20384 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20385 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20386 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20387 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20388 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20389 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20390 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20391 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20392
20393 return (PARSER_OK);
20394 }
20395
20396 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20397 {
20398 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
20399
20400 u32 *digest = (u32 *) hash_buf->digest;
20401
20402 salt_t *salt = hash_buf->salt;
20403
20404 /**
20405 * parse line
20406 */
20407
20408 char *hash_pos = input_buf + 64;
20409 char *salt1_pos = input_buf + 128;
20410 char *salt2_pos = input_buf;
20411
20412 /**
20413 * salt
20414 */
20415
20416 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
20417 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
20418 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
20419 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
20420
20421 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
20422 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
20423 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
20424 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
20425
20426 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
20427 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
20428 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
20429 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
20430
20431 salt->salt_len = 48;
20432
20433 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
20434
20435 /**
20436 * digest buf
20437 */
20438
20439 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20440 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20441 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20442 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20443 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20444 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20445 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20446 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20447
20448 return (PARSER_OK);
20449 }
20450
20451 int zip2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20452 {
20453 if ((input_len < DISPLAY_LEN_MIN_13600) || (input_len > DISPLAY_LEN_MAX_13600)) return (PARSER_GLOBAL_LENGTH);
20454
20455 if (memcmp (SIGNATURE_ZIP2_START, input_buf , 6)) return (PARSER_SIGNATURE_UNMATCHED);
20456 if (memcmp (SIGNATURE_ZIP2_STOP , input_buf + input_len - 7, 7)) return (PARSER_SIGNATURE_UNMATCHED);
20457
20458 u32 *digest = (u32 *) hash_buf->digest;
20459
20460 salt_t *salt = hash_buf->salt;
20461
20462 zip2_t *zip2 = (zip2_t *) hash_buf->esalt;
20463
20464 /**
20465 * parse line
20466 */
20467
20468 char *param0_pos = input_buf + 6 + 1;
20469
20470 char *param1_pos = strchr (param0_pos, '*');
20471
20472 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20473
20474 u32 param0_len = param1_pos - param0_pos;
20475
20476 param1_pos++;
20477
20478 char *param2_pos = strchr (param1_pos, '*');
20479
20480 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20481
20482 u32 param1_len = param2_pos - param1_pos;
20483
20484 param2_pos++;
20485
20486 char *param3_pos = strchr (param2_pos, '*');
20487
20488 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20489
20490 u32 param2_len = param3_pos - param2_pos;
20491
20492 param3_pos++;
20493
20494 char *param4_pos = strchr (param3_pos, '*');
20495
20496 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20497
20498 u32 param3_len = param4_pos - param3_pos;
20499
20500 param4_pos++;
20501
20502 char *param5_pos = strchr (param4_pos, '*');
20503
20504 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20505
20506 u32 param4_len = param5_pos - param4_pos;
20507
20508 param5_pos++;
20509
20510 char *param6_pos = strchr (param5_pos, '*');
20511
20512 if (param6_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20513
20514 u32 param5_len = param6_pos - param5_pos;
20515
20516 param6_pos++;
20517
20518 char *param7_pos = strchr (param6_pos, '*');
20519
20520 if (param7_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20521
20522 u32 param6_len = param7_pos - param6_pos;
20523
20524 param7_pos++;
20525
20526 char *param8_pos = strchr (param7_pos, '*');
20527
20528 if (param8_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20529
20530 u32 param7_len = param8_pos - param7_pos;
20531
20532 param8_pos++;
20533
20534 const uint type = atoi (param0_pos);
20535 const uint mode = atoi (param1_pos);
20536 const uint magic = atoi (param2_pos);
20537
20538 char *salt_buf = param3_pos;
20539
20540 uint verify_bytes; sscanf (param4_pos, "%4x*", &verify_bytes);
20541
20542 const uint compress_length = atoi (param5_pos);
20543
20544 char *data_buf = param6_pos;
20545 char *auth = param7_pos;
20546
20547 /**
20548 * verify some data
20549 */
20550
20551 if (param0_len != 1) return (PARSER_SALT_VALUE);
20552
20553 if (param1_len != 1) return (PARSER_SALT_VALUE);
20554
20555 if (param2_len != 1) return (PARSER_SALT_VALUE);
20556
20557 if ((param3_len != 16) && (param3_len != 24) && (param3_len != 32)) return (PARSER_SALT_VALUE);
20558
20559 if (param4_len >= 5) return (PARSER_SALT_VALUE);
20560
20561 if (param5_len >= 5) return (PARSER_SALT_VALUE);
20562
20563 if (param6_len >= 8192) return (PARSER_SALT_VALUE);
20564
20565 if (param6_len & 1) return (PARSER_SALT_VALUE);
20566
20567 if (param7_len != 20) return (PARSER_SALT_VALUE);
20568
20569 if (type != 0) return (PARSER_SALT_VALUE);
20570
20571 if ((mode != 1) && (mode != 2) && (mode != 3)) return (PARSER_SALT_VALUE);
20572
20573 if (magic != 0) return (PARSER_SALT_VALUE);
20574
20575 if (verify_bytes >= 0x10000) return (PARSER_SALT_VALUE);
20576
20577 /**
20578 * store data
20579 */
20580
20581 zip2->type = type;
20582 zip2->mode = mode;
20583 zip2->magic = magic;
20584
20585 if (mode == 1)
20586 {
20587 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20588 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20589 zip2->salt_buf[2] = 0;
20590 zip2->salt_buf[3] = 0;
20591
20592 zip2->salt_len = 8;
20593 }
20594 else if (mode == 2)
20595 {
20596 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20597 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20598 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20599 zip2->salt_buf[3] = 0;
20600
20601 zip2->salt_len = 12;
20602 }
20603 else if (mode == 3)
20604 {
20605 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20606 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20607 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20608 zip2->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
20609
20610 zip2->salt_len = 16;
20611 }
20612
20613 zip2->salt_buf[0] = byte_swap_32 (zip2->salt_buf[0]);
20614 zip2->salt_buf[1] = byte_swap_32 (zip2->salt_buf[1]);
20615 zip2->salt_buf[2] = byte_swap_32 (zip2->salt_buf[2]);
20616 zip2->salt_buf[3] = byte_swap_32 (zip2->salt_buf[3]);
20617
20618 zip2->verify_bytes = verify_bytes;
20619
20620 zip2->compress_length = compress_length;
20621
20622 char *data_buf_ptr = (char *) zip2->data_buf;
20623
20624 for (uint i = 0; i < param6_len; i += 2)
20625 {
20626 const char p0 = data_buf[i + 0];
20627 const char p1 = data_buf[i + 1];
20628
20629 *data_buf_ptr++ = hex_convert (p1) << 0
20630 | hex_convert (p0) << 4;
20631
20632 zip2->data_len++;
20633 }
20634
20635 *data_buf_ptr = 0x80;
20636
20637 char *auth_ptr = (char *) zip2->auth_buf;
20638
20639 for (uint i = 0; i < param7_len; i += 2)
20640 {
20641 const char p0 = auth[i + 0];
20642 const char p1 = auth[i + 1];
20643
20644 *auth_ptr++ = hex_convert (p1) << 0
20645 | hex_convert (p0) << 4;
20646
20647 zip2->auth_len++;
20648 }
20649
20650 /**
20651 * salt buf (fake)
20652 */
20653
20654 salt->salt_buf[0] = zip2->salt_buf[0];
20655 salt->salt_buf[1] = zip2->salt_buf[1];
20656 salt->salt_buf[2] = zip2->salt_buf[2];
20657 salt->salt_buf[3] = zip2->salt_buf[3];
20658 salt->salt_buf[4] = zip2->data_buf[0];
20659 salt->salt_buf[5] = zip2->data_buf[1];
20660 salt->salt_buf[6] = zip2->data_buf[2];
20661 salt->salt_buf[7] = zip2->data_buf[3];
20662
20663 salt->salt_len = 32;
20664
20665 salt->salt_iter = ROUNDS_ZIP2 - 1;
20666
20667 /**
20668 * digest buf (fake)
20669 */
20670
20671 digest[0] = zip2->auth_buf[0];
20672 digest[1] = zip2->auth_buf[1];
20673 digest[2] = zip2->auth_buf[2];
20674 digest[3] = zip2->auth_buf[3];
20675
20676 return (PARSER_OK);
20677 }
20678
20679 int win8phone_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20680 {
20681 if ((input_len < DISPLAY_LEN_MIN_13800) || (input_len > DISPLAY_LEN_MAX_13800)) return (PARSER_GLOBAL_LENGTH);
20682
20683 u32 *digest = (u32 *) hash_buf->digest;
20684
20685 salt_t *salt = hash_buf->salt;
20686
20687 win8phone_t *esalt = hash_buf->esalt;
20688
20689 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
20690 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
20691 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
20692 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
20693 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
20694 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
20695 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
20696 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
20697
20698 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
20699
20700 char *salt_buf_ptr = input_buf + 64 + 1;
20701
20702 u32 *salt_buf = esalt->salt_buf;
20703
20704 for (int i = 0, j = 0; i < 32; i += 1, j += 8)
20705 {
20706 salt_buf[i] = hex_to_u32 ((const u8 *) &salt_buf_ptr[j]);
20707 }
20708
20709 salt->salt_buf[0] = salt_buf[0];
20710 salt->salt_buf[1] = salt_buf[1];
20711 salt->salt_buf[2] = salt_buf[2];
20712 salt->salt_buf[3] = salt_buf[3];
20713 salt->salt_buf[4] = salt_buf[4];
20714 salt->salt_buf[5] = salt_buf[5];
20715 salt->salt_buf[6] = salt_buf[6];
20716 salt->salt_buf[7] = salt_buf[7];
20717
20718 salt->salt_len = 64;
20719
20720 return (PARSER_OK);
20721 }
20722
20723 /**
20724 * parallel running threads
20725 */
20726
20727 #ifdef WIN
20728
20729 BOOL WINAPI sigHandler_default (DWORD sig)
20730 {
20731 switch (sig)
20732 {
20733 case CTRL_CLOSE_EVENT:
20734
20735 /*
20736 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
20737 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
20738 * function otherwise it is too late (e.g. after returning from this function)
20739 */
20740
20741 myabort ();
20742
20743 SetConsoleCtrlHandler (NULL, TRUE);
20744
20745 hc_sleep (10);
20746
20747 return TRUE;
20748
20749 case CTRL_C_EVENT:
20750 case CTRL_LOGOFF_EVENT:
20751 case CTRL_SHUTDOWN_EVENT:
20752
20753 myabort ();
20754
20755 SetConsoleCtrlHandler (NULL, TRUE);
20756
20757 return TRUE;
20758 }
20759
20760 return FALSE;
20761 }
20762
20763 BOOL WINAPI sigHandler_benchmark (DWORD sig)
20764 {
20765 switch (sig)
20766 {
20767 case CTRL_CLOSE_EVENT:
20768
20769 myquit ();
20770
20771 SetConsoleCtrlHandler (NULL, TRUE);
20772
20773 hc_sleep (10);
20774
20775 return TRUE;
20776
20777 case CTRL_C_EVENT:
20778 case CTRL_LOGOFF_EVENT:
20779 case CTRL_SHUTDOWN_EVENT:
20780
20781 myquit ();
20782
20783 SetConsoleCtrlHandler (NULL, TRUE);
20784
20785 return TRUE;
20786 }
20787
20788 return FALSE;
20789 }
20790
20791 void hc_signal (BOOL WINAPI (callback) (DWORD))
20792 {
20793 if (callback == NULL)
20794 {
20795 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
20796 }
20797 else
20798 {
20799 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
20800 }
20801 }
20802
20803 #else
20804
20805 void sigHandler_default (int sig)
20806 {
20807 myabort ();
20808
20809 signal (sig, NULL);
20810 }
20811
20812 void sigHandler_benchmark (int sig)
20813 {
20814 myquit ();
20815
20816 signal (sig, NULL);
20817 }
20818
20819 void hc_signal (void (callback) (int))
20820 {
20821 if (callback == NULL) callback = SIG_DFL;
20822
20823 signal (SIGINT, callback);
20824 signal (SIGTERM, callback);
20825 signal (SIGABRT, callback);
20826 }
20827
20828 #endif
20829
20830 void status_display ();
20831
20832 void *thread_keypress (void *p)
20833 {
20834 uint quiet = data.quiet;
20835
20836 tty_break();
20837
20838 while (data.shutdown_outer == 0)
20839 {
20840 int ch = tty_getchar();
20841
20842 if (ch == -1) break;
20843
20844 if (ch == 0) continue;
20845
20846 //https://github.com/hashcat/hashcat/issues/302
20847 //#ifdef _POSIX
20848 //if (ch != '\n')
20849 //#endif
20850
20851 hc_thread_mutex_lock (mux_display);
20852
20853 log_info ("");
20854
20855 switch (ch)
20856 {
20857 case 's':
20858 case '\r':
20859 case '\n':
20860
20861 log_info ("");
20862
20863 status_display ();
20864
20865 log_info ("");
20866
20867 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20868 if (quiet == 0) fflush (stdout);
20869
20870 break;
20871
20872 case 'b':
20873
20874 log_info ("");
20875
20876 bypass ();
20877
20878 log_info ("");
20879
20880 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20881 if (quiet == 0) fflush (stdout);
20882
20883 break;
20884
20885 case 'p':
20886
20887 log_info ("");
20888
20889 SuspendThreads ();
20890
20891 log_info ("");
20892
20893 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20894 if (quiet == 0) fflush (stdout);
20895
20896 break;
20897
20898 case 'r':
20899
20900 log_info ("");
20901
20902 ResumeThreads ();
20903
20904 log_info ("");
20905
20906 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20907 if (quiet == 0) fflush (stdout);
20908
20909 break;
20910
20911 case 'c':
20912
20913 log_info ("");
20914
20915 stop_at_checkpoint ();
20916
20917 log_info ("");
20918
20919 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20920 if (quiet == 0) fflush (stdout);
20921
20922 break;
20923
20924 case 'q':
20925
20926 log_info ("");
20927
20928 myabort ();
20929
20930 break;
20931 }
20932
20933 //https://github.com/hashcat/hashcat/issues/302
20934 //#ifdef _POSIX
20935 //if (ch != '\n')
20936 //#endif
20937
20938 hc_thread_mutex_unlock (mux_display);
20939 }
20940
20941 tty_fix();
20942
20943 return (p);
20944 }
20945
20946 /**
20947 * rules common
20948 */
20949
20950 bool class_num (const u8 c)
20951 {
20952 return ((c >= '0') && (c <= '9'));
20953 }
20954
20955 bool class_lower (const u8 c)
20956 {
20957 return ((c >= 'a') && (c <= 'z'));
20958 }
20959
20960 bool class_upper (const u8 c)
20961 {
20962 return ((c >= 'A') && (c <= 'Z'));
20963 }
20964
20965 bool class_alpha (const u8 c)
20966 {
20967 return (class_lower (c) || class_upper (c));
20968 }
20969
20970 int conv_ctoi (const u8 c)
20971 {
20972 if (class_num (c))
20973 {
20974 return c - '0';
20975 }
20976 else if (class_upper (c))
20977 {
20978 return c - 'A' + 10;
20979 }
20980
20981 return -1;
20982 }
20983
20984 int conv_itoc (const u8 c)
20985 {
20986 if (c < 10)
20987 {
20988 return c + '0';
20989 }
20990 else if (c < 37)
20991 {
20992 return c + 'A' - 10;
20993 }
20994
20995 return -1;
20996 }
20997
20998 /**
20999 * device rules
21000 */
21001
21002 #define INCR_POS if (++rule_pos == rule_len) return (-1)
21003 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
21004 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
21005 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
21006 #define MAX_KERNEL_RULES 255
21007 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
21008 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
21009 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
21010
21011 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
21012 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
21013 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
21014 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
21015
21016 int cpu_rule_to_kernel_rule (char *rule_buf, uint rule_len, kernel_rule_t *rule)
21017 {
21018 uint rule_pos;
21019 uint rule_cnt;
21020
21021 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
21022 {
21023 switch (rule_buf[rule_pos])
21024 {
21025 case ' ':
21026 rule_cnt--;
21027 break;
21028
21029 case RULE_OP_MANGLE_NOOP:
21030 SET_NAME (rule, rule_buf[rule_pos]);
21031 break;
21032
21033 case RULE_OP_MANGLE_LREST:
21034 SET_NAME (rule, rule_buf[rule_pos]);
21035 break;
21036
21037 case RULE_OP_MANGLE_UREST:
21038 SET_NAME (rule, rule_buf[rule_pos]);
21039 break;
21040
21041 case RULE_OP_MANGLE_LREST_UFIRST:
21042 SET_NAME (rule, rule_buf[rule_pos]);
21043 break;
21044
21045 case RULE_OP_MANGLE_UREST_LFIRST:
21046 SET_NAME (rule, rule_buf[rule_pos]);
21047 break;
21048
21049 case RULE_OP_MANGLE_TREST:
21050 SET_NAME (rule, rule_buf[rule_pos]);
21051 break;
21052
21053 case RULE_OP_MANGLE_TOGGLE_AT:
21054 SET_NAME (rule, rule_buf[rule_pos]);
21055 SET_P0_CONV (rule, rule_buf[rule_pos]);
21056 break;
21057
21058 case RULE_OP_MANGLE_REVERSE:
21059 SET_NAME (rule, rule_buf[rule_pos]);
21060 break;
21061
21062 case RULE_OP_MANGLE_DUPEWORD:
21063 SET_NAME (rule, rule_buf[rule_pos]);
21064 break;
21065
21066 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21067 SET_NAME (rule, rule_buf[rule_pos]);
21068 SET_P0_CONV (rule, rule_buf[rule_pos]);
21069 break;
21070
21071 case RULE_OP_MANGLE_REFLECT:
21072 SET_NAME (rule, rule_buf[rule_pos]);
21073 break;
21074
21075 case RULE_OP_MANGLE_ROTATE_LEFT:
21076 SET_NAME (rule, rule_buf[rule_pos]);
21077 break;
21078
21079 case RULE_OP_MANGLE_ROTATE_RIGHT:
21080 SET_NAME (rule, rule_buf[rule_pos]);
21081 break;
21082
21083 case RULE_OP_MANGLE_APPEND:
21084 SET_NAME (rule, rule_buf[rule_pos]);
21085 SET_P0 (rule, rule_buf[rule_pos]);
21086 break;
21087
21088 case RULE_OP_MANGLE_PREPEND:
21089 SET_NAME (rule, rule_buf[rule_pos]);
21090 SET_P0 (rule, rule_buf[rule_pos]);
21091 break;
21092
21093 case RULE_OP_MANGLE_DELETE_FIRST:
21094 SET_NAME (rule, rule_buf[rule_pos]);
21095 break;
21096
21097 case RULE_OP_MANGLE_DELETE_LAST:
21098 SET_NAME (rule, rule_buf[rule_pos]);
21099 break;
21100
21101 case RULE_OP_MANGLE_DELETE_AT:
21102 SET_NAME (rule, rule_buf[rule_pos]);
21103 SET_P0_CONV (rule, rule_buf[rule_pos]);
21104 break;
21105
21106 case RULE_OP_MANGLE_EXTRACT:
21107 SET_NAME (rule, rule_buf[rule_pos]);
21108 SET_P0_CONV (rule, rule_buf[rule_pos]);
21109 SET_P1_CONV (rule, rule_buf[rule_pos]);
21110 break;
21111
21112 case RULE_OP_MANGLE_OMIT:
21113 SET_NAME (rule, rule_buf[rule_pos]);
21114 SET_P0_CONV (rule, rule_buf[rule_pos]);
21115 SET_P1_CONV (rule, rule_buf[rule_pos]);
21116 break;
21117
21118 case RULE_OP_MANGLE_INSERT:
21119 SET_NAME (rule, rule_buf[rule_pos]);
21120 SET_P0_CONV (rule, rule_buf[rule_pos]);
21121 SET_P1 (rule, rule_buf[rule_pos]);
21122 break;
21123
21124 case RULE_OP_MANGLE_OVERSTRIKE:
21125 SET_NAME (rule, rule_buf[rule_pos]);
21126 SET_P0_CONV (rule, rule_buf[rule_pos]);
21127 SET_P1 (rule, rule_buf[rule_pos]);
21128 break;
21129
21130 case RULE_OP_MANGLE_TRUNCATE_AT:
21131 SET_NAME (rule, rule_buf[rule_pos]);
21132 SET_P0_CONV (rule, rule_buf[rule_pos]);
21133 break;
21134
21135 case RULE_OP_MANGLE_REPLACE:
21136 SET_NAME (rule, rule_buf[rule_pos]);
21137 SET_P0 (rule, rule_buf[rule_pos]);
21138 SET_P1 (rule, rule_buf[rule_pos]);
21139 break;
21140
21141 case RULE_OP_MANGLE_PURGECHAR:
21142 SET_NAME (rule, rule_buf[rule_pos]);
21143 SET_P0 (rule, rule_buf[rule_pos]);
21144 break;
21145
21146 case RULE_OP_MANGLE_TOGGLECASE_REC:
21147 return -1;
21148 break;
21149
21150 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21151 SET_NAME (rule, rule_buf[rule_pos]);
21152 SET_P0_CONV (rule, rule_buf[rule_pos]);
21153 break;
21154
21155 case RULE_OP_MANGLE_DUPECHAR_LAST:
21156 SET_NAME (rule, rule_buf[rule_pos]);
21157 SET_P0_CONV (rule, rule_buf[rule_pos]);
21158 break;
21159
21160 case RULE_OP_MANGLE_DUPECHAR_ALL:
21161 SET_NAME (rule, rule_buf[rule_pos]);
21162 break;
21163
21164 case RULE_OP_MANGLE_SWITCH_FIRST:
21165 SET_NAME (rule, rule_buf[rule_pos]);
21166 break;
21167
21168 case RULE_OP_MANGLE_SWITCH_LAST:
21169 SET_NAME (rule, rule_buf[rule_pos]);
21170 break;
21171
21172 case RULE_OP_MANGLE_SWITCH_AT:
21173 SET_NAME (rule, rule_buf[rule_pos]);
21174 SET_P0_CONV (rule, rule_buf[rule_pos]);
21175 SET_P1_CONV (rule, rule_buf[rule_pos]);
21176 break;
21177
21178 case RULE_OP_MANGLE_CHR_SHIFTL:
21179 SET_NAME (rule, rule_buf[rule_pos]);
21180 SET_P0_CONV (rule, rule_buf[rule_pos]);
21181 break;
21182
21183 case RULE_OP_MANGLE_CHR_SHIFTR:
21184 SET_NAME (rule, rule_buf[rule_pos]);
21185 SET_P0_CONV (rule, rule_buf[rule_pos]);
21186 break;
21187
21188 case RULE_OP_MANGLE_CHR_INCR:
21189 SET_NAME (rule, rule_buf[rule_pos]);
21190 SET_P0_CONV (rule, rule_buf[rule_pos]);
21191 break;
21192
21193 case RULE_OP_MANGLE_CHR_DECR:
21194 SET_NAME (rule, rule_buf[rule_pos]);
21195 SET_P0_CONV (rule, rule_buf[rule_pos]);
21196 break;
21197
21198 case RULE_OP_MANGLE_REPLACE_NP1:
21199 SET_NAME (rule, rule_buf[rule_pos]);
21200 SET_P0_CONV (rule, rule_buf[rule_pos]);
21201 break;
21202
21203 case RULE_OP_MANGLE_REPLACE_NM1:
21204 SET_NAME (rule, rule_buf[rule_pos]);
21205 SET_P0_CONV (rule, rule_buf[rule_pos]);
21206 break;
21207
21208 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21209 SET_NAME (rule, rule_buf[rule_pos]);
21210 SET_P0_CONV (rule, rule_buf[rule_pos]);
21211 break;
21212
21213 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21214 SET_NAME (rule, rule_buf[rule_pos]);
21215 SET_P0_CONV (rule, rule_buf[rule_pos]);
21216 break;
21217
21218 case RULE_OP_MANGLE_TITLE:
21219 SET_NAME (rule, rule_buf[rule_pos]);
21220 break;
21221
21222 default:
21223 return -1;
21224 break;
21225 }
21226 }
21227
21228 if (rule_pos < rule_len) return -1;
21229
21230 return 0;
21231 }
21232
21233 int kernel_rule_to_cpu_rule (char *rule_buf, kernel_rule_t *rule)
21234 {
21235 uint rule_cnt;
21236 uint rule_pos;
21237 uint rule_len = HCBUFSIZ - 1; // maximum possible len
21238
21239 char rule_cmd;
21240
21241 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
21242 {
21243 GET_NAME (rule);
21244
21245 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
21246
21247 switch (rule_cmd)
21248 {
21249 case RULE_OP_MANGLE_NOOP:
21250 rule_buf[rule_pos] = rule_cmd;
21251 break;
21252
21253 case RULE_OP_MANGLE_LREST:
21254 rule_buf[rule_pos] = rule_cmd;
21255 break;
21256
21257 case RULE_OP_MANGLE_UREST:
21258 rule_buf[rule_pos] = rule_cmd;
21259 break;
21260
21261 case RULE_OP_MANGLE_LREST_UFIRST:
21262 rule_buf[rule_pos] = rule_cmd;
21263 break;
21264
21265 case RULE_OP_MANGLE_UREST_LFIRST:
21266 rule_buf[rule_pos] = rule_cmd;
21267 break;
21268
21269 case RULE_OP_MANGLE_TREST:
21270 rule_buf[rule_pos] = rule_cmd;
21271 break;
21272
21273 case RULE_OP_MANGLE_TOGGLE_AT:
21274 rule_buf[rule_pos] = rule_cmd;
21275 GET_P0_CONV (rule);
21276 break;
21277
21278 case RULE_OP_MANGLE_REVERSE:
21279 rule_buf[rule_pos] = rule_cmd;
21280 break;
21281
21282 case RULE_OP_MANGLE_DUPEWORD:
21283 rule_buf[rule_pos] = rule_cmd;
21284 break;
21285
21286 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21287 rule_buf[rule_pos] = rule_cmd;
21288 GET_P0_CONV (rule);
21289 break;
21290
21291 case RULE_OP_MANGLE_REFLECT:
21292 rule_buf[rule_pos] = rule_cmd;
21293 break;
21294
21295 case RULE_OP_MANGLE_ROTATE_LEFT:
21296 rule_buf[rule_pos] = rule_cmd;
21297 break;
21298
21299 case RULE_OP_MANGLE_ROTATE_RIGHT:
21300 rule_buf[rule_pos] = rule_cmd;
21301 break;
21302
21303 case RULE_OP_MANGLE_APPEND:
21304 rule_buf[rule_pos] = rule_cmd;
21305 GET_P0 (rule);
21306 break;
21307
21308 case RULE_OP_MANGLE_PREPEND:
21309 rule_buf[rule_pos] = rule_cmd;
21310 GET_P0 (rule);
21311 break;
21312
21313 case RULE_OP_MANGLE_DELETE_FIRST:
21314 rule_buf[rule_pos] = rule_cmd;
21315 break;
21316
21317 case RULE_OP_MANGLE_DELETE_LAST:
21318 rule_buf[rule_pos] = rule_cmd;
21319 break;
21320
21321 case RULE_OP_MANGLE_DELETE_AT:
21322 rule_buf[rule_pos] = rule_cmd;
21323 GET_P0_CONV (rule);
21324 break;
21325
21326 case RULE_OP_MANGLE_EXTRACT:
21327 rule_buf[rule_pos] = rule_cmd;
21328 GET_P0_CONV (rule);
21329 GET_P1_CONV (rule);
21330 break;
21331
21332 case RULE_OP_MANGLE_OMIT:
21333 rule_buf[rule_pos] = rule_cmd;
21334 GET_P0_CONV (rule);
21335 GET_P1_CONV (rule);
21336 break;
21337
21338 case RULE_OP_MANGLE_INSERT:
21339 rule_buf[rule_pos] = rule_cmd;
21340 GET_P0_CONV (rule);
21341 GET_P1 (rule);
21342 break;
21343
21344 case RULE_OP_MANGLE_OVERSTRIKE:
21345 rule_buf[rule_pos] = rule_cmd;
21346 GET_P0_CONV (rule);
21347 GET_P1 (rule);
21348 break;
21349
21350 case RULE_OP_MANGLE_TRUNCATE_AT:
21351 rule_buf[rule_pos] = rule_cmd;
21352 GET_P0_CONV (rule);
21353 break;
21354
21355 case RULE_OP_MANGLE_REPLACE:
21356 rule_buf[rule_pos] = rule_cmd;
21357 GET_P0 (rule);
21358 GET_P1 (rule);
21359 break;
21360
21361 case RULE_OP_MANGLE_PURGECHAR:
21362 rule_buf[rule_pos] = rule_cmd;
21363 GET_P0 (rule);
21364 break;
21365
21366 case RULE_OP_MANGLE_TOGGLECASE_REC:
21367 return -1;
21368 break;
21369
21370 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21371 rule_buf[rule_pos] = rule_cmd;
21372 GET_P0_CONV (rule);
21373 break;
21374
21375 case RULE_OP_MANGLE_DUPECHAR_LAST:
21376 rule_buf[rule_pos] = rule_cmd;
21377 GET_P0_CONV (rule);
21378 break;
21379
21380 case RULE_OP_MANGLE_DUPECHAR_ALL:
21381 rule_buf[rule_pos] = rule_cmd;
21382 break;
21383
21384 case RULE_OP_MANGLE_SWITCH_FIRST:
21385 rule_buf[rule_pos] = rule_cmd;
21386 break;
21387
21388 case RULE_OP_MANGLE_SWITCH_LAST:
21389 rule_buf[rule_pos] = rule_cmd;
21390 break;
21391
21392 case RULE_OP_MANGLE_SWITCH_AT:
21393 rule_buf[rule_pos] = rule_cmd;
21394 GET_P0_CONV (rule);
21395 GET_P1_CONV (rule);
21396 break;
21397
21398 case RULE_OP_MANGLE_CHR_SHIFTL:
21399 rule_buf[rule_pos] = rule_cmd;
21400 GET_P0_CONV (rule);
21401 break;
21402
21403 case RULE_OP_MANGLE_CHR_SHIFTR:
21404 rule_buf[rule_pos] = rule_cmd;
21405 GET_P0_CONV (rule);
21406 break;
21407
21408 case RULE_OP_MANGLE_CHR_INCR:
21409 rule_buf[rule_pos] = rule_cmd;
21410 GET_P0_CONV (rule);
21411 break;
21412
21413 case RULE_OP_MANGLE_CHR_DECR:
21414 rule_buf[rule_pos] = rule_cmd;
21415 GET_P0_CONV (rule);
21416 break;
21417
21418 case RULE_OP_MANGLE_REPLACE_NP1:
21419 rule_buf[rule_pos] = rule_cmd;
21420 GET_P0_CONV (rule);
21421 break;
21422
21423 case RULE_OP_MANGLE_REPLACE_NM1:
21424 rule_buf[rule_pos] = rule_cmd;
21425 GET_P0_CONV (rule);
21426 break;
21427
21428 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21429 rule_buf[rule_pos] = rule_cmd;
21430 GET_P0_CONV (rule);
21431 break;
21432
21433 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21434 rule_buf[rule_pos] = rule_cmd;
21435 GET_P0_CONV (rule);
21436 break;
21437
21438 case RULE_OP_MANGLE_TITLE:
21439 rule_buf[rule_pos] = rule_cmd;
21440 break;
21441
21442 case 0:
21443 return rule_pos - 1;
21444 break;
21445
21446 default:
21447 return -1;
21448 break;
21449 }
21450 }
21451
21452 if (rule_cnt > 0)
21453 {
21454 return rule_pos;
21455 }
21456
21457 return -1;
21458 }
21459
21460 /**
21461 * CPU rules : this is from hashcat sources, cpu based rules
21462 */
21463
21464 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
21465 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
21466
21467 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
21468 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
21469 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
21470
21471 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
21472 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
21473 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
21474
21475 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
21476 {
21477 int pos;
21478
21479 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
21480
21481 return (arr_len);
21482 }
21483
21484 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
21485 {
21486 int pos;
21487
21488 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
21489
21490 return (arr_len);
21491 }
21492
21493 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
21494 {
21495 int pos;
21496
21497 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
21498
21499 return (arr_len);
21500 }
21501
21502 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
21503 {
21504 int l;
21505 int r;
21506
21507 for (l = 0; l < arr_len; l++)
21508 {
21509 r = arr_len - 1 - l;
21510
21511 if (l >= r) break;
21512
21513 MANGLE_SWITCH (arr, l, r);
21514 }
21515
21516 return (arr_len);
21517 }
21518
21519 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
21520 {
21521 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21522
21523 memcpy (&arr[arr_len], arr, (size_t) arr_len);
21524
21525 return (arr_len * 2);
21526 }
21527
21528 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
21529 {
21530 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
21531
21532 int orig_len = arr_len;
21533
21534 int i;
21535
21536 for (i = 0; i < times; i++)
21537 {
21538 memcpy (&arr[arr_len], arr, orig_len);
21539
21540 arr_len += orig_len;
21541 }
21542
21543 return (arr_len);
21544 }
21545
21546 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
21547 {
21548 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21549
21550 mangle_double (arr, arr_len);
21551
21552 mangle_reverse (arr + arr_len, arr_len);
21553
21554 return (arr_len * 2);
21555 }
21556
21557 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
21558 {
21559 int l;
21560 int r;
21561
21562 for (l = 0, r = arr_len - 1; r > 0; r--)
21563 {
21564 MANGLE_SWITCH (arr, l, r);
21565 }
21566
21567 return (arr_len);
21568 }
21569
21570 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
21571 {
21572 int l;
21573 int r;
21574
21575 for (l = 0, r = arr_len - 1; l < r; l++)
21576 {
21577 MANGLE_SWITCH (arr, l, r);
21578 }
21579
21580 return (arr_len);
21581 }
21582
21583 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
21584 {
21585 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21586
21587 arr[arr_len] = c;
21588
21589 return (arr_len + 1);
21590 }
21591
21592 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
21593 {
21594 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21595
21596 int arr_pos;
21597
21598 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21599 {
21600 arr[arr_pos + 1] = arr[arr_pos];
21601 }
21602
21603 arr[0] = c;
21604
21605 return (arr_len + 1);
21606 }
21607
21608 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21609 {
21610 if (upos >= arr_len) return (arr_len);
21611
21612 int arr_pos;
21613
21614 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
21615 {
21616 arr[arr_pos] = arr[arr_pos + 1];
21617 }
21618
21619 return (arr_len - 1);
21620 }
21621
21622 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21623 {
21624 if (upos >= arr_len) return (arr_len);
21625
21626 if ((upos + ulen) > arr_len) return (arr_len);
21627
21628 int arr_pos;
21629
21630 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
21631 {
21632 arr[arr_pos] = arr[upos + arr_pos];
21633 }
21634
21635 return (ulen);
21636 }
21637
21638 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21639 {
21640 if (upos >= arr_len) return (arr_len);
21641
21642 if ((upos + ulen) >= arr_len) return (arr_len);
21643
21644 int arr_pos;
21645
21646 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
21647 {
21648 arr[arr_pos] = arr[arr_pos + ulen];
21649 }
21650
21651 return (arr_len - ulen);
21652 }
21653
21654 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21655 {
21656 if (upos >= arr_len) return (arr_len);
21657
21658 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21659
21660 int arr_pos;
21661
21662 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
21663 {
21664 arr[arr_pos + 1] = arr[arr_pos];
21665 }
21666
21667 arr[upos] = c;
21668
21669 return (arr_len + 1);
21670 }
21671
21672 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)
21673 {
21674 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21675
21676 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
21677
21678 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
21679
21680 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
21681
21682 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
21683
21684 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
21685
21686 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
21687
21688 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
21689
21690 return (arr_len + arr2_cpy);
21691 }
21692
21693 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21694 {
21695 if (upos >= arr_len) return (arr_len);
21696
21697 arr[upos] = c;
21698
21699 return (arr_len);
21700 }
21701
21702 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21703 {
21704 if (upos >= arr_len) return (arr_len);
21705
21706 memset (arr + upos, 0, arr_len - upos);
21707
21708 return (upos);
21709 }
21710
21711 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
21712 {
21713 int arr_pos;
21714
21715 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
21716 {
21717 if (arr[arr_pos] != oldc) continue;
21718
21719 arr[arr_pos] = newc;
21720 }
21721
21722 return (arr_len);
21723 }
21724
21725 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
21726 {
21727 int arr_pos;
21728
21729 int ret_len;
21730
21731 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
21732 {
21733 if (arr[arr_pos] == c) continue;
21734
21735 arr[ret_len] = arr[arr_pos];
21736
21737 ret_len++;
21738 }
21739
21740 return (ret_len);
21741 }
21742
21743 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
21744 {
21745 if (ulen > arr_len) return (arr_len);
21746
21747 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21748
21749 char cs[100] = { 0 };
21750
21751 memcpy (cs, arr, ulen);
21752
21753 int i;
21754
21755 for (i = 0; i < ulen; i++)
21756 {
21757 char c = cs[i];
21758
21759 arr_len = mangle_insert (arr, arr_len, i, c);
21760 }
21761
21762 return (arr_len);
21763 }
21764
21765 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
21766 {
21767 if (ulen > arr_len) return (arr_len);
21768
21769 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21770
21771 int upos = arr_len - ulen;
21772
21773 int i;
21774
21775 for (i = 0; i < ulen; i++)
21776 {
21777 char c = arr[upos + i];
21778
21779 arr_len = mangle_append (arr, arr_len, c);
21780 }
21781
21782 return (arr_len);
21783 }
21784
21785 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21786 {
21787 if ( arr_len == 0) return (arr_len);
21788 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21789
21790 char c = arr[upos];
21791
21792 int i;
21793
21794 for (i = 0; i < ulen; i++)
21795 {
21796 arr_len = mangle_insert (arr, arr_len, upos, c);
21797 }
21798
21799 return (arr_len);
21800 }
21801
21802 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
21803 {
21804 if ( arr_len == 0) return (arr_len);
21805 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
21806
21807 int arr_pos;
21808
21809 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21810 {
21811 int new_pos = arr_pos * 2;
21812
21813 arr[new_pos] = arr[arr_pos];
21814
21815 arr[new_pos + 1] = arr[arr_pos];
21816 }
21817
21818 return (arr_len * 2);
21819 }
21820
21821 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21822 {
21823 if (upos >= arr_len) return (arr_len);
21824 if (upos2 >= arr_len) return (arr_len);
21825
21826 MANGLE_SWITCH (arr, upos, upos2);
21827
21828 return (arr_len);
21829 }
21830
21831 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21832 {
21833 MANGLE_SWITCH (arr, upos, upos2);
21834
21835 return (arr_len);
21836 }
21837
21838 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
21839 {
21840 if (upos >= arr_len) return (arr_len);
21841
21842 arr[upos] <<= 1;
21843
21844 return (arr_len);
21845 }
21846
21847 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
21848 {
21849 if (upos >= arr_len) return (arr_len);
21850
21851 arr[upos] >>= 1;
21852
21853 return (arr_len);
21854 }
21855
21856 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
21857 {
21858 if (upos >= arr_len) return (arr_len);
21859
21860 arr[upos] += 1;
21861
21862 return (arr_len);
21863 }
21864
21865 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
21866 {
21867 if (upos >= arr_len) return (arr_len);
21868
21869 arr[upos] -= 1;
21870
21871 return (arr_len);
21872 }
21873
21874 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
21875 {
21876 int upper_next = 1;
21877
21878 int pos;
21879
21880 for (pos = 0; pos < arr_len; pos++)
21881 {
21882 if (arr[pos] == ' ')
21883 {
21884 upper_next = 1;
21885
21886 continue;
21887 }
21888
21889 if (upper_next)
21890 {
21891 upper_next = 0;
21892
21893 MANGLE_UPPER_AT (arr, pos);
21894 }
21895 else
21896 {
21897 MANGLE_LOWER_AT (arr, pos);
21898 }
21899 }
21900
21901 return (arr_len);
21902 }
21903
21904 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
21905 {
21906 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
21907
21908 u32 j;
21909
21910 u32 rule_pos = 0;
21911
21912 for (j = 0; j < rp_gen_num; j++)
21913 {
21914 u32 r = 0;
21915 u32 p1 = 0;
21916 u32 p2 = 0;
21917 u32 p3 = 0;
21918
21919 switch ((char) get_random_num (0, 9))
21920 {
21921 case 0:
21922 r = get_random_num (0, sizeof (grp_op_nop));
21923 rule_buf[rule_pos++] = grp_op_nop[r];
21924 break;
21925
21926 case 1:
21927 r = get_random_num (0, sizeof (grp_op_pos_p0));
21928 rule_buf[rule_pos++] = grp_op_pos_p0[r];
21929 p1 = get_random_num (0, sizeof (grp_pos));
21930 rule_buf[rule_pos++] = grp_pos[p1];
21931 break;
21932
21933 case 2:
21934 r = get_random_num (0, sizeof (grp_op_pos_p1));
21935 rule_buf[rule_pos++] = grp_op_pos_p1[r];
21936 p1 = get_random_num (1, 6);
21937 rule_buf[rule_pos++] = grp_pos[p1];
21938 break;
21939
21940 case 3:
21941 r = get_random_num (0, sizeof (grp_op_chr));
21942 rule_buf[rule_pos++] = grp_op_chr[r];
21943 p1 = get_random_num (0x20, 0x7e);
21944 rule_buf[rule_pos++] = (char) p1;
21945 break;
21946
21947 case 4:
21948 r = get_random_num (0, sizeof (grp_op_chr_chr));
21949 rule_buf[rule_pos++] = grp_op_chr_chr[r];
21950 p1 = get_random_num (0x20, 0x7e);
21951 rule_buf[rule_pos++] = (char) p1;
21952 p2 = get_random_num (0x20, 0x7e);
21953 while (p1 == p2)
21954 p2 = get_random_num (0x20, 0x7e);
21955 rule_buf[rule_pos++] = (char) p2;
21956 break;
21957
21958 case 5:
21959 r = get_random_num (0, sizeof (grp_op_pos_chr));
21960 rule_buf[rule_pos++] = grp_op_pos_chr[r];
21961 p1 = get_random_num (0, sizeof (grp_pos));
21962 rule_buf[rule_pos++] = grp_pos[p1];
21963 p2 = get_random_num (0x20, 0x7e);
21964 rule_buf[rule_pos++] = (char) p2;
21965 break;
21966
21967 case 6:
21968 r = get_random_num (0, sizeof (grp_op_pos_pos0));
21969 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
21970 p1 = get_random_num (0, sizeof (grp_pos));
21971 rule_buf[rule_pos++] = grp_pos[p1];
21972 p2 = get_random_num (0, sizeof (grp_pos));
21973 while (p1 == p2)
21974 p2 = get_random_num (0, sizeof (grp_pos));
21975 rule_buf[rule_pos++] = grp_pos[p2];
21976 break;
21977
21978 case 7:
21979 r = get_random_num (0, sizeof (grp_op_pos_pos1));
21980 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
21981 p1 = get_random_num (0, sizeof (grp_pos));
21982 rule_buf[rule_pos++] = grp_pos[p1];
21983 p2 = get_random_num (1, sizeof (grp_pos));
21984 while (p1 == p2)
21985 p2 = get_random_num (1, sizeof (grp_pos));
21986 rule_buf[rule_pos++] = grp_pos[p2];
21987 break;
21988
21989 case 8:
21990 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
21991 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
21992 p1 = get_random_num (0, sizeof (grp_pos));
21993 rule_buf[rule_pos++] = grp_pos[p1];
21994 p2 = get_random_num (1, sizeof (grp_pos));
21995 rule_buf[rule_pos++] = grp_pos[p1];
21996 p3 = get_random_num (0, sizeof (grp_pos));
21997 rule_buf[rule_pos++] = grp_pos[p3];
21998 break;
21999 }
22000 }
22001
22002 return (rule_pos);
22003 }
22004
22005 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
22006 {
22007 char mem[BLOCK_SIZE] = { 0 };
22008
22009 if (in == NULL) return (RULE_RC_REJECT_ERROR);
22010
22011 if (out == NULL) return (RULE_RC_REJECT_ERROR);
22012
22013 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22014
22015 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
22016
22017 int out_len = in_len;
22018 int mem_len = in_len;
22019
22020 memcpy (out, in, out_len);
22021
22022 int rule_pos;
22023
22024 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
22025 {
22026 int upos, upos2;
22027 int ulen;
22028
22029 switch (rule[rule_pos])
22030 {
22031 case ' ':
22032 break;
22033
22034 case RULE_OP_MANGLE_NOOP:
22035 break;
22036
22037 case RULE_OP_MANGLE_LREST:
22038 out_len = mangle_lrest (out, out_len);
22039 break;
22040
22041 case RULE_OP_MANGLE_UREST:
22042 out_len = mangle_urest (out, out_len);
22043 break;
22044
22045 case RULE_OP_MANGLE_LREST_UFIRST:
22046 out_len = mangle_lrest (out, out_len);
22047 if (out_len) MANGLE_UPPER_AT (out, 0);
22048 break;
22049
22050 case RULE_OP_MANGLE_UREST_LFIRST:
22051 out_len = mangle_urest (out, out_len);
22052 if (out_len) MANGLE_LOWER_AT (out, 0);
22053 break;
22054
22055 case RULE_OP_MANGLE_TREST:
22056 out_len = mangle_trest (out, out_len);
22057 break;
22058
22059 case RULE_OP_MANGLE_TOGGLE_AT:
22060 NEXT_RULEPOS (rule_pos);
22061 NEXT_RPTOI (rule, rule_pos, upos);
22062 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
22063 break;
22064
22065 case RULE_OP_MANGLE_REVERSE:
22066 out_len = mangle_reverse (out, out_len);
22067 break;
22068
22069 case RULE_OP_MANGLE_DUPEWORD:
22070 out_len = mangle_double (out, out_len);
22071 break;
22072
22073 case RULE_OP_MANGLE_DUPEWORD_TIMES:
22074 NEXT_RULEPOS (rule_pos);
22075 NEXT_RPTOI (rule, rule_pos, ulen);
22076 out_len = mangle_double_times (out, out_len, ulen);
22077 break;
22078
22079 case RULE_OP_MANGLE_REFLECT:
22080 out_len = mangle_reflect (out, out_len);
22081 break;
22082
22083 case RULE_OP_MANGLE_ROTATE_LEFT:
22084 mangle_rotate_left (out, out_len);
22085 break;
22086
22087 case RULE_OP_MANGLE_ROTATE_RIGHT:
22088 mangle_rotate_right (out, out_len);
22089 break;
22090
22091 case RULE_OP_MANGLE_APPEND:
22092 NEXT_RULEPOS (rule_pos);
22093 out_len = mangle_append (out, out_len, rule[rule_pos]);
22094 break;
22095
22096 case RULE_OP_MANGLE_PREPEND:
22097 NEXT_RULEPOS (rule_pos);
22098 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
22099 break;
22100
22101 case RULE_OP_MANGLE_DELETE_FIRST:
22102 out_len = mangle_delete_at (out, out_len, 0);
22103 break;
22104
22105 case RULE_OP_MANGLE_DELETE_LAST:
22106 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
22107 break;
22108
22109 case RULE_OP_MANGLE_DELETE_AT:
22110 NEXT_RULEPOS (rule_pos);
22111 NEXT_RPTOI (rule, rule_pos, upos);
22112 out_len = mangle_delete_at (out, out_len, upos);
22113 break;
22114
22115 case RULE_OP_MANGLE_EXTRACT:
22116 NEXT_RULEPOS (rule_pos);
22117 NEXT_RPTOI (rule, rule_pos, upos);
22118 NEXT_RULEPOS (rule_pos);
22119 NEXT_RPTOI (rule, rule_pos, ulen);
22120 out_len = mangle_extract (out, out_len, upos, ulen);
22121 break;
22122
22123 case RULE_OP_MANGLE_OMIT:
22124 NEXT_RULEPOS (rule_pos);
22125 NEXT_RPTOI (rule, rule_pos, upos);
22126 NEXT_RULEPOS (rule_pos);
22127 NEXT_RPTOI (rule, rule_pos, ulen);
22128 out_len = mangle_omit (out, out_len, upos, ulen);
22129 break;
22130
22131 case RULE_OP_MANGLE_INSERT:
22132 NEXT_RULEPOS (rule_pos);
22133 NEXT_RPTOI (rule, rule_pos, upos);
22134 NEXT_RULEPOS (rule_pos);
22135 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
22136 break;
22137
22138 case RULE_OP_MANGLE_OVERSTRIKE:
22139 NEXT_RULEPOS (rule_pos);
22140 NEXT_RPTOI (rule, rule_pos, upos);
22141 NEXT_RULEPOS (rule_pos);
22142 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
22143 break;
22144
22145 case RULE_OP_MANGLE_TRUNCATE_AT:
22146 NEXT_RULEPOS (rule_pos);
22147 NEXT_RPTOI (rule, rule_pos, upos);
22148 out_len = mangle_truncate_at (out, out_len, upos);
22149 break;
22150
22151 case RULE_OP_MANGLE_REPLACE:
22152 NEXT_RULEPOS (rule_pos);
22153 NEXT_RULEPOS (rule_pos);
22154 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
22155 break;
22156
22157 case RULE_OP_MANGLE_PURGECHAR:
22158 NEXT_RULEPOS (rule_pos);
22159 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
22160 break;
22161
22162 case RULE_OP_MANGLE_TOGGLECASE_REC:
22163 /* todo */
22164 break;
22165
22166 case RULE_OP_MANGLE_DUPECHAR_FIRST:
22167 NEXT_RULEPOS (rule_pos);
22168 NEXT_RPTOI (rule, rule_pos, ulen);
22169 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
22170 break;
22171
22172 case RULE_OP_MANGLE_DUPECHAR_LAST:
22173 NEXT_RULEPOS (rule_pos);
22174 NEXT_RPTOI (rule, rule_pos, ulen);
22175 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
22176 break;
22177
22178 case RULE_OP_MANGLE_DUPECHAR_ALL:
22179 out_len = mangle_dupechar (out, out_len);
22180 break;
22181
22182 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
22183 NEXT_RULEPOS (rule_pos);
22184 NEXT_RPTOI (rule, rule_pos, ulen);
22185 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
22186 break;
22187
22188 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
22189 NEXT_RULEPOS (rule_pos);
22190 NEXT_RPTOI (rule, rule_pos, ulen);
22191 out_len = mangle_dupeblock_append (out, out_len, ulen);
22192 break;
22193
22194 case RULE_OP_MANGLE_SWITCH_FIRST:
22195 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
22196 break;
22197
22198 case RULE_OP_MANGLE_SWITCH_LAST:
22199 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
22200 break;
22201
22202 case RULE_OP_MANGLE_SWITCH_AT:
22203 NEXT_RULEPOS (rule_pos);
22204 NEXT_RPTOI (rule, rule_pos, upos);
22205 NEXT_RULEPOS (rule_pos);
22206 NEXT_RPTOI (rule, rule_pos, upos2);
22207 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
22208 break;
22209
22210 case RULE_OP_MANGLE_CHR_SHIFTL:
22211 NEXT_RULEPOS (rule_pos);
22212 NEXT_RPTOI (rule, rule_pos, upos);
22213 mangle_chr_shiftl (out, out_len, upos);
22214 break;
22215
22216 case RULE_OP_MANGLE_CHR_SHIFTR:
22217 NEXT_RULEPOS (rule_pos);
22218 NEXT_RPTOI (rule, rule_pos, upos);
22219 mangle_chr_shiftr (out, out_len, upos);
22220 break;
22221
22222 case RULE_OP_MANGLE_CHR_INCR:
22223 NEXT_RULEPOS (rule_pos);
22224 NEXT_RPTOI (rule, rule_pos, upos);
22225 mangle_chr_incr (out, out_len, upos);
22226 break;
22227
22228 case RULE_OP_MANGLE_CHR_DECR:
22229 NEXT_RULEPOS (rule_pos);
22230 NEXT_RPTOI (rule, rule_pos, upos);
22231 mangle_chr_decr (out, out_len, upos);
22232 break;
22233
22234 case RULE_OP_MANGLE_REPLACE_NP1:
22235 NEXT_RULEPOS (rule_pos);
22236 NEXT_RPTOI (rule, rule_pos, upos);
22237 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
22238 break;
22239
22240 case RULE_OP_MANGLE_REPLACE_NM1:
22241 NEXT_RULEPOS (rule_pos);
22242 NEXT_RPTOI (rule, rule_pos, upos);
22243 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
22244 break;
22245
22246 case RULE_OP_MANGLE_TITLE:
22247 out_len = mangle_title (out, out_len);
22248 break;
22249
22250 case RULE_OP_MANGLE_EXTRACT_MEMORY:
22251 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22252 NEXT_RULEPOS (rule_pos);
22253 NEXT_RPTOI (rule, rule_pos, upos);
22254 NEXT_RULEPOS (rule_pos);
22255 NEXT_RPTOI (rule, rule_pos, ulen);
22256 NEXT_RULEPOS (rule_pos);
22257 NEXT_RPTOI (rule, rule_pos, upos2);
22258 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
22259 break;
22260
22261 case RULE_OP_MANGLE_APPEND_MEMORY:
22262 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22263 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22264 memcpy (out + out_len, mem, mem_len);
22265 out_len += mem_len;
22266 break;
22267
22268 case RULE_OP_MANGLE_PREPEND_MEMORY:
22269 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22270 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22271 memcpy (mem + mem_len, out, out_len);
22272 out_len += mem_len;
22273 memcpy (out, mem, out_len);
22274 break;
22275
22276 case RULE_OP_MEMORIZE_WORD:
22277 memcpy (mem, out, out_len);
22278 mem_len = out_len;
22279 break;
22280
22281 case RULE_OP_REJECT_LESS:
22282 NEXT_RULEPOS (rule_pos);
22283 NEXT_RPTOI (rule, rule_pos, upos);
22284 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
22285 break;
22286
22287 case RULE_OP_REJECT_GREATER:
22288 NEXT_RULEPOS (rule_pos);
22289 NEXT_RPTOI (rule, rule_pos, upos);
22290 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
22291 break;
22292
22293 case RULE_OP_REJECT_CONTAIN:
22294 NEXT_RULEPOS (rule_pos);
22295 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
22296 break;
22297
22298 case RULE_OP_REJECT_NOT_CONTAIN:
22299 NEXT_RULEPOS (rule_pos);
22300 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
22301 break;
22302
22303 case RULE_OP_REJECT_EQUAL_FIRST:
22304 NEXT_RULEPOS (rule_pos);
22305 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22306 break;
22307
22308 case RULE_OP_REJECT_EQUAL_LAST:
22309 NEXT_RULEPOS (rule_pos);
22310 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22311 break;
22312
22313 case RULE_OP_REJECT_EQUAL_AT:
22314 NEXT_RULEPOS (rule_pos);
22315 NEXT_RPTOI (rule, rule_pos, upos);
22316 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22317 NEXT_RULEPOS (rule_pos);
22318 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22319 break;
22320
22321 case RULE_OP_REJECT_CONTAINS:
22322 NEXT_RULEPOS (rule_pos);
22323 NEXT_RPTOI (rule, rule_pos, upos);
22324 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22325 NEXT_RULEPOS (rule_pos);
22326 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
22327 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
22328 break;
22329
22330 case RULE_OP_REJECT_MEMORY:
22331 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
22332 break;
22333
22334 default:
22335 return (RULE_RC_SYNTAX_ERROR);
22336 break;
22337 }
22338 }
22339
22340 memset (out + out_len, 0, BLOCK_SIZE - out_len);
22341
22342 return (out_len);
22343 }