cadae6572687ad8e1561134371acaee52893a8e5
[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 void 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
115 void log_out_nn (FILE *fp, const char *fmt, ...)
116 {
117 if (SUPPRESS_OUTPUT) return;
118
119 va_list ap;
120
121 va_start (ap, fmt);
122
123 log_final (fp, fmt, ap);
124
125 va_end (ap);
126 }
127
128 void log_info_nn (const char *fmt, ...)
129 {
130 if (SUPPRESS_OUTPUT) return;
131
132 va_list ap;
133
134 va_start (ap, fmt);
135
136 log_final (stdout, fmt, ap);
137
138 va_end (ap);
139 }
140
141 void log_error_nn (const char *fmt, ...)
142 {
143 if (SUPPRESS_OUTPUT) return;
144
145 va_list ap;
146
147 va_start (ap, fmt);
148
149 log_final (stderr, fmt, ap);
150
151 va_end (ap);
152 }
153
154 void log_out (FILE *fp, const char *fmt, ...)
155 {
156 if (SUPPRESS_OUTPUT) return;
157
158 va_list ap;
159
160 va_start (ap, fmt);
161
162 log_final (fp, fmt, ap);
163
164 va_end (ap);
165
166 fputc ('\n', fp);
167
168 last_len = 0;
169 }
170
171 void log_info (const char *fmt, ...)
172 {
173 if (SUPPRESS_OUTPUT) return;
174
175 va_list ap;
176
177 va_start (ap, fmt);
178
179 log_final (stdout, fmt, ap);
180
181 va_end (ap);
182
183 fputc ('\n', stdout);
184
185 last_len = 0;
186 }
187
188 void log_error (const char *fmt, ...)
189 {
190 if (SUPPRESS_OUTPUT) return;
191
192 fputc ('\n', stderr);
193 fputc ('\n', stderr);
194
195 va_list ap;
196
197 va_start (ap, fmt);
198
199 log_final (stderr, fmt, ap);
200
201 va_end (ap);
202
203 fputc ('\n', stderr);
204 fputc ('\n', stderr);
205
206 last_len = 0;
207 }
208
209 /**
210 * converter
211 */
212
213 u8 int_to_base32 (const u8 c)
214 {
215 static const u8 tbl[0x20] =
216 {
217 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
218 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
219 };
220
221 return tbl[c];
222 }
223
224 u8 base32_to_int (const u8 c)
225 {
226 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
227 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
228
229 return 0;
230 }
231
232 u8 int_to_itoa32 (const u8 c)
233 {
234 static const u8 tbl[0x20] =
235 {
236 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
237 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
238 };
239
240 return tbl[c];
241 }
242
243 u8 itoa32_to_int (const u8 c)
244 {
245 if ((c >= '0') && (c <= '9')) return c - '0';
246 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
247
248 return 0;
249 }
250
251 u8 int_to_itoa64 (const u8 c)
252 {
253 static const u8 tbl[0x40] =
254 {
255 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
256 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
257 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
258 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
259 };
260
261 return tbl[c];
262 }
263
264 u8 itoa64_to_int (const u8 c)
265 {
266 static const u8 tbl[0x100] =
267 {
268 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
269 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
270 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
271 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
272 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
273 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
274 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
275 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
276 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
277 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
278 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
279 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
280 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
281 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
282 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
283 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
284 };
285
286 return tbl[c];
287 }
288
289 u8 int_to_base64 (const u8 c)
290 {
291 static const u8 tbl[0x40] =
292 {
293 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
294 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
295 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
296 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
297 };
298
299 return tbl[c];
300 }
301
302 u8 base64_to_int (const u8 c)
303 {
304 static const u8 tbl[0x100] =
305 {
306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
309 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
311 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
313 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 };
323
324 return tbl[c];
325 }
326
327 u8 int_to_bf64 (const u8 c)
328 {
329 static const u8 tbl[0x40] =
330 {
331 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
332 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
333 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
334 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
335 };
336
337 return tbl[c];
338 }
339
340 u8 bf64_to_int (const u8 c)
341 {
342 static const u8 tbl[0x100] =
343 {
344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
347 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
349 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
351 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 };
361
362 return tbl[c];
363 }
364
365 u8 int_to_lotus64 (const u8 c)
366 {
367 if (c < 10) return '0' + c;
368 else if (c < 36) return 'A' + c - 10;
369 else if (c < 62) return 'a' + c - 36;
370 else if (c == 62) return '+';
371 else if (c == 63) return '/';
372
373 return 0;
374 }
375
376 u8 lotus64_to_int (const u8 c)
377 {
378 if ((c >= '0') && (c <= '9')) return c - '0';
379 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
380 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
381 else if (c == '+') return 62;
382 else if (c == '/') return 63;
383 else
384
385 return 0;
386 }
387
388 int base32_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
389 {
390 const u8 *in_ptr = in_buf;
391
392 u8 *out_ptr = out_buf;
393
394 for (int i = 0; i < in_len; i += 8)
395 {
396 const u8 out_val0 = f (in_ptr[0] & 0x7f);
397 const u8 out_val1 = f (in_ptr[1] & 0x7f);
398 const u8 out_val2 = f (in_ptr[2] & 0x7f);
399 const u8 out_val3 = f (in_ptr[3] & 0x7f);
400 const u8 out_val4 = f (in_ptr[4] & 0x7f);
401 const u8 out_val5 = f (in_ptr[5] & 0x7f);
402 const u8 out_val6 = f (in_ptr[6] & 0x7f);
403 const u8 out_val7 = f (in_ptr[7] & 0x7f);
404
405 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
406 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
407 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
408 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
409 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
410
411 in_ptr += 8;
412 out_ptr += 5;
413 }
414
415 for (int i = 0; i < in_len; i++)
416 {
417 if (in_buf[i] != '=') continue;
418
419 in_len = i;
420 }
421
422 int out_len = (in_len * 5) / 8;
423
424 return out_len;
425 }
426
427 int base32_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
428 {
429 const u8 *in_ptr = in_buf;
430
431 u8 *out_ptr = out_buf;
432
433 for (int i = 0; i < in_len; i += 5)
434 {
435 const u8 out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
436 const u8 out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
437 const u8 out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
438 const u8 out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
439 const u8 out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
440 const u8 out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
441 const u8 out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
442 const u8 out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
443
444 out_ptr[0] = out_val0 & 0x7f;
445 out_ptr[1] = out_val1 & 0x7f;
446 out_ptr[2] = out_val2 & 0x7f;
447 out_ptr[3] = out_val3 & 0x7f;
448 out_ptr[4] = out_val4 & 0x7f;
449 out_ptr[5] = out_val5 & 0x7f;
450 out_ptr[6] = out_val6 & 0x7f;
451 out_ptr[7] = out_val7 & 0x7f;
452
453 in_ptr += 5;
454 out_ptr += 8;
455 }
456
457 int out_len = (int) (((0.5 + (float) in_len) * 8) / 5); // ceil (in_len * 8 / 5)
458
459 while (out_len % 8)
460 {
461 out_buf[out_len] = '=';
462
463 out_len++;
464 }
465
466 return out_len;
467 }
468
469 int base64_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
470 {
471 const u8 *in_ptr = in_buf;
472
473 u8 *out_ptr = out_buf;
474
475 for (int i = 0; i < in_len; i += 4)
476 {
477 const u8 out_val0 = f (in_ptr[0] & 0x7f);
478 const u8 out_val1 = f (in_ptr[1] & 0x7f);
479 const u8 out_val2 = f (in_ptr[2] & 0x7f);
480 const u8 out_val3 = f (in_ptr[3] & 0x7f);
481
482 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
483 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
484 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
485
486 in_ptr += 4;
487 out_ptr += 3;
488 }
489
490 for (int i = 0; i < in_len; i++)
491 {
492 if (in_buf[i] != '=') continue;
493
494 in_len = i;
495 }
496
497 int out_len = (in_len * 6) / 8;
498
499 return out_len;
500 }
501
502 int base64_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
503 {
504 const u8 *in_ptr = in_buf;
505
506 u8 *out_ptr = out_buf;
507
508 for (int i = 0; i < in_len; i += 3)
509 {
510 const u8 out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
511 const u8 out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
512 const u8 out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
513 const u8 out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
514
515 out_ptr[0] = out_val0 & 0x7f;
516 out_ptr[1] = out_val1 & 0x7f;
517 out_ptr[2] = out_val2 & 0x7f;
518 out_ptr[3] = out_val3 & 0x7f;
519
520 in_ptr += 3;
521 out_ptr += 4;
522 }
523
524 int out_len = (int) (((0.5 + (float) in_len) * 8) / 6); // ceil (in_len * 8 / 6)
525
526 while (out_len % 4)
527 {
528 out_buf[out_len] = '=';
529
530 out_len++;
531 }
532
533 return out_len;
534 }
535
536 int is_valid_hex_char (const u8 c)
537 {
538 if ((c >= '0') && (c <= '9')) return 1;
539 if ((c >= 'A') && (c <= 'F')) return 1;
540 if ((c >= 'a') && (c <= 'f')) return 1;
541
542 return 0;
543 }
544
545 u8 hex_convert (const u8 c)
546 {
547 return (c & 15) + (c >> 6) * 9;
548 }
549
550 u8 hex_to_u8 (const u8 hex[2])
551 {
552 u8 v = 0;
553
554 v |= (hex_convert (hex[1]) << 0);
555 v |= (hex_convert (hex[0]) << 4);
556
557 return (v);
558 }
559
560 u32 hex_to_u32 (const u8 hex[8])
561 {
562 u32 v = 0;
563
564 v |= ((u32) hex_convert (hex[7])) << 0;
565 v |= ((u32) hex_convert (hex[6])) << 4;
566 v |= ((u32) hex_convert (hex[5])) << 8;
567 v |= ((u32) hex_convert (hex[4])) << 12;
568 v |= ((u32) hex_convert (hex[3])) << 16;
569 v |= ((u32) hex_convert (hex[2])) << 20;
570 v |= ((u32) hex_convert (hex[1])) << 24;
571 v |= ((u32) hex_convert (hex[0])) << 28;
572
573 return (v);
574 }
575
576 u64 hex_to_u64 (const u8 hex[16])
577 {
578 u64 v = 0;
579
580 v |= ((u64) hex_convert (hex[15]) << 0);
581 v |= ((u64) hex_convert (hex[14]) << 4);
582 v |= ((u64) hex_convert (hex[13]) << 8);
583 v |= ((u64) hex_convert (hex[12]) << 12);
584 v |= ((u64) hex_convert (hex[11]) << 16);
585 v |= ((u64) hex_convert (hex[10]) << 20);
586 v |= ((u64) hex_convert (hex[ 9]) << 24);
587 v |= ((u64) hex_convert (hex[ 8]) << 28);
588 v |= ((u64) hex_convert (hex[ 7]) << 32);
589 v |= ((u64) hex_convert (hex[ 6]) << 36);
590 v |= ((u64) hex_convert (hex[ 5]) << 40);
591 v |= ((u64) hex_convert (hex[ 4]) << 44);
592 v |= ((u64) hex_convert (hex[ 3]) << 48);
593 v |= ((u64) hex_convert (hex[ 2]) << 52);
594 v |= ((u64) hex_convert (hex[ 1]) << 56);
595 v |= ((u64) hex_convert (hex[ 0]) << 60);
596
597 return (v);
598 }
599
600 void bin_to_hex_lower (const u32 v, u8 hex[8])
601 {
602 hex[0] = v >> 28 & 15;
603 hex[1] = v >> 24 & 15;
604 hex[2] = v >> 20 & 15;
605 hex[3] = v >> 16 & 15;
606 hex[4] = v >> 12 & 15;
607 hex[5] = v >> 8 & 15;
608 hex[6] = v >> 4 & 15;
609 hex[7] = v >> 0 & 15;
610
611 u32 add;
612
613 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
614 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
615 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
616 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
617 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
618 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
619 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
620 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
621 }
622
623 /**
624 * decoder
625 */
626
627 static void AES128_decrypt_cbc (const u32 key[4], const u32 iv[4], const u32 in[16], u32 out[16])
628 {
629 AES_KEY skey;
630
631 AES_set_decrypt_key ((const u8 *) key, 128, &skey);
632
633 u32 _iv[4] = { 0 };
634
635 _iv[0] = iv[0];
636 _iv[1] = iv[1];
637 _iv[2] = iv[2];
638 _iv[3] = iv[3];
639
640 for (int i = 0; i < 16; i += 4)
641 {
642 u32 _in[4] = { 0 };
643 u32 _out[4] = { 0 };
644
645 _in[0] = in[i + 0];
646 _in[1] = in[i + 1];
647 _in[2] = in[i + 2];
648 _in[3] = in[i + 3];
649
650 AES_decrypt (&skey, (const u8 *) _in, (u8 *) _out);
651
652 _out[0] ^= _iv[0];
653 _out[1] ^= _iv[1];
654 _out[2] ^= _iv[2];
655 _out[3] ^= _iv[3];
656
657 out[i + 0] = _out[0];
658 out[i + 1] = _out[1];
659 out[i + 2] = _out[2];
660 out[i + 3] = _out[3];
661
662 _iv[0] = _in[0];
663 _iv[1] = _in[1];
664 _iv[2] = _in[2];
665 _iv[3] = _in[3];
666 }
667 }
668
669 static void juniper_decrypt_hash (char *in, char *out)
670 {
671 // base64 decode
672
673 u8 base64_buf[100] = { 0 };
674
675 base64_decode (base64_to_int, (const u8 *) in, DISPLAY_LEN_MIN_501, base64_buf);
676
677 // iv stuff
678
679 u32 juniper_iv[4] = { 0 };
680
681 memcpy (juniper_iv, base64_buf, 12);
682
683 memcpy (out, juniper_iv, 12);
684
685 // reversed key
686
687 u32 juniper_key[4] = { 0 };
688
689 juniper_key[0] = byte_swap_32 (0xa6707a7e);
690 juniper_key[1] = byte_swap_32 (0x8df91059);
691 juniper_key[2] = byte_swap_32 (0xdea70ae5);
692 juniper_key[3] = byte_swap_32 (0x2f9c2442);
693
694 // AES decrypt
695
696 u32 *in_ptr = (u32 *) (base64_buf + 12);
697 u32 *out_ptr = (u32 *) (out + 12);
698
699 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
700 }
701
702 void phpass_decode (u8 digest[16], u8 buf[22])
703 {
704 int l;
705
706 l = itoa64_to_int (buf[ 0]) << 0;
707 l |= itoa64_to_int (buf[ 1]) << 6;
708 l |= itoa64_to_int (buf[ 2]) << 12;
709 l |= itoa64_to_int (buf[ 3]) << 18;
710
711 digest[ 0] = (l >> 0) & 0xff;
712 digest[ 1] = (l >> 8) & 0xff;
713 digest[ 2] = (l >> 16) & 0xff;
714
715 l = itoa64_to_int (buf[ 4]) << 0;
716 l |= itoa64_to_int (buf[ 5]) << 6;
717 l |= itoa64_to_int (buf[ 6]) << 12;
718 l |= itoa64_to_int (buf[ 7]) << 18;
719
720 digest[ 3] = (l >> 0) & 0xff;
721 digest[ 4] = (l >> 8) & 0xff;
722 digest[ 5] = (l >> 16) & 0xff;
723
724 l = itoa64_to_int (buf[ 8]) << 0;
725 l |= itoa64_to_int (buf[ 9]) << 6;
726 l |= itoa64_to_int (buf[10]) << 12;
727 l |= itoa64_to_int (buf[11]) << 18;
728
729 digest[ 6] = (l >> 0) & 0xff;
730 digest[ 7] = (l >> 8) & 0xff;
731 digest[ 8] = (l >> 16) & 0xff;
732
733 l = itoa64_to_int (buf[12]) << 0;
734 l |= itoa64_to_int (buf[13]) << 6;
735 l |= itoa64_to_int (buf[14]) << 12;
736 l |= itoa64_to_int (buf[15]) << 18;
737
738 digest[ 9] = (l >> 0) & 0xff;
739 digest[10] = (l >> 8) & 0xff;
740 digest[11] = (l >> 16) & 0xff;
741
742 l = itoa64_to_int (buf[16]) << 0;
743 l |= itoa64_to_int (buf[17]) << 6;
744 l |= itoa64_to_int (buf[18]) << 12;
745 l |= itoa64_to_int (buf[19]) << 18;
746
747 digest[12] = (l >> 0) & 0xff;
748 digest[13] = (l >> 8) & 0xff;
749 digest[14] = (l >> 16) & 0xff;
750
751 l = itoa64_to_int (buf[20]) << 0;
752 l |= itoa64_to_int (buf[21]) << 6;
753
754 digest[15] = (l >> 0) & 0xff;
755 }
756
757 void phpass_encode (u8 digest[16], u8 buf[22])
758 {
759 int l;
760
761 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
762
763 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
764 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
765 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
766 buf[ 3] = int_to_itoa64 (l & 0x3f);
767
768 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
769
770 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
771 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
772 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
773 buf[ 7] = int_to_itoa64 (l & 0x3f);
774
775 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
776
777 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
778 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
779 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
780 buf[11] = int_to_itoa64 (l & 0x3f);
781
782 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
783
784 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
785 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
786 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
787 buf[15] = int_to_itoa64 (l & 0x3f);
788
789 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
790
791 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
792 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
793 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
794 buf[19] = int_to_itoa64 (l & 0x3f);
795
796 l = (digest[15] << 0);
797
798 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
799 buf[21] = int_to_itoa64 (l & 0x3f);
800 }
801
802 void md5crypt_decode (u8 digest[16], u8 buf[22])
803 {
804 int l;
805
806 l = itoa64_to_int (buf[ 0]) << 0;
807 l |= itoa64_to_int (buf[ 1]) << 6;
808 l |= itoa64_to_int (buf[ 2]) << 12;
809 l |= itoa64_to_int (buf[ 3]) << 18;
810
811 digest[ 0] = (l >> 16) & 0xff;
812 digest[ 6] = (l >> 8) & 0xff;
813 digest[12] = (l >> 0) & 0xff;
814
815 l = itoa64_to_int (buf[ 4]) << 0;
816 l |= itoa64_to_int (buf[ 5]) << 6;
817 l |= itoa64_to_int (buf[ 6]) << 12;
818 l |= itoa64_to_int (buf[ 7]) << 18;
819
820 digest[ 1] = (l >> 16) & 0xff;
821 digest[ 7] = (l >> 8) & 0xff;
822 digest[13] = (l >> 0) & 0xff;
823
824 l = itoa64_to_int (buf[ 8]) << 0;
825 l |= itoa64_to_int (buf[ 9]) << 6;
826 l |= itoa64_to_int (buf[10]) << 12;
827 l |= itoa64_to_int (buf[11]) << 18;
828
829 digest[ 2] = (l >> 16) & 0xff;
830 digest[ 8] = (l >> 8) & 0xff;
831 digest[14] = (l >> 0) & 0xff;
832
833 l = itoa64_to_int (buf[12]) << 0;
834 l |= itoa64_to_int (buf[13]) << 6;
835 l |= itoa64_to_int (buf[14]) << 12;
836 l |= itoa64_to_int (buf[15]) << 18;
837
838 digest[ 3] = (l >> 16) & 0xff;
839 digest[ 9] = (l >> 8) & 0xff;
840 digest[15] = (l >> 0) & 0xff;
841
842 l = itoa64_to_int (buf[16]) << 0;
843 l |= itoa64_to_int (buf[17]) << 6;
844 l |= itoa64_to_int (buf[18]) << 12;
845 l |= itoa64_to_int (buf[19]) << 18;
846
847 digest[ 4] = (l >> 16) & 0xff;
848 digest[10] = (l >> 8) & 0xff;
849 digest[ 5] = (l >> 0) & 0xff;
850
851 l = itoa64_to_int (buf[20]) << 0;
852 l |= itoa64_to_int (buf[21]) << 6;
853
854 digest[11] = (l >> 0) & 0xff;
855 }
856
857 void md5crypt_encode (u8 digest[16], u8 buf[22])
858 {
859 int l;
860
861 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
862
863 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
864 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
865 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
866 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
867
868 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
869
870 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
871 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
872 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
873 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
874
875 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
876
877 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
878 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
879 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
880 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
881
882 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
883
884 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
885 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
886 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
887 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
888
889 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
890
891 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
892 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
893 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
894 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
895
896 l = (digest[11] << 0);
897
898 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
899 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
900 }
901
902 void sha512crypt_decode (u8 digest[64], u8 buf[86])
903 {
904 int l;
905
906 l = itoa64_to_int (buf[ 0]) << 0;
907 l |= itoa64_to_int (buf[ 1]) << 6;
908 l |= itoa64_to_int (buf[ 2]) << 12;
909 l |= itoa64_to_int (buf[ 3]) << 18;
910
911 digest[ 0] = (l >> 16) & 0xff;
912 digest[21] = (l >> 8) & 0xff;
913 digest[42] = (l >> 0) & 0xff;
914
915 l = itoa64_to_int (buf[ 4]) << 0;
916 l |= itoa64_to_int (buf[ 5]) << 6;
917 l |= itoa64_to_int (buf[ 6]) << 12;
918 l |= itoa64_to_int (buf[ 7]) << 18;
919
920 digest[22] = (l >> 16) & 0xff;
921 digest[43] = (l >> 8) & 0xff;
922 digest[ 1] = (l >> 0) & 0xff;
923
924 l = itoa64_to_int (buf[ 8]) << 0;
925 l |= itoa64_to_int (buf[ 9]) << 6;
926 l |= itoa64_to_int (buf[10]) << 12;
927 l |= itoa64_to_int (buf[11]) << 18;
928
929 digest[44] = (l >> 16) & 0xff;
930 digest[ 2] = (l >> 8) & 0xff;
931 digest[23] = (l >> 0) & 0xff;
932
933 l = itoa64_to_int (buf[12]) << 0;
934 l |= itoa64_to_int (buf[13]) << 6;
935 l |= itoa64_to_int (buf[14]) << 12;
936 l |= itoa64_to_int (buf[15]) << 18;
937
938 digest[ 3] = (l >> 16) & 0xff;
939 digest[24] = (l >> 8) & 0xff;
940 digest[45] = (l >> 0) & 0xff;
941
942 l = itoa64_to_int (buf[16]) << 0;
943 l |= itoa64_to_int (buf[17]) << 6;
944 l |= itoa64_to_int (buf[18]) << 12;
945 l |= itoa64_to_int (buf[19]) << 18;
946
947 digest[25] = (l >> 16) & 0xff;
948 digest[46] = (l >> 8) & 0xff;
949 digest[ 4] = (l >> 0) & 0xff;
950
951 l = itoa64_to_int (buf[20]) << 0;
952 l |= itoa64_to_int (buf[21]) << 6;
953 l |= itoa64_to_int (buf[22]) << 12;
954 l |= itoa64_to_int (buf[23]) << 18;
955
956 digest[47] = (l >> 16) & 0xff;
957 digest[ 5] = (l >> 8) & 0xff;
958 digest[26] = (l >> 0) & 0xff;
959
960 l = itoa64_to_int (buf[24]) << 0;
961 l |= itoa64_to_int (buf[25]) << 6;
962 l |= itoa64_to_int (buf[26]) << 12;
963 l |= itoa64_to_int (buf[27]) << 18;
964
965 digest[ 6] = (l >> 16) & 0xff;
966 digest[27] = (l >> 8) & 0xff;
967 digest[48] = (l >> 0) & 0xff;
968
969 l = itoa64_to_int (buf[28]) << 0;
970 l |= itoa64_to_int (buf[29]) << 6;
971 l |= itoa64_to_int (buf[30]) << 12;
972 l |= itoa64_to_int (buf[31]) << 18;
973
974 digest[28] = (l >> 16) & 0xff;
975 digest[49] = (l >> 8) & 0xff;
976 digest[ 7] = (l >> 0) & 0xff;
977
978 l = itoa64_to_int (buf[32]) << 0;
979 l |= itoa64_to_int (buf[33]) << 6;
980 l |= itoa64_to_int (buf[34]) << 12;
981 l |= itoa64_to_int (buf[35]) << 18;
982
983 digest[50] = (l >> 16) & 0xff;
984 digest[ 8] = (l >> 8) & 0xff;
985 digest[29] = (l >> 0) & 0xff;
986
987 l = itoa64_to_int (buf[36]) << 0;
988 l |= itoa64_to_int (buf[37]) << 6;
989 l |= itoa64_to_int (buf[38]) << 12;
990 l |= itoa64_to_int (buf[39]) << 18;
991
992 digest[ 9] = (l >> 16) & 0xff;
993 digest[30] = (l >> 8) & 0xff;
994 digest[51] = (l >> 0) & 0xff;
995
996 l = itoa64_to_int (buf[40]) << 0;
997 l |= itoa64_to_int (buf[41]) << 6;
998 l |= itoa64_to_int (buf[42]) << 12;
999 l |= itoa64_to_int (buf[43]) << 18;
1000
1001 digest[31] = (l >> 16) & 0xff;
1002 digest[52] = (l >> 8) & 0xff;
1003 digest[10] = (l >> 0) & 0xff;
1004
1005 l = itoa64_to_int (buf[44]) << 0;
1006 l |= itoa64_to_int (buf[45]) << 6;
1007 l |= itoa64_to_int (buf[46]) << 12;
1008 l |= itoa64_to_int (buf[47]) << 18;
1009
1010 digest[53] = (l >> 16) & 0xff;
1011 digest[11] = (l >> 8) & 0xff;
1012 digest[32] = (l >> 0) & 0xff;
1013
1014 l = itoa64_to_int (buf[48]) << 0;
1015 l |= itoa64_to_int (buf[49]) << 6;
1016 l |= itoa64_to_int (buf[50]) << 12;
1017 l |= itoa64_to_int (buf[51]) << 18;
1018
1019 digest[12] = (l >> 16) & 0xff;
1020 digest[33] = (l >> 8) & 0xff;
1021 digest[54] = (l >> 0) & 0xff;
1022
1023 l = itoa64_to_int (buf[52]) << 0;
1024 l |= itoa64_to_int (buf[53]) << 6;
1025 l |= itoa64_to_int (buf[54]) << 12;
1026 l |= itoa64_to_int (buf[55]) << 18;
1027
1028 digest[34] = (l >> 16) & 0xff;
1029 digest[55] = (l >> 8) & 0xff;
1030 digest[13] = (l >> 0) & 0xff;
1031
1032 l = itoa64_to_int (buf[56]) << 0;
1033 l |= itoa64_to_int (buf[57]) << 6;
1034 l |= itoa64_to_int (buf[58]) << 12;
1035 l |= itoa64_to_int (buf[59]) << 18;
1036
1037 digest[56] = (l >> 16) & 0xff;
1038 digest[14] = (l >> 8) & 0xff;
1039 digest[35] = (l >> 0) & 0xff;
1040
1041 l = itoa64_to_int (buf[60]) << 0;
1042 l |= itoa64_to_int (buf[61]) << 6;
1043 l |= itoa64_to_int (buf[62]) << 12;
1044 l |= itoa64_to_int (buf[63]) << 18;
1045
1046 digest[15] = (l >> 16) & 0xff;
1047 digest[36] = (l >> 8) & 0xff;
1048 digest[57] = (l >> 0) & 0xff;
1049
1050 l = itoa64_to_int (buf[64]) << 0;
1051 l |= itoa64_to_int (buf[65]) << 6;
1052 l |= itoa64_to_int (buf[66]) << 12;
1053 l |= itoa64_to_int (buf[67]) << 18;
1054
1055 digest[37] = (l >> 16) & 0xff;
1056 digest[58] = (l >> 8) & 0xff;
1057 digest[16] = (l >> 0) & 0xff;
1058
1059 l = itoa64_to_int (buf[68]) << 0;
1060 l |= itoa64_to_int (buf[69]) << 6;
1061 l |= itoa64_to_int (buf[70]) << 12;
1062 l |= itoa64_to_int (buf[71]) << 18;
1063
1064 digest[59] = (l >> 16) & 0xff;
1065 digest[17] = (l >> 8) & 0xff;
1066 digest[38] = (l >> 0) & 0xff;
1067
1068 l = itoa64_to_int (buf[72]) << 0;
1069 l |= itoa64_to_int (buf[73]) << 6;
1070 l |= itoa64_to_int (buf[74]) << 12;
1071 l |= itoa64_to_int (buf[75]) << 18;
1072
1073 digest[18] = (l >> 16) & 0xff;
1074 digest[39] = (l >> 8) & 0xff;
1075 digest[60] = (l >> 0) & 0xff;
1076
1077 l = itoa64_to_int (buf[76]) << 0;
1078 l |= itoa64_to_int (buf[77]) << 6;
1079 l |= itoa64_to_int (buf[78]) << 12;
1080 l |= itoa64_to_int (buf[79]) << 18;
1081
1082 digest[40] = (l >> 16) & 0xff;
1083 digest[61] = (l >> 8) & 0xff;
1084 digest[19] = (l >> 0) & 0xff;
1085
1086 l = itoa64_to_int (buf[80]) << 0;
1087 l |= itoa64_to_int (buf[81]) << 6;
1088 l |= itoa64_to_int (buf[82]) << 12;
1089 l |= itoa64_to_int (buf[83]) << 18;
1090
1091 digest[62] = (l >> 16) & 0xff;
1092 digest[20] = (l >> 8) & 0xff;
1093 digest[41] = (l >> 0) & 0xff;
1094
1095 l = itoa64_to_int (buf[84]) << 0;
1096 l |= itoa64_to_int (buf[85]) << 6;
1097
1098 digest[63] = (l >> 0) & 0xff;
1099 }
1100
1101 void sha512crypt_encode (u8 digest[64], u8 buf[86])
1102 {
1103 int l;
1104
1105 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1106
1107 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1108 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1109 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1110 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1111
1112 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1113
1114 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1115 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1116 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1117 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1118
1119 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1120
1121 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1122 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1123 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1124 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1125
1126 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1127
1128 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1129 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1130 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1131 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1132
1133 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1134
1135 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1136 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1137 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1138 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1139
1140 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1141
1142 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1143 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1144 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1145 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1146
1147 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1148
1149 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1150 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1151 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1152 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1153
1154 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1155
1156 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1157 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1158 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1159 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1160
1161 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1162
1163 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1164 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1165 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1166 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1167
1168 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1169
1170 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1171 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1172 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1173 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1174
1175 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1176
1177 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1178 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1179 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1180 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1181
1182 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1183
1184 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1185 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1186 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1187 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1188
1189 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1190
1191 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1192 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1193 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1194 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1195
1196 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1197
1198 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1199 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1200 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1201 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1202
1203 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1204
1205 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1206 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1207 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1208 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1209
1210 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1211
1212 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1213 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1214 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1215 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1216
1217 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1218
1219 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1220 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1221 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1222 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1223
1224 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1225
1226 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1227 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1228 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1229 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1230
1231 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1232
1233 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1234 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1235 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1236 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1237
1238 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1239
1240 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1241 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1242 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1243 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1244
1245 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1246
1247 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1248 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1249 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1250 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1251
1252 l = 0 | 0 | (digest[63] << 0);
1253
1254 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1255 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1256 }
1257
1258 void sha1aix_decode (u8 digest[20], u8 buf[27])
1259 {
1260 int l;
1261
1262 l = itoa64_to_int (buf[ 0]) << 0;
1263 l |= itoa64_to_int (buf[ 1]) << 6;
1264 l |= itoa64_to_int (buf[ 2]) << 12;
1265 l |= itoa64_to_int (buf[ 3]) << 18;
1266
1267 digest[ 2] = (l >> 0) & 0xff;
1268 digest[ 1] = (l >> 8) & 0xff;
1269 digest[ 0] = (l >> 16) & 0xff;
1270
1271 l = itoa64_to_int (buf[ 4]) << 0;
1272 l |= itoa64_to_int (buf[ 5]) << 6;
1273 l |= itoa64_to_int (buf[ 6]) << 12;
1274 l |= itoa64_to_int (buf[ 7]) << 18;
1275
1276 digest[ 5] = (l >> 0) & 0xff;
1277 digest[ 4] = (l >> 8) & 0xff;
1278 digest[ 3] = (l >> 16) & 0xff;
1279
1280 l = itoa64_to_int (buf[ 8]) << 0;
1281 l |= itoa64_to_int (buf[ 9]) << 6;
1282 l |= itoa64_to_int (buf[10]) << 12;
1283 l |= itoa64_to_int (buf[11]) << 18;
1284
1285 digest[ 8] = (l >> 0) & 0xff;
1286 digest[ 7] = (l >> 8) & 0xff;
1287 digest[ 6] = (l >> 16) & 0xff;
1288
1289 l = itoa64_to_int (buf[12]) << 0;
1290 l |= itoa64_to_int (buf[13]) << 6;
1291 l |= itoa64_to_int (buf[14]) << 12;
1292 l |= itoa64_to_int (buf[15]) << 18;
1293
1294 digest[11] = (l >> 0) & 0xff;
1295 digest[10] = (l >> 8) & 0xff;
1296 digest[ 9] = (l >> 16) & 0xff;
1297
1298 l = itoa64_to_int (buf[16]) << 0;
1299 l |= itoa64_to_int (buf[17]) << 6;
1300 l |= itoa64_to_int (buf[18]) << 12;
1301 l |= itoa64_to_int (buf[19]) << 18;
1302
1303 digest[14] = (l >> 0) & 0xff;
1304 digest[13] = (l >> 8) & 0xff;
1305 digest[12] = (l >> 16) & 0xff;
1306
1307 l = itoa64_to_int (buf[20]) << 0;
1308 l |= itoa64_to_int (buf[21]) << 6;
1309 l |= itoa64_to_int (buf[22]) << 12;
1310 l |= itoa64_to_int (buf[23]) << 18;
1311
1312 digest[17] = (l >> 0) & 0xff;
1313 digest[16] = (l >> 8) & 0xff;
1314 digest[15] = (l >> 16) & 0xff;
1315
1316 l = itoa64_to_int (buf[24]) << 0;
1317 l |= itoa64_to_int (buf[25]) << 6;
1318 l |= itoa64_to_int (buf[26]) << 12;
1319
1320 digest[19] = (l >> 8) & 0xff;
1321 digest[18] = (l >> 16) & 0xff;
1322 }
1323
1324 void sha1aix_encode (u8 digest[20], u8 buf[27])
1325 {
1326 int l;
1327
1328 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1329
1330 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1331 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1332 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1333 buf[ 3] = int_to_itoa64 (l & 0x3f);
1334
1335 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1336
1337 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1338 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1339 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1340 buf[ 7] = int_to_itoa64 (l & 0x3f);
1341
1342 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1343
1344 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1345 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1346 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1347 buf[11] = int_to_itoa64 (l & 0x3f);
1348
1349 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1350
1351 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1352 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1353 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1354 buf[15] = int_to_itoa64 (l & 0x3f);
1355
1356 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1357
1358 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1359 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1360 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1361 buf[19] = int_to_itoa64 (l & 0x3f);
1362
1363 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1364
1365 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1366 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1367 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1368 buf[23] = int_to_itoa64 (l & 0x3f);
1369
1370 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1371
1372 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1373 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1374 buf[26] = int_to_itoa64 (l & 0x3f);
1375 }
1376
1377 void sha256aix_decode (u8 digest[32], u8 buf[43])
1378 {
1379 int l;
1380
1381 l = itoa64_to_int (buf[ 0]) << 0;
1382 l |= itoa64_to_int (buf[ 1]) << 6;
1383 l |= itoa64_to_int (buf[ 2]) << 12;
1384 l |= itoa64_to_int (buf[ 3]) << 18;
1385
1386 digest[ 2] = (l >> 0) & 0xff;
1387 digest[ 1] = (l >> 8) & 0xff;
1388 digest[ 0] = (l >> 16) & 0xff;
1389
1390 l = itoa64_to_int (buf[ 4]) << 0;
1391 l |= itoa64_to_int (buf[ 5]) << 6;
1392 l |= itoa64_to_int (buf[ 6]) << 12;
1393 l |= itoa64_to_int (buf[ 7]) << 18;
1394
1395 digest[ 5] = (l >> 0) & 0xff;
1396 digest[ 4] = (l >> 8) & 0xff;
1397 digest[ 3] = (l >> 16) & 0xff;
1398
1399 l = itoa64_to_int (buf[ 8]) << 0;
1400 l |= itoa64_to_int (buf[ 9]) << 6;
1401 l |= itoa64_to_int (buf[10]) << 12;
1402 l |= itoa64_to_int (buf[11]) << 18;
1403
1404 digest[ 8] = (l >> 0) & 0xff;
1405 digest[ 7] = (l >> 8) & 0xff;
1406 digest[ 6] = (l >> 16) & 0xff;
1407
1408 l = itoa64_to_int (buf[12]) << 0;
1409 l |= itoa64_to_int (buf[13]) << 6;
1410 l |= itoa64_to_int (buf[14]) << 12;
1411 l |= itoa64_to_int (buf[15]) << 18;
1412
1413 digest[11] = (l >> 0) & 0xff;
1414 digest[10] = (l >> 8) & 0xff;
1415 digest[ 9] = (l >> 16) & 0xff;
1416
1417 l = itoa64_to_int (buf[16]) << 0;
1418 l |= itoa64_to_int (buf[17]) << 6;
1419 l |= itoa64_to_int (buf[18]) << 12;
1420 l |= itoa64_to_int (buf[19]) << 18;
1421
1422 digest[14] = (l >> 0) & 0xff;
1423 digest[13] = (l >> 8) & 0xff;
1424 digest[12] = (l >> 16) & 0xff;
1425
1426 l = itoa64_to_int (buf[20]) << 0;
1427 l |= itoa64_to_int (buf[21]) << 6;
1428 l |= itoa64_to_int (buf[22]) << 12;
1429 l |= itoa64_to_int (buf[23]) << 18;
1430
1431 digest[17] = (l >> 0) & 0xff;
1432 digest[16] = (l >> 8) & 0xff;
1433 digest[15] = (l >> 16) & 0xff;
1434
1435 l = itoa64_to_int (buf[24]) << 0;
1436 l |= itoa64_to_int (buf[25]) << 6;
1437 l |= itoa64_to_int (buf[26]) << 12;
1438 l |= itoa64_to_int (buf[27]) << 18;
1439
1440 digest[20] = (l >> 0) & 0xff;
1441 digest[19] = (l >> 8) & 0xff;
1442 digest[18] = (l >> 16) & 0xff;
1443
1444 l = itoa64_to_int (buf[28]) << 0;
1445 l |= itoa64_to_int (buf[29]) << 6;
1446 l |= itoa64_to_int (buf[30]) << 12;
1447 l |= itoa64_to_int (buf[31]) << 18;
1448
1449 digest[23] = (l >> 0) & 0xff;
1450 digest[22] = (l >> 8) & 0xff;
1451 digest[21] = (l >> 16) & 0xff;
1452
1453 l = itoa64_to_int (buf[32]) << 0;
1454 l |= itoa64_to_int (buf[33]) << 6;
1455 l |= itoa64_to_int (buf[34]) << 12;
1456 l |= itoa64_to_int (buf[35]) << 18;
1457
1458 digest[26] = (l >> 0) & 0xff;
1459 digest[25] = (l >> 8) & 0xff;
1460 digest[24] = (l >> 16) & 0xff;
1461
1462 l = itoa64_to_int (buf[36]) << 0;
1463 l |= itoa64_to_int (buf[37]) << 6;
1464 l |= itoa64_to_int (buf[38]) << 12;
1465 l |= itoa64_to_int (buf[39]) << 18;
1466
1467 digest[29] = (l >> 0) & 0xff;
1468 digest[28] = (l >> 8) & 0xff;
1469 digest[27] = (l >> 16) & 0xff;
1470
1471 l = itoa64_to_int (buf[40]) << 0;
1472 l |= itoa64_to_int (buf[41]) << 6;
1473 l |= itoa64_to_int (buf[42]) << 12;
1474
1475 //digest[32] = (l >> 0) & 0xff;
1476 digest[31] = (l >> 8) & 0xff;
1477 digest[30] = (l >> 16) & 0xff;
1478 }
1479
1480 void sha256aix_encode (u8 digest[32], u8 buf[43])
1481 {
1482 int l;
1483
1484 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1485
1486 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1487 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1488 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1489 buf[ 3] = int_to_itoa64 (l & 0x3f);
1490
1491 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1492
1493 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1494 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1495 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1496 buf[ 7] = int_to_itoa64 (l & 0x3f);
1497
1498 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1499
1500 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1501 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1502 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1503 buf[11] = int_to_itoa64 (l & 0x3f);
1504
1505 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1506
1507 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1508 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1509 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1510 buf[15] = int_to_itoa64 (l & 0x3f);
1511
1512 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1513
1514 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1515 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1516 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1517 buf[19] = int_to_itoa64 (l & 0x3f);
1518
1519 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1520
1521 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1522 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1523 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1524 buf[23] = int_to_itoa64 (l & 0x3f);
1525
1526 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1527
1528 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1529 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1530 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1531 buf[27] = int_to_itoa64 (l & 0x3f);
1532
1533 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1534
1535 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1536 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1537 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1538 buf[31] = int_to_itoa64 (l & 0x3f);
1539
1540 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1541
1542 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1543 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1544 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1545 buf[35] = int_to_itoa64 (l & 0x3f);
1546
1547 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1548
1549 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1550 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1551 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1552 buf[39] = int_to_itoa64 (l & 0x3f);
1553
1554 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1555
1556 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1557 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1558 buf[42] = int_to_itoa64 (l & 0x3f);
1559 }
1560
1561 void sha512aix_decode (u8 digest[64], u8 buf[86])
1562 {
1563 int l;
1564
1565 l = itoa64_to_int (buf[ 0]) << 0;
1566 l |= itoa64_to_int (buf[ 1]) << 6;
1567 l |= itoa64_to_int (buf[ 2]) << 12;
1568 l |= itoa64_to_int (buf[ 3]) << 18;
1569
1570 digest[ 2] = (l >> 0) & 0xff;
1571 digest[ 1] = (l >> 8) & 0xff;
1572 digest[ 0] = (l >> 16) & 0xff;
1573
1574 l = itoa64_to_int (buf[ 4]) << 0;
1575 l |= itoa64_to_int (buf[ 5]) << 6;
1576 l |= itoa64_to_int (buf[ 6]) << 12;
1577 l |= itoa64_to_int (buf[ 7]) << 18;
1578
1579 digest[ 5] = (l >> 0) & 0xff;
1580 digest[ 4] = (l >> 8) & 0xff;
1581 digest[ 3] = (l >> 16) & 0xff;
1582
1583 l = itoa64_to_int (buf[ 8]) << 0;
1584 l |= itoa64_to_int (buf[ 9]) << 6;
1585 l |= itoa64_to_int (buf[10]) << 12;
1586 l |= itoa64_to_int (buf[11]) << 18;
1587
1588 digest[ 8] = (l >> 0) & 0xff;
1589 digest[ 7] = (l >> 8) & 0xff;
1590 digest[ 6] = (l >> 16) & 0xff;
1591
1592 l = itoa64_to_int (buf[12]) << 0;
1593 l |= itoa64_to_int (buf[13]) << 6;
1594 l |= itoa64_to_int (buf[14]) << 12;
1595 l |= itoa64_to_int (buf[15]) << 18;
1596
1597 digest[11] = (l >> 0) & 0xff;
1598 digest[10] = (l >> 8) & 0xff;
1599 digest[ 9] = (l >> 16) & 0xff;
1600
1601 l = itoa64_to_int (buf[16]) << 0;
1602 l |= itoa64_to_int (buf[17]) << 6;
1603 l |= itoa64_to_int (buf[18]) << 12;
1604 l |= itoa64_to_int (buf[19]) << 18;
1605
1606 digest[14] = (l >> 0) & 0xff;
1607 digest[13] = (l >> 8) & 0xff;
1608 digest[12] = (l >> 16) & 0xff;
1609
1610 l = itoa64_to_int (buf[20]) << 0;
1611 l |= itoa64_to_int (buf[21]) << 6;
1612 l |= itoa64_to_int (buf[22]) << 12;
1613 l |= itoa64_to_int (buf[23]) << 18;
1614
1615 digest[17] = (l >> 0) & 0xff;
1616 digest[16] = (l >> 8) & 0xff;
1617 digest[15] = (l >> 16) & 0xff;
1618
1619 l = itoa64_to_int (buf[24]) << 0;
1620 l |= itoa64_to_int (buf[25]) << 6;
1621 l |= itoa64_to_int (buf[26]) << 12;
1622 l |= itoa64_to_int (buf[27]) << 18;
1623
1624 digest[20] = (l >> 0) & 0xff;
1625 digest[19] = (l >> 8) & 0xff;
1626 digest[18] = (l >> 16) & 0xff;
1627
1628 l = itoa64_to_int (buf[28]) << 0;
1629 l |= itoa64_to_int (buf[29]) << 6;
1630 l |= itoa64_to_int (buf[30]) << 12;
1631 l |= itoa64_to_int (buf[31]) << 18;
1632
1633 digest[23] = (l >> 0) & 0xff;
1634 digest[22] = (l >> 8) & 0xff;
1635 digest[21] = (l >> 16) & 0xff;
1636
1637 l = itoa64_to_int (buf[32]) << 0;
1638 l |= itoa64_to_int (buf[33]) << 6;
1639 l |= itoa64_to_int (buf[34]) << 12;
1640 l |= itoa64_to_int (buf[35]) << 18;
1641
1642 digest[26] = (l >> 0) & 0xff;
1643 digest[25] = (l >> 8) & 0xff;
1644 digest[24] = (l >> 16) & 0xff;
1645
1646 l = itoa64_to_int (buf[36]) << 0;
1647 l |= itoa64_to_int (buf[37]) << 6;
1648 l |= itoa64_to_int (buf[38]) << 12;
1649 l |= itoa64_to_int (buf[39]) << 18;
1650
1651 digest[29] = (l >> 0) & 0xff;
1652 digest[28] = (l >> 8) & 0xff;
1653 digest[27] = (l >> 16) & 0xff;
1654
1655 l = itoa64_to_int (buf[40]) << 0;
1656 l |= itoa64_to_int (buf[41]) << 6;
1657 l |= itoa64_to_int (buf[42]) << 12;
1658 l |= itoa64_to_int (buf[43]) << 18;
1659
1660 digest[32] = (l >> 0) & 0xff;
1661 digest[31] = (l >> 8) & 0xff;
1662 digest[30] = (l >> 16) & 0xff;
1663
1664 l = itoa64_to_int (buf[44]) << 0;
1665 l |= itoa64_to_int (buf[45]) << 6;
1666 l |= itoa64_to_int (buf[46]) << 12;
1667 l |= itoa64_to_int (buf[47]) << 18;
1668
1669 digest[35] = (l >> 0) & 0xff;
1670 digest[34] = (l >> 8) & 0xff;
1671 digest[33] = (l >> 16) & 0xff;
1672
1673 l = itoa64_to_int (buf[48]) << 0;
1674 l |= itoa64_to_int (buf[49]) << 6;
1675 l |= itoa64_to_int (buf[50]) << 12;
1676 l |= itoa64_to_int (buf[51]) << 18;
1677
1678 digest[38] = (l >> 0) & 0xff;
1679 digest[37] = (l >> 8) & 0xff;
1680 digest[36] = (l >> 16) & 0xff;
1681
1682 l = itoa64_to_int (buf[52]) << 0;
1683 l |= itoa64_to_int (buf[53]) << 6;
1684 l |= itoa64_to_int (buf[54]) << 12;
1685 l |= itoa64_to_int (buf[55]) << 18;
1686
1687 digest[41] = (l >> 0) & 0xff;
1688 digest[40] = (l >> 8) & 0xff;
1689 digest[39] = (l >> 16) & 0xff;
1690
1691 l = itoa64_to_int (buf[56]) << 0;
1692 l |= itoa64_to_int (buf[57]) << 6;
1693 l |= itoa64_to_int (buf[58]) << 12;
1694 l |= itoa64_to_int (buf[59]) << 18;
1695
1696 digest[44] = (l >> 0) & 0xff;
1697 digest[43] = (l >> 8) & 0xff;
1698 digest[42] = (l >> 16) & 0xff;
1699
1700 l = itoa64_to_int (buf[60]) << 0;
1701 l |= itoa64_to_int (buf[61]) << 6;
1702 l |= itoa64_to_int (buf[62]) << 12;
1703 l |= itoa64_to_int (buf[63]) << 18;
1704
1705 digest[47] = (l >> 0) & 0xff;
1706 digest[46] = (l >> 8) & 0xff;
1707 digest[45] = (l >> 16) & 0xff;
1708
1709 l = itoa64_to_int (buf[64]) << 0;
1710 l |= itoa64_to_int (buf[65]) << 6;
1711 l |= itoa64_to_int (buf[66]) << 12;
1712 l |= itoa64_to_int (buf[67]) << 18;
1713
1714 digest[50] = (l >> 0) & 0xff;
1715 digest[49] = (l >> 8) & 0xff;
1716 digest[48] = (l >> 16) & 0xff;
1717
1718 l = itoa64_to_int (buf[68]) << 0;
1719 l |= itoa64_to_int (buf[69]) << 6;
1720 l |= itoa64_to_int (buf[70]) << 12;
1721 l |= itoa64_to_int (buf[71]) << 18;
1722
1723 digest[53] = (l >> 0) & 0xff;
1724 digest[52] = (l >> 8) & 0xff;
1725 digest[51] = (l >> 16) & 0xff;
1726
1727 l = itoa64_to_int (buf[72]) << 0;
1728 l |= itoa64_to_int (buf[73]) << 6;
1729 l |= itoa64_to_int (buf[74]) << 12;
1730 l |= itoa64_to_int (buf[75]) << 18;
1731
1732 digest[56] = (l >> 0) & 0xff;
1733 digest[55] = (l >> 8) & 0xff;
1734 digest[54] = (l >> 16) & 0xff;
1735
1736 l = itoa64_to_int (buf[76]) << 0;
1737 l |= itoa64_to_int (buf[77]) << 6;
1738 l |= itoa64_to_int (buf[78]) << 12;
1739 l |= itoa64_to_int (buf[79]) << 18;
1740
1741 digest[59] = (l >> 0) & 0xff;
1742 digest[58] = (l >> 8) & 0xff;
1743 digest[57] = (l >> 16) & 0xff;
1744
1745 l = itoa64_to_int (buf[80]) << 0;
1746 l |= itoa64_to_int (buf[81]) << 6;
1747 l |= itoa64_to_int (buf[82]) << 12;
1748 l |= itoa64_to_int (buf[83]) << 18;
1749
1750 digest[62] = (l >> 0) & 0xff;
1751 digest[61] = (l >> 8) & 0xff;
1752 digest[60] = (l >> 16) & 0xff;
1753
1754 l = itoa64_to_int (buf[84]) << 0;
1755 l |= itoa64_to_int (buf[85]) << 6;
1756
1757 digest[63] = (l >> 16) & 0xff;
1758 }
1759
1760 void sha512aix_encode (u8 digest[64], u8 buf[86])
1761 {
1762 int l;
1763
1764 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1765
1766 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1767 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1768 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1769 buf[ 3] = int_to_itoa64 (l & 0x3f);
1770
1771 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1772
1773 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1774 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1775 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1776 buf[ 7] = int_to_itoa64 (l & 0x3f);
1777
1778 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1779
1780 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1781 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1782 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1783 buf[11] = int_to_itoa64 (l & 0x3f);
1784
1785 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1786
1787 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1788 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1789 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1790 buf[15] = int_to_itoa64 (l & 0x3f);
1791
1792 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1793
1794 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1795 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1796 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1797 buf[19] = int_to_itoa64 (l & 0x3f);
1798
1799 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1800
1801 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1802 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1803 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1804 buf[23] = int_to_itoa64 (l & 0x3f);
1805
1806 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1807
1808 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1809 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1810 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1811 buf[27] = int_to_itoa64 (l & 0x3f);
1812
1813 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1814
1815 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1816 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1817 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1818 buf[31] = int_to_itoa64 (l & 0x3f);
1819
1820 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1821
1822 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1823 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1824 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1825 buf[35] = int_to_itoa64 (l & 0x3f);
1826
1827 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1828
1829 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1830 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1831 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1832 buf[39] = int_to_itoa64 (l & 0x3f);
1833
1834 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1835
1836 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1837 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1838 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1839 buf[43] = int_to_itoa64 (l & 0x3f);
1840
1841 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1842
1843 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1844 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1845 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1846 buf[47] = int_to_itoa64 (l & 0x3f);
1847
1848 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1849
1850 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1851 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1852 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1853 buf[51] = int_to_itoa64 (l & 0x3f);
1854
1855 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1856
1857 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1858 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1859 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1860 buf[55] = int_to_itoa64 (l & 0x3f);
1861
1862 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1863
1864 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1865 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1866 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1867 buf[59] = int_to_itoa64 (l & 0x3f);
1868
1869 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1870
1871 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1872 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1873 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1874 buf[63] = int_to_itoa64 (l & 0x3f);
1875
1876 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1877
1878 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1879 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1880 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1881 buf[67] = int_to_itoa64 (l & 0x3f);
1882
1883 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1884
1885 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1886 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1887 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1888 buf[71] = int_to_itoa64 (l & 0x3f);
1889
1890 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1891
1892 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1893 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1894 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1895 buf[75] = int_to_itoa64 (l & 0x3f);
1896
1897 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1898
1899 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1900 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1901 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1902 buf[79] = int_to_itoa64 (l & 0x3f);
1903
1904 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1905
1906 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1907 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1908 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1909 buf[83] = int_to_itoa64 (l & 0x3f);
1910
1911 l = 0 | 0 | (digest[63] << 16);
1912
1913 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1914 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1915 }
1916
1917 void sha256crypt_decode (u8 digest[32], u8 buf[43])
1918 {
1919 int l;
1920
1921 l = itoa64_to_int (buf[ 0]) << 0;
1922 l |= itoa64_to_int (buf[ 1]) << 6;
1923 l |= itoa64_to_int (buf[ 2]) << 12;
1924 l |= itoa64_to_int (buf[ 3]) << 18;
1925
1926 digest[ 0] = (l >> 16) & 0xff;
1927 digest[10] = (l >> 8) & 0xff;
1928 digest[20] = (l >> 0) & 0xff;
1929
1930 l = itoa64_to_int (buf[ 4]) << 0;
1931 l |= itoa64_to_int (buf[ 5]) << 6;
1932 l |= itoa64_to_int (buf[ 6]) << 12;
1933 l |= itoa64_to_int (buf[ 7]) << 18;
1934
1935 digest[21] = (l >> 16) & 0xff;
1936 digest[ 1] = (l >> 8) & 0xff;
1937 digest[11] = (l >> 0) & 0xff;
1938
1939 l = itoa64_to_int (buf[ 8]) << 0;
1940 l |= itoa64_to_int (buf[ 9]) << 6;
1941 l |= itoa64_to_int (buf[10]) << 12;
1942 l |= itoa64_to_int (buf[11]) << 18;
1943
1944 digest[12] = (l >> 16) & 0xff;
1945 digest[22] = (l >> 8) & 0xff;
1946 digest[ 2] = (l >> 0) & 0xff;
1947
1948 l = itoa64_to_int (buf[12]) << 0;
1949 l |= itoa64_to_int (buf[13]) << 6;
1950 l |= itoa64_to_int (buf[14]) << 12;
1951 l |= itoa64_to_int (buf[15]) << 18;
1952
1953 digest[ 3] = (l >> 16) & 0xff;
1954 digest[13] = (l >> 8) & 0xff;
1955 digest[23] = (l >> 0) & 0xff;
1956
1957 l = itoa64_to_int (buf[16]) << 0;
1958 l |= itoa64_to_int (buf[17]) << 6;
1959 l |= itoa64_to_int (buf[18]) << 12;
1960 l |= itoa64_to_int (buf[19]) << 18;
1961
1962 digest[24] = (l >> 16) & 0xff;
1963 digest[ 4] = (l >> 8) & 0xff;
1964 digest[14] = (l >> 0) & 0xff;
1965
1966 l = itoa64_to_int (buf[20]) << 0;
1967 l |= itoa64_to_int (buf[21]) << 6;
1968 l |= itoa64_to_int (buf[22]) << 12;
1969 l |= itoa64_to_int (buf[23]) << 18;
1970
1971 digest[15] = (l >> 16) & 0xff;
1972 digest[25] = (l >> 8) & 0xff;
1973 digest[ 5] = (l >> 0) & 0xff;
1974
1975 l = itoa64_to_int (buf[24]) << 0;
1976 l |= itoa64_to_int (buf[25]) << 6;
1977 l |= itoa64_to_int (buf[26]) << 12;
1978 l |= itoa64_to_int (buf[27]) << 18;
1979
1980 digest[ 6] = (l >> 16) & 0xff;
1981 digest[16] = (l >> 8) & 0xff;
1982 digest[26] = (l >> 0) & 0xff;
1983
1984 l = itoa64_to_int (buf[28]) << 0;
1985 l |= itoa64_to_int (buf[29]) << 6;
1986 l |= itoa64_to_int (buf[30]) << 12;
1987 l |= itoa64_to_int (buf[31]) << 18;
1988
1989 digest[27] = (l >> 16) & 0xff;
1990 digest[ 7] = (l >> 8) & 0xff;
1991 digest[17] = (l >> 0) & 0xff;
1992
1993 l = itoa64_to_int (buf[32]) << 0;
1994 l |= itoa64_to_int (buf[33]) << 6;
1995 l |= itoa64_to_int (buf[34]) << 12;
1996 l |= itoa64_to_int (buf[35]) << 18;
1997
1998 digest[18] = (l >> 16) & 0xff;
1999 digest[28] = (l >> 8) & 0xff;
2000 digest[ 8] = (l >> 0) & 0xff;
2001
2002 l = itoa64_to_int (buf[36]) << 0;
2003 l |= itoa64_to_int (buf[37]) << 6;
2004 l |= itoa64_to_int (buf[38]) << 12;
2005 l |= itoa64_to_int (buf[39]) << 18;
2006
2007 digest[ 9] = (l >> 16) & 0xff;
2008 digest[19] = (l >> 8) & 0xff;
2009 digest[29] = (l >> 0) & 0xff;
2010
2011 l = itoa64_to_int (buf[40]) << 0;
2012 l |= itoa64_to_int (buf[41]) << 6;
2013 l |= itoa64_to_int (buf[42]) << 12;
2014
2015 digest[31] = (l >> 8) & 0xff;
2016 digest[30] = (l >> 0) & 0xff;
2017 }
2018
2019 void sha256crypt_encode (u8 digest[32], u8 buf[43])
2020 {
2021 int l;
2022
2023 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2024
2025 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2026 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2027 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2028 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2029
2030 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2031
2032 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2033 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2034 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2035 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2036
2037 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2038
2039 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2040 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2041 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2042 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2043
2044 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2045
2046 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2047 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2048 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2049 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2050
2051 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2052
2053 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2054 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2055 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2056 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2057
2058 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2059
2060 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2061 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2062 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2063 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2064
2065 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2066
2067 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2068 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2069 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2070 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2071
2072 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2073
2074 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2075 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2076 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2077 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2078
2079 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2080
2081 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2082 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2083 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2084 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2085
2086 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2087
2088 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2089 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2090 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2091 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2092
2093 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2094
2095 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2096 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2097 buf[42] = int_to_itoa64 (l & 0x3f);
2098 }
2099
2100 void drupal7_decode (u8 digest[64], u8 buf[44])
2101 {
2102 int l;
2103
2104 l = itoa64_to_int (buf[ 0]) << 0;
2105 l |= itoa64_to_int (buf[ 1]) << 6;
2106 l |= itoa64_to_int (buf[ 2]) << 12;
2107 l |= itoa64_to_int (buf[ 3]) << 18;
2108
2109 digest[ 0] = (l >> 0) & 0xff;
2110 digest[ 1] = (l >> 8) & 0xff;
2111 digest[ 2] = (l >> 16) & 0xff;
2112
2113 l = itoa64_to_int (buf[ 4]) << 0;
2114 l |= itoa64_to_int (buf[ 5]) << 6;
2115 l |= itoa64_to_int (buf[ 6]) << 12;
2116 l |= itoa64_to_int (buf[ 7]) << 18;
2117
2118 digest[ 3] = (l >> 0) & 0xff;
2119 digest[ 4] = (l >> 8) & 0xff;
2120 digest[ 5] = (l >> 16) & 0xff;
2121
2122 l = itoa64_to_int (buf[ 8]) << 0;
2123 l |= itoa64_to_int (buf[ 9]) << 6;
2124 l |= itoa64_to_int (buf[10]) << 12;
2125 l |= itoa64_to_int (buf[11]) << 18;
2126
2127 digest[ 6] = (l >> 0) & 0xff;
2128 digest[ 7] = (l >> 8) & 0xff;
2129 digest[ 8] = (l >> 16) & 0xff;
2130
2131 l = itoa64_to_int (buf[12]) << 0;
2132 l |= itoa64_to_int (buf[13]) << 6;
2133 l |= itoa64_to_int (buf[14]) << 12;
2134 l |= itoa64_to_int (buf[15]) << 18;
2135
2136 digest[ 9] = (l >> 0) & 0xff;
2137 digest[10] = (l >> 8) & 0xff;
2138 digest[11] = (l >> 16) & 0xff;
2139
2140 l = itoa64_to_int (buf[16]) << 0;
2141 l |= itoa64_to_int (buf[17]) << 6;
2142 l |= itoa64_to_int (buf[18]) << 12;
2143 l |= itoa64_to_int (buf[19]) << 18;
2144
2145 digest[12] = (l >> 0) & 0xff;
2146 digest[13] = (l >> 8) & 0xff;
2147 digest[14] = (l >> 16) & 0xff;
2148
2149 l = itoa64_to_int (buf[20]) << 0;
2150 l |= itoa64_to_int (buf[21]) << 6;
2151 l |= itoa64_to_int (buf[22]) << 12;
2152 l |= itoa64_to_int (buf[23]) << 18;
2153
2154 digest[15] = (l >> 0) & 0xff;
2155 digest[16] = (l >> 8) & 0xff;
2156 digest[17] = (l >> 16) & 0xff;
2157
2158 l = itoa64_to_int (buf[24]) << 0;
2159 l |= itoa64_to_int (buf[25]) << 6;
2160 l |= itoa64_to_int (buf[26]) << 12;
2161 l |= itoa64_to_int (buf[27]) << 18;
2162
2163 digest[18] = (l >> 0) & 0xff;
2164 digest[19] = (l >> 8) & 0xff;
2165 digest[20] = (l >> 16) & 0xff;
2166
2167 l = itoa64_to_int (buf[28]) << 0;
2168 l |= itoa64_to_int (buf[29]) << 6;
2169 l |= itoa64_to_int (buf[30]) << 12;
2170 l |= itoa64_to_int (buf[31]) << 18;
2171
2172 digest[21] = (l >> 0) & 0xff;
2173 digest[22] = (l >> 8) & 0xff;
2174 digest[23] = (l >> 16) & 0xff;
2175
2176 l = itoa64_to_int (buf[32]) << 0;
2177 l |= itoa64_to_int (buf[33]) << 6;
2178 l |= itoa64_to_int (buf[34]) << 12;
2179 l |= itoa64_to_int (buf[35]) << 18;
2180
2181 digest[24] = (l >> 0) & 0xff;
2182 digest[25] = (l >> 8) & 0xff;
2183 digest[26] = (l >> 16) & 0xff;
2184
2185 l = itoa64_to_int (buf[36]) << 0;
2186 l |= itoa64_to_int (buf[37]) << 6;
2187 l |= itoa64_to_int (buf[38]) << 12;
2188 l |= itoa64_to_int (buf[39]) << 18;
2189
2190 digest[27] = (l >> 0) & 0xff;
2191 digest[28] = (l >> 8) & 0xff;
2192 digest[29] = (l >> 16) & 0xff;
2193
2194 l = itoa64_to_int (buf[40]) << 0;
2195 l |= itoa64_to_int (buf[41]) << 6;
2196 l |= itoa64_to_int (buf[42]) << 12;
2197 l |= itoa64_to_int (buf[43]) << 18;
2198
2199 digest[30] = (l >> 0) & 0xff;
2200 digest[31] = (l >> 8) & 0xff;
2201 digest[32] = (l >> 16) & 0xff;
2202
2203 digest[33] = 0;
2204 digest[34] = 0;
2205 digest[35] = 0;
2206 digest[36] = 0;
2207 digest[37] = 0;
2208 digest[38] = 0;
2209 digest[39] = 0;
2210 digest[40] = 0;
2211 digest[41] = 0;
2212 digest[42] = 0;
2213 digest[43] = 0;
2214 digest[44] = 0;
2215 digest[45] = 0;
2216 digest[46] = 0;
2217 digest[47] = 0;
2218 digest[48] = 0;
2219 digest[49] = 0;
2220 digest[50] = 0;
2221 digest[51] = 0;
2222 digest[52] = 0;
2223 digest[53] = 0;
2224 digest[54] = 0;
2225 digest[55] = 0;
2226 digest[56] = 0;
2227 digest[57] = 0;
2228 digest[58] = 0;
2229 digest[59] = 0;
2230 digest[60] = 0;
2231 digest[61] = 0;
2232 digest[62] = 0;
2233 digest[63] = 0;
2234 }
2235
2236 void drupal7_encode (u8 digest[64], u8 buf[43])
2237 {
2238 int l;
2239
2240 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2241
2242 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2243 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2244 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2245 buf[ 3] = int_to_itoa64 (l & 0x3f);
2246
2247 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2248
2249 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2250 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2251 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2252 buf[ 7] = int_to_itoa64 (l & 0x3f);
2253
2254 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2255
2256 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2257 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2258 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2259 buf[11] = int_to_itoa64 (l & 0x3f);
2260
2261 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2262
2263 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2264 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2265 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2266 buf[15] = int_to_itoa64 (l & 0x3f);
2267
2268 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2269
2270 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2271 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2272 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2273 buf[19] = int_to_itoa64 (l & 0x3f);
2274
2275 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2276
2277 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2278 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2279 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2280 buf[23] = int_to_itoa64 (l & 0x3f);
2281
2282 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2283
2284 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2285 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2286 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2287 buf[27] = int_to_itoa64 (l & 0x3f);
2288
2289 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2290
2291 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2292 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2293 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2294 buf[31] = int_to_itoa64 (l & 0x3f);
2295
2296 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2297
2298 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2299 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2300 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2301 buf[35] = int_to_itoa64 (l & 0x3f);
2302
2303 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2304
2305 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2306 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2307 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2308 buf[39] = int_to_itoa64 (l & 0x3f);
2309
2310 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2311
2312 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2313 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2314 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2315 //buf[43] = int_to_itoa64 (l & 0x3f);
2316 }
2317
2318 /**
2319 * tty
2320 */
2321
2322 #ifdef LINUX
2323 static struct termio savemodes;
2324 static int havemodes = 0;
2325
2326 int tty_break()
2327 {
2328 struct termio modmodes;
2329
2330 if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1;
2331
2332 havemodes = 1;
2333
2334 modmodes = savemodes;
2335 modmodes.c_lflag &= ~ICANON;
2336 modmodes.c_cc[VMIN] = 1;
2337 modmodes.c_cc[VTIME] = 0;
2338
2339 return ioctl (fileno (stdin), TCSETAW, &modmodes);
2340 }
2341
2342 int tty_getchar()
2343 {
2344 fd_set rfds;
2345
2346 FD_ZERO (&rfds);
2347
2348 FD_SET (fileno (stdin), &rfds);
2349
2350 struct timeval tv;
2351
2352 tv.tv_sec = 1;
2353 tv.tv_usec = 0;
2354
2355 int retval = select (1, &rfds, NULL, NULL, &tv);
2356
2357 if (retval == 0) return 0;
2358 if (retval == -1) return -1;
2359
2360 return getchar();
2361 }
2362
2363 int tty_fix()
2364 {
2365 if (!havemodes) return 0;
2366
2367 return ioctl (fileno (stdin), TCSETAW, &savemodes);
2368 }
2369 #endif
2370
2371 #ifdef OSX
2372 static struct termios savemodes;
2373 static int havemodes = 0;
2374
2375 int tty_break()
2376 {
2377 struct termios modmodes;
2378
2379 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2380
2381 havemodes = 1;
2382
2383 modmodes = savemodes;
2384 modmodes.c_lflag &= ~ICANON;
2385 modmodes.c_cc[VMIN] = 1;
2386 modmodes.c_cc[VTIME] = 0;
2387
2388 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2389 }
2390
2391 int tty_getchar()
2392 {
2393 fd_set rfds;
2394
2395 FD_ZERO (&rfds);
2396
2397 FD_SET (fileno (stdin), &rfds);
2398
2399 struct timeval tv;
2400
2401 tv.tv_sec = 1;
2402 tv.tv_usec = 0;
2403
2404 int retval = select (1, &rfds, NULL, NULL, &tv);
2405
2406 if (retval == 0) return 0;
2407 if (retval == -1) return -1;
2408
2409 return getchar();
2410 }
2411
2412 int tty_fix()
2413 {
2414 if (!havemodes) return 0;
2415
2416 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2417 }
2418 #endif
2419
2420 #ifdef WIN
2421 static DWORD saveMode = 0;
2422
2423 int tty_break()
2424 {
2425 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2426
2427 GetConsoleMode (stdinHandle, &saveMode);
2428 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2429
2430 return 0;
2431 }
2432
2433 int tty_getchar()
2434 {
2435 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2436
2437 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2438
2439 if (rc == WAIT_TIMEOUT) return 0;
2440 if (rc == WAIT_ABANDONED) return -1;
2441 if (rc == WAIT_FAILED) return -1;
2442
2443 // The whole ReadConsoleInput () part is a workaround.
2444 // For some unknown reason, maybe a mingw bug, a random signal
2445 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2446 // Then it wants to read with getche () a keyboard input
2447 // which has never been made.
2448
2449 INPUT_RECORD buf[100];
2450
2451 DWORD num = 0;
2452
2453 memset (buf, 0, sizeof (buf));
2454
2455 ReadConsoleInput (stdinHandle, buf, 100, &num);
2456
2457 FlushConsoleInputBuffer (stdinHandle);
2458
2459 for (uint i = 0; i < num; i++)
2460 {
2461 if (buf[i].EventType != KEY_EVENT) continue;
2462
2463 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2464
2465 if (KeyEvent.bKeyDown != TRUE) continue;
2466
2467 return KeyEvent.uChar.AsciiChar;
2468 }
2469
2470 return 0;
2471 }
2472
2473 int tty_fix()
2474 {
2475 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2476
2477 SetConsoleMode (stdinHandle, saveMode);
2478
2479 return 0;
2480 }
2481 #endif
2482
2483 /**
2484 * mem alloc
2485 */
2486
2487 #define MSG_ENOMEM "Insufficient memory available"
2488
2489 void *mycalloc (size_t nmemb, size_t size)
2490 {
2491 void *p = calloc (nmemb, size);
2492
2493 if (p == NULL)
2494 {
2495 log_error ("ERROR: %s", MSG_ENOMEM);
2496
2497 exit (-1);
2498 }
2499
2500 return (p);
2501 }
2502
2503 void *mymalloc (size_t size)
2504 {
2505 void *p = malloc (size);
2506
2507 if (p == NULL)
2508 {
2509 log_error ("ERROR: %s", MSG_ENOMEM);
2510
2511 exit (-1);
2512 }
2513
2514 memset (p, 0, size);
2515
2516 return (p);
2517 }
2518
2519 void myfree (void *ptr)
2520 {
2521 if (ptr == NULL) return;
2522
2523 free (ptr);
2524 }
2525
2526 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2527 {
2528 void *p = realloc (ptr, oldsz + add);
2529
2530 if (p == NULL)
2531 {
2532 log_error ("ERROR: %s", MSG_ENOMEM);
2533
2534 exit (-1);
2535 }
2536
2537 memset ((char *) p + oldsz, 0, add);
2538
2539 return (p);
2540 }
2541
2542 char *mystrdup (const char *s)
2543 {
2544 const size_t len = strlen (s);
2545
2546 char *b = (char *) mymalloc (len + 1);
2547
2548 memcpy (b, s, len);
2549
2550 return (b);
2551 }
2552
2553 FILE *logfile_open (char *logfile)
2554 {
2555 FILE *fp = fopen (logfile, "ab");
2556
2557 if (fp == NULL)
2558 {
2559 fp = stdout;
2560 }
2561
2562 return fp;
2563 }
2564
2565 void logfile_close (FILE *fp)
2566 {
2567 if (fp == stdout) return;
2568
2569 fclose (fp);
2570 }
2571
2572 void logfile_append (const char *fmt, ...)
2573 {
2574 if (data.logfile_disable == 1) return;
2575
2576 FILE *fp = logfile_open (data.logfile);
2577
2578 va_list ap;
2579
2580 va_start (ap, fmt);
2581
2582 vfprintf (fp, fmt, ap);
2583
2584 va_end (ap);
2585
2586 fputc ('\n', fp);
2587
2588 fflush (fp);
2589
2590 logfile_close (fp);
2591 }
2592
2593 int logfile_generate_id ()
2594 {
2595 const int n = rand ();
2596
2597 time_t t;
2598
2599 time (&t);
2600
2601 return t + n;
2602 }
2603
2604 char *logfile_generate_topid ()
2605 {
2606 const int id = logfile_generate_id ();
2607
2608 char *topid = (char *) mymalloc (1 + 16 + 1);
2609
2610 snprintf (topid, 1 + 16, "TOP%08x", id);
2611
2612 return topid;
2613 }
2614
2615 char *logfile_generate_subid ()
2616 {
2617 const int id = logfile_generate_id ();
2618
2619 char *subid = (char *) mymalloc (1 + 16 + 1);
2620
2621 snprintf (subid, 1 + 16, "SUB%08x", id);
2622
2623 return subid;
2624 }
2625
2626 /**
2627 * system
2628 */
2629
2630 #if F_SETLKW
2631 void lock_file (FILE *fp)
2632 {
2633 struct flock lock;
2634
2635 memset (&lock, 0, sizeof (struct flock));
2636
2637 lock.l_type = F_WRLCK;
2638 while (fcntl(fileno(fp), F_SETLKW, &lock))
2639 {
2640 if (errno != EINTR)
2641 {
2642 log_error ("ERROR: failed acquiring write lock: %s", strerror (errno));
2643
2644 exit (-1);
2645 }
2646 }
2647 }
2648
2649 void unlock_file (FILE *fp)
2650 {
2651 struct flock lock;
2652
2653 memset (&lock, 0, sizeof (struct flock));
2654
2655 lock.l_type = F_UNLCK;
2656 fcntl(fileno(fp), F_SETLK, &lock);
2657 }
2658 #endif // F_SETLKW
2659
2660 #ifdef _WIN
2661 void fsync (int fd)
2662 {
2663 HANDLE h = (HANDLE) _get_osfhandle (fd);
2664
2665 FlushFileBuffers (h);
2666 }
2667 #endif
2668
2669 /**
2670 * thermal
2671 */
2672
2673 #ifdef HAVE_HWMON
2674
2675 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2676 {
2677 int pGpuCount = 0;
2678
2679 for (uint i = 0; i < DEVICES_MAX; i++)
2680 {
2681 if (hm_NVML_nvmlDeviceGetHandleByIndex (data.hm_nv, 1, i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2682
2683 // can be used to determine if the device by index matches the cuda device by index
2684 // char name[100]; memset (name, 0, sizeof (name));
2685 // hm_NVML_nvmlDeviceGetName (data.hm_nv, nvGPUHandle[i], name, sizeof (name) - 1);
2686
2687 pGpuCount++;
2688 }
2689
2690 if (pGpuCount == 0)
2691 {
2692 log_info ("WARN: No NVML adapters found");
2693
2694 return (0);
2695 }
2696
2697 return (pGpuCount);
2698 }
2699
2700 int get_adapters_num_amd (void *adl, int *iNumberAdapters)
2701 {
2702 if (hm_ADL_Adapter_NumberOfAdapters_Get ((ADL_PTR *) adl, iNumberAdapters) != ADL_OK) return -1;
2703
2704 if (iNumberAdapters == 0)
2705 {
2706 log_info ("WARN: No ADL adapters found.");
2707
2708 return -1;
2709 }
2710
2711 return 0;
2712 }
2713
2714 /*
2715 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2716 {
2717 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2718 ADLODParameters lpOdParameters;
2719
2720 lpOdParameters.iSize = sizeof (ADLODParameters);
2721 size_t plevels_size = 0;
2722
2723 if (hm_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2724
2725 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2726 __func__, iAdapterIndex,
2727 lpOdParameters.iNumberOfPerformanceLevels,
2728 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2729 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2730
2731 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2732
2733 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2734
2735 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2736
2737 if (hm_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2738
2739 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2740 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2741 __func__, iAdapterIndex, j,
2742 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2743
2744 myfree (lpOdPerformanceLevels);
2745
2746 return 0;
2747 }
2748 */
2749
2750 LPAdapterInfo hm_get_adapter_info_amd (void *adl, int iNumberAdapters)
2751 {
2752 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2753
2754 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2755
2756 if (hm_ADL_Adapter_AdapterInfo_Get ((ADL_PTR *) adl, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2757
2758 return lpAdapterInfo;
2759 }
2760
2761 /*
2762 //
2763 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2764 //
2765
2766 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2767 {
2768 u32 idx = -1;
2769
2770 for (uint i = 0; i < num_adl_adapters; i++)
2771 {
2772 int opencl_bus_num = hm_device[i].busid;
2773 int opencl_dev_num = hm_device[i].devid;
2774
2775 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2776 {
2777 idx = i;
2778
2779 break;
2780 }
2781 }
2782
2783 if (idx >= DEVICES_MAX) return -1;
2784
2785 return idx;
2786 }
2787
2788 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2789 {
2790 for (uint i = 0; i < opencl_num_devices; i++)
2791 {
2792 cl_device_topology_amd device_topology;
2793
2794 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2795
2796 hm_device[i].busid = device_topology.pcie.bus;
2797 hm_device[i].devid = device_topology.pcie.device;
2798 }
2799 }
2800 */
2801
2802 void hm_sort_adl_adapters_by_busid_devid (u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2803 {
2804 // basically bubble sort
2805
2806 for (int i = 0; i < num_adl_adapters; i++)
2807 {
2808 for (int j = 0; j < num_adl_adapters - 1; j++)
2809 {
2810 // get info of adapter [x]
2811
2812 u32 adapter_index_x = valid_adl_device_list[j];
2813 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2814
2815 u32 bus_num_x = info_x.iBusNumber;
2816 u32 dev_num_x = info_x.iDeviceNumber;
2817
2818 // get info of adapter [y]
2819
2820 u32 adapter_index_y = valid_adl_device_list[j + 1];
2821 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2822
2823 u32 bus_num_y = info_y.iBusNumber;
2824 u32 dev_num_y = info_y.iDeviceNumber;
2825
2826 uint need_swap = 0;
2827
2828 if (bus_num_y < bus_num_x)
2829 {
2830 need_swap = 1;
2831 }
2832 else if (bus_num_y == bus_num_x)
2833 {
2834 if (dev_num_y < dev_num_x)
2835 {
2836 need_swap = 1;
2837 }
2838 }
2839
2840 if (need_swap == 1)
2841 {
2842 u32 temp = valid_adl_device_list[j + 1];
2843
2844 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2845 valid_adl_device_list[j + 0] = temp;
2846 }
2847 }
2848 }
2849 }
2850
2851 u32 *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2852 {
2853 *num_adl_adapters = 0;
2854
2855 u32 *adl_adapters = NULL;
2856
2857 int *bus_numbers = NULL;
2858 int *device_numbers = NULL;
2859
2860 for (int i = 0; i < iNumberAdapters; i++)
2861 {
2862 AdapterInfo info = lpAdapterInfo[i];
2863
2864 if (strlen (info.strUDID) < 1) continue;
2865
2866 #ifdef WIN
2867 if (info.iVendorID != 1002) continue;
2868 #else
2869 if (info.iVendorID != 0x1002) continue;
2870 #endif
2871
2872 if (info.iBusNumber < 0) continue;
2873 if (info.iDeviceNumber < 0) continue;
2874
2875 int found = 0;
2876
2877 for (int pos = 0; pos < *num_adl_adapters; pos++)
2878 {
2879 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2880 {
2881 found = 1;
2882 break;
2883 }
2884 }
2885
2886 if (found) continue;
2887
2888 // add it to the list
2889
2890 adl_adapters = (u32 *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2891
2892 adl_adapters[*num_adl_adapters] = i;
2893
2894 // rest is just bookkeeping
2895
2896 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2897 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2898
2899 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2900 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2901
2902 (*num_adl_adapters)++;
2903 }
2904
2905 myfree (bus_numbers);
2906 myfree (device_numbers);
2907
2908 // sort the list by increasing bus id, device id number
2909
2910 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2911
2912 return adl_adapters;
2913 }
2914
2915 int hm_check_fanspeed_control (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2916 {
2917 // loop through all valid devices
2918
2919 for (int i = 0; i < num_adl_adapters; i++)
2920 {
2921 u32 adapter_index = valid_adl_device_list[i];
2922
2923 // get AdapterInfo
2924
2925 AdapterInfo info = lpAdapterInfo[adapter_index];
2926
2927 // unfortunately this doesn't work since bus id and dev id are not unique
2928 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2929 // if (opencl_device_index == -1) continue;
2930
2931 int opencl_device_index = i;
2932
2933 // if (hm_show_performance_level (adl, info.iAdapterIndex) != 0) return -1;
2934
2935 // get fanspeed info
2936
2937 if (hm_device[opencl_device_index].od_version == 5)
2938 {
2939 ADLFanSpeedInfo FanSpeedInfo;
2940
2941 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2942
2943 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2944
2945 if (hm_ADL_Overdrive5_FanSpeedInfo_Get (adl, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2946
2947 // check read and write capability in fanspeedinfo
2948
2949 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2950 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2951 {
2952 hm_device[opencl_device_index].fan_get_supported = 1;
2953 }
2954 else
2955 {
2956 hm_device[opencl_device_index].fan_get_supported = 0;
2957 }
2958 }
2959 else // od_version == 6
2960 {
2961 ADLOD6FanSpeedInfo faninfo;
2962
2963 memset (&faninfo, 0, sizeof (faninfo));
2964
2965 if (hm_ADL_Overdrive6_FanSpeed_Get (adl, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2966
2967 // check read capability in fanspeedinfo
2968
2969 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
2970 {
2971 hm_device[opencl_device_index].fan_get_supported = 1;
2972 }
2973 else
2974 {
2975 hm_device[opencl_device_index].fan_get_supported = 0;
2976 }
2977 }
2978 }
2979
2980 return 0;
2981 }
2982
2983 int hm_get_overdrive_version (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2984 {
2985 for (int i = 0; i < num_adl_adapters; i++)
2986 {
2987 u32 adapter_index = valid_adl_device_list[i];
2988
2989 // get AdapterInfo
2990
2991 AdapterInfo info = lpAdapterInfo[adapter_index];
2992
2993 // get overdrive version
2994
2995 int od_supported = 0;
2996 int od_enabled = 0;
2997 int od_version = 0;
2998
2999 if (hm_ADL_Overdrive_Caps (adl, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3000
3001 // store the overdrive version in hm_device
3002
3003 // unfortunately this doesn't work since bus id and dev id are not unique
3004 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3005 // if (opencl_device_index == -1) continue;
3006
3007 int opencl_device_index = i;
3008
3009 hm_device[opencl_device_index].od_version = od_version;
3010 }
3011
3012 return 0;
3013 }
3014
3015 int hm_get_adapter_index_amd (hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3016 {
3017 for (int i = 0; i < num_adl_adapters; i++)
3018 {
3019 u32 adapter_index = valid_adl_device_list[i];
3020
3021 // get AdapterInfo
3022
3023 AdapterInfo info = lpAdapterInfo[adapter_index];
3024
3025 // store the iAdapterIndex in hm_device
3026
3027 // unfortunately this doesn't work since bus id and dev id are not unique
3028 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3029 // if (opencl_device_index == -1) continue;
3030
3031 int opencl_device_index = i;
3032
3033 hm_device[opencl_device_index].adapter_index.amd = info.iAdapterIndex;
3034 }
3035
3036 return num_adl_adapters;
3037 }
3038
3039 int hm_get_threshold_slowdown_with_device_id (const uint device_id)
3040 {
3041 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3042
3043 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3044 {
3045 if (data.hm_amd)
3046 {
3047 if (data.hm_device[device_id].od_version == 5)
3048 {
3049
3050 }
3051 else if (data.hm_device[device_id].od_version == 6)
3052 {
3053 int CurrentValue = 0;
3054 int DefaultValue = 0;
3055
3056 if (hm_ADL_Overdrive6_TargetTemperatureData_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &CurrentValue, &DefaultValue) != ADL_OK) return -1;
3057
3058 // the return value has never been tested since hm_ADL_Overdrive6_TargetTemperatureData_Get() never worked on any system. expect problems.
3059
3060 return DefaultValue;
3061 }
3062 }
3063 }
3064
3065 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3066 {
3067 int target = 0;
3068
3069 hm_NVML_nvmlDeviceGetTemperatureThreshold (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_THRESHOLD_SLOWDOWN, (unsigned int *) &target);
3070
3071 return target;
3072 }
3073
3074 return -1;
3075 }
3076
3077 int hm_get_temperature_with_device_id (const uint device_id)
3078 {
3079 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3080
3081 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3082 {
3083 if (data.hm_amd)
3084 {
3085 if (data.hm_device[device_id].od_version == 5)
3086 {
3087 ADLTemperature Temperature;
3088
3089 Temperature.iSize = sizeof (ADLTemperature);
3090
3091 if (hm_ADL_Overdrive5_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &Temperature) != ADL_OK) return -1;
3092
3093 return Temperature.iTemperature / 1000;
3094 }
3095 else if (data.hm_device[device_id].od_version == 6)
3096 {
3097 int Temperature = 0;
3098
3099 if (hm_ADL_Overdrive6_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3100
3101 return Temperature / 1000;
3102 }
3103 }
3104 }
3105
3106 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3107 {
3108 int temperature = 0;
3109
3110 hm_NVML_nvmlDeviceGetTemperature (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (uint *) &temperature);
3111
3112 return temperature;
3113 }
3114
3115 return -1;
3116 }
3117
3118 int hm_get_fanpolicy_with_device_id (const uint device_id)
3119 {
3120 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3121
3122 if (data.hm_device[device_id].fan_get_supported == 1)
3123 {
3124 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3125 {
3126 if (data.hm_amd)
3127 {
3128 if (data.hm_device[device_id].od_version == 5)
3129 {
3130 ADLFanSpeedValue lpFanSpeedValue;
3131
3132 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3133
3134 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3135 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3136
3137 if (hm_ADL_Overdrive5_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3138
3139 return (lpFanSpeedValue.iFanSpeed & ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED) ? 0 : 1;
3140 }
3141 else // od_version == 6
3142 {
3143 return 1;
3144 }
3145 }
3146 }
3147
3148 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3149 {
3150 #if defined(LINUX)
3151 return 0;
3152 #endif
3153
3154 #if defined(WIN)
3155 return 1;
3156 #endif
3157 }
3158 }
3159
3160 return -1;
3161 }
3162
3163 int hm_get_fanspeed_with_device_id (const uint device_id)
3164 {
3165 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3166
3167 if (data.hm_device[device_id].fan_get_supported == 1)
3168 {
3169 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3170 {
3171 if (data.hm_amd)
3172 {
3173 if (data.hm_device[device_id].od_version == 5)
3174 {
3175 ADLFanSpeedValue lpFanSpeedValue;
3176
3177 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3178
3179 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3180 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3181 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3182
3183 if (hm_ADL_Overdrive5_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3184
3185 return lpFanSpeedValue.iFanSpeed;
3186 }
3187 else // od_version == 6
3188 {
3189 ADLOD6FanSpeedInfo faninfo;
3190
3191 memset (&faninfo, 0, sizeof (faninfo));
3192
3193 if (hm_ADL_Overdrive6_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3194
3195 return faninfo.iFanSpeedPercent;
3196 }
3197 }
3198 }
3199
3200 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3201 {
3202 int speed = 0;
3203
3204 hm_NVML_nvmlDeviceGetFanSpeed (data.hm_nv, 1, data.hm_device[device_id].adapter_index.nv, (uint *) &speed);
3205
3206 return speed;
3207 }
3208 }
3209
3210 return -1;
3211 }
3212
3213 int hm_get_buslanes_with_device_id (const uint device_id)
3214 {
3215 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3216
3217 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3218 {
3219 if (data.hm_amd)
3220 {
3221 ADLPMActivity PMActivity;
3222
3223 PMActivity.iSize = sizeof (ADLPMActivity);
3224
3225 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3226
3227 return PMActivity.iCurrentBusLanes;
3228 }
3229 }
3230
3231 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3232 {
3233 unsigned int currLinkWidth;
3234
3235 hm_NVML_nvmlDeviceGetCurrPcieLinkWidth (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &currLinkWidth);
3236
3237 return currLinkWidth;
3238 }
3239
3240 return -1;
3241 }
3242
3243 int hm_get_utilization_with_device_id (const uint device_id)
3244 {
3245 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3246
3247 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3248 {
3249 if (data.hm_amd)
3250 {
3251 ADLPMActivity PMActivity;
3252
3253 PMActivity.iSize = sizeof (ADLPMActivity);
3254
3255 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3256
3257 return PMActivity.iActivityPercent;
3258 }
3259 }
3260
3261 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3262 {
3263 nvmlUtilization_t utilization;
3264
3265 hm_NVML_nvmlDeviceGetUtilizationRates (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &utilization);
3266
3267 return utilization.gpu;
3268 }
3269
3270 return -1;
3271 }
3272
3273 int hm_get_memoryspeed_with_device_id (const uint device_id)
3274 {
3275 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3276
3277 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3278 {
3279 if (data.hm_amd)
3280 {
3281 ADLPMActivity PMActivity;
3282
3283 PMActivity.iSize = sizeof (ADLPMActivity);
3284
3285 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3286
3287 return PMActivity.iMemoryClock / 100;
3288 }
3289 }
3290
3291 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3292 {
3293 unsigned int clock;
3294
3295 hm_NVML_nvmlDeviceGetClockInfo (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_CLOCK_MEM, &clock);
3296
3297 return clock;
3298 }
3299
3300 return -1;
3301 }
3302
3303 int hm_get_corespeed_with_device_id (const uint device_id)
3304 {
3305 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3306
3307 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3308 {
3309 if (data.hm_amd)
3310 {
3311 ADLPMActivity PMActivity;
3312
3313 PMActivity.iSize = sizeof (ADLPMActivity);
3314
3315 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3316
3317 return PMActivity.iEngineClock / 100;
3318 }
3319 }
3320
3321 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3322 {
3323 unsigned int clock;
3324
3325 hm_NVML_nvmlDeviceGetClockInfo (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_CLOCK_SM, &clock);
3326
3327 return clock;
3328 }
3329
3330 return -1;
3331 }
3332
3333 int hm_get_throttle_with_device_id (const uint device_id)
3334 {
3335 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3336
3337 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3338 {
3339
3340 }
3341
3342 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3343 {
3344
3345 }
3346
3347 return -1;
3348 }
3349
3350 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed, const int fanpolicy)
3351 {
3352 if (data.hm_device[device_id].fan_set_supported == 1)
3353 {
3354 if (data.hm_amd)
3355 {
3356 if (data.hm_device[device_id].od_version == 5)
3357 {
3358 ADLFanSpeedValue lpFanSpeedValue;
3359
3360 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3361
3362 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3363 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3364 lpFanSpeedValue.iFlags = (fanpolicy == 1) ? ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED : 0;
3365 lpFanSpeedValue.iFanSpeed = fanspeed;
3366
3367 if (hm_ADL_Overdrive5_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3368
3369 return 0;
3370 }
3371 else // od_version == 6
3372 {
3373 ADLOD6FanSpeedValue fan_speed_value;
3374
3375 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3376
3377 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3378 fan_speed_value.iFanSpeed = fanspeed;
3379
3380 if (hm_ADL_Overdrive6_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3381
3382 return 0;
3383 }
3384 }
3385 }
3386
3387 return -1;
3388 }
3389
3390 int hm_set_fanspeed_with_device_id_nvml (const uint device_id, const int fanspeed, const int fanpolicy)
3391 {
3392 if (data.hm_device[device_id].fan_set_supported == 1)
3393 {
3394 if (data.hm_nv)
3395 {
3396 // NVML does not support setting the fan speed... :((
3397
3398 if (fanspeed == fanpolicy) return -1; // makes the compiler happy
3399 }
3400 }
3401
3402 return -1;
3403 }
3404
3405 #endif // HAVE_HWMON
3406
3407 /**
3408 * maskprocessor
3409 */
3410
3411 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3412 {
3413 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3414
3415 if (css_cnt > SP_PW_MAX)
3416 {
3417 log_error ("ERROR: mask length is too long");
3418
3419 exit (-1);
3420 }
3421
3422 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3423 {
3424 uint *uniq_tbl = uniq_tbls[css_pos];
3425
3426 uint *cs_buf = css[css_pos].cs_buf;
3427 uint cs_len = css[css_pos].cs_len;
3428
3429 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3430 {
3431 uint c = cs_buf[cs_pos] & 0xff;
3432
3433 uniq_tbl[c] = 1;
3434 }
3435 }
3436 }
3437
3438 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3439 {
3440 cs_t *cs = &css[css_cnt];
3441
3442 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3443
3444 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3445
3446 size_t i;
3447
3448 for (i = 0; i < cs->cs_len; i++)
3449 {
3450 const uint u = cs->cs_buf[i];
3451
3452 css_uniq[u] = 1;
3453 }
3454
3455 for (i = 0; i < in_len; i++)
3456 {
3457 uint u = in_buf[i] & 0xff;
3458
3459 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3460
3461 if (css_uniq[u] == 1) continue;
3462
3463 css_uniq[u] = 1;
3464
3465 cs->cs_buf[cs->cs_len] = u;
3466
3467 cs->cs_len++;
3468 }
3469
3470 myfree (css_uniq);
3471 }
3472
3473 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3474 {
3475 size_t in_pos;
3476
3477 for (in_pos = 0; in_pos < in_len; in_pos++)
3478 {
3479 uint p0 = in_buf[in_pos] & 0xff;
3480
3481 if (interpret == 1 && p0 == '?')
3482 {
3483 in_pos++;
3484
3485 if (in_pos == in_len) break;
3486
3487 uint p1 = in_buf[in_pos] & 0xff;
3488
3489 switch (p1)
3490 {
3491 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3492 break;
3493 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3494 break;
3495 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3496 break;
3497 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3498 break;
3499 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3500 break;
3501 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3502 break;
3503 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3504 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3505 break;
3506 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3507 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3508 break;
3509 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3510 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3511 break;
3512 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3513 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3514 break;
3515 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3516 break;
3517 default: log_error ("Syntax error: %s", in_buf);
3518 exit (-1);
3519 }
3520 }
3521 else
3522 {
3523 if (data.hex_charset)
3524 {
3525 in_pos++;
3526
3527 if (in_pos == in_len)
3528 {
3529 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3530
3531 exit (-1);
3532 }
3533
3534 uint p1 = in_buf[in_pos] & 0xff;
3535
3536 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3537 {
3538 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3539
3540 exit (-1);
3541 }
3542
3543 uint chr = 0;
3544
3545 chr = hex_convert (p1) << 0;
3546 chr |= hex_convert (p0) << 4;
3547
3548 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3549 }
3550 else
3551 {
3552 uint chr = p0;
3553
3554 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3555 }
3556 }
3557 }
3558 }
3559
3560 u64 mp_get_sum (uint css_cnt, cs_t *css)
3561 {
3562 u64 sum = 1;
3563
3564 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3565 {
3566 sum *= css[css_pos].cs_len;
3567 }
3568
3569 return (sum);
3570 }
3571
3572 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3573 {
3574 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3575
3576 uint mask_pos;
3577 uint css_pos;
3578
3579 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3580 {
3581 char p0 = mask_buf[mask_pos];
3582
3583 if (p0 == '?')
3584 {
3585 mask_pos++;
3586
3587 if (mask_pos == mask_len) break;
3588
3589 char p1 = mask_buf[mask_pos];
3590
3591 uint chr = p1;
3592
3593 switch (p1)
3594 {
3595 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3596 break;
3597 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3598 break;
3599 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3600 break;
3601 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3602 break;
3603 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3604 break;
3605 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3606 break;
3607 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3608 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3609 break;
3610 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3611 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3612 break;
3613 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3614 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3615 break;
3616 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3617 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3618 break;
3619 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3620 break;
3621 default: log_error ("ERROR: syntax error: %s", mask_buf);
3622 exit (-1);
3623 }
3624 }
3625 else
3626 {
3627 if (data.hex_charset)
3628 {
3629 mask_pos++;
3630
3631 // if there is no 2nd hex character, show an error:
3632
3633 if (mask_pos == mask_len)
3634 {
3635 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3636
3637 exit (-1);
3638 }
3639
3640 char p1 = mask_buf[mask_pos];
3641
3642 // if they are not valid hex character, show an error:
3643
3644 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3645 {
3646 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3647
3648 exit (-1);
3649 }
3650
3651 uint chr = 0;
3652
3653 chr |= hex_convert (p1) << 0;
3654 chr |= hex_convert (p0) << 4;
3655
3656 mp_add_cs_buf (&chr, 1, css, css_pos);
3657 }
3658 else
3659 {
3660 uint chr = p0;
3661
3662 mp_add_cs_buf (&chr, 1, css, css_pos);
3663 }
3664 }
3665 }
3666
3667 if (css_pos == 0)
3668 {
3669 log_error ("ERROR: invalid mask length (0)");
3670
3671 exit (-1);
3672 }
3673
3674 *css_cnt = css_pos;
3675
3676 return (css);
3677 }
3678
3679 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3680 {
3681 for (int i = 0; i < css_cnt; i++)
3682 {
3683 uint len = css[i].cs_len;
3684 u64 next = val / len;
3685 uint pos = val % len;
3686 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3687 val = next;
3688 }
3689 }
3690
3691 void mp_cut_at (char *mask, uint max)
3692 {
3693 uint i;
3694 uint j;
3695 uint mask_len = strlen (mask);
3696
3697 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3698 {
3699 if (mask[i] == '?') i++;
3700 }
3701
3702 mask[i] = 0;
3703 }
3704
3705 void mp_setup_sys (cs_t *mp_sys)
3706 {
3707 uint pos;
3708 uint chr;
3709 uint donec[CHARSIZ] = { 0 };
3710
3711 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3712 mp_sys[0].cs_buf[pos++] = chr;
3713 mp_sys[0].cs_len = pos; }
3714
3715 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3716 mp_sys[1].cs_buf[pos++] = chr;
3717 mp_sys[1].cs_len = pos; }
3718
3719 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3720 mp_sys[2].cs_buf[pos++] = chr;
3721 mp_sys[2].cs_len = pos; }
3722
3723 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3724 mp_sys[3].cs_buf[pos++] = chr;
3725 mp_sys[3].cs_len = pos; }
3726
3727 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3728 mp_sys[4].cs_len = pos; }
3729
3730 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3731 mp_sys[5].cs_len = pos; }
3732 }
3733
3734 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3735 {
3736 FILE *fp = fopen (buf, "rb");
3737
3738 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3739 {
3740 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3741 }
3742 else
3743 {
3744 char mp_file[1024] = { 0 };
3745
3746 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3747
3748 fclose (fp);
3749
3750 len = in_superchop (mp_file);
3751
3752 if (len == 0)
3753 {
3754 log_info ("WARNING: charset file corrupted");
3755
3756 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3757 }
3758 else
3759 {
3760 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3761 }
3762 }
3763 }
3764
3765 void mp_reset_usr (cs_t *mp_usr, uint index)
3766 {
3767 mp_usr[index].cs_len = 0;
3768
3769 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3770 }
3771
3772 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3773 {
3774 char *new_mask_buf = (char *) mymalloc (256);
3775
3776 uint mask_pos;
3777
3778 uint css_pos;
3779
3780 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3781 {
3782 if (css_pos == len) break;
3783
3784 char p0 = mask_buf[mask_pos];
3785
3786 new_mask_buf[mask_pos] = p0;
3787
3788 if (p0 == '?')
3789 {
3790 mask_pos++;
3791
3792 if (mask_pos == mask_len) break;
3793
3794 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3795 }
3796 else
3797 {
3798 if (data.hex_charset)
3799 {
3800 mask_pos++;
3801
3802 if (mask_pos == mask_len)
3803 {
3804 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3805
3806 exit (-1);
3807 }
3808
3809 char p1 = mask_buf[mask_pos];
3810
3811 // if they are not valid hex character, show an error:
3812
3813 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3814 {
3815 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3816
3817 exit (-1);
3818 }
3819
3820 new_mask_buf[mask_pos] = p1;
3821 }
3822 }
3823 }
3824
3825 if (css_pos == len) return (new_mask_buf);
3826
3827 myfree (new_mask_buf);
3828
3829 return (NULL);
3830 }
3831
3832 /**
3833 * statprocessor
3834 */
3835
3836 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3837 {
3838 u64 sum = 1;
3839
3840 uint i;
3841
3842 for (i = start; i < stop; i++)
3843 {
3844 sum *= root_css_buf[i].cs_len;
3845 }
3846
3847 return (sum);
3848 }
3849
3850 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3851 {
3852 u64 v = ctx;
3853
3854 cs_t *cs = &root_css_buf[start];
3855
3856 uint i;
3857
3858 for (i = start; i < stop; i++)
3859 {
3860 const u64 m = v % cs->cs_len;
3861 const u64 d = v / cs->cs_len;
3862
3863 v = d;
3864
3865 const uint k = cs->cs_buf[m];
3866
3867 pw_buf[i - start] = (char) k;
3868
3869 cs = &markov_css_buf[(i * CHARSIZ) + k];
3870 }
3871 }
3872
3873 int sp_comp_val (const void *p1, const void *p2)
3874 {
3875 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3876 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3877
3878 return b2->val - b1->val;
3879 }
3880
3881 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)
3882 {
3883 uint i;
3884 uint j;
3885 uint k;
3886
3887 /**
3888 * Initialize hcstats
3889 */
3890
3891 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3892
3893 u64 *root_stats_ptr = root_stats_buf;
3894
3895 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3896
3897 for (i = 0; i < SP_PW_MAX; i++)
3898 {
3899 root_stats_buf_by_pos[i] = root_stats_ptr;
3900
3901 root_stats_ptr += CHARSIZ;
3902 }
3903
3904 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3905
3906 u64 *markov_stats_ptr = markov_stats_buf;
3907
3908 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3909
3910 for (i = 0; i < SP_PW_MAX; i++)
3911 {
3912 for (j = 0; j < CHARSIZ; j++)
3913 {
3914 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3915
3916 markov_stats_ptr += CHARSIZ;
3917 }
3918 }
3919
3920 /**
3921 * Load hcstats File
3922 */
3923
3924 if (hcstat == NULL)
3925 {
3926 char hcstat_tmp[256] = { 0 };
3927
3928 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3929
3930 hcstat = hcstat_tmp;
3931 }
3932
3933 FILE *fd = fopen (hcstat, "rb");
3934
3935 if (fd == NULL)
3936 {
3937 log_error ("%s: %s", hcstat, strerror (errno));
3938
3939 exit (-1);
3940 }
3941
3942 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3943 {
3944 log_error ("%s: Could not load data", hcstat);
3945
3946 fclose (fd);
3947
3948 exit (-1);
3949 }
3950
3951 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3952 {
3953 log_error ("%s: Could not load data", hcstat);
3954
3955 fclose (fd);
3956
3957 exit (-1);
3958 }
3959
3960 fclose (fd);
3961
3962 /**
3963 * Markov modifier of hcstat_table on user request
3964 */
3965
3966 if (disable)
3967 {
3968 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
3969 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
3970 }
3971
3972 if (classic)
3973 {
3974 /* Add all stats to first position */
3975
3976 for (i = 1; i < SP_PW_MAX; i++)
3977 {
3978 u64 *out = root_stats_buf_by_pos[0];
3979 u64 *in = root_stats_buf_by_pos[i];
3980
3981 for (j = 0; j < CHARSIZ; j++)
3982 {
3983 *out++ += *in++;
3984 }
3985 }
3986
3987 for (i = 1; i < SP_PW_MAX; i++)
3988 {
3989 u64 *out = markov_stats_buf_by_key[0][0];
3990 u64 *in = markov_stats_buf_by_key[i][0];
3991
3992 for (j = 0; j < CHARSIZ; j++)
3993 {
3994 for (k = 0; k < CHARSIZ; k++)
3995 {
3996 *out++ += *in++;
3997 }
3998 }
3999 }
4000
4001 /* copy them to all pw_positions */
4002
4003 for (i = 1; i < SP_PW_MAX; i++)
4004 {
4005 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
4006 }
4007
4008 for (i = 1; i < SP_PW_MAX; i++)
4009 {
4010 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
4011 }
4012 }
4013
4014 /**
4015 * Initialize tables
4016 */
4017
4018 hcstat_table_t *root_table_ptr = root_table_buf;
4019
4020 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
4021
4022 for (i = 0; i < SP_PW_MAX; i++)
4023 {
4024 root_table_buf_by_pos[i] = root_table_ptr;
4025
4026 root_table_ptr += CHARSIZ;
4027 }
4028
4029 hcstat_table_t *markov_table_ptr = markov_table_buf;
4030
4031 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
4032
4033 for (i = 0; i < SP_PW_MAX; i++)
4034 {
4035 for (j = 0; j < CHARSIZ; j++)
4036 {
4037 markov_table_buf_by_key[i][j] = markov_table_ptr;
4038
4039 markov_table_ptr += CHARSIZ;
4040 }
4041 }
4042
4043 /**
4044 * Convert hcstat to tables
4045 */
4046
4047 for (i = 0; i < SP_ROOT_CNT; i++)
4048 {
4049 uint key = i % CHARSIZ;
4050
4051 root_table_buf[i].key = key;
4052 root_table_buf[i].val = root_stats_buf[i];
4053 }
4054
4055 for (i = 0; i < SP_MARKOV_CNT; i++)
4056 {
4057 uint key = i % CHARSIZ;
4058
4059 markov_table_buf[i].key = key;
4060 markov_table_buf[i].val = markov_stats_buf[i];
4061 }
4062
4063 myfree (root_stats_buf);
4064 myfree (markov_stats_buf);
4065
4066 /**
4067 * Finally sort them
4068 */
4069
4070 for (i = 0; i < SP_PW_MAX; i++)
4071 {
4072 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4073 }
4074
4075 for (i = 0; i < SP_PW_MAX; i++)
4076 {
4077 for (j = 0; j < CHARSIZ; j++)
4078 {
4079 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4080 }
4081 }
4082 }
4083
4084 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])
4085 {
4086 /**
4087 * Convert tables to css
4088 */
4089
4090 for (uint i = 0; i < SP_ROOT_CNT; i++)
4091 {
4092 uint pw_pos = i / CHARSIZ;
4093
4094 cs_t *cs = &root_css_buf[pw_pos];
4095
4096 if (cs->cs_len == threshold) continue;
4097
4098 uint key = root_table_buf[i].key;
4099
4100 if (uniq_tbls[pw_pos][key] == 0) continue;
4101
4102 cs->cs_buf[cs->cs_len] = key;
4103
4104 cs->cs_len++;
4105 }
4106
4107 /**
4108 * Convert table to css
4109 */
4110
4111 for (uint i = 0; i < SP_MARKOV_CNT; i++)
4112 {
4113 uint c = i / CHARSIZ;
4114
4115 cs_t *cs = &markov_css_buf[c];
4116
4117 if (cs->cs_len == threshold) continue;
4118
4119 uint pw_pos = c / CHARSIZ;
4120
4121 uint key = markov_table_buf[i].key;
4122
4123 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4124
4125 cs->cs_buf[cs->cs_len] = key;
4126
4127 cs->cs_len++;
4128 }
4129
4130 /*
4131 for (uint i = 0; i < 8; i++)
4132 {
4133 for (uint j = 0x20; j < 0x80; j++)
4134 {
4135 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4136
4137 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4138
4139 for (uint k = 0; k < 10; k++)
4140 {
4141 printf (" %u\n", ptr->cs_buf[k]);
4142 }
4143 }
4144 }
4145 */
4146 }
4147
4148 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4149 {
4150 for (uint i = 0; i < SP_PW_MAX; i += 2)
4151 {
4152 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4153
4154 out += CHARSIZ;
4155 in += CHARSIZ;
4156
4157 out->key = 0;
4158 out->val = 1;
4159
4160 out++;
4161
4162 for (uint j = 1; j < CHARSIZ; j++)
4163 {
4164 out->key = j;
4165 out->val = 0;
4166
4167 out++;
4168 }
4169 }
4170 }
4171
4172 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4173 {
4174 for (uint i = 0; i < SP_PW_MAX; i += 2)
4175 {
4176 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4177
4178 out += CHARSIZ * CHARSIZ;
4179 in += CHARSIZ * CHARSIZ;
4180
4181 for (uint j = 0; j < CHARSIZ; j++)
4182 {
4183 out->key = 0;
4184 out->val = 1;
4185
4186 out++;
4187
4188 for (uint k = 1; k < CHARSIZ; k++)
4189 {
4190 out->key = k;
4191 out->val = 0;
4192
4193 out++;
4194 }
4195 }
4196 }
4197 }
4198
4199 /**
4200 * mixed shared functions
4201 */
4202
4203 void dump_hex (const u8 *s, const int sz)
4204 {
4205 for (int i = 0; i < sz; i++)
4206 {
4207 log_info_nn ("%02x ", s[i]);
4208 }
4209
4210 log_info ("");
4211 }
4212
4213 void usage_mini_print (const char *progname)
4214 {
4215 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4216 }
4217
4218 void usage_big_print (const char *progname)
4219 {
4220 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4221 }
4222
4223 char *get_exec_path ()
4224 {
4225 int exec_path_len = 1024;
4226
4227 char *exec_path = (char *) mymalloc (exec_path_len);
4228
4229 #ifdef LINUX
4230
4231 char tmp[32] = { 0 };
4232
4233 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4234
4235 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4236
4237 #elif WIN
4238
4239 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4240
4241 #elif OSX
4242
4243 uint size = exec_path_len;
4244
4245 if (_NSGetExecutablePath (exec_path, &size) != 0)
4246 {
4247 log_error("! executable path buffer too small\n");
4248
4249 exit (-1);
4250 }
4251
4252 const int len = strlen (exec_path);
4253
4254 #else
4255 #error Your Operating System is not supported or detected
4256 #endif
4257
4258 exec_path[len] = 0;
4259
4260 return exec_path;
4261 }
4262
4263 char *get_install_dir (const char *progname)
4264 {
4265 char *install_dir = mystrdup (progname);
4266 char *last_slash = NULL;
4267
4268 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4269 {
4270 *last_slash = 0;
4271 }
4272 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4273 {
4274 *last_slash = 0;
4275 }
4276 else
4277 {
4278 install_dir[0] = '.';
4279 install_dir[1] = 0;
4280 }
4281
4282 return (install_dir);
4283 }
4284
4285 char *get_profile_dir (const char *homedir)
4286 {
4287 #define DOT_HASHCAT ".hashcat"
4288
4289 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4290
4291 char *profile_dir = (char *) mymalloc (len + 1);
4292
4293 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4294
4295 return profile_dir;
4296 }
4297
4298 char *get_session_dir (const char *profile_dir)
4299 {
4300 #define SESSIONS_FOLDER "sessions"
4301
4302 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4303
4304 char *session_dir = (char *) mymalloc (len + 1);
4305
4306 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4307
4308 return session_dir;
4309 }
4310
4311 uint count_lines (FILE *fd)
4312 {
4313 uint cnt = 0;
4314
4315 char *buf = (char *) mymalloc (HCBUFSIZ + 1);
4316
4317 char prev = '\n';
4318
4319 while (!feof (fd))
4320 {
4321 size_t nread = fread (buf, sizeof (char), HCBUFSIZ, fd);
4322
4323 if (nread < 1) continue;
4324
4325 size_t i;
4326
4327 for (i = 0; i < nread; i++)
4328 {
4329 if (prev == '\n') cnt++;
4330
4331 prev = buf[i];
4332 }
4333 }
4334
4335 myfree (buf);
4336
4337 return cnt;
4338 }
4339
4340 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4341 {
4342 uint crc = ~0;
4343
4344 FILE *fd = fopen (filename, "rb");
4345
4346 if (fd == NULL)
4347 {
4348 log_error ("%s: %s", filename, strerror (errno));
4349
4350 exit (-1);
4351 }
4352
4353 #define MAX_KEY_SIZE (1024 * 1024)
4354
4355 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4356
4357 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4358
4359 fclose (fd);
4360
4361 int kpos = 0;
4362
4363 for (int fpos = 0; fpos < nread; fpos++)
4364 {
4365 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4366
4367 keytab[kpos++] += (crc >> 24) & 0xff;
4368 keytab[kpos++] += (crc >> 16) & 0xff;
4369 keytab[kpos++] += (crc >> 8) & 0xff;
4370 keytab[kpos++] += (crc >> 0) & 0xff;
4371
4372 if (kpos >= 64) kpos = 0;
4373 }
4374
4375 myfree (buf);
4376 }
4377
4378 #ifdef OSX
4379 int pthread_setaffinity_np (pthread_t thread, size_t cpu_size, cpu_set_t *cpu_set)
4380 {
4381 int core;
4382
4383 for (core = 0; core < (8 * (int)cpu_size); core++)
4384 if (CPU_ISSET(core, cpu_set)) break;
4385
4386 thread_affinity_policy_data_t policy = { core };
4387
4388 const int rc = thread_policy_set (pthread_mach_thread_np (thread), THREAD_AFFINITY_POLICY, (thread_policy_t) &policy, 1);
4389
4390 if (data.quiet == 0)
4391 {
4392 if (rc != KERN_SUCCESS)
4393 {
4394 log_error ("ERROR: %s : %d", "thread_policy_set()", rc);
4395 }
4396 }
4397
4398 return rc;
4399 }
4400 #endif
4401
4402 void set_cpu_affinity (char *cpu_affinity)
4403 {
4404 #ifdef WIN
4405 DWORD_PTR aff_mask = 0;
4406 #elif _POSIX
4407 cpu_set_t cpuset;
4408 CPU_ZERO (&cpuset);
4409 #endif
4410
4411 if (cpu_affinity)
4412 {
4413 char *devices = strdup (cpu_affinity);
4414
4415 char *next = strtok (devices, ",");
4416
4417 do
4418 {
4419 uint cpu_id = atoi (next);
4420
4421 if (cpu_id == 0)
4422 {
4423 #ifdef WIN
4424 aff_mask = 0;
4425 #elif _POSIX
4426 CPU_ZERO (&cpuset);
4427 #endif
4428
4429 break;
4430 }
4431
4432 if (cpu_id > 32)
4433 {
4434 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4435
4436 exit (-1);
4437 }
4438
4439 #ifdef WIN
4440 aff_mask |= 1 << (cpu_id - 1);
4441 #elif _POSIX
4442 CPU_SET ((cpu_id - 1), &cpuset);
4443 #endif
4444
4445 } while ((next = strtok (NULL, ",")) != NULL);
4446
4447 free (devices);
4448 }
4449
4450 #ifdef WIN
4451 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4452 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4453 #elif _POSIX
4454 pthread_t thread = pthread_self ();
4455 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4456 #endif
4457 }
4458
4459 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4460 {
4461 char *element, *end;
4462
4463 end = (char *) base + nmemb * size;
4464
4465 for (element = (char *) base; element < end; element += size)
4466 if (!compar (element, key))
4467 return element;
4468
4469 return NULL;
4470 }
4471
4472 int sort_by_u32 (const void *v1, const void *v2)
4473 {
4474 const u32 *s1 = (const u32 *) v1;
4475 const u32 *s2 = (const u32 *) v2;
4476
4477 return *s1 - *s2;
4478 }
4479
4480 int sort_by_salt (const void *v1, const void *v2)
4481 {
4482 const salt_t *s1 = (const salt_t *) v1;
4483 const salt_t *s2 = (const salt_t *) v2;
4484
4485 const int res1 = s1->salt_len - s2->salt_len;
4486
4487 if (res1 != 0) return (res1);
4488
4489 const int res2 = s1->salt_iter - s2->salt_iter;
4490
4491 if (res2 != 0) return (res2);
4492
4493 uint n;
4494
4495 n = 16;
4496
4497 while (n--)
4498 {
4499 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4500 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4501 }
4502
4503 n = 8;
4504
4505 while (n--)
4506 {
4507 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4508 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4509 }
4510
4511 return (0);
4512 }
4513
4514 int sort_by_salt_buf (const void *v1, const void *v2)
4515 {
4516 const pot_t *p1 = (const pot_t *) v1;
4517 const pot_t *p2 = (const pot_t *) v2;
4518
4519 const hash_t *h1 = &p1->hash;
4520 const hash_t *h2 = &p2->hash;
4521
4522 const salt_t *s1 = h1->salt;
4523 const salt_t *s2 = h2->salt;
4524
4525 uint n = 16;
4526
4527 while (n--)
4528 {
4529 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4530 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4531 }
4532
4533 return 0;
4534 }
4535
4536 int sort_by_hash_t_salt (const void *v1, const void *v2)
4537 {
4538 const hash_t *h1 = (const hash_t *) v1;
4539 const hash_t *h2 = (const hash_t *) v2;
4540
4541 const salt_t *s1 = h1->salt;
4542 const salt_t *s2 = h2->salt;
4543
4544 // testphase: this should work
4545 uint n = 16;
4546
4547 while (n--)
4548 {
4549 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4550 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4551 }
4552
4553 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4554 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4555 if (s1->salt_len > s2->salt_len) return ( 1);
4556 if (s1->salt_len < s2->salt_len) return (-1);
4557
4558 uint n = s1->salt_len;
4559
4560 while (n--)
4561 {
4562 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4563 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4564 }
4565 */
4566
4567 return 0;
4568 }
4569
4570 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4571 {
4572 const hash_t *h1 = (const hash_t *) v1;
4573 const hash_t *h2 = (const hash_t *) v2;
4574
4575 const salt_t *s1 = h1->salt;
4576 const salt_t *s2 = h2->salt;
4577
4578 // 16 - 2 (since last 2 uints contain the digest)
4579 uint n = 14;
4580
4581 while (n--)
4582 {
4583 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4584 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4585 }
4586
4587 return 0;
4588 }
4589
4590 int sort_by_hash_no_salt (const void *v1, const void *v2)
4591 {
4592 const hash_t *h1 = (const hash_t *) v1;
4593 const hash_t *h2 = (const hash_t *) v2;
4594
4595 const void *d1 = h1->digest;
4596 const void *d2 = h2->digest;
4597
4598 return data.sort_by_digest (d1, d2);
4599 }
4600
4601 int sort_by_hash (const void *v1, const void *v2)
4602 {
4603 const hash_t *h1 = (const hash_t *) v1;
4604 const hash_t *h2 = (const hash_t *) v2;
4605
4606 if (data.isSalted)
4607 {
4608 const salt_t *s1 = h1->salt;
4609 const salt_t *s2 = h2->salt;
4610
4611 int res = sort_by_salt (s1, s2);
4612
4613 if (res != 0) return (res);
4614 }
4615
4616 const void *d1 = h1->digest;
4617 const void *d2 = h2->digest;
4618
4619 return data.sort_by_digest (d1, d2);
4620 }
4621
4622 int sort_by_pot (const void *v1, const void *v2)
4623 {
4624 const pot_t *p1 = (const pot_t *) v1;
4625 const pot_t *p2 = (const pot_t *) v2;
4626
4627 const hash_t *h1 = &p1->hash;
4628 const hash_t *h2 = &p2->hash;
4629
4630 return sort_by_hash (h1, h2);
4631 }
4632
4633 int sort_by_mtime (const void *p1, const void *p2)
4634 {
4635 const char **f1 = (const char **) p1;
4636 const char **f2 = (const char **) p2;
4637
4638 struct stat s1; stat (*f1, &s1);
4639 struct stat s2; stat (*f2, &s2);
4640
4641 return s2.st_mtime - s1.st_mtime;
4642 }
4643
4644 int sort_by_cpu_rule (const void *p1, const void *p2)
4645 {
4646 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4647 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4648
4649 return memcmp (r1, r2, sizeof (cpu_rule_t));
4650 }
4651
4652 int sort_by_kernel_rule (const void *p1, const void *p2)
4653 {
4654 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4655 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4656
4657 return memcmp (r1, r2, sizeof (kernel_rule_t));
4658 }
4659
4660 int sort_by_stringptr (const void *p1, const void *p2)
4661 {
4662 const char **s1 = (const char **) p1;
4663 const char **s2 = (const char **) p2;
4664
4665 return strcmp (*s1, *s2);
4666 }
4667
4668 int sort_by_dictstat (const void *s1, const void *s2)
4669 {
4670 dictstat_t *d1 = (dictstat_t *) s1;
4671 dictstat_t *d2 = (dictstat_t *) s2;
4672
4673 #ifdef LINUX
4674 d2->stat.st_atim = d1->stat.st_atim;
4675 #else
4676 d2->stat.st_atime = d1->stat.st_atime;
4677 #endif
4678
4679 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4680 }
4681
4682 int sort_by_bitmap (const void *p1, const void *p2)
4683 {
4684 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4685 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4686
4687 return b1->collisions - b2->collisions;
4688 }
4689
4690 int sort_by_digest_4_2 (const void *v1, const void *v2)
4691 {
4692 const u32 *d1 = (const u32 *) v1;
4693 const u32 *d2 = (const u32 *) v2;
4694
4695 uint n = 2;
4696
4697 while (n--)
4698 {
4699 if (d1[n] > d2[n]) return ( 1);
4700 if (d1[n] < d2[n]) return (-1);
4701 }
4702
4703 return (0);
4704 }
4705
4706 int sort_by_digest_4_4 (const void *v1, const void *v2)
4707 {
4708 const u32 *d1 = (const u32 *) v1;
4709 const u32 *d2 = (const u32 *) v2;
4710
4711 uint n = 4;
4712
4713 while (n--)
4714 {
4715 if (d1[n] > d2[n]) return ( 1);
4716 if (d1[n] < d2[n]) return (-1);
4717 }
4718
4719 return (0);
4720 }
4721
4722 int sort_by_digest_4_5 (const void *v1, const void *v2)
4723 {
4724 const u32 *d1 = (const u32 *) v1;
4725 const u32 *d2 = (const u32 *) v2;
4726
4727 uint n = 5;
4728
4729 while (n--)
4730 {
4731 if (d1[n] > d2[n]) return ( 1);
4732 if (d1[n] < d2[n]) return (-1);
4733 }
4734
4735 return (0);
4736 }
4737
4738 int sort_by_digest_4_6 (const void *v1, const void *v2)
4739 {
4740 const u32 *d1 = (const u32 *) v1;
4741 const u32 *d2 = (const u32 *) v2;
4742
4743 uint n = 6;
4744
4745 while (n--)
4746 {
4747 if (d1[n] > d2[n]) return ( 1);
4748 if (d1[n] < d2[n]) return (-1);
4749 }
4750
4751 return (0);
4752 }
4753
4754 int sort_by_digest_4_8 (const void *v1, const void *v2)
4755 {
4756 const u32 *d1 = (const u32 *) v1;
4757 const u32 *d2 = (const u32 *) v2;
4758
4759 uint n = 8;
4760
4761 while (n--)
4762 {
4763 if (d1[n] > d2[n]) return ( 1);
4764 if (d1[n] < d2[n]) return (-1);
4765 }
4766
4767 return (0);
4768 }
4769
4770 int sort_by_digest_4_16 (const void *v1, const void *v2)
4771 {
4772 const u32 *d1 = (const u32 *) v1;
4773 const u32 *d2 = (const u32 *) v2;
4774
4775 uint n = 16;
4776
4777 while (n--)
4778 {
4779 if (d1[n] > d2[n]) return ( 1);
4780 if (d1[n] < d2[n]) return (-1);
4781 }
4782
4783 return (0);
4784 }
4785
4786 int sort_by_digest_4_32 (const void *v1, const void *v2)
4787 {
4788 const u32 *d1 = (const u32 *) v1;
4789 const u32 *d2 = (const u32 *) v2;
4790
4791 uint n = 32;
4792
4793 while (n--)
4794 {
4795 if (d1[n] > d2[n]) return ( 1);
4796 if (d1[n] < d2[n]) return (-1);
4797 }
4798
4799 return (0);
4800 }
4801
4802 int sort_by_digest_4_64 (const void *v1, const void *v2)
4803 {
4804 const u32 *d1 = (const u32 *) v1;
4805 const u32 *d2 = (const u32 *) v2;
4806
4807 uint n = 64;
4808
4809 while (n--)
4810 {
4811 if (d1[n] > d2[n]) return ( 1);
4812 if (d1[n] < d2[n]) return (-1);
4813 }
4814
4815 return (0);
4816 }
4817
4818 int sort_by_digest_8_8 (const void *v1, const void *v2)
4819 {
4820 const u64 *d1 = (const u64 *) v1;
4821 const u64 *d2 = (const u64 *) v2;
4822
4823 uint n = 8;
4824
4825 while (n--)
4826 {
4827 if (d1[n] > d2[n]) return ( 1);
4828 if (d1[n] < d2[n]) return (-1);
4829 }
4830
4831 return (0);
4832 }
4833
4834 int sort_by_digest_8_16 (const void *v1, const void *v2)
4835 {
4836 const u64 *d1 = (const u64 *) v1;
4837 const u64 *d2 = (const u64 *) v2;
4838
4839 uint n = 16;
4840
4841 while (n--)
4842 {
4843 if (d1[n] > d2[n]) return ( 1);
4844 if (d1[n] < d2[n]) return (-1);
4845 }
4846
4847 return (0);
4848 }
4849
4850 int sort_by_digest_8_25 (const void *v1, const void *v2)
4851 {
4852 const u64 *d1 = (const u64 *) v1;
4853 const u64 *d2 = (const u64 *) v2;
4854
4855 uint n = 25;
4856
4857 while (n--)
4858 {
4859 if (d1[n] > d2[n]) return ( 1);
4860 if (d1[n] < d2[n]) return (-1);
4861 }
4862
4863 return (0);
4864 }
4865
4866 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4867 {
4868 const u32 *d1 = (const u32 *) v1;
4869 const u32 *d2 = (const u32 *) v2;
4870
4871 const uint dgst_pos0 = data.dgst_pos0;
4872 const uint dgst_pos1 = data.dgst_pos1;
4873 const uint dgst_pos2 = data.dgst_pos2;
4874 const uint dgst_pos3 = data.dgst_pos3;
4875
4876 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4877 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4878 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4879 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4880 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4881 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4882 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4883 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4884
4885 return (0);
4886 }
4887
4888 int sort_by_tuning_db_alias (const void *v1, const void *v2)
4889 {
4890 const tuning_db_alias_t *t1 = (const tuning_db_alias_t *) v1;
4891 const tuning_db_alias_t *t2 = (const tuning_db_alias_t *) v2;
4892
4893 const int res1 = strcmp (t1->device_name, t2->device_name);
4894
4895 if (res1 != 0) return (res1);
4896
4897 return 0;
4898 }
4899
4900 int sort_by_tuning_db_entry (const void *v1, const void *v2)
4901 {
4902 const tuning_db_entry_t *t1 = (const tuning_db_entry_t *) v1;
4903 const tuning_db_entry_t *t2 = (const tuning_db_entry_t *) v2;
4904
4905 const int res1 = strcmp (t1->device_name, t2->device_name);
4906
4907 if (res1 != 0) return (res1);
4908
4909 const int res2 = t1->attack_mode
4910 - t2->attack_mode;
4911
4912 if (res2 != 0) return (res2);
4913
4914 const int res3 = t1->hash_type
4915 - t2->hash_type;
4916
4917 if (res3 != 0) return (res3);
4918
4919 return 0;
4920 }
4921
4922 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)
4923 {
4924 uint outfile_autohex = data.outfile_autohex;
4925
4926 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4927
4928 FILE *debug_fp = NULL;
4929
4930 if (debug_file != NULL)
4931 {
4932 debug_fp = fopen (debug_file, "ab");
4933
4934 lock_file (debug_fp);
4935 }
4936 else
4937 {
4938 debug_fp = stderr;
4939 }
4940
4941 if (debug_fp == NULL)
4942 {
4943 log_info ("WARNING: Could not open debug-file for writing");
4944 }
4945 else
4946 {
4947 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4948 {
4949 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4950
4951 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4952 }
4953
4954 fwrite (rule_ptr, rule_len, 1, debug_fp);
4955
4956 if (debug_mode == 4)
4957 {
4958 fputc (':', debug_fp);
4959
4960 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4961 }
4962
4963 fputc ('\n', debug_fp);
4964
4965 if (debug_file != NULL) fclose (debug_fp);
4966 }
4967 }
4968
4969 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4970 {
4971 int needs_hexify = 0;
4972
4973 if (outfile_autohex == 1)
4974 {
4975 for (uint i = 0; i < plain_len; i++)
4976 {
4977 if (plain_ptr[i] < 0x20)
4978 {
4979 needs_hexify = 1;
4980
4981 break;
4982 }
4983
4984 if (plain_ptr[i] > 0x7f)
4985 {
4986 needs_hexify = 1;
4987
4988 break;
4989 }
4990 }
4991 }
4992
4993 if (needs_hexify == 1)
4994 {
4995 fprintf (fp, "$HEX[");
4996
4997 for (uint i = 0; i < plain_len; i++)
4998 {
4999 fprintf (fp, "%02x", plain_ptr[i]);
5000 }
5001
5002 fprintf (fp, "]");
5003 }
5004 else
5005 {
5006 fwrite (plain_ptr, plain_len, 1, fp);
5007 }
5008 }
5009
5010 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)
5011 {
5012 uint outfile_format = data.outfile_format;
5013
5014 char separator = data.separator;
5015
5016 if (outfile_format & OUTFILE_FMT_HASH)
5017 {
5018 fprintf (out_fp, "%s", out_buf);
5019
5020 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5021 {
5022 fputc (separator, out_fp);
5023 }
5024 }
5025 else if (data.username)
5026 {
5027 if (username != NULL)
5028 {
5029 for (uint i = 0; i < user_len; i++)
5030 {
5031 fprintf (out_fp, "%c", username[i]);
5032 }
5033
5034 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5035 {
5036 fputc (separator, out_fp);
5037 }
5038 }
5039 }
5040
5041 if (outfile_format & OUTFILE_FMT_PLAIN)
5042 {
5043 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
5044
5045 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
5046 {
5047 fputc (separator, out_fp);
5048 }
5049 }
5050
5051 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
5052 {
5053 for (uint i = 0; i < plain_len; i++)
5054 {
5055 fprintf (out_fp, "%02x", plain_ptr[i]);
5056 }
5057
5058 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
5059 {
5060 fputc (separator, out_fp);
5061 }
5062 }
5063
5064 if (outfile_format & OUTFILE_FMT_CRACKPOS)
5065 {
5066 #ifdef _WIN
5067 __mingw_fprintf (out_fp, "%llu", crackpos);
5068 #endif
5069
5070 #ifdef _POSIX
5071 #ifdef __x86_64__
5072 fprintf (out_fp, "%lu", (unsigned long) crackpos);
5073 #else
5074 fprintf (out_fp, "%llu", crackpos);
5075 #endif
5076 #endif
5077 }
5078
5079 fputc ('\n', out_fp);
5080 }
5081
5082 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)
5083 {
5084 pot_t pot_key;
5085
5086 pot_key.hash.salt = hashes_buf->salt;
5087 pot_key.hash.digest = hashes_buf->digest;
5088
5089 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5090
5091 if (pot_ptr)
5092 {
5093 log_info_nn ("");
5094
5095 input_buf[input_len] = 0;
5096
5097 // user
5098 unsigned char *username = NULL;
5099 uint user_len = 0;
5100
5101 if (data.username)
5102 {
5103 user_t *user = hashes_buf->hash_info->user;
5104
5105 if (user)
5106 {
5107 username = (unsigned char *) (user->user_name);
5108
5109 user_len = user->user_len;
5110 }
5111 }
5112
5113 // do output the line
5114 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
5115 }
5116 }
5117
5118 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
5119 #define LM_MASKED_PLAIN "[notfound]"
5120
5121 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)
5122 {
5123 // left
5124
5125 pot_t pot_left_key;
5126
5127 pot_left_key.hash.salt = hash_left->salt;
5128 pot_left_key.hash.digest = hash_left->digest;
5129
5130 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5131
5132 // right
5133
5134 uint weak_hash_found = 0;
5135
5136 pot_t pot_right_key;
5137
5138 pot_right_key.hash.salt = hash_right->salt;
5139 pot_right_key.hash.digest = hash_right->digest;
5140
5141 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5142
5143 if (pot_right_ptr == NULL)
5144 {
5145 // special case, if "weak hash"
5146
5147 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5148 {
5149 weak_hash_found = 1;
5150
5151 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5152
5153 // in theory this is not needed, but we are paranoia:
5154
5155 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5156 pot_right_ptr->plain_len = 0;
5157 }
5158 }
5159
5160 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
5161 {
5162 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
5163
5164 return;
5165 }
5166
5167 // at least one half was found:
5168
5169 log_info_nn ("");
5170
5171 input_buf[input_len] = 0;
5172
5173 // user
5174
5175 unsigned char *username = NULL;
5176 uint user_len = 0;
5177
5178 if (data.username)
5179 {
5180 user_t *user = hash_left->hash_info->user;
5181
5182 if (user)
5183 {
5184 username = (unsigned char *) (user->user_name);
5185
5186 user_len = user->user_len;
5187 }
5188 }
5189
5190 // mask the part which was not found
5191
5192 uint left_part_masked = 0;
5193 uint right_part_masked = 0;
5194
5195 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5196
5197 if (pot_left_ptr == NULL)
5198 {
5199 left_part_masked = 1;
5200
5201 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5202
5203 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5204
5205 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5206 pot_left_ptr->plain_len = mask_plain_len;
5207 }
5208
5209 if (pot_right_ptr == NULL)
5210 {
5211 right_part_masked = 1;
5212
5213 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5214
5215 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5216
5217 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5218 pot_right_ptr->plain_len = mask_plain_len;
5219 }
5220
5221 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5222
5223 pot_t pot_ptr;
5224
5225 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5226
5227 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5228
5229 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5230
5231 // do output the line
5232
5233 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5234
5235 if (weak_hash_found == 1) myfree (pot_right_ptr);
5236
5237 if (left_part_masked == 1) myfree (pot_left_ptr);
5238 if (right_part_masked == 1) myfree (pot_right_ptr);
5239 }
5240
5241 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)
5242 {
5243 pot_t pot_key;
5244
5245 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5246
5247 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5248
5249 if (pot_ptr == NULL)
5250 {
5251 log_info_nn ("");
5252
5253 input_buf[input_len] = 0;
5254
5255 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5256 }
5257 }
5258
5259 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)
5260 {
5261 // left
5262
5263 pot_t pot_left_key;
5264
5265 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5266
5267 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5268
5269 // right
5270
5271 pot_t pot_right_key;
5272
5273 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5274
5275 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5276
5277 uint weak_hash_found = 0;
5278
5279 if (pot_right_ptr == NULL)
5280 {
5281 // special case, if "weak hash"
5282
5283 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5284 {
5285 weak_hash_found = 1;
5286
5287 // we just need that pot_right_ptr is not a NULL pointer
5288
5289 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5290 }
5291 }
5292
5293 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5294 {
5295 if (weak_hash_found == 1) myfree (pot_right_ptr);
5296
5297 return;
5298 }
5299
5300 // ... at least one part was not cracked
5301
5302 log_info_nn ("");
5303
5304 input_buf[input_len] = 0;
5305
5306 // only show the hash part which is still not cracked
5307
5308 uint user_len = input_len - 32;
5309
5310 char *hash_output = (char *) mymalloc (33);
5311
5312 memcpy (hash_output, input_buf, input_len);
5313
5314 if (pot_left_ptr != NULL)
5315 {
5316 // only show right part (because left part was already found)
5317
5318 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5319
5320 hash_output[user_len + 16] = 0;
5321 }
5322
5323 if (pot_right_ptr != NULL)
5324 {
5325 // only show left part (because right part was already found)
5326
5327 memcpy (hash_output + user_len, input_buf + user_len, 16);
5328
5329 hash_output[user_len + 16] = 0;
5330 }
5331
5332 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5333
5334 myfree (hash_output);
5335
5336 if (weak_hash_found == 1) myfree (pot_right_ptr);
5337 }
5338
5339 uint setup_opencl_platforms_filter (char *opencl_platforms)
5340 {
5341 uint opencl_platforms_filter = 0;
5342
5343 if (opencl_platforms)
5344 {
5345 char *platforms = strdup (opencl_platforms);
5346
5347 char *next = strtok (platforms, ",");
5348
5349 do
5350 {
5351 int platform = atoi (next);
5352
5353 if (platform < 1 || platform > 32)
5354 {
5355 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5356
5357 exit (-1);
5358 }
5359
5360 opencl_platforms_filter |= 1 << (platform - 1);
5361
5362 } while ((next = strtok (NULL, ",")) != NULL);
5363
5364 free (platforms);
5365 }
5366 else
5367 {
5368 opencl_platforms_filter = -1;
5369 }
5370
5371 return opencl_platforms_filter;
5372 }
5373
5374 u32 setup_devices_filter (char *opencl_devices)
5375 {
5376 u32 devices_filter = 0;
5377
5378 if (opencl_devices)
5379 {
5380 char *devices = strdup (opencl_devices);
5381
5382 char *next = strtok (devices, ",");
5383
5384 do
5385 {
5386 int device_id = atoi (next);
5387
5388 if (device_id < 1 || device_id > 32)
5389 {
5390 log_error ("ERROR: invalid device_id %u specified", device_id);
5391
5392 exit (-1);
5393 }
5394
5395 devices_filter |= 1 << (device_id - 1);
5396
5397 } while ((next = strtok (NULL, ",")) != NULL);
5398
5399 free (devices);
5400 }
5401 else
5402 {
5403 devices_filter = -1;
5404 }
5405
5406 return devices_filter;
5407 }
5408
5409 cl_device_type setup_device_types_filter (char *opencl_device_types)
5410 {
5411 cl_device_type device_types_filter = 0;
5412
5413 if (opencl_device_types)
5414 {
5415 char *device_types = strdup (opencl_device_types);
5416
5417 char *next = strtok (device_types, ",");
5418
5419 do
5420 {
5421 int device_type = atoi (next);
5422
5423 if (device_type < 1 || device_type > 3)
5424 {
5425 log_error ("ERROR: invalid device_type %u specified", device_type);
5426
5427 exit (-1);
5428 }
5429
5430 device_types_filter |= 1 << device_type;
5431
5432 } while ((next = strtok (NULL, ",")) != NULL);
5433
5434 free (device_types);
5435 }
5436 else
5437 {
5438 // Do not use CPU by default, this often reduces GPU performance because
5439 // the CPU is too busy to handle GPU synchronization
5440
5441 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5442 }
5443
5444 return device_types_filter;
5445 }
5446
5447 u32 get_random_num (const u32 min, const u32 max)
5448 {
5449 if (min == max) return (min);
5450
5451 return ((rand () % (max - min)) + min);
5452 }
5453
5454 u32 mydivc32 (const u32 dividend, const u32 divisor)
5455 {
5456 u32 quotient = dividend / divisor;
5457
5458 if (dividend % divisor) quotient++;
5459
5460 return quotient;
5461 }
5462
5463 u64 mydivc64 (const u64 dividend, const u64 divisor)
5464 {
5465 u64 quotient = dividend / divisor;
5466
5467 if (dividend % divisor) quotient++;
5468
5469 return quotient;
5470 }
5471
5472 void format_timer_display (struct tm *tm, char *buf, size_t len)
5473 {
5474 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5475 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5476
5477 if (tm->tm_year - 70)
5478 {
5479 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5480 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5481
5482 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5483 }
5484 else if (tm->tm_yday)
5485 {
5486 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5487 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5488
5489 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5490 }
5491 else if (tm->tm_hour)
5492 {
5493 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5494 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5495
5496 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5497 }
5498 else if (tm->tm_min)
5499 {
5500 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5501 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5502
5503 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5504 }
5505 else
5506 {
5507 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5508
5509 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5510 }
5511 }
5512
5513 void format_speed_display (float val, char *buf, size_t len)
5514 {
5515 if (val <= 0)
5516 {
5517 buf[0] = '0';
5518 buf[1] = ' ';
5519 buf[2] = 0;
5520
5521 return;
5522 }
5523
5524 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5525
5526 uint level = 0;
5527
5528 while (val > 99999)
5529 {
5530 val /= 1000;
5531
5532 level++;
5533 }
5534
5535 /* generate output */
5536
5537 if (level == 0)
5538 {
5539 snprintf (buf, len - 1, "%.0f ", val);
5540 }
5541 else
5542 {
5543 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5544 }
5545 }
5546
5547 void lowercase (u8 *buf, int len)
5548 {
5549 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5550 }
5551
5552 void uppercase (u8 *buf, int len)
5553 {
5554 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5555 }
5556
5557 int fgetl (FILE *fp, char *line_buf)
5558 {
5559 int line_len = 0;
5560
5561 while (!feof (fp))
5562 {
5563 const int c = fgetc (fp);
5564
5565 if (c == EOF) break;
5566
5567 line_buf[line_len] = (char) c;
5568
5569 line_len++;
5570
5571 if (line_len == HCBUFSIZ) line_len--;
5572
5573 if (c == '\n') break;
5574 }
5575
5576 if (line_len == 0) return 0;
5577
5578 if (line_buf[line_len - 1] == '\n')
5579 {
5580 line_len--;
5581
5582 line_buf[line_len] = 0;
5583 }
5584
5585 if (line_len == 0) return 0;
5586
5587 if (line_buf[line_len - 1] == '\r')
5588 {
5589 line_len--;
5590
5591 line_buf[line_len] = 0;
5592 }
5593
5594 return (line_len);
5595 }
5596
5597 int in_superchop (char *buf)
5598 {
5599 int len = strlen (buf);
5600
5601 while (len)
5602 {
5603 if (buf[len - 1] == '\n')
5604 {
5605 len--;
5606
5607 continue;
5608 }
5609
5610 if (buf[len - 1] == '\r')
5611 {
5612 len--;
5613
5614 continue;
5615 }
5616
5617 break;
5618 }
5619
5620 buf[len] = 0;
5621
5622 return len;
5623 }
5624
5625 char **scan_directory (const char *path)
5626 {
5627 char *tmp_path = mystrdup (path);
5628
5629 size_t tmp_path_len = strlen (tmp_path);
5630
5631 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5632 {
5633 tmp_path[tmp_path_len - 1] = 0;
5634
5635 tmp_path_len = strlen (tmp_path);
5636 }
5637
5638 char **files = NULL;
5639
5640 int num_files = 0;
5641
5642 DIR *d = NULL;
5643
5644 if ((d = opendir (tmp_path)) != NULL)
5645 {
5646 #ifdef OSX
5647 struct dirent e;
5648
5649 for (;;) {
5650 memset (&e, 0, sizeof (e));
5651 struct dirent *de = NULL;
5652
5653 if (readdir_r (d, &e, &de) != 0)
5654 {
5655 log_error ("ERROR: readdir_r() failed");
5656
5657 break;
5658 }
5659
5660 if (de == NULL) break;
5661 #else
5662 struct dirent *de;
5663
5664 while ((de = readdir (d)) != NULL)
5665 {
5666 #endif
5667 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5668
5669 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5670
5671 char *path_file = (char *) mymalloc (path_size + 1);
5672
5673 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5674
5675 path_file[path_size] = 0;
5676
5677 DIR *d_test;
5678
5679 if ((d_test = opendir (path_file)) != NULL)
5680 {
5681 closedir (d_test);
5682
5683 myfree (path_file);
5684 }
5685 else
5686 {
5687 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5688
5689 num_files++;
5690
5691 files[num_files - 1] = path_file;
5692 }
5693 }
5694
5695 closedir (d);
5696 }
5697 else if (errno == ENOTDIR)
5698 {
5699 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5700
5701 num_files++;
5702
5703 files[num_files - 1] = mystrdup (path);
5704 }
5705
5706 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5707
5708 num_files++;
5709
5710 files[num_files - 1] = NULL;
5711
5712 myfree (tmp_path);
5713
5714 return (files);
5715 }
5716
5717 int count_dictionaries (char **dictionary_files)
5718 {
5719 if (dictionary_files == NULL) return 0;
5720
5721 int cnt = 0;
5722
5723 for (int d = 0; dictionary_files[d] != NULL; d++)
5724 {
5725 cnt++;
5726 }
5727
5728 return (cnt);
5729 }
5730
5731 char *stroptitype (const uint opti_type)
5732 {
5733 switch (opti_type)
5734 {
5735 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5736 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5737 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5738 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5739 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5740 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5741 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5742 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5743 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5744 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5745 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5746 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5747 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5748 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5749 case OPTI_TYPE_SLOW_HASH_SIMD: return ((char *) OPTI_STR_SLOW_HASH_SIMD); break;
5750 case OPTI_TYPE_USES_BITS_8: return ((char *) OPTI_STR_USES_BITS_8); break;
5751 case OPTI_TYPE_USES_BITS_16: return ((char *) OPTI_STR_USES_BITS_16); break;
5752 case OPTI_TYPE_USES_BITS_32: return ((char *) OPTI_STR_USES_BITS_32); break;
5753 case OPTI_TYPE_USES_BITS_64: return ((char *) OPTI_STR_USES_BITS_64); break;
5754 }
5755
5756 return (NULL);
5757 }
5758
5759 char *strparser (const uint parser_status)
5760 {
5761 switch (parser_status)
5762 {
5763 case PARSER_OK: return ((char *) PA_000); break;
5764 case PARSER_COMMENT: return ((char *) PA_001); break;
5765 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5766 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5767 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5768 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5769 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5770 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5771 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5772 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5773 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5774 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5775 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5776 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5777 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5778 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5779 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5780 }
5781
5782 return ((char *) PA_255);
5783 }
5784
5785 char *strhashtype (const uint hash_mode)
5786 {
5787 switch (hash_mode)
5788 {
5789 case 0: return ((char *) HT_00000); break;
5790 case 10: return ((char *) HT_00010); break;
5791 case 11: return ((char *) HT_00011); break;
5792 case 12: return ((char *) HT_00012); break;
5793 case 20: return ((char *) HT_00020); break;
5794 case 21: return ((char *) HT_00021); break;
5795 case 22: return ((char *) HT_00022); break;
5796 case 23: return ((char *) HT_00023); break;
5797 case 30: return ((char *) HT_00030); break;
5798 case 40: return ((char *) HT_00040); break;
5799 case 50: return ((char *) HT_00050); break;
5800 case 60: return ((char *) HT_00060); break;
5801 case 100: return ((char *) HT_00100); break;
5802 case 101: return ((char *) HT_00101); break;
5803 case 110: return ((char *) HT_00110); break;
5804 case 111: return ((char *) HT_00111); break;
5805 case 112: return ((char *) HT_00112); break;
5806 case 120: return ((char *) HT_00120); break;
5807 case 121: return ((char *) HT_00121); break;
5808 case 122: return ((char *) HT_00122); break;
5809 case 124: return ((char *) HT_00124); break;
5810 case 125: return ((char *) HT_00125); break;
5811 case 130: return ((char *) HT_00130); break;
5812 case 131: return ((char *) HT_00131); break;
5813 case 132: return ((char *) HT_00132); break;
5814 case 133: return ((char *) HT_00133); break;
5815 case 140: return ((char *) HT_00140); break;
5816 case 141: return ((char *) HT_00141); break;
5817 case 150: return ((char *) HT_00150); break;
5818 case 160: return ((char *) HT_00160); break;
5819 case 190: return ((char *) HT_00190); break;
5820 case 200: return ((char *) HT_00200); break;
5821 case 300: return ((char *) HT_00300); break;
5822 case 400: return ((char *) HT_00400); break;
5823 case 500: return ((char *) HT_00500); break;
5824 case 501: return ((char *) HT_00501); break;
5825 case 900: return ((char *) HT_00900); break;
5826 case 910: return ((char *) HT_00910); break;
5827 case 1000: return ((char *) HT_01000); break;
5828 case 1100: return ((char *) HT_01100); break;
5829 case 1400: return ((char *) HT_01400); break;
5830 case 1410: return ((char *) HT_01410); break;
5831 case 1420: return ((char *) HT_01420); break;
5832 case 1421: return ((char *) HT_01421); break;
5833 case 1430: return ((char *) HT_01430); break;
5834 case 1440: return ((char *) HT_01440); break;
5835 case 1441: return ((char *) HT_01441); break;
5836 case 1450: return ((char *) HT_01450); break;
5837 case 1460: return ((char *) HT_01460); break;
5838 case 1500: return ((char *) HT_01500); break;
5839 case 1600: return ((char *) HT_01600); break;
5840 case 1700: return ((char *) HT_01700); break;
5841 case 1710: return ((char *) HT_01710); break;
5842 case 1711: return ((char *) HT_01711); break;
5843 case 1720: return ((char *) HT_01720); break;
5844 case 1722: return ((char *) HT_01722); break;
5845 case 1730: return ((char *) HT_01730); break;
5846 case 1731: return ((char *) HT_01731); break;
5847 case 1740: return ((char *) HT_01740); break;
5848 case 1750: return ((char *) HT_01750); break;
5849 case 1760: return ((char *) HT_01760); break;
5850 case 1800: return ((char *) HT_01800); break;
5851 case 2100: return ((char *) HT_02100); break;
5852 case 2400: return ((char *) HT_02400); break;
5853 case 2410: return ((char *) HT_02410); break;
5854 case 2500: return ((char *) HT_02500); break;
5855 case 2600: return ((char *) HT_02600); break;
5856 case 2611: return ((char *) HT_02611); break;
5857 case 2612: return ((char *) HT_02612); break;
5858 case 2711: return ((char *) HT_02711); break;
5859 case 2811: return ((char *) HT_02811); break;
5860 case 3000: return ((char *) HT_03000); break;
5861 case 3100: return ((char *) HT_03100); break;
5862 case 3200: return ((char *) HT_03200); break;
5863 case 3710: return ((char *) HT_03710); break;
5864 case 3711: return ((char *) HT_03711); break;
5865 case 3800: return ((char *) HT_03800); break;
5866 case 4300: return ((char *) HT_04300); break;
5867 case 4400: return ((char *) HT_04400); break;
5868 case 4500: return ((char *) HT_04500); break;
5869 case 4700: return ((char *) HT_04700); break;
5870 case 4800: return ((char *) HT_04800); break;
5871 case 4900: return ((char *) HT_04900); break;
5872 case 5000: return ((char *) HT_05000); break;
5873 case 5100: return ((char *) HT_05100); break;
5874 case 5200: return ((char *) HT_05200); break;
5875 case 5300: return ((char *) HT_05300); break;
5876 case 5400: return ((char *) HT_05400); break;
5877 case 5500: return ((char *) HT_05500); break;
5878 case 5600: return ((char *) HT_05600); break;
5879 case 5700: return ((char *) HT_05700); break;
5880 case 5800: return ((char *) HT_05800); break;
5881 case 6000: return ((char *) HT_06000); break;
5882 case 6100: return ((char *) HT_06100); break;
5883 case 6211: return ((char *) HT_06211); break;
5884 case 6212: return ((char *) HT_06212); break;
5885 case 6213: return ((char *) HT_06213); break;
5886 case 6221: return ((char *) HT_06221); break;
5887 case 6222: return ((char *) HT_06222); break;
5888 case 6223: return ((char *) HT_06223); break;
5889 case 6231: return ((char *) HT_06231); break;
5890 case 6232: return ((char *) HT_06232); break;
5891 case 6233: return ((char *) HT_06233); break;
5892 case 6241: return ((char *) HT_06241); break;
5893 case 6242: return ((char *) HT_06242); break;
5894 case 6243: return ((char *) HT_06243); break;
5895 case 6300: return ((char *) HT_06300); break;
5896 case 6400: return ((char *) HT_06400); break;
5897 case 6500: return ((char *) HT_06500); break;
5898 case 6600: return ((char *) HT_06600); break;
5899 case 6700: return ((char *) HT_06700); break;
5900 case 6800: return ((char *) HT_06800); break;
5901 case 6900: return ((char *) HT_06900); break;
5902 case 7100: return ((char *) HT_07100); break;
5903 case 7200: return ((char *) HT_07200); break;
5904 case 7300: return ((char *) HT_07300); break;
5905 case 7400: return ((char *) HT_07400); break;
5906 case 7500: return ((char *) HT_07500); break;
5907 case 7600: return ((char *) HT_07600); break;
5908 case 7700: return ((char *) HT_07700); break;
5909 case 7800: return ((char *) HT_07800); break;
5910 case 7900: return ((char *) HT_07900); break;
5911 case 8000: return ((char *) HT_08000); break;
5912 case 8100: return ((char *) HT_08100); break;
5913 case 8200: return ((char *) HT_08200); break;
5914 case 8300: return ((char *) HT_08300); break;
5915 case 8400: return ((char *) HT_08400); break;
5916 case 8500: return ((char *) HT_08500); break;
5917 case 8600: return ((char *) HT_08600); break;
5918 case 8700: return ((char *) HT_08700); break;
5919 case 8800: return ((char *) HT_08800); break;
5920 case 8900: return ((char *) HT_08900); break;
5921 case 9000: return ((char *) HT_09000); break;
5922 case 9100: return ((char *) HT_09100); break;
5923 case 9200: return ((char *) HT_09200); break;
5924 case 9300: return ((char *) HT_09300); break;
5925 case 9400: return ((char *) HT_09400); break;
5926 case 9500: return ((char *) HT_09500); break;
5927 case 9600: return ((char *) HT_09600); break;
5928 case 9700: return ((char *) HT_09700); break;
5929 case 9710: return ((char *) HT_09710); break;
5930 case 9720: return ((char *) HT_09720); break;
5931 case 9800: return ((char *) HT_09800); break;
5932 case 9810: return ((char *) HT_09810); break;
5933 case 9820: return ((char *) HT_09820); break;
5934 case 9900: return ((char *) HT_09900); break;
5935 case 10000: return ((char *) HT_10000); break;
5936 case 10100: return ((char *) HT_10100); break;
5937 case 10200: return ((char *) HT_10200); break;
5938 case 10300: return ((char *) HT_10300); break;
5939 case 10400: return ((char *) HT_10400); break;
5940 case 10410: return ((char *) HT_10410); break;
5941 case 10420: return ((char *) HT_10420); break;
5942 case 10500: return ((char *) HT_10500); break;
5943 case 10600: return ((char *) HT_10600); break;
5944 case 10700: return ((char *) HT_10700); break;
5945 case 10800: return ((char *) HT_10800); break;
5946 case 10900: return ((char *) HT_10900); break;
5947 case 11000: return ((char *) HT_11000); break;
5948 case 11100: return ((char *) HT_11100); break;
5949 case 11200: return ((char *) HT_11200); break;
5950 case 11300: return ((char *) HT_11300); break;
5951 case 11400: return ((char *) HT_11400); break;
5952 case 11500: return ((char *) HT_11500); break;
5953 case 11600: return ((char *) HT_11600); break;
5954 case 11700: return ((char *) HT_11700); break;
5955 case 11800: return ((char *) HT_11800); break;
5956 case 11900: return ((char *) HT_11900); break;
5957 case 12000: return ((char *) HT_12000); break;
5958 case 12100: return ((char *) HT_12100); break;
5959 case 12200: return ((char *) HT_12200); break;
5960 case 12300: return ((char *) HT_12300); break;
5961 case 12400: return ((char *) HT_12400); break;
5962 case 12500: return ((char *) HT_12500); break;
5963 case 12600: return ((char *) HT_12600); break;
5964 case 12700: return ((char *) HT_12700); break;
5965 case 12800: return ((char *) HT_12800); break;
5966 case 12900: return ((char *) HT_12900); break;
5967 case 13000: return ((char *) HT_13000); break;
5968 case 13100: return ((char *) HT_13100); break;
5969 case 13200: return ((char *) HT_13200); break;
5970 case 13300: return ((char *) HT_13300); break;
5971 case 13400: return ((char *) HT_13400); break;
5972 case 13500: return ((char *) HT_13500); break;
5973 case 13600: return ((char *) HT_13600); break;
5974 case 13711: return ((char *) HT_13711); break;
5975 case 13712: return ((char *) HT_13712); break;
5976 case 13713: return ((char *) HT_13713); break;
5977 case 13721: return ((char *) HT_13721); break;
5978 case 13722: return ((char *) HT_13722); break;
5979 case 13723: return ((char *) HT_13723); break;
5980 case 13731: return ((char *) HT_13731); break;
5981 case 13732: return ((char *) HT_13732); break;
5982 case 13733: return ((char *) HT_13733); break;
5983 case 13741: return ((char *) HT_13741); break;
5984 case 13742: return ((char *) HT_13742); break;
5985 case 13743: return ((char *) HT_13743); break;
5986 case 13751: return ((char *) HT_13751); break;
5987 case 13752: return ((char *) HT_13752); break;
5988 case 13753: return ((char *) HT_13753); break;
5989 case 13761: return ((char *) HT_13761); break;
5990 case 13762: return ((char *) HT_13762); break;
5991 case 13763: return ((char *) HT_13763); break;
5992 }
5993
5994 return ((char *) "Unknown");
5995 }
5996
5997 char *strstatus (const uint devices_status)
5998 {
5999 switch (devices_status)
6000 {
6001 case STATUS_INIT: return ((char *) ST_0000); break;
6002 case STATUS_STARTING: return ((char *) ST_0001); break;
6003 case STATUS_RUNNING: return ((char *) ST_0002); break;
6004 case STATUS_PAUSED: return ((char *) ST_0003); break;
6005 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
6006 case STATUS_CRACKED: return ((char *) ST_0005); break;
6007 case STATUS_ABORTED: return ((char *) ST_0006); break;
6008 case STATUS_QUIT: return ((char *) ST_0007); break;
6009 case STATUS_BYPASS: return ((char *) ST_0008); break;
6010 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
6011 case STATUS_AUTOTUNE: return ((char *) ST_0010); break;
6012 }
6013
6014 return ((char *) "Unknown");
6015 }
6016
6017 void ascii_digest (char *out_buf, uint salt_pos, uint digest_pos)
6018 {
6019 uint hash_type = data.hash_type;
6020 uint hash_mode = data.hash_mode;
6021 uint salt_type = data.salt_type;
6022 uint opts_type = data.opts_type;
6023 uint opti_type = data.opti_type;
6024 uint dgst_size = data.dgst_size;
6025
6026 char *hashfile = data.hashfile;
6027
6028 uint len = 4096;
6029
6030 uint digest_buf[64] = { 0 };
6031
6032 u64 *digest_buf64 = (u64 *) digest_buf;
6033
6034 char *digests_buf_ptr = (char *) data.digests_buf;
6035
6036 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
6037
6038 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6039 {
6040 uint tt;
6041
6042 switch (hash_type)
6043 {
6044 case HASH_TYPE_DESCRYPT:
6045 FP (digest_buf[1], digest_buf[0], tt);
6046 break;
6047
6048 case HASH_TYPE_DESRACF:
6049 digest_buf[0] = rotl32 (digest_buf[0], 29);
6050 digest_buf[1] = rotl32 (digest_buf[1], 29);
6051
6052 FP (digest_buf[1], digest_buf[0], tt);
6053 break;
6054
6055 case HASH_TYPE_LM:
6056 FP (digest_buf[1], digest_buf[0], tt);
6057 break;
6058
6059 case HASH_TYPE_NETNTLM:
6060 digest_buf[0] = rotl32 (digest_buf[0], 29);
6061 digest_buf[1] = rotl32 (digest_buf[1], 29);
6062 digest_buf[2] = rotl32 (digest_buf[2], 29);
6063 digest_buf[3] = rotl32 (digest_buf[3], 29);
6064
6065 FP (digest_buf[1], digest_buf[0], tt);
6066 FP (digest_buf[3], digest_buf[2], tt);
6067 break;
6068
6069 case HASH_TYPE_BSDICRYPT:
6070 digest_buf[0] = rotl32 (digest_buf[0], 31);
6071 digest_buf[1] = rotl32 (digest_buf[1], 31);
6072
6073 FP (digest_buf[1], digest_buf[0], tt);
6074 break;
6075 }
6076 }
6077
6078 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
6079 {
6080 switch (hash_type)
6081 {
6082 case HASH_TYPE_MD4:
6083 digest_buf[0] += MD4M_A;
6084 digest_buf[1] += MD4M_B;
6085 digest_buf[2] += MD4M_C;
6086 digest_buf[3] += MD4M_D;
6087 break;
6088
6089 case HASH_TYPE_MD5:
6090 digest_buf[0] += MD5M_A;
6091 digest_buf[1] += MD5M_B;
6092 digest_buf[2] += MD5M_C;
6093 digest_buf[3] += MD5M_D;
6094 break;
6095
6096 case HASH_TYPE_SHA1:
6097 digest_buf[0] += SHA1M_A;
6098 digest_buf[1] += SHA1M_B;
6099 digest_buf[2] += SHA1M_C;
6100 digest_buf[3] += SHA1M_D;
6101 digest_buf[4] += SHA1M_E;
6102 break;
6103
6104 case HASH_TYPE_SHA256:
6105 digest_buf[0] += SHA256M_A;
6106 digest_buf[1] += SHA256M_B;
6107 digest_buf[2] += SHA256M_C;
6108 digest_buf[3] += SHA256M_D;
6109 digest_buf[4] += SHA256M_E;
6110 digest_buf[5] += SHA256M_F;
6111 digest_buf[6] += SHA256M_G;
6112 digest_buf[7] += SHA256M_H;
6113 break;
6114
6115 case HASH_TYPE_SHA384:
6116 digest_buf64[0] += SHA384M_A;
6117 digest_buf64[1] += SHA384M_B;
6118 digest_buf64[2] += SHA384M_C;
6119 digest_buf64[3] += SHA384M_D;
6120 digest_buf64[4] += SHA384M_E;
6121 digest_buf64[5] += SHA384M_F;
6122 digest_buf64[6] += 0;
6123 digest_buf64[7] += 0;
6124 break;
6125
6126 case HASH_TYPE_SHA512:
6127 digest_buf64[0] += SHA512M_A;
6128 digest_buf64[1] += SHA512M_B;
6129 digest_buf64[2] += SHA512M_C;
6130 digest_buf64[3] += SHA512M_D;
6131 digest_buf64[4] += SHA512M_E;
6132 digest_buf64[5] += SHA512M_F;
6133 digest_buf64[6] += SHA512M_G;
6134 digest_buf64[7] += SHA512M_H;
6135 break;
6136 }
6137 }
6138
6139 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
6140 {
6141 if (dgst_size == DGST_SIZE_4_2)
6142 {
6143 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6144 }
6145 else if (dgst_size == DGST_SIZE_4_4)
6146 {
6147 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6148 }
6149 else if (dgst_size == DGST_SIZE_4_5)
6150 {
6151 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6152 }
6153 else if (dgst_size == DGST_SIZE_4_6)
6154 {
6155 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6156 }
6157 else if (dgst_size == DGST_SIZE_4_8)
6158 {
6159 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6160 }
6161 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
6162 {
6163 if (hash_type == HASH_TYPE_WHIRLPOOL)
6164 {
6165 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6166 }
6167 else if (hash_type == HASH_TYPE_SHA384)
6168 {
6169 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6170 }
6171 else if (hash_type == HASH_TYPE_SHA512)
6172 {
6173 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6174 }
6175 else if (hash_type == HASH_TYPE_GOST)
6176 {
6177 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6178 }
6179 }
6180 else if (dgst_size == DGST_SIZE_4_64)
6181 {
6182 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6183 }
6184 else if (dgst_size == DGST_SIZE_8_25)
6185 {
6186 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6187 }
6188 }
6189
6190 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
6191 | (data.salt_type == SALT_TYPE_EXTERN)
6192 | (data.salt_type == SALT_TYPE_EMBEDDED));
6193
6194 salt_t salt;
6195
6196 if (isSalted)
6197 {
6198 memset (&salt, 0, sizeof (salt_t));
6199
6200 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
6201
6202 char *ptr = (char *) salt.salt_buf;
6203
6204 uint len = salt.salt_len;
6205
6206 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6207 {
6208 uint tt;
6209
6210 switch (hash_type)
6211 {
6212 case HASH_TYPE_NETNTLM:
6213
6214 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6215 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6216
6217 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6218
6219 break;
6220 }
6221 }
6222
6223 if (opts_type & OPTS_TYPE_ST_UNICODE)
6224 {
6225 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6226 {
6227 ptr[i] = ptr[j];
6228 }
6229
6230 len = len / 2;
6231 }
6232
6233 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6234 {
6235 uint max = salt.salt_len / 4;
6236
6237 if (len % 4) max++;
6238
6239 for (uint i = 0; i < max; i++)
6240 {
6241 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6242 }
6243 }
6244
6245 if (opts_type & OPTS_TYPE_ST_HEX)
6246 {
6247 char tmp[64] = { 0 };
6248
6249 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6250 {
6251 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6252 }
6253
6254 len = len * 2;
6255
6256 memcpy (ptr, tmp, len);
6257 }
6258
6259 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6260
6261 memset (ptr + len, 0, memset_size);
6262
6263 salt.salt_len = len;
6264 }
6265
6266 //
6267 // some modes require special encoding
6268 //
6269
6270 uint out_buf_plain[256] = { 0 };
6271 uint out_buf_salt[256] = { 0 };
6272
6273 char tmp_buf[1024] = { 0 };
6274
6275 char *ptr_plain = (char *) out_buf_plain;
6276 char *ptr_salt = (char *) out_buf_salt;
6277
6278 if (hash_mode == 22)
6279 {
6280 char username[30] = { 0 };
6281
6282 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6283
6284 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6285
6286 u16 *ptr = (u16 *) digest_buf;
6287
6288 tmp_buf[ 0] = sig[0];
6289 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6290 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6291 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6292 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6293 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6294 tmp_buf[ 6] = sig[1];
6295 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6296 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6297 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6298 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6299 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6300 tmp_buf[12] = sig[2];
6301 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6302 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6303 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6304 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6305 tmp_buf[17] = sig[3];
6306 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6307 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6308 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6309 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6310 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6311 tmp_buf[23] = sig[4];
6312 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6313 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6314 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6315 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6316 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6317 tmp_buf[29] = sig[5];
6318
6319 snprintf (out_buf, len-1, "%s:%s",
6320 tmp_buf,
6321 username);
6322 }
6323 else if (hash_mode == 23)
6324 {
6325 // do not show the skyper part in output
6326
6327 char *salt_buf_ptr = (char *) salt.salt_buf;
6328
6329 salt_buf_ptr[salt.salt_len - 8] = 0;
6330
6331 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6332 digest_buf[0],
6333 digest_buf[1],
6334 digest_buf[2],
6335 digest_buf[3],
6336 salt_buf_ptr);
6337 }
6338 else if (hash_mode == 101)
6339 {
6340 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6341
6342 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6343 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6344 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6345 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6346 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6347
6348 memcpy (tmp_buf, digest_buf, 20);
6349
6350 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6351
6352 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6353 }
6354 else if (hash_mode == 111)
6355 {
6356 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6357
6358 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6359 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6360 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6361 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6362 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6363
6364 memcpy (tmp_buf, digest_buf, 20);
6365 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6366
6367 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6368
6369 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6370 }
6371 else if ((hash_mode == 122) || (hash_mode == 125))
6372 {
6373 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6374 (char *) salt.salt_buf,
6375 digest_buf[0],
6376 digest_buf[1],
6377 digest_buf[2],
6378 digest_buf[3],
6379 digest_buf[4]);
6380 }
6381 else if (hash_mode == 124)
6382 {
6383 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6384 (char *) salt.salt_buf,
6385 digest_buf[0],
6386 digest_buf[1],
6387 digest_buf[2],
6388 digest_buf[3],
6389 digest_buf[4]);
6390 }
6391 else if (hash_mode == 131)
6392 {
6393 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6394 (char *) salt.salt_buf,
6395 0, 0, 0, 0, 0,
6396 digest_buf[0],
6397 digest_buf[1],
6398 digest_buf[2],
6399 digest_buf[3],
6400 digest_buf[4]);
6401 }
6402 else if (hash_mode == 132)
6403 {
6404 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6405 (char *) salt.salt_buf,
6406 digest_buf[0],
6407 digest_buf[1],
6408 digest_buf[2],
6409 digest_buf[3],
6410 digest_buf[4]);
6411 }
6412 else if (hash_mode == 133)
6413 {
6414 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6415
6416 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6417 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6418 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6419 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6420 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6421
6422 memcpy (tmp_buf, digest_buf, 20);
6423
6424 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6425
6426 snprintf (out_buf, len-1, "%s", ptr_plain);
6427 }
6428 else if (hash_mode == 141)
6429 {
6430 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6431
6432 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6433
6434 memset (tmp_buf, 0, sizeof (tmp_buf));
6435
6436 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6437
6438 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6439 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6440 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6441 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6442 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6443
6444 memcpy (tmp_buf, digest_buf, 20);
6445
6446 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6447
6448 ptr_plain[27] = 0;
6449
6450 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6451 }
6452 else if (hash_mode == 400)
6453 {
6454 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6455
6456 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6457 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6458 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6459 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6460
6461 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6462
6463 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6464 }
6465 else if (hash_mode == 500)
6466 {
6467 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6468
6469 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6470 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6471 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6472 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6473
6474 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6475
6476 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6477 {
6478 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6479 }
6480 else
6481 {
6482 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6483 }
6484 }
6485 else if (hash_mode == 501)
6486 {
6487 uint digest_idx = salt.digests_offset + digest_pos;
6488
6489 hashinfo_t **hashinfo_ptr = data.hash_info;
6490 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6491
6492 snprintf (out_buf, len-1, "%s", hash_buf);
6493 }
6494 else if (hash_mode == 1421)
6495 {
6496 u8 *salt_ptr = (u8 *) salt.salt_buf;
6497
6498 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6499 salt_ptr[0],
6500 salt_ptr[1],
6501 salt_ptr[2],
6502 salt_ptr[3],
6503 salt_ptr[4],
6504 salt_ptr[5],
6505 digest_buf[0],
6506 digest_buf[1],
6507 digest_buf[2],
6508 digest_buf[3],
6509 digest_buf[4],
6510 digest_buf[5],
6511 digest_buf[6],
6512 digest_buf[7]);
6513 }
6514 else if (hash_mode == 1441)
6515 {
6516 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6517
6518 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6519
6520 memset (tmp_buf, 0, sizeof (tmp_buf));
6521
6522 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6523
6524 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6525 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6526 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6527 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6528 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6529 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6530 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6531 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6532
6533 memcpy (tmp_buf, digest_buf, 32);
6534
6535 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6536
6537 ptr_plain[43] = 0;
6538
6539 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6540 }
6541 else if (hash_mode == 1500)
6542 {
6543 out_buf[0] = salt.salt_sign[0] & 0xff;
6544 out_buf[1] = salt.salt_sign[1] & 0xff;
6545 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6546 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6547 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6548
6549 memset (tmp_buf, 0, sizeof (tmp_buf));
6550
6551 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6552
6553 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6554 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6555
6556 memcpy (tmp_buf, digest_buf, 8);
6557
6558 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6559
6560 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6561
6562 out_buf[13] = 0;
6563 }
6564 else if (hash_mode == 1600)
6565 {
6566 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6567
6568 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6569 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6570 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6571 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6572
6573 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6574
6575 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6576 {
6577 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6578 }
6579 else
6580 {
6581 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6582 }
6583 }
6584 else if (hash_mode == 1711)
6585 {
6586 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6587
6588 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6589 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6590 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6591 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6592 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6593 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6594 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6595 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6596
6597 memcpy (tmp_buf, digest_buf, 64);
6598 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6599
6600 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6601
6602 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6603 }
6604 else if (hash_mode == 1722)
6605 {
6606 uint *ptr = digest_buf;
6607
6608 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6609 (unsigned char *) salt.salt_buf,
6610 ptr[ 1], ptr[ 0],
6611 ptr[ 3], ptr[ 2],
6612 ptr[ 5], ptr[ 4],
6613 ptr[ 7], ptr[ 6],
6614 ptr[ 9], ptr[ 8],
6615 ptr[11], ptr[10],
6616 ptr[13], ptr[12],
6617 ptr[15], ptr[14]);
6618 }
6619 else if (hash_mode == 1731)
6620 {
6621 uint *ptr = digest_buf;
6622
6623 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6624 (unsigned char *) salt.salt_buf,
6625 ptr[ 1], ptr[ 0],
6626 ptr[ 3], ptr[ 2],
6627 ptr[ 5], ptr[ 4],
6628 ptr[ 7], ptr[ 6],
6629 ptr[ 9], ptr[ 8],
6630 ptr[11], ptr[10],
6631 ptr[13], ptr[12],
6632 ptr[15], ptr[14]);
6633 }
6634 else if (hash_mode == 1800)
6635 {
6636 // temp workaround
6637
6638 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6639 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6640 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6641 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6642 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6643 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6644 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6645 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6646
6647 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6648
6649 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6650 {
6651 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6652 }
6653 else
6654 {
6655 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6656 }
6657 }
6658 else if (hash_mode == 2100)
6659 {
6660 uint pos = 0;
6661
6662 snprintf (out_buf + pos, len-1, "%s%i#",
6663 SIGNATURE_DCC2,
6664 salt.salt_iter + 1);
6665
6666 uint signature_len = strlen (out_buf);
6667
6668 pos += signature_len;
6669 len -= signature_len;
6670
6671 char *salt_ptr = (char *) salt.salt_buf;
6672
6673 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6674
6675 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6676 byte_swap_32 (digest_buf[0]),
6677 byte_swap_32 (digest_buf[1]),
6678 byte_swap_32 (digest_buf[2]),
6679 byte_swap_32 (digest_buf[3]));
6680 }
6681 else if ((hash_mode == 2400) || (hash_mode == 2410))
6682 {
6683 memcpy (tmp_buf, digest_buf, 16);
6684
6685 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6686
6687 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6688 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6689 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6690 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6691
6692 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6693 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6694 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6695 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6696
6697 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6698 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6699 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6700 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6701
6702 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6703 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6704 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6705 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6706
6707 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6708 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6709 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6710 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6711
6712 out_buf[16] = 0;
6713 }
6714 else if (hash_mode == 2500)
6715 {
6716 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6717
6718 wpa_t *wpa = &wpas[salt_pos];
6719
6720 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6721 (char *) salt.salt_buf,
6722 wpa->orig_mac1[0],
6723 wpa->orig_mac1[1],
6724 wpa->orig_mac1[2],
6725 wpa->orig_mac1[3],
6726 wpa->orig_mac1[4],
6727 wpa->orig_mac1[5],
6728 wpa->orig_mac2[0],
6729 wpa->orig_mac2[1],
6730 wpa->orig_mac2[2],
6731 wpa->orig_mac2[3],
6732 wpa->orig_mac2[4],
6733 wpa->orig_mac2[5]);
6734 }
6735 else if (hash_mode == 4400)
6736 {
6737 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6738 byte_swap_32 (digest_buf[0]),
6739 byte_swap_32 (digest_buf[1]),
6740 byte_swap_32 (digest_buf[2]),
6741 byte_swap_32 (digest_buf[3]));
6742 }
6743 else if (hash_mode == 4700)
6744 {
6745 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6746 byte_swap_32 (digest_buf[0]),
6747 byte_swap_32 (digest_buf[1]),
6748 byte_swap_32 (digest_buf[2]),
6749 byte_swap_32 (digest_buf[3]),
6750 byte_swap_32 (digest_buf[4]));
6751 }
6752 else if (hash_mode == 4800)
6753 {
6754 u8 chap_id_byte = (u8) salt.salt_buf[4];
6755
6756 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6757 digest_buf[0],
6758 digest_buf[1],
6759 digest_buf[2],
6760 digest_buf[3],
6761 byte_swap_32 (salt.salt_buf[0]),
6762 byte_swap_32 (salt.salt_buf[1]),
6763 byte_swap_32 (salt.salt_buf[2]),
6764 byte_swap_32 (salt.salt_buf[3]),
6765 chap_id_byte);
6766 }
6767 else if (hash_mode == 4900)
6768 {
6769 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6770 byte_swap_32 (digest_buf[0]),
6771 byte_swap_32 (digest_buf[1]),
6772 byte_swap_32 (digest_buf[2]),
6773 byte_swap_32 (digest_buf[3]),
6774 byte_swap_32 (digest_buf[4]));
6775 }
6776 else if (hash_mode == 5100)
6777 {
6778 snprintf (out_buf, len-1, "%08x%08x",
6779 digest_buf[0],
6780 digest_buf[1]);
6781 }
6782 else if (hash_mode == 5200)
6783 {
6784 snprintf (out_buf, len-1, "%s", hashfile);
6785 }
6786 else if (hash_mode == 5300)
6787 {
6788 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6789
6790 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6791
6792 int buf_len = len -1;
6793
6794 // msg_buf
6795
6796 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6797
6798 for (uint i = 0; i < ikepsk_msg_len; i++)
6799 {
6800 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6801 {
6802 snprintf (out_buf, buf_len, ":");
6803
6804 buf_len--;
6805 out_buf++;
6806 }
6807
6808 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6809
6810 buf_len -= 8;
6811 out_buf += 8;
6812 }
6813
6814 // nr_buf
6815
6816 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6817
6818 for (uint i = 0; i < ikepsk_nr_len; i++)
6819 {
6820 if ((i == 0) || (i == 5))
6821 {
6822 snprintf (out_buf, buf_len, ":");
6823
6824 buf_len--;
6825 out_buf++;
6826 }
6827
6828 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6829
6830 buf_len -= 8;
6831 out_buf += 8;
6832 }
6833
6834 // digest_buf
6835
6836 for (uint i = 0; i < 4; i++)
6837 {
6838 if (i == 0)
6839 {
6840 snprintf (out_buf, buf_len, ":");
6841
6842 buf_len--;
6843 out_buf++;
6844 }
6845
6846 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6847
6848 buf_len -= 8;
6849 out_buf += 8;
6850 }
6851 }
6852 else if (hash_mode == 5400)
6853 {
6854 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6855
6856 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6857
6858 int buf_len = len -1;
6859
6860 // msg_buf
6861
6862 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6863
6864 for (uint i = 0; i < ikepsk_msg_len; i++)
6865 {
6866 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6867 {
6868 snprintf (out_buf, buf_len, ":");
6869
6870 buf_len--;
6871 out_buf++;
6872 }
6873
6874 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6875
6876 buf_len -= 8;
6877 out_buf += 8;
6878 }
6879
6880 // nr_buf
6881
6882 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6883
6884 for (uint i = 0; i < ikepsk_nr_len; i++)
6885 {
6886 if ((i == 0) || (i == 5))
6887 {
6888 snprintf (out_buf, buf_len, ":");
6889
6890 buf_len--;
6891 out_buf++;
6892 }
6893
6894 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6895
6896 buf_len -= 8;
6897 out_buf += 8;
6898 }
6899
6900 // digest_buf
6901
6902 for (uint i = 0; i < 5; i++)
6903 {
6904 if (i == 0)
6905 {
6906 snprintf (out_buf, buf_len, ":");
6907
6908 buf_len--;
6909 out_buf++;
6910 }
6911
6912 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6913
6914 buf_len -= 8;
6915 out_buf += 8;
6916 }
6917 }
6918 else if (hash_mode == 5500)
6919 {
6920 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6921
6922 netntlm_t *netntlm = &netntlms[salt_pos];
6923
6924 char user_buf[64] = { 0 };
6925 char domain_buf[64] = { 0 };
6926 char srvchall_buf[1024] = { 0 };
6927 char clichall_buf[1024] = { 0 };
6928
6929 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6930 {
6931 char *ptr = (char *) netntlm->userdomain_buf;
6932
6933 user_buf[i] = ptr[j];
6934 }
6935
6936 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6937 {
6938 char *ptr = (char *) netntlm->userdomain_buf;
6939
6940 domain_buf[i] = ptr[netntlm->user_len + j];
6941 }
6942
6943 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6944 {
6945 u8 *ptr = (u8 *) netntlm->chall_buf;
6946
6947 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6948 }
6949
6950 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6951 {
6952 u8 *ptr = (u8 *) netntlm->chall_buf;
6953
6954 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6955 }
6956
6957 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6958 user_buf,
6959 domain_buf,
6960 srvchall_buf,
6961 digest_buf[0],
6962 digest_buf[1],
6963 digest_buf[2],
6964 digest_buf[3],
6965 byte_swap_32 (salt.salt_buf_pc[0]),
6966 byte_swap_32 (salt.salt_buf_pc[1]),
6967 clichall_buf);
6968 }
6969 else if (hash_mode == 5600)
6970 {
6971 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6972
6973 netntlm_t *netntlm = &netntlms[salt_pos];
6974
6975 char user_buf[64] = { 0 };
6976 char domain_buf[64] = { 0 };
6977 char srvchall_buf[1024] = { 0 };
6978 char clichall_buf[1024] = { 0 };
6979
6980 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6981 {
6982 char *ptr = (char *) netntlm->userdomain_buf;
6983
6984 user_buf[i] = ptr[j];
6985 }
6986
6987 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6988 {
6989 char *ptr = (char *) netntlm->userdomain_buf;
6990
6991 domain_buf[i] = ptr[netntlm->user_len + j];
6992 }
6993
6994 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6995 {
6996 u8 *ptr = (u8 *) netntlm->chall_buf;
6997
6998 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6999 }
7000
7001 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
7002 {
7003 u8 *ptr = (u8 *) netntlm->chall_buf;
7004
7005 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
7006 }
7007
7008 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
7009 user_buf,
7010 domain_buf,
7011 srvchall_buf,
7012 digest_buf[0],
7013 digest_buf[1],
7014 digest_buf[2],
7015 digest_buf[3],
7016 clichall_buf);
7017 }
7018 else if (hash_mode == 5700)
7019 {
7020 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7021
7022 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7023 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7024 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7025 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7026 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7027 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7028 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7029 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7030
7031 memcpy (tmp_buf, digest_buf, 32);
7032
7033 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
7034
7035 ptr_plain[43] = 0;
7036
7037 snprintf (out_buf, len-1, "%s", ptr_plain);
7038 }
7039 else if (hash_mode == 5800)
7040 {
7041 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7042 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7043 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7044 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7045 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7046
7047 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
7048 digest_buf[0],
7049 digest_buf[1],
7050 digest_buf[2],
7051 digest_buf[3],
7052 digest_buf[4]);
7053 }
7054 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
7055 {
7056 snprintf (out_buf, len-1, "%s", hashfile);
7057 }
7058 else if (hash_mode == 6300)
7059 {
7060 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7061
7062 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7063 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7064 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7065 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7066
7067 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7068
7069 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7070 }
7071 else if (hash_mode == 6400)
7072 {
7073 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7074
7075 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7076 }
7077 else if (hash_mode == 6500)
7078 {
7079 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7080
7081 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7082 }
7083 else if (hash_mode == 6600)
7084 {
7085 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
7086
7087 agilekey_t *agilekey = &agilekeys[salt_pos];
7088
7089 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7090 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7091
7092 uint buf_len = len - 1;
7093
7094 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
7095 buf_len -= 22;
7096
7097 for (uint i = 0, j = off; i < 1040; i++, j += 2)
7098 {
7099 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
7100
7101 buf_len -= 2;
7102 }
7103 }
7104 else if (hash_mode == 6700)
7105 {
7106 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7107
7108 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7109 }
7110 else if (hash_mode == 6800)
7111 {
7112 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
7113 }
7114 else if (hash_mode == 7100)
7115 {
7116 uint *ptr = digest_buf;
7117
7118 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7119
7120 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7121
7122 uint esalt[8] = { 0 };
7123
7124 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
7125 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
7126 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
7127 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
7128 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
7129 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
7130 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
7131 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
7132
7133 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",
7134 SIGNATURE_SHA512OSX,
7135 salt.salt_iter + 1,
7136 esalt[ 0], esalt[ 1],
7137 esalt[ 2], esalt[ 3],
7138 esalt[ 4], esalt[ 5],
7139 esalt[ 6], esalt[ 7],
7140 ptr [ 1], ptr [ 0],
7141 ptr [ 3], ptr [ 2],
7142 ptr [ 5], ptr [ 4],
7143 ptr [ 7], ptr [ 6],
7144 ptr [ 9], ptr [ 8],
7145 ptr [11], ptr [10],
7146 ptr [13], ptr [12],
7147 ptr [15], ptr [14]);
7148 }
7149 else if (hash_mode == 7200)
7150 {
7151 uint *ptr = digest_buf;
7152
7153 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7154
7155 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7156
7157 uint len_used = 0;
7158
7159 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
7160
7161 len_used = strlen (out_buf);
7162
7163 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
7164
7165 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
7166 {
7167 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
7168 }
7169
7170 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",
7171 ptr [ 1], ptr [ 0],
7172 ptr [ 3], ptr [ 2],
7173 ptr [ 5], ptr [ 4],
7174 ptr [ 7], ptr [ 6],
7175 ptr [ 9], ptr [ 8],
7176 ptr [11], ptr [10],
7177 ptr [13], ptr [12],
7178 ptr [15], ptr [14]);
7179 }
7180 else if (hash_mode == 7300)
7181 {
7182 rakp_t *rakps = (rakp_t *) data.esalts_buf;
7183
7184 rakp_t *rakp = &rakps[salt_pos];
7185
7186 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
7187 {
7188 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
7189 }
7190
7191 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7192 digest_buf[0],
7193 digest_buf[1],
7194 digest_buf[2],
7195 digest_buf[3],
7196 digest_buf[4]);
7197 }
7198 else if (hash_mode == 7400)
7199 {
7200 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7201
7202 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7203 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7204 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7205 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7206 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7207 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7208 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7209 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7210
7211 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7212
7213 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7214 {
7215 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7216 }
7217 else
7218 {
7219 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7220 }
7221 }
7222 else if (hash_mode == 7500)
7223 {
7224 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7225
7226 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7227
7228 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7229 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7230
7231 char data[128] = { 0 };
7232
7233 char *ptr_data = data;
7234
7235 for (uint i = 0; i < 36; i++, ptr_data += 2)
7236 {
7237 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7238 }
7239
7240 for (uint i = 0; i < 16; i++, ptr_data += 2)
7241 {
7242 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7243 }
7244
7245 *ptr_data = 0;
7246
7247 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7248 SIGNATURE_KRB5PA,
7249 (char *) krb5pa->user,
7250 (char *) krb5pa->realm,
7251 (char *) krb5pa->salt,
7252 data);
7253 }
7254 else if (hash_mode == 7700)
7255 {
7256 snprintf (out_buf, len-1, "%s$%08X%08X",
7257 (char *) salt.salt_buf,
7258 digest_buf[0],
7259 digest_buf[1]);
7260 }
7261 else if (hash_mode == 7800)
7262 {
7263 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7264 (char *) salt.salt_buf,
7265 digest_buf[0],
7266 digest_buf[1],
7267 digest_buf[2],
7268 digest_buf[3],
7269 digest_buf[4]);
7270 }
7271 else if (hash_mode == 7900)
7272 {
7273 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7274
7275 // ugly hack start
7276
7277 char *tmp = (char *) salt.salt_buf_pc;
7278
7279 ptr_plain[42] = tmp[0];
7280
7281 // ugly hack end
7282
7283 ptr_plain[43] = 0;
7284
7285 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7286 }
7287 else if (hash_mode == 8000)
7288 {
7289 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7290 (unsigned char *) salt.salt_buf,
7291 digest_buf[0],
7292 digest_buf[1],
7293 digest_buf[2],
7294 digest_buf[3],
7295 digest_buf[4],
7296 digest_buf[5],
7297 digest_buf[6],
7298 digest_buf[7]);
7299 }
7300 else if (hash_mode == 8100)
7301 {
7302 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7303 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7304
7305 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7306 (unsigned char *) salt.salt_buf,
7307 digest_buf[0],
7308 digest_buf[1],
7309 digest_buf[2],
7310 digest_buf[3],
7311 digest_buf[4]);
7312 }
7313 else if (hash_mode == 8200)
7314 {
7315 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7316
7317 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7318
7319 char data_buf[4096] = { 0 };
7320
7321 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7322 {
7323 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7324 }
7325
7326 data_buf[cloudkey->data_len * 2] = 0;
7327
7328 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7329 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7330 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7331 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7332 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7333 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7334 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7335 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7336
7337 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7338 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7339 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7340 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7341
7342 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7343 digest_buf[0],
7344 digest_buf[1],
7345 digest_buf[2],
7346 digest_buf[3],
7347 digest_buf[4],
7348 digest_buf[5],
7349 digest_buf[6],
7350 digest_buf[7],
7351 salt.salt_buf[0],
7352 salt.salt_buf[1],
7353 salt.salt_buf[2],
7354 salt.salt_buf[3],
7355 salt.salt_iter + 1,
7356 data_buf);
7357 }
7358 else if (hash_mode == 8300)
7359 {
7360 char digest_buf_c[34] = { 0 };
7361
7362 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7363 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7364 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7365 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7366 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7367
7368 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7369
7370 digest_buf_c[32] = 0;
7371
7372 // domain
7373
7374 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7375
7376 char domain_buf_c[33] = { 0 };
7377
7378 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7379
7380 for (uint i = 0; i < salt_pc_len; i++)
7381 {
7382 const char next = domain_buf_c[i];
7383
7384 domain_buf_c[i] = '.';
7385
7386 i += next;
7387 }
7388
7389 domain_buf_c[salt_pc_len] = 0;
7390
7391 // final
7392
7393 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7394 }
7395 else if (hash_mode == 8500)
7396 {
7397 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7398 }
7399 else if (hash_mode == 2612)
7400 {
7401 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7402 SIGNATURE_PHPS,
7403 (char *) salt.salt_buf,
7404 digest_buf[0],
7405 digest_buf[1],
7406 digest_buf[2],
7407 digest_buf[3]);
7408 }
7409 else if (hash_mode == 3711)
7410 {
7411 char *salt_ptr = (char *) salt.salt_buf;
7412
7413 salt_ptr[salt.salt_len - 1] = 0;
7414
7415 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7416 SIGNATURE_MEDIAWIKI_B,
7417 salt_ptr,
7418 digest_buf[0],
7419 digest_buf[1],
7420 digest_buf[2],
7421 digest_buf[3]);
7422 }
7423 else if (hash_mode == 8800)
7424 {
7425 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7426
7427 androidfde_t *androidfde = &androidfdes[salt_pos];
7428
7429 char tmp[3073] = { 0 };
7430
7431 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7432 {
7433 sprintf (tmp + j, "%08x", androidfde->data[i]);
7434 }
7435
7436 tmp[3072] = 0;
7437
7438 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7439 SIGNATURE_ANDROIDFDE,
7440 byte_swap_32 (salt.salt_buf[0]),
7441 byte_swap_32 (salt.salt_buf[1]),
7442 byte_swap_32 (salt.salt_buf[2]),
7443 byte_swap_32 (salt.salt_buf[3]),
7444 byte_swap_32 (digest_buf[0]),
7445 byte_swap_32 (digest_buf[1]),
7446 byte_swap_32 (digest_buf[2]),
7447 byte_swap_32 (digest_buf[3]),
7448 tmp);
7449 }
7450 else if (hash_mode == 8900)
7451 {
7452 uint N = salt.scrypt_N;
7453 uint r = salt.scrypt_r;
7454 uint p = salt.scrypt_p;
7455
7456 char base64_salt[32] = { 0 };
7457
7458 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7459
7460 memset (tmp_buf, 0, 46);
7461
7462 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7463 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7464 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7465 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7466 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7467 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7468 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7469 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7470 digest_buf[8] = 0; // needed for base64_encode ()
7471
7472 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7473
7474 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7475 SIGNATURE_SCRYPT,
7476 N,
7477 r,
7478 p,
7479 base64_salt,
7480 tmp_buf);
7481 }
7482 else if (hash_mode == 9000)
7483 {
7484 snprintf (out_buf, len-1, "%s", hashfile);
7485 }
7486 else if (hash_mode == 9200)
7487 {
7488 // salt
7489
7490 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7491
7492 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7493
7494 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7495
7496 // hash
7497
7498 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7499 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7500 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7501 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7502 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7503 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7504 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7505 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7506 digest_buf[8] = 0; // needed for base64_encode ()
7507
7508 char tmp_buf[64] = { 0 };
7509
7510 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7511 tmp_buf[43] = 0; // cut it here
7512
7513 // output
7514
7515 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7516 }
7517 else if (hash_mode == 9300)
7518 {
7519 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7520 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7521 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7522 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7523 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7524 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7525 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7526 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7527 digest_buf[8] = 0; // needed for base64_encode ()
7528
7529 char tmp_buf[64] = { 0 };
7530
7531 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7532 tmp_buf[43] = 0; // cut it here
7533
7534 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7535
7536 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7537 }
7538 else if (hash_mode == 9400)
7539 {
7540 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7541
7542 office2007_t *office2007 = &office2007s[salt_pos];
7543
7544 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7545 SIGNATURE_OFFICE2007,
7546 2007,
7547 20,
7548 office2007->keySize,
7549 16,
7550 salt.salt_buf[0],
7551 salt.salt_buf[1],
7552 salt.salt_buf[2],
7553 salt.salt_buf[3],
7554 office2007->encryptedVerifier[0],
7555 office2007->encryptedVerifier[1],
7556 office2007->encryptedVerifier[2],
7557 office2007->encryptedVerifier[3],
7558 office2007->encryptedVerifierHash[0],
7559 office2007->encryptedVerifierHash[1],
7560 office2007->encryptedVerifierHash[2],
7561 office2007->encryptedVerifierHash[3],
7562 office2007->encryptedVerifierHash[4]);
7563 }
7564 else if (hash_mode == 9500)
7565 {
7566 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7567
7568 office2010_t *office2010 = &office2010s[salt_pos];
7569
7570 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,
7571
7572 salt.salt_buf[0],
7573 salt.salt_buf[1],
7574 salt.salt_buf[2],
7575 salt.salt_buf[3],
7576 office2010->encryptedVerifier[0],
7577 office2010->encryptedVerifier[1],
7578 office2010->encryptedVerifier[2],
7579 office2010->encryptedVerifier[3],
7580 office2010->encryptedVerifierHash[0],
7581 office2010->encryptedVerifierHash[1],
7582 office2010->encryptedVerifierHash[2],
7583 office2010->encryptedVerifierHash[3],
7584 office2010->encryptedVerifierHash[4],
7585 office2010->encryptedVerifierHash[5],
7586 office2010->encryptedVerifierHash[6],
7587 office2010->encryptedVerifierHash[7]);
7588 }
7589 else if (hash_mode == 9600)
7590 {
7591 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7592
7593 office2013_t *office2013 = &office2013s[salt_pos];
7594
7595 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,
7596
7597 salt.salt_buf[0],
7598 salt.salt_buf[1],
7599 salt.salt_buf[2],
7600 salt.salt_buf[3],
7601 office2013->encryptedVerifier[0],
7602 office2013->encryptedVerifier[1],
7603 office2013->encryptedVerifier[2],
7604 office2013->encryptedVerifier[3],
7605 office2013->encryptedVerifierHash[0],
7606 office2013->encryptedVerifierHash[1],
7607 office2013->encryptedVerifierHash[2],
7608 office2013->encryptedVerifierHash[3],
7609 office2013->encryptedVerifierHash[4],
7610 office2013->encryptedVerifierHash[5],
7611 office2013->encryptedVerifierHash[6],
7612 office2013->encryptedVerifierHash[7]);
7613 }
7614 else if (hash_mode == 9700)
7615 {
7616 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7617
7618 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7619
7620 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7621 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7622 byte_swap_32 (salt.salt_buf[0]),
7623 byte_swap_32 (salt.salt_buf[1]),
7624 byte_swap_32 (salt.salt_buf[2]),
7625 byte_swap_32 (salt.salt_buf[3]),
7626 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7627 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7628 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7629 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7630 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7631 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7632 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7633 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7634 }
7635 else if (hash_mode == 9710)
7636 {
7637 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7638
7639 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7640
7641 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7642 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7643 byte_swap_32 (salt.salt_buf[0]),
7644 byte_swap_32 (salt.salt_buf[1]),
7645 byte_swap_32 (salt.salt_buf[2]),
7646 byte_swap_32 (salt.salt_buf[3]),
7647 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7648 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7649 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7650 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7651 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7652 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7653 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7654 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7655 }
7656 else if (hash_mode == 9720)
7657 {
7658 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7659
7660 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7661
7662 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7663
7664 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7665 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7666 byte_swap_32 (salt.salt_buf[0]),
7667 byte_swap_32 (salt.salt_buf[1]),
7668 byte_swap_32 (salt.salt_buf[2]),
7669 byte_swap_32 (salt.salt_buf[3]),
7670 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7671 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7672 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7673 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7674 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7675 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7676 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7677 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7678 rc4key[0],
7679 rc4key[1],
7680 rc4key[2],
7681 rc4key[3],
7682 rc4key[4]);
7683 }
7684 else if (hash_mode == 9800)
7685 {
7686 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7687
7688 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7689
7690 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7691 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7692 salt.salt_buf[0],
7693 salt.salt_buf[1],
7694 salt.salt_buf[2],
7695 salt.salt_buf[3],
7696 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7697 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7698 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7699 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7700 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7701 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7702 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7703 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7704 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7705 }
7706 else if (hash_mode == 9810)
7707 {
7708 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7709
7710 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7711
7712 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7713 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7714 salt.salt_buf[0],
7715 salt.salt_buf[1],
7716 salt.salt_buf[2],
7717 salt.salt_buf[3],
7718 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7719 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7720 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7721 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7722 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7723 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7724 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7725 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7726 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7727 }
7728 else if (hash_mode == 9820)
7729 {
7730 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7731
7732 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7733
7734 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7735
7736 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7737 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7738 salt.salt_buf[0],
7739 salt.salt_buf[1],
7740 salt.salt_buf[2],
7741 salt.salt_buf[3],
7742 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7743 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7744 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7745 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7746 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7747 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7748 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7749 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7750 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7751 rc4key[0],
7752 rc4key[1],
7753 rc4key[2],
7754 rc4key[3],
7755 rc4key[4]);
7756 }
7757 else if (hash_mode == 10000)
7758 {
7759 // salt
7760
7761 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7762
7763 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7764
7765 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7766
7767 // hash
7768
7769 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7770 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7771 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7772 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7773 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7774 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7775 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7776 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7777 digest_buf[8] = 0; // needed for base64_encode ()
7778
7779 char tmp_buf[64] = { 0 };
7780
7781 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7782
7783 // output
7784
7785 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7786 }
7787 else if (hash_mode == 10100)
7788 {
7789 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7790 digest_buf[0],
7791 digest_buf[1],
7792 2,
7793 4,
7794 byte_swap_32 (salt.salt_buf[0]),
7795 byte_swap_32 (salt.salt_buf[1]),
7796 byte_swap_32 (salt.salt_buf[2]),
7797 byte_swap_32 (salt.salt_buf[3]));
7798 }
7799 else if (hash_mode == 10200)
7800 {
7801 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7802
7803 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7804
7805 // challenge
7806
7807 char challenge[100] = { 0 };
7808
7809 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7810
7811 // response
7812
7813 char tmp_buf[100] = { 0 };
7814
7815 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7816 (char *) cram_md5->user,
7817 digest_buf[0],
7818 digest_buf[1],
7819 digest_buf[2],
7820 digest_buf[3]);
7821
7822 char response[100] = { 0 };
7823
7824 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7825
7826 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7827 }
7828 else if (hash_mode == 10300)
7829 {
7830 char tmp_buf[100] = { 0 };
7831
7832 memcpy (tmp_buf + 0, digest_buf, 20);
7833 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7834
7835 uint tmp_len = 20 + salt.salt_len;
7836
7837 // base64 encode it
7838
7839 char base64_encoded[100] = { 0 };
7840
7841 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7842
7843 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7844 }
7845 else if (hash_mode == 10400)
7846 {
7847 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7848
7849 pdf_t *pdf = &pdfs[salt_pos];
7850
7851 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",
7852
7853 pdf->V,
7854 pdf->R,
7855 40,
7856 pdf->P,
7857 pdf->enc_md,
7858 pdf->id_len,
7859 byte_swap_32 (pdf->id_buf[0]),
7860 byte_swap_32 (pdf->id_buf[1]),
7861 byte_swap_32 (pdf->id_buf[2]),
7862 byte_swap_32 (pdf->id_buf[3]),
7863 pdf->u_len,
7864 byte_swap_32 (pdf->u_buf[0]),
7865 byte_swap_32 (pdf->u_buf[1]),
7866 byte_swap_32 (pdf->u_buf[2]),
7867 byte_swap_32 (pdf->u_buf[3]),
7868 byte_swap_32 (pdf->u_buf[4]),
7869 byte_swap_32 (pdf->u_buf[5]),
7870 byte_swap_32 (pdf->u_buf[6]),
7871 byte_swap_32 (pdf->u_buf[7]),
7872 pdf->o_len,
7873 byte_swap_32 (pdf->o_buf[0]),
7874 byte_swap_32 (pdf->o_buf[1]),
7875 byte_swap_32 (pdf->o_buf[2]),
7876 byte_swap_32 (pdf->o_buf[3]),
7877 byte_swap_32 (pdf->o_buf[4]),
7878 byte_swap_32 (pdf->o_buf[5]),
7879 byte_swap_32 (pdf->o_buf[6]),
7880 byte_swap_32 (pdf->o_buf[7])
7881 );
7882 }
7883 else if (hash_mode == 10410)
7884 {
7885 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7886
7887 pdf_t *pdf = &pdfs[salt_pos];
7888
7889 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",
7890
7891 pdf->V,
7892 pdf->R,
7893 40,
7894 pdf->P,
7895 pdf->enc_md,
7896 pdf->id_len,
7897 byte_swap_32 (pdf->id_buf[0]),
7898 byte_swap_32 (pdf->id_buf[1]),
7899 byte_swap_32 (pdf->id_buf[2]),
7900 byte_swap_32 (pdf->id_buf[3]),
7901 pdf->u_len,
7902 byte_swap_32 (pdf->u_buf[0]),
7903 byte_swap_32 (pdf->u_buf[1]),
7904 byte_swap_32 (pdf->u_buf[2]),
7905 byte_swap_32 (pdf->u_buf[3]),
7906 byte_swap_32 (pdf->u_buf[4]),
7907 byte_swap_32 (pdf->u_buf[5]),
7908 byte_swap_32 (pdf->u_buf[6]),
7909 byte_swap_32 (pdf->u_buf[7]),
7910 pdf->o_len,
7911 byte_swap_32 (pdf->o_buf[0]),
7912 byte_swap_32 (pdf->o_buf[1]),
7913 byte_swap_32 (pdf->o_buf[2]),
7914 byte_swap_32 (pdf->o_buf[3]),
7915 byte_swap_32 (pdf->o_buf[4]),
7916 byte_swap_32 (pdf->o_buf[5]),
7917 byte_swap_32 (pdf->o_buf[6]),
7918 byte_swap_32 (pdf->o_buf[7])
7919 );
7920 }
7921 else if (hash_mode == 10420)
7922 {
7923 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7924
7925 pdf_t *pdf = &pdfs[salt_pos];
7926
7927 u8 *rc4key = (u8 *) pdf->rc4key;
7928
7929 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",
7930
7931 pdf->V,
7932 pdf->R,
7933 40,
7934 pdf->P,
7935 pdf->enc_md,
7936 pdf->id_len,
7937 byte_swap_32 (pdf->id_buf[0]),
7938 byte_swap_32 (pdf->id_buf[1]),
7939 byte_swap_32 (pdf->id_buf[2]),
7940 byte_swap_32 (pdf->id_buf[3]),
7941 pdf->u_len,
7942 byte_swap_32 (pdf->u_buf[0]),
7943 byte_swap_32 (pdf->u_buf[1]),
7944 byte_swap_32 (pdf->u_buf[2]),
7945 byte_swap_32 (pdf->u_buf[3]),
7946 byte_swap_32 (pdf->u_buf[4]),
7947 byte_swap_32 (pdf->u_buf[5]),
7948 byte_swap_32 (pdf->u_buf[6]),
7949 byte_swap_32 (pdf->u_buf[7]),
7950 pdf->o_len,
7951 byte_swap_32 (pdf->o_buf[0]),
7952 byte_swap_32 (pdf->o_buf[1]),
7953 byte_swap_32 (pdf->o_buf[2]),
7954 byte_swap_32 (pdf->o_buf[3]),
7955 byte_swap_32 (pdf->o_buf[4]),
7956 byte_swap_32 (pdf->o_buf[5]),
7957 byte_swap_32 (pdf->o_buf[6]),
7958 byte_swap_32 (pdf->o_buf[7]),
7959 rc4key[0],
7960 rc4key[1],
7961 rc4key[2],
7962 rc4key[3],
7963 rc4key[4]
7964 );
7965 }
7966 else if (hash_mode == 10500)
7967 {
7968 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7969
7970 pdf_t *pdf = &pdfs[salt_pos];
7971
7972 if (pdf->id_len == 32)
7973 {
7974 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",
7975
7976 pdf->V,
7977 pdf->R,
7978 128,
7979 pdf->P,
7980 pdf->enc_md,
7981 pdf->id_len,
7982 byte_swap_32 (pdf->id_buf[0]),
7983 byte_swap_32 (pdf->id_buf[1]),
7984 byte_swap_32 (pdf->id_buf[2]),
7985 byte_swap_32 (pdf->id_buf[3]),
7986 byte_swap_32 (pdf->id_buf[4]),
7987 byte_swap_32 (pdf->id_buf[5]),
7988 byte_swap_32 (pdf->id_buf[6]),
7989 byte_swap_32 (pdf->id_buf[7]),
7990 pdf->u_len,
7991 byte_swap_32 (pdf->u_buf[0]),
7992 byte_swap_32 (pdf->u_buf[1]),
7993 byte_swap_32 (pdf->u_buf[2]),
7994 byte_swap_32 (pdf->u_buf[3]),
7995 byte_swap_32 (pdf->u_buf[4]),
7996 byte_swap_32 (pdf->u_buf[5]),
7997 byte_swap_32 (pdf->u_buf[6]),
7998 byte_swap_32 (pdf->u_buf[7]),
7999 pdf->o_len,
8000 byte_swap_32 (pdf->o_buf[0]),
8001 byte_swap_32 (pdf->o_buf[1]),
8002 byte_swap_32 (pdf->o_buf[2]),
8003 byte_swap_32 (pdf->o_buf[3]),
8004 byte_swap_32 (pdf->o_buf[4]),
8005 byte_swap_32 (pdf->o_buf[5]),
8006 byte_swap_32 (pdf->o_buf[6]),
8007 byte_swap_32 (pdf->o_buf[7])
8008 );
8009 }
8010 else
8011 {
8012 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",
8013
8014 pdf->V,
8015 pdf->R,
8016 128,
8017 pdf->P,
8018 pdf->enc_md,
8019 pdf->id_len,
8020 byte_swap_32 (pdf->id_buf[0]),
8021 byte_swap_32 (pdf->id_buf[1]),
8022 byte_swap_32 (pdf->id_buf[2]),
8023 byte_swap_32 (pdf->id_buf[3]),
8024 pdf->u_len,
8025 byte_swap_32 (pdf->u_buf[0]),
8026 byte_swap_32 (pdf->u_buf[1]),
8027 byte_swap_32 (pdf->u_buf[2]),
8028 byte_swap_32 (pdf->u_buf[3]),
8029 byte_swap_32 (pdf->u_buf[4]),
8030 byte_swap_32 (pdf->u_buf[5]),
8031 byte_swap_32 (pdf->u_buf[6]),
8032 byte_swap_32 (pdf->u_buf[7]),
8033 pdf->o_len,
8034 byte_swap_32 (pdf->o_buf[0]),
8035 byte_swap_32 (pdf->o_buf[1]),
8036 byte_swap_32 (pdf->o_buf[2]),
8037 byte_swap_32 (pdf->o_buf[3]),
8038 byte_swap_32 (pdf->o_buf[4]),
8039 byte_swap_32 (pdf->o_buf[5]),
8040 byte_swap_32 (pdf->o_buf[6]),
8041 byte_swap_32 (pdf->o_buf[7])
8042 );
8043 }
8044 }
8045 else if (hash_mode == 10600)
8046 {
8047 uint digest_idx = salt.digests_offset + digest_pos;
8048
8049 hashinfo_t **hashinfo_ptr = data.hash_info;
8050 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8051
8052 snprintf (out_buf, len-1, "%s", hash_buf);
8053 }
8054 else if (hash_mode == 10700)
8055 {
8056 uint digest_idx = salt.digests_offset + digest_pos;
8057
8058 hashinfo_t **hashinfo_ptr = data.hash_info;
8059 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8060
8061 snprintf (out_buf, len-1, "%s", hash_buf);
8062 }
8063 else if (hash_mode == 10900)
8064 {
8065 uint digest_idx = salt.digests_offset + digest_pos;
8066
8067 hashinfo_t **hashinfo_ptr = data.hash_info;
8068 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8069
8070 snprintf (out_buf, len-1, "%s", hash_buf);
8071 }
8072 else if (hash_mode == 11100)
8073 {
8074 u32 salt_challenge = salt.salt_buf[0];
8075
8076 salt_challenge = byte_swap_32 (salt_challenge);
8077
8078 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
8079
8080 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
8081 SIGNATURE_POSTGRESQL_AUTH,
8082 user_name,
8083 salt_challenge,
8084 digest_buf[0],
8085 digest_buf[1],
8086 digest_buf[2],
8087 digest_buf[3]);
8088 }
8089 else if (hash_mode == 11200)
8090 {
8091 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
8092 SIGNATURE_MYSQL_AUTH,
8093 (unsigned char *) salt.salt_buf,
8094 digest_buf[0],
8095 digest_buf[1],
8096 digest_buf[2],
8097 digest_buf[3],
8098 digest_buf[4]);
8099 }
8100 else if (hash_mode == 11300)
8101 {
8102 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
8103
8104 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
8105
8106 const uint cry_master_len = bitcoin_wallet->cry_master_len;
8107 const uint ckey_len = bitcoin_wallet->ckey_len;
8108 const uint public_key_len = bitcoin_wallet->public_key_len;
8109
8110 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
8111 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
8112 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
8113
8114 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
8115 {
8116 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
8117
8118 sprintf (cry_master_buf + j, "%02x", ptr[i]);
8119 }
8120
8121 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
8122 {
8123 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
8124
8125 sprintf (ckey_buf + j, "%02x", ptr[i]);
8126 }
8127
8128 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
8129 {
8130 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
8131
8132 sprintf (public_key_buf + j, "%02x", ptr[i]);
8133 }
8134
8135 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
8136 SIGNATURE_BITCOIN_WALLET,
8137 cry_master_len * 2,
8138 cry_master_buf,
8139 salt.salt_len,
8140 (unsigned char *) salt.salt_buf,
8141 salt.salt_iter + 1,
8142 ckey_len * 2,
8143 ckey_buf,
8144 public_key_len * 2,
8145 public_key_buf
8146 );
8147
8148 free (cry_master_buf);
8149 free (ckey_buf);
8150 free (public_key_buf);
8151 }
8152 else if (hash_mode == 11400)
8153 {
8154 uint digest_idx = salt.digests_offset + digest_pos;
8155
8156 hashinfo_t **hashinfo_ptr = data.hash_info;
8157 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8158
8159 snprintf (out_buf, len-1, "%s", hash_buf);
8160 }
8161 else if (hash_mode == 11600)
8162 {
8163 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
8164
8165 seven_zip_t *seven_zip = &seven_zips[salt_pos];
8166
8167 const uint data_len = seven_zip->data_len;
8168
8169 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
8170
8171 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8172 {
8173 const u8 *ptr = (const u8 *) seven_zip->data_buf;
8174
8175 sprintf (data_buf + j, "%02x", ptr[i]);
8176 }
8177
8178 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
8179 SIGNATURE_SEVEN_ZIP,
8180 0,
8181 salt.salt_sign[0],
8182 0,
8183 (char *) seven_zip->salt_buf,
8184 seven_zip->iv_len,
8185 seven_zip->iv_buf[0],
8186 seven_zip->iv_buf[1],
8187 seven_zip->iv_buf[2],
8188 seven_zip->iv_buf[3],
8189 seven_zip->crc,
8190 seven_zip->data_len,
8191 seven_zip->unpack_size,
8192 data_buf);
8193
8194 free (data_buf);
8195 }
8196 else if (hash_mode == 11700)
8197 {
8198 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8199 digest_buf[0],
8200 digest_buf[1],
8201 digest_buf[2],
8202 digest_buf[3],
8203 digest_buf[4],
8204 digest_buf[5],
8205 digest_buf[6],
8206 digest_buf[7]);
8207 }
8208 else if (hash_mode == 11800)
8209 {
8210 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8211 digest_buf[ 0],
8212 digest_buf[ 1],
8213 digest_buf[ 2],
8214 digest_buf[ 3],
8215 digest_buf[ 4],
8216 digest_buf[ 5],
8217 digest_buf[ 6],
8218 digest_buf[ 7],
8219 digest_buf[ 8],
8220 digest_buf[ 9],
8221 digest_buf[10],
8222 digest_buf[11],
8223 digest_buf[12],
8224 digest_buf[13],
8225 digest_buf[14],
8226 digest_buf[15]);
8227 }
8228 else if (hash_mode == 11900)
8229 {
8230 uint digest_idx = salt.digests_offset + digest_pos;
8231
8232 hashinfo_t **hashinfo_ptr = data.hash_info;
8233 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8234
8235 snprintf (out_buf, len-1, "%s", hash_buf);
8236 }
8237 else if (hash_mode == 12000)
8238 {
8239 uint digest_idx = salt.digests_offset + digest_pos;
8240
8241 hashinfo_t **hashinfo_ptr = data.hash_info;
8242 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8243
8244 snprintf (out_buf, len-1, "%s", hash_buf);
8245 }
8246 else if (hash_mode == 12100)
8247 {
8248 uint digest_idx = salt.digests_offset + digest_pos;
8249
8250 hashinfo_t **hashinfo_ptr = data.hash_info;
8251 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8252
8253 snprintf (out_buf, len-1, "%s", hash_buf);
8254 }
8255 else if (hash_mode == 12200)
8256 {
8257 uint *ptr_digest = digest_buf;
8258 uint *ptr_salt = salt.salt_buf;
8259
8260 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8261 SIGNATURE_ECRYPTFS,
8262 ptr_salt[0],
8263 ptr_salt[1],
8264 ptr_digest[0],
8265 ptr_digest[1]);
8266 }
8267 else if (hash_mode == 12300)
8268 {
8269 uint *ptr_digest = digest_buf;
8270 uint *ptr_salt = salt.salt_buf;
8271
8272 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",
8273 ptr_digest[ 0], ptr_digest[ 1],
8274 ptr_digest[ 2], ptr_digest[ 3],
8275 ptr_digest[ 4], ptr_digest[ 5],
8276 ptr_digest[ 6], ptr_digest[ 7],
8277 ptr_digest[ 8], ptr_digest[ 9],
8278 ptr_digest[10], ptr_digest[11],
8279 ptr_digest[12], ptr_digest[13],
8280 ptr_digest[14], ptr_digest[15],
8281 ptr_salt[0],
8282 ptr_salt[1],
8283 ptr_salt[2],
8284 ptr_salt[3]);
8285 }
8286 else if (hash_mode == 12400)
8287 {
8288 // encode iteration count
8289
8290 char salt_iter[5] = { 0 };
8291
8292 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8293 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8294 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8295 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8296 salt_iter[4] = 0;
8297
8298 // encode salt
8299
8300 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8301 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8302 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8303 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8304 ptr_salt[4] = 0;
8305
8306 // encode digest
8307
8308 memset (tmp_buf, 0, sizeof (tmp_buf));
8309
8310 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8311 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8312
8313 memcpy (tmp_buf, digest_buf, 8);
8314
8315 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8316
8317 ptr_plain[11] = 0;
8318
8319 // fill the resulting buffer
8320
8321 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8322 }
8323 else if (hash_mode == 12500)
8324 {
8325 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8326 SIGNATURE_RAR3,
8327 byte_swap_32 (salt.salt_buf[0]),
8328 byte_swap_32 (salt.salt_buf[1]),
8329 salt.salt_buf[2],
8330 salt.salt_buf[3],
8331 salt.salt_buf[4],
8332 salt.salt_buf[5]);
8333 }
8334 else if (hash_mode == 12600)
8335 {
8336 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8337 digest_buf[0] + salt.salt_buf_pc[0],
8338 digest_buf[1] + salt.salt_buf_pc[1],
8339 digest_buf[2] + salt.salt_buf_pc[2],
8340 digest_buf[3] + salt.salt_buf_pc[3],
8341 digest_buf[4] + salt.salt_buf_pc[4],
8342 digest_buf[5] + salt.salt_buf_pc[5],
8343 digest_buf[6] + salt.salt_buf_pc[6],
8344 digest_buf[7] + salt.salt_buf_pc[7]);
8345 }
8346 else if (hash_mode == 12700)
8347 {
8348 uint digest_idx = salt.digests_offset + digest_pos;
8349
8350 hashinfo_t **hashinfo_ptr = data.hash_info;
8351 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8352
8353 snprintf (out_buf, len-1, "%s", hash_buf);
8354 }
8355 else if (hash_mode == 12800)
8356 {
8357 const u8 *ptr = (const u8 *) salt.salt_buf;
8358
8359 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",
8360 SIGNATURE_MS_DRSR,
8361 ptr[0],
8362 ptr[1],
8363 ptr[2],
8364 ptr[3],
8365 ptr[4],
8366 ptr[5],
8367 ptr[6],
8368 ptr[7],
8369 ptr[8],
8370 ptr[9],
8371 salt.salt_iter + 1,
8372 byte_swap_32 (digest_buf[0]),
8373 byte_swap_32 (digest_buf[1]),
8374 byte_swap_32 (digest_buf[2]),
8375 byte_swap_32 (digest_buf[3]),
8376 byte_swap_32 (digest_buf[4]),
8377 byte_swap_32 (digest_buf[5]),
8378 byte_swap_32 (digest_buf[6]),
8379 byte_swap_32 (digest_buf[7])
8380 );
8381 }
8382 else if (hash_mode == 12900)
8383 {
8384 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",
8385 salt.salt_buf[ 4],
8386 salt.salt_buf[ 5],
8387 salt.salt_buf[ 6],
8388 salt.salt_buf[ 7],
8389 salt.salt_buf[ 8],
8390 salt.salt_buf[ 9],
8391 salt.salt_buf[10],
8392 salt.salt_buf[11],
8393 byte_swap_32 (digest_buf[0]),
8394 byte_swap_32 (digest_buf[1]),
8395 byte_swap_32 (digest_buf[2]),
8396 byte_swap_32 (digest_buf[3]),
8397 byte_swap_32 (digest_buf[4]),
8398 byte_swap_32 (digest_buf[5]),
8399 byte_swap_32 (digest_buf[6]),
8400 byte_swap_32 (digest_buf[7]),
8401 salt.salt_buf[ 0],
8402 salt.salt_buf[ 1],
8403 salt.salt_buf[ 2],
8404 salt.salt_buf[ 3]
8405 );
8406 }
8407 else if (hash_mode == 13000)
8408 {
8409 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8410
8411 rar5_t *rar5 = &rar5s[salt_pos];
8412
8413 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8414 salt.salt_buf[0],
8415 salt.salt_buf[1],
8416 salt.salt_buf[2],
8417 salt.salt_buf[3],
8418 salt.salt_sign[0],
8419 rar5->iv[0],
8420 rar5->iv[1],
8421 rar5->iv[2],
8422 rar5->iv[3],
8423 byte_swap_32 (digest_buf[0]),
8424 byte_swap_32 (digest_buf[1])
8425 );
8426 }
8427 else if (hash_mode == 13100)
8428 {
8429 krb5tgs_t *krb5tgss = (krb5tgs_t *) data.esalts_buf;
8430
8431 krb5tgs_t *krb5tgs = &krb5tgss[salt_pos];
8432
8433 u8 *ptr_checksum = (u8 *) krb5tgs->checksum;
8434 u8 *ptr_edata2 = (u8 *) krb5tgs->edata2;
8435
8436 char data[2560 * 4 * 2] = { 0 };
8437
8438 char *ptr_data = data;
8439
8440 for (uint i = 0; i < 16; i++, ptr_data += 2)
8441 sprintf (ptr_data, "%02x", ptr_checksum[i]);
8442
8443 /* skip '$' */
8444 ptr_data++;
8445
8446 for (uint i = 0; i < krb5tgs->edata2_len; i++, ptr_data += 2)
8447 sprintf (ptr_data, "%02x", ptr_edata2[i]);
8448
8449 snprintf (out_buf, len-1, "%s$%s$%s$%s",
8450 SIGNATURE_KRB5TGS,
8451 (char *) krb5tgs->account_info,
8452 data,
8453 data + 33);
8454 }
8455 else if (hash_mode == 13200)
8456 {
8457 snprintf (out_buf, len-1, "%s*%d*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x",
8458 SIGNATURE_AXCRYPT,
8459 salt.salt_iter,
8460 salt.salt_buf[0],
8461 salt.salt_buf[1],
8462 salt.salt_buf[2],
8463 salt.salt_buf[3],
8464 salt.salt_buf[4],
8465 salt.salt_buf[5],
8466 salt.salt_buf[6],
8467 salt.salt_buf[7],
8468 salt.salt_buf[8],
8469 salt.salt_buf[9]);
8470 }
8471 else if (hash_mode == 13300)
8472 {
8473 snprintf (out_buf, len-1, "%s$%08x%08x%08x%08x",
8474 SIGNATURE_AXCRYPT_SHA1,
8475 digest_buf[0],
8476 digest_buf[1],
8477 digest_buf[2],
8478 digest_buf[3]);
8479 }
8480 else if (hash_mode == 13400)
8481 {
8482 keepass_t *keepasss = (keepass_t *) data.esalts_buf;
8483
8484 keepass_t *keepass = &keepasss[salt_pos];
8485
8486 u32 version = (u32) keepass->version;
8487 u32 rounds = salt.salt_iter;
8488 u32 algorithm = (u32) keepass->algorithm;
8489 u32 keyfile_len = (u32) keepass->keyfile_len;
8490
8491 u32 *ptr_final_random_seed = (u32 *) keepass->final_random_seed ;
8492 u32 *ptr_transf_random_seed = (u32 *) keepass->transf_random_seed ;
8493 u32 *ptr_enc_iv = (u32 *) keepass->enc_iv ;
8494 u32 *ptr_contents_hash = (u32 *) keepass->contents_hash ;
8495 u32 *ptr_keyfile = (u32 *) keepass->keyfile ;
8496
8497 /* specific to version 1 */
8498 u32 contents_len;
8499 u32 *ptr_contents;
8500
8501 /* specific to version 2 */
8502 u32 expected_bytes_len;
8503 u32 *ptr_expected_bytes;
8504
8505 u32 final_random_seed_len;
8506 u32 transf_random_seed_len;
8507 u32 enc_iv_len;
8508 u32 contents_hash_len;
8509
8510 transf_random_seed_len = 8;
8511 enc_iv_len = 4;
8512 contents_hash_len = 8;
8513 final_random_seed_len = 8;
8514
8515 if (version == 1)
8516 final_random_seed_len = 4;
8517
8518 snprintf (out_buf, len-1, "%s*%d*%d*%d",
8519 SIGNATURE_KEEPASS,
8520 version,
8521 rounds,
8522 algorithm);
8523
8524 char *ptr_data = out_buf;
8525
8526 ptr_data += strlen(out_buf);
8527
8528 *ptr_data = '*';
8529 ptr_data++;
8530
8531 for (uint i = 0; i < final_random_seed_len; i++, ptr_data += 8)
8532 sprintf (ptr_data, "%08x", ptr_final_random_seed[i]);
8533
8534 *ptr_data = '*';
8535 ptr_data++;
8536
8537 for (uint i = 0; i < transf_random_seed_len; i++, ptr_data += 8)
8538 sprintf (ptr_data, "%08x", ptr_transf_random_seed[i]);
8539
8540 *ptr_data = '*';
8541 ptr_data++;
8542
8543 for (uint i = 0; i < enc_iv_len; i++, ptr_data += 8)
8544 sprintf (ptr_data, "%08x", ptr_enc_iv[i]);
8545
8546 *ptr_data = '*';
8547 ptr_data++;
8548
8549 if (version == 1)
8550 {
8551 contents_len = (u32) keepass->contents_len;
8552 ptr_contents = (u32 *) keepass->contents;
8553
8554 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8555 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8556
8557 *ptr_data = '*';
8558 ptr_data++;
8559
8560 /* inline flag */
8561 *ptr_data = '1';
8562 ptr_data++;
8563
8564 *ptr_data = '*';
8565 ptr_data++;
8566
8567 char ptr_contents_len[10] = { 0 };
8568
8569 sprintf ((char*) ptr_contents_len, "%d", contents_len);
8570
8571 sprintf (ptr_data, "%d", contents_len);
8572
8573 ptr_data += strlen(ptr_contents_len);
8574
8575 *ptr_data = '*';
8576 ptr_data++;
8577
8578 for (uint i = 0; i < contents_len / 4; i++, ptr_data += 8)
8579 sprintf (ptr_data, "%08x", ptr_contents[i]);
8580 }
8581 else if (version == 2)
8582 {
8583 expected_bytes_len = 8;
8584 ptr_expected_bytes = (u32 *) keepass->expected_bytes ;
8585
8586 for (uint i = 0; i < expected_bytes_len; i++, ptr_data += 8)
8587 sprintf (ptr_data, "%08x", ptr_expected_bytes[i]);
8588
8589 *ptr_data = '*';
8590 ptr_data++;
8591
8592 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8593 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8594 }
8595 if (keyfile_len)
8596 {
8597 *ptr_data = '*';
8598 ptr_data++;
8599
8600 /* inline flag */
8601 *ptr_data = '1';
8602 ptr_data++;
8603
8604 *ptr_data = '*';
8605 ptr_data++;
8606
8607 sprintf (ptr_data, "%d", keyfile_len);
8608
8609 ptr_data += 2;
8610
8611 *ptr_data = '*';
8612 ptr_data++;
8613
8614 for (uint i = 0; i < 8; i++, ptr_data += 8)
8615 sprintf (ptr_data, "%08x", ptr_keyfile[i]);
8616 }
8617 }
8618 else if (hash_mode == 13500)
8619 {
8620 pstoken_t *pstokens = (pstoken_t *) data.esalts_buf;
8621
8622 pstoken_t *pstoken = &pstokens[salt_pos];
8623
8624 const u32 salt_len = (pstoken->salt_len > 512) ? 512 : pstoken->salt_len;
8625
8626 char pstoken_tmp[1024 + 1] = { 0 };
8627
8628 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8629 {
8630 const u8 *ptr = (const u8 *) pstoken->salt_buf;
8631
8632 sprintf (pstoken_tmp + j, "%02x", ptr[i]);
8633 }
8634
8635 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x:%s",
8636 digest_buf[0],
8637 digest_buf[1],
8638 digest_buf[2],
8639 digest_buf[3],
8640 digest_buf[4],
8641 pstoken_tmp);
8642 }
8643 else if (hash_mode == 13600)
8644 {
8645 zip2_t *zip2s = (zip2_t *) data.esalts_buf;
8646
8647 zip2_t *zip2 = &zip2s[salt_pos];
8648
8649 const u32 salt_len = zip2->salt_len;
8650
8651 char salt_tmp[32 + 1] = { 0 };
8652
8653 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8654 {
8655 const u8 *ptr = (const u8 *) zip2->salt_buf;
8656
8657 sprintf (salt_tmp + j, "%02x", ptr[i]);
8658 }
8659
8660 const u32 data_len = zip2->data_len;
8661
8662 char data_tmp[8192 + 1] = { 0 };
8663
8664 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8665 {
8666 const u8 *ptr = (const u8 *) zip2->data_buf;
8667
8668 sprintf (data_tmp + j, "%02x", ptr[i]);
8669 }
8670
8671 const u32 auth_len = zip2->auth_len;
8672
8673 char auth_tmp[20 + 1] = { 0 };
8674
8675 for (uint i = 0, j = 0; i < auth_len; i += 1, j += 2)
8676 {
8677 const u8 *ptr = (const u8 *) zip2->auth_buf;
8678
8679 sprintf (auth_tmp + j, "%02x", ptr[i]);
8680 }
8681
8682 snprintf (out_buf, 255, "%s*%u*%u*%u*%s*%x*%u*%s*%s*%s",
8683 SIGNATURE_ZIP2_START,
8684 zip2->type,
8685 zip2->mode,
8686 zip2->magic,
8687 salt_tmp,
8688 zip2->verify_bytes,
8689 zip2->compress_length,
8690 data_tmp,
8691 auth_tmp,
8692 SIGNATURE_ZIP2_STOP);
8693 }
8694 else if ((hash_mode >= 13700) && (hash_mode <= 13799))
8695 {
8696 snprintf (out_buf, len-1, "%s", hashfile);
8697 }
8698 else
8699 {
8700 if (hash_type == HASH_TYPE_MD4)
8701 {
8702 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8703 digest_buf[0],
8704 digest_buf[1],
8705 digest_buf[2],
8706 digest_buf[3]);
8707 }
8708 else if (hash_type == HASH_TYPE_MD5)
8709 {
8710 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8711 digest_buf[0],
8712 digest_buf[1],
8713 digest_buf[2],
8714 digest_buf[3]);
8715 }
8716 else if (hash_type == HASH_TYPE_SHA1)
8717 {
8718 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8719 digest_buf[0],
8720 digest_buf[1],
8721 digest_buf[2],
8722 digest_buf[3],
8723 digest_buf[4]);
8724 }
8725 else if (hash_type == HASH_TYPE_SHA256)
8726 {
8727 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8728 digest_buf[0],
8729 digest_buf[1],
8730 digest_buf[2],
8731 digest_buf[3],
8732 digest_buf[4],
8733 digest_buf[5],
8734 digest_buf[6],
8735 digest_buf[7]);
8736 }
8737 else if (hash_type == HASH_TYPE_SHA384)
8738 {
8739 uint *ptr = digest_buf;
8740
8741 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8742 ptr[ 1], ptr[ 0],
8743 ptr[ 3], ptr[ 2],
8744 ptr[ 5], ptr[ 4],
8745 ptr[ 7], ptr[ 6],
8746 ptr[ 9], ptr[ 8],
8747 ptr[11], ptr[10]);
8748 }
8749 else if (hash_type == HASH_TYPE_SHA512)
8750 {
8751 uint *ptr = digest_buf;
8752
8753 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8754 ptr[ 1], ptr[ 0],
8755 ptr[ 3], ptr[ 2],
8756 ptr[ 5], ptr[ 4],
8757 ptr[ 7], ptr[ 6],
8758 ptr[ 9], ptr[ 8],
8759 ptr[11], ptr[10],
8760 ptr[13], ptr[12],
8761 ptr[15], ptr[14]);
8762 }
8763 else if (hash_type == HASH_TYPE_LM)
8764 {
8765 snprintf (out_buf, len-1, "%08x%08x",
8766 digest_buf[0],
8767 digest_buf[1]);
8768 }
8769 else if (hash_type == HASH_TYPE_ORACLEH)
8770 {
8771 snprintf (out_buf, len-1, "%08X%08X",
8772 digest_buf[0],
8773 digest_buf[1]);
8774 }
8775 else if (hash_type == HASH_TYPE_BCRYPT)
8776 {
8777 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8778 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8779
8780 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8781
8782 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8783 }
8784 else if (hash_type == HASH_TYPE_KECCAK)
8785 {
8786 uint *ptr = digest_buf;
8787
8788 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",
8789 ptr[ 1], ptr[ 0],
8790 ptr[ 3], ptr[ 2],
8791 ptr[ 5], ptr[ 4],
8792 ptr[ 7], ptr[ 6],
8793 ptr[ 9], ptr[ 8],
8794 ptr[11], ptr[10],
8795 ptr[13], ptr[12],
8796 ptr[15], ptr[14],
8797 ptr[17], ptr[16],
8798 ptr[19], ptr[18],
8799 ptr[21], ptr[20],
8800 ptr[23], ptr[22],
8801 ptr[25], ptr[24],
8802 ptr[27], ptr[26],
8803 ptr[29], ptr[28],
8804 ptr[31], ptr[30],
8805 ptr[33], ptr[32],
8806 ptr[35], ptr[34],
8807 ptr[37], ptr[36],
8808 ptr[39], ptr[38],
8809 ptr[41], ptr[30],
8810 ptr[43], ptr[42],
8811 ptr[45], ptr[44],
8812 ptr[47], ptr[46],
8813 ptr[49], ptr[48]
8814 );
8815
8816 out_buf[salt.keccak_mdlen * 2] = 0;
8817 }
8818 else if (hash_type == HASH_TYPE_RIPEMD160)
8819 {
8820 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8821 digest_buf[0],
8822 digest_buf[1],
8823 digest_buf[2],
8824 digest_buf[3],
8825 digest_buf[4]);
8826 }
8827 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8828 {
8829 digest_buf[ 0] = digest_buf[ 0];
8830 digest_buf[ 1] = digest_buf[ 1];
8831 digest_buf[ 2] = digest_buf[ 2];
8832 digest_buf[ 3] = digest_buf[ 3];
8833 digest_buf[ 4] = digest_buf[ 4];
8834 digest_buf[ 5] = digest_buf[ 5];
8835 digest_buf[ 6] = digest_buf[ 6];
8836 digest_buf[ 7] = digest_buf[ 7];
8837 digest_buf[ 8] = digest_buf[ 8];
8838 digest_buf[ 9] = digest_buf[ 9];
8839 digest_buf[10] = digest_buf[10];
8840 digest_buf[11] = digest_buf[11];
8841 digest_buf[12] = digest_buf[12];
8842 digest_buf[13] = digest_buf[13];
8843 digest_buf[14] = digest_buf[14];
8844 digest_buf[15] = digest_buf[15];
8845
8846 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8847 digest_buf[ 0],
8848 digest_buf[ 1],
8849 digest_buf[ 2],
8850 digest_buf[ 3],
8851 digest_buf[ 4],
8852 digest_buf[ 5],
8853 digest_buf[ 6],
8854 digest_buf[ 7],
8855 digest_buf[ 8],
8856 digest_buf[ 9],
8857 digest_buf[10],
8858 digest_buf[11],
8859 digest_buf[12],
8860 digest_buf[13],
8861 digest_buf[14],
8862 digest_buf[15]);
8863 }
8864 else if (hash_type == HASH_TYPE_GOST)
8865 {
8866 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8867 digest_buf[0],
8868 digest_buf[1],
8869 digest_buf[2],
8870 digest_buf[3],
8871 digest_buf[4],
8872 digest_buf[5],
8873 digest_buf[6],
8874 digest_buf[7]);
8875 }
8876 else if (hash_type == HASH_TYPE_MYSQL)
8877 {
8878 snprintf (out_buf, len-1, "%08x%08x",
8879 digest_buf[0],
8880 digest_buf[1]);
8881 }
8882 else if (hash_type == HASH_TYPE_LOTUS5)
8883 {
8884 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8885 digest_buf[0],
8886 digest_buf[1],
8887 digest_buf[2],
8888 digest_buf[3]);
8889 }
8890 else if (hash_type == HASH_TYPE_LOTUS6)
8891 {
8892 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8893 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8894 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8895 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8896
8897 char buf[16] = { 0 };
8898
8899 memcpy (buf + 0, salt.salt_buf, 5);
8900 memcpy (buf + 5, digest_buf, 9);
8901
8902 buf[3] -= -4;
8903
8904 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8905
8906 tmp_buf[18] = salt.salt_buf_pc[7];
8907 tmp_buf[19] = 0;
8908
8909 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8910 }
8911 else if (hash_type == HASH_TYPE_LOTUS8)
8912 {
8913 char buf[52] = { 0 };
8914
8915 // salt
8916
8917 memcpy (buf + 0, salt.salt_buf, 16);
8918
8919 buf[3] -= -4;
8920
8921 // iteration
8922
8923 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8924
8925 // chars
8926
8927 buf[26] = salt.salt_buf_pc[0];
8928 buf[27] = salt.salt_buf_pc[1];
8929
8930 // digest
8931
8932 memcpy (buf + 28, digest_buf, 8);
8933
8934 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8935
8936 tmp_buf[49] = 0;
8937
8938 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8939 }
8940 else if (hash_type == HASH_TYPE_CRC32)
8941 {
8942 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8943 }
8944 }
8945
8946 if (salt_type == SALT_TYPE_INTERN)
8947 {
8948 size_t pos = strlen (out_buf);
8949
8950 out_buf[pos] = data.separator;
8951
8952 char *ptr = (char *) salt.salt_buf;
8953
8954 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8955
8956 out_buf[pos + 1 + salt.salt_len] = 0;
8957 }
8958 }
8959
8960 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8961 {
8962 memset (hccap, 0, sizeof (hccap_t));
8963
8964 salt_t *salt = &data.salts_buf[salt_pos];
8965
8966 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8967
8968 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8969 wpa_t *wpa = &wpas[salt_pos];
8970
8971 hccap->keyver = wpa->keyver;
8972
8973 hccap->eapol_size = wpa->eapol_size;
8974
8975 if (wpa->keyver != 1)
8976 {
8977 uint eapol_tmp[64] = { 0 };
8978
8979 for (uint i = 0; i < 64; i++)
8980 {
8981 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8982 }
8983
8984 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8985 }
8986 else
8987 {
8988 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8989 }
8990
8991 memcpy (hccap->mac1, wpa->orig_mac1, 6);
8992 memcpy (hccap->mac2, wpa->orig_mac2, 6);
8993 memcpy (hccap->nonce1, wpa->orig_nonce1, 32);
8994 memcpy (hccap->nonce2, wpa->orig_nonce2, 32);
8995
8996 char *digests_buf_ptr = (char *) data.digests_buf;
8997
8998 uint dgst_size = data.dgst_size;
8999
9000 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
9001
9002 if (wpa->keyver != 1)
9003 {
9004 uint digest_tmp[4] = { 0 };
9005
9006 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
9007 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
9008 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
9009 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
9010
9011 memcpy (hccap->keymic, digest_tmp, 16);
9012 }
9013 else
9014 {
9015 memcpy (hccap->keymic, digest_ptr, 16);
9016 }
9017 }
9018
9019 void SuspendThreads ()
9020 {
9021 if (data.devices_status == STATUS_RUNNING)
9022 {
9023 hc_timer_set (&data.timer_paused);
9024
9025 data.devices_status = STATUS_PAUSED;
9026
9027 log_info ("Paused");
9028 }
9029 }
9030
9031 void ResumeThreads ()
9032 {
9033 if (data.devices_status == STATUS_PAUSED)
9034 {
9035 double ms_paused;
9036
9037 hc_timer_get (data.timer_paused, ms_paused);
9038
9039 data.ms_paused += ms_paused;
9040
9041 data.devices_status = STATUS_RUNNING;
9042
9043 log_info ("Resumed");
9044 }
9045 }
9046
9047 void bypass ()
9048 {
9049 if (data.devices_status != STATUS_RUNNING) return;
9050
9051 data.devices_status = STATUS_BYPASS;
9052
9053 log_info ("Next dictionary / mask in queue selected, bypassing current one");
9054 }
9055
9056 void stop_at_checkpoint ()
9057 {
9058 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9059 {
9060 if (data.devices_status != STATUS_RUNNING) return;
9061 }
9062
9063 // this feature only makes sense if --restore-disable was not specified
9064
9065 if (data.restore_disable == 1)
9066 {
9067 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
9068
9069 return;
9070 }
9071
9072 // check if monitoring of Restore Point updates should be enabled or disabled
9073
9074 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9075 {
9076 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
9077
9078 // save the current restore point value
9079
9080 data.checkpoint_cur_words = get_lowest_words_done ();
9081
9082 log_info ("Checkpoint enabled: will quit at next Restore Point update");
9083 }
9084 else
9085 {
9086 data.devices_status = STATUS_RUNNING;
9087
9088 // reset the global value for checkpoint checks
9089
9090 data.checkpoint_cur_words = 0;
9091
9092 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
9093 }
9094 }
9095
9096 void myabort ()
9097 {
9098 if (data.devices_status == STATUS_INIT) return;
9099 if (data.devices_status == STATUS_STARTING) return;
9100
9101 data.devices_status = STATUS_ABORTED;
9102 }
9103
9104 void myquit ()
9105 {
9106 if (data.devices_status == STATUS_INIT) return;
9107 if (data.devices_status == STATUS_STARTING) return;
9108
9109 data.devices_status = STATUS_QUIT;
9110 }
9111
9112 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
9113 {
9114 FILE *fp = fopen (kernel_file, "rb");
9115
9116 if (fp != NULL)
9117 {
9118 struct stat st;
9119
9120 memset (&st, 0, sizeof (st));
9121
9122 stat (kernel_file, &st);
9123
9124 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
9125
9126 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
9127
9128 if (num_read != (size_t) st.st_size)
9129 {
9130 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9131
9132 exit (-1);
9133 }
9134
9135 fclose (fp);
9136
9137 buf[st.st_size] = 0;
9138
9139 for (int i = 0; i < num_devices; i++)
9140 {
9141 kernel_lengths[i] = (size_t) st.st_size;
9142
9143 kernel_sources[i] = buf;
9144 }
9145 }
9146 else
9147 {
9148 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9149
9150 exit (-1);
9151 }
9152
9153 return;
9154 }
9155
9156 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
9157 {
9158 if (binary_size > 0)
9159 {
9160 FILE *fp = fopen (dst, "wb");
9161
9162 lock_file (fp);
9163 fwrite (binary, sizeof (u8), binary_size, fp);
9164
9165 fflush (fp);
9166 fclose (fp);
9167 }
9168 }
9169
9170 /**
9171 * restore
9172 */
9173
9174 restore_data_t *init_restore (int argc, char **argv)
9175 {
9176 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
9177
9178 if (data.restore_disable == 0)
9179 {
9180 FILE *fp = fopen (data.eff_restore_file, "rb");
9181
9182 if (fp)
9183 {
9184 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
9185
9186 if (nread != 1)
9187 {
9188 log_error ("ERROR: cannot read %s", data.eff_restore_file);
9189
9190 exit (-1);
9191 }
9192
9193 fclose (fp);
9194
9195 if (rd->pid)
9196 {
9197 char *pidbin = (char *) mymalloc (HCBUFSIZ);
9198
9199 int pidbin_len = -1;
9200
9201 #ifdef _POSIX
9202 snprintf (pidbin, HCBUFSIZ - 1, "/proc/%d/cmdline", rd->pid);
9203
9204 FILE *fd = fopen (pidbin, "rb");
9205
9206 if (fd)
9207 {
9208 pidbin_len = fread (pidbin, 1, HCBUFSIZ, fd);
9209
9210 pidbin[pidbin_len] = 0;
9211
9212 fclose (fd);
9213
9214 char *argv0_r = strrchr (argv[0], '/');
9215
9216 char *pidbin_r = strrchr (pidbin, '/');
9217
9218 if (argv0_r == NULL) argv0_r = argv[0];
9219
9220 if (pidbin_r == NULL) pidbin_r = pidbin;
9221
9222 if (strcmp (argv0_r, pidbin_r) == 0)
9223 {
9224 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
9225
9226 exit (-1);
9227 }
9228 }
9229
9230 #elif _WIN
9231 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
9232
9233 char *pidbin2 = (char *) mymalloc (HCBUFSIZ);
9234
9235 int pidbin2_len = -1;
9236
9237 pidbin_len = GetModuleFileName (NULL, pidbin, HCBUFSIZ);
9238 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, HCBUFSIZ);
9239
9240 pidbin[pidbin_len] = 0;
9241 pidbin2[pidbin2_len] = 0;
9242
9243 if (pidbin2_len)
9244 {
9245 if (strcmp (pidbin, pidbin2) == 0)
9246 {
9247 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
9248
9249 exit (-1);
9250 }
9251 }
9252
9253 myfree (pidbin2);
9254
9255 #endif
9256
9257 myfree (pidbin);
9258 }
9259
9260 if (rd->version_bin < RESTORE_MIN)
9261 {
9262 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
9263
9264 exit (-1);
9265 }
9266 }
9267 }
9268
9269 memset (rd, 0, sizeof (restore_data_t));
9270
9271 rd->version_bin = VERSION_BIN;
9272
9273 #ifdef _POSIX
9274 rd->pid = getpid ();
9275 #elif _WIN
9276 rd->pid = GetCurrentProcessId ();
9277 #endif
9278
9279 if (getcwd (rd->cwd, 255) == NULL)
9280 {
9281 myfree (rd);
9282
9283 return (NULL);
9284 }
9285
9286 rd->argc = argc;
9287 rd->argv = argv;
9288
9289 return (rd);
9290 }
9291
9292 void read_restore (const char *eff_restore_file, restore_data_t *rd)
9293 {
9294 FILE *fp = fopen (eff_restore_file, "rb");
9295
9296 if (fp == NULL)
9297 {
9298 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
9299
9300 exit (-1);
9301 }
9302
9303 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
9304 {
9305 log_error ("ERROR: cannot read %s", eff_restore_file);
9306
9307 exit (-1);
9308 }
9309
9310 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
9311
9312 char *buf = (char *) mymalloc (HCBUFSIZ);
9313
9314 for (uint i = 0; i < rd->argc; i++)
9315 {
9316 if (fgets (buf, HCBUFSIZ - 1, fp) == NULL)
9317 {
9318 log_error ("ERROR: cannot read %s", eff_restore_file);
9319
9320 exit (-1);
9321 }
9322
9323 size_t len = strlen (buf);
9324
9325 if (len) buf[len - 1] = 0;
9326
9327 rd->argv[i] = mystrdup (buf);
9328 }
9329
9330 myfree (buf);
9331
9332 fclose (fp);
9333
9334 log_info ("INFO: Changing current working directory to the path found within the .restore file: '%s'", rd->cwd);
9335
9336 if (chdir (rd->cwd))
9337 {
9338 log_error ("ERROR: The directory '%s' does not exist. It is needed to restore (--restore) the session.\n"
9339 " You could either create this directory (or link it) or update the .restore file using e.g. the analyze_hc_restore.pl tool:\n"
9340 " https://github.com/philsmd/analyze_hc_restore\n"
9341 " The directory must be relative to (or contain) all files/folders mentioned within the command line.", rd->cwd);
9342
9343 exit (-1);
9344 }
9345 }
9346
9347 u64 get_lowest_words_done ()
9348 {
9349 u64 words_cur = -1;
9350
9351 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
9352 {
9353 hc_device_param_t *device_param = &data.devices_param[device_id];
9354
9355 if (device_param->skipped) continue;
9356
9357 const u64 words_done = device_param->words_done;
9358
9359 if (words_done < words_cur) words_cur = words_done;
9360 }
9361
9362 // It's possible that a device's workload isn't finished right after a restore-case.
9363 // In that case, this function would return 0 and overwrite the real restore point
9364 // There's also data.words_cur which is set to rd->words_cur but it changes while
9365 // the attack is running therefore we should stick to rd->words_cur.
9366 // Note that -s influences rd->words_cur we should keep a close look on that.
9367
9368 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
9369
9370 return words_cur;
9371 }
9372
9373 void write_restore (const char *new_restore_file, restore_data_t *rd)
9374 {
9375 u64 words_cur = get_lowest_words_done ();
9376
9377 rd->words_cur = words_cur;
9378
9379 FILE *fp = fopen (new_restore_file, "wb");
9380
9381 if (fp == NULL)
9382 {
9383 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
9384
9385 exit (-1);
9386 }
9387
9388 if (setvbuf (fp, NULL, _IONBF, 0))
9389 {
9390 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
9391
9392 exit (-1);
9393 }
9394
9395 fwrite (rd, sizeof (restore_data_t), 1, fp);
9396
9397 for (uint i = 0; i < rd->argc; i++)
9398 {
9399 fprintf (fp, "%s", rd->argv[i]);
9400 fputc ('\n', fp);
9401 }
9402
9403 fflush (fp);
9404
9405 fsync (fileno (fp));
9406
9407 fclose (fp);
9408 }
9409
9410 void cycle_restore ()
9411 {
9412 const char *eff_restore_file = data.eff_restore_file;
9413 const char *new_restore_file = data.new_restore_file;
9414
9415 restore_data_t *rd = data.rd;
9416
9417 write_restore (new_restore_file, rd);
9418
9419 struct stat st;
9420
9421 memset (&st, 0, sizeof(st));
9422
9423 if (stat (eff_restore_file, &st) == 0)
9424 {
9425 if (unlink (eff_restore_file))
9426 {
9427 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
9428 }
9429 }
9430
9431 if (rename (new_restore_file, eff_restore_file))
9432 {
9433 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
9434 }
9435 }
9436
9437 void check_checkpoint ()
9438 {
9439 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9440
9441 u64 words_cur = get_lowest_words_done ();
9442
9443 if (words_cur != data.checkpoint_cur_words)
9444 {
9445 myabort ();
9446 }
9447 }
9448
9449 /**
9450 * tuning db
9451 */
9452
9453 void tuning_db_destroy (tuning_db_t *tuning_db)
9454 {
9455 int i;
9456
9457 for (i = 0; i < tuning_db->alias_cnt; i++)
9458 {
9459 tuning_db_alias_t *alias = &tuning_db->alias_buf[i];
9460
9461 myfree (alias->device_name);
9462 myfree (alias->alias_name);
9463 }
9464
9465 for (i = 0; i < tuning_db->entry_cnt; i++)
9466 {
9467 tuning_db_entry_t *entry = &tuning_db->entry_buf[i];
9468
9469 myfree (entry->device_name);
9470 }
9471
9472 myfree (tuning_db->alias_buf);
9473 myfree (tuning_db->entry_buf);
9474
9475 myfree (tuning_db);
9476 }
9477
9478 tuning_db_t *tuning_db_alloc (FILE *fp)
9479 {
9480 tuning_db_t *tuning_db = (tuning_db_t *) mymalloc (sizeof (tuning_db_t));
9481
9482 int num_lines = count_lines (fp);
9483
9484 // a bit over-allocated
9485
9486 tuning_db->alias_buf = (tuning_db_alias_t *) mycalloc (num_lines + 1, sizeof (tuning_db_alias_t));
9487 tuning_db->alias_cnt = 0;
9488
9489 tuning_db->entry_buf = (tuning_db_entry_t *) mycalloc (num_lines + 1, sizeof (tuning_db_entry_t));
9490 tuning_db->entry_cnt = 0;
9491
9492 return tuning_db;
9493 }
9494
9495 tuning_db_t *tuning_db_init (const char *tuning_db_file)
9496 {
9497 FILE *fp = fopen (tuning_db_file, "rb");
9498
9499 if (fp == NULL)
9500 {
9501 log_error ("%s: %s", tuning_db_file, strerror (errno));
9502
9503 exit (-1);
9504 }
9505
9506 tuning_db_t *tuning_db = tuning_db_alloc (fp);
9507
9508 rewind (fp);
9509
9510 int line_num = 0;
9511
9512 char *buf = (char *) mymalloc (HCBUFSIZ);
9513
9514 while (!feof (fp))
9515 {
9516 char *line_buf = fgets (buf, HCBUFSIZ - 1, fp);
9517
9518 if (line_buf == NULL) break;
9519
9520 line_num++;
9521
9522 const int line_len = in_superchop (line_buf);
9523
9524 if (line_len == 0) continue;
9525
9526 if (line_buf[0] == '#') continue;
9527
9528 // start processing
9529
9530 char *token_ptr[7] = { NULL };
9531
9532 int token_cnt = 0;
9533
9534 char *next = strtok (line_buf, "\t ");
9535
9536 token_ptr[token_cnt] = next;
9537
9538 token_cnt++;
9539
9540 while ((next = strtok (NULL, "\t ")) != NULL)
9541 {
9542 token_ptr[token_cnt] = next;
9543
9544 token_cnt++;
9545 }
9546
9547 if (token_cnt == 2)
9548 {
9549 char *device_name = token_ptr[0];
9550 char *alias_name = token_ptr[1];
9551
9552 tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt];
9553
9554 alias->device_name = mystrdup (device_name);
9555 alias->alias_name = mystrdup (alias_name);
9556
9557 tuning_db->alias_cnt++;
9558 }
9559 else if (token_cnt == 6)
9560 {
9561 if ((token_ptr[1][0] != '0') &&
9562 (token_ptr[1][0] != '1') &&
9563 (token_ptr[1][0] != '3') &&
9564 (token_ptr[1][0] != '*'))
9565 {
9566 log_info ("WARNING: Tuning-db: Invalid attack_mode '%c' in Line '%u'", token_ptr[1][0], line_num);
9567
9568 continue;
9569 }
9570
9571 if ((token_ptr[3][0] != '1') &&
9572 (token_ptr[3][0] != '2') &&
9573 (token_ptr[3][0] != '4') &&
9574 (token_ptr[3][0] != '8') &&
9575 (token_ptr[3][0] != 'N'))
9576 {
9577 log_info ("WARNING: Tuning-db: Invalid vector_width '%c' in Line '%u'", token_ptr[3][0], line_num);
9578
9579 continue;
9580 }
9581
9582 char *device_name = token_ptr[0];
9583
9584 int attack_mode = -1;
9585 int hash_type = -1;
9586 int vector_width = -1;
9587 int kernel_accel = -1;
9588 int kernel_loops = -1;
9589
9590 if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]);
9591 if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]);
9592 if (token_ptr[3][0] != 'N') vector_width = atoi (token_ptr[3]);
9593
9594 if (token_ptr[4][0] != 'A')
9595 {
9596 kernel_accel = atoi (token_ptr[4]);
9597
9598 if ((kernel_accel < 1) || (kernel_accel > 1024))
9599 {
9600 log_info ("WARNING: Tuning-db: Invalid kernel_accel '%d' in Line '%u'", kernel_accel, line_num);
9601
9602 continue;
9603 }
9604 }
9605 else
9606 {
9607 kernel_accel = 0;
9608 }
9609
9610 if (token_ptr[5][0] != 'A')
9611 {
9612 kernel_loops = atoi (token_ptr[5]);
9613
9614 if ((kernel_loops < 1) || (kernel_loops > 1024))
9615 {
9616 log_info ("WARNING: Tuning-db: Invalid kernel_loops '%d' in Line '%u'", kernel_loops, line_num);
9617
9618 continue;
9619 }
9620 }
9621 else
9622 {
9623 kernel_loops = 0;
9624 }
9625
9626 tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt];
9627
9628 entry->device_name = mystrdup (device_name);
9629 entry->attack_mode = attack_mode;
9630 entry->hash_type = hash_type;
9631 entry->vector_width = vector_width;
9632 entry->kernel_accel = kernel_accel;
9633 entry->kernel_loops = kernel_loops;
9634
9635 tuning_db->entry_cnt++;
9636 }
9637 else
9638 {
9639 log_info ("WARNING: Tuning-db: Invalid number of token in Line '%u'", line_num);
9640
9641 continue;
9642 }
9643 }
9644
9645 myfree (buf);
9646
9647 fclose (fp);
9648
9649 // todo: print loaded 'cnt' message
9650
9651 // sort the database
9652
9653 qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9654 qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9655
9656 return tuning_db;
9657 }
9658
9659 tuning_db_entry_t *tuning_db_search (tuning_db_t *tuning_db, hc_device_param_t *device_param, int attack_mode, int hash_type)
9660 {
9661 static tuning_db_entry_t s;
9662
9663 // first we need to convert all spaces in the device_name to underscore
9664
9665 char *device_name_nospace = strdup (device_param->device_name);
9666
9667 int device_name_length = strlen (device_name_nospace);
9668
9669 int i;
9670
9671 for (i = 0; i < device_name_length; i++)
9672 {
9673 if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_';
9674 }
9675
9676 // find out if there's an alias configured
9677
9678 tuning_db_alias_t a;
9679
9680 a.device_name = device_name_nospace;
9681
9682 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);
9683
9684 char *alias_name = (alias == NULL) ? NULL : alias->alias_name;
9685
9686 // attack-mode 6 and 7 are attack-mode 1 basically
9687
9688 if (attack_mode == 6) attack_mode = 1;
9689 if (attack_mode == 7) attack_mode = 1;
9690
9691 // bsearch is not ideal but fast enough
9692
9693 s.device_name = device_name_nospace;
9694 s.attack_mode = attack_mode;
9695 s.hash_type = hash_type;
9696
9697 tuning_db_entry_t *entry = NULL;
9698
9699 // this will produce all 2^3 combinations required
9700
9701 for (i = 0; i < 8; i++)
9702 {
9703 s.device_name = (i & 1) ? "*" : device_name_nospace;
9704 s.attack_mode = (i & 2) ? -1 : attack_mode;
9705 s.hash_type = (i & 4) ? -1 : hash_type;
9706
9707 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9708
9709 if (entry != NULL) break;
9710
9711 // in non-wildcard mode do some additional checks:
9712
9713 if ((i & 1) == 0)
9714 {
9715 // in case we have an alias-name
9716
9717 if (alias_name != NULL)
9718 {
9719 s.device_name = alias_name;
9720
9721 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9722
9723 if (entry != NULL) break;
9724 }
9725
9726 // or by device type
9727
9728 if (device_param->device_type & CL_DEVICE_TYPE_CPU)
9729 {
9730 s.device_name = "DEVICE_TYPE_CPU";
9731 }
9732 else if (device_param->device_type & CL_DEVICE_TYPE_GPU)
9733 {
9734 s.device_name = "DEVICE_TYPE_GPU";
9735 }
9736 else if (device_param->device_type & CL_DEVICE_TYPE_ACCELERATOR)
9737 {
9738 s.device_name = "DEVICE_TYPE_ACCELERATOR";
9739 }
9740
9741 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9742
9743 if (entry != NULL) break;
9744 }
9745 }
9746
9747 // free converted device_name
9748
9749 myfree (device_name_nospace);
9750
9751 return entry;
9752 }
9753
9754 /**
9755 * parser
9756 */
9757
9758 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9759 {
9760 u8 tmp[256] = { 0 };
9761
9762 if (salt_len > sizeof (tmp))
9763 {
9764 return UINT_MAX;
9765 }
9766
9767 memcpy (tmp, in, salt_len);
9768
9769 if (data.opts_type & OPTS_TYPE_ST_HEX)
9770 {
9771 if ((salt_len % 2) == 0)
9772 {
9773 u32 new_salt_len = salt_len / 2;
9774
9775 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9776 {
9777 u8 p0 = tmp[j + 0];
9778 u8 p1 = tmp[j + 1];
9779
9780 tmp[i] = hex_convert (p1) << 0;
9781 tmp[i] |= hex_convert (p0) << 4;
9782 }
9783
9784 salt_len = new_salt_len;
9785 }
9786 else
9787 {
9788 return UINT_MAX;
9789 }
9790 }
9791 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9792 {
9793 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9794 }
9795
9796 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9797
9798 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9799 {
9800 if (salt_len < 20)
9801 {
9802 u32 *tmp_uint = (u32 *) tmp;
9803
9804 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9805 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9806 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9807 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9808 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9809 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9810 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9811 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9812 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9813 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9814
9815 salt_len = salt_len * 2;
9816 }
9817 else
9818 {
9819 return UINT_MAX;
9820 }
9821 }
9822
9823 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9824 {
9825 lowercase (tmp, salt_len);
9826 }
9827
9828 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9829 {
9830 uppercase (tmp, salt_len);
9831 }
9832
9833 u32 len = salt_len;
9834
9835 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9836 {
9837 tmp[len++] = 0x80;
9838 }
9839
9840 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9841 {
9842 tmp[len++] = 0x01;
9843 }
9844
9845 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9846 {
9847 u32 *tmp_uint = (uint *) tmp;
9848
9849 u32 max = len / 4;
9850
9851 if (len % 4) max++;
9852
9853 for (u32 i = 0; i < max; i++)
9854 {
9855 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9856 }
9857
9858 // Important: we may need to increase the length of memcpy since
9859 // we don't want to "loose" some swapped bytes (could happen if
9860 // they do not perfectly fit in the 4-byte blocks)
9861 // Memcpy does always copy the bytes in the BE order, but since
9862 // we swapped them, some important bytes could be in positions
9863 // we normally skip with the original len
9864
9865 if (len % 4) len += 4 - (len % 4);
9866 }
9867
9868 memcpy (out, tmp, len);
9869
9870 return (salt_len);
9871 }
9872
9873 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9874 {
9875 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9876
9877 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9878
9879 u32 *digest = (u32 *) hash_buf->digest;
9880
9881 salt_t *salt = hash_buf->salt;
9882
9883 memcpy ((char *) salt->salt_sign, input_buf, 6);
9884
9885 char *iter_pos = input_buf + 4;
9886
9887 salt->salt_iter = 1 << atoi (iter_pos);
9888
9889 char *salt_pos = strchr (iter_pos, '$');
9890
9891 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9892
9893 salt_pos++;
9894
9895 uint salt_len = 16;
9896
9897 salt->salt_len = salt_len;
9898
9899 u8 tmp_buf[100] = { 0 };
9900
9901 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9902
9903 char *salt_buf_ptr = (char *) salt->salt_buf;
9904
9905 memcpy (salt_buf_ptr, tmp_buf, 16);
9906
9907 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9908 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9909 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9910 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9911
9912 char *hash_pos = salt_pos + 22;
9913
9914 memset (tmp_buf, 0, sizeof (tmp_buf));
9915
9916 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9917
9918 memcpy (digest, tmp_buf, 24);
9919
9920 digest[0] = byte_swap_32 (digest[0]);
9921 digest[1] = byte_swap_32 (digest[1]);
9922 digest[2] = byte_swap_32 (digest[2]);
9923 digest[3] = byte_swap_32 (digest[3]);
9924 digest[4] = byte_swap_32 (digest[4]);
9925 digest[5] = byte_swap_32 (digest[5]);
9926
9927 digest[5] &= ~0xff; // its just 23 not 24 !
9928
9929 return (PARSER_OK);
9930 }
9931
9932 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9933 {
9934 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9935
9936 u32 *digest = (u32 *) hash_buf->digest;
9937
9938 u8 tmp_buf[100] = { 0 };
9939
9940 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9941
9942 memcpy (digest, tmp_buf, 32);
9943
9944 digest[0] = byte_swap_32 (digest[0]);
9945 digest[1] = byte_swap_32 (digest[1]);
9946 digest[2] = byte_swap_32 (digest[2]);
9947 digest[3] = byte_swap_32 (digest[3]);
9948 digest[4] = byte_swap_32 (digest[4]);
9949 digest[5] = byte_swap_32 (digest[5]);
9950 digest[6] = byte_swap_32 (digest[6]);
9951 digest[7] = byte_swap_32 (digest[7]);
9952
9953 digest[0] -= SHA256M_A;
9954 digest[1] -= SHA256M_B;
9955 digest[2] -= SHA256M_C;
9956 digest[3] -= SHA256M_D;
9957 digest[4] -= SHA256M_E;
9958 digest[5] -= SHA256M_F;
9959 digest[6] -= SHA256M_G;
9960 digest[7] -= SHA256M_H;
9961
9962 return (PARSER_OK);
9963 }
9964
9965 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9966 {
9967 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9968
9969 u32 *digest = (u32 *) hash_buf->digest;
9970
9971 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9972 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9973
9974 digest[0] = byte_swap_32 (digest[0]);
9975 digest[1] = byte_swap_32 (digest[1]);
9976
9977 uint tt;
9978
9979 IP (digest[0], digest[1], tt);
9980
9981 digest[0] = digest[0];
9982 digest[1] = digest[1];
9983 digest[2] = 0;
9984 digest[3] = 0;
9985
9986 return (PARSER_OK);
9987 }
9988
9989 int arubaos_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9990 {
9991 if ((input_len < DISPLAY_LEN_MIN_125) || (input_len > DISPLAY_LEN_MAX_125)) return (PARSER_GLOBAL_LENGTH);
9992
9993 if ((input_buf[8] != '0') || (input_buf[9] != '1')) return (PARSER_SIGNATURE_UNMATCHED);
9994
9995 u32 *digest = (u32 *) hash_buf->digest;
9996
9997 salt_t *salt = hash_buf->salt;
9998
9999 char *hash_pos = input_buf + 10;
10000
10001 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10002 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10003 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10004 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10005 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10006
10007 digest[0] -= SHA1M_A;
10008 digest[1] -= SHA1M_B;
10009 digest[2] -= SHA1M_C;
10010 digest[3] -= SHA1M_D;
10011 digest[4] -= SHA1M_E;
10012
10013 uint salt_len = 10;
10014
10015 char *salt_buf_ptr = (char *) salt->salt_buf;
10016
10017 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10018
10019 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10020
10021 salt->salt_len = salt_len;
10022
10023 return (PARSER_OK);
10024 }
10025
10026 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10027 {
10028 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
10029
10030 u32 *digest = (u32 *) hash_buf->digest;
10031
10032 salt_t *salt = hash_buf->salt;
10033
10034 char *hash_pos = input_buf + 8;
10035
10036 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10037 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10038 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10039 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10040 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10041
10042 digest[0] -= SHA1M_A;
10043 digest[1] -= SHA1M_B;
10044 digest[2] -= SHA1M_C;
10045 digest[3] -= SHA1M_D;
10046 digest[4] -= SHA1M_E;
10047
10048 uint salt_len = 8;
10049
10050 char *salt_buf_ptr = (char *) salt->salt_buf;
10051
10052 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10053
10054 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10055
10056 salt->salt_len = salt_len;
10057
10058 return (PARSER_OK);
10059 }
10060
10061 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10062 {
10063 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
10064
10065 u64 *digest = (u64 *) hash_buf->digest;
10066
10067 salt_t *salt = hash_buf->salt;
10068
10069 char *hash_pos = input_buf + 8;
10070
10071 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
10072 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
10073 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
10074 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
10075 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
10076 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
10077 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
10078 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
10079
10080 digest[0] -= SHA512M_A;
10081 digest[1] -= SHA512M_B;
10082 digest[2] -= SHA512M_C;
10083 digest[3] -= SHA512M_D;
10084 digest[4] -= SHA512M_E;
10085 digest[5] -= SHA512M_F;
10086 digest[6] -= SHA512M_G;
10087 digest[7] -= SHA512M_H;
10088
10089 uint salt_len = 8;
10090
10091 char *salt_buf_ptr = (char *) salt->salt_buf;
10092
10093 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10094
10095 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10096
10097 salt->salt_len = salt_len;
10098
10099 return (PARSER_OK);
10100 }
10101
10102 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10103 {
10104 if (data.opts_type & OPTS_TYPE_ST_HEX)
10105 {
10106 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
10107 }
10108 else
10109 {
10110 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
10111 }
10112
10113 u32 *digest = (u32 *) hash_buf->digest;
10114
10115 salt_t *salt = hash_buf->salt;
10116
10117 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10118 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10119 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10120 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10121
10122 digest[0] = byte_swap_32 (digest[0]);
10123 digest[1] = byte_swap_32 (digest[1]);
10124 digest[2] = byte_swap_32 (digest[2]);
10125 digest[3] = byte_swap_32 (digest[3]);
10126
10127 digest[0] -= MD5M_A;
10128 digest[1] -= MD5M_B;
10129 digest[2] -= MD5M_C;
10130 digest[3] -= MD5M_D;
10131
10132 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10133
10134 uint salt_len = input_len - 32 - 1;
10135
10136 char *salt_buf = input_buf + 32 + 1;
10137
10138 char *salt_buf_ptr = (char *) salt->salt_buf;
10139
10140 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10141
10142 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10143
10144 salt->salt_len = salt_len;
10145
10146 return (PARSER_OK);
10147 }
10148
10149 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10150 {
10151 if (data.opts_type & OPTS_TYPE_ST_HEX)
10152 {
10153 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
10154 }
10155 else
10156 {
10157 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
10158 }
10159
10160 // unscramble
10161
10162 char clean_input_buf[32] = { 0 };
10163
10164 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
10165 int pos[6] = { 0, 6, 12, 17, 23, 29 };
10166
10167 for (int i = 0, j = 0, k = 0; i < 30; i++)
10168 {
10169 if (i == pos[j])
10170 {
10171 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
10172
10173 j++;
10174 }
10175 else
10176 {
10177 clean_input_buf[k] = input_buf[i];
10178
10179 k++;
10180 }
10181 }
10182
10183 // base64 decode
10184
10185 u32 *digest = (u32 *) hash_buf->digest;
10186
10187 salt_t *salt = hash_buf->salt;
10188
10189 u32 a, b, c, d, e, f;
10190
10191 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
10192 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
10193 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
10194 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
10195 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
10196 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
10197
10198 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
10199 | (((d << 12) | (e << 6) | (f)) << 0);
10200
10201 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
10202 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
10203 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
10204 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
10205 e = base64_to_int (clean_input_buf[10] & 0x7f);
10206 f = base64_to_int (clean_input_buf[11] & 0x7f);
10207
10208 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
10209 | (((d << 12) | (e << 6) | (f)) << 0);
10210
10211 a = base64_to_int (clean_input_buf[12] & 0x7f);
10212 b = base64_to_int (clean_input_buf[13] & 0x7f);
10213 c = base64_to_int (clean_input_buf[14] & 0x7f);
10214 d = base64_to_int (clean_input_buf[15] & 0x7f);
10215 e = base64_to_int (clean_input_buf[16] & 0x7f);
10216 f = base64_to_int (clean_input_buf[17] & 0x7f);
10217
10218 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
10219 | (((d << 12) | (e << 6) | (f)) << 0);
10220
10221 a = base64_to_int (clean_input_buf[18] & 0x7f);
10222 b = base64_to_int (clean_input_buf[19] & 0x7f);
10223 c = base64_to_int (clean_input_buf[20] & 0x7f);
10224 d = base64_to_int (clean_input_buf[21] & 0x7f);
10225 e = base64_to_int (clean_input_buf[22] & 0x7f);
10226 f = base64_to_int (clean_input_buf[23] & 0x7f);
10227
10228 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
10229 | (((d << 12) | (e << 6) | (f)) << 0);
10230
10231 digest[0] = byte_swap_32 (digest[0]);
10232 digest[1] = byte_swap_32 (digest[1]);
10233 digest[2] = byte_swap_32 (digest[2]);
10234 digest[3] = byte_swap_32 (digest[3]);
10235
10236 digest[0] -= MD5M_A;
10237 digest[1] -= MD5M_B;
10238 digest[2] -= MD5M_C;
10239 digest[3] -= MD5M_D;
10240
10241 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
10242
10243 uint salt_len = input_len - 30 - 1;
10244
10245 char *salt_buf = input_buf + 30 + 1;
10246
10247 char *salt_buf_ptr = (char *) salt->salt_buf;
10248
10249 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10250
10251 // max. salt length: 55 (max for MD5) - 22 (":Administration Tools:") - 1 (0x80) = 32
10252 // 32 - 4 bytes (to fit w0lr for all attack modes) = 28
10253
10254 if (salt_len > 28) return (PARSER_SALT_LENGTH);
10255
10256 salt->salt_len = salt_len;
10257
10258 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
10259
10260 salt->salt_len += 22;
10261
10262 return (PARSER_OK);
10263 }
10264
10265 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10266 {
10267 if (data.opts_type & OPTS_TYPE_ST_HEX)
10268 {
10269 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
10270 }
10271 else
10272 {
10273 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
10274 }
10275
10276 u32 *digest = (u32 *) hash_buf->digest;
10277
10278 salt_t *salt = hash_buf->salt;
10279
10280 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10281 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10282 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10283 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10284 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
10285
10286 digest[0] -= SHA1M_A;
10287 digest[1] -= SHA1M_B;
10288 digest[2] -= SHA1M_C;
10289 digest[3] -= SHA1M_D;
10290 digest[4] -= SHA1M_E;
10291
10292 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10293
10294 uint salt_len = input_len - 40 - 1;
10295
10296 char *salt_buf = input_buf + 40 + 1;
10297
10298 char *salt_buf_ptr = (char *) salt->salt_buf;
10299
10300 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10301
10302 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10303
10304 salt->salt_len = salt_len;
10305
10306 return (PARSER_OK);
10307 }
10308
10309 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10310 {
10311 if (data.opts_type & OPTS_TYPE_ST_HEX)
10312 {
10313 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
10314 }
10315 else
10316 {
10317 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
10318 }
10319
10320 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10321
10322 char *iter_pos = input_buf + 6;
10323
10324 salt_t *salt = hash_buf->salt;
10325
10326 uint iter = atoi (iter_pos);
10327
10328 if (iter < 1)
10329 {
10330 iter = ROUNDS_DCC2;
10331 }
10332
10333 salt->salt_iter = iter - 1;
10334
10335 char *salt_pos = strchr (iter_pos, '#');
10336
10337 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10338
10339 salt_pos++;
10340
10341 char *digest_pos = strchr (salt_pos, '#');
10342
10343 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10344
10345 digest_pos++;
10346
10347 uint salt_len = digest_pos - salt_pos - 1;
10348
10349 u32 *digest = (u32 *) hash_buf->digest;
10350
10351 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
10352 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
10353 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
10354 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
10355
10356 char *salt_buf_ptr = (char *) salt->salt_buf;
10357
10358 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10359
10360 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10361
10362 salt->salt_len = salt_len;
10363
10364 return (PARSER_OK);
10365 }
10366
10367 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10368 {
10369 u32 *digest = (u32 *) hash_buf->digest;
10370
10371 salt_t *salt = hash_buf->salt;
10372
10373 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
10374
10375 hccap_t in;
10376
10377 memcpy (&in, input_buf, input_len);
10378
10379 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
10380
10381 memcpy (digest, in.keymic, 16);
10382
10383 /*
10384 http://www.one-net.eu/jsw/j_sec/m_ptype.html
10385 The phrase "Pairwise key expansion"
10386 Access Point Address (referred to as Authenticator Address AA)
10387 Supplicant Address (referred to as Supplicant Address SA)
10388 Access Point Nonce (referred to as Authenticator Anonce)
10389 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
10390 */
10391
10392 uint salt_len = strlen (in.essid);
10393
10394 if (salt_len > 36)
10395 {
10396 log_info ("WARNING: the length of the ESSID is too long. The hccap file may be invalid or corrupted");
10397
10398 return (PARSER_SALT_LENGTH);
10399 }
10400
10401 memcpy (salt->salt_buf, in.essid, salt_len);
10402
10403 salt->salt_len = salt_len;
10404
10405 salt->salt_iter = ROUNDS_WPA2 - 1;
10406
10407 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
10408
10409 memcpy (pke_ptr, "Pairwise key expansion", 23);
10410
10411 if (memcmp (in.mac1, in.mac2, 6) < 0)
10412 {
10413 memcpy (pke_ptr + 23, in.mac1, 6);
10414 memcpy (pke_ptr + 29, in.mac2, 6);
10415 }
10416 else
10417 {
10418 memcpy (pke_ptr + 23, in.mac2, 6);
10419 memcpy (pke_ptr + 29, in.mac1, 6);
10420 }
10421
10422 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10423 {
10424 memcpy (pke_ptr + 35, in.nonce1, 32);
10425 memcpy (pke_ptr + 67, in.nonce2, 32);
10426 }
10427 else
10428 {
10429 memcpy (pke_ptr + 35, in.nonce2, 32);
10430 memcpy (pke_ptr + 67, in.nonce1, 32);
10431 }
10432
10433 for (int i = 0; i < 25; i++)
10434 {
10435 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10436 }
10437
10438 memcpy (wpa->orig_mac1, in.mac1, 6);
10439 memcpy (wpa->orig_mac2, in.mac2, 6);
10440 memcpy (wpa->orig_nonce1, in.nonce1, 32);
10441 memcpy (wpa->orig_nonce2, in.nonce2, 32);
10442
10443 wpa->keyver = in.keyver;
10444
10445 if (wpa->keyver > 255)
10446 {
10447 log_info ("ATTENTION!");
10448 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10449 log_info (" This could be due to a recent aircrack-ng bug.");
10450 log_info (" The key version was automatically reset to a reasonable value.");
10451 log_info ("");
10452
10453 wpa->keyver &= 0xff;
10454 }
10455
10456 wpa->eapol_size = in.eapol_size;
10457
10458 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10459
10460 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10461
10462 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10463
10464 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10465
10466 if (wpa->keyver == 1)
10467 {
10468 // nothing to do
10469 }
10470 else
10471 {
10472 digest[0] = byte_swap_32 (digest[0]);
10473 digest[1] = byte_swap_32 (digest[1]);
10474 digest[2] = byte_swap_32 (digest[2]);
10475 digest[3] = byte_swap_32 (digest[3]);
10476
10477 for (int i = 0; i < 64; i++)
10478 {
10479 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10480 }
10481 }
10482
10483 uint32_t *p0 = (uint32_t *) in.essid;
10484 uint32_t c0 = 0;
10485 uint32_t c1 = 0;
10486
10487 for (uint i = 0; i < sizeof (in.essid) / sizeof (uint32_t); i++) c0 ^= *p0++;
10488 for (uint i = 0; i < sizeof (wpa->pke) / sizeof (wpa->pke[0]); i++) c1 ^= wpa->pke[i];
10489
10490 salt->salt_buf[10] = c0;
10491 salt->salt_buf[11] = c1;
10492
10493 return (PARSER_OK);
10494 }
10495
10496 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10497 {
10498 u32 *digest = (u32 *) hash_buf->digest;
10499
10500 salt_t *salt = hash_buf->salt;
10501
10502 if (input_len == 0)
10503 {
10504 log_error ("Password Safe v2 container not specified");
10505
10506 exit (-1);
10507 }
10508
10509 FILE *fp = fopen (input_buf, "rb");
10510
10511 if (fp == NULL)
10512 {
10513 log_error ("%s: %s", input_buf, strerror (errno));
10514
10515 exit (-1);
10516 }
10517
10518 psafe2_hdr buf;
10519
10520 memset (&buf, 0, sizeof (psafe2_hdr));
10521
10522 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10523
10524 fclose (fp);
10525
10526 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10527
10528 salt->salt_buf[0] = buf.random[0];
10529 salt->salt_buf[1] = buf.random[1];
10530
10531 salt->salt_len = 8;
10532 salt->salt_iter = 1000;
10533
10534 digest[0] = byte_swap_32 (buf.hash[0]);
10535 digest[1] = byte_swap_32 (buf.hash[1]);
10536 digest[2] = byte_swap_32 (buf.hash[2]);
10537 digest[3] = byte_swap_32 (buf.hash[3]);
10538 digest[4] = byte_swap_32 (buf.hash[4]);
10539
10540 return (PARSER_OK);
10541 }
10542
10543 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10544 {
10545 u32 *digest = (u32 *) hash_buf->digest;
10546
10547 salt_t *salt = hash_buf->salt;
10548
10549 if (input_len == 0)
10550 {
10551 log_error (".psafe3 not specified");
10552
10553 exit (-1);
10554 }
10555
10556 FILE *fp = fopen (input_buf, "rb");
10557
10558 if (fp == NULL)
10559 {
10560 log_error ("%s: %s", input_buf, strerror (errno));
10561
10562 exit (-1);
10563 }
10564
10565 psafe3_t in;
10566
10567 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10568
10569 fclose (fp);
10570
10571 data.hashfile = input_buf; // we will need this in case it gets cracked
10572
10573 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10574
10575 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10576
10577 salt->salt_iter = in.iterations + 1;
10578
10579 salt->salt_buf[0] = in.salt_buf[0];
10580 salt->salt_buf[1] = in.salt_buf[1];
10581 salt->salt_buf[2] = in.salt_buf[2];
10582 salt->salt_buf[3] = in.salt_buf[3];
10583 salt->salt_buf[4] = in.salt_buf[4];
10584 salt->salt_buf[5] = in.salt_buf[5];
10585 salt->salt_buf[6] = in.salt_buf[6];
10586 salt->salt_buf[7] = in.salt_buf[7];
10587
10588 salt->salt_len = 32;
10589
10590 digest[0] = in.hash_buf[0];
10591 digest[1] = in.hash_buf[1];
10592 digest[2] = in.hash_buf[2];
10593 digest[3] = in.hash_buf[3];
10594 digest[4] = in.hash_buf[4];
10595 digest[5] = in.hash_buf[5];
10596 digest[6] = in.hash_buf[6];
10597 digest[7] = in.hash_buf[7];
10598
10599 digest[0] = byte_swap_32 (digest[0]);
10600 digest[1] = byte_swap_32 (digest[1]);
10601 digest[2] = byte_swap_32 (digest[2]);
10602 digest[3] = byte_swap_32 (digest[3]);
10603 digest[4] = byte_swap_32 (digest[4]);
10604 digest[5] = byte_swap_32 (digest[5]);
10605 digest[6] = byte_swap_32 (digest[6]);
10606 digest[7] = byte_swap_32 (digest[7]);
10607
10608 return (PARSER_OK);
10609 }
10610
10611 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10612 {
10613 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10614
10615 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10616
10617 u32 *digest = (u32 *) hash_buf->digest;
10618
10619 salt_t *salt = hash_buf->salt;
10620
10621 char *iter_pos = input_buf + 3;
10622
10623 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10624
10625 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10626
10627 memcpy ((char *) salt->salt_sign, input_buf, 4);
10628
10629 salt->salt_iter = salt_iter;
10630
10631 char *salt_pos = iter_pos + 1;
10632
10633 uint salt_len = 8;
10634
10635 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10636
10637 salt->salt_len = salt_len;
10638
10639 char *hash_pos = salt_pos + salt_len;
10640
10641 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10642
10643 return (PARSER_OK);
10644 }
10645
10646 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10647 {
10648 if (input_len < DISPLAY_LEN_MIN_500) return (PARSER_GLOBAL_LENGTH);
10649
10650 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10651
10652 u32 *digest = (u32 *) hash_buf->digest;
10653
10654 salt_t *salt = hash_buf->salt;
10655
10656 char *salt_pos = input_buf + 3;
10657
10658 uint iterations_len = 0;
10659
10660 if (memcmp (salt_pos, "rounds=", 7) == 0)
10661 {
10662 salt_pos += 7;
10663
10664 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10665
10666 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10667 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10668
10669 salt_pos[0] = 0x0;
10670
10671 salt->salt_iter = atoi (salt_pos - iterations_len);
10672
10673 salt_pos += 1;
10674
10675 iterations_len += 8;
10676 }
10677 else
10678 {
10679 salt->salt_iter = ROUNDS_MD5CRYPT;
10680 }
10681
10682 if (input_len > (DISPLAY_LEN_MAX_500 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10683
10684 char *hash_pos = strchr (salt_pos, '$');
10685
10686 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10687
10688 uint salt_len = hash_pos - salt_pos;
10689
10690 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10691
10692 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10693
10694 salt->salt_len = salt_len;
10695
10696 hash_pos++;
10697
10698 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10699
10700 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10701
10702 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10703
10704 return (PARSER_OK);
10705 }
10706
10707 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10708 {
10709 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10710
10711 u32 *digest = (u32 *) hash_buf->digest;
10712
10713 salt_t *salt = hash_buf->salt;
10714
10715 char *salt_pos = input_buf + 6;
10716
10717 uint iterations_len = 0;
10718
10719 if (memcmp (salt_pos, "rounds=", 7) == 0)
10720 {
10721 salt_pos += 7;
10722
10723 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10724
10725 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10726 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10727
10728 salt_pos[0] = 0x0;
10729
10730 salt->salt_iter = atoi (salt_pos - iterations_len);
10731
10732 salt_pos += 1;
10733
10734 iterations_len += 8;
10735 }
10736 else
10737 {
10738 salt->salt_iter = ROUNDS_MD5CRYPT;
10739 }
10740
10741 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10742
10743 char *hash_pos = strchr (salt_pos, '$');
10744
10745 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10746
10747 uint salt_len = hash_pos - salt_pos;
10748
10749 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10750
10751 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10752
10753 salt->salt_len = salt_len;
10754
10755 hash_pos++;
10756
10757 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10758
10759 return (PARSER_OK);
10760 }
10761
10762 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10763 {
10764 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10765
10766 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10767
10768 u32 *digest = (u32 *) hash_buf->digest;
10769
10770 salt_t *salt = hash_buf->salt;
10771
10772 char *salt_pos = input_buf + 14;
10773
10774 char *hash_pos = strchr (salt_pos, '*');
10775
10776 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10777
10778 hash_pos++;
10779
10780 uint salt_len = hash_pos - salt_pos - 1;
10781
10782 char *salt_buf_ptr = (char *) salt->salt_buf;
10783
10784 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10785
10786 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10787
10788 salt->salt_len = salt_len;
10789
10790 u8 tmp_buf[100] = { 0 };
10791
10792 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10793
10794 memcpy (digest, tmp_buf, 20);
10795
10796 digest[0] = byte_swap_32 (digest[0]);
10797 digest[1] = byte_swap_32 (digest[1]);
10798 digest[2] = byte_swap_32 (digest[2]);
10799 digest[3] = byte_swap_32 (digest[3]);
10800 digest[4] = byte_swap_32 (digest[4]);
10801
10802 digest[0] -= SHA1M_A;
10803 digest[1] -= SHA1M_B;
10804 digest[2] -= SHA1M_C;
10805 digest[3] -= SHA1M_D;
10806 digest[4] -= SHA1M_E;
10807
10808 return (PARSER_OK);
10809 }
10810
10811 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10812 {
10813 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10814
10815 unsigned char c12 = itoa64_to_int (input_buf[12]);
10816
10817 if (c12 & 3) return (PARSER_HASH_VALUE);
10818
10819 u32 *digest = (u32 *) hash_buf->digest;
10820
10821 salt_t *salt = hash_buf->salt;
10822
10823 // for ascii_digest
10824 salt->salt_sign[0] = input_buf[0];
10825 salt->salt_sign[1] = input_buf[1];
10826
10827 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10828 | itoa64_to_int (input_buf[1]) << 6;
10829
10830 salt->salt_len = 2;
10831
10832 u8 tmp_buf[100] = { 0 };
10833
10834 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10835
10836 memcpy (digest, tmp_buf, 8);
10837
10838 uint tt;
10839
10840 IP (digest[0], digest[1], tt);
10841
10842 digest[2] = 0;
10843 digest[3] = 0;
10844
10845 return (PARSER_OK);
10846 }
10847
10848 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10849 {
10850 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10851
10852 u32 *digest = (u32 *) hash_buf->digest;
10853
10854 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10855 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10856 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10857 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10858
10859 digest[0] = byte_swap_32 (digest[0]);
10860 digest[1] = byte_swap_32 (digest[1]);
10861 digest[2] = byte_swap_32 (digest[2]);
10862 digest[3] = byte_swap_32 (digest[3]);
10863
10864 digest[0] -= MD4M_A;
10865 digest[1] -= MD4M_B;
10866 digest[2] -= MD4M_C;
10867 digest[3] -= MD4M_D;
10868
10869 return (PARSER_OK);
10870 }
10871
10872 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10873 {
10874 if (data.opts_type & OPTS_TYPE_ST_HEX)
10875 {
10876 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10877 }
10878 else
10879 {
10880 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10881 }
10882
10883 u32 *digest = (u32 *) hash_buf->digest;
10884
10885 salt_t *salt = hash_buf->salt;
10886
10887 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10888 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10889 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10890 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10891
10892 digest[0] = byte_swap_32 (digest[0]);
10893 digest[1] = byte_swap_32 (digest[1]);
10894 digest[2] = byte_swap_32 (digest[2]);
10895 digest[3] = byte_swap_32 (digest[3]);
10896
10897 digest[0] -= MD4M_A;
10898 digest[1] -= MD4M_B;
10899 digest[2] -= MD4M_C;
10900 digest[3] -= MD4M_D;
10901
10902 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10903
10904 uint salt_len = input_len - 32 - 1;
10905
10906 char *salt_buf = input_buf + 32 + 1;
10907
10908 char *salt_buf_ptr = (char *) salt->salt_buf;
10909
10910 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10911
10912 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10913
10914 salt->salt_len = salt_len;
10915
10916 return (PARSER_OK);
10917 }
10918
10919 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10920 {
10921 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10922
10923 u32 *digest = (u32 *) hash_buf->digest;
10924
10925 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10926 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10927 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10928 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10929
10930 digest[0] = byte_swap_32 (digest[0]);
10931 digest[1] = byte_swap_32 (digest[1]);
10932 digest[2] = byte_swap_32 (digest[2]);
10933 digest[3] = byte_swap_32 (digest[3]);
10934
10935 digest[0] -= MD5M_A;
10936 digest[1] -= MD5M_B;
10937 digest[2] -= MD5M_C;
10938 digest[3] -= MD5M_D;
10939
10940 return (PARSER_OK);
10941 }
10942
10943 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10944 {
10945 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10946
10947 u32 *digest = (u32 *) hash_buf->digest;
10948
10949 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10950 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10951 digest[2] = 0;
10952 digest[3] = 0;
10953
10954 digest[0] = byte_swap_32 (digest[0]);
10955 digest[1] = byte_swap_32 (digest[1]);
10956
10957 return (PARSER_OK);
10958 }
10959
10960 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10961 {
10962 if (data.opts_type & OPTS_TYPE_ST_HEX)
10963 {
10964 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10965 }
10966 else
10967 {
10968 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10969 }
10970
10971 u32 *digest = (u32 *) hash_buf->digest;
10972
10973 salt_t *salt = hash_buf->salt;
10974
10975 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10976 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10977 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10978 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10979
10980 digest[0] = byte_swap_32 (digest[0]);
10981 digest[1] = byte_swap_32 (digest[1]);
10982 digest[2] = byte_swap_32 (digest[2]);
10983 digest[3] = byte_swap_32 (digest[3]);
10984
10985 digest[0] -= MD5M_A;
10986 digest[1] -= MD5M_B;
10987 digest[2] -= MD5M_C;
10988 digest[3] -= MD5M_D;
10989
10990 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10991
10992 uint salt_len = input_len - 32 - 1;
10993
10994 char *salt_buf = input_buf + 32 + 1;
10995
10996 char *salt_buf_ptr = (char *) salt->salt_buf;
10997
10998 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10999
11000 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11001
11002 salt->salt_len = salt_len;
11003
11004 return (PARSER_OK);
11005 }
11006
11007 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11008 {
11009 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
11010
11011 u32 *digest = (u32 *) hash_buf->digest;
11012
11013 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11014 | itoa64_to_int (input_buf[ 1]) << 6
11015 | itoa64_to_int (input_buf[ 2]) << 12
11016 | itoa64_to_int (input_buf[ 3]) << 18;
11017 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11018 | itoa64_to_int (input_buf[ 5]) << 6
11019 | itoa64_to_int (input_buf[ 6]) << 12
11020 | itoa64_to_int (input_buf[ 7]) << 18;
11021 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11022 | itoa64_to_int (input_buf[ 9]) << 6
11023 | itoa64_to_int (input_buf[10]) << 12
11024 | itoa64_to_int (input_buf[11]) << 18;
11025 digest[3] = itoa64_to_int (input_buf[12]) << 0
11026 | itoa64_to_int (input_buf[13]) << 6
11027 | itoa64_to_int (input_buf[14]) << 12
11028 | itoa64_to_int (input_buf[15]) << 18;
11029
11030 digest[0] -= MD5M_A;
11031 digest[1] -= MD5M_B;
11032 digest[2] -= MD5M_C;
11033 digest[3] -= MD5M_D;
11034
11035 digest[0] &= 0x00ffffff;
11036 digest[1] &= 0x00ffffff;
11037 digest[2] &= 0x00ffffff;
11038 digest[3] &= 0x00ffffff;
11039
11040 return (PARSER_OK);
11041 }
11042
11043 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11044 {
11045 if (data.opts_type & OPTS_TYPE_ST_HEX)
11046 {
11047 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
11048 }
11049 else
11050 {
11051 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
11052 }
11053
11054 u32 *digest = (u32 *) hash_buf->digest;
11055
11056 salt_t *salt = hash_buf->salt;
11057
11058 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
11059 | itoa64_to_int (input_buf[ 1]) << 6
11060 | itoa64_to_int (input_buf[ 2]) << 12
11061 | itoa64_to_int (input_buf[ 3]) << 18;
11062 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
11063 | itoa64_to_int (input_buf[ 5]) << 6
11064 | itoa64_to_int (input_buf[ 6]) << 12
11065 | itoa64_to_int (input_buf[ 7]) << 18;
11066 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
11067 | itoa64_to_int (input_buf[ 9]) << 6
11068 | itoa64_to_int (input_buf[10]) << 12
11069 | itoa64_to_int (input_buf[11]) << 18;
11070 digest[3] = itoa64_to_int (input_buf[12]) << 0
11071 | itoa64_to_int (input_buf[13]) << 6
11072 | itoa64_to_int (input_buf[14]) << 12
11073 | itoa64_to_int (input_buf[15]) << 18;
11074
11075 digest[0] -= MD5M_A;
11076 digest[1] -= MD5M_B;
11077 digest[2] -= MD5M_C;
11078 digest[3] -= MD5M_D;
11079
11080 digest[0] &= 0x00ffffff;
11081 digest[1] &= 0x00ffffff;
11082 digest[2] &= 0x00ffffff;
11083 digest[3] &= 0x00ffffff;
11084
11085 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11086
11087 uint salt_len = input_len - 16 - 1;
11088
11089 char *salt_buf = input_buf + 16 + 1;
11090
11091 char *salt_buf_ptr = (char *) salt->salt_buf;
11092
11093 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11094
11095 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11096
11097 salt->salt_len = salt_len;
11098
11099 return (PARSER_OK);
11100 }
11101
11102 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
11103 {
11104 key[0] = (nthash[0] >> 0);
11105 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
11106 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
11107 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
11108 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
11109 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
11110 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
11111 key[7] = (nthash[6] << 1);
11112
11113 key[0] |= 0x01;
11114 key[1] |= 0x01;
11115 key[2] |= 0x01;
11116 key[3] |= 0x01;
11117 key[4] |= 0x01;
11118 key[5] |= 0x01;
11119 key[6] |= 0x01;
11120 key[7] |= 0x01;
11121 }
11122
11123 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11124 {
11125 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
11126
11127 u32 *digest = (u32 *) hash_buf->digest;
11128
11129 salt_t *salt = hash_buf->salt;
11130
11131 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11132
11133 /**
11134 * parse line
11135 */
11136
11137 char *user_pos = input_buf;
11138
11139 char *unused_pos = strchr (user_pos, ':');
11140
11141 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11142
11143 uint user_len = unused_pos - user_pos;
11144
11145 if (user_len > 60) return (PARSER_SALT_LENGTH);
11146
11147 unused_pos++;
11148
11149 char *domain_pos = strchr (unused_pos, ':');
11150
11151 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11152
11153 uint unused_len = domain_pos - unused_pos;
11154
11155 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11156
11157 domain_pos++;
11158
11159 char *srvchall_pos = strchr (domain_pos, ':');
11160
11161 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11162
11163 uint domain_len = srvchall_pos - domain_pos;
11164
11165 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11166
11167 srvchall_pos++;
11168
11169 char *hash_pos = strchr (srvchall_pos, ':');
11170
11171 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11172
11173 uint srvchall_len = hash_pos - srvchall_pos;
11174
11175 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
11176
11177 hash_pos++;
11178
11179 char *clichall_pos = strchr (hash_pos, ':');
11180
11181 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11182
11183 uint hash_len = clichall_pos - hash_pos;
11184
11185 if (hash_len != 48) return (PARSER_HASH_LENGTH);
11186
11187 clichall_pos++;
11188
11189 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11190
11191 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
11192
11193 /**
11194 * store some data for later use
11195 */
11196
11197 netntlm->user_len = user_len * 2;
11198 netntlm->domain_len = domain_len * 2;
11199 netntlm->srvchall_len = srvchall_len / 2;
11200 netntlm->clichall_len = clichall_len / 2;
11201
11202 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11203 char *chall_ptr = (char *) netntlm->chall_buf;
11204
11205 /**
11206 * handle username and domainname
11207 */
11208
11209 for (uint i = 0; i < user_len; i++)
11210 {
11211 *userdomain_ptr++ = user_pos[i];
11212 *userdomain_ptr++ = 0;
11213 }
11214
11215 for (uint i = 0; i < domain_len; i++)
11216 {
11217 *userdomain_ptr++ = domain_pos[i];
11218 *userdomain_ptr++ = 0;
11219 }
11220
11221 /**
11222 * handle server challenge encoding
11223 */
11224
11225 for (uint i = 0; i < srvchall_len; i += 2)
11226 {
11227 const char p0 = srvchall_pos[i + 0];
11228 const char p1 = srvchall_pos[i + 1];
11229
11230 *chall_ptr++ = hex_convert (p1) << 0
11231 | hex_convert (p0) << 4;
11232 }
11233
11234 /**
11235 * handle client challenge encoding
11236 */
11237
11238 for (uint i = 0; i < clichall_len; i += 2)
11239 {
11240 const char p0 = clichall_pos[i + 0];
11241 const char p1 = clichall_pos[i + 1];
11242
11243 *chall_ptr++ = hex_convert (p1) << 0
11244 | hex_convert (p0) << 4;
11245 }
11246
11247 /**
11248 * store data
11249 */
11250
11251 char *salt_buf_ptr = (char *) salt->salt_buf;
11252
11253 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
11254
11255 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11256
11257 salt->salt_len = salt_len;
11258
11259 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11260 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11261 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11262 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11263
11264 digest[0] = byte_swap_32 (digest[0]);
11265 digest[1] = byte_swap_32 (digest[1]);
11266 digest[2] = byte_swap_32 (digest[2]);
11267 digest[3] = byte_swap_32 (digest[3]);
11268
11269 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
11270
11271 uint digest_tmp[2] = { 0 };
11272
11273 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11274 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
11275
11276 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
11277 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
11278
11279 /* special case 2: ESS */
11280
11281 if (srvchall_len == 48)
11282 {
11283 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
11284 {
11285 uint w[16] = { 0 };
11286
11287 w[ 0] = netntlm->chall_buf[6];
11288 w[ 1] = netntlm->chall_buf[7];
11289 w[ 2] = netntlm->chall_buf[0];
11290 w[ 3] = netntlm->chall_buf[1];
11291 w[ 4] = 0x80;
11292 w[14] = 16 * 8;
11293
11294 uint dgst[4] = { 0 };
11295
11296 dgst[0] = MAGIC_A;
11297 dgst[1] = MAGIC_B;
11298 dgst[2] = MAGIC_C;
11299 dgst[3] = MAGIC_D;
11300
11301 md5_64 (w, dgst);
11302
11303 salt->salt_buf[0] = dgst[0];
11304 salt->salt_buf[1] = dgst[1];
11305 }
11306 }
11307
11308 /* precompute netntlmv1 exploit start */
11309
11310 for (uint i = 0; i < 0x10000; i++)
11311 {
11312 uint key_md4[2] = { i, 0 };
11313 uint key_des[2] = { 0, 0 };
11314
11315 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
11316
11317 uint Kc[16] = { 0 };
11318 uint Kd[16] = { 0 };
11319
11320 _des_keysetup (key_des, Kc, Kd, c_skb);
11321
11322 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
11323
11324 _des_encrypt (data3, Kc, Kd, c_SPtrans);
11325
11326 if (data3[0] != digest_tmp[0]) continue;
11327 if (data3[1] != digest_tmp[1]) continue;
11328
11329 salt->salt_buf[2] = i;
11330
11331 salt->salt_len = 24;
11332
11333 break;
11334 }
11335
11336 salt->salt_buf_pc[0] = digest_tmp[0];
11337 salt->salt_buf_pc[1] = digest_tmp[1];
11338
11339 /* precompute netntlmv1 exploit stop */
11340
11341 u32 tt;
11342
11343 IP (digest[0], digest[1], tt);
11344 IP (digest[2], digest[3], tt);
11345
11346 digest[0] = rotr32 (digest[0], 29);
11347 digest[1] = rotr32 (digest[1], 29);
11348 digest[2] = rotr32 (digest[2], 29);
11349 digest[3] = rotr32 (digest[3], 29);
11350
11351 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
11352
11353 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
11354 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
11355
11356 return (PARSER_OK);
11357 }
11358
11359 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11360 {
11361 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
11362
11363 u32 *digest = (u32 *) hash_buf->digest;
11364
11365 salt_t *salt = hash_buf->salt;
11366
11367 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11368
11369 /**
11370 * parse line
11371 */
11372
11373 char *user_pos = input_buf;
11374
11375 char *unused_pos = strchr (user_pos, ':');
11376
11377 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11378
11379 uint user_len = unused_pos - user_pos;
11380
11381 if (user_len > 60) return (PARSER_SALT_LENGTH);
11382
11383 unused_pos++;
11384
11385 char *domain_pos = strchr (unused_pos, ':');
11386
11387 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11388
11389 uint unused_len = domain_pos - unused_pos;
11390
11391 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11392
11393 domain_pos++;
11394
11395 char *srvchall_pos = strchr (domain_pos, ':');
11396
11397 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11398
11399 uint domain_len = srvchall_pos - domain_pos;
11400
11401 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11402
11403 srvchall_pos++;
11404
11405 char *hash_pos = strchr (srvchall_pos, ':');
11406
11407 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11408
11409 uint srvchall_len = hash_pos - srvchall_pos;
11410
11411 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
11412
11413 hash_pos++;
11414
11415 char *clichall_pos = strchr (hash_pos, ':');
11416
11417 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11418
11419 uint hash_len = clichall_pos - hash_pos;
11420
11421 if (hash_len != 32) return (PARSER_HASH_LENGTH);
11422
11423 clichall_pos++;
11424
11425 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11426
11427 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
11428
11429 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11430
11431 /**
11432 * store some data for later use
11433 */
11434
11435 netntlm->user_len = user_len * 2;
11436 netntlm->domain_len = domain_len * 2;
11437 netntlm->srvchall_len = srvchall_len / 2;
11438 netntlm->clichall_len = clichall_len / 2;
11439
11440 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11441 char *chall_ptr = (char *) netntlm->chall_buf;
11442
11443 /**
11444 * handle username and domainname
11445 */
11446
11447 for (uint i = 0; i < user_len; i++)
11448 {
11449 *userdomain_ptr++ = toupper (user_pos[i]);
11450 *userdomain_ptr++ = 0;
11451 }
11452
11453 for (uint i = 0; i < domain_len; i++)
11454 {
11455 *userdomain_ptr++ = domain_pos[i];
11456 *userdomain_ptr++ = 0;
11457 }
11458
11459 *userdomain_ptr++ = 0x80;
11460
11461 /**
11462 * handle server challenge encoding
11463 */
11464
11465 for (uint i = 0; i < srvchall_len; i += 2)
11466 {
11467 const char p0 = srvchall_pos[i + 0];
11468 const char p1 = srvchall_pos[i + 1];
11469
11470 *chall_ptr++ = hex_convert (p1) << 0
11471 | hex_convert (p0) << 4;
11472 }
11473
11474 /**
11475 * handle client challenge encoding
11476 */
11477
11478 for (uint i = 0; i < clichall_len; i += 2)
11479 {
11480 const char p0 = clichall_pos[i + 0];
11481 const char p1 = clichall_pos[i + 1];
11482
11483 *chall_ptr++ = hex_convert (p1) << 0
11484 | hex_convert (p0) << 4;
11485 }
11486
11487 *chall_ptr++ = 0x80;
11488
11489 /**
11490 * handle hash itself
11491 */
11492
11493 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11494 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11495 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11496 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11497
11498 digest[0] = byte_swap_32 (digest[0]);
11499 digest[1] = byte_swap_32 (digest[1]);
11500 digest[2] = byte_swap_32 (digest[2]);
11501 digest[3] = byte_swap_32 (digest[3]);
11502
11503 /**
11504 * reuse challange data as salt_buf, its the buffer that is most likely unique
11505 */
11506
11507 salt->salt_buf[0] = 0;
11508 salt->salt_buf[1] = 0;
11509 salt->salt_buf[2] = 0;
11510 salt->salt_buf[3] = 0;
11511 salt->salt_buf[4] = 0;
11512 salt->salt_buf[5] = 0;
11513 salt->salt_buf[6] = 0;
11514 salt->salt_buf[7] = 0;
11515
11516 uint *uptr;
11517
11518 uptr = (uint *) netntlm->userdomain_buf;
11519
11520 for (uint i = 0; i < 16; i += 16)
11521 {
11522 md5_64 (uptr, salt->salt_buf);
11523 }
11524
11525 uptr = (uint *) netntlm->chall_buf;
11526
11527 for (uint i = 0; i < 256; i += 16)
11528 {
11529 md5_64 (uptr, salt->salt_buf);
11530 }
11531
11532 salt->salt_len = 16;
11533
11534 return (PARSER_OK);
11535 }
11536
11537 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11538 {
11539 if (data.opts_type & OPTS_TYPE_ST_HEX)
11540 {
11541 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11542 }
11543 else
11544 {
11545 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11546 }
11547
11548 u32 *digest = (u32 *) hash_buf->digest;
11549
11550 salt_t *salt = hash_buf->salt;
11551
11552 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11553 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11554 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11555 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11556
11557 digest[0] = byte_swap_32 (digest[0]);
11558 digest[1] = byte_swap_32 (digest[1]);
11559 digest[2] = byte_swap_32 (digest[2]);
11560 digest[3] = byte_swap_32 (digest[3]);
11561
11562 digest[0] -= MD5M_A;
11563 digest[1] -= MD5M_B;
11564 digest[2] -= MD5M_C;
11565 digest[3] -= MD5M_D;
11566
11567 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11568
11569 uint salt_len = input_len - 32 - 1;
11570
11571 char *salt_buf = input_buf + 32 + 1;
11572
11573 char *salt_buf_ptr = (char *) salt->salt_buf;
11574
11575 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11576
11577 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11578
11579 salt->salt_len = salt_len;
11580
11581 return (PARSER_OK);
11582 }
11583
11584 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11585 {
11586 if (data.opts_type & OPTS_TYPE_ST_HEX)
11587 {
11588 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11589 }
11590 else
11591 {
11592 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11593 }
11594
11595 u32 *digest = (u32 *) hash_buf->digest;
11596
11597 salt_t *salt = hash_buf->salt;
11598
11599 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11600 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11601 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11602 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11603
11604 digest[0] = byte_swap_32 (digest[0]);
11605 digest[1] = byte_swap_32 (digest[1]);
11606 digest[2] = byte_swap_32 (digest[2]);
11607 digest[3] = byte_swap_32 (digest[3]);
11608
11609 digest[0] -= MD5M_A;
11610 digest[1] -= MD5M_B;
11611 digest[2] -= MD5M_C;
11612 digest[3] -= MD5M_D;
11613
11614 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11615
11616 uint salt_len = input_len - 32 - 1;
11617
11618 char *salt_buf = input_buf + 32 + 1;
11619
11620 char *salt_buf_ptr = (char *) salt->salt_buf;
11621
11622 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11623
11624 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11625
11626 salt->salt_len = salt_len;
11627
11628 return (PARSER_OK);
11629 }
11630
11631 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11632 {
11633 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11634
11635 u32 *digest = (u32 *) hash_buf->digest;
11636
11637 salt_t *salt = hash_buf->salt;
11638
11639 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11640 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11641 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11642 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11643
11644 digest[0] = byte_swap_32 (digest[0]);
11645 digest[1] = byte_swap_32 (digest[1]);
11646 digest[2] = byte_swap_32 (digest[2]);
11647 digest[3] = byte_swap_32 (digest[3]);
11648
11649 digest[0] -= MD5M_A;
11650 digest[1] -= MD5M_B;
11651 digest[2] -= MD5M_C;
11652 digest[3] -= MD5M_D;
11653
11654 /**
11655 * This is a virtual salt. While the algorithm is basically not salted
11656 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11657 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11658 */
11659
11660 char *salt_buf_ptr = (char *) salt->salt_buf;
11661
11662 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11663
11664 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11665
11666 salt->salt_len = salt_len;
11667
11668 return (PARSER_OK);
11669 }
11670
11671 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11672 {
11673 if (data.opts_type & OPTS_TYPE_ST_HEX)
11674 {
11675 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11676 }
11677 else
11678 {
11679 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11680 }
11681
11682 u32 *digest = (u32 *) hash_buf->digest;
11683
11684 salt_t *salt = hash_buf->salt;
11685
11686 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11687 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11688 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11689 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11690
11691 digest[0] = byte_swap_32 (digest[0]);
11692 digest[1] = byte_swap_32 (digest[1]);
11693 digest[2] = byte_swap_32 (digest[2]);
11694 digest[3] = byte_swap_32 (digest[3]);
11695
11696 digest[0] -= MD5M_A;
11697 digest[1] -= MD5M_B;
11698 digest[2] -= MD5M_C;
11699 digest[3] -= MD5M_D;
11700
11701 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11702
11703 uint salt_len = input_len - 32 - 1;
11704
11705 char *salt_buf = input_buf + 32 + 1;
11706
11707 char *salt_buf_ptr = (char *) salt->salt_buf;
11708
11709 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11710
11711 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11712
11713 salt->salt_len = salt_len;
11714
11715 return (PARSER_OK);
11716 }
11717
11718 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11719 {
11720 if (data.opts_type & OPTS_TYPE_ST_HEX)
11721 {
11722 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11723 }
11724 else
11725 {
11726 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11727 }
11728
11729 u32 *digest = (u32 *) hash_buf->digest;
11730
11731 salt_t *salt = hash_buf->salt;
11732
11733 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11734 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11735 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11736 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11737
11738 digest[0] = byte_swap_32 (digest[0]);
11739 digest[1] = byte_swap_32 (digest[1]);
11740 digest[2] = byte_swap_32 (digest[2]);
11741 digest[3] = byte_swap_32 (digest[3]);
11742
11743 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11744
11745 uint salt_len = input_len - 32 - 1;
11746
11747 char *salt_buf = input_buf + 32 + 1;
11748
11749 char *salt_buf_ptr = (char *) salt->salt_buf;
11750
11751 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11752
11753 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11754
11755 salt->salt_len = salt_len;
11756
11757 return (PARSER_OK);
11758 }
11759
11760 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11761 {
11762 if (data.opts_type & OPTS_TYPE_ST_HEX)
11763 {
11764 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11765 }
11766 else
11767 {
11768 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11769 }
11770
11771 u32 *digest = (u32 *) hash_buf->digest;
11772
11773 salt_t *salt = hash_buf->salt;
11774
11775 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11776 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11777 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11778 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11779
11780 digest[0] = byte_swap_32 (digest[0]);
11781 digest[1] = byte_swap_32 (digest[1]);
11782 digest[2] = byte_swap_32 (digest[2]);
11783 digest[3] = byte_swap_32 (digest[3]);
11784
11785 digest[0] -= MD4M_A;
11786 digest[1] -= MD4M_B;
11787 digest[2] -= MD4M_C;
11788 digest[3] -= MD4M_D;
11789
11790 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11791
11792 uint salt_len = input_len - 32 - 1;
11793
11794 char *salt_buf = input_buf + 32 + 1;
11795
11796 char *salt_buf_ptr = (char *) salt->salt_buf;
11797
11798 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11799
11800 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11801
11802 salt->salt_len = salt_len;
11803
11804 return (PARSER_OK);
11805 }
11806
11807 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11808 {
11809 if (data.opts_type & OPTS_TYPE_ST_HEX)
11810 {
11811 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11812 }
11813 else
11814 {
11815 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11816 }
11817
11818 u32 *digest = (u32 *) hash_buf->digest;
11819
11820 salt_t *salt = hash_buf->salt;
11821
11822 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11823 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11824 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11825 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11826
11827 digest[0] = byte_swap_32 (digest[0]);
11828 digest[1] = byte_swap_32 (digest[1]);
11829 digest[2] = byte_swap_32 (digest[2]);
11830 digest[3] = byte_swap_32 (digest[3]);
11831
11832 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11833
11834 uint salt_len = input_len - 32 - 1;
11835
11836 char *salt_buf = input_buf + 32 + 1;
11837
11838 uint salt_pc_block[16] = { 0 };
11839
11840 char *salt_pc_block_ptr = (char *) salt_pc_block;
11841
11842 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11843
11844 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11845
11846 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11847
11848 salt_pc_block[14] = salt_len * 8;
11849
11850 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11851
11852 md5_64 (salt_pc_block, salt_pc_digest);
11853
11854 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11855 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11856 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11857 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11858
11859 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11860
11861 memcpy (salt_buf_ptr, salt_buf, salt_len);
11862
11863 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11864
11865 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11866 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11867 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11868 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11869
11870 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11871
11872 return (PARSER_OK);
11873 }
11874
11875 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11876 {
11877 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11878
11879 u32 *digest = (u32 *) hash_buf->digest;
11880
11881 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11882 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11883 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11884 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11885 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11886
11887 digest[0] -= SHA1M_A;
11888 digest[1] -= SHA1M_B;
11889 digest[2] -= SHA1M_C;
11890 digest[3] -= SHA1M_D;
11891 digest[4] -= SHA1M_E;
11892
11893 return (PARSER_OK);
11894 }
11895
11896 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11897 {
11898 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11899
11900 u32 *digest = (u32 *) hash_buf->digest;
11901
11902 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11903 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11904 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11905 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11906 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11907
11908 return (PARSER_OK);
11909 }
11910
11911 int sha1axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11912 {
11913 if ((input_len < DISPLAY_LEN_MIN_13300) || (input_len > DISPLAY_LEN_MAX_13300)) return (PARSER_GLOBAL_LENGTH);
11914
11915 if (memcmp (SIGNATURE_AXCRYPT_SHA1, input_buf, 13)) return (PARSER_SIGNATURE_UNMATCHED);
11916
11917 u32 *digest = (u32 *) hash_buf->digest;
11918
11919 input_buf +=14;
11920
11921 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11922 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11923 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11924 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11925 digest[4] = 0x00000000;
11926
11927 return (PARSER_OK);
11928 }
11929
11930 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11931 {
11932 if (data.opts_type & OPTS_TYPE_ST_HEX)
11933 {
11934 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11935 }
11936 else
11937 {
11938 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11939 }
11940
11941 u32 *digest = (u32 *) hash_buf->digest;
11942
11943 salt_t *salt = hash_buf->salt;
11944
11945 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11946 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11947 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11948 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11949 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11950
11951 digest[0] -= SHA1M_A;
11952 digest[1] -= SHA1M_B;
11953 digest[2] -= SHA1M_C;
11954 digest[3] -= SHA1M_D;
11955 digest[4] -= SHA1M_E;
11956
11957 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11958
11959 uint salt_len = input_len - 40 - 1;
11960
11961 char *salt_buf = input_buf + 40 + 1;
11962
11963 char *salt_buf_ptr = (char *) salt->salt_buf;
11964
11965 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11966
11967 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11968
11969 salt->salt_len = salt_len;
11970
11971 return (PARSER_OK);
11972 }
11973
11974 int pstoken_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11975 {
11976 if ((input_len < DISPLAY_LEN_MIN_13500) || (input_len > DISPLAY_LEN_MAX_13500)) return (PARSER_GLOBAL_LENGTH);
11977
11978 u32 *digest = (u32 *) hash_buf->digest;
11979
11980 salt_t *salt = hash_buf->salt;
11981
11982 pstoken_t *pstoken = (pstoken_t *) hash_buf->esalt;
11983
11984 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11985 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11986 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11987 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11988 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11989
11990 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11991
11992 uint salt_len = input_len - 40 - 1;
11993
11994 char *salt_buf = input_buf + 40 + 1;
11995
11996 if (salt_len == UINT_MAX || salt_len % 2 != 0) return (PARSER_SALT_LENGTH);
11997
11998 u8 *pstoken_ptr = (u8 *) pstoken->salt_buf;
11999
12000 for (uint i = 0, j = 0; i < salt_len; i += 2, j += 1)
12001 {
12002 pstoken_ptr[j] = hex_to_u8 ((const u8 *) &salt_buf[i]);
12003 }
12004
12005 pstoken->salt_len = salt_len / 2;
12006
12007 /* some fake salt for the sorting mechanisms */
12008
12009 salt->salt_buf[0] = pstoken->salt_buf[0];
12010 salt->salt_buf[1] = pstoken->salt_buf[1];
12011 salt->salt_buf[2] = pstoken->salt_buf[2];
12012 salt->salt_buf[3] = pstoken->salt_buf[3];
12013 salt->salt_buf[4] = pstoken->salt_buf[4];
12014 salt->salt_buf[5] = pstoken->salt_buf[5];
12015 salt->salt_buf[6] = pstoken->salt_buf[6];
12016 salt->salt_buf[7] = pstoken->salt_buf[7];
12017
12018 salt->salt_len = 32;
12019
12020 /* we need to check if we can precompute some of the data --
12021 this is possible since the scheme is badly designed */
12022
12023 pstoken->pc_digest[0] = SHA1M_A;
12024 pstoken->pc_digest[1] = SHA1M_B;
12025 pstoken->pc_digest[2] = SHA1M_C;
12026 pstoken->pc_digest[3] = SHA1M_D;
12027 pstoken->pc_digest[4] = SHA1M_E;
12028
12029 pstoken->pc_offset = 0;
12030
12031 for (int i = 0; i < (int) pstoken->salt_len - 64; i += 64)
12032 {
12033 uint w[16];
12034
12035 w[ 0] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 0]);
12036 w[ 1] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 1]);
12037 w[ 2] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 2]);
12038 w[ 3] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 3]);
12039 w[ 4] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 4]);
12040 w[ 5] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 5]);
12041 w[ 6] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 6]);
12042 w[ 7] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 7]);
12043 w[ 8] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 8]);
12044 w[ 9] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 9]);
12045 w[10] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 10]);
12046 w[11] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 11]);
12047 w[12] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 12]);
12048 w[13] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 13]);
12049 w[14] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 14]);
12050 w[15] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 15]);
12051
12052 sha1_64 (w, pstoken->pc_digest);
12053
12054 pstoken->pc_offset += 16;
12055 }
12056
12057 return (PARSER_OK);
12058 }
12059
12060 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12061 {
12062 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
12063
12064 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
12065
12066 u32 *digest = (u32 *) hash_buf->digest;
12067
12068 u8 tmp_buf[100] = { 0 };
12069
12070 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
12071
12072 memcpy (digest, tmp_buf, 20);
12073
12074 digest[0] = byte_swap_32 (digest[0]);
12075 digest[1] = byte_swap_32 (digest[1]);
12076 digest[2] = byte_swap_32 (digest[2]);
12077 digest[3] = byte_swap_32 (digest[3]);
12078 digest[4] = byte_swap_32 (digest[4]);
12079
12080 digest[0] -= SHA1M_A;
12081 digest[1] -= SHA1M_B;
12082 digest[2] -= SHA1M_C;
12083 digest[3] -= SHA1M_D;
12084 digest[4] -= SHA1M_E;
12085
12086 return (PARSER_OK);
12087 }
12088
12089 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12090 {
12091 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
12092
12093 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12094
12095 u32 *digest = (u32 *) hash_buf->digest;
12096
12097 salt_t *salt = hash_buf->salt;
12098
12099 u8 tmp_buf[100] = { 0 };
12100
12101 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
12102
12103 if (tmp_len < 20) return (PARSER_HASH_LENGTH);
12104
12105 memcpy (digest, tmp_buf, 20);
12106
12107 int salt_len = tmp_len - 20;
12108
12109 if (salt_len < 0) return (PARSER_SALT_LENGTH);
12110
12111 salt->salt_len = salt_len;
12112
12113 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
12114
12115 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12116 {
12117 char *ptr = (char *) salt->salt_buf;
12118
12119 ptr[salt->salt_len] = 0x80;
12120 }
12121
12122 digest[0] = byte_swap_32 (digest[0]);
12123 digest[1] = byte_swap_32 (digest[1]);
12124 digest[2] = byte_swap_32 (digest[2]);
12125 digest[3] = byte_swap_32 (digest[3]);
12126 digest[4] = byte_swap_32 (digest[4]);
12127
12128 digest[0] -= SHA1M_A;
12129 digest[1] -= SHA1M_B;
12130 digest[2] -= SHA1M_C;
12131 digest[3] -= SHA1M_D;
12132 digest[4] -= SHA1M_E;
12133
12134 return (PARSER_OK);
12135 }
12136
12137 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12138 {
12139 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
12140
12141 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12142
12143 u32 *digest = (u32 *) hash_buf->digest;
12144
12145 salt_t *salt = hash_buf->salt;
12146
12147 char *salt_buf = input_buf + 6;
12148
12149 uint salt_len = 8;
12150
12151 char *salt_buf_ptr = (char *) salt->salt_buf;
12152
12153 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12154
12155 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12156
12157 salt->salt_len = salt_len;
12158
12159 char *hash_pos = input_buf + 6 + 8 + 40;
12160
12161 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12162 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12163 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12164 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12165 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12166
12167 digest[0] -= SHA1M_A;
12168 digest[1] -= SHA1M_B;
12169 digest[2] -= SHA1M_C;
12170 digest[3] -= SHA1M_D;
12171 digest[4] -= SHA1M_E;
12172
12173 return (PARSER_OK);
12174 }
12175
12176 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12177 {
12178 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
12179
12180 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12181
12182 u32 *digest = (u32 *) hash_buf->digest;
12183
12184 salt_t *salt = hash_buf->salt;
12185
12186 char *salt_buf = input_buf + 6;
12187
12188 uint salt_len = 8;
12189
12190 char *salt_buf_ptr = (char *) salt->salt_buf;
12191
12192 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12193
12194 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12195
12196 salt->salt_len = salt_len;
12197
12198 char *hash_pos = input_buf + 6 + 8;
12199
12200 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12201 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12202 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12203 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12204 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12205
12206 digest[0] -= SHA1M_A;
12207 digest[1] -= SHA1M_B;
12208 digest[2] -= SHA1M_C;
12209 digest[3] -= SHA1M_D;
12210 digest[4] -= SHA1M_E;
12211
12212 return (PARSER_OK);
12213 }
12214
12215 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12216 {
12217 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
12218
12219 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12220
12221 u64 *digest = (u64 *) hash_buf->digest;
12222
12223 salt_t *salt = hash_buf->salt;
12224
12225 char *salt_buf = input_buf + 6;
12226
12227 uint salt_len = 8;
12228
12229 char *salt_buf_ptr = (char *) salt->salt_buf;
12230
12231 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12232
12233 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12234
12235 salt->salt_len = salt_len;
12236
12237 char *hash_pos = input_buf + 6 + 8;
12238
12239 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12240 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12241 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12242 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12243 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12244 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12245 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12246 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12247
12248 digest[0] -= SHA512M_A;
12249 digest[1] -= SHA512M_B;
12250 digest[2] -= SHA512M_C;
12251 digest[3] -= SHA512M_D;
12252 digest[4] -= SHA512M_E;
12253 digest[5] -= SHA512M_F;
12254 digest[6] -= SHA512M_G;
12255 digest[7] -= SHA512M_H;
12256
12257 return (PARSER_OK);
12258 }
12259
12260 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12261 {
12262 if (data.opts_type & OPTS_TYPE_ST_HEX)
12263 {
12264 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
12265 }
12266 else
12267 {
12268 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
12269 }
12270
12271 u32 *digest = (u32 *) hash_buf->digest;
12272
12273 salt_t *salt = hash_buf->salt;
12274
12275 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12276 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12277 digest[2] = 0;
12278 digest[3] = 0;
12279
12280 digest[0] = byte_swap_32 (digest[0]);
12281 digest[1] = byte_swap_32 (digest[1]);
12282
12283 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12284
12285 uint salt_len = input_len - 16 - 1;
12286
12287 char *salt_buf = input_buf + 16 + 1;
12288
12289 char *salt_buf_ptr = (char *) salt->salt_buf;
12290
12291 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12292
12293 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12294
12295 salt->salt_len = salt_len;
12296
12297 return (PARSER_OK);
12298 }
12299
12300 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12301 {
12302 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
12303
12304 u32 *digest = (u32 *) hash_buf->digest;
12305
12306 salt_t *salt = hash_buf->salt;
12307
12308 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12309 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12310 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12311 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12312 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12313
12314 digest[0] -= SHA1M_A;
12315 digest[1] -= SHA1M_B;
12316 digest[2] -= SHA1M_C;
12317 digest[3] -= SHA1M_D;
12318 digest[4] -= SHA1M_E;
12319
12320 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12321
12322 uint salt_len = input_len - 40 - 1;
12323
12324 char *salt_buf = input_buf + 40 + 1;
12325
12326 char *salt_buf_ptr = (char *) salt->salt_buf;
12327
12328 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12329
12330 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12331
12332 salt->salt_len = salt_len;
12333
12334 return (PARSER_OK);
12335 }
12336
12337 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12338 {
12339 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
12340
12341 u32 *digest = (u32 *) hash_buf->digest;
12342
12343 salt_t *salt = hash_buf->salt;
12344
12345 char *hash_pos = input_buf;
12346
12347 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12348 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12349 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
12350 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
12351 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
12352 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
12353 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
12354 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
12355 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
12356 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
12357 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
12358 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
12359 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
12360 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
12361 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
12362 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
12363
12364 char *salt_pos = input_buf + 128;
12365
12366 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12367 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12368 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12369 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12370
12371 salt->salt_iter = ROUNDS_ORACLET - 1;
12372 salt->salt_len = 16;
12373
12374 return (PARSER_OK);
12375 }
12376
12377 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12378 {
12379 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
12380
12381 u32 *digest = (u32 *) hash_buf->digest;
12382
12383 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12384 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12385 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12386 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12387 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12388 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12389 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12390 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12391
12392 digest[0] -= SHA256M_A;
12393 digest[1] -= SHA256M_B;
12394 digest[2] -= SHA256M_C;
12395 digest[3] -= SHA256M_D;
12396 digest[4] -= SHA256M_E;
12397 digest[5] -= SHA256M_F;
12398 digest[6] -= SHA256M_G;
12399 digest[7] -= SHA256M_H;
12400
12401 return (PARSER_OK);
12402 }
12403
12404 int sha256s_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_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
12409 }
12410 else
12411 {
12412 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) 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] = hex_to_u32 ((const u8 *) &input_buf[16]);
12422 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12423 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12424 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12425 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12426 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12427
12428 digest[0] -= SHA256M_A;
12429 digest[1] -= SHA256M_B;
12430 digest[2] -= SHA256M_C;
12431 digest[3] -= SHA256M_D;
12432 digest[4] -= SHA256M_E;
12433 digest[5] -= SHA256M_F;
12434 digest[6] -= SHA256M_G;
12435 digest[7] -= SHA256M_H;
12436
12437 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12438
12439 uint salt_len = input_len - 64 - 1;
12440
12441 char *salt_buf = input_buf + 64 + 1;
12442
12443 char *salt_buf_ptr = (char *) salt->salt_buf;
12444
12445 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12446
12447 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12448
12449 salt->salt_len = salt_len;
12450
12451 return (PARSER_OK);
12452 }
12453
12454 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12455 {
12456 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
12457
12458 u64 *digest = (u64 *) hash_buf->digest;
12459
12460 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12461 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12462 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12463 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12464 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12465 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12466 digest[6] = 0;
12467 digest[7] = 0;
12468
12469 digest[0] -= SHA384M_A;
12470 digest[1] -= SHA384M_B;
12471 digest[2] -= SHA384M_C;
12472 digest[3] -= SHA384M_D;
12473 digest[4] -= SHA384M_E;
12474 digest[5] -= SHA384M_F;
12475 digest[6] -= 0;
12476 digest[7] -= 0;
12477
12478 return (PARSER_OK);
12479 }
12480
12481 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12482 {
12483 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
12484
12485 u64 *digest = (u64 *) hash_buf->digest;
12486
12487 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12488 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12489 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12490 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12491 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12492 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12493 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12494 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12495
12496 digest[0] -= SHA512M_A;
12497 digest[1] -= SHA512M_B;
12498 digest[2] -= SHA512M_C;
12499 digest[3] -= SHA512M_D;
12500 digest[4] -= SHA512M_E;
12501 digest[5] -= SHA512M_F;
12502 digest[6] -= SHA512M_G;
12503 digest[7] -= SHA512M_H;
12504
12505 return (PARSER_OK);
12506 }
12507
12508 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12509 {
12510 if (data.opts_type & OPTS_TYPE_ST_HEX)
12511 {
12512 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
12513 }
12514 else
12515 {
12516 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
12517 }
12518
12519 u64 *digest = (u64 *) hash_buf->digest;
12520
12521 salt_t *salt = hash_buf->salt;
12522
12523 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12524 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12525 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12526 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12527 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12528 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12529 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12530 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12531
12532 digest[0] -= SHA512M_A;
12533 digest[1] -= SHA512M_B;
12534 digest[2] -= SHA512M_C;
12535 digest[3] -= SHA512M_D;
12536 digest[4] -= SHA512M_E;
12537 digest[5] -= SHA512M_F;
12538 digest[6] -= SHA512M_G;
12539 digest[7] -= SHA512M_H;
12540
12541 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12542
12543 uint salt_len = input_len - 128 - 1;
12544
12545 char *salt_buf = input_buf + 128 + 1;
12546
12547 char *salt_buf_ptr = (char *) salt->salt_buf;
12548
12549 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12550
12551 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12552
12553 salt->salt_len = salt_len;
12554
12555 return (PARSER_OK);
12556 }
12557
12558 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12559 {
12560 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12561
12562 u64 *digest = (u64 *) hash_buf->digest;
12563
12564 salt_t *salt = hash_buf->salt;
12565
12566 char *salt_pos = input_buf + 3;
12567
12568 uint iterations_len = 0;
12569
12570 if (memcmp (salt_pos, "rounds=", 7) == 0)
12571 {
12572 salt_pos += 7;
12573
12574 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12575
12576 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12577 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12578
12579 salt_pos[0] = 0x0;
12580
12581 salt->salt_iter = atoi (salt_pos - iterations_len);
12582
12583 salt_pos += 1;
12584
12585 iterations_len += 8;
12586 }
12587 else
12588 {
12589 salt->salt_iter = ROUNDS_SHA512CRYPT;
12590 }
12591
12592 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12593
12594 char *hash_pos = strchr (salt_pos, '$');
12595
12596 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12597
12598 uint salt_len = hash_pos - salt_pos;
12599
12600 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12601
12602 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12603
12604 salt->salt_len = salt_len;
12605
12606 hash_pos++;
12607
12608 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12609
12610 return (PARSER_OK);
12611 }
12612
12613 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12614 {
12615 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12616
12617 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12618
12619 u64 *digest = (u64 *) hash_buf->digest;
12620
12621 salt_t *salt = hash_buf->salt;
12622
12623 uint keccak_mdlen = input_len / 2;
12624
12625 for (uint i = 0; i < keccak_mdlen / 8; i++)
12626 {
12627 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12628
12629 digest[i] = byte_swap_64 (digest[i]);
12630 }
12631
12632 salt->keccak_mdlen = keccak_mdlen;
12633
12634 return (PARSER_OK);
12635 }
12636
12637 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12638 {
12639 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12640
12641 u32 *digest = (u32 *) hash_buf->digest;
12642
12643 salt_t *salt = hash_buf->salt;
12644
12645 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12646
12647 /**
12648 * Parse that strange long line
12649 */
12650
12651 char *in_off[9];
12652
12653 size_t in_len[9] = { 0 };
12654
12655 in_off[0] = strtok (input_buf, ":");
12656
12657 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12658
12659 in_len[0] = strlen (in_off[0]);
12660
12661 size_t i;
12662
12663 for (i = 1; i < 9; i++)
12664 {
12665 in_off[i] = strtok (NULL, ":");
12666
12667 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12668
12669 in_len[i] = strlen (in_off[i]);
12670 }
12671
12672 char *ptr = (char *) ikepsk->msg_buf;
12673
12674 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12675 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12676 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12677 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12678 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12679 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12680
12681 *ptr = 0x80;
12682
12683 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12684
12685 ptr = (char *) ikepsk->nr_buf;
12686
12687 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12688 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12689
12690 *ptr = 0x80;
12691
12692 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12693
12694 /**
12695 * Store to database
12696 */
12697
12698 ptr = in_off[8];
12699
12700 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12701 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12702 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12703 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12704
12705 digest[0] = byte_swap_32 (digest[0]);
12706 digest[1] = byte_swap_32 (digest[1]);
12707 digest[2] = byte_swap_32 (digest[2]);
12708 digest[3] = byte_swap_32 (digest[3]);
12709
12710 salt->salt_len = 32;
12711
12712 salt->salt_buf[0] = ikepsk->nr_buf[0];
12713 salt->salt_buf[1] = ikepsk->nr_buf[1];
12714 salt->salt_buf[2] = ikepsk->nr_buf[2];
12715 salt->salt_buf[3] = ikepsk->nr_buf[3];
12716 salt->salt_buf[4] = ikepsk->nr_buf[4];
12717 salt->salt_buf[5] = ikepsk->nr_buf[5];
12718 salt->salt_buf[6] = ikepsk->nr_buf[6];
12719 salt->salt_buf[7] = ikepsk->nr_buf[7];
12720
12721 return (PARSER_OK);
12722 }
12723
12724 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12725 {
12726 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12727
12728 u32 *digest = (u32 *) hash_buf->digest;
12729
12730 salt_t *salt = hash_buf->salt;
12731
12732 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12733
12734 /**
12735 * Parse that strange long line
12736 */
12737
12738 char *in_off[9];
12739
12740 size_t in_len[9] = { 0 };
12741
12742 in_off[0] = strtok (input_buf, ":");
12743
12744 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12745
12746 in_len[0] = strlen (in_off[0]);
12747
12748 size_t i;
12749
12750 for (i = 1; i < 9; i++)
12751 {
12752 in_off[i] = strtok (NULL, ":");
12753
12754 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12755
12756 in_len[i] = strlen (in_off[i]);
12757 }
12758
12759 char *ptr = (char *) ikepsk->msg_buf;
12760
12761 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12762 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12763 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12764 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12765 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12766 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12767
12768 *ptr = 0x80;
12769
12770 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12771
12772 ptr = (char *) ikepsk->nr_buf;
12773
12774 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12775 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12776
12777 *ptr = 0x80;
12778
12779 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12780
12781 /**
12782 * Store to database
12783 */
12784
12785 ptr = in_off[8];
12786
12787 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12788 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12789 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12790 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12791 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12792
12793 salt->salt_len = 32;
12794
12795 salt->salt_buf[0] = ikepsk->nr_buf[0];
12796 salt->salt_buf[1] = ikepsk->nr_buf[1];
12797 salt->salt_buf[2] = ikepsk->nr_buf[2];
12798 salt->salt_buf[3] = ikepsk->nr_buf[3];
12799 salt->salt_buf[4] = ikepsk->nr_buf[4];
12800 salt->salt_buf[5] = ikepsk->nr_buf[5];
12801 salt->salt_buf[6] = ikepsk->nr_buf[6];
12802 salt->salt_buf[7] = ikepsk->nr_buf[7];
12803
12804 return (PARSER_OK);
12805 }
12806
12807 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12808 {
12809 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12810
12811 u32 *digest = (u32 *) hash_buf->digest;
12812
12813 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12814 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12815 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12816 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12817 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12818
12819 digest[0] = byte_swap_32 (digest[0]);
12820 digest[1] = byte_swap_32 (digest[1]);
12821 digest[2] = byte_swap_32 (digest[2]);
12822 digest[3] = byte_swap_32 (digest[3]);
12823 digest[4] = byte_swap_32 (digest[4]);
12824
12825 return (PARSER_OK);
12826 }
12827
12828 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12829 {
12830 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12831
12832 u32 *digest = (u32 *) hash_buf->digest;
12833
12834 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12835 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12836 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12837 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12838 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12839 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12840 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12841 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12842 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12843 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12844 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12845 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12846 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12847 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12848 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12849 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12850
12851 return (PARSER_OK);
12852 }
12853
12854 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12855 {
12856 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12857
12858 u32 *digest = (u32 *) hash_buf->digest;
12859
12860 salt_t *salt = hash_buf->salt;
12861
12862 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12863 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12864 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12865 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12866 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12867
12868 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12869
12870 uint salt_len = input_len - 40 - 1;
12871
12872 char *salt_buf = input_buf + 40 + 1;
12873
12874 char *salt_buf_ptr = (char *) salt->salt_buf;
12875
12876 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12877
12878 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12879
12880 salt->salt_len = salt_len;
12881
12882 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12883
12884 return (PARSER_OK);
12885 }
12886
12887 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12888 {
12889 u32 *digest = (u32 *) hash_buf->digest;
12890
12891 salt_t *salt = hash_buf->salt;
12892
12893 tc_t *tc = (tc_t *) hash_buf->esalt;
12894
12895 if (input_len == 0)
12896 {
12897 log_error ("TrueCrypt container not specified");
12898
12899 exit (-1);
12900 }
12901
12902 FILE *fp = fopen (input_buf, "rb");
12903
12904 if (fp == NULL)
12905 {
12906 log_error ("%s: %s", input_buf, strerror (errno));
12907
12908 exit (-1);
12909 }
12910
12911 char buf[512] = { 0 };
12912
12913 int n = fread (buf, 1, sizeof (buf), fp);
12914
12915 fclose (fp);
12916
12917 if (n != 512) return (PARSER_TC_FILE_SIZE);
12918
12919 memcpy (tc->salt_buf, buf, 64);
12920
12921 memcpy (tc->data_buf, buf + 64, 512 - 64);
12922
12923 salt->salt_buf[0] = tc->salt_buf[0];
12924
12925 salt->salt_len = 4;
12926
12927 salt->salt_iter = ROUNDS_TRUECRYPT_1K - 1;
12928
12929 tc->signature = 0x45555254; // "TRUE"
12930
12931 digest[0] = tc->data_buf[0];
12932
12933 return (PARSER_OK);
12934 }
12935
12936 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12937 {
12938 u32 *digest = (u32 *) hash_buf->digest;
12939
12940 salt_t *salt = hash_buf->salt;
12941
12942 tc_t *tc = (tc_t *) hash_buf->esalt;
12943
12944 if (input_len == 0)
12945 {
12946 log_error ("TrueCrypt container not specified");
12947
12948 exit (-1);
12949 }
12950
12951 FILE *fp = fopen (input_buf, "rb");
12952
12953 if (fp == NULL)
12954 {
12955 log_error ("%s: %s", input_buf, strerror (errno));
12956
12957 exit (-1);
12958 }
12959
12960 char buf[512] = { 0 };
12961
12962 int n = fread (buf, 1, sizeof (buf), fp);
12963
12964 fclose (fp);
12965
12966 if (n != 512) return (PARSER_TC_FILE_SIZE);
12967
12968 memcpy (tc->salt_buf, buf, 64);
12969
12970 memcpy (tc->data_buf, buf + 64, 512 - 64);
12971
12972 salt->salt_buf[0] = tc->salt_buf[0];
12973
12974 salt->salt_len = 4;
12975
12976 salt->salt_iter = ROUNDS_TRUECRYPT_2K - 1;
12977
12978 tc->signature = 0x45555254; // "TRUE"
12979
12980 digest[0] = tc->data_buf[0];
12981
12982 return (PARSER_OK);
12983 }
12984
12985 int veracrypt_parse_hash_200000 (char *input_buf, uint input_len, hash_t *hash_buf)
12986 {
12987 u32 *digest = (u32 *) hash_buf->digest;
12988
12989 salt_t *salt = hash_buf->salt;
12990
12991 tc_t *tc = (tc_t *) hash_buf->esalt;
12992
12993 if (input_len == 0)
12994 {
12995 log_error ("VeraCrypt container not specified");
12996
12997 exit (-1);
12998 }
12999
13000 FILE *fp = fopen (input_buf, "rb");
13001
13002 if (fp == NULL)
13003 {
13004 log_error ("%s: %s", input_buf, strerror (errno));
13005
13006 exit (-1);
13007 }
13008
13009 char buf[512] = { 0 };
13010
13011 int n = fread (buf, 1, sizeof (buf), fp);
13012
13013 fclose (fp);
13014
13015 if (n != 512) return (PARSER_VC_FILE_SIZE);
13016
13017 memcpy (tc->salt_buf, buf, 64);
13018
13019 memcpy (tc->data_buf, buf + 64, 512 - 64);
13020
13021 salt->salt_buf[0] = tc->salt_buf[0];
13022
13023 salt->salt_len = 4;
13024
13025 salt->salt_iter = ROUNDS_VERACRYPT_200000 - 1;
13026
13027 tc->signature = 0x41524556; // "VERA"
13028
13029 digest[0] = tc->data_buf[0];
13030
13031 return (PARSER_OK);
13032 }
13033
13034 int veracrypt_parse_hash_500000 (char *input_buf, uint input_len, hash_t *hash_buf)
13035 {
13036 u32 *digest = (u32 *) hash_buf->digest;
13037
13038 salt_t *salt = hash_buf->salt;
13039
13040 tc_t *tc = (tc_t *) hash_buf->esalt;
13041
13042 if (input_len == 0)
13043 {
13044 log_error ("VeraCrypt container not specified");
13045
13046 exit (-1);
13047 }
13048
13049 FILE *fp = fopen (input_buf, "rb");
13050
13051 if (fp == NULL)
13052 {
13053 log_error ("%s: %s", input_buf, strerror (errno));
13054
13055 exit (-1);
13056 }
13057
13058 char buf[512] = { 0 };
13059
13060 int n = fread (buf, 1, sizeof (buf), fp);
13061
13062 fclose (fp);
13063
13064 if (n != 512) return (PARSER_VC_FILE_SIZE);
13065
13066 memcpy (tc->salt_buf, buf, 64);
13067
13068 memcpy (tc->data_buf, buf + 64, 512 - 64);
13069
13070 salt->salt_buf[0] = tc->salt_buf[0];
13071
13072 salt->salt_len = 4;
13073
13074 salt->salt_iter = ROUNDS_VERACRYPT_500000 - 1;
13075
13076 tc->signature = 0x41524556; // "VERA"
13077
13078 digest[0] = tc->data_buf[0];
13079
13080 return (PARSER_OK);
13081 }
13082
13083 int veracrypt_parse_hash_327661 (char *input_buf, uint input_len, hash_t *hash_buf)
13084 {
13085 u32 *digest = (u32 *) hash_buf->digest;
13086
13087 salt_t *salt = hash_buf->salt;
13088
13089 tc_t *tc = (tc_t *) hash_buf->esalt;
13090
13091 if (input_len == 0)
13092 {
13093 log_error ("VeraCrypt container not specified");
13094
13095 exit (-1);
13096 }
13097
13098 FILE *fp = fopen (input_buf, "rb");
13099
13100 if (fp == NULL)
13101 {
13102 log_error ("%s: %s", input_buf, strerror (errno));
13103
13104 exit (-1);
13105 }
13106
13107 char buf[512] = { 0 };
13108
13109 int n = fread (buf, 1, sizeof (buf), fp);
13110
13111 fclose (fp);
13112
13113 if (n != 512) return (PARSER_VC_FILE_SIZE);
13114
13115 memcpy (tc->salt_buf, buf, 64);
13116
13117 memcpy (tc->data_buf, buf + 64, 512 - 64);
13118
13119 salt->salt_buf[0] = tc->salt_buf[0];
13120
13121 salt->salt_len = 4;
13122
13123 salt->salt_iter = ROUNDS_VERACRYPT_327661 - 1;
13124
13125 tc->signature = 0x41524556; // "VERA"
13126
13127 digest[0] = tc->data_buf[0];
13128
13129 return (PARSER_OK);
13130 }
13131
13132 int veracrypt_parse_hash_655331 (char *input_buf, uint input_len, hash_t *hash_buf)
13133 {
13134 u32 *digest = (u32 *) hash_buf->digest;
13135
13136 salt_t *salt = hash_buf->salt;
13137
13138 tc_t *tc = (tc_t *) hash_buf->esalt;
13139
13140 if (input_len == 0)
13141 {
13142 log_error ("VeraCrypt container not specified");
13143
13144 exit (-1);
13145 }
13146
13147 FILE *fp = fopen (input_buf, "rb");
13148
13149 if (fp == NULL)
13150 {
13151 log_error ("%s: %s", input_buf, strerror (errno));
13152
13153 exit (-1);
13154 }
13155
13156 char buf[512] = { 0 };
13157
13158 int n = fread (buf, 1, sizeof (buf), fp);
13159
13160 fclose (fp);
13161
13162 if (n != 512) return (PARSER_VC_FILE_SIZE);
13163
13164 memcpy (tc->salt_buf, buf, 64);
13165
13166 memcpy (tc->data_buf, buf + 64, 512 - 64);
13167
13168 salt->salt_buf[0] = tc->salt_buf[0];
13169
13170 salt->salt_len = 4;
13171
13172 salt->salt_iter = ROUNDS_VERACRYPT_655331 - 1;
13173
13174 tc->signature = 0x41524556; // "VERA"
13175
13176 digest[0] = tc->data_buf[0];
13177
13178 return (PARSER_OK);
13179 }
13180
13181 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13182 {
13183 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
13184
13185 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13186
13187 u32 *digest = (u32 *) hash_buf->digest;
13188
13189 salt_t *salt = hash_buf->salt;
13190
13191 char *salt_pos = input_buf + 6;
13192
13193 char *hash_pos = strchr (salt_pos, '$');
13194
13195 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13196
13197 uint salt_len = hash_pos - salt_pos;
13198
13199 if (salt_len < 8) return (PARSER_SALT_LENGTH);
13200
13201 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13202
13203 salt->salt_len = salt_len;
13204
13205 salt->salt_iter = 1000;
13206
13207 hash_pos++;
13208
13209 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13210
13211 return (PARSER_OK);
13212 }
13213
13214 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13215 {
13216 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
13217
13218 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
13219
13220 u32 *digest = (u32 *) hash_buf->digest;
13221
13222 salt_t *salt = hash_buf->salt;
13223
13224 char *iter_pos = input_buf + 7;
13225
13226 char *salt_pos = strchr (iter_pos, '$');
13227
13228 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13229
13230 salt_pos++;
13231
13232 char *hash_pos = strchr (salt_pos, '$');
13233
13234 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13235
13236 uint salt_len = hash_pos - salt_pos;
13237
13238 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13239
13240 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13241
13242 salt->salt_len = salt_len;
13243
13244 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13245
13246 salt->salt_sign[0] = atoi (salt_iter);
13247
13248 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13249
13250 hash_pos++;
13251
13252 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13253
13254 digest[0] = byte_swap_32 (digest[0]);
13255 digest[1] = byte_swap_32 (digest[1]);
13256 digest[2] = byte_swap_32 (digest[2]);
13257 digest[3] = byte_swap_32 (digest[3]);
13258 digest[4] = byte_swap_32 (digest[4]);
13259
13260 return (PARSER_OK);
13261 }
13262
13263 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13264 {
13265 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
13266
13267 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13268
13269 u32 *digest = (u32 *) hash_buf->digest;
13270
13271 salt_t *salt = hash_buf->salt;
13272
13273 char *iter_pos = input_buf + 9;
13274
13275 char *salt_pos = strchr (iter_pos, '$');
13276
13277 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13278
13279 salt_pos++;
13280
13281 char *hash_pos = strchr (salt_pos, '$');
13282
13283 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13284
13285 uint salt_len = hash_pos - salt_pos;
13286
13287 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13288
13289 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13290
13291 salt->salt_len = salt_len;
13292
13293 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13294
13295 salt->salt_sign[0] = atoi (salt_iter);
13296
13297 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13298
13299 hash_pos++;
13300
13301 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13302
13303 digest[0] = byte_swap_32 (digest[0]);
13304 digest[1] = byte_swap_32 (digest[1]);
13305 digest[2] = byte_swap_32 (digest[2]);
13306 digest[3] = byte_swap_32 (digest[3]);
13307 digest[4] = byte_swap_32 (digest[4]);
13308 digest[5] = byte_swap_32 (digest[5]);
13309 digest[6] = byte_swap_32 (digest[6]);
13310 digest[7] = byte_swap_32 (digest[7]);
13311
13312 return (PARSER_OK);
13313 }
13314
13315 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13316 {
13317 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
13318
13319 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13320
13321 u64 *digest = (u64 *) hash_buf->digest;
13322
13323 salt_t *salt = hash_buf->salt;
13324
13325 char *iter_pos = input_buf + 9;
13326
13327 char *salt_pos = strchr (iter_pos, '$');
13328
13329 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13330
13331 salt_pos++;
13332
13333 char *hash_pos = strchr (salt_pos, '$');
13334
13335 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13336
13337 uint salt_len = hash_pos - salt_pos;
13338
13339 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13340
13341 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13342
13343 salt->salt_len = salt_len;
13344
13345 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13346
13347 salt->salt_sign[0] = atoi (salt_iter);
13348
13349 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13350
13351 hash_pos++;
13352
13353 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13354
13355 digest[0] = byte_swap_64 (digest[0]);
13356 digest[1] = byte_swap_64 (digest[1]);
13357 digest[2] = byte_swap_64 (digest[2]);
13358 digest[3] = byte_swap_64 (digest[3]);
13359 digest[4] = byte_swap_64 (digest[4]);
13360 digest[5] = byte_swap_64 (digest[5]);
13361 digest[6] = byte_swap_64 (digest[6]);
13362 digest[7] = byte_swap_64 (digest[7]);
13363
13364 return (PARSER_OK);
13365 }
13366
13367 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13368 {
13369 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
13370
13371 u32 *digest = (u32 *) hash_buf->digest;
13372
13373 salt_t *salt = hash_buf->salt;
13374
13375 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
13376
13377 /**
13378 * parse line
13379 */
13380
13381 char *iterations_pos = input_buf;
13382
13383 char *saltbuf_pos = strchr (iterations_pos, ':');
13384
13385 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13386
13387 uint iterations_len = saltbuf_pos - iterations_pos;
13388
13389 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
13390
13391 saltbuf_pos++;
13392
13393 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
13394
13395 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13396
13397 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
13398
13399 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
13400
13401 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
13402
13403 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
13404
13405 cipherbuf_pos++;
13406
13407 /**
13408 * pbkdf2 iterations
13409 */
13410
13411 salt->salt_iter = atoi (iterations_pos) - 1;
13412
13413 /**
13414 * handle salt encoding
13415 */
13416
13417 char *saltbuf_ptr = (char *) salt->salt_buf;
13418
13419 for (uint i = 0; i < saltbuf_len; i += 2)
13420 {
13421 const char p0 = saltbuf_pos[i + 0];
13422 const char p1 = saltbuf_pos[i + 1];
13423
13424 *saltbuf_ptr++ = hex_convert (p1) << 0
13425 | hex_convert (p0) << 4;
13426 }
13427
13428 salt->salt_len = saltbuf_len / 2;
13429
13430 /**
13431 * handle cipher encoding
13432 */
13433
13434 uint *tmp = (uint *) mymalloc (32);
13435
13436 char *cipherbuf_ptr = (char *) tmp;
13437
13438 for (uint i = 2016; i < cipherbuf_len; i += 2)
13439 {
13440 const char p0 = cipherbuf_pos[i + 0];
13441 const char p1 = cipherbuf_pos[i + 1];
13442
13443 *cipherbuf_ptr++ = hex_convert (p1) << 0
13444 | hex_convert (p0) << 4;
13445 }
13446
13447 // iv is stored at salt_buf 4 (length 16)
13448 // data is stored at salt_buf 8 (length 16)
13449
13450 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
13451 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
13452 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
13453 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
13454
13455 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
13456 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
13457 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
13458 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
13459
13460 free (tmp);
13461
13462 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
13463 {
13464 const char p0 = cipherbuf_pos[j + 0];
13465 const char p1 = cipherbuf_pos[j + 1];
13466
13467 agilekey->cipher[i] = hex_convert (p1) << 0
13468 | hex_convert (p0) << 4;
13469 }
13470
13471 /**
13472 * digest buf
13473 */
13474
13475 digest[0] = 0x10101010;
13476 digest[1] = 0x10101010;
13477 digest[2] = 0x10101010;
13478 digest[3] = 0x10101010;
13479
13480 return (PARSER_OK);
13481 }
13482
13483 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13484 {
13485 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
13486
13487 u32 *digest = (u32 *) hash_buf->digest;
13488
13489 salt_t *salt = hash_buf->salt;
13490
13491 char *hashbuf_pos = input_buf;
13492
13493 char *iterations_pos = strchr (hashbuf_pos, ':');
13494
13495 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13496
13497 uint hash_len = iterations_pos - hashbuf_pos;
13498
13499 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
13500
13501 iterations_pos++;
13502
13503 char *saltbuf_pos = strchr (iterations_pos, ':');
13504
13505 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13506
13507 uint iterations_len = saltbuf_pos - iterations_pos;
13508
13509 saltbuf_pos++;
13510
13511 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
13512
13513 if (salt_len > 32) return (PARSER_SALT_LENGTH);
13514
13515 char *salt_buf_ptr = (char *) salt->salt_buf;
13516
13517 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
13518
13519 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13520
13521 salt->salt_len = salt_len;
13522
13523 salt->salt_iter = atoi (iterations_pos) - 1;
13524
13525 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13526 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13527 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13528 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13529
13530 return (PARSER_OK);
13531 }
13532
13533 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13534 {
13535 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
13536
13537 u32 *digest = (u32 *) hash_buf->digest;
13538
13539 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13540 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13541 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13542 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13543 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13544 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13545 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13546 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13547
13548 digest[0] = byte_swap_32 (digest[0]);
13549 digest[1] = byte_swap_32 (digest[1]);
13550 digest[2] = byte_swap_32 (digest[2]);
13551 digest[3] = byte_swap_32 (digest[3]);
13552 digest[4] = byte_swap_32 (digest[4]);
13553 digest[5] = byte_swap_32 (digest[5]);
13554 digest[6] = byte_swap_32 (digest[6]);
13555 digest[7] = byte_swap_32 (digest[7]);
13556
13557 return (PARSER_OK);
13558 }
13559
13560 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13561 {
13562 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13563
13564 u32 *digest = (u32 *) hash_buf->digest;
13565
13566 salt_t *salt = hash_buf->salt;
13567
13568 char *salt_pos = input_buf + 3;
13569
13570 uint iterations_len = 0;
13571
13572 if (memcmp (salt_pos, "rounds=", 7) == 0)
13573 {
13574 salt_pos += 7;
13575
13576 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
13577
13578 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
13579 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
13580
13581 salt_pos[0] = 0x0;
13582
13583 salt->salt_iter = atoi (salt_pos - iterations_len);
13584
13585 salt_pos += 1;
13586
13587 iterations_len += 8;
13588 }
13589 else
13590 {
13591 salt->salt_iter = ROUNDS_SHA256CRYPT;
13592 }
13593
13594 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
13595
13596 char *hash_pos = strchr (salt_pos, '$');
13597
13598 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13599
13600 uint salt_len = hash_pos - salt_pos;
13601
13602 if (salt_len > 16) return (PARSER_SALT_LENGTH);
13603
13604 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13605
13606 salt->salt_len = salt_len;
13607
13608 hash_pos++;
13609
13610 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13611
13612 return (PARSER_OK);
13613 }
13614
13615 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13616 {
13617 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
13618
13619 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13620
13621 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
13622
13623 u64 *digest = (u64 *) hash_buf->digest;
13624
13625 salt_t *salt = hash_buf->salt;
13626
13627 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13628
13629 char *iter_pos = input_buf + 4;
13630
13631 char *salt_pos = strchr (iter_pos, '$');
13632
13633 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13634
13635 salt_pos++;
13636
13637 char *hash_pos = strchr (salt_pos, '$');
13638
13639 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13640
13641 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13642
13643 hash_pos++;
13644
13645 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13646 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13647 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13648 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13649 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13650 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13651 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13652 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13653
13654 uint salt_len = hash_pos - salt_pos - 1;
13655
13656 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
13657
13658 salt->salt_len = salt_len / 2;
13659
13660 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
13661 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
13662 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
13663 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
13664 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
13665 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
13666 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
13667 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
13668
13669 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
13670 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
13671 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
13672 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
13673 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
13674 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
13675 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
13676 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
13677 pbkdf2_sha512->salt_buf[8] = 0x01000000;
13678 pbkdf2_sha512->salt_buf[9] = 0x80;
13679
13680 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13681
13682 salt->salt_iter = atoi (iter_pos) - 1;
13683
13684 return (PARSER_OK);
13685 }
13686
13687 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13688 {
13689 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
13690
13691 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
13692
13693 u32 *digest = (u32 *) hash_buf->digest;
13694
13695 salt_t *salt = hash_buf->salt;
13696
13697 char *salt_pos = input_buf + 14;
13698
13699 char *hash_pos = strchr (salt_pos, '*');
13700
13701 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13702
13703 hash_pos++;
13704
13705 uint salt_len = hash_pos - salt_pos - 1;
13706
13707 char *salt_buf_ptr = (char *) salt->salt_buf;
13708
13709 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13710
13711 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13712
13713 salt->salt_len = salt_len;
13714
13715 u8 tmp_buf[100] = { 0 };
13716
13717 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
13718
13719 memcpy (digest, tmp_buf, 32);
13720
13721 digest[0] = byte_swap_32 (digest[0]);
13722 digest[1] = byte_swap_32 (digest[1]);
13723 digest[2] = byte_swap_32 (digest[2]);
13724 digest[3] = byte_swap_32 (digest[3]);
13725 digest[4] = byte_swap_32 (digest[4]);
13726 digest[5] = byte_swap_32 (digest[5]);
13727 digest[6] = byte_swap_32 (digest[6]);
13728 digest[7] = byte_swap_32 (digest[7]);
13729
13730 digest[0] -= SHA256M_A;
13731 digest[1] -= SHA256M_B;
13732 digest[2] -= SHA256M_C;
13733 digest[3] -= SHA256M_D;
13734 digest[4] -= SHA256M_E;
13735 digest[5] -= SHA256M_F;
13736 digest[6] -= SHA256M_G;
13737 digest[7] -= SHA256M_H;
13738
13739 return (PARSER_OK);
13740 }
13741
13742 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13743 {
13744 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13745
13746 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13747
13748 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13749
13750 u64 *digest = (u64 *) hash_buf->digest;
13751
13752 salt_t *salt = hash_buf->salt;
13753
13754 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13755
13756 char *iter_pos = input_buf + 19;
13757
13758 char *salt_pos = strchr (iter_pos, '.');
13759
13760 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13761
13762 salt_pos++;
13763
13764 char *hash_pos = strchr (salt_pos, '.');
13765
13766 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13767
13768 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13769
13770 hash_pos++;
13771
13772 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13773 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13774 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13775 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13776 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13777 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13778 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13779 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13780
13781 uint salt_len = hash_pos - salt_pos - 1;
13782
13783 salt_len /= 2;
13784
13785 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13786
13787 uint i;
13788
13789 for (i = 0; i < salt_len; i++)
13790 {
13791 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13792 }
13793
13794 salt_buf_ptr[salt_len + 3] = 0x01;
13795 salt_buf_ptr[salt_len + 4] = 0x80;
13796
13797 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13798
13799 salt->salt_len = salt_len;
13800
13801 salt->salt_iter = atoi (iter_pos) - 1;
13802
13803 return (PARSER_OK);
13804 }
13805
13806 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13807 {
13808 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13809
13810 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13811
13812 u64 *digest = (u64 *) hash_buf->digest;
13813
13814 salt_t *salt = hash_buf->salt;
13815
13816 u8 tmp_buf[120] = { 0 };
13817
13818 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13819
13820 if (tmp_len < 64) return (PARSER_HASH_LENGTH);
13821
13822 memcpy (digest, tmp_buf, 64);
13823
13824 digest[0] = byte_swap_64 (digest[0]);
13825 digest[1] = byte_swap_64 (digest[1]);
13826 digest[2] = byte_swap_64 (digest[2]);
13827 digest[3] = byte_swap_64 (digest[3]);
13828 digest[4] = byte_swap_64 (digest[4]);
13829 digest[5] = byte_swap_64 (digest[5]);
13830 digest[6] = byte_swap_64 (digest[6]);
13831 digest[7] = byte_swap_64 (digest[7]);
13832
13833 digest[0] -= SHA512M_A;
13834 digest[1] -= SHA512M_B;
13835 digest[2] -= SHA512M_C;
13836 digest[3] -= SHA512M_D;
13837 digest[4] -= SHA512M_E;
13838 digest[5] -= SHA512M_F;
13839 digest[6] -= SHA512M_G;
13840 digest[7] -= SHA512M_H;
13841
13842 int salt_len = tmp_len - 64;
13843
13844 if (salt_len < 0) return (PARSER_SALT_LENGTH);
13845
13846 salt->salt_len = salt_len;
13847
13848 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13849
13850 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13851 {
13852 char *ptr = (char *) salt->salt_buf;
13853
13854 ptr[salt->salt_len] = 0x80;
13855 }
13856
13857 return (PARSER_OK);
13858 }
13859
13860 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13861 {
13862 if (data.opts_type & OPTS_TYPE_ST_HEX)
13863 {
13864 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13865 }
13866 else
13867 {
13868 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13869 }
13870
13871 u32 *digest = (u32 *) hash_buf->digest;
13872
13873 salt_t *salt = hash_buf->salt;
13874
13875 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13876 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13877 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13878 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13879
13880 digest[0] = byte_swap_32 (digest[0]);
13881 digest[1] = byte_swap_32 (digest[1]);
13882 digest[2] = byte_swap_32 (digest[2]);
13883 digest[3] = byte_swap_32 (digest[3]);
13884
13885 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13886
13887 uint salt_len = input_len - 32 - 1;
13888
13889 char *salt_buf = input_buf + 32 + 1;
13890
13891 char *salt_buf_ptr = (char *) salt->salt_buf;
13892
13893 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13894
13895 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13896
13897 salt->salt_len = salt_len;
13898
13899 return (PARSER_OK);
13900 }
13901
13902 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13903 {
13904 if (data.opts_type & OPTS_TYPE_ST_HEX)
13905 {
13906 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13907 }
13908 else
13909 {
13910 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13911 }
13912
13913 u32 *digest = (u32 *) hash_buf->digest;
13914
13915 salt_t *salt = hash_buf->salt;
13916
13917 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13918 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13919 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13920 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13921 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13922
13923 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13924
13925 uint salt_len = input_len - 40 - 1;
13926
13927 char *salt_buf = input_buf + 40 + 1;
13928
13929 char *salt_buf_ptr = (char *) salt->salt_buf;
13930
13931 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13932
13933 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13934
13935 salt->salt_len = salt_len;
13936
13937 return (PARSER_OK);
13938 }
13939
13940 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13941 {
13942 if (data.opts_type & OPTS_TYPE_ST_HEX)
13943 {
13944 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13945 }
13946 else
13947 {
13948 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13949 }
13950
13951 u32 *digest = (u32 *) hash_buf->digest;
13952
13953 salt_t *salt = hash_buf->salt;
13954
13955 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13956 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13957 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13958 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13959 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13960 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13961 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13962 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13963
13964 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13965
13966 uint salt_len = input_len - 64 - 1;
13967
13968 char *salt_buf = input_buf + 64 + 1;
13969
13970 char *salt_buf_ptr = (char *) salt->salt_buf;
13971
13972 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13973
13974 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13975
13976 salt->salt_len = salt_len;
13977
13978 return (PARSER_OK);
13979 }
13980
13981 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13982 {
13983 if (data.opts_type & OPTS_TYPE_ST_HEX)
13984 {
13985 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13986 }
13987 else
13988 {
13989 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13990 }
13991
13992 u64 *digest = (u64 *) hash_buf->digest;
13993
13994 salt_t *salt = hash_buf->salt;
13995
13996 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13997 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13998 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13999 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
14000 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
14001 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
14002 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
14003 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
14004
14005 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14006
14007 uint salt_len = input_len - 128 - 1;
14008
14009 char *salt_buf = input_buf + 128 + 1;
14010
14011 char *salt_buf_ptr = (char *) salt->salt_buf;
14012
14013 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14014
14015 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14016
14017 salt->salt_len = salt_len;
14018
14019 return (PARSER_OK);
14020 }
14021
14022 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14023 {
14024 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
14025
14026 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
14027
14028 u32 *digest = (u32 *) hash_buf->digest;
14029
14030 salt_t *salt = hash_buf->salt;
14031
14032 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
14033
14034 /**
14035 * parse line
14036 */
14037
14038 char *user_pos = input_buf + 10 + 1;
14039
14040 char *realm_pos = strchr (user_pos, '$');
14041
14042 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14043
14044 uint user_len = realm_pos - user_pos;
14045
14046 if (user_len >= 64) return (PARSER_SALT_LENGTH);
14047
14048 realm_pos++;
14049
14050 char *salt_pos = strchr (realm_pos, '$');
14051
14052 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14053
14054 uint realm_len = salt_pos - realm_pos;
14055
14056 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
14057
14058 salt_pos++;
14059
14060 char *data_pos = strchr (salt_pos, '$');
14061
14062 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14063
14064 uint salt_len = data_pos - salt_pos;
14065
14066 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
14067
14068 data_pos++;
14069
14070 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
14071
14072 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
14073
14074 /**
14075 * copy data
14076 */
14077
14078 memcpy (krb5pa->user, user_pos, user_len);
14079 memcpy (krb5pa->realm, realm_pos, realm_len);
14080 memcpy (krb5pa->salt, salt_pos, salt_len);
14081
14082 char *timestamp_ptr = (char *) krb5pa->timestamp;
14083
14084 for (uint i = 0; i < (36 * 2); i += 2)
14085 {
14086 const char p0 = data_pos[i + 0];
14087 const char p1 = data_pos[i + 1];
14088
14089 *timestamp_ptr++ = hex_convert (p1) << 0
14090 | hex_convert (p0) << 4;
14091 }
14092
14093 char *checksum_ptr = (char *) krb5pa->checksum;
14094
14095 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
14096 {
14097 const char p0 = data_pos[i + 0];
14098 const char p1 = data_pos[i + 1];
14099
14100 *checksum_ptr++ = hex_convert (p1) << 0
14101 | hex_convert (p0) << 4;
14102 }
14103
14104 /**
14105 * copy some data to generic buffers to make sorting happy
14106 */
14107
14108 salt->salt_buf[0] = krb5pa->timestamp[0];
14109 salt->salt_buf[1] = krb5pa->timestamp[1];
14110 salt->salt_buf[2] = krb5pa->timestamp[2];
14111 salt->salt_buf[3] = krb5pa->timestamp[3];
14112 salt->salt_buf[4] = krb5pa->timestamp[4];
14113 salt->salt_buf[5] = krb5pa->timestamp[5];
14114 salt->salt_buf[6] = krb5pa->timestamp[6];
14115 salt->salt_buf[7] = krb5pa->timestamp[7];
14116 salt->salt_buf[8] = krb5pa->timestamp[8];
14117
14118 salt->salt_len = 36;
14119
14120 digest[0] = krb5pa->checksum[0];
14121 digest[1] = krb5pa->checksum[1];
14122 digest[2] = krb5pa->checksum[2];
14123 digest[3] = krb5pa->checksum[3];
14124
14125 return (PARSER_OK);
14126 }
14127
14128 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14129 {
14130 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
14131
14132 u32 *digest = (u32 *) hash_buf->digest;
14133
14134 salt_t *salt = hash_buf->salt;
14135
14136 /**
14137 * parse line
14138 */
14139
14140 char *salt_pos = input_buf;
14141
14142 char *hash_pos = strchr (salt_pos, '$');
14143
14144 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14145
14146 uint salt_len = hash_pos - salt_pos;
14147
14148 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14149
14150 hash_pos++;
14151
14152 uint hash_len = input_len - 1 - salt_len;
14153
14154 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14155
14156 /**
14157 * valid some data
14158 */
14159
14160 uint user_len = 0;
14161
14162 for (uint i = 0; i < salt_len; i++)
14163 {
14164 if (salt_pos[i] == ' ') continue;
14165
14166 user_len++;
14167 }
14168
14169 // SAP user names cannot be longer than 12 characters
14170 if (user_len > 12) return (PARSER_SALT_LENGTH);
14171
14172 // SAP user name cannot start with ! or ?
14173 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14174
14175 /**
14176 * copy data
14177 */
14178
14179 char *salt_buf_ptr = (char *) salt->salt_buf;
14180
14181 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14182
14183 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14184
14185 salt->salt_len = salt_len;
14186
14187 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
14188 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
14189 digest[2] = 0;
14190 digest[3] = 0;
14191
14192 digest[0] = byte_swap_32 (digest[0]);
14193 digest[1] = byte_swap_32 (digest[1]);
14194
14195 return (PARSER_OK);
14196 }
14197
14198 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14199 {
14200 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
14201
14202 u32 *digest = (u32 *) hash_buf->digest;
14203
14204 salt_t *salt = hash_buf->salt;
14205
14206 /**
14207 * parse line
14208 */
14209
14210 char *salt_pos = input_buf;
14211
14212 char *hash_pos = strchr (salt_pos, '$');
14213
14214 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14215
14216 uint salt_len = hash_pos - salt_pos;
14217
14218 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14219
14220 hash_pos++;
14221
14222 uint hash_len = input_len - 1 - salt_len;
14223
14224 if (hash_len != 40) return (PARSER_HASH_LENGTH);
14225
14226 /**
14227 * valid some data
14228 */
14229
14230 uint user_len = 0;
14231
14232 for (uint i = 0; i < salt_len; i++)
14233 {
14234 if (salt_pos[i] == ' ') continue;
14235
14236 user_len++;
14237 }
14238
14239 // SAP user names cannot be longer than 12 characters
14240 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
14241 // so far nobody complained so we stay with this because it helps in optimization
14242 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
14243
14244 if (user_len > 12) return (PARSER_SALT_LENGTH);
14245
14246 // SAP user name cannot start with ! or ?
14247 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14248
14249 /**
14250 * copy data
14251 */
14252
14253 char *salt_buf_ptr = (char *) salt->salt_buf;
14254
14255 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14256
14257 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14258
14259 salt->salt_len = salt_len;
14260
14261 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14262 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14263 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14264 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14265 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14266
14267 return (PARSER_OK);
14268 }
14269
14270 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14271 {
14272 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
14273
14274 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14275
14276 u64 *digest = (u64 *) hash_buf->digest;
14277
14278 salt_t *salt = hash_buf->salt;
14279
14280 char *iter_pos = input_buf + 3;
14281
14282 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
14283
14284 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
14285
14286 memcpy ((char *) salt->salt_sign, input_buf, 4);
14287
14288 salt->salt_iter = salt_iter;
14289
14290 char *salt_pos = iter_pos + 1;
14291
14292 uint salt_len = 8;
14293
14294 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
14295
14296 salt->salt_len = salt_len;
14297
14298 char *hash_pos = salt_pos + salt_len;
14299
14300 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14301
14302 // ugly hack start
14303
14304 char *tmp = (char *) salt->salt_buf_pc;
14305
14306 tmp[0] = hash_pos[42];
14307
14308 // ugly hack end
14309
14310 digest[ 0] = byte_swap_64 (digest[ 0]);
14311 digest[ 1] = byte_swap_64 (digest[ 1]);
14312 digest[ 2] = byte_swap_64 (digest[ 2]);
14313 digest[ 3] = byte_swap_64 (digest[ 3]);
14314 digest[ 4] = 0;
14315 digest[ 5] = 0;
14316 digest[ 6] = 0;
14317 digest[ 7] = 0;
14318
14319 return (PARSER_OK);
14320 }
14321
14322 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14323 {
14324 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
14325
14326 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14327
14328 u32 *digest = (u32 *) hash_buf->digest;
14329
14330 salt_t *salt = hash_buf->salt;
14331
14332 char *salt_buf = input_buf + 6;
14333
14334 uint salt_len = 16;
14335
14336 char *salt_buf_ptr = (char *) salt->salt_buf;
14337
14338 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14339
14340 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14341
14342 salt->salt_len = salt_len;
14343
14344 char *hash_pos = input_buf + 6 + 16;
14345
14346 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14347 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14348 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14349 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14350 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14351 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
14352 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
14353 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
14354
14355 return (PARSER_OK);
14356 }
14357
14358 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14359 {
14360 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
14361
14362 u32 *digest = (u32 *) hash_buf->digest;
14363
14364 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14365 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14366 digest[2] = 0;
14367 digest[3] = 0;
14368
14369 return (PARSER_OK);
14370 }
14371
14372 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14373 {
14374 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
14375
14376 u32 *digest = (u32 *) hash_buf->digest;
14377
14378 salt_t *salt = hash_buf->salt;
14379
14380 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
14381
14382 char *saltbuf_pos = input_buf;
14383
14384 char *hashbuf_pos = strchr (saltbuf_pos, ':');
14385
14386 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14387
14388 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
14389
14390 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
14391 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
14392
14393 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
14394
14395 hashbuf_pos++;
14396
14397 uint hashbuf_len = input_len - saltbuf_len - 1;
14398
14399 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
14400
14401 char *salt_ptr = (char *) saltbuf_pos;
14402 char *rakp_ptr = (char *) rakp->salt_buf;
14403
14404 uint i;
14405 uint j;
14406
14407 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
14408 {
14409 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
14410 }
14411
14412 rakp_ptr[j] = 0x80;
14413
14414 rakp->salt_len = j;
14415
14416 for (i = 0; i < 64; i++)
14417 {
14418 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
14419 }
14420
14421 salt->salt_buf[0] = rakp->salt_buf[0];
14422 salt->salt_buf[1] = rakp->salt_buf[1];
14423 salt->salt_buf[2] = rakp->salt_buf[2];
14424 salt->salt_buf[3] = rakp->salt_buf[3];
14425 salt->salt_buf[4] = rakp->salt_buf[4];
14426 salt->salt_buf[5] = rakp->salt_buf[5];
14427 salt->salt_buf[6] = rakp->salt_buf[6];
14428 salt->salt_buf[7] = rakp->salt_buf[7];
14429
14430 salt->salt_len = 32; // muss min. 32 haben
14431
14432 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14433 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14434 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14435 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14436 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14437
14438 return (PARSER_OK);
14439 }
14440
14441 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14442 {
14443 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
14444
14445 u32 *digest = (u32 *) hash_buf->digest;
14446
14447 salt_t *salt = hash_buf->salt;
14448
14449 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
14450
14451 char *salt_pos = input_buf + 1;
14452
14453 memcpy (salt->salt_buf, salt_pos, 8);
14454
14455 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14456 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14457
14458 salt->salt_len = 8;
14459
14460 char *hash_pos = salt_pos + 8;
14461
14462 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14463 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14464 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14465 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14466 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14467
14468 digest[0] -= SHA1M_A;
14469 digest[1] -= SHA1M_B;
14470 digest[2] -= SHA1M_C;
14471 digest[3] -= SHA1M_D;
14472 digest[4] -= SHA1M_E;
14473
14474 return (PARSER_OK);
14475 }
14476
14477 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14478 {
14479 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
14480
14481 u32 *digest = (u32 *) hash_buf->digest;
14482
14483 salt_t *salt = hash_buf->salt;
14484
14485 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14486 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14487 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14488 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14489
14490 digest[0] = byte_swap_32 (digest[0]);
14491 digest[1] = byte_swap_32 (digest[1]);
14492 digest[2] = byte_swap_32 (digest[2]);
14493 digest[3] = byte_swap_32 (digest[3]);
14494
14495 digest[0] -= MD5M_A;
14496 digest[1] -= MD5M_B;
14497 digest[2] -= MD5M_C;
14498 digest[3] -= MD5M_D;
14499
14500 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14501
14502 char *salt_buf_ptr = input_buf + 32 + 1;
14503
14504 u32 *salt_buf = salt->salt_buf;
14505
14506 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
14507 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
14508 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
14509 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
14510
14511 salt_buf[0] = byte_swap_32 (salt_buf[0]);
14512 salt_buf[1] = byte_swap_32 (salt_buf[1]);
14513 salt_buf[2] = byte_swap_32 (salt_buf[2]);
14514 salt_buf[3] = byte_swap_32 (salt_buf[3]);
14515
14516 salt->salt_len = 16 + 1;
14517
14518 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14519
14520 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
14521
14522 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
14523
14524 return (PARSER_OK);
14525 }
14526
14527 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14528 {
14529 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
14530
14531 u32 *digest = (u32 *) hash_buf->digest;
14532
14533 salt_t *salt = hash_buf->salt;
14534
14535 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
14536
14537 /**
14538 * parse line
14539 */
14540
14541 char *hashbuf_pos = input_buf;
14542
14543 char *saltbuf_pos = strchr (hashbuf_pos, ':');
14544
14545 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14546
14547 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
14548
14549 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
14550
14551 saltbuf_pos++;
14552
14553 char *iteration_pos = strchr (saltbuf_pos, ':');
14554
14555 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14556
14557 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14558
14559 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14560
14561 iteration_pos++;
14562
14563 char *databuf_pos = strchr (iteration_pos, ':');
14564
14565 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14566
14567 const uint iteration_len = databuf_pos - iteration_pos;
14568
14569 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14570 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
14571
14572 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
14573
14574 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
14575 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
14576
14577 databuf_pos++;
14578
14579 // digest
14580
14581 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14582 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14583 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14584 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14585 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14586 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
14587 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
14588 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
14589
14590 // salt
14591
14592 char *saltbuf_ptr = (char *) salt->salt_buf;
14593
14594 for (uint i = 0; i < saltbuf_len; i += 2)
14595 {
14596 const char p0 = saltbuf_pos[i + 0];
14597 const char p1 = saltbuf_pos[i + 1];
14598
14599 *saltbuf_ptr++ = hex_convert (p1) << 0
14600 | hex_convert (p0) << 4;
14601 }
14602
14603 salt->salt_buf[4] = 0x01000000;
14604 salt->salt_buf[5] = 0x80;
14605
14606 salt->salt_len = saltbuf_len / 2;
14607
14608 // iteration
14609
14610 salt->salt_iter = atoi (iteration_pos) - 1;
14611
14612 // data
14613
14614 char *databuf_ptr = (char *) cloudkey->data_buf;
14615
14616 for (uint i = 0; i < databuf_len; i += 2)
14617 {
14618 const char p0 = databuf_pos[i + 0];
14619 const char p1 = databuf_pos[i + 1];
14620
14621 *databuf_ptr++ = hex_convert (p1) << 0
14622 | hex_convert (p0) << 4;
14623 }
14624
14625 *databuf_ptr++ = 0x80;
14626
14627 for (uint i = 0; i < 512; i++)
14628 {
14629 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
14630 }
14631
14632 cloudkey->data_len = databuf_len / 2;
14633
14634 return (PARSER_OK);
14635 }
14636
14637 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14638 {
14639 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
14640
14641 u32 *digest = (u32 *) hash_buf->digest;
14642
14643 salt_t *salt = hash_buf->salt;
14644
14645 /**
14646 * parse line
14647 */
14648
14649 char *hashbuf_pos = input_buf;
14650
14651 char *domainbuf_pos = strchr (hashbuf_pos, ':');
14652
14653 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14654
14655 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
14656
14657 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
14658
14659 domainbuf_pos++;
14660
14661 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
14662
14663 char *saltbuf_pos = strchr (domainbuf_pos, ':');
14664
14665 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14666
14667 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
14668
14669 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
14670
14671 saltbuf_pos++;
14672
14673 char *iteration_pos = strchr (saltbuf_pos, ':');
14674
14675 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14676
14677 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14678
14679 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
14680
14681 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
14682
14683 iteration_pos++;
14684
14685 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
14686
14687 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14688 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
14689
14690 // ok, the plan for this algorithm is the following:
14691 // we have 2 salts here, the domain-name and a random salt
14692 // while both are used in the initial transformation,
14693 // only the random salt is used in the following iterations
14694 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
14695 // and one that includes only the real salt (stored into salt_buf[]).
14696 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
14697
14698 u8 tmp_buf[100] = { 0 };
14699
14700 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
14701
14702 memcpy (digest, tmp_buf, 20);
14703
14704 digest[0] = byte_swap_32 (digest[0]);
14705 digest[1] = byte_swap_32 (digest[1]);
14706 digest[2] = byte_swap_32 (digest[2]);
14707 digest[3] = byte_swap_32 (digest[3]);
14708 digest[4] = byte_swap_32 (digest[4]);
14709
14710 // domain
14711
14712 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14713
14714 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
14715
14716 char *len_ptr = NULL;
14717
14718 for (uint i = 0; i < domainbuf_len; i++)
14719 {
14720 if (salt_buf_pc_ptr[i] == '.')
14721 {
14722 len_ptr = &salt_buf_pc_ptr[i];
14723
14724 *len_ptr = 0;
14725 }
14726 else
14727 {
14728 *len_ptr += 1;
14729 }
14730 }
14731
14732 salt->salt_buf_pc[7] = domainbuf_len;
14733
14734 // "real" salt
14735
14736 char *salt_buf_ptr = (char *) salt->salt_buf;
14737
14738 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
14739
14740 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14741
14742 salt->salt_len = salt_len;
14743
14744 // iteration
14745
14746 salt->salt_iter = atoi (iteration_pos);
14747
14748 return (PARSER_OK);
14749 }
14750
14751 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14752 {
14753 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14754
14755 u32 *digest = (u32 *) hash_buf->digest;
14756
14757 salt_t *salt = hash_buf->salt;
14758
14759 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14760 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14761 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14762 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14763 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14764
14765 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14766
14767 uint salt_len = input_len - 40 - 1;
14768
14769 char *salt_buf = input_buf + 40 + 1;
14770
14771 char *salt_buf_ptr = (char *) salt->salt_buf;
14772
14773 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14774
14775 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14776
14777 salt->salt_len = salt_len;
14778
14779 return (PARSER_OK);
14780 }
14781
14782 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14783 {
14784 const u8 ascii_to_ebcdic[] =
14785 {
14786 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14787 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14788 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14789 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14790 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14791 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14792 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14793 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14794 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14795 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14796 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14797 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14798 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14799 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14800 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14801 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14802 };
14803
14804 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14805
14806 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14807
14808 u32 *digest = (u32 *) hash_buf->digest;
14809
14810 salt_t *salt = hash_buf->salt;
14811
14812 char *salt_pos = input_buf + 6 + 1;
14813
14814 char *digest_pos = strchr (salt_pos, '*');
14815
14816 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14817
14818 uint salt_len = digest_pos - salt_pos;
14819
14820 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14821
14822 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14823
14824 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14825
14826 digest_pos++;
14827
14828 char *salt_buf_ptr = (char *) salt->salt_buf;
14829 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14830
14831 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14832
14833 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14834
14835 salt->salt_len = salt_len;
14836
14837 for (uint i = 0; i < salt_len; i++)
14838 {
14839 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14840 }
14841 for (uint i = salt_len; i < 8; i++)
14842 {
14843 salt_buf_pc_ptr[i] = 0x40;
14844 }
14845
14846 uint tt;
14847
14848 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14849
14850 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14851 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14852
14853 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14854 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14855
14856 digest[0] = byte_swap_32 (digest[0]);
14857 digest[1] = byte_swap_32 (digest[1]);
14858
14859 IP (digest[0], digest[1], tt);
14860
14861 digest[0] = rotr32 (digest[0], 29);
14862 digest[1] = rotr32 (digest[1], 29);
14863 digest[2] = 0;
14864 digest[3] = 0;
14865
14866 return (PARSER_OK);
14867 }
14868
14869 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14870 {
14871 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14872
14873 u32 *digest = (u32 *) hash_buf->digest;
14874
14875 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14876 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14877 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14878 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14879
14880 digest[0] = byte_swap_32 (digest[0]);
14881 digest[1] = byte_swap_32 (digest[1]);
14882 digest[2] = byte_swap_32 (digest[2]);
14883 digest[3] = byte_swap_32 (digest[3]);
14884
14885 return (PARSER_OK);
14886 }
14887
14888 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14889 {
14890 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14891
14892 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14893
14894 u32 *digest = (u32 *) hash_buf->digest;
14895
14896 salt_t *salt = hash_buf->salt;
14897
14898 u8 tmp_buf[120] = { 0 };
14899
14900 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14901
14902 tmp_buf[3] += -4; // dont ask!
14903
14904 memcpy (salt->salt_buf, tmp_buf, 5);
14905
14906 salt->salt_len = 5;
14907
14908 memcpy (digest, tmp_buf + 5, 9);
14909
14910 // yes, only 9 byte are needed to crack, but 10 to display
14911
14912 salt->salt_buf_pc[7] = input_buf[20];
14913
14914 return (PARSER_OK);
14915 }
14916
14917 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14918 {
14919 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14920
14921 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14922
14923 u32 *digest = (u32 *) hash_buf->digest;
14924
14925 salt_t *salt = hash_buf->salt;
14926
14927 u8 tmp_buf[120] = { 0 };
14928
14929 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14930
14931 tmp_buf[3] += -4; // dont ask!
14932
14933 // salt
14934
14935 memcpy (salt->salt_buf, tmp_buf, 16);
14936
14937 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)
14938
14939 // iteration
14940
14941 char tmp_iter_buf[11] = { 0 };
14942
14943 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14944
14945 tmp_iter_buf[10] = 0;
14946
14947 salt->salt_iter = atoi (tmp_iter_buf);
14948
14949 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14950 {
14951 return (PARSER_SALT_ITERATION);
14952 }
14953
14954 salt->salt_iter--; // first round in init
14955
14956 // 2 additional bytes for display only
14957
14958 salt->salt_buf_pc[0] = tmp_buf[26];
14959 salt->salt_buf_pc[1] = tmp_buf[27];
14960
14961 // digest
14962
14963 memcpy (digest, tmp_buf + 28, 8);
14964
14965 digest[0] = byte_swap_32 (digest[0]);
14966 digest[1] = byte_swap_32 (digest[1]);
14967 digest[2] = 0;
14968 digest[3] = 0;
14969
14970 return (PARSER_OK);
14971 }
14972
14973 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14974 {
14975 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14976
14977 u32 *digest = (u32 *) hash_buf->digest;
14978
14979 salt_t *salt = hash_buf->salt;
14980
14981 char *salt_buf_pos = input_buf;
14982
14983 char *hash_buf_pos = salt_buf_pos + 6;
14984
14985 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14986 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14987 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14988 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14989 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14990 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14991 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14992 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14993
14994 digest[0] -= SHA256M_A;
14995 digest[1] -= SHA256M_B;
14996 digest[2] -= SHA256M_C;
14997 digest[3] -= SHA256M_D;
14998 digest[4] -= SHA256M_E;
14999 digest[5] -= SHA256M_F;
15000 digest[6] -= SHA256M_G;
15001 digest[7] -= SHA256M_H;
15002
15003 char *salt_buf_ptr = (char *) salt->salt_buf;
15004
15005 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
15006
15007 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15008
15009 salt->salt_len = salt_len;
15010
15011 return (PARSER_OK);
15012 }
15013
15014 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15015 {
15016 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
15017
15018 u32 *digest = (u32 *) hash_buf->digest;
15019
15020 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15021
15022 salt_t *salt = hash_buf->salt;
15023
15024 char *salt_buf = input_buf + 6;
15025
15026 char *digest_buf = strchr (salt_buf, '$');
15027
15028 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15029
15030 uint salt_len = digest_buf - salt_buf;
15031
15032 digest_buf++; // skip the '$' symbol
15033
15034 char *salt_buf_ptr = (char *) salt->salt_buf;
15035
15036 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15037
15038 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15039
15040 salt->salt_len = salt_len;
15041
15042 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15043 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15044 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15045 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15046
15047 digest[0] = byte_swap_32 (digest[0]);
15048 digest[1] = byte_swap_32 (digest[1]);
15049 digest[2] = byte_swap_32 (digest[2]);
15050 digest[3] = byte_swap_32 (digest[3]);
15051
15052 digest[0] -= MD5M_A;
15053 digest[1] -= MD5M_B;
15054 digest[2] -= MD5M_C;
15055 digest[3] -= MD5M_D;
15056
15057 return (PARSER_OK);
15058 }
15059
15060 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15061 {
15062 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
15063
15064 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15065
15066 u32 *digest = (u32 *) hash_buf->digest;
15067
15068 salt_t *salt = hash_buf->salt;
15069
15070 char *salt_buf = input_buf + 3;
15071
15072 char *digest_buf = strchr (salt_buf, '$');
15073
15074 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15075
15076 uint salt_len = digest_buf - salt_buf;
15077
15078 digest_buf++; // skip the '$' symbol
15079
15080 char *salt_buf_ptr = (char *) salt->salt_buf;
15081
15082 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15083
15084 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15085
15086 salt_buf_ptr[salt_len] = 0x2d;
15087
15088 salt->salt_len = salt_len + 1;
15089
15090 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15091 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15092 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15093 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15094
15095 digest[0] = byte_swap_32 (digest[0]);
15096 digest[1] = byte_swap_32 (digest[1]);
15097 digest[2] = byte_swap_32 (digest[2]);
15098 digest[3] = byte_swap_32 (digest[3]);
15099
15100 digest[0] -= MD5M_A;
15101 digest[1] -= MD5M_B;
15102 digest[2] -= MD5M_C;
15103 digest[3] -= MD5M_D;
15104
15105 return (PARSER_OK);
15106 }
15107
15108 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15109 {
15110 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
15111
15112 u32 *digest = (u32 *) hash_buf->digest;
15113
15114 salt_t *salt = hash_buf->salt;
15115
15116 u8 tmp_buf[100] = { 0 };
15117
15118 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
15119
15120 memcpy (digest, tmp_buf, 20);
15121
15122 digest[0] = byte_swap_32 (digest[0]);
15123 digest[1] = byte_swap_32 (digest[1]);
15124 digest[2] = byte_swap_32 (digest[2]);
15125 digest[3] = byte_swap_32 (digest[3]);
15126 digest[4] = byte_swap_32 (digest[4]);
15127
15128 digest[0] -= SHA1M_A;
15129 digest[1] -= SHA1M_B;
15130 digest[2] -= SHA1M_C;
15131 digest[3] -= SHA1M_D;
15132 digest[4] -= SHA1M_E;
15133
15134 salt->salt_buf[0] = 0x80;
15135
15136 salt->salt_len = 0;
15137
15138 return (PARSER_OK);
15139 }
15140
15141 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15142 {
15143 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
15144
15145 u32 *digest = (u32 *) hash_buf->digest;
15146
15147 salt_t *salt = hash_buf->salt;
15148
15149 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15150 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15151 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15152 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15153
15154 digest[0] = byte_swap_32 (digest[0]);
15155 digest[1] = byte_swap_32 (digest[1]);
15156 digest[2] = byte_swap_32 (digest[2]);
15157 digest[3] = byte_swap_32 (digest[3]);
15158
15159 digest[0] -= MD5M_A;
15160 digest[1] -= MD5M_B;
15161 digest[2] -= MD5M_C;
15162 digest[3] -= MD5M_D;
15163
15164 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15165
15166 uint salt_len = input_len - 32 - 1;
15167
15168 char *salt_buf = input_buf + 32 + 1;
15169
15170 char *salt_buf_ptr = (char *) salt->salt_buf;
15171
15172 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15173
15174 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15175
15176 /*
15177 * add static "salt" part
15178 */
15179
15180 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
15181
15182 salt_len += 8;
15183
15184 salt->salt_len = salt_len;
15185
15186 return (PARSER_OK);
15187 }
15188
15189 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15190 {
15191 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
15192
15193 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
15194
15195 u32 *digest = (u32 *) hash_buf->digest;
15196
15197 salt_t *salt = hash_buf->salt;
15198
15199 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
15200
15201 /**
15202 * parse line
15203 */
15204
15205 char *saltlen_pos = input_buf + 1 + 3 + 1;
15206
15207 char *saltbuf_pos = strchr (saltlen_pos, '$');
15208
15209 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15210
15211 uint saltlen_len = saltbuf_pos - saltlen_pos;
15212
15213 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
15214
15215 saltbuf_pos++;
15216
15217 char *keylen_pos = strchr (saltbuf_pos, '$');
15218
15219 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15220
15221 uint saltbuf_len = keylen_pos - saltbuf_pos;
15222
15223 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
15224
15225 keylen_pos++;
15226
15227 char *keybuf_pos = strchr (keylen_pos, '$');
15228
15229 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15230
15231 uint keylen_len = keybuf_pos - keylen_pos;
15232
15233 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
15234
15235 keybuf_pos++;
15236
15237 char *databuf_pos = strchr (keybuf_pos, '$');
15238
15239 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15240
15241 uint keybuf_len = databuf_pos - keybuf_pos;
15242
15243 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
15244
15245 databuf_pos++;
15246
15247 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
15248
15249 if (data_len != 3072) return (PARSER_SALT_LENGTH);
15250
15251 /**
15252 * copy data
15253 */
15254
15255 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
15256 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
15257 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
15258 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
15259
15260 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
15261 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
15262 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
15263 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
15264
15265 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15266 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15267 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15268 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15269
15270 salt->salt_len = 16;
15271 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
15272
15273 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
15274 {
15275 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
15276 }
15277
15278 return (PARSER_OK);
15279 }
15280
15281 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15282 {
15283 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
15284
15285 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15286
15287 u32 *digest = (u32 *) hash_buf->digest;
15288
15289 salt_t *salt = hash_buf->salt;
15290
15291 /**
15292 * parse line
15293 */
15294
15295 // first is the N salt parameter
15296
15297 char *N_pos = input_buf + 6;
15298
15299 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15300
15301 N_pos++;
15302
15303 salt->scrypt_N = atoi (N_pos);
15304
15305 // r
15306
15307 char *r_pos = strchr (N_pos, ':');
15308
15309 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15310
15311 r_pos++;
15312
15313 salt->scrypt_r = atoi (r_pos);
15314
15315 // p
15316
15317 char *p_pos = strchr (r_pos, ':');
15318
15319 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15320
15321 p_pos++;
15322
15323 salt->scrypt_p = atoi (p_pos);
15324
15325 // salt
15326
15327 char *saltbuf_pos = strchr (p_pos, ':');
15328
15329 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15330
15331 saltbuf_pos++;
15332
15333 char *hash_pos = strchr (saltbuf_pos, ':');
15334
15335 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15336
15337 hash_pos++;
15338
15339 // base64 decode
15340
15341 int salt_len_base64 = hash_pos - saltbuf_pos;
15342
15343 if (salt_len_base64 > 45) return (PARSER_SALT_LENGTH);
15344
15345 u8 tmp_buf[33] = { 0 };
15346
15347 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, salt_len_base64, tmp_buf);
15348
15349 char *salt_buf_ptr = (char *) salt->salt_buf;
15350
15351 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
15352
15353 salt->salt_len = tmp_len;
15354 salt->salt_iter = 1;
15355
15356 // digest - base64 decode
15357
15358 memset (tmp_buf, 0, sizeof (tmp_buf));
15359
15360 tmp_len = input_len - (hash_pos - input_buf);
15361
15362 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
15363
15364 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
15365
15366 memcpy (digest, tmp_buf, 32);
15367
15368 return (PARSER_OK);
15369 }
15370
15371 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15372 {
15373 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
15374
15375 u32 *digest = (u32 *) hash_buf->digest;
15376
15377 salt_t *salt = hash_buf->salt;
15378
15379 /**
15380 * parse line
15381 */
15382
15383 char decrypted[76] = { 0 }; // iv + hash
15384
15385 juniper_decrypt_hash (input_buf, decrypted);
15386
15387 char *md5crypt_hash = decrypted + 12;
15388
15389 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
15390
15391 salt->salt_iter = ROUNDS_MD5CRYPT;
15392
15393 char *salt_pos = md5crypt_hash + 3;
15394
15395 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
15396
15397 salt->salt_len = hash_pos - salt_pos; // should be 8
15398
15399 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
15400
15401 hash_pos++;
15402
15403 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
15404
15405 return (PARSER_OK);
15406 }
15407
15408 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15409 {
15410 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
15411
15412 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15413
15414 u32 *digest = (u32 *) hash_buf->digest;
15415
15416 salt_t *salt = hash_buf->salt;
15417
15418 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15419
15420 /**
15421 * parse line
15422 */
15423
15424 // first is *raw* salt
15425
15426 char *salt_pos = input_buf + 3;
15427
15428 char *hash_pos = strchr (salt_pos, '$');
15429
15430 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15431
15432 uint salt_len = hash_pos - salt_pos;
15433
15434 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15435
15436 hash_pos++;
15437
15438 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15439
15440 memcpy (salt_buf_ptr, salt_pos, 14);
15441
15442 salt_buf_ptr[17] = 0x01;
15443 salt_buf_ptr[18] = 0x80;
15444
15445 // add some stuff to normal salt to make sorted happy
15446
15447 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15448 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15449 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15450 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15451
15452 salt->salt_len = salt_len;
15453 salt->salt_iter = ROUNDS_CISCO8 - 1;
15454
15455 // base64 decode hash
15456
15457 u8 tmp_buf[100] = { 0 };
15458
15459 uint hash_len = input_len - 3 - salt_len - 1;
15460
15461 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15462
15463 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15464
15465 memcpy (digest, tmp_buf, 32);
15466
15467 digest[0] = byte_swap_32 (digest[0]);
15468 digest[1] = byte_swap_32 (digest[1]);
15469 digest[2] = byte_swap_32 (digest[2]);
15470 digest[3] = byte_swap_32 (digest[3]);
15471 digest[4] = byte_swap_32 (digest[4]);
15472 digest[5] = byte_swap_32 (digest[5]);
15473 digest[6] = byte_swap_32 (digest[6]);
15474 digest[7] = byte_swap_32 (digest[7]);
15475
15476 return (PARSER_OK);
15477 }
15478
15479 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15480 {
15481 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
15482
15483 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15484
15485 u32 *digest = (u32 *) hash_buf->digest;
15486
15487 salt_t *salt = hash_buf->salt;
15488
15489 /**
15490 * parse line
15491 */
15492
15493 // first is *raw* salt
15494
15495 char *salt_pos = input_buf + 3;
15496
15497 char *hash_pos = strchr (salt_pos, '$');
15498
15499 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15500
15501 uint salt_len = hash_pos - salt_pos;
15502
15503 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15504
15505 salt->salt_len = salt_len;
15506 hash_pos++;
15507
15508 char *salt_buf_ptr = (char *) salt->salt_buf;
15509
15510 memcpy (salt_buf_ptr, salt_pos, salt_len);
15511 salt_buf_ptr[salt_len] = 0;
15512
15513 // base64 decode hash
15514
15515 u8 tmp_buf[100] = { 0 };
15516
15517 uint hash_len = input_len - 3 - salt_len - 1;
15518
15519 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15520
15521 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15522
15523 memcpy (digest, tmp_buf, 32);
15524
15525 // fixed:
15526 salt->scrypt_N = 16384;
15527 salt->scrypt_r = 1;
15528 salt->scrypt_p = 1;
15529 salt->salt_iter = 1;
15530
15531 return (PARSER_OK);
15532 }
15533
15534 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15535 {
15536 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
15537
15538 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15539
15540 u32 *digest = (u32 *) hash_buf->digest;
15541
15542 salt_t *salt = hash_buf->salt;
15543
15544 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
15545
15546 /**
15547 * parse line
15548 */
15549
15550 char *version_pos = input_buf + 8 + 1;
15551
15552 char *verifierHashSize_pos = strchr (version_pos, '*');
15553
15554 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15555
15556 u32 version_len = verifierHashSize_pos - version_pos;
15557
15558 if (version_len != 4) return (PARSER_SALT_LENGTH);
15559
15560 verifierHashSize_pos++;
15561
15562 char *keySize_pos = strchr (verifierHashSize_pos, '*');
15563
15564 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15565
15566 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
15567
15568 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
15569
15570 keySize_pos++;
15571
15572 char *saltSize_pos = strchr (keySize_pos, '*');
15573
15574 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15575
15576 u32 keySize_len = saltSize_pos - keySize_pos;
15577
15578 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15579
15580 saltSize_pos++;
15581
15582 char *osalt_pos = strchr (saltSize_pos, '*');
15583
15584 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15585
15586 u32 saltSize_len = osalt_pos - saltSize_pos;
15587
15588 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15589
15590 osalt_pos++;
15591
15592 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15593
15594 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15595
15596 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15597
15598 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15599
15600 encryptedVerifier_pos++;
15601
15602 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15603
15604 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15605
15606 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15607
15608 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15609
15610 encryptedVerifierHash_pos++;
15611
15612 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;
15613
15614 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15615
15616 const uint version = atoi (version_pos);
15617
15618 if (version != 2007) return (PARSER_SALT_VALUE);
15619
15620 const uint verifierHashSize = atoi (verifierHashSize_pos);
15621
15622 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
15623
15624 const uint keySize = atoi (keySize_pos);
15625
15626 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
15627
15628 office2007->keySize = keySize;
15629
15630 const uint saltSize = atoi (saltSize_pos);
15631
15632 if (saltSize != 16) return (PARSER_SALT_VALUE);
15633
15634 /**
15635 * salt
15636 */
15637
15638 salt->salt_len = 16;
15639 salt->salt_iter = ROUNDS_OFFICE2007;
15640
15641 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15642 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15643 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15644 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15645
15646 /**
15647 * esalt
15648 */
15649
15650 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15651 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15652 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15653 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15654
15655 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15656 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15657 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15658 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15659 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15660
15661 /**
15662 * digest
15663 */
15664
15665 digest[0] = office2007->encryptedVerifierHash[0];
15666 digest[1] = office2007->encryptedVerifierHash[1];
15667 digest[2] = office2007->encryptedVerifierHash[2];
15668 digest[3] = office2007->encryptedVerifierHash[3];
15669
15670 return (PARSER_OK);
15671 }
15672
15673 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15674 {
15675 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
15676
15677 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15678
15679 u32 *digest = (u32 *) hash_buf->digest;
15680
15681 salt_t *salt = hash_buf->salt;
15682
15683 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
15684
15685 /**
15686 * parse line
15687 */
15688
15689 char *version_pos = input_buf + 8 + 1;
15690
15691 char *spinCount_pos = strchr (version_pos, '*');
15692
15693 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15694
15695 u32 version_len = spinCount_pos - version_pos;
15696
15697 if (version_len != 4) return (PARSER_SALT_LENGTH);
15698
15699 spinCount_pos++;
15700
15701 char *keySize_pos = strchr (spinCount_pos, '*');
15702
15703 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15704
15705 u32 spinCount_len = keySize_pos - spinCount_pos;
15706
15707 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15708
15709 keySize_pos++;
15710
15711 char *saltSize_pos = strchr (keySize_pos, '*');
15712
15713 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15714
15715 u32 keySize_len = saltSize_pos - keySize_pos;
15716
15717 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15718
15719 saltSize_pos++;
15720
15721 char *osalt_pos = strchr (saltSize_pos, '*');
15722
15723 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15724
15725 u32 saltSize_len = osalt_pos - saltSize_pos;
15726
15727 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15728
15729 osalt_pos++;
15730
15731 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15732
15733 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15734
15735 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15736
15737 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15738
15739 encryptedVerifier_pos++;
15740
15741 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15742
15743 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15744
15745 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15746
15747 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15748
15749 encryptedVerifierHash_pos++;
15750
15751 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;
15752
15753 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15754
15755 const uint version = atoi (version_pos);
15756
15757 if (version != 2010) return (PARSER_SALT_VALUE);
15758
15759 const uint spinCount = atoi (spinCount_pos);
15760
15761 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15762
15763 const uint keySize = atoi (keySize_pos);
15764
15765 if (keySize != 128) return (PARSER_SALT_VALUE);
15766
15767 const uint saltSize = atoi (saltSize_pos);
15768
15769 if (saltSize != 16) return (PARSER_SALT_VALUE);
15770
15771 /**
15772 * salt
15773 */
15774
15775 salt->salt_len = 16;
15776 salt->salt_iter = spinCount;
15777
15778 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15779 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15780 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15781 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15782
15783 /**
15784 * esalt
15785 */
15786
15787 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15788 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15789 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15790 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15791
15792 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15793 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15794 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15795 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15796 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15797 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15798 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15799 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15800
15801 /**
15802 * digest
15803 */
15804
15805 digest[0] = office2010->encryptedVerifierHash[0];
15806 digest[1] = office2010->encryptedVerifierHash[1];
15807 digest[2] = office2010->encryptedVerifierHash[2];
15808 digest[3] = office2010->encryptedVerifierHash[3];
15809
15810 return (PARSER_OK);
15811 }
15812
15813 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15814 {
15815 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15816
15817 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15818
15819 u32 *digest = (u32 *) hash_buf->digest;
15820
15821 salt_t *salt = hash_buf->salt;
15822
15823 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15824
15825 /**
15826 * parse line
15827 */
15828
15829 char *version_pos = input_buf + 8 + 1;
15830
15831 char *spinCount_pos = strchr (version_pos, '*');
15832
15833 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15834
15835 u32 version_len = spinCount_pos - version_pos;
15836
15837 if (version_len != 4) return (PARSER_SALT_LENGTH);
15838
15839 spinCount_pos++;
15840
15841 char *keySize_pos = strchr (spinCount_pos, '*');
15842
15843 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15844
15845 u32 spinCount_len = keySize_pos - spinCount_pos;
15846
15847 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15848
15849 keySize_pos++;
15850
15851 char *saltSize_pos = strchr (keySize_pos, '*');
15852
15853 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15854
15855 u32 keySize_len = saltSize_pos - keySize_pos;
15856
15857 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15858
15859 saltSize_pos++;
15860
15861 char *osalt_pos = strchr (saltSize_pos, '*');
15862
15863 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15864
15865 u32 saltSize_len = osalt_pos - saltSize_pos;
15866
15867 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15868
15869 osalt_pos++;
15870
15871 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15872
15873 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15874
15875 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15876
15877 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15878
15879 encryptedVerifier_pos++;
15880
15881 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15882
15883 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15884
15885 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15886
15887 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15888
15889 encryptedVerifierHash_pos++;
15890
15891 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;
15892
15893 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15894
15895 const uint version = atoi (version_pos);
15896
15897 if (version != 2013) return (PARSER_SALT_VALUE);
15898
15899 const uint spinCount = atoi (spinCount_pos);
15900
15901 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15902
15903 const uint keySize = atoi (keySize_pos);
15904
15905 if (keySize != 256) return (PARSER_SALT_VALUE);
15906
15907 const uint saltSize = atoi (saltSize_pos);
15908
15909 if (saltSize != 16) return (PARSER_SALT_VALUE);
15910
15911 /**
15912 * salt
15913 */
15914
15915 salt->salt_len = 16;
15916 salt->salt_iter = spinCount;
15917
15918 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15919 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15920 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15921 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15922
15923 /**
15924 * esalt
15925 */
15926
15927 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15928 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15929 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15930 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15931
15932 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15933 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15934 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15935 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15936 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15937 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15938 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15939 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15940
15941 /**
15942 * digest
15943 */
15944
15945 digest[0] = office2013->encryptedVerifierHash[0];
15946 digest[1] = office2013->encryptedVerifierHash[1];
15947 digest[2] = office2013->encryptedVerifierHash[2];
15948 digest[3] = office2013->encryptedVerifierHash[3];
15949
15950 return (PARSER_OK);
15951 }
15952
15953 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15954 {
15955 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15956
15957 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15958
15959 u32 *digest = (u32 *) hash_buf->digest;
15960
15961 salt_t *salt = hash_buf->salt;
15962
15963 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15964
15965 /**
15966 * parse line
15967 */
15968
15969 char *version_pos = input_buf + 11;
15970
15971 char *osalt_pos = strchr (version_pos, '*');
15972
15973 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15974
15975 u32 version_len = osalt_pos - version_pos;
15976
15977 if (version_len != 1) return (PARSER_SALT_LENGTH);
15978
15979 osalt_pos++;
15980
15981 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15982
15983 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15984
15985 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15986
15987 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15988
15989 encryptedVerifier_pos++;
15990
15991 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15992
15993 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15994
15995 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15996
15997 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15998
15999 encryptedVerifierHash_pos++;
16000
16001 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16002
16003 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16004
16005 const uint version = *version_pos - 0x30;
16006
16007 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16008
16009 /**
16010 * esalt
16011 */
16012
16013 oldoffice01->version = version;
16014
16015 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16016 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16017 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16018 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16019
16020 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16021 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16022 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16023 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16024
16025 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16026 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16027 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16028 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16029
16030 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16031 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16032 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16033 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16034
16035 /**
16036 * salt
16037 */
16038
16039 salt->salt_len = 16;
16040
16041 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16042 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16043 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16044 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16045
16046 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16047 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16048 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16049 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16050
16051 // this is a workaround as office produces multiple documents with the same salt
16052
16053 salt->salt_len += 32;
16054
16055 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16056 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16057 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16058 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16059 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16060 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16061 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16062 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16063
16064 /**
16065 * digest
16066 */
16067
16068 digest[0] = oldoffice01->encryptedVerifierHash[0];
16069 digest[1] = oldoffice01->encryptedVerifierHash[1];
16070 digest[2] = oldoffice01->encryptedVerifierHash[2];
16071 digest[3] = oldoffice01->encryptedVerifierHash[3];
16072
16073 return (PARSER_OK);
16074 }
16075
16076 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16077 {
16078 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
16079 }
16080
16081 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16082 {
16083 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
16084
16085 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16086
16087 u32 *digest = (u32 *) hash_buf->digest;
16088
16089 salt_t *salt = hash_buf->salt;
16090
16091 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
16092
16093 /**
16094 * parse line
16095 */
16096
16097 char *version_pos = input_buf + 11;
16098
16099 char *osalt_pos = strchr (version_pos, '*');
16100
16101 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16102
16103 u32 version_len = osalt_pos - version_pos;
16104
16105 if (version_len != 1) return (PARSER_SALT_LENGTH);
16106
16107 osalt_pos++;
16108
16109 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16110
16111 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16112
16113 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16114
16115 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16116
16117 encryptedVerifier_pos++;
16118
16119 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16120
16121 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16122
16123 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16124
16125 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16126
16127 encryptedVerifierHash_pos++;
16128
16129 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16130
16131 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16132
16133 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16134
16135 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16136
16137 rc4key_pos++;
16138
16139 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16140
16141 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16142
16143 const uint version = *version_pos - 0x30;
16144
16145 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16146
16147 /**
16148 * esalt
16149 */
16150
16151 oldoffice01->version = version;
16152
16153 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16154 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16155 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16156 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16157
16158 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16159 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16160 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16161 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16162
16163 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16164 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16165 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16166 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16167
16168 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16169 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16170 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16171 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16172
16173 oldoffice01->rc4key[1] = 0;
16174 oldoffice01->rc4key[0] = 0;
16175
16176 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16177 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16178 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16179 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16180 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16181 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16182 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16183 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16184 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16185 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16186
16187 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
16188 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
16189
16190 /**
16191 * salt
16192 */
16193
16194 salt->salt_len = 16;
16195
16196 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16197 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16198 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16199 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16200
16201 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16202 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16203 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16204 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16205
16206 // this is a workaround as office produces multiple documents with the same salt
16207
16208 salt->salt_len += 32;
16209
16210 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16211 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16212 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16213 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16214 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16215 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16216 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16217 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16218
16219 /**
16220 * digest
16221 */
16222
16223 digest[0] = oldoffice01->rc4key[0];
16224 digest[1] = oldoffice01->rc4key[1];
16225 digest[2] = 0;
16226 digest[3] = 0;
16227
16228 return (PARSER_OK);
16229 }
16230
16231 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16232 {
16233 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
16234
16235 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16236
16237 u32 *digest = (u32 *) hash_buf->digest;
16238
16239 salt_t *salt = hash_buf->salt;
16240
16241 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16242
16243 /**
16244 * parse line
16245 */
16246
16247 char *version_pos = input_buf + 11;
16248
16249 char *osalt_pos = strchr (version_pos, '*');
16250
16251 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16252
16253 u32 version_len = osalt_pos - version_pos;
16254
16255 if (version_len != 1) return (PARSER_SALT_LENGTH);
16256
16257 osalt_pos++;
16258
16259 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16260
16261 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16262
16263 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16264
16265 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16266
16267 encryptedVerifier_pos++;
16268
16269 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16270
16271 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16272
16273 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16274
16275 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16276
16277 encryptedVerifierHash_pos++;
16278
16279 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16280
16281 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16282
16283 const uint version = *version_pos - 0x30;
16284
16285 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16286
16287 /**
16288 * esalt
16289 */
16290
16291 oldoffice34->version = version;
16292
16293 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16294 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16295 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16296 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16297
16298 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16299 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16300 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16301 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16302
16303 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16304 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16305 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16306 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16307 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16308
16309 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16310 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16311 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16312 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16313 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16314
16315 /**
16316 * salt
16317 */
16318
16319 salt->salt_len = 16;
16320
16321 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16322 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16323 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16324 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16325
16326 // this is a workaround as office produces multiple documents with the same salt
16327
16328 salt->salt_len += 32;
16329
16330 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16331 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16332 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16333 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16334 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16335 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16336 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16337 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16338
16339 /**
16340 * digest
16341 */
16342
16343 digest[0] = oldoffice34->encryptedVerifierHash[0];
16344 digest[1] = oldoffice34->encryptedVerifierHash[1];
16345 digest[2] = oldoffice34->encryptedVerifierHash[2];
16346 digest[3] = oldoffice34->encryptedVerifierHash[3];
16347
16348 return (PARSER_OK);
16349 }
16350
16351 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16352 {
16353 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16354
16355 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
16356 }
16357
16358 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16359 {
16360 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
16361
16362 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16363
16364 u32 *digest = (u32 *) hash_buf->digest;
16365
16366 salt_t *salt = hash_buf->salt;
16367
16368 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16369
16370 /**
16371 * parse line
16372 */
16373
16374 char *version_pos = input_buf + 11;
16375
16376 char *osalt_pos = strchr (version_pos, '*');
16377
16378 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16379
16380 u32 version_len = osalt_pos - version_pos;
16381
16382 if (version_len != 1) return (PARSER_SALT_LENGTH);
16383
16384 osalt_pos++;
16385
16386 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16387
16388 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16389
16390 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16391
16392 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16393
16394 encryptedVerifier_pos++;
16395
16396 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16397
16398 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16399
16400 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16401
16402 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16403
16404 encryptedVerifierHash_pos++;
16405
16406 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16407
16408 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16409
16410 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16411
16412 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16413
16414 rc4key_pos++;
16415
16416 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16417
16418 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16419
16420 const uint version = *version_pos - 0x30;
16421
16422 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16423
16424 /**
16425 * esalt
16426 */
16427
16428 oldoffice34->version = version;
16429
16430 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16431 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16432 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16433 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16434
16435 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16436 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16437 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16438 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16439
16440 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16441 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16442 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16443 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16444 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16445
16446 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16447 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16448 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16449 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16450 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16451
16452 oldoffice34->rc4key[1] = 0;
16453 oldoffice34->rc4key[0] = 0;
16454
16455 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16456 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16457 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16458 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16459 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16460 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16461 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16462 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16463 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16464 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16465
16466 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
16467 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
16468
16469 /**
16470 * salt
16471 */
16472
16473 salt->salt_len = 16;
16474
16475 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16476 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16477 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16478 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16479
16480 // this is a workaround as office produces multiple documents with the same salt
16481
16482 salt->salt_len += 32;
16483
16484 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16485 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16486 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16487 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16488 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16489 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16490 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16491 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16492
16493 /**
16494 * digest
16495 */
16496
16497 digest[0] = oldoffice34->rc4key[0];
16498 digest[1] = oldoffice34->rc4key[1];
16499 digest[2] = 0;
16500 digest[3] = 0;
16501
16502 return (PARSER_OK);
16503 }
16504
16505 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16506 {
16507 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
16508
16509 u32 *digest = (u32 *) hash_buf->digest;
16510
16511 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16512 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16513 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16514 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16515
16516 digest[0] = byte_swap_32 (digest[0]);
16517 digest[1] = byte_swap_32 (digest[1]);
16518 digest[2] = byte_swap_32 (digest[2]);
16519 digest[3] = byte_swap_32 (digest[3]);
16520
16521 return (PARSER_OK);
16522 }
16523
16524 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16525 {
16526 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
16527
16528 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16529
16530 u32 *digest = (u32 *) hash_buf->digest;
16531
16532 salt_t *salt = hash_buf->salt;
16533
16534 char *signature_pos = input_buf;
16535
16536 char *salt_pos = strchr (signature_pos, '$');
16537
16538 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16539
16540 u32 signature_len = salt_pos - signature_pos;
16541
16542 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
16543
16544 salt_pos++;
16545
16546 char *hash_pos = strchr (salt_pos, '$');
16547
16548 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16549
16550 u32 salt_len = hash_pos - salt_pos;
16551
16552 if (salt_len > 32) return (PARSER_SALT_LENGTH);
16553
16554 hash_pos++;
16555
16556 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
16557
16558 if (hash_len != 40) return (PARSER_SALT_LENGTH);
16559
16560 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
16561 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
16562 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
16563 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
16564 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
16565
16566 digest[0] -= SHA1M_A;
16567 digest[1] -= SHA1M_B;
16568 digest[2] -= SHA1M_C;
16569 digest[3] -= SHA1M_D;
16570 digest[4] -= SHA1M_E;
16571
16572 char *salt_buf_ptr = (char *) salt->salt_buf;
16573
16574 memcpy (salt_buf_ptr, salt_pos, salt_len);
16575
16576 salt->salt_len = salt_len;
16577
16578 return (PARSER_OK);
16579 }
16580
16581 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16582 {
16583 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
16584
16585 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
16586
16587 u32 *digest = (u32 *) hash_buf->digest;
16588
16589 salt_t *salt = hash_buf->salt;
16590
16591 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16592
16593 /**
16594 * parse line
16595 */
16596
16597 char *iter_pos = input_buf + 14;
16598
16599 const int iter = atoi (iter_pos);
16600
16601 if (iter < 1) return (PARSER_SALT_ITERATION);
16602
16603 salt->salt_iter = iter - 1;
16604
16605 char *salt_pos = strchr (iter_pos, '$');
16606
16607 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16608
16609 salt_pos++;
16610
16611 char *hash_pos = strchr (salt_pos, '$');
16612
16613 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16614
16615 const uint salt_len = hash_pos - salt_pos;
16616
16617 hash_pos++;
16618
16619 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16620
16621 memcpy (salt_buf_ptr, salt_pos, salt_len);
16622
16623 salt->salt_len = salt_len;
16624
16625 salt_buf_ptr[salt_len + 3] = 0x01;
16626 salt_buf_ptr[salt_len + 4] = 0x80;
16627
16628 // add some stuff to normal salt to make sorted happy
16629
16630 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16631 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16632 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16633 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16634 salt->salt_buf[4] = salt->salt_iter;
16635
16636 // base64 decode hash
16637
16638 u8 tmp_buf[100] = { 0 };
16639
16640 uint hash_len = input_len - (hash_pos - input_buf);
16641
16642 if (hash_len != 44) return (PARSER_HASH_LENGTH);
16643
16644 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16645
16646 memcpy (digest, tmp_buf, 32);
16647
16648 digest[0] = byte_swap_32 (digest[0]);
16649 digest[1] = byte_swap_32 (digest[1]);
16650 digest[2] = byte_swap_32 (digest[2]);
16651 digest[3] = byte_swap_32 (digest[3]);
16652 digest[4] = byte_swap_32 (digest[4]);
16653 digest[5] = byte_swap_32 (digest[5]);
16654 digest[6] = byte_swap_32 (digest[6]);
16655 digest[7] = byte_swap_32 (digest[7]);
16656
16657 return (PARSER_OK);
16658 }
16659
16660 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16661 {
16662 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
16663
16664 u32 *digest = (u32 *) hash_buf->digest;
16665
16666 salt_t *salt = hash_buf->salt;
16667
16668 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16669 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16670 digest[2] = 0;
16671 digest[3] = 0;
16672
16673 digest[0] = byte_swap_32 (digest[0]);
16674 digest[1] = byte_swap_32 (digest[1]);
16675
16676 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16677 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16678 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16679
16680 char iter_c = input_buf[17];
16681 char iter_d = input_buf[19];
16682
16683 // atm only defaults, let's see if there's more request
16684 if (iter_c != '2') return (PARSER_SALT_ITERATION);
16685 if (iter_d != '4') return (PARSER_SALT_ITERATION);
16686
16687 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
16688
16689 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
16690 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
16691 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
16692 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
16693
16694 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16695 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16696 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16697 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16698
16699 salt->salt_len = 16;
16700
16701 return (PARSER_OK);
16702 }
16703
16704 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16705 {
16706 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
16707
16708 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16709
16710 u32 *digest = (u32 *) hash_buf->digest;
16711
16712 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
16713
16714 salt_t *salt = hash_buf->salt;
16715
16716 char *salt_pos = input_buf + 10;
16717
16718 char *hash_pos = strchr (salt_pos, '$');
16719
16720 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16721
16722 uint salt_len = hash_pos - salt_pos;
16723
16724 hash_pos++;
16725
16726 uint hash_len = input_len - 10 - salt_len - 1;
16727
16728 // base64 decode salt
16729
16730 if (salt_len > 133) return (PARSER_SALT_LENGTH);
16731
16732 u8 tmp_buf[100] = { 0 };
16733
16734 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
16735
16736 if (salt_len > 55) return (PARSER_SALT_LENGTH);
16737
16738 tmp_buf[salt_len] = 0x80;
16739
16740 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
16741
16742 salt->salt_len = salt_len;
16743
16744 // base64 decode hash
16745
16746 if (hash_len > 133) return (PARSER_HASH_LENGTH);
16747
16748 memset (tmp_buf, 0, sizeof (tmp_buf));
16749
16750 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16751
16752 if (hash_len < 32 + 1) return (PARSER_SALT_LENGTH);
16753
16754 uint user_len = hash_len - 32;
16755
16756 const u8 *tmp_hash = tmp_buf + user_len;
16757
16758 user_len--; // skip the trailing space
16759
16760 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16761 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16762 digest[2] = hex_to_u32 (&tmp_hash[16]);
16763 digest[3] = hex_to_u32 (&tmp_hash[24]);
16764
16765 digest[0] = byte_swap_32 (digest[0]);
16766 digest[1] = byte_swap_32 (digest[1]);
16767 digest[2] = byte_swap_32 (digest[2]);
16768 digest[3] = byte_swap_32 (digest[3]);
16769
16770 // store username for host only (output hash if cracked)
16771
16772 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16773 memcpy (cram_md5->user, tmp_buf, user_len);
16774
16775 return (PARSER_OK);
16776 }
16777
16778 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16779 {
16780 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16781
16782 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16783
16784 u32 *digest = (u32 *) hash_buf->digest;
16785
16786 salt_t *salt = hash_buf->salt;
16787
16788 char *iter_pos = input_buf + 10;
16789
16790 u32 iter = atoi (iter_pos);
16791
16792 if (iter < 1)
16793 {
16794 return (PARSER_SALT_ITERATION);
16795 }
16796
16797 iter--; // first iteration is special
16798
16799 salt->salt_iter = iter;
16800
16801 char *base64_pos = strchr (iter_pos, '}');
16802
16803 if (base64_pos == NULL)
16804 {
16805 return (PARSER_SIGNATURE_UNMATCHED);
16806 }
16807
16808 base64_pos++;
16809
16810 // base64 decode salt
16811
16812 u32 base64_len = input_len - (base64_pos - input_buf);
16813
16814 u8 tmp_buf[100] = { 0 };
16815
16816 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16817
16818 if (decoded_len < 24)
16819 {
16820 return (PARSER_SALT_LENGTH);
16821 }
16822
16823 // copy the salt
16824
16825 uint salt_len = decoded_len - 20;
16826
16827 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16828 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16829
16830 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16831
16832 salt->salt_len = salt_len;
16833
16834 // set digest
16835
16836 u32 *digest_ptr = (u32*) tmp_buf;
16837
16838 digest[0] = byte_swap_32 (digest_ptr[0]);
16839 digest[1] = byte_swap_32 (digest_ptr[1]);
16840 digest[2] = byte_swap_32 (digest_ptr[2]);
16841 digest[3] = byte_swap_32 (digest_ptr[3]);
16842 digest[4] = byte_swap_32 (digest_ptr[4]);
16843
16844 return (PARSER_OK);
16845 }
16846
16847 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16848 {
16849 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16850
16851 u32 *digest = (u32 *) hash_buf->digest;
16852
16853 salt_t *salt = hash_buf->salt;
16854
16855 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16856 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16857 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16858 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16859 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16860
16861 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16862
16863 uint salt_len = input_len - 40 - 1;
16864
16865 char *salt_buf = input_buf + 40 + 1;
16866
16867 char *salt_buf_ptr = (char *) salt->salt_buf;
16868
16869 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16870
16871 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16872
16873 salt->salt_len = salt_len;
16874
16875 return (PARSER_OK);
16876 }
16877
16878 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16879 {
16880 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16881
16882 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16883
16884 u32 *digest = (u32 *) hash_buf->digest;
16885
16886 salt_t *salt = hash_buf->salt;
16887
16888 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16889
16890 /**
16891 * parse line
16892 */
16893
16894 char *V_pos = input_buf + 5;
16895
16896 char *R_pos = strchr (V_pos, '*');
16897
16898 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16899
16900 u32 V_len = R_pos - V_pos;
16901
16902 R_pos++;
16903
16904 char *bits_pos = strchr (R_pos, '*');
16905
16906 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16907
16908 u32 R_len = bits_pos - R_pos;
16909
16910 bits_pos++;
16911
16912 char *P_pos = strchr (bits_pos, '*');
16913
16914 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16915
16916 u32 bits_len = P_pos - bits_pos;
16917
16918 P_pos++;
16919
16920 char *enc_md_pos = strchr (P_pos, '*');
16921
16922 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16923
16924 u32 P_len = enc_md_pos - P_pos;
16925
16926 enc_md_pos++;
16927
16928 char *id_len_pos = strchr (enc_md_pos, '*');
16929
16930 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16931
16932 u32 enc_md_len = id_len_pos - enc_md_pos;
16933
16934 id_len_pos++;
16935
16936 char *id_buf_pos = strchr (id_len_pos, '*');
16937
16938 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16939
16940 u32 id_len_len = id_buf_pos - id_len_pos;
16941
16942 id_buf_pos++;
16943
16944 char *u_len_pos = strchr (id_buf_pos, '*');
16945
16946 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16947
16948 u32 id_buf_len = u_len_pos - id_buf_pos;
16949
16950 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16951
16952 u_len_pos++;
16953
16954 char *u_buf_pos = strchr (u_len_pos, '*');
16955
16956 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16957
16958 u32 u_len_len = u_buf_pos - u_len_pos;
16959
16960 u_buf_pos++;
16961
16962 char *o_len_pos = strchr (u_buf_pos, '*');
16963
16964 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16965
16966 u32 u_buf_len = o_len_pos - u_buf_pos;
16967
16968 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16969
16970 o_len_pos++;
16971
16972 char *o_buf_pos = strchr (o_len_pos, '*');
16973
16974 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16975
16976 u32 o_len_len = o_buf_pos - o_len_pos;
16977
16978 o_buf_pos++;
16979
16980 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;
16981
16982 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16983
16984 // validate data
16985
16986 const int V = atoi (V_pos);
16987 const int R = atoi (R_pos);
16988 const int P = atoi (P_pos);
16989
16990 if (V != 1) return (PARSER_SALT_VALUE);
16991 if (R != 2) return (PARSER_SALT_VALUE);
16992
16993 const int enc_md = atoi (enc_md_pos);
16994
16995 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16996
16997 const int id_len = atoi (id_len_pos);
16998 const int u_len = atoi (u_len_pos);
16999 const int o_len = atoi (o_len_pos);
17000
17001 if (id_len != 16) return (PARSER_SALT_VALUE);
17002 if (u_len != 32) return (PARSER_SALT_VALUE);
17003 if (o_len != 32) return (PARSER_SALT_VALUE);
17004
17005 const int bits = atoi (bits_pos);
17006
17007 if (bits != 40) return (PARSER_SALT_VALUE);
17008
17009 // copy data to esalt
17010
17011 pdf->V = V;
17012 pdf->R = R;
17013 pdf->P = P;
17014
17015 pdf->enc_md = enc_md;
17016
17017 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17018 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17019 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17020 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17021 pdf->id_len = id_len;
17022
17023 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17024 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17025 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17026 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17027 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17028 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17029 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17030 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17031 pdf->u_len = u_len;
17032
17033 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17034 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17035 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17036 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17037 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17038 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17039 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17040 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17041 pdf->o_len = o_len;
17042
17043 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17044 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17045 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17046 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17047
17048 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17049 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17050 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17051 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17052 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17053 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17054 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17055 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17056
17057 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17058 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17059 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17060 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17061 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17062 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17063 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17064 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17065
17066 // we use ID for salt, maybe needs to change, we will see...
17067
17068 salt->salt_buf[0] = pdf->id_buf[0];
17069 salt->salt_buf[1] = pdf->id_buf[1];
17070 salt->salt_buf[2] = pdf->id_buf[2];
17071 salt->salt_buf[3] = pdf->id_buf[3];
17072 salt->salt_len = pdf->id_len;
17073
17074 digest[0] = pdf->u_buf[0];
17075 digest[1] = pdf->u_buf[1];
17076 digest[2] = pdf->u_buf[2];
17077 digest[3] = pdf->u_buf[3];
17078
17079 return (PARSER_OK);
17080 }
17081
17082 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17083 {
17084 return pdf11_parse_hash (input_buf, input_len, hash_buf);
17085 }
17086
17087 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17088 {
17089 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
17090
17091 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17092
17093 u32 *digest = (u32 *) hash_buf->digest;
17094
17095 salt_t *salt = hash_buf->salt;
17096
17097 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17098
17099 /**
17100 * parse line
17101 */
17102
17103 char *V_pos = input_buf + 5;
17104
17105 char *R_pos = strchr (V_pos, '*');
17106
17107 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17108
17109 u32 V_len = R_pos - V_pos;
17110
17111 R_pos++;
17112
17113 char *bits_pos = strchr (R_pos, '*');
17114
17115 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17116
17117 u32 R_len = bits_pos - R_pos;
17118
17119 bits_pos++;
17120
17121 char *P_pos = strchr (bits_pos, '*');
17122
17123 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17124
17125 u32 bits_len = P_pos - bits_pos;
17126
17127 P_pos++;
17128
17129 char *enc_md_pos = strchr (P_pos, '*');
17130
17131 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17132
17133 u32 P_len = enc_md_pos - P_pos;
17134
17135 enc_md_pos++;
17136
17137 char *id_len_pos = strchr (enc_md_pos, '*');
17138
17139 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17140
17141 u32 enc_md_len = id_len_pos - enc_md_pos;
17142
17143 id_len_pos++;
17144
17145 char *id_buf_pos = strchr (id_len_pos, '*');
17146
17147 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17148
17149 u32 id_len_len = id_buf_pos - id_len_pos;
17150
17151 id_buf_pos++;
17152
17153 char *u_len_pos = strchr (id_buf_pos, '*');
17154
17155 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17156
17157 u32 id_buf_len = u_len_pos - id_buf_pos;
17158
17159 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
17160
17161 u_len_pos++;
17162
17163 char *u_buf_pos = strchr (u_len_pos, '*');
17164
17165 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17166
17167 u32 u_len_len = u_buf_pos - u_len_pos;
17168
17169 u_buf_pos++;
17170
17171 char *o_len_pos = strchr (u_buf_pos, '*');
17172
17173 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17174
17175 u32 u_buf_len = o_len_pos - u_buf_pos;
17176
17177 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17178
17179 o_len_pos++;
17180
17181 char *o_buf_pos = strchr (o_len_pos, '*');
17182
17183 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17184
17185 u32 o_len_len = o_buf_pos - o_len_pos;
17186
17187 o_buf_pos++;
17188
17189 char *rc4key_pos = strchr (o_buf_pos, ':');
17190
17191 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17192
17193 u32 o_buf_len = rc4key_pos - o_buf_pos;
17194
17195 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17196
17197 rc4key_pos++;
17198
17199 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;
17200
17201 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
17202
17203 // validate data
17204
17205 const int V = atoi (V_pos);
17206 const int R = atoi (R_pos);
17207 const int P = atoi (P_pos);
17208
17209 if (V != 1) return (PARSER_SALT_VALUE);
17210 if (R != 2) return (PARSER_SALT_VALUE);
17211
17212 const int enc_md = atoi (enc_md_pos);
17213
17214 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17215
17216 const int id_len = atoi (id_len_pos);
17217 const int u_len = atoi (u_len_pos);
17218 const int o_len = atoi (o_len_pos);
17219
17220 if (id_len != 16) return (PARSER_SALT_VALUE);
17221 if (u_len != 32) return (PARSER_SALT_VALUE);
17222 if (o_len != 32) return (PARSER_SALT_VALUE);
17223
17224 const int bits = atoi (bits_pos);
17225
17226 if (bits != 40) return (PARSER_SALT_VALUE);
17227
17228 // copy data to esalt
17229
17230 pdf->V = V;
17231 pdf->R = R;
17232 pdf->P = P;
17233
17234 pdf->enc_md = enc_md;
17235
17236 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17237 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17238 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17239 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17240 pdf->id_len = id_len;
17241
17242 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17243 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17244 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17245 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17246 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17247 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17248 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17249 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17250 pdf->u_len = u_len;
17251
17252 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17253 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17254 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17255 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17256 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17257 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17258 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17259 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17260 pdf->o_len = o_len;
17261
17262 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17263 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17264 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17265 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17266
17267 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17268 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17269 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17270 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17271 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17272 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17273 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17274 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17275
17276 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17277 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17278 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17279 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17280 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17281 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17282 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17283 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17284
17285 pdf->rc4key[1] = 0;
17286 pdf->rc4key[0] = 0;
17287
17288 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
17289 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
17290 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
17291 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
17292 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
17293 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
17294 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
17295 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
17296 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
17297 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
17298
17299 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
17300 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
17301
17302 // we use ID for salt, maybe needs to change, we will see...
17303
17304 salt->salt_buf[0] = pdf->id_buf[0];
17305 salt->salt_buf[1] = pdf->id_buf[1];
17306 salt->salt_buf[2] = pdf->id_buf[2];
17307 salt->salt_buf[3] = pdf->id_buf[3];
17308 salt->salt_buf[4] = pdf->u_buf[0];
17309 salt->salt_buf[5] = pdf->u_buf[1];
17310 salt->salt_buf[6] = pdf->o_buf[0];
17311 salt->salt_buf[7] = pdf->o_buf[1];
17312 salt->salt_len = pdf->id_len + 16;
17313
17314 digest[0] = pdf->rc4key[0];
17315 digest[1] = pdf->rc4key[1];
17316 digest[2] = 0;
17317 digest[3] = 0;
17318
17319 return (PARSER_OK);
17320 }
17321
17322 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17323 {
17324 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
17325
17326 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17327
17328 u32 *digest = (u32 *) hash_buf->digest;
17329
17330 salt_t *salt = hash_buf->salt;
17331
17332 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17333
17334 /**
17335 * parse line
17336 */
17337
17338 char *V_pos = input_buf + 5;
17339
17340 char *R_pos = strchr (V_pos, '*');
17341
17342 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17343
17344 u32 V_len = R_pos - V_pos;
17345
17346 R_pos++;
17347
17348 char *bits_pos = strchr (R_pos, '*');
17349
17350 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17351
17352 u32 R_len = bits_pos - R_pos;
17353
17354 bits_pos++;
17355
17356 char *P_pos = strchr (bits_pos, '*');
17357
17358 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17359
17360 u32 bits_len = P_pos - bits_pos;
17361
17362 P_pos++;
17363
17364 char *enc_md_pos = strchr (P_pos, '*');
17365
17366 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17367
17368 u32 P_len = enc_md_pos - P_pos;
17369
17370 enc_md_pos++;
17371
17372 char *id_len_pos = strchr (enc_md_pos, '*');
17373
17374 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17375
17376 u32 enc_md_len = id_len_pos - enc_md_pos;
17377
17378 id_len_pos++;
17379
17380 char *id_buf_pos = strchr (id_len_pos, '*');
17381
17382 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17383
17384 u32 id_len_len = id_buf_pos - id_len_pos;
17385
17386 id_buf_pos++;
17387
17388 char *u_len_pos = strchr (id_buf_pos, '*');
17389
17390 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17391
17392 u32 id_buf_len = u_len_pos - id_buf_pos;
17393
17394 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
17395
17396 u_len_pos++;
17397
17398 char *u_buf_pos = strchr (u_len_pos, '*');
17399
17400 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17401
17402 u32 u_len_len = u_buf_pos - u_len_pos;
17403
17404 u_buf_pos++;
17405
17406 char *o_len_pos = strchr (u_buf_pos, '*');
17407
17408 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17409
17410 u32 u_buf_len = o_len_pos - u_buf_pos;
17411
17412 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17413
17414 o_len_pos++;
17415
17416 char *o_buf_pos = strchr (o_len_pos, '*');
17417
17418 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17419
17420 u32 o_len_len = o_buf_pos - o_len_pos;
17421
17422 o_buf_pos++;
17423
17424 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;
17425
17426 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17427
17428 // validate data
17429
17430 const int V = atoi (V_pos);
17431 const int R = atoi (R_pos);
17432 const int P = atoi (P_pos);
17433
17434 int vr_ok = 0;
17435
17436 if ((V == 2) && (R == 3)) vr_ok = 1;
17437 if ((V == 4) && (R == 4)) vr_ok = 1;
17438
17439 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17440
17441 const int id_len = atoi (id_len_pos);
17442 const int u_len = atoi (u_len_pos);
17443 const int o_len = atoi (o_len_pos);
17444
17445 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
17446
17447 if (u_len != 32) return (PARSER_SALT_VALUE);
17448 if (o_len != 32) return (PARSER_SALT_VALUE);
17449
17450 const int bits = atoi (bits_pos);
17451
17452 if (bits != 128) return (PARSER_SALT_VALUE);
17453
17454 int enc_md = 1;
17455
17456 if (R >= 4)
17457 {
17458 enc_md = atoi (enc_md_pos);
17459 }
17460
17461 // copy data to esalt
17462
17463 pdf->V = V;
17464 pdf->R = R;
17465 pdf->P = P;
17466
17467 pdf->enc_md = enc_md;
17468
17469 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17470 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17471 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17472 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17473
17474 if (id_len == 32)
17475 {
17476 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
17477 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
17478 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
17479 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
17480 }
17481
17482 pdf->id_len = id_len;
17483
17484 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17485 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17486 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17487 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17488 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17489 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17490 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17491 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17492 pdf->u_len = u_len;
17493
17494 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17495 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17496 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17497 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17498 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17499 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17500 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17501 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17502 pdf->o_len = o_len;
17503
17504 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17505 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17506 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17507 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17508
17509 if (id_len == 32)
17510 {
17511 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
17512 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
17513 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
17514 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
17515 }
17516
17517 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17518 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17519 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17520 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17521 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17522 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17523 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17524 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17525
17526 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17527 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17528 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17529 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17530 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17531 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17532 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17533 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17534
17535 // precompute rc4 data for later use
17536
17537 uint padding[8] =
17538 {
17539 0x5e4ebf28,
17540 0x418a754e,
17541 0x564e0064,
17542 0x0801faff,
17543 0xb6002e2e,
17544 0x803e68d0,
17545 0xfea90c2f,
17546 0x7a695364
17547 };
17548
17549 // md5
17550
17551 uint salt_pc_block[32] = { 0 };
17552
17553 char *salt_pc_ptr = (char *) salt_pc_block;
17554
17555 memcpy (salt_pc_ptr, padding, 32);
17556 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
17557
17558 uint salt_pc_digest[4] = { 0 };
17559
17560 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
17561
17562 pdf->rc4data[0] = salt_pc_digest[0];
17563 pdf->rc4data[1] = salt_pc_digest[1];
17564
17565 // we use ID for salt, maybe needs to change, we will see...
17566
17567 salt->salt_buf[0] = pdf->id_buf[0];
17568 salt->salt_buf[1] = pdf->id_buf[1];
17569 salt->salt_buf[2] = pdf->id_buf[2];
17570 salt->salt_buf[3] = pdf->id_buf[3];
17571 salt->salt_buf[4] = pdf->u_buf[0];
17572 salt->salt_buf[5] = pdf->u_buf[1];
17573 salt->salt_buf[6] = pdf->o_buf[0];
17574 salt->salt_buf[7] = pdf->o_buf[1];
17575 salt->salt_len = pdf->id_len + 16;
17576
17577 salt->salt_iter = ROUNDS_PDF14;
17578
17579 digest[0] = pdf->u_buf[0];
17580 digest[1] = pdf->u_buf[1];
17581 digest[2] = 0;
17582 digest[3] = 0;
17583
17584 return (PARSER_OK);
17585 }
17586
17587 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17588 {
17589 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
17590
17591 if (ret != PARSER_OK)
17592 {
17593 return ret;
17594 }
17595
17596 u32 *digest = (u32 *) hash_buf->digest;
17597
17598 salt_t *salt = hash_buf->salt;
17599
17600 digest[0] -= SHA256M_A;
17601 digest[1] -= SHA256M_B;
17602 digest[2] -= SHA256M_C;
17603 digest[3] -= SHA256M_D;
17604 digest[4] -= SHA256M_E;
17605 digest[5] -= SHA256M_F;
17606 digest[6] -= SHA256M_G;
17607 digest[7] -= SHA256M_H;
17608
17609 salt->salt_buf[2] = 0x80;
17610
17611 return (PARSER_OK);
17612 }
17613
17614 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17615 {
17616 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
17617
17618 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17619
17620 u32 *digest = (u32 *) hash_buf->digest;
17621
17622 salt_t *salt = hash_buf->salt;
17623
17624 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17625
17626 /**
17627 * parse line
17628 */
17629
17630 char *V_pos = input_buf + 5;
17631
17632 char *R_pos = strchr (V_pos, '*');
17633
17634 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17635
17636 u32 V_len = R_pos - V_pos;
17637
17638 R_pos++;
17639
17640 char *bits_pos = strchr (R_pos, '*');
17641
17642 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17643
17644 u32 R_len = bits_pos - R_pos;
17645
17646 bits_pos++;
17647
17648 char *P_pos = strchr (bits_pos, '*');
17649
17650 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17651
17652 u32 bits_len = P_pos - bits_pos;
17653
17654 P_pos++;
17655
17656 char *enc_md_pos = strchr (P_pos, '*');
17657
17658 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17659
17660 u32 P_len = enc_md_pos - P_pos;
17661
17662 enc_md_pos++;
17663
17664 char *id_len_pos = strchr (enc_md_pos, '*');
17665
17666 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17667
17668 u32 enc_md_len = id_len_pos - enc_md_pos;
17669
17670 id_len_pos++;
17671
17672 char *id_buf_pos = strchr (id_len_pos, '*');
17673
17674 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17675
17676 u32 id_len_len = id_buf_pos - id_len_pos;
17677
17678 id_buf_pos++;
17679
17680 char *u_len_pos = strchr (id_buf_pos, '*');
17681
17682 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17683
17684 u32 id_buf_len = u_len_pos - id_buf_pos;
17685
17686 u_len_pos++;
17687
17688 char *u_buf_pos = strchr (u_len_pos, '*');
17689
17690 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17691
17692 u32 u_len_len = u_buf_pos - u_len_pos;
17693
17694 u_buf_pos++;
17695
17696 char *o_len_pos = strchr (u_buf_pos, '*');
17697
17698 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17699
17700 u32 u_buf_len = o_len_pos - u_buf_pos;
17701
17702 o_len_pos++;
17703
17704 char *o_buf_pos = strchr (o_len_pos, '*');
17705
17706 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17707
17708 u32 o_len_len = o_buf_pos - o_len_pos;
17709
17710 o_buf_pos++;
17711
17712 char *last = strchr (o_buf_pos, '*');
17713
17714 if (last == NULL) last = input_buf + input_len;
17715
17716 u32 o_buf_len = last - o_buf_pos;
17717
17718 // validate data
17719
17720 const int V = atoi (V_pos);
17721 const int R = atoi (R_pos);
17722
17723 int vr_ok = 0;
17724
17725 if ((V == 5) && (R == 5)) vr_ok = 1;
17726 if ((V == 5) && (R == 6)) vr_ok = 1;
17727
17728 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17729
17730 const int bits = atoi (bits_pos);
17731
17732 if (bits != 256) return (PARSER_SALT_VALUE);
17733
17734 int enc_md = atoi (enc_md_pos);
17735
17736 if (enc_md != 1) return (PARSER_SALT_VALUE);
17737
17738 const uint id_len = atoi (id_len_pos);
17739 const uint u_len = atoi (u_len_pos);
17740 const uint o_len = atoi (o_len_pos);
17741
17742 if (V_len > 6) return (PARSER_SALT_LENGTH);
17743 if (R_len > 6) return (PARSER_SALT_LENGTH);
17744 if (P_len > 6) return (PARSER_SALT_LENGTH);
17745 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
17746 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
17747 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
17748 if (bits_len > 6) return (PARSER_SALT_LENGTH);
17749 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17750
17751 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17752 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17753 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17754
17755 // copy data to esalt
17756
17757 if (u_len < 40) return (PARSER_SALT_VALUE);
17758
17759 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17760 {
17761 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17762 }
17763
17764 salt->salt_buf[0] = pdf->u_buf[8];
17765 salt->salt_buf[1] = pdf->u_buf[9];
17766
17767 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17768 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17769
17770 salt->salt_len = 8;
17771 salt->salt_iter = ROUNDS_PDF17L8;
17772
17773 digest[0] = pdf->u_buf[0];
17774 digest[1] = pdf->u_buf[1];
17775 digest[2] = pdf->u_buf[2];
17776 digest[3] = pdf->u_buf[3];
17777 digest[4] = pdf->u_buf[4];
17778 digest[5] = pdf->u_buf[5];
17779 digest[6] = pdf->u_buf[6];
17780 digest[7] = pdf->u_buf[7];
17781
17782 return (PARSER_OK);
17783 }
17784
17785 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17786 {
17787 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17788
17789 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17790
17791 u32 *digest = (u32 *) hash_buf->digest;
17792
17793 salt_t *salt = hash_buf->salt;
17794
17795 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17796
17797 /**
17798 * parse line
17799 */
17800
17801 // iterations
17802
17803 char *iter_pos = input_buf + 7;
17804
17805 u32 iter = atoi (iter_pos);
17806
17807 if (iter < 1) return (PARSER_SALT_ITERATION);
17808 if (iter > 999999) return (PARSER_SALT_ITERATION);
17809
17810 // first is *raw* salt
17811
17812 char *salt_pos = strchr (iter_pos, ':');
17813
17814 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17815
17816 salt_pos++;
17817
17818 char *hash_pos = strchr (salt_pos, ':');
17819
17820 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17821
17822 u32 salt_len = hash_pos - salt_pos;
17823
17824 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17825
17826 hash_pos++;
17827
17828 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17829
17830 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17831
17832 // decode salt
17833
17834 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17835
17836 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17837
17838 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17839
17840 salt_buf_ptr[salt_len + 3] = 0x01;
17841 salt_buf_ptr[salt_len + 4] = 0x80;
17842
17843 salt->salt_len = salt_len;
17844 salt->salt_iter = iter - 1;
17845
17846 // decode hash
17847
17848 u8 tmp_buf[100] = { 0 };
17849
17850 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17851
17852 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17853
17854 memcpy (digest, tmp_buf, 16);
17855
17856 digest[0] = byte_swap_32 (digest[0]);
17857 digest[1] = byte_swap_32 (digest[1]);
17858 digest[2] = byte_swap_32 (digest[2]);
17859 digest[3] = byte_swap_32 (digest[3]);
17860
17861 // add some stuff to normal salt to make sorted happy
17862
17863 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17864 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17865 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17866 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17867 salt->salt_buf[4] = salt->salt_iter;
17868
17869 return (PARSER_OK);
17870 }
17871
17872 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17873 {
17874 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17875
17876 u32 *digest = (u32 *) hash_buf->digest;
17877
17878 salt_t *salt = hash_buf->salt;
17879
17880 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17881 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17882 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17883 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17884
17885 digest[0] = byte_swap_32 (digest[0]);
17886 digest[1] = byte_swap_32 (digest[1]);
17887 digest[2] = byte_swap_32 (digest[2]);
17888 digest[3] = byte_swap_32 (digest[3]);
17889
17890 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17891
17892 uint salt_len = input_len - 32 - 1;
17893
17894 char *salt_buf = input_buf + 32 + 1;
17895
17896 char *salt_buf_ptr = (char *) salt->salt_buf;
17897
17898 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17899
17900 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17901
17902 salt->salt_len = salt_len;
17903
17904 return (PARSER_OK);
17905 }
17906
17907 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17908 {
17909 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17910
17911 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17912
17913 u32 *digest = (u32 *) hash_buf->digest;
17914
17915 salt_t *salt = hash_buf->salt;
17916
17917 char *user_pos = input_buf + 10;
17918
17919 char *salt_pos = strchr (user_pos, '*');
17920
17921 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17922
17923 salt_pos++;
17924
17925 char *hash_pos = strchr (salt_pos, '*');
17926
17927 hash_pos++;
17928
17929 uint hash_len = input_len - (hash_pos - input_buf);
17930
17931 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17932
17933 uint user_len = salt_pos - user_pos - 1;
17934
17935 uint salt_len = hash_pos - salt_pos - 1;
17936
17937 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17938
17939 /*
17940 * store digest
17941 */
17942
17943 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17944 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17945 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17946 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17947
17948 digest[0] = byte_swap_32 (digest[0]);
17949 digest[1] = byte_swap_32 (digest[1]);
17950 digest[2] = byte_swap_32 (digest[2]);
17951 digest[3] = byte_swap_32 (digest[3]);
17952
17953 digest[0] -= MD5M_A;
17954 digest[1] -= MD5M_B;
17955 digest[2] -= MD5M_C;
17956 digest[3] -= MD5M_D;
17957
17958 /*
17959 * store salt
17960 */
17961
17962 char *salt_buf_ptr = (char *) salt->salt_buf;
17963
17964 // first 4 bytes are the "challenge"
17965
17966 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17967 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17968 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17969 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17970
17971 // append the user name
17972
17973 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17974
17975 salt->salt_len = 4 + user_len;
17976
17977 return (PARSER_OK);
17978 }
17979
17980 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17981 {
17982 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17983
17984 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17985
17986 u32 *digest = (u32 *) hash_buf->digest;
17987
17988 salt_t *salt = hash_buf->salt;
17989
17990 char *salt_pos = input_buf + 9;
17991
17992 char *hash_pos = strchr (salt_pos, '*');
17993
17994 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17995
17996 hash_pos++;
17997
17998 uint hash_len = input_len - (hash_pos - input_buf);
17999
18000 if (hash_len != 40) return (PARSER_HASH_LENGTH);
18001
18002 uint salt_len = hash_pos - salt_pos - 1;
18003
18004 if (salt_len != 40) return (PARSER_SALT_LENGTH);
18005
18006 /*
18007 * store digest
18008 */
18009
18010 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18011 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18012 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18013 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18014 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18015
18016 /*
18017 * store salt
18018 */
18019
18020 char *salt_buf_ptr = (char *) salt->salt_buf;
18021
18022 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18023
18024 salt->salt_len = salt_len;
18025
18026 return (PARSER_OK);
18027 }
18028
18029 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18030 {
18031 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
18032
18033 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
18034
18035 u32 *digest = (u32 *) hash_buf->digest;
18036
18037 salt_t *salt = hash_buf->salt;
18038
18039 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
18040
18041 /**
18042 * parse line
18043 */
18044
18045 char *cry_master_len_pos = input_buf + 9;
18046
18047 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
18048
18049 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18050
18051 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
18052
18053 cry_master_buf_pos++;
18054
18055 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
18056
18057 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18058
18059 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
18060
18061 cry_salt_len_pos++;
18062
18063 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
18064
18065 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18066
18067 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
18068
18069 cry_salt_buf_pos++;
18070
18071 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
18072
18073 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18074
18075 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
18076
18077 cry_rounds_pos++;
18078
18079 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
18080
18081 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18082
18083 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
18084
18085 ckey_len_pos++;
18086
18087 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
18088
18089 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18090
18091 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
18092
18093 ckey_buf_pos++;
18094
18095 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
18096
18097 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18098
18099 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
18100
18101 public_key_len_pos++;
18102
18103 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
18104
18105 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18106
18107 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
18108
18109 public_key_buf_pos++;
18110
18111 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;
18112
18113 const uint cry_master_len = atoi (cry_master_len_pos);
18114 const uint cry_salt_len = atoi (cry_salt_len_pos);
18115 const uint ckey_len = atoi (ckey_len_pos);
18116 const uint public_key_len = atoi (public_key_len_pos);
18117
18118 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
18119 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
18120 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
18121 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
18122
18123 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
18124 {
18125 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
18126
18127 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
18128 }
18129
18130 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
18131 {
18132 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
18133
18134 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
18135 }
18136
18137 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
18138 {
18139 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
18140
18141 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
18142 }
18143
18144 bitcoin_wallet->cry_master_len = cry_master_len / 2;
18145 bitcoin_wallet->ckey_len = ckey_len / 2;
18146 bitcoin_wallet->public_key_len = public_key_len / 2;
18147
18148 /*
18149 * store digest (should be unique enought, hopefully)
18150 */
18151
18152 digest[0] = bitcoin_wallet->cry_master_buf[0];
18153 digest[1] = bitcoin_wallet->cry_master_buf[1];
18154 digest[2] = bitcoin_wallet->cry_master_buf[2];
18155 digest[3] = bitcoin_wallet->cry_master_buf[3];
18156
18157 /*
18158 * store salt
18159 */
18160
18161 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
18162
18163 const uint cry_rounds = atoi (cry_rounds_pos);
18164
18165 salt->salt_iter = cry_rounds - 1;
18166
18167 char *salt_buf_ptr = (char *) salt->salt_buf;
18168
18169 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
18170
18171 salt->salt_len = salt_len;
18172
18173 return (PARSER_OK);
18174 }
18175
18176 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18177 {
18178 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
18179
18180 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18181
18182 u32 *digest = (u32 *) hash_buf->digest;
18183
18184 salt_t *salt = hash_buf->salt;
18185
18186 sip_t *sip = (sip_t *) hash_buf->esalt;
18187
18188 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
18189
18190 char *temp_input_buf = (char *) mymalloc (input_len + 1);
18191
18192 memcpy (temp_input_buf, input_buf, input_len);
18193
18194 // URI_server:
18195
18196 char *URI_server_pos = temp_input_buf + 6;
18197
18198 char *URI_client_pos = strchr (URI_server_pos, '*');
18199
18200 if (URI_client_pos == NULL)
18201 {
18202 myfree (temp_input_buf);
18203
18204 return (PARSER_SEPARATOR_UNMATCHED);
18205 }
18206
18207 URI_client_pos[0] = 0;
18208 URI_client_pos++;
18209
18210 uint URI_server_len = strlen (URI_server_pos);
18211
18212 if (URI_server_len > 512)
18213 {
18214 myfree (temp_input_buf);
18215
18216 return (PARSER_SALT_LENGTH);
18217 }
18218
18219 // URI_client:
18220
18221 char *user_pos = strchr (URI_client_pos, '*');
18222
18223 if (user_pos == NULL)
18224 {
18225 myfree (temp_input_buf);
18226
18227 return (PARSER_SEPARATOR_UNMATCHED);
18228 }
18229
18230 user_pos[0] = 0;
18231 user_pos++;
18232
18233 uint URI_client_len = strlen (URI_client_pos);
18234
18235 if (URI_client_len > 512)
18236 {
18237 myfree (temp_input_buf);
18238
18239 return (PARSER_SALT_LENGTH);
18240 }
18241
18242 // user:
18243
18244 char *realm_pos = strchr (user_pos, '*');
18245
18246 if (realm_pos == NULL)
18247 {
18248 myfree (temp_input_buf);
18249
18250 return (PARSER_SEPARATOR_UNMATCHED);
18251 }
18252
18253 realm_pos[0] = 0;
18254 realm_pos++;
18255
18256 uint user_len = strlen (user_pos);
18257
18258 if (user_len > 116)
18259 {
18260 myfree (temp_input_buf);
18261
18262 return (PARSER_SALT_LENGTH);
18263 }
18264
18265 // realm:
18266
18267 char *method_pos = strchr (realm_pos, '*');
18268
18269 if (method_pos == NULL)
18270 {
18271 myfree (temp_input_buf);
18272
18273 return (PARSER_SEPARATOR_UNMATCHED);
18274 }
18275
18276 method_pos[0] = 0;
18277 method_pos++;
18278
18279 uint realm_len = strlen (realm_pos);
18280
18281 if (realm_len > 116)
18282 {
18283 myfree (temp_input_buf);
18284
18285 return (PARSER_SALT_LENGTH);
18286 }
18287
18288 // method:
18289
18290 char *URI_prefix_pos = strchr (method_pos, '*');
18291
18292 if (URI_prefix_pos == NULL)
18293 {
18294 myfree (temp_input_buf);
18295
18296 return (PARSER_SEPARATOR_UNMATCHED);
18297 }
18298
18299 URI_prefix_pos[0] = 0;
18300 URI_prefix_pos++;
18301
18302 uint method_len = strlen (method_pos);
18303
18304 if (method_len > 246)
18305 {
18306 myfree (temp_input_buf);
18307
18308 return (PARSER_SALT_LENGTH);
18309 }
18310
18311 // URI_prefix:
18312
18313 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
18314
18315 if (URI_resource_pos == NULL)
18316 {
18317 myfree (temp_input_buf);
18318
18319 return (PARSER_SEPARATOR_UNMATCHED);
18320 }
18321
18322 URI_resource_pos[0] = 0;
18323 URI_resource_pos++;
18324
18325 uint URI_prefix_len = strlen (URI_prefix_pos);
18326
18327 if (URI_prefix_len > 245)
18328 {
18329 myfree (temp_input_buf);
18330
18331 return (PARSER_SALT_LENGTH);
18332 }
18333
18334 // URI_resource:
18335
18336 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
18337
18338 if (URI_suffix_pos == NULL)
18339 {
18340 myfree (temp_input_buf);
18341
18342 return (PARSER_SEPARATOR_UNMATCHED);
18343 }
18344
18345 URI_suffix_pos[0] = 0;
18346 URI_suffix_pos++;
18347
18348 uint URI_resource_len = strlen (URI_resource_pos);
18349
18350 if (URI_resource_len < 1 || URI_resource_len > 246)
18351 {
18352 myfree (temp_input_buf);
18353
18354 return (PARSER_SALT_LENGTH);
18355 }
18356
18357 // URI_suffix:
18358
18359 char *nonce_pos = strchr (URI_suffix_pos, '*');
18360
18361 if (nonce_pos == NULL)
18362 {
18363 myfree (temp_input_buf);
18364
18365 return (PARSER_SEPARATOR_UNMATCHED);
18366 }
18367
18368 nonce_pos[0] = 0;
18369 nonce_pos++;
18370
18371 uint URI_suffix_len = strlen (URI_suffix_pos);
18372
18373 if (URI_suffix_len > 245)
18374 {
18375 myfree (temp_input_buf);
18376
18377 return (PARSER_SALT_LENGTH);
18378 }
18379
18380 // nonce:
18381
18382 char *nonce_client_pos = strchr (nonce_pos, '*');
18383
18384 if (nonce_client_pos == NULL)
18385 {
18386 myfree (temp_input_buf);
18387
18388 return (PARSER_SEPARATOR_UNMATCHED);
18389 }
18390
18391 nonce_client_pos[0] = 0;
18392 nonce_client_pos++;
18393
18394 uint nonce_len = strlen (nonce_pos);
18395
18396 if (nonce_len < 1 || nonce_len > 50)
18397 {
18398 myfree (temp_input_buf);
18399
18400 return (PARSER_SALT_LENGTH);
18401 }
18402
18403 // nonce_client:
18404
18405 char *nonce_count_pos = strchr (nonce_client_pos, '*');
18406
18407 if (nonce_count_pos == NULL)
18408 {
18409 myfree (temp_input_buf);
18410
18411 return (PARSER_SEPARATOR_UNMATCHED);
18412 }
18413
18414 nonce_count_pos[0] = 0;
18415 nonce_count_pos++;
18416
18417 uint nonce_client_len = strlen (nonce_client_pos);
18418
18419 if (nonce_client_len > 50)
18420 {
18421 myfree (temp_input_buf);
18422
18423 return (PARSER_SALT_LENGTH);
18424 }
18425
18426 // nonce_count:
18427
18428 char *qop_pos = strchr (nonce_count_pos, '*');
18429
18430 if (qop_pos == NULL)
18431 {
18432 myfree (temp_input_buf);
18433
18434 return (PARSER_SEPARATOR_UNMATCHED);
18435 }
18436
18437 qop_pos[0] = 0;
18438 qop_pos++;
18439
18440 uint nonce_count_len = strlen (nonce_count_pos);
18441
18442 if (nonce_count_len > 50)
18443 {
18444 myfree (temp_input_buf);
18445
18446 return (PARSER_SALT_LENGTH);
18447 }
18448
18449 // qop:
18450
18451 char *directive_pos = strchr (qop_pos, '*');
18452
18453 if (directive_pos == NULL)
18454 {
18455 myfree (temp_input_buf);
18456
18457 return (PARSER_SEPARATOR_UNMATCHED);
18458 }
18459
18460 directive_pos[0] = 0;
18461 directive_pos++;
18462
18463 uint qop_len = strlen (qop_pos);
18464
18465 if (qop_len > 50)
18466 {
18467 myfree (temp_input_buf);
18468
18469 return (PARSER_SALT_LENGTH);
18470 }
18471
18472 // directive
18473
18474 char *digest_pos = strchr (directive_pos, '*');
18475
18476 if (digest_pos == NULL)
18477 {
18478 myfree (temp_input_buf);
18479
18480 return (PARSER_SEPARATOR_UNMATCHED);
18481 }
18482
18483 digest_pos[0] = 0;
18484 digest_pos++;
18485
18486 uint directive_len = strlen (directive_pos);
18487
18488 if (directive_len != 3)
18489 {
18490 myfree (temp_input_buf);
18491
18492 return (PARSER_SALT_LENGTH);
18493 }
18494
18495 if (memcmp (directive_pos, "MD5", 3))
18496 {
18497 log_info ("ERROR: only the MD5 directive is currently supported\n");
18498
18499 myfree (temp_input_buf);
18500
18501 return (PARSER_SIP_AUTH_DIRECTIVE);
18502 }
18503
18504 /*
18505 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
18506 */
18507
18508 uint md5_len = 0;
18509
18510 uint md5_max_len = 4 * 64;
18511
18512 uint md5_remaining_len = md5_max_len;
18513
18514 uint tmp_md5_buf[64] = { 0 };
18515
18516 char *tmp_md5_ptr = (char *) tmp_md5_buf;
18517
18518 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
18519
18520 md5_len += method_len + 1;
18521 tmp_md5_ptr += method_len + 1;
18522
18523 if (URI_prefix_len > 0)
18524 {
18525 md5_remaining_len = md5_max_len - md5_len;
18526
18527 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
18528
18529 md5_len += URI_prefix_len + 1;
18530 tmp_md5_ptr += URI_prefix_len + 1;
18531 }
18532
18533 md5_remaining_len = md5_max_len - md5_len;
18534
18535 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
18536
18537 md5_len += URI_resource_len;
18538 tmp_md5_ptr += URI_resource_len;
18539
18540 if (URI_suffix_len > 0)
18541 {
18542 md5_remaining_len = md5_max_len - md5_len;
18543
18544 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
18545
18546 md5_len += 1 + URI_suffix_len;
18547 }
18548
18549 uint tmp_digest[4] = { 0 };
18550
18551 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
18552
18553 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
18554 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
18555 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
18556 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
18557
18558 /*
18559 * esalt
18560 */
18561
18562 char *esalt_buf_ptr = (char *) sip->esalt_buf;
18563
18564 uint esalt_len = 0;
18565
18566 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
18567
18568 // there are 2 possibilities for the esalt:
18569
18570 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
18571 {
18572 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
18573
18574 if (esalt_len > max_esalt_len)
18575 {
18576 myfree (temp_input_buf);
18577
18578 return (PARSER_SALT_LENGTH);
18579 }
18580
18581 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
18582 nonce_pos,
18583 nonce_count_pos,
18584 nonce_client_pos,
18585 qop_pos,
18586 tmp_digest[0],
18587 tmp_digest[1],
18588 tmp_digest[2],
18589 tmp_digest[3]);
18590 }
18591 else
18592 {
18593 esalt_len = 1 + nonce_len + 1 + 32;
18594
18595 if (esalt_len > max_esalt_len)
18596 {
18597 myfree (temp_input_buf);
18598
18599 return (PARSER_SALT_LENGTH);
18600 }
18601
18602 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
18603 nonce_pos,
18604 tmp_digest[0],
18605 tmp_digest[1],
18606 tmp_digest[2],
18607 tmp_digest[3]);
18608 }
18609
18610 // add 0x80 to esalt
18611
18612 esalt_buf_ptr[esalt_len] = 0x80;
18613
18614 sip->esalt_len = esalt_len;
18615
18616 /*
18617 * actual salt
18618 */
18619
18620 char *sip_salt_ptr = (char *) sip->salt_buf;
18621
18622 uint salt_len = user_len + 1 + realm_len + 1;
18623
18624 uint max_salt_len = 119;
18625
18626 if (salt_len > max_salt_len)
18627 {
18628 myfree (temp_input_buf);
18629
18630 return (PARSER_SALT_LENGTH);
18631 }
18632
18633 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18634
18635 sip->salt_len = salt_len;
18636
18637 /*
18638 * fake salt (for sorting)
18639 */
18640
18641 char *salt_buf_ptr = (char *) salt->salt_buf;
18642
18643 max_salt_len = 55;
18644
18645 uint fake_salt_len = salt_len;
18646
18647 if (fake_salt_len > max_salt_len)
18648 {
18649 fake_salt_len = max_salt_len;
18650 }
18651
18652 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18653
18654 salt->salt_len = fake_salt_len;
18655
18656 /*
18657 * digest
18658 */
18659
18660 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
18661 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
18662 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
18663 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
18664
18665 digest[0] = byte_swap_32 (digest[0]);
18666 digest[1] = byte_swap_32 (digest[1]);
18667 digest[2] = byte_swap_32 (digest[2]);
18668 digest[3] = byte_swap_32 (digest[3]);
18669
18670 myfree (temp_input_buf);
18671
18672 return (PARSER_OK);
18673 }
18674
18675 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18676 {
18677 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
18678
18679 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18680
18681 u32 *digest = (u32 *) hash_buf->digest;
18682
18683 salt_t *salt = hash_buf->salt;
18684
18685 // digest
18686
18687 char *digest_pos = input_buf;
18688
18689 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
18690 digest[1] = 0;
18691 digest[2] = 0;
18692 digest[3] = 0;
18693
18694 // salt
18695
18696 char *salt_buf = input_buf + 8 + 1;
18697
18698 uint salt_len = 8;
18699
18700 char *salt_buf_ptr = (char *) salt->salt_buf;
18701
18702 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18703
18704 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18705
18706 salt->salt_len = salt_len;
18707
18708 return (PARSER_OK);
18709 }
18710
18711 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18712 {
18713 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
18714
18715 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18716
18717 u32 *digest = (u32 *) hash_buf->digest;
18718
18719 salt_t *salt = hash_buf->salt;
18720
18721 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
18722
18723 /**
18724 * parse line
18725 */
18726
18727 char *p_buf_pos = input_buf + 4;
18728
18729 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
18730
18731 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18732
18733 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
18734
18735 NumCyclesPower_pos++;
18736
18737 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
18738
18739 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18740
18741 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
18742
18743 salt_len_pos++;
18744
18745 char *salt_buf_pos = strchr (salt_len_pos, '$');
18746
18747 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18748
18749 u32 salt_len_len = salt_buf_pos - salt_len_pos;
18750
18751 salt_buf_pos++;
18752
18753 char *iv_len_pos = strchr (salt_buf_pos, '$');
18754
18755 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18756
18757 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
18758
18759 iv_len_pos++;
18760
18761 char *iv_buf_pos = strchr (iv_len_pos, '$');
18762
18763 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18764
18765 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18766
18767 iv_buf_pos++;
18768
18769 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18770
18771 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18772
18773 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18774
18775 crc_buf_pos++;
18776
18777 char *data_len_pos = strchr (crc_buf_pos, '$');
18778
18779 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18780
18781 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18782
18783 data_len_pos++;
18784
18785 char *unpack_size_pos = strchr (data_len_pos, '$');
18786
18787 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18788
18789 u32 data_len_len = unpack_size_pos - data_len_pos;
18790
18791 unpack_size_pos++;
18792
18793 char *data_buf_pos = strchr (unpack_size_pos, '$');
18794
18795 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18796
18797 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18798
18799 data_buf_pos++;
18800
18801 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;
18802
18803 const uint iter = atoi (NumCyclesPower_pos);
18804 const uint crc = atoi (crc_buf_pos);
18805 const uint p_buf = atoi (p_buf_pos);
18806 const uint salt_len = atoi (salt_len_pos);
18807 const uint iv_len = atoi (iv_len_pos);
18808 const uint unpack_size = atoi (unpack_size_pos);
18809 const uint data_len = atoi (data_len_pos);
18810
18811 /**
18812 * verify some data
18813 */
18814
18815 if (p_buf != 0) return (PARSER_SALT_VALUE);
18816 if (salt_len != 0) return (PARSER_SALT_VALUE);
18817
18818 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18819
18820 if (data_len > 384) return (PARSER_SALT_VALUE);
18821
18822 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18823
18824 /**
18825 * store data
18826 */
18827
18828 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18829 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18830 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18831 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18832
18833 seven_zip->iv_len = iv_len;
18834
18835 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18836
18837 seven_zip->salt_len = 0;
18838
18839 seven_zip->crc = crc;
18840
18841 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18842 {
18843 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18844
18845 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18846 }
18847
18848 seven_zip->data_len = data_len;
18849
18850 seven_zip->unpack_size = unpack_size;
18851
18852 // real salt
18853
18854 salt->salt_buf[0] = seven_zip->data_buf[0];
18855 salt->salt_buf[1] = seven_zip->data_buf[1];
18856 salt->salt_buf[2] = seven_zip->data_buf[2];
18857 salt->salt_buf[3] = seven_zip->data_buf[3];
18858
18859 salt->salt_len = 16;
18860
18861 salt->salt_sign[0] = iter;
18862
18863 salt->salt_iter = 1 << iter;
18864
18865 /**
18866 * digest
18867 */
18868
18869 digest[0] = crc;
18870 digest[1] = 0;
18871 digest[2] = 0;
18872 digest[3] = 0;
18873
18874 return (PARSER_OK);
18875 }
18876
18877 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18878 {
18879 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18880
18881 u32 *digest = (u32 *) hash_buf->digest;
18882
18883 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18884 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18885 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18886 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18887 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18888 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18889 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18890 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18891
18892 digest[0] = byte_swap_32 (digest[0]);
18893 digest[1] = byte_swap_32 (digest[1]);
18894 digest[2] = byte_swap_32 (digest[2]);
18895 digest[3] = byte_swap_32 (digest[3]);
18896 digest[4] = byte_swap_32 (digest[4]);
18897 digest[5] = byte_swap_32 (digest[5]);
18898 digest[6] = byte_swap_32 (digest[6]);
18899 digest[7] = byte_swap_32 (digest[7]);
18900
18901 return (PARSER_OK);
18902 }
18903
18904 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18905 {
18906 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18907
18908 u32 *digest = (u32 *) hash_buf->digest;
18909
18910 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18911 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18912 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18913 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18914 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18915 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18916 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18917 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18918 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18919 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18920 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18921 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18922 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18923 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18924 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18925 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18926
18927 digest[ 0] = byte_swap_32 (digest[ 0]);
18928 digest[ 1] = byte_swap_32 (digest[ 1]);
18929 digest[ 2] = byte_swap_32 (digest[ 2]);
18930 digest[ 3] = byte_swap_32 (digest[ 3]);
18931 digest[ 4] = byte_swap_32 (digest[ 4]);
18932 digest[ 5] = byte_swap_32 (digest[ 5]);
18933 digest[ 6] = byte_swap_32 (digest[ 6]);
18934 digest[ 7] = byte_swap_32 (digest[ 7]);
18935 digest[ 8] = byte_swap_32 (digest[ 8]);
18936 digest[ 9] = byte_swap_32 (digest[ 9]);
18937 digest[10] = byte_swap_32 (digest[10]);
18938 digest[11] = byte_swap_32 (digest[11]);
18939 digest[12] = byte_swap_32 (digest[12]);
18940 digest[13] = byte_swap_32 (digest[13]);
18941 digest[14] = byte_swap_32 (digest[14]);
18942 digest[15] = byte_swap_32 (digest[15]);
18943
18944 return (PARSER_OK);
18945 }
18946
18947 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18948 {
18949 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18950
18951 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18952
18953 u32 *digest = (u32 *) hash_buf->digest;
18954
18955 salt_t *salt = hash_buf->salt;
18956
18957 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18958
18959 /**
18960 * parse line
18961 */
18962
18963 // iterations
18964
18965 char *iter_pos = input_buf + 4;
18966
18967 u32 iter = atoi (iter_pos);
18968
18969 if (iter < 1) return (PARSER_SALT_ITERATION);
18970 if (iter > 999999) return (PARSER_SALT_ITERATION);
18971
18972 // first is *raw* salt
18973
18974 char *salt_pos = strchr (iter_pos, ':');
18975
18976 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18977
18978 salt_pos++;
18979
18980 char *hash_pos = strchr (salt_pos, ':');
18981
18982 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18983
18984 u32 salt_len = hash_pos - salt_pos;
18985
18986 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18987
18988 hash_pos++;
18989
18990 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18991
18992 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18993
18994 // decode salt
18995
18996 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18997
18998 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18999
19000 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19001
19002 salt_buf_ptr[salt_len + 3] = 0x01;
19003 salt_buf_ptr[salt_len + 4] = 0x80;
19004
19005 salt->salt_len = salt_len;
19006 salt->salt_iter = iter - 1;
19007
19008 // decode hash
19009
19010 u8 tmp_buf[100] = { 0 };
19011
19012 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19013
19014 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19015
19016 memcpy (digest, tmp_buf, 16);
19017
19018 // add some stuff to normal salt to make sorted happy
19019
19020 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
19021 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
19022 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
19023 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
19024 salt->salt_buf[4] = salt->salt_iter;
19025
19026 return (PARSER_OK);
19027 }
19028
19029 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19030 {
19031 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
19032
19033 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
19034
19035 u32 *digest = (u32 *) hash_buf->digest;
19036
19037 salt_t *salt = hash_buf->salt;
19038
19039 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
19040
19041 /**
19042 * parse line
19043 */
19044
19045 // iterations
19046
19047 char *iter_pos = input_buf + 5;
19048
19049 u32 iter = atoi (iter_pos);
19050
19051 if (iter < 1) return (PARSER_SALT_ITERATION);
19052 if (iter > 999999) return (PARSER_SALT_ITERATION);
19053
19054 // first is *raw* salt
19055
19056 char *salt_pos = strchr (iter_pos, ':');
19057
19058 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19059
19060 salt_pos++;
19061
19062 char *hash_pos = strchr (salt_pos, ':');
19063
19064 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19065
19066 u32 salt_len = hash_pos - salt_pos;
19067
19068 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19069
19070 hash_pos++;
19071
19072 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19073
19074 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19075
19076 // decode salt
19077
19078 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
19079
19080 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19081
19082 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19083
19084 salt_buf_ptr[salt_len + 3] = 0x01;
19085 salt_buf_ptr[salt_len + 4] = 0x80;
19086
19087 salt->salt_len = salt_len;
19088 salt->salt_iter = iter - 1;
19089
19090 // decode hash
19091
19092 u8 tmp_buf[100] = { 0 };
19093
19094 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19095
19096 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19097
19098 memcpy (digest, tmp_buf, 16);
19099
19100 digest[0] = byte_swap_32 (digest[0]);
19101 digest[1] = byte_swap_32 (digest[1]);
19102 digest[2] = byte_swap_32 (digest[2]);
19103 digest[3] = byte_swap_32 (digest[3]);
19104
19105 // add some stuff to normal salt to make sorted happy
19106
19107 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
19108 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
19109 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
19110 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
19111 salt->salt_buf[4] = salt->salt_iter;
19112
19113 return (PARSER_OK);
19114 }
19115
19116 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19117 {
19118 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
19119
19120 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
19121
19122 u64 *digest = (u64 *) hash_buf->digest;
19123
19124 salt_t *salt = hash_buf->salt;
19125
19126 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
19127
19128 /**
19129 * parse line
19130 */
19131
19132 // iterations
19133
19134 char *iter_pos = input_buf + 7;
19135
19136 u32 iter = atoi (iter_pos);
19137
19138 if (iter < 1) return (PARSER_SALT_ITERATION);
19139 if (iter > 999999) return (PARSER_SALT_ITERATION);
19140
19141 // first is *raw* salt
19142
19143 char *salt_pos = strchr (iter_pos, ':');
19144
19145 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19146
19147 salt_pos++;
19148
19149 char *hash_pos = strchr (salt_pos, ':');
19150
19151 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19152
19153 u32 salt_len = hash_pos - salt_pos;
19154
19155 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19156
19157 hash_pos++;
19158
19159 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19160
19161 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19162
19163 // decode salt
19164
19165 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
19166
19167 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19168
19169 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19170
19171 salt_buf_ptr[salt_len + 3] = 0x01;
19172 salt_buf_ptr[salt_len + 4] = 0x80;
19173
19174 salt->salt_len = salt_len;
19175 salt->salt_iter = iter - 1;
19176
19177 // decode hash
19178
19179 u8 tmp_buf[100] = { 0 };
19180
19181 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19182
19183 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19184
19185 memcpy (digest, tmp_buf, 64);
19186
19187 digest[0] = byte_swap_64 (digest[0]);
19188 digest[1] = byte_swap_64 (digest[1]);
19189 digest[2] = byte_swap_64 (digest[2]);
19190 digest[3] = byte_swap_64 (digest[3]);
19191 digest[4] = byte_swap_64 (digest[4]);
19192 digest[5] = byte_swap_64 (digest[5]);
19193 digest[6] = byte_swap_64 (digest[6]);
19194 digest[7] = byte_swap_64 (digest[7]);
19195
19196 // add some stuff to normal salt to make sorted happy
19197
19198 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
19199 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
19200 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
19201 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
19202 salt->salt_buf[4] = salt->salt_iter;
19203
19204 return (PARSER_OK);
19205 }
19206
19207 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19208 {
19209 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
19210
19211 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
19212
19213 uint *digest = (uint *) hash_buf->digest;
19214
19215 salt_t *salt = hash_buf->salt;
19216
19217 /**
19218 * parse line
19219 */
19220
19221 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
19222
19223 char *hash_pos = strchr (salt_pos, '$');
19224
19225 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19226
19227 u32 salt_len = hash_pos - salt_pos;
19228
19229 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19230
19231 hash_pos++;
19232
19233 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
19234
19235 if (hash_len != 16) return (PARSER_HASH_LENGTH);
19236
19237 // decode hash
19238
19239 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
19240 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
19241 digest[ 2] = 0;
19242 digest[ 3] = 0;
19243 digest[ 4] = 0;
19244 digest[ 5] = 0;
19245 digest[ 6] = 0;
19246 digest[ 7] = 0;
19247 digest[ 8] = 0;
19248 digest[ 9] = 0;
19249 digest[10] = 0;
19250 digest[11] = 0;
19251 digest[12] = 0;
19252 digest[13] = 0;
19253 digest[14] = 0;
19254 digest[15] = 0;
19255
19256 // decode salt
19257
19258 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19259 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19260
19261 salt->salt_iter = ROUNDS_ECRYPTFS;
19262 salt->salt_len = 8;
19263
19264 return (PARSER_OK);
19265 }
19266
19267 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19268 {
19269 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
19270
19271 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
19272
19273 unsigned char c19 = itoa64_to_int (input_buf[19]);
19274
19275 if (c19 & 3) return (PARSER_HASH_VALUE);
19276
19277 salt_t *salt = hash_buf->salt;
19278
19279 u32 *digest = (u32 *) hash_buf->digest;
19280
19281 // iteration count
19282
19283 salt->salt_iter = itoa64_to_int (input_buf[1])
19284 | itoa64_to_int (input_buf[2]) << 6
19285 | itoa64_to_int (input_buf[3]) << 12
19286 | itoa64_to_int (input_buf[4]) << 18;
19287
19288 // set salt
19289
19290 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
19291 | itoa64_to_int (input_buf[6]) << 6
19292 | itoa64_to_int (input_buf[7]) << 12
19293 | itoa64_to_int (input_buf[8]) << 18;
19294
19295 salt->salt_len = 4;
19296
19297 u8 tmp_buf[100] = { 0 };
19298
19299 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
19300
19301 memcpy (digest, tmp_buf, 8);
19302
19303 uint tt;
19304
19305 IP (digest[0], digest[1], tt);
19306
19307 digest[0] = rotr32 (digest[0], 31);
19308 digest[1] = rotr32 (digest[1], 31);
19309 digest[2] = 0;
19310 digest[3] = 0;
19311
19312 return (PARSER_OK);
19313 }
19314
19315 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19316 {
19317 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
19318
19319 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
19320
19321 u32 *digest = (u32 *) hash_buf->digest;
19322
19323 salt_t *salt = hash_buf->salt;
19324
19325 /**
19326 * parse line
19327 */
19328
19329 char *type_pos = input_buf + 6 + 1;
19330
19331 char *salt_pos = strchr (type_pos, '*');
19332
19333 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19334
19335 u32 type_len = salt_pos - type_pos;
19336
19337 if (type_len != 1) return (PARSER_SALT_LENGTH);
19338
19339 salt_pos++;
19340
19341 char *crypted_pos = strchr (salt_pos, '*');
19342
19343 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19344
19345 u32 salt_len = crypted_pos - salt_pos;
19346
19347 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19348
19349 crypted_pos++;
19350
19351 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
19352
19353 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
19354
19355 /**
19356 * copy data
19357 */
19358
19359 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19360 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19361
19362 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19363 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19364
19365 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
19366 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
19367 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
19368 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
19369
19370 salt->salt_len = 24;
19371 salt->salt_iter = ROUNDS_RAR3;
19372
19373 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
19374 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
19375
19376 digest[0] = 0xc43d7b00;
19377 digest[1] = 0x40070000;
19378 digest[2] = 0;
19379 digest[3] = 0;
19380
19381 return (PARSER_OK);
19382 }
19383
19384 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19385 {
19386 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
19387
19388 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
19389
19390 u32 *digest = (u32 *) hash_buf->digest;
19391
19392 salt_t *salt = hash_buf->salt;
19393
19394 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
19395
19396 /**
19397 * parse line
19398 */
19399
19400 char *param0_pos = input_buf + 1 + 4 + 1;
19401
19402 char *param1_pos = strchr (param0_pos, '$');
19403
19404 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19405
19406 u32 param0_len = param1_pos - param0_pos;
19407
19408 param1_pos++;
19409
19410 char *param2_pos = strchr (param1_pos, '$');
19411
19412 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19413
19414 u32 param1_len = param2_pos - param1_pos;
19415
19416 param2_pos++;
19417
19418 char *param3_pos = strchr (param2_pos, '$');
19419
19420 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19421
19422 u32 param2_len = param3_pos - param2_pos;
19423
19424 param3_pos++;
19425
19426 char *param4_pos = strchr (param3_pos, '$');
19427
19428 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19429
19430 u32 param3_len = param4_pos - param3_pos;
19431
19432 param4_pos++;
19433
19434 char *param5_pos = strchr (param4_pos, '$');
19435
19436 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19437
19438 u32 param4_len = param5_pos - param4_pos;
19439
19440 param5_pos++;
19441
19442 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
19443
19444 char *salt_buf = param1_pos;
19445 char *iv = param3_pos;
19446 char *pswcheck = param5_pos;
19447
19448 const uint salt_len = atoi (param0_pos);
19449 const uint iterations = atoi (param2_pos);
19450 const uint pswcheck_len = atoi (param4_pos);
19451
19452 /**
19453 * verify some data
19454 */
19455
19456 if (param1_len != 32) return (PARSER_SALT_VALUE);
19457 if (param3_len != 32) return (PARSER_SALT_VALUE);
19458 if (param5_len != 16) return (PARSER_SALT_VALUE);
19459
19460 if (salt_len != 16) return (PARSER_SALT_VALUE);
19461 if (iterations == 0) return (PARSER_SALT_VALUE);
19462 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
19463
19464 /**
19465 * store data
19466 */
19467
19468 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
19469 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
19470 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
19471 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
19472
19473 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
19474 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
19475 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
19476 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
19477
19478 salt->salt_len = 16;
19479
19480 salt->salt_sign[0] = iterations;
19481
19482 salt->salt_iter = ((1 << iterations) + 32) - 1;
19483
19484 /**
19485 * digest buf
19486 */
19487
19488 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
19489 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
19490 digest[2] = 0;
19491 digest[3] = 0;
19492
19493 return (PARSER_OK);
19494 }
19495
19496 int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19497 {
19498 if ((input_len < DISPLAY_LEN_MIN_13100) || (input_len > DISPLAY_LEN_MAX_13100)) return (PARSER_GLOBAL_LENGTH);
19499
19500 if (memcmp (SIGNATURE_KRB5TGS, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19501
19502 u32 *digest = (u32 *) hash_buf->digest;
19503
19504 salt_t *salt = hash_buf->salt;
19505
19506 krb5tgs_t *krb5tgs = (krb5tgs_t *) hash_buf->esalt;
19507
19508 /**
19509 * parse line
19510 */
19511
19512 /* Skip '$' */
19513 char *account_pos = input_buf + 11 + 1;
19514
19515 char *data_pos;
19516
19517 uint data_len;
19518
19519 if (account_pos[0] == '*')
19520 {
19521 account_pos++;
19522
19523 data_pos = strchr (account_pos, '*');
19524
19525 /* Skip '*' */
19526 data_pos++;
19527
19528 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19529
19530 uint account_len = data_pos - account_pos + 1;
19531
19532 if (account_len >= 512) return (PARSER_SALT_LENGTH);
19533
19534 /* Skip '$' */
19535 data_pos++;
19536
19537 data_len = input_len - 11 - 1 - account_len - 2;
19538
19539 memcpy (krb5tgs->account_info, account_pos - 1, account_len);
19540 }
19541 else
19542 {
19543 /* assume $krb5tgs$23$checksum$edata2 */
19544 data_pos = account_pos;
19545
19546 memcpy (krb5tgs->account_info, "**", 3);
19547
19548 data_len = input_len - 11 - 1 - 1;
19549 }
19550
19551 if (data_len < ((16 + 32) * 2)) return (PARSER_SALT_LENGTH);
19552
19553 char *checksum_ptr = (char *) krb5tgs->checksum;
19554
19555 for (uint i = 0; i < 16 * 2; i += 2)
19556 {
19557 const char p0 = data_pos[i + 0];
19558 const char p1 = data_pos[i + 1];
19559
19560 *checksum_ptr++ = hex_convert (p1) << 0
19561 | hex_convert (p0) << 4;
19562 }
19563
19564 char *edata_ptr = (char *) krb5tgs->edata2;
19565
19566 krb5tgs->edata2_len = (data_len - 32) / 2 ;
19567
19568 /* skip '$' */
19569 for (uint i = 16 * 2 + 1; i < (krb5tgs->edata2_len * 2) + (16 * 2 + 1); i += 2)
19570 {
19571 const char p0 = data_pos[i + 0];
19572 const char p1 = data_pos[i + 1];
19573 *edata_ptr++ = hex_convert (p1) << 0
19574 | hex_convert (p0) << 4;
19575 }
19576
19577 /* this is needed for hmac_md5 */
19578 *edata_ptr++ = 0x80;
19579
19580 salt->salt_buf[0] = krb5tgs->checksum[0];
19581 salt->salt_buf[1] = krb5tgs->checksum[1];
19582 salt->salt_buf[2] = krb5tgs->checksum[2];
19583 salt->salt_buf[3] = krb5tgs->checksum[3];
19584
19585 salt->salt_len = 32;
19586
19587 digest[0] = krb5tgs->checksum[0];
19588 digest[1] = krb5tgs->checksum[1];
19589 digest[2] = krb5tgs->checksum[2];
19590 digest[3] = krb5tgs->checksum[3];
19591
19592 return (PARSER_OK);
19593 }
19594
19595 int axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19596 {
19597 if ((input_len < DISPLAY_LEN_MIN_13200) || (input_len > DISPLAY_LEN_MAX_13200)) return (PARSER_GLOBAL_LENGTH);
19598
19599 if (memcmp (SIGNATURE_AXCRYPT, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19600
19601 u32 *digest = (u32 *) hash_buf->digest;
19602
19603 salt_t *salt = hash_buf->salt;
19604
19605 /**
19606 * parse line
19607 */
19608
19609 /* Skip '*' */
19610 char *wrapping_rounds_pos = input_buf + 11 + 1;
19611
19612 char *salt_pos;
19613
19614 char *wrapped_key_pos;
19615
19616 char *data_pos;
19617
19618 salt->salt_iter = atoi (wrapping_rounds_pos);
19619
19620 salt_pos = strchr (wrapping_rounds_pos, '*');
19621
19622 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19623
19624 uint wrapping_rounds_len = salt_pos - wrapping_rounds_pos;
19625
19626 /* Skip '*' */
19627 salt_pos++;
19628
19629 data_pos = salt_pos;
19630
19631 wrapped_key_pos = strchr (salt_pos, '*');
19632
19633 if (wrapped_key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19634
19635 uint salt_len = wrapped_key_pos - salt_pos;
19636
19637 if (salt_len != 32) return (PARSER_SALT_LENGTH);
19638
19639 /* Skip '*' */
19640 wrapped_key_pos++;
19641
19642 uint wrapped_key_len = input_len - 11 - 1 - wrapping_rounds_len - 1 - salt_len - 1;
19643
19644 if (wrapped_key_len != 48) return (PARSER_SALT_LENGTH);
19645
19646 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19647 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19648 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &data_pos[16]);
19649 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &data_pos[24]);
19650
19651 data_pos += 33;
19652
19653 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19654 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19655 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &data_pos[16]);
19656 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &data_pos[24]);
19657 salt->salt_buf[8] = hex_to_u32 ((const u8 *) &data_pos[32]);
19658 salt->salt_buf[9] = hex_to_u32 ((const u8 *) &data_pos[40]);
19659
19660 salt->salt_len = 40;
19661
19662 digest[0] = salt->salt_buf[0];
19663 digest[1] = salt->salt_buf[1];
19664 digest[2] = salt->salt_buf[2];
19665 digest[3] = salt->salt_buf[3];
19666
19667 return (PARSER_OK);
19668 }
19669
19670 int keepass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19671 {
19672 if ((input_len < DISPLAY_LEN_MIN_13400) || (input_len > DISPLAY_LEN_MAX_13400)) return (PARSER_GLOBAL_LENGTH);
19673
19674 if (memcmp (SIGNATURE_KEEPASS, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
19675
19676 u32 *digest = (u32 *) hash_buf->digest;
19677
19678 salt_t *salt = hash_buf->salt;
19679
19680 keepass_t *keepass = (keepass_t *) hash_buf->esalt;
19681
19682 /**
19683 * parse line
19684 */
19685
19686 char *version_pos;
19687
19688 char *rounds_pos;
19689
19690 char *algorithm_pos;
19691
19692 char *final_random_seed_pos;
19693 u32 final_random_seed_len;
19694
19695 char *transf_random_seed_pos;
19696 u32 transf_random_seed_len;
19697
19698 char *enc_iv_pos;
19699 u32 enc_iv_len;
19700
19701 /* default is no keyfile provided */
19702 char *keyfile_len_pos;
19703 u32 keyfile_len = 0;
19704 u32 is_keyfile_present = 0;
19705 char *keyfile_inline_pos;
19706 char *keyfile_pos;
19707
19708 /* specific to version 1 */
19709 char *contents_len_pos;
19710 u32 contents_len;
19711 char *contents_pos;
19712
19713 /* specific to version 2 */
19714 char *expected_bytes_pos;
19715 u32 expected_bytes_len;
19716
19717 char *contents_hash_pos;
19718 u32 contents_hash_len;
19719
19720 version_pos = input_buf + 8 + 1 + 1;
19721
19722 keepass->version = atoi (version_pos);
19723
19724 rounds_pos = strchr (version_pos, '*');
19725
19726 if (rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19727
19728 rounds_pos++;
19729
19730 salt->salt_iter = (atoi (rounds_pos));
19731
19732 algorithm_pos = strchr (rounds_pos, '*');
19733
19734 if (algorithm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19735
19736 algorithm_pos++;
19737
19738 keepass->algorithm = atoi (algorithm_pos);
19739
19740 final_random_seed_pos = strchr (algorithm_pos, '*');
19741
19742 if (final_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19743
19744 final_random_seed_pos++;
19745
19746 keepass->final_random_seed[0] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 0]);
19747 keepass->final_random_seed[1] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 8]);
19748 keepass->final_random_seed[2] = hex_to_u32 ((const u8 *) &final_random_seed_pos[16]);
19749 keepass->final_random_seed[3] = hex_to_u32 ((const u8 *) &final_random_seed_pos[24]);
19750
19751 if (keepass->version == 2)
19752 {
19753 keepass->final_random_seed[4] = hex_to_u32 ((const u8 *) &final_random_seed_pos[32]);
19754 keepass->final_random_seed[5] = hex_to_u32 ((const u8 *) &final_random_seed_pos[40]);
19755 keepass->final_random_seed[6] = hex_to_u32 ((const u8 *) &final_random_seed_pos[48]);
19756 keepass->final_random_seed[7] = hex_to_u32 ((const u8 *) &final_random_seed_pos[56]);
19757 }
19758
19759 transf_random_seed_pos = strchr (final_random_seed_pos, '*');
19760
19761 if (transf_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19762
19763 final_random_seed_len = transf_random_seed_pos - final_random_seed_pos;
19764
19765 if (keepass->version == 1 && final_random_seed_len != 32) return (PARSER_SALT_LENGTH);
19766 if (keepass->version == 2 && final_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19767
19768 transf_random_seed_pos++;
19769
19770 keepass->transf_random_seed[0] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 0]);
19771 keepass->transf_random_seed[1] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 8]);
19772 keepass->transf_random_seed[2] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[16]);
19773 keepass->transf_random_seed[3] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[24]);
19774 keepass->transf_random_seed[4] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[32]);
19775 keepass->transf_random_seed[5] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[40]);
19776 keepass->transf_random_seed[6] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[48]);
19777 keepass->transf_random_seed[7] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[56]);
19778
19779 enc_iv_pos = strchr (transf_random_seed_pos, '*');
19780
19781 if (enc_iv_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19782
19783 transf_random_seed_len = enc_iv_pos - transf_random_seed_pos;
19784
19785 if (transf_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19786
19787 enc_iv_pos++;
19788
19789 keepass->enc_iv[0] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 0]);
19790 keepass->enc_iv[1] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 8]);
19791 keepass->enc_iv[2] = hex_to_u32 ((const u8 *) &enc_iv_pos[16]);
19792 keepass->enc_iv[3] = hex_to_u32 ((const u8 *) &enc_iv_pos[24]);
19793
19794 if (keepass->version == 1)
19795 {
19796 contents_hash_pos = strchr (enc_iv_pos, '*');
19797
19798 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19799
19800 enc_iv_len = contents_hash_pos - enc_iv_pos;
19801
19802 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19803
19804 contents_hash_pos++;
19805
19806 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19807 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19808 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19809 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19810 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
19811 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
19812 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
19813 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
19814
19815 /* get length of contents following */
19816 char *inline_flag_pos = strchr (contents_hash_pos, '*');
19817
19818 if (inline_flag_pos == NULL) return (PARSER_SALT_LENGTH);
19819
19820 contents_hash_len = inline_flag_pos - contents_hash_pos;
19821
19822 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
19823
19824 inline_flag_pos++;
19825
19826 u32 inline_flag = atoi (inline_flag_pos);
19827
19828 if (inline_flag != 1) return (PARSER_SALT_LENGTH);
19829
19830 contents_len_pos = strchr (inline_flag_pos, '*');
19831
19832 if (contents_len_pos == NULL) return (PARSER_SALT_LENGTH);
19833
19834 contents_len_pos++;
19835
19836 contents_len = atoi (contents_len_pos);
19837
19838 if (contents_len > 50000) return (PARSER_SALT_LENGTH);
19839
19840 contents_pos = strchr (contents_len_pos, '*');
19841
19842 if (contents_pos == NULL) return (PARSER_SALT_LENGTH);
19843
19844 contents_pos++;
19845
19846 u32 i;
19847
19848 keepass->contents_len = contents_len;
19849
19850 contents_len = contents_len / 4;
19851
19852 keyfile_inline_pos = strchr (contents_pos, '*');
19853
19854 u32 real_contents_len;
19855
19856 if (keyfile_inline_pos == NULL)
19857 real_contents_len = input_len - (contents_pos - input_buf);
19858 else
19859 {
19860 real_contents_len = keyfile_inline_pos - contents_pos;
19861 keyfile_inline_pos++;
19862 is_keyfile_present = 1;
19863 }
19864
19865 if (real_contents_len != keepass->contents_len * 2) return (PARSER_SALT_LENGTH);
19866
19867 for (i = 0; i < contents_len; i++)
19868 keepass->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]);
19869 }
19870 else if (keepass->version == 2)
19871 {
19872 expected_bytes_pos = strchr (enc_iv_pos, '*');
19873
19874 if (expected_bytes_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19875
19876 enc_iv_len = expected_bytes_pos - enc_iv_pos;
19877
19878 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19879
19880 expected_bytes_pos++;
19881
19882 keepass->expected_bytes[0] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 0]);
19883 keepass->expected_bytes[1] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 8]);
19884 keepass->expected_bytes[2] = hex_to_u32 ((const u8 *) &expected_bytes_pos[16]);
19885 keepass->expected_bytes[3] = hex_to_u32 ((const u8 *) &expected_bytes_pos[24]);
19886 keepass->expected_bytes[4] = hex_to_u32 ((const u8 *) &expected_bytes_pos[32]);
19887 keepass->expected_bytes[5] = hex_to_u32 ((const u8 *) &expected_bytes_pos[40]);
19888 keepass->expected_bytes[6] = hex_to_u32 ((const u8 *) &expected_bytes_pos[48]);
19889 keepass->expected_bytes[7] = hex_to_u32 ((const u8 *) &expected_bytes_pos[56]);
19890
19891 contents_hash_pos = strchr (expected_bytes_pos, '*');
19892
19893 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19894
19895 expected_bytes_len = contents_hash_pos - expected_bytes_pos;
19896
19897 if (expected_bytes_len != 64) return (PARSER_SALT_LENGTH);
19898
19899 contents_hash_pos++;
19900
19901 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19902 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19903 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19904 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19905 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
19906 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
19907 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
19908 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
19909
19910 keyfile_inline_pos = strchr (contents_hash_pos, '*');
19911
19912 if (keyfile_inline_pos == NULL)
19913 contents_hash_len = input_len - (int) (contents_hash_pos - input_buf);
19914 else
19915 {
19916 contents_hash_len = keyfile_inline_pos - contents_hash_pos;
19917 keyfile_inline_pos++;
19918 is_keyfile_present = 1;
19919 }
19920 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
19921 }
19922
19923 if (is_keyfile_present != 0)
19924 {
19925 keyfile_len_pos = strchr (keyfile_inline_pos, '*');
19926
19927 keyfile_len_pos++;
19928
19929 keyfile_len = atoi (keyfile_len_pos);
19930
19931 keepass->keyfile_len = keyfile_len;
19932
19933 if (keyfile_len != 64) return (PARSER_SALT_LENGTH);
19934
19935 keyfile_pos = strchr (keyfile_len_pos, '*');
19936
19937 if (keyfile_pos == NULL) return (PARSER_SALT_LENGTH);
19938
19939 keyfile_pos++;
19940
19941 u32 real_keyfile_len = input_len - (keyfile_pos - input_buf);
19942
19943 if (real_keyfile_len != 64) return (PARSER_SALT_LENGTH);
19944
19945 keepass->keyfile[0] = hex_to_u32 ((const u8 *) &keyfile_pos[ 0]);
19946 keepass->keyfile[1] = hex_to_u32 ((const u8 *) &keyfile_pos[ 8]);
19947 keepass->keyfile[2] = hex_to_u32 ((const u8 *) &keyfile_pos[16]);
19948 keepass->keyfile[3] = hex_to_u32 ((const u8 *) &keyfile_pos[24]);
19949 keepass->keyfile[4] = hex_to_u32 ((const u8 *) &keyfile_pos[32]);
19950 keepass->keyfile[5] = hex_to_u32 ((const u8 *) &keyfile_pos[40]);
19951 keepass->keyfile[6] = hex_to_u32 ((const u8 *) &keyfile_pos[48]);
19952 keepass->keyfile[7] = hex_to_u32 ((const u8 *) &keyfile_pos[56]);
19953 }
19954
19955 digest[0] = keepass->enc_iv[0];
19956 digest[1] = keepass->enc_iv[1];
19957 digest[2] = keepass->enc_iv[2];
19958 digest[3] = keepass->enc_iv[3];
19959
19960 salt->salt_buf[0] = keepass->transf_random_seed[0];
19961 salt->salt_buf[1] = keepass->transf_random_seed[1];
19962 salt->salt_buf[2] = keepass->transf_random_seed[2];
19963 salt->salt_buf[3] = keepass->transf_random_seed[3];
19964 salt->salt_buf[4] = keepass->transf_random_seed[4];
19965 salt->salt_buf[5] = keepass->transf_random_seed[5];
19966 salt->salt_buf[6] = keepass->transf_random_seed[6];
19967 salt->salt_buf[7] = keepass->transf_random_seed[7];
19968
19969 return (PARSER_OK);
19970 }
19971
19972 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19973 {
19974 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
19975
19976 u32 *digest = (u32 *) hash_buf->digest;
19977
19978 salt_t *salt = hash_buf->salt;
19979
19980 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
19981 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
19982 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
19983 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
19984 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
19985 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
19986 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
19987 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
19988
19989 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
19990
19991 uint salt_len = input_len - 64 - 1;
19992
19993 char *salt_buf = input_buf + 64 + 1;
19994
19995 char *salt_buf_ptr = (char *) salt->salt_buf;
19996
19997 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
19998
19999 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
20000
20001 salt->salt_len = salt_len;
20002
20003 /**
20004 * we can precompute the first sha256 transform
20005 */
20006
20007 uint w[16] = { 0 };
20008
20009 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
20010 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
20011 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
20012 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
20013 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
20014 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
20015 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
20016 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
20017 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
20018 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
20019 w[10] = byte_swap_32 (salt->salt_buf[10]);
20020 w[11] = byte_swap_32 (salt->salt_buf[11]);
20021 w[12] = byte_swap_32 (salt->salt_buf[12]);
20022 w[13] = byte_swap_32 (salt->salt_buf[13]);
20023 w[14] = byte_swap_32 (salt->salt_buf[14]);
20024 w[15] = byte_swap_32 (salt->salt_buf[15]);
20025
20026 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
20027
20028 sha256_64 (w, pc256);
20029
20030 salt->salt_buf_pc[0] = pc256[0];
20031 salt->salt_buf_pc[1] = pc256[1];
20032 salt->salt_buf_pc[2] = pc256[2];
20033 salt->salt_buf_pc[3] = pc256[3];
20034 salt->salt_buf_pc[4] = pc256[4];
20035 salt->salt_buf_pc[5] = pc256[5];
20036 salt->salt_buf_pc[6] = pc256[6];
20037 salt->salt_buf_pc[7] = pc256[7];
20038
20039 digest[0] -= pc256[0];
20040 digest[1] -= pc256[1];
20041 digest[2] -= pc256[2];
20042 digest[3] -= pc256[3];
20043 digest[4] -= pc256[4];
20044 digest[5] -= pc256[5];
20045 digest[6] -= pc256[6];
20046 digest[7] -= pc256[7];
20047
20048 return (PARSER_OK);
20049 }
20050
20051 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20052 {
20053 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
20054
20055 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
20056
20057 u32 *digest = (u32 *) hash_buf->digest;
20058
20059 salt_t *salt = hash_buf->salt;
20060
20061 /**
20062 * parse line
20063 */
20064
20065 char *data_len_pos = input_buf + 1 + 10 + 1;
20066
20067 char *data_buf_pos = strchr (data_len_pos, '$');
20068
20069 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20070
20071 u32 data_len_len = data_buf_pos - data_len_pos;
20072
20073 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
20074 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
20075
20076 data_buf_pos++;
20077
20078 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
20079
20080 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
20081
20082 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
20083
20084 u32 data_len = atoi (data_len_pos);
20085
20086 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
20087
20088 /**
20089 * salt
20090 */
20091
20092 char *salt_pos = data_buf_pos;
20093
20094 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20095 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20096 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
20097 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
20098
20099 // this is actually the CT, which is also the hash later (if matched)
20100
20101 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
20102 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
20103 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
20104 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
20105
20106 salt->salt_len = 32; // note we need to fix this to 16 in kernel
20107
20108 salt->salt_iter = 10 - 1;
20109
20110 /**
20111 * digest buf
20112 */
20113
20114 digest[0] = salt->salt_buf[4];
20115 digest[1] = salt->salt_buf[5];
20116 digest[2] = salt->salt_buf[6];
20117 digest[3] = salt->salt_buf[7];
20118
20119 return (PARSER_OK);
20120 }
20121
20122 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20123 {
20124 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
20125
20126 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
20127
20128 u32 *digest = (u32 *) hash_buf->digest;
20129
20130 salt_t *salt = hash_buf->salt;
20131
20132 /**
20133 * parse line
20134 */
20135
20136 char *salt_pos = input_buf + 11 + 1;
20137
20138 char *iter_pos = strchr (salt_pos, ',');
20139
20140 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20141
20142 u32 salt_len = iter_pos - salt_pos;
20143
20144 if (salt_len != 20) return (PARSER_SALT_LENGTH);
20145
20146 iter_pos++;
20147
20148 char *hash_pos = strchr (iter_pos, ',');
20149
20150 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20151
20152 u32 iter_len = hash_pos - iter_pos;
20153
20154 if (iter_len > 5) return (PARSER_SALT_LENGTH);
20155
20156 hash_pos++;
20157
20158 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
20159
20160 if (hash_len != 64) return (PARSER_HASH_LENGTH);
20161
20162 /**
20163 * salt
20164 */
20165
20166 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20167 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20168 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
20169 salt->salt_buf[3] = 0x00018000;
20170
20171 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
20172 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
20173 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
20174 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
20175
20176 salt->salt_len = salt_len / 2;
20177
20178 salt->salt_iter = atoi (iter_pos) - 1;
20179
20180 /**
20181 * digest buf
20182 */
20183
20184 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20185 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20186 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20187 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20188 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20189 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20190 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20191 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20192
20193 return (PARSER_OK);
20194 }
20195
20196 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20197 {
20198 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
20199
20200 u32 *digest = (u32 *) hash_buf->digest;
20201
20202 salt_t *salt = hash_buf->salt;
20203
20204 /**
20205 * parse line
20206 */
20207
20208 char *hash_pos = input_buf + 64;
20209 char *salt1_pos = input_buf + 128;
20210 char *salt2_pos = input_buf;
20211
20212 /**
20213 * salt
20214 */
20215
20216 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
20217 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
20218 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
20219 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
20220
20221 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
20222 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
20223 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
20224 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
20225
20226 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
20227 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
20228 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
20229 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
20230
20231 salt->salt_len = 48;
20232
20233 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
20234
20235 /**
20236 * digest buf
20237 */
20238
20239 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20240 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20241 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20242 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20243 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20244 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20245 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20246 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20247
20248 return (PARSER_OK);
20249 }
20250
20251 int zip2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20252 {
20253 if ((input_len < DISPLAY_LEN_MIN_13600) || (input_len > DISPLAY_LEN_MAX_13600)) return (PARSER_GLOBAL_LENGTH);
20254
20255 if (memcmp (SIGNATURE_ZIP2_START, input_buf , 6)) return (PARSER_SIGNATURE_UNMATCHED);
20256 if (memcmp (SIGNATURE_ZIP2_STOP , input_buf + input_len - 7, 7)) return (PARSER_SIGNATURE_UNMATCHED);
20257
20258 u32 *digest = (u32 *) hash_buf->digest;
20259
20260 salt_t *salt = hash_buf->salt;
20261
20262 zip2_t *zip2 = (zip2_t *) hash_buf->esalt;
20263
20264 /**
20265 * parse line
20266 */
20267
20268 char *param0_pos = input_buf + 6 + 1;
20269
20270 char *param1_pos = strchr (param0_pos, '*');
20271
20272 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20273
20274 u32 param0_len = param1_pos - param0_pos;
20275
20276 param1_pos++;
20277
20278 char *param2_pos = strchr (param1_pos, '*');
20279
20280 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20281
20282 u32 param1_len = param2_pos - param1_pos;
20283
20284 param2_pos++;
20285
20286 char *param3_pos = strchr (param2_pos, '*');
20287
20288 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20289
20290 u32 param2_len = param3_pos - param2_pos;
20291
20292 param3_pos++;
20293
20294 char *param4_pos = strchr (param3_pos, '*');
20295
20296 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20297
20298 u32 param3_len = param4_pos - param3_pos;
20299
20300 param4_pos++;
20301
20302 char *param5_pos = strchr (param4_pos, '*');
20303
20304 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20305
20306 u32 param4_len = param5_pos - param4_pos;
20307
20308 param5_pos++;
20309
20310 char *param6_pos = strchr (param5_pos, '*');
20311
20312 if (param6_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20313
20314 u32 param5_len = param6_pos - param5_pos;
20315
20316 param6_pos++;
20317
20318 char *param7_pos = strchr (param6_pos, '*');
20319
20320 if (param7_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20321
20322 u32 param6_len = param7_pos - param6_pos;
20323
20324 param7_pos++;
20325
20326 char *param8_pos = strchr (param7_pos, '*');
20327
20328 if (param8_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20329
20330 u32 param7_len = param8_pos - param7_pos;
20331
20332 param8_pos++;
20333
20334 const uint type = atoi (param0_pos);
20335 const uint mode = atoi (param1_pos);
20336 const uint magic = atoi (param2_pos);
20337
20338 char *salt_buf = param3_pos;
20339
20340 uint verify_bytes; sscanf (param4_pos, "%4x*", &verify_bytes);
20341
20342 const uint compress_length = atoi (param5_pos);
20343
20344 char *data_buf = param6_pos;
20345 char *auth = param7_pos;
20346
20347 /**
20348 * verify some data
20349 */
20350
20351 if (param0_len != 1) return (PARSER_SALT_VALUE);
20352
20353 if (param1_len != 1) return (PARSER_SALT_VALUE);
20354
20355 if (param2_len != 1) return (PARSER_SALT_VALUE);
20356
20357 if ((param3_len != 16) && (param3_len != 24) && (param3_len != 32)) return (PARSER_SALT_VALUE);
20358
20359 if (param4_len >= 5) return (PARSER_SALT_VALUE);
20360
20361 if (param5_len >= 5) return (PARSER_SALT_VALUE);
20362
20363 if (param6_len >= 8192) return (PARSER_SALT_VALUE);
20364
20365 if (param6_len & 1) return (PARSER_SALT_VALUE);
20366
20367 if (param7_len != 20) return (PARSER_SALT_VALUE);
20368
20369 if (type != 0) return (PARSER_SALT_VALUE);
20370
20371 if ((mode != 1) && (mode != 2) && (mode != 3)) return (PARSER_SALT_VALUE);
20372
20373 if (magic != 0) return (PARSER_SALT_VALUE);
20374
20375 if (verify_bytes >= 0x10000) return (PARSER_SALT_VALUE);
20376
20377 /**
20378 * store data
20379 */
20380
20381 zip2->type = type;
20382 zip2->mode = mode;
20383 zip2->magic = magic;
20384
20385 if (mode == 1)
20386 {
20387 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20388 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20389 zip2->salt_buf[2] = 0;
20390 zip2->salt_buf[3] = 0;
20391
20392 zip2->salt_len = 8;
20393 }
20394 else if (mode == 2)
20395 {
20396 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20397 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20398 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20399 zip2->salt_buf[3] = 0;
20400
20401 zip2->salt_len = 12;
20402 }
20403 else if (mode == 3)
20404 {
20405 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20406 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20407 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20408 zip2->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
20409
20410 zip2->salt_len = 16;
20411 }
20412
20413 zip2->salt_buf[0] = byte_swap_32 (zip2->salt_buf[0]);
20414 zip2->salt_buf[1] = byte_swap_32 (zip2->salt_buf[1]);
20415 zip2->salt_buf[2] = byte_swap_32 (zip2->salt_buf[2]);
20416 zip2->salt_buf[3] = byte_swap_32 (zip2->salt_buf[3]);
20417
20418 zip2->verify_bytes = verify_bytes;
20419
20420 zip2->compress_length = compress_length;
20421
20422 char *data_buf_ptr = (char *) zip2->data_buf;
20423
20424 for (uint i = 0; i < param6_len; i += 2)
20425 {
20426 const char p0 = data_buf[i + 0];
20427 const char p1 = data_buf[i + 1];
20428
20429 *data_buf_ptr++ = hex_convert (p1) << 0
20430 | hex_convert (p0) << 4;
20431
20432 zip2->data_len++;
20433 }
20434
20435 *data_buf_ptr = 0x80;
20436
20437 char *auth_ptr = (char *) zip2->auth_buf;
20438
20439 for (uint i = 0; i < param7_len; i += 2)
20440 {
20441 const char p0 = auth[i + 0];
20442 const char p1 = auth[i + 1];
20443
20444 *auth_ptr++ = hex_convert (p1) << 0
20445 | hex_convert (p0) << 4;
20446
20447 zip2->auth_len++;
20448 }
20449
20450 /**
20451 * salt buf (fake)
20452 */
20453
20454 salt->salt_buf[0] = zip2->salt_buf[0];
20455 salt->salt_buf[1] = zip2->salt_buf[1];
20456 salt->salt_buf[2] = zip2->salt_buf[2];
20457 salt->salt_buf[3] = zip2->salt_buf[3];
20458 salt->salt_buf[4] = zip2->data_buf[0];
20459 salt->salt_buf[5] = zip2->data_buf[1];
20460 salt->salt_buf[6] = zip2->data_buf[2];
20461 salt->salt_buf[7] = zip2->data_buf[3];
20462
20463 salt->salt_len = 32;
20464
20465 salt->salt_iter = ROUNDS_ZIP2 - 1;
20466
20467 /**
20468 * digest buf (fake)
20469 */
20470
20471 digest[0] = zip2->auth_buf[0];
20472 digest[1] = zip2->auth_buf[1];
20473 digest[2] = zip2->auth_buf[2];
20474 digest[3] = zip2->auth_buf[3];
20475
20476 return (PARSER_OK);
20477 }
20478
20479 /**
20480 * parallel running threads
20481 */
20482
20483 #ifdef WIN
20484
20485 BOOL WINAPI sigHandler_default (DWORD sig)
20486 {
20487 switch (sig)
20488 {
20489 case CTRL_CLOSE_EVENT:
20490
20491 /*
20492 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
20493 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
20494 * function otherwise it is too late (e.g. after returning from this function)
20495 */
20496
20497 myabort ();
20498
20499 SetConsoleCtrlHandler (NULL, TRUE);
20500
20501 hc_sleep (10);
20502
20503 return TRUE;
20504
20505 case CTRL_C_EVENT:
20506 case CTRL_LOGOFF_EVENT:
20507 case CTRL_SHUTDOWN_EVENT:
20508
20509 myabort ();
20510
20511 SetConsoleCtrlHandler (NULL, TRUE);
20512
20513 return TRUE;
20514 }
20515
20516 return FALSE;
20517 }
20518
20519 BOOL WINAPI sigHandler_benchmark (DWORD sig)
20520 {
20521 switch (sig)
20522 {
20523 case CTRL_CLOSE_EVENT:
20524
20525 myabort ();
20526
20527 SetConsoleCtrlHandler (NULL, TRUE);
20528
20529 hc_sleep (10);
20530
20531 return TRUE;
20532
20533 case CTRL_C_EVENT:
20534 case CTRL_LOGOFF_EVENT:
20535 case CTRL_SHUTDOWN_EVENT:
20536
20537 myquit ();
20538
20539 SetConsoleCtrlHandler (NULL, TRUE);
20540
20541 return TRUE;
20542 }
20543
20544 return FALSE;
20545 }
20546
20547 void hc_signal (BOOL WINAPI (callback) (DWORD))
20548 {
20549 if (callback == NULL)
20550 {
20551 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
20552 }
20553 else
20554 {
20555 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
20556 }
20557 }
20558
20559 #else
20560
20561 void sigHandler_default (int sig)
20562 {
20563 myabort ();
20564
20565 signal (sig, NULL);
20566 }
20567
20568 void sigHandler_benchmark (int sig)
20569 {
20570 myquit ();
20571
20572 signal (sig, NULL);
20573 }
20574
20575 void hc_signal (void (callback) (int))
20576 {
20577 if (callback == NULL) callback = SIG_DFL;
20578
20579 signal (SIGINT, callback);
20580 signal (SIGTERM, callback);
20581 signal (SIGABRT, callback);
20582 }
20583
20584 #endif
20585
20586 void status_display ();
20587
20588 void *thread_keypress (void *p)
20589 {
20590 int benchmark = *((int *) p);
20591
20592 uint quiet = data.quiet;
20593
20594 tty_break();
20595
20596 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
20597 {
20598 int ch = tty_getchar();
20599
20600 if (ch == -1) break;
20601
20602 if (ch == 0) continue;
20603
20604 //https://github.com/hashcat/hashcat/issues/302
20605 //#ifdef _POSIX
20606 //if (ch != '\n')
20607 //#endif
20608
20609 hc_thread_mutex_lock (mux_display);
20610
20611 log_info ("");
20612
20613 switch (ch)
20614 {
20615 case 's':
20616 case '\r':
20617 case '\n':
20618
20619 log_info ("");
20620
20621 status_display ();
20622
20623 log_info ("");
20624
20625 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20626 if (quiet == 0) fflush (stdout);
20627
20628 break;
20629
20630 case 'b':
20631
20632 log_info ("");
20633
20634 bypass ();
20635
20636 log_info ("");
20637
20638 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20639 if (quiet == 0) fflush (stdout);
20640
20641 break;
20642
20643 case 'p':
20644
20645 log_info ("");
20646
20647 SuspendThreads ();
20648
20649 log_info ("");
20650
20651 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20652 if (quiet == 0) fflush (stdout);
20653
20654 break;
20655
20656 case 'r':
20657
20658 log_info ("");
20659
20660 ResumeThreads ();
20661
20662 log_info ("");
20663
20664 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20665 if (quiet == 0) fflush (stdout);
20666
20667 break;
20668
20669 case 'c':
20670
20671 log_info ("");
20672
20673 if (benchmark == 1) break;
20674
20675 stop_at_checkpoint ();
20676
20677 log_info ("");
20678
20679 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20680 if (quiet == 0) fflush (stdout);
20681
20682 break;
20683
20684 case 'q':
20685
20686 log_info ("");
20687
20688 if (benchmark == 1)
20689 {
20690 myquit ();
20691 }
20692 else
20693 {
20694 myabort ();
20695 }
20696
20697 break;
20698 }
20699
20700 //https://github.com/hashcat/hashcat/issues/302
20701 //#ifdef _POSIX
20702 //if (ch != '\n')
20703 //#endif
20704
20705 hc_thread_mutex_unlock (mux_display);
20706 }
20707
20708 tty_fix();
20709
20710 return (p);
20711 }
20712
20713 /**
20714 * rules common
20715 */
20716
20717 bool class_num (const u8 c)
20718 {
20719 return ((c >= '0') && (c <= '9'));
20720 }
20721
20722 bool class_lower (const u8 c)
20723 {
20724 return ((c >= 'a') && (c <= 'z'));
20725 }
20726
20727 bool class_upper (const u8 c)
20728 {
20729 return ((c >= 'A') && (c <= 'Z'));
20730 }
20731
20732 bool class_alpha (const u8 c)
20733 {
20734 return (class_lower (c) || class_upper (c));
20735 }
20736
20737 int conv_ctoi (const u8 c)
20738 {
20739 if (class_num (c))
20740 {
20741 return c - '0';
20742 }
20743 else if (class_upper (c))
20744 {
20745 return c - 'A' + 10;
20746 }
20747
20748 return -1;
20749 }
20750
20751 int conv_itoc (const u8 c)
20752 {
20753 if (c < 10)
20754 {
20755 return c + '0';
20756 }
20757 else if (c < 37)
20758 {
20759 return c + 'A' - 10;
20760 }
20761
20762 return -1;
20763 }
20764
20765 /**
20766 * device rules
20767 */
20768
20769 #define INCR_POS if (++rule_pos == rule_len) return (-1)
20770 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
20771 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
20772 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
20773 #define MAX_KERNEL_RULES 255
20774 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
20775 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20776 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20777
20778 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
20779 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
20780 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20781 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20782
20783 int cpu_rule_to_kernel_rule (char *rule_buf, uint rule_len, kernel_rule_t *rule)
20784 {
20785 uint rule_pos;
20786 uint rule_cnt;
20787
20788 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
20789 {
20790 switch (rule_buf[rule_pos])
20791 {
20792 case ' ':
20793 rule_cnt--;
20794 break;
20795
20796 case RULE_OP_MANGLE_NOOP:
20797 SET_NAME (rule, rule_buf[rule_pos]);
20798 break;
20799
20800 case RULE_OP_MANGLE_LREST:
20801 SET_NAME (rule, rule_buf[rule_pos]);
20802 break;
20803
20804 case RULE_OP_MANGLE_UREST:
20805 SET_NAME (rule, rule_buf[rule_pos]);
20806 break;
20807
20808 case RULE_OP_MANGLE_LREST_UFIRST:
20809 SET_NAME (rule, rule_buf[rule_pos]);
20810 break;
20811
20812 case RULE_OP_MANGLE_UREST_LFIRST:
20813 SET_NAME (rule, rule_buf[rule_pos]);
20814 break;
20815
20816 case RULE_OP_MANGLE_TREST:
20817 SET_NAME (rule, rule_buf[rule_pos]);
20818 break;
20819
20820 case RULE_OP_MANGLE_TOGGLE_AT:
20821 SET_NAME (rule, rule_buf[rule_pos]);
20822 SET_P0_CONV (rule, rule_buf[rule_pos]);
20823 break;
20824
20825 case RULE_OP_MANGLE_REVERSE:
20826 SET_NAME (rule, rule_buf[rule_pos]);
20827 break;
20828
20829 case RULE_OP_MANGLE_DUPEWORD:
20830 SET_NAME (rule, rule_buf[rule_pos]);
20831 break;
20832
20833 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20834 SET_NAME (rule, rule_buf[rule_pos]);
20835 SET_P0_CONV (rule, rule_buf[rule_pos]);
20836 break;
20837
20838 case RULE_OP_MANGLE_REFLECT:
20839 SET_NAME (rule, rule_buf[rule_pos]);
20840 break;
20841
20842 case RULE_OP_MANGLE_ROTATE_LEFT:
20843 SET_NAME (rule, rule_buf[rule_pos]);
20844 break;
20845
20846 case RULE_OP_MANGLE_ROTATE_RIGHT:
20847 SET_NAME (rule, rule_buf[rule_pos]);
20848 break;
20849
20850 case RULE_OP_MANGLE_APPEND:
20851 SET_NAME (rule, rule_buf[rule_pos]);
20852 SET_P0 (rule, rule_buf[rule_pos]);
20853 break;
20854
20855 case RULE_OP_MANGLE_PREPEND:
20856 SET_NAME (rule, rule_buf[rule_pos]);
20857 SET_P0 (rule, rule_buf[rule_pos]);
20858 break;
20859
20860 case RULE_OP_MANGLE_DELETE_FIRST:
20861 SET_NAME (rule, rule_buf[rule_pos]);
20862 break;
20863
20864 case RULE_OP_MANGLE_DELETE_LAST:
20865 SET_NAME (rule, rule_buf[rule_pos]);
20866 break;
20867
20868 case RULE_OP_MANGLE_DELETE_AT:
20869 SET_NAME (rule, rule_buf[rule_pos]);
20870 SET_P0_CONV (rule, rule_buf[rule_pos]);
20871 break;
20872
20873 case RULE_OP_MANGLE_EXTRACT:
20874 SET_NAME (rule, rule_buf[rule_pos]);
20875 SET_P0_CONV (rule, rule_buf[rule_pos]);
20876 SET_P1_CONV (rule, rule_buf[rule_pos]);
20877 break;
20878
20879 case RULE_OP_MANGLE_OMIT:
20880 SET_NAME (rule, rule_buf[rule_pos]);
20881 SET_P0_CONV (rule, rule_buf[rule_pos]);
20882 SET_P1_CONV (rule, rule_buf[rule_pos]);
20883 break;
20884
20885 case RULE_OP_MANGLE_INSERT:
20886 SET_NAME (rule, rule_buf[rule_pos]);
20887 SET_P0_CONV (rule, rule_buf[rule_pos]);
20888 SET_P1 (rule, rule_buf[rule_pos]);
20889 break;
20890
20891 case RULE_OP_MANGLE_OVERSTRIKE:
20892 SET_NAME (rule, rule_buf[rule_pos]);
20893 SET_P0_CONV (rule, rule_buf[rule_pos]);
20894 SET_P1 (rule, rule_buf[rule_pos]);
20895 break;
20896
20897 case RULE_OP_MANGLE_TRUNCATE_AT:
20898 SET_NAME (rule, rule_buf[rule_pos]);
20899 SET_P0_CONV (rule, rule_buf[rule_pos]);
20900 break;
20901
20902 case RULE_OP_MANGLE_REPLACE:
20903 SET_NAME (rule, rule_buf[rule_pos]);
20904 SET_P0 (rule, rule_buf[rule_pos]);
20905 SET_P1 (rule, rule_buf[rule_pos]);
20906 break;
20907
20908 case RULE_OP_MANGLE_PURGECHAR:
20909 return (-1);
20910 break;
20911
20912 case RULE_OP_MANGLE_TOGGLECASE_REC:
20913 return (-1);
20914 break;
20915
20916 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20917 SET_NAME (rule, rule_buf[rule_pos]);
20918 SET_P0_CONV (rule, rule_buf[rule_pos]);
20919 break;
20920
20921 case RULE_OP_MANGLE_DUPECHAR_LAST:
20922 SET_NAME (rule, rule_buf[rule_pos]);
20923 SET_P0_CONV (rule, rule_buf[rule_pos]);
20924 break;
20925
20926 case RULE_OP_MANGLE_DUPECHAR_ALL:
20927 SET_NAME (rule, rule_buf[rule_pos]);
20928 break;
20929
20930 case RULE_OP_MANGLE_SWITCH_FIRST:
20931 SET_NAME (rule, rule_buf[rule_pos]);
20932 break;
20933
20934 case RULE_OP_MANGLE_SWITCH_LAST:
20935 SET_NAME (rule, rule_buf[rule_pos]);
20936 break;
20937
20938 case RULE_OP_MANGLE_SWITCH_AT:
20939 SET_NAME (rule, rule_buf[rule_pos]);
20940 SET_P0_CONV (rule, rule_buf[rule_pos]);
20941 SET_P1_CONV (rule, rule_buf[rule_pos]);
20942 break;
20943
20944 case RULE_OP_MANGLE_CHR_SHIFTL:
20945 SET_NAME (rule, rule_buf[rule_pos]);
20946 SET_P0_CONV (rule, rule_buf[rule_pos]);
20947 break;
20948
20949 case RULE_OP_MANGLE_CHR_SHIFTR:
20950 SET_NAME (rule, rule_buf[rule_pos]);
20951 SET_P0_CONV (rule, rule_buf[rule_pos]);
20952 break;
20953
20954 case RULE_OP_MANGLE_CHR_INCR:
20955 SET_NAME (rule, rule_buf[rule_pos]);
20956 SET_P0_CONV (rule, rule_buf[rule_pos]);
20957 break;
20958
20959 case RULE_OP_MANGLE_CHR_DECR:
20960 SET_NAME (rule, rule_buf[rule_pos]);
20961 SET_P0_CONV (rule, rule_buf[rule_pos]);
20962 break;
20963
20964 case RULE_OP_MANGLE_REPLACE_NP1:
20965 SET_NAME (rule, rule_buf[rule_pos]);
20966 SET_P0_CONV (rule, rule_buf[rule_pos]);
20967 break;
20968
20969 case RULE_OP_MANGLE_REPLACE_NM1:
20970 SET_NAME (rule, rule_buf[rule_pos]);
20971 SET_P0_CONV (rule, rule_buf[rule_pos]);
20972 break;
20973
20974 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20975 SET_NAME (rule, rule_buf[rule_pos]);
20976 SET_P0_CONV (rule, rule_buf[rule_pos]);
20977 break;
20978
20979 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20980 SET_NAME (rule, rule_buf[rule_pos]);
20981 SET_P0_CONV (rule, rule_buf[rule_pos]);
20982 break;
20983
20984 case RULE_OP_MANGLE_TITLE:
20985 SET_NAME (rule, rule_buf[rule_pos]);
20986 break;
20987
20988 default:
20989 return (-1);
20990 break;
20991 }
20992 }
20993
20994 if (rule_pos < rule_len) return (-1);
20995
20996 return (0);
20997 }
20998
20999 int kernel_rule_to_cpu_rule (char *rule_buf, kernel_rule_t *rule)
21000 {
21001 uint rule_cnt;
21002 uint rule_pos;
21003 uint rule_len = HCBUFSIZ - 1; // maximum possible len
21004
21005 char rule_cmd;
21006
21007 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
21008 {
21009 GET_NAME (rule);
21010
21011 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
21012
21013 switch (rule_cmd)
21014 {
21015 case RULE_OP_MANGLE_NOOP:
21016 rule_buf[rule_pos] = rule_cmd;
21017 break;
21018
21019 case RULE_OP_MANGLE_LREST:
21020 rule_buf[rule_pos] = rule_cmd;
21021 break;
21022
21023 case RULE_OP_MANGLE_UREST:
21024 rule_buf[rule_pos] = rule_cmd;
21025 break;
21026
21027 case RULE_OP_MANGLE_LREST_UFIRST:
21028 rule_buf[rule_pos] = rule_cmd;
21029 break;
21030
21031 case RULE_OP_MANGLE_UREST_LFIRST:
21032 rule_buf[rule_pos] = rule_cmd;
21033 break;
21034
21035 case RULE_OP_MANGLE_TREST:
21036 rule_buf[rule_pos] = rule_cmd;
21037 break;
21038
21039 case RULE_OP_MANGLE_TOGGLE_AT:
21040 rule_buf[rule_pos] = rule_cmd;
21041 GET_P0_CONV (rule);
21042 break;
21043
21044 case RULE_OP_MANGLE_REVERSE:
21045 rule_buf[rule_pos] = rule_cmd;
21046 break;
21047
21048 case RULE_OP_MANGLE_DUPEWORD:
21049 rule_buf[rule_pos] = rule_cmd;
21050 break;
21051
21052 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21053 rule_buf[rule_pos] = rule_cmd;
21054 GET_P0_CONV (rule);
21055 break;
21056
21057 case RULE_OP_MANGLE_REFLECT:
21058 rule_buf[rule_pos] = rule_cmd;
21059 break;
21060
21061 case RULE_OP_MANGLE_ROTATE_LEFT:
21062 rule_buf[rule_pos] = rule_cmd;
21063 break;
21064
21065 case RULE_OP_MANGLE_ROTATE_RIGHT:
21066 rule_buf[rule_pos] = rule_cmd;
21067 break;
21068
21069 case RULE_OP_MANGLE_APPEND:
21070 rule_buf[rule_pos] = rule_cmd;
21071 GET_P0 (rule);
21072 break;
21073
21074 case RULE_OP_MANGLE_PREPEND:
21075 rule_buf[rule_pos] = rule_cmd;
21076 GET_P0 (rule);
21077 break;
21078
21079 case RULE_OP_MANGLE_DELETE_FIRST:
21080 rule_buf[rule_pos] = rule_cmd;
21081 break;
21082
21083 case RULE_OP_MANGLE_DELETE_LAST:
21084 rule_buf[rule_pos] = rule_cmd;
21085 break;
21086
21087 case RULE_OP_MANGLE_DELETE_AT:
21088 rule_buf[rule_pos] = rule_cmd;
21089 GET_P0_CONV (rule);
21090 break;
21091
21092 case RULE_OP_MANGLE_EXTRACT:
21093 rule_buf[rule_pos] = rule_cmd;
21094 GET_P0_CONV (rule);
21095 GET_P1_CONV (rule);
21096 break;
21097
21098 case RULE_OP_MANGLE_OMIT:
21099 rule_buf[rule_pos] = rule_cmd;
21100 GET_P0_CONV (rule);
21101 GET_P1_CONV (rule);
21102 break;
21103
21104 case RULE_OP_MANGLE_INSERT:
21105 rule_buf[rule_pos] = rule_cmd;
21106 GET_P0_CONV (rule);
21107 GET_P1 (rule);
21108 break;
21109
21110 case RULE_OP_MANGLE_OVERSTRIKE:
21111 rule_buf[rule_pos] = rule_cmd;
21112 GET_P0_CONV (rule);
21113 GET_P1 (rule);
21114 break;
21115
21116 case RULE_OP_MANGLE_TRUNCATE_AT:
21117 rule_buf[rule_pos] = rule_cmd;
21118 GET_P0_CONV (rule);
21119 break;
21120
21121 case RULE_OP_MANGLE_REPLACE:
21122 rule_buf[rule_pos] = rule_cmd;
21123 GET_P0 (rule);
21124 GET_P1 (rule);
21125 break;
21126
21127 case RULE_OP_MANGLE_PURGECHAR:
21128 return (-1);
21129 break;
21130
21131 case RULE_OP_MANGLE_TOGGLECASE_REC:
21132 return (-1);
21133 break;
21134
21135 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21136 rule_buf[rule_pos] = rule_cmd;
21137 GET_P0_CONV (rule);
21138 break;
21139
21140 case RULE_OP_MANGLE_DUPECHAR_LAST:
21141 rule_buf[rule_pos] = rule_cmd;
21142 GET_P0_CONV (rule);
21143 break;
21144
21145 case RULE_OP_MANGLE_DUPECHAR_ALL:
21146 rule_buf[rule_pos] = rule_cmd;
21147 break;
21148
21149 case RULE_OP_MANGLE_SWITCH_FIRST:
21150 rule_buf[rule_pos] = rule_cmd;
21151 break;
21152
21153 case RULE_OP_MANGLE_SWITCH_LAST:
21154 rule_buf[rule_pos] = rule_cmd;
21155 break;
21156
21157 case RULE_OP_MANGLE_SWITCH_AT:
21158 rule_buf[rule_pos] = rule_cmd;
21159 GET_P0_CONV (rule);
21160 GET_P1_CONV (rule);
21161 break;
21162
21163 case RULE_OP_MANGLE_CHR_SHIFTL:
21164 rule_buf[rule_pos] = rule_cmd;
21165 GET_P0_CONV (rule);
21166 break;
21167
21168 case RULE_OP_MANGLE_CHR_SHIFTR:
21169 rule_buf[rule_pos] = rule_cmd;
21170 GET_P0_CONV (rule);
21171 break;
21172
21173 case RULE_OP_MANGLE_CHR_INCR:
21174 rule_buf[rule_pos] = rule_cmd;
21175 GET_P0_CONV (rule);
21176 break;
21177
21178 case RULE_OP_MANGLE_CHR_DECR:
21179 rule_buf[rule_pos] = rule_cmd;
21180 GET_P0_CONV (rule);
21181 break;
21182
21183 case RULE_OP_MANGLE_REPLACE_NP1:
21184 rule_buf[rule_pos] = rule_cmd;
21185 GET_P0_CONV (rule);
21186 break;
21187
21188 case RULE_OP_MANGLE_REPLACE_NM1:
21189 rule_buf[rule_pos] = rule_cmd;
21190 GET_P0_CONV (rule);
21191 break;
21192
21193 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21194 rule_buf[rule_pos] = rule_cmd;
21195 GET_P0_CONV (rule);
21196 break;
21197
21198 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21199 rule_buf[rule_pos] = rule_cmd;
21200 GET_P0_CONV (rule);
21201 break;
21202
21203 case RULE_OP_MANGLE_TITLE:
21204 rule_buf[rule_pos] = rule_cmd;
21205 break;
21206
21207 case 0:
21208 return rule_pos - 1;
21209 break;
21210
21211 default:
21212 return (-1);
21213 break;
21214 }
21215 }
21216
21217 if (rule_cnt > 0)
21218 {
21219 return rule_pos;
21220 }
21221
21222 return (-1);
21223 }
21224
21225 /**
21226 * CPU rules : this is from hashcat sources, cpu based rules
21227 */
21228
21229 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
21230 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
21231
21232 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
21233 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
21234 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
21235
21236 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
21237 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
21238 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
21239
21240 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
21241 {
21242 int pos;
21243
21244 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
21245
21246 return (arr_len);
21247 }
21248
21249 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
21250 {
21251 int pos;
21252
21253 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
21254
21255 return (arr_len);
21256 }
21257
21258 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
21259 {
21260 int pos;
21261
21262 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
21263
21264 return (arr_len);
21265 }
21266
21267 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
21268 {
21269 int l;
21270 int r;
21271
21272 for (l = 0; l < arr_len; l++)
21273 {
21274 r = arr_len - 1 - l;
21275
21276 if (l >= r) break;
21277
21278 MANGLE_SWITCH (arr, l, r);
21279 }
21280
21281 return (arr_len);
21282 }
21283
21284 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
21285 {
21286 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21287
21288 memcpy (&arr[arr_len], arr, (size_t) arr_len);
21289
21290 return (arr_len * 2);
21291 }
21292
21293 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
21294 {
21295 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
21296
21297 int orig_len = arr_len;
21298
21299 int i;
21300
21301 for (i = 0; i < times; i++)
21302 {
21303 memcpy (&arr[arr_len], arr, orig_len);
21304
21305 arr_len += orig_len;
21306 }
21307
21308 return (arr_len);
21309 }
21310
21311 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
21312 {
21313 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21314
21315 mangle_double (arr, arr_len);
21316
21317 mangle_reverse (arr + arr_len, arr_len);
21318
21319 return (arr_len * 2);
21320 }
21321
21322 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
21323 {
21324 int l;
21325 int r;
21326
21327 for (l = 0, r = arr_len - 1; r > 0; r--)
21328 {
21329 MANGLE_SWITCH (arr, l, r);
21330 }
21331
21332 return (arr_len);
21333 }
21334
21335 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
21336 {
21337 int l;
21338 int r;
21339
21340 for (l = 0, r = arr_len - 1; l < r; l++)
21341 {
21342 MANGLE_SWITCH (arr, l, r);
21343 }
21344
21345 return (arr_len);
21346 }
21347
21348 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
21349 {
21350 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21351
21352 arr[arr_len] = c;
21353
21354 return (arr_len + 1);
21355 }
21356
21357 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
21358 {
21359 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21360
21361 int arr_pos;
21362
21363 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21364 {
21365 arr[arr_pos + 1] = arr[arr_pos];
21366 }
21367
21368 arr[0] = c;
21369
21370 return (arr_len + 1);
21371 }
21372
21373 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21374 {
21375 if (upos >= arr_len) return (arr_len);
21376
21377 int arr_pos;
21378
21379 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
21380 {
21381 arr[arr_pos] = arr[arr_pos + 1];
21382 }
21383
21384 return (arr_len - 1);
21385 }
21386
21387 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21388 {
21389 if (upos >= arr_len) return (arr_len);
21390
21391 if ((upos + ulen) > arr_len) return (arr_len);
21392
21393 int arr_pos;
21394
21395 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
21396 {
21397 arr[arr_pos] = arr[upos + arr_pos];
21398 }
21399
21400 return (ulen);
21401 }
21402
21403 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21404 {
21405 if (upos >= arr_len) return (arr_len);
21406
21407 if ((upos + ulen) >= arr_len) return (arr_len);
21408
21409 int arr_pos;
21410
21411 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
21412 {
21413 arr[arr_pos] = arr[arr_pos + ulen];
21414 }
21415
21416 return (arr_len - ulen);
21417 }
21418
21419 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21420 {
21421 if (upos >= arr_len) return (arr_len);
21422
21423 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21424
21425 int arr_pos;
21426
21427 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
21428 {
21429 arr[arr_pos + 1] = arr[arr_pos];
21430 }
21431
21432 arr[upos] = c;
21433
21434 return (arr_len + 1);
21435 }
21436
21437 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)
21438 {
21439 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21440
21441 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
21442
21443 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
21444
21445 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
21446
21447 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
21448
21449 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
21450
21451 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
21452
21453 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
21454
21455 return (arr_len + arr2_cpy);
21456 }
21457
21458 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21459 {
21460 if (upos >= arr_len) return (arr_len);
21461
21462 arr[upos] = c;
21463
21464 return (arr_len);
21465 }
21466
21467 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21468 {
21469 if (upos >= arr_len) return (arr_len);
21470
21471 memset (arr + upos, 0, arr_len - upos);
21472
21473 return (upos);
21474 }
21475
21476 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
21477 {
21478 int arr_pos;
21479
21480 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
21481 {
21482 if (arr[arr_pos] != oldc) continue;
21483
21484 arr[arr_pos] = newc;
21485 }
21486
21487 return (arr_len);
21488 }
21489
21490 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
21491 {
21492 int arr_pos;
21493
21494 int ret_len;
21495
21496 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
21497 {
21498 if (arr[arr_pos] == c) continue;
21499
21500 arr[ret_len] = arr[arr_pos];
21501
21502 ret_len++;
21503 }
21504
21505 return (ret_len);
21506 }
21507
21508 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
21509 {
21510 if (ulen > arr_len) return (arr_len);
21511
21512 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21513
21514 char cs[100] = { 0 };
21515
21516 memcpy (cs, arr, ulen);
21517
21518 int i;
21519
21520 for (i = 0; i < ulen; i++)
21521 {
21522 char c = cs[i];
21523
21524 arr_len = mangle_insert (arr, arr_len, i, c);
21525 }
21526
21527 return (arr_len);
21528 }
21529
21530 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
21531 {
21532 if (ulen > arr_len) return (arr_len);
21533
21534 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21535
21536 int upos = arr_len - ulen;
21537
21538 int i;
21539
21540 for (i = 0; i < ulen; i++)
21541 {
21542 char c = arr[upos + i];
21543
21544 arr_len = mangle_append (arr, arr_len, c);
21545 }
21546
21547 return (arr_len);
21548 }
21549
21550 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21551 {
21552 if ( arr_len == 0) return (arr_len);
21553 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21554
21555 char c = arr[upos];
21556
21557 int i;
21558
21559 for (i = 0; i < ulen; i++)
21560 {
21561 arr_len = mangle_insert (arr, arr_len, upos, c);
21562 }
21563
21564 return (arr_len);
21565 }
21566
21567 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
21568 {
21569 if ( arr_len == 0) return (arr_len);
21570 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
21571
21572 int arr_pos;
21573
21574 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21575 {
21576 int new_pos = arr_pos * 2;
21577
21578 arr[new_pos] = arr[arr_pos];
21579
21580 arr[new_pos + 1] = arr[arr_pos];
21581 }
21582
21583 return (arr_len * 2);
21584 }
21585
21586 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21587 {
21588 if (upos >= arr_len) return (arr_len);
21589 if (upos2 >= arr_len) return (arr_len);
21590
21591 MANGLE_SWITCH (arr, upos, upos2);
21592
21593 return (arr_len);
21594 }
21595
21596 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21597 {
21598 MANGLE_SWITCH (arr, upos, upos2);
21599
21600 return (arr_len);
21601 }
21602
21603 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
21604 {
21605 if (upos >= arr_len) return (arr_len);
21606
21607 arr[upos] <<= 1;
21608
21609 return (arr_len);
21610 }
21611
21612 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
21613 {
21614 if (upos >= arr_len) return (arr_len);
21615
21616 arr[upos] >>= 1;
21617
21618 return (arr_len);
21619 }
21620
21621 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
21622 {
21623 if (upos >= arr_len) return (arr_len);
21624
21625 arr[upos] += 1;
21626
21627 return (arr_len);
21628 }
21629
21630 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
21631 {
21632 if (upos >= arr_len) return (arr_len);
21633
21634 arr[upos] -= 1;
21635
21636 return (arr_len);
21637 }
21638
21639 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
21640 {
21641 int upper_next = 1;
21642
21643 int pos;
21644
21645 for (pos = 0; pos < arr_len; pos++)
21646 {
21647 if (arr[pos] == ' ')
21648 {
21649 upper_next = 1;
21650
21651 continue;
21652 }
21653
21654 if (upper_next)
21655 {
21656 upper_next = 0;
21657
21658 MANGLE_UPPER_AT (arr, pos);
21659 }
21660 else
21661 {
21662 MANGLE_LOWER_AT (arr, pos);
21663 }
21664 }
21665
21666 return (arr_len);
21667 }
21668
21669 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
21670 {
21671 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
21672
21673 u32 j;
21674
21675 u32 rule_pos = 0;
21676
21677 for (j = 0; j < rp_gen_num; j++)
21678 {
21679 u32 r = 0;
21680 u32 p1 = 0;
21681 u32 p2 = 0;
21682 u32 p3 = 0;
21683
21684 switch ((char) get_random_num (0, 9))
21685 {
21686 case 0:
21687 r = get_random_num (0, sizeof (grp_op_nop));
21688 rule_buf[rule_pos++] = grp_op_nop[r];
21689 break;
21690
21691 case 1:
21692 r = get_random_num (0, sizeof (grp_op_pos_p0));
21693 rule_buf[rule_pos++] = grp_op_pos_p0[r];
21694 p1 = get_random_num (0, sizeof (grp_pos));
21695 rule_buf[rule_pos++] = grp_pos[p1];
21696 break;
21697
21698 case 2:
21699 r = get_random_num (0, sizeof (grp_op_pos_p1));
21700 rule_buf[rule_pos++] = grp_op_pos_p1[r];
21701 p1 = get_random_num (1, 6);
21702 rule_buf[rule_pos++] = grp_pos[p1];
21703 break;
21704
21705 case 3:
21706 r = get_random_num (0, sizeof (grp_op_chr));
21707 rule_buf[rule_pos++] = grp_op_chr[r];
21708 p1 = get_random_num (0x20, 0x7e);
21709 rule_buf[rule_pos++] = (char) p1;
21710 break;
21711
21712 case 4:
21713 r = get_random_num (0, sizeof (grp_op_chr_chr));
21714 rule_buf[rule_pos++] = grp_op_chr_chr[r];
21715 p1 = get_random_num (0x20, 0x7e);
21716 rule_buf[rule_pos++] = (char) p1;
21717 p2 = get_random_num (0x20, 0x7e);
21718 while (p1 == p2)
21719 p2 = get_random_num (0x20, 0x7e);
21720 rule_buf[rule_pos++] = (char) p2;
21721 break;
21722
21723 case 5:
21724 r = get_random_num (0, sizeof (grp_op_pos_chr));
21725 rule_buf[rule_pos++] = grp_op_pos_chr[r];
21726 p1 = get_random_num (0, sizeof (grp_pos));
21727 rule_buf[rule_pos++] = grp_pos[p1];
21728 p2 = get_random_num (0x20, 0x7e);
21729 rule_buf[rule_pos++] = (char) p2;
21730 break;
21731
21732 case 6:
21733 r = get_random_num (0, sizeof (grp_op_pos_pos0));
21734 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
21735 p1 = get_random_num (0, sizeof (grp_pos));
21736 rule_buf[rule_pos++] = grp_pos[p1];
21737 p2 = get_random_num (0, sizeof (grp_pos));
21738 while (p1 == p2)
21739 p2 = get_random_num (0, sizeof (grp_pos));
21740 rule_buf[rule_pos++] = grp_pos[p2];
21741 break;
21742
21743 case 7:
21744 r = get_random_num (0, sizeof (grp_op_pos_pos1));
21745 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
21746 p1 = get_random_num (0, sizeof (grp_pos));
21747 rule_buf[rule_pos++] = grp_pos[p1];
21748 p2 = get_random_num (1, sizeof (grp_pos));
21749 while (p1 == p2)
21750 p2 = get_random_num (1, sizeof (grp_pos));
21751 rule_buf[rule_pos++] = grp_pos[p2];
21752 break;
21753
21754 case 8:
21755 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
21756 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
21757 p1 = get_random_num (0, sizeof (grp_pos));
21758 rule_buf[rule_pos++] = grp_pos[p1];
21759 p2 = get_random_num (1, sizeof (grp_pos));
21760 rule_buf[rule_pos++] = grp_pos[p1];
21761 p3 = get_random_num (0, sizeof (grp_pos));
21762 rule_buf[rule_pos++] = grp_pos[p3];
21763 break;
21764 }
21765 }
21766
21767 return (rule_pos);
21768 }
21769
21770 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
21771 {
21772 char mem[BLOCK_SIZE] = { 0 };
21773
21774 if (in == NULL) return (RULE_RC_REJECT_ERROR);
21775
21776 if (out == NULL) return (RULE_RC_REJECT_ERROR);
21777
21778 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21779
21780 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
21781
21782 int out_len = in_len;
21783 int mem_len = in_len;
21784
21785 memcpy (out, in, out_len);
21786
21787 int rule_pos;
21788
21789 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
21790 {
21791 int upos, upos2;
21792 int ulen;
21793
21794 switch (rule[rule_pos])
21795 {
21796 case ' ':
21797 break;
21798
21799 case RULE_OP_MANGLE_NOOP:
21800 break;
21801
21802 case RULE_OP_MANGLE_LREST:
21803 out_len = mangle_lrest (out, out_len);
21804 break;
21805
21806 case RULE_OP_MANGLE_UREST:
21807 out_len = mangle_urest (out, out_len);
21808 break;
21809
21810 case RULE_OP_MANGLE_LREST_UFIRST:
21811 out_len = mangle_lrest (out, out_len);
21812 if (out_len) MANGLE_UPPER_AT (out, 0);
21813 break;
21814
21815 case RULE_OP_MANGLE_UREST_LFIRST:
21816 out_len = mangle_urest (out, out_len);
21817 if (out_len) MANGLE_LOWER_AT (out, 0);
21818 break;
21819
21820 case RULE_OP_MANGLE_TREST:
21821 out_len = mangle_trest (out, out_len);
21822 break;
21823
21824 case RULE_OP_MANGLE_TOGGLE_AT:
21825 NEXT_RULEPOS (rule_pos);
21826 NEXT_RPTOI (rule, rule_pos, upos);
21827 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
21828 break;
21829
21830 case RULE_OP_MANGLE_REVERSE:
21831 out_len = mangle_reverse (out, out_len);
21832 break;
21833
21834 case RULE_OP_MANGLE_DUPEWORD:
21835 out_len = mangle_double (out, out_len);
21836 break;
21837
21838 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21839 NEXT_RULEPOS (rule_pos);
21840 NEXT_RPTOI (rule, rule_pos, ulen);
21841 out_len = mangle_double_times (out, out_len, ulen);
21842 break;
21843
21844 case RULE_OP_MANGLE_REFLECT:
21845 out_len = mangle_reflect (out, out_len);
21846 break;
21847
21848 case RULE_OP_MANGLE_ROTATE_LEFT:
21849 mangle_rotate_left (out, out_len);
21850 break;
21851
21852 case RULE_OP_MANGLE_ROTATE_RIGHT:
21853 mangle_rotate_right (out, out_len);
21854 break;
21855
21856 case RULE_OP_MANGLE_APPEND:
21857 NEXT_RULEPOS (rule_pos);
21858 out_len = mangle_append (out, out_len, rule[rule_pos]);
21859 break;
21860
21861 case RULE_OP_MANGLE_PREPEND:
21862 NEXT_RULEPOS (rule_pos);
21863 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
21864 break;
21865
21866 case RULE_OP_MANGLE_DELETE_FIRST:
21867 out_len = mangle_delete_at (out, out_len, 0);
21868 break;
21869
21870 case RULE_OP_MANGLE_DELETE_LAST:
21871 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
21872 break;
21873
21874 case RULE_OP_MANGLE_DELETE_AT:
21875 NEXT_RULEPOS (rule_pos);
21876 NEXT_RPTOI (rule, rule_pos, upos);
21877 out_len = mangle_delete_at (out, out_len, upos);
21878 break;
21879
21880 case RULE_OP_MANGLE_EXTRACT:
21881 NEXT_RULEPOS (rule_pos);
21882 NEXT_RPTOI (rule, rule_pos, upos);
21883 NEXT_RULEPOS (rule_pos);
21884 NEXT_RPTOI (rule, rule_pos, ulen);
21885 out_len = mangle_extract (out, out_len, upos, ulen);
21886 break;
21887
21888 case RULE_OP_MANGLE_OMIT:
21889 NEXT_RULEPOS (rule_pos);
21890 NEXT_RPTOI (rule, rule_pos, upos);
21891 NEXT_RULEPOS (rule_pos);
21892 NEXT_RPTOI (rule, rule_pos, ulen);
21893 out_len = mangle_omit (out, out_len, upos, ulen);
21894 break;
21895
21896 case RULE_OP_MANGLE_INSERT:
21897 NEXT_RULEPOS (rule_pos);
21898 NEXT_RPTOI (rule, rule_pos, upos);
21899 NEXT_RULEPOS (rule_pos);
21900 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
21901 break;
21902
21903 case RULE_OP_MANGLE_OVERSTRIKE:
21904 NEXT_RULEPOS (rule_pos);
21905 NEXT_RPTOI (rule, rule_pos, upos);
21906 NEXT_RULEPOS (rule_pos);
21907 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
21908 break;
21909
21910 case RULE_OP_MANGLE_TRUNCATE_AT:
21911 NEXT_RULEPOS (rule_pos);
21912 NEXT_RPTOI (rule, rule_pos, upos);
21913 out_len = mangle_truncate_at (out, out_len, upos);
21914 break;
21915
21916 case RULE_OP_MANGLE_REPLACE:
21917 NEXT_RULEPOS (rule_pos);
21918 NEXT_RULEPOS (rule_pos);
21919 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
21920 break;
21921
21922 case RULE_OP_MANGLE_PURGECHAR:
21923 NEXT_RULEPOS (rule_pos);
21924 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
21925 break;
21926
21927 case RULE_OP_MANGLE_TOGGLECASE_REC:
21928 /* todo */
21929 break;
21930
21931 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21932 NEXT_RULEPOS (rule_pos);
21933 NEXT_RPTOI (rule, rule_pos, ulen);
21934 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
21935 break;
21936
21937 case RULE_OP_MANGLE_DUPECHAR_LAST:
21938 NEXT_RULEPOS (rule_pos);
21939 NEXT_RPTOI (rule, rule_pos, ulen);
21940 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
21941 break;
21942
21943 case RULE_OP_MANGLE_DUPECHAR_ALL:
21944 out_len = mangle_dupechar (out, out_len);
21945 break;
21946
21947 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21948 NEXT_RULEPOS (rule_pos);
21949 NEXT_RPTOI (rule, rule_pos, ulen);
21950 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
21951 break;
21952
21953 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21954 NEXT_RULEPOS (rule_pos);
21955 NEXT_RPTOI (rule, rule_pos, ulen);
21956 out_len = mangle_dupeblock_append (out, out_len, ulen);
21957 break;
21958
21959 case RULE_OP_MANGLE_SWITCH_FIRST:
21960 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
21961 break;
21962
21963 case RULE_OP_MANGLE_SWITCH_LAST:
21964 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
21965 break;
21966
21967 case RULE_OP_MANGLE_SWITCH_AT:
21968 NEXT_RULEPOS (rule_pos);
21969 NEXT_RPTOI (rule, rule_pos, upos);
21970 NEXT_RULEPOS (rule_pos);
21971 NEXT_RPTOI (rule, rule_pos, upos2);
21972 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
21973 break;
21974
21975 case RULE_OP_MANGLE_CHR_SHIFTL:
21976 NEXT_RULEPOS (rule_pos);
21977 NEXT_RPTOI (rule, rule_pos, upos);
21978 mangle_chr_shiftl (out, out_len, upos);
21979 break;
21980
21981 case RULE_OP_MANGLE_CHR_SHIFTR:
21982 NEXT_RULEPOS (rule_pos);
21983 NEXT_RPTOI (rule, rule_pos, upos);
21984 mangle_chr_shiftr (out, out_len, upos);
21985 break;
21986
21987 case RULE_OP_MANGLE_CHR_INCR:
21988 NEXT_RULEPOS (rule_pos);
21989 NEXT_RPTOI (rule, rule_pos, upos);
21990 mangle_chr_incr (out, out_len, upos);
21991 break;
21992
21993 case RULE_OP_MANGLE_CHR_DECR:
21994 NEXT_RULEPOS (rule_pos);
21995 NEXT_RPTOI (rule, rule_pos, upos);
21996 mangle_chr_decr (out, out_len, upos);
21997 break;
21998
21999 case RULE_OP_MANGLE_REPLACE_NP1:
22000 NEXT_RULEPOS (rule_pos);
22001 NEXT_RPTOI (rule, rule_pos, upos);
22002 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
22003 break;
22004
22005 case RULE_OP_MANGLE_REPLACE_NM1:
22006 NEXT_RULEPOS (rule_pos);
22007 NEXT_RPTOI (rule, rule_pos, upos);
22008 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
22009 break;
22010
22011 case RULE_OP_MANGLE_TITLE:
22012 out_len = mangle_title (out, out_len);
22013 break;
22014
22015 case RULE_OP_MANGLE_EXTRACT_MEMORY:
22016 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22017 NEXT_RULEPOS (rule_pos);
22018 NEXT_RPTOI (rule, rule_pos, upos);
22019 NEXT_RULEPOS (rule_pos);
22020 NEXT_RPTOI (rule, rule_pos, ulen);
22021 NEXT_RULEPOS (rule_pos);
22022 NEXT_RPTOI (rule, rule_pos, upos2);
22023 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
22024 break;
22025
22026 case RULE_OP_MANGLE_APPEND_MEMORY:
22027 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22028 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22029 memcpy (out + out_len, mem, mem_len);
22030 out_len += mem_len;
22031 break;
22032
22033 case RULE_OP_MANGLE_PREPEND_MEMORY:
22034 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
22035 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
22036 memcpy (mem + mem_len, out, out_len);
22037 out_len += mem_len;
22038 memcpy (out, mem, out_len);
22039 break;
22040
22041 case RULE_OP_MEMORIZE_WORD:
22042 memcpy (mem, out, out_len);
22043 mem_len = out_len;
22044 break;
22045
22046 case RULE_OP_REJECT_LESS:
22047 NEXT_RULEPOS (rule_pos);
22048 NEXT_RPTOI (rule, rule_pos, upos);
22049 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
22050 break;
22051
22052 case RULE_OP_REJECT_GREATER:
22053 NEXT_RULEPOS (rule_pos);
22054 NEXT_RPTOI (rule, rule_pos, upos);
22055 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
22056 break;
22057
22058 case RULE_OP_REJECT_CONTAIN:
22059 NEXT_RULEPOS (rule_pos);
22060 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
22061 break;
22062
22063 case RULE_OP_REJECT_NOT_CONTAIN:
22064 NEXT_RULEPOS (rule_pos);
22065 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
22066 break;
22067
22068 case RULE_OP_REJECT_EQUAL_FIRST:
22069 NEXT_RULEPOS (rule_pos);
22070 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22071 break;
22072
22073 case RULE_OP_REJECT_EQUAL_LAST:
22074 NEXT_RULEPOS (rule_pos);
22075 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22076 break;
22077
22078 case RULE_OP_REJECT_EQUAL_AT:
22079 NEXT_RULEPOS (rule_pos);
22080 NEXT_RPTOI (rule, rule_pos, upos);
22081 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22082 NEXT_RULEPOS (rule_pos);
22083 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22084 break;
22085
22086 case RULE_OP_REJECT_CONTAINS:
22087 NEXT_RULEPOS (rule_pos);
22088 NEXT_RPTOI (rule, rule_pos, upos);
22089 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22090 NEXT_RULEPOS (rule_pos);
22091 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
22092 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
22093 break;
22094
22095 case RULE_OP_REJECT_MEMORY:
22096 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
22097 break;
22098
22099 default:
22100 return (RULE_RC_SYNTAX_ERROR);
22101 break;
22102 }
22103 }
22104
22105 memset (out + out_len, 0, BLOCK_SIZE - out_len);
22106
22107 return (out_len);
22108 }