8cfa46ef9a22fce39ddcf7d6cccef3312f2db26c
[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 OSX
10 #include <stdio.h>
11 #endif
12
13 #include <shared.h>
14 #include <limits.h>
15
16 /**
17 * basic bit handling
18 */
19
20 u32 is_power_of_2(u32 v)
21 {
22 return (v && !(v & (v - 1)));
23 }
24
25 u32 rotl32 (const u32 a, const u32 n)
26 {
27 return ((a << n) | (a >> (32 - n)));
28 }
29
30 u32 rotr32 (const u32 a, const u32 n)
31 {
32 return ((a >> n) | (a << (32 - n)));
33 }
34
35 u64 rotl64 (const u64 a, const u64 n)
36 {
37 return ((a << n) | (a >> (64 - n)));
38 }
39
40 u64 rotr64 (const u64 a, const u64 n)
41 {
42 return ((a >> n) | (a << (64 - n)));
43 }
44
45 u32 byte_swap_32 (const u32 n)
46 {
47 return (n & 0xff000000) >> 24
48 | (n & 0x00ff0000) >> 8
49 | (n & 0x0000ff00) << 8
50 | (n & 0x000000ff) << 24;
51 }
52
53 u64 byte_swap_64 (const u64 n)
54 {
55 return (n & 0xff00000000000000ULL) >> 56
56 | (n & 0x00ff000000000000ULL) >> 40
57 | (n & 0x0000ff0000000000ULL) >> 24
58 | (n & 0x000000ff00000000ULL) >> 8
59 | (n & 0x00000000ff000000ULL) << 8
60 | (n & 0x0000000000ff0000ULL) << 24
61 | (n & 0x000000000000ff00ULL) << 40
62 | (n & 0x00000000000000ffULL) << 56;
63 }
64
65 /**
66 * ciphers for use on cpu
67 */
68
69 #include "cpu-des.c"
70 #include "cpu-aes.c"
71
72 /**
73 * hashes for use on cpu
74 */
75
76 #include "cpu-md5.c"
77 #include "cpu-sha1.c"
78 #include "cpu-sha256.c"
79
80 /**
81 * logging
82 */
83
84 int last_len = 0;
85
86 int log_final (FILE *fp, const char *fmt, va_list ap)
87 {
88 if (last_len)
89 {
90 fputc ('\r', fp);
91
92 for (int i = 0; i < last_len; i++)
93 {
94 fputc (' ', fp);
95 }
96
97 fputc ('\r', fp);
98 }
99
100 char s[4096] = { 0 };
101
102 int max_len = (int) sizeof (s);
103
104 int len = vsnprintf (s, max_len, fmt, ap);
105
106 if (len > max_len) len = max_len;
107
108 fwrite (s, len, 1, fp);
109
110 fflush (fp);
111
112 last_len = len;
113
114 return len;
115 }
116
117 int log_out_nn (FILE *fp, const char *fmt, ...)
118 {
119 if (SUPPRESS_OUTPUT) return 0;
120
121 va_list ap;
122
123 va_start (ap, fmt);
124
125 const int len = log_final (fp, fmt, ap);
126
127 va_end (ap);
128
129 return len;
130 }
131
132 int log_info_nn (const char *fmt, ...)
133 {
134 if (SUPPRESS_OUTPUT) return 0;
135
136 va_list ap;
137
138 va_start (ap, fmt);
139
140 const int len = log_final (stdout, fmt, ap);
141
142 va_end (ap);
143
144 return len;
145 }
146
147 int log_error_nn (const char *fmt, ...)
148 {
149 if (SUPPRESS_OUTPUT) return 0;
150
151 va_list ap;
152
153 va_start (ap, fmt);
154
155 const int len = log_final (stderr, fmt, ap);
156
157 va_end (ap);
158
159 return len;
160 }
161
162 int log_out (FILE *fp, const char *fmt, ...)
163 {
164 if (SUPPRESS_OUTPUT) return 0;
165
166 va_list ap;
167
168 va_start (ap, fmt);
169
170 const int len = log_final (fp, fmt, ap);
171
172 va_end (ap);
173
174 fputc ('\n', fp);
175
176 last_len = 0;
177
178 return len;
179 }
180
181 int log_info (const char *fmt, ...)
182 {
183 if (SUPPRESS_OUTPUT) return 0;
184
185 va_list ap;
186
187 va_start (ap, fmt);
188
189 const int len = log_final (stdout, fmt, ap);
190
191 va_end (ap);
192
193 fputc ('\n', stdout);
194
195 last_len = 0;
196
197 return len;
198 }
199
200 int log_error (const char *fmt, ...)
201 {
202 if (SUPPRESS_OUTPUT) return 0;
203
204 fputc ('\n', stderr);
205 fputc ('\n', stderr);
206
207 va_list ap;
208
209 va_start (ap, fmt);
210
211 const int len = log_final (stderr, fmt, ap);
212
213 va_end (ap);
214
215 fputc ('\n', stderr);
216 fputc ('\n', stderr);
217
218 last_len = 0;
219
220 return len;
221 }
222
223 /**
224 * converter
225 */
226
227 u8 int_to_base32 (const u8 c)
228 {
229 static const u8 tbl[0x20] =
230 {
231 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
232 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
233 };
234
235 return tbl[c];
236 }
237
238 u8 base32_to_int (const u8 c)
239 {
240 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
241 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
242
243 return 0;
244 }
245
246 u8 int_to_itoa32 (const u8 c)
247 {
248 static const u8 tbl[0x20] =
249 {
250 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
251 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
252 };
253
254 return tbl[c];
255 }
256
257 u8 itoa32_to_int (const u8 c)
258 {
259 if ((c >= '0') && (c <= '9')) return c - '0';
260 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
261
262 return 0;
263 }
264
265 u8 int_to_itoa64 (const u8 c)
266 {
267 static const u8 tbl[0x40] =
268 {
269 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
270 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
271 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
272 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
273 };
274
275 return tbl[c];
276 }
277
278 u8 itoa64_to_int (const u8 c)
279 {
280 static const u8 tbl[0x100] =
281 {
282 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
283 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
284 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
285 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
286 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
287 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
288 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
289 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
290 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
291 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
292 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
293 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
294 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
295 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
296 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
297 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
298 };
299
300 return tbl[c];
301 }
302
303 u8 int_to_base64 (const u8 c)
304 {
305 static const u8 tbl[0x40] =
306 {
307 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
308 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
309 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
310 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
311 };
312
313 return tbl[c];
314 }
315
316 u8 base64_to_int (const u8 c)
317 {
318 static const u8 tbl[0x100] =
319 {
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
323 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
324 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
325 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
326 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
327 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
328 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
330 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
331 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
332 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 };
337
338 return tbl[c];
339 }
340
341 u8 int_to_bf64 (const u8 c)
342 {
343 static const u8 tbl[0x40] =
344 {
345 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
346 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
347 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
348 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
349 };
350
351 return tbl[c];
352 }
353
354 u8 bf64_to_int (const u8 c)
355 {
356 static const u8 tbl[0x100] =
357 {
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
361 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
363 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
364 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
365 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
366 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
368 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
370 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 };
375
376 return tbl[c];
377 }
378
379 u8 int_to_lotus64 (const u8 c)
380 {
381 if (c < 10) return '0' + c;
382 else if (c < 36) return 'A' + c - 10;
383 else if (c < 62) return 'a' + c - 36;
384 else if (c == 62) return '+';
385 else if (c == 63) return '/';
386
387 return 0;
388 }
389
390 u8 lotus64_to_int (const u8 c)
391 {
392 if ((c >= '0') && (c <= '9')) return c - '0';
393 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
394 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
395 else if (c == '+') return 62;
396 else if (c == '/') return 63;
397 else
398
399 return 0;
400 }
401
402 int base32_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
403 {
404 const u8 *in_ptr = in_buf;
405
406 u8 *out_ptr = out_buf;
407
408 for (int i = 0; i < in_len; i += 8)
409 {
410 const u8 out_val0 = f (in_ptr[0] & 0x7f);
411 const u8 out_val1 = f (in_ptr[1] & 0x7f);
412 const u8 out_val2 = f (in_ptr[2] & 0x7f);
413 const u8 out_val3 = f (in_ptr[3] & 0x7f);
414 const u8 out_val4 = f (in_ptr[4] & 0x7f);
415 const u8 out_val5 = f (in_ptr[5] & 0x7f);
416 const u8 out_val6 = f (in_ptr[6] & 0x7f);
417 const u8 out_val7 = f (in_ptr[7] & 0x7f);
418
419 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
420 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
421 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
422 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
423 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
424
425 in_ptr += 8;
426 out_ptr += 5;
427 }
428
429 for (int i = 0; i < in_len; i++)
430 {
431 if (in_buf[i] != '=') continue;
432
433 in_len = i;
434 }
435
436 int out_len = (in_len * 5) / 8;
437
438 return out_len;
439 }
440
441 int base32_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
442 {
443 const u8 *in_ptr = in_buf;
444
445 u8 *out_ptr = out_buf;
446
447 for (int i = 0; i < in_len; i += 5)
448 {
449 const u8 out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
450 const u8 out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
451 const u8 out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
452 const u8 out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
453 const u8 out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
454 const u8 out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
455 const u8 out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
456 const u8 out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
457
458 out_ptr[0] = out_val0 & 0x7f;
459 out_ptr[1] = out_val1 & 0x7f;
460 out_ptr[2] = out_val2 & 0x7f;
461 out_ptr[3] = out_val3 & 0x7f;
462 out_ptr[4] = out_val4 & 0x7f;
463 out_ptr[5] = out_val5 & 0x7f;
464 out_ptr[6] = out_val6 & 0x7f;
465 out_ptr[7] = out_val7 & 0x7f;
466
467 in_ptr += 5;
468 out_ptr += 8;
469 }
470
471 int out_len = (int) (((0.5 + (float) in_len) * 8) / 5); // ceil (in_len * 8 / 5)
472
473 while (out_len % 8)
474 {
475 out_buf[out_len] = '=';
476
477 out_len++;
478 }
479
480 return out_len;
481 }
482
483 int base64_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
484 {
485 const u8 *in_ptr = in_buf;
486
487 u8 *out_ptr = out_buf;
488
489 for (int i = 0; i < in_len; i += 4)
490 {
491 const u8 out_val0 = f (in_ptr[0] & 0x7f);
492 const u8 out_val1 = f (in_ptr[1] & 0x7f);
493 const u8 out_val2 = f (in_ptr[2] & 0x7f);
494 const u8 out_val3 = f (in_ptr[3] & 0x7f);
495
496 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
497 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
498 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
499
500 in_ptr += 4;
501 out_ptr += 3;
502 }
503
504 for (int i = 0; i < in_len; i++)
505 {
506 if (in_buf[i] != '=') continue;
507
508 in_len = i;
509 }
510
511 int out_len = (in_len * 6) / 8;
512
513 return out_len;
514 }
515
516 int base64_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
517 {
518 const u8 *in_ptr = in_buf;
519
520 u8 *out_ptr = out_buf;
521
522 for (int i = 0; i < in_len; i += 3)
523 {
524 const u8 out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
525 const u8 out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
526 const u8 out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
527 const u8 out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
528
529 out_ptr[0] = out_val0 & 0x7f;
530 out_ptr[1] = out_val1 & 0x7f;
531 out_ptr[2] = out_val2 & 0x7f;
532 out_ptr[3] = out_val3 & 0x7f;
533
534 in_ptr += 3;
535 out_ptr += 4;
536 }
537
538 int out_len = (int) (((0.5 + (float) in_len) * 8) / 6); // ceil (in_len * 8 / 6)
539
540 while (out_len % 4)
541 {
542 out_buf[out_len] = '=';
543
544 out_len++;
545 }
546
547 return out_len;
548 }
549
550 int is_valid_hex_char (const u8 c)
551 {
552 if ((c >= '0') && (c <= '9')) return 1;
553 if ((c >= 'A') && (c <= 'F')) return 1;
554 if ((c >= 'a') && (c <= 'f')) return 1;
555
556 return 0;
557 }
558
559 u8 hex_convert (const u8 c)
560 {
561 return (c & 15) + (c >> 6) * 9;
562 }
563
564 u8 hex_to_u8 (const u8 hex[2])
565 {
566 u8 v = 0;
567
568 v |= (hex_convert (hex[1]) << 0);
569 v |= (hex_convert (hex[0]) << 4);
570
571 return (v);
572 }
573
574 u32 hex_to_u32 (const u8 hex[8])
575 {
576 u32 v = 0;
577
578 v |= ((u32) hex_convert (hex[7])) << 0;
579 v |= ((u32) hex_convert (hex[6])) << 4;
580 v |= ((u32) hex_convert (hex[5])) << 8;
581 v |= ((u32) hex_convert (hex[4])) << 12;
582 v |= ((u32) hex_convert (hex[3])) << 16;
583 v |= ((u32) hex_convert (hex[2])) << 20;
584 v |= ((u32) hex_convert (hex[1])) << 24;
585 v |= ((u32) hex_convert (hex[0])) << 28;
586
587 return (v);
588 }
589
590 u64 hex_to_u64 (const u8 hex[16])
591 {
592 u64 v = 0;
593
594 v |= ((u64) hex_convert (hex[15]) << 0);
595 v |= ((u64) hex_convert (hex[14]) << 4);
596 v |= ((u64) hex_convert (hex[13]) << 8);
597 v |= ((u64) hex_convert (hex[12]) << 12);
598 v |= ((u64) hex_convert (hex[11]) << 16);
599 v |= ((u64) hex_convert (hex[10]) << 20);
600 v |= ((u64) hex_convert (hex[ 9]) << 24);
601 v |= ((u64) hex_convert (hex[ 8]) << 28);
602 v |= ((u64) hex_convert (hex[ 7]) << 32);
603 v |= ((u64) hex_convert (hex[ 6]) << 36);
604 v |= ((u64) hex_convert (hex[ 5]) << 40);
605 v |= ((u64) hex_convert (hex[ 4]) << 44);
606 v |= ((u64) hex_convert (hex[ 3]) << 48);
607 v |= ((u64) hex_convert (hex[ 2]) << 52);
608 v |= ((u64) hex_convert (hex[ 1]) << 56);
609 v |= ((u64) hex_convert (hex[ 0]) << 60);
610
611 return (v);
612 }
613
614 void bin_to_hex_lower (const u32 v, u8 hex[8])
615 {
616 hex[0] = v >> 28 & 15;
617 hex[1] = v >> 24 & 15;
618 hex[2] = v >> 20 & 15;
619 hex[3] = v >> 16 & 15;
620 hex[4] = v >> 12 & 15;
621 hex[5] = v >> 8 & 15;
622 hex[6] = v >> 4 & 15;
623 hex[7] = v >> 0 & 15;
624
625 u32 add;
626
627 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
628 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
629 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
630 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
631 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
632 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
633 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
634 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
635 }
636
637 /**
638 * decoder
639 */
640
641 static void AES128_decrypt_cbc (const u32 key[4], const u32 iv[4], const u32 in[16], u32 out[16])
642 {
643 AES_KEY skey;
644
645 AES_set_decrypt_key ((const u8 *) key, 128, &skey);
646
647 u32 _iv[4] = { 0 };
648
649 _iv[0] = iv[0];
650 _iv[1] = iv[1];
651 _iv[2] = iv[2];
652 _iv[3] = iv[3];
653
654 for (int i = 0; i < 16; i += 4)
655 {
656 u32 _in[4] = { 0 };
657 u32 _out[4] = { 0 };
658
659 _in[0] = in[i + 0];
660 _in[1] = in[i + 1];
661 _in[2] = in[i + 2];
662 _in[3] = in[i + 3];
663
664 AES_decrypt (&skey, (const u8 *) _in, (u8 *) _out);
665
666 _out[0] ^= _iv[0];
667 _out[1] ^= _iv[1];
668 _out[2] ^= _iv[2];
669 _out[3] ^= _iv[3];
670
671 out[i + 0] = _out[0];
672 out[i + 1] = _out[1];
673 out[i + 2] = _out[2];
674 out[i + 3] = _out[3];
675
676 _iv[0] = _in[0];
677 _iv[1] = _in[1];
678 _iv[2] = _in[2];
679 _iv[3] = _in[3];
680 }
681 }
682
683 static void juniper_decrypt_hash (char *in, char *out)
684 {
685 // base64 decode
686
687 u8 base64_buf[100] = { 0 };
688
689 base64_decode (base64_to_int, (const u8 *) in, DISPLAY_LEN_MIN_501, base64_buf);
690
691 // iv stuff
692
693 u32 juniper_iv[4] = { 0 };
694
695 memcpy (juniper_iv, base64_buf, 12);
696
697 memcpy (out, juniper_iv, 12);
698
699 // reversed key
700
701 u32 juniper_key[4] = { 0 };
702
703 juniper_key[0] = byte_swap_32 (0xa6707a7e);
704 juniper_key[1] = byte_swap_32 (0x8df91059);
705 juniper_key[2] = byte_swap_32 (0xdea70ae5);
706 juniper_key[3] = byte_swap_32 (0x2f9c2442);
707
708 // AES decrypt
709
710 u32 *in_ptr = (u32 *) (base64_buf + 12);
711 u32 *out_ptr = (u32 *) (out + 12);
712
713 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
714 }
715
716 void phpass_decode (u8 digest[16], u8 buf[22])
717 {
718 int l;
719
720 l = itoa64_to_int (buf[ 0]) << 0;
721 l |= itoa64_to_int (buf[ 1]) << 6;
722 l |= itoa64_to_int (buf[ 2]) << 12;
723 l |= itoa64_to_int (buf[ 3]) << 18;
724
725 digest[ 0] = (l >> 0) & 0xff;
726 digest[ 1] = (l >> 8) & 0xff;
727 digest[ 2] = (l >> 16) & 0xff;
728
729 l = itoa64_to_int (buf[ 4]) << 0;
730 l |= itoa64_to_int (buf[ 5]) << 6;
731 l |= itoa64_to_int (buf[ 6]) << 12;
732 l |= itoa64_to_int (buf[ 7]) << 18;
733
734 digest[ 3] = (l >> 0) & 0xff;
735 digest[ 4] = (l >> 8) & 0xff;
736 digest[ 5] = (l >> 16) & 0xff;
737
738 l = itoa64_to_int (buf[ 8]) << 0;
739 l |= itoa64_to_int (buf[ 9]) << 6;
740 l |= itoa64_to_int (buf[10]) << 12;
741 l |= itoa64_to_int (buf[11]) << 18;
742
743 digest[ 6] = (l >> 0) & 0xff;
744 digest[ 7] = (l >> 8) & 0xff;
745 digest[ 8] = (l >> 16) & 0xff;
746
747 l = itoa64_to_int (buf[12]) << 0;
748 l |= itoa64_to_int (buf[13]) << 6;
749 l |= itoa64_to_int (buf[14]) << 12;
750 l |= itoa64_to_int (buf[15]) << 18;
751
752 digest[ 9] = (l >> 0) & 0xff;
753 digest[10] = (l >> 8) & 0xff;
754 digest[11] = (l >> 16) & 0xff;
755
756 l = itoa64_to_int (buf[16]) << 0;
757 l |= itoa64_to_int (buf[17]) << 6;
758 l |= itoa64_to_int (buf[18]) << 12;
759 l |= itoa64_to_int (buf[19]) << 18;
760
761 digest[12] = (l >> 0) & 0xff;
762 digest[13] = (l >> 8) & 0xff;
763 digest[14] = (l >> 16) & 0xff;
764
765 l = itoa64_to_int (buf[20]) << 0;
766 l |= itoa64_to_int (buf[21]) << 6;
767
768 digest[15] = (l >> 0) & 0xff;
769 }
770
771 void phpass_encode (u8 digest[16], u8 buf[22])
772 {
773 int l;
774
775 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
776
777 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
778 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
779 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
780 buf[ 3] = int_to_itoa64 (l & 0x3f);
781
782 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
783
784 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
785 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
786 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
787 buf[ 7] = int_to_itoa64 (l & 0x3f);
788
789 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
790
791 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
792 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
793 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
794 buf[11] = int_to_itoa64 (l & 0x3f);
795
796 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
797
798 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
799 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
800 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
801 buf[15] = int_to_itoa64 (l & 0x3f);
802
803 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
804
805 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
806 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
807 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
808 buf[19] = int_to_itoa64 (l & 0x3f);
809
810 l = (digest[15] << 0);
811
812 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
813 buf[21] = int_to_itoa64 (l & 0x3f);
814 }
815
816 void md5crypt_decode (u8 digest[16], u8 buf[22])
817 {
818 int l;
819
820 l = itoa64_to_int (buf[ 0]) << 0;
821 l |= itoa64_to_int (buf[ 1]) << 6;
822 l |= itoa64_to_int (buf[ 2]) << 12;
823 l |= itoa64_to_int (buf[ 3]) << 18;
824
825 digest[ 0] = (l >> 16) & 0xff;
826 digest[ 6] = (l >> 8) & 0xff;
827 digest[12] = (l >> 0) & 0xff;
828
829 l = itoa64_to_int (buf[ 4]) << 0;
830 l |= itoa64_to_int (buf[ 5]) << 6;
831 l |= itoa64_to_int (buf[ 6]) << 12;
832 l |= itoa64_to_int (buf[ 7]) << 18;
833
834 digest[ 1] = (l >> 16) & 0xff;
835 digest[ 7] = (l >> 8) & 0xff;
836 digest[13] = (l >> 0) & 0xff;
837
838 l = itoa64_to_int (buf[ 8]) << 0;
839 l |= itoa64_to_int (buf[ 9]) << 6;
840 l |= itoa64_to_int (buf[10]) << 12;
841 l |= itoa64_to_int (buf[11]) << 18;
842
843 digest[ 2] = (l >> 16) & 0xff;
844 digest[ 8] = (l >> 8) & 0xff;
845 digest[14] = (l >> 0) & 0xff;
846
847 l = itoa64_to_int (buf[12]) << 0;
848 l |= itoa64_to_int (buf[13]) << 6;
849 l |= itoa64_to_int (buf[14]) << 12;
850 l |= itoa64_to_int (buf[15]) << 18;
851
852 digest[ 3] = (l >> 16) & 0xff;
853 digest[ 9] = (l >> 8) & 0xff;
854 digest[15] = (l >> 0) & 0xff;
855
856 l = itoa64_to_int (buf[16]) << 0;
857 l |= itoa64_to_int (buf[17]) << 6;
858 l |= itoa64_to_int (buf[18]) << 12;
859 l |= itoa64_to_int (buf[19]) << 18;
860
861 digest[ 4] = (l >> 16) & 0xff;
862 digest[10] = (l >> 8) & 0xff;
863 digest[ 5] = (l >> 0) & 0xff;
864
865 l = itoa64_to_int (buf[20]) << 0;
866 l |= itoa64_to_int (buf[21]) << 6;
867
868 digest[11] = (l >> 0) & 0xff;
869 }
870
871 void md5crypt_encode (u8 digest[16], u8 buf[22])
872 {
873 int l;
874
875 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
876
877 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
878 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
879 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
880 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
881
882 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
883
884 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
885 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
886 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
887 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
888
889 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
890
891 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
892 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
893 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
894 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
895
896 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
897
898 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
899 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
900 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
901 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
902
903 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
904
905 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
906 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
907 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
908 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
909
910 l = (digest[11] << 0);
911
912 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
913 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
914 }
915
916 void sha512crypt_decode (u8 digest[64], u8 buf[86])
917 {
918 int l;
919
920 l = itoa64_to_int (buf[ 0]) << 0;
921 l |= itoa64_to_int (buf[ 1]) << 6;
922 l |= itoa64_to_int (buf[ 2]) << 12;
923 l |= itoa64_to_int (buf[ 3]) << 18;
924
925 digest[ 0] = (l >> 16) & 0xff;
926 digest[21] = (l >> 8) & 0xff;
927 digest[42] = (l >> 0) & 0xff;
928
929 l = itoa64_to_int (buf[ 4]) << 0;
930 l |= itoa64_to_int (buf[ 5]) << 6;
931 l |= itoa64_to_int (buf[ 6]) << 12;
932 l |= itoa64_to_int (buf[ 7]) << 18;
933
934 digest[22] = (l >> 16) & 0xff;
935 digest[43] = (l >> 8) & 0xff;
936 digest[ 1] = (l >> 0) & 0xff;
937
938 l = itoa64_to_int (buf[ 8]) << 0;
939 l |= itoa64_to_int (buf[ 9]) << 6;
940 l |= itoa64_to_int (buf[10]) << 12;
941 l |= itoa64_to_int (buf[11]) << 18;
942
943 digest[44] = (l >> 16) & 0xff;
944 digest[ 2] = (l >> 8) & 0xff;
945 digest[23] = (l >> 0) & 0xff;
946
947 l = itoa64_to_int (buf[12]) << 0;
948 l |= itoa64_to_int (buf[13]) << 6;
949 l |= itoa64_to_int (buf[14]) << 12;
950 l |= itoa64_to_int (buf[15]) << 18;
951
952 digest[ 3] = (l >> 16) & 0xff;
953 digest[24] = (l >> 8) & 0xff;
954 digest[45] = (l >> 0) & 0xff;
955
956 l = itoa64_to_int (buf[16]) << 0;
957 l |= itoa64_to_int (buf[17]) << 6;
958 l |= itoa64_to_int (buf[18]) << 12;
959 l |= itoa64_to_int (buf[19]) << 18;
960
961 digest[25] = (l >> 16) & 0xff;
962 digest[46] = (l >> 8) & 0xff;
963 digest[ 4] = (l >> 0) & 0xff;
964
965 l = itoa64_to_int (buf[20]) << 0;
966 l |= itoa64_to_int (buf[21]) << 6;
967 l |= itoa64_to_int (buf[22]) << 12;
968 l |= itoa64_to_int (buf[23]) << 18;
969
970 digest[47] = (l >> 16) & 0xff;
971 digest[ 5] = (l >> 8) & 0xff;
972 digest[26] = (l >> 0) & 0xff;
973
974 l = itoa64_to_int (buf[24]) << 0;
975 l |= itoa64_to_int (buf[25]) << 6;
976 l |= itoa64_to_int (buf[26]) << 12;
977 l |= itoa64_to_int (buf[27]) << 18;
978
979 digest[ 6] = (l >> 16) & 0xff;
980 digest[27] = (l >> 8) & 0xff;
981 digest[48] = (l >> 0) & 0xff;
982
983 l = itoa64_to_int (buf[28]) << 0;
984 l |= itoa64_to_int (buf[29]) << 6;
985 l |= itoa64_to_int (buf[30]) << 12;
986 l |= itoa64_to_int (buf[31]) << 18;
987
988 digest[28] = (l >> 16) & 0xff;
989 digest[49] = (l >> 8) & 0xff;
990 digest[ 7] = (l >> 0) & 0xff;
991
992 l = itoa64_to_int (buf[32]) << 0;
993 l |= itoa64_to_int (buf[33]) << 6;
994 l |= itoa64_to_int (buf[34]) << 12;
995 l |= itoa64_to_int (buf[35]) << 18;
996
997 digest[50] = (l >> 16) & 0xff;
998 digest[ 8] = (l >> 8) & 0xff;
999 digest[29] = (l >> 0) & 0xff;
1000
1001 l = itoa64_to_int (buf[36]) << 0;
1002 l |= itoa64_to_int (buf[37]) << 6;
1003 l |= itoa64_to_int (buf[38]) << 12;
1004 l |= itoa64_to_int (buf[39]) << 18;
1005
1006 digest[ 9] = (l >> 16) & 0xff;
1007 digest[30] = (l >> 8) & 0xff;
1008 digest[51] = (l >> 0) & 0xff;
1009
1010 l = itoa64_to_int (buf[40]) << 0;
1011 l |= itoa64_to_int (buf[41]) << 6;
1012 l |= itoa64_to_int (buf[42]) << 12;
1013 l |= itoa64_to_int (buf[43]) << 18;
1014
1015 digest[31] = (l >> 16) & 0xff;
1016 digest[52] = (l >> 8) & 0xff;
1017 digest[10] = (l >> 0) & 0xff;
1018
1019 l = itoa64_to_int (buf[44]) << 0;
1020 l |= itoa64_to_int (buf[45]) << 6;
1021 l |= itoa64_to_int (buf[46]) << 12;
1022 l |= itoa64_to_int (buf[47]) << 18;
1023
1024 digest[53] = (l >> 16) & 0xff;
1025 digest[11] = (l >> 8) & 0xff;
1026 digest[32] = (l >> 0) & 0xff;
1027
1028 l = itoa64_to_int (buf[48]) << 0;
1029 l |= itoa64_to_int (buf[49]) << 6;
1030 l |= itoa64_to_int (buf[50]) << 12;
1031 l |= itoa64_to_int (buf[51]) << 18;
1032
1033 digest[12] = (l >> 16) & 0xff;
1034 digest[33] = (l >> 8) & 0xff;
1035 digest[54] = (l >> 0) & 0xff;
1036
1037 l = itoa64_to_int (buf[52]) << 0;
1038 l |= itoa64_to_int (buf[53]) << 6;
1039 l |= itoa64_to_int (buf[54]) << 12;
1040 l |= itoa64_to_int (buf[55]) << 18;
1041
1042 digest[34] = (l >> 16) & 0xff;
1043 digest[55] = (l >> 8) & 0xff;
1044 digest[13] = (l >> 0) & 0xff;
1045
1046 l = itoa64_to_int (buf[56]) << 0;
1047 l |= itoa64_to_int (buf[57]) << 6;
1048 l |= itoa64_to_int (buf[58]) << 12;
1049 l |= itoa64_to_int (buf[59]) << 18;
1050
1051 digest[56] = (l >> 16) & 0xff;
1052 digest[14] = (l >> 8) & 0xff;
1053 digest[35] = (l >> 0) & 0xff;
1054
1055 l = itoa64_to_int (buf[60]) << 0;
1056 l |= itoa64_to_int (buf[61]) << 6;
1057 l |= itoa64_to_int (buf[62]) << 12;
1058 l |= itoa64_to_int (buf[63]) << 18;
1059
1060 digest[15] = (l >> 16) & 0xff;
1061 digest[36] = (l >> 8) & 0xff;
1062 digest[57] = (l >> 0) & 0xff;
1063
1064 l = itoa64_to_int (buf[64]) << 0;
1065 l |= itoa64_to_int (buf[65]) << 6;
1066 l |= itoa64_to_int (buf[66]) << 12;
1067 l |= itoa64_to_int (buf[67]) << 18;
1068
1069 digest[37] = (l >> 16) & 0xff;
1070 digest[58] = (l >> 8) & 0xff;
1071 digest[16] = (l >> 0) & 0xff;
1072
1073 l = itoa64_to_int (buf[68]) << 0;
1074 l |= itoa64_to_int (buf[69]) << 6;
1075 l |= itoa64_to_int (buf[70]) << 12;
1076 l |= itoa64_to_int (buf[71]) << 18;
1077
1078 digest[59] = (l >> 16) & 0xff;
1079 digest[17] = (l >> 8) & 0xff;
1080 digest[38] = (l >> 0) & 0xff;
1081
1082 l = itoa64_to_int (buf[72]) << 0;
1083 l |= itoa64_to_int (buf[73]) << 6;
1084 l |= itoa64_to_int (buf[74]) << 12;
1085 l |= itoa64_to_int (buf[75]) << 18;
1086
1087 digest[18] = (l >> 16) & 0xff;
1088 digest[39] = (l >> 8) & 0xff;
1089 digest[60] = (l >> 0) & 0xff;
1090
1091 l = itoa64_to_int (buf[76]) << 0;
1092 l |= itoa64_to_int (buf[77]) << 6;
1093 l |= itoa64_to_int (buf[78]) << 12;
1094 l |= itoa64_to_int (buf[79]) << 18;
1095
1096 digest[40] = (l >> 16) & 0xff;
1097 digest[61] = (l >> 8) & 0xff;
1098 digest[19] = (l >> 0) & 0xff;
1099
1100 l = itoa64_to_int (buf[80]) << 0;
1101 l |= itoa64_to_int (buf[81]) << 6;
1102 l |= itoa64_to_int (buf[82]) << 12;
1103 l |= itoa64_to_int (buf[83]) << 18;
1104
1105 digest[62] = (l >> 16) & 0xff;
1106 digest[20] = (l >> 8) & 0xff;
1107 digest[41] = (l >> 0) & 0xff;
1108
1109 l = itoa64_to_int (buf[84]) << 0;
1110 l |= itoa64_to_int (buf[85]) << 6;
1111
1112 digest[63] = (l >> 0) & 0xff;
1113 }
1114
1115 void sha512crypt_encode (u8 digest[64], u8 buf[86])
1116 {
1117 int l;
1118
1119 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1120
1121 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1122 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1123 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1124 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1125
1126 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1127
1128 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1129 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1130 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1131 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1132
1133 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1134
1135 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1136 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1137 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1138 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1139
1140 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1141
1142 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1143 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1144 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1145 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1146
1147 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1148
1149 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1150 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1151 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1152 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1153
1154 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1155
1156 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1157 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1158 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1159 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1160
1161 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1162
1163 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1164 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1165 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1166 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1167
1168 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1169
1170 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1171 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1172 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1173 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1174
1175 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1176
1177 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1178 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1179 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1180 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1181
1182 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1183
1184 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1185 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1186 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1187 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1188
1189 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1190
1191 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1192 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1193 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1194 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1195
1196 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1197
1198 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1199 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1200 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1201 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1202
1203 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1204
1205 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1206 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1207 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1208 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1209
1210 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1211
1212 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1213 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1214 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1215 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1216
1217 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1218
1219 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1220 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1221 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1222 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1223
1224 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1225
1226 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1227 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1228 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1229 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1230
1231 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1232
1233 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1234 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1235 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1236 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1237
1238 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1239
1240 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1241 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1242 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1243 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1244
1245 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1246
1247 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1248 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1249 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1250 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1251
1252 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1253
1254 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1255 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1256 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1257 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1258
1259 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1260
1261 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1262 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1263 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1264 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1265
1266 l = 0 | 0 | (digest[63] << 0);
1267
1268 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1269 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1270 }
1271
1272 void sha1aix_decode (u8 digest[20], u8 buf[27])
1273 {
1274 int l;
1275
1276 l = itoa64_to_int (buf[ 0]) << 0;
1277 l |= itoa64_to_int (buf[ 1]) << 6;
1278 l |= itoa64_to_int (buf[ 2]) << 12;
1279 l |= itoa64_to_int (buf[ 3]) << 18;
1280
1281 digest[ 2] = (l >> 0) & 0xff;
1282 digest[ 1] = (l >> 8) & 0xff;
1283 digest[ 0] = (l >> 16) & 0xff;
1284
1285 l = itoa64_to_int (buf[ 4]) << 0;
1286 l |= itoa64_to_int (buf[ 5]) << 6;
1287 l |= itoa64_to_int (buf[ 6]) << 12;
1288 l |= itoa64_to_int (buf[ 7]) << 18;
1289
1290 digest[ 5] = (l >> 0) & 0xff;
1291 digest[ 4] = (l >> 8) & 0xff;
1292 digest[ 3] = (l >> 16) & 0xff;
1293
1294 l = itoa64_to_int (buf[ 8]) << 0;
1295 l |= itoa64_to_int (buf[ 9]) << 6;
1296 l |= itoa64_to_int (buf[10]) << 12;
1297 l |= itoa64_to_int (buf[11]) << 18;
1298
1299 digest[ 8] = (l >> 0) & 0xff;
1300 digest[ 7] = (l >> 8) & 0xff;
1301 digest[ 6] = (l >> 16) & 0xff;
1302
1303 l = itoa64_to_int (buf[12]) << 0;
1304 l |= itoa64_to_int (buf[13]) << 6;
1305 l |= itoa64_to_int (buf[14]) << 12;
1306 l |= itoa64_to_int (buf[15]) << 18;
1307
1308 digest[11] = (l >> 0) & 0xff;
1309 digest[10] = (l >> 8) & 0xff;
1310 digest[ 9] = (l >> 16) & 0xff;
1311
1312 l = itoa64_to_int (buf[16]) << 0;
1313 l |= itoa64_to_int (buf[17]) << 6;
1314 l |= itoa64_to_int (buf[18]) << 12;
1315 l |= itoa64_to_int (buf[19]) << 18;
1316
1317 digest[14] = (l >> 0) & 0xff;
1318 digest[13] = (l >> 8) & 0xff;
1319 digest[12] = (l >> 16) & 0xff;
1320
1321 l = itoa64_to_int (buf[20]) << 0;
1322 l |= itoa64_to_int (buf[21]) << 6;
1323 l |= itoa64_to_int (buf[22]) << 12;
1324 l |= itoa64_to_int (buf[23]) << 18;
1325
1326 digest[17] = (l >> 0) & 0xff;
1327 digest[16] = (l >> 8) & 0xff;
1328 digest[15] = (l >> 16) & 0xff;
1329
1330 l = itoa64_to_int (buf[24]) << 0;
1331 l |= itoa64_to_int (buf[25]) << 6;
1332 l |= itoa64_to_int (buf[26]) << 12;
1333
1334 digest[19] = (l >> 8) & 0xff;
1335 digest[18] = (l >> 16) & 0xff;
1336 }
1337
1338 void sha1aix_encode (u8 digest[20], u8 buf[27])
1339 {
1340 int l;
1341
1342 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1343
1344 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1345 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1346 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1347 buf[ 3] = int_to_itoa64 (l & 0x3f);
1348
1349 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1350
1351 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1352 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1353 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1354 buf[ 7] = int_to_itoa64 (l & 0x3f);
1355
1356 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1357
1358 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1359 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1360 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1361 buf[11] = int_to_itoa64 (l & 0x3f);
1362
1363 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1364
1365 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1366 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1367 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1368 buf[15] = int_to_itoa64 (l & 0x3f);
1369
1370 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1371
1372 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1373 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1374 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1375 buf[19] = int_to_itoa64 (l & 0x3f);
1376
1377 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1378
1379 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1380 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1381 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1382 buf[23] = int_to_itoa64 (l & 0x3f);
1383
1384 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1385
1386 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1387 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1388 buf[26] = int_to_itoa64 (l & 0x3f);
1389 }
1390
1391 void sha256aix_decode (u8 digest[32], u8 buf[43])
1392 {
1393 int l;
1394
1395 l = itoa64_to_int (buf[ 0]) << 0;
1396 l |= itoa64_to_int (buf[ 1]) << 6;
1397 l |= itoa64_to_int (buf[ 2]) << 12;
1398 l |= itoa64_to_int (buf[ 3]) << 18;
1399
1400 digest[ 2] = (l >> 0) & 0xff;
1401 digest[ 1] = (l >> 8) & 0xff;
1402 digest[ 0] = (l >> 16) & 0xff;
1403
1404 l = itoa64_to_int (buf[ 4]) << 0;
1405 l |= itoa64_to_int (buf[ 5]) << 6;
1406 l |= itoa64_to_int (buf[ 6]) << 12;
1407 l |= itoa64_to_int (buf[ 7]) << 18;
1408
1409 digest[ 5] = (l >> 0) & 0xff;
1410 digest[ 4] = (l >> 8) & 0xff;
1411 digest[ 3] = (l >> 16) & 0xff;
1412
1413 l = itoa64_to_int (buf[ 8]) << 0;
1414 l |= itoa64_to_int (buf[ 9]) << 6;
1415 l |= itoa64_to_int (buf[10]) << 12;
1416 l |= itoa64_to_int (buf[11]) << 18;
1417
1418 digest[ 8] = (l >> 0) & 0xff;
1419 digest[ 7] = (l >> 8) & 0xff;
1420 digest[ 6] = (l >> 16) & 0xff;
1421
1422 l = itoa64_to_int (buf[12]) << 0;
1423 l |= itoa64_to_int (buf[13]) << 6;
1424 l |= itoa64_to_int (buf[14]) << 12;
1425 l |= itoa64_to_int (buf[15]) << 18;
1426
1427 digest[11] = (l >> 0) & 0xff;
1428 digest[10] = (l >> 8) & 0xff;
1429 digest[ 9] = (l >> 16) & 0xff;
1430
1431 l = itoa64_to_int (buf[16]) << 0;
1432 l |= itoa64_to_int (buf[17]) << 6;
1433 l |= itoa64_to_int (buf[18]) << 12;
1434 l |= itoa64_to_int (buf[19]) << 18;
1435
1436 digest[14] = (l >> 0) & 0xff;
1437 digest[13] = (l >> 8) & 0xff;
1438 digest[12] = (l >> 16) & 0xff;
1439
1440 l = itoa64_to_int (buf[20]) << 0;
1441 l |= itoa64_to_int (buf[21]) << 6;
1442 l |= itoa64_to_int (buf[22]) << 12;
1443 l |= itoa64_to_int (buf[23]) << 18;
1444
1445 digest[17] = (l >> 0) & 0xff;
1446 digest[16] = (l >> 8) & 0xff;
1447 digest[15] = (l >> 16) & 0xff;
1448
1449 l = itoa64_to_int (buf[24]) << 0;
1450 l |= itoa64_to_int (buf[25]) << 6;
1451 l |= itoa64_to_int (buf[26]) << 12;
1452 l |= itoa64_to_int (buf[27]) << 18;
1453
1454 digest[20] = (l >> 0) & 0xff;
1455 digest[19] = (l >> 8) & 0xff;
1456 digest[18] = (l >> 16) & 0xff;
1457
1458 l = itoa64_to_int (buf[28]) << 0;
1459 l |= itoa64_to_int (buf[29]) << 6;
1460 l |= itoa64_to_int (buf[30]) << 12;
1461 l |= itoa64_to_int (buf[31]) << 18;
1462
1463 digest[23] = (l >> 0) & 0xff;
1464 digest[22] = (l >> 8) & 0xff;
1465 digest[21] = (l >> 16) & 0xff;
1466
1467 l = itoa64_to_int (buf[32]) << 0;
1468 l |= itoa64_to_int (buf[33]) << 6;
1469 l |= itoa64_to_int (buf[34]) << 12;
1470 l |= itoa64_to_int (buf[35]) << 18;
1471
1472 digest[26] = (l >> 0) & 0xff;
1473 digest[25] = (l >> 8) & 0xff;
1474 digest[24] = (l >> 16) & 0xff;
1475
1476 l = itoa64_to_int (buf[36]) << 0;
1477 l |= itoa64_to_int (buf[37]) << 6;
1478 l |= itoa64_to_int (buf[38]) << 12;
1479 l |= itoa64_to_int (buf[39]) << 18;
1480
1481 digest[29] = (l >> 0) & 0xff;
1482 digest[28] = (l >> 8) & 0xff;
1483 digest[27] = (l >> 16) & 0xff;
1484
1485 l = itoa64_to_int (buf[40]) << 0;
1486 l |= itoa64_to_int (buf[41]) << 6;
1487 l |= itoa64_to_int (buf[42]) << 12;
1488
1489 //digest[32] = (l >> 0) & 0xff;
1490 digest[31] = (l >> 8) & 0xff;
1491 digest[30] = (l >> 16) & 0xff;
1492 }
1493
1494 void sha256aix_encode (u8 digest[32], u8 buf[43])
1495 {
1496 int l;
1497
1498 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1499
1500 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1501 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1502 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1503 buf[ 3] = int_to_itoa64 (l & 0x3f);
1504
1505 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1506
1507 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1508 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1509 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1510 buf[ 7] = int_to_itoa64 (l & 0x3f);
1511
1512 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1513
1514 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1515 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1516 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1517 buf[11] = int_to_itoa64 (l & 0x3f);
1518
1519 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1520
1521 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1522 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1523 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1524 buf[15] = int_to_itoa64 (l & 0x3f);
1525
1526 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1527
1528 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1529 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1530 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1531 buf[19] = int_to_itoa64 (l & 0x3f);
1532
1533 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1534
1535 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1536 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1537 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1538 buf[23] = int_to_itoa64 (l & 0x3f);
1539
1540 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1541
1542 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1543 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1544 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1545 buf[27] = int_to_itoa64 (l & 0x3f);
1546
1547 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1548
1549 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1550 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1551 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1552 buf[31] = int_to_itoa64 (l & 0x3f);
1553
1554 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1555
1556 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1557 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1558 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1559 buf[35] = int_to_itoa64 (l & 0x3f);
1560
1561 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1562
1563 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1564 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1565 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1566 buf[39] = int_to_itoa64 (l & 0x3f);
1567
1568 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1569
1570 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1571 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1572 buf[42] = int_to_itoa64 (l & 0x3f);
1573 }
1574
1575 void sha512aix_decode (u8 digest[64], u8 buf[86])
1576 {
1577 int l;
1578
1579 l = itoa64_to_int (buf[ 0]) << 0;
1580 l |= itoa64_to_int (buf[ 1]) << 6;
1581 l |= itoa64_to_int (buf[ 2]) << 12;
1582 l |= itoa64_to_int (buf[ 3]) << 18;
1583
1584 digest[ 2] = (l >> 0) & 0xff;
1585 digest[ 1] = (l >> 8) & 0xff;
1586 digest[ 0] = (l >> 16) & 0xff;
1587
1588 l = itoa64_to_int (buf[ 4]) << 0;
1589 l |= itoa64_to_int (buf[ 5]) << 6;
1590 l |= itoa64_to_int (buf[ 6]) << 12;
1591 l |= itoa64_to_int (buf[ 7]) << 18;
1592
1593 digest[ 5] = (l >> 0) & 0xff;
1594 digest[ 4] = (l >> 8) & 0xff;
1595 digest[ 3] = (l >> 16) & 0xff;
1596
1597 l = itoa64_to_int (buf[ 8]) << 0;
1598 l |= itoa64_to_int (buf[ 9]) << 6;
1599 l |= itoa64_to_int (buf[10]) << 12;
1600 l |= itoa64_to_int (buf[11]) << 18;
1601
1602 digest[ 8] = (l >> 0) & 0xff;
1603 digest[ 7] = (l >> 8) & 0xff;
1604 digest[ 6] = (l >> 16) & 0xff;
1605
1606 l = itoa64_to_int (buf[12]) << 0;
1607 l |= itoa64_to_int (buf[13]) << 6;
1608 l |= itoa64_to_int (buf[14]) << 12;
1609 l |= itoa64_to_int (buf[15]) << 18;
1610
1611 digest[11] = (l >> 0) & 0xff;
1612 digest[10] = (l >> 8) & 0xff;
1613 digest[ 9] = (l >> 16) & 0xff;
1614
1615 l = itoa64_to_int (buf[16]) << 0;
1616 l |= itoa64_to_int (buf[17]) << 6;
1617 l |= itoa64_to_int (buf[18]) << 12;
1618 l |= itoa64_to_int (buf[19]) << 18;
1619
1620 digest[14] = (l >> 0) & 0xff;
1621 digest[13] = (l >> 8) & 0xff;
1622 digest[12] = (l >> 16) & 0xff;
1623
1624 l = itoa64_to_int (buf[20]) << 0;
1625 l |= itoa64_to_int (buf[21]) << 6;
1626 l |= itoa64_to_int (buf[22]) << 12;
1627 l |= itoa64_to_int (buf[23]) << 18;
1628
1629 digest[17] = (l >> 0) & 0xff;
1630 digest[16] = (l >> 8) & 0xff;
1631 digest[15] = (l >> 16) & 0xff;
1632
1633 l = itoa64_to_int (buf[24]) << 0;
1634 l |= itoa64_to_int (buf[25]) << 6;
1635 l |= itoa64_to_int (buf[26]) << 12;
1636 l |= itoa64_to_int (buf[27]) << 18;
1637
1638 digest[20] = (l >> 0) & 0xff;
1639 digest[19] = (l >> 8) & 0xff;
1640 digest[18] = (l >> 16) & 0xff;
1641
1642 l = itoa64_to_int (buf[28]) << 0;
1643 l |= itoa64_to_int (buf[29]) << 6;
1644 l |= itoa64_to_int (buf[30]) << 12;
1645 l |= itoa64_to_int (buf[31]) << 18;
1646
1647 digest[23] = (l >> 0) & 0xff;
1648 digest[22] = (l >> 8) & 0xff;
1649 digest[21] = (l >> 16) & 0xff;
1650
1651 l = itoa64_to_int (buf[32]) << 0;
1652 l |= itoa64_to_int (buf[33]) << 6;
1653 l |= itoa64_to_int (buf[34]) << 12;
1654 l |= itoa64_to_int (buf[35]) << 18;
1655
1656 digest[26] = (l >> 0) & 0xff;
1657 digest[25] = (l >> 8) & 0xff;
1658 digest[24] = (l >> 16) & 0xff;
1659
1660 l = itoa64_to_int (buf[36]) << 0;
1661 l |= itoa64_to_int (buf[37]) << 6;
1662 l |= itoa64_to_int (buf[38]) << 12;
1663 l |= itoa64_to_int (buf[39]) << 18;
1664
1665 digest[29] = (l >> 0) & 0xff;
1666 digest[28] = (l >> 8) & 0xff;
1667 digest[27] = (l >> 16) & 0xff;
1668
1669 l = itoa64_to_int (buf[40]) << 0;
1670 l |= itoa64_to_int (buf[41]) << 6;
1671 l |= itoa64_to_int (buf[42]) << 12;
1672 l |= itoa64_to_int (buf[43]) << 18;
1673
1674 digest[32] = (l >> 0) & 0xff;
1675 digest[31] = (l >> 8) & 0xff;
1676 digest[30] = (l >> 16) & 0xff;
1677
1678 l = itoa64_to_int (buf[44]) << 0;
1679 l |= itoa64_to_int (buf[45]) << 6;
1680 l |= itoa64_to_int (buf[46]) << 12;
1681 l |= itoa64_to_int (buf[47]) << 18;
1682
1683 digest[35] = (l >> 0) & 0xff;
1684 digest[34] = (l >> 8) & 0xff;
1685 digest[33] = (l >> 16) & 0xff;
1686
1687 l = itoa64_to_int (buf[48]) << 0;
1688 l |= itoa64_to_int (buf[49]) << 6;
1689 l |= itoa64_to_int (buf[50]) << 12;
1690 l |= itoa64_to_int (buf[51]) << 18;
1691
1692 digest[38] = (l >> 0) & 0xff;
1693 digest[37] = (l >> 8) & 0xff;
1694 digest[36] = (l >> 16) & 0xff;
1695
1696 l = itoa64_to_int (buf[52]) << 0;
1697 l |= itoa64_to_int (buf[53]) << 6;
1698 l |= itoa64_to_int (buf[54]) << 12;
1699 l |= itoa64_to_int (buf[55]) << 18;
1700
1701 digest[41] = (l >> 0) & 0xff;
1702 digest[40] = (l >> 8) & 0xff;
1703 digest[39] = (l >> 16) & 0xff;
1704
1705 l = itoa64_to_int (buf[56]) << 0;
1706 l |= itoa64_to_int (buf[57]) << 6;
1707 l |= itoa64_to_int (buf[58]) << 12;
1708 l |= itoa64_to_int (buf[59]) << 18;
1709
1710 digest[44] = (l >> 0) & 0xff;
1711 digest[43] = (l >> 8) & 0xff;
1712 digest[42] = (l >> 16) & 0xff;
1713
1714 l = itoa64_to_int (buf[60]) << 0;
1715 l |= itoa64_to_int (buf[61]) << 6;
1716 l |= itoa64_to_int (buf[62]) << 12;
1717 l |= itoa64_to_int (buf[63]) << 18;
1718
1719 digest[47] = (l >> 0) & 0xff;
1720 digest[46] = (l >> 8) & 0xff;
1721 digest[45] = (l >> 16) & 0xff;
1722
1723 l = itoa64_to_int (buf[64]) << 0;
1724 l |= itoa64_to_int (buf[65]) << 6;
1725 l |= itoa64_to_int (buf[66]) << 12;
1726 l |= itoa64_to_int (buf[67]) << 18;
1727
1728 digest[50] = (l >> 0) & 0xff;
1729 digest[49] = (l >> 8) & 0xff;
1730 digest[48] = (l >> 16) & 0xff;
1731
1732 l = itoa64_to_int (buf[68]) << 0;
1733 l |= itoa64_to_int (buf[69]) << 6;
1734 l |= itoa64_to_int (buf[70]) << 12;
1735 l |= itoa64_to_int (buf[71]) << 18;
1736
1737 digest[53] = (l >> 0) & 0xff;
1738 digest[52] = (l >> 8) & 0xff;
1739 digest[51] = (l >> 16) & 0xff;
1740
1741 l = itoa64_to_int (buf[72]) << 0;
1742 l |= itoa64_to_int (buf[73]) << 6;
1743 l |= itoa64_to_int (buf[74]) << 12;
1744 l |= itoa64_to_int (buf[75]) << 18;
1745
1746 digest[56] = (l >> 0) & 0xff;
1747 digest[55] = (l >> 8) & 0xff;
1748 digest[54] = (l >> 16) & 0xff;
1749
1750 l = itoa64_to_int (buf[76]) << 0;
1751 l |= itoa64_to_int (buf[77]) << 6;
1752 l |= itoa64_to_int (buf[78]) << 12;
1753 l |= itoa64_to_int (buf[79]) << 18;
1754
1755 digest[59] = (l >> 0) & 0xff;
1756 digest[58] = (l >> 8) & 0xff;
1757 digest[57] = (l >> 16) & 0xff;
1758
1759 l = itoa64_to_int (buf[80]) << 0;
1760 l |= itoa64_to_int (buf[81]) << 6;
1761 l |= itoa64_to_int (buf[82]) << 12;
1762 l |= itoa64_to_int (buf[83]) << 18;
1763
1764 digest[62] = (l >> 0) & 0xff;
1765 digest[61] = (l >> 8) & 0xff;
1766 digest[60] = (l >> 16) & 0xff;
1767
1768 l = itoa64_to_int (buf[84]) << 0;
1769 l |= itoa64_to_int (buf[85]) << 6;
1770
1771 digest[63] = (l >> 16) & 0xff;
1772 }
1773
1774 void sha512aix_encode (u8 digest[64], u8 buf[86])
1775 {
1776 int l;
1777
1778 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1779
1780 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1781 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1782 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1783 buf[ 3] = int_to_itoa64 (l & 0x3f);
1784
1785 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1786
1787 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1788 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1789 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1790 buf[ 7] = int_to_itoa64 (l & 0x3f);
1791
1792 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1793
1794 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1795 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1796 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1797 buf[11] = int_to_itoa64 (l & 0x3f);
1798
1799 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1800
1801 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1802 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1803 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1804 buf[15] = int_to_itoa64 (l & 0x3f);
1805
1806 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1807
1808 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1809 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1810 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1811 buf[19] = int_to_itoa64 (l & 0x3f);
1812
1813 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1814
1815 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1816 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1817 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1818 buf[23] = int_to_itoa64 (l & 0x3f);
1819
1820 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1821
1822 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1823 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1824 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1825 buf[27] = int_to_itoa64 (l & 0x3f);
1826
1827 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1828
1829 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1830 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1831 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1832 buf[31] = int_to_itoa64 (l & 0x3f);
1833
1834 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1835
1836 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1837 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1838 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1839 buf[35] = int_to_itoa64 (l & 0x3f);
1840
1841 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1842
1843 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1844 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1845 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1846 buf[39] = int_to_itoa64 (l & 0x3f);
1847
1848 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1849
1850 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1851 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1852 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1853 buf[43] = int_to_itoa64 (l & 0x3f);
1854
1855 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1856
1857 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1858 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1859 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1860 buf[47] = int_to_itoa64 (l & 0x3f);
1861
1862 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1863
1864 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1865 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1866 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1867 buf[51] = int_to_itoa64 (l & 0x3f);
1868
1869 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1870
1871 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1872 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1873 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1874 buf[55] = int_to_itoa64 (l & 0x3f);
1875
1876 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1877
1878 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1879 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1880 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1881 buf[59] = int_to_itoa64 (l & 0x3f);
1882
1883 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1884
1885 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1886 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1887 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1888 buf[63] = int_to_itoa64 (l & 0x3f);
1889
1890 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1891
1892 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1893 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1894 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1895 buf[67] = int_to_itoa64 (l & 0x3f);
1896
1897 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1898
1899 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1900 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1901 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1902 buf[71] = int_to_itoa64 (l & 0x3f);
1903
1904 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1905
1906 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1907 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1908 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1909 buf[75] = int_to_itoa64 (l & 0x3f);
1910
1911 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1912
1913 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1914 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1915 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1916 buf[79] = int_to_itoa64 (l & 0x3f);
1917
1918 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1919
1920 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1921 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1922 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1923 buf[83] = int_to_itoa64 (l & 0x3f);
1924
1925 l = 0 | 0 | (digest[63] << 16);
1926
1927 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1928 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1929 }
1930
1931 void sha256crypt_decode (u8 digest[32], u8 buf[43])
1932 {
1933 int l;
1934
1935 l = itoa64_to_int (buf[ 0]) << 0;
1936 l |= itoa64_to_int (buf[ 1]) << 6;
1937 l |= itoa64_to_int (buf[ 2]) << 12;
1938 l |= itoa64_to_int (buf[ 3]) << 18;
1939
1940 digest[ 0] = (l >> 16) & 0xff;
1941 digest[10] = (l >> 8) & 0xff;
1942 digest[20] = (l >> 0) & 0xff;
1943
1944 l = itoa64_to_int (buf[ 4]) << 0;
1945 l |= itoa64_to_int (buf[ 5]) << 6;
1946 l |= itoa64_to_int (buf[ 6]) << 12;
1947 l |= itoa64_to_int (buf[ 7]) << 18;
1948
1949 digest[21] = (l >> 16) & 0xff;
1950 digest[ 1] = (l >> 8) & 0xff;
1951 digest[11] = (l >> 0) & 0xff;
1952
1953 l = itoa64_to_int (buf[ 8]) << 0;
1954 l |= itoa64_to_int (buf[ 9]) << 6;
1955 l |= itoa64_to_int (buf[10]) << 12;
1956 l |= itoa64_to_int (buf[11]) << 18;
1957
1958 digest[12] = (l >> 16) & 0xff;
1959 digest[22] = (l >> 8) & 0xff;
1960 digest[ 2] = (l >> 0) & 0xff;
1961
1962 l = itoa64_to_int (buf[12]) << 0;
1963 l |= itoa64_to_int (buf[13]) << 6;
1964 l |= itoa64_to_int (buf[14]) << 12;
1965 l |= itoa64_to_int (buf[15]) << 18;
1966
1967 digest[ 3] = (l >> 16) & 0xff;
1968 digest[13] = (l >> 8) & 0xff;
1969 digest[23] = (l >> 0) & 0xff;
1970
1971 l = itoa64_to_int (buf[16]) << 0;
1972 l |= itoa64_to_int (buf[17]) << 6;
1973 l |= itoa64_to_int (buf[18]) << 12;
1974 l |= itoa64_to_int (buf[19]) << 18;
1975
1976 digest[24] = (l >> 16) & 0xff;
1977 digest[ 4] = (l >> 8) & 0xff;
1978 digest[14] = (l >> 0) & 0xff;
1979
1980 l = itoa64_to_int (buf[20]) << 0;
1981 l |= itoa64_to_int (buf[21]) << 6;
1982 l |= itoa64_to_int (buf[22]) << 12;
1983 l |= itoa64_to_int (buf[23]) << 18;
1984
1985 digest[15] = (l >> 16) & 0xff;
1986 digest[25] = (l >> 8) & 0xff;
1987 digest[ 5] = (l >> 0) & 0xff;
1988
1989 l = itoa64_to_int (buf[24]) << 0;
1990 l |= itoa64_to_int (buf[25]) << 6;
1991 l |= itoa64_to_int (buf[26]) << 12;
1992 l |= itoa64_to_int (buf[27]) << 18;
1993
1994 digest[ 6] = (l >> 16) & 0xff;
1995 digest[16] = (l >> 8) & 0xff;
1996 digest[26] = (l >> 0) & 0xff;
1997
1998 l = itoa64_to_int (buf[28]) << 0;
1999 l |= itoa64_to_int (buf[29]) << 6;
2000 l |= itoa64_to_int (buf[30]) << 12;
2001 l |= itoa64_to_int (buf[31]) << 18;
2002
2003 digest[27] = (l >> 16) & 0xff;
2004 digest[ 7] = (l >> 8) & 0xff;
2005 digest[17] = (l >> 0) & 0xff;
2006
2007 l = itoa64_to_int (buf[32]) << 0;
2008 l |= itoa64_to_int (buf[33]) << 6;
2009 l |= itoa64_to_int (buf[34]) << 12;
2010 l |= itoa64_to_int (buf[35]) << 18;
2011
2012 digest[18] = (l >> 16) & 0xff;
2013 digest[28] = (l >> 8) & 0xff;
2014 digest[ 8] = (l >> 0) & 0xff;
2015
2016 l = itoa64_to_int (buf[36]) << 0;
2017 l |= itoa64_to_int (buf[37]) << 6;
2018 l |= itoa64_to_int (buf[38]) << 12;
2019 l |= itoa64_to_int (buf[39]) << 18;
2020
2021 digest[ 9] = (l >> 16) & 0xff;
2022 digest[19] = (l >> 8) & 0xff;
2023 digest[29] = (l >> 0) & 0xff;
2024
2025 l = itoa64_to_int (buf[40]) << 0;
2026 l |= itoa64_to_int (buf[41]) << 6;
2027 l |= itoa64_to_int (buf[42]) << 12;
2028
2029 digest[31] = (l >> 8) & 0xff;
2030 digest[30] = (l >> 0) & 0xff;
2031 }
2032
2033 void sha256crypt_encode (u8 digest[32], u8 buf[43])
2034 {
2035 int l;
2036
2037 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2038
2039 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2040 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2041 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2042 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2043
2044 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2045
2046 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2047 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2048 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2049 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2050
2051 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2052
2053 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2054 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2055 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2056 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2057
2058 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2059
2060 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2061 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2062 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2063 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2064
2065 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2066
2067 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2068 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2069 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2070 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2071
2072 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2073
2074 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2075 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2076 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2077 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2078
2079 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2080
2081 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2082 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2083 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2084 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2085
2086 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2087
2088 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2089 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2090 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2091 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2092
2093 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2094
2095 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2096 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2097 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2098 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2099
2100 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2101
2102 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2103 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2104 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2105 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2106
2107 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2108
2109 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2110 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2111 buf[42] = int_to_itoa64 (l & 0x3f);
2112 }
2113
2114 void drupal7_decode (u8 digest[64], u8 buf[44])
2115 {
2116 int l;
2117
2118 l = itoa64_to_int (buf[ 0]) << 0;
2119 l |= itoa64_to_int (buf[ 1]) << 6;
2120 l |= itoa64_to_int (buf[ 2]) << 12;
2121 l |= itoa64_to_int (buf[ 3]) << 18;
2122
2123 digest[ 0] = (l >> 0) & 0xff;
2124 digest[ 1] = (l >> 8) & 0xff;
2125 digest[ 2] = (l >> 16) & 0xff;
2126
2127 l = itoa64_to_int (buf[ 4]) << 0;
2128 l |= itoa64_to_int (buf[ 5]) << 6;
2129 l |= itoa64_to_int (buf[ 6]) << 12;
2130 l |= itoa64_to_int (buf[ 7]) << 18;
2131
2132 digest[ 3] = (l >> 0) & 0xff;
2133 digest[ 4] = (l >> 8) & 0xff;
2134 digest[ 5] = (l >> 16) & 0xff;
2135
2136 l = itoa64_to_int (buf[ 8]) << 0;
2137 l |= itoa64_to_int (buf[ 9]) << 6;
2138 l |= itoa64_to_int (buf[10]) << 12;
2139 l |= itoa64_to_int (buf[11]) << 18;
2140
2141 digest[ 6] = (l >> 0) & 0xff;
2142 digest[ 7] = (l >> 8) & 0xff;
2143 digest[ 8] = (l >> 16) & 0xff;
2144
2145 l = itoa64_to_int (buf[12]) << 0;
2146 l |= itoa64_to_int (buf[13]) << 6;
2147 l |= itoa64_to_int (buf[14]) << 12;
2148 l |= itoa64_to_int (buf[15]) << 18;
2149
2150 digest[ 9] = (l >> 0) & 0xff;
2151 digest[10] = (l >> 8) & 0xff;
2152 digest[11] = (l >> 16) & 0xff;
2153
2154 l = itoa64_to_int (buf[16]) << 0;
2155 l |= itoa64_to_int (buf[17]) << 6;
2156 l |= itoa64_to_int (buf[18]) << 12;
2157 l |= itoa64_to_int (buf[19]) << 18;
2158
2159 digest[12] = (l >> 0) & 0xff;
2160 digest[13] = (l >> 8) & 0xff;
2161 digest[14] = (l >> 16) & 0xff;
2162
2163 l = itoa64_to_int (buf[20]) << 0;
2164 l |= itoa64_to_int (buf[21]) << 6;
2165 l |= itoa64_to_int (buf[22]) << 12;
2166 l |= itoa64_to_int (buf[23]) << 18;
2167
2168 digest[15] = (l >> 0) & 0xff;
2169 digest[16] = (l >> 8) & 0xff;
2170 digest[17] = (l >> 16) & 0xff;
2171
2172 l = itoa64_to_int (buf[24]) << 0;
2173 l |= itoa64_to_int (buf[25]) << 6;
2174 l |= itoa64_to_int (buf[26]) << 12;
2175 l |= itoa64_to_int (buf[27]) << 18;
2176
2177 digest[18] = (l >> 0) & 0xff;
2178 digest[19] = (l >> 8) & 0xff;
2179 digest[20] = (l >> 16) & 0xff;
2180
2181 l = itoa64_to_int (buf[28]) << 0;
2182 l |= itoa64_to_int (buf[29]) << 6;
2183 l |= itoa64_to_int (buf[30]) << 12;
2184 l |= itoa64_to_int (buf[31]) << 18;
2185
2186 digest[21] = (l >> 0) & 0xff;
2187 digest[22] = (l >> 8) & 0xff;
2188 digest[23] = (l >> 16) & 0xff;
2189
2190 l = itoa64_to_int (buf[32]) << 0;
2191 l |= itoa64_to_int (buf[33]) << 6;
2192 l |= itoa64_to_int (buf[34]) << 12;
2193 l |= itoa64_to_int (buf[35]) << 18;
2194
2195 digest[24] = (l >> 0) & 0xff;
2196 digest[25] = (l >> 8) & 0xff;
2197 digest[26] = (l >> 16) & 0xff;
2198
2199 l = itoa64_to_int (buf[36]) << 0;
2200 l |= itoa64_to_int (buf[37]) << 6;
2201 l |= itoa64_to_int (buf[38]) << 12;
2202 l |= itoa64_to_int (buf[39]) << 18;
2203
2204 digest[27] = (l >> 0) & 0xff;
2205 digest[28] = (l >> 8) & 0xff;
2206 digest[29] = (l >> 16) & 0xff;
2207
2208 l = itoa64_to_int (buf[40]) << 0;
2209 l |= itoa64_to_int (buf[41]) << 6;
2210 l |= itoa64_to_int (buf[42]) << 12;
2211 l |= itoa64_to_int (buf[43]) << 18;
2212
2213 digest[30] = (l >> 0) & 0xff;
2214 digest[31] = (l >> 8) & 0xff;
2215 digest[32] = (l >> 16) & 0xff;
2216
2217 digest[33] = 0;
2218 digest[34] = 0;
2219 digest[35] = 0;
2220 digest[36] = 0;
2221 digest[37] = 0;
2222 digest[38] = 0;
2223 digest[39] = 0;
2224 digest[40] = 0;
2225 digest[41] = 0;
2226 digest[42] = 0;
2227 digest[43] = 0;
2228 digest[44] = 0;
2229 digest[45] = 0;
2230 digest[46] = 0;
2231 digest[47] = 0;
2232 digest[48] = 0;
2233 digest[49] = 0;
2234 digest[50] = 0;
2235 digest[51] = 0;
2236 digest[52] = 0;
2237 digest[53] = 0;
2238 digest[54] = 0;
2239 digest[55] = 0;
2240 digest[56] = 0;
2241 digest[57] = 0;
2242 digest[58] = 0;
2243 digest[59] = 0;
2244 digest[60] = 0;
2245 digest[61] = 0;
2246 digest[62] = 0;
2247 digest[63] = 0;
2248 }
2249
2250 void drupal7_encode (u8 digest[64], u8 buf[43])
2251 {
2252 int l;
2253
2254 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2255
2256 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2257 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2258 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2259 buf[ 3] = int_to_itoa64 (l & 0x3f);
2260
2261 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2262
2263 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2264 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2265 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2266 buf[ 7] = int_to_itoa64 (l & 0x3f);
2267
2268 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2269
2270 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2271 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2272 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2273 buf[11] = int_to_itoa64 (l & 0x3f);
2274
2275 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2276
2277 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2278 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2279 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2280 buf[15] = int_to_itoa64 (l & 0x3f);
2281
2282 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2283
2284 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2285 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2286 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2287 buf[19] = int_to_itoa64 (l & 0x3f);
2288
2289 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2290
2291 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2292 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2293 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2294 buf[23] = int_to_itoa64 (l & 0x3f);
2295
2296 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2297
2298 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2299 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2300 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2301 buf[27] = int_to_itoa64 (l & 0x3f);
2302
2303 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2304
2305 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2306 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2307 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2308 buf[31] = int_to_itoa64 (l & 0x3f);
2309
2310 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2311
2312 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2313 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2314 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2315 buf[35] = int_to_itoa64 (l & 0x3f);
2316
2317 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2318
2319 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2320 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2321 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2322 buf[39] = int_to_itoa64 (l & 0x3f);
2323
2324 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2325
2326 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2327 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2328 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2329 //buf[43] = int_to_itoa64 (l & 0x3f);
2330 }
2331
2332 /**
2333 * tty
2334 */
2335
2336 #ifdef LINUX
2337 static struct termio savemodes;
2338 static int havemodes = 0;
2339
2340 int tty_break()
2341 {
2342 struct termio modmodes;
2343
2344 if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1;
2345
2346 havemodes = 1;
2347
2348 modmodes = savemodes;
2349 modmodes.c_lflag &= ~ICANON;
2350 modmodes.c_cc[VMIN] = 1;
2351 modmodes.c_cc[VTIME] = 0;
2352
2353 return ioctl (fileno (stdin), TCSETAW, &modmodes);
2354 }
2355
2356 int tty_getchar()
2357 {
2358 fd_set rfds;
2359
2360 FD_ZERO (&rfds);
2361
2362 FD_SET (fileno (stdin), &rfds);
2363
2364 struct timeval tv;
2365
2366 tv.tv_sec = 1;
2367 tv.tv_usec = 0;
2368
2369 int retval = select (1, &rfds, NULL, NULL, &tv);
2370
2371 if (retval == 0) return 0;
2372 if (retval == -1) return -1;
2373
2374 return getchar();
2375 }
2376
2377 int tty_fix()
2378 {
2379 if (!havemodes) return 0;
2380
2381 return ioctl (fileno (stdin), TCSETAW, &savemodes);
2382 }
2383 #endif
2384
2385 #ifdef OSX
2386 static struct termios savemodes;
2387 static int havemodes = 0;
2388
2389 int tty_break()
2390 {
2391 struct termios modmodes;
2392
2393 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2394
2395 havemodes = 1;
2396
2397 modmodes = savemodes;
2398 modmodes.c_lflag &= ~ICANON;
2399 modmodes.c_cc[VMIN] = 1;
2400 modmodes.c_cc[VTIME] = 0;
2401
2402 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2403 }
2404
2405 int tty_getchar()
2406 {
2407 fd_set rfds;
2408
2409 FD_ZERO (&rfds);
2410
2411 FD_SET (fileno (stdin), &rfds);
2412
2413 struct timeval tv;
2414
2415 tv.tv_sec = 1;
2416 tv.tv_usec = 0;
2417
2418 int retval = select (1, &rfds, NULL, NULL, &tv);
2419
2420 if (retval == 0) return 0;
2421 if (retval == -1) return -1;
2422
2423 return getchar();
2424 }
2425
2426 int tty_fix()
2427 {
2428 if (!havemodes) return 0;
2429
2430 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2431 }
2432 #endif
2433
2434 #ifdef WIN
2435 static DWORD saveMode = 0;
2436
2437 int tty_break()
2438 {
2439 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2440
2441 GetConsoleMode (stdinHandle, &saveMode);
2442 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2443
2444 return 0;
2445 }
2446
2447 int tty_getchar()
2448 {
2449 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2450
2451 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2452
2453 if (rc == WAIT_TIMEOUT) return 0;
2454 if (rc == WAIT_ABANDONED) return -1;
2455 if (rc == WAIT_FAILED) return -1;
2456
2457 // The whole ReadConsoleInput () part is a workaround.
2458 // For some unknown reason, maybe a mingw bug, a random signal
2459 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2460 // Then it wants to read with getche () a keyboard input
2461 // which has never been made.
2462
2463 INPUT_RECORD buf[100];
2464
2465 DWORD num = 0;
2466
2467 memset (buf, 0, sizeof (buf));
2468
2469 ReadConsoleInput (stdinHandle, buf, 100, &num);
2470
2471 FlushConsoleInputBuffer (stdinHandle);
2472
2473 for (uint i = 0; i < num; i++)
2474 {
2475 if (buf[i].EventType != KEY_EVENT) continue;
2476
2477 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2478
2479 if (KeyEvent.bKeyDown != TRUE) continue;
2480
2481 return KeyEvent.uChar.AsciiChar;
2482 }
2483
2484 return 0;
2485 }
2486
2487 int tty_fix()
2488 {
2489 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2490
2491 SetConsoleMode (stdinHandle, saveMode);
2492
2493 return 0;
2494 }
2495 #endif
2496
2497 /**
2498 * mem alloc
2499 */
2500
2501 #define MSG_ENOMEM "Insufficient memory available"
2502
2503 void *mycalloc (size_t nmemb, size_t size)
2504 {
2505 void *p = calloc (nmemb, size);
2506
2507 if (p == NULL)
2508 {
2509 log_error ("ERROR: %s", MSG_ENOMEM);
2510
2511 exit (-1);
2512 }
2513
2514 return (p);
2515 }
2516
2517 void *mymalloc (size_t size)
2518 {
2519 void *p = malloc (size);
2520
2521 if (p == NULL)
2522 {
2523 log_error ("ERROR: %s", MSG_ENOMEM);
2524
2525 exit (-1);
2526 }
2527
2528 memset (p, 0, size);
2529
2530 return (p);
2531 }
2532
2533 void myfree (void *ptr)
2534 {
2535 if (ptr == NULL) return;
2536
2537 free (ptr);
2538 }
2539
2540 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2541 {
2542 void *p = realloc (ptr, oldsz + add);
2543
2544 if (p == NULL)
2545 {
2546 log_error ("ERROR: %s", MSG_ENOMEM);
2547
2548 exit (-1);
2549 }
2550
2551 memset ((char *) p + oldsz, 0, add);
2552
2553 return (p);
2554 }
2555
2556 char *mystrdup (const char *s)
2557 {
2558 const size_t len = strlen (s);
2559
2560 char *b = (char *) mymalloc (len + 1);
2561
2562 memcpy (b, s, len);
2563
2564 return (b);
2565 }
2566
2567 FILE *logfile_open (char *logfile)
2568 {
2569 FILE *fp = fopen (logfile, "ab");
2570
2571 if (fp == NULL)
2572 {
2573 fp = stdout;
2574 }
2575
2576 return fp;
2577 }
2578
2579 void logfile_close (FILE *fp)
2580 {
2581 if (fp == stdout) return;
2582
2583 fclose (fp);
2584 }
2585
2586 void logfile_append (const char *fmt, ...)
2587 {
2588 if (data.logfile_disable == 1) return;
2589
2590 FILE *fp = logfile_open (data.logfile);
2591
2592 va_list ap;
2593
2594 va_start (ap, fmt);
2595
2596 vfprintf (fp, fmt, ap);
2597
2598 va_end (ap);
2599
2600 fputc ('\n', fp);
2601
2602 fflush (fp);
2603
2604 logfile_close (fp);
2605 }
2606
2607 int logfile_generate_id ()
2608 {
2609 const int n = rand ();
2610
2611 time_t t;
2612
2613 time (&t);
2614
2615 return t + n;
2616 }
2617
2618 char *logfile_generate_topid ()
2619 {
2620 const int id = logfile_generate_id ();
2621
2622 char *topid = (char *) mymalloc (1 + 16 + 1);
2623
2624 snprintf (topid, 1 + 16, "TOP%08x", id);
2625
2626 return topid;
2627 }
2628
2629 char *logfile_generate_subid ()
2630 {
2631 const int id = logfile_generate_id ();
2632
2633 char *subid = (char *) mymalloc (1 + 16 + 1);
2634
2635 snprintf (subid, 1 + 16, "SUB%08x", id);
2636
2637 return subid;
2638 }
2639
2640 /**
2641 * system
2642 */
2643
2644 #if F_SETLKW
2645 void lock_file (FILE *fp)
2646 {
2647 struct flock lock;
2648
2649 memset (&lock, 0, sizeof (struct flock));
2650
2651 lock.l_type = F_WRLCK;
2652 while (fcntl(fileno(fp), F_SETLKW, &lock))
2653 {
2654 if (errno != EINTR)
2655 {
2656 log_error ("ERROR: Failed acquiring write lock: %s", strerror (errno));
2657
2658 exit (-1);
2659 }
2660 }
2661 }
2662
2663 void unlock_file (FILE *fp)
2664 {
2665 struct flock lock;
2666
2667 memset (&lock, 0, sizeof (struct flock));
2668
2669 lock.l_type = F_UNLCK;
2670 fcntl(fileno(fp), F_SETLK, &lock);
2671 }
2672 #endif // F_SETLKW
2673
2674 #ifdef WIN
2675 void fsync (int fd)
2676 {
2677 HANDLE h = (HANDLE) _get_osfhandle (fd);
2678
2679 FlushFileBuffers (h);
2680 }
2681 #endif
2682
2683 /**
2684 * thermal
2685 */
2686
2687 #ifdef HAVE_HWMON
2688
2689 int get_adapters_num_adl (void *adl, int *iNumberAdapters)
2690 {
2691 if (hm_ADL_Adapter_NumberOfAdapters_Get ((ADL_PTR *) adl, iNumberAdapters) != ADL_OK) return -1;
2692
2693 if (iNumberAdapters == 0)
2694 {
2695 log_info ("WARN: No ADL adapters found.");
2696
2697 return -1;
2698 }
2699
2700 return 0;
2701 }
2702
2703 /*
2704 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2705 {
2706 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2707 ADLODParameters lpOdParameters;
2708
2709 lpOdParameters.iSize = sizeof (ADLODParameters);
2710 size_t plevels_size = 0;
2711
2712 if (hm_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2713
2714 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2715 __func__, iAdapterIndex,
2716 lpOdParameters.iNumberOfPerformanceLevels,
2717 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2718 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2719
2720 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2721
2722 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2723
2724 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2725
2726 if (hm_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2727
2728 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2729 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2730 __func__, iAdapterIndex, j,
2731 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2732
2733 myfree (lpOdPerformanceLevels);
2734
2735 return 0;
2736 }
2737 */
2738
2739 LPAdapterInfo hm_get_adapter_info_adl (void *adl, int iNumberAdapters)
2740 {
2741 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2742
2743 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2744
2745 if (hm_ADL_Adapter_AdapterInfo_Get ((ADL_PTR *) adl, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2746
2747 return lpAdapterInfo;
2748 }
2749
2750 int hm_get_adapter_index_nvapi (HM_ADAPTER_NVAPI nvapiGPUHandle[DEVICES_MAX])
2751 {
2752 NvU32 pGpuCount;
2753
2754 if (hm_NvAPI_EnumPhysicalGPUs (data.hm_nvapi, nvapiGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2755
2756 if (pGpuCount == 0)
2757 {
2758 log_info ("WARN: No NvAPI adapters found");
2759
2760 return (0);
2761 }
2762
2763 return (pGpuCount);
2764 }
2765
2766 int hm_get_adapter_index_nvml (HM_ADAPTER_NVML nvmlGPUHandle[DEVICES_MAX])
2767 {
2768 int pGpuCount = 0;
2769
2770 for (uint i = 0; i < DEVICES_MAX; i++)
2771 {
2772 if (hm_NVML_nvmlDeviceGetHandleByIndex (data.hm_nvml, 1, i, &nvmlGPUHandle[i]) != NVML_SUCCESS) break;
2773
2774 // can be used to determine if the device by index matches the cuda device by index
2775 // char name[100]; memset (name, 0, sizeof (name));
2776 // hm_NVML_nvmlDeviceGetName (data.hm_nvml, nvGPUHandle[i], name, sizeof (name) - 1);
2777
2778 pGpuCount++;
2779 }
2780
2781 if (pGpuCount == 0)
2782 {
2783 log_info ("WARN: No NVML adapters found");
2784
2785 return (0);
2786 }
2787
2788 return (pGpuCount);
2789 }
2790
2791 /*
2792 //
2793 // does not help at all, since ADL does not assign different bus id, device id when we have multi GPU setups
2794 //
2795
2796 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2797 {
2798 u32 idx = -1;
2799
2800 for (uint i = 0; i < num_adl_adapters; i++)
2801 {
2802 int opencl_bus_num = hm_device[i].busid;
2803 int opencl_dev_num = hm_device[i].devid;
2804
2805 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2806 {
2807 idx = i;
2808
2809 break;
2810 }
2811 }
2812
2813 if (idx >= DEVICES_MAX) return -1;
2814
2815 return idx;
2816 }
2817
2818 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2819 {
2820 for (uint i = 0; i < opencl_num_devices; i++)
2821 {
2822 cl_device_topology_amd device_topology;
2823
2824 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2825
2826 hm_device[i].busid = device_topology.pcie.bus;
2827 hm_device[i].devid = device_topology.pcie.device;
2828 }
2829 }
2830 */
2831
2832 void hm_sort_adl_adapters_by_busid_devid (u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2833 {
2834 // basically bubble sort
2835
2836 for (int i = 0; i < num_adl_adapters; i++)
2837 {
2838 for (int j = 0; j < num_adl_adapters - 1; j++)
2839 {
2840 // get info of adapter [x]
2841
2842 u32 adapter_index_x = valid_adl_device_list[j];
2843 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2844
2845 u32 bus_num_x = info_x.iBusNumber;
2846 u32 dev_num_x = info_x.iDeviceNumber;
2847
2848 // get info of adapter [y]
2849
2850 u32 adapter_index_y = valid_adl_device_list[j + 1];
2851 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2852
2853 u32 bus_num_y = info_y.iBusNumber;
2854 u32 dev_num_y = info_y.iDeviceNumber;
2855
2856 uint need_swap = 0;
2857
2858 if (bus_num_y < bus_num_x)
2859 {
2860 need_swap = 1;
2861 }
2862 else if (bus_num_y == bus_num_x)
2863 {
2864 if (dev_num_y < dev_num_x)
2865 {
2866 need_swap = 1;
2867 }
2868 }
2869
2870 if (need_swap == 1)
2871 {
2872 u32 temp = valid_adl_device_list[j + 1];
2873
2874 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2875 valid_adl_device_list[j + 0] = temp;
2876 }
2877 }
2878 }
2879 }
2880
2881 u32 *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2882 {
2883 *num_adl_adapters = 0;
2884
2885 u32 *adl_adapters = NULL;
2886
2887 int *bus_numbers = NULL;
2888 int *device_numbers = NULL;
2889
2890 for (int i = 0; i < iNumberAdapters; i++)
2891 {
2892 AdapterInfo info = lpAdapterInfo[i];
2893
2894 if (strlen (info.strUDID) < 1) continue;
2895
2896 #ifdef WIN
2897 if (info.iVendorID != 1002) continue;
2898 #else
2899 if (info.iVendorID != 0x1002) continue;
2900 #endif
2901
2902 if (info.iBusNumber < 0) continue;
2903 if (info.iDeviceNumber < 0) continue;
2904
2905 int found = 0;
2906
2907 for (int pos = 0; pos < *num_adl_adapters; pos++)
2908 {
2909 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2910 {
2911 found = 1;
2912 break;
2913 }
2914 }
2915
2916 if (found) continue;
2917
2918 // add it to the list
2919
2920 adl_adapters = (u32 *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2921
2922 adl_adapters[*num_adl_adapters] = i;
2923
2924 // rest is just bookkeeping
2925
2926 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2927 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2928
2929 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2930 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2931
2932 (*num_adl_adapters)++;
2933 }
2934
2935 myfree (bus_numbers);
2936 myfree (device_numbers);
2937
2938 // sort the list by increasing bus id, device id number
2939
2940 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2941
2942 return adl_adapters;
2943 }
2944
2945 int hm_check_fanspeed_control (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2946 {
2947 // loop through all valid devices
2948
2949 for (int i = 0; i < num_adl_adapters; i++)
2950 {
2951 u32 adapter_index = valid_adl_device_list[i];
2952
2953 // get AdapterInfo
2954
2955 AdapterInfo info = lpAdapterInfo[adapter_index];
2956
2957 // unfortunately this doesn't work since bus id and dev id are not unique
2958 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2959 // if (opencl_device_index == -1) continue;
2960
2961 int opencl_device_index = i;
2962
2963 // if (hm_show_performance_level (adl, info.iAdapterIndex) != 0) return -1;
2964
2965 // get fanspeed info
2966
2967 if (hm_device[opencl_device_index].od_version == 5)
2968 {
2969 ADLFanSpeedInfo FanSpeedInfo;
2970
2971 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2972
2973 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2974
2975 if (hm_ADL_Overdrive5_FanSpeedInfo_Get (adl, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2976
2977 // check read and write capability in fanspeedinfo
2978
2979 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2980 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2981 {
2982 hm_device[opencl_device_index].fan_get_supported = 1;
2983 }
2984 else
2985 {
2986 hm_device[opencl_device_index].fan_get_supported = 0;
2987 }
2988 }
2989 else // od_version == 6
2990 {
2991 ADLOD6FanSpeedInfo faninfo;
2992
2993 memset (&faninfo, 0, sizeof (faninfo));
2994
2995 if (hm_ADL_Overdrive6_FanSpeed_Get (adl, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2996
2997 // check read capability in fanspeedinfo
2998
2999 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
3000 {
3001 hm_device[opencl_device_index].fan_get_supported = 1;
3002 }
3003 else
3004 {
3005 hm_device[opencl_device_index].fan_get_supported = 0;
3006 }
3007 }
3008 }
3009
3010 return 0;
3011 }
3012
3013 int hm_get_overdrive_version (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3014 {
3015 for (int i = 0; i < num_adl_adapters; i++)
3016 {
3017 u32 adapter_index = valid_adl_device_list[i];
3018
3019 // get AdapterInfo
3020
3021 AdapterInfo info = lpAdapterInfo[adapter_index];
3022
3023 // get overdrive version
3024
3025 int od_supported = 0;
3026 int od_enabled = 0;
3027 int od_version = 0;
3028
3029 if (hm_ADL_Overdrive_Caps (adl, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3030
3031 // store the overdrive version in hm_device
3032
3033 // unfortunately this doesn't work since bus id and dev id are not unique
3034 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3035 // if (opencl_device_index == -1) continue;
3036
3037 int opencl_device_index = i;
3038
3039 hm_device[opencl_device_index].od_version = od_version;
3040 }
3041
3042 return 0;
3043 }
3044
3045 int hm_get_adapter_index_adl (hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3046 {
3047 for (int i = 0; i < num_adl_adapters; i++)
3048 {
3049 u32 adapter_index = valid_adl_device_list[i];
3050
3051 // get AdapterInfo
3052
3053 AdapterInfo info = lpAdapterInfo[adapter_index];
3054
3055 // store the iAdapterIndex in hm_device
3056
3057 // unfortunately this doesn't work since bus id and dev id are not unique
3058 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3059 // if (opencl_device_index == -1) continue;
3060
3061 int opencl_device_index = i;
3062
3063 hm_device[opencl_device_index].adl = info.iAdapterIndex;
3064 }
3065
3066 return num_adl_adapters;
3067 }
3068
3069 int hm_get_threshold_slowdown_with_device_id (const uint device_id)
3070 {
3071 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3072
3073 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3074 {
3075 if (data.hm_adl)
3076 {
3077 if (data.hm_device[device_id].od_version == 5)
3078 {
3079
3080 }
3081 else if (data.hm_device[device_id].od_version == 6)
3082 {
3083 int CurrentValue = 0;
3084 int DefaultValue = 0;
3085
3086 if (hm_ADL_Overdrive6_TargetTemperatureData_Get (data.hm_adl, data.hm_device[device_id].adl, &CurrentValue, &DefaultValue) != ADL_OK) return -1;
3087
3088 // the return value has never been tested since hm_ADL_Overdrive6_TargetTemperatureData_Get() never worked on any system. expect problems.
3089
3090 return DefaultValue;
3091 }
3092 }
3093 }
3094
3095 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3096 {
3097 int target = 0;
3098
3099 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;
3100
3101 return target;
3102 }
3103
3104 return -1;
3105 }
3106
3107 int hm_get_threshold_shutdown_with_device_id (const uint device_id)
3108 {
3109 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3110
3111 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3112 {
3113 if (data.hm_adl)
3114 {
3115 if (data.hm_device[device_id].od_version == 5)
3116 {
3117
3118 }
3119 else if (data.hm_device[device_id].od_version == 6)
3120 {
3121
3122 }
3123 }
3124 }
3125
3126 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3127 {
3128 int target = 0;
3129
3130 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;
3131
3132 return target;
3133 }
3134
3135 return -1;
3136 }
3137
3138 int hm_get_temperature_with_device_id (const uint device_id)
3139 {
3140 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3141
3142 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3143 {
3144 if (data.hm_adl)
3145 {
3146 if (data.hm_device[device_id].od_version == 5)
3147 {
3148 ADLTemperature Temperature;
3149
3150 Temperature.iSize = sizeof (ADLTemperature);
3151
3152 if (hm_ADL_Overdrive5_Temperature_Get (data.hm_adl, data.hm_device[device_id].adl, 0, &Temperature) != ADL_OK) return -1;
3153
3154 return Temperature.iTemperature / 1000;
3155 }
3156 else if (data.hm_device[device_id].od_version == 6)
3157 {
3158 int Temperature = 0;
3159
3160 if (hm_ADL_Overdrive6_Temperature_Get (data.hm_adl, data.hm_device[device_id].adl, &Temperature) != ADL_OK) return -1;
3161
3162 return Temperature / 1000;
3163 }
3164 }
3165 }
3166
3167 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3168 {
3169 int temperature = 0;
3170
3171 if (hm_NVML_nvmlDeviceGetTemperature (data.hm_nvml, 1, data.hm_device[device_id].nvml, NVML_TEMPERATURE_GPU, (uint *) &temperature) != NVML_SUCCESS) return -1;
3172
3173 return temperature;
3174 }
3175
3176 return -1;
3177 }
3178
3179 int hm_get_fanpolicy_with_device_id (const uint device_id)
3180 {
3181 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3182
3183 if (data.hm_device[device_id].fan_get_supported == 1)
3184 {
3185 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3186 {
3187 if (data.hm_adl)
3188 {
3189 if (data.hm_device[device_id].od_version == 5)
3190 {
3191 ADLFanSpeedValue lpFanSpeedValue;
3192
3193 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3194
3195 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3196 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3197
3198 if (hm_ADL_Overdrive5_FanSpeed_Get (data.hm_adl, data.hm_device[device_id].adl, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3199
3200 return (lpFanSpeedValue.iFanSpeed & ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED) ? 0 : 1;
3201 }
3202 else // od_version == 6
3203 {
3204 return 1;
3205 }
3206 }
3207 }
3208
3209 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3210 {
3211 return 1;
3212 }
3213 }
3214
3215 return -1;
3216 }
3217
3218 int hm_get_fanspeed_with_device_id (const uint device_id)
3219 {
3220 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3221
3222 if (data.hm_device[device_id].fan_get_supported == 1)
3223 {
3224 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3225 {
3226 if (data.hm_adl)
3227 {
3228 if (data.hm_device[device_id].od_version == 5)
3229 {
3230 ADLFanSpeedValue lpFanSpeedValue;
3231
3232 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3233
3234 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3235 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3236 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3237
3238 if (hm_ADL_Overdrive5_FanSpeed_Get (data.hm_adl, data.hm_device[device_id].adl, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3239
3240 return lpFanSpeedValue.iFanSpeed;
3241 }
3242 else // od_version == 6
3243 {
3244 ADLOD6FanSpeedInfo faninfo;
3245
3246 memset (&faninfo, 0, sizeof (faninfo));
3247
3248 if (hm_ADL_Overdrive6_FanSpeed_Get (data.hm_adl, data.hm_device[device_id].adl, &faninfo) != ADL_OK) return -1;
3249
3250 return faninfo.iFanSpeedPercent;
3251 }
3252 }
3253 }
3254
3255 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3256 {
3257 int speed = 0;
3258
3259 if (hm_NVML_nvmlDeviceGetFanSpeed (data.hm_nvml, 0, data.hm_device[device_id].nvml, (uint *) &speed) != NVML_SUCCESS) return -1;
3260
3261 return speed;
3262 }
3263 }
3264
3265 return -1;
3266 }
3267
3268 int hm_get_buslanes_with_device_id (const uint device_id)
3269 {
3270 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3271
3272 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3273 {
3274 if (data.hm_adl)
3275 {
3276 ADLPMActivity PMActivity;
3277
3278 PMActivity.iSize = sizeof (ADLPMActivity);
3279
3280 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_adl, data.hm_device[device_id].adl, &PMActivity) != ADL_OK) return -1;
3281
3282 return PMActivity.iCurrentBusLanes;
3283 }
3284 }
3285
3286 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3287 {
3288 unsigned int currLinkWidth;
3289
3290 if (hm_NVML_nvmlDeviceGetCurrPcieLinkWidth (data.hm_nvml, 1, data.hm_device[device_id].nvml, &currLinkWidth) != NVML_SUCCESS) return -1;
3291
3292 return currLinkWidth;
3293 }
3294
3295 return -1;
3296 }
3297
3298 int hm_get_utilization_with_device_id (const uint device_id)
3299 {
3300 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3301
3302 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3303 {
3304 if (data.hm_adl)
3305 {
3306 ADLPMActivity PMActivity;
3307
3308 PMActivity.iSize = sizeof (ADLPMActivity);
3309
3310 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_adl, data.hm_device[device_id].adl, &PMActivity) != ADL_OK) return -1;
3311
3312 return PMActivity.iActivityPercent;
3313 }
3314 }
3315
3316 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3317 {
3318 nvmlUtilization_t utilization;
3319
3320 if (hm_NVML_nvmlDeviceGetUtilizationRates (data.hm_nvml, 1, data.hm_device[device_id].nvml, &utilization) != NVML_SUCCESS) return -1;
3321
3322 return utilization.gpu;
3323 }
3324
3325 return -1;
3326 }
3327
3328 int hm_get_memoryspeed_with_device_id (const uint device_id)
3329 {
3330 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3331
3332 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3333 {
3334 if (data.hm_adl)
3335 {
3336 ADLPMActivity PMActivity;
3337
3338 PMActivity.iSize = sizeof (ADLPMActivity);
3339
3340 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_adl, data.hm_device[device_id].adl, &PMActivity) != ADL_OK) return -1;
3341
3342 return PMActivity.iMemoryClock / 100;
3343 }
3344 }
3345
3346 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3347 {
3348 unsigned int clock;
3349
3350 if (hm_NVML_nvmlDeviceGetClockInfo (data.hm_nvml, 1, data.hm_device[device_id].nvml, NVML_CLOCK_MEM, &clock) != NVML_SUCCESS) return -1;
3351
3352 return clock;
3353 }
3354
3355 return -1;
3356 }
3357
3358 int hm_get_corespeed_with_device_id (const uint device_id)
3359 {
3360 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3361
3362 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3363 {
3364 if (data.hm_adl)
3365 {
3366 ADLPMActivity PMActivity;
3367
3368 PMActivity.iSize = sizeof (ADLPMActivity);
3369
3370 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_adl, data.hm_device[device_id].adl, &PMActivity) != ADL_OK) return -1;
3371
3372 return PMActivity.iEngineClock / 100;
3373 }
3374 }
3375
3376 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3377 {
3378 unsigned int clock;
3379
3380 if (hm_NVML_nvmlDeviceGetClockInfo (data.hm_nvml, 1, data.hm_device[device_id].nvml, NVML_CLOCK_SM, &clock) != NVML_SUCCESS) return -1;
3381
3382 return clock;
3383 }
3384
3385 return -1;
3386 }
3387
3388 int hm_get_throttle_with_device_id (const uint device_id)
3389 {
3390 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3391
3392 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3393 {
3394
3395 }
3396
3397 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3398 {
3399 unsigned long long clocksThrottleReasons = 0;
3400 unsigned long long supportedThrottleReasons = 0;
3401
3402 if (hm_NVML_nvmlDeviceGetCurrentClocksThrottleReasons (data.hm_nvml, 1, data.hm_device[device_id].nvml, &clocksThrottleReasons) != NVML_SUCCESS) return -1;
3403 if (hm_NVML_nvmlDeviceGetSupportedClocksThrottleReasons (data.hm_nvml, 1, data.hm_device[device_id].nvml, &supportedThrottleReasons) != NVML_SUCCESS) return -1;
3404
3405 clocksThrottleReasons &= supportedThrottleReasons;
3406 clocksThrottleReasons &= ~nvmlClocksThrottleReasonGpuIdle;
3407 clocksThrottleReasons &= ~nvmlClocksThrottleReasonApplicationsClocksSetting;
3408 clocksThrottleReasons &= ~nvmlClocksThrottleReasonUnknown;
3409
3410 if (data.kernel_power_final)
3411 {
3412 clocksThrottleReasons &= ~nvmlClocksThrottleReasonHwSlowdown;
3413 }
3414
3415 return (clocksThrottleReasons != nvmlClocksThrottleReasonNone);
3416 }
3417
3418 return -1;
3419 }
3420
3421 int hm_set_fanspeed_with_device_id_adl (const uint device_id, const int fanspeed, const int fanpolicy)
3422 {
3423 if (data.hm_device[device_id].fan_set_supported == 1)
3424 {
3425 if (data.hm_adl)
3426 {
3427 if (data.hm_device[device_id].od_version == 5)
3428 {
3429 ADLFanSpeedValue lpFanSpeedValue;
3430
3431 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3432
3433 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3434 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3435 lpFanSpeedValue.iFlags = (fanpolicy == 1) ? ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED : 0;
3436 lpFanSpeedValue.iFanSpeed = fanspeed;
3437
3438 if (hm_ADL_Overdrive5_FanSpeed_Set (data.hm_adl, data.hm_device[device_id].adl, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3439
3440 return 0;
3441 }
3442 else // od_version == 6
3443 {
3444 ADLOD6FanSpeedValue fan_speed_value;
3445
3446 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3447
3448 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3449 fan_speed_value.iFanSpeed = fanspeed;
3450
3451 if (hm_ADL_Overdrive6_FanSpeed_Set (data.hm_adl, data.hm_device[device_id].adl, &fan_speed_value) != ADL_OK) return -1;
3452
3453 return 0;
3454 }
3455 }
3456 }
3457
3458 return -1;
3459 }
3460
3461 int hm_set_fanspeed_with_device_id_nvapi (const uint device_id, const int fanspeed, const int fanpolicy)
3462 {
3463 if (data.hm_device[device_id].fan_set_supported == 1)
3464 {
3465 if (data.hm_nvapi)
3466 {
3467 NV_GPU_COOLER_LEVELS CoolerLevels = { 0 };
3468
3469 CoolerLevels.Version = GPU_COOLER_LEVELS_VER | sizeof (NV_GPU_COOLER_LEVELS);
3470
3471 CoolerLevels.Levels[0].Level = fanspeed;
3472 CoolerLevels.Levels[0].Policy = fanpolicy;
3473
3474 if (hm_NvAPI_GPU_SetCoolerLevels (data.hm_nvapi, data.hm_device[device_id].nvapi, 0, &CoolerLevels) != NVAPI_OK) return -1;
3475
3476 return 0;
3477 }
3478 }
3479
3480 return -1;
3481 }
3482
3483 int hm_set_fanspeed_with_device_id_xnvctrl (const uint device_id, const int fanspeed)
3484 {
3485 if (data.hm_device[device_id].fan_set_supported == 1)
3486 {
3487 if (data.hm_xnvctrl)
3488 {
3489 if (set_fan_speed_target (data.hm_xnvctrl, data.hm_device[device_id].xnvctrl, fanspeed) != 0) return -1;
3490
3491 return 0;
3492 }
3493 }
3494
3495 return -1;
3496 }
3497
3498 #endif // HAVE_HWMON
3499
3500 /**
3501 * maskprocessor
3502 */
3503
3504 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3505 {
3506 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3507
3508 if (css_cnt > SP_PW_MAX)
3509 {
3510 log_error ("ERROR: Mask length is too long");
3511
3512 exit (-1);
3513 }
3514
3515 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3516 {
3517 uint *uniq_tbl = uniq_tbls[css_pos];
3518
3519 uint *cs_buf = css[css_pos].cs_buf;
3520 uint cs_len = css[css_pos].cs_len;
3521
3522 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3523 {
3524 uint c = cs_buf[cs_pos] & 0xff;
3525
3526 uniq_tbl[c] = 1;
3527 }
3528 }
3529 }
3530
3531 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3532 {
3533 cs_t *cs = &css[css_cnt];
3534
3535 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3536
3537 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3538
3539 size_t i;
3540
3541 for (i = 0; i < cs->cs_len; i++)
3542 {
3543 const uint u = cs->cs_buf[i];
3544
3545 css_uniq[u] = 1;
3546 }
3547
3548 for (i = 0; i < in_len; i++)
3549 {
3550 uint u = in_buf[i] & 0xff;
3551
3552 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3553
3554 if (css_uniq[u] == 1) continue;
3555
3556 css_uniq[u] = 1;
3557
3558 cs->cs_buf[cs->cs_len] = u;
3559
3560 cs->cs_len++;
3561 }
3562
3563 myfree (css_uniq);
3564 }
3565
3566 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3567 {
3568 size_t in_pos;
3569
3570 for (in_pos = 0; in_pos < in_len; in_pos++)
3571 {
3572 uint p0 = in_buf[in_pos] & 0xff;
3573
3574 if (interpret == 1 && p0 == '?')
3575 {
3576 in_pos++;
3577
3578 if (in_pos == in_len) break;
3579
3580 uint p1 = in_buf[in_pos] & 0xff;
3581
3582 switch (p1)
3583 {
3584 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3585 break;
3586 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3587 break;
3588 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3589 break;
3590 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3591 break;
3592 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3593 break;
3594 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3595 break;
3596 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3597 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3598 break;
3599 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3600 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3601 break;
3602 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3603 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3604 break;
3605 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3606 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3607 break;
3608 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3609 break;
3610 default: log_error ("Syntax error: %s", in_buf);
3611 exit (-1);
3612 }
3613 }
3614 else
3615 {
3616 if (data.hex_charset)
3617 {
3618 in_pos++;
3619
3620 if (in_pos == in_len)
3621 {
3622 log_error ("ERROR: The hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3623
3624 exit (-1);
3625 }
3626
3627 uint p1 = in_buf[in_pos] & 0xff;
3628
3629 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3630 {
3631 log_error ("ERROR: Invalid hex character detected in mask %s", in_buf);
3632
3633 exit (-1);
3634 }
3635
3636 uint chr = 0;
3637
3638 chr = hex_convert (p1) << 0;
3639 chr |= hex_convert (p0) << 4;
3640
3641 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3642 }
3643 else
3644 {
3645 uint chr = p0;
3646
3647 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3648 }
3649 }
3650 }
3651 }
3652
3653 u64 mp_get_sum (uint css_cnt, cs_t *css)
3654 {
3655 u64 sum = 1;
3656
3657 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3658 {
3659 sum *= css[css_pos].cs_len;
3660 }
3661
3662 return (sum);
3663 }
3664
3665 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3666 {
3667 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3668
3669 uint mask_pos;
3670 uint css_pos;
3671
3672 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3673 {
3674 char p0 = mask_buf[mask_pos];
3675
3676 if (p0 == '?')
3677 {
3678 mask_pos++;
3679
3680 if (mask_pos == mask_len) break;
3681
3682 char p1 = mask_buf[mask_pos];
3683
3684 uint chr = p1;
3685
3686 switch (p1)
3687 {
3688 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3689 break;
3690 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3691 break;
3692 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3693 break;
3694 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3695 break;
3696 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3697 break;
3698 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3699 break;
3700 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3701 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3702 break;
3703 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3704 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3705 break;
3706 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3707 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3708 break;
3709 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3710 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3711 break;
3712 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3713 break;
3714 default: log_error ("ERROR: Syntax error: %s", mask_buf);
3715 exit (-1);
3716 }
3717 }
3718 else
3719 {
3720 if (data.hex_charset)
3721 {
3722 mask_pos++;
3723
3724 // if there is no 2nd hex character, show an error:
3725
3726 if (mask_pos == mask_len)
3727 {
3728 log_error ("ERROR: The hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3729
3730 exit (-1);
3731 }
3732
3733 char p1 = mask_buf[mask_pos];
3734
3735 // if they are not valid hex character, show an error:
3736
3737 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3738 {
3739 log_error ("ERROR: Invalid hex character detected in mask %s", mask_buf);
3740
3741 exit (-1);
3742 }
3743
3744 uint chr = 0;
3745
3746 chr |= hex_convert (p1) << 0;
3747 chr |= hex_convert (p0) << 4;
3748
3749 mp_add_cs_buf (&chr, 1, css, css_pos);
3750 }
3751 else
3752 {
3753 uint chr = p0;
3754
3755 mp_add_cs_buf (&chr, 1, css, css_pos);
3756 }
3757 }
3758 }
3759
3760 if (css_pos == 0)
3761 {
3762 log_error ("ERROR: Invalid mask length (0)");
3763
3764 exit (-1);
3765 }
3766
3767 *css_cnt = css_pos;
3768
3769 return (css);
3770 }
3771
3772 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3773 {
3774 for (int i = 0; i < css_cnt; i++)
3775 {
3776 uint len = css[i].cs_len;
3777 u64 next = val / len;
3778 uint pos = val % len;
3779 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3780 val = next;
3781 }
3782 }
3783
3784 void mp_cut_at (char *mask, uint max)
3785 {
3786 uint i;
3787 uint j;
3788 uint mask_len = strlen (mask);
3789
3790 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3791 {
3792 if (mask[i] == '?') i++;
3793 }
3794
3795 mask[i] = 0;
3796 }
3797
3798 void mp_setup_sys (cs_t *mp_sys)
3799 {
3800 uint pos;
3801 uint chr;
3802 uint donec[CHARSIZ] = { 0 };
3803
3804 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3805 mp_sys[0].cs_buf[pos++] = chr;
3806 mp_sys[0].cs_len = pos; }
3807
3808 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3809 mp_sys[1].cs_buf[pos++] = chr;
3810 mp_sys[1].cs_len = pos; }
3811
3812 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3813 mp_sys[2].cs_buf[pos++] = chr;
3814 mp_sys[2].cs_len = pos; }
3815
3816 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3817 mp_sys[3].cs_buf[pos++] = chr;
3818 mp_sys[3].cs_len = pos; }
3819
3820 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3821 mp_sys[4].cs_len = pos; }
3822
3823 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3824 mp_sys[5].cs_len = pos; }
3825 }
3826
3827 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3828 {
3829 FILE *fp = fopen (buf, "rb");
3830
3831 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3832 {
3833 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3834 }
3835 else
3836 {
3837 char mp_file[1024] = { 0 };
3838
3839 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3840
3841 fclose (fp);
3842
3843 len = in_superchop (mp_file);
3844
3845 if (len == 0)
3846 {
3847 log_info ("WARNING: Charset file corrupted");
3848
3849 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3850 }
3851 else
3852 {
3853 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3854 }
3855 }
3856 }
3857
3858 void mp_reset_usr (cs_t *mp_usr, uint index)
3859 {
3860 mp_usr[index].cs_len = 0;
3861
3862 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3863 }
3864
3865 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3866 {
3867 char *new_mask_buf = (char *) mymalloc (256);
3868
3869 uint mask_pos;
3870
3871 uint css_pos;
3872
3873 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3874 {
3875 if (css_pos == len) break;
3876
3877 char p0 = mask_buf[mask_pos];
3878
3879 new_mask_buf[mask_pos] = p0;
3880
3881 if (p0 == '?')
3882 {
3883 mask_pos++;
3884
3885 if (mask_pos == mask_len) break;
3886
3887 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3888 }
3889 else
3890 {
3891 if (data.hex_charset)
3892 {
3893 mask_pos++;
3894
3895 if (mask_pos == mask_len)
3896 {
3897 log_error ("ERROR: The hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3898
3899 exit (-1);
3900 }
3901
3902 char p1 = mask_buf[mask_pos];
3903
3904 // if they are not valid hex character, show an error:
3905
3906 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3907 {
3908 log_error ("ERROR: Invalid hex character detected in mask: %s", mask_buf);
3909
3910 exit (-1);
3911 }
3912
3913 new_mask_buf[mask_pos] = p1;
3914 }
3915 }
3916 }
3917
3918 if (css_pos == len) return (new_mask_buf);
3919
3920 myfree (new_mask_buf);
3921
3922 return (NULL);
3923 }
3924
3925 /**
3926 * statprocessor
3927 */
3928
3929 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3930 {
3931 u64 sum = 1;
3932
3933 uint i;
3934
3935 for (i = start; i < stop; i++)
3936 {
3937 sum *= root_css_buf[i].cs_len;
3938 }
3939
3940 return (sum);
3941 }
3942
3943 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3944 {
3945 u64 v = ctx;
3946
3947 cs_t *cs = &root_css_buf[start];
3948
3949 uint i;
3950
3951 for (i = start; i < stop; i++)
3952 {
3953 const u64 m = v % cs->cs_len;
3954 const u64 d = v / cs->cs_len;
3955
3956 v = d;
3957
3958 const uint k = cs->cs_buf[m];
3959
3960 pw_buf[i - start] = (char) k;
3961
3962 cs = &markov_css_buf[(i * CHARSIZ) + k];
3963 }
3964 }
3965
3966 int sp_comp_val (const void *p1, const void *p2)
3967 {
3968 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3969 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3970
3971 return b2->val - b1->val;
3972 }
3973
3974 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)
3975 {
3976 uint i;
3977 uint j;
3978 uint k;
3979
3980 /**
3981 * Initialize hcstats
3982 */
3983
3984 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3985
3986 u64 *root_stats_ptr = root_stats_buf;
3987
3988 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3989
3990 for (i = 0; i < SP_PW_MAX; i++)
3991 {
3992 root_stats_buf_by_pos[i] = root_stats_ptr;
3993
3994 root_stats_ptr += CHARSIZ;
3995 }
3996
3997 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3998
3999 u64 *markov_stats_ptr = markov_stats_buf;
4000
4001 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
4002
4003 for (i = 0; i < SP_PW_MAX; i++)
4004 {
4005 for (j = 0; j < CHARSIZ; j++)
4006 {
4007 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
4008
4009 markov_stats_ptr += CHARSIZ;
4010 }
4011 }
4012
4013 /**
4014 * Load hcstats File
4015 */
4016
4017 if (hcstat == NULL)
4018 {
4019 char hcstat_tmp[256] = { 0 };
4020
4021 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
4022
4023 hcstat = hcstat_tmp;
4024 }
4025
4026 FILE *fd = fopen (hcstat, "rb");
4027
4028 if (fd == NULL)
4029 {
4030 log_error ("%s: %s", hcstat, strerror (errno));
4031
4032 exit (-1);
4033 }
4034
4035 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
4036 {
4037 log_error ("%s: Could not load data", hcstat);
4038
4039 fclose (fd);
4040
4041 exit (-1);
4042 }
4043
4044 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
4045 {
4046 log_error ("%s: Could not load data", hcstat);
4047
4048 fclose (fd);
4049
4050 exit (-1);
4051 }
4052
4053 fclose (fd);
4054
4055 /**
4056 * Markov modifier of hcstat_table on user request
4057 */
4058
4059 if (disable)
4060 {
4061 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
4062 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
4063 }
4064
4065 if (classic)
4066 {
4067 /* Add all stats to first position */
4068
4069 for (i = 1; i < SP_PW_MAX; i++)
4070 {
4071 u64 *out = root_stats_buf_by_pos[0];
4072 u64 *in = root_stats_buf_by_pos[i];
4073
4074 for (j = 0; j < CHARSIZ; j++)
4075 {
4076 *out++ += *in++;
4077 }
4078 }
4079
4080 for (i = 1; i < SP_PW_MAX; i++)
4081 {
4082 u64 *out = markov_stats_buf_by_key[0][0];
4083 u64 *in = markov_stats_buf_by_key[i][0];
4084
4085 for (j = 0; j < CHARSIZ; j++)
4086 {
4087 for (k = 0; k < CHARSIZ; k++)
4088 {
4089 *out++ += *in++;
4090 }
4091 }
4092 }
4093
4094 /* copy them to all pw_positions */
4095
4096 for (i = 1; i < SP_PW_MAX; i++)
4097 {
4098 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
4099 }
4100
4101 for (i = 1; i < SP_PW_MAX; i++)
4102 {
4103 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
4104 }
4105 }
4106
4107 /**
4108 * Initialize tables
4109 */
4110
4111 hcstat_table_t *root_table_ptr = root_table_buf;
4112
4113 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
4114
4115 for (i = 0; i < SP_PW_MAX; i++)
4116 {
4117 root_table_buf_by_pos[i] = root_table_ptr;
4118
4119 root_table_ptr += CHARSIZ;
4120 }
4121
4122 hcstat_table_t *markov_table_ptr = markov_table_buf;
4123
4124 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
4125
4126 for (i = 0; i < SP_PW_MAX; i++)
4127 {
4128 for (j = 0; j < CHARSIZ; j++)
4129 {
4130 markov_table_buf_by_key[i][j] = markov_table_ptr;
4131
4132 markov_table_ptr += CHARSIZ;
4133 }
4134 }
4135
4136 /**
4137 * Convert hcstat to tables
4138 */
4139
4140 for (i = 0; i < SP_ROOT_CNT; i++)
4141 {
4142 uint key = i % CHARSIZ;
4143
4144 root_table_buf[i].key = key;
4145 root_table_buf[i].val = root_stats_buf[i];
4146 }
4147
4148 for (i = 0; i < SP_MARKOV_CNT; i++)
4149 {
4150 uint key = i % CHARSIZ;
4151
4152 markov_table_buf[i].key = key;
4153 markov_table_buf[i].val = markov_stats_buf[i];
4154 }
4155
4156 myfree (root_stats_buf);
4157 myfree (markov_stats_buf);
4158
4159 /**
4160 * Finally sort them
4161 */
4162
4163 for (i = 0; i < SP_PW_MAX; i++)
4164 {
4165 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4166 }
4167
4168 for (i = 0; i < SP_PW_MAX; i++)
4169 {
4170 for (j = 0; j < CHARSIZ; j++)
4171 {
4172 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4173 }
4174 }
4175 }
4176
4177 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])
4178 {
4179 /**
4180 * Convert tables to css
4181 */
4182
4183 for (uint i = 0; i < SP_ROOT_CNT; i++)
4184 {
4185 uint pw_pos = i / CHARSIZ;
4186
4187 cs_t *cs = &root_css_buf[pw_pos];
4188
4189 if (cs->cs_len == threshold) continue;
4190
4191 uint key = root_table_buf[i].key;
4192
4193 if (uniq_tbls[pw_pos][key] == 0) continue;
4194
4195 cs->cs_buf[cs->cs_len] = key;
4196
4197 cs->cs_len++;
4198 }
4199
4200 /**
4201 * Convert table to css
4202 */
4203
4204 for (uint i = 0; i < SP_MARKOV_CNT; i++)
4205 {
4206 uint c = i / CHARSIZ;
4207
4208 cs_t *cs = &markov_css_buf[c];
4209
4210 if (cs->cs_len == threshold) continue;
4211
4212 uint pw_pos = c / CHARSIZ;
4213
4214 uint key = markov_table_buf[i].key;
4215
4216 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4217
4218 cs->cs_buf[cs->cs_len] = key;
4219
4220 cs->cs_len++;
4221 }
4222
4223 /*
4224 for (uint i = 0; i < 8; i++)
4225 {
4226 for (uint j = 0x20; j < 0x80; j++)
4227 {
4228 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4229
4230 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4231
4232 for (uint k = 0; k < 10; k++)
4233 {
4234 printf (" %u\n", ptr->cs_buf[k]);
4235 }
4236 }
4237 }
4238 */
4239 }
4240
4241 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4242 {
4243 for (uint i = 0; i < SP_PW_MAX; i += 2)
4244 {
4245 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4246
4247 out += CHARSIZ;
4248 in += CHARSIZ;
4249
4250 out->key = 0;
4251 out->val = 1;
4252
4253 out++;
4254
4255 for (uint j = 1; j < CHARSIZ; j++)
4256 {
4257 out->key = j;
4258 out->val = 0;
4259
4260 out++;
4261 }
4262 }
4263 }
4264
4265 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4266 {
4267 for (uint i = 0; i < SP_PW_MAX; i += 2)
4268 {
4269 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4270
4271 out += CHARSIZ * CHARSIZ;
4272 in += CHARSIZ * CHARSIZ;
4273
4274 for (uint j = 0; j < CHARSIZ; j++)
4275 {
4276 out->key = 0;
4277 out->val = 1;
4278
4279 out++;
4280
4281 for (uint k = 1; k < CHARSIZ; k++)
4282 {
4283 out->key = k;
4284 out->val = 0;
4285
4286 out++;
4287 }
4288 }
4289 }
4290 }
4291
4292 /**
4293 * mixed shared functions
4294 */
4295
4296 void dump_hex (const u8 *s, const int sz)
4297 {
4298 for (int i = 0; i < sz; i++)
4299 {
4300 log_info_nn ("%02x ", s[i]);
4301 }
4302
4303 log_info ("");
4304 }
4305
4306 void usage_mini_print (const char *progname)
4307 {
4308 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4309 }
4310
4311 void usage_big_print (const char *progname)
4312 {
4313 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4314 }
4315
4316 char *get_exec_path ()
4317 {
4318 int exec_path_len = 1024;
4319
4320 char *exec_path = (char *) mymalloc (exec_path_len);
4321
4322 #ifdef LINUX
4323
4324 char tmp[32] = { 0 };
4325
4326 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4327
4328 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4329
4330 #elif WIN
4331
4332 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4333
4334 #elif OSX
4335
4336 uint size = exec_path_len;
4337
4338 if (_NSGetExecutablePath (exec_path, &size) != 0)
4339 {
4340 log_error("! executable path buffer too small\n");
4341
4342 exit (-1);
4343 }
4344
4345 const int len = strlen (exec_path);
4346
4347 #else
4348 #error Your Operating System is not supported or detected
4349 #endif
4350
4351 exec_path[len] = 0;
4352
4353 return exec_path;
4354 }
4355
4356 char *get_install_dir (const char *progname)
4357 {
4358 char *install_dir = mystrdup (progname);
4359 char *last_slash = NULL;
4360
4361 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4362 {
4363 *last_slash = 0;
4364 }
4365 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4366 {
4367 *last_slash = 0;
4368 }
4369 else
4370 {
4371 install_dir[0] = '.';
4372 install_dir[1] = 0;
4373 }
4374
4375 return (install_dir);
4376 }
4377
4378 char *get_profile_dir (const char *homedir)
4379 {
4380 #define DOT_HASHCAT ".hashcat"
4381
4382 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4383
4384 char *profile_dir = (char *) mymalloc (len + 1);
4385
4386 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4387
4388 return profile_dir;
4389 }
4390
4391 char *get_session_dir (const char *profile_dir)
4392 {
4393 #define SESSIONS_FOLDER "sessions"
4394
4395 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4396
4397 char *session_dir = (char *) mymalloc (len + 1);
4398
4399 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4400
4401 return session_dir;
4402 }
4403
4404 uint count_lines (FILE *fd)
4405 {
4406 uint cnt = 0;
4407
4408 char *buf = (char *) mymalloc (HCBUFSIZ + 1);
4409
4410 char prev = '\n';
4411
4412 while (!feof (fd))
4413 {
4414 size_t nread = fread (buf, sizeof (char), HCBUFSIZ, fd);
4415
4416 if (nread < 1) continue;
4417
4418 size_t i;
4419
4420 for (i = 0; i < nread; i++)
4421 {
4422 if (prev == '\n') cnt++;
4423
4424 prev = buf[i];
4425 }
4426 }
4427
4428 myfree (buf);
4429
4430 return cnt;
4431 }
4432
4433 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4434 {
4435 uint crc = ~0;
4436
4437 FILE *fd = fopen (filename, "rb");
4438
4439 if (fd == NULL)
4440 {
4441 log_error ("%s: %s", filename, strerror (errno));
4442
4443 exit (-1);
4444 }
4445
4446 #define MAX_KEY_SIZE (1024 * 1024)
4447
4448 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4449
4450 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4451
4452 fclose (fd);
4453
4454 int kpos = 0;
4455
4456 for (int fpos = 0; fpos < nread; fpos++)
4457 {
4458 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4459
4460 keytab[kpos++] += (crc >> 24) & 0xff;
4461 keytab[kpos++] += (crc >> 16) & 0xff;
4462 keytab[kpos++] += (crc >> 8) & 0xff;
4463 keytab[kpos++] += (crc >> 0) & 0xff;
4464
4465 if (kpos >= 64) kpos = 0;
4466 }
4467
4468 myfree (buf);
4469 }
4470
4471 #ifdef OSX
4472 int pthread_setaffinity_np (pthread_t thread, size_t cpu_size, cpu_set_t *cpu_set)
4473 {
4474 int core;
4475
4476 for (core = 0; core < (8 * (int)cpu_size); core++)
4477 if (CPU_ISSET(core, cpu_set)) break;
4478
4479 thread_affinity_policy_data_t policy = { core };
4480
4481 const int rc = thread_policy_set (pthread_mach_thread_np (thread), THREAD_AFFINITY_POLICY, (thread_policy_t) &policy, 1);
4482
4483 if (data.quiet == 0)
4484 {
4485 if (rc != KERN_SUCCESS)
4486 {
4487 log_error ("ERROR: %s : %d", "thread_policy_set()", rc);
4488 }
4489 }
4490
4491 return rc;
4492 }
4493 #endif
4494
4495 void set_cpu_affinity (char *cpu_affinity)
4496 {
4497 #ifdef _WIN
4498 DWORD_PTR aff_mask = 0;
4499 #elif _POSIX
4500 cpu_set_t cpuset;
4501 CPU_ZERO (&cpuset);
4502 #endif
4503
4504 if (cpu_affinity)
4505 {
4506 char *devices = strdup (cpu_affinity);
4507
4508 char *next = strtok (devices, ",");
4509
4510 do
4511 {
4512 uint cpu_id = atoi (next);
4513
4514 if (cpu_id == 0)
4515 {
4516 #ifdef _WIN
4517 aff_mask = 0;
4518 #elif _POSIX
4519 CPU_ZERO (&cpuset);
4520 #endif
4521
4522 break;
4523 }
4524
4525 if (cpu_id > 32)
4526 {
4527 log_error ("ERROR: Invalid cpu_id %u specified", cpu_id);
4528
4529 exit (-1);
4530 }
4531
4532 #ifdef _WIN
4533 aff_mask |= 1 << (cpu_id - 1);
4534 #elif _POSIX
4535 CPU_SET ((cpu_id - 1), &cpuset);
4536 #endif
4537
4538 } while ((next = strtok (NULL, ",")) != NULL);
4539
4540 free (devices);
4541 }
4542
4543 #ifdef _WIN
4544 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4545 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4546 #elif _POSIX
4547 pthread_t thread = pthread_self ();
4548 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4549 #endif
4550 }
4551
4552 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4553 {
4554 char *element, *end;
4555
4556 end = (char *) base + nmemb * size;
4557
4558 for (element = (char *) base; element < end; element += size)
4559 if (!compar (element, key))
4560 return element;
4561
4562 return NULL;
4563 }
4564
4565 int sort_by_u32 (const void *v1, const void *v2)
4566 {
4567 const u32 *s1 = (const u32 *) v1;
4568 const u32 *s2 = (const u32 *) v2;
4569
4570 return *s1 - *s2;
4571 }
4572
4573 int sort_by_salt (const void *v1, const void *v2)
4574 {
4575 const salt_t *s1 = (const salt_t *) v1;
4576 const salt_t *s2 = (const salt_t *) v2;
4577
4578 const int res1 = s1->salt_len - s2->salt_len;
4579
4580 if (res1 != 0) return (res1);
4581
4582 const int res2 = s1->salt_iter - s2->salt_iter;
4583
4584 if (res2 != 0) return (res2);
4585
4586 uint n;
4587
4588 n = 16;
4589
4590 while (n--)
4591 {
4592 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4593 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4594 }
4595
4596 n = 8;
4597
4598 while (n--)
4599 {
4600 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4601 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4602 }
4603
4604 return (0);
4605 }
4606
4607 int sort_by_salt_buf (const void *v1, const void *v2)
4608 {
4609 const pot_t *p1 = (const pot_t *) v1;
4610 const pot_t *p2 = (const pot_t *) v2;
4611
4612 const hash_t *h1 = &p1->hash;
4613 const hash_t *h2 = &p2->hash;
4614
4615 const salt_t *s1 = h1->salt;
4616 const salt_t *s2 = h2->salt;
4617
4618 uint n = 16;
4619
4620 while (n--)
4621 {
4622 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4623 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4624 }
4625
4626 return 0;
4627 }
4628
4629 int sort_by_hash_t_salt (const void *v1, const void *v2)
4630 {
4631 const hash_t *h1 = (const hash_t *) v1;
4632 const hash_t *h2 = (const hash_t *) v2;
4633
4634 const salt_t *s1 = h1->salt;
4635 const salt_t *s2 = h2->salt;
4636
4637 // testphase: this should work
4638 uint n = 16;
4639
4640 while (n--)
4641 {
4642 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4643 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4644 }
4645
4646 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4647 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4648 if (s1->salt_len > s2->salt_len) return ( 1);
4649 if (s1->salt_len < s2->salt_len) return (-1);
4650
4651 uint n = s1->salt_len;
4652
4653 while (n--)
4654 {
4655 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4656 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4657 }
4658 */
4659
4660 return 0;
4661 }
4662
4663 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4664 {
4665 const hash_t *h1 = (const hash_t *) v1;
4666 const hash_t *h2 = (const hash_t *) v2;
4667
4668 const salt_t *s1 = h1->salt;
4669 const salt_t *s2 = h2->salt;
4670
4671 // 16 - 2 (since last 2 uints contain the digest)
4672 uint n = 14;
4673
4674 while (n--)
4675 {
4676 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4677 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4678 }
4679
4680 return 0;
4681 }
4682
4683 int sort_by_hash_no_salt (const void *v1, const void *v2)
4684 {
4685 const hash_t *h1 = (const hash_t *) v1;
4686 const hash_t *h2 = (const hash_t *) v2;
4687
4688 const void *d1 = h1->digest;
4689 const void *d2 = h2->digest;
4690
4691 return data.sort_by_digest (d1, d2);
4692 }
4693
4694 int sort_by_hash (const void *v1, const void *v2)
4695 {
4696 const hash_t *h1 = (const hash_t *) v1;
4697 const hash_t *h2 = (const hash_t *) v2;
4698
4699 if (data.isSalted)
4700 {
4701 const salt_t *s1 = h1->salt;
4702 const salt_t *s2 = h2->salt;
4703
4704 int res = sort_by_salt (s1, s2);
4705
4706 if (res != 0) return (res);
4707 }
4708
4709 const void *d1 = h1->digest;
4710 const void *d2 = h2->digest;
4711
4712 return data.sort_by_digest (d1, d2);
4713 }
4714
4715 int sort_by_pot (const void *v1, const void *v2)
4716 {
4717 const pot_t *p1 = (const pot_t *) v1;
4718 const pot_t *p2 = (const pot_t *) v2;
4719
4720 const hash_t *h1 = &p1->hash;
4721 const hash_t *h2 = &p2->hash;
4722
4723 return sort_by_hash (h1, h2);
4724 }
4725
4726 int sort_by_mtime (const void *p1, const void *p2)
4727 {
4728 const char **f1 = (const char **) p1;
4729 const char **f2 = (const char **) p2;
4730
4731 struct stat s1; stat (*f1, &s1);
4732 struct stat s2; stat (*f2, &s2);
4733
4734 return s2.st_mtime - s1.st_mtime;
4735 }
4736
4737 int sort_by_cpu_rule (const void *p1, const void *p2)
4738 {
4739 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4740 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4741
4742 return memcmp (r1, r2, sizeof (cpu_rule_t));
4743 }
4744
4745 int sort_by_kernel_rule (const void *p1, const void *p2)
4746 {
4747 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4748 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4749
4750 return memcmp (r1, r2, sizeof (kernel_rule_t));
4751 }
4752
4753 int sort_by_stringptr (const void *p1, const void *p2)
4754 {
4755 const char **s1 = (const char **) p1;
4756 const char **s2 = (const char **) p2;
4757
4758 return strcmp (*s1, *s2);
4759 }
4760
4761 int sort_by_dictstat (const void *s1, const void *s2)
4762 {
4763 dictstat_t *d1 = (dictstat_t *) s1;
4764 dictstat_t *d2 = (dictstat_t *) s2;
4765
4766 #ifdef _LINUX
4767 d2->stat.st_atim = d1->stat.st_atim;
4768 #else
4769 d2->stat.st_atime = d1->stat.st_atime;
4770 #endif
4771
4772 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4773 }
4774
4775 int sort_by_bitmap (const void *p1, const void *p2)
4776 {
4777 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4778 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4779
4780 return b1->collisions - b2->collisions;
4781 }
4782
4783 int sort_by_digest_4_2 (const void *v1, const void *v2)
4784 {
4785 const u32 *d1 = (const u32 *) v1;
4786 const u32 *d2 = (const u32 *) v2;
4787
4788 uint n = 2;
4789
4790 while (n--)
4791 {
4792 if (d1[n] > d2[n]) return ( 1);
4793 if (d1[n] < d2[n]) return (-1);
4794 }
4795
4796 return (0);
4797 }
4798
4799 int sort_by_digest_4_4 (const void *v1, const void *v2)
4800 {
4801 const u32 *d1 = (const u32 *) v1;
4802 const u32 *d2 = (const u32 *) v2;
4803
4804 uint n = 4;
4805
4806 while (n--)
4807 {
4808 if (d1[n] > d2[n]) return ( 1);
4809 if (d1[n] < d2[n]) return (-1);
4810 }
4811
4812 return (0);
4813 }
4814
4815 int sort_by_digest_4_5 (const void *v1, const void *v2)
4816 {
4817 const u32 *d1 = (const u32 *) v1;
4818 const u32 *d2 = (const u32 *) v2;
4819
4820 uint n = 5;
4821
4822 while (n--)
4823 {
4824 if (d1[n] > d2[n]) return ( 1);
4825 if (d1[n] < d2[n]) return (-1);
4826 }
4827
4828 return (0);
4829 }
4830
4831 int sort_by_digest_4_6 (const void *v1, const void *v2)
4832 {
4833 const u32 *d1 = (const u32 *) v1;
4834 const u32 *d2 = (const u32 *) v2;
4835
4836 uint n = 6;
4837
4838 while (n--)
4839 {
4840 if (d1[n] > d2[n]) return ( 1);
4841 if (d1[n] < d2[n]) return (-1);
4842 }
4843
4844 return (0);
4845 }
4846
4847 int sort_by_digest_4_8 (const void *v1, const void *v2)
4848 {
4849 const u32 *d1 = (const u32 *) v1;
4850 const u32 *d2 = (const u32 *) v2;
4851
4852 uint n = 8;
4853
4854 while (n--)
4855 {
4856 if (d1[n] > d2[n]) return ( 1);
4857 if (d1[n] < d2[n]) return (-1);
4858 }
4859
4860 return (0);
4861 }
4862
4863 int sort_by_digest_4_16 (const void *v1, const void *v2)
4864 {
4865 const u32 *d1 = (const u32 *) v1;
4866 const u32 *d2 = (const u32 *) v2;
4867
4868 uint n = 16;
4869
4870 while (n--)
4871 {
4872 if (d1[n] > d2[n]) return ( 1);
4873 if (d1[n] < d2[n]) return (-1);
4874 }
4875
4876 return (0);
4877 }
4878
4879 int sort_by_digest_4_32 (const void *v1, const void *v2)
4880 {
4881 const u32 *d1 = (const u32 *) v1;
4882 const u32 *d2 = (const u32 *) v2;
4883
4884 uint n = 32;
4885
4886 while (n--)
4887 {
4888 if (d1[n] > d2[n]) return ( 1);
4889 if (d1[n] < d2[n]) return (-1);
4890 }
4891
4892 return (0);
4893 }
4894
4895 int sort_by_digest_4_64 (const void *v1, const void *v2)
4896 {
4897 const u32 *d1 = (const u32 *) v1;
4898 const u32 *d2 = (const u32 *) v2;
4899
4900 uint n = 64;
4901
4902 while (n--)
4903 {
4904 if (d1[n] > d2[n]) return ( 1);
4905 if (d1[n] < d2[n]) return (-1);
4906 }
4907
4908 return (0);
4909 }
4910
4911 int sort_by_digest_8_8 (const void *v1, const void *v2)
4912 {
4913 const u64 *d1 = (const u64 *) v1;
4914 const u64 *d2 = (const u64 *) v2;
4915
4916 uint n = 8;
4917
4918 while (n--)
4919 {
4920 if (d1[n] > d2[n]) return ( 1);
4921 if (d1[n] < d2[n]) return (-1);
4922 }
4923
4924 return (0);
4925 }
4926
4927 int sort_by_digest_8_16 (const void *v1, const void *v2)
4928 {
4929 const u64 *d1 = (const u64 *) v1;
4930 const u64 *d2 = (const u64 *) v2;
4931
4932 uint n = 16;
4933
4934 while (n--)
4935 {
4936 if (d1[n] > d2[n]) return ( 1);
4937 if (d1[n] < d2[n]) return (-1);
4938 }
4939
4940 return (0);
4941 }
4942
4943 int sort_by_digest_8_25 (const void *v1, const void *v2)
4944 {
4945 const u64 *d1 = (const u64 *) v1;
4946 const u64 *d2 = (const u64 *) v2;
4947
4948 uint n = 25;
4949
4950 while (n--)
4951 {
4952 if (d1[n] > d2[n]) return ( 1);
4953 if (d1[n] < d2[n]) return (-1);
4954 }
4955
4956 return (0);
4957 }
4958
4959 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4960 {
4961 const u32 *d1 = (const u32 *) v1;
4962 const u32 *d2 = (const u32 *) v2;
4963
4964 const uint dgst_pos0 = data.dgst_pos0;
4965 const uint dgst_pos1 = data.dgst_pos1;
4966 const uint dgst_pos2 = data.dgst_pos2;
4967 const uint dgst_pos3 = data.dgst_pos3;
4968
4969 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4970 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4971 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4972 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4973 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4974 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4975 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4976 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4977
4978 return (0);
4979 }
4980
4981 int sort_by_tuning_db_alias (const void *v1, const void *v2)
4982 {
4983 const tuning_db_alias_t *t1 = (const tuning_db_alias_t *) v1;
4984 const tuning_db_alias_t *t2 = (const tuning_db_alias_t *) v2;
4985
4986 const int res1 = strcmp (t1->device_name, t2->device_name);
4987
4988 if (res1 != 0) return (res1);
4989
4990 return 0;
4991 }
4992
4993 int sort_by_tuning_db_entry (const void *v1, const void *v2)
4994 {
4995 const tuning_db_entry_t *t1 = (const tuning_db_entry_t *) v1;
4996 const tuning_db_entry_t *t2 = (const tuning_db_entry_t *) v2;
4997
4998 const int res1 = strcmp (t1->device_name, t2->device_name);
4999
5000 if (res1 != 0) return (res1);
5001
5002 const int res2 = t1->attack_mode
5003 - t2->attack_mode;
5004
5005 if (res2 != 0) return (res2);
5006
5007 const int res3 = t1->hash_type
5008 - t2->hash_type;
5009
5010 if (res3 != 0) return (res3);
5011
5012 return 0;
5013 }
5014
5015 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)
5016 {
5017 uint outfile_autohex = data.outfile_autohex;
5018
5019 unsigned char *rule_ptr = (unsigned char *) rule_buf;
5020
5021 FILE *debug_fp = NULL;
5022
5023 if (debug_file != NULL)
5024 {
5025 debug_fp = fopen (debug_file, "ab");
5026
5027 lock_file (debug_fp);
5028 }
5029 else
5030 {
5031 debug_fp = stderr;
5032 }
5033
5034 if (debug_fp == NULL)
5035 {
5036 log_info ("WARNING: Could not open debug-file for writing");
5037 }
5038 else
5039 {
5040 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
5041 {
5042 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
5043
5044 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
5045 }
5046
5047 fwrite (rule_ptr, rule_len, 1, debug_fp);
5048
5049 if (debug_mode == 4)
5050 {
5051 fputc (':', debug_fp);
5052
5053 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
5054 }
5055
5056 fputc ('\n', debug_fp);
5057
5058 if (debug_file != NULL) fclose (debug_fp);
5059 }
5060 }
5061
5062 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
5063 {
5064 int needs_hexify = 0;
5065
5066 if (outfile_autohex == 1)
5067 {
5068 for (uint i = 0; i < plain_len; i++)
5069 {
5070 if (plain_ptr[i] < 0x20)
5071 {
5072 needs_hexify = 1;
5073
5074 break;
5075 }
5076
5077 if (plain_ptr[i] > 0x7f)
5078 {
5079 needs_hexify = 1;
5080
5081 break;
5082 }
5083 }
5084 }
5085
5086 if (needs_hexify == 1)
5087 {
5088 fprintf (fp, "$HEX[");
5089
5090 for (uint i = 0; i < plain_len; i++)
5091 {
5092 fprintf (fp, "%02x", plain_ptr[i]);
5093 }
5094
5095 fprintf (fp, "]");
5096 }
5097 else
5098 {
5099 fwrite (plain_ptr, plain_len, 1, fp);
5100 }
5101 }
5102
5103 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)
5104 {
5105 uint outfile_format = data.outfile_format;
5106
5107 char separator = data.separator;
5108
5109 if (outfile_format & OUTFILE_FMT_HASH)
5110 {
5111 fprintf (out_fp, "%s", out_buf);
5112
5113 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5114 {
5115 fputc (separator, out_fp);
5116 }
5117 }
5118 else if (data.username)
5119 {
5120 if (username != NULL)
5121 {
5122 for (uint i = 0; i < user_len; i++)
5123 {
5124 fprintf (out_fp, "%c", username[i]);
5125 }
5126
5127 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5128 {
5129 fputc (separator, out_fp);
5130 }
5131 }
5132 }
5133
5134 if (outfile_format & OUTFILE_FMT_PLAIN)
5135 {
5136 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
5137
5138 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5139 {
5140 fputc (separator, out_fp);
5141 }
5142 }
5143
5144 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
5145 {
5146 for (uint i = 0; i < plain_len; i++)
5147 {
5148 fprintf (out_fp, "%02x", plain_ptr[i]);
5149 }
5150
5151 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
5152 {
5153 fputc (separator, out_fp);
5154 }
5155 }
5156
5157 if (outfile_format & OUTFILE_FMT_CRACKPOS)
5158 {
5159 #ifdef _WIN
5160 __mingw_fprintf (out_fp, "%llu", crackpos);
5161 #endif
5162
5163 #ifdef _POSIX
5164 #ifdef __x86_64__
5165 fprintf (out_fp, "%lu", (unsigned long) crackpos);
5166 #else
5167 fprintf (out_fp, "%llu", crackpos);
5168 #endif
5169 #endif
5170 }
5171
5172 fputc ('\n', out_fp);
5173 }
5174
5175 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)
5176 {
5177 pot_t pot_key;
5178
5179 pot_key.hash.salt = hashes_buf->salt;
5180 pot_key.hash.digest = hashes_buf->digest;
5181
5182 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5183
5184 if (pot_ptr)
5185 {
5186 log_info_nn ("");
5187
5188 input_buf[input_len] = 0;
5189
5190 // user
5191 unsigned char *username = NULL;
5192 uint user_len = 0;
5193
5194 if (data.username)
5195 {
5196 user_t *user = hashes_buf->hash_info->user;
5197
5198 if (user)
5199 {
5200 username = (unsigned char *) (user->user_name);
5201
5202 user_len = user->user_len;
5203 }
5204 }
5205
5206 // do output the line
5207 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
5208 }
5209 }
5210
5211 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
5212 #define LM_MASKED_PLAIN "[notfound]"
5213
5214 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)
5215 {
5216 // left
5217
5218 pot_t pot_left_key;
5219
5220 pot_left_key.hash.salt = hash_left->salt;
5221 pot_left_key.hash.digest = hash_left->digest;
5222
5223 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5224
5225 // right
5226
5227 uint weak_hash_found = 0;
5228
5229 pot_t pot_right_key;
5230
5231 pot_right_key.hash.salt = hash_right->salt;
5232 pot_right_key.hash.digest = hash_right->digest;
5233
5234 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5235
5236 if (pot_right_ptr == NULL)
5237 {
5238 // special case, if "weak hash"
5239
5240 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5241 {
5242 weak_hash_found = 1;
5243
5244 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5245
5246 // in theory this is not needed, but we are paranoia:
5247
5248 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5249 pot_right_ptr->plain_len = 0;
5250 }
5251 }
5252
5253 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
5254 {
5255 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
5256
5257 return;
5258 }
5259
5260 // at least one half was found:
5261
5262 log_info_nn ("");
5263
5264 input_buf[input_len] = 0;
5265
5266 // user
5267
5268 unsigned char *username = NULL;
5269 uint user_len = 0;
5270
5271 if (data.username)
5272 {
5273 user_t *user = hash_left->hash_info->user;
5274
5275 if (user)
5276 {
5277 username = (unsigned char *) (user->user_name);
5278
5279 user_len = user->user_len;
5280 }
5281 }
5282
5283 // mask the part which was not found
5284
5285 uint left_part_masked = 0;
5286 uint right_part_masked = 0;
5287
5288 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5289
5290 if (pot_left_ptr == NULL)
5291 {
5292 left_part_masked = 1;
5293
5294 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5295
5296 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5297
5298 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5299 pot_left_ptr->plain_len = mask_plain_len;
5300 }
5301
5302 if (pot_right_ptr == NULL)
5303 {
5304 right_part_masked = 1;
5305
5306 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5307
5308 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5309
5310 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5311 pot_right_ptr->plain_len = mask_plain_len;
5312 }
5313
5314 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5315
5316 pot_t pot_ptr;
5317
5318 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5319
5320 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5321
5322 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5323
5324 // do output the line
5325
5326 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5327
5328 if (weak_hash_found == 1) myfree (pot_right_ptr);
5329
5330 if (left_part_masked == 1) myfree (pot_left_ptr);
5331 if (right_part_masked == 1) myfree (pot_right_ptr);
5332 }
5333
5334 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)
5335 {
5336 pot_t pot_key;
5337
5338 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5339
5340 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5341
5342 if (pot_ptr == NULL)
5343 {
5344 log_info_nn ("");
5345
5346 input_buf[input_len] = 0;
5347
5348 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5349 }
5350 }
5351
5352 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)
5353 {
5354 // left
5355
5356 pot_t pot_left_key;
5357
5358 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5359
5360 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5361
5362 // right
5363
5364 pot_t pot_right_key;
5365
5366 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5367
5368 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5369
5370 uint weak_hash_found = 0;
5371
5372 if (pot_right_ptr == NULL)
5373 {
5374 // special case, if "weak hash"
5375
5376 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5377 {
5378 weak_hash_found = 1;
5379
5380 // we just need that pot_right_ptr is not a NULL pointer
5381
5382 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5383 }
5384 }
5385
5386 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5387 {
5388 if (weak_hash_found == 1) myfree (pot_right_ptr);
5389
5390 return;
5391 }
5392
5393 // ... at least one part was not cracked
5394
5395 log_info_nn ("");
5396
5397 input_buf[input_len] = 0;
5398
5399 // only show the hash part which is still not cracked
5400
5401 uint user_len = input_len - 32;
5402
5403 char *hash_output = (char *) mymalloc (33);
5404
5405 memcpy (hash_output, input_buf, input_len);
5406
5407 if (pot_left_ptr != NULL)
5408 {
5409 // only show right part (because left part was already found)
5410
5411 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5412
5413 hash_output[user_len + 16] = 0;
5414 }
5415
5416 if (pot_right_ptr != NULL)
5417 {
5418 // only show left part (because right part was already found)
5419
5420 memcpy (hash_output + user_len, input_buf + user_len, 16);
5421
5422 hash_output[user_len + 16] = 0;
5423 }
5424
5425 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5426
5427 myfree (hash_output);
5428
5429 if (weak_hash_found == 1) myfree (pot_right_ptr);
5430 }
5431
5432 uint setup_opencl_platforms_filter (char *opencl_platforms)
5433 {
5434 uint opencl_platforms_filter = 0;
5435
5436 if (opencl_platforms)
5437 {
5438 char *platforms = strdup (opencl_platforms);
5439
5440 char *next = strtok (platforms, ",");
5441
5442 do
5443 {
5444 int platform = atoi (next);
5445
5446 if (platform < 1 || platform > 32)
5447 {
5448 log_error ("ERROR: Invalid OpenCL platform %u specified", platform);
5449
5450 exit (-1);
5451 }
5452
5453 opencl_platforms_filter |= 1 << (platform - 1);
5454
5455 } while ((next = strtok (NULL, ",")) != NULL);
5456
5457 free (platforms);
5458 }
5459 else
5460 {
5461 opencl_platforms_filter = -1;
5462 }
5463
5464 return opencl_platforms_filter;
5465 }
5466
5467 u32 setup_devices_filter (char *opencl_devices)
5468 {
5469 u32 devices_filter = 0;
5470
5471 if (opencl_devices)
5472 {
5473 char *devices = strdup (opencl_devices);
5474
5475 char *next = strtok (devices, ",");
5476
5477 do
5478 {
5479 int device_id = atoi (next);
5480
5481 if (device_id < 1 || device_id > 32)
5482 {
5483 log_error ("ERROR: Invalid device_id %u specified", device_id);
5484
5485 exit (-1);
5486 }
5487
5488 devices_filter |= 1 << (device_id - 1);
5489
5490 } while ((next = strtok (NULL, ",")) != NULL);
5491
5492 free (devices);
5493 }
5494 else
5495 {
5496 devices_filter = -1;
5497 }
5498
5499 return devices_filter;
5500 }
5501
5502 cl_device_type setup_device_types_filter (char *opencl_device_types)
5503 {
5504 cl_device_type device_types_filter = 0;
5505
5506 if (opencl_device_types)
5507 {
5508 char *device_types = strdup (opencl_device_types);
5509
5510 char *next = strtok (device_types, ",");
5511
5512 do
5513 {
5514 int device_type = atoi (next);
5515
5516 if (device_type < 1 || device_type > 3)
5517 {
5518 log_error ("ERROR: Invalid device_type %u specified", device_type);
5519
5520 exit (-1);
5521 }
5522
5523 device_types_filter |= 1 << device_type;
5524
5525 } while ((next = strtok (NULL, ",")) != NULL);
5526
5527 free (device_types);
5528 }
5529 else
5530 {
5531 // Do not use CPU by default, this often reduces GPU performance because
5532 // the CPU is too busy to handle GPU synchronization
5533
5534 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5535 }
5536
5537 return device_types_filter;
5538 }
5539
5540 u32 get_random_num (const u32 min, const u32 max)
5541 {
5542 if (min == max) return (min);
5543
5544 return ((rand () % (max - min)) + min);
5545 }
5546
5547 u32 mydivc32 (const u32 dividend, const u32 divisor)
5548 {
5549 u32 quotient = dividend / divisor;
5550
5551 if (dividend % divisor) quotient++;
5552
5553 return quotient;
5554 }
5555
5556 u64 mydivc64 (const u64 dividend, const u64 divisor)
5557 {
5558 u64 quotient = dividend / divisor;
5559
5560 if (dividend % divisor) quotient++;
5561
5562 return quotient;
5563 }
5564
5565 void format_timer_display (struct tm *tm, char *buf, size_t len)
5566 {
5567 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5568 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5569
5570 if (tm->tm_year - 70)
5571 {
5572 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5573 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5574
5575 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5576 }
5577 else if (tm->tm_yday)
5578 {
5579 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5580 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5581
5582 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5583 }
5584 else if (tm->tm_hour)
5585 {
5586 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5587 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5588
5589 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5590 }
5591 else if (tm->tm_min)
5592 {
5593 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5594 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5595
5596 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5597 }
5598 else
5599 {
5600 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5601
5602 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5603 }
5604 }
5605
5606 void format_speed_display (float val, char *buf, size_t len)
5607 {
5608 if (val <= 0)
5609 {
5610 buf[0] = '0';
5611 buf[1] = ' ';
5612 buf[2] = 0;
5613
5614 return;
5615 }
5616
5617 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5618
5619 uint level = 0;
5620
5621 while (val > 99999)
5622 {
5623 val /= 1000;
5624
5625 level++;
5626 }
5627
5628 /* generate output */
5629
5630 if (level == 0)
5631 {
5632 snprintf (buf, len - 1, "%.0f ", val);
5633 }
5634 else
5635 {
5636 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5637 }
5638 }
5639
5640 void lowercase (u8 *buf, int len)
5641 {
5642 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5643 }
5644
5645 void uppercase (u8 *buf, int len)
5646 {
5647 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5648 }
5649
5650 int fgetl (FILE *fp, char *line_buf)
5651 {
5652 int line_len = 0;
5653
5654 while (!feof (fp))
5655 {
5656 const int c = fgetc (fp);
5657
5658 if (c == EOF) break;
5659
5660 line_buf[line_len] = (char) c;
5661
5662 line_len++;
5663
5664 if (line_len == HCBUFSIZ) line_len--;
5665
5666 if (c == '\n') break;
5667 }
5668
5669 if (line_len == 0) return 0;
5670
5671 if (line_buf[line_len - 1] == '\n')
5672 {
5673 line_len--;
5674
5675 line_buf[line_len] = 0;
5676 }
5677
5678 if (line_len == 0) return 0;
5679
5680 if (line_buf[line_len - 1] == '\r')
5681 {
5682 line_len--;
5683
5684 line_buf[line_len] = 0;
5685 }
5686
5687 return (line_len);
5688 }
5689
5690 int in_superchop (char *buf)
5691 {
5692 int len = strlen (buf);
5693
5694 while (len)
5695 {
5696 if (buf[len - 1] == '\n')
5697 {
5698 len--;
5699
5700 continue;
5701 }
5702
5703 if (buf[len - 1] == '\r')
5704 {
5705 len--;
5706
5707 continue;
5708 }
5709
5710 break;
5711 }
5712
5713 buf[len] = 0;
5714
5715 return len;
5716 }
5717
5718 char **scan_directory (const char *path)
5719 {
5720 char *tmp_path = mystrdup (path);
5721
5722 size_t tmp_path_len = strlen (tmp_path);
5723
5724 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5725 {
5726 tmp_path[tmp_path_len - 1] = 0;
5727
5728 tmp_path_len = strlen (tmp_path);
5729 }
5730
5731 char **files = NULL;
5732
5733 int num_files = 0;
5734
5735 DIR *d = NULL;
5736
5737 if ((d = opendir (tmp_path)) != NULL)
5738 {
5739 #ifdef OSX
5740 struct dirent e;
5741
5742 for (;;) {
5743 memset (&e, 0, sizeof (e));
5744 struct dirent *de = NULL;
5745
5746 if (readdir_r (d, &e, &de) != 0)
5747 {
5748 log_error ("ERROR: readdir_r() failed");
5749
5750 break;
5751 }
5752
5753 if (de == NULL) break;
5754 #else
5755 struct dirent *de;
5756
5757 while ((de = readdir (d)) != NULL)
5758 {
5759 #endif
5760 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5761
5762 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5763
5764 char *path_file = (char *) mymalloc (path_size + 1);
5765
5766 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5767
5768 path_file[path_size] = 0;
5769
5770 DIR *d_test;
5771
5772 if ((d_test = opendir (path_file)) != NULL)
5773 {
5774 closedir (d_test);
5775
5776 myfree (path_file);
5777 }
5778 else
5779 {
5780 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5781
5782 num_files++;
5783
5784 files[num_files - 1] = path_file;
5785 }
5786 }
5787
5788 closedir (d);
5789 }
5790 else if (errno == ENOTDIR)
5791 {
5792 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5793
5794 num_files++;
5795
5796 files[num_files - 1] = mystrdup (path);
5797 }
5798
5799 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5800
5801 num_files++;
5802
5803 files[num_files - 1] = NULL;
5804
5805 myfree (tmp_path);
5806
5807 return (files);
5808 }
5809
5810 int count_dictionaries (char **dictionary_files)
5811 {
5812 if (dictionary_files == NULL) return 0;
5813
5814 int cnt = 0;
5815
5816 for (int d = 0; dictionary_files[d] != NULL; d++)
5817 {
5818 cnt++;
5819 }
5820
5821 return (cnt);
5822 }
5823
5824 char *stroptitype (const uint opti_type)
5825 {
5826 switch (opti_type)
5827 {
5828 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5829 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5830 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5831 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5832 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5833 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5834 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5835 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5836 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5837 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5838 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5839 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5840 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5841 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5842 case OPTI_TYPE_SLOW_HASH_SIMD: return ((char *) OPTI_STR_SLOW_HASH_SIMD); break;
5843 case OPTI_TYPE_USES_BITS_8: return ((char *) OPTI_STR_USES_BITS_8); break;
5844 case OPTI_TYPE_USES_BITS_16: return ((char *) OPTI_STR_USES_BITS_16); break;
5845 case OPTI_TYPE_USES_BITS_32: return ((char *) OPTI_STR_USES_BITS_32); break;
5846 case OPTI_TYPE_USES_BITS_64: return ((char *) OPTI_STR_USES_BITS_64); break;
5847 }
5848
5849 return (NULL);
5850 }
5851
5852 char *strparser (const uint parser_status)
5853 {
5854 switch (parser_status)
5855 {
5856 case PARSER_OK: return ((char *) PA_000); break;
5857 case PARSER_COMMENT: return ((char *) PA_001); break;
5858 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5859 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5860 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5861 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5862 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5863 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5864 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5865 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5866 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5867 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5868 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5869 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5870 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5871 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5872 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5873 }
5874
5875 return ((char *) PA_255);
5876 }
5877
5878 char *strhashtype (const uint hash_mode)
5879 {
5880 switch (hash_mode)
5881 {
5882 case 0: return ((char *) HT_00000); break;
5883 case 10: return ((char *) HT_00010); break;
5884 case 11: return ((char *) HT_00011); break;
5885 case 12: return ((char *) HT_00012); break;
5886 case 20: return ((char *) HT_00020); break;
5887 case 21: return ((char *) HT_00021); break;
5888 case 22: return ((char *) HT_00022); break;
5889 case 23: return ((char *) HT_00023); break;
5890 case 30: return ((char *) HT_00030); break;
5891 case 40: return ((char *) HT_00040); break;
5892 case 50: return ((char *) HT_00050); break;
5893 case 60: return ((char *) HT_00060); break;
5894 case 100: return ((char *) HT_00100); break;
5895 case 101: return ((char *) HT_00101); break;
5896 case 110: return ((char *) HT_00110); break;
5897 case 111: return ((char *) HT_00111); break;
5898 case 112: return ((char *) HT_00112); break;
5899 case 120: return ((char *) HT_00120); break;
5900 case 121: return ((char *) HT_00121); break;
5901 case 122: return ((char *) HT_00122); break;
5902 case 124: return ((char *) HT_00124); break;
5903 case 125: return ((char *) HT_00125); break;
5904 case 130: return ((char *) HT_00130); break;
5905 case 131: return ((char *) HT_00131); break;
5906 case 132: return ((char *) HT_00132); break;
5907 case 133: return ((char *) HT_00133); break;
5908 case 140: return ((char *) HT_00140); break;
5909 case 141: return ((char *) HT_00141); break;
5910 case 150: return ((char *) HT_00150); break;
5911 case 160: return ((char *) HT_00160); break;
5912 case 200: return ((char *) HT_00200); break;
5913 case 300: return ((char *) HT_00300); break;
5914 case 400: return ((char *) HT_00400); break;
5915 case 500: return ((char *) HT_00500); break;
5916 case 501: return ((char *) HT_00501); break;
5917 case 900: return ((char *) HT_00900); break;
5918 case 910: return ((char *) HT_00910); break;
5919 case 1000: return ((char *) HT_01000); break;
5920 case 1100: return ((char *) HT_01100); break;
5921 case 1400: return ((char *) HT_01400); break;
5922 case 1410: return ((char *) HT_01410); break;
5923 case 1420: return ((char *) HT_01420); break;
5924 case 1421: return ((char *) HT_01421); break;
5925 case 1430: return ((char *) HT_01430); break;
5926 case 1440: return ((char *) HT_01440); break;
5927 case 1441: return ((char *) HT_01441); break;
5928 case 1450: return ((char *) HT_01450); break;
5929 case 1460: return ((char *) HT_01460); break;
5930 case 1500: return ((char *) HT_01500); break;
5931 case 1600: return ((char *) HT_01600); break;
5932 case 1700: return ((char *) HT_01700); break;
5933 case 1710: return ((char *) HT_01710); break;
5934 case 1711: return ((char *) HT_01711); break;
5935 case 1720: return ((char *) HT_01720); break;
5936 case 1722: return ((char *) HT_01722); break;
5937 case 1730: return ((char *) HT_01730); break;
5938 case 1731: return ((char *) HT_01731); break;
5939 case 1740: return ((char *) HT_01740); break;
5940 case 1750: return ((char *) HT_01750); break;
5941 case 1760: return ((char *) HT_01760); break;
5942 case 1800: return ((char *) HT_01800); break;
5943 case 2100: return ((char *) HT_02100); break;
5944 case 2400: return ((char *) HT_02400); break;
5945 case 2410: return ((char *) HT_02410); break;
5946 case 2500: return ((char *) HT_02500); break;
5947 case 2600: return ((char *) HT_02600); break;
5948 case 2611: return ((char *) HT_02611); break;
5949 case 2612: return ((char *) HT_02612); break;
5950 case 2711: return ((char *) HT_02711); break;
5951 case 2811: return ((char *) HT_02811); break;
5952 case 3000: return ((char *) HT_03000); break;
5953 case 3100: return ((char *) HT_03100); break;
5954 case 3200: return ((char *) HT_03200); break;
5955 case 3710: return ((char *) HT_03710); break;
5956 case 3711: return ((char *) HT_03711); break;
5957 case 3800: return ((char *) HT_03800); break;
5958 case 4300: return ((char *) HT_04300); break;
5959 case 4400: return ((char *) HT_04400); break;
5960 case 4500: return ((char *) HT_04500); break;
5961 case 4700: return ((char *) HT_04700); break;
5962 case 4800: return ((char *) HT_04800); break;
5963 case 4900: return ((char *) HT_04900); break;
5964 case 5000: return ((char *) HT_05000); break;
5965 case 5100: return ((char *) HT_05100); break;
5966 case 5200: return ((char *) HT_05200); break;
5967 case 5300: return ((char *) HT_05300); break;
5968 case 5400: return ((char *) HT_05400); break;
5969 case 5500: return ((char *) HT_05500); break;
5970 case 5600: return ((char *) HT_05600); break;
5971 case 5700: return ((char *) HT_05700); break;
5972 case 5800: return ((char *) HT_05800); break;
5973 case 6000: return ((char *) HT_06000); break;
5974 case 6100: return ((char *) HT_06100); break;
5975 case 6211: return ((char *) HT_06211); break;
5976 case 6212: return ((char *) HT_06212); break;
5977 case 6213: return ((char *) HT_06213); break;
5978 case 6221: return ((char *) HT_06221); break;
5979 case 6222: return ((char *) HT_06222); break;
5980 case 6223: return ((char *) HT_06223); break;
5981 case 6231: return ((char *) HT_06231); break;
5982 case 6232: return ((char *) HT_06232); break;
5983 case 6233: return ((char *) HT_06233); break;
5984 case 6241: return ((char *) HT_06241); break;
5985 case 6242: return ((char *) HT_06242); break;
5986 case 6243: return ((char *) HT_06243); break;
5987 case 6300: return ((char *) HT_06300); break;
5988 case 6400: return ((char *) HT_06400); break;
5989 case 6500: return ((char *) HT_06500); break;
5990 case 6600: return ((char *) HT_06600); break;
5991 case 6700: return ((char *) HT_06700); break;
5992 case 6800: return ((char *) HT_06800); break;
5993 case 6900: return ((char *) HT_06900); break;
5994 case 7100: return ((char *) HT_07100); break;
5995 case 7200: return ((char *) HT_07200); break;
5996 case 7300: return ((char *) HT_07300); break;
5997 case 7400: return ((char *) HT_07400); break;
5998 case 7500: return ((char *) HT_07500); break;
5999 case 7600: return ((char *) HT_07600); break;
6000 case 7700: return ((char *) HT_07700); break;
6001 case 7800: return ((char *) HT_07800); break;
6002 case 7900: return ((char *) HT_07900); break;
6003 case 8000: return ((char *) HT_08000); break;
6004 case 8100: return ((char *) HT_08100); break;
6005 case 8200: return ((char *) HT_08200); break;
6006 case 8300: return ((char *) HT_08300); break;
6007 case 8400: return ((char *) HT_08400); break;
6008 case 8500: return ((char *) HT_08500); break;
6009 case 8600: return ((char *) HT_08600); break;
6010 case 8700: return ((char *) HT_08700); break;
6011 case 8800: return ((char *) HT_08800); break;
6012 case 8900: return ((char *) HT_08900); break;
6013 case 9000: return ((char *) HT_09000); break;
6014 case 9100: return ((char *) HT_09100); break;
6015 case 9200: return ((char *) HT_09200); break;
6016 case 9300: return ((char *) HT_09300); break;
6017 case 9400: return ((char *) HT_09400); break;
6018 case 9500: return ((char *) HT_09500); break;
6019 case 9600: return ((char *) HT_09600); break;
6020 case 9700: return ((char *) HT_09700); break;
6021 case 9710: return ((char *) HT_09710); break;
6022 case 9720: return ((char *) HT_09720); break;
6023 case 9800: return ((char *) HT_09800); break;
6024 case 9810: return ((char *) HT_09810); break;
6025 case 9820: return ((char *) HT_09820); break;
6026 case 9900: return ((char *) HT_09900); break;
6027 case 10000: return ((char *) HT_10000); break;
6028 case 10100: return ((char *) HT_10100); break;
6029 case 10200: return ((char *) HT_10200); break;
6030 case 10300: return ((char *) HT_10300); break;
6031 case 10400: return ((char *) HT_10400); break;
6032 case 10410: return ((char *) HT_10410); break;
6033 case 10420: return ((char *) HT_10420); break;
6034 case 10500: return ((char *) HT_10500); break;
6035 case 10600: return ((char *) HT_10600); break;
6036 case 10700: return ((char *) HT_10700); break;
6037 case 10800: return ((char *) HT_10800); break;
6038 case 10900: return ((char *) HT_10900); break;
6039 case 11000: return ((char *) HT_11000); break;
6040 case 11100: return ((char *) HT_11100); break;
6041 case 11200: return ((char *) HT_11200); break;
6042 case 11300: return ((char *) HT_11300); break;
6043 case 11400: return ((char *) HT_11400); break;
6044 case 11500: return ((char *) HT_11500); break;
6045 case 11600: return ((char *) HT_11600); break;
6046 case 11700: return ((char *) HT_11700); break;
6047 case 11800: return ((char *) HT_11800); break;
6048 case 11900: return ((char *) HT_11900); break;
6049 case 12000: return ((char *) HT_12000); break;
6050 case 12100: return ((char *) HT_12100); break;
6051 case 12200: return ((char *) HT_12200); break;
6052 case 12300: return ((char *) HT_12300); break;
6053 case 12400: return ((char *) HT_12400); break;
6054 case 12500: return ((char *) HT_12500); break;
6055 case 12600: return ((char *) HT_12600); break;
6056 case 12700: return ((char *) HT_12700); break;
6057 case 12800: return ((char *) HT_12800); break;
6058 case 12900: return ((char *) HT_12900); break;
6059 case 13000: return ((char *) HT_13000); break;
6060 case 13100: return ((char *) HT_13100); break;
6061 case 13200: return ((char *) HT_13200); break;
6062 case 13300: return ((char *) HT_13300); break;
6063 case 13400: return ((char *) HT_13400); break;
6064 case 13500: return ((char *) HT_13500); break;
6065 case 13600: return ((char *) HT_13600); break;
6066 case 13711: return ((char *) HT_13711); break;
6067 case 13712: return ((char *) HT_13712); break;
6068 case 13713: return ((char *) HT_13713); break;
6069 case 13721: return ((char *) HT_13721); break;
6070 case 13722: return ((char *) HT_13722); break;
6071 case 13723: return ((char *) HT_13723); break;
6072 case 13731: return ((char *) HT_13731); break;
6073 case 13732: return ((char *) HT_13732); break;
6074 case 13733: return ((char *) HT_13733); break;
6075 case 13741: return ((char *) HT_13741); break;
6076 case 13742: return ((char *) HT_13742); break;
6077 case 13743: return ((char *) HT_13743); break;
6078 case 13751: return ((char *) HT_13751); break;
6079 case 13752: return ((char *) HT_13752); break;
6080 case 13753: return ((char *) HT_13753); break;
6081 case 13761: return ((char *) HT_13761); break;
6082 case 13762: return ((char *) HT_13762); break;
6083 case 13763: return ((char *) HT_13763); break;
6084 case 13800: return ((char *) HT_13800); break;
6085 }
6086
6087 return ((char *) "Unknown");
6088 }
6089
6090 char *strstatus (const uint devices_status)
6091 {
6092 switch (devices_status)
6093 {
6094 case STATUS_INIT: return ((char *) ST_0000); break;
6095 case STATUS_STARTING: return ((char *) ST_0001); break;
6096 case STATUS_RUNNING: return ((char *) ST_0002); break;
6097 case STATUS_PAUSED: return ((char *) ST_0003); break;
6098 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
6099 case STATUS_CRACKED: return ((char *) ST_0005); break;
6100 case STATUS_ABORTED: return ((char *) ST_0006); break;
6101 case STATUS_QUIT: return ((char *) ST_0007); break;
6102 case STATUS_BYPASS: return ((char *) ST_0008); break;
6103 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
6104 case STATUS_AUTOTUNE: return ((char *) ST_0010); break;
6105 }
6106
6107 return ((char *) "Unknown");
6108 }
6109
6110 void ascii_digest (char *out_buf, uint salt_pos, uint digest_pos)
6111 {
6112 uint hash_type = data.hash_type;
6113 uint hash_mode = data.hash_mode;
6114 uint salt_type = data.salt_type;
6115 uint opts_type = data.opts_type;
6116 uint opti_type = data.opti_type;
6117 uint dgst_size = data.dgst_size;
6118
6119 char *hashfile = data.hashfile;
6120
6121 uint len = 4096;
6122
6123 uint digest_buf[64] = { 0 };
6124
6125 u64 *digest_buf64 = (u64 *) digest_buf;
6126
6127 char *digests_buf_ptr = (char *) data.digests_buf;
6128
6129 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
6130
6131 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6132 {
6133 uint tt;
6134
6135 switch (hash_type)
6136 {
6137 case HASH_TYPE_DESCRYPT:
6138 FP (digest_buf[1], digest_buf[0], tt);
6139 break;
6140
6141 case HASH_TYPE_DESRACF:
6142 digest_buf[0] = rotl32 (digest_buf[0], 29);
6143 digest_buf[1] = rotl32 (digest_buf[1], 29);
6144
6145 FP (digest_buf[1], digest_buf[0], tt);
6146 break;
6147
6148 case HASH_TYPE_LM:
6149 FP (digest_buf[1], digest_buf[0], tt);
6150 break;
6151
6152 case HASH_TYPE_NETNTLM:
6153 digest_buf[0] = rotl32 (digest_buf[0], 29);
6154 digest_buf[1] = rotl32 (digest_buf[1], 29);
6155 digest_buf[2] = rotl32 (digest_buf[2], 29);
6156 digest_buf[3] = rotl32 (digest_buf[3], 29);
6157
6158 FP (digest_buf[1], digest_buf[0], tt);
6159 FP (digest_buf[3], digest_buf[2], tt);
6160 break;
6161
6162 case HASH_TYPE_BSDICRYPT:
6163 digest_buf[0] = rotl32 (digest_buf[0], 31);
6164 digest_buf[1] = rotl32 (digest_buf[1], 31);
6165
6166 FP (digest_buf[1], digest_buf[0], tt);
6167 break;
6168 }
6169 }
6170
6171 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
6172 {
6173 switch (hash_type)
6174 {
6175 case HASH_TYPE_MD4:
6176 digest_buf[0] += MD4M_A;
6177 digest_buf[1] += MD4M_B;
6178 digest_buf[2] += MD4M_C;
6179 digest_buf[3] += MD4M_D;
6180 break;
6181
6182 case HASH_TYPE_MD5:
6183 digest_buf[0] += MD5M_A;
6184 digest_buf[1] += MD5M_B;
6185 digest_buf[2] += MD5M_C;
6186 digest_buf[3] += MD5M_D;
6187 break;
6188
6189 case HASH_TYPE_SHA1:
6190 digest_buf[0] += SHA1M_A;
6191 digest_buf[1] += SHA1M_B;
6192 digest_buf[2] += SHA1M_C;
6193 digest_buf[3] += SHA1M_D;
6194 digest_buf[4] += SHA1M_E;
6195 break;
6196
6197 case HASH_TYPE_SHA256:
6198 digest_buf[0] += SHA256M_A;
6199 digest_buf[1] += SHA256M_B;
6200 digest_buf[2] += SHA256M_C;
6201 digest_buf[3] += SHA256M_D;
6202 digest_buf[4] += SHA256M_E;
6203 digest_buf[5] += SHA256M_F;
6204 digest_buf[6] += SHA256M_G;
6205 digest_buf[7] += SHA256M_H;
6206 break;
6207
6208 case HASH_TYPE_SHA384:
6209 digest_buf64[0] += SHA384M_A;
6210 digest_buf64[1] += SHA384M_B;
6211 digest_buf64[2] += SHA384M_C;
6212 digest_buf64[3] += SHA384M_D;
6213 digest_buf64[4] += SHA384M_E;
6214 digest_buf64[5] += SHA384M_F;
6215 digest_buf64[6] += 0;
6216 digest_buf64[7] += 0;
6217 break;
6218
6219 case HASH_TYPE_SHA512:
6220 digest_buf64[0] += SHA512M_A;
6221 digest_buf64[1] += SHA512M_B;
6222 digest_buf64[2] += SHA512M_C;
6223 digest_buf64[3] += SHA512M_D;
6224 digest_buf64[4] += SHA512M_E;
6225 digest_buf64[5] += SHA512M_F;
6226 digest_buf64[6] += SHA512M_G;
6227 digest_buf64[7] += SHA512M_H;
6228 break;
6229 }
6230 }
6231
6232 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
6233 {
6234 if (dgst_size == DGST_SIZE_4_2)
6235 {
6236 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6237 }
6238 else if (dgst_size == DGST_SIZE_4_4)
6239 {
6240 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6241 }
6242 else if (dgst_size == DGST_SIZE_4_5)
6243 {
6244 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6245 }
6246 else if (dgst_size == DGST_SIZE_4_6)
6247 {
6248 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6249 }
6250 else if (dgst_size == DGST_SIZE_4_8)
6251 {
6252 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6253 }
6254 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
6255 {
6256 if (hash_type == HASH_TYPE_WHIRLPOOL)
6257 {
6258 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6259 }
6260 else if (hash_type == HASH_TYPE_SHA384)
6261 {
6262 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6263 }
6264 else if (hash_type == HASH_TYPE_SHA512)
6265 {
6266 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6267 }
6268 else if (hash_type == HASH_TYPE_GOST)
6269 {
6270 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6271 }
6272 }
6273 else if (dgst_size == DGST_SIZE_4_64)
6274 {
6275 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6276 }
6277 else if (dgst_size == DGST_SIZE_8_25)
6278 {
6279 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6280 }
6281 }
6282
6283 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
6284 | (data.salt_type == SALT_TYPE_EXTERN)
6285 | (data.salt_type == SALT_TYPE_EMBEDDED));
6286
6287 salt_t salt;
6288
6289 if (isSalted)
6290 {
6291 memset (&salt, 0, sizeof (salt_t));
6292
6293 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
6294
6295 char *ptr = (char *) salt.salt_buf;
6296
6297 uint len = salt.salt_len;
6298
6299 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6300 {
6301 uint tt;
6302
6303 switch (hash_type)
6304 {
6305 case HASH_TYPE_NETNTLM:
6306
6307 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6308 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6309
6310 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6311
6312 break;
6313 }
6314 }
6315
6316 if (opts_type & OPTS_TYPE_ST_UNICODE)
6317 {
6318 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6319 {
6320 ptr[i] = ptr[j];
6321 }
6322
6323 len = len / 2;
6324 }
6325
6326 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6327 {
6328 uint max = salt.salt_len / 4;
6329
6330 if (len % 4) max++;
6331
6332 for (uint i = 0; i < max; i++)
6333 {
6334 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6335 }
6336 }
6337
6338 if (opts_type & OPTS_TYPE_ST_HEX)
6339 {
6340 char tmp[64] = { 0 };
6341
6342 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6343 {
6344 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6345 }
6346
6347 len = len * 2;
6348
6349 memcpy (ptr, tmp, len);
6350 }
6351
6352 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6353
6354 memset (ptr + len, 0, memset_size);
6355
6356 salt.salt_len = len;
6357 }
6358
6359 //
6360 // some modes require special encoding
6361 //
6362
6363 uint out_buf_plain[256] = { 0 };
6364 uint out_buf_salt[256] = { 0 };
6365
6366 char tmp_buf[1024] = { 0 };
6367
6368 char *ptr_plain = (char *) out_buf_plain;
6369 char *ptr_salt = (char *) out_buf_salt;
6370
6371 if (hash_mode == 22)
6372 {
6373 char username[30] = { 0 };
6374
6375 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6376
6377 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6378
6379 u16 *ptr = (u16 *) digest_buf;
6380
6381 tmp_buf[ 0] = sig[0];
6382 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6383 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6384 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6385 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6386 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6387 tmp_buf[ 6] = sig[1];
6388 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6389 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6390 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6391 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6392 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6393 tmp_buf[12] = sig[2];
6394 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6395 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6396 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6397 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6398 tmp_buf[17] = sig[3];
6399 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6400 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6401 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6402 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6403 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6404 tmp_buf[23] = sig[4];
6405 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6406 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6407 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6408 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6409 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6410 tmp_buf[29] = sig[5];
6411
6412 snprintf (out_buf, len-1, "%s:%s",
6413 tmp_buf,
6414 username);
6415 }
6416 else if (hash_mode == 23)
6417 {
6418 // do not show the skyper part in output
6419
6420 char *salt_buf_ptr = (char *) salt.salt_buf;
6421
6422 salt_buf_ptr[salt.salt_len - 8] = 0;
6423
6424 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6425 digest_buf[0],
6426 digest_buf[1],
6427 digest_buf[2],
6428 digest_buf[3],
6429 salt_buf_ptr);
6430 }
6431 else if (hash_mode == 101)
6432 {
6433 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6434
6435 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6436 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6437 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6438 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6439 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6440
6441 memcpy (tmp_buf, digest_buf, 20);
6442
6443 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6444
6445 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6446 }
6447 else if (hash_mode == 111)
6448 {
6449 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6450
6451 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6452 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6453 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6454 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6455 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6456
6457 memcpy (tmp_buf, digest_buf, 20);
6458 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6459
6460 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6461
6462 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6463 }
6464 else if ((hash_mode == 122) || (hash_mode == 125))
6465 {
6466 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6467 (char *) salt.salt_buf,
6468 digest_buf[0],
6469 digest_buf[1],
6470 digest_buf[2],
6471 digest_buf[3],
6472 digest_buf[4]);
6473 }
6474 else if (hash_mode == 124)
6475 {
6476 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6477 (char *) salt.salt_buf,
6478 digest_buf[0],
6479 digest_buf[1],
6480 digest_buf[2],
6481 digest_buf[3],
6482 digest_buf[4]);
6483 }
6484 else if (hash_mode == 131)
6485 {
6486 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6487 (char *) salt.salt_buf,
6488 0, 0, 0, 0, 0,
6489 digest_buf[0],
6490 digest_buf[1],
6491 digest_buf[2],
6492 digest_buf[3],
6493 digest_buf[4]);
6494 }
6495 else if (hash_mode == 132)
6496 {
6497 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6498 (char *) salt.salt_buf,
6499 digest_buf[0],
6500 digest_buf[1],
6501 digest_buf[2],
6502 digest_buf[3],
6503 digest_buf[4]);
6504 }
6505 else if (hash_mode == 133)
6506 {
6507 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6508
6509 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6510 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6511 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6512 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6513 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6514
6515 memcpy (tmp_buf, digest_buf, 20);
6516
6517 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6518
6519 snprintf (out_buf, len-1, "%s", ptr_plain);
6520 }
6521 else if (hash_mode == 141)
6522 {
6523 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6524
6525 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6526
6527 memset (tmp_buf, 0, sizeof (tmp_buf));
6528
6529 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6530
6531 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6532 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6533 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6534 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6535 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6536
6537 memcpy (tmp_buf, digest_buf, 20);
6538
6539 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6540
6541 ptr_plain[27] = 0;
6542
6543 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6544 }
6545 else if (hash_mode == 400)
6546 {
6547 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6548
6549 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6550 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6551 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6552 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6553
6554 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6555
6556 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6557 }
6558 else if (hash_mode == 500)
6559 {
6560 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6561
6562 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6563 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6564 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6565 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6566
6567 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6568
6569 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6570 {
6571 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6572 }
6573 else
6574 {
6575 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6576 }
6577 }
6578 else if (hash_mode == 501)
6579 {
6580 uint digest_idx = salt.digests_offset + digest_pos;
6581
6582 hashinfo_t **hashinfo_ptr = data.hash_info;
6583 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6584
6585 snprintf (out_buf, len-1, "%s", hash_buf);
6586 }
6587 else if (hash_mode == 1421)
6588 {
6589 u8 *salt_ptr = (u8 *) salt.salt_buf;
6590
6591 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6592 salt_ptr[0],
6593 salt_ptr[1],
6594 salt_ptr[2],
6595 salt_ptr[3],
6596 salt_ptr[4],
6597 salt_ptr[5],
6598 digest_buf[0],
6599 digest_buf[1],
6600 digest_buf[2],
6601 digest_buf[3],
6602 digest_buf[4],
6603 digest_buf[5],
6604 digest_buf[6],
6605 digest_buf[7]);
6606 }
6607 else if (hash_mode == 1441)
6608 {
6609 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6610
6611 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6612
6613 memset (tmp_buf, 0, sizeof (tmp_buf));
6614
6615 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6616
6617 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6618 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6619 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6620 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6621 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6622 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6623 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6624 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6625
6626 memcpy (tmp_buf, digest_buf, 32);
6627
6628 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6629
6630 ptr_plain[43] = 0;
6631
6632 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6633 }
6634 else if (hash_mode == 1500)
6635 {
6636 out_buf[0] = salt.salt_sign[0] & 0xff;
6637 out_buf[1] = salt.salt_sign[1] & 0xff;
6638 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6639 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6640 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6641
6642 memset (tmp_buf, 0, sizeof (tmp_buf));
6643
6644 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6645
6646 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6647 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6648
6649 memcpy (tmp_buf, digest_buf, 8);
6650
6651 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6652
6653 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6654
6655 out_buf[13] = 0;
6656 }
6657 else if (hash_mode == 1600)
6658 {
6659 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6660
6661 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6662 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6663 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6664 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6665
6666 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6667
6668 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6669 {
6670 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6671 }
6672 else
6673 {
6674 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6675 }
6676 }
6677 else if (hash_mode == 1711)
6678 {
6679 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6680
6681 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6682 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6683 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6684 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6685 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6686 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6687 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6688 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6689
6690 memcpy (tmp_buf, digest_buf, 64);
6691 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6692
6693 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6694
6695 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6696 }
6697 else if (hash_mode == 1722)
6698 {
6699 uint *ptr = digest_buf;
6700
6701 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6702 (unsigned char *) salt.salt_buf,
6703 ptr[ 1], ptr[ 0],
6704 ptr[ 3], ptr[ 2],
6705 ptr[ 5], ptr[ 4],
6706 ptr[ 7], ptr[ 6],
6707 ptr[ 9], ptr[ 8],
6708 ptr[11], ptr[10],
6709 ptr[13], ptr[12],
6710 ptr[15], ptr[14]);
6711 }
6712 else if (hash_mode == 1731)
6713 {
6714 uint *ptr = digest_buf;
6715
6716 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6717 (unsigned char *) salt.salt_buf,
6718 ptr[ 1], ptr[ 0],
6719 ptr[ 3], ptr[ 2],
6720 ptr[ 5], ptr[ 4],
6721 ptr[ 7], ptr[ 6],
6722 ptr[ 9], ptr[ 8],
6723 ptr[11], ptr[10],
6724 ptr[13], ptr[12],
6725 ptr[15], ptr[14]);
6726 }
6727 else if (hash_mode == 1800)
6728 {
6729 // temp workaround
6730
6731 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6732 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6733 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6734 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6735 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6736 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6737 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6738 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6739
6740 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6741
6742 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6743 {
6744 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6745 }
6746 else
6747 {
6748 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6749 }
6750 }
6751 else if (hash_mode == 2100)
6752 {
6753 uint pos = 0;
6754
6755 snprintf (out_buf + pos, len-1, "%s%i#",
6756 SIGNATURE_DCC2,
6757 salt.salt_iter + 1);
6758
6759 uint signature_len = strlen (out_buf);
6760
6761 pos += signature_len;
6762 len -= signature_len;
6763
6764 char *salt_ptr = (char *) salt.salt_buf;
6765
6766 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6767
6768 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6769 byte_swap_32 (digest_buf[0]),
6770 byte_swap_32 (digest_buf[1]),
6771 byte_swap_32 (digest_buf[2]),
6772 byte_swap_32 (digest_buf[3]));
6773 }
6774 else if ((hash_mode == 2400) || (hash_mode == 2410))
6775 {
6776 memcpy (tmp_buf, digest_buf, 16);
6777
6778 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6779
6780 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6781 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6782 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6783 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6784
6785 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6786 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6787 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6788 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6789
6790 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6791 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6792 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6793 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6794
6795 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6796 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6797 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6798 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6799
6800 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6801 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6802 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6803 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6804
6805 out_buf[16] = 0;
6806 }
6807 else if (hash_mode == 2500)
6808 {
6809 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6810
6811 wpa_t *wpa = &wpas[salt_pos];
6812
6813 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6814 (char *) salt.salt_buf,
6815 wpa->orig_mac1[0],
6816 wpa->orig_mac1[1],
6817 wpa->orig_mac1[2],
6818 wpa->orig_mac1[3],
6819 wpa->orig_mac1[4],
6820 wpa->orig_mac1[5],
6821 wpa->orig_mac2[0],
6822 wpa->orig_mac2[1],
6823 wpa->orig_mac2[2],
6824 wpa->orig_mac2[3],
6825 wpa->orig_mac2[4],
6826 wpa->orig_mac2[5]);
6827 }
6828 else if (hash_mode == 4400)
6829 {
6830 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6831 byte_swap_32 (digest_buf[0]),
6832 byte_swap_32 (digest_buf[1]),
6833 byte_swap_32 (digest_buf[2]),
6834 byte_swap_32 (digest_buf[3]));
6835 }
6836 else if (hash_mode == 4700)
6837 {
6838 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6839 byte_swap_32 (digest_buf[0]),
6840 byte_swap_32 (digest_buf[1]),
6841 byte_swap_32 (digest_buf[2]),
6842 byte_swap_32 (digest_buf[3]),
6843 byte_swap_32 (digest_buf[4]));
6844 }
6845 else if (hash_mode == 4800)
6846 {
6847 u8 chap_id_byte = (u8) salt.salt_buf[4];
6848
6849 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6850 digest_buf[0],
6851 digest_buf[1],
6852 digest_buf[2],
6853 digest_buf[3],
6854 byte_swap_32 (salt.salt_buf[0]),
6855 byte_swap_32 (salt.salt_buf[1]),
6856 byte_swap_32 (salt.salt_buf[2]),
6857 byte_swap_32 (salt.salt_buf[3]),
6858 chap_id_byte);
6859 }
6860 else if (hash_mode == 4900)
6861 {
6862 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6863 byte_swap_32 (digest_buf[0]),
6864 byte_swap_32 (digest_buf[1]),
6865 byte_swap_32 (digest_buf[2]),
6866 byte_swap_32 (digest_buf[3]),
6867 byte_swap_32 (digest_buf[4]));
6868 }
6869 else if (hash_mode == 5100)
6870 {
6871 snprintf (out_buf, len-1, "%08x%08x",
6872 digest_buf[0],
6873 digest_buf[1]);
6874 }
6875 else if (hash_mode == 5200)
6876 {
6877 snprintf (out_buf, len-1, "%s", hashfile);
6878 }
6879 else if (hash_mode == 5300)
6880 {
6881 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6882
6883 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6884
6885 int buf_len = len -1;
6886
6887 // msg_buf
6888
6889 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6890
6891 for (uint i = 0; i < ikepsk_msg_len; i++)
6892 {
6893 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6894 {
6895 snprintf (out_buf, buf_len, ":");
6896
6897 buf_len--;
6898 out_buf++;
6899 }
6900
6901 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6902
6903 buf_len -= 8;
6904 out_buf += 8;
6905 }
6906
6907 // nr_buf
6908
6909 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6910
6911 for (uint i = 0; i < ikepsk_nr_len; i++)
6912 {
6913 if ((i == 0) || (i == 5))
6914 {
6915 snprintf (out_buf, buf_len, ":");
6916
6917 buf_len--;
6918 out_buf++;
6919 }
6920
6921 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6922
6923 buf_len -= 8;
6924 out_buf += 8;
6925 }
6926
6927 // digest_buf
6928
6929 for (uint i = 0; i < 4; i++)
6930 {
6931 if (i == 0)
6932 {
6933 snprintf (out_buf, buf_len, ":");
6934
6935 buf_len--;
6936 out_buf++;
6937 }
6938
6939 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6940
6941 buf_len -= 8;
6942 out_buf += 8;
6943 }
6944 }
6945 else if (hash_mode == 5400)
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 < 5; 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 == 5500)
7012 {
7013 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
7014
7015 netntlm_t *netntlm = &netntlms[salt_pos];
7016
7017 char user_buf[64] = { 0 };
7018 char domain_buf[64] = { 0 };
7019 char srvchall_buf[1024] = { 0 };
7020 char clichall_buf[1024] = { 0 };
7021
7022 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
7023 {
7024 char *ptr = (char *) netntlm->userdomain_buf;
7025
7026 user_buf[i] = ptr[j];
7027 }
7028
7029 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
7030 {
7031 char *ptr = (char *) netntlm->userdomain_buf;
7032
7033 domain_buf[i] = ptr[netntlm->user_len + j];
7034 }
7035
7036 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
7037 {
7038 u8 *ptr = (u8 *) netntlm->chall_buf;
7039
7040 sprintf (srvchall_buf + j, "%02x", ptr[i]);
7041 }
7042
7043 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
7044 {
7045 u8 *ptr = (u8 *) netntlm->chall_buf;
7046
7047 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
7048 }
7049
7050 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
7051 user_buf,
7052 domain_buf,
7053 srvchall_buf,
7054 digest_buf[0],
7055 digest_buf[1],
7056 digest_buf[2],
7057 digest_buf[3],
7058 byte_swap_32 (salt.salt_buf_pc[0]),
7059 byte_swap_32 (salt.salt_buf_pc[1]),
7060 clichall_buf);
7061 }
7062 else if (hash_mode == 5600)
7063 {
7064 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
7065
7066 netntlm_t *netntlm = &netntlms[salt_pos];
7067
7068 char user_buf[64] = { 0 };
7069 char domain_buf[64] = { 0 };
7070 char srvchall_buf[1024] = { 0 };
7071 char clichall_buf[1024] = { 0 };
7072
7073 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
7074 {
7075 char *ptr = (char *) netntlm->userdomain_buf;
7076
7077 user_buf[i] = ptr[j];
7078 }
7079
7080 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
7081 {
7082 char *ptr = (char *) netntlm->userdomain_buf;
7083
7084 domain_buf[i] = ptr[netntlm->user_len + j];
7085 }
7086
7087 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
7088 {
7089 u8 *ptr = (u8 *) netntlm->chall_buf;
7090
7091 sprintf (srvchall_buf + j, "%02x", ptr[i]);
7092 }
7093
7094 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
7095 {
7096 u8 *ptr = (u8 *) netntlm->chall_buf;
7097
7098 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
7099 }
7100
7101 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
7102 user_buf,
7103 domain_buf,
7104 srvchall_buf,
7105 digest_buf[0],
7106 digest_buf[1],
7107 digest_buf[2],
7108 digest_buf[3],
7109 clichall_buf);
7110 }
7111 else if (hash_mode == 5700)
7112 {
7113 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7114
7115 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7116 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7117 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7118 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7119 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7120 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7121 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7122 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7123
7124 memcpy (tmp_buf, digest_buf, 32);
7125
7126 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
7127
7128 ptr_plain[43] = 0;
7129
7130 snprintf (out_buf, len-1, "%s", ptr_plain);
7131 }
7132 else if (hash_mode == 5800)
7133 {
7134 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7135 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7136 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7137 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7138 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7139
7140 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
7141 digest_buf[0],
7142 digest_buf[1],
7143 digest_buf[2],
7144 digest_buf[3],
7145 digest_buf[4]);
7146 }
7147 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
7148 {
7149 snprintf (out_buf, len-1, "%s", hashfile);
7150 }
7151 else if (hash_mode == 6300)
7152 {
7153 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7154
7155 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7156 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7157 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7158 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7159
7160 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7161
7162 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7163 }
7164 else if (hash_mode == 6400)
7165 {
7166 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7167
7168 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7169 }
7170 else if (hash_mode == 6500)
7171 {
7172 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7173
7174 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7175 }
7176 else if (hash_mode == 6600)
7177 {
7178 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
7179
7180 agilekey_t *agilekey = &agilekeys[salt_pos];
7181
7182 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7183 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7184
7185 uint buf_len = len - 1;
7186
7187 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
7188 buf_len -= 22;
7189
7190 for (uint i = 0, j = off; i < 1040; i++, j += 2)
7191 {
7192 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
7193
7194 buf_len -= 2;
7195 }
7196 }
7197 else if (hash_mode == 6700)
7198 {
7199 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7200
7201 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7202 }
7203 else if (hash_mode == 6800)
7204 {
7205 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
7206 }
7207 else if (hash_mode == 7100)
7208 {
7209 uint *ptr = digest_buf;
7210
7211 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7212
7213 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7214
7215 uint esalt[8] = { 0 };
7216
7217 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
7218 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
7219 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
7220 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
7221 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
7222 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
7223 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
7224 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
7225
7226 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",
7227 SIGNATURE_SHA512OSX,
7228 salt.salt_iter + 1,
7229 esalt[ 0], esalt[ 1],
7230 esalt[ 2], esalt[ 3],
7231 esalt[ 4], esalt[ 5],
7232 esalt[ 6], esalt[ 7],
7233 ptr [ 1], ptr [ 0],
7234 ptr [ 3], ptr [ 2],
7235 ptr [ 5], ptr [ 4],
7236 ptr [ 7], ptr [ 6],
7237 ptr [ 9], ptr [ 8],
7238 ptr [11], ptr [10],
7239 ptr [13], ptr [12],
7240 ptr [15], ptr [14]);
7241 }
7242 else if (hash_mode == 7200)
7243 {
7244 uint *ptr = digest_buf;
7245
7246 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7247
7248 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7249
7250 uint len_used = 0;
7251
7252 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
7253
7254 len_used = strlen (out_buf);
7255
7256 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
7257
7258 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
7259 {
7260 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
7261 }
7262
7263 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",
7264 ptr [ 1], ptr [ 0],
7265 ptr [ 3], ptr [ 2],
7266 ptr [ 5], ptr [ 4],
7267 ptr [ 7], ptr [ 6],
7268 ptr [ 9], ptr [ 8],
7269 ptr [11], ptr [10],
7270 ptr [13], ptr [12],
7271 ptr [15], ptr [14]);
7272 }
7273 else if (hash_mode == 7300)
7274 {
7275 rakp_t *rakps = (rakp_t *) data.esalts_buf;
7276
7277 rakp_t *rakp = &rakps[salt_pos];
7278
7279 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
7280 {
7281 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
7282 }
7283
7284 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7285 digest_buf[0],
7286 digest_buf[1],
7287 digest_buf[2],
7288 digest_buf[3],
7289 digest_buf[4]);
7290 }
7291 else if (hash_mode == 7400)
7292 {
7293 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7294
7295 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7296 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7297 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7298 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7299 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7300 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7301 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7302 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7303
7304 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7305
7306 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7307 {
7308 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7309 }
7310 else
7311 {
7312 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7313 }
7314 }
7315 else if (hash_mode == 7500)
7316 {
7317 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7318
7319 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7320
7321 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7322 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7323
7324 char data[128] = { 0 };
7325
7326 char *ptr_data = data;
7327
7328 for (uint i = 0; i < 36; i++, ptr_data += 2)
7329 {
7330 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7331 }
7332
7333 for (uint i = 0; i < 16; i++, ptr_data += 2)
7334 {
7335 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7336 }
7337
7338 *ptr_data = 0;
7339
7340 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7341 SIGNATURE_KRB5PA,
7342 (char *) krb5pa->user,
7343 (char *) krb5pa->realm,
7344 (char *) krb5pa->salt,
7345 data);
7346 }
7347 else if (hash_mode == 7700)
7348 {
7349 snprintf (out_buf, len-1, "%s$%08X%08X",
7350 (char *) salt.salt_buf,
7351 digest_buf[0],
7352 digest_buf[1]);
7353 }
7354 else if (hash_mode == 7800)
7355 {
7356 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7357 (char *) salt.salt_buf,
7358 digest_buf[0],
7359 digest_buf[1],
7360 digest_buf[2],
7361 digest_buf[3],
7362 digest_buf[4]);
7363 }
7364 else if (hash_mode == 7900)
7365 {
7366 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7367
7368 // ugly hack start
7369
7370 char *tmp = (char *) salt.salt_buf_pc;
7371
7372 ptr_plain[42] = tmp[0];
7373
7374 // ugly hack end
7375
7376 ptr_plain[43] = 0;
7377
7378 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7379 }
7380 else if (hash_mode == 8000)
7381 {
7382 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7383 (unsigned char *) salt.salt_buf,
7384 digest_buf[0],
7385 digest_buf[1],
7386 digest_buf[2],
7387 digest_buf[3],
7388 digest_buf[4],
7389 digest_buf[5],
7390 digest_buf[6],
7391 digest_buf[7]);
7392 }
7393 else if (hash_mode == 8100)
7394 {
7395 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7396 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7397
7398 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7399 (unsigned char *) salt.salt_buf,
7400 digest_buf[0],
7401 digest_buf[1],
7402 digest_buf[2],
7403 digest_buf[3],
7404 digest_buf[4]);
7405 }
7406 else if (hash_mode == 8200)
7407 {
7408 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7409
7410 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7411
7412 char data_buf[4096] = { 0 };
7413
7414 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7415 {
7416 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7417 }
7418
7419 data_buf[cloudkey->data_len * 2] = 0;
7420
7421 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7422 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7423 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7424 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7425 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7426 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7427 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7428 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7429
7430 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7431 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7432 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7433 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7434
7435 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7436 digest_buf[0],
7437 digest_buf[1],
7438 digest_buf[2],
7439 digest_buf[3],
7440 digest_buf[4],
7441 digest_buf[5],
7442 digest_buf[6],
7443 digest_buf[7],
7444 salt.salt_buf[0],
7445 salt.salt_buf[1],
7446 salt.salt_buf[2],
7447 salt.salt_buf[3],
7448 salt.salt_iter + 1,
7449 data_buf);
7450 }
7451 else if (hash_mode == 8300)
7452 {
7453 char digest_buf_c[34] = { 0 };
7454
7455 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7456 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7457 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7458 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7459 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7460
7461 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7462
7463 digest_buf_c[32] = 0;
7464
7465 // domain
7466
7467 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7468
7469 char domain_buf_c[33] = { 0 };
7470
7471 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7472
7473 for (uint i = 0; i < salt_pc_len; i++)
7474 {
7475 const char next = domain_buf_c[i];
7476
7477 domain_buf_c[i] = '.';
7478
7479 i += next;
7480 }
7481
7482 domain_buf_c[salt_pc_len] = 0;
7483
7484 // final
7485
7486 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7487 }
7488 else if (hash_mode == 8500)
7489 {
7490 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7491 }
7492 else if (hash_mode == 2612)
7493 {
7494 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7495 SIGNATURE_PHPS,
7496 (char *) salt.salt_buf,
7497 digest_buf[0],
7498 digest_buf[1],
7499 digest_buf[2],
7500 digest_buf[3]);
7501 }
7502 else if (hash_mode == 3711)
7503 {
7504 char *salt_ptr = (char *) salt.salt_buf;
7505
7506 salt_ptr[salt.salt_len - 1] = 0;
7507
7508 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7509 SIGNATURE_MEDIAWIKI_B,
7510 salt_ptr,
7511 digest_buf[0],
7512 digest_buf[1],
7513 digest_buf[2],
7514 digest_buf[3]);
7515 }
7516 else if (hash_mode == 8800)
7517 {
7518 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7519
7520 androidfde_t *androidfde = &androidfdes[salt_pos];
7521
7522 char tmp[3073] = { 0 };
7523
7524 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7525 {
7526 sprintf (tmp + j, "%08x", androidfde->data[i]);
7527 }
7528
7529 tmp[3072] = 0;
7530
7531 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7532 SIGNATURE_ANDROIDFDE,
7533 byte_swap_32 (salt.salt_buf[0]),
7534 byte_swap_32 (salt.salt_buf[1]),
7535 byte_swap_32 (salt.salt_buf[2]),
7536 byte_swap_32 (salt.salt_buf[3]),
7537 byte_swap_32 (digest_buf[0]),
7538 byte_swap_32 (digest_buf[1]),
7539 byte_swap_32 (digest_buf[2]),
7540 byte_swap_32 (digest_buf[3]),
7541 tmp);
7542 }
7543 else if (hash_mode == 8900)
7544 {
7545 uint N = salt.scrypt_N;
7546 uint r = salt.scrypt_r;
7547 uint p = salt.scrypt_p;
7548
7549 char base64_salt[32] = { 0 };
7550
7551 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7552
7553 memset (tmp_buf, 0, 46);
7554
7555 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7556 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7557 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7558 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7559 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7560 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7561 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7562 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7563 digest_buf[8] = 0; // needed for base64_encode ()
7564
7565 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7566
7567 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7568 SIGNATURE_SCRYPT,
7569 N,
7570 r,
7571 p,
7572 base64_salt,
7573 tmp_buf);
7574 }
7575 else if (hash_mode == 9000)
7576 {
7577 snprintf (out_buf, len-1, "%s", hashfile);
7578 }
7579 else if (hash_mode == 9200)
7580 {
7581 // salt
7582
7583 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7584
7585 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7586
7587 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7588
7589 // hash
7590
7591 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7592 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7593 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7594 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7595 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7596 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7597 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7598 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7599 digest_buf[8] = 0; // needed for base64_encode ()
7600
7601 char tmp_buf[64] = { 0 };
7602
7603 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7604 tmp_buf[43] = 0; // cut it here
7605
7606 // output
7607
7608 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7609 }
7610 else if (hash_mode == 9300)
7611 {
7612 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7613 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7614 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7615 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7616 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7617 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7618 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7619 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7620 digest_buf[8] = 0; // needed for base64_encode ()
7621
7622 char tmp_buf[64] = { 0 };
7623
7624 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7625 tmp_buf[43] = 0; // cut it here
7626
7627 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7628
7629 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7630 }
7631 else if (hash_mode == 9400)
7632 {
7633 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7634
7635 office2007_t *office2007 = &office2007s[salt_pos];
7636
7637 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7638 SIGNATURE_OFFICE2007,
7639 2007,
7640 20,
7641 office2007->keySize,
7642 16,
7643 salt.salt_buf[0],
7644 salt.salt_buf[1],
7645 salt.salt_buf[2],
7646 salt.salt_buf[3],
7647 office2007->encryptedVerifier[0],
7648 office2007->encryptedVerifier[1],
7649 office2007->encryptedVerifier[2],
7650 office2007->encryptedVerifier[3],
7651 office2007->encryptedVerifierHash[0],
7652 office2007->encryptedVerifierHash[1],
7653 office2007->encryptedVerifierHash[2],
7654 office2007->encryptedVerifierHash[3],
7655 office2007->encryptedVerifierHash[4]);
7656 }
7657 else if (hash_mode == 9500)
7658 {
7659 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7660
7661 office2010_t *office2010 = &office2010s[salt_pos];
7662
7663 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,
7664
7665 salt.salt_buf[0],
7666 salt.salt_buf[1],
7667 salt.salt_buf[2],
7668 salt.salt_buf[3],
7669 office2010->encryptedVerifier[0],
7670 office2010->encryptedVerifier[1],
7671 office2010->encryptedVerifier[2],
7672 office2010->encryptedVerifier[3],
7673 office2010->encryptedVerifierHash[0],
7674 office2010->encryptedVerifierHash[1],
7675 office2010->encryptedVerifierHash[2],
7676 office2010->encryptedVerifierHash[3],
7677 office2010->encryptedVerifierHash[4],
7678 office2010->encryptedVerifierHash[5],
7679 office2010->encryptedVerifierHash[6],
7680 office2010->encryptedVerifierHash[7]);
7681 }
7682 else if (hash_mode == 9600)
7683 {
7684 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7685
7686 office2013_t *office2013 = &office2013s[salt_pos];
7687
7688 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,
7689
7690 salt.salt_buf[0],
7691 salt.salt_buf[1],
7692 salt.salt_buf[2],
7693 salt.salt_buf[3],
7694 office2013->encryptedVerifier[0],
7695 office2013->encryptedVerifier[1],
7696 office2013->encryptedVerifier[2],
7697 office2013->encryptedVerifier[3],
7698 office2013->encryptedVerifierHash[0],
7699 office2013->encryptedVerifierHash[1],
7700 office2013->encryptedVerifierHash[2],
7701 office2013->encryptedVerifierHash[3],
7702 office2013->encryptedVerifierHash[4],
7703 office2013->encryptedVerifierHash[5],
7704 office2013->encryptedVerifierHash[6],
7705 office2013->encryptedVerifierHash[7]);
7706 }
7707 else if (hash_mode == 9700)
7708 {
7709 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7710
7711 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7712
7713 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7714 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7715 byte_swap_32 (salt.salt_buf[0]),
7716 byte_swap_32 (salt.salt_buf[1]),
7717 byte_swap_32 (salt.salt_buf[2]),
7718 byte_swap_32 (salt.salt_buf[3]),
7719 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7720 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7721 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7722 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7723 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7724 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7725 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7726 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7727 }
7728 else if (hash_mode == 9710)
7729 {
7730 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7731
7732 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7733
7734 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7735 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7736 byte_swap_32 (salt.salt_buf[0]),
7737 byte_swap_32 (salt.salt_buf[1]),
7738 byte_swap_32 (salt.salt_buf[2]),
7739 byte_swap_32 (salt.salt_buf[3]),
7740 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7741 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7742 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7743 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7744 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7745 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7746 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7747 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7748 }
7749 else if (hash_mode == 9720)
7750 {
7751 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7752
7753 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7754
7755 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7756
7757 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7758 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7759 byte_swap_32 (salt.salt_buf[0]),
7760 byte_swap_32 (salt.salt_buf[1]),
7761 byte_swap_32 (salt.salt_buf[2]),
7762 byte_swap_32 (salt.salt_buf[3]),
7763 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7764 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7765 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7766 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7767 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7768 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7769 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7770 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7771 rc4key[0],
7772 rc4key[1],
7773 rc4key[2],
7774 rc4key[3],
7775 rc4key[4]);
7776 }
7777 else if (hash_mode == 9800)
7778 {
7779 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7780
7781 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7782
7783 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7784 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7785 salt.salt_buf[0],
7786 salt.salt_buf[1],
7787 salt.salt_buf[2],
7788 salt.salt_buf[3],
7789 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7790 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7791 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7792 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7793 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7794 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7795 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7796 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7797 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7798 }
7799 else if (hash_mode == 9810)
7800 {
7801 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7802
7803 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7804
7805 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7806 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7807 salt.salt_buf[0],
7808 salt.salt_buf[1],
7809 salt.salt_buf[2],
7810 salt.salt_buf[3],
7811 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7812 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7813 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7814 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7815 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7816 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7817 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7818 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7819 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7820 }
7821 else if (hash_mode == 9820)
7822 {
7823 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7824
7825 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7826
7827 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7828
7829 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7830 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7831 salt.salt_buf[0],
7832 salt.salt_buf[1],
7833 salt.salt_buf[2],
7834 salt.salt_buf[3],
7835 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7836 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7837 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7838 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7839 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7840 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7841 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7842 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7843 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7844 rc4key[0],
7845 rc4key[1],
7846 rc4key[2],
7847 rc4key[3],
7848 rc4key[4]);
7849 }
7850 else if (hash_mode == 10000)
7851 {
7852 // salt
7853
7854 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7855
7856 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7857
7858 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7859
7860 // hash
7861
7862 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7863 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7864 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7865 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7866 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7867 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7868 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7869 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7870 digest_buf[8] = 0; // needed for base64_encode ()
7871
7872 char tmp_buf[64] = { 0 };
7873
7874 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7875
7876 // output
7877
7878 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7879 }
7880 else if (hash_mode == 10100)
7881 {
7882 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7883 digest_buf[0],
7884 digest_buf[1],
7885 2,
7886 4,
7887 byte_swap_32 (salt.salt_buf[0]),
7888 byte_swap_32 (salt.salt_buf[1]),
7889 byte_swap_32 (salt.salt_buf[2]),
7890 byte_swap_32 (salt.salt_buf[3]));
7891 }
7892 else if (hash_mode == 10200)
7893 {
7894 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7895
7896 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7897
7898 // challenge
7899
7900 char challenge[100] = { 0 };
7901
7902 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7903
7904 // response
7905
7906 char tmp_buf[100] = { 0 };
7907
7908 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7909 (char *) cram_md5->user,
7910 digest_buf[0],
7911 digest_buf[1],
7912 digest_buf[2],
7913 digest_buf[3]);
7914
7915 char response[100] = { 0 };
7916
7917 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7918
7919 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7920 }
7921 else if (hash_mode == 10300)
7922 {
7923 char tmp_buf[100] = { 0 };
7924
7925 memcpy (tmp_buf + 0, digest_buf, 20);
7926 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7927
7928 uint tmp_len = 20 + salt.salt_len;
7929
7930 // base64 encode it
7931
7932 char base64_encoded[100] = { 0 };
7933
7934 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7935
7936 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7937 }
7938 else if (hash_mode == 10400)
7939 {
7940 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7941
7942 pdf_t *pdf = &pdfs[salt_pos];
7943
7944 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",
7945
7946 pdf->V,
7947 pdf->R,
7948 40,
7949 pdf->P,
7950 pdf->enc_md,
7951 pdf->id_len,
7952 byte_swap_32 (pdf->id_buf[0]),
7953 byte_swap_32 (pdf->id_buf[1]),
7954 byte_swap_32 (pdf->id_buf[2]),
7955 byte_swap_32 (pdf->id_buf[3]),
7956 pdf->u_len,
7957 byte_swap_32 (pdf->u_buf[0]),
7958 byte_swap_32 (pdf->u_buf[1]),
7959 byte_swap_32 (pdf->u_buf[2]),
7960 byte_swap_32 (pdf->u_buf[3]),
7961 byte_swap_32 (pdf->u_buf[4]),
7962 byte_swap_32 (pdf->u_buf[5]),
7963 byte_swap_32 (pdf->u_buf[6]),
7964 byte_swap_32 (pdf->u_buf[7]),
7965 pdf->o_len,
7966 byte_swap_32 (pdf->o_buf[0]),
7967 byte_swap_32 (pdf->o_buf[1]),
7968 byte_swap_32 (pdf->o_buf[2]),
7969 byte_swap_32 (pdf->o_buf[3]),
7970 byte_swap_32 (pdf->o_buf[4]),
7971 byte_swap_32 (pdf->o_buf[5]),
7972 byte_swap_32 (pdf->o_buf[6]),
7973 byte_swap_32 (pdf->o_buf[7])
7974 );
7975 }
7976 else if (hash_mode == 10410)
7977 {
7978 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7979
7980 pdf_t *pdf = &pdfs[salt_pos];
7981
7982 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",
7983
7984 pdf->V,
7985 pdf->R,
7986 40,
7987 pdf->P,
7988 pdf->enc_md,
7989 pdf->id_len,
7990 byte_swap_32 (pdf->id_buf[0]),
7991 byte_swap_32 (pdf->id_buf[1]),
7992 byte_swap_32 (pdf->id_buf[2]),
7993 byte_swap_32 (pdf->id_buf[3]),
7994 pdf->u_len,
7995 byte_swap_32 (pdf->u_buf[0]),
7996 byte_swap_32 (pdf->u_buf[1]),
7997 byte_swap_32 (pdf->u_buf[2]),
7998 byte_swap_32 (pdf->u_buf[3]),
7999 byte_swap_32 (pdf->u_buf[4]),
8000 byte_swap_32 (pdf->u_buf[5]),
8001 byte_swap_32 (pdf->u_buf[6]),
8002 byte_swap_32 (pdf->u_buf[7]),
8003 pdf->o_len,
8004 byte_swap_32 (pdf->o_buf[0]),
8005 byte_swap_32 (pdf->o_buf[1]),
8006 byte_swap_32 (pdf->o_buf[2]),
8007 byte_swap_32 (pdf->o_buf[3]),
8008 byte_swap_32 (pdf->o_buf[4]),
8009 byte_swap_32 (pdf->o_buf[5]),
8010 byte_swap_32 (pdf->o_buf[6]),
8011 byte_swap_32 (pdf->o_buf[7])
8012 );
8013 }
8014 else if (hash_mode == 10420)
8015 {
8016 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
8017
8018 pdf_t *pdf = &pdfs[salt_pos];
8019
8020 u8 *rc4key = (u8 *) pdf->rc4key;
8021
8022 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",
8023
8024 pdf->V,
8025 pdf->R,
8026 40,
8027 pdf->P,
8028 pdf->enc_md,
8029 pdf->id_len,
8030 byte_swap_32 (pdf->id_buf[0]),
8031 byte_swap_32 (pdf->id_buf[1]),
8032 byte_swap_32 (pdf->id_buf[2]),
8033 byte_swap_32 (pdf->id_buf[3]),
8034 pdf->u_len,
8035 byte_swap_32 (pdf->u_buf[0]),
8036 byte_swap_32 (pdf->u_buf[1]),
8037 byte_swap_32 (pdf->u_buf[2]),
8038 byte_swap_32 (pdf->u_buf[3]),
8039 byte_swap_32 (pdf->u_buf[4]),
8040 byte_swap_32 (pdf->u_buf[5]),
8041 byte_swap_32 (pdf->u_buf[6]),
8042 byte_swap_32 (pdf->u_buf[7]),
8043 pdf->o_len,
8044 byte_swap_32 (pdf->o_buf[0]),
8045 byte_swap_32 (pdf->o_buf[1]),
8046 byte_swap_32 (pdf->o_buf[2]),
8047 byte_swap_32 (pdf->o_buf[3]),
8048 byte_swap_32 (pdf->o_buf[4]),
8049 byte_swap_32 (pdf->o_buf[5]),
8050 byte_swap_32 (pdf->o_buf[6]),
8051 byte_swap_32 (pdf->o_buf[7]),
8052 rc4key[0],
8053 rc4key[1],
8054 rc4key[2],
8055 rc4key[3],
8056 rc4key[4]
8057 );
8058 }
8059 else if (hash_mode == 10500)
8060 {
8061 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
8062
8063 pdf_t *pdf = &pdfs[salt_pos];
8064
8065 if (pdf->id_len == 32)
8066 {
8067 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",
8068
8069 pdf->V,
8070 pdf->R,
8071 128,
8072 pdf->P,
8073 pdf->enc_md,
8074 pdf->id_len,
8075 byte_swap_32 (pdf->id_buf[0]),
8076 byte_swap_32 (pdf->id_buf[1]),
8077 byte_swap_32 (pdf->id_buf[2]),
8078 byte_swap_32 (pdf->id_buf[3]),
8079 byte_swap_32 (pdf->id_buf[4]),
8080 byte_swap_32 (pdf->id_buf[5]),
8081 byte_swap_32 (pdf->id_buf[6]),
8082 byte_swap_32 (pdf->id_buf[7]),
8083 pdf->u_len,
8084 byte_swap_32 (pdf->u_buf[0]),
8085 byte_swap_32 (pdf->u_buf[1]),
8086 byte_swap_32 (pdf->u_buf[2]),
8087 byte_swap_32 (pdf->u_buf[3]),
8088 byte_swap_32 (pdf->u_buf[4]),
8089 byte_swap_32 (pdf->u_buf[5]),
8090 byte_swap_32 (pdf->u_buf[6]),
8091 byte_swap_32 (pdf->u_buf[7]),
8092 pdf->o_len,
8093 byte_swap_32 (pdf->o_buf[0]),
8094 byte_swap_32 (pdf->o_buf[1]),
8095 byte_swap_32 (pdf->o_buf[2]),
8096 byte_swap_32 (pdf->o_buf[3]),
8097 byte_swap_32 (pdf->o_buf[4]),
8098 byte_swap_32 (pdf->o_buf[5]),
8099 byte_swap_32 (pdf->o_buf[6]),
8100 byte_swap_32 (pdf->o_buf[7])
8101 );
8102 }
8103 else
8104 {
8105 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",
8106
8107 pdf->V,
8108 pdf->R,
8109 128,
8110 pdf->P,
8111 pdf->enc_md,
8112 pdf->id_len,
8113 byte_swap_32 (pdf->id_buf[0]),
8114 byte_swap_32 (pdf->id_buf[1]),
8115 byte_swap_32 (pdf->id_buf[2]),
8116 byte_swap_32 (pdf->id_buf[3]),
8117 pdf->u_len,
8118 byte_swap_32 (pdf->u_buf[0]),
8119 byte_swap_32 (pdf->u_buf[1]),
8120 byte_swap_32 (pdf->u_buf[2]),
8121 byte_swap_32 (pdf->u_buf[3]),
8122 byte_swap_32 (pdf->u_buf[4]),
8123 byte_swap_32 (pdf->u_buf[5]),
8124 byte_swap_32 (pdf->u_buf[6]),
8125 byte_swap_32 (pdf->u_buf[7]),
8126 pdf->o_len,
8127 byte_swap_32 (pdf->o_buf[0]),
8128 byte_swap_32 (pdf->o_buf[1]),
8129 byte_swap_32 (pdf->o_buf[2]),
8130 byte_swap_32 (pdf->o_buf[3]),
8131 byte_swap_32 (pdf->o_buf[4]),
8132 byte_swap_32 (pdf->o_buf[5]),
8133 byte_swap_32 (pdf->o_buf[6]),
8134 byte_swap_32 (pdf->o_buf[7])
8135 );
8136 }
8137 }
8138 else if (hash_mode == 10600)
8139 {
8140 uint digest_idx = salt.digests_offset + digest_pos;
8141
8142 hashinfo_t **hashinfo_ptr = data.hash_info;
8143 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8144
8145 snprintf (out_buf, len-1, "%s", hash_buf);
8146 }
8147 else if (hash_mode == 10700)
8148 {
8149 uint digest_idx = salt.digests_offset + digest_pos;
8150
8151 hashinfo_t **hashinfo_ptr = data.hash_info;
8152 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8153
8154 snprintf (out_buf, len-1, "%s", hash_buf);
8155 }
8156 else if (hash_mode == 10900)
8157 {
8158 uint digest_idx = salt.digests_offset + digest_pos;
8159
8160 hashinfo_t **hashinfo_ptr = data.hash_info;
8161 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8162
8163 snprintf (out_buf, len-1, "%s", hash_buf);
8164 }
8165 else if (hash_mode == 11100)
8166 {
8167 u32 salt_challenge = salt.salt_buf[0];
8168
8169 salt_challenge = byte_swap_32 (salt_challenge);
8170
8171 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
8172
8173 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
8174 SIGNATURE_POSTGRESQL_AUTH,
8175 user_name,
8176 salt_challenge,
8177 digest_buf[0],
8178 digest_buf[1],
8179 digest_buf[2],
8180 digest_buf[3]);
8181 }
8182 else if (hash_mode == 11200)
8183 {
8184 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
8185 SIGNATURE_MYSQL_AUTH,
8186 (unsigned char *) salt.salt_buf,
8187 digest_buf[0],
8188 digest_buf[1],
8189 digest_buf[2],
8190 digest_buf[3],
8191 digest_buf[4]);
8192 }
8193 else if (hash_mode == 11300)
8194 {
8195 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
8196
8197 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
8198
8199 const uint cry_master_len = bitcoin_wallet->cry_master_len;
8200 const uint ckey_len = bitcoin_wallet->ckey_len;
8201 const uint public_key_len = bitcoin_wallet->public_key_len;
8202
8203 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
8204 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
8205 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
8206
8207 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
8208 {
8209 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
8210
8211 sprintf (cry_master_buf + j, "%02x", ptr[i]);
8212 }
8213
8214 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
8215 {
8216 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
8217
8218 sprintf (ckey_buf + j, "%02x", ptr[i]);
8219 }
8220
8221 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
8222 {
8223 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
8224
8225 sprintf (public_key_buf + j, "%02x", ptr[i]);
8226 }
8227
8228 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
8229 SIGNATURE_BITCOIN_WALLET,
8230 cry_master_len * 2,
8231 cry_master_buf,
8232 salt.salt_len,
8233 (unsigned char *) salt.salt_buf,
8234 salt.salt_iter + 1,
8235 ckey_len * 2,
8236 ckey_buf,
8237 public_key_len * 2,
8238 public_key_buf
8239 );
8240
8241 free (cry_master_buf);
8242 free (ckey_buf);
8243 free (public_key_buf);
8244 }
8245 else if (hash_mode == 11400)
8246 {
8247 uint digest_idx = salt.digests_offset + digest_pos;
8248
8249 hashinfo_t **hashinfo_ptr = data.hash_info;
8250 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8251
8252 snprintf (out_buf, len-1, "%s", hash_buf);
8253 }
8254 else if (hash_mode == 11600)
8255 {
8256 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
8257
8258 seven_zip_t *seven_zip = &seven_zips[salt_pos];
8259
8260 const uint data_len = seven_zip->data_len;
8261
8262 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
8263
8264 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8265 {
8266 const u8 *ptr = (const u8 *) seven_zip->data_buf;
8267
8268 sprintf (data_buf + j, "%02x", ptr[i]);
8269 }
8270
8271 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
8272 SIGNATURE_SEVEN_ZIP,
8273 0,
8274 salt.salt_sign[0],
8275 0,
8276 (char *) seven_zip->salt_buf,
8277 seven_zip->iv_len,
8278 seven_zip->iv_buf[0],
8279 seven_zip->iv_buf[1],
8280 seven_zip->iv_buf[2],
8281 seven_zip->iv_buf[3],
8282 seven_zip->crc,
8283 seven_zip->data_len,
8284 seven_zip->unpack_size,
8285 data_buf);
8286
8287 free (data_buf);
8288 }
8289 else if (hash_mode == 11700)
8290 {
8291 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8292 digest_buf[0],
8293 digest_buf[1],
8294 digest_buf[2],
8295 digest_buf[3],
8296 digest_buf[4],
8297 digest_buf[5],
8298 digest_buf[6],
8299 digest_buf[7]);
8300 }
8301 else if (hash_mode == 11800)
8302 {
8303 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8304 digest_buf[ 0],
8305 digest_buf[ 1],
8306 digest_buf[ 2],
8307 digest_buf[ 3],
8308 digest_buf[ 4],
8309 digest_buf[ 5],
8310 digest_buf[ 6],
8311 digest_buf[ 7],
8312 digest_buf[ 8],
8313 digest_buf[ 9],
8314 digest_buf[10],
8315 digest_buf[11],
8316 digest_buf[12],
8317 digest_buf[13],
8318 digest_buf[14],
8319 digest_buf[15]);
8320 }
8321 else if (hash_mode == 11900)
8322 {
8323 uint digest_idx = salt.digests_offset + digest_pos;
8324
8325 hashinfo_t **hashinfo_ptr = data.hash_info;
8326 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8327
8328 snprintf (out_buf, len-1, "%s", hash_buf);
8329 }
8330 else if (hash_mode == 12000)
8331 {
8332 uint digest_idx = salt.digests_offset + digest_pos;
8333
8334 hashinfo_t **hashinfo_ptr = data.hash_info;
8335 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8336
8337 snprintf (out_buf, len-1, "%s", hash_buf);
8338 }
8339 else if (hash_mode == 12100)
8340 {
8341 uint digest_idx = salt.digests_offset + digest_pos;
8342
8343 hashinfo_t **hashinfo_ptr = data.hash_info;
8344 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8345
8346 snprintf (out_buf, len-1, "%s", hash_buf);
8347 }
8348 else if (hash_mode == 12200)
8349 {
8350 uint *ptr_digest = digest_buf;
8351 uint *ptr_salt = salt.salt_buf;
8352
8353 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8354 SIGNATURE_ECRYPTFS,
8355 ptr_salt[0],
8356 ptr_salt[1],
8357 ptr_digest[0],
8358 ptr_digest[1]);
8359 }
8360 else if (hash_mode == 12300)
8361 {
8362 uint *ptr_digest = digest_buf;
8363 uint *ptr_salt = salt.salt_buf;
8364
8365 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",
8366 ptr_digest[ 0], ptr_digest[ 1],
8367 ptr_digest[ 2], ptr_digest[ 3],
8368 ptr_digest[ 4], ptr_digest[ 5],
8369 ptr_digest[ 6], ptr_digest[ 7],
8370 ptr_digest[ 8], ptr_digest[ 9],
8371 ptr_digest[10], ptr_digest[11],
8372 ptr_digest[12], ptr_digest[13],
8373 ptr_digest[14], ptr_digest[15],
8374 ptr_salt[0],
8375 ptr_salt[1],
8376 ptr_salt[2],
8377 ptr_salt[3]);
8378 }
8379 else if (hash_mode == 12400)
8380 {
8381 // encode iteration count
8382
8383 char salt_iter[5] = { 0 };
8384
8385 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8386 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8387 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8388 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8389 salt_iter[4] = 0;
8390
8391 // encode salt
8392
8393 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8394 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8395 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8396 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8397 ptr_salt[4] = 0;
8398
8399 // encode digest
8400
8401 memset (tmp_buf, 0, sizeof (tmp_buf));
8402
8403 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8404 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8405
8406 memcpy (tmp_buf, digest_buf, 8);
8407
8408 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8409
8410 ptr_plain[11] = 0;
8411
8412 // fill the resulting buffer
8413
8414 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8415 }
8416 else if (hash_mode == 12500)
8417 {
8418 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8419 SIGNATURE_RAR3,
8420 byte_swap_32 (salt.salt_buf[0]),
8421 byte_swap_32 (salt.salt_buf[1]),
8422 salt.salt_buf[2],
8423 salt.salt_buf[3],
8424 salt.salt_buf[4],
8425 salt.salt_buf[5]);
8426 }
8427 else if (hash_mode == 12600)
8428 {
8429 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8430 digest_buf[0] + salt.salt_buf_pc[0],
8431 digest_buf[1] + salt.salt_buf_pc[1],
8432 digest_buf[2] + salt.salt_buf_pc[2],
8433 digest_buf[3] + salt.salt_buf_pc[3],
8434 digest_buf[4] + salt.salt_buf_pc[4],
8435 digest_buf[5] + salt.salt_buf_pc[5],
8436 digest_buf[6] + salt.salt_buf_pc[6],
8437 digest_buf[7] + salt.salt_buf_pc[7]);
8438 }
8439 else if (hash_mode == 12700)
8440 {
8441 uint digest_idx = salt.digests_offset + digest_pos;
8442
8443 hashinfo_t **hashinfo_ptr = data.hash_info;
8444 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8445
8446 snprintf (out_buf, len-1, "%s", hash_buf);
8447 }
8448 else if (hash_mode == 12800)
8449 {
8450 const u8 *ptr = (const u8 *) salt.salt_buf;
8451
8452 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",
8453 SIGNATURE_MS_DRSR,
8454 ptr[0],
8455 ptr[1],
8456 ptr[2],
8457 ptr[3],
8458 ptr[4],
8459 ptr[5],
8460 ptr[6],
8461 ptr[7],
8462 ptr[8],
8463 ptr[9],
8464 salt.salt_iter + 1,
8465 byte_swap_32 (digest_buf[0]),
8466 byte_swap_32 (digest_buf[1]),
8467 byte_swap_32 (digest_buf[2]),
8468 byte_swap_32 (digest_buf[3]),
8469 byte_swap_32 (digest_buf[4]),
8470 byte_swap_32 (digest_buf[5]),
8471 byte_swap_32 (digest_buf[6]),
8472 byte_swap_32 (digest_buf[7])
8473 );
8474 }
8475 else if (hash_mode == 12900)
8476 {
8477 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",
8478 salt.salt_buf[ 4],
8479 salt.salt_buf[ 5],
8480 salt.salt_buf[ 6],
8481 salt.salt_buf[ 7],
8482 salt.salt_buf[ 8],
8483 salt.salt_buf[ 9],
8484 salt.salt_buf[10],
8485 salt.salt_buf[11],
8486 byte_swap_32 (digest_buf[0]),
8487 byte_swap_32 (digest_buf[1]),
8488 byte_swap_32 (digest_buf[2]),
8489 byte_swap_32 (digest_buf[3]),
8490 byte_swap_32 (digest_buf[4]),
8491 byte_swap_32 (digest_buf[5]),
8492 byte_swap_32 (digest_buf[6]),
8493 byte_swap_32 (digest_buf[7]),
8494 salt.salt_buf[ 0],
8495 salt.salt_buf[ 1],
8496 salt.salt_buf[ 2],
8497 salt.salt_buf[ 3]
8498 );
8499 }
8500 else if (hash_mode == 13000)
8501 {
8502 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8503
8504 rar5_t *rar5 = &rar5s[salt_pos];
8505
8506 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8507 salt.salt_buf[0],
8508 salt.salt_buf[1],
8509 salt.salt_buf[2],
8510 salt.salt_buf[3],
8511 salt.salt_sign[0],
8512 rar5->iv[0],
8513 rar5->iv[1],
8514 rar5->iv[2],
8515 rar5->iv[3],
8516 byte_swap_32 (digest_buf[0]),
8517 byte_swap_32 (digest_buf[1])
8518 );
8519 }
8520 else if (hash_mode == 13100)
8521 {
8522 krb5tgs_t *krb5tgss = (krb5tgs_t *) data.esalts_buf;
8523
8524 krb5tgs_t *krb5tgs = &krb5tgss[salt_pos];
8525
8526 u8 *ptr_checksum = (u8 *) krb5tgs->checksum;
8527 u8 *ptr_edata2 = (u8 *) krb5tgs->edata2;
8528
8529 char data[2560 * 4 * 2] = { 0 };
8530
8531 char *ptr_data = data;
8532
8533 for (uint i = 0; i < 16; i++, ptr_data += 2)
8534 sprintf (ptr_data, "%02x", ptr_checksum[i]);
8535
8536 /* skip '$' */
8537 ptr_data++;
8538
8539 for (uint i = 0; i < krb5tgs->edata2_len; i++, ptr_data += 2)
8540 sprintf (ptr_data, "%02x", ptr_edata2[i]);
8541
8542 snprintf (out_buf, len-1, "%s$%s$%s$%s",
8543 SIGNATURE_KRB5TGS,
8544 (char *) krb5tgs->account_info,
8545 data,
8546 data + 33);
8547 }
8548 else if (hash_mode == 13200)
8549 {
8550 snprintf (out_buf, len-1, "%s*%d*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x",
8551 SIGNATURE_AXCRYPT,
8552 salt.salt_iter,
8553 salt.salt_buf[0],
8554 salt.salt_buf[1],
8555 salt.salt_buf[2],
8556 salt.salt_buf[3],
8557 salt.salt_buf[4],
8558 salt.salt_buf[5],
8559 salt.salt_buf[6],
8560 salt.salt_buf[7],
8561 salt.salt_buf[8],
8562 salt.salt_buf[9]);
8563 }
8564 else if (hash_mode == 13300)
8565 {
8566 snprintf (out_buf, len-1, "%s$%08x%08x%08x%08x",
8567 SIGNATURE_AXCRYPT_SHA1,
8568 digest_buf[0],
8569 digest_buf[1],
8570 digest_buf[2],
8571 digest_buf[3]);
8572 }
8573 else if (hash_mode == 13400)
8574 {
8575 keepass_t *keepasss = (keepass_t *) data.esalts_buf;
8576
8577 keepass_t *keepass = &keepasss[salt_pos];
8578
8579 u32 version = (u32) keepass->version;
8580 u32 rounds = salt.salt_iter;
8581 u32 algorithm = (u32) keepass->algorithm;
8582 u32 keyfile_len = (u32) keepass->keyfile_len;
8583
8584 u32 *ptr_final_random_seed = (u32 *) keepass->final_random_seed ;
8585 u32 *ptr_transf_random_seed = (u32 *) keepass->transf_random_seed ;
8586 u32 *ptr_enc_iv = (u32 *) keepass->enc_iv ;
8587 u32 *ptr_contents_hash = (u32 *) keepass->contents_hash ;
8588 u32 *ptr_keyfile = (u32 *) keepass->keyfile ;
8589
8590 /* specific to version 1 */
8591 u32 contents_len;
8592 u32 *ptr_contents;
8593
8594 /* specific to version 2 */
8595 u32 expected_bytes_len;
8596 u32 *ptr_expected_bytes;
8597
8598 u32 final_random_seed_len;
8599 u32 transf_random_seed_len;
8600 u32 enc_iv_len;
8601 u32 contents_hash_len;
8602
8603 transf_random_seed_len = 8;
8604 enc_iv_len = 4;
8605 contents_hash_len = 8;
8606 final_random_seed_len = 8;
8607
8608 if (version == 1)
8609 final_random_seed_len = 4;
8610
8611 snprintf (out_buf, len-1, "%s*%d*%d*%d",
8612 SIGNATURE_KEEPASS,
8613 version,
8614 rounds,
8615 algorithm);
8616
8617 char *ptr_data = out_buf;
8618
8619 ptr_data += strlen(out_buf);
8620
8621 *ptr_data = '*';
8622 ptr_data++;
8623
8624 for (uint i = 0; i < final_random_seed_len; i++, ptr_data += 8)
8625 sprintf (ptr_data, "%08x", ptr_final_random_seed[i]);
8626
8627 *ptr_data = '*';
8628 ptr_data++;
8629
8630 for (uint i = 0; i < transf_random_seed_len; i++, ptr_data += 8)
8631 sprintf (ptr_data, "%08x", ptr_transf_random_seed[i]);
8632
8633 *ptr_data = '*';
8634 ptr_data++;
8635
8636 for (uint i = 0; i < enc_iv_len; i++, ptr_data += 8)
8637 sprintf (ptr_data, "%08x", ptr_enc_iv[i]);
8638
8639 *ptr_data = '*';
8640 ptr_data++;
8641
8642 if (version == 1)
8643 {
8644 contents_len = (u32) keepass->contents_len;
8645 ptr_contents = (u32 *) keepass->contents;
8646
8647 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8648 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8649
8650 *ptr_data = '*';
8651 ptr_data++;
8652
8653 /* inline flag */
8654 *ptr_data = '1';
8655 ptr_data++;
8656
8657 *ptr_data = '*';
8658 ptr_data++;
8659
8660 char ptr_contents_len[10] = { 0 };
8661
8662 sprintf ((char*) ptr_contents_len, "%d", contents_len);
8663
8664 sprintf (ptr_data, "%d", contents_len);
8665
8666 ptr_data += strlen(ptr_contents_len);
8667
8668 *ptr_data = '*';
8669 ptr_data++;
8670
8671 for (uint i = 0; i < contents_len / 4; i++, ptr_data += 8)
8672 sprintf (ptr_data, "%08x", ptr_contents[i]);
8673 }
8674 else if (version == 2)
8675 {
8676 expected_bytes_len = 8;
8677 ptr_expected_bytes = (u32 *) keepass->expected_bytes ;
8678
8679 for (uint i = 0; i < expected_bytes_len; i++, ptr_data += 8)
8680 sprintf (ptr_data, "%08x", ptr_expected_bytes[i]);
8681
8682 *ptr_data = '*';
8683 ptr_data++;
8684
8685 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8686 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8687 }
8688 if (keyfile_len)
8689 {
8690 *ptr_data = '*';
8691 ptr_data++;
8692
8693 /* inline flag */
8694 *ptr_data = '1';
8695 ptr_data++;
8696
8697 *ptr_data = '*';
8698 ptr_data++;
8699
8700 sprintf (ptr_data, "%d", keyfile_len);
8701
8702 ptr_data += 2;
8703
8704 *ptr_data = '*';
8705 ptr_data++;
8706
8707 for (uint i = 0; i < 8; i++, ptr_data += 8)
8708 sprintf (ptr_data, "%08x", ptr_keyfile[i]);
8709 }
8710 }
8711 else if (hash_mode == 13500)
8712 {
8713 pstoken_t *pstokens = (pstoken_t *) data.esalts_buf;
8714
8715 pstoken_t *pstoken = &pstokens[salt_pos];
8716
8717 const u32 salt_len = (pstoken->salt_len > 512) ? 512 : pstoken->salt_len;
8718
8719 char pstoken_tmp[1024 + 1] = { 0 };
8720
8721 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8722 {
8723 const u8 *ptr = (const u8 *) pstoken->salt_buf;
8724
8725 sprintf (pstoken_tmp + j, "%02x", ptr[i]);
8726 }
8727
8728 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x:%s",
8729 digest_buf[0],
8730 digest_buf[1],
8731 digest_buf[2],
8732 digest_buf[3],
8733 digest_buf[4],
8734 pstoken_tmp);
8735 }
8736 else if (hash_mode == 13600)
8737 {
8738 zip2_t *zip2s = (zip2_t *) data.esalts_buf;
8739
8740 zip2_t *zip2 = &zip2s[salt_pos];
8741
8742 const u32 salt_len = zip2->salt_len;
8743
8744 char salt_tmp[32 + 1] = { 0 };
8745
8746 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8747 {
8748 const u8 *ptr = (const u8 *) zip2->salt_buf;
8749
8750 sprintf (salt_tmp + j, "%02x", ptr[i]);
8751 }
8752
8753 const u32 data_len = zip2->data_len;
8754
8755 char data_tmp[8192 + 1] = { 0 };
8756
8757 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8758 {
8759 const u8 *ptr = (const u8 *) zip2->data_buf;
8760
8761 sprintf (data_tmp + j, "%02x", ptr[i]);
8762 }
8763
8764 const u32 auth_len = zip2->auth_len;
8765
8766 char auth_tmp[20 + 1] = { 0 };
8767
8768 for (uint i = 0, j = 0; i < auth_len; i += 1, j += 2)
8769 {
8770 const u8 *ptr = (const u8 *) zip2->auth_buf;
8771
8772 sprintf (auth_tmp + j, "%02x", ptr[i]);
8773 }
8774
8775 snprintf (out_buf, 255, "%s*%u*%u*%u*%s*%x*%u*%s*%s*%s",
8776 SIGNATURE_ZIP2_START,
8777 zip2->type,
8778 zip2->mode,
8779 zip2->magic,
8780 salt_tmp,
8781 zip2->verify_bytes,
8782 zip2->compress_length,
8783 data_tmp,
8784 auth_tmp,
8785 SIGNATURE_ZIP2_STOP);
8786 }
8787 else if ((hash_mode >= 13700) && (hash_mode <= 13799))
8788 {
8789 snprintf (out_buf, len-1, "%s", hashfile);
8790 }
8791 else if (hash_mode == 13800)
8792 {
8793 win8phone_t *esalts = (win8phone_t *) data.esalts_buf;
8794
8795 win8phone_t *esalt = &esalts[salt_pos];
8796
8797 char buf[256 + 1] = { 0 };
8798
8799 for (int i = 0, j = 0; i < 32; i += 1, j += 8)
8800 {
8801 sprintf (buf + j, "%08x", esalt->salt_buf[i]);
8802 }
8803
8804 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%s",
8805 digest_buf[0],
8806 digest_buf[1],
8807 digest_buf[2],
8808 digest_buf[3],
8809 digest_buf[4],
8810 digest_buf[5],
8811 digest_buf[6],
8812 digest_buf[7],
8813 buf);
8814 }
8815 else
8816 {
8817 if (hash_type == HASH_TYPE_MD4)
8818 {
8819 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8820 digest_buf[0],
8821 digest_buf[1],
8822 digest_buf[2],
8823 digest_buf[3]);
8824 }
8825 else if (hash_type == HASH_TYPE_MD5)
8826 {
8827 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8828 digest_buf[0],
8829 digest_buf[1],
8830 digest_buf[2],
8831 digest_buf[3]);
8832 }
8833 else if (hash_type == HASH_TYPE_SHA1)
8834 {
8835 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8836 digest_buf[0],
8837 digest_buf[1],
8838 digest_buf[2],
8839 digest_buf[3],
8840 digest_buf[4]);
8841 }
8842 else if (hash_type == HASH_TYPE_SHA256)
8843 {
8844 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8845 digest_buf[0],
8846 digest_buf[1],
8847 digest_buf[2],
8848 digest_buf[3],
8849 digest_buf[4],
8850 digest_buf[5],
8851 digest_buf[6],
8852 digest_buf[7]);
8853 }
8854 else if (hash_type == HASH_TYPE_SHA384)
8855 {
8856 uint *ptr = digest_buf;
8857
8858 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8859 ptr[ 1], ptr[ 0],
8860 ptr[ 3], ptr[ 2],
8861 ptr[ 5], ptr[ 4],
8862 ptr[ 7], ptr[ 6],
8863 ptr[ 9], ptr[ 8],
8864 ptr[11], ptr[10]);
8865 }
8866 else if (hash_type == HASH_TYPE_SHA512)
8867 {
8868 uint *ptr = digest_buf;
8869
8870 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8871 ptr[ 1], ptr[ 0],
8872 ptr[ 3], ptr[ 2],
8873 ptr[ 5], ptr[ 4],
8874 ptr[ 7], ptr[ 6],
8875 ptr[ 9], ptr[ 8],
8876 ptr[11], ptr[10],
8877 ptr[13], ptr[12],
8878 ptr[15], ptr[14]);
8879 }
8880 else if (hash_type == HASH_TYPE_LM)
8881 {
8882 snprintf (out_buf, len-1, "%08x%08x",
8883 digest_buf[0],
8884 digest_buf[1]);
8885 }
8886 else if (hash_type == HASH_TYPE_ORACLEH)
8887 {
8888 snprintf (out_buf, len-1, "%08X%08X",
8889 digest_buf[0],
8890 digest_buf[1]);
8891 }
8892 else if (hash_type == HASH_TYPE_BCRYPT)
8893 {
8894 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8895 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8896
8897 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8898
8899 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8900 }
8901 else if (hash_type == HASH_TYPE_KECCAK)
8902 {
8903 uint *ptr = digest_buf;
8904
8905 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",
8906 ptr[ 1], ptr[ 0],
8907 ptr[ 3], ptr[ 2],
8908 ptr[ 5], ptr[ 4],
8909 ptr[ 7], ptr[ 6],
8910 ptr[ 9], ptr[ 8],
8911 ptr[11], ptr[10],
8912 ptr[13], ptr[12],
8913 ptr[15], ptr[14],
8914 ptr[17], ptr[16],
8915 ptr[19], ptr[18],
8916 ptr[21], ptr[20],
8917 ptr[23], ptr[22],
8918 ptr[25], ptr[24],
8919 ptr[27], ptr[26],
8920 ptr[29], ptr[28],
8921 ptr[31], ptr[30],
8922 ptr[33], ptr[32],
8923 ptr[35], ptr[34],
8924 ptr[37], ptr[36],
8925 ptr[39], ptr[38],
8926 ptr[41], ptr[30],
8927 ptr[43], ptr[42],
8928 ptr[45], ptr[44],
8929 ptr[47], ptr[46],
8930 ptr[49], ptr[48]
8931 );
8932
8933 out_buf[salt.keccak_mdlen * 2] = 0;
8934 }
8935 else if (hash_type == HASH_TYPE_RIPEMD160)
8936 {
8937 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8938 digest_buf[0],
8939 digest_buf[1],
8940 digest_buf[2],
8941 digest_buf[3],
8942 digest_buf[4]);
8943 }
8944 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8945 {
8946 digest_buf[ 0] = digest_buf[ 0];
8947 digest_buf[ 1] = digest_buf[ 1];
8948 digest_buf[ 2] = digest_buf[ 2];
8949 digest_buf[ 3] = digest_buf[ 3];
8950 digest_buf[ 4] = digest_buf[ 4];
8951 digest_buf[ 5] = digest_buf[ 5];
8952 digest_buf[ 6] = digest_buf[ 6];
8953 digest_buf[ 7] = digest_buf[ 7];
8954 digest_buf[ 8] = digest_buf[ 8];
8955 digest_buf[ 9] = digest_buf[ 9];
8956 digest_buf[10] = digest_buf[10];
8957 digest_buf[11] = digest_buf[11];
8958 digest_buf[12] = digest_buf[12];
8959 digest_buf[13] = digest_buf[13];
8960 digest_buf[14] = digest_buf[14];
8961 digest_buf[15] = digest_buf[15];
8962
8963 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8964 digest_buf[ 0],
8965 digest_buf[ 1],
8966 digest_buf[ 2],
8967 digest_buf[ 3],
8968 digest_buf[ 4],
8969 digest_buf[ 5],
8970 digest_buf[ 6],
8971 digest_buf[ 7],
8972 digest_buf[ 8],
8973 digest_buf[ 9],
8974 digest_buf[10],
8975 digest_buf[11],
8976 digest_buf[12],
8977 digest_buf[13],
8978 digest_buf[14],
8979 digest_buf[15]);
8980 }
8981 else if (hash_type == HASH_TYPE_GOST)
8982 {
8983 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8984 digest_buf[0],
8985 digest_buf[1],
8986 digest_buf[2],
8987 digest_buf[3],
8988 digest_buf[4],
8989 digest_buf[5],
8990 digest_buf[6],
8991 digest_buf[7]);
8992 }
8993 else if (hash_type == HASH_TYPE_MYSQL)
8994 {
8995 snprintf (out_buf, len-1, "%08x%08x",
8996 digest_buf[0],
8997 digest_buf[1]);
8998 }
8999 else if (hash_type == HASH_TYPE_LOTUS5)
9000 {
9001 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
9002 digest_buf[0],
9003 digest_buf[1],
9004 digest_buf[2],
9005 digest_buf[3]);
9006 }
9007 else if (hash_type == HASH_TYPE_LOTUS6)
9008 {
9009 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
9010 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
9011 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
9012 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
9013
9014 char buf[16] = { 0 };
9015
9016 memcpy (buf + 0, salt.salt_buf, 5);
9017 memcpy (buf + 5, digest_buf, 9);
9018
9019 buf[3] -= -4;
9020
9021 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
9022
9023 tmp_buf[18] = salt.salt_buf_pc[7];
9024 tmp_buf[19] = 0;
9025
9026 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
9027 }
9028 else if (hash_type == HASH_TYPE_LOTUS8)
9029 {
9030 char buf[52] = { 0 };
9031
9032 // salt
9033
9034 memcpy (buf + 0, salt.salt_buf, 16);
9035
9036 buf[3] -= -4;
9037
9038 // iteration
9039
9040 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
9041
9042 // chars
9043
9044 buf[26] = salt.salt_buf_pc[0];
9045 buf[27] = salt.salt_buf_pc[1];
9046
9047 // digest
9048
9049 memcpy (buf + 28, digest_buf, 8);
9050
9051 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
9052
9053 tmp_buf[49] = 0;
9054
9055 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
9056 }
9057 else if (hash_type == HASH_TYPE_CRC32)
9058 {
9059 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
9060 }
9061 }
9062
9063 if (salt_type == SALT_TYPE_INTERN)
9064 {
9065 size_t pos = strlen (out_buf);
9066
9067 out_buf[pos] = data.separator;
9068
9069 char *ptr = (char *) salt.salt_buf;
9070
9071 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
9072
9073 out_buf[pos + 1 + salt.salt_len] = 0;
9074 }
9075 }
9076
9077 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
9078 {
9079 memset (hccap, 0, sizeof (hccap_t));
9080
9081 salt_t *salt = &data.salts_buf[salt_pos];
9082
9083 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
9084
9085 wpa_t *wpas = (wpa_t *) data.esalts_buf;
9086 wpa_t *wpa = &wpas[salt_pos];
9087
9088 hccap->keyver = wpa->keyver;
9089
9090 hccap->eapol_size = wpa->eapol_size;
9091
9092 if (wpa->keyver != 1)
9093 {
9094 uint eapol_tmp[64] = { 0 };
9095
9096 for (uint i = 0; i < 64; i++)
9097 {
9098 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
9099 }
9100
9101 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
9102 }
9103 else
9104 {
9105 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
9106 }
9107
9108 memcpy (hccap->mac1, wpa->orig_mac1, 6);
9109 memcpy (hccap->mac2, wpa->orig_mac2, 6);
9110 memcpy (hccap->nonce1, wpa->orig_nonce1, 32);
9111 memcpy (hccap->nonce2, wpa->orig_nonce2, 32);
9112
9113 char *digests_buf_ptr = (char *) data.digests_buf;
9114
9115 uint dgst_size = data.dgst_size;
9116
9117 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
9118
9119 if (wpa->keyver != 1)
9120 {
9121 uint digest_tmp[4] = { 0 };
9122
9123 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
9124 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
9125 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
9126 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
9127
9128 memcpy (hccap->keymic, digest_tmp, 16);
9129 }
9130 else
9131 {
9132 memcpy (hccap->keymic, digest_ptr, 16);
9133 }
9134 }
9135
9136 void SuspendThreads ()
9137 {
9138 if (data.devices_status == STATUS_RUNNING)
9139 {
9140 hc_timer_set (&data.timer_paused);
9141
9142 data.devices_status = STATUS_PAUSED;
9143
9144 log_info ("Paused");
9145 }
9146 }
9147
9148 void ResumeThreads ()
9149 {
9150 if (data.devices_status == STATUS_PAUSED)
9151 {
9152 double ms_paused;
9153
9154 hc_timer_get (data.timer_paused, ms_paused);
9155
9156 data.ms_paused += ms_paused;
9157
9158 data.devices_status = STATUS_RUNNING;
9159
9160 log_info ("Resumed");
9161 }
9162 }
9163
9164 void bypass ()
9165 {
9166 if (data.devices_status != STATUS_RUNNING) return;
9167
9168 data.devices_status = STATUS_BYPASS;
9169
9170 log_info ("Next dictionary / mask in queue selected, bypassing current one");
9171 }
9172
9173 void stop_at_checkpoint ()
9174 {
9175 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9176 {
9177 if (data.devices_status != STATUS_RUNNING) return;
9178 }
9179
9180 // this feature only makes sense if --restore-disable was not specified
9181
9182 if (data.restore_disable == 1)
9183 {
9184 log_info ("WARNING: This feature is disabled when --restore-disable is specified");
9185
9186 return;
9187 }
9188
9189 // check if monitoring of Restore Point updates should be enabled or disabled
9190
9191 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9192 {
9193 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
9194
9195 // save the current restore point value
9196
9197 data.checkpoint_cur_words = get_lowest_words_done ();
9198
9199 log_info ("Checkpoint enabled: Will quit at next Restore Point update");
9200 }
9201 else
9202 {
9203 data.devices_status = STATUS_RUNNING;
9204
9205 // reset the global value for checkpoint checks
9206
9207 data.checkpoint_cur_words = 0;
9208
9209 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
9210 }
9211 }
9212
9213 void myabort ()
9214 {
9215 //if (data.devices_status == STATUS_INIT) return;
9216 //if (data.devices_status == STATUS_STARTING) return;
9217
9218 data.devices_status = STATUS_ABORTED;
9219 }
9220
9221 void myquit ()
9222 {
9223 //if (data.devices_status == STATUS_INIT) return;
9224 //if (data.devices_status == STATUS_STARTING) return;
9225
9226 data.devices_status = STATUS_QUIT;
9227 }
9228
9229 void naive_replace (char *s, const u8 key_char, const u8 replace_char)
9230 {
9231 const size_t len = strlen (s);
9232
9233 for (size_t in = 0; in < len; in++)
9234 {
9235 const u8 c = s[in];
9236
9237 if (c == key_char)
9238 {
9239 s[in] = replace_char;
9240 }
9241 }
9242 }
9243
9244 void naive_escape (char *s, size_t s_max, const u8 key_char, const u8 escape_char)
9245 {
9246 char s_escaped[1024] = { 0 };
9247
9248 size_t s_escaped_max = sizeof (s_escaped);
9249
9250 const size_t len = strlen (s);
9251
9252 for (size_t in = 0, out = 0; in < len; in++, out++)
9253 {
9254 const u8 c = s[in];
9255
9256 if (c == key_char)
9257 {
9258 s_escaped[out] = escape_char;
9259
9260 out++;
9261 }
9262
9263 if (out == s_escaped_max - 2) break;
9264
9265 s_escaped[out] = c;
9266 }
9267
9268 strncpy (s, s_escaped, s_max - 1);
9269 }
9270
9271 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
9272 {
9273 FILE *fp = fopen (kernel_file, "rb");
9274
9275 if (fp != NULL)
9276 {
9277 struct stat st;
9278
9279 memset (&st, 0, sizeof (st));
9280
9281 stat (kernel_file, &st);
9282
9283 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
9284
9285 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
9286
9287 if (num_read != (size_t) st.st_size)
9288 {
9289 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9290
9291 exit (-1);
9292 }
9293
9294 fclose (fp);
9295
9296 buf[st.st_size] = 0;
9297
9298 for (int i = 0; i < num_devices; i++)
9299 {
9300 kernel_lengths[i] = (size_t) st.st_size;
9301
9302 kernel_sources[i] = buf;
9303 }
9304 }
9305 else
9306 {
9307 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9308
9309 exit (-1);
9310 }
9311
9312 return;
9313 }
9314
9315 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
9316 {
9317 if (binary_size > 0)
9318 {
9319 FILE *fp = fopen (dst, "wb");
9320
9321 lock_file (fp);
9322 fwrite (binary, sizeof (u8), binary_size, fp);
9323
9324 fflush (fp);
9325 fclose (fp);
9326 }
9327 }
9328
9329 /**
9330 * restore
9331 */
9332
9333 restore_data_t *init_restore (int argc, char **argv)
9334 {
9335 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
9336
9337 if (data.restore_disable == 0)
9338 {
9339 FILE *fp = fopen (data.eff_restore_file, "rb");
9340
9341 if (fp)
9342 {
9343 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
9344
9345 if (nread != 1)
9346 {
9347 log_error ("ERROR: Cannot read %s", data.eff_restore_file);
9348
9349 exit (-1);
9350 }
9351
9352 fclose (fp);
9353
9354 if (rd->pid)
9355 {
9356 char *pidbin = (char *) mymalloc (HCBUFSIZ);
9357
9358 int pidbin_len = -1;
9359
9360 #ifdef _POSIX
9361 snprintf (pidbin, HCBUFSIZ - 1, "/proc/%d/cmdline", rd->pid);
9362
9363 FILE *fd = fopen (pidbin, "rb");
9364
9365 if (fd)
9366 {
9367 pidbin_len = fread (pidbin, 1, HCBUFSIZ, fd);
9368
9369 pidbin[pidbin_len] = 0;
9370
9371 fclose (fd);
9372
9373 char *argv0_r = strrchr (argv[0], '/');
9374
9375 char *pidbin_r = strrchr (pidbin, '/');
9376
9377 if (argv0_r == NULL) argv0_r = argv[0];
9378
9379 if (pidbin_r == NULL) pidbin_r = pidbin;
9380
9381 if (strcmp (argv0_r, pidbin_r) == 0)
9382 {
9383 log_error ("ERROR: Already an instance %s running on pid %d", pidbin, rd->pid);
9384
9385 exit (-1);
9386 }
9387 }
9388
9389 #elif _WIN
9390 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
9391
9392 char *pidbin2 = (char *) mymalloc (HCBUFSIZ);
9393
9394 int pidbin2_len = -1;
9395
9396 pidbin_len = GetModuleFileName (NULL, pidbin, HCBUFSIZ);
9397 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, HCBUFSIZ);
9398
9399 pidbin[pidbin_len] = 0;
9400 pidbin2[pidbin2_len] = 0;
9401
9402 if (pidbin2_len)
9403 {
9404 if (strcmp (pidbin, pidbin2) == 0)
9405 {
9406 log_error ("ERROR: Already an instance %s running on pid %d", pidbin2, rd->pid);
9407
9408 exit (-1);
9409 }
9410 }
9411
9412 myfree (pidbin2);
9413
9414 #endif
9415
9416 myfree (pidbin);
9417 }
9418
9419 if (rd->version_bin < RESTORE_MIN)
9420 {
9421 log_error ("ERROR: Cannot use outdated %s. Please remove it.", data.eff_restore_file);
9422
9423 exit (-1);
9424 }
9425 }
9426 }
9427
9428 memset (rd, 0, sizeof (restore_data_t));
9429
9430 rd->version_bin = VERSION_BIN;
9431
9432 #ifdef _POSIX
9433 rd->pid = getpid ();
9434 #elif _WIN
9435 rd->pid = GetCurrentProcessId ();
9436 #endif
9437
9438 if (getcwd (rd->cwd, 255) == NULL)
9439 {
9440 myfree (rd);
9441
9442 return (NULL);
9443 }
9444
9445 rd->argc = argc;
9446 rd->argv = argv;
9447
9448 return (rd);
9449 }
9450
9451 void read_restore (const char *eff_restore_file, restore_data_t *rd)
9452 {
9453 FILE *fp = fopen (eff_restore_file, "rb");
9454
9455 if (fp == NULL)
9456 {
9457 log_error ("ERROR: Restore file '%s': %s", eff_restore_file, strerror (errno));
9458
9459 exit (-1);
9460 }
9461
9462 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
9463 {
9464 log_error ("ERROR: Can't read %s", eff_restore_file);
9465
9466 exit (-1);
9467 }
9468
9469 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
9470
9471 char *buf = (char *) mymalloc (HCBUFSIZ);
9472
9473 for (uint i = 0; i < rd->argc; i++)
9474 {
9475 if (fgets (buf, HCBUFSIZ - 1, fp) == NULL)
9476 {
9477 log_error ("ERROR: Can't read %s", eff_restore_file);
9478
9479 exit (-1);
9480 }
9481
9482 size_t len = strlen (buf);
9483
9484 if (len) buf[len - 1] = 0;
9485
9486 rd->argv[i] = mystrdup (buf);
9487 }
9488
9489 myfree (buf);
9490
9491 fclose (fp);
9492
9493 log_info ("INFO: Changing current working directory to the path found within the .restore file: '%s'", rd->cwd);
9494
9495 if (chdir (rd->cwd))
9496 {
9497 log_error ("ERROR: The directory '%s' does not exist. It is needed to restore (--restore) the session.\n"
9498 " You could either create this directory (or link it) or update the .restore file using e.g. the analyze_hc_restore.pl tool:\n"
9499 " https://github.com/philsmd/analyze_hc_restore\n"
9500 " The directory must be relative to (or contain) all files/folders mentioned within the command line.", rd->cwd);
9501
9502 exit (-1);
9503 }
9504 }
9505
9506 u64 get_lowest_words_done ()
9507 {
9508 u64 words_cur = -1;
9509
9510 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
9511 {
9512 hc_device_param_t *device_param = &data.devices_param[device_id];
9513
9514 if (device_param->skipped) continue;
9515
9516 const u64 words_done = device_param->words_done;
9517
9518 if (words_done < words_cur) words_cur = words_done;
9519 }
9520
9521 // It's possible that a device's workload isn't finished right after a restore-case.
9522 // In that case, this function would return 0 and overwrite the real restore point
9523 // There's also data.words_cur which is set to rd->words_cur but it changes while
9524 // the attack is running therefore we should stick to rd->words_cur.
9525 // Note that -s influences rd->words_cur we should keep a close look on that.
9526
9527 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
9528
9529 return words_cur;
9530 }
9531
9532 void write_restore (const char *new_restore_file, restore_data_t *rd)
9533 {
9534 u64 words_cur = get_lowest_words_done ();
9535
9536 rd->words_cur = words_cur;
9537
9538 FILE *fp = fopen (new_restore_file, "wb");
9539
9540 if (fp == NULL)
9541 {
9542 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
9543
9544 exit (-1);
9545 }
9546
9547 if (setvbuf (fp, NULL, _IONBF, 0))
9548 {
9549 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
9550
9551 exit (-1);
9552 }
9553
9554 fwrite (rd, sizeof (restore_data_t), 1, fp);
9555
9556 for (uint i = 0; i < rd->argc; i++)
9557 {
9558 fprintf (fp, "%s", rd->argv[i]);
9559 fputc ('\n', fp);
9560 }
9561
9562 fflush (fp);
9563
9564 fsync (fileno (fp));
9565
9566 fclose (fp);
9567 }
9568
9569 void cycle_restore ()
9570 {
9571 const char *eff_restore_file = data.eff_restore_file;
9572 const char *new_restore_file = data.new_restore_file;
9573
9574 restore_data_t *rd = data.rd;
9575
9576 write_restore (new_restore_file, rd);
9577
9578 struct stat st;
9579
9580 memset (&st, 0, sizeof(st));
9581
9582 if (stat (eff_restore_file, &st) == 0)
9583 {
9584 if (unlink (eff_restore_file))
9585 {
9586 log_info ("WARN: Unlink file '%s': %s", eff_restore_file, strerror (errno));
9587 }
9588 }
9589
9590 if (rename (new_restore_file, eff_restore_file))
9591 {
9592 log_info ("WARN: Rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
9593 }
9594 }
9595
9596 void check_checkpoint ()
9597 {
9598 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9599
9600 u64 words_cur = get_lowest_words_done ();
9601
9602 if (words_cur != data.checkpoint_cur_words)
9603 {
9604 myabort ();
9605 }
9606 }
9607
9608 /**
9609 * tuning db
9610 */
9611
9612 void tuning_db_destroy (tuning_db_t *tuning_db)
9613 {
9614 int i;
9615
9616 for (i = 0; i < tuning_db->alias_cnt; i++)
9617 {
9618 tuning_db_alias_t *alias = &tuning_db->alias_buf[i];
9619
9620 myfree (alias->device_name);
9621 myfree (alias->alias_name);
9622 }
9623
9624 for (i = 0; i < tuning_db->entry_cnt; i++)
9625 {
9626 tuning_db_entry_t *entry = &tuning_db->entry_buf[i];
9627
9628 myfree (entry->device_name);
9629 }
9630
9631 myfree (tuning_db->alias_buf);
9632 myfree (tuning_db->entry_buf);
9633
9634 myfree (tuning_db);
9635 }
9636
9637 tuning_db_t *tuning_db_alloc (FILE *fp)
9638 {
9639 tuning_db_t *tuning_db = (tuning_db_t *) mymalloc (sizeof (tuning_db_t));
9640
9641 int num_lines = count_lines (fp);
9642
9643 // a bit over-allocated
9644
9645 tuning_db->alias_buf = (tuning_db_alias_t *) mycalloc (num_lines + 1, sizeof (tuning_db_alias_t));
9646 tuning_db->alias_cnt = 0;
9647
9648 tuning_db->entry_buf = (tuning_db_entry_t *) mycalloc (num_lines + 1, sizeof (tuning_db_entry_t));
9649 tuning_db->entry_cnt = 0;
9650
9651 return tuning_db;
9652 }
9653
9654 tuning_db_t *tuning_db_init (const char *tuning_db_file)
9655 {
9656 FILE *fp = fopen (tuning_db_file, "rb");
9657
9658 if (fp == NULL)
9659 {
9660 log_error ("%s: %s", tuning_db_file, strerror (errno));
9661
9662 exit (-1);
9663 }
9664
9665 tuning_db_t *tuning_db = tuning_db_alloc (fp);
9666
9667 rewind (fp);
9668
9669 int line_num = 0;
9670
9671 char *buf = (char *) mymalloc (HCBUFSIZ);
9672
9673 while (!feof (fp))
9674 {
9675 char *line_buf = fgets (buf, HCBUFSIZ - 1, fp);
9676
9677 if (line_buf == NULL) break;
9678
9679 line_num++;
9680
9681 const int line_len = in_superchop (line_buf);
9682
9683 if (line_len == 0) continue;
9684
9685 if (line_buf[0] == '#') continue;
9686
9687 // start processing
9688
9689 char *token_ptr[7] = { NULL };
9690
9691 int token_cnt = 0;
9692
9693 char *next = strtok (line_buf, "\t ");
9694
9695 token_ptr[token_cnt] = next;
9696
9697 token_cnt++;
9698
9699 while ((next = strtok (NULL, "\t ")) != NULL)
9700 {
9701 token_ptr[token_cnt] = next;
9702
9703 token_cnt++;
9704 }
9705
9706 if (token_cnt == 2)
9707 {
9708 char *device_name = token_ptr[0];
9709 char *alias_name = token_ptr[1];
9710
9711 tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt];
9712
9713 alias->device_name = mystrdup (device_name);
9714 alias->alias_name = mystrdup (alias_name);
9715
9716 tuning_db->alias_cnt++;
9717 }
9718 else if (token_cnt == 6)
9719 {
9720 if ((token_ptr[1][0] != '0') &&
9721 (token_ptr[1][0] != '1') &&
9722 (token_ptr[1][0] != '3') &&
9723 (token_ptr[1][0] != '*'))
9724 {
9725 log_info ("WARNING: Tuning-db: Invalid attack_mode '%c' in Line '%u'", token_ptr[1][0], line_num);
9726
9727 continue;
9728 }
9729
9730 if ((token_ptr[3][0] != '1') &&
9731 (token_ptr[3][0] != '2') &&
9732 (token_ptr[3][0] != '4') &&
9733 (token_ptr[3][0] != '8') &&
9734 (token_ptr[3][0] != 'N'))
9735 {
9736 log_info ("WARNING: Tuning-db: Invalid vector_width '%c' in Line '%u'", token_ptr[3][0], line_num);
9737
9738 continue;
9739 }
9740
9741 char *device_name = token_ptr[0];
9742
9743 int attack_mode = -1;
9744 int hash_type = -1;
9745 int vector_width = -1;
9746 int kernel_accel = -1;
9747 int kernel_loops = -1;
9748
9749 if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]);
9750 if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]);
9751 if (token_ptr[3][0] != 'N') vector_width = atoi (token_ptr[3]);
9752
9753 if (token_ptr[4][0] != 'A')
9754 {
9755 kernel_accel = atoi (token_ptr[4]);
9756
9757 if ((kernel_accel < 1) || (kernel_accel > 1024))
9758 {
9759 log_info ("WARNING: Tuning-db: Invalid kernel_accel '%d' in Line '%u'", kernel_accel, line_num);
9760
9761 continue;
9762 }
9763 }
9764 else
9765 {
9766 kernel_accel = 0;
9767 }
9768
9769 if (token_ptr[5][0] != 'A')
9770 {
9771 kernel_loops = atoi (token_ptr[5]);
9772
9773 if ((kernel_loops < 1) || (kernel_loops > 1024))
9774 {
9775 log_info ("WARNING: Tuning-db: Invalid kernel_loops '%d' in Line '%u'", kernel_loops, line_num);
9776
9777 continue;
9778 }
9779 }
9780 else
9781 {
9782 kernel_loops = 0;
9783 }
9784
9785 tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt];
9786
9787 entry->device_name = mystrdup (device_name);
9788 entry->attack_mode = attack_mode;
9789 entry->hash_type = hash_type;
9790 entry->vector_width = vector_width;
9791 entry->kernel_accel = kernel_accel;
9792 entry->kernel_loops = kernel_loops;
9793
9794 tuning_db->entry_cnt++;
9795 }
9796 else
9797 {
9798 log_info ("WARNING: Tuning-db: Invalid number of token in Line '%u'", line_num);
9799
9800 continue;
9801 }
9802 }
9803
9804 myfree (buf);
9805
9806 fclose (fp);
9807
9808 // todo: print loaded 'cnt' message
9809
9810 // sort the database
9811
9812 qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9813 qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9814
9815 return tuning_db;
9816 }
9817
9818 tuning_db_entry_t *tuning_db_search (tuning_db_t *tuning_db, hc_device_param_t *device_param, int attack_mode, int hash_type)
9819 {
9820 static tuning_db_entry_t s;
9821
9822 // first we need to convert all spaces in the device_name to underscore
9823
9824 char *device_name_nospace = strdup (device_param->device_name);
9825
9826 int device_name_length = strlen (device_name_nospace);
9827
9828 int i;
9829
9830 for (i = 0; i < device_name_length; i++)
9831 {
9832 if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_';
9833 }
9834
9835 // find out if there's an alias configured
9836
9837 tuning_db_alias_t a;
9838
9839 a.device_name = device_name_nospace;
9840
9841 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);
9842
9843 char *alias_name = (alias == NULL) ? NULL : alias->alias_name;
9844
9845 // attack-mode 6 and 7 are attack-mode 1 basically
9846
9847 if (attack_mode == 6) attack_mode = 1;
9848 if (attack_mode == 7) attack_mode = 1;
9849
9850 // bsearch is not ideal but fast enough
9851
9852 s.device_name = device_name_nospace;
9853 s.attack_mode = attack_mode;
9854 s.hash_type = hash_type;
9855
9856 tuning_db_entry_t *entry = NULL;
9857
9858 // this will produce all 2^3 combinations required
9859
9860 for (i = 0; i < 8; i++)
9861 {
9862 s.device_name = (i & 1) ? "*" : device_name_nospace;
9863 s.attack_mode = (i & 2) ? -1 : attack_mode;
9864 s.hash_type = (i & 4) ? -1 : hash_type;
9865
9866 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9867
9868 if (entry != NULL) break;
9869
9870 // in non-wildcard mode do some additional checks:
9871
9872 if ((i & 1) == 0)
9873 {
9874 // in case we have an alias-name
9875
9876 if (alias_name != NULL)
9877 {
9878 s.device_name = alias_name;
9879
9880 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9881
9882 if (entry != NULL) break;
9883 }
9884
9885 // or by device type
9886
9887 if (device_param->device_type & CL_DEVICE_TYPE_CPU)
9888 {
9889 s.device_name = "DEVICE_TYPE_CPU";
9890 }
9891 else if (device_param->device_type & CL_DEVICE_TYPE_GPU)
9892 {
9893 s.device_name = "DEVICE_TYPE_GPU";
9894 }
9895 else if (device_param->device_type & CL_DEVICE_TYPE_ACCELERATOR)
9896 {
9897 s.device_name = "DEVICE_TYPE_ACCELERATOR";
9898 }
9899
9900 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9901
9902 if (entry != NULL) break;
9903 }
9904 }
9905
9906 // free converted device_name
9907
9908 myfree (device_name_nospace);
9909
9910 return entry;
9911 }
9912
9913 /**
9914 * parser
9915 */
9916
9917 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9918 {
9919 u8 tmp[256] = { 0 };
9920
9921 if (salt_len > sizeof (tmp))
9922 {
9923 return UINT_MAX;
9924 }
9925
9926 memcpy (tmp, in, salt_len);
9927
9928 if (data.opts_type & OPTS_TYPE_ST_HEX)
9929 {
9930 if ((salt_len % 2) == 0)
9931 {
9932 u32 new_salt_len = salt_len / 2;
9933
9934 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9935 {
9936 u8 p0 = tmp[j + 0];
9937 u8 p1 = tmp[j + 1];
9938
9939 tmp[i] = hex_convert (p1) << 0;
9940 tmp[i] |= hex_convert (p0) << 4;
9941 }
9942
9943 salt_len = new_salt_len;
9944 }
9945 else
9946 {
9947 return UINT_MAX;
9948 }
9949 }
9950 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9951 {
9952 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9953 }
9954
9955 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9956
9957 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9958 {
9959 if (salt_len < 20)
9960 {
9961 u32 *tmp_uint = (u32 *) tmp;
9962
9963 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9964 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9965 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9966 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9967 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9968 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9969 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9970 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9971 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9972 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9973
9974 salt_len = salt_len * 2;
9975 }
9976 else
9977 {
9978 return UINT_MAX;
9979 }
9980 }
9981
9982 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9983 {
9984 lowercase (tmp, salt_len);
9985 }
9986
9987 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9988 {
9989 uppercase (tmp, salt_len);
9990 }
9991
9992 u32 len = salt_len;
9993
9994 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9995 {
9996 tmp[len++] = 0x80;
9997 }
9998
9999 if (data.opts_type & OPTS_TYPE_ST_ADD01)
10000 {
10001 tmp[len++] = 0x01;
10002 }
10003
10004 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
10005 {
10006 u32 *tmp_uint = (uint *) tmp;
10007
10008 u32 max = len / 4;
10009
10010 if (len % 4) max++;
10011
10012 for (u32 i = 0; i < max; i++)
10013 {
10014 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
10015 }
10016
10017 // Important: we may need to increase the length of memcpy since
10018 // we don't want to "loose" some swapped bytes (could happen if
10019 // they do not perfectly fit in the 4-byte blocks)
10020 // Memcpy does always copy the bytes in the BE order, but since
10021 // we swapped them, some important bytes could be in positions
10022 // we normally skip with the original len
10023
10024 if (len % 4) len += 4 - (len % 4);
10025 }
10026
10027 memcpy (out, tmp, len);
10028
10029 return (salt_len);
10030 }
10031
10032 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10033 {
10034 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
10035
10036 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
10037
10038 u32 *digest = (u32 *) hash_buf->digest;
10039
10040 salt_t *salt = hash_buf->salt;
10041
10042 memcpy ((char *) salt->salt_sign, input_buf, 6);
10043
10044 char *iter_pos = input_buf + 4;
10045
10046 salt->salt_iter = 1 << atoi (iter_pos);
10047
10048 char *salt_pos = strchr (iter_pos, '$');
10049
10050 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10051
10052 salt_pos++;
10053
10054 uint salt_len = 16;
10055
10056 salt->salt_len = salt_len;
10057
10058 u8 tmp_buf[100] = { 0 };
10059
10060 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
10061
10062 char *salt_buf_ptr = (char *) salt->salt_buf;
10063
10064 memcpy (salt_buf_ptr, tmp_buf, 16);
10065
10066 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
10067 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
10068 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
10069 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
10070
10071 char *hash_pos = salt_pos + 22;
10072
10073 memset (tmp_buf, 0, sizeof (tmp_buf));
10074
10075 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
10076
10077 memcpy (digest, tmp_buf, 24);
10078
10079 digest[0] = byte_swap_32 (digest[0]);
10080 digest[1] = byte_swap_32 (digest[1]);
10081 digest[2] = byte_swap_32 (digest[2]);
10082 digest[3] = byte_swap_32 (digest[3]);
10083 digest[4] = byte_swap_32 (digest[4]);
10084 digest[5] = byte_swap_32 (digest[5]);
10085
10086 digest[5] &= ~0xff; // its just 23 not 24 !
10087
10088 return (PARSER_OK);
10089 }
10090
10091 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10092 {
10093 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
10094
10095 u32 *digest = (u32 *) hash_buf->digest;
10096
10097 u8 tmp_buf[100] = { 0 };
10098
10099 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
10100
10101 memcpy (digest, tmp_buf, 32);
10102
10103 digest[0] = byte_swap_32 (digest[0]);
10104 digest[1] = byte_swap_32 (digest[1]);
10105 digest[2] = byte_swap_32 (digest[2]);
10106 digest[3] = byte_swap_32 (digest[3]);
10107 digest[4] = byte_swap_32 (digest[4]);
10108 digest[5] = byte_swap_32 (digest[5]);
10109 digest[6] = byte_swap_32 (digest[6]);
10110 digest[7] = byte_swap_32 (digest[7]);
10111
10112 digest[0] -= SHA256M_A;
10113 digest[1] -= SHA256M_B;
10114 digest[2] -= SHA256M_C;
10115 digest[3] -= SHA256M_D;
10116 digest[4] -= SHA256M_E;
10117 digest[5] -= SHA256M_F;
10118 digest[6] -= SHA256M_G;
10119 digest[7] -= SHA256M_H;
10120
10121 return (PARSER_OK);
10122 }
10123
10124 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10125 {
10126 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
10127
10128 u32 *digest = (u32 *) hash_buf->digest;
10129
10130 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10131 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10132
10133 digest[0] = byte_swap_32 (digest[0]);
10134 digest[1] = byte_swap_32 (digest[1]);
10135
10136 uint tt;
10137
10138 IP (digest[0], digest[1], tt);
10139
10140 digest[0] = digest[0];
10141 digest[1] = digest[1];
10142 digest[2] = 0;
10143 digest[3] = 0;
10144
10145 return (PARSER_OK);
10146 }
10147
10148 int arubaos_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10149 {
10150 if ((input_len < DISPLAY_LEN_MIN_125) || (input_len > DISPLAY_LEN_MAX_125)) return (PARSER_GLOBAL_LENGTH);
10151
10152 if ((input_buf[8] != '0') || (input_buf[9] != '1')) return (PARSER_SIGNATURE_UNMATCHED);
10153
10154 u32 *digest = (u32 *) hash_buf->digest;
10155
10156 salt_t *salt = hash_buf->salt;
10157
10158 char *hash_pos = input_buf + 10;
10159
10160 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10161 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10162 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10163 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10164 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10165
10166 digest[0] -= SHA1M_A;
10167 digest[1] -= SHA1M_B;
10168 digest[2] -= SHA1M_C;
10169 digest[3] -= SHA1M_D;
10170 digest[4] -= SHA1M_E;
10171
10172 uint salt_len = 10;
10173
10174 char *salt_buf_ptr = (char *) salt->salt_buf;
10175
10176 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10177
10178 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10179
10180 salt->salt_len = salt_len;
10181
10182 return (PARSER_OK);
10183 }
10184
10185 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10186 {
10187 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
10188
10189 u32 *digest = (u32 *) hash_buf->digest;
10190
10191 salt_t *salt = hash_buf->salt;
10192
10193 char *hash_pos = input_buf + 8;
10194
10195 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10196 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10197 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10198 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10199 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10200
10201 digest[0] -= SHA1M_A;
10202 digest[1] -= SHA1M_B;
10203 digest[2] -= SHA1M_C;
10204 digest[3] -= SHA1M_D;
10205 digest[4] -= SHA1M_E;
10206
10207 uint salt_len = 8;
10208
10209 char *salt_buf_ptr = (char *) salt->salt_buf;
10210
10211 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10212
10213 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10214
10215 salt->salt_len = salt_len;
10216
10217 return (PARSER_OK);
10218 }
10219
10220 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10221 {
10222 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
10223
10224 u64 *digest = (u64 *) hash_buf->digest;
10225
10226 salt_t *salt = hash_buf->salt;
10227
10228 char *hash_pos = input_buf + 8;
10229
10230 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
10231 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
10232 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
10233 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
10234 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
10235 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
10236 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
10237 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
10238
10239 digest[0] -= SHA512M_A;
10240 digest[1] -= SHA512M_B;
10241 digest[2] -= SHA512M_C;
10242 digest[3] -= SHA512M_D;
10243 digest[4] -= SHA512M_E;
10244 digest[5] -= SHA512M_F;
10245 digest[6] -= SHA512M_G;
10246 digest[7] -= SHA512M_H;
10247
10248 uint salt_len = 8;
10249
10250 char *salt_buf_ptr = (char *) salt->salt_buf;
10251
10252 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10253
10254 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10255
10256 salt->salt_len = salt_len;
10257
10258 return (PARSER_OK);
10259 }
10260
10261 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10262 {
10263 if (data.opts_type & OPTS_TYPE_ST_HEX)
10264 {
10265 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
10266 }
10267 else
10268 {
10269 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
10270 }
10271
10272 u32 *digest = (u32 *) hash_buf->digest;
10273
10274 salt_t *salt = hash_buf->salt;
10275
10276 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10277 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10278 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10279 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10280
10281 digest[0] = byte_swap_32 (digest[0]);
10282 digest[1] = byte_swap_32 (digest[1]);
10283 digest[2] = byte_swap_32 (digest[2]);
10284 digest[3] = byte_swap_32 (digest[3]);
10285
10286 digest[0] -= MD5M_A;
10287 digest[1] -= MD5M_B;
10288 digest[2] -= MD5M_C;
10289 digest[3] -= MD5M_D;
10290
10291 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10292
10293 uint salt_len = input_len - 32 - 1;
10294
10295 char *salt_buf = input_buf + 32 + 1;
10296
10297 char *salt_buf_ptr = (char *) salt->salt_buf;
10298
10299 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10300
10301 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10302
10303 salt->salt_len = salt_len;
10304
10305 return (PARSER_OK);
10306 }
10307
10308 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10309 {
10310 if (data.opts_type & OPTS_TYPE_ST_HEX)
10311 {
10312 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
10313 }
10314 else
10315 {
10316 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
10317 }
10318
10319 // unscramble
10320
10321 char clean_input_buf[32] = { 0 };
10322
10323 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
10324 int pos[6] = { 0, 6, 12, 17, 23, 29 };
10325
10326 for (int i = 0, j = 0, k = 0; i < 30; i++)
10327 {
10328 if (i == pos[j])
10329 {
10330 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
10331
10332 j++;
10333 }
10334 else
10335 {
10336 clean_input_buf[k] = input_buf[i];
10337
10338 k++;
10339 }
10340 }
10341
10342 // base64 decode
10343
10344 u32 *digest = (u32 *) hash_buf->digest;
10345
10346 salt_t *salt = hash_buf->salt;
10347
10348 u32 a, b, c, d, e, f;
10349
10350 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
10351 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
10352 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
10353 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
10354 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
10355 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
10356
10357 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
10358 | (((d << 12) | (e << 6) | (f)) << 0);
10359
10360 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
10361 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
10362 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
10363 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
10364 e = base64_to_int (clean_input_buf[10] & 0x7f);
10365 f = base64_to_int (clean_input_buf[11] & 0x7f);
10366
10367 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
10368 | (((d << 12) | (e << 6) | (f)) << 0);
10369
10370 a = base64_to_int (clean_input_buf[12] & 0x7f);
10371 b = base64_to_int (clean_input_buf[13] & 0x7f);
10372 c = base64_to_int (clean_input_buf[14] & 0x7f);
10373 d = base64_to_int (clean_input_buf[15] & 0x7f);
10374 e = base64_to_int (clean_input_buf[16] & 0x7f);
10375 f = base64_to_int (clean_input_buf[17] & 0x7f);
10376
10377 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
10378 | (((d << 12) | (e << 6) | (f)) << 0);
10379
10380 a = base64_to_int (clean_input_buf[18] & 0x7f);
10381 b = base64_to_int (clean_input_buf[19] & 0x7f);
10382 c = base64_to_int (clean_input_buf[20] & 0x7f);
10383 d = base64_to_int (clean_input_buf[21] & 0x7f);
10384 e = base64_to_int (clean_input_buf[22] & 0x7f);
10385 f = base64_to_int (clean_input_buf[23] & 0x7f);
10386
10387 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
10388 | (((d << 12) | (e << 6) | (f)) << 0);
10389
10390 digest[0] = byte_swap_32 (digest[0]);
10391 digest[1] = byte_swap_32 (digest[1]);
10392 digest[2] = byte_swap_32 (digest[2]);
10393 digest[3] = byte_swap_32 (digest[3]);
10394
10395 digest[0] -= MD5M_A;
10396 digest[1] -= MD5M_B;
10397 digest[2] -= MD5M_C;
10398 digest[3] -= MD5M_D;
10399
10400 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
10401
10402 uint salt_len = input_len - 30 - 1;
10403
10404 char *salt_buf = input_buf + 30 + 1;
10405
10406 char *salt_buf_ptr = (char *) salt->salt_buf;
10407
10408 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10409
10410 // max. salt length: 55 (max for MD5) - 22 (":Administration Tools:") - 1 (0x80) = 32
10411 // 32 - 4 bytes (to fit w0lr for all attack modes) = 28
10412
10413 if (salt_len > 28) return (PARSER_SALT_LENGTH);
10414
10415 salt->salt_len = salt_len;
10416
10417 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
10418
10419 salt->salt_len += 22;
10420
10421 return (PARSER_OK);
10422 }
10423
10424 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10425 {
10426 if (data.opts_type & OPTS_TYPE_ST_HEX)
10427 {
10428 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
10429 }
10430 else
10431 {
10432 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
10433 }
10434
10435 u32 *digest = (u32 *) hash_buf->digest;
10436
10437 salt_t *salt = hash_buf->salt;
10438
10439 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10440 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10441 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10442 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10443 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
10444
10445 digest[0] -= SHA1M_A;
10446 digest[1] -= SHA1M_B;
10447 digest[2] -= SHA1M_C;
10448 digest[3] -= SHA1M_D;
10449 digest[4] -= SHA1M_E;
10450
10451 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10452
10453 uint salt_len = input_len - 40 - 1;
10454
10455 char *salt_buf = input_buf + 40 + 1;
10456
10457 char *salt_buf_ptr = (char *) salt->salt_buf;
10458
10459 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10460
10461 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10462
10463 salt->salt_len = salt_len;
10464
10465 return (PARSER_OK);
10466 }
10467
10468 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10469 {
10470 if (data.opts_type & OPTS_TYPE_ST_HEX)
10471 {
10472 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
10473 }
10474 else
10475 {
10476 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
10477 }
10478
10479 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10480
10481 char *iter_pos = input_buf + 6;
10482
10483 salt_t *salt = hash_buf->salt;
10484
10485 uint iter = atoi (iter_pos);
10486
10487 if (iter < 1)
10488 {
10489 iter = ROUNDS_DCC2;
10490 }
10491
10492 salt->salt_iter = iter - 1;
10493
10494 char *salt_pos = strchr (iter_pos, '#');
10495
10496 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10497
10498 salt_pos++;
10499
10500 char *digest_pos = strchr (salt_pos, '#');
10501
10502 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10503
10504 digest_pos++;
10505
10506 uint salt_len = digest_pos - salt_pos - 1;
10507
10508 u32 *digest = (u32 *) hash_buf->digest;
10509
10510 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
10511 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
10512 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
10513 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
10514
10515 char *salt_buf_ptr = (char *) salt->salt_buf;
10516
10517 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10518
10519 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10520
10521 salt->salt_len = salt_len;
10522
10523 return (PARSER_OK);
10524 }
10525
10526 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10527 {
10528 u32 *digest = (u32 *) hash_buf->digest;
10529
10530 salt_t *salt = hash_buf->salt;
10531
10532 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
10533
10534 hccap_t in;
10535
10536 memcpy (&in, input_buf, input_len);
10537
10538 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
10539
10540 memcpy (digest, in.keymic, 16);
10541
10542 /*
10543 http://www.one-net.eu/jsw/j_sec/m_ptype.html
10544 The phrase "Pairwise key expansion"
10545 Access Point Address (referred to as Authenticator Address AA)
10546 Supplicant Address (referred to as Supplicant Address SA)
10547 Access Point Nonce (referred to as Authenticator Anonce)
10548 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
10549 */
10550
10551 uint salt_len = strlen (in.essid);
10552
10553 if (salt_len > 36)
10554 {
10555 log_info ("WARNING: The ESSID length is too long, the hccap file may be invalid or corrupted");
10556
10557 return (PARSER_SALT_LENGTH);
10558 }
10559
10560 memcpy (salt->salt_buf, in.essid, salt_len);
10561
10562 salt->salt_len = salt_len;
10563
10564 salt->salt_iter = ROUNDS_WPA2 - 1;
10565
10566 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
10567
10568 memcpy (pke_ptr, "Pairwise key expansion", 23);
10569
10570 if (memcmp (in.mac1, in.mac2, 6) < 0)
10571 {
10572 memcpy (pke_ptr + 23, in.mac1, 6);
10573 memcpy (pke_ptr + 29, in.mac2, 6);
10574 }
10575 else
10576 {
10577 memcpy (pke_ptr + 23, in.mac2, 6);
10578 memcpy (pke_ptr + 29, in.mac1, 6);
10579 }
10580
10581 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10582 {
10583 memcpy (pke_ptr + 35, in.nonce1, 32);
10584 memcpy (pke_ptr + 67, in.nonce2, 32);
10585 }
10586 else
10587 {
10588 memcpy (pke_ptr + 35, in.nonce2, 32);
10589 memcpy (pke_ptr + 67, in.nonce1, 32);
10590 }
10591
10592 for (int i = 0; i < 25; i++)
10593 {
10594 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10595 }
10596
10597 memcpy (wpa->orig_mac1, in.mac1, 6);
10598 memcpy (wpa->orig_mac2, in.mac2, 6);
10599 memcpy (wpa->orig_nonce1, in.nonce1, 32);
10600 memcpy (wpa->orig_nonce2, in.nonce2, 32);
10601
10602 wpa->keyver = in.keyver;
10603
10604 if (wpa->keyver > 255)
10605 {
10606 log_info ("ATTENTION!");
10607 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10608 log_info (" This could be due to a recent aircrack-ng bug.");
10609 log_info (" The key version was automatically reset to a reasonable value.");
10610 log_info ("");
10611
10612 wpa->keyver &= 0xff;
10613 }
10614
10615 wpa->eapol_size = in.eapol_size;
10616
10617 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10618
10619 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10620
10621 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10622
10623 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10624
10625 if (wpa->keyver == 1)
10626 {
10627 // nothing to do
10628 }
10629 else
10630 {
10631 digest[0] = byte_swap_32 (digest[0]);
10632 digest[1] = byte_swap_32 (digest[1]);
10633 digest[2] = byte_swap_32 (digest[2]);
10634 digest[3] = byte_swap_32 (digest[3]);
10635
10636 for (int i = 0; i < 64; i++)
10637 {
10638 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10639 }
10640 }
10641
10642 uint32_t *p0 = (uint32_t *) in.essid;
10643 uint32_t c0 = 0;
10644 uint32_t c1 = 0;
10645
10646 for (uint i = 0; i < sizeof (in.essid) / sizeof (uint32_t); i++) c0 ^= *p0++;
10647 for (uint i = 0; i < sizeof (wpa->pke) / sizeof (wpa->pke[0]); i++) c1 ^= wpa->pke[i];
10648
10649 salt->salt_buf[10] = c0;
10650 salt->salt_buf[11] = c1;
10651
10652 return (PARSER_OK);
10653 }
10654
10655 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10656 {
10657 u32 *digest = (u32 *) hash_buf->digest;
10658
10659 salt_t *salt = hash_buf->salt;
10660
10661 if (input_len == 0)
10662 {
10663 log_error ("Password Safe v2 container not specified");
10664
10665 exit (-1);
10666 }
10667
10668 FILE *fp = fopen (input_buf, "rb");
10669
10670 if (fp == NULL)
10671 {
10672 log_error ("%s: %s", input_buf, strerror (errno));
10673
10674 exit (-1);
10675 }
10676
10677 psafe2_hdr buf;
10678
10679 memset (&buf, 0, sizeof (psafe2_hdr));
10680
10681 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10682
10683 fclose (fp);
10684
10685 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10686
10687 salt->salt_buf[0] = buf.random[0];
10688 salt->salt_buf[1] = buf.random[1];
10689
10690 salt->salt_len = 8;
10691 salt->salt_iter = 1000;
10692
10693 digest[0] = byte_swap_32 (buf.hash[0]);
10694 digest[1] = byte_swap_32 (buf.hash[1]);
10695 digest[2] = byte_swap_32 (buf.hash[2]);
10696 digest[3] = byte_swap_32 (buf.hash[3]);
10697 digest[4] = byte_swap_32 (buf.hash[4]);
10698
10699 return (PARSER_OK);
10700 }
10701
10702 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10703 {
10704 u32 *digest = (u32 *) hash_buf->digest;
10705
10706 salt_t *salt = hash_buf->salt;
10707
10708 if (input_len == 0)
10709 {
10710 log_error (".psafe3 not specified");
10711
10712 exit (-1);
10713 }
10714
10715 FILE *fp = fopen (input_buf, "rb");
10716
10717 if (fp == NULL)
10718 {
10719 log_error ("%s: %s", input_buf, strerror (errno));
10720
10721 exit (-1);
10722 }
10723
10724 psafe3_t in;
10725
10726 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10727
10728 fclose (fp);
10729
10730 data.hashfile = input_buf; // we will need this in case it gets cracked
10731
10732 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10733
10734 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10735
10736 salt->salt_iter = in.iterations + 1;
10737
10738 salt->salt_buf[0] = in.salt_buf[0];
10739 salt->salt_buf[1] = in.salt_buf[1];
10740 salt->salt_buf[2] = in.salt_buf[2];
10741 salt->salt_buf[3] = in.salt_buf[3];
10742 salt->salt_buf[4] = in.salt_buf[4];
10743 salt->salt_buf[5] = in.salt_buf[5];
10744 salt->salt_buf[6] = in.salt_buf[6];
10745 salt->salt_buf[7] = in.salt_buf[7];
10746
10747 salt->salt_len = 32;
10748
10749 digest[0] = in.hash_buf[0];
10750 digest[1] = in.hash_buf[1];
10751 digest[2] = in.hash_buf[2];
10752 digest[3] = in.hash_buf[3];
10753 digest[4] = in.hash_buf[4];
10754 digest[5] = in.hash_buf[5];
10755 digest[6] = in.hash_buf[6];
10756 digest[7] = in.hash_buf[7];
10757
10758 digest[0] = byte_swap_32 (digest[0]);
10759 digest[1] = byte_swap_32 (digest[1]);
10760 digest[2] = byte_swap_32 (digest[2]);
10761 digest[3] = byte_swap_32 (digest[3]);
10762 digest[4] = byte_swap_32 (digest[4]);
10763 digest[5] = byte_swap_32 (digest[5]);
10764 digest[6] = byte_swap_32 (digest[6]);
10765 digest[7] = byte_swap_32 (digest[7]);
10766
10767 return (PARSER_OK);
10768 }
10769
10770 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10771 {
10772 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10773
10774 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10775
10776 u32 *digest = (u32 *) hash_buf->digest;
10777
10778 salt_t *salt = hash_buf->salt;
10779
10780 char *iter_pos = input_buf + 3;
10781
10782 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10783
10784 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10785
10786 memcpy ((char *) salt->salt_sign, input_buf, 4);
10787
10788 salt->salt_iter = salt_iter;
10789
10790 char *salt_pos = iter_pos + 1;
10791
10792 uint salt_len = 8;
10793
10794 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10795
10796 salt->salt_len = salt_len;
10797
10798 char *hash_pos = salt_pos + salt_len;
10799
10800 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10801
10802 return (PARSER_OK);
10803 }
10804
10805 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10806 {
10807 if (input_len < DISPLAY_LEN_MIN_500) return (PARSER_GLOBAL_LENGTH);
10808
10809 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10810
10811 u32 *digest = (u32 *) hash_buf->digest;
10812
10813 salt_t *salt = hash_buf->salt;
10814
10815 char *salt_pos = input_buf + 3;
10816
10817 uint iterations_len = 0;
10818
10819 if (memcmp (salt_pos, "rounds=", 7) == 0)
10820 {
10821 salt_pos += 7;
10822
10823 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10824
10825 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10826 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10827
10828 salt_pos[0] = 0x0;
10829
10830 salt->salt_iter = atoi (salt_pos - iterations_len);
10831
10832 salt_pos += 1;
10833
10834 iterations_len += 8;
10835 }
10836 else
10837 {
10838 salt->salt_iter = ROUNDS_MD5CRYPT;
10839 }
10840
10841 if (input_len > (DISPLAY_LEN_MAX_500 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10842
10843 char *hash_pos = strchr (salt_pos, '$');
10844
10845 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10846
10847 uint salt_len = hash_pos - salt_pos;
10848
10849 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10850
10851 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10852
10853 salt->salt_len = salt_len;
10854
10855 hash_pos++;
10856
10857 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10858
10859 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10860
10861 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10862
10863 return (PARSER_OK);
10864 }
10865
10866 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10867 {
10868 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10869
10870 u32 *digest = (u32 *) hash_buf->digest;
10871
10872 salt_t *salt = hash_buf->salt;
10873
10874 char *salt_pos = input_buf + 6;
10875
10876 uint iterations_len = 0;
10877
10878 if (memcmp (salt_pos, "rounds=", 7) == 0)
10879 {
10880 salt_pos += 7;
10881
10882 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10883
10884 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10885 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10886
10887 salt_pos[0] = 0x0;
10888
10889 salt->salt_iter = atoi (salt_pos - iterations_len);
10890
10891 salt_pos += 1;
10892
10893 iterations_len += 8;
10894 }
10895 else
10896 {
10897 salt->salt_iter = ROUNDS_MD5CRYPT;
10898 }
10899
10900 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10901
10902 char *hash_pos = strchr (salt_pos, '$');
10903
10904 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10905
10906 uint salt_len = hash_pos - salt_pos;
10907
10908 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10909
10910 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10911
10912 salt->salt_len = salt_len;
10913
10914 hash_pos++;
10915
10916 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10917
10918 return (PARSER_OK);
10919 }
10920
10921 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10922 {
10923 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10924
10925 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10926
10927 u32 *digest = (u32 *) hash_buf->digest;
10928
10929 salt_t *salt = hash_buf->salt;
10930
10931 char *salt_pos = input_buf + 14;
10932
10933 char *hash_pos = strchr (salt_pos, '*');
10934
10935 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10936
10937 hash_pos++;
10938
10939 uint salt_len = hash_pos - salt_pos - 1;
10940
10941 char *salt_buf_ptr = (char *) salt->salt_buf;
10942
10943 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10944
10945 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10946
10947 salt->salt_len = salt_len;
10948
10949 u8 tmp_buf[100] = { 0 };
10950
10951 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10952
10953 memcpy (digest, tmp_buf, 20);
10954
10955 digest[0] = byte_swap_32 (digest[0]);
10956 digest[1] = byte_swap_32 (digest[1]);
10957 digest[2] = byte_swap_32 (digest[2]);
10958 digest[3] = byte_swap_32 (digest[3]);
10959 digest[4] = byte_swap_32 (digest[4]);
10960
10961 digest[0] -= SHA1M_A;
10962 digest[1] -= SHA1M_B;
10963 digest[2] -= SHA1M_C;
10964 digest[3] -= SHA1M_D;
10965 digest[4] -= SHA1M_E;
10966
10967 return (PARSER_OK);
10968 }
10969
10970 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10971 {
10972 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10973
10974 unsigned char c12 = itoa64_to_int (input_buf[12]);
10975
10976 if (c12 & 3) return (PARSER_HASH_VALUE);
10977
10978 u32 *digest = (u32 *) hash_buf->digest;
10979
10980 salt_t *salt = hash_buf->salt;
10981
10982 // for ascii_digest
10983 salt->salt_sign[0] = input_buf[0];
10984 salt->salt_sign[1] = input_buf[1];
10985
10986 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10987 | itoa64_to_int (input_buf[1]) << 6;
10988
10989 salt->salt_len = 2;
10990
10991 u8 tmp_buf[100] = { 0 };
10992
10993 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10994
10995 memcpy (digest, tmp_buf, 8);
10996
10997 uint tt;
10998
10999 IP (digest[0], digest[1], tt);
11000
11001 digest[2] = 0;
11002 digest[3] = 0;
11003
11004 return (PARSER_OK);
11005 }
11006
11007 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11008 {
11009 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
11010
11011 u32 *digest = (u32 *) hash_buf->digest;
11012
11013 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11014 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11015 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11016 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11017
11018 digest[0] = byte_swap_32 (digest[0]);
11019 digest[1] = byte_swap_32 (digest[1]);
11020 digest[2] = byte_swap_32 (digest[2]);
11021 digest[3] = byte_swap_32 (digest[3]);
11022
11023 digest[0] -= MD4M_A;
11024 digest[1] -= MD4M_B;
11025 digest[2] -= MD4M_C;
11026 digest[3] -= MD4M_D;
11027
11028 return (PARSER_OK);
11029 }
11030
11031 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11032 {
11033 if (data.opts_type & OPTS_TYPE_ST_HEX)
11034 {
11035 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
11036 }
11037 else
11038 {
11039 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
11040 }
11041
11042 u32 *digest = (u32 *) hash_buf->digest;
11043
11044 salt_t *salt = hash_buf->salt;
11045
11046 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11047 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11048 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11049 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11050
11051 digest[0] = byte_swap_32 (digest[0]);
11052 digest[1] = byte_swap_32 (digest[1]);
11053 digest[2] = byte_swap_32 (digest[2]);
11054 digest[3] = byte_swap_32 (digest[3]);
11055
11056 digest[0] -= MD4M_A;
11057 digest[1] -= MD4M_B;
11058 digest[2] -= MD4M_C;
11059 digest[3] -= MD4M_D;
11060
11061 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11062
11063 uint salt_len = input_len - 32 - 1;
11064
11065 char *salt_buf = input_buf + 32 + 1;
11066
11067 char *salt_buf_ptr = (char *) salt->salt_buf;
11068
11069 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11070
11071 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11072
11073 salt->salt_len = salt_len;
11074
11075 return (PARSER_OK);
11076 }
11077
11078 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11079 {
11080 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
11081
11082 u32 *digest = (u32 *) hash_buf->digest;
11083
11084 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11085 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11086 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11087 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11088
11089 digest[0] = byte_swap_32 (digest[0]);
11090 digest[1] = byte_swap_32 (digest[1]);
11091 digest[2] = byte_swap_32 (digest[2]);
11092 digest[3] = byte_swap_32 (digest[3]);
11093
11094 digest[0] -= MD5M_A;
11095 digest[1] -= MD5M_B;
11096 digest[2] -= MD5M_C;
11097 digest[3] -= MD5M_D;
11098
11099 return (PARSER_OK);
11100 }
11101
11102 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11103 {
11104 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
11105
11106 u32 *digest = (u32 *) hash_buf->digest;
11107
11108 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
11109 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
11110 digest[2] = 0;
11111 digest[3] = 0;
11112
11113 digest[0] = byte_swap_32 (digest[0]);
11114 digest[1] = byte_swap_32 (digest[1]);
11115
11116 return (PARSER_OK);
11117 }
11118
11119 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11120 {
11121 if (data.opts_type & OPTS_TYPE_ST_HEX)
11122 {
11123 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
11124 }
11125 else
11126 {
11127 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
11128 }
11129
11130 u32 *digest = (u32 *) hash_buf->digest;
11131
11132 salt_t *salt = hash_buf->salt;
11133
11134 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11135 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11136 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11137 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11138
11139 digest[0] = byte_swap_32 (digest[0]);
11140 digest[1] = byte_swap_32 (digest[1]);
11141 digest[2] = byte_swap_32 (digest[2]);
11142 digest[3] = byte_swap_32 (digest[3]);
11143
11144 digest[0] -= MD5M_A;
11145 digest[1] -= MD5M_B;
11146 digest[2] -= MD5M_C;
11147 digest[3] -= MD5M_D;
11148
11149 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11150
11151 uint salt_len = input_len - 32 - 1;
11152
11153 char *salt_buf = input_buf + 32 + 1;
11154
11155 char *salt_buf_ptr = (char *) salt->salt_buf;
11156
11157 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11158
11159 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11160
11161 salt->salt_len = salt_len;
11162
11163 return (PARSER_OK);
11164 }
11165
11166 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11167 {
11168 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
11169
11170 u32 *digest = (u32 *) hash_buf->digest;
11171
11172 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11173 | itoa64_to_int (input_buf[ 1]) << 6
11174 | itoa64_to_int (input_buf[ 2]) << 12
11175 | itoa64_to_int (input_buf[ 3]) << 18;
11176 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11177 | itoa64_to_int (input_buf[ 5]) << 6
11178 | itoa64_to_int (input_buf[ 6]) << 12
11179 | itoa64_to_int (input_buf[ 7]) << 18;
11180 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11181 | itoa64_to_int (input_buf[ 9]) << 6
11182 | itoa64_to_int (input_buf[10]) << 12
11183 | itoa64_to_int (input_buf[11]) << 18;
11184 digest[3] = itoa64_to_int (input_buf[12]) << 0
11185 | itoa64_to_int (input_buf[13]) << 6
11186 | itoa64_to_int (input_buf[14]) << 12
11187 | itoa64_to_int (input_buf[15]) << 18;
11188
11189 digest[0] -= MD5M_A;
11190 digest[1] -= MD5M_B;
11191 digest[2] -= MD5M_C;
11192 digest[3] -= MD5M_D;
11193
11194 digest[0] &= 0x00ffffff;
11195 digest[1] &= 0x00ffffff;
11196 digest[2] &= 0x00ffffff;
11197 digest[3] &= 0x00ffffff;
11198
11199 return (PARSER_OK);
11200 }
11201
11202 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11203 {
11204 if (data.opts_type & OPTS_TYPE_ST_HEX)
11205 {
11206 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
11207 }
11208 else
11209 {
11210 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
11211 }
11212
11213 u32 *digest = (u32 *) hash_buf->digest;
11214
11215 salt_t *salt = hash_buf->salt;
11216
11217 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11218 | itoa64_to_int (input_buf[ 1]) << 6
11219 | itoa64_to_int (input_buf[ 2]) << 12
11220 | itoa64_to_int (input_buf[ 3]) << 18;
11221 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11222 | itoa64_to_int (input_buf[ 5]) << 6
11223 | itoa64_to_int (input_buf[ 6]) << 12
11224 | itoa64_to_int (input_buf[ 7]) << 18;
11225 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11226 | itoa64_to_int (input_buf[ 9]) << 6
11227 | itoa64_to_int (input_buf[10]) << 12
11228 | itoa64_to_int (input_buf[11]) << 18;
11229 digest[3] = itoa64_to_int (input_buf[12]) << 0
11230 | itoa64_to_int (input_buf[13]) << 6
11231 | itoa64_to_int (input_buf[14]) << 12
11232 | itoa64_to_int (input_buf[15]) << 18;
11233
11234 digest[0] -= MD5M_A;
11235 digest[1] -= MD5M_B;
11236 digest[2] -= MD5M_C;
11237 digest[3] -= MD5M_D;
11238
11239 digest[0] &= 0x00ffffff;
11240 digest[1] &= 0x00ffffff;
11241 digest[2] &= 0x00ffffff;
11242 digest[3] &= 0x00ffffff;
11243
11244 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11245
11246 uint salt_len = input_len - 16 - 1;
11247
11248 char *salt_buf = input_buf + 16 + 1;
11249
11250 char *salt_buf_ptr = (char *) salt->salt_buf;
11251
11252 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11253
11254 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11255
11256 salt->salt_len = salt_len;
11257
11258 return (PARSER_OK);
11259 }
11260
11261 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
11262 {
11263 key[0] = (nthash[0] >> 0);
11264 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
11265 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
11266 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
11267 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
11268 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
11269 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
11270 key[7] = (nthash[6] << 1);
11271
11272 key[0] |= 0x01;
11273 key[1] |= 0x01;
11274 key[2] |= 0x01;
11275 key[3] |= 0x01;
11276 key[4] |= 0x01;
11277 key[5] |= 0x01;
11278 key[6] |= 0x01;
11279 key[7] |= 0x01;
11280 }
11281
11282 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11283 {
11284 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
11285
11286 u32 *digest = (u32 *) hash_buf->digest;
11287
11288 salt_t *salt = hash_buf->salt;
11289
11290 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11291
11292 /**
11293 * parse line
11294 */
11295
11296 char *user_pos = input_buf;
11297
11298 char *unused_pos = strchr (user_pos, ':');
11299
11300 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11301
11302 uint user_len = unused_pos - user_pos;
11303
11304 if (user_len > 60) return (PARSER_SALT_LENGTH);
11305
11306 unused_pos++;
11307
11308 char *domain_pos = strchr (unused_pos, ':');
11309
11310 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11311
11312 uint unused_len = domain_pos - unused_pos;
11313
11314 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11315
11316 domain_pos++;
11317
11318 char *srvchall_pos = strchr (domain_pos, ':');
11319
11320 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11321
11322 uint domain_len = srvchall_pos - domain_pos;
11323
11324 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11325
11326 srvchall_pos++;
11327
11328 char *hash_pos = strchr (srvchall_pos, ':');
11329
11330 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11331
11332 uint srvchall_len = hash_pos - srvchall_pos;
11333
11334 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
11335
11336 hash_pos++;
11337
11338 char *clichall_pos = strchr (hash_pos, ':');
11339
11340 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11341
11342 uint hash_len = clichall_pos - hash_pos;
11343
11344 if (hash_len != 48) return (PARSER_HASH_LENGTH);
11345
11346 clichall_pos++;
11347
11348 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11349
11350 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
11351
11352 /**
11353 * store some data for later use
11354 */
11355
11356 netntlm->user_len = user_len * 2;
11357 netntlm->domain_len = domain_len * 2;
11358 netntlm->srvchall_len = srvchall_len / 2;
11359 netntlm->clichall_len = clichall_len / 2;
11360
11361 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11362 char *chall_ptr = (char *) netntlm->chall_buf;
11363
11364 /**
11365 * handle username and domainname
11366 */
11367
11368 for (uint i = 0; i < user_len; i++)
11369 {
11370 *userdomain_ptr++ = user_pos[i];
11371 *userdomain_ptr++ = 0;
11372 }
11373
11374 for (uint i = 0; i < domain_len; i++)
11375 {
11376 *userdomain_ptr++ = domain_pos[i];
11377 *userdomain_ptr++ = 0;
11378 }
11379
11380 /**
11381 * handle server challenge encoding
11382 */
11383
11384 for (uint i = 0; i < srvchall_len; i += 2)
11385 {
11386 const char p0 = srvchall_pos[i + 0];
11387 const char p1 = srvchall_pos[i + 1];
11388
11389 *chall_ptr++ = hex_convert (p1) << 0
11390 | hex_convert (p0) << 4;
11391 }
11392
11393 /**
11394 * handle client challenge encoding
11395 */
11396
11397 for (uint i = 0; i < clichall_len; i += 2)
11398 {
11399 const char p0 = clichall_pos[i + 0];
11400 const char p1 = clichall_pos[i + 1];
11401
11402 *chall_ptr++ = hex_convert (p1) << 0
11403 | hex_convert (p0) << 4;
11404 }
11405
11406 /**
11407 * store data
11408 */
11409
11410 char *salt_buf_ptr = (char *) salt->salt_buf;
11411
11412 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
11413
11414 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11415
11416 salt->salt_len = salt_len;
11417
11418 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11419 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11420 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11421 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11422
11423 digest[0] = byte_swap_32 (digest[0]);
11424 digest[1] = byte_swap_32 (digest[1]);
11425 digest[2] = byte_swap_32 (digest[2]);
11426 digest[3] = byte_swap_32 (digest[3]);
11427
11428 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
11429
11430 uint digest_tmp[2] = { 0 };
11431
11432 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11433 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
11434
11435 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
11436 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
11437
11438 /* special case 2: ESS */
11439
11440 if (srvchall_len == 48)
11441 {
11442 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
11443 {
11444 uint w[16] = { 0 };
11445
11446 w[ 0] = netntlm->chall_buf[6];
11447 w[ 1] = netntlm->chall_buf[7];
11448 w[ 2] = netntlm->chall_buf[0];
11449 w[ 3] = netntlm->chall_buf[1];
11450 w[ 4] = 0x80;
11451 w[14] = 16 * 8;
11452
11453 uint dgst[4] = { 0 };
11454
11455 dgst[0] = MAGIC_A;
11456 dgst[1] = MAGIC_B;
11457 dgst[2] = MAGIC_C;
11458 dgst[3] = MAGIC_D;
11459
11460 md5_64 (w, dgst);
11461
11462 salt->salt_buf[0] = dgst[0];
11463 salt->salt_buf[1] = dgst[1];
11464 }
11465 }
11466
11467 /* precompute netntlmv1 exploit start */
11468
11469 for (uint i = 0; i < 0x10000; i++)
11470 {
11471 uint key_md4[2] = { i, 0 };
11472 uint key_des[2] = { 0, 0 };
11473
11474 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
11475
11476 uint Kc[16] = { 0 };
11477 uint Kd[16] = { 0 };
11478
11479 _des_keysetup (key_des, Kc, Kd, c_skb);
11480
11481 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
11482
11483 _des_encrypt (data3, Kc, Kd, c_SPtrans);
11484
11485 if (data3[0] != digest_tmp[0]) continue;
11486 if (data3[1] != digest_tmp[1]) continue;
11487
11488 salt->salt_buf[2] = i;
11489
11490 salt->salt_len = 24;
11491
11492 break;
11493 }
11494
11495 salt->salt_buf_pc[0] = digest_tmp[0];
11496 salt->salt_buf_pc[1] = digest_tmp[1];
11497
11498 /* precompute netntlmv1 exploit stop */
11499
11500 u32 tt;
11501
11502 IP (digest[0], digest[1], tt);
11503 IP (digest[2], digest[3], tt);
11504
11505 digest[0] = rotr32 (digest[0], 29);
11506 digest[1] = rotr32 (digest[1], 29);
11507 digest[2] = rotr32 (digest[2], 29);
11508 digest[3] = rotr32 (digest[3], 29);
11509
11510 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
11511
11512 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
11513 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
11514
11515 return (PARSER_OK);
11516 }
11517
11518 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11519 {
11520 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
11521
11522 u32 *digest = (u32 *) hash_buf->digest;
11523
11524 salt_t *salt = hash_buf->salt;
11525
11526 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11527
11528 /**
11529 * parse line
11530 */
11531
11532 char *user_pos = input_buf;
11533
11534 char *unused_pos = strchr (user_pos, ':');
11535
11536 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11537
11538 uint user_len = unused_pos - user_pos;
11539
11540 if (user_len > 60) return (PARSER_SALT_LENGTH);
11541
11542 unused_pos++;
11543
11544 char *domain_pos = strchr (unused_pos, ':');
11545
11546 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11547
11548 uint unused_len = domain_pos - unused_pos;
11549
11550 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11551
11552 domain_pos++;
11553
11554 char *srvchall_pos = strchr (domain_pos, ':');
11555
11556 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11557
11558 uint domain_len = srvchall_pos - domain_pos;
11559
11560 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11561
11562 srvchall_pos++;
11563
11564 char *hash_pos = strchr (srvchall_pos, ':');
11565
11566 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11567
11568 uint srvchall_len = hash_pos - srvchall_pos;
11569
11570 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
11571
11572 hash_pos++;
11573
11574 char *clichall_pos = strchr (hash_pos, ':');
11575
11576 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11577
11578 uint hash_len = clichall_pos - hash_pos;
11579
11580 if (hash_len != 32) return (PARSER_HASH_LENGTH);
11581
11582 clichall_pos++;
11583
11584 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11585
11586 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
11587
11588 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11589
11590 /**
11591 * store some data for later use
11592 */
11593
11594 netntlm->user_len = user_len * 2;
11595 netntlm->domain_len = domain_len * 2;
11596 netntlm->srvchall_len = srvchall_len / 2;
11597 netntlm->clichall_len = clichall_len / 2;
11598
11599 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11600 char *chall_ptr = (char *) netntlm->chall_buf;
11601
11602 /**
11603 * handle username and domainname
11604 */
11605
11606 for (uint i = 0; i < user_len; i++)
11607 {
11608 *userdomain_ptr++ = toupper (user_pos[i]);
11609 *userdomain_ptr++ = 0;
11610 }
11611
11612 for (uint i = 0; i < domain_len; i++)
11613 {
11614 *userdomain_ptr++ = domain_pos[i];
11615 *userdomain_ptr++ = 0;
11616 }
11617
11618 *userdomain_ptr++ = 0x80;
11619
11620 /**
11621 * handle server challenge encoding
11622 */
11623
11624 for (uint i = 0; i < srvchall_len; i += 2)
11625 {
11626 const char p0 = srvchall_pos[i + 0];
11627 const char p1 = srvchall_pos[i + 1];
11628
11629 *chall_ptr++ = hex_convert (p1) << 0
11630 | hex_convert (p0) << 4;
11631 }
11632
11633 /**
11634 * handle client challenge encoding
11635 */
11636
11637 for (uint i = 0; i < clichall_len; i += 2)
11638 {
11639 const char p0 = clichall_pos[i + 0];
11640 const char p1 = clichall_pos[i + 1];
11641
11642 *chall_ptr++ = hex_convert (p1) << 0
11643 | hex_convert (p0) << 4;
11644 }
11645
11646 *chall_ptr++ = 0x80;
11647
11648 /**
11649 * handle hash itself
11650 */
11651
11652 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11653 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11654 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11655 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11656
11657 digest[0] = byte_swap_32 (digest[0]);
11658 digest[1] = byte_swap_32 (digest[1]);
11659 digest[2] = byte_swap_32 (digest[2]);
11660 digest[3] = byte_swap_32 (digest[3]);
11661
11662 /**
11663 * reuse challange data as salt_buf, its the buffer that is most likely unique
11664 */
11665
11666 salt->salt_buf[0] = 0;
11667 salt->salt_buf[1] = 0;
11668 salt->salt_buf[2] = 0;
11669 salt->salt_buf[3] = 0;
11670 salt->salt_buf[4] = 0;
11671 salt->salt_buf[5] = 0;
11672 salt->salt_buf[6] = 0;
11673 salt->salt_buf[7] = 0;
11674
11675 uint *uptr;
11676
11677 uptr = (uint *) netntlm->userdomain_buf;
11678
11679 for (uint i = 0; i < 16; i += 16)
11680 {
11681 md5_64 (uptr, salt->salt_buf);
11682 }
11683
11684 uptr = (uint *) netntlm->chall_buf;
11685
11686 for (uint i = 0; i < 256; i += 16)
11687 {
11688 md5_64 (uptr, salt->salt_buf);
11689 }
11690
11691 salt->salt_len = 16;
11692
11693 return (PARSER_OK);
11694 }
11695
11696 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11697 {
11698 if (data.opts_type & OPTS_TYPE_ST_HEX)
11699 {
11700 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11701 }
11702 else
11703 {
11704 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11705 }
11706
11707 u32 *digest = (u32 *) hash_buf->digest;
11708
11709 salt_t *salt = hash_buf->salt;
11710
11711 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11712 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11713 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11714 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11715
11716 digest[0] = byte_swap_32 (digest[0]);
11717 digest[1] = byte_swap_32 (digest[1]);
11718 digest[2] = byte_swap_32 (digest[2]);
11719 digest[3] = byte_swap_32 (digest[3]);
11720
11721 digest[0] -= MD5M_A;
11722 digest[1] -= MD5M_B;
11723 digest[2] -= MD5M_C;
11724 digest[3] -= MD5M_D;
11725
11726 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11727
11728 uint salt_len = input_len - 32 - 1;
11729
11730 char *salt_buf = input_buf + 32 + 1;
11731
11732 char *salt_buf_ptr = (char *) salt->salt_buf;
11733
11734 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11735
11736 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11737
11738 salt->salt_len = salt_len;
11739
11740 return (PARSER_OK);
11741 }
11742
11743 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11744 {
11745 if (data.opts_type & OPTS_TYPE_ST_HEX)
11746 {
11747 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11748 }
11749 else
11750 {
11751 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11752 }
11753
11754 u32 *digest = (u32 *) hash_buf->digest;
11755
11756 salt_t *salt = hash_buf->salt;
11757
11758 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11759 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11760 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11761 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11762
11763 digest[0] = byte_swap_32 (digest[0]);
11764 digest[1] = byte_swap_32 (digest[1]);
11765 digest[2] = byte_swap_32 (digest[2]);
11766 digest[3] = byte_swap_32 (digest[3]);
11767
11768 digest[0] -= MD5M_A;
11769 digest[1] -= MD5M_B;
11770 digest[2] -= MD5M_C;
11771 digest[3] -= MD5M_D;
11772
11773 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11774
11775 uint salt_len = input_len - 32 - 1;
11776
11777 char *salt_buf = input_buf + 32 + 1;
11778
11779 char *salt_buf_ptr = (char *) salt->salt_buf;
11780
11781 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11782
11783 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11784
11785 salt->salt_len = salt_len;
11786
11787 return (PARSER_OK);
11788 }
11789
11790 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11791 {
11792 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11793
11794 u32 *digest = (u32 *) hash_buf->digest;
11795
11796 salt_t *salt = hash_buf->salt;
11797
11798 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11799 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11800 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11801 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11802
11803 digest[0] = byte_swap_32 (digest[0]);
11804 digest[1] = byte_swap_32 (digest[1]);
11805 digest[2] = byte_swap_32 (digest[2]);
11806 digest[3] = byte_swap_32 (digest[3]);
11807
11808 digest[0] -= MD5M_A;
11809 digest[1] -= MD5M_B;
11810 digest[2] -= MD5M_C;
11811 digest[3] -= MD5M_D;
11812
11813 /**
11814 * This is a virtual salt. While the algorithm is basically not salted
11815 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11816 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11817 */
11818
11819 char *salt_buf_ptr = (char *) salt->salt_buf;
11820
11821 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11822
11823 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11824
11825 salt->salt_len = salt_len;
11826
11827 return (PARSER_OK);
11828 }
11829
11830 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11831 {
11832 if (data.opts_type & OPTS_TYPE_ST_HEX)
11833 {
11834 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11835 }
11836 else
11837 {
11838 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11839 }
11840
11841 u32 *digest = (u32 *) hash_buf->digest;
11842
11843 salt_t *salt = hash_buf->salt;
11844
11845 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11846 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11847 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11848 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11849
11850 digest[0] = byte_swap_32 (digest[0]);
11851 digest[1] = byte_swap_32 (digest[1]);
11852 digest[2] = byte_swap_32 (digest[2]);
11853 digest[3] = byte_swap_32 (digest[3]);
11854
11855 digest[0] -= MD5M_A;
11856 digest[1] -= MD5M_B;
11857 digest[2] -= MD5M_C;
11858 digest[3] -= MD5M_D;
11859
11860 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11861
11862 uint salt_len = input_len - 32 - 1;
11863
11864 char *salt_buf = input_buf + 32 + 1;
11865
11866 char *salt_buf_ptr = (char *) salt->salt_buf;
11867
11868 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11869
11870 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11871
11872 salt->salt_len = salt_len;
11873
11874 return (PARSER_OK);
11875 }
11876
11877 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11878 {
11879 if (data.opts_type & OPTS_TYPE_ST_HEX)
11880 {
11881 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11882 }
11883 else
11884 {
11885 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11886 }
11887
11888 u32 *digest = (u32 *) hash_buf->digest;
11889
11890 salt_t *salt = hash_buf->salt;
11891
11892 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11893 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11894 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11895 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11896
11897 digest[0] = byte_swap_32 (digest[0]);
11898 digest[1] = byte_swap_32 (digest[1]);
11899 digest[2] = byte_swap_32 (digest[2]);
11900 digest[3] = byte_swap_32 (digest[3]);
11901
11902 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11903
11904 uint salt_len = input_len - 32 - 1;
11905
11906 char *salt_buf = input_buf + 32 + 1;
11907
11908 char *salt_buf_ptr = (char *) salt->salt_buf;
11909
11910 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11911
11912 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11913
11914 salt->salt_len = salt_len;
11915
11916 return (PARSER_OK);
11917 }
11918
11919 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11920 {
11921 if (data.opts_type & OPTS_TYPE_ST_HEX)
11922 {
11923 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11924 }
11925 else
11926 {
11927 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11928 }
11929
11930 u32 *digest = (u32 *) hash_buf->digest;
11931
11932 salt_t *salt = hash_buf->salt;
11933
11934 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11935 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11936 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11937 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11938
11939 digest[0] = byte_swap_32 (digest[0]);
11940 digest[1] = byte_swap_32 (digest[1]);
11941 digest[2] = byte_swap_32 (digest[2]);
11942 digest[3] = byte_swap_32 (digest[3]);
11943
11944 digest[0] -= MD4M_A;
11945 digest[1] -= MD4M_B;
11946 digest[2] -= MD4M_C;
11947 digest[3] -= MD4M_D;
11948
11949 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11950
11951 uint salt_len = input_len - 32 - 1;
11952
11953 char *salt_buf = input_buf + 32 + 1;
11954
11955 char *salt_buf_ptr = (char *) salt->salt_buf;
11956
11957 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11958
11959 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11960
11961 salt->salt_len = salt_len;
11962
11963 return (PARSER_OK);
11964 }
11965
11966 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11967 {
11968 if (data.opts_type & OPTS_TYPE_ST_HEX)
11969 {
11970 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11971 }
11972 else
11973 {
11974 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11975 }
11976
11977 u32 *digest = (u32 *) hash_buf->digest;
11978
11979 salt_t *salt = hash_buf->salt;
11980
11981 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11982 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11983 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11984 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11985
11986 digest[0] = byte_swap_32 (digest[0]);
11987 digest[1] = byte_swap_32 (digest[1]);
11988 digest[2] = byte_swap_32 (digest[2]);
11989 digest[3] = byte_swap_32 (digest[3]);
11990
11991 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11992
11993 uint salt_len = input_len - 32 - 1;
11994
11995 char *salt_buf = input_buf + 32 + 1;
11996
11997 uint salt_pc_block[16] = { 0 };
11998
11999 char *salt_pc_block_ptr = (char *) salt_pc_block;
12000
12001 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
12002
12003 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12004
12005 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
12006
12007 salt_pc_block[14] = salt_len * 8;
12008
12009 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
12010
12011 md5_64 (salt_pc_block, salt_pc_digest);
12012
12013 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
12014 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
12015 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
12016 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
12017
12018 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
12019
12020 memcpy (salt_buf_ptr, salt_buf, salt_len);
12021
12022 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
12023
12024 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
12025 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
12026 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
12027 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
12028
12029 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
12030
12031 return (PARSER_OK);
12032 }
12033
12034 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12035 {
12036 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
12037
12038 u32 *digest = (u32 *) hash_buf->digest;
12039
12040 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12041 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12042 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12043 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12044 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12045
12046 digest[0] -= SHA1M_A;
12047 digest[1] -= SHA1M_B;
12048 digest[2] -= SHA1M_C;
12049 digest[3] -= SHA1M_D;
12050 digest[4] -= SHA1M_E;
12051
12052 return (PARSER_OK);
12053 }
12054
12055 int sha1axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12056 {
12057 if ((input_len < DISPLAY_LEN_MIN_13300) || (input_len > DISPLAY_LEN_MAX_13300)) return (PARSER_GLOBAL_LENGTH);
12058
12059 if (memcmp (SIGNATURE_AXCRYPT_SHA1, input_buf, 13)) return (PARSER_SIGNATURE_UNMATCHED);
12060
12061 u32 *digest = (u32 *) hash_buf->digest;
12062
12063 input_buf += 14;
12064
12065 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12066 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12067 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12068 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12069 digest[4] = 0;
12070
12071 return (PARSER_OK);
12072 }
12073
12074 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12075 {
12076 if (data.opts_type & OPTS_TYPE_ST_HEX)
12077 {
12078 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
12079 }
12080 else
12081 {
12082 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
12083 }
12084
12085 u32 *digest = (u32 *) hash_buf->digest;
12086
12087 salt_t *salt = hash_buf->salt;
12088
12089 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12090 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12091 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12092 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12093 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12094
12095 digest[0] -= SHA1M_A;
12096 digest[1] -= SHA1M_B;
12097 digest[2] -= SHA1M_C;
12098 digest[3] -= SHA1M_D;
12099 digest[4] -= SHA1M_E;
12100
12101 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12102
12103 uint salt_len = input_len - 40 - 1;
12104
12105 char *salt_buf = input_buf + 40 + 1;
12106
12107 char *salt_buf_ptr = (char *) salt->salt_buf;
12108
12109 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12110
12111 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12112
12113 salt->salt_len = salt_len;
12114
12115 return (PARSER_OK);
12116 }
12117
12118 int pstoken_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12119 {
12120 if ((input_len < DISPLAY_LEN_MIN_13500) || (input_len > DISPLAY_LEN_MAX_13500)) return (PARSER_GLOBAL_LENGTH);
12121
12122 u32 *digest = (u32 *) hash_buf->digest;
12123
12124 salt_t *salt = hash_buf->salt;
12125
12126 pstoken_t *pstoken = (pstoken_t *) hash_buf->esalt;
12127
12128 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12129 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12130 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12131 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12132 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12133
12134 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12135
12136 uint salt_len = input_len - 40 - 1;
12137
12138 char *salt_buf = input_buf + 40 + 1;
12139
12140 if (salt_len == UINT_MAX || salt_len % 2 != 0) return (PARSER_SALT_LENGTH);
12141
12142 u8 *pstoken_ptr = (u8 *) pstoken->salt_buf;
12143
12144 for (uint i = 0, j = 0; i < salt_len; i += 2, j += 1)
12145 {
12146 pstoken_ptr[j] = hex_to_u8 ((const u8 *) &salt_buf[i]);
12147 }
12148
12149 pstoken->salt_len = salt_len / 2;
12150
12151 /* some fake salt for the sorting mechanisms */
12152
12153 salt->salt_buf[0] = pstoken->salt_buf[0];
12154 salt->salt_buf[1] = pstoken->salt_buf[1];
12155 salt->salt_buf[2] = pstoken->salt_buf[2];
12156 salt->salt_buf[3] = pstoken->salt_buf[3];
12157 salt->salt_buf[4] = pstoken->salt_buf[4];
12158 salt->salt_buf[5] = pstoken->salt_buf[5];
12159 salt->salt_buf[6] = pstoken->salt_buf[6];
12160 salt->salt_buf[7] = pstoken->salt_buf[7];
12161
12162 salt->salt_len = 32;
12163
12164 /* we need to check if we can precompute some of the data --
12165 this is possible since the scheme is badly designed */
12166
12167 pstoken->pc_digest[0] = SHA1M_A;
12168 pstoken->pc_digest[1] = SHA1M_B;
12169 pstoken->pc_digest[2] = SHA1M_C;
12170 pstoken->pc_digest[3] = SHA1M_D;
12171 pstoken->pc_digest[4] = SHA1M_E;
12172
12173 pstoken->pc_offset = 0;
12174
12175 for (int i = 0; i < (int) pstoken->salt_len - 63; i += 64)
12176 {
12177 uint w[16];
12178
12179 w[ 0] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 0]);
12180 w[ 1] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 1]);
12181 w[ 2] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 2]);
12182 w[ 3] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 3]);
12183 w[ 4] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 4]);
12184 w[ 5] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 5]);
12185 w[ 6] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 6]);
12186 w[ 7] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 7]);
12187 w[ 8] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 8]);
12188 w[ 9] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 9]);
12189 w[10] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 10]);
12190 w[11] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 11]);
12191 w[12] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 12]);
12192 w[13] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 13]);
12193 w[14] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 14]);
12194 w[15] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 15]);
12195
12196 sha1_64 (w, pstoken->pc_digest);
12197
12198 pstoken->pc_offset += 16;
12199 }
12200
12201 return (PARSER_OK);
12202 }
12203
12204 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12205 {
12206 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
12207
12208 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
12209
12210 u32 *digest = (u32 *) hash_buf->digest;
12211
12212 u8 tmp_buf[100] = { 0 };
12213
12214 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
12215
12216 memcpy (digest, tmp_buf, 20);
12217
12218 digest[0] = byte_swap_32 (digest[0]);
12219 digest[1] = byte_swap_32 (digest[1]);
12220 digest[2] = byte_swap_32 (digest[2]);
12221 digest[3] = byte_swap_32 (digest[3]);
12222 digest[4] = byte_swap_32 (digest[4]);
12223
12224 digest[0] -= SHA1M_A;
12225 digest[1] -= SHA1M_B;
12226 digest[2] -= SHA1M_C;
12227 digest[3] -= SHA1M_D;
12228 digest[4] -= SHA1M_E;
12229
12230 return (PARSER_OK);
12231 }
12232
12233 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12234 {
12235 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
12236
12237 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12238
12239 u32 *digest = (u32 *) hash_buf->digest;
12240
12241 salt_t *salt = hash_buf->salt;
12242
12243 u8 tmp_buf[100] = { 0 };
12244
12245 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
12246
12247 if (tmp_len < 20) return (PARSER_HASH_LENGTH);
12248
12249 memcpy (digest, tmp_buf, 20);
12250
12251 int salt_len = tmp_len - 20;
12252
12253 if (salt_len < 0) return (PARSER_SALT_LENGTH);
12254
12255 salt->salt_len = salt_len;
12256
12257 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
12258
12259 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12260 {
12261 char *ptr = (char *) salt->salt_buf;
12262
12263 ptr[salt->salt_len] = 0x80;
12264 }
12265
12266 digest[0] = byte_swap_32 (digest[0]);
12267 digest[1] = byte_swap_32 (digest[1]);
12268 digest[2] = byte_swap_32 (digest[2]);
12269 digest[3] = byte_swap_32 (digest[3]);
12270 digest[4] = byte_swap_32 (digest[4]);
12271
12272 digest[0] -= SHA1M_A;
12273 digest[1] -= SHA1M_B;
12274 digest[2] -= SHA1M_C;
12275 digest[3] -= SHA1M_D;
12276 digest[4] -= SHA1M_E;
12277
12278 return (PARSER_OK);
12279 }
12280
12281 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12282 {
12283 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
12284
12285 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12286
12287 u32 *digest = (u32 *) hash_buf->digest;
12288
12289 salt_t *salt = hash_buf->salt;
12290
12291 char *salt_buf = input_buf + 6;
12292
12293 uint salt_len = 8;
12294
12295 char *salt_buf_ptr = (char *) salt->salt_buf;
12296
12297 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12298
12299 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12300
12301 salt->salt_len = salt_len;
12302
12303 char *hash_pos = input_buf + 6 + 8 + 40;
12304
12305 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12306 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12307 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12308 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12309 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12310
12311 digest[0] -= SHA1M_A;
12312 digest[1] -= SHA1M_B;
12313 digest[2] -= SHA1M_C;
12314 digest[3] -= SHA1M_D;
12315 digest[4] -= SHA1M_E;
12316
12317 return (PARSER_OK);
12318 }
12319
12320 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12321 {
12322 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
12323
12324 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12325
12326 u32 *digest = (u32 *) hash_buf->digest;
12327
12328 salt_t *salt = hash_buf->salt;
12329
12330 char *salt_buf = input_buf + 6;
12331
12332 uint salt_len = 8;
12333
12334 char *salt_buf_ptr = (char *) salt->salt_buf;
12335
12336 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12337
12338 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12339
12340 salt->salt_len = salt_len;
12341
12342 char *hash_pos = input_buf + 6 + 8;
12343
12344 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12345 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12346 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12347 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12348 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12349
12350 digest[0] -= SHA1M_A;
12351 digest[1] -= SHA1M_B;
12352 digest[2] -= SHA1M_C;
12353 digest[3] -= SHA1M_D;
12354 digest[4] -= SHA1M_E;
12355
12356 return (PARSER_OK);
12357 }
12358
12359 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12360 {
12361 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
12362
12363 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12364
12365 u64 *digest = (u64 *) hash_buf->digest;
12366
12367 salt_t *salt = hash_buf->salt;
12368
12369 char *salt_buf = input_buf + 6;
12370
12371 uint salt_len = 8;
12372
12373 char *salt_buf_ptr = (char *) salt->salt_buf;
12374
12375 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12376
12377 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12378
12379 salt->salt_len = salt_len;
12380
12381 char *hash_pos = input_buf + 6 + 8;
12382
12383 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12384 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12385 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12386 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12387 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12388 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12389 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12390 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12391
12392 digest[0] -= SHA512M_A;
12393 digest[1] -= SHA512M_B;
12394 digest[2] -= SHA512M_C;
12395 digest[3] -= SHA512M_D;
12396 digest[4] -= SHA512M_E;
12397 digest[5] -= SHA512M_F;
12398 digest[6] -= SHA512M_G;
12399 digest[7] -= SHA512M_H;
12400
12401 return (PARSER_OK);
12402 }
12403
12404 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12405 {
12406 if (data.opts_type & OPTS_TYPE_ST_HEX)
12407 {
12408 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
12409 }
12410 else
12411 {
12412 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
12413 }
12414
12415 u32 *digest = (u32 *) hash_buf->digest;
12416
12417 salt_t *salt = hash_buf->salt;
12418
12419 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12420 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12421 digest[2] = 0;
12422 digest[3] = 0;
12423
12424 digest[0] = byte_swap_32 (digest[0]);
12425 digest[1] = byte_swap_32 (digest[1]);
12426
12427 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12428
12429 uint salt_len = input_len - 16 - 1;
12430
12431 char *salt_buf = input_buf + 16 + 1;
12432
12433 char *salt_buf_ptr = (char *) salt->salt_buf;
12434
12435 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12436
12437 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12438
12439 salt->salt_len = salt_len;
12440
12441 return (PARSER_OK);
12442 }
12443
12444 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12445 {
12446 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
12447
12448 u32 *digest = (u32 *) hash_buf->digest;
12449
12450 salt_t *salt = hash_buf->salt;
12451
12452 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12453 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12454 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12455 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12456 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12457
12458 digest[0] -= SHA1M_A;
12459 digest[1] -= SHA1M_B;
12460 digest[2] -= SHA1M_C;
12461 digest[3] -= SHA1M_D;
12462 digest[4] -= SHA1M_E;
12463
12464 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12465
12466 uint salt_len = input_len - 40 - 1;
12467
12468 char *salt_buf = input_buf + 40 + 1;
12469
12470 char *salt_buf_ptr = (char *) salt->salt_buf;
12471
12472 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12473
12474 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12475
12476 salt->salt_len = salt_len;
12477
12478 return (PARSER_OK);
12479 }
12480
12481 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12482 {
12483 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
12484
12485 u32 *digest = (u32 *) hash_buf->digest;
12486
12487 salt_t *salt = hash_buf->salt;
12488
12489 char *hash_pos = input_buf;
12490
12491 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12492 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12493 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
12494 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
12495 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
12496 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
12497 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
12498 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
12499 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
12500 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
12501 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
12502 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
12503 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
12504 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
12505 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
12506 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
12507
12508 char *salt_pos = input_buf + 128;
12509
12510 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12511 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12512 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12513 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12514
12515 salt->salt_iter = ROUNDS_ORACLET - 1;
12516 salt->salt_len = 16;
12517
12518 return (PARSER_OK);
12519 }
12520
12521 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12522 {
12523 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
12524
12525 u32 *digest = (u32 *) hash_buf->digest;
12526
12527 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12528 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12529 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12530 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12531 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12532 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12533 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12534 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12535
12536 digest[0] -= SHA256M_A;
12537 digest[1] -= SHA256M_B;
12538 digest[2] -= SHA256M_C;
12539 digest[3] -= SHA256M_D;
12540 digest[4] -= SHA256M_E;
12541 digest[5] -= SHA256M_F;
12542 digest[6] -= SHA256M_G;
12543 digest[7] -= SHA256M_H;
12544
12545 return (PARSER_OK);
12546 }
12547
12548 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12549 {
12550 if (data.opts_type & OPTS_TYPE_ST_HEX)
12551 {
12552 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
12553 }
12554 else
12555 {
12556 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
12557 }
12558
12559 u32 *digest = (u32 *) hash_buf->digest;
12560
12561 salt_t *salt = hash_buf->salt;
12562
12563 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12564 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12565 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12566 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12567 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12568 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12569 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12570 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12571
12572 digest[0] -= SHA256M_A;
12573 digest[1] -= SHA256M_B;
12574 digest[2] -= SHA256M_C;
12575 digest[3] -= SHA256M_D;
12576 digest[4] -= SHA256M_E;
12577 digest[5] -= SHA256M_F;
12578 digest[6] -= SHA256M_G;
12579 digest[7] -= SHA256M_H;
12580
12581 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12582
12583 uint salt_len = input_len - 64 - 1;
12584
12585 char *salt_buf = input_buf + 64 + 1;
12586
12587 char *salt_buf_ptr = (char *) salt->salt_buf;
12588
12589 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12590
12591 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12592
12593 salt->salt_len = salt_len;
12594
12595 return (PARSER_OK);
12596 }
12597
12598 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12599 {
12600 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
12601
12602 u64 *digest = (u64 *) hash_buf->digest;
12603
12604 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12605 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12606 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12607 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12608 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12609 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12610 digest[6] = 0;
12611 digest[7] = 0;
12612
12613 digest[0] -= SHA384M_A;
12614 digest[1] -= SHA384M_B;
12615 digest[2] -= SHA384M_C;
12616 digest[3] -= SHA384M_D;
12617 digest[4] -= SHA384M_E;
12618 digest[5] -= SHA384M_F;
12619 digest[6] -= 0;
12620 digest[7] -= 0;
12621
12622 return (PARSER_OK);
12623 }
12624
12625 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12626 {
12627 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
12628
12629 u64 *digest = (u64 *) hash_buf->digest;
12630
12631 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12632 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12633 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12634 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12635 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12636 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12637 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12638 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12639
12640 digest[0] -= SHA512M_A;
12641 digest[1] -= SHA512M_B;
12642 digest[2] -= SHA512M_C;
12643 digest[3] -= SHA512M_D;
12644 digest[4] -= SHA512M_E;
12645 digest[5] -= SHA512M_F;
12646 digest[6] -= SHA512M_G;
12647 digest[7] -= SHA512M_H;
12648
12649 return (PARSER_OK);
12650 }
12651
12652 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12653 {
12654 if (data.opts_type & OPTS_TYPE_ST_HEX)
12655 {
12656 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
12657 }
12658 else
12659 {
12660 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
12661 }
12662
12663 u64 *digest = (u64 *) hash_buf->digest;
12664
12665 salt_t *salt = hash_buf->salt;
12666
12667 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12668 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12669 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12670 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12671 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12672 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12673 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12674 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12675
12676 digest[0] -= SHA512M_A;
12677 digest[1] -= SHA512M_B;
12678 digest[2] -= SHA512M_C;
12679 digest[3] -= SHA512M_D;
12680 digest[4] -= SHA512M_E;
12681 digest[5] -= SHA512M_F;
12682 digest[6] -= SHA512M_G;
12683 digest[7] -= SHA512M_H;
12684
12685 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12686
12687 uint salt_len = input_len - 128 - 1;
12688
12689 char *salt_buf = input_buf + 128 + 1;
12690
12691 char *salt_buf_ptr = (char *) salt->salt_buf;
12692
12693 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12694
12695 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12696
12697 salt->salt_len = salt_len;
12698
12699 return (PARSER_OK);
12700 }
12701
12702 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12703 {
12704 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12705
12706 u64 *digest = (u64 *) hash_buf->digest;
12707
12708 salt_t *salt = hash_buf->salt;
12709
12710 char *salt_pos = input_buf + 3;
12711
12712 uint iterations_len = 0;
12713
12714 if (memcmp (salt_pos, "rounds=", 7) == 0)
12715 {
12716 salt_pos += 7;
12717
12718 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12719
12720 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12721 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12722
12723 salt_pos[0] = 0x0;
12724
12725 salt->salt_iter = atoi (salt_pos - iterations_len);
12726
12727 salt_pos += 1;
12728
12729 iterations_len += 8;
12730 }
12731 else
12732 {
12733 salt->salt_iter = ROUNDS_SHA512CRYPT;
12734 }
12735
12736 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12737
12738 char *hash_pos = strchr (salt_pos, '$');
12739
12740 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12741
12742 uint salt_len = hash_pos - salt_pos;
12743
12744 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12745
12746 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12747
12748 salt->salt_len = salt_len;
12749
12750 hash_pos++;
12751
12752 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12753
12754 return (PARSER_OK);
12755 }
12756
12757 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12758 {
12759 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12760
12761 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12762
12763 u64 *digest = (u64 *) hash_buf->digest;
12764
12765 salt_t *salt = hash_buf->salt;
12766
12767 uint keccak_mdlen = input_len / 2;
12768
12769 for (uint i = 0; i < keccak_mdlen / 8; i++)
12770 {
12771 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12772
12773 digest[i] = byte_swap_64 (digest[i]);
12774 }
12775
12776 salt->keccak_mdlen = keccak_mdlen;
12777
12778 return (PARSER_OK);
12779 }
12780
12781 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12782 {
12783 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12784
12785 u32 *digest = (u32 *) hash_buf->digest;
12786
12787 salt_t *salt = hash_buf->salt;
12788
12789 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12790
12791 /**
12792 * Parse that strange long line
12793 */
12794
12795 char *in_off[9];
12796
12797 size_t in_len[9] = { 0 };
12798
12799 in_off[0] = strtok (input_buf, ":");
12800
12801 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12802
12803 in_len[0] = strlen (in_off[0]);
12804
12805 size_t i;
12806
12807 for (i = 1; i < 9; i++)
12808 {
12809 in_off[i] = strtok (NULL, ":");
12810
12811 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12812
12813 in_len[i] = strlen (in_off[i]);
12814 }
12815
12816 char *ptr = (char *) ikepsk->msg_buf;
12817
12818 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12819 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12820 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12821 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12822 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12823 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12824
12825 *ptr = 0x80;
12826
12827 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12828
12829 ptr = (char *) ikepsk->nr_buf;
12830
12831 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12832 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12833
12834 *ptr = 0x80;
12835
12836 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12837
12838 /**
12839 * Store to database
12840 */
12841
12842 ptr = in_off[8];
12843
12844 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12845 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12846 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12847 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12848
12849 digest[0] = byte_swap_32 (digest[0]);
12850 digest[1] = byte_swap_32 (digest[1]);
12851 digest[2] = byte_swap_32 (digest[2]);
12852 digest[3] = byte_swap_32 (digest[3]);
12853
12854 salt->salt_len = 32;
12855
12856 salt->salt_buf[0] = ikepsk->nr_buf[0];
12857 salt->salt_buf[1] = ikepsk->nr_buf[1];
12858 salt->salt_buf[2] = ikepsk->nr_buf[2];
12859 salt->salt_buf[3] = ikepsk->nr_buf[3];
12860 salt->salt_buf[4] = ikepsk->nr_buf[4];
12861 salt->salt_buf[5] = ikepsk->nr_buf[5];
12862 salt->salt_buf[6] = ikepsk->nr_buf[6];
12863 salt->salt_buf[7] = ikepsk->nr_buf[7];
12864
12865 return (PARSER_OK);
12866 }
12867
12868 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12869 {
12870 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12871
12872 u32 *digest = (u32 *) hash_buf->digest;
12873
12874 salt_t *salt = hash_buf->salt;
12875
12876 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12877
12878 /**
12879 * Parse that strange long line
12880 */
12881
12882 char *in_off[9];
12883
12884 size_t in_len[9] = { 0 };
12885
12886 in_off[0] = strtok (input_buf, ":");
12887
12888 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12889
12890 in_len[0] = strlen (in_off[0]);
12891
12892 size_t i;
12893
12894 for (i = 1; i < 9; i++)
12895 {
12896 in_off[i] = strtok (NULL, ":");
12897
12898 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12899
12900 in_len[i] = strlen (in_off[i]);
12901 }
12902
12903 char *ptr = (char *) ikepsk->msg_buf;
12904
12905 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12906 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12907 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12908 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12909 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12910 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12911
12912 *ptr = 0x80;
12913
12914 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12915
12916 ptr = (char *) ikepsk->nr_buf;
12917
12918 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12919 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12920
12921 *ptr = 0x80;
12922
12923 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12924
12925 /**
12926 * Store to database
12927 */
12928
12929 ptr = in_off[8];
12930
12931 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12932 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12933 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12934 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12935 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12936
12937 salt->salt_len = 32;
12938
12939 salt->salt_buf[0] = ikepsk->nr_buf[0];
12940 salt->salt_buf[1] = ikepsk->nr_buf[1];
12941 salt->salt_buf[2] = ikepsk->nr_buf[2];
12942 salt->salt_buf[3] = ikepsk->nr_buf[3];
12943 salt->salt_buf[4] = ikepsk->nr_buf[4];
12944 salt->salt_buf[5] = ikepsk->nr_buf[5];
12945 salt->salt_buf[6] = ikepsk->nr_buf[6];
12946 salt->salt_buf[7] = ikepsk->nr_buf[7];
12947
12948 return (PARSER_OK);
12949 }
12950
12951 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12952 {
12953 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12954
12955 u32 *digest = (u32 *) hash_buf->digest;
12956
12957 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12958 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12959 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12960 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12961 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12962
12963 digest[0] = byte_swap_32 (digest[0]);
12964 digest[1] = byte_swap_32 (digest[1]);
12965 digest[2] = byte_swap_32 (digest[2]);
12966 digest[3] = byte_swap_32 (digest[3]);
12967 digest[4] = byte_swap_32 (digest[4]);
12968
12969 return (PARSER_OK);
12970 }
12971
12972 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12973 {
12974 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12975
12976 u32 *digest = (u32 *) hash_buf->digest;
12977
12978 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12979 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12980 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12981 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12982 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12983 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12984 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12985 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12986 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12987 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12988 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12989 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12990 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12991 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12992 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12993 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12994
12995 return (PARSER_OK);
12996 }
12997
12998 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12999 {
13000 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
13001
13002 u32 *digest = (u32 *) hash_buf->digest;
13003
13004 salt_t *salt = hash_buf->salt;
13005
13006 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13007 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13008 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13009 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13010 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13011
13012 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13013
13014 uint salt_len = input_len - 40 - 1;
13015
13016 char *salt_buf = input_buf + 40 + 1;
13017
13018 char *salt_buf_ptr = (char *) salt->salt_buf;
13019
13020 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13021
13022 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13023
13024 salt->salt_len = salt_len;
13025
13026 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
13027
13028 return (PARSER_OK);
13029 }
13030
13031 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
13032 {
13033 u32 *digest = (u32 *) hash_buf->digest;
13034
13035 salt_t *salt = hash_buf->salt;
13036
13037 tc_t *tc = (tc_t *) hash_buf->esalt;
13038
13039 if (input_len == 0)
13040 {
13041 log_error ("TrueCrypt container not specified");
13042
13043 exit (-1);
13044 }
13045
13046 FILE *fp = fopen (input_buf, "rb");
13047
13048 if (fp == NULL)
13049 {
13050 log_error ("%s: %s", input_buf, strerror (errno));
13051
13052 exit (-1);
13053 }
13054
13055 char buf[512] = { 0 };
13056
13057 int n = fread (buf, 1, sizeof (buf), fp);
13058
13059 fclose (fp);
13060
13061 if (n != 512) return (PARSER_TC_FILE_SIZE);
13062
13063 memcpy (tc->salt_buf, buf, 64);
13064
13065 memcpy (tc->data_buf, buf + 64, 512 - 64);
13066
13067 salt->salt_buf[0] = tc->salt_buf[0];
13068
13069 salt->salt_len = 4;
13070
13071 salt->salt_iter = ROUNDS_TRUECRYPT_1K - 1;
13072
13073 tc->signature = 0x45555254; // "TRUE"
13074
13075 digest[0] = tc->data_buf[0];
13076
13077 return (PARSER_OK);
13078 }
13079
13080 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
13081 {
13082 u32 *digest = (u32 *) hash_buf->digest;
13083
13084 salt_t *salt = hash_buf->salt;
13085
13086 tc_t *tc = (tc_t *) hash_buf->esalt;
13087
13088 if (input_len == 0)
13089 {
13090 log_error ("TrueCrypt container not specified");
13091
13092 exit (-1);
13093 }
13094
13095 FILE *fp = fopen (input_buf, "rb");
13096
13097 if (fp == NULL)
13098 {
13099 log_error ("%s: %s", input_buf, strerror (errno));
13100
13101 exit (-1);
13102 }
13103
13104 char buf[512] = { 0 };
13105
13106 int n = fread (buf, 1, sizeof (buf), fp);
13107
13108 fclose (fp);
13109
13110 if (n != 512) return (PARSER_TC_FILE_SIZE);
13111
13112 memcpy (tc->salt_buf, buf, 64);
13113
13114 memcpy (tc->data_buf, buf + 64, 512 - 64);
13115
13116 salt->salt_buf[0] = tc->salt_buf[0];
13117
13118 salt->salt_len = 4;
13119
13120 salt->salt_iter = ROUNDS_TRUECRYPT_2K - 1;
13121
13122 tc->signature = 0x45555254; // "TRUE"
13123
13124 digest[0] = tc->data_buf[0];
13125
13126 return (PARSER_OK);
13127 }
13128
13129 int veracrypt_parse_hash_200000 (char *input_buf, uint input_len, hash_t *hash_buf)
13130 {
13131 u32 *digest = (u32 *) hash_buf->digest;
13132
13133 salt_t *salt = hash_buf->salt;
13134
13135 tc_t *tc = (tc_t *) hash_buf->esalt;
13136
13137 if (input_len == 0)
13138 {
13139 log_error ("VeraCrypt container not specified");
13140
13141 exit (-1);
13142 }
13143
13144 FILE *fp = fopen (input_buf, "rb");
13145
13146 if (fp == NULL)
13147 {
13148 log_error ("%s: %s", input_buf, strerror (errno));
13149
13150 exit (-1);
13151 }
13152
13153 char buf[512] = { 0 };
13154
13155 int n = fread (buf, 1, sizeof (buf), fp);
13156
13157 fclose (fp);
13158
13159 if (n != 512) return (PARSER_VC_FILE_SIZE);
13160
13161 memcpy (tc->salt_buf, buf, 64);
13162
13163 memcpy (tc->data_buf, buf + 64, 512 - 64);
13164
13165 salt->salt_buf[0] = tc->salt_buf[0];
13166
13167 salt->salt_len = 4;
13168
13169 salt->salt_iter = ROUNDS_VERACRYPT_200000 - 1;
13170
13171 tc->signature = 0x41524556; // "VERA"
13172
13173 digest[0] = tc->data_buf[0];
13174
13175 return (PARSER_OK);
13176 }
13177
13178 int veracrypt_parse_hash_500000 (char *input_buf, uint input_len, hash_t *hash_buf)
13179 {
13180 u32 *digest = (u32 *) hash_buf->digest;
13181
13182 salt_t *salt = hash_buf->salt;
13183
13184 tc_t *tc = (tc_t *) hash_buf->esalt;
13185
13186 if (input_len == 0)
13187 {
13188 log_error ("VeraCrypt container not specified");
13189
13190 exit (-1);
13191 }
13192
13193 FILE *fp = fopen (input_buf, "rb");
13194
13195 if (fp == NULL)
13196 {
13197 log_error ("%s: %s", input_buf, strerror (errno));
13198
13199 exit (-1);
13200 }
13201
13202 char buf[512] = { 0 };
13203
13204 int n = fread (buf, 1, sizeof (buf), fp);
13205
13206 fclose (fp);
13207
13208 if (n != 512) return (PARSER_VC_FILE_SIZE);
13209
13210 memcpy (tc->salt_buf, buf, 64);
13211
13212 memcpy (tc->data_buf, buf + 64, 512 - 64);
13213
13214 salt->salt_buf[0] = tc->salt_buf[0];
13215
13216 salt->salt_len = 4;
13217
13218 salt->salt_iter = ROUNDS_VERACRYPT_500000 - 1;
13219
13220 tc->signature = 0x41524556; // "VERA"
13221
13222 digest[0] = tc->data_buf[0];
13223
13224 return (PARSER_OK);
13225 }
13226
13227 int veracrypt_parse_hash_327661 (char *input_buf, uint input_len, hash_t *hash_buf)
13228 {
13229 u32 *digest = (u32 *) hash_buf->digest;
13230
13231 salt_t *salt = hash_buf->salt;
13232
13233 tc_t *tc = (tc_t *) hash_buf->esalt;
13234
13235 if (input_len == 0)
13236 {
13237 log_error ("VeraCrypt container not specified");
13238
13239 exit (-1);
13240 }
13241
13242 FILE *fp = fopen (input_buf, "rb");
13243
13244 if (fp == NULL)
13245 {
13246 log_error ("%s: %s", input_buf, strerror (errno));
13247
13248 exit (-1);
13249 }
13250
13251 char buf[512] = { 0 };
13252
13253 int n = fread (buf, 1, sizeof (buf), fp);
13254
13255 fclose (fp);
13256
13257 if (n != 512) return (PARSER_VC_FILE_SIZE);
13258
13259 memcpy (tc->salt_buf, buf, 64);
13260
13261 memcpy (tc->data_buf, buf + 64, 512 - 64);
13262
13263 salt->salt_buf[0] = tc->salt_buf[0];
13264
13265 salt->salt_len = 4;
13266
13267 salt->salt_iter = ROUNDS_VERACRYPT_327661 - 1;
13268
13269 tc->signature = 0x41524556; // "VERA"
13270
13271 digest[0] = tc->data_buf[0];
13272
13273 return (PARSER_OK);
13274 }
13275
13276 int veracrypt_parse_hash_655331 (char *input_buf, uint input_len, hash_t *hash_buf)
13277 {
13278 u32 *digest = (u32 *) hash_buf->digest;
13279
13280 salt_t *salt = hash_buf->salt;
13281
13282 tc_t *tc = (tc_t *) hash_buf->esalt;
13283
13284 if (input_len == 0)
13285 {
13286 log_error ("VeraCrypt container not specified");
13287
13288 exit (-1);
13289 }
13290
13291 FILE *fp = fopen (input_buf, "rb");
13292
13293 if (fp == NULL)
13294 {
13295 log_error ("%s: %s", input_buf, strerror (errno));
13296
13297 exit (-1);
13298 }
13299
13300 char buf[512] = { 0 };
13301
13302 int n = fread (buf, 1, sizeof (buf), fp);
13303
13304 fclose (fp);
13305
13306 if (n != 512) return (PARSER_VC_FILE_SIZE);
13307
13308 memcpy (tc->salt_buf, buf, 64);
13309
13310 memcpy (tc->data_buf, buf + 64, 512 - 64);
13311
13312 salt->salt_buf[0] = tc->salt_buf[0];
13313
13314 salt->salt_len = 4;
13315
13316 salt->salt_iter = ROUNDS_VERACRYPT_655331 - 1;
13317
13318 tc->signature = 0x41524556; // "VERA"
13319
13320 digest[0] = tc->data_buf[0];
13321
13322 return (PARSER_OK);
13323 }
13324
13325 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13326 {
13327 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
13328
13329 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13330
13331 u32 *digest = (u32 *) hash_buf->digest;
13332
13333 salt_t *salt = hash_buf->salt;
13334
13335 char *salt_pos = input_buf + 6;
13336
13337 char *hash_pos = strchr (salt_pos, '$');
13338
13339 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13340
13341 uint salt_len = hash_pos - salt_pos;
13342
13343 if (salt_len < 8) return (PARSER_SALT_LENGTH);
13344
13345 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13346
13347 salt->salt_len = salt_len;
13348
13349 salt->salt_iter = 1000;
13350
13351 hash_pos++;
13352
13353 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13354
13355 return (PARSER_OK);
13356 }
13357
13358 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13359 {
13360 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
13361
13362 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
13363
13364 u32 *digest = (u32 *) hash_buf->digest;
13365
13366 salt_t *salt = hash_buf->salt;
13367
13368 char *iter_pos = input_buf + 7;
13369
13370 char *salt_pos = strchr (iter_pos, '$');
13371
13372 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13373
13374 salt_pos++;
13375
13376 char *hash_pos = strchr (salt_pos, '$');
13377
13378 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13379
13380 uint salt_len = hash_pos - salt_pos;
13381
13382 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13383
13384 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13385
13386 salt->salt_len = salt_len;
13387
13388 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13389
13390 salt->salt_sign[0] = atoi (salt_iter);
13391
13392 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13393
13394 hash_pos++;
13395
13396 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13397
13398 digest[0] = byte_swap_32 (digest[0]);
13399 digest[1] = byte_swap_32 (digest[1]);
13400 digest[2] = byte_swap_32 (digest[2]);
13401 digest[3] = byte_swap_32 (digest[3]);
13402 digest[4] = byte_swap_32 (digest[4]);
13403
13404 return (PARSER_OK);
13405 }
13406
13407 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13408 {
13409 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
13410
13411 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13412
13413 u32 *digest = (u32 *) hash_buf->digest;
13414
13415 salt_t *salt = hash_buf->salt;
13416
13417 char *iter_pos = input_buf + 9;
13418
13419 char *salt_pos = strchr (iter_pos, '$');
13420
13421 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13422
13423 salt_pos++;
13424
13425 char *hash_pos = strchr (salt_pos, '$');
13426
13427 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13428
13429 uint salt_len = hash_pos - salt_pos;
13430
13431 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13432
13433 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13434
13435 salt->salt_len = salt_len;
13436
13437 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13438
13439 salt->salt_sign[0] = atoi (salt_iter);
13440
13441 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13442
13443 hash_pos++;
13444
13445 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13446
13447 digest[0] = byte_swap_32 (digest[0]);
13448 digest[1] = byte_swap_32 (digest[1]);
13449 digest[2] = byte_swap_32 (digest[2]);
13450 digest[3] = byte_swap_32 (digest[3]);
13451 digest[4] = byte_swap_32 (digest[4]);
13452 digest[5] = byte_swap_32 (digest[5]);
13453 digest[6] = byte_swap_32 (digest[6]);
13454 digest[7] = byte_swap_32 (digest[7]);
13455
13456 return (PARSER_OK);
13457 }
13458
13459 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13460 {
13461 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
13462
13463 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13464
13465 u64 *digest = (u64 *) hash_buf->digest;
13466
13467 salt_t *salt = hash_buf->salt;
13468
13469 char *iter_pos = input_buf + 9;
13470
13471 char *salt_pos = strchr (iter_pos, '$');
13472
13473 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13474
13475 salt_pos++;
13476
13477 char *hash_pos = strchr (salt_pos, '$');
13478
13479 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13480
13481 uint salt_len = hash_pos - salt_pos;
13482
13483 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13484
13485 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13486
13487 salt->salt_len = salt_len;
13488
13489 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13490
13491 salt->salt_sign[0] = atoi (salt_iter);
13492
13493 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13494
13495 hash_pos++;
13496
13497 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13498
13499 digest[0] = byte_swap_64 (digest[0]);
13500 digest[1] = byte_swap_64 (digest[1]);
13501 digest[2] = byte_swap_64 (digest[2]);
13502 digest[3] = byte_swap_64 (digest[3]);
13503 digest[4] = byte_swap_64 (digest[4]);
13504 digest[5] = byte_swap_64 (digest[5]);
13505 digest[6] = byte_swap_64 (digest[6]);
13506 digest[7] = byte_swap_64 (digest[7]);
13507
13508 return (PARSER_OK);
13509 }
13510
13511 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13512 {
13513 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
13514
13515 u32 *digest = (u32 *) hash_buf->digest;
13516
13517 salt_t *salt = hash_buf->salt;
13518
13519 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
13520
13521 /**
13522 * parse line
13523 */
13524
13525 char *iterations_pos = input_buf;
13526
13527 char *saltbuf_pos = strchr (iterations_pos, ':');
13528
13529 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13530
13531 uint iterations_len = saltbuf_pos - iterations_pos;
13532
13533 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
13534
13535 saltbuf_pos++;
13536
13537 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
13538
13539 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13540
13541 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
13542
13543 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
13544
13545 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
13546
13547 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
13548
13549 cipherbuf_pos++;
13550
13551 /**
13552 * pbkdf2 iterations
13553 */
13554
13555 salt->salt_iter = atoi (iterations_pos) - 1;
13556
13557 /**
13558 * handle salt encoding
13559 */
13560
13561 char *saltbuf_ptr = (char *) salt->salt_buf;
13562
13563 for (uint i = 0; i < saltbuf_len; i += 2)
13564 {
13565 const char p0 = saltbuf_pos[i + 0];
13566 const char p1 = saltbuf_pos[i + 1];
13567
13568 *saltbuf_ptr++ = hex_convert (p1) << 0
13569 | hex_convert (p0) << 4;
13570 }
13571
13572 salt->salt_len = saltbuf_len / 2;
13573
13574 /**
13575 * handle cipher encoding
13576 */
13577
13578 uint *tmp = (uint *) mymalloc (32);
13579
13580 char *cipherbuf_ptr = (char *) tmp;
13581
13582 for (uint i = 2016; i < cipherbuf_len; i += 2)
13583 {
13584 const char p0 = cipherbuf_pos[i + 0];
13585 const char p1 = cipherbuf_pos[i + 1];
13586
13587 *cipherbuf_ptr++ = hex_convert (p1) << 0
13588 | hex_convert (p0) << 4;
13589 }
13590
13591 // iv is stored at salt_buf 4 (length 16)
13592 // data is stored at salt_buf 8 (length 16)
13593
13594 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
13595 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
13596 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
13597 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
13598
13599 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
13600 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
13601 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
13602 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
13603
13604 free (tmp);
13605
13606 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
13607 {
13608 const char p0 = cipherbuf_pos[j + 0];
13609 const char p1 = cipherbuf_pos[j + 1];
13610
13611 agilekey->cipher[i] = hex_convert (p1) << 0
13612 | hex_convert (p0) << 4;
13613 }
13614
13615 /**
13616 * digest buf
13617 */
13618
13619 digest[0] = 0x10101010;
13620 digest[1] = 0x10101010;
13621 digest[2] = 0x10101010;
13622 digest[3] = 0x10101010;
13623
13624 return (PARSER_OK);
13625 }
13626
13627 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13628 {
13629 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
13630
13631 u32 *digest = (u32 *) hash_buf->digest;
13632
13633 salt_t *salt = hash_buf->salt;
13634
13635 char *hashbuf_pos = input_buf;
13636
13637 char *iterations_pos = strchr (hashbuf_pos, ':');
13638
13639 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13640
13641 uint hash_len = iterations_pos - hashbuf_pos;
13642
13643 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
13644
13645 iterations_pos++;
13646
13647 char *saltbuf_pos = strchr (iterations_pos, ':');
13648
13649 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13650
13651 uint iterations_len = saltbuf_pos - iterations_pos;
13652
13653 saltbuf_pos++;
13654
13655 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
13656
13657 if (salt_len > 32) return (PARSER_SALT_LENGTH);
13658
13659 char *salt_buf_ptr = (char *) salt->salt_buf;
13660
13661 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
13662
13663 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13664
13665 salt->salt_len = salt_len;
13666
13667 salt->salt_iter = atoi (iterations_pos) - 1;
13668
13669 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13670 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13671 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13672 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13673
13674 return (PARSER_OK);
13675 }
13676
13677 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13678 {
13679 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
13680
13681 u32 *digest = (u32 *) hash_buf->digest;
13682
13683 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13684 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13685 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13686 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13687 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13688 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13689 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13690 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13691
13692 digest[0] = byte_swap_32 (digest[0]);
13693 digest[1] = byte_swap_32 (digest[1]);
13694 digest[2] = byte_swap_32 (digest[2]);
13695 digest[3] = byte_swap_32 (digest[3]);
13696 digest[4] = byte_swap_32 (digest[4]);
13697 digest[5] = byte_swap_32 (digest[5]);
13698 digest[6] = byte_swap_32 (digest[6]);
13699 digest[7] = byte_swap_32 (digest[7]);
13700
13701 return (PARSER_OK);
13702 }
13703
13704 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13705 {
13706 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13707
13708 u32 *digest = (u32 *) hash_buf->digest;
13709
13710 salt_t *salt = hash_buf->salt;
13711
13712 char *salt_pos = input_buf + 3;
13713
13714 uint iterations_len = 0;
13715
13716 if (memcmp (salt_pos, "rounds=", 7) == 0)
13717 {
13718 salt_pos += 7;
13719
13720 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
13721
13722 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
13723 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
13724
13725 salt_pos[0] = 0x0;
13726
13727 salt->salt_iter = atoi (salt_pos - iterations_len);
13728
13729 salt_pos += 1;
13730
13731 iterations_len += 8;
13732 }
13733 else
13734 {
13735 salt->salt_iter = ROUNDS_SHA256CRYPT;
13736 }
13737
13738 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
13739
13740 char *hash_pos = strchr (salt_pos, '$');
13741
13742 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13743
13744 uint salt_len = hash_pos - salt_pos;
13745
13746 if (salt_len > 16) return (PARSER_SALT_LENGTH);
13747
13748 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13749
13750 salt->salt_len = salt_len;
13751
13752 hash_pos++;
13753
13754 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13755
13756 return (PARSER_OK);
13757 }
13758
13759 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13760 {
13761 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
13762
13763 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13764
13765 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
13766
13767 u64 *digest = (u64 *) hash_buf->digest;
13768
13769 salt_t *salt = hash_buf->salt;
13770
13771 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13772
13773 char *iter_pos = input_buf + 4;
13774
13775 char *salt_pos = strchr (iter_pos, '$');
13776
13777 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13778
13779 salt_pos++;
13780
13781 char *hash_pos = strchr (salt_pos, '$');
13782
13783 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13784
13785 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13786
13787 hash_pos++;
13788
13789 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13790 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13791 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13792 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13793 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13794 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13795 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13796 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13797
13798 uint salt_len = hash_pos - salt_pos - 1;
13799
13800 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
13801
13802 salt->salt_len = salt_len / 2;
13803
13804 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
13805 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
13806 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
13807 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
13808 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
13809 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
13810 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
13811 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
13812
13813 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
13814 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
13815 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
13816 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
13817 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
13818 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
13819 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
13820 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
13821 pbkdf2_sha512->salt_buf[8] = 0x01000000;
13822 pbkdf2_sha512->salt_buf[9] = 0x80;
13823
13824 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13825
13826 salt->salt_iter = atoi (iter_pos) - 1;
13827
13828 return (PARSER_OK);
13829 }
13830
13831 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13832 {
13833 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
13834
13835 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
13836
13837 u32 *digest = (u32 *) hash_buf->digest;
13838
13839 salt_t *salt = hash_buf->salt;
13840
13841 char *salt_pos = input_buf + 14;
13842
13843 char *hash_pos = strchr (salt_pos, '*');
13844
13845 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13846
13847 hash_pos++;
13848
13849 uint salt_len = hash_pos - salt_pos - 1;
13850
13851 char *salt_buf_ptr = (char *) salt->salt_buf;
13852
13853 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13854
13855 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13856
13857 salt->salt_len = salt_len;
13858
13859 u8 tmp_buf[100] = { 0 };
13860
13861 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
13862
13863 memcpy (digest, tmp_buf, 32);
13864
13865 digest[0] = byte_swap_32 (digest[0]);
13866 digest[1] = byte_swap_32 (digest[1]);
13867 digest[2] = byte_swap_32 (digest[2]);
13868 digest[3] = byte_swap_32 (digest[3]);
13869 digest[4] = byte_swap_32 (digest[4]);
13870 digest[5] = byte_swap_32 (digest[5]);
13871 digest[6] = byte_swap_32 (digest[6]);
13872 digest[7] = byte_swap_32 (digest[7]);
13873
13874 digest[0] -= SHA256M_A;
13875 digest[1] -= SHA256M_B;
13876 digest[2] -= SHA256M_C;
13877 digest[3] -= SHA256M_D;
13878 digest[4] -= SHA256M_E;
13879 digest[5] -= SHA256M_F;
13880 digest[6] -= SHA256M_G;
13881 digest[7] -= SHA256M_H;
13882
13883 return (PARSER_OK);
13884 }
13885
13886 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13887 {
13888 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13889
13890 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13891
13892 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13893
13894 u64 *digest = (u64 *) hash_buf->digest;
13895
13896 salt_t *salt = hash_buf->salt;
13897
13898 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13899
13900 char *iter_pos = input_buf + 19;
13901
13902 char *salt_pos = strchr (iter_pos, '.');
13903
13904 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13905
13906 salt_pos++;
13907
13908 char *hash_pos = strchr (salt_pos, '.');
13909
13910 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13911
13912 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13913
13914 hash_pos++;
13915
13916 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13917 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13918 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13919 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13920 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13921 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13922 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13923 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13924
13925 uint salt_len = hash_pos - salt_pos - 1;
13926
13927 salt_len /= 2;
13928
13929 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13930
13931 uint i;
13932
13933 for (i = 0; i < salt_len; i++)
13934 {
13935 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13936 }
13937
13938 salt_buf_ptr[salt_len + 3] = 0x01;
13939 salt_buf_ptr[salt_len + 4] = 0x80;
13940
13941 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13942
13943 salt->salt_len = salt_len;
13944
13945 salt->salt_iter = atoi (iter_pos) - 1;
13946
13947 return (PARSER_OK);
13948 }
13949
13950 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13951 {
13952 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13953
13954 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13955
13956 u64 *digest = (u64 *) hash_buf->digest;
13957
13958 salt_t *salt = hash_buf->salt;
13959
13960 u8 tmp_buf[120] = { 0 };
13961
13962 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13963
13964 if (tmp_len < 64) return (PARSER_HASH_LENGTH);
13965
13966 memcpy (digest, tmp_buf, 64);
13967
13968 digest[0] = byte_swap_64 (digest[0]);
13969 digest[1] = byte_swap_64 (digest[1]);
13970 digest[2] = byte_swap_64 (digest[2]);
13971 digest[3] = byte_swap_64 (digest[3]);
13972 digest[4] = byte_swap_64 (digest[4]);
13973 digest[5] = byte_swap_64 (digest[5]);
13974 digest[6] = byte_swap_64 (digest[6]);
13975 digest[7] = byte_swap_64 (digest[7]);
13976
13977 digest[0] -= SHA512M_A;
13978 digest[1] -= SHA512M_B;
13979 digest[2] -= SHA512M_C;
13980 digest[3] -= SHA512M_D;
13981 digest[4] -= SHA512M_E;
13982 digest[5] -= SHA512M_F;
13983 digest[6] -= SHA512M_G;
13984 digest[7] -= SHA512M_H;
13985
13986 int salt_len = tmp_len - 64;
13987
13988 if (salt_len < 0) return (PARSER_SALT_LENGTH);
13989
13990 salt->salt_len = salt_len;
13991
13992 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13993
13994 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13995 {
13996 char *ptr = (char *) salt->salt_buf;
13997
13998 ptr[salt->salt_len] = 0x80;
13999 }
14000
14001 return (PARSER_OK);
14002 }
14003
14004 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14005 {
14006 if (data.opts_type & OPTS_TYPE_ST_HEX)
14007 {
14008 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
14009 }
14010 else
14011 {
14012 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
14013 }
14014
14015 u32 *digest = (u32 *) hash_buf->digest;
14016
14017 salt_t *salt = hash_buf->salt;
14018
14019 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14020 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14021 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14022 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14023
14024 digest[0] = byte_swap_32 (digest[0]);
14025 digest[1] = byte_swap_32 (digest[1]);
14026 digest[2] = byte_swap_32 (digest[2]);
14027 digest[3] = byte_swap_32 (digest[3]);
14028
14029 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14030
14031 uint salt_len = input_len - 32 - 1;
14032
14033 char *salt_buf = input_buf + 32 + 1;
14034
14035 char *salt_buf_ptr = (char *) salt->salt_buf;
14036
14037 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14038
14039 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14040
14041 salt->salt_len = salt_len;
14042
14043 return (PARSER_OK);
14044 }
14045
14046 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14047 {
14048 if (data.opts_type & OPTS_TYPE_ST_HEX)
14049 {
14050 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
14051 }
14052 else
14053 {
14054 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
14055 }
14056
14057 u32 *digest = (u32 *) hash_buf->digest;
14058
14059 salt_t *salt = hash_buf->salt;
14060
14061 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14062 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14063 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14064 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14065 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14066
14067 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14068
14069 uint salt_len = input_len - 40 - 1;
14070
14071 char *salt_buf = input_buf + 40 + 1;
14072
14073 char *salt_buf_ptr = (char *) salt->salt_buf;
14074
14075 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14076
14077 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14078
14079 salt->salt_len = salt_len;
14080
14081 return (PARSER_OK);
14082 }
14083
14084 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14085 {
14086 if (data.opts_type & OPTS_TYPE_ST_HEX)
14087 {
14088 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
14089 }
14090 else
14091 {
14092 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
14093 }
14094
14095 u32 *digest = (u32 *) hash_buf->digest;
14096
14097 salt_t *salt = hash_buf->salt;
14098
14099 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14100 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14101 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14102 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14103 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14104 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
14105 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
14106 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
14107
14108 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14109
14110 uint salt_len = input_len - 64 - 1;
14111
14112 char *salt_buf = input_buf + 64 + 1;
14113
14114 char *salt_buf_ptr = (char *) salt->salt_buf;
14115
14116 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14117
14118 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14119
14120 salt->salt_len = salt_len;
14121
14122 return (PARSER_OK);
14123 }
14124
14125 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14126 {
14127 if (data.opts_type & OPTS_TYPE_ST_HEX)
14128 {
14129 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
14130 }
14131 else
14132 {
14133 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
14134 }
14135
14136 u64 *digest = (u64 *) hash_buf->digest;
14137
14138 salt_t *salt = hash_buf->salt;
14139
14140 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
14141 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
14142 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
14143 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
14144 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
14145 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
14146 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
14147 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
14148
14149 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14150
14151 uint salt_len = input_len - 128 - 1;
14152
14153 char *salt_buf = input_buf + 128 + 1;
14154
14155 char *salt_buf_ptr = (char *) salt->salt_buf;
14156
14157 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14158
14159 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14160
14161 salt->salt_len = salt_len;
14162
14163 return (PARSER_OK);
14164 }
14165
14166 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14167 {
14168 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
14169
14170 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
14171
14172 u32 *digest = (u32 *) hash_buf->digest;
14173
14174 salt_t *salt = hash_buf->salt;
14175
14176 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
14177
14178 /**
14179 * parse line
14180 */
14181
14182 char *user_pos = input_buf + 10 + 1;
14183
14184 char *realm_pos = strchr (user_pos, '$');
14185
14186 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14187
14188 uint user_len = realm_pos - user_pos;
14189
14190 if (user_len >= 64) return (PARSER_SALT_LENGTH);
14191
14192 realm_pos++;
14193
14194 char *salt_pos = strchr (realm_pos, '$');
14195
14196 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14197
14198 uint realm_len = salt_pos - realm_pos;
14199
14200 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
14201
14202 salt_pos++;
14203
14204 char *data_pos = strchr (salt_pos, '$');
14205
14206 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14207
14208 uint salt_len = data_pos - salt_pos;
14209
14210 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
14211
14212 data_pos++;
14213
14214 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
14215
14216 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
14217
14218 /**
14219 * copy data
14220 */
14221
14222 memcpy (krb5pa->user, user_pos, user_len);
14223 memcpy (krb5pa->realm, realm_pos, realm_len);
14224 memcpy (krb5pa->salt, salt_pos, salt_len);
14225
14226 char *timestamp_ptr = (char *) krb5pa->timestamp;
14227
14228 for (uint i = 0; i < (36 * 2); i += 2)
14229 {
14230 const char p0 = data_pos[i + 0];
14231 const char p1 = data_pos[i + 1];
14232
14233 *timestamp_ptr++ = hex_convert (p1) << 0
14234 | hex_convert (p0) << 4;
14235 }
14236
14237 char *checksum_ptr = (char *) krb5pa->checksum;
14238
14239 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
14240 {
14241 const char p0 = data_pos[i + 0];
14242 const char p1 = data_pos[i + 1];
14243
14244 *checksum_ptr++ = hex_convert (p1) << 0
14245 | hex_convert (p0) << 4;
14246 }
14247
14248 /**
14249 * copy some data to generic buffers to make sorting happy
14250 */
14251
14252 salt->salt_buf[0] = krb5pa->timestamp[0];
14253 salt->salt_buf[1] = krb5pa->timestamp[1];
14254 salt->salt_buf[2] = krb5pa->timestamp[2];
14255 salt->salt_buf[3] = krb5pa->timestamp[3];
14256 salt->salt_buf[4] = krb5pa->timestamp[4];
14257 salt->salt_buf[5] = krb5pa->timestamp[5];
14258 salt->salt_buf[6] = krb5pa->timestamp[6];
14259 salt->salt_buf[7] = krb5pa->timestamp[7];
14260 salt->salt_buf[8] = krb5pa->timestamp[8];
14261
14262 salt->salt_len = 36;
14263
14264 digest[0] = krb5pa->checksum[0];
14265 digest[1] = krb5pa->checksum[1];
14266 digest[2] = krb5pa->checksum[2];
14267 digest[3] = krb5pa->checksum[3];
14268
14269 return (PARSER_OK);
14270 }
14271
14272 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14273 {
14274 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
14275
14276 u32 *digest = (u32 *) hash_buf->digest;
14277
14278 salt_t *salt = hash_buf->salt;
14279
14280 /**
14281 * parse line
14282 */
14283
14284 char *salt_pos = input_buf;
14285
14286 char *hash_pos = strchr (salt_pos, '$');
14287
14288 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14289
14290 uint salt_len = hash_pos - salt_pos;
14291
14292 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14293
14294 hash_pos++;
14295
14296 uint hash_len = input_len - 1 - salt_len;
14297
14298 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14299
14300 /**
14301 * valid some data
14302 */
14303
14304 uint user_len = 0;
14305
14306 for (uint i = 0; i < salt_len; i++)
14307 {
14308 if (salt_pos[i] == ' ') continue;
14309
14310 user_len++;
14311 }
14312
14313 // SAP user names cannot be longer than 12 characters
14314 if (user_len > 12) return (PARSER_SALT_LENGTH);
14315
14316 // SAP user name cannot start with ! or ?
14317 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14318
14319 /**
14320 * copy data
14321 */
14322
14323 char *salt_buf_ptr = (char *) salt->salt_buf;
14324
14325 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14326
14327 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14328
14329 salt->salt_len = salt_len;
14330
14331 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
14332 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
14333 digest[2] = 0;
14334 digest[3] = 0;
14335
14336 digest[0] = byte_swap_32 (digest[0]);
14337 digest[1] = byte_swap_32 (digest[1]);
14338
14339 return (PARSER_OK);
14340 }
14341
14342 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14343 {
14344 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
14345
14346 u32 *digest = (u32 *) hash_buf->digest;
14347
14348 salt_t *salt = hash_buf->salt;
14349
14350 /**
14351 * parse line
14352 */
14353
14354 char *salt_pos = input_buf;
14355
14356 char *hash_pos = strchr (salt_pos, '$');
14357
14358 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14359
14360 uint salt_len = hash_pos - salt_pos;
14361
14362 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14363
14364 hash_pos++;
14365
14366 uint hash_len = input_len - 1 - salt_len;
14367
14368 if (hash_len != 40) return (PARSER_HASH_LENGTH);
14369
14370 /**
14371 * valid some data
14372 */
14373
14374 uint user_len = 0;
14375
14376 for (uint i = 0; i < salt_len; i++)
14377 {
14378 if (salt_pos[i] == ' ') continue;
14379
14380 user_len++;
14381 }
14382
14383 // SAP user names cannot be longer than 12 characters
14384 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
14385 // so far nobody complained so we stay with this because it helps in optimization
14386 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
14387
14388 if (user_len > 12) return (PARSER_SALT_LENGTH);
14389
14390 // SAP user name cannot start with ! or ?
14391 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14392
14393 /**
14394 * copy data
14395 */
14396
14397 char *salt_buf_ptr = (char *) salt->salt_buf;
14398
14399 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14400
14401 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14402
14403 salt->salt_len = salt_len;
14404
14405 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14406 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14407 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14408 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14409 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14410
14411 return (PARSER_OK);
14412 }
14413
14414 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14415 {
14416 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
14417
14418 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14419
14420 u64 *digest = (u64 *) hash_buf->digest;
14421
14422 salt_t *salt = hash_buf->salt;
14423
14424 char *iter_pos = input_buf + 3;
14425
14426 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
14427
14428 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
14429
14430 memcpy ((char *) salt->salt_sign, input_buf, 4);
14431
14432 salt->salt_iter = salt_iter;
14433
14434 char *salt_pos = iter_pos + 1;
14435
14436 uint salt_len = 8;
14437
14438 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
14439
14440 salt->salt_len = salt_len;
14441
14442 char *hash_pos = salt_pos + salt_len;
14443
14444 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14445
14446 // ugly hack start
14447
14448 char *tmp = (char *) salt->salt_buf_pc;
14449
14450 tmp[0] = hash_pos[42];
14451
14452 // ugly hack end
14453
14454 digest[ 0] = byte_swap_64 (digest[ 0]);
14455 digest[ 1] = byte_swap_64 (digest[ 1]);
14456 digest[ 2] = byte_swap_64 (digest[ 2]);
14457 digest[ 3] = byte_swap_64 (digest[ 3]);
14458 digest[ 4] = 0;
14459 digest[ 5] = 0;
14460 digest[ 6] = 0;
14461 digest[ 7] = 0;
14462
14463 return (PARSER_OK);
14464 }
14465
14466 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14467 {
14468 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
14469
14470 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14471
14472 u32 *digest = (u32 *) hash_buf->digest;
14473
14474 salt_t *salt = hash_buf->salt;
14475
14476 char *salt_buf = input_buf + 6;
14477
14478 uint salt_len = 16;
14479
14480 char *salt_buf_ptr = (char *) salt->salt_buf;
14481
14482 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14483
14484 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14485
14486 salt->salt_len = salt_len;
14487
14488 char *hash_pos = input_buf + 6 + 16;
14489
14490 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14491 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14492 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14493 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14494 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14495 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
14496 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
14497 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
14498
14499 return (PARSER_OK);
14500 }
14501
14502 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14503 {
14504 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
14505
14506 u32 *digest = (u32 *) hash_buf->digest;
14507
14508 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14509 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14510 digest[2] = 0;
14511 digest[3] = 0;
14512
14513 return (PARSER_OK);
14514 }
14515
14516 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14517 {
14518 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
14519
14520 u32 *digest = (u32 *) hash_buf->digest;
14521
14522 salt_t *salt = hash_buf->salt;
14523
14524 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
14525
14526 char *saltbuf_pos = input_buf;
14527
14528 char *hashbuf_pos = strchr (saltbuf_pos, ':');
14529
14530 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14531
14532 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
14533
14534 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
14535 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
14536
14537 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
14538
14539 hashbuf_pos++;
14540
14541 uint hashbuf_len = input_len - saltbuf_len - 1;
14542
14543 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
14544
14545 char *salt_ptr = (char *) saltbuf_pos;
14546 char *rakp_ptr = (char *) rakp->salt_buf;
14547
14548 uint i;
14549 uint j;
14550
14551 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
14552 {
14553 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
14554 }
14555
14556 rakp_ptr[j] = 0x80;
14557
14558 rakp->salt_len = j;
14559
14560 for (i = 0; i < 64; i++)
14561 {
14562 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
14563 }
14564
14565 salt->salt_buf[0] = rakp->salt_buf[0];
14566 salt->salt_buf[1] = rakp->salt_buf[1];
14567 salt->salt_buf[2] = rakp->salt_buf[2];
14568 salt->salt_buf[3] = rakp->salt_buf[3];
14569 salt->salt_buf[4] = rakp->salt_buf[4];
14570 salt->salt_buf[5] = rakp->salt_buf[5];
14571 salt->salt_buf[6] = rakp->salt_buf[6];
14572 salt->salt_buf[7] = rakp->salt_buf[7];
14573
14574 salt->salt_len = 32; // muss min. 32 haben
14575
14576 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14577 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14578 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14579 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14580 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14581
14582 return (PARSER_OK);
14583 }
14584
14585 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14586 {
14587 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
14588
14589 u32 *digest = (u32 *) hash_buf->digest;
14590
14591 salt_t *salt = hash_buf->salt;
14592
14593 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
14594
14595 char *salt_pos = input_buf + 1;
14596
14597 memcpy (salt->salt_buf, salt_pos, 8);
14598
14599 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14600 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14601
14602 salt->salt_len = 8;
14603
14604 char *hash_pos = salt_pos + 8;
14605
14606 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14607 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14608 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14609 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14610 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14611
14612 digest[0] -= SHA1M_A;
14613 digest[1] -= SHA1M_B;
14614 digest[2] -= SHA1M_C;
14615 digest[3] -= SHA1M_D;
14616 digest[4] -= SHA1M_E;
14617
14618 return (PARSER_OK);
14619 }
14620
14621 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14622 {
14623 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
14624
14625 u32 *digest = (u32 *) hash_buf->digest;
14626
14627 salt_t *salt = hash_buf->salt;
14628
14629 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14630 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14631 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14632 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14633
14634 digest[0] = byte_swap_32 (digest[0]);
14635 digest[1] = byte_swap_32 (digest[1]);
14636 digest[2] = byte_swap_32 (digest[2]);
14637 digest[3] = byte_swap_32 (digest[3]);
14638
14639 digest[0] -= MD5M_A;
14640 digest[1] -= MD5M_B;
14641 digest[2] -= MD5M_C;
14642 digest[3] -= MD5M_D;
14643
14644 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14645
14646 char *salt_buf_ptr = input_buf + 32 + 1;
14647
14648 u32 *salt_buf = salt->salt_buf;
14649
14650 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
14651 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
14652 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
14653 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
14654
14655 salt_buf[0] = byte_swap_32 (salt_buf[0]);
14656 salt_buf[1] = byte_swap_32 (salt_buf[1]);
14657 salt_buf[2] = byte_swap_32 (salt_buf[2]);
14658 salt_buf[3] = byte_swap_32 (salt_buf[3]);
14659
14660 salt->salt_len = 16 + 1;
14661
14662 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14663
14664 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
14665
14666 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
14667
14668 return (PARSER_OK);
14669 }
14670
14671 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14672 {
14673 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
14674
14675 u32 *digest = (u32 *) hash_buf->digest;
14676
14677 salt_t *salt = hash_buf->salt;
14678
14679 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
14680
14681 /**
14682 * parse line
14683 */
14684
14685 char *hashbuf_pos = input_buf;
14686
14687 char *saltbuf_pos = strchr (hashbuf_pos, ':');
14688
14689 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14690
14691 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
14692
14693 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
14694
14695 saltbuf_pos++;
14696
14697 char *iteration_pos = strchr (saltbuf_pos, ':');
14698
14699 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14700
14701 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14702
14703 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14704
14705 iteration_pos++;
14706
14707 char *databuf_pos = strchr (iteration_pos, ':');
14708
14709 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14710
14711 const uint iteration_len = databuf_pos - iteration_pos;
14712
14713 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14714 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
14715
14716 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
14717
14718 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
14719 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
14720
14721 databuf_pos++;
14722
14723 // digest
14724
14725 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14726 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14727 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14728 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14729 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14730 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
14731 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
14732 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
14733
14734 // salt
14735
14736 char *saltbuf_ptr = (char *) salt->salt_buf;
14737
14738 for (uint i = 0; i < saltbuf_len; i += 2)
14739 {
14740 const char p0 = saltbuf_pos[i + 0];
14741 const char p1 = saltbuf_pos[i + 1];
14742
14743 *saltbuf_ptr++ = hex_convert (p1) << 0
14744 | hex_convert (p0) << 4;
14745 }
14746
14747 salt->salt_buf[4] = 0x01000000;
14748 salt->salt_buf[5] = 0x80;
14749
14750 salt->salt_len = saltbuf_len / 2;
14751
14752 // iteration
14753
14754 salt->salt_iter = atoi (iteration_pos) - 1;
14755
14756 // data
14757
14758 char *databuf_ptr = (char *) cloudkey->data_buf;
14759
14760 for (uint i = 0; i < databuf_len; i += 2)
14761 {
14762 const char p0 = databuf_pos[i + 0];
14763 const char p1 = databuf_pos[i + 1];
14764
14765 *databuf_ptr++ = hex_convert (p1) << 0
14766 | hex_convert (p0) << 4;
14767 }
14768
14769 *databuf_ptr++ = 0x80;
14770
14771 for (uint i = 0; i < 512; i++)
14772 {
14773 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
14774 }
14775
14776 cloudkey->data_len = databuf_len / 2;
14777
14778 return (PARSER_OK);
14779 }
14780
14781 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14782 {
14783 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
14784
14785 u32 *digest = (u32 *) hash_buf->digest;
14786
14787 salt_t *salt = hash_buf->salt;
14788
14789 /**
14790 * parse line
14791 */
14792
14793 char *hashbuf_pos = input_buf;
14794
14795 char *domainbuf_pos = strchr (hashbuf_pos, ':');
14796
14797 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14798
14799 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
14800
14801 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
14802
14803 domainbuf_pos++;
14804
14805 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
14806
14807 char *saltbuf_pos = strchr (domainbuf_pos, ':');
14808
14809 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14810
14811 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
14812
14813 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
14814
14815 saltbuf_pos++;
14816
14817 char *iteration_pos = strchr (saltbuf_pos, ':');
14818
14819 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14820
14821 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14822
14823 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
14824
14825 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
14826
14827 iteration_pos++;
14828
14829 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
14830
14831 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14832 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
14833
14834 // ok, the plan for this algorithm is the following:
14835 // we have 2 salts here, the domain-name and a random salt
14836 // while both are used in the initial transformation,
14837 // only the random salt is used in the following iterations
14838 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
14839 // and one that includes only the real salt (stored into salt_buf[]).
14840 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
14841
14842 u8 tmp_buf[100] = { 0 };
14843
14844 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
14845
14846 memcpy (digest, tmp_buf, 20);
14847
14848 digest[0] = byte_swap_32 (digest[0]);
14849 digest[1] = byte_swap_32 (digest[1]);
14850 digest[2] = byte_swap_32 (digest[2]);
14851 digest[3] = byte_swap_32 (digest[3]);
14852 digest[4] = byte_swap_32 (digest[4]);
14853
14854 // domain
14855
14856 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14857
14858 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
14859
14860 char *len_ptr = NULL;
14861
14862 for (uint i = 0; i < domainbuf_len; i++)
14863 {
14864 if (salt_buf_pc_ptr[i] == '.')
14865 {
14866 len_ptr = &salt_buf_pc_ptr[i];
14867
14868 *len_ptr = 0;
14869 }
14870 else
14871 {
14872 *len_ptr += 1;
14873 }
14874 }
14875
14876 salt->salt_buf_pc[7] = domainbuf_len;
14877
14878 // "real" salt
14879
14880 char *salt_buf_ptr = (char *) salt->salt_buf;
14881
14882 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
14883
14884 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14885
14886 salt->salt_len = salt_len;
14887
14888 // iteration
14889
14890 salt->salt_iter = atoi (iteration_pos);
14891
14892 return (PARSER_OK);
14893 }
14894
14895 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14896 {
14897 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14898
14899 u32 *digest = (u32 *) hash_buf->digest;
14900
14901 salt_t *salt = hash_buf->salt;
14902
14903 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14904 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14905 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14906 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14907 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14908
14909 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14910
14911 uint salt_len = input_len - 40 - 1;
14912
14913 char *salt_buf = input_buf + 40 + 1;
14914
14915 char *salt_buf_ptr = (char *) salt->salt_buf;
14916
14917 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14918
14919 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14920
14921 salt->salt_len = salt_len;
14922
14923 return (PARSER_OK);
14924 }
14925
14926 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14927 {
14928 const u8 ascii_to_ebcdic[] =
14929 {
14930 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14931 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14932 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14933 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14934 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14935 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14936 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14937 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14938 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14939 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14940 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14941 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14942 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14943 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14944 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14945 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14946 };
14947
14948 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14949
14950 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14951
14952 u32 *digest = (u32 *) hash_buf->digest;
14953
14954 salt_t *salt = hash_buf->salt;
14955
14956 char *salt_pos = input_buf + 6 + 1;
14957
14958 char *digest_pos = strchr (salt_pos, '*');
14959
14960 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14961
14962 uint salt_len = digest_pos - salt_pos;
14963
14964 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14965
14966 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14967
14968 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14969
14970 digest_pos++;
14971
14972 char *salt_buf_ptr = (char *) salt->salt_buf;
14973 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14974
14975 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14976
14977 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14978
14979 salt->salt_len = salt_len;
14980
14981 for (uint i = 0; i < salt_len; i++)
14982 {
14983 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14984 }
14985 for (uint i = salt_len; i < 8; i++)
14986 {
14987 salt_buf_pc_ptr[i] = 0x40;
14988 }
14989
14990 uint tt;
14991
14992 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14993
14994 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14995 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14996
14997 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14998 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14999
15000 digest[0] = byte_swap_32 (digest[0]);
15001 digest[1] = byte_swap_32 (digest[1]);
15002
15003 IP (digest[0], digest[1], tt);
15004
15005 digest[0] = rotr32 (digest[0], 29);
15006 digest[1] = rotr32 (digest[1], 29);
15007 digest[2] = 0;
15008 digest[3] = 0;
15009
15010 return (PARSER_OK);
15011 }
15012
15013 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15014 {
15015 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
15016
15017 u32 *digest = (u32 *) hash_buf->digest;
15018
15019 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15020 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15021 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15022 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15023
15024 digest[0] = byte_swap_32 (digest[0]);
15025 digest[1] = byte_swap_32 (digest[1]);
15026 digest[2] = byte_swap_32 (digest[2]);
15027 digest[3] = byte_swap_32 (digest[3]);
15028
15029 return (PARSER_OK);
15030 }
15031
15032 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15033 {
15034 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
15035
15036 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
15037
15038 u32 *digest = (u32 *) hash_buf->digest;
15039
15040 salt_t *salt = hash_buf->salt;
15041
15042 u8 tmp_buf[120] = { 0 };
15043
15044 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
15045
15046 tmp_buf[3] += -4; // dont ask!
15047
15048 memcpy (salt->salt_buf, tmp_buf, 5);
15049
15050 salt->salt_len = 5;
15051
15052 memcpy (digest, tmp_buf + 5, 9);
15053
15054 // yes, only 9 byte are needed to crack, but 10 to display
15055
15056 salt->salt_buf_pc[7] = input_buf[20];
15057
15058 return (PARSER_OK);
15059 }
15060
15061 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15062 {
15063 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
15064
15065 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
15066
15067 u32 *digest = (u32 *) hash_buf->digest;
15068
15069 salt_t *salt = hash_buf->salt;
15070
15071 u8 tmp_buf[120] = { 0 };
15072
15073 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
15074
15075 tmp_buf[3] += -4; // dont ask!
15076
15077 // salt
15078
15079 memcpy (salt->salt_buf, tmp_buf, 16);
15080
15081 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)
15082
15083 // iteration
15084
15085 char tmp_iter_buf[11] = { 0 };
15086
15087 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
15088
15089 tmp_iter_buf[10] = 0;
15090
15091 salt->salt_iter = atoi (tmp_iter_buf);
15092
15093 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
15094 {
15095 return (PARSER_SALT_ITERATION);
15096 }
15097
15098 salt->salt_iter--; // first round in init
15099
15100 // 2 additional bytes for display only
15101
15102 salt->salt_buf_pc[0] = tmp_buf[26];
15103 salt->salt_buf_pc[1] = tmp_buf[27];
15104
15105 // digest
15106
15107 memcpy (digest, tmp_buf + 28, 8);
15108
15109 digest[0] = byte_swap_32 (digest[0]);
15110 digest[1] = byte_swap_32 (digest[1]);
15111 digest[2] = 0;
15112 digest[3] = 0;
15113
15114 return (PARSER_OK);
15115 }
15116
15117 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15118 {
15119 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
15120
15121 u32 *digest = (u32 *) hash_buf->digest;
15122
15123 salt_t *salt = hash_buf->salt;
15124
15125 char *salt_buf_pos = input_buf;
15126
15127 char *hash_buf_pos = salt_buf_pos + 6;
15128
15129 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
15130 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
15131 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
15132 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
15133 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
15134 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
15135 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
15136 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
15137
15138 digest[0] -= SHA256M_A;
15139 digest[1] -= SHA256M_B;
15140 digest[2] -= SHA256M_C;
15141 digest[3] -= SHA256M_D;
15142 digest[4] -= SHA256M_E;
15143 digest[5] -= SHA256M_F;
15144 digest[6] -= SHA256M_G;
15145 digest[7] -= SHA256M_H;
15146
15147 char *salt_buf_ptr = (char *) salt->salt_buf;
15148
15149 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
15150
15151 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15152
15153 salt->salt_len = salt_len;
15154
15155 return (PARSER_OK);
15156 }
15157
15158 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15159 {
15160 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
15161
15162 u32 *digest = (u32 *) hash_buf->digest;
15163
15164 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15165
15166 salt_t *salt = hash_buf->salt;
15167
15168 char *salt_buf = input_buf + 6;
15169
15170 char *digest_buf = strchr (salt_buf, '$');
15171
15172 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15173
15174 uint salt_len = digest_buf - salt_buf;
15175
15176 digest_buf++; // skip the '$' symbol
15177
15178 char *salt_buf_ptr = (char *) salt->salt_buf;
15179
15180 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15181
15182 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15183
15184 salt->salt_len = salt_len;
15185
15186 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15187 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15188 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15189 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15190
15191 digest[0] = byte_swap_32 (digest[0]);
15192 digest[1] = byte_swap_32 (digest[1]);
15193 digest[2] = byte_swap_32 (digest[2]);
15194 digest[3] = byte_swap_32 (digest[3]);
15195
15196 digest[0] -= MD5M_A;
15197 digest[1] -= MD5M_B;
15198 digest[2] -= MD5M_C;
15199 digest[3] -= MD5M_D;
15200
15201 return (PARSER_OK);
15202 }
15203
15204 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15205 {
15206 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
15207
15208 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15209
15210 u32 *digest = (u32 *) hash_buf->digest;
15211
15212 salt_t *salt = hash_buf->salt;
15213
15214 char *salt_buf = input_buf + 3;
15215
15216 char *digest_buf = strchr (salt_buf, '$');
15217
15218 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15219
15220 uint salt_len = digest_buf - salt_buf;
15221
15222 digest_buf++; // skip the '$' symbol
15223
15224 char *salt_buf_ptr = (char *) salt->salt_buf;
15225
15226 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15227
15228 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15229
15230 salt_buf_ptr[salt_len] = 0x2d;
15231
15232 salt->salt_len = salt_len + 1;
15233
15234 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15235 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15236 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15237 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15238
15239 digest[0] = byte_swap_32 (digest[0]);
15240 digest[1] = byte_swap_32 (digest[1]);
15241 digest[2] = byte_swap_32 (digest[2]);
15242 digest[3] = byte_swap_32 (digest[3]);
15243
15244 digest[0] -= MD5M_A;
15245 digest[1] -= MD5M_B;
15246 digest[2] -= MD5M_C;
15247 digest[3] -= MD5M_D;
15248
15249 return (PARSER_OK);
15250 }
15251
15252 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15253 {
15254 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
15255
15256 u32 *digest = (u32 *) hash_buf->digest;
15257
15258 salt_t *salt = hash_buf->salt;
15259
15260 u8 tmp_buf[100] = { 0 };
15261
15262 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
15263
15264 memcpy (digest, tmp_buf, 20);
15265
15266 digest[0] = byte_swap_32 (digest[0]);
15267 digest[1] = byte_swap_32 (digest[1]);
15268 digest[2] = byte_swap_32 (digest[2]);
15269 digest[3] = byte_swap_32 (digest[3]);
15270 digest[4] = byte_swap_32 (digest[4]);
15271
15272 digest[0] -= SHA1M_A;
15273 digest[1] -= SHA1M_B;
15274 digest[2] -= SHA1M_C;
15275 digest[3] -= SHA1M_D;
15276 digest[4] -= SHA1M_E;
15277
15278 salt->salt_buf[0] = 0x80;
15279
15280 salt->salt_len = 0;
15281
15282 return (PARSER_OK);
15283 }
15284
15285 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15286 {
15287 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
15288
15289 u32 *digest = (u32 *) hash_buf->digest;
15290
15291 salt_t *salt = hash_buf->salt;
15292
15293 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15294 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15295 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15296 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15297
15298 digest[0] = byte_swap_32 (digest[0]);
15299 digest[1] = byte_swap_32 (digest[1]);
15300 digest[2] = byte_swap_32 (digest[2]);
15301 digest[3] = byte_swap_32 (digest[3]);
15302
15303 digest[0] -= MD5M_A;
15304 digest[1] -= MD5M_B;
15305 digest[2] -= MD5M_C;
15306 digest[3] -= MD5M_D;
15307
15308 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15309
15310 uint salt_len = input_len - 32 - 1;
15311
15312 char *salt_buf = input_buf + 32 + 1;
15313
15314 char *salt_buf_ptr = (char *) salt->salt_buf;
15315
15316 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15317
15318 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15319
15320 /*
15321 * add static "salt" part
15322 */
15323
15324 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
15325
15326 salt_len += 8;
15327
15328 salt->salt_len = salt_len;
15329
15330 return (PARSER_OK);
15331 }
15332
15333 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15334 {
15335 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
15336
15337 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
15338
15339 u32 *digest = (u32 *) hash_buf->digest;
15340
15341 salt_t *salt = hash_buf->salt;
15342
15343 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
15344
15345 /**
15346 * parse line
15347 */
15348
15349 char *saltlen_pos = input_buf + 1 + 3 + 1;
15350
15351 char *saltbuf_pos = strchr (saltlen_pos, '$');
15352
15353 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15354
15355 uint saltlen_len = saltbuf_pos - saltlen_pos;
15356
15357 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
15358
15359 saltbuf_pos++;
15360
15361 char *keylen_pos = strchr (saltbuf_pos, '$');
15362
15363 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15364
15365 uint saltbuf_len = keylen_pos - saltbuf_pos;
15366
15367 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
15368
15369 keylen_pos++;
15370
15371 char *keybuf_pos = strchr (keylen_pos, '$');
15372
15373 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15374
15375 uint keylen_len = keybuf_pos - keylen_pos;
15376
15377 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
15378
15379 keybuf_pos++;
15380
15381 char *databuf_pos = strchr (keybuf_pos, '$');
15382
15383 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15384
15385 uint keybuf_len = databuf_pos - keybuf_pos;
15386
15387 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
15388
15389 databuf_pos++;
15390
15391 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
15392
15393 if (data_len != 3072) return (PARSER_SALT_LENGTH);
15394
15395 /**
15396 * copy data
15397 */
15398
15399 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
15400 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
15401 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
15402 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
15403
15404 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
15405 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
15406 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
15407 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
15408
15409 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15410 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15411 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15412 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15413
15414 salt->salt_len = 16;
15415 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
15416
15417 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
15418 {
15419 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
15420 }
15421
15422 return (PARSER_OK);
15423 }
15424
15425 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15426 {
15427 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
15428
15429 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15430
15431 u32 *digest = (u32 *) hash_buf->digest;
15432
15433 salt_t *salt = hash_buf->salt;
15434
15435 /**
15436 * parse line
15437 */
15438
15439 // first is the N salt parameter
15440
15441 char *N_pos = input_buf + 6;
15442
15443 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15444
15445 N_pos++;
15446
15447 salt->scrypt_N = atoi (N_pos);
15448
15449 // r
15450
15451 char *r_pos = strchr (N_pos, ':');
15452
15453 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15454
15455 r_pos++;
15456
15457 salt->scrypt_r = atoi (r_pos);
15458
15459 // p
15460
15461 char *p_pos = strchr (r_pos, ':');
15462
15463 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15464
15465 p_pos++;
15466
15467 salt->scrypt_p = atoi (p_pos);
15468
15469 // salt
15470
15471 char *saltbuf_pos = strchr (p_pos, ':');
15472
15473 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15474
15475 saltbuf_pos++;
15476
15477 char *hash_pos = strchr (saltbuf_pos, ':');
15478
15479 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15480
15481 hash_pos++;
15482
15483 // base64 decode
15484
15485 int salt_len_base64 = hash_pos - saltbuf_pos;
15486
15487 if (salt_len_base64 > 45) return (PARSER_SALT_LENGTH);
15488
15489 u8 tmp_buf[33] = { 0 };
15490
15491 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, salt_len_base64, tmp_buf);
15492
15493 char *salt_buf_ptr = (char *) salt->salt_buf;
15494
15495 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
15496
15497 salt->salt_len = tmp_len;
15498 salt->salt_iter = 1;
15499
15500 // digest - base64 decode
15501
15502 memset (tmp_buf, 0, sizeof (tmp_buf));
15503
15504 tmp_len = input_len - (hash_pos - input_buf);
15505
15506 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
15507
15508 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
15509
15510 memcpy (digest, tmp_buf, 32);
15511
15512 return (PARSER_OK);
15513 }
15514
15515 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15516 {
15517 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
15518
15519 u32 *digest = (u32 *) hash_buf->digest;
15520
15521 salt_t *salt = hash_buf->salt;
15522
15523 /**
15524 * parse line
15525 */
15526
15527 char decrypted[76] = { 0 }; // iv + hash
15528
15529 juniper_decrypt_hash (input_buf, decrypted);
15530
15531 char *md5crypt_hash = decrypted + 12;
15532
15533 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
15534
15535 salt->salt_iter = ROUNDS_MD5CRYPT;
15536
15537 char *salt_pos = md5crypt_hash + 3;
15538
15539 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
15540
15541 salt->salt_len = hash_pos - salt_pos; // should be 8
15542
15543 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
15544
15545 hash_pos++;
15546
15547 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
15548
15549 return (PARSER_OK);
15550 }
15551
15552 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15553 {
15554 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
15555
15556 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15557
15558 u32 *digest = (u32 *) hash_buf->digest;
15559
15560 salt_t *salt = hash_buf->salt;
15561
15562 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15563
15564 /**
15565 * parse line
15566 */
15567
15568 // first is *raw* salt
15569
15570 char *salt_pos = input_buf + 3;
15571
15572 char *hash_pos = strchr (salt_pos, '$');
15573
15574 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15575
15576 uint salt_len = hash_pos - salt_pos;
15577
15578 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15579
15580 hash_pos++;
15581
15582 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15583
15584 memcpy (salt_buf_ptr, salt_pos, 14);
15585
15586 salt_buf_ptr[17] = 0x01;
15587 salt_buf_ptr[18] = 0x80;
15588
15589 // add some stuff to normal salt to make sorted happy
15590
15591 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15592 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15593 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15594 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15595
15596 salt->salt_len = salt_len;
15597 salt->salt_iter = ROUNDS_CISCO8 - 1;
15598
15599 // base64 decode hash
15600
15601 u8 tmp_buf[100] = { 0 };
15602
15603 uint hash_len = input_len - 3 - salt_len - 1;
15604
15605 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15606
15607 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15608
15609 memcpy (digest, tmp_buf, 32);
15610
15611 digest[0] = byte_swap_32 (digest[0]);
15612 digest[1] = byte_swap_32 (digest[1]);
15613 digest[2] = byte_swap_32 (digest[2]);
15614 digest[3] = byte_swap_32 (digest[3]);
15615 digest[4] = byte_swap_32 (digest[4]);
15616 digest[5] = byte_swap_32 (digest[5]);
15617 digest[6] = byte_swap_32 (digest[6]);
15618 digest[7] = byte_swap_32 (digest[7]);
15619
15620 return (PARSER_OK);
15621 }
15622
15623 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15624 {
15625 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
15626
15627 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15628
15629 u32 *digest = (u32 *) hash_buf->digest;
15630
15631 salt_t *salt = hash_buf->salt;
15632
15633 /**
15634 * parse line
15635 */
15636
15637 // first is *raw* salt
15638
15639 char *salt_pos = input_buf + 3;
15640
15641 char *hash_pos = strchr (salt_pos, '$');
15642
15643 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15644
15645 uint salt_len = hash_pos - salt_pos;
15646
15647 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15648
15649 salt->salt_len = salt_len;
15650 hash_pos++;
15651
15652 char *salt_buf_ptr = (char *) salt->salt_buf;
15653
15654 memcpy (salt_buf_ptr, salt_pos, salt_len);
15655 salt_buf_ptr[salt_len] = 0;
15656
15657 // base64 decode hash
15658
15659 u8 tmp_buf[100] = { 0 };
15660
15661 uint hash_len = input_len - 3 - salt_len - 1;
15662
15663 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15664
15665 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15666
15667 memcpy (digest, tmp_buf, 32);
15668
15669 // fixed:
15670 salt->scrypt_N = 16384;
15671 salt->scrypt_r = 1;
15672 salt->scrypt_p = 1;
15673 salt->salt_iter = 1;
15674
15675 return (PARSER_OK);
15676 }
15677
15678 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15679 {
15680 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
15681
15682 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15683
15684 u32 *digest = (u32 *) hash_buf->digest;
15685
15686 salt_t *salt = hash_buf->salt;
15687
15688 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
15689
15690 /**
15691 * parse line
15692 */
15693
15694 char *version_pos = input_buf + 8 + 1;
15695
15696 char *verifierHashSize_pos = strchr (version_pos, '*');
15697
15698 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15699
15700 u32 version_len = verifierHashSize_pos - version_pos;
15701
15702 if (version_len != 4) return (PARSER_SALT_LENGTH);
15703
15704 verifierHashSize_pos++;
15705
15706 char *keySize_pos = strchr (verifierHashSize_pos, '*');
15707
15708 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15709
15710 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
15711
15712 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
15713
15714 keySize_pos++;
15715
15716 char *saltSize_pos = strchr (keySize_pos, '*');
15717
15718 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15719
15720 u32 keySize_len = saltSize_pos - keySize_pos;
15721
15722 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15723
15724 saltSize_pos++;
15725
15726 char *osalt_pos = strchr (saltSize_pos, '*');
15727
15728 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15729
15730 u32 saltSize_len = osalt_pos - saltSize_pos;
15731
15732 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15733
15734 osalt_pos++;
15735
15736 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15737
15738 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15739
15740 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15741
15742 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15743
15744 encryptedVerifier_pos++;
15745
15746 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15747
15748 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15749
15750 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15751
15752 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15753
15754 encryptedVerifierHash_pos++;
15755
15756 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;
15757
15758 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15759
15760 const uint version = atoi (version_pos);
15761
15762 if (version != 2007) return (PARSER_SALT_VALUE);
15763
15764 const uint verifierHashSize = atoi (verifierHashSize_pos);
15765
15766 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
15767
15768 const uint keySize = atoi (keySize_pos);
15769
15770 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
15771
15772 office2007->keySize = keySize;
15773
15774 const uint saltSize = atoi (saltSize_pos);
15775
15776 if (saltSize != 16) return (PARSER_SALT_VALUE);
15777
15778 /**
15779 * salt
15780 */
15781
15782 salt->salt_len = 16;
15783 salt->salt_iter = ROUNDS_OFFICE2007;
15784
15785 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15786 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15787 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15788 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15789
15790 /**
15791 * esalt
15792 */
15793
15794 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15795 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15796 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15797 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15798
15799 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15800 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15801 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15802 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15803 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15804
15805 /**
15806 * digest
15807 */
15808
15809 digest[0] = office2007->encryptedVerifierHash[0];
15810 digest[1] = office2007->encryptedVerifierHash[1];
15811 digest[2] = office2007->encryptedVerifierHash[2];
15812 digest[3] = office2007->encryptedVerifierHash[3];
15813
15814 return (PARSER_OK);
15815 }
15816
15817 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15818 {
15819 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
15820
15821 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15822
15823 u32 *digest = (u32 *) hash_buf->digest;
15824
15825 salt_t *salt = hash_buf->salt;
15826
15827 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
15828
15829 /**
15830 * parse line
15831 */
15832
15833 char *version_pos = input_buf + 8 + 1;
15834
15835 char *spinCount_pos = strchr (version_pos, '*');
15836
15837 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15838
15839 u32 version_len = spinCount_pos - version_pos;
15840
15841 if (version_len != 4) return (PARSER_SALT_LENGTH);
15842
15843 spinCount_pos++;
15844
15845 char *keySize_pos = strchr (spinCount_pos, '*');
15846
15847 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15848
15849 u32 spinCount_len = keySize_pos - spinCount_pos;
15850
15851 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15852
15853 keySize_pos++;
15854
15855 char *saltSize_pos = strchr (keySize_pos, '*');
15856
15857 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15858
15859 u32 keySize_len = saltSize_pos - keySize_pos;
15860
15861 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15862
15863 saltSize_pos++;
15864
15865 char *osalt_pos = strchr (saltSize_pos, '*');
15866
15867 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15868
15869 u32 saltSize_len = osalt_pos - saltSize_pos;
15870
15871 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15872
15873 osalt_pos++;
15874
15875 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15876
15877 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15878
15879 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15880
15881 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15882
15883 encryptedVerifier_pos++;
15884
15885 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15886
15887 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15888
15889 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15890
15891 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15892
15893 encryptedVerifierHash_pos++;
15894
15895 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;
15896
15897 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15898
15899 const uint version = atoi (version_pos);
15900
15901 if (version != 2010) return (PARSER_SALT_VALUE);
15902
15903 const uint spinCount = atoi (spinCount_pos);
15904
15905 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15906
15907 const uint keySize = atoi (keySize_pos);
15908
15909 if (keySize != 128) return (PARSER_SALT_VALUE);
15910
15911 const uint saltSize = atoi (saltSize_pos);
15912
15913 if (saltSize != 16) return (PARSER_SALT_VALUE);
15914
15915 /**
15916 * salt
15917 */
15918
15919 salt->salt_len = 16;
15920 salt->salt_iter = spinCount;
15921
15922 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15923 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15924 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15925 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15926
15927 /**
15928 * esalt
15929 */
15930
15931 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15932 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15933 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15934 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15935
15936 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15937 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15938 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15939 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15940 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15941 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15942 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15943 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15944
15945 /**
15946 * digest
15947 */
15948
15949 digest[0] = office2010->encryptedVerifierHash[0];
15950 digest[1] = office2010->encryptedVerifierHash[1];
15951 digest[2] = office2010->encryptedVerifierHash[2];
15952 digest[3] = office2010->encryptedVerifierHash[3];
15953
15954 return (PARSER_OK);
15955 }
15956
15957 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15958 {
15959 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15960
15961 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15962
15963 u32 *digest = (u32 *) hash_buf->digest;
15964
15965 salt_t *salt = hash_buf->salt;
15966
15967 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15968
15969 /**
15970 * parse line
15971 */
15972
15973 char *version_pos = input_buf + 8 + 1;
15974
15975 char *spinCount_pos = strchr (version_pos, '*');
15976
15977 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15978
15979 u32 version_len = spinCount_pos - version_pos;
15980
15981 if (version_len != 4) return (PARSER_SALT_LENGTH);
15982
15983 spinCount_pos++;
15984
15985 char *keySize_pos = strchr (spinCount_pos, '*');
15986
15987 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15988
15989 u32 spinCount_len = keySize_pos - spinCount_pos;
15990
15991 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15992
15993 keySize_pos++;
15994
15995 char *saltSize_pos = strchr (keySize_pos, '*');
15996
15997 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15998
15999 u32 keySize_len = saltSize_pos - keySize_pos;
16000
16001 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
16002
16003 saltSize_pos++;
16004
16005 char *osalt_pos = strchr (saltSize_pos, '*');
16006
16007 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16008
16009 u32 saltSize_len = osalt_pos - saltSize_pos;
16010
16011 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
16012
16013 osalt_pos++;
16014
16015 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16016
16017 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16018
16019 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16020
16021 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16022
16023 encryptedVerifier_pos++;
16024
16025 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16026
16027 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16028
16029 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16030
16031 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16032
16033 encryptedVerifierHash_pos++;
16034
16035 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;
16036
16037 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
16038
16039 const uint version = atoi (version_pos);
16040
16041 if (version != 2013) return (PARSER_SALT_VALUE);
16042
16043 const uint spinCount = atoi (spinCount_pos);
16044
16045 if (spinCount != 100000) return (PARSER_SALT_VALUE);
16046
16047 const uint keySize = atoi (keySize_pos);
16048
16049 if (keySize != 256) return (PARSER_SALT_VALUE);
16050
16051 const uint saltSize = atoi (saltSize_pos);
16052
16053 if (saltSize != 16) return (PARSER_SALT_VALUE);
16054
16055 /**
16056 * salt
16057 */
16058
16059 salt->salt_len = 16;
16060 salt->salt_iter = spinCount;
16061
16062 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16063 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16064 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16065 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16066
16067 /**
16068 * esalt
16069 */
16070
16071 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16072 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16073 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16074 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16075
16076 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16077 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16078 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16079 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16080 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16081 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
16082 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
16083 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
16084
16085 /**
16086 * digest
16087 */
16088
16089 digest[0] = office2013->encryptedVerifierHash[0];
16090 digest[1] = office2013->encryptedVerifierHash[1];
16091 digest[2] = office2013->encryptedVerifierHash[2];
16092 digest[3] = office2013->encryptedVerifierHash[3];
16093
16094 return (PARSER_OK);
16095 }
16096
16097 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16098 {
16099 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
16100
16101 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16102
16103 u32 *digest = (u32 *) hash_buf->digest;
16104
16105 salt_t *salt = hash_buf->salt;
16106
16107 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
16108
16109 /**
16110 * parse line
16111 */
16112
16113 char *version_pos = input_buf + 11;
16114
16115 char *osalt_pos = strchr (version_pos, '*');
16116
16117 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16118
16119 u32 version_len = osalt_pos - version_pos;
16120
16121 if (version_len != 1) return (PARSER_SALT_LENGTH);
16122
16123 osalt_pos++;
16124
16125 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16126
16127 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16128
16129 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16130
16131 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16132
16133 encryptedVerifier_pos++;
16134
16135 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16136
16137 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16138
16139 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16140
16141 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16142
16143 encryptedVerifierHash_pos++;
16144
16145 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16146
16147 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16148
16149 const uint version = *version_pos - 0x30;
16150
16151 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16152
16153 /**
16154 * esalt
16155 */
16156
16157 oldoffice01->version = version;
16158
16159 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16160 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16161 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16162 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16163
16164 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16165 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16166 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16167 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16168
16169 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16170 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16171 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16172 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16173
16174 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16175 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16176 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16177 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16178
16179 /**
16180 * salt
16181 */
16182
16183 salt->salt_len = 16;
16184
16185 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16186 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16187 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16188 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16189
16190 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16191 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16192 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16193 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16194
16195 // this is a workaround as office produces multiple documents with the same salt
16196
16197 salt->salt_len += 32;
16198
16199 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16200 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16201 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16202 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16203 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16204 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16205 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16206 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16207
16208 /**
16209 * digest
16210 */
16211
16212 digest[0] = oldoffice01->encryptedVerifierHash[0];
16213 digest[1] = oldoffice01->encryptedVerifierHash[1];
16214 digest[2] = oldoffice01->encryptedVerifierHash[2];
16215 digest[3] = oldoffice01->encryptedVerifierHash[3];
16216
16217 return (PARSER_OK);
16218 }
16219
16220 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16221 {
16222 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
16223 }
16224
16225 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16226 {
16227 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
16228
16229 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16230
16231 u32 *digest = (u32 *) hash_buf->digest;
16232
16233 salt_t *salt = hash_buf->salt;
16234
16235 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
16236
16237 /**
16238 * parse line
16239 */
16240
16241 char *version_pos = input_buf + 11;
16242
16243 char *osalt_pos = strchr (version_pos, '*');
16244
16245 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16246
16247 u32 version_len = osalt_pos - version_pos;
16248
16249 if (version_len != 1) return (PARSER_SALT_LENGTH);
16250
16251 osalt_pos++;
16252
16253 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16254
16255 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16256
16257 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16258
16259 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16260
16261 encryptedVerifier_pos++;
16262
16263 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16264
16265 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16266
16267 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16268
16269 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16270
16271 encryptedVerifierHash_pos++;
16272
16273 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16274
16275 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16276
16277 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16278
16279 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16280
16281 rc4key_pos++;
16282
16283 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16284
16285 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16286
16287 const uint version = *version_pos - 0x30;
16288
16289 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16290
16291 /**
16292 * esalt
16293 */
16294
16295 oldoffice01->version = version;
16296
16297 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16298 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16299 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16300 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16301
16302 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16303 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16304 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16305 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16306
16307 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16308 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16309 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16310 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16311
16312 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16313 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16314 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16315 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16316
16317 oldoffice01->rc4key[1] = 0;
16318 oldoffice01->rc4key[0] = 0;
16319
16320 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16321 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16322 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16323 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16324 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16325 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16326 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16327 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16328 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16329 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16330
16331 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
16332 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
16333
16334 /**
16335 * salt
16336 */
16337
16338 salt->salt_len = 16;
16339
16340 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16341 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16342 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16343 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16344
16345 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16346 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16347 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16348 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16349
16350 // this is a workaround as office produces multiple documents with the same salt
16351
16352 salt->salt_len += 32;
16353
16354 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16355 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16356 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16357 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16358 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16359 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16360 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16361 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16362
16363 /**
16364 * digest
16365 */
16366
16367 digest[0] = oldoffice01->rc4key[0];
16368 digest[1] = oldoffice01->rc4key[1];
16369 digest[2] = 0;
16370 digest[3] = 0;
16371
16372 return (PARSER_OK);
16373 }
16374
16375 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16376 {
16377 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
16378
16379 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16380
16381 u32 *digest = (u32 *) hash_buf->digest;
16382
16383 salt_t *salt = hash_buf->salt;
16384
16385 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16386
16387 /**
16388 * parse line
16389 */
16390
16391 char *version_pos = input_buf + 11;
16392
16393 char *osalt_pos = strchr (version_pos, '*');
16394
16395 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16396
16397 u32 version_len = osalt_pos - version_pos;
16398
16399 if (version_len != 1) return (PARSER_SALT_LENGTH);
16400
16401 osalt_pos++;
16402
16403 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16404
16405 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16406
16407 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16408
16409 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16410
16411 encryptedVerifier_pos++;
16412
16413 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16414
16415 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16416
16417 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16418
16419 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16420
16421 encryptedVerifierHash_pos++;
16422
16423 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16424
16425 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16426
16427 const uint version = *version_pos - 0x30;
16428
16429 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16430
16431 /**
16432 * esalt
16433 */
16434
16435 oldoffice34->version = version;
16436
16437 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16438 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16439 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16440 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16441
16442 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16443 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16444 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16445 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16446
16447 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16448 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16449 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16450 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16451 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16452
16453 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16454 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16455 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16456 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16457 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16458
16459 /**
16460 * salt
16461 */
16462
16463 salt->salt_len = 16;
16464
16465 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16466 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16467 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16468 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16469
16470 // this is a workaround as office produces multiple documents with the same salt
16471
16472 salt->salt_len += 32;
16473
16474 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16475 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16476 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16477 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16478 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16479 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16480 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16481 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16482
16483 /**
16484 * digest
16485 */
16486
16487 digest[0] = oldoffice34->encryptedVerifierHash[0];
16488 digest[1] = oldoffice34->encryptedVerifierHash[1];
16489 digest[2] = oldoffice34->encryptedVerifierHash[2];
16490 digest[3] = oldoffice34->encryptedVerifierHash[3];
16491
16492 return (PARSER_OK);
16493 }
16494
16495 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16496 {
16497 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16498
16499 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
16500 }
16501
16502 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16503 {
16504 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
16505
16506 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16507
16508 u32 *digest = (u32 *) hash_buf->digest;
16509
16510 salt_t *salt = hash_buf->salt;
16511
16512 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16513
16514 /**
16515 * parse line
16516 */
16517
16518 char *version_pos = input_buf + 11;
16519
16520 char *osalt_pos = strchr (version_pos, '*');
16521
16522 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16523
16524 u32 version_len = osalt_pos - version_pos;
16525
16526 if (version_len != 1) return (PARSER_SALT_LENGTH);
16527
16528 osalt_pos++;
16529
16530 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16531
16532 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16533
16534 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16535
16536 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16537
16538 encryptedVerifier_pos++;
16539
16540 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16541
16542 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16543
16544 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16545
16546 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16547
16548 encryptedVerifierHash_pos++;
16549
16550 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16551
16552 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16553
16554 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16555
16556 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16557
16558 rc4key_pos++;
16559
16560 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16561
16562 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16563
16564 const uint version = *version_pos - 0x30;
16565
16566 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16567
16568 /**
16569 * esalt
16570 */
16571
16572 oldoffice34->version = version;
16573
16574 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16575 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16576 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16577 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16578
16579 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16580 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16581 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16582 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16583
16584 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16585 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16586 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16587 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16588 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16589
16590 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16591 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16592 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16593 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16594 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16595
16596 oldoffice34->rc4key[1] = 0;
16597 oldoffice34->rc4key[0] = 0;
16598
16599 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16600 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16601 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16602 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16603 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16604 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16605 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16606 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16607 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16608 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16609
16610 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
16611 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
16612
16613 /**
16614 * salt
16615 */
16616
16617 salt->salt_len = 16;
16618
16619 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16620 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16621 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16622 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16623
16624 // this is a workaround as office produces multiple documents with the same salt
16625
16626 salt->salt_len += 32;
16627
16628 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16629 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16630 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16631 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16632 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16633 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16634 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16635 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16636
16637 /**
16638 * digest
16639 */
16640
16641 digest[0] = oldoffice34->rc4key[0];
16642 digest[1] = oldoffice34->rc4key[1];
16643 digest[2] = 0;
16644 digest[3] = 0;
16645
16646 return (PARSER_OK);
16647 }
16648
16649 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16650 {
16651 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
16652
16653 u32 *digest = (u32 *) hash_buf->digest;
16654
16655 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16656 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16657 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16658 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16659
16660 digest[0] = byte_swap_32 (digest[0]);
16661 digest[1] = byte_swap_32 (digest[1]);
16662 digest[2] = byte_swap_32 (digest[2]);
16663 digest[3] = byte_swap_32 (digest[3]);
16664
16665 return (PARSER_OK);
16666 }
16667
16668 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16669 {
16670 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
16671
16672 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16673
16674 u32 *digest = (u32 *) hash_buf->digest;
16675
16676 salt_t *salt = hash_buf->salt;
16677
16678 char *signature_pos = input_buf;
16679
16680 char *salt_pos = strchr (signature_pos, '$');
16681
16682 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16683
16684 u32 signature_len = salt_pos - signature_pos;
16685
16686 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
16687
16688 salt_pos++;
16689
16690 char *hash_pos = strchr (salt_pos, '$');
16691
16692 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16693
16694 u32 salt_len = hash_pos - salt_pos;
16695
16696 if (salt_len > 32) return (PARSER_SALT_LENGTH);
16697
16698 hash_pos++;
16699
16700 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
16701
16702 if (hash_len != 40) return (PARSER_SALT_LENGTH);
16703
16704 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
16705 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
16706 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
16707 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
16708 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
16709
16710 digest[0] -= SHA1M_A;
16711 digest[1] -= SHA1M_B;
16712 digest[2] -= SHA1M_C;
16713 digest[3] -= SHA1M_D;
16714 digest[4] -= SHA1M_E;
16715
16716 char *salt_buf_ptr = (char *) salt->salt_buf;
16717
16718 memcpy (salt_buf_ptr, salt_pos, salt_len);
16719
16720 salt->salt_len = salt_len;
16721
16722 return (PARSER_OK);
16723 }
16724
16725 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16726 {
16727 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
16728
16729 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
16730
16731 u32 *digest = (u32 *) hash_buf->digest;
16732
16733 salt_t *salt = hash_buf->salt;
16734
16735 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16736
16737 /**
16738 * parse line
16739 */
16740
16741 char *iter_pos = input_buf + 14;
16742
16743 const int iter = atoi (iter_pos);
16744
16745 if (iter < 1) return (PARSER_SALT_ITERATION);
16746
16747 salt->salt_iter = iter - 1;
16748
16749 char *salt_pos = strchr (iter_pos, '$');
16750
16751 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16752
16753 salt_pos++;
16754
16755 char *hash_pos = strchr (salt_pos, '$');
16756
16757 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16758
16759 const uint salt_len = hash_pos - salt_pos;
16760
16761 hash_pos++;
16762
16763 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16764
16765 memcpy (salt_buf_ptr, salt_pos, salt_len);
16766
16767 salt->salt_len = salt_len;
16768
16769 salt_buf_ptr[salt_len + 3] = 0x01;
16770 salt_buf_ptr[salt_len + 4] = 0x80;
16771
16772 // add some stuff to normal salt to make sorted happy
16773
16774 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16775 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16776 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16777 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16778 salt->salt_buf[4] = salt->salt_iter;
16779
16780 // base64 decode hash
16781
16782 u8 tmp_buf[100] = { 0 };
16783
16784 uint hash_len = input_len - (hash_pos - input_buf);
16785
16786 if (hash_len != 44) return (PARSER_HASH_LENGTH);
16787
16788 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16789
16790 memcpy (digest, tmp_buf, 32);
16791
16792 digest[0] = byte_swap_32 (digest[0]);
16793 digest[1] = byte_swap_32 (digest[1]);
16794 digest[2] = byte_swap_32 (digest[2]);
16795 digest[3] = byte_swap_32 (digest[3]);
16796 digest[4] = byte_swap_32 (digest[4]);
16797 digest[5] = byte_swap_32 (digest[5]);
16798 digest[6] = byte_swap_32 (digest[6]);
16799 digest[7] = byte_swap_32 (digest[7]);
16800
16801 return (PARSER_OK);
16802 }
16803
16804 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16805 {
16806 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
16807
16808 u32 *digest = (u32 *) hash_buf->digest;
16809
16810 salt_t *salt = hash_buf->salt;
16811
16812 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16813 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16814 digest[2] = 0;
16815 digest[3] = 0;
16816
16817 digest[0] = byte_swap_32 (digest[0]);
16818 digest[1] = byte_swap_32 (digest[1]);
16819
16820 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16821 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16822 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16823
16824 char iter_c = input_buf[17];
16825 char iter_d = input_buf[19];
16826
16827 // atm only defaults, let's see if there's more request
16828 if (iter_c != '2') return (PARSER_SALT_ITERATION);
16829 if (iter_d != '4') return (PARSER_SALT_ITERATION);
16830
16831 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
16832
16833 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
16834 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
16835 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
16836 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
16837
16838 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16839 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16840 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16841 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16842
16843 salt->salt_len = 16;
16844
16845 return (PARSER_OK);
16846 }
16847
16848 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16849 {
16850 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
16851
16852 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16853
16854 u32 *digest = (u32 *) hash_buf->digest;
16855
16856 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
16857
16858 salt_t *salt = hash_buf->salt;
16859
16860 char *salt_pos = input_buf + 10;
16861
16862 char *hash_pos = strchr (salt_pos, '$');
16863
16864 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16865
16866 uint salt_len = hash_pos - salt_pos;
16867
16868 hash_pos++;
16869
16870 uint hash_len = input_len - 10 - salt_len - 1;
16871
16872 // base64 decode salt
16873
16874 if (salt_len > 133) return (PARSER_SALT_LENGTH);
16875
16876 u8 tmp_buf[100] = { 0 };
16877
16878 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
16879
16880 if (salt_len > 55) return (PARSER_SALT_LENGTH);
16881
16882 tmp_buf[salt_len] = 0x80;
16883
16884 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
16885
16886 salt->salt_len = salt_len;
16887
16888 // base64 decode hash
16889
16890 if (hash_len > 133) return (PARSER_HASH_LENGTH);
16891
16892 memset (tmp_buf, 0, sizeof (tmp_buf));
16893
16894 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16895
16896 if (hash_len < 32 + 1) return (PARSER_SALT_LENGTH);
16897
16898 uint user_len = hash_len - 32;
16899
16900 const u8 *tmp_hash = tmp_buf + user_len;
16901
16902 user_len--; // skip the trailing space
16903
16904 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16905 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16906 digest[2] = hex_to_u32 (&tmp_hash[16]);
16907 digest[3] = hex_to_u32 (&tmp_hash[24]);
16908
16909 digest[0] = byte_swap_32 (digest[0]);
16910 digest[1] = byte_swap_32 (digest[1]);
16911 digest[2] = byte_swap_32 (digest[2]);
16912 digest[3] = byte_swap_32 (digest[3]);
16913
16914 // store username for host only (output hash if cracked)
16915
16916 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16917 memcpy (cram_md5->user, tmp_buf, user_len);
16918
16919 return (PARSER_OK);
16920 }
16921
16922 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16923 {
16924 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16925
16926 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16927
16928 u32 *digest = (u32 *) hash_buf->digest;
16929
16930 salt_t *salt = hash_buf->salt;
16931
16932 char *iter_pos = input_buf + 10;
16933
16934 u32 iter = atoi (iter_pos);
16935
16936 if (iter < 1)
16937 {
16938 return (PARSER_SALT_ITERATION);
16939 }
16940
16941 iter--; // first iteration is special
16942
16943 salt->salt_iter = iter;
16944
16945 char *base64_pos = strchr (iter_pos, '}');
16946
16947 if (base64_pos == NULL)
16948 {
16949 return (PARSER_SIGNATURE_UNMATCHED);
16950 }
16951
16952 base64_pos++;
16953
16954 // base64 decode salt
16955
16956 u32 base64_len = input_len - (base64_pos - input_buf);
16957
16958 u8 tmp_buf[100] = { 0 };
16959
16960 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16961
16962 if (decoded_len < 24)
16963 {
16964 return (PARSER_SALT_LENGTH);
16965 }
16966
16967 // copy the salt
16968
16969 uint salt_len = decoded_len - 20;
16970
16971 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16972 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16973
16974 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16975
16976 salt->salt_len = salt_len;
16977
16978 // set digest
16979
16980 u32 *digest_ptr = (u32*) tmp_buf;
16981
16982 digest[0] = byte_swap_32 (digest_ptr[0]);
16983 digest[1] = byte_swap_32 (digest_ptr[1]);
16984 digest[2] = byte_swap_32 (digest_ptr[2]);
16985 digest[3] = byte_swap_32 (digest_ptr[3]);
16986 digest[4] = byte_swap_32 (digest_ptr[4]);
16987
16988 return (PARSER_OK);
16989 }
16990
16991 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16992 {
16993 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16994
16995 u32 *digest = (u32 *) hash_buf->digest;
16996
16997 salt_t *salt = hash_buf->salt;
16998
16999 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17000 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17001 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17002 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17003 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
17004
17005 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17006
17007 uint salt_len = input_len - 40 - 1;
17008
17009 char *salt_buf = input_buf + 40 + 1;
17010
17011 char *salt_buf_ptr = (char *) salt->salt_buf;
17012
17013 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17014
17015 if (salt_len != 32) return (PARSER_SALT_LENGTH);
17016
17017 salt->salt_len = salt_len;
17018
17019 return (PARSER_OK);
17020 }
17021
17022 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17023 {
17024 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
17025
17026 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17027
17028 u32 *digest = (u32 *) hash_buf->digest;
17029
17030 salt_t *salt = hash_buf->salt;
17031
17032 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17033
17034 /**
17035 * parse line
17036 */
17037
17038 char *V_pos = input_buf + 5;
17039
17040 char *R_pos = strchr (V_pos, '*');
17041
17042 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17043
17044 u32 V_len = R_pos - V_pos;
17045
17046 R_pos++;
17047
17048 char *bits_pos = strchr (R_pos, '*');
17049
17050 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17051
17052 u32 R_len = bits_pos - R_pos;
17053
17054 bits_pos++;
17055
17056 char *P_pos = strchr (bits_pos, '*');
17057
17058 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17059
17060 u32 bits_len = P_pos - bits_pos;
17061
17062 P_pos++;
17063
17064 char *enc_md_pos = strchr (P_pos, '*');
17065
17066 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17067
17068 u32 P_len = enc_md_pos - P_pos;
17069
17070 enc_md_pos++;
17071
17072 char *id_len_pos = strchr (enc_md_pos, '*');
17073
17074 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17075
17076 u32 enc_md_len = id_len_pos - enc_md_pos;
17077
17078 id_len_pos++;
17079
17080 char *id_buf_pos = strchr (id_len_pos, '*');
17081
17082 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17083
17084 u32 id_len_len = id_buf_pos - id_len_pos;
17085
17086 id_buf_pos++;
17087
17088 char *u_len_pos = strchr (id_buf_pos, '*');
17089
17090 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17091
17092 u32 id_buf_len = u_len_pos - id_buf_pos;
17093
17094 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
17095
17096 u_len_pos++;
17097
17098 char *u_buf_pos = strchr (u_len_pos, '*');
17099
17100 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17101
17102 u32 u_len_len = u_buf_pos - u_len_pos;
17103
17104 u_buf_pos++;
17105
17106 char *o_len_pos = strchr (u_buf_pos, '*');
17107
17108 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17109
17110 u32 u_buf_len = o_len_pos - u_buf_pos;
17111
17112 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17113
17114 o_len_pos++;
17115
17116 char *o_buf_pos = strchr (o_len_pos, '*');
17117
17118 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17119
17120 u32 o_len_len = o_buf_pos - o_len_pos;
17121
17122 o_buf_pos++;
17123
17124 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;
17125
17126 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17127
17128 // validate data
17129
17130 const int V = atoi (V_pos);
17131 const int R = atoi (R_pos);
17132 const int P = atoi (P_pos);
17133
17134 if (V != 1) return (PARSER_SALT_VALUE);
17135 if (R != 2) return (PARSER_SALT_VALUE);
17136
17137 const int enc_md = atoi (enc_md_pos);
17138
17139 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17140
17141 const int id_len = atoi (id_len_pos);
17142 const int u_len = atoi (u_len_pos);
17143 const int o_len = atoi (o_len_pos);
17144
17145 if (id_len != 16) return (PARSER_SALT_VALUE);
17146 if (u_len != 32) return (PARSER_SALT_VALUE);
17147 if (o_len != 32) return (PARSER_SALT_VALUE);
17148
17149 const int bits = atoi (bits_pos);
17150
17151 if (bits != 40) return (PARSER_SALT_VALUE);
17152
17153 // copy data to esalt
17154
17155 pdf->V = V;
17156 pdf->R = R;
17157 pdf->P = P;
17158
17159 pdf->enc_md = enc_md;
17160
17161 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17162 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17163 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17164 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17165 pdf->id_len = id_len;
17166
17167 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17168 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17169 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17170 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17171 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17172 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17173 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17174 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17175 pdf->u_len = u_len;
17176
17177 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17178 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17179 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17180 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17181 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17182 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17183 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17184 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17185 pdf->o_len = o_len;
17186
17187 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17188 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17189 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17190 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17191
17192 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17193 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17194 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17195 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17196 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17197 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17198 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17199 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17200
17201 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17202 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17203 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17204 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17205 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17206 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17207 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17208 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17209
17210 // we use ID for salt, maybe needs to change, we will see...
17211
17212 salt->salt_buf[0] = pdf->id_buf[0];
17213 salt->salt_buf[1] = pdf->id_buf[1];
17214 salt->salt_buf[2] = pdf->id_buf[2];
17215 salt->salt_buf[3] = pdf->id_buf[3];
17216 salt->salt_len = pdf->id_len;
17217
17218 digest[0] = pdf->u_buf[0];
17219 digest[1] = pdf->u_buf[1];
17220 digest[2] = pdf->u_buf[2];
17221 digest[3] = pdf->u_buf[3];
17222
17223 return (PARSER_OK);
17224 }
17225
17226 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17227 {
17228 return pdf11_parse_hash (input_buf, input_len, hash_buf);
17229 }
17230
17231 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17232 {
17233 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
17234
17235 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17236
17237 u32 *digest = (u32 *) hash_buf->digest;
17238
17239 salt_t *salt = hash_buf->salt;
17240
17241 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17242
17243 /**
17244 * parse line
17245 */
17246
17247 char *V_pos = input_buf + 5;
17248
17249 char *R_pos = strchr (V_pos, '*');
17250
17251 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17252
17253 u32 V_len = R_pos - V_pos;
17254
17255 R_pos++;
17256
17257 char *bits_pos = strchr (R_pos, '*');
17258
17259 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17260
17261 u32 R_len = bits_pos - R_pos;
17262
17263 bits_pos++;
17264
17265 char *P_pos = strchr (bits_pos, '*');
17266
17267 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17268
17269 u32 bits_len = P_pos - bits_pos;
17270
17271 P_pos++;
17272
17273 char *enc_md_pos = strchr (P_pos, '*');
17274
17275 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17276
17277 u32 P_len = enc_md_pos - P_pos;
17278
17279 enc_md_pos++;
17280
17281 char *id_len_pos = strchr (enc_md_pos, '*');
17282
17283 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17284
17285 u32 enc_md_len = id_len_pos - enc_md_pos;
17286
17287 id_len_pos++;
17288
17289 char *id_buf_pos = strchr (id_len_pos, '*');
17290
17291 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17292
17293 u32 id_len_len = id_buf_pos - id_len_pos;
17294
17295 id_buf_pos++;
17296
17297 char *u_len_pos = strchr (id_buf_pos, '*');
17298
17299 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17300
17301 u32 id_buf_len = u_len_pos - id_buf_pos;
17302
17303 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
17304
17305 u_len_pos++;
17306
17307 char *u_buf_pos = strchr (u_len_pos, '*');
17308
17309 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17310
17311 u32 u_len_len = u_buf_pos - u_len_pos;
17312
17313 u_buf_pos++;
17314
17315 char *o_len_pos = strchr (u_buf_pos, '*');
17316
17317 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17318
17319 u32 u_buf_len = o_len_pos - u_buf_pos;
17320
17321 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17322
17323 o_len_pos++;
17324
17325 char *o_buf_pos = strchr (o_len_pos, '*');
17326
17327 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17328
17329 u32 o_len_len = o_buf_pos - o_len_pos;
17330
17331 o_buf_pos++;
17332
17333 char *rc4key_pos = strchr (o_buf_pos, ':');
17334
17335 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17336
17337 u32 o_buf_len = rc4key_pos - o_buf_pos;
17338
17339 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17340
17341 rc4key_pos++;
17342
17343 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;
17344
17345 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
17346
17347 // validate data
17348
17349 const int V = atoi (V_pos);
17350 const int R = atoi (R_pos);
17351 const int P = atoi (P_pos);
17352
17353 if (V != 1) return (PARSER_SALT_VALUE);
17354 if (R != 2) return (PARSER_SALT_VALUE);
17355
17356 const int enc_md = atoi (enc_md_pos);
17357
17358 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17359
17360 const int id_len = atoi (id_len_pos);
17361 const int u_len = atoi (u_len_pos);
17362 const int o_len = atoi (o_len_pos);
17363
17364 if (id_len != 16) return (PARSER_SALT_VALUE);
17365 if (u_len != 32) return (PARSER_SALT_VALUE);
17366 if (o_len != 32) return (PARSER_SALT_VALUE);
17367
17368 const int bits = atoi (bits_pos);
17369
17370 if (bits != 40) return (PARSER_SALT_VALUE);
17371
17372 // copy data to esalt
17373
17374 pdf->V = V;
17375 pdf->R = R;
17376 pdf->P = P;
17377
17378 pdf->enc_md = enc_md;
17379
17380 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17381 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17382 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17383 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17384 pdf->id_len = id_len;
17385
17386 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17387 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17388 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17389 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17390 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17391 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17392 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17393 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17394 pdf->u_len = u_len;
17395
17396 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17397 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17398 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17399 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17400 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17401 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17402 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17403 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17404 pdf->o_len = o_len;
17405
17406 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17407 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17408 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17409 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17410
17411 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17412 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17413 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17414 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17415 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17416 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17417 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17418 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17419
17420 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17421 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17422 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17423 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17424 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17425 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17426 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17427 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17428
17429 pdf->rc4key[1] = 0;
17430 pdf->rc4key[0] = 0;
17431
17432 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
17433 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
17434 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
17435 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
17436 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
17437 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
17438 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
17439 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
17440 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
17441 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
17442
17443 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
17444 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
17445
17446 // we use ID for salt, maybe needs to change, we will see...
17447
17448 salt->salt_buf[0] = pdf->id_buf[0];
17449 salt->salt_buf[1] = pdf->id_buf[1];
17450 salt->salt_buf[2] = pdf->id_buf[2];
17451 salt->salt_buf[3] = pdf->id_buf[3];
17452 salt->salt_buf[4] = pdf->u_buf[0];
17453 salt->salt_buf[5] = pdf->u_buf[1];
17454 salt->salt_buf[6] = pdf->o_buf[0];
17455 salt->salt_buf[7] = pdf->o_buf[1];
17456 salt->salt_len = pdf->id_len + 16;
17457
17458 digest[0] = pdf->rc4key[0];
17459 digest[1] = pdf->rc4key[1];
17460 digest[2] = 0;
17461 digest[3] = 0;
17462
17463 return (PARSER_OK);
17464 }
17465
17466 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17467 {
17468 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
17469
17470 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17471
17472 u32 *digest = (u32 *) hash_buf->digest;
17473
17474 salt_t *salt = hash_buf->salt;
17475
17476 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17477
17478 /**
17479 * parse line
17480 */
17481
17482 char *V_pos = input_buf + 5;
17483
17484 char *R_pos = strchr (V_pos, '*');
17485
17486 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17487
17488 u32 V_len = R_pos - V_pos;
17489
17490 R_pos++;
17491
17492 char *bits_pos = strchr (R_pos, '*');
17493
17494 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17495
17496 u32 R_len = bits_pos - R_pos;
17497
17498 bits_pos++;
17499
17500 char *P_pos = strchr (bits_pos, '*');
17501
17502 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17503
17504 u32 bits_len = P_pos - bits_pos;
17505
17506 P_pos++;
17507
17508 char *enc_md_pos = strchr (P_pos, '*');
17509
17510 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17511
17512 u32 P_len = enc_md_pos - P_pos;
17513
17514 enc_md_pos++;
17515
17516 char *id_len_pos = strchr (enc_md_pos, '*');
17517
17518 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17519
17520 u32 enc_md_len = id_len_pos - enc_md_pos;
17521
17522 id_len_pos++;
17523
17524 char *id_buf_pos = strchr (id_len_pos, '*');
17525
17526 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17527
17528 u32 id_len_len = id_buf_pos - id_len_pos;
17529
17530 id_buf_pos++;
17531
17532 char *u_len_pos = strchr (id_buf_pos, '*');
17533
17534 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17535
17536 u32 id_buf_len = u_len_pos - id_buf_pos;
17537
17538 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
17539
17540 u_len_pos++;
17541
17542 char *u_buf_pos = strchr (u_len_pos, '*');
17543
17544 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17545
17546 u32 u_len_len = u_buf_pos - u_len_pos;
17547
17548 u_buf_pos++;
17549
17550 char *o_len_pos = strchr (u_buf_pos, '*');
17551
17552 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17553
17554 u32 u_buf_len = o_len_pos - u_buf_pos;
17555
17556 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17557
17558 o_len_pos++;
17559
17560 char *o_buf_pos = strchr (o_len_pos, '*');
17561
17562 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17563
17564 u32 o_len_len = o_buf_pos - o_len_pos;
17565
17566 o_buf_pos++;
17567
17568 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;
17569
17570 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17571
17572 // validate data
17573
17574 const int V = atoi (V_pos);
17575 const int R = atoi (R_pos);
17576 const int P = atoi (P_pos);
17577
17578 int vr_ok = 0;
17579
17580 if ((V == 2) && (R == 3)) vr_ok = 1;
17581 if ((V == 4) && (R == 4)) vr_ok = 1;
17582
17583 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17584
17585 const int id_len = atoi (id_len_pos);
17586 const int u_len = atoi (u_len_pos);
17587 const int o_len = atoi (o_len_pos);
17588
17589 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
17590
17591 if (u_len != 32) return (PARSER_SALT_VALUE);
17592 if (o_len != 32) return (PARSER_SALT_VALUE);
17593
17594 const int bits = atoi (bits_pos);
17595
17596 if (bits != 128) return (PARSER_SALT_VALUE);
17597
17598 int enc_md = 1;
17599
17600 if (R >= 4)
17601 {
17602 enc_md = atoi (enc_md_pos);
17603 }
17604
17605 // copy data to esalt
17606
17607 pdf->V = V;
17608 pdf->R = R;
17609 pdf->P = P;
17610
17611 pdf->enc_md = enc_md;
17612
17613 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17614 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17615 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17616 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17617
17618 if (id_len == 32)
17619 {
17620 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
17621 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
17622 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
17623 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
17624 }
17625
17626 pdf->id_len = id_len;
17627
17628 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17629 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17630 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17631 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17632 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17633 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17634 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17635 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17636 pdf->u_len = u_len;
17637
17638 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17639 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17640 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17641 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17642 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17643 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17644 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17645 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17646 pdf->o_len = o_len;
17647
17648 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17649 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17650 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17651 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17652
17653 if (id_len == 32)
17654 {
17655 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
17656 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
17657 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
17658 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
17659 }
17660
17661 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17662 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17663 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17664 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17665 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17666 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17667 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17668 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17669
17670 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17671 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17672 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17673 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17674 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17675 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17676 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17677 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17678
17679 // precompute rc4 data for later use
17680
17681 uint padding[8] =
17682 {
17683 0x5e4ebf28,
17684 0x418a754e,
17685 0x564e0064,
17686 0x0801faff,
17687 0xb6002e2e,
17688 0x803e68d0,
17689 0xfea90c2f,
17690 0x7a695364
17691 };
17692
17693 // md5
17694
17695 uint salt_pc_block[32] = { 0 };
17696
17697 char *salt_pc_ptr = (char *) salt_pc_block;
17698
17699 memcpy (salt_pc_ptr, padding, 32);
17700 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
17701
17702 uint salt_pc_digest[4] = { 0 };
17703
17704 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
17705
17706 pdf->rc4data[0] = salt_pc_digest[0];
17707 pdf->rc4data[1] = salt_pc_digest[1];
17708
17709 // we use ID for salt, maybe needs to change, we will see...
17710
17711 salt->salt_buf[0] = pdf->id_buf[0];
17712 salt->salt_buf[1] = pdf->id_buf[1];
17713 salt->salt_buf[2] = pdf->id_buf[2];
17714 salt->salt_buf[3] = pdf->id_buf[3];
17715 salt->salt_buf[4] = pdf->u_buf[0];
17716 salt->salt_buf[5] = pdf->u_buf[1];
17717 salt->salt_buf[6] = pdf->o_buf[0];
17718 salt->salt_buf[7] = pdf->o_buf[1];
17719 salt->salt_len = pdf->id_len + 16;
17720
17721 salt->salt_iter = ROUNDS_PDF14;
17722
17723 digest[0] = pdf->u_buf[0];
17724 digest[1] = pdf->u_buf[1];
17725 digest[2] = 0;
17726 digest[3] = 0;
17727
17728 return (PARSER_OK);
17729 }
17730
17731 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17732 {
17733 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
17734
17735 if (ret != PARSER_OK)
17736 {
17737 return ret;
17738 }
17739
17740 u32 *digest = (u32 *) hash_buf->digest;
17741
17742 salt_t *salt = hash_buf->salt;
17743
17744 digest[0] -= SHA256M_A;
17745 digest[1] -= SHA256M_B;
17746 digest[2] -= SHA256M_C;
17747 digest[3] -= SHA256M_D;
17748 digest[4] -= SHA256M_E;
17749 digest[5] -= SHA256M_F;
17750 digest[6] -= SHA256M_G;
17751 digest[7] -= SHA256M_H;
17752
17753 salt->salt_buf[2] = 0x80;
17754
17755 return (PARSER_OK);
17756 }
17757
17758 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17759 {
17760 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
17761
17762 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17763
17764 u32 *digest = (u32 *) hash_buf->digest;
17765
17766 salt_t *salt = hash_buf->salt;
17767
17768 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17769
17770 /**
17771 * parse line
17772 */
17773
17774 char *V_pos = input_buf + 5;
17775
17776 char *R_pos = strchr (V_pos, '*');
17777
17778 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17779
17780 u32 V_len = R_pos - V_pos;
17781
17782 R_pos++;
17783
17784 char *bits_pos = strchr (R_pos, '*');
17785
17786 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17787
17788 u32 R_len = bits_pos - R_pos;
17789
17790 bits_pos++;
17791
17792 char *P_pos = strchr (bits_pos, '*');
17793
17794 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17795
17796 u32 bits_len = P_pos - bits_pos;
17797
17798 P_pos++;
17799
17800 char *enc_md_pos = strchr (P_pos, '*');
17801
17802 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17803
17804 u32 P_len = enc_md_pos - P_pos;
17805
17806 enc_md_pos++;
17807
17808 char *id_len_pos = strchr (enc_md_pos, '*');
17809
17810 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17811
17812 u32 enc_md_len = id_len_pos - enc_md_pos;
17813
17814 id_len_pos++;
17815
17816 char *id_buf_pos = strchr (id_len_pos, '*');
17817
17818 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17819
17820 u32 id_len_len = id_buf_pos - id_len_pos;
17821
17822 id_buf_pos++;
17823
17824 char *u_len_pos = strchr (id_buf_pos, '*');
17825
17826 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17827
17828 u32 id_buf_len = u_len_pos - id_buf_pos;
17829
17830 u_len_pos++;
17831
17832 char *u_buf_pos = strchr (u_len_pos, '*');
17833
17834 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17835
17836 u32 u_len_len = u_buf_pos - u_len_pos;
17837
17838 u_buf_pos++;
17839
17840 char *o_len_pos = strchr (u_buf_pos, '*');
17841
17842 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17843
17844 u32 u_buf_len = o_len_pos - u_buf_pos;
17845
17846 o_len_pos++;
17847
17848 char *o_buf_pos = strchr (o_len_pos, '*');
17849
17850 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17851
17852 u32 o_len_len = o_buf_pos - o_len_pos;
17853
17854 o_buf_pos++;
17855
17856 char *last = strchr (o_buf_pos, '*');
17857
17858 if (last == NULL) last = input_buf + input_len;
17859
17860 u32 o_buf_len = last - o_buf_pos;
17861
17862 // validate data
17863
17864 const int V = atoi (V_pos);
17865 const int R = atoi (R_pos);
17866
17867 int vr_ok = 0;
17868
17869 if ((V == 5) && (R == 5)) vr_ok = 1;
17870 if ((V == 5) && (R == 6)) vr_ok = 1;
17871
17872 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17873
17874 const int bits = atoi (bits_pos);
17875
17876 if (bits != 256) return (PARSER_SALT_VALUE);
17877
17878 int enc_md = atoi (enc_md_pos);
17879
17880 if (enc_md != 1) return (PARSER_SALT_VALUE);
17881
17882 const uint id_len = atoi (id_len_pos);
17883 const uint u_len = atoi (u_len_pos);
17884 const uint o_len = atoi (o_len_pos);
17885
17886 if (V_len > 6) return (PARSER_SALT_LENGTH);
17887 if (R_len > 6) return (PARSER_SALT_LENGTH);
17888 if (P_len > 6) return (PARSER_SALT_LENGTH);
17889 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
17890 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
17891 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
17892 if (bits_len > 6) return (PARSER_SALT_LENGTH);
17893 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17894
17895 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17896 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17897 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17898
17899 // copy data to esalt
17900
17901 if (u_len < 40) return (PARSER_SALT_VALUE);
17902
17903 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17904 {
17905 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17906 }
17907
17908 salt->salt_buf[0] = pdf->u_buf[8];
17909 salt->salt_buf[1] = pdf->u_buf[9];
17910
17911 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17912 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17913
17914 salt->salt_len = 8;
17915 salt->salt_iter = ROUNDS_PDF17L8;
17916
17917 digest[0] = pdf->u_buf[0];
17918 digest[1] = pdf->u_buf[1];
17919 digest[2] = pdf->u_buf[2];
17920 digest[3] = pdf->u_buf[3];
17921 digest[4] = pdf->u_buf[4];
17922 digest[5] = pdf->u_buf[5];
17923 digest[6] = pdf->u_buf[6];
17924 digest[7] = pdf->u_buf[7];
17925
17926 return (PARSER_OK);
17927 }
17928
17929 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17930 {
17931 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17932
17933 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17934
17935 u32 *digest = (u32 *) hash_buf->digest;
17936
17937 salt_t *salt = hash_buf->salt;
17938
17939 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17940
17941 /**
17942 * parse line
17943 */
17944
17945 // iterations
17946
17947 char *iter_pos = input_buf + 7;
17948
17949 u32 iter = atoi (iter_pos);
17950
17951 if (iter < 1) return (PARSER_SALT_ITERATION);
17952 if (iter > 999999) return (PARSER_SALT_ITERATION);
17953
17954 // first is *raw* salt
17955
17956 char *salt_pos = strchr (iter_pos, ':');
17957
17958 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17959
17960 salt_pos++;
17961
17962 char *hash_pos = strchr (salt_pos, ':');
17963
17964 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17965
17966 u32 salt_len = hash_pos - salt_pos;
17967
17968 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17969
17970 hash_pos++;
17971
17972 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17973
17974 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17975
17976 // decode salt
17977
17978 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17979
17980 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17981
17982 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17983
17984 salt_buf_ptr[salt_len + 3] = 0x01;
17985 salt_buf_ptr[salt_len + 4] = 0x80;
17986
17987 salt->salt_len = salt_len;
17988 salt->salt_iter = iter - 1;
17989
17990 // decode hash
17991
17992 u8 tmp_buf[100] = { 0 };
17993
17994 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17995
17996 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17997
17998 memcpy (digest, tmp_buf, 16);
17999
18000 digest[0] = byte_swap_32 (digest[0]);
18001 digest[1] = byte_swap_32 (digest[1]);
18002 digest[2] = byte_swap_32 (digest[2]);
18003 digest[3] = byte_swap_32 (digest[3]);
18004
18005 // add some stuff to normal salt to make sorted happy
18006
18007 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
18008 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
18009 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
18010 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
18011 salt->salt_buf[4] = salt->salt_iter;
18012
18013 return (PARSER_OK);
18014 }
18015
18016 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18017 {
18018 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
18019
18020 u32 *digest = (u32 *) hash_buf->digest;
18021
18022 salt_t *salt = hash_buf->salt;
18023
18024 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18025 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18026 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18027 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18028
18029 digest[0] = byte_swap_32 (digest[0]);
18030 digest[1] = byte_swap_32 (digest[1]);
18031 digest[2] = byte_swap_32 (digest[2]);
18032 digest[3] = byte_swap_32 (digest[3]);
18033
18034 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18035
18036 uint salt_len = input_len - 32 - 1;
18037
18038 char *salt_buf = input_buf + 32 + 1;
18039
18040 char *salt_buf_ptr = (char *) salt->salt_buf;
18041
18042 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18043
18044 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18045
18046 salt->salt_len = salt_len;
18047
18048 return (PARSER_OK);
18049 }
18050
18051 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18052 {
18053 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
18054
18055 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18056
18057 u32 *digest = (u32 *) hash_buf->digest;
18058
18059 salt_t *salt = hash_buf->salt;
18060
18061 char *user_pos = input_buf + 10;
18062
18063 char *salt_pos = strchr (user_pos, '*');
18064
18065 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18066
18067 salt_pos++;
18068
18069 char *hash_pos = strchr (salt_pos, '*');
18070
18071 hash_pos++;
18072
18073 uint hash_len = input_len - (hash_pos - input_buf);
18074
18075 if (hash_len != 32) return (PARSER_HASH_LENGTH);
18076
18077 uint user_len = salt_pos - user_pos - 1;
18078
18079 uint salt_len = hash_pos - salt_pos - 1;
18080
18081 if (salt_len != 8) return (PARSER_SALT_LENGTH);
18082
18083 /*
18084 * store digest
18085 */
18086
18087 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18088 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18089 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18090 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18091
18092 digest[0] = byte_swap_32 (digest[0]);
18093 digest[1] = byte_swap_32 (digest[1]);
18094 digest[2] = byte_swap_32 (digest[2]);
18095 digest[3] = byte_swap_32 (digest[3]);
18096
18097 digest[0] -= MD5M_A;
18098 digest[1] -= MD5M_B;
18099 digest[2] -= MD5M_C;
18100 digest[3] -= MD5M_D;
18101
18102 /*
18103 * store salt
18104 */
18105
18106 char *salt_buf_ptr = (char *) salt->salt_buf;
18107
18108 // first 4 bytes are the "challenge"
18109
18110 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
18111 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
18112 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
18113 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
18114
18115 // append the user name
18116
18117 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
18118
18119 salt->salt_len = 4 + user_len;
18120
18121 return (PARSER_OK);
18122 }
18123
18124 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18125 {
18126 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
18127
18128 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18129
18130 u32 *digest = (u32 *) hash_buf->digest;
18131
18132 salt_t *salt = hash_buf->salt;
18133
18134 char *salt_pos = input_buf + 9;
18135
18136 char *hash_pos = strchr (salt_pos, '*');
18137
18138 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18139
18140 hash_pos++;
18141
18142 uint hash_len = input_len - (hash_pos - input_buf);
18143
18144 if (hash_len != 40) return (PARSER_HASH_LENGTH);
18145
18146 uint salt_len = hash_pos - salt_pos - 1;
18147
18148 if (salt_len != 40) return (PARSER_SALT_LENGTH);
18149
18150 /*
18151 * store digest
18152 */
18153
18154 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18155 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18156 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18157 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18158 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18159
18160 /*
18161 * store salt
18162 */
18163
18164 char *salt_buf_ptr = (char *) salt->salt_buf;
18165
18166 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18167
18168 salt->salt_len = salt_len;
18169
18170 return (PARSER_OK);
18171 }
18172
18173 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18174 {
18175 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
18176
18177 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18178
18179 u32 *digest = (u32 *) hash_buf->digest;
18180
18181 salt_t *salt = hash_buf->salt;
18182
18183 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
18184
18185 /**
18186 * parse line
18187 */
18188
18189 char *cry_master_len_pos = input_buf + 9;
18190
18191 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
18192
18193 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18194
18195 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
18196
18197 cry_master_buf_pos++;
18198
18199 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
18200
18201 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18202
18203 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
18204
18205 cry_salt_len_pos++;
18206
18207 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
18208
18209 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18210
18211 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
18212
18213 cry_salt_buf_pos++;
18214
18215 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
18216
18217 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18218
18219 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
18220
18221 cry_rounds_pos++;
18222
18223 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
18224
18225 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18226
18227 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
18228
18229 ckey_len_pos++;
18230
18231 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
18232
18233 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18234
18235 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
18236
18237 ckey_buf_pos++;
18238
18239 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
18240
18241 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18242
18243 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
18244
18245 public_key_len_pos++;
18246
18247 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
18248
18249 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18250
18251 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
18252
18253 public_key_buf_pos++;
18254
18255 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;
18256
18257 const uint cry_master_len = atoi (cry_master_len_pos);
18258 const uint cry_salt_len = atoi (cry_salt_len_pos);
18259 const uint ckey_len = atoi (ckey_len_pos);
18260 const uint public_key_len = atoi (public_key_len_pos);
18261
18262 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
18263 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
18264 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
18265 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
18266
18267 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
18268 {
18269 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
18270
18271 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
18272 }
18273
18274 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
18275 {
18276 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
18277
18278 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
18279 }
18280
18281 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
18282 {
18283 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
18284
18285 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
18286 }
18287
18288 bitcoin_wallet->cry_master_len = cry_master_len / 2;
18289 bitcoin_wallet->ckey_len = ckey_len / 2;
18290 bitcoin_wallet->public_key_len = public_key_len / 2;
18291
18292 /*
18293 * store digest (should be unique enought, hopefully)
18294 */
18295
18296 digest[0] = bitcoin_wallet->cry_master_buf[0];
18297 digest[1] = bitcoin_wallet->cry_master_buf[1];
18298 digest[2] = bitcoin_wallet->cry_master_buf[2];
18299 digest[3] = bitcoin_wallet->cry_master_buf[3];
18300
18301 /*
18302 * store salt
18303 */
18304
18305 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
18306
18307 const uint cry_rounds = atoi (cry_rounds_pos);
18308
18309 salt->salt_iter = cry_rounds - 1;
18310
18311 char *salt_buf_ptr = (char *) salt->salt_buf;
18312
18313 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
18314
18315 salt->salt_len = salt_len;
18316
18317 return (PARSER_OK);
18318 }
18319
18320 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18321 {
18322 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
18323
18324 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18325
18326 u32 *digest = (u32 *) hash_buf->digest;
18327
18328 salt_t *salt = hash_buf->salt;
18329
18330 sip_t *sip = (sip_t *) hash_buf->esalt;
18331
18332 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
18333
18334 char *temp_input_buf = (char *) mymalloc (input_len + 1);
18335
18336 memcpy (temp_input_buf, input_buf, input_len);
18337
18338 // URI_server:
18339
18340 char *URI_server_pos = temp_input_buf + 6;
18341
18342 char *URI_client_pos = strchr (URI_server_pos, '*');
18343
18344 if (URI_client_pos == NULL)
18345 {
18346 myfree (temp_input_buf);
18347
18348 return (PARSER_SEPARATOR_UNMATCHED);
18349 }
18350
18351 URI_client_pos[0] = 0;
18352 URI_client_pos++;
18353
18354 uint URI_server_len = strlen (URI_server_pos);
18355
18356 if (URI_server_len > 512)
18357 {
18358 myfree (temp_input_buf);
18359
18360 return (PARSER_SALT_LENGTH);
18361 }
18362
18363 // URI_client:
18364
18365 char *user_pos = strchr (URI_client_pos, '*');
18366
18367 if (user_pos == NULL)
18368 {
18369 myfree (temp_input_buf);
18370
18371 return (PARSER_SEPARATOR_UNMATCHED);
18372 }
18373
18374 user_pos[0] = 0;
18375 user_pos++;
18376
18377 uint URI_client_len = strlen (URI_client_pos);
18378
18379 if (URI_client_len > 512)
18380 {
18381 myfree (temp_input_buf);
18382
18383 return (PARSER_SALT_LENGTH);
18384 }
18385
18386 // user:
18387
18388 char *realm_pos = strchr (user_pos, '*');
18389
18390 if (realm_pos == NULL)
18391 {
18392 myfree (temp_input_buf);
18393
18394 return (PARSER_SEPARATOR_UNMATCHED);
18395 }
18396
18397 realm_pos[0] = 0;
18398 realm_pos++;
18399
18400 uint user_len = strlen (user_pos);
18401
18402 if (user_len > 116)
18403 {
18404 myfree (temp_input_buf);
18405
18406 return (PARSER_SALT_LENGTH);
18407 }
18408
18409 // realm:
18410
18411 char *method_pos = strchr (realm_pos, '*');
18412
18413 if (method_pos == NULL)
18414 {
18415 myfree (temp_input_buf);
18416
18417 return (PARSER_SEPARATOR_UNMATCHED);
18418 }
18419
18420 method_pos[0] = 0;
18421 method_pos++;
18422
18423 uint realm_len = strlen (realm_pos);
18424
18425 if (realm_len > 116)
18426 {
18427 myfree (temp_input_buf);
18428
18429 return (PARSER_SALT_LENGTH);
18430 }
18431
18432 // method:
18433
18434 char *URI_prefix_pos = strchr (method_pos, '*');
18435
18436 if (URI_prefix_pos == NULL)
18437 {
18438 myfree (temp_input_buf);
18439
18440 return (PARSER_SEPARATOR_UNMATCHED);
18441 }
18442
18443 URI_prefix_pos[0] = 0;
18444 URI_prefix_pos++;
18445
18446 uint method_len = strlen (method_pos);
18447
18448 if (method_len > 246)
18449 {
18450 myfree (temp_input_buf);
18451
18452 return (PARSER_SALT_LENGTH);
18453 }
18454
18455 // URI_prefix:
18456
18457 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
18458
18459 if (URI_resource_pos == NULL)
18460 {
18461 myfree (temp_input_buf);
18462
18463 return (PARSER_SEPARATOR_UNMATCHED);
18464 }
18465
18466 URI_resource_pos[0] = 0;
18467 URI_resource_pos++;
18468
18469 uint URI_prefix_len = strlen (URI_prefix_pos);
18470
18471 if (URI_prefix_len > 245)
18472 {
18473 myfree (temp_input_buf);
18474
18475 return (PARSER_SALT_LENGTH);
18476 }
18477
18478 // URI_resource:
18479
18480 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
18481
18482 if (URI_suffix_pos == NULL)
18483 {
18484 myfree (temp_input_buf);
18485
18486 return (PARSER_SEPARATOR_UNMATCHED);
18487 }
18488
18489 URI_suffix_pos[0] = 0;
18490 URI_suffix_pos++;
18491
18492 uint URI_resource_len = strlen (URI_resource_pos);
18493
18494 if (URI_resource_len < 1 || URI_resource_len > 246)
18495 {
18496 myfree (temp_input_buf);
18497
18498 return (PARSER_SALT_LENGTH);
18499 }
18500
18501 // URI_suffix:
18502
18503 char *nonce_pos = strchr (URI_suffix_pos, '*');
18504
18505 if (nonce_pos == NULL)
18506 {
18507 myfree (temp_input_buf);
18508
18509 return (PARSER_SEPARATOR_UNMATCHED);
18510 }
18511
18512 nonce_pos[0] = 0;
18513 nonce_pos++;
18514
18515 uint URI_suffix_len = strlen (URI_suffix_pos);
18516
18517 if (URI_suffix_len > 245)
18518 {
18519 myfree (temp_input_buf);
18520
18521 return (PARSER_SALT_LENGTH);
18522 }
18523
18524 // nonce:
18525
18526 char *nonce_client_pos = strchr (nonce_pos, '*');
18527
18528 if (nonce_client_pos == NULL)
18529 {
18530 myfree (temp_input_buf);
18531
18532 return (PARSER_SEPARATOR_UNMATCHED);
18533 }
18534
18535 nonce_client_pos[0] = 0;
18536 nonce_client_pos++;
18537
18538 uint nonce_len = strlen (nonce_pos);
18539
18540 if (nonce_len < 1 || nonce_len > 50)
18541 {
18542 myfree (temp_input_buf);
18543
18544 return (PARSER_SALT_LENGTH);
18545 }
18546
18547 // nonce_client:
18548
18549 char *nonce_count_pos = strchr (nonce_client_pos, '*');
18550
18551 if (nonce_count_pos == NULL)
18552 {
18553 myfree (temp_input_buf);
18554
18555 return (PARSER_SEPARATOR_UNMATCHED);
18556 }
18557
18558 nonce_count_pos[0] = 0;
18559 nonce_count_pos++;
18560
18561 uint nonce_client_len = strlen (nonce_client_pos);
18562
18563 if (nonce_client_len > 50)
18564 {
18565 myfree (temp_input_buf);
18566
18567 return (PARSER_SALT_LENGTH);
18568 }
18569
18570 // nonce_count:
18571
18572 char *qop_pos = strchr (nonce_count_pos, '*');
18573
18574 if (qop_pos == NULL)
18575 {
18576 myfree (temp_input_buf);
18577
18578 return (PARSER_SEPARATOR_UNMATCHED);
18579 }
18580
18581 qop_pos[0] = 0;
18582 qop_pos++;
18583
18584 uint nonce_count_len = strlen (nonce_count_pos);
18585
18586 if (nonce_count_len > 50)
18587 {
18588 myfree (temp_input_buf);
18589
18590 return (PARSER_SALT_LENGTH);
18591 }
18592
18593 // qop:
18594
18595 char *directive_pos = strchr (qop_pos, '*');
18596
18597 if (directive_pos == NULL)
18598 {
18599 myfree (temp_input_buf);
18600
18601 return (PARSER_SEPARATOR_UNMATCHED);
18602 }
18603
18604 directive_pos[0] = 0;
18605 directive_pos++;
18606
18607 uint qop_len = strlen (qop_pos);
18608
18609 if (qop_len > 50)
18610 {
18611 myfree (temp_input_buf);
18612
18613 return (PARSER_SALT_LENGTH);
18614 }
18615
18616 // directive
18617
18618 char *digest_pos = strchr (directive_pos, '*');
18619
18620 if (digest_pos == NULL)
18621 {
18622 myfree (temp_input_buf);
18623
18624 return (PARSER_SEPARATOR_UNMATCHED);
18625 }
18626
18627 digest_pos[0] = 0;
18628 digest_pos++;
18629
18630 uint directive_len = strlen (directive_pos);
18631
18632 if (directive_len != 3)
18633 {
18634 myfree (temp_input_buf);
18635
18636 return (PARSER_SALT_LENGTH);
18637 }
18638
18639 if (memcmp (directive_pos, "MD5", 3))
18640 {
18641 log_info ("ERROR: Only the MD5 directive is currently supported\n");
18642
18643 myfree (temp_input_buf);
18644
18645 return (PARSER_SIP_AUTH_DIRECTIVE);
18646 }
18647
18648 /*
18649 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
18650 */
18651
18652 uint md5_len = 0;
18653
18654 uint md5_max_len = 4 * 64;
18655
18656 uint md5_remaining_len = md5_max_len;
18657
18658 uint tmp_md5_buf[64] = { 0 };
18659
18660 char *tmp_md5_ptr = (char *) tmp_md5_buf;
18661
18662 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
18663
18664 md5_len += method_len + 1;
18665 tmp_md5_ptr += method_len + 1;
18666
18667 if (URI_prefix_len > 0)
18668 {
18669 md5_remaining_len = md5_max_len - md5_len;
18670
18671 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
18672
18673 md5_len += URI_prefix_len + 1;
18674 tmp_md5_ptr += URI_prefix_len + 1;
18675 }
18676
18677 md5_remaining_len = md5_max_len - md5_len;
18678
18679 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
18680
18681 md5_len += URI_resource_len;
18682 tmp_md5_ptr += URI_resource_len;
18683
18684 if (URI_suffix_len > 0)
18685 {
18686 md5_remaining_len = md5_max_len - md5_len;
18687
18688 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
18689
18690 md5_len += 1 + URI_suffix_len;
18691 }
18692
18693 uint tmp_digest[4] = { 0 };
18694
18695 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
18696
18697 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
18698 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
18699 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
18700 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
18701
18702 /*
18703 * esalt
18704 */
18705
18706 char *esalt_buf_ptr = (char *) sip->esalt_buf;
18707
18708 uint esalt_len = 0;
18709
18710 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
18711
18712 // there are 2 possibilities for the esalt:
18713
18714 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
18715 {
18716 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
18717
18718 if (esalt_len > max_esalt_len)
18719 {
18720 myfree (temp_input_buf);
18721
18722 return (PARSER_SALT_LENGTH);
18723 }
18724
18725 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
18726 nonce_pos,
18727 nonce_count_pos,
18728 nonce_client_pos,
18729 qop_pos,
18730 tmp_digest[0],
18731 tmp_digest[1],
18732 tmp_digest[2],
18733 tmp_digest[3]);
18734 }
18735 else
18736 {
18737 esalt_len = 1 + nonce_len + 1 + 32;
18738
18739 if (esalt_len > max_esalt_len)
18740 {
18741 myfree (temp_input_buf);
18742
18743 return (PARSER_SALT_LENGTH);
18744 }
18745
18746 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
18747 nonce_pos,
18748 tmp_digest[0],
18749 tmp_digest[1],
18750 tmp_digest[2],
18751 tmp_digest[3]);
18752 }
18753
18754 // add 0x80 to esalt
18755
18756 esalt_buf_ptr[esalt_len] = 0x80;
18757
18758 sip->esalt_len = esalt_len;
18759
18760 /*
18761 * actual salt
18762 */
18763
18764 char *sip_salt_ptr = (char *) sip->salt_buf;
18765
18766 uint salt_len = user_len + 1 + realm_len + 1;
18767
18768 uint max_salt_len = 119;
18769
18770 if (salt_len > max_salt_len)
18771 {
18772 myfree (temp_input_buf);
18773
18774 return (PARSER_SALT_LENGTH);
18775 }
18776
18777 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18778
18779 sip->salt_len = salt_len;
18780
18781 /*
18782 * fake salt (for sorting)
18783 */
18784
18785 char *salt_buf_ptr = (char *) salt->salt_buf;
18786
18787 max_salt_len = 55;
18788
18789 uint fake_salt_len = salt_len;
18790
18791 if (fake_salt_len > max_salt_len)
18792 {
18793 fake_salt_len = max_salt_len;
18794 }
18795
18796 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18797
18798 salt->salt_len = fake_salt_len;
18799
18800 /*
18801 * digest
18802 */
18803
18804 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
18805 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
18806 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
18807 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
18808
18809 digest[0] = byte_swap_32 (digest[0]);
18810 digest[1] = byte_swap_32 (digest[1]);
18811 digest[2] = byte_swap_32 (digest[2]);
18812 digest[3] = byte_swap_32 (digest[3]);
18813
18814 myfree (temp_input_buf);
18815
18816 return (PARSER_OK);
18817 }
18818
18819 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18820 {
18821 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
18822
18823 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18824
18825 u32 *digest = (u32 *) hash_buf->digest;
18826
18827 salt_t *salt = hash_buf->salt;
18828
18829 // digest
18830
18831 char *digest_pos = input_buf;
18832
18833 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
18834 digest[1] = 0;
18835 digest[2] = 0;
18836 digest[3] = 0;
18837
18838 // salt
18839
18840 char *salt_buf = input_buf + 8 + 1;
18841
18842 uint salt_len = 8;
18843
18844 char *salt_buf_ptr = (char *) salt->salt_buf;
18845
18846 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18847
18848 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18849
18850 salt->salt_len = salt_len;
18851
18852 return (PARSER_OK);
18853 }
18854
18855 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18856 {
18857 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
18858
18859 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18860
18861 u32 *digest = (u32 *) hash_buf->digest;
18862
18863 salt_t *salt = hash_buf->salt;
18864
18865 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
18866
18867 /**
18868 * parse line
18869 */
18870
18871 char *p_buf_pos = input_buf + 4;
18872
18873 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
18874
18875 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18876
18877 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
18878
18879 NumCyclesPower_pos++;
18880
18881 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
18882
18883 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18884
18885 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
18886
18887 salt_len_pos++;
18888
18889 char *salt_buf_pos = strchr (salt_len_pos, '$');
18890
18891 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18892
18893 u32 salt_len_len = salt_buf_pos - salt_len_pos;
18894
18895 salt_buf_pos++;
18896
18897 char *iv_len_pos = strchr (salt_buf_pos, '$');
18898
18899 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18900
18901 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
18902
18903 iv_len_pos++;
18904
18905 char *iv_buf_pos = strchr (iv_len_pos, '$');
18906
18907 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18908
18909 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18910
18911 iv_buf_pos++;
18912
18913 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18914
18915 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18916
18917 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18918
18919 crc_buf_pos++;
18920
18921 char *data_len_pos = strchr (crc_buf_pos, '$');
18922
18923 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18924
18925 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18926
18927 data_len_pos++;
18928
18929 char *unpack_size_pos = strchr (data_len_pos, '$');
18930
18931 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18932
18933 u32 data_len_len = unpack_size_pos - data_len_pos;
18934
18935 unpack_size_pos++;
18936
18937 char *data_buf_pos = strchr (unpack_size_pos, '$');
18938
18939 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18940
18941 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18942
18943 data_buf_pos++;
18944
18945 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;
18946
18947 const uint iter = atoi (NumCyclesPower_pos);
18948 const uint crc = atoi (crc_buf_pos);
18949 const uint p_buf = atoi (p_buf_pos);
18950 const uint salt_len = atoi (salt_len_pos);
18951 const uint iv_len = atoi (iv_len_pos);
18952 const uint unpack_size = atoi (unpack_size_pos);
18953 const uint data_len = atoi (data_len_pos);
18954
18955 /**
18956 * verify some data
18957 */
18958
18959 if (p_buf != 0) return (PARSER_SALT_VALUE);
18960 if (salt_len != 0) return (PARSER_SALT_VALUE);
18961
18962 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18963
18964 if (data_len > 384) return (PARSER_SALT_VALUE);
18965
18966 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18967
18968 /**
18969 * store data
18970 */
18971
18972 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18973 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18974 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18975 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18976
18977 seven_zip->iv_len = iv_len;
18978
18979 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18980
18981 seven_zip->salt_len = 0;
18982
18983 seven_zip->crc = crc;
18984
18985 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18986 {
18987 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18988
18989 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18990 }
18991
18992 seven_zip->data_len = data_len;
18993
18994 seven_zip->unpack_size = unpack_size;
18995
18996 // real salt
18997
18998 salt->salt_buf[0] = seven_zip->data_buf[0];
18999 salt->salt_buf[1] = seven_zip->data_buf[1];
19000 salt->salt_buf[2] = seven_zip->data_buf[2];
19001 salt->salt_buf[3] = seven_zip->data_buf[3];
19002
19003 salt->salt_len = 16;
19004
19005 salt->salt_sign[0] = iter;
19006
19007 salt->salt_iter = 1 << iter;
19008
19009 /**
19010 * digest
19011 */
19012
19013 digest[0] = crc;
19014 digest[1] = 0;
19015 digest[2] = 0;
19016 digest[3] = 0;
19017
19018 return (PARSER_OK);
19019 }
19020
19021 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19022 {
19023 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
19024
19025 u32 *digest = (u32 *) hash_buf->digest;
19026
19027 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
19028 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
19029 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
19030 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
19031 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
19032 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
19033 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
19034 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
19035
19036 digest[0] = byte_swap_32 (digest[0]);
19037 digest[1] = byte_swap_32 (digest[1]);
19038 digest[2] = byte_swap_32 (digest[2]);
19039 digest[3] = byte_swap_32 (digest[3]);
19040 digest[4] = byte_swap_32 (digest[4]);
19041 digest[5] = byte_swap_32 (digest[5]);
19042 digest[6] = byte_swap_32 (digest[6]);
19043 digest[7] = byte_swap_32 (digest[7]);
19044
19045 return (PARSER_OK);
19046 }
19047
19048 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19049 {
19050 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
19051
19052 u32 *digest = (u32 *) hash_buf->digest;
19053
19054 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
19055 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
19056 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
19057 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
19058 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
19059 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
19060 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
19061 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
19062 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
19063 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
19064 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
19065 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
19066 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
19067 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
19068 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
19069 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
19070
19071 digest[ 0] = byte_swap_32 (digest[ 0]);
19072 digest[ 1] = byte_swap_32 (digest[ 1]);
19073 digest[ 2] = byte_swap_32 (digest[ 2]);
19074 digest[ 3] = byte_swap_32 (digest[ 3]);
19075 digest[ 4] = byte_swap_32 (digest[ 4]);
19076 digest[ 5] = byte_swap_32 (digest[ 5]);
19077 digest[ 6] = byte_swap_32 (digest[ 6]);
19078 digest[ 7] = byte_swap_32 (digest[ 7]);
19079 digest[ 8] = byte_swap_32 (digest[ 8]);
19080 digest[ 9] = byte_swap_32 (digest[ 9]);
19081 digest[10] = byte_swap_32 (digest[10]);
19082 digest[11] = byte_swap_32 (digest[11]);
19083 digest[12] = byte_swap_32 (digest[12]);
19084 digest[13] = byte_swap_32 (digest[13]);
19085 digest[14] = byte_swap_32 (digest[14]);
19086 digest[15] = byte_swap_32 (digest[15]);
19087
19088 return (PARSER_OK);
19089 }
19090
19091 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19092 {
19093 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
19094
19095 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
19096
19097 u32 *digest = (u32 *) hash_buf->digest;
19098
19099 salt_t *salt = hash_buf->salt;
19100
19101 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
19102
19103 /**
19104 * parse line
19105 */
19106
19107 // iterations
19108
19109 char *iter_pos = input_buf + 4;
19110
19111 u32 iter = atoi (iter_pos);
19112
19113 if (iter < 1) return (PARSER_SALT_ITERATION);
19114 if (iter > 999999) return (PARSER_SALT_ITERATION);
19115
19116 // first is *raw* salt
19117
19118 char *salt_pos = strchr (iter_pos, ':');
19119
19120 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19121
19122 salt_pos++;
19123
19124 char *hash_pos = strchr (salt_pos, ':');
19125
19126 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19127
19128 u32 salt_len = hash_pos - salt_pos;
19129
19130 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19131
19132 hash_pos++;
19133
19134 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19135
19136 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19137
19138 // decode salt
19139
19140 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
19141
19142 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19143
19144 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19145
19146 salt_buf_ptr[salt_len + 3] = 0x01;
19147 salt_buf_ptr[salt_len + 4] = 0x80;
19148
19149 salt->salt_len = salt_len;
19150 salt->salt_iter = iter - 1;
19151
19152 // decode hash
19153
19154 u8 tmp_buf[100] = { 0 };
19155
19156 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19157
19158 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19159
19160 memcpy (digest, tmp_buf, 16);
19161
19162 // add some stuff to normal salt to make sorted happy
19163
19164 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
19165 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
19166 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
19167 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
19168 salt->salt_buf[4] = salt->salt_iter;
19169
19170 return (PARSER_OK);
19171 }
19172
19173 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19174 {
19175 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
19176
19177 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
19178
19179 u32 *digest = (u32 *) hash_buf->digest;
19180
19181 salt_t *salt = hash_buf->salt;
19182
19183 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
19184
19185 /**
19186 * parse line
19187 */
19188
19189 // iterations
19190
19191 char *iter_pos = input_buf + 5;
19192
19193 u32 iter = atoi (iter_pos);
19194
19195 if (iter < 1) return (PARSER_SALT_ITERATION);
19196 if (iter > 999999) return (PARSER_SALT_ITERATION);
19197
19198 // first is *raw* salt
19199
19200 char *salt_pos = strchr (iter_pos, ':');
19201
19202 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19203
19204 salt_pos++;
19205
19206 char *hash_pos = strchr (salt_pos, ':');
19207
19208 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19209
19210 u32 salt_len = hash_pos - salt_pos;
19211
19212 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19213
19214 hash_pos++;
19215
19216 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19217
19218 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19219
19220 // decode salt
19221
19222 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
19223
19224 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19225
19226 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19227
19228 salt_buf_ptr[salt_len + 3] = 0x01;
19229 salt_buf_ptr[salt_len + 4] = 0x80;
19230
19231 salt->salt_len = salt_len;
19232 salt->salt_iter = iter - 1;
19233
19234 // decode hash
19235
19236 u8 tmp_buf[100] = { 0 };
19237
19238 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19239
19240 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19241
19242 memcpy (digest, tmp_buf, 16);
19243
19244 digest[0] = byte_swap_32 (digest[0]);
19245 digest[1] = byte_swap_32 (digest[1]);
19246 digest[2] = byte_swap_32 (digest[2]);
19247 digest[3] = byte_swap_32 (digest[3]);
19248
19249 // add some stuff to normal salt to make sorted happy
19250
19251 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
19252 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
19253 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
19254 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
19255 salt->salt_buf[4] = salt->salt_iter;
19256
19257 return (PARSER_OK);
19258 }
19259
19260 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19261 {
19262 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
19263
19264 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
19265
19266 u64 *digest = (u64 *) hash_buf->digest;
19267
19268 salt_t *salt = hash_buf->salt;
19269
19270 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
19271
19272 /**
19273 * parse line
19274 */
19275
19276 // iterations
19277
19278 char *iter_pos = input_buf + 7;
19279
19280 u32 iter = atoi (iter_pos);
19281
19282 if (iter < 1) return (PARSER_SALT_ITERATION);
19283 if (iter > 999999) return (PARSER_SALT_ITERATION);
19284
19285 // first is *raw* salt
19286
19287 char *salt_pos = strchr (iter_pos, ':');
19288
19289 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19290
19291 salt_pos++;
19292
19293 char *hash_pos = strchr (salt_pos, ':');
19294
19295 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19296
19297 u32 salt_len = hash_pos - salt_pos;
19298
19299 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19300
19301 hash_pos++;
19302
19303 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19304
19305 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19306
19307 // decode salt
19308
19309 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
19310
19311 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19312
19313 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19314
19315 salt_buf_ptr[salt_len + 3] = 0x01;
19316 salt_buf_ptr[salt_len + 4] = 0x80;
19317
19318 salt->salt_len = salt_len;
19319 salt->salt_iter = iter - 1;
19320
19321 // decode hash
19322
19323 u8 tmp_buf[100] = { 0 };
19324
19325 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19326
19327 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19328
19329 memcpy (digest, tmp_buf, 64);
19330
19331 digest[0] = byte_swap_64 (digest[0]);
19332 digest[1] = byte_swap_64 (digest[1]);
19333 digest[2] = byte_swap_64 (digest[2]);
19334 digest[3] = byte_swap_64 (digest[3]);
19335 digest[4] = byte_swap_64 (digest[4]);
19336 digest[5] = byte_swap_64 (digest[5]);
19337 digest[6] = byte_swap_64 (digest[6]);
19338 digest[7] = byte_swap_64 (digest[7]);
19339
19340 // add some stuff to normal salt to make sorted happy
19341
19342 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
19343 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
19344 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
19345 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
19346 salt->salt_buf[4] = salt->salt_iter;
19347
19348 return (PARSER_OK);
19349 }
19350
19351 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19352 {
19353 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
19354
19355 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
19356
19357 uint *digest = (uint *) hash_buf->digest;
19358
19359 salt_t *salt = hash_buf->salt;
19360
19361 /**
19362 * parse line
19363 */
19364
19365 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
19366
19367 char *hash_pos = strchr (salt_pos, '$');
19368
19369 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19370
19371 u32 salt_len = hash_pos - salt_pos;
19372
19373 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19374
19375 hash_pos++;
19376
19377 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
19378
19379 if (hash_len != 16) return (PARSER_HASH_LENGTH);
19380
19381 // decode hash
19382
19383 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
19384 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
19385 digest[ 2] = 0;
19386 digest[ 3] = 0;
19387 digest[ 4] = 0;
19388 digest[ 5] = 0;
19389 digest[ 6] = 0;
19390 digest[ 7] = 0;
19391 digest[ 8] = 0;
19392 digest[ 9] = 0;
19393 digest[10] = 0;
19394 digest[11] = 0;
19395 digest[12] = 0;
19396 digest[13] = 0;
19397 digest[14] = 0;
19398 digest[15] = 0;
19399
19400 // decode salt
19401
19402 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19403 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19404
19405 salt->salt_iter = ROUNDS_ECRYPTFS;
19406 salt->salt_len = 8;
19407
19408 return (PARSER_OK);
19409 }
19410
19411 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19412 {
19413 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
19414
19415 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
19416
19417 unsigned char c19 = itoa64_to_int (input_buf[19]);
19418
19419 if (c19 & 3) return (PARSER_HASH_VALUE);
19420
19421 salt_t *salt = hash_buf->salt;
19422
19423 u32 *digest = (u32 *) hash_buf->digest;
19424
19425 // iteration count
19426
19427 salt->salt_iter = itoa64_to_int (input_buf[1])
19428 | itoa64_to_int (input_buf[2]) << 6
19429 | itoa64_to_int (input_buf[3]) << 12
19430 | itoa64_to_int (input_buf[4]) << 18;
19431
19432 // set salt
19433
19434 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
19435 | itoa64_to_int (input_buf[6]) << 6
19436 | itoa64_to_int (input_buf[7]) << 12
19437 | itoa64_to_int (input_buf[8]) << 18;
19438
19439 salt->salt_len = 4;
19440
19441 u8 tmp_buf[100] = { 0 };
19442
19443 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
19444
19445 memcpy (digest, tmp_buf, 8);
19446
19447 uint tt;
19448
19449 IP (digest[0], digest[1], tt);
19450
19451 digest[0] = rotr32 (digest[0], 31);
19452 digest[1] = rotr32 (digest[1], 31);
19453 digest[2] = 0;
19454 digest[3] = 0;
19455
19456 return (PARSER_OK);
19457 }
19458
19459 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19460 {
19461 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
19462
19463 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
19464
19465 u32 *digest = (u32 *) hash_buf->digest;
19466
19467 salt_t *salt = hash_buf->salt;
19468
19469 /**
19470 * parse line
19471 */
19472
19473 char *type_pos = input_buf + 6 + 1;
19474
19475 char *salt_pos = strchr (type_pos, '*');
19476
19477 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19478
19479 u32 type_len = salt_pos - type_pos;
19480
19481 if (type_len != 1) return (PARSER_SALT_LENGTH);
19482
19483 salt_pos++;
19484
19485 char *crypted_pos = strchr (salt_pos, '*');
19486
19487 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19488
19489 u32 salt_len = crypted_pos - salt_pos;
19490
19491 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19492
19493 crypted_pos++;
19494
19495 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
19496
19497 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
19498
19499 /**
19500 * copy data
19501 */
19502
19503 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19504 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19505
19506 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19507 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19508
19509 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
19510 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
19511 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
19512 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
19513
19514 salt->salt_len = 24;
19515 salt->salt_iter = ROUNDS_RAR3;
19516
19517 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
19518 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
19519
19520 digest[0] = 0xc43d7b00;
19521 digest[1] = 0x40070000;
19522 digest[2] = 0;
19523 digest[3] = 0;
19524
19525 return (PARSER_OK);
19526 }
19527
19528 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19529 {
19530 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
19531
19532 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
19533
19534 u32 *digest = (u32 *) hash_buf->digest;
19535
19536 salt_t *salt = hash_buf->salt;
19537
19538 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
19539
19540 /**
19541 * parse line
19542 */
19543
19544 char *param0_pos = input_buf + 1 + 4 + 1;
19545
19546 char *param1_pos = strchr (param0_pos, '$');
19547
19548 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19549
19550 u32 param0_len = param1_pos - param0_pos;
19551
19552 param1_pos++;
19553
19554 char *param2_pos = strchr (param1_pos, '$');
19555
19556 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19557
19558 u32 param1_len = param2_pos - param1_pos;
19559
19560 param2_pos++;
19561
19562 char *param3_pos = strchr (param2_pos, '$');
19563
19564 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19565
19566 u32 param2_len = param3_pos - param2_pos;
19567
19568 param3_pos++;
19569
19570 char *param4_pos = strchr (param3_pos, '$');
19571
19572 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19573
19574 u32 param3_len = param4_pos - param3_pos;
19575
19576 param4_pos++;
19577
19578 char *param5_pos = strchr (param4_pos, '$');
19579
19580 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19581
19582 u32 param4_len = param5_pos - param4_pos;
19583
19584 param5_pos++;
19585
19586 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
19587
19588 char *salt_buf = param1_pos;
19589 char *iv = param3_pos;
19590 char *pswcheck = param5_pos;
19591
19592 const uint salt_len = atoi (param0_pos);
19593 const uint iterations = atoi (param2_pos);
19594 const uint pswcheck_len = atoi (param4_pos);
19595
19596 /**
19597 * verify some data
19598 */
19599
19600 if (param1_len != 32) return (PARSER_SALT_VALUE);
19601 if (param3_len != 32) return (PARSER_SALT_VALUE);
19602 if (param5_len != 16) return (PARSER_SALT_VALUE);
19603
19604 if (salt_len != 16) return (PARSER_SALT_VALUE);
19605 if (iterations == 0) return (PARSER_SALT_VALUE);
19606 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
19607
19608 /**
19609 * store data
19610 */
19611
19612 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
19613 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
19614 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
19615 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
19616
19617 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
19618 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
19619 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
19620 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
19621
19622 salt->salt_len = 16;
19623
19624 salt->salt_sign[0] = iterations;
19625
19626 salt->salt_iter = ((1 << iterations) + 32) - 1;
19627
19628 /**
19629 * digest buf
19630 */
19631
19632 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
19633 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
19634 digest[2] = 0;
19635 digest[3] = 0;
19636
19637 return (PARSER_OK);
19638 }
19639
19640 int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19641 {
19642 if ((input_len < DISPLAY_LEN_MIN_13100) || (input_len > DISPLAY_LEN_MAX_13100)) return (PARSER_GLOBAL_LENGTH);
19643
19644 if (memcmp (SIGNATURE_KRB5TGS, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19645
19646 u32 *digest = (u32 *) hash_buf->digest;
19647
19648 salt_t *salt = hash_buf->salt;
19649
19650 krb5tgs_t *krb5tgs = (krb5tgs_t *) hash_buf->esalt;
19651
19652 /**
19653 * parse line
19654 */
19655
19656 /* Skip '$' */
19657 char *account_pos = input_buf + 11 + 1;
19658
19659 char *data_pos;
19660
19661 uint data_len;
19662
19663 if (account_pos[0] == '*')
19664 {
19665 account_pos++;
19666
19667 data_pos = strchr (account_pos, '*');
19668
19669 /* Skip '*' */
19670 data_pos++;
19671
19672 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19673
19674 uint account_len = data_pos - account_pos + 1;
19675
19676 if (account_len >= 512) return (PARSER_SALT_LENGTH);
19677
19678 /* Skip '$' */
19679 data_pos++;
19680
19681 data_len = input_len - 11 - 1 - account_len - 2;
19682
19683 memcpy (krb5tgs->account_info, account_pos - 1, account_len);
19684 }
19685 else
19686 {
19687 /* assume $krb5tgs$23$checksum$edata2 */
19688 data_pos = account_pos;
19689
19690 memcpy (krb5tgs->account_info, "**", 3);
19691
19692 data_len = input_len - 11 - 1 - 1;
19693 }
19694
19695 if (data_len < ((16 + 32) * 2)) return (PARSER_SALT_LENGTH);
19696
19697 char *checksum_ptr = (char *) krb5tgs->checksum;
19698
19699 for (uint i = 0; i < 16 * 2; i += 2)
19700 {
19701 const char p0 = data_pos[i + 0];
19702 const char p1 = data_pos[i + 1];
19703
19704 *checksum_ptr++ = hex_convert (p1) << 0
19705 | hex_convert (p0) << 4;
19706 }
19707
19708 char *edata_ptr = (char *) krb5tgs->edata2;
19709
19710 krb5tgs->edata2_len = (data_len - 32) / 2 ;
19711
19712 /* skip '$' */
19713 for (uint i = 16 * 2 + 1; i < (krb5tgs->edata2_len * 2) + (16 * 2 + 1); i += 2)
19714 {
19715 const char p0 = data_pos[i + 0];
19716 const char p1 = data_pos[i + 1];
19717 *edata_ptr++ = hex_convert (p1) << 0
19718 | hex_convert (p0) << 4;
19719 }
19720
19721 /* this is needed for hmac_md5 */
19722 *edata_ptr++ = 0x80;
19723
19724 salt->salt_buf[0] = krb5tgs->checksum[0];
19725 salt->salt_buf[1] = krb5tgs->checksum[1];
19726 salt->salt_buf[2] = krb5tgs->checksum[2];
19727 salt->salt_buf[3] = krb5tgs->checksum[3];
19728
19729 salt->salt_len = 32;
19730
19731 digest[0] = krb5tgs->checksum[0];
19732 digest[1] = krb5tgs->checksum[1];
19733 digest[2] = krb5tgs->checksum[2];
19734 digest[3] = krb5tgs->checksum[3];
19735
19736 return (PARSER_OK);
19737 }
19738
19739 int axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19740 {
19741 if ((input_len < DISPLAY_LEN_MIN_13200) || (input_len > DISPLAY_LEN_MAX_13200)) return (PARSER_GLOBAL_LENGTH);
19742
19743 if (memcmp (SIGNATURE_AXCRYPT, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19744
19745 u32 *digest = (u32 *) hash_buf->digest;
19746
19747 salt_t *salt = hash_buf->salt;
19748
19749 /**
19750 * parse line
19751 */
19752
19753 /* Skip '*' */
19754 char *wrapping_rounds_pos = input_buf + 11 + 1;
19755
19756 char *salt_pos;
19757
19758 char *wrapped_key_pos;
19759
19760 char *data_pos;
19761
19762 salt->salt_iter = atoi (wrapping_rounds_pos);
19763
19764 salt_pos = strchr (wrapping_rounds_pos, '*');
19765
19766 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19767
19768 uint wrapping_rounds_len = salt_pos - wrapping_rounds_pos;
19769
19770 /* Skip '*' */
19771 salt_pos++;
19772
19773 data_pos = salt_pos;
19774
19775 wrapped_key_pos = strchr (salt_pos, '*');
19776
19777 if (wrapped_key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19778
19779 uint salt_len = wrapped_key_pos - salt_pos;
19780
19781 if (salt_len != 32) return (PARSER_SALT_LENGTH);
19782
19783 /* Skip '*' */
19784 wrapped_key_pos++;
19785
19786 uint wrapped_key_len = input_len - 11 - 1 - wrapping_rounds_len - 1 - salt_len - 1;
19787
19788 if (wrapped_key_len != 48) return (PARSER_SALT_LENGTH);
19789
19790 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19791 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19792 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &data_pos[16]);
19793 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &data_pos[24]);
19794
19795 data_pos += 33;
19796
19797 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19798 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19799 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &data_pos[16]);
19800 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &data_pos[24]);
19801 salt->salt_buf[8] = hex_to_u32 ((const u8 *) &data_pos[32]);
19802 salt->salt_buf[9] = hex_to_u32 ((const u8 *) &data_pos[40]);
19803
19804 salt->salt_len = 40;
19805
19806 digest[0] = salt->salt_buf[0];
19807 digest[1] = salt->salt_buf[1];
19808 digest[2] = salt->salt_buf[2];
19809 digest[3] = salt->salt_buf[3];
19810
19811 return (PARSER_OK);
19812 }
19813
19814 int keepass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19815 {
19816 if ((input_len < DISPLAY_LEN_MIN_13400) || (input_len > DISPLAY_LEN_MAX_13400)) return (PARSER_GLOBAL_LENGTH);
19817
19818 if (memcmp (SIGNATURE_KEEPASS, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
19819
19820 u32 *digest = (u32 *) hash_buf->digest;
19821
19822 salt_t *salt = hash_buf->salt;
19823
19824 keepass_t *keepass = (keepass_t *) hash_buf->esalt;
19825
19826 /**
19827 * parse line
19828 */
19829
19830 char *version_pos;
19831
19832 char *rounds_pos;
19833
19834 char *algorithm_pos;
19835
19836 char *final_random_seed_pos;
19837 u32 final_random_seed_len;
19838
19839 char *transf_random_seed_pos;
19840 u32 transf_random_seed_len;
19841
19842 char *enc_iv_pos;
19843 u32 enc_iv_len;
19844
19845 /* default is no keyfile provided */
19846 char *keyfile_len_pos;
19847 u32 keyfile_len = 0;
19848 u32 is_keyfile_present = 0;
19849 char *keyfile_inline_pos;
19850 char *keyfile_pos;
19851
19852 /* specific to version 1 */
19853 char *contents_len_pos;
19854 u32 contents_len;
19855 char *contents_pos;
19856
19857 /* specific to version 2 */
19858 char *expected_bytes_pos;
19859 u32 expected_bytes_len;
19860
19861 char *contents_hash_pos;
19862 u32 contents_hash_len;
19863
19864 version_pos = input_buf + 8 + 1 + 1;
19865
19866 keepass->version = atoi (version_pos);
19867
19868 rounds_pos = strchr (version_pos, '*');
19869
19870 if (rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19871
19872 rounds_pos++;
19873
19874 salt->salt_iter = (atoi (rounds_pos));
19875
19876 algorithm_pos = strchr (rounds_pos, '*');
19877
19878 if (algorithm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19879
19880 algorithm_pos++;
19881
19882 keepass->algorithm = atoi (algorithm_pos);
19883
19884 final_random_seed_pos = strchr (algorithm_pos, '*');
19885
19886 if (final_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19887
19888 final_random_seed_pos++;
19889
19890 keepass->final_random_seed[0] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 0]);
19891 keepass->final_random_seed[1] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 8]);
19892 keepass->final_random_seed[2] = hex_to_u32 ((const u8 *) &final_random_seed_pos[16]);
19893 keepass->final_random_seed[3] = hex_to_u32 ((const u8 *) &final_random_seed_pos[24]);
19894
19895 if (keepass->version == 2)
19896 {
19897 keepass->final_random_seed[4] = hex_to_u32 ((const u8 *) &final_random_seed_pos[32]);
19898 keepass->final_random_seed[5] = hex_to_u32 ((const u8 *) &final_random_seed_pos[40]);
19899 keepass->final_random_seed[6] = hex_to_u32 ((const u8 *) &final_random_seed_pos[48]);
19900 keepass->final_random_seed[7] = hex_to_u32 ((const u8 *) &final_random_seed_pos[56]);
19901 }
19902
19903 transf_random_seed_pos = strchr (final_random_seed_pos, '*');
19904
19905 if (transf_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19906
19907 final_random_seed_len = transf_random_seed_pos - final_random_seed_pos;
19908
19909 if (keepass->version == 1 && final_random_seed_len != 32) return (PARSER_SALT_LENGTH);
19910 if (keepass->version == 2 && final_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19911
19912 transf_random_seed_pos++;
19913
19914 keepass->transf_random_seed[0] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 0]);
19915 keepass->transf_random_seed[1] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 8]);
19916 keepass->transf_random_seed[2] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[16]);
19917 keepass->transf_random_seed[3] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[24]);
19918 keepass->transf_random_seed[4] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[32]);
19919 keepass->transf_random_seed[5] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[40]);
19920 keepass->transf_random_seed[6] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[48]);
19921 keepass->transf_random_seed[7] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[56]);
19922
19923 enc_iv_pos = strchr (transf_random_seed_pos, '*');
19924
19925 if (enc_iv_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19926
19927 transf_random_seed_len = enc_iv_pos - transf_random_seed_pos;
19928
19929 if (transf_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19930
19931 enc_iv_pos++;
19932
19933 keepass->enc_iv[0] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 0]);
19934 keepass->enc_iv[1] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 8]);
19935 keepass->enc_iv[2] = hex_to_u32 ((const u8 *) &enc_iv_pos[16]);
19936 keepass->enc_iv[3] = hex_to_u32 ((const u8 *) &enc_iv_pos[24]);
19937
19938 if (keepass->version == 1)
19939 {
19940 contents_hash_pos = strchr (enc_iv_pos, '*');
19941
19942 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19943
19944 enc_iv_len = contents_hash_pos - enc_iv_pos;
19945
19946 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19947
19948 contents_hash_pos++;
19949
19950 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19951 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19952 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19953 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19954 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
19955 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
19956 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
19957 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
19958
19959 /* get length of contents following */
19960 char *inline_flag_pos = strchr (contents_hash_pos, '*');
19961
19962 if (inline_flag_pos == NULL) return (PARSER_SALT_LENGTH);
19963
19964 contents_hash_len = inline_flag_pos - contents_hash_pos;
19965
19966 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
19967
19968 inline_flag_pos++;
19969
19970 u32 inline_flag = atoi (inline_flag_pos);
19971
19972 if (inline_flag != 1) return (PARSER_SALT_LENGTH);
19973
19974 contents_len_pos = strchr (inline_flag_pos, '*');
19975
19976 if (contents_len_pos == NULL) return (PARSER_SALT_LENGTH);
19977
19978 contents_len_pos++;
19979
19980 contents_len = atoi (contents_len_pos);
19981
19982 if (contents_len > 50000) return (PARSER_SALT_LENGTH);
19983
19984 contents_pos = strchr (contents_len_pos, '*');
19985
19986 if (contents_pos == NULL) return (PARSER_SALT_LENGTH);
19987
19988 contents_pos++;
19989
19990 u32 i;
19991
19992 keepass->contents_len = contents_len;
19993
19994 contents_len = contents_len / 4;
19995
19996 keyfile_inline_pos = strchr (contents_pos, '*');
19997
19998 u32 real_contents_len;
19999
20000 if (keyfile_inline_pos == NULL)
20001 real_contents_len = input_len - (contents_pos - input_buf);
20002 else
20003 {
20004 real_contents_len = keyfile_inline_pos - contents_pos;
20005 keyfile_inline_pos++;
20006 is_keyfile_present = 1;
20007 }
20008
20009 if (real_contents_len != keepass->contents_len * 2) return (PARSER_SALT_LENGTH);
20010
20011 for (i = 0; i < contents_len; i++)
20012 keepass->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]);
20013 }
20014 else if (keepass->version == 2)
20015 {
20016 expected_bytes_pos = strchr (enc_iv_pos, '*');
20017
20018 if (expected_bytes_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20019
20020 enc_iv_len = expected_bytes_pos - enc_iv_pos;
20021
20022 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
20023
20024 expected_bytes_pos++;
20025
20026 keepass->expected_bytes[0] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 0]);
20027 keepass->expected_bytes[1] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 8]);
20028 keepass->expected_bytes[2] = hex_to_u32 ((const u8 *) &expected_bytes_pos[16]);
20029 keepass->expected_bytes[3] = hex_to_u32 ((const u8 *) &expected_bytes_pos[24]);
20030 keepass->expected_bytes[4] = hex_to_u32 ((const u8 *) &expected_bytes_pos[32]);
20031 keepass->expected_bytes[5] = hex_to_u32 ((const u8 *) &expected_bytes_pos[40]);
20032 keepass->expected_bytes[6] = hex_to_u32 ((const u8 *) &expected_bytes_pos[48]);
20033 keepass->expected_bytes[7] = hex_to_u32 ((const u8 *) &expected_bytes_pos[56]);
20034
20035 contents_hash_pos = strchr (expected_bytes_pos, '*');
20036
20037 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20038
20039 expected_bytes_len = contents_hash_pos - expected_bytes_pos;
20040
20041 if (expected_bytes_len != 64) return (PARSER_SALT_LENGTH);
20042
20043 contents_hash_pos++;
20044
20045 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
20046 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
20047 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
20048 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
20049 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
20050 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
20051 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
20052 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
20053
20054 keyfile_inline_pos = strchr (contents_hash_pos, '*');
20055
20056 if (keyfile_inline_pos == NULL)
20057 contents_hash_len = input_len - (int) (contents_hash_pos - input_buf);
20058 else
20059 {
20060 contents_hash_len = keyfile_inline_pos - contents_hash_pos;
20061 keyfile_inline_pos++;
20062 is_keyfile_present = 1;
20063 }
20064 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
20065 }
20066
20067 if (is_keyfile_present != 0)
20068 {
20069 keyfile_len_pos = strchr (keyfile_inline_pos, '*');
20070
20071 keyfile_len_pos++;
20072
20073 keyfile_len = atoi (keyfile_len_pos);
20074
20075 keepass->keyfile_len = keyfile_len;
20076
20077 if (keyfile_len != 64) return (PARSER_SALT_LENGTH);
20078
20079 keyfile_pos = strchr (keyfile_len_pos, '*');
20080
20081 if (keyfile_pos == NULL) return (PARSER_SALT_LENGTH);
20082
20083 keyfile_pos++;
20084
20085 u32 real_keyfile_len = input_len - (keyfile_pos - input_buf);
20086
20087 if (real_keyfile_len != 64) return (PARSER_SALT_LENGTH);
20088
20089 keepass->keyfile[0] = hex_to_u32 ((const u8 *) &keyfile_pos[ 0]);
20090 keepass->keyfile[1] = hex_to_u32 ((const u8 *) &keyfile_pos[ 8]);
20091 keepass->keyfile[2] = hex_to_u32 ((const u8 *) &keyfile_pos[16]);
20092 keepass->keyfile[3] = hex_to_u32 ((const u8 *) &keyfile_pos[24]);
20093 keepass->keyfile[4] = hex_to_u32 ((const u8 *) &keyfile_pos[32]);
20094 keepass->keyfile[5] = hex_to_u32 ((const u8 *) &keyfile_pos[40]);
20095 keepass->keyfile[6] = hex_to_u32 ((const u8 *) &keyfile_pos[48]);
20096 keepass->keyfile[7] = hex_to_u32 ((const u8 *) &keyfile_pos[56]);
20097 }
20098
20099 digest[0] = keepass->enc_iv[0];
20100 digest[1] = keepass->enc_iv[1];
20101 digest[2] = keepass->enc_iv[2];
20102 digest[3] = keepass->enc_iv[3];
20103
20104 salt->salt_buf[0] = keepass->transf_random_seed[0];
20105 salt->salt_buf[1] = keepass->transf_random_seed[1];
20106 salt->salt_buf[2] = keepass->transf_random_seed[2];
20107 salt->salt_buf[3] = keepass->transf_random_seed[3];
20108 salt->salt_buf[4] = keepass->transf_random_seed[4];
20109 salt->salt_buf[5] = keepass->transf_random_seed[5];
20110 salt->salt_buf[6] = keepass->transf_random_seed[6];
20111 salt->salt_buf[7] = keepass->transf_random_seed[7];
20112
20113 return (PARSER_OK);
20114 }
20115
20116 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20117 {
20118 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
20119
20120 u32 *digest = (u32 *) hash_buf->digest;
20121
20122 salt_t *salt = hash_buf->salt;
20123
20124 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
20125 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
20126 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
20127 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
20128 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
20129 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
20130 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
20131 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
20132
20133 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
20134
20135 uint salt_len = input_len - 64 - 1;
20136
20137 char *salt_buf = input_buf + 64 + 1;
20138
20139 char *salt_buf_ptr = (char *) salt->salt_buf;
20140
20141 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
20142
20143 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
20144
20145 salt->salt_len = salt_len;
20146
20147 /**
20148 * we can precompute the first sha256 transform
20149 */
20150
20151 uint w[16] = { 0 };
20152
20153 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
20154 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
20155 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
20156 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
20157 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
20158 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
20159 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
20160 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
20161 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
20162 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
20163 w[10] = byte_swap_32 (salt->salt_buf[10]);
20164 w[11] = byte_swap_32 (salt->salt_buf[11]);
20165 w[12] = byte_swap_32 (salt->salt_buf[12]);
20166 w[13] = byte_swap_32 (salt->salt_buf[13]);
20167 w[14] = byte_swap_32 (salt->salt_buf[14]);
20168 w[15] = byte_swap_32 (salt->salt_buf[15]);
20169
20170 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
20171
20172 sha256_64 (w, pc256);
20173
20174 salt->salt_buf_pc[0] = pc256[0];
20175 salt->salt_buf_pc[1] = pc256[1];
20176 salt->salt_buf_pc[2] = pc256[2];
20177 salt->salt_buf_pc[3] = pc256[3];
20178 salt->salt_buf_pc[4] = pc256[4];
20179 salt->salt_buf_pc[5] = pc256[5];
20180 salt->salt_buf_pc[6] = pc256[6];
20181 salt->salt_buf_pc[7] = pc256[7];
20182
20183 digest[0] -= pc256[0];
20184 digest[1] -= pc256[1];
20185 digest[2] -= pc256[2];
20186 digest[3] -= pc256[3];
20187 digest[4] -= pc256[4];
20188 digest[5] -= pc256[5];
20189 digest[6] -= pc256[6];
20190 digest[7] -= pc256[7];
20191
20192 return (PARSER_OK);
20193 }
20194
20195 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20196 {
20197 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
20198
20199 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
20200
20201 u32 *digest = (u32 *) hash_buf->digest;
20202
20203 salt_t *salt = hash_buf->salt;
20204
20205 /**
20206 * parse line
20207 */
20208
20209 char *data_len_pos = input_buf + 1 + 10 + 1;
20210
20211 char *data_buf_pos = strchr (data_len_pos, '$');
20212
20213 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20214
20215 u32 data_len_len = data_buf_pos - data_len_pos;
20216
20217 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
20218 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
20219
20220 data_buf_pos++;
20221
20222 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
20223
20224 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
20225
20226 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
20227
20228 u32 data_len = atoi (data_len_pos);
20229
20230 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
20231
20232 /**
20233 * salt
20234 */
20235
20236 char *salt_pos = data_buf_pos;
20237
20238 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20239 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20240 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
20241 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
20242
20243 // this is actually the CT, which is also the hash later (if matched)
20244
20245 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
20246 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
20247 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
20248 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
20249
20250 salt->salt_len = 32; // note we need to fix this to 16 in kernel
20251
20252 salt->salt_iter = 10 - 1;
20253
20254 /**
20255 * digest buf
20256 */
20257
20258 digest[0] = salt->salt_buf[4];
20259 digest[1] = salt->salt_buf[5];
20260 digest[2] = salt->salt_buf[6];
20261 digest[3] = salt->salt_buf[7];
20262
20263 return (PARSER_OK);
20264 }
20265
20266 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20267 {
20268 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
20269
20270 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
20271
20272 u32 *digest = (u32 *) hash_buf->digest;
20273
20274 salt_t *salt = hash_buf->salt;
20275
20276 /**
20277 * parse line
20278 */
20279
20280 char *salt_pos = input_buf + 11 + 1;
20281
20282 char *iter_pos = strchr (salt_pos, ',');
20283
20284 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20285
20286 u32 salt_len = iter_pos - salt_pos;
20287
20288 if (salt_len != 20) return (PARSER_SALT_LENGTH);
20289
20290 iter_pos++;
20291
20292 char *hash_pos = strchr (iter_pos, ',');
20293
20294 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20295
20296 u32 iter_len = hash_pos - iter_pos;
20297
20298 if (iter_len > 5) return (PARSER_SALT_LENGTH);
20299
20300 hash_pos++;
20301
20302 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
20303
20304 if (hash_len != 64) return (PARSER_HASH_LENGTH);
20305
20306 /**
20307 * salt
20308 */
20309
20310 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20311 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20312 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
20313 salt->salt_buf[3] = 0x00018000;
20314
20315 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
20316 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
20317 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
20318 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
20319
20320 salt->salt_len = salt_len / 2;
20321
20322 salt->salt_iter = atoi (iter_pos) - 1;
20323
20324 /**
20325 * digest buf
20326 */
20327
20328 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20329 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20330 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20331 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20332 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20333 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20334 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20335 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20336
20337 return (PARSER_OK);
20338 }
20339
20340 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20341 {
20342 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
20343
20344 u32 *digest = (u32 *) hash_buf->digest;
20345
20346 salt_t *salt = hash_buf->salt;
20347
20348 /**
20349 * parse line
20350 */
20351
20352 char *hash_pos = input_buf + 64;
20353 char *salt1_pos = input_buf + 128;
20354 char *salt2_pos = input_buf;
20355
20356 /**
20357 * salt
20358 */
20359
20360 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
20361 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
20362 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
20363 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
20364
20365 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
20366 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
20367 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
20368 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
20369
20370 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
20371 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
20372 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
20373 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
20374
20375 salt->salt_len = 48;
20376
20377 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
20378
20379 /**
20380 * digest buf
20381 */
20382
20383 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20384 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20385 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20386 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20387 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20388 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20389 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20390 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20391
20392 return (PARSER_OK);
20393 }
20394
20395 int zip2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20396 {
20397 if ((input_len < DISPLAY_LEN_MIN_13600) || (input_len > DISPLAY_LEN_MAX_13600)) return (PARSER_GLOBAL_LENGTH);
20398
20399 if (memcmp (SIGNATURE_ZIP2_START, input_buf , 6)) return (PARSER_SIGNATURE_UNMATCHED);
20400 if (memcmp (SIGNATURE_ZIP2_STOP , input_buf + input_len - 7, 7)) return (PARSER_SIGNATURE_UNMATCHED);
20401
20402 u32 *digest = (u32 *) hash_buf->digest;
20403
20404 salt_t *salt = hash_buf->salt;
20405
20406 zip2_t *zip2 = (zip2_t *) hash_buf->esalt;
20407
20408 /**
20409 * parse line
20410 */
20411
20412 char *param0_pos = input_buf + 6 + 1;
20413
20414 char *param1_pos = strchr (param0_pos, '*');
20415
20416 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20417
20418 u32 param0_len = param1_pos - param0_pos;
20419
20420 param1_pos++;
20421
20422 char *param2_pos = strchr (param1_pos, '*');
20423
20424 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20425
20426 u32 param1_len = param2_pos - param1_pos;
20427
20428 param2_pos++;
20429
20430 char *param3_pos = strchr (param2_pos, '*');
20431
20432 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20433
20434 u32 param2_len = param3_pos - param2_pos;
20435
20436 param3_pos++;
20437
20438 char *param4_pos = strchr (param3_pos, '*');
20439
20440 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20441
20442 u32 param3_len = param4_pos - param3_pos;
20443
20444 param4_pos++;
20445
20446 char *param5_pos = strchr (param4_pos, '*');
20447
20448 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20449
20450 u32 param4_len = param5_pos - param4_pos;
20451
20452 param5_pos++;
20453
20454 char *param6_pos = strchr (param5_pos, '*');
20455
20456 if (param6_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20457
20458 u32 param5_len = param6_pos - param5_pos;
20459
20460 param6_pos++;
20461
20462 char *param7_pos = strchr (param6_pos, '*');
20463
20464 if (param7_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20465
20466 u32 param6_len = param7_pos - param6_pos;
20467
20468 param7_pos++;
20469
20470 char *param8_pos = strchr (param7_pos, '*');
20471
20472 if (param8_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20473
20474 u32 param7_len = param8_pos - param7_pos;
20475
20476 param8_pos++;
20477
20478 const uint type = atoi (param0_pos);
20479 const uint mode = atoi (param1_pos);
20480 const uint magic = atoi (param2_pos);
20481
20482 char *salt_buf = param3_pos;
20483
20484 uint verify_bytes; sscanf (param4_pos, "%4x*", &verify_bytes);
20485
20486 const uint compress_length = atoi (param5_pos);
20487
20488 char *data_buf = param6_pos;
20489 char *auth = param7_pos;
20490
20491 /**
20492 * verify some data
20493 */
20494
20495 if (param0_len != 1) return (PARSER_SALT_VALUE);
20496
20497 if (param1_len != 1) return (PARSER_SALT_VALUE);
20498
20499 if (param2_len != 1) return (PARSER_SALT_VALUE);
20500
20501 if ((param3_len != 16) && (param3_len != 24) && (param3_len != 32)) return (PARSER_SALT_VALUE);
20502
20503 if (param4_len >= 5) return (PARSER_SALT_VALUE);
20504
20505 if (param5_len >= 5) return (PARSER_SALT_VALUE);
20506
20507 if (param6_len >= 8192) return (PARSER_SALT_VALUE);
20508
20509 if (param6_len & 1) return (PARSER_SALT_VALUE);
20510
20511 if (param7_len != 20) return (PARSER_SALT_VALUE);
20512
20513 if (type != 0) return (PARSER_SALT_VALUE);
20514
20515 if ((mode != 1) && (mode != 2) && (mode != 3)) return (PARSER_SALT_VALUE);
20516
20517 if (magic != 0) return (PARSER_SALT_VALUE);
20518
20519 if (verify_bytes >= 0x10000) return (PARSER_SALT_VALUE);
20520
20521 /**
20522 * store data
20523 */
20524
20525 zip2->type = type;
20526 zip2->mode = mode;
20527 zip2->magic = magic;
20528
20529 if (mode == 1)
20530 {
20531 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20532 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20533 zip2->salt_buf[2] = 0;
20534 zip2->salt_buf[3] = 0;
20535
20536 zip2->salt_len = 8;
20537 }
20538 else if (mode == 2)
20539 {
20540 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20541 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20542 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20543 zip2->salt_buf[3] = 0;
20544
20545 zip2->salt_len = 12;
20546 }
20547 else if (mode == 3)
20548 {
20549 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20550 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20551 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20552 zip2->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
20553
20554 zip2->salt_len = 16;
20555 }
20556
20557 zip2->salt_buf[0] = byte_swap_32 (zip2->salt_buf[0]);
20558 zip2->salt_buf[1] = byte_swap_32 (zip2->salt_buf[1]);
20559 zip2->salt_buf[2] = byte_swap_32 (zip2->salt_buf[2]);
20560 zip2->salt_buf[3] = byte_swap_32 (zip2->salt_buf[3]);
20561
20562 zip2->verify_bytes = verify_bytes;
20563
20564 zip2->compress_length = compress_length;
20565
20566 char *data_buf_ptr = (char *) zip2->data_buf;
20567
20568 for (uint i = 0; i < param6_len; i += 2)
20569 {
20570 const char p0 = data_buf[i + 0];
20571 const char p1 = data_buf[i + 1];
20572
20573 *data_buf_ptr++ = hex_convert (p1) << 0
20574 | hex_convert (p0) << 4;
20575
20576 zip2->data_len++;
20577 }
20578
20579 *data_buf_ptr = 0x80;
20580
20581 char *auth_ptr = (char *) zip2->auth_buf;
20582
20583 for (uint i = 0; i < param7_len; i += 2)
20584 {
20585 const char p0 = auth[i + 0];
20586 const char p1 = auth[i + 1];
20587
20588 *auth_ptr++ = hex_convert (p1) << 0
20589 | hex_convert (p0) << 4;
20590
20591 zip2->auth_len++;
20592 }
20593
20594 /**
20595 * salt buf (fake)
20596 */
20597
20598 salt->salt_buf[0] = zip2->salt_buf[0];
20599 salt->salt_buf[1] = zip2->salt_buf[1];
20600 salt->salt_buf[2] = zip2->salt_buf[2];
20601 salt->salt_buf[3] = zip2->salt_buf[3];
20602 salt->salt_buf[4] = zip2->data_buf[0];
20603 salt->salt_buf[5] = zip2->data_buf[1];
20604 salt->salt_buf[6] = zip2->data_buf[2];
20605 salt->salt_buf[7] = zip2->data_buf[3];
20606
20607 salt->salt_len = 32;
20608
20609 salt->salt_iter = ROUNDS_ZIP2 - 1;
20610
20611 /**
20612 * digest buf (fake)
20613 */
20614
20615 digest[0] = zip2->auth_buf[0];
20616 digest[1] = zip2->auth_buf[1];
20617 digest[2] = zip2->auth_buf[2];
20618 digest[3] = zip2->auth_buf[3];
20619
20620 return (PARSER_OK);
20621 }
20622
20623 int win8phone_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20624 {
20625 if ((input_len < DISPLAY_LEN_MIN_13800) || (input_len > DISPLAY_LEN_MAX_13800)) return (PARSER_GLOBAL_LENGTH);
20626
20627 u32 *digest = (u32 *) hash_buf->digest;
20628
20629 salt_t *salt = hash_buf->salt;
20630
20631 win8phone_t *esalt = hash_buf->esalt;
20632
20633 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
20634 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
20635 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
20636 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
20637 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
20638 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
20639 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
20640 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
20641
20642 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
20643
20644 char *salt_buf_ptr = input_buf + 64 + 1;
20645
20646 u32 *salt_buf = esalt->salt_buf;
20647
20648 for (int i = 0, j = 0; i < 32; i += 1, j += 8)
20649 {
20650 salt_buf[i] = hex_to_u32 ((const u8 *) &salt_buf_ptr[j]);
20651 }
20652
20653 salt->salt_buf[0] = salt_buf[0];
20654 salt->salt_buf[1] = salt_buf[1];
20655 salt->salt_buf[2] = salt_buf[2];
20656 salt->salt_buf[3] = salt_buf[3];
20657 salt->salt_buf[4] = salt_buf[4];
20658 salt->salt_buf[5] = salt_buf[5];
20659 salt->salt_buf[6] = salt_buf[6];
20660 salt->salt_buf[7] = salt_buf[7];
20661
20662 salt->salt_len = 64;
20663
20664 return (PARSER_OK);
20665 }
20666
20667 /**
20668 * parallel running threads
20669 */
20670
20671 #ifdef WIN
20672
20673 BOOL WINAPI sigHandler_default (DWORD sig)
20674 {
20675 switch (sig)
20676 {
20677 case CTRL_CLOSE_EVENT:
20678
20679 /*
20680 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
20681 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
20682 * function otherwise it is too late (e.g. after returning from this function)
20683 */
20684
20685 myabort ();
20686
20687 SetConsoleCtrlHandler (NULL, TRUE);
20688
20689 hc_sleep (10);
20690
20691 return TRUE;
20692
20693 case CTRL_C_EVENT:
20694 case CTRL_LOGOFF_EVENT:
20695 case CTRL_SHUTDOWN_EVENT:
20696
20697 myabort ();
20698
20699 SetConsoleCtrlHandler (NULL, TRUE);
20700
20701 return TRUE;
20702 }
20703
20704 return FALSE;
20705 }
20706
20707 BOOL WINAPI sigHandler_benchmark (DWORD sig)
20708 {
20709 switch (sig)
20710 {
20711 case CTRL_CLOSE_EVENT:
20712
20713 myabort ();
20714
20715 SetConsoleCtrlHandler (NULL, TRUE);
20716
20717 hc_sleep (10);
20718
20719 return TRUE;
20720
20721 case CTRL_C_EVENT:
20722 case CTRL_LOGOFF_EVENT:
20723 case CTRL_SHUTDOWN_EVENT:
20724
20725 myquit ();
20726
20727 SetConsoleCtrlHandler (NULL, TRUE);
20728
20729 return TRUE;
20730 }
20731
20732 return FALSE;
20733 }
20734
20735 void hc_signal (BOOL WINAPI (callback) (DWORD))
20736 {
20737 if (callback == NULL)
20738 {
20739 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
20740 }
20741 else
20742 {
20743 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
20744 }
20745 }
20746
20747 #else
20748
20749 void sigHandler_default (int sig)
20750 {
20751 myabort ();
20752
20753 signal (sig, NULL);
20754 }
20755
20756 void sigHandler_benchmark (int sig)
20757 {
20758 myquit ();
20759
20760 signal (sig, NULL);
20761 }
20762
20763 void hc_signal (void (callback) (int))
20764 {
20765 if (callback == NULL) callback = SIG_DFL;
20766
20767 signal (SIGINT, callback);
20768 signal (SIGTERM, callback);
20769 signal (SIGABRT, callback);
20770 }
20771
20772 #endif
20773
20774 void status_display ();
20775
20776 void *thread_keypress (void *p)
20777 {
20778 uint quiet = data.quiet;
20779
20780 tty_break();
20781
20782 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
20783 {
20784 int ch = tty_getchar();
20785
20786 if (ch == -1) break;
20787
20788 if (ch == 0) continue;
20789
20790 //https://github.com/hashcat/hashcat/issues/302
20791 //#ifdef _POSIX
20792 //if (ch != '\n')
20793 //#endif
20794
20795 hc_thread_mutex_lock (mux_display);
20796
20797 log_info ("");
20798
20799 switch (ch)
20800 {
20801 case 's':
20802 case '\r':
20803 case '\n':
20804
20805 log_info ("");
20806
20807 status_display ();
20808
20809 log_info ("");
20810
20811 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20812 if (quiet == 0) fflush (stdout);
20813
20814 break;
20815
20816 case 'b':
20817
20818 log_info ("");
20819
20820 bypass ();
20821
20822 log_info ("");
20823
20824 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20825 if (quiet == 0) fflush (stdout);
20826
20827 break;
20828
20829 case 'p':
20830
20831 log_info ("");
20832
20833 SuspendThreads ();
20834
20835 log_info ("");
20836
20837 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20838 if (quiet == 0) fflush (stdout);
20839
20840 break;
20841
20842 case 'r':
20843
20844 log_info ("");
20845
20846 ResumeThreads ();
20847
20848 log_info ("");
20849
20850 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20851 if (quiet == 0) fflush (stdout);
20852
20853 break;
20854
20855 case 'c':
20856
20857 log_info ("");
20858
20859 stop_at_checkpoint ();
20860
20861 log_info ("");
20862
20863 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20864 if (quiet == 0) fflush (stdout);
20865
20866 break;
20867
20868 case 'q':
20869
20870 log_info ("");
20871
20872 myabort ();
20873
20874 break;
20875 }
20876
20877 //https://github.com/hashcat/hashcat/issues/302
20878 //#ifdef _POSIX
20879 //if (ch != '\n')
20880 //#endif
20881
20882 hc_thread_mutex_unlock (mux_display);
20883 }
20884
20885 tty_fix();
20886
20887 return (p);
20888 }
20889
20890 /**
20891 * rules common
20892 */
20893
20894 bool class_num (const u8 c)
20895 {
20896 return ((c >= '0') && (c <= '9'));
20897 }
20898
20899 bool class_lower (const u8 c)
20900 {
20901 return ((c >= 'a') && (c <= 'z'));
20902 }
20903
20904 bool class_upper (const u8 c)
20905 {
20906 return ((c >= 'A') && (c <= 'Z'));
20907 }
20908
20909 bool class_alpha (const u8 c)
20910 {
20911 return (class_lower (c) || class_upper (c));
20912 }
20913
20914 int conv_ctoi (const u8 c)
20915 {
20916 if (class_num (c))
20917 {
20918 return c - '0';
20919 }
20920 else if (class_upper (c))
20921 {
20922 return c - 'A' + 10;
20923 }
20924
20925 return -1;
20926 }
20927
20928 int conv_itoc (const u8 c)
20929 {
20930 if (c < 10)
20931 {
20932 return c + '0';
20933 }
20934 else if (c < 37)
20935 {
20936 return c + 'A' - 10;
20937 }
20938
20939 return -1;
20940 }
20941
20942 /**
20943 * device rules
20944 */
20945
20946 #define INCR_POS if (++rule_pos == rule_len) return (-1)
20947 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
20948 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
20949 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
20950 #define MAX_KERNEL_RULES 255
20951 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
20952 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20953 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20954
20955 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
20956 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
20957 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20958 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20959
20960 int cpu_rule_to_kernel_rule (char *rule_buf, uint rule_len, kernel_rule_t *rule)
20961 {
20962 uint rule_pos;
20963 uint rule_cnt;
20964
20965 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
20966 {
20967 switch (rule_buf[rule_pos])
20968 {
20969 case ' ':
20970 rule_cnt--;
20971 break;
20972
20973 case RULE_OP_MANGLE_NOOP:
20974 SET_NAME (rule, rule_buf[rule_pos]);
20975 break;
20976
20977 case RULE_OP_MANGLE_LREST:
20978 SET_NAME (rule, rule_buf[rule_pos]);
20979 break;
20980
20981 case RULE_OP_MANGLE_UREST:
20982 SET_NAME (rule, rule_buf[rule_pos]);
20983 break;
20984
20985 case RULE_OP_MANGLE_LREST_UFIRST:
20986 SET_NAME (rule, rule_buf[rule_pos]);
20987 break;
20988
20989 case RULE_OP_MANGLE_UREST_LFIRST:
20990 SET_NAME (rule, rule_buf[rule_pos]);
20991 break;
20992
20993 case RULE_OP_MANGLE_TREST:
20994 SET_NAME (rule, rule_buf[rule_pos]);
20995 break;
20996
20997 case RULE_OP_MANGLE_TOGGLE_AT:
20998 SET_NAME (rule, rule_buf[rule_pos]);
20999 SET_P0_CONV (rule, rule_buf[rule_pos]);
21000 break;
21001
21002 case RULE_OP_MANGLE_REVERSE:
21003 SET_NAME (rule, rule_buf[rule_pos]);
21004 break;
21005
21006 case RULE_OP_MANGLE_DUPEWORD:
21007 SET_NAME (rule, rule_buf[rule_pos]);
21008 break;
21009
21010 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21011 SET_NAME (rule, rule_buf[rule_pos]);
21012 SET_P0_CONV (rule, rule_buf[rule_pos]);
21013 break;
21014
21015 case RULE_OP_MANGLE_REFLECT:
21016 SET_NAME (rule, rule_buf[rule_pos]);
21017 break;
21018
21019 case RULE_OP_MANGLE_ROTATE_LEFT:
21020 SET_NAME (rule, rule_buf[rule_pos]);
21021 break;
21022
21023 case RULE_OP_MANGLE_ROTATE_RIGHT:
21024 SET_NAME (rule, rule_buf[rule_pos]);
21025 break;
21026
21027 case RULE_OP_MANGLE_APPEND:
21028 SET_NAME (rule, rule_buf[rule_pos]);
21029 SET_P0 (rule, rule_buf[rule_pos]);
21030 break;
21031
21032 case RULE_OP_MANGLE_PREPEND:
21033 SET_NAME (rule, rule_buf[rule_pos]);
21034 SET_P0 (rule, rule_buf[rule_pos]);
21035 break;
21036
21037 case RULE_OP_MANGLE_DELETE_FIRST:
21038 SET_NAME (rule, rule_buf[rule_pos]);
21039 break;
21040
21041 case RULE_OP_MANGLE_DELETE_LAST:
21042 SET_NAME (rule, rule_buf[rule_pos]);
21043 break;
21044
21045 case RULE_OP_MANGLE_DELETE_AT:
21046 SET_NAME (rule, rule_buf[rule_pos]);
21047 SET_P0_CONV (rule, rule_buf[rule_pos]);
21048 break;
21049
21050 case RULE_OP_MANGLE_EXTRACT:
21051 SET_NAME (rule, rule_buf[rule_pos]);
21052 SET_P0_CONV (rule, rule_buf[rule_pos]);
21053 SET_P1_CONV (rule, rule_buf[rule_pos]);
21054 break;
21055
21056 case RULE_OP_MANGLE_OMIT:
21057 SET_NAME (rule, rule_buf[rule_pos]);
21058 SET_P0_CONV (rule, rule_buf[rule_pos]);
21059 SET_P1_CONV (rule, rule_buf[rule_pos]);
21060 break;
21061
21062 case RULE_OP_MANGLE_INSERT:
21063 SET_NAME (rule, rule_buf[rule_pos]);
21064 SET_P0_CONV (rule, rule_buf[rule_pos]);
21065 SET_P1 (rule, rule_buf[rule_pos]);
21066 break;
21067
21068 case RULE_OP_MANGLE_OVERSTRIKE:
21069 SET_NAME (rule, rule_buf[rule_pos]);
21070 SET_P0_CONV (rule, rule_buf[rule_pos]);
21071 SET_P1 (rule, rule_buf[rule_pos]);
21072 break;
21073
21074 case RULE_OP_MANGLE_TRUNCATE_AT:
21075 SET_NAME (rule, rule_buf[rule_pos]);
21076 SET_P0_CONV (rule, rule_buf[rule_pos]);
21077 break;
21078
21079 case RULE_OP_MANGLE_REPLACE:
21080 SET_NAME (rule, rule_buf[rule_pos]);
21081 SET_P0 (rule, rule_buf[rule_pos]);
21082 SET_P1 (rule, rule_buf[rule_pos]);
21083 break;
21084
21085 case RULE_OP_MANGLE_PURGECHAR:
21086 return (-1);
21087 break;
21088
21089 case RULE_OP_MANGLE_TOGGLECASE_REC:
21090 return (-1);
21091 break;
21092
21093 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21094 SET_NAME (rule, rule_buf[rule_pos]);
21095 SET_P0_CONV (rule, rule_buf[rule_pos]);
21096 break;
21097
21098 case RULE_OP_MANGLE_DUPECHAR_LAST:
21099 SET_NAME (rule, rule_buf[rule_pos]);
21100 SET_P0_CONV (rule, rule_buf[rule_pos]);
21101 break;
21102
21103 case RULE_OP_MANGLE_DUPECHAR_ALL:
21104 SET_NAME (rule, rule_buf[rule_pos]);
21105 break;
21106
21107 case RULE_OP_MANGLE_SWITCH_FIRST:
21108 SET_NAME (rule, rule_buf[rule_pos]);
21109 break;
21110
21111 case RULE_OP_MANGLE_SWITCH_LAST:
21112 SET_NAME (rule, rule_buf[rule_pos]);
21113 break;
21114
21115 case RULE_OP_MANGLE_SWITCH_AT:
21116 SET_NAME (rule, rule_buf[rule_pos]);
21117 SET_P0_CONV (rule, rule_buf[rule_pos]);
21118 SET_P1_CONV (rule, rule_buf[rule_pos]);
21119 break;
21120
21121 case RULE_OP_MANGLE_CHR_SHIFTL:
21122 SET_NAME (rule, rule_buf[rule_pos]);
21123 SET_P0_CONV (rule, rule_buf[rule_pos]);
21124 break;
21125
21126 case RULE_OP_MANGLE_CHR_SHIFTR:
21127 SET_NAME (rule, rule_buf[rule_pos]);
21128 SET_P0_CONV (rule, rule_buf[rule_pos]);
21129 break;
21130
21131 case RULE_OP_MANGLE_CHR_INCR:
21132 SET_NAME (rule, rule_buf[rule_pos]);
21133 SET_P0_CONV (rule, rule_buf[rule_pos]);
21134 break;
21135
21136 case RULE_OP_MANGLE_CHR_DECR:
21137 SET_NAME (rule, rule_buf[rule_pos]);
21138 SET_P0_CONV (rule, rule_buf[rule_pos]);
21139 break;
21140
21141 case RULE_OP_MANGLE_REPLACE_NP1:
21142 SET_NAME (rule, rule_buf[rule_pos]);
21143 SET_P0_CONV (rule, rule_buf[rule_pos]);
21144 break;
21145
21146 case RULE_OP_MANGLE_REPLACE_NM1:
21147 SET_NAME (rule, rule_buf[rule_pos]);
21148 SET_P0_CONV (rule, rule_buf[rule_pos]);
21149 break;
21150
21151 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21152 SET_NAME (rule, rule_buf[rule_pos]);
21153 SET_P0_CONV (rule, rule_buf[rule_pos]);
21154 break;
21155
21156 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21157 SET_NAME (rule, rule_buf[rule_pos]);
21158 SET_P0_CONV (rule, rule_buf[rule_pos]);
21159 break;
21160
21161 case RULE_OP_MANGLE_TITLE:
21162 SET_NAME (rule, rule_buf[rule_pos]);
21163 break;
21164
21165 default:
21166 return (-1);
21167 break;
21168 }
21169 }
21170
21171 if (rule_pos < rule_len) return (-1);
21172
21173 return (0);
21174 }
21175
21176 int kernel_rule_to_cpu_rule (char *rule_buf, kernel_rule_t *rule)
21177 {
21178 uint rule_cnt;
21179 uint rule_pos;
21180 uint rule_len = HCBUFSIZ - 1; // maximum possible len
21181
21182 char rule_cmd;
21183
21184 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
21185 {
21186 GET_NAME (rule);
21187
21188 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
21189
21190 switch (rule_cmd)
21191 {
21192 case RULE_OP_MANGLE_NOOP:
21193 rule_buf[rule_pos] = rule_cmd;
21194 break;
21195
21196 case RULE_OP_MANGLE_LREST:
21197 rule_buf[rule_pos] = rule_cmd;
21198 break;
21199
21200 case RULE_OP_MANGLE_UREST:
21201 rule_buf[rule_pos] = rule_cmd;
21202 break;
21203
21204 case RULE_OP_MANGLE_LREST_UFIRST:
21205 rule_buf[rule_pos] = rule_cmd;
21206 break;
21207
21208 case RULE_OP_MANGLE_UREST_LFIRST:
21209 rule_buf[rule_pos] = rule_cmd;
21210 break;
21211
21212 case RULE_OP_MANGLE_TREST:
21213 rule_buf[rule_pos] = rule_cmd;
21214 break;
21215
21216 case RULE_OP_MANGLE_TOGGLE_AT:
21217 rule_buf[rule_pos] = rule_cmd;
21218 GET_P0_CONV (rule);
21219 break;
21220
21221 case RULE_OP_MANGLE_REVERSE:
21222 rule_buf[rule_pos] = rule_cmd;
21223 break;
21224
21225 case RULE_OP_MANGLE_DUPEWORD:
21226 rule_buf[rule_pos] = rule_cmd;
21227 break;
21228
21229 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21230 rule_buf[rule_pos] = rule_cmd;
21231 GET_P0_CONV (rule);
21232 break;
21233
21234 case RULE_OP_MANGLE_REFLECT:
21235 rule_buf[rule_pos] = rule_cmd;
21236 break;
21237
21238 case RULE_OP_MANGLE_ROTATE_LEFT:
21239 rule_buf[rule_pos] = rule_cmd;
21240 break;
21241
21242 case RULE_OP_MANGLE_ROTATE_RIGHT:
21243 rule_buf[rule_pos] = rule_cmd;
21244 break;
21245
21246 case RULE_OP_MANGLE_APPEND:
21247 rule_buf[rule_pos] = rule_cmd;
21248 GET_P0 (rule);
21249 break;
21250
21251 case RULE_OP_MANGLE_PREPEND:
21252 rule_buf[rule_pos] = rule_cmd;
21253 GET_P0 (rule);
21254 break;
21255
21256 case RULE_OP_MANGLE_DELETE_FIRST:
21257 rule_buf[rule_pos] = rule_cmd;
21258 break;
21259
21260 case RULE_OP_MANGLE_DELETE_LAST:
21261 rule_buf[rule_pos] = rule_cmd;
21262 break;
21263
21264 case RULE_OP_MANGLE_DELETE_AT:
21265 rule_buf[rule_pos] = rule_cmd;
21266 GET_P0_CONV (rule);
21267 break;
21268
21269 case RULE_OP_MANGLE_EXTRACT:
21270 rule_buf[rule_pos] = rule_cmd;
21271 GET_P0_CONV (rule);
21272 GET_P1_CONV (rule);
21273 break;
21274
21275 case RULE_OP_MANGLE_OMIT:
21276 rule_buf[rule_pos] = rule_cmd;
21277 GET_P0_CONV (rule);
21278 GET_P1_CONV (rule);
21279 break;
21280
21281 case RULE_OP_MANGLE_INSERT:
21282 rule_buf[rule_pos] = rule_cmd;
21283 GET_P0_CONV (rule);
21284 GET_P1 (rule);
21285 break;
21286
21287 case RULE_OP_MANGLE_OVERSTRIKE:
21288 rule_buf[rule_pos] = rule_cmd;
21289 GET_P0_CONV (rule);
21290 GET_P1 (rule);
21291 break;
21292
21293 case RULE_OP_MANGLE_TRUNCATE_AT:
21294 rule_buf[rule_pos] = rule_cmd;
21295 GET_P0_CONV (rule);
21296 break;
21297
21298 case RULE_OP_MANGLE_REPLACE:
21299 rule_buf[rule_pos] = rule_cmd;
21300 GET_P0 (rule);
21301 GET_P1 (rule);
21302 break;
21303
21304 case RULE_OP_MANGLE_PURGECHAR:
21305 return (-1);
21306 break;
21307
21308 case RULE_OP_MANGLE_TOGGLECASE_REC:
21309 return (-1);
21310 break;
21311
21312 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21313 rule_buf[rule_pos] = rule_cmd;
21314 GET_P0_CONV (rule);
21315 break;
21316
21317 case RULE_OP_MANGLE_DUPECHAR_LAST:
21318 rule_buf[rule_pos] = rule_cmd;
21319 GET_P0_CONV (rule);
21320 break;
21321
21322 case RULE_OP_MANGLE_DUPECHAR_ALL:
21323 rule_buf[rule_pos] = rule_cmd;
21324 break;
21325
21326 case RULE_OP_MANGLE_SWITCH_FIRST:
21327 rule_buf[rule_pos] = rule_cmd;
21328 break;
21329
21330 case RULE_OP_MANGLE_SWITCH_LAST:
21331 rule_buf[rule_pos] = rule_cmd;
21332 break;
21333
21334 case RULE_OP_MANGLE_SWITCH_AT:
21335 rule_buf[rule_pos] = rule_cmd;
21336 GET_P0_CONV (rule);
21337 GET_P1_CONV (rule);
21338 break;
21339
21340 case RULE_OP_MANGLE_CHR_SHIFTL:
21341 rule_buf[rule_pos] = rule_cmd;
21342 GET_P0_CONV (rule);
21343 break;
21344
21345 case RULE_OP_MANGLE_CHR_SHIFTR:
21346 rule_buf[rule_pos] = rule_cmd;
21347 GET_P0_CONV (rule);
21348 break;
21349
21350 case RULE_OP_MANGLE_CHR_INCR:
21351 rule_buf[rule_pos] = rule_cmd;
21352 GET_P0_CONV (rule);
21353 break;
21354
21355 case RULE_OP_MANGLE_CHR_DECR:
21356 rule_buf[rule_pos] = rule_cmd;
21357 GET_P0_CONV (rule);
21358 break;
21359
21360 case RULE_OP_MANGLE_REPLACE_NP1:
21361 rule_buf[rule_pos] = rule_cmd;
21362 GET_P0_CONV (rule);
21363 break;
21364
21365 case RULE_OP_MANGLE_REPLACE_NM1:
21366 rule_buf[rule_pos] = rule_cmd;
21367 GET_P0_CONV (rule);
21368 break;
21369
21370 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21371 rule_buf[rule_pos] = rule_cmd;
21372 GET_P0_CONV (rule);
21373 break;
21374
21375 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21376 rule_buf[rule_pos] = rule_cmd;
21377 GET_P0_CONV (rule);
21378 break;
21379
21380 case RULE_OP_MANGLE_TITLE:
21381 rule_buf[rule_pos] = rule_cmd;
21382 break;
21383
21384 case 0:
21385 return rule_pos - 1;
21386 break;
21387
21388 default:
21389 return (-1);
21390 break;
21391 }
21392 }
21393
21394 if (rule_cnt > 0)
21395 {
21396 return rule_pos;
21397 }
21398
21399 return (-1);
21400 }
21401
21402 /**
21403 * CPU rules : this is from hashcat sources, cpu based rules
21404 */
21405
21406 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
21407 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
21408
21409 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
21410 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
21411 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
21412
21413 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
21414 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
21415 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
21416
21417 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
21418 {
21419 int pos;
21420
21421 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
21422
21423 return (arr_len);
21424 }
21425
21426 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
21427 {
21428 int pos;
21429
21430 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
21431
21432 return (arr_len);
21433 }
21434
21435 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
21436 {
21437 int pos;
21438
21439 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
21440
21441 return (arr_len);
21442 }
21443
21444 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
21445 {
21446 int l;
21447 int r;
21448
21449 for (l = 0; l < arr_len; l++)
21450 {
21451 r = arr_len - 1 - l;
21452
21453 if (l >= r) break;
21454
21455 MANGLE_SWITCH (arr, l, r);
21456 }
21457
21458 return (arr_len);
21459 }
21460
21461 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
21462 {
21463 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21464
21465 memcpy (&arr[arr_len], arr, (size_t) arr_len);
21466
21467 return (arr_len * 2);
21468 }
21469
21470 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
21471 {
21472 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
21473
21474 int orig_len = arr_len;
21475
21476 int i;
21477
21478 for (i = 0; i < times; i++)
21479 {
21480 memcpy (&arr[arr_len], arr, orig_len);
21481
21482 arr_len += orig_len;
21483 }
21484
21485 return (arr_len);
21486 }
21487
21488 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
21489 {
21490 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21491
21492 mangle_double (arr, arr_len);
21493
21494 mangle_reverse (arr + arr_len, arr_len);
21495
21496 return (arr_len * 2);
21497 }
21498
21499 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
21500 {
21501 int l;
21502 int r;
21503
21504 for (l = 0, r = arr_len - 1; r > 0; r--)
21505 {
21506 MANGLE_SWITCH (arr, l, r);
21507 }
21508
21509 return (arr_len);
21510 }
21511
21512 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
21513 {
21514 int l;
21515 int r;
21516
21517 for (l = 0, r = arr_len - 1; l < r; l++)
21518 {
21519 MANGLE_SWITCH (arr, l, r);
21520 }
21521
21522 return (arr_len);
21523 }
21524
21525 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
21526 {
21527 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21528
21529 arr[arr_len] = c;
21530
21531 return (arr_len + 1);
21532 }
21533
21534 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
21535 {
21536 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21537
21538 int arr_pos;
21539
21540 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21541 {
21542 arr[arr_pos + 1] = arr[arr_pos];
21543 }
21544
21545 arr[0] = c;
21546
21547 return (arr_len + 1);
21548 }
21549
21550 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21551 {
21552 if (upos >= arr_len) return (arr_len);
21553
21554 int arr_pos;
21555
21556 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
21557 {
21558 arr[arr_pos] = arr[arr_pos + 1];
21559 }
21560
21561 return (arr_len - 1);
21562 }
21563
21564 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21565 {
21566 if (upos >= arr_len) return (arr_len);
21567
21568 if ((upos + ulen) > arr_len) return (arr_len);
21569
21570 int arr_pos;
21571
21572 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
21573 {
21574 arr[arr_pos] = arr[upos + arr_pos];
21575 }
21576
21577 return (ulen);
21578 }
21579
21580 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21581 {
21582 if (upos >= arr_len) return (arr_len);
21583
21584 if ((upos + ulen) >= arr_len) return (arr_len);
21585
21586 int arr_pos;
21587
21588 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
21589 {
21590 arr[arr_pos] = arr[arr_pos + ulen];
21591 }
21592
21593 return (arr_len - ulen);
21594 }
21595
21596 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21597 {
21598 if (upos >= arr_len) return (arr_len);
21599
21600 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21601
21602 int arr_pos;
21603
21604 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
21605 {
21606 arr[arr_pos + 1] = arr[arr_pos];
21607 }
21608
21609 arr[upos] = c;
21610
21611 return (arr_len + 1);
21612 }
21613
21614 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)
21615 {
21616 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21617
21618 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
21619
21620 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
21621
21622 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
21623
21624 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
21625
21626 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
21627
21628 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
21629
21630 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
21631
21632 return (arr_len + arr2_cpy);
21633 }
21634
21635 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21636 {
21637 if (upos >= arr_len) return (arr_len);
21638
21639 arr[upos] = c;
21640
21641 return (arr_len);
21642 }
21643
21644 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21645 {
21646 if (upos >= arr_len) return (arr_len);
21647
21648 memset (arr + upos, 0, arr_len - upos);
21649
21650 return (upos);
21651 }
21652
21653 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
21654 {
21655 int arr_pos;
21656
21657 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
21658 {
21659 if (arr[arr_pos] != oldc) continue;
21660
21661 arr[arr_pos] = newc;
21662 }
21663
21664 return (arr_len);
21665 }
21666
21667 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
21668 {
21669 int arr_pos;
21670
21671 int ret_len;
21672
21673 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
21674 {
21675 if (arr[arr_pos] == c) continue;
21676
21677 arr[ret_len] = arr[arr_pos];
21678
21679 ret_len++;
21680 }
21681
21682 return (ret_len);
21683 }
21684
21685 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
21686 {
21687 if (ulen > arr_len) return (arr_len);
21688
21689 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21690
21691 char cs[100] = { 0 };
21692
21693 memcpy (cs, arr, ulen);
21694
21695 int i;
21696
21697 for (i = 0; i < ulen; i++)
21698 {
21699 char c = cs[i];
21700
21701 arr_len = mangle_insert (arr, arr_len, i, c);
21702 }
21703
21704 return (arr_len);
21705 }
21706
21707 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
21708 {
21709 if (ulen > arr_len) return (arr_len);
21710
21711 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21712
21713 int upos = arr_len - ulen;
21714
21715 int i;
21716
21717 for (i = 0; i < ulen; i++)
21718 {
21719 char c = arr[upos + i];
21720
21721 arr_len = mangle_append (arr, arr_len, c);
21722 }
21723
21724 return (arr_len);
21725 }
21726
21727 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21728 {
21729 if ( arr_len == 0) return (arr_len);
21730 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21731
21732 char c = arr[upos];
21733
21734 int i;
21735
21736 for (i = 0; i < ulen; i++)
21737 {
21738 arr_len = mangle_insert (arr, arr_len, upos, c);
21739 }
21740
21741 return (arr_len);
21742 }
21743
21744 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
21745 {
21746 if ( arr_len == 0) return (arr_len);
21747 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
21748
21749 int arr_pos;
21750
21751 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21752 {
21753 int new_pos = arr_pos * 2;
21754
21755 arr[new_pos] = arr[arr_pos];
21756
21757 arr[new_pos + 1] = arr[arr_pos];
21758 }
21759
21760 return (arr_len * 2);
21761 }
21762
21763 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21764 {
21765 if (upos >= arr_len) return (arr_len);
21766 if (upos2 >= arr_len) return (arr_len);
21767
21768 MANGLE_SWITCH (arr, upos, upos2);
21769
21770 return (arr_len);
21771 }
21772
21773 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21774 {
21775 MANGLE_SWITCH (arr, upos, upos2);
21776
21777 return (arr_len);
21778 }
21779
21780 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
21781 {
21782 if (upos >= arr_len) return (arr_len);
21783
21784 arr[upos] <<= 1;
21785
21786 return (arr_len);
21787 }
21788
21789 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
21790 {
21791 if (upos >= arr_len) return (arr_len);
21792
21793 arr[upos] >>= 1;
21794
21795 return (arr_len);
21796 }
21797
21798 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
21799 {
21800 if (upos >= arr_len) return (arr_len);
21801
21802 arr[upos] += 1;
21803
21804 return (arr_len);
21805 }
21806
21807 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
21808 {
21809 if (upos >= arr_len) return (arr_len);
21810
21811 arr[upos] -= 1;
21812
21813 return (arr_len);
21814 }
21815
21816 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
21817 {
21818 int upper_next = 1;
21819
21820 int pos;
21821
21822 for (pos = 0; pos < arr_len; pos++)
21823 {
21824 if (arr[pos] == ' ')
21825 {
21826 upper_next = 1;
21827
21828 continue;
21829 }
21830
21831 if (upper_next)
21832 {
21833 upper_next = 0;
21834
21835 MANGLE_UPPER_AT (arr, pos);
21836 }
21837 else
21838 {
21839 MANGLE_LOWER_AT (arr, pos);
21840 }
21841 }
21842
21843 return (arr_len);
21844 }
21845
21846 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
21847 {
21848 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
21849
21850 u32 j;
21851
21852 u32 rule_pos = 0;
21853
21854 for (j = 0; j < rp_gen_num; j++)
21855 {
21856 u32 r = 0;
21857 u32 p1 = 0;
21858 u32 p2 = 0;
21859 u32 p3 = 0;
21860
21861 switch ((char) get_random_num (0, 9))
21862 {
21863 case 0:
21864 r = get_random_num (0, sizeof (grp_op_nop));
21865 rule_buf[rule_pos++] = grp_op_nop[r];
21866 break;
21867
21868 case 1:
21869 r = get_random_num (0, sizeof (grp_op_pos_p0));
21870 rule_buf[rule_pos++] = grp_op_pos_p0[r];
21871 p1 = get_random_num (0, sizeof (grp_pos));
21872 rule_buf[rule_pos++] = grp_pos[p1];
21873 break;
21874
21875 case 2:
21876 r = get_random_num (0, sizeof (grp_op_pos_p1));
21877 rule_buf[rule_pos++] = grp_op_pos_p1[r];
21878 p1 = get_random_num (1, 6);
21879 rule_buf[rule_pos++] = grp_pos[p1];
21880 break;
21881
21882 case 3:
21883 r = get_random_num (0, sizeof (grp_op_chr));
21884 rule_buf[rule_pos++] = grp_op_chr[r];
21885 p1 = get_random_num (0x20, 0x7e);
21886 rule_buf[rule_pos++] = (char) p1;
21887 break;
21888
21889 case 4:
21890 r = get_random_num (0, sizeof (grp_op_chr_chr));
21891 rule_buf[rule_pos++] = grp_op_chr_chr[r];
21892 p1 = get_random_num (0x20, 0x7e);
21893 rule_buf[rule_pos++] = (char) p1;
21894 p2 = get_random_num (0x20, 0x7e);
21895 while (p1 == p2)
21896 p2 = get_random_num (0x20, 0x7e);
21897 rule_buf[rule_pos++] = (char) p2;
21898 break;
21899
21900 case 5:
21901 r = get_random_num (0, sizeof (grp_op_pos_chr));
21902 rule_buf[rule_pos++] = grp_op_pos_chr[r];
21903 p1 = get_random_num (0, sizeof (grp_pos));
21904 rule_buf[rule_pos++] = grp_pos[p1];
21905 p2 = get_random_num (0x20, 0x7e);
21906 rule_buf[rule_pos++] = (char) p2;
21907 break;
21908
21909 case 6:
21910 r = get_random_num (0, sizeof (grp_op_pos_pos0));
21911 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
21912 p1 = get_random_num (0, sizeof (grp_pos));
21913 rule_buf[rule_pos++] = grp_pos[p1];
21914 p2 = get_random_num (0, sizeof (grp_pos));
21915 while (p1 == p2)
21916 p2 = get_random_num (0, sizeof (grp_pos));
21917 rule_buf[rule_pos++] = grp_pos[p2];
21918 break;
21919
21920 case 7:
21921 r = get_random_num (0, sizeof (grp_op_pos_pos1));
21922 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
21923 p1 = get_random_num (0, sizeof (grp_pos));
21924 rule_buf[rule_pos++] = grp_pos[p1];
21925 p2 = get_random_num (1, sizeof (grp_pos));
21926 while (p1 == p2)
21927 p2 = get_random_num (1, sizeof (grp_pos));
21928 rule_buf[rule_pos++] = grp_pos[p2];
21929 break;
21930
21931 case 8:
21932 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
21933 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
21934 p1 = get_random_num (0, sizeof (grp_pos));
21935 rule_buf[rule_pos++] = grp_pos[p1];
21936 p2 = get_random_num (1, sizeof (grp_pos));
21937 rule_buf[rule_pos++] = grp_pos[p1];
21938 p3 = get_random_num (0, sizeof (grp_pos));
21939 rule_buf[rule_pos++] = grp_pos[p3];
21940 break;
21941 }
21942 }
21943
21944 return (rule_pos);
21945 }
21946
21947 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
21948 {
21949 char mem[BLOCK_SIZE] = { 0 };
21950
21951 if (in == NULL) return (RULE_RC_REJECT_ERROR);
21952
21953 if (out == NULL) return (RULE_RC_REJECT_ERROR);
21954
21955 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21956
21957 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
21958
21959 int out_len = in_len;
21960 int mem_len = in_len;
21961
21962 memcpy (out, in, out_len);
21963
21964 int rule_pos;
21965
21966 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
21967 {
21968 int upos, upos2;
21969 int ulen;
21970
21971 switch (rule[rule_pos])
21972 {
21973 case ' ':
21974 break;
21975
21976 case RULE_OP_MANGLE_NOOP:
21977 break;
21978
21979 case RULE_OP_MANGLE_LREST:
21980 out_len = mangle_lrest (out, out_len);
21981 break;
21982
21983 case RULE_OP_MANGLE_UREST:
21984 out_len = mangle_urest (out, out_len);
21985 break;
21986
21987 case RULE_OP_MANGLE_LREST_UFIRST:
21988 out_len = mangle_lrest (out, out_len);
21989 if (out_len) MANGLE_UPPER_AT (out, 0);
21990 break;
21991
21992 case RULE_OP_MANGLE_UREST_LFIRST:
21993 out_len = mangle_urest (out, out_len);
21994 if (out_len) MANGLE_LOWER_AT (out, 0);
21995 break;
21996
21997 case RULE_OP_MANGLE_TREST:
21998 out_len = mangle_trest (out, out_len);
21999 break;
22000
22001 case RULE_OP_MANGLE_TOGGLE_AT:
22002 NEXT_RULEPOS (rule_pos);
22003 NEXT_RPTOI (rule, rule_pos, upos);
22004 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
22005 break;
22006
22007 case RULE_OP_MANGLE_REVERSE:
22008 out_len = mangle_reverse (out, out_len);
22009 break;
22010
22011 case RULE_OP_MANGLE_DUPEWORD:
22012 out_len = mangle_double (out, out_len);
22013 break;
22014
22015 case RULE_OP_MANGLE_DUPEWORD_TIMES:
22016 NEXT_RULEPOS (rule_pos);
22017 NEXT_RPTOI (rule, rule_pos, ulen);
22018 out_len = mangle_double_times (out, out_len, ulen);
22019 break;
22020
22021 case RULE_OP_MANGLE_REFLECT:
22022 out_len = mangle_reflect (out, out_len);
22023 break;
22024
22025 case RULE_OP_MANGLE_ROTATE_LEFT:
22026 mangle_rotate_left (out, out_len);
22027 break;
22028
22029 case RULE_OP_MANGLE_ROTATE_RIGHT:
22030 mangle_rotate_right (out, out_len);
22031 break;
22032
22033 case RULE_OP_MANGLE_APPEND:
22034 NEXT_RULEPOS (rule_pos);
22035 out_len = mangle_append (out, out_len, rule[rule_pos]);
22036 break;
22037
22038 case RULE_OP_MANGLE_PREPEND:
22039 NEXT_RULEPOS (rule_pos);
22040 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
22041 break;
22042
22043 case RULE_OP_MANGLE_DELETE_FIRST:
22044 out_len = mangle_delete_at (out, out_len, 0);
22045 break;
22046
22047 case RULE_OP_MANGLE_DELETE_LAST:
22048 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
22049 break;
22050
22051 case RULE_OP_MANGLE_DELETE_AT:
22052 NEXT_RULEPOS (rule_pos);
22053 NEXT_RPTOI (rule, rule_pos, upos);
22054 out_len = mangle_delete_at (out, out_len, upos);
22055 break;
22056
22057 case RULE_OP_MANGLE_EXTRACT:
22058 NEXT_RULEPOS (rule_pos);
22059 NEXT_RPTOI (rule, rule_pos, upos);
22060 NEXT_RULEPOS (rule_pos);
22061 NEXT_RPTOI (rule, rule_pos, ulen);
22062 out_len = mangle_extract (out, out_len, upos, ulen);
22063 break;
22064
22065 case RULE_OP_MANGLE_OMIT:
22066 NEXT_RULEPOS (rule_pos);
22067 NEXT_RPTOI (rule, rule_pos, upos);
22068 NEXT_RULEPOS (rule_pos);
22069 NEXT_RPTOI (rule, rule_pos, ulen);
22070 out_len = mangle_omit (out, out_len, upos, ulen);
22071 break;
22072
22073 case RULE_OP_MANGLE_INSERT:
22074 NEXT_RULEPOS (rule_pos);
22075 NEXT_RPTOI (rule, rule_pos, upos);
22076 NEXT_RULEPOS (rule_pos);
22077 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
22078 break;
22079
22080 case RULE_OP_MANGLE_OVERSTRIKE:
22081 NEXT_RULEPOS (rule_pos);
22082 NEXT_RPTOI (rule, rule_pos, upos);
22083 NEXT_RULEPOS (rule_pos);
22084 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
22085 break;
22086
22087 case RULE_OP_MANGLE_TRUNCATE_AT:
22088 NEXT_RULEPOS (rule_pos);
22089 NEXT_RPTOI (rule, rule_pos, upos);
22090 out_len = mangle_truncate_at (out, out_len, upos);
22091 break;
22092
22093 case RULE_OP_MANGLE_REPLACE:
22094 NEXT_RULEPOS (rule_pos);
22095 NEXT_RULEPOS (rule_pos);
22096 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
22097 break;
22098
22099 case RULE_OP_MANGLE_PURGECHAR:
22100 NEXT_RULEPOS (rule_pos);
22101 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
22102 break;
22103
22104 case RULE_OP_MANGLE_TOGGLECASE_REC:
22105 /* todo */
22106 break;
22107
22108 case RULE_OP_MANGLE_DUPECHAR_FIRST:
22109 NEXT_RULEPOS (rule_pos);
22110 NEXT_RPTOI (rule, rule_pos, ulen);
22111 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
22112 break;
22113
22114 case RULE_OP_MANGLE_DUPECHAR_LAST:
22115 NEXT_RULEPOS (rule_pos);
22116 NEXT_RPTOI (rule, rule_pos, ulen);
22117 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
22118 break;
22119
22120 case RULE_OP_MANGLE_DUPECHAR_ALL:
22121 out_len = mangle_dupechar (out, out_len);
22122 break;
22123
22124 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
22125 NEXT_RULEPOS (rule_pos);
22126 NEXT_RPTOI (rule, rule_pos, ulen);
22127 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
22128 break;
22129
22130 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
22131 NEXT_RULEPOS (rule_pos);
22132 NEXT_RPTOI (rule, rule_pos, ulen);
22133 out_len = mangle_dupeblock_append (out, out_len, ulen);
22134 break;
22135
22136 case RULE_OP_MANGLE_SWITCH_FIRST:
22137 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
22138 break;
22139
22140 case RULE_OP_MANGLE_SWITCH_LAST:
22141 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
22142 break;
22143
22144 case RULE_OP_MANGLE_SWITCH_AT:
22145 NEXT_RULEPOS (rule_pos);
22146 NEXT_RPTOI (rule, rule_pos, upos);
22147 NEXT_RULEPOS (rule_pos);
22148 NEXT_RPTOI (rule, rule_pos, upos2);
22149 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
22150 break;
22151
22152 case RULE_OP_MANGLE_CHR_SHIFTL:
22153 NEXT_RULEPOS (rule_pos);
22154 NEXT_RPTOI (rule, rule_pos, upos);
22155 mangle_chr_shiftl (out, out_len, upos);
22156 break;
22157
22158 case RULE_OP_MANGLE_CHR_SHIFTR:
22159 NEXT_RULEPOS (rule_pos);
22160 NEXT_RPTOI (rule, rule_pos, upos);
22161 mangle_chr_shiftr (out, out_len, upos);
22162 break;
22163
22164 case RULE_OP_MANGLE_CHR_INCR:
22165 NEXT_RULEPOS (rule_pos);
22166 NEXT_RPTOI (rule, rule_pos, upos);
22167 mangle_chr_incr (out, out_len, upos);
22168 break;
22169
22170 case RULE_OP_MANGLE_CHR_DECR:
22171 NEXT_RULEPOS (rule_pos);
22172 NEXT_RPTOI (rule, rule_pos, upos);
22173 mangle_chr_decr (out, out_len, upos);
22174 break;
22175
22176 case RULE_OP_MANGLE_REPLACE_NP1:
22177 NEXT_RULEPOS (rule_pos);
22178 NEXT_RPTOI (rule, rule_pos, upos);
22179 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
22180 break;
22181
22182 case RULE_OP_MANGLE_REPLACE_NM1:
22183 NEXT_RULEPOS (rule_pos);
22184 NEXT_RPTOI (rule, rule_pos, upos);
22185 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
22186 break;
22187
22188 case RULE_OP_MANGLE_TITLE:
22189 out_len = mangle_title (out, out_len);
22190 break;
22191
22192 case RULE_OP_MANGLE_EXTRACT_MEMORY:
22193 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22194 NEXT_RULEPOS (rule_pos);
22195 NEXT_RPTOI (rule, rule_pos, upos);
22196 NEXT_RULEPOS (rule_pos);
22197 NEXT_RPTOI (rule, rule_pos, ulen);
22198 NEXT_RULEPOS (rule_pos);
22199 NEXT_RPTOI (rule, rule_pos, upos2);
22200 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
22201 break;
22202
22203 case RULE_OP_MANGLE_APPEND_MEMORY:
22204 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22205 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22206 memcpy (out + out_len, mem, mem_len);
22207 out_len += mem_len;
22208 break;
22209
22210 case RULE_OP_MANGLE_PREPEND_MEMORY:
22211 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22212 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22213 memcpy (mem + mem_len, out, out_len);
22214 out_len += mem_len;
22215 memcpy (out, mem, out_len);
22216 break;
22217
22218 case RULE_OP_MEMORIZE_WORD:
22219 memcpy (mem, out, out_len);
22220 mem_len = out_len;
22221 break;
22222
22223 case RULE_OP_REJECT_LESS:
22224 NEXT_RULEPOS (rule_pos);
22225 NEXT_RPTOI (rule, rule_pos, upos);
22226 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
22227 break;
22228
22229 case RULE_OP_REJECT_GREATER:
22230 NEXT_RULEPOS (rule_pos);
22231 NEXT_RPTOI (rule, rule_pos, upos);
22232 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
22233 break;
22234
22235 case RULE_OP_REJECT_CONTAIN:
22236 NEXT_RULEPOS (rule_pos);
22237 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
22238 break;
22239
22240 case RULE_OP_REJECT_NOT_CONTAIN:
22241 NEXT_RULEPOS (rule_pos);
22242 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
22243 break;
22244
22245 case RULE_OP_REJECT_EQUAL_FIRST:
22246 NEXT_RULEPOS (rule_pos);
22247 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22248 break;
22249
22250 case RULE_OP_REJECT_EQUAL_LAST:
22251 NEXT_RULEPOS (rule_pos);
22252 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22253 break;
22254
22255 case RULE_OP_REJECT_EQUAL_AT:
22256 NEXT_RULEPOS (rule_pos);
22257 NEXT_RPTOI (rule, rule_pos, upos);
22258 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22259 NEXT_RULEPOS (rule_pos);
22260 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22261 break;
22262
22263 case RULE_OP_REJECT_CONTAINS:
22264 NEXT_RULEPOS (rule_pos);
22265 NEXT_RPTOI (rule, rule_pos, upos);
22266 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22267 NEXT_RULEPOS (rule_pos);
22268 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
22269 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
22270 break;
22271
22272 case RULE_OP_REJECT_MEMORY:
22273 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
22274 break;
22275
22276 default:
22277 return (RULE_RC_SYNTAX_ERROR);
22278 break;
22279 }
22280 }
22281
22282 memset (out + out_len, 0, BLOCK_SIZE - out_len);
22283
22284 return (out_len);
22285 }