Added current engine clock and current memory clock to the status display (ADL only...
[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 #if defined(_WIN) && defined(HAVE_NVAPI)
2675 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2676 {
2677 NvU32 pGpuCount;
2678
2679 if (hm_NvAPI_EnumPhysicalGPUs (data.hm_nv, nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2680
2681 if (pGpuCount == 0)
2682 {
2683 log_info ("WARN: No NvAPI adapters found");
2684
2685 return (0);
2686 }
2687
2688 return (pGpuCount);
2689 }
2690 #endif // _WIN && HAVE_NVAPI
2691
2692 #if defined(LINUX) && defined(HAVE_NVML)
2693 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2694 {
2695 int pGpuCount = 0;
2696
2697 for (uint i = 0; i < DEVICES_MAX; i++)
2698 {
2699 if (hm_NVML_nvmlDeviceGetHandleByIndex (data.hm_nv, 1, i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2700
2701 // can be used to determine if the device by index matches the cuda device by index
2702 // char name[100]; memset (name, 0, sizeof (name));
2703 // hm_NVML_nvmlDeviceGetName (data.hm_nv, nvGPUHandle[i], name, sizeof (name) - 1);
2704
2705 pGpuCount++;
2706 }
2707
2708 if (pGpuCount == 0)
2709 {
2710 log_info ("WARN: No NVML adapters found");
2711
2712 return (0);
2713 }
2714
2715 return (pGpuCount);
2716 }
2717 #endif // LINUX && HAVE_NVML
2718
2719 #ifdef HAVE_ADL
2720 int get_adapters_num_amd (void *adl, int *iNumberAdapters)
2721 {
2722 if (hm_ADL_Adapter_NumberOfAdapters_Get ((ADL_PTR *) adl, iNumberAdapters) != ADL_OK) return -1;
2723
2724 if (iNumberAdapters == 0)
2725 {
2726 log_info ("WARN: No ADL adapters found.");
2727
2728 return -1;
2729 }
2730
2731 return 0;
2732 }
2733
2734 /*
2735 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2736 {
2737 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2738 ADLODParameters lpOdParameters;
2739
2740 lpOdParameters.iSize = sizeof (ADLODParameters);
2741 size_t plevels_size = 0;
2742
2743 if (hm_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2744
2745 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2746 __func__, iAdapterIndex,
2747 lpOdParameters.iNumberOfPerformanceLevels,
2748 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2749 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2750
2751 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2752
2753 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2754
2755 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2756
2757 if (hm_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2758
2759 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2760 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2761 __func__, iAdapterIndex, j,
2762 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2763
2764 myfree (lpOdPerformanceLevels);
2765
2766 return 0;
2767 }
2768 */
2769
2770 LPAdapterInfo hm_get_adapter_info_amd (void *adl, int iNumberAdapters)
2771 {
2772 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2773
2774 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2775
2776 if (hm_ADL_Adapter_AdapterInfo_Get ((ADL_PTR *) adl, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2777
2778 return lpAdapterInfo;
2779 }
2780
2781 /*
2782 //
2783 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2784 //
2785
2786 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2787 {
2788 u32 idx = -1;
2789
2790 for (uint i = 0; i < num_adl_adapters; i++)
2791 {
2792 int opencl_bus_num = hm_device[i].busid;
2793 int opencl_dev_num = hm_device[i].devid;
2794
2795 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2796 {
2797 idx = i;
2798
2799 break;
2800 }
2801 }
2802
2803 if (idx >= DEVICES_MAX) return -1;
2804
2805 return idx;
2806 }
2807
2808 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2809 {
2810 for (uint i = 0; i < opencl_num_devices; i++)
2811 {
2812 cl_device_topology_amd device_topology;
2813
2814 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2815
2816 hm_device[i].busid = device_topology.pcie.bus;
2817 hm_device[i].devid = device_topology.pcie.device;
2818 }
2819 }
2820 */
2821
2822 void hm_sort_adl_adapters_by_busid_devid (u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2823 {
2824 // basically bubble sort
2825
2826 for (int i = 0; i < num_adl_adapters; i++)
2827 {
2828 for (int j = 0; j < num_adl_adapters - 1; j++)
2829 {
2830 // get info of adapter [x]
2831
2832 u32 adapter_index_x = valid_adl_device_list[j];
2833 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2834
2835 u32 bus_num_x = info_x.iBusNumber;
2836 u32 dev_num_x = info_x.iDeviceNumber;
2837
2838 // get info of adapter [y]
2839
2840 u32 adapter_index_y = valid_adl_device_list[j + 1];
2841 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2842
2843 u32 bus_num_y = info_y.iBusNumber;
2844 u32 dev_num_y = info_y.iDeviceNumber;
2845
2846 uint need_swap = 0;
2847
2848 if (bus_num_y < bus_num_x)
2849 {
2850 need_swap = 1;
2851 }
2852 else if (bus_num_y == bus_num_x)
2853 {
2854 if (dev_num_y < dev_num_x)
2855 {
2856 need_swap = 1;
2857 }
2858 }
2859
2860 if (need_swap == 1)
2861 {
2862 u32 temp = valid_adl_device_list[j + 1];
2863
2864 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2865 valid_adl_device_list[j + 0] = temp;
2866 }
2867 }
2868 }
2869 }
2870
2871 u32 *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2872 {
2873 *num_adl_adapters = 0;
2874
2875 u32 *adl_adapters = NULL;
2876
2877 int *bus_numbers = NULL;
2878 int *device_numbers = NULL;
2879
2880 for (int i = 0; i < iNumberAdapters; i++)
2881 {
2882 AdapterInfo info = lpAdapterInfo[i];
2883
2884 if (strlen (info.strUDID) < 1) continue;
2885
2886 #ifdef WIN
2887 if (info.iVendorID != 1002) continue;
2888 #else
2889 if (info.iVendorID != 0x1002) continue;
2890 #endif
2891
2892 if (info.iBusNumber < 0) continue;
2893 if (info.iDeviceNumber < 0) continue;
2894
2895 int found = 0;
2896
2897 for (int pos = 0; pos < *num_adl_adapters; pos++)
2898 {
2899 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2900 {
2901 found = 1;
2902 break;
2903 }
2904 }
2905
2906 if (found) continue;
2907
2908 // add it to the list
2909
2910 adl_adapters = (u32 *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2911
2912 adl_adapters[*num_adl_adapters] = i;
2913
2914 // rest is just bookkeeping
2915
2916 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2917 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2918
2919 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2920 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2921
2922 (*num_adl_adapters)++;
2923 }
2924
2925 myfree (bus_numbers);
2926 myfree (device_numbers);
2927
2928 // sort the list by increasing bus id, device id number
2929
2930 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2931
2932 return adl_adapters;
2933 }
2934
2935 int hm_check_fanspeed_control (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2936 {
2937 // loop through all valid devices
2938
2939 for (int i = 0; i < num_adl_adapters; i++)
2940 {
2941 u32 adapter_index = valid_adl_device_list[i];
2942
2943 // get AdapterInfo
2944
2945 AdapterInfo info = lpAdapterInfo[adapter_index];
2946
2947 // unfortunately this doesn't work since bus id and dev id are not unique
2948 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2949 // if (opencl_device_index == -1) continue;
2950
2951 int opencl_device_index = i;
2952
2953 // if (hm_show_performance_level (adl, info.iAdapterIndex) != 0) return -1;
2954
2955 // get fanspeed info
2956
2957 if (hm_device[opencl_device_index].od_version == 5)
2958 {
2959 ADLFanSpeedInfo FanSpeedInfo;
2960
2961 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2962
2963 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2964
2965 if (hm_ADL_Overdrive5_FanSpeedInfo_Get (adl, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2966
2967 // check read and write capability in fanspeedinfo
2968
2969 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2970 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2971 {
2972 hm_device[opencl_device_index].fan_supported = 1;
2973 }
2974 else
2975 {
2976 hm_device[opencl_device_index].fan_supported = 0;
2977 }
2978 }
2979 else // od_version == 6
2980 {
2981 ADLOD6FanSpeedInfo faninfo;
2982
2983 memset (&faninfo, 0, sizeof (faninfo));
2984
2985 if (hm_ADL_Overdrive6_FanSpeed_Get (adl, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2986
2987 // check read capability in fanspeedinfo
2988
2989 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
2990 {
2991 hm_device[opencl_device_index].fan_supported = 1;
2992 }
2993 else
2994 {
2995 hm_device[opencl_device_index].fan_supported = 0;
2996 }
2997 }
2998 }
2999
3000 return 0;
3001 }
3002
3003 int hm_get_overdrive_version (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3004 {
3005 for (int i = 0; i < num_adl_adapters; i++)
3006 {
3007 u32 adapter_index = valid_adl_device_list[i];
3008
3009 // get AdapterInfo
3010
3011 AdapterInfo info = lpAdapterInfo[adapter_index];
3012
3013 // get overdrive version
3014
3015 int od_supported = 0;
3016 int od_enabled = 0;
3017 int od_version = 0;
3018
3019 if (hm_ADL_Overdrive_Caps (adl, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3020
3021 // store the overdrive version in hm_device
3022
3023 // unfortunately this doesn't work since bus id and dev id are not unique
3024 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3025 // if (opencl_device_index == -1) continue;
3026
3027 int opencl_device_index = i;
3028
3029 hm_device[opencl_device_index].od_version = od_version;
3030 }
3031
3032 return 0;
3033 }
3034
3035 int hm_get_adapter_index_amd (hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3036 {
3037 for (int i = 0; i < num_adl_adapters; i++)
3038 {
3039 u32 adapter_index = valid_adl_device_list[i];
3040
3041 // get AdapterInfo
3042
3043 AdapterInfo info = lpAdapterInfo[adapter_index];
3044
3045 // store the iAdapterIndex in hm_device
3046
3047 // unfortunately this doesn't work since bus id and dev id are not unique
3048 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3049 // if (opencl_device_index == -1) continue;
3050
3051 int opencl_device_index = i;
3052
3053 hm_device[opencl_device_index].adapter_index.amd = info.iAdapterIndex;
3054 }
3055
3056 return num_adl_adapters;
3057 }
3058 #endif // HAVE_ADL
3059
3060 int hm_get_temperature_with_device_id (const uint device_id)
3061 {
3062 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3063
3064 #ifdef HAVE_ADL
3065 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3066 {
3067 if (data.hm_amd)
3068 {
3069 if (data.hm_device[device_id].od_version == 5)
3070 {
3071 ADLTemperature Temperature;
3072
3073 Temperature.iSize = sizeof (ADLTemperature);
3074
3075 if (hm_ADL_Overdrive5_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &Temperature) != ADL_OK) return -1;
3076
3077 return Temperature.iTemperature / 1000;
3078 }
3079 else if (data.hm_device[device_id].od_version == 6)
3080 {
3081 int Temperature = 0;
3082
3083 if (hm_ADL_Overdrive6_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3084
3085 return Temperature / 1000;
3086 }
3087 }
3088 }
3089 #endif
3090
3091 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3092 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3093 {
3094 #if defined(LINUX) && defined(HAVE_NVML)
3095 int temperature = 0;
3096
3097 hm_NVML_nvmlDeviceGetTemperature (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (uint *) &temperature);
3098
3099 return temperature;
3100 #endif
3101
3102 #if defined(WIN) && defined(HAVE_NVAPI)
3103 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3104
3105 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3106 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3107 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3108 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3109
3110 if (hm_NvAPI_GPU_GetThermalSettings (data.hm_nv, data.hm_device[device_id].adapter_index.nv, 0, &pThermalSettings) != NVAPI_OK) return -1;
3111
3112 return pThermalSettings.sensor[0].currentTemp;
3113 #endif // WIN && HAVE_NVAPI
3114 }
3115 #endif // HAVE_NVML || HAVE_NVAPI
3116
3117 return -1;
3118 }
3119
3120 int hm_get_fanspeed_with_device_id (const uint device_id)
3121 {
3122 // we shouldn't really need this extra CL_DEVICE_TYPE_GPU check, because fan_supported should not be set w/ CPUs
3123 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3124
3125 if (data.hm_device[device_id].fan_supported == 1)
3126 {
3127 #ifdef HAVE_ADL
3128 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3129 {
3130 if (data.hm_amd)
3131 {
3132 if (data.hm_device[device_id].od_version == 5)
3133 {
3134 ADLFanSpeedValue lpFanSpeedValue;
3135
3136 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3137
3138 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3139 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3140 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3141
3142 if (hm_ADL_Overdrive5_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3143
3144 return lpFanSpeedValue.iFanSpeed;
3145 }
3146 else // od_version == 6
3147 {
3148 ADLOD6FanSpeedInfo faninfo;
3149
3150 memset (&faninfo, 0, sizeof (faninfo));
3151
3152 if (hm_ADL_Overdrive6_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3153
3154 return faninfo.iFanSpeedPercent;
3155 }
3156 }
3157 }
3158 #endif // HAVE_ADL
3159
3160 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3161 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3162 {
3163 #if defined(LINUX) && defined(HAVE_NVML)
3164 int speed = 0;
3165
3166 hm_NVML_nvmlDeviceGetFanSpeed (data.hm_nv, 1, data.hm_device[device_id].adapter_index.nv, (uint *) &speed);
3167
3168 return speed;
3169 #endif
3170
3171 #if defined(WIN) && defined(HAVE_NVAPI)
3172
3173 NV_GPU_COOLER_SETTINGS pCoolerSettings;
3174
3175 pCoolerSettings.Version = GPU_COOLER_SETTINGS_VER | sizeof (NV_GPU_COOLER_SETTINGS);
3176
3177 hm_NvAPI_GPU_GetCoolerSettings (data.hm_nv, data.hm_device[device_id].adapter_index.nv, 0, &pCoolerSettings);
3178
3179 return pCoolerSettings.Cooler[0].CurrentLevel;
3180 #endif
3181 }
3182 #endif // HAVE_NVML || HAVE_NVAPI
3183 }
3184
3185 return -1;
3186 }
3187
3188 int hm_get_utilization_with_device_id (const uint device_id)
3189 {
3190 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3191
3192 #ifdef HAVE_ADL
3193 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3194 {
3195 if (data.hm_amd)
3196 {
3197 ADLPMActivity PMActivity;
3198
3199 PMActivity.iSize = sizeof (ADLPMActivity);
3200
3201 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3202
3203 return PMActivity.iActivityPercent;
3204 }
3205 }
3206 #endif // HAVE_ADL
3207
3208 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3209 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_NV)
3210 {
3211 #if defined(LINUX) && defined(HAVE_NVML)
3212 nvmlUtilization_t utilization;
3213
3214 hm_NVML_nvmlDeviceGetUtilizationRates (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &utilization);
3215
3216 return utilization.gpu;
3217 #endif
3218
3219 #if defined(WIN) && defined(HAVE_NVAPI)
3220 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3221
3222 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3223
3224 if (hm_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3225
3226 return pDynamicPstatesInfoEx.utilization[0].percentage;
3227 #endif
3228 }
3229 #endif // HAVE_NVML || HAVE_NVAPI
3230
3231 return -1;
3232 }
3233
3234 int hm_get_memoryspeed_with_device_id (const uint device_id)
3235 {
3236 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3237
3238 #ifdef HAVE_ADL
3239 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3240 {
3241 if (data.hm_amd)
3242 {
3243 ADLPMActivity PMActivity;
3244
3245 PMActivity.iSize = sizeof (ADLPMActivity);
3246
3247 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3248
3249 return PMActivity.iMemoryClock / 100;
3250 }
3251 }
3252 #endif // HAVE_ADL
3253
3254 return -1;
3255 }
3256
3257 int hm_get_corespeed_with_device_id (const uint device_id)
3258 {
3259 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3260
3261 #ifdef HAVE_ADL
3262 if (data.devices_param[device_id].device_vendor_id == VENDOR_ID_AMD)
3263 {
3264 if (data.hm_amd)
3265 {
3266 ADLPMActivity PMActivity;
3267
3268 PMActivity.iSize = sizeof (ADLPMActivity);
3269
3270 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3271
3272 return PMActivity.iEngineClock / 100;
3273 }
3274 }
3275 #endif // HAVE_ADL
3276
3277 return -1;
3278 }
3279
3280 #ifdef HAVE_ADL
3281 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3282 {
3283 if (data.hm_device[device_id].fan_supported == 1)
3284 {
3285 if (data.hm_amd)
3286 {
3287 if (data.hm_device[device_id].od_version == 5)
3288 {
3289 ADLFanSpeedValue lpFanSpeedValue;
3290
3291 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3292
3293 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3294 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3295 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3296 lpFanSpeedValue.iFanSpeed = fanspeed;
3297
3298 if (hm_ADL_Overdrive5_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3299
3300 return 0;
3301 }
3302 else // od_version == 6
3303 {
3304 ADLOD6FanSpeedValue fan_speed_value;
3305
3306 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3307
3308 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3309 fan_speed_value.iFanSpeed = fanspeed;
3310
3311 if (hm_ADL_Overdrive6_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3312
3313 return 0;
3314 }
3315 }
3316 }
3317
3318 return -1;
3319 }
3320 #endif
3321
3322 // helper function for status display
3323
3324 void hm_device_val_to_str (char *target_buf, int max_buf_size, char *suffix, int value)
3325 {
3326 #define VALUE_NOT_AVAILABLE "N/A"
3327
3328 if (value == -1)
3329 {
3330 snprintf (target_buf, max_buf_size, VALUE_NOT_AVAILABLE);
3331 }
3332 else
3333 {
3334 snprintf (target_buf, max_buf_size, "%2d%s", value, suffix);
3335 }
3336 }
3337 #endif // HAVE_HWMON
3338
3339 /**
3340 * maskprocessor
3341 */
3342
3343 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3344 {
3345 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3346
3347 if (css_cnt > SP_PW_MAX)
3348 {
3349 log_error ("ERROR: mask length is too long");
3350
3351 exit (-1);
3352 }
3353
3354 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3355 {
3356 uint *uniq_tbl = uniq_tbls[css_pos];
3357
3358 uint *cs_buf = css[css_pos].cs_buf;
3359 uint cs_len = css[css_pos].cs_len;
3360
3361 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3362 {
3363 uint c = cs_buf[cs_pos] & 0xff;
3364
3365 uniq_tbl[c] = 1;
3366 }
3367 }
3368 }
3369
3370 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3371 {
3372 cs_t *cs = &css[css_cnt];
3373
3374 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3375
3376 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3377
3378 size_t i;
3379
3380 for (i = 0; i < cs->cs_len; i++)
3381 {
3382 const uint u = cs->cs_buf[i];
3383
3384 css_uniq[u] = 1;
3385 }
3386
3387 for (i = 0; i < in_len; i++)
3388 {
3389 uint u = in_buf[i] & 0xff;
3390
3391 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3392
3393 if (css_uniq[u] == 1) continue;
3394
3395 css_uniq[u] = 1;
3396
3397 cs->cs_buf[cs->cs_len] = u;
3398
3399 cs->cs_len++;
3400 }
3401
3402 myfree (css_uniq);
3403 }
3404
3405 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3406 {
3407 size_t in_pos;
3408
3409 for (in_pos = 0; in_pos < in_len; in_pos++)
3410 {
3411 uint p0 = in_buf[in_pos] & 0xff;
3412
3413 if (interpret == 1 && p0 == '?')
3414 {
3415 in_pos++;
3416
3417 if (in_pos == in_len) break;
3418
3419 uint p1 = in_buf[in_pos] & 0xff;
3420
3421 switch (p1)
3422 {
3423 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3424 break;
3425 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3426 break;
3427 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3428 break;
3429 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3430 break;
3431 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3432 break;
3433 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3434 break;
3435 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3436 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3437 break;
3438 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3439 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3440 break;
3441 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3442 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3443 break;
3444 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3445 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3446 break;
3447 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3448 break;
3449 default: log_error ("Syntax error: %s", in_buf);
3450 exit (-1);
3451 }
3452 }
3453 else
3454 {
3455 if (data.hex_charset)
3456 {
3457 in_pos++;
3458
3459 if (in_pos == in_len)
3460 {
3461 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3462
3463 exit (-1);
3464 }
3465
3466 uint p1 = in_buf[in_pos] & 0xff;
3467
3468 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3469 {
3470 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3471
3472 exit (-1);
3473 }
3474
3475 uint chr = 0;
3476
3477 chr = hex_convert (p1) << 0;
3478 chr |= hex_convert (p0) << 4;
3479
3480 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3481 }
3482 else
3483 {
3484 uint chr = p0;
3485
3486 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3487 }
3488 }
3489 }
3490 }
3491
3492 u64 mp_get_sum (uint css_cnt, cs_t *css)
3493 {
3494 u64 sum = 1;
3495
3496 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3497 {
3498 sum *= css[css_pos].cs_len;
3499 }
3500
3501 return (sum);
3502 }
3503
3504 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3505 {
3506 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3507
3508 uint mask_pos;
3509 uint css_pos;
3510
3511 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3512 {
3513 char p0 = mask_buf[mask_pos];
3514
3515 if (p0 == '?')
3516 {
3517 mask_pos++;
3518
3519 if (mask_pos == mask_len) break;
3520
3521 char p1 = mask_buf[mask_pos];
3522
3523 uint chr = p1;
3524
3525 switch (p1)
3526 {
3527 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3528 break;
3529 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3530 break;
3531 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3532 break;
3533 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3534 break;
3535 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3536 break;
3537 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3538 break;
3539 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3540 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3541 break;
3542 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3543 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3544 break;
3545 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3546 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3547 break;
3548 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3549 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3550 break;
3551 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3552 break;
3553 default: log_error ("ERROR: syntax error: %s", mask_buf);
3554 exit (-1);
3555 }
3556 }
3557 else
3558 {
3559 if (data.hex_charset)
3560 {
3561 mask_pos++;
3562
3563 // if there is no 2nd hex character, show an error:
3564
3565 if (mask_pos == mask_len)
3566 {
3567 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3568
3569 exit (-1);
3570 }
3571
3572 char p1 = mask_buf[mask_pos];
3573
3574 // if they are not valid hex character, show an error:
3575
3576 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3577 {
3578 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3579
3580 exit (-1);
3581 }
3582
3583 uint chr = 0;
3584
3585 chr |= hex_convert (p1) << 0;
3586 chr |= hex_convert (p0) << 4;
3587
3588 mp_add_cs_buf (&chr, 1, css, css_pos);
3589 }
3590 else
3591 {
3592 uint chr = p0;
3593
3594 mp_add_cs_buf (&chr, 1, css, css_pos);
3595 }
3596 }
3597 }
3598
3599 if (css_pos == 0)
3600 {
3601 log_error ("ERROR: invalid mask length (0)");
3602
3603 exit (-1);
3604 }
3605
3606 *css_cnt = css_pos;
3607
3608 return (css);
3609 }
3610
3611 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3612 {
3613 for (int i = 0; i < css_cnt; i++)
3614 {
3615 uint len = css[i].cs_len;
3616 u64 next = val / len;
3617 uint pos = val % len;
3618 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3619 val = next;
3620 }
3621 }
3622
3623 void mp_cut_at (char *mask, uint max)
3624 {
3625 uint i;
3626 uint j;
3627 uint mask_len = strlen (mask);
3628
3629 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3630 {
3631 if (mask[i] == '?') i++;
3632 }
3633
3634 mask[i] = 0;
3635 }
3636
3637 void mp_setup_sys (cs_t *mp_sys)
3638 {
3639 uint pos;
3640 uint chr;
3641 uint donec[CHARSIZ] = { 0 };
3642
3643 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3644 mp_sys[0].cs_buf[pos++] = chr;
3645 mp_sys[0].cs_len = pos; }
3646
3647 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3648 mp_sys[1].cs_buf[pos++] = chr;
3649 mp_sys[1].cs_len = pos; }
3650
3651 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3652 mp_sys[2].cs_buf[pos++] = chr;
3653 mp_sys[2].cs_len = pos; }
3654
3655 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3656 mp_sys[3].cs_buf[pos++] = chr;
3657 mp_sys[3].cs_len = pos; }
3658
3659 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3660 mp_sys[4].cs_len = pos; }
3661
3662 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3663 mp_sys[5].cs_len = pos; }
3664 }
3665
3666 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3667 {
3668 FILE *fp = fopen (buf, "rb");
3669
3670 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3671 {
3672 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3673 }
3674 else
3675 {
3676 char mp_file[1024] = { 0 };
3677
3678 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3679
3680 fclose (fp);
3681
3682 len = in_superchop (mp_file);
3683
3684 if (len == 0)
3685 {
3686 log_info ("WARNING: charset file corrupted");
3687
3688 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3689 }
3690 else
3691 {
3692 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3693 }
3694 }
3695 }
3696
3697 void mp_reset_usr (cs_t *mp_usr, uint index)
3698 {
3699 mp_usr[index].cs_len = 0;
3700
3701 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3702 }
3703
3704 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3705 {
3706 char *new_mask_buf = (char *) mymalloc (256);
3707
3708 uint mask_pos;
3709
3710 uint css_pos;
3711
3712 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3713 {
3714 if (css_pos == len) break;
3715
3716 char p0 = mask_buf[mask_pos];
3717
3718 new_mask_buf[mask_pos] = p0;
3719
3720 if (p0 == '?')
3721 {
3722 mask_pos++;
3723
3724 if (mask_pos == mask_len) break;
3725
3726 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3727 }
3728 else
3729 {
3730 if (data.hex_charset)
3731 {
3732 mask_pos++;
3733
3734 if (mask_pos == mask_len)
3735 {
3736 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3737
3738 exit (-1);
3739 }
3740
3741 char p1 = mask_buf[mask_pos];
3742
3743 // if they are not valid hex character, show an error:
3744
3745 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3746 {
3747 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3748
3749 exit (-1);
3750 }
3751
3752 new_mask_buf[mask_pos] = p1;
3753 }
3754 }
3755 }
3756
3757 if (css_pos == len) return (new_mask_buf);
3758
3759 myfree (new_mask_buf);
3760
3761 return (NULL);
3762 }
3763
3764 /**
3765 * statprocessor
3766 */
3767
3768 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3769 {
3770 u64 sum = 1;
3771
3772 uint i;
3773
3774 for (i = start; i < stop; i++)
3775 {
3776 sum *= root_css_buf[i].cs_len;
3777 }
3778
3779 return (sum);
3780 }
3781
3782 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3783 {
3784 u64 v = ctx;
3785
3786 cs_t *cs = &root_css_buf[start];
3787
3788 uint i;
3789
3790 for (i = start; i < stop; i++)
3791 {
3792 const u64 m = v % cs->cs_len;
3793 const u64 d = v / cs->cs_len;
3794
3795 v = d;
3796
3797 const uint k = cs->cs_buf[m];
3798
3799 pw_buf[i - start] = (char) k;
3800
3801 cs = &markov_css_buf[(i * CHARSIZ) + k];
3802 }
3803 }
3804
3805 int sp_comp_val (const void *p1, const void *p2)
3806 {
3807 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3808 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3809
3810 return b2->val - b1->val;
3811 }
3812
3813 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)
3814 {
3815 uint i;
3816 uint j;
3817 uint k;
3818
3819 /**
3820 * Initialize hcstats
3821 */
3822
3823 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3824
3825 u64 *root_stats_ptr = root_stats_buf;
3826
3827 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3828
3829 for (i = 0; i < SP_PW_MAX; i++)
3830 {
3831 root_stats_buf_by_pos[i] = root_stats_ptr;
3832
3833 root_stats_ptr += CHARSIZ;
3834 }
3835
3836 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3837
3838 u64 *markov_stats_ptr = markov_stats_buf;
3839
3840 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3841
3842 for (i = 0; i < SP_PW_MAX; i++)
3843 {
3844 for (j = 0; j < CHARSIZ; j++)
3845 {
3846 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3847
3848 markov_stats_ptr += CHARSIZ;
3849 }
3850 }
3851
3852 /**
3853 * Load hcstats File
3854 */
3855
3856 if (hcstat == NULL)
3857 {
3858 char hcstat_tmp[256] = { 0 };
3859
3860 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3861
3862 hcstat = hcstat_tmp;
3863 }
3864
3865 FILE *fd = fopen (hcstat, "rb");
3866
3867 if (fd == NULL)
3868 {
3869 log_error ("%s: %s", hcstat, strerror (errno));
3870
3871 exit (-1);
3872 }
3873
3874 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3875 {
3876 log_error ("%s: Could not load data", hcstat);
3877
3878 fclose (fd);
3879
3880 exit (-1);
3881 }
3882
3883 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3884 {
3885 log_error ("%s: Could not load data", hcstat);
3886
3887 fclose (fd);
3888
3889 exit (-1);
3890 }
3891
3892 fclose (fd);
3893
3894 /**
3895 * Markov modifier of hcstat_table on user request
3896 */
3897
3898 if (disable)
3899 {
3900 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
3901 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
3902 }
3903
3904 if (classic)
3905 {
3906 /* Add all stats to first position */
3907
3908 for (i = 1; i < SP_PW_MAX; i++)
3909 {
3910 u64 *out = root_stats_buf_by_pos[0];
3911 u64 *in = root_stats_buf_by_pos[i];
3912
3913 for (j = 0; j < CHARSIZ; j++)
3914 {
3915 *out++ += *in++;
3916 }
3917 }
3918
3919 for (i = 1; i < SP_PW_MAX; i++)
3920 {
3921 u64 *out = markov_stats_buf_by_key[0][0];
3922 u64 *in = markov_stats_buf_by_key[i][0];
3923
3924 for (j = 0; j < CHARSIZ; j++)
3925 {
3926 for (k = 0; k < CHARSIZ; k++)
3927 {
3928 *out++ += *in++;
3929 }
3930 }
3931 }
3932
3933 /* copy them to all pw_positions */
3934
3935 for (i = 1; i < SP_PW_MAX; i++)
3936 {
3937 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
3938 }
3939
3940 for (i = 1; i < SP_PW_MAX; i++)
3941 {
3942 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
3943 }
3944 }
3945
3946 /**
3947 * Initialize tables
3948 */
3949
3950 hcstat_table_t *root_table_ptr = root_table_buf;
3951
3952 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3953
3954 for (i = 0; i < SP_PW_MAX; i++)
3955 {
3956 root_table_buf_by_pos[i] = root_table_ptr;
3957
3958 root_table_ptr += CHARSIZ;
3959 }
3960
3961 hcstat_table_t *markov_table_ptr = markov_table_buf;
3962
3963 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3964
3965 for (i = 0; i < SP_PW_MAX; i++)
3966 {
3967 for (j = 0; j < CHARSIZ; j++)
3968 {
3969 markov_table_buf_by_key[i][j] = markov_table_ptr;
3970
3971 markov_table_ptr += CHARSIZ;
3972 }
3973 }
3974
3975 /**
3976 * Convert hcstat to tables
3977 */
3978
3979 for (i = 0; i < SP_ROOT_CNT; i++)
3980 {
3981 uint key = i % CHARSIZ;
3982
3983 root_table_buf[i].key = key;
3984 root_table_buf[i].val = root_stats_buf[i];
3985 }
3986
3987 for (i = 0; i < SP_MARKOV_CNT; i++)
3988 {
3989 uint key = i % CHARSIZ;
3990
3991 markov_table_buf[i].key = key;
3992 markov_table_buf[i].val = markov_stats_buf[i];
3993 }
3994
3995 myfree (root_stats_buf);
3996 myfree (markov_stats_buf);
3997
3998 /**
3999 * Finally sort them
4000 */
4001
4002 for (i = 0; i < SP_PW_MAX; i++)
4003 {
4004 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4005 }
4006
4007 for (i = 0; i < SP_PW_MAX; i++)
4008 {
4009 for (j = 0; j < CHARSIZ; j++)
4010 {
4011 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4012 }
4013 }
4014 }
4015
4016 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])
4017 {
4018 /**
4019 * Convert tables to css
4020 */
4021
4022 for (uint i = 0; i < SP_ROOT_CNT; i++)
4023 {
4024 uint pw_pos = i / CHARSIZ;
4025
4026 cs_t *cs = &root_css_buf[pw_pos];
4027
4028 if (cs->cs_len == threshold) continue;
4029
4030 uint key = root_table_buf[i].key;
4031
4032 if (uniq_tbls[pw_pos][key] == 0) continue;
4033
4034 cs->cs_buf[cs->cs_len] = key;
4035
4036 cs->cs_len++;
4037 }
4038
4039 /**
4040 * Convert table to css
4041 */
4042
4043 for (uint i = 0; i < SP_MARKOV_CNT; i++)
4044 {
4045 uint c = i / CHARSIZ;
4046
4047 cs_t *cs = &markov_css_buf[c];
4048
4049 if (cs->cs_len == threshold) continue;
4050
4051 uint pw_pos = c / CHARSIZ;
4052
4053 uint key = markov_table_buf[i].key;
4054
4055 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4056
4057 cs->cs_buf[cs->cs_len] = key;
4058
4059 cs->cs_len++;
4060 }
4061
4062 /*
4063 for (uint i = 0; i < 8; i++)
4064 {
4065 for (uint j = 0x20; j < 0x80; j++)
4066 {
4067 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4068
4069 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4070
4071 for (uint k = 0; k < 10; k++)
4072 {
4073 printf (" %u\n", ptr->cs_buf[k]);
4074 }
4075 }
4076 }
4077 */
4078 }
4079
4080 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4081 {
4082 for (uint i = 0; i < SP_PW_MAX; i += 2)
4083 {
4084 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4085
4086 out += CHARSIZ;
4087 in += CHARSIZ;
4088
4089 out->key = 0;
4090 out->val = 1;
4091
4092 out++;
4093
4094 for (uint j = 1; j < CHARSIZ; j++)
4095 {
4096 out->key = j;
4097 out->val = 0;
4098
4099 out++;
4100 }
4101 }
4102 }
4103
4104 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4105 {
4106 for (uint i = 0; i < SP_PW_MAX; i += 2)
4107 {
4108 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4109
4110 out += CHARSIZ * CHARSIZ;
4111 in += CHARSIZ * CHARSIZ;
4112
4113 for (uint j = 0; j < CHARSIZ; j++)
4114 {
4115 out->key = 0;
4116 out->val = 1;
4117
4118 out++;
4119
4120 for (uint k = 1; k < CHARSIZ; k++)
4121 {
4122 out->key = k;
4123 out->val = 0;
4124
4125 out++;
4126 }
4127 }
4128 }
4129 }
4130
4131 /**
4132 * mixed shared functions
4133 */
4134
4135 void dump_hex (const u8 *s, const int sz)
4136 {
4137 for (int i = 0; i < sz; i++)
4138 {
4139 log_info_nn ("%02x ", s[i]);
4140 }
4141
4142 log_info ("");
4143 }
4144
4145 void usage_mini_print (const char *progname)
4146 {
4147 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4148 }
4149
4150 void usage_big_print (const char *progname)
4151 {
4152 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4153 }
4154
4155 char *get_exec_path ()
4156 {
4157 int exec_path_len = 1024;
4158
4159 char *exec_path = (char *) mymalloc (exec_path_len);
4160
4161 #ifdef LINUX
4162
4163 char tmp[32] = { 0 };
4164
4165 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4166
4167 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4168
4169 #elif WIN
4170
4171 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4172
4173 #elif OSX
4174
4175 uint size = exec_path_len;
4176
4177 if (_NSGetExecutablePath (exec_path, &size) != 0)
4178 {
4179 log_error("! executable path buffer too small\n");
4180
4181 exit (-1);
4182 }
4183
4184 const int len = strlen (exec_path);
4185
4186 #else
4187 #error Your Operating System is not supported or detected
4188 #endif
4189
4190 exec_path[len] = 0;
4191
4192 return exec_path;
4193 }
4194
4195 char *get_install_dir (const char *progname)
4196 {
4197 char *install_dir = mystrdup (progname);
4198 char *last_slash = NULL;
4199
4200 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4201 {
4202 *last_slash = 0;
4203 }
4204 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4205 {
4206 *last_slash = 0;
4207 }
4208 else
4209 {
4210 install_dir[0] = '.';
4211 install_dir[1] = 0;
4212 }
4213
4214 return (install_dir);
4215 }
4216
4217 char *get_profile_dir (const char *homedir)
4218 {
4219 #define DOT_HASHCAT ".hashcat"
4220
4221 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4222
4223 char *profile_dir = (char *) mymalloc (len + 1);
4224
4225 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4226
4227 return profile_dir;
4228 }
4229
4230 char *get_session_dir (const char *profile_dir)
4231 {
4232 #define SESSIONS_FOLDER "sessions"
4233
4234 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4235
4236 char *session_dir = (char *) mymalloc (len + 1);
4237
4238 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4239
4240 return session_dir;
4241 }
4242
4243 uint count_lines (FILE *fd)
4244 {
4245 uint cnt = 0;
4246
4247 char *buf = (char *) mymalloc (HCBUFSIZ + 1);
4248
4249 char prev = '\n';
4250
4251 while (!feof (fd))
4252 {
4253 size_t nread = fread (buf, sizeof (char), HCBUFSIZ, fd);
4254
4255 if (nread < 1) continue;
4256
4257 size_t i;
4258
4259 for (i = 0; i < nread; i++)
4260 {
4261 if (prev == '\n') cnt++;
4262
4263 prev = buf[i];
4264 }
4265 }
4266
4267 myfree (buf);
4268
4269 return cnt;
4270 }
4271
4272 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4273 {
4274 uint crc = ~0;
4275
4276 FILE *fd = fopen (filename, "rb");
4277
4278 if (fd == NULL)
4279 {
4280 log_error ("%s: %s", filename, strerror (errno));
4281
4282 exit (-1);
4283 }
4284
4285 #define MAX_KEY_SIZE (1024 * 1024)
4286
4287 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4288
4289 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4290
4291 fclose (fd);
4292
4293 int kpos = 0;
4294
4295 for (int fpos = 0; fpos < nread; fpos++)
4296 {
4297 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4298
4299 keytab[kpos++] += (crc >> 24) & 0xff;
4300 keytab[kpos++] += (crc >> 16) & 0xff;
4301 keytab[kpos++] += (crc >> 8) & 0xff;
4302 keytab[kpos++] += (crc >> 0) & 0xff;
4303
4304 if (kpos >= 64) kpos = 0;
4305 }
4306
4307 myfree (buf);
4308 }
4309
4310 #ifdef OSX
4311 int pthread_setaffinity_np (pthread_t thread, size_t cpu_size, cpu_set_t *cpu_set)
4312 {
4313 int core;
4314
4315 for (core = 0; core < (8 * (int)cpu_size); core++)
4316 if (CPU_ISSET(core, cpu_set)) break;
4317
4318 thread_affinity_policy_data_t policy = { core };
4319
4320 const int rc = thread_policy_set (pthread_mach_thread_np (thread), THREAD_AFFINITY_POLICY, (thread_policy_t) &policy, 1);
4321
4322 if (data.quiet == 0)
4323 {
4324 if (rc != KERN_SUCCESS)
4325 {
4326 log_error ("ERROR: %s : %d", "thread_policy_set()", rc);
4327 }
4328 }
4329
4330 return rc;
4331 }
4332 #endif
4333
4334 void set_cpu_affinity (char *cpu_affinity)
4335 {
4336 #ifdef WIN
4337 DWORD_PTR aff_mask = 0;
4338 #elif _POSIX
4339 cpu_set_t cpuset;
4340 CPU_ZERO (&cpuset);
4341 #endif
4342
4343 if (cpu_affinity)
4344 {
4345 char *devices = strdup (cpu_affinity);
4346
4347 char *next = strtok (devices, ",");
4348
4349 do
4350 {
4351 uint cpu_id = atoi (next);
4352
4353 if (cpu_id == 0)
4354 {
4355 #ifdef WIN
4356 aff_mask = 0;
4357 #elif _POSIX
4358 CPU_ZERO (&cpuset);
4359 #endif
4360
4361 break;
4362 }
4363
4364 if (cpu_id > 32)
4365 {
4366 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4367
4368 exit (-1);
4369 }
4370
4371 #ifdef WIN
4372 aff_mask |= 1 << (cpu_id - 1);
4373 #elif _POSIX
4374 CPU_SET ((cpu_id - 1), &cpuset);
4375 #endif
4376
4377 } while ((next = strtok (NULL, ",")) != NULL);
4378
4379 free (devices);
4380 }
4381
4382 #ifdef WIN
4383 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4384 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4385 #elif _POSIX
4386 pthread_t thread = pthread_self ();
4387 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4388 #endif
4389 }
4390
4391 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4392 {
4393 char *element, *end;
4394
4395 end = (char *) base + nmemb * size;
4396
4397 for (element = (char *) base; element < end; element += size)
4398 if (!compar (element, key))
4399 return element;
4400
4401 return NULL;
4402 }
4403
4404 int sort_by_u32 (const void *v1, const void *v2)
4405 {
4406 const u32 *s1 = (const u32 *) v1;
4407 const u32 *s2 = (const u32 *) v2;
4408
4409 return *s1 - *s2;
4410 }
4411
4412 int sort_by_salt (const void *v1, const void *v2)
4413 {
4414 const salt_t *s1 = (const salt_t *) v1;
4415 const salt_t *s2 = (const salt_t *) v2;
4416
4417 const int res1 = s1->salt_len - s2->salt_len;
4418
4419 if (res1 != 0) return (res1);
4420
4421 const int res2 = s1->salt_iter - s2->salt_iter;
4422
4423 if (res2 != 0) return (res2);
4424
4425 uint n;
4426
4427 n = 16;
4428
4429 while (n--)
4430 {
4431 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4432 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4433 }
4434
4435 n = 8;
4436
4437 while (n--)
4438 {
4439 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4440 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4441 }
4442
4443 return (0);
4444 }
4445
4446 int sort_by_salt_buf (const void *v1, const void *v2)
4447 {
4448 const pot_t *p1 = (const pot_t *) v1;
4449 const pot_t *p2 = (const pot_t *) v2;
4450
4451 const hash_t *h1 = &p1->hash;
4452 const hash_t *h2 = &p2->hash;
4453
4454 const salt_t *s1 = h1->salt;
4455 const salt_t *s2 = h2->salt;
4456
4457 uint n = 16;
4458
4459 while (n--)
4460 {
4461 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4462 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4463 }
4464
4465 return 0;
4466 }
4467
4468 int sort_by_hash_t_salt (const void *v1, const void *v2)
4469 {
4470 const hash_t *h1 = (const hash_t *) v1;
4471 const hash_t *h2 = (const hash_t *) v2;
4472
4473 const salt_t *s1 = h1->salt;
4474 const salt_t *s2 = h2->salt;
4475
4476 // testphase: this should work
4477 uint n = 16;
4478
4479 while (n--)
4480 {
4481 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4482 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4483 }
4484
4485 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4486 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4487 if (s1->salt_len > s2->salt_len) return ( 1);
4488 if (s1->salt_len < s2->salt_len) return (-1);
4489
4490 uint n = s1->salt_len;
4491
4492 while (n--)
4493 {
4494 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4495 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4496 }
4497 */
4498
4499 return 0;
4500 }
4501
4502 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4503 {
4504 const hash_t *h1 = (const hash_t *) v1;
4505 const hash_t *h2 = (const hash_t *) v2;
4506
4507 const salt_t *s1 = h1->salt;
4508 const salt_t *s2 = h2->salt;
4509
4510 // 16 - 2 (since last 2 uints contain the digest)
4511 uint n = 14;
4512
4513 while (n--)
4514 {
4515 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4516 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4517 }
4518
4519 return 0;
4520 }
4521
4522 int sort_by_hash_no_salt (const void *v1, const void *v2)
4523 {
4524 const hash_t *h1 = (const hash_t *) v1;
4525 const hash_t *h2 = (const hash_t *) v2;
4526
4527 const void *d1 = h1->digest;
4528 const void *d2 = h2->digest;
4529
4530 return data.sort_by_digest (d1, d2);
4531 }
4532
4533 int sort_by_hash (const void *v1, const void *v2)
4534 {
4535 const hash_t *h1 = (const hash_t *) v1;
4536 const hash_t *h2 = (const hash_t *) v2;
4537
4538 if (data.isSalted)
4539 {
4540 const salt_t *s1 = h1->salt;
4541 const salt_t *s2 = h2->salt;
4542
4543 int res = sort_by_salt (s1, s2);
4544
4545 if (res != 0) return (res);
4546 }
4547
4548 const void *d1 = h1->digest;
4549 const void *d2 = h2->digest;
4550
4551 return data.sort_by_digest (d1, d2);
4552 }
4553
4554 int sort_by_pot (const void *v1, const void *v2)
4555 {
4556 const pot_t *p1 = (const pot_t *) v1;
4557 const pot_t *p2 = (const pot_t *) v2;
4558
4559 const hash_t *h1 = &p1->hash;
4560 const hash_t *h2 = &p2->hash;
4561
4562 return sort_by_hash (h1, h2);
4563 }
4564
4565 int sort_by_mtime (const void *p1, const void *p2)
4566 {
4567 const char **f1 = (const char **) p1;
4568 const char **f2 = (const char **) p2;
4569
4570 struct stat s1; stat (*f1, &s1);
4571 struct stat s2; stat (*f2, &s2);
4572
4573 return s2.st_mtime - s1.st_mtime;
4574 }
4575
4576 int sort_by_cpu_rule (const void *p1, const void *p2)
4577 {
4578 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4579 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4580
4581 return memcmp (r1, r2, sizeof (cpu_rule_t));
4582 }
4583
4584 int sort_by_kernel_rule (const void *p1, const void *p2)
4585 {
4586 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4587 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4588
4589 return memcmp (r1, r2, sizeof (kernel_rule_t));
4590 }
4591
4592 int sort_by_stringptr (const void *p1, const void *p2)
4593 {
4594 const char **s1 = (const char **) p1;
4595 const char **s2 = (const char **) p2;
4596
4597 return strcmp (*s1, *s2);
4598 }
4599
4600 int sort_by_dictstat (const void *s1, const void *s2)
4601 {
4602 dictstat_t *d1 = (dictstat_t *) s1;
4603 dictstat_t *d2 = (dictstat_t *) s2;
4604
4605 #ifdef LINUX
4606 d2->stat.st_atim = d1->stat.st_atim;
4607 #else
4608 d2->stat.st_atime = d1->stat.st_atime;
4609 #endif
4610
4611 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4612 }
4613
4614 int sort_by_bitmap (const void *p1, const void *p2)
4615 {
4616 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4617 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4618
4619 return b1->collisions - b2->collisions;
4620 }
4621
4622 int sort_by_digest_4_2 (const void *v1, const void *v2)
4623 {
4624 const u32 *d1 = (const u32 *) v1;
4625 const u32 *d2 = (const u32 *) v2;
4626
4627 uint n = 2;
4628
4629 while (n--)
4630 {
4631 if (d1[n] > d2[n]) return ( 1);
4632 if (d1[n] < d2[n]) return (-1);
4633 }
4634
4635 return (0);
4636 }
4637
4638 int sort_by_digest_4_4 (const void *v1, const void *v2)
4639 {
4640 const u32 *d1 = (const u32 *) v1;
4641 const u32 *d2 = (const u32 *) v2;
4642
4643 uint n = 4;
4644
4645 while (n--)
4646 {
4647 if (d1[n] > d2[n]) return ( 1);
4648 if (d1[n] < d2[n]) return (-1);
4649 }
4650
4651 return (0);
4652 }
4653
4654 int sort_by_digest_4_5 (const void *v1, const void *v2)
4655 {
4656 const u32 *d1 = (const u32 *) v1;
4657 const u32 *d2 = (const u32 *) v2;
4658
4659 uint n = 5;
4660
4661 while (n--)
4662 {
4663 if (d1[n] > d2[n]) return ( 1);
4664 if (d1[n] < d2[n]) return (-1);
4665 }
4666
4667 return (0);
4668 }
4669
4670 int sort_by_digest_4_6 (const void *v1, const void *v2)
4671 {
4672 const u32 *d1 = (const u32 *) v1;
4673 const u32 *d2 = (const u32 *) v2;
4674
4675 uint n = 6;
4676
4677 while (n--)
4678 {
4679 if (d1[n] > d2[n]) return ( 1);
4680 if (d1[n] < d2[n]) return (-1);
4681 }
4682
4683 return (0);
4684 }
4685
4686 int sort_by_digest_4_8 (const void *v1, const void *v2)
4687 {
4688 const u32 *d1 = (const u32 *) v1;
4689 const u32 *d2 = (const u32 *) v2;
4690
4691 uint n = 8;
4692
4693 while (n--)
4694 {
4695 if (d1[n] > d2[n]) return ( 1);
4696 if (d1[n] < d2[n]) return (-1);
4697 }
4698
4699 return (0);
4700 }
4701
4702 int sort_by_digest_4_16 (const void *v1, const void *v2)
4703 {
4704 const u32 *d1 = (const u32 *) v1;
4705 const u32 *d2 = (const u32 *) v2;
4706
4707 uint n = 16;
4708
4709 while (n--)
4710 {
4711 if (d1[n] > d2[n]) return ( 1);
4712 if (d1[n] < d2[n]) return (-1);
4713 }
4714
4715 return (0);
4716 }
4717
4718 int sort_by_digest_4_32 (const void *v1, const void *v2)
4719 {
4720 const u32 *d1 = (const u32 *) v1;
4721 const u32 *d2 = (const u32 *) v2;
4722
4723 uint n = 32;
4724
4725 while (n--)
4726 {
4727 if (d1[n] > d2[n]) return ( 1);
4728 if (d1[n] < d2[n]) return (-1);
4729 }
4730
4731 return (0);
4732 }
4733
4734 int sort_by_digest_4_64 (const void *v1, const void *v2)
4735 {
4736 const u32 *d1 = (const u32 *) v1;
4737 const u32 *d2 = (const u32 *) v2;
4738
4739 uint n = 64;
4740
4741 while (n--)
4742 {
4743 if (d1[n] > d2[n]) return ( 1);
4744 if (d1[n] < d2[n]) return (-1);
4745 }
4746
4747 return (0);
4748 }
4749
4750 int sort_by_digest_8_8 (const void *v1, const void *v2)
4751 {
4752 const u64 *d1 = (const u64 *) v1;
4753 const u64 *d2 = (const u64 *) v2;
4754
4755 uint n = 8;
4756
4757 while (n--)
4758 {
4759 if (d1[n] > d2[n]) return ( 1);
4760 if (d1[n] < d2[n]) return (-1);
4761 }
4762
4763 return (0);
4764 }
4765
4766 int sort_by_digest_8_16 (const void *v1, const void *v2)
4767 {
4768 const u64 *d1 = (const u64 *) v1;
4769 const u64 *d2 = (const u64 *) v2;
4770
4771 uint n = 16;
4772
4773 while (n--)
4774 {
4775 if (d1[n] > d2[n]) return ( 1);
4776 if (d1[n] < d2[n]) return (-1);
4777 }
4778
4779 return (0);
4780 }
4781
4782 int sort_by_digest_8_25 (const void *v1, const void *v2)
4783 {
4784 const u64 *d1 = (const u64 *) v1;
4785 const u64 *d2 = (const u64 *) v2;
4786
4787 uint n = 25;
4788
4789 while (n--)
4790 {
4791 if (d1[n] > d2[n]) return ( 1);
4792 if (d1[n] < d2[n]) return (-1);
4793 }
4794
4795 return (0);
4796 }
4797
4798 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4799 {
4800 const u32 *d1 = (const u32 *) v1;
4801 const u32 *d2 = (const u32 *) v2;
4802
4803 const uint dgst_pos0 = data.dgst_pos0;
4804 const uint dgst_pos1 = data.dgst_pos1;
4805 const uint dgst_pos2 = data.dgst_pos2;
4806 const uint dgst_pos3 = data.dgst_pos3;
4807
4808 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4809 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4810 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4811 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4812 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4813 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4814 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4815 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4816
4817 return (0);
4818 }
4819
4820 int sort_by_tuning_db_alias (const void *v1, const void *v2)
4821 {
4822 const tuning_db_alias_t *t1 = (const tuning_db_alias_t *) v1;
4823 const tuning_db_alias_t *t2 = (const tuning_db_alias_t *) v2;
4824
4825 const int res1 = strcmp (t1->device_name, t2->device_name);
4826
4827 if (res1 != 0) return (res1);
4828
4829 return 0;
4830 }
4831
4832 int sort_by_tuning_db_entry (const void *v1, const void *v2)
4833 {
4834 const tuning_db_entry_t *t1 = (const tuning_db_entry_t *) v1;
4835 const tuning_db_entry_t *t2 = (const tuning_db_entry_t *) v2;
4836
4837 const int res1 = strcmp (t1->device_name, t2->device_name);
4838
4839 if (res1 != 0) return (res1);
4840
4841 const int res2 = t1->attack_mode
4842 - t2->attack_mode;
4843
4844 if (res2 != 0) return (res2);
4845
4846 const int res3 = t1->hash_type
4847 - t2->hash_type;
4848
4849 if (res3 != 0) return (res3);
4850
4851 return 0;
4852 }
4853
4854 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)
4855 {
4856 uint outfile_autohex = data.outfile_autohex;
4857
4858 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4859
4860 FILE *debug_fp = NULL;
4861
4862 if (debug_file != NULL)
4863 {
4864 debug_fp = fopen (debug_file, "ab");
4865
4866 lock_file (debug_fp);
4867 }
4868 else
4869 {
4870 debug_fp = stderr;
4871 }
4872
4873 if (debug_fp == NULL)
4874 {
4875 log_info ("WARNING: Could not open debug-file for writing");
4876 }
4877 else
4878 {
4879 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4880 {
4881 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4882
4883 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4884 }
4885
4886 fwrite (rule_ptr, rule_len, 1, debug_fp);
4887
4888 if (debug_mode == 4)
4889 {
4890 fputc (':', debug_fp);
4891
4892 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4893 }
4894
4895 fputc ('\n', debug_fp);
4896
4897 if (debug_file != NULL) fclose (debug_fp);
4898 }
4899 }
4900
4901 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4902 {
4903 int needs_hexify = 0;
4904
4905 if (outfile_autohex == 1)
4906 {
4907 for (uint i = 0; i < plain_len; i++)
4908 {
4909 if (plain_ptr[i] < 0x20)
4910 {
4911 needs_hexify = 1;
4912
4913 break;
4914 }
4915
4916 if (plain_ptr[i] > 0x7f)
4917 {
4918 needs_hexify = 1;
4919
4920 break;
4921 }
4922 }
4923 }
4924
4925 if (needs_hexify == 1)
4926 {
4927 fprintf (fp, "$HEX[");
4928
4929 for (uint i = 0; i < plain_len; i++)
4930 {
4931 fprintf (fp, "%02x", plain_ptr[i]);
4932 }
4933
4934 fprintf (fp, "]");
4935 }
4936 else
4937 {
4938 fwrite (plain_ptr, plain_len, 1, fp);
4939 }
4940 }
4941
4942 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)
4943 {
4944 uint outfile_format = data.outfile_format;
4945
4946 char separator = data.separator;
4947
4948 if (outfile_format & OUTFILE_FMT_HASH)
4949 {
4950 fprintf (out_fp, "%s", out_buf);
4951
4952 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4953 {
4954 fputc (separator, out_fp);
4955 }
4956 }
4957 else if (data.username)
4958 {
4959 if (username != NULL)
4960 {
4961 for (uint i = 0; i < user_len; i++)
4962 {
4963 fprintf (out_fp, "%c", username[i]);
4964 }
4965
4966 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4967 {
4968 fputc (separator, out_fp);
4969 }
4970 }
4971 }
4972
4973 if (outfile_format & OUTFILE_FMT_PLAIN)
4974 {
4975 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4976
4977 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4978 {
4979 fputc (separator, out_fp);
4980 }
4981 }
4982
4983 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4984 {
4985 for (uint i = 0; i < plain_len; i++)
4986 {
4987 fprintf (out_fp, "%02x", plain_ptr[i]);
4988 }
4989
4990 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4991 {
4992 fputc (separator, out_fp);
4993 }
4994 }
4995
4996 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4997 {
4998 #ifdef _WIN
4999 __mingw_fprintf (out_fp, "%llu", crackpos);
5000 #endif
5001
5002 #ifdef _POSIX
5003 #ifdef __x86_64__
5004 fprintf (out_fp, "%lu", (unsigned long) crackpos);
5005 #else
5006 fprintf (out_fp, "%llu", crackpos);
5007 #endif
5008 #endif
5009 }
5010
5011 fputc ('\n', out_fp);
5012 }
5013
5014 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)
5015 {
5016 pot_t pot_key;
5017
5018 pot_key.hash.salt = hashes_buf->salt;
5019 pot_key.hash.digest = hashes_buf->digest;
5020
5021 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5022
5023 if (pot_ptr)
5024 {
5025 log_info_nn ("");
5026
5027 input_buf[input_len] = 0;
5028
5029 // user
5030 unsigned char *username = NULL;
5031 uint user_len = 0;
5032
5033 if (data.username)
5034 {
5035 user_t *user = hashes_buf->hash_info->user;
5036
5037 if (user)
5038 {
5039 username = (unsigned char *) (user->user_name);
5040
5041 user_len = user->user_len;
5042 }
5043 }
5044
5045 // do output the line
5046 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
5047 }
5048 }
5049
5050 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
5051 #define LM_MASKED_PLAIN "[notfound]"
5052
5053 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)
5054 {
5055 // left
5056
5057 pot_t pot_left_key;
5058
5059 pot_left_key.hash.salt = hash_left->salt;
5060 pot_left_key.hash.digest = hash_left->digest;
5061
5062 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5063
5064 // right
5065
5066 uint weak_hash_found = 0;
5067
5068 pot_t pot_right_key;
5069
5070 pot_right_key.hash.salt = hash_right->salt;
5071 pot_right_key.hash.digest = hash_right->digest;
5072
5073 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5074
5075 if (pot_right_ptr == NULL)
5076 {
5077 // special case, if "weak hash"
5078
5079 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5080 {
5081 weak_hash_found = 1;
5082
5083 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5084
5085 // in theory this is not needed, but we are paranoia:
5086
5087 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5088 pot_right_ptr->plain_len = 0;
5089 }
5090 }
5091
5092 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
5093 {
5094 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
5095
5096 return;
5097 }
5098
5099 // at least one half was found:
5100
5101 log_info_nn ("");
5102
5103 input_buf[input_len] = 0;
5104
5105 // user
5106
5107 unsigned char *username = NULL;
5108 uint user_len = 0;
5109
5110 if (data.username)
5111 {
5112 user_t *user = hash_left->hash_info->user;
5113
5114 if (user)
5115 {
5116 username = (unsigned char *) (user->user_name);
5117
5118 user_len = user->user_len;
5119 }
5120 }
5121
5122 // mask the part which was not found
5123
5124 uint left_part_masked = 0;
5125 uint right_part_masked = 0;
5126
5127 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5128
5129 if (pot_left_ptr == NULL)
5130 {
5131 left_part_masked = 1;
5132
5133 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5134
5135 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5136
5137 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5138 pot_left_ptr->plain_len = mask_plain_len;
5139 }
5140
5141 if (pot_right_ptr == NULL)
5142 {
5143 right_part_masked = 1;
5144
5145 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5146
5147 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5148
5149 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5150 pot_right_ptr->plain_len = mask_plain_len;
5151 }
5152
5153 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5154
5155 pot_t pot_ptr;
5156
5157 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5158
5159 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5160
5161 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5162
5163 // do output the line
5164
5165 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5166
5167 if (weak_hash_found == 1) myfree (pot_right_ptr);
5168
5169 if (left_part_masked == 1) myfree (pot_left_ptr);
5170 if (right_part_masked == 1) myfree (pot_right_ptr);
5171 }
5172
5173 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)
5174 {
5175 pot_t pot_key;
5176
5177 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5178
5179 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5180
5181 if (pot_ptr == NULL)
5182 {
5183 log_info_nn ("");
5184
5185 input_buf[input_len] = 0;
5186
5187 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5188 }
5189 }
5190
5191 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)
5192 {
5193 // left
5194
5195 pot_t pot_left_key;
5196
5197 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5198
5199 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5200
5201 // right
5202
5203 pot_t pot_right_key;
5204
5205 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5206
5207 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5208
5209 uint weak_hash_found = 0;
5210
5211 if (pot_right_ptr == NULL)
5212 {
5213 // special case, if "weak hash"
5214
5215 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5216 {
5217 weak_hash_found = 1;
5218
5219 // we just need that pot_right_ptr is not a NULL pointer
5220
5221 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5222 }
5223 }
5224
5225 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5226 {
5227 if (weak_hash_found == 1) myfree (pot_right_ptr);
5228
5229 return;
5230 }
5231
5232 // ... at least one part was not cracked
5233
5234 log_info_nn ("");
5235
5236 input_buf[input_len] = 0;
5237
5238 // only show the hash part which is still not cracked
5239
5240 uint user_len = input_len - 32;
5241
5242 char *hash_output = (char *) mymalloc (33);
5243
5244 memcpy (hash_output, input_buf, input_len);
5245
5246 if (pot_left_ptr != NULL)
5247 {
5248 // only show right part (because left part was already found)
5249
5250 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5251
5252 hash_output[user_len + 16] = 0;
5253 }
5254
5255 if (pot_right_ptr != NULL)
5256 {
5257 // only show left part (because right part was already found)
5258
5259 memcpy (hash_output + user_len, input_buf + user_len, 16);
5260
5261 hash_output[user_len + 16] = 0;
5262 }
5263
5264 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5265
5266 myfree (hash_output);
5267
5268 if (weak_hash_found == 1) myfree (pot_right_ptr);
5269 }
5270
5271 uint setup_opencl_platforms_filter (char *opencl_platforms)
5272 {
5273 uint opencl_platforms_filter = 0;
5274
5275 if (opencl_platforms)
5276 {
5277 char *platforms = strdup (opencl_platforms);
5278
5279 char *next = strtok (platforms, ",");
5280
5281 do
5282 {
5283 int platform = atoi (next);
5284
5285 if (platform < 1 || platform > 32)
5286 {
5287 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5288
5289 exit (-1);
5290 }
5291
5292 opencl_platforms_filter |= 1 << (platform - 1);
5293
5294 } while ((next = strtok (NULL, ",")) != NULL);
5295
5296 free (platforms);
5297 }
5298 else
5299 {
5300 opencl_platforms_filter = -1;
5301 }
5302
5303 return opencl_platforms_filter;
5304 }
5305
5306 u32 setup_devices_filter (char *opencl_devices)
5307 {
5308 u32 devices_filter = 0;
5309
5310 if (opencl_devices)
5311 {
5312 char *devices = strdup (opencl_devices);
5313
5314 char *next = strtok (devices, ",");
5315
5316 do
5317 {
5318 int device_id = atoi (next);
5319
5320 if (device_id < 1 || device_id > 32)
5321 {
5322 log_error ("ERROR: invalid device_id %u specified", device_id);
5323
5324 exit (-1);
5325 }
5326
5327 devices_filter |= 1 << (device_id - 1);
5328
5329 } while ((next = strtok (NULL, ",")) != NULL);
5330
5331 free (devices);
5332 }
5333 else
5334 {
5335 devices_filter = -1;
5336 }
5337
5338 return devices_filter;
5339 }
5340
5341 cl_device_type setup_device_types_filter (char *opencl_device_types)
5342 {
5343 cl_device_type device_types_filter = 0;
5344
5345 if (opencl_device_types)
5346 {
5347 char *device_types = strdup (opencl_device_types);
5348
5349 char *next = strtok (device_types, ",");
5350
5351 do
5352 {
5353 int device_type = atoi (next);
5354
5355 if (device_type < 1 || device_type > 3)
5356 {
5357 log_error ("ERROR: invalid device_type %u specified", device_type);
5358
5359 exit (-1);
5360 }
5361
5362 device_types_filter |= 1 << device_type;
5363
5364 } while ((next = strtok (NULL, ",")) != NULL);
5365
5366 free (device_types);
5367 }
5368 else
5369 {
5370 // Do not use CPU by default, this often reduces GPU performance because
5371 // the CPU is too busy to handle GPU synchronization
5372
5373 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5374 }
5375
5376 return device_types_filter;
5377 }
5378
5379 u32 get_random_num (const u32 min, const u32 max)
5380 {
5381 if (min == max) return (min);
5382
5383 return ((rand () % (max - min)) + min);
5384 }
5385
5386 u32 mydivc32 (const u32 dividend, const u32 divisor)
5387 {
5388 u32 quotient = dividend / divisor;
5389
5390 if (dividend % divisor) quotient++;
5391
5392 return quotient;
5393 }
5394
5395 u64 mydivc64 (const u64 dividend, const u64 divisor)
5396 {
5397 u64 quotient = dividend / divisor;
5398
5399 if (dividend % divisor) quotient++;
5400
5401 return quotient;
5402 }
5403
5404 void format_timer_display (struct tm *tm, char *buf, size_t len)
5405 {
5406 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5407 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5408
5409 if (tm->tm_year - 70)
5410 {
5411 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5412 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5413
5414 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5415 }
5416 else if (tm->tm_yday)
5417 {
5418 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5419 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5420
5421 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5422 }
5423 else if (tm->tm_hour)
5424 {
5425 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5426 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5427
5428 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5429 }
5430 else if (tm->tm_min)
5431 {
5432 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5433 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5434
5435 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5436 }
5437 else
5438 {
5439 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5440
5441 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5442 }
5443 }
5444
5445 void format_speed_display (float val, char *buf, size_t len)
5446 {
5447 if (val <= 0)
5448 {
5449 buf[0] = '0';
5450 buf[1] = ' ';
5451 buf[2] = 0;
5452
5453 return;
5454 }
5455
5456 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5457
5458 uint level = 0;
5459
5460 while (val > 99999)
5461 {
5462 val /= 1000;
5463
5464 level++;
5465 }
5466
5467 /* generate output */
5468
5469 if (level == 0)
5470 {
5471 snprintf (buf, len - 1, "%.0f ", val);
5472 }
5473 else
5474 {
5475 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5476 }
5477 }
5478
5479 void lowercase (u8 *buf, int len)
5480 {
5481 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5482 }
5483
5484 void uppercase (u8 *buf, int len)
5485 {
5486 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5487 }
5488
5489 int fgetl (FILE *fp, char *line_buf)
5490 {
5491 int line_len = 0;
5492
5493 while (!feof (fp))
5494 {
5495 const int c = fgetc (fp);
5496
5497 if (c == EOF) break;
5498
5499 line_buf[line_len] = (char) c;
5500
5501 line_len++;
5502
5503 if (line_len == HCBUFSIZ) line_len--;
5504
5505 if (c == '\n') break;
5506 }
5507
5508 if (line_len == 0) return 0;
5509
5510 if (line_buf[line_len - 1] == '\n')
5511 {
5512 line_len--;
5513
5514 line_buf[line_len] = 0;
5515 }
5516
5517 if (line_len == 0) return 0;
5518
5519 if (line_buf[line_len - 1] == '\r')
5520 {
5521 line_len--;
5522
5523 line_buf[line_len] = 0;
5524 }
5525
5526 return (line_len);
5527 }
5528
5529 int in_superchop (char *buf)
5530 {
5531 int len = strlen (buf);
5532
5533 while (len)
5534 {
5535 if (buf[len - 1] == '\n')
5536 {
5537 len--;
5538
5539 continue;
5540 }
5541
5542 if (buf[len - 1] == '\r')
5543 {
5544 len--;
5545
5546 continue;
5547 }
5548
5549 break;
5550 }
5551
5552 buf[len] = 0;
5553
5554 return len;
5555 }
5556
5557 char **scan_directory (const char *path)
5558 {
5559 char *tmp_path = mystrdup (path);
5560
5561 size_t tmp_path_len = strlen (tmp_path);
5562
5563 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5564 {
5565 tmp_path[tmp_path_len - 1] = 0;
5566
5567 tmp_path_len = strlen (tmp_path);
5568 }
5569
5570 char **files = NULL;
5571
5572 int num_files = 0;
5573
5574 DIR *d = NULL;
5575
5576 if ((d = opendir (tmp_path)) != NULL)
5577 {
5578 #ifdef OSX
5579 struct dirent e;
5580
5581 for (;;) {
5582 memset (&e, 0, sizeof (e));
5583 struct dirent *de = NULL;
5584
5585 if (readdir_r (d, &e, &de) != 0)
5586 {
5587 log_error ("ERROR: readdir_r() failed");
5588
5589 break;
5590 }
5591
5592 if (de == NULL) break;
5593 #else
5594 struct dirent *de;
5595
5596 while ((de = readdir (d)) != NULL)
5597 {
5598 #endif
5599 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5600
5601 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5602
5603 char *path_file = (char *) mymalloc (path_size + 1);
5604
5605 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5606
5607 path_file[path_size] = 0;
5608
5609 DIR *d_test;
5610
5611 if ((d_test = opendir (path_file)) != NULL)
5612 {
5613 closedir (d_test);
5614
5615 myfree (path_file);
5616 }
5617 else
5618 {
5619 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5620
5621 num_files++;
5622
5623 files[num_files - 1] = path_file;
5624 }
5625 }
5626
5627 closedir (d);
5628 }
5629 else if (errno == ENOTDIR)
5630 {
5631 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5632
5633 num_files++;
5634
5635 files[num_files - 1] = mystrdup (path);
5636 }
5637
5638 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5639
5640 num_files++;
5641
5642 files[num_files - 1] = NULL;
5643
5644 myfree (tmp_path);
5645
5646 return (files);
5647 }
5648
5649 int count_dictionaries (char **dictionary_files)
5650 {
5651 if (dictionary_files == NULL) return 0;
5652
5653 int cnt = 0;
5654
5655 for (int d = 0; dictionary_files[d] != NULL; d++)
5656 {
5657 cnt++;
5658 }
5659
5660 return (cnt);
5661 }
5662
5663 char *stroptitype (const uint opti_type)
5664 {
5665 switch (opti_type)
5666 {
5667 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5668 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5669 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5670 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5671 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5672 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5673 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5674 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5675 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5676 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5677 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5678 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5679 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5680 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5681 case OPTI_TYPE_SLOW_HASH_SIMD: return ((char *) OPTI_STR_SLOW_HASH_SIMD); break;
5682 case OPTI_TYPE_USES_BITS_8: return ((char *) OPTI_STR_USES_BITS_8); break;
5683 case OPTI_TYPE_USES_BITS_16: return ((char *) OPTI_STR_USES_BITS_16); break;
5684 case OPTI_TYPE_USES_BITS_32: return ((char *) OPTI_STR_USES_BITS_32); break;
5685 case OPTI_TYPE_USES_BITS_64: return ((char *) OPTI_STR_USES_BITS_64); break;
5686 }
5687
5688 return (NULL);
5689 }
5690
5691 char *strparser (const uint parser_status)
5692 {
5693 switch (parser_status)
5694 {
5695 case PARSER_OK: return ((char *) PA_000); break;
5696 case PARSER_COMMENT: return ((char *) PA_001); break;
5697 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5698 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5699 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5700 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5701 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5702 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5703 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5704 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5705 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5706 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5707 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5708 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5709 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5710 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5711 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5712 }
5713
5714 return ((char *) PA_255);
5715 }
5716
5717 char *strhashtype (const uint hash_mode)
5718 {
5719 switch (hash_mode)
5720 {
5721 case 0: return ((char *) HT_00000); break;
5722 case 10: return ((char *) HT_00010); break;
5723 case 11: return ((char *) HT_00011); break;
5724 case 12: return ((char *) HT_00012); break;
5725 case 20: return ((char *) HT_00020); break;
5726 case 21: return ((char *) HT_00021); break;
5727 case 22: return ((char *) HT_00022); break;
5728 case 23: return ((char *) HT_00023); break;
5729 case 30: return ((char *) HT_00030); break;
5730 case 40: return ((char *) HT_00040); break;
5731 case 50: return ((char *) HT_00050); break;
5732 case 60: return ((char *) HT_00060); break;
5733 case 100: return ((char *) HT_00100); break;
5734 case 101: return ((char *) HT_00101); break;
5735 case 110: return ((char *) HT_00110); break;
5736 case 111: return ((char *) HT_00111); break;
5737 case 112: return ((char *) HT_00112); break;
5738 case 120: return ((char *) HT_00120); break;
5739 case 121: return ((char *) HT_00121); break;
5740 case 122: return ((char *) HT_00122); break;
5741 case 124: return ((char *) HT_00124); break;
5742 case 125: return ((char *) HT_00125); break;
5743 case 130: return ((char *) HT_00130); break;
5744 case 131: return ((char *) HT_00131); break;
5745 case 132: return ((char *) HT_00132); break;
5746 case 133: return ((char *) HT_00133); break;
5747 case 140: return ((char *) HT_00140); break;
5748 case 141: return ((char *) HT_00141); break;
5749 case 150: return ((char *) HT_00150); break;
5750 case 160: return ((char *) HT_00160); break;
5751 case 190: return ((char *) HT_00190); break;
5752 case 200: return ((char *) HT_00200); break;
5753 case 300: return ((char *) HT_00300); break;
5754 case 400: return ((char *) HT_00400); break;
5755 case 500: return ((char *) HT_00500); break;
5756 case 501: return ((char *) HT_00501); break;
5757 case 900: return ((char *) HT_00900); break;
5758 case 910: return ((char *) HT_00910); break;
5759 case 1000: return ((char *) HT_01000); break;
5760 case 1100: return ((char *) HT_01100); break;
5761 case 1400: return ((char *) HT_01400); break;
5762 case 1410: return ((char *) HT_01410); break;
5763 case 1420: return ((char *) HT_01420); break;
5764 case 1421: return ((char *) HT_01421); break;
5765 case 1430: return ((char *) HT_01430); break;
5766 case 1440: return ((char *) HT_01440); break;
5767 case 1441: return ((char *) HT_01441); break;
5768 case 1450: return ((char *) HT_01450); break;
5769 case 1460: return ((char *) HT_01460); break;
5770 case 1500: return ((char *) HT_01500); break;
5771 case 1600: return ((char *) HT_01600); break;
5772 case 1700: return ((char *) HT_01700); break;
5773 case 1710: return ((char *) HT_01710); break;
5774 case 1711: return ((char *) HT_01711); break;
5775 case 1720: return ((char *) HT_01720); break;
5776 case 1722: return ((char *) HT_01722); break;
5777 case 1730: return ((char *) HT_01730); break;
5778 case 1731: return ((char *) HT_01731); break;
5779 case 1740: return ((char *) HT_01740); break;
5780 case 1750: return ((char *) HT_01750); break;
5781 case 1760: return ((char *) HT_01760); break;
5782 case 1800: return ((char *) HT_01800); break;
5783 case 2100: return ((char *) HT_02100); break;
5784 case 2400: return ((char *) HT_02400); break;
5785 case 2410: return ((char *) HT_02410); break;
5786 case 2500: return ((char *) HT_02500); break;
5787 case 2600: return ((char *) HT_02600); break;
5788 case 2611: return ((char *) HT_02611); break;
5789 case 2612: return ((char *) HT_02612); break;
5790 case 2711: return ((char *) HT_02711); break;
5791 case 2811: return ((char *) HT_02811); break;
5792 case 3000: return ((char *) HT_03000); break;
5793 case 3100: return ((char *) HT_03100); break;
5794 case 3200: return ((char *) HT_03200); break;
5795 case 3710: return ((char *) HT_03710); break;
5796 case 3711: return ((char *) HT_03711); break;
5797 case 3800: return ((char *) HT_03800); break;
5798 case 4300: return ((char *) HT_04300); break;
5799 case 4400: return ((char *) HT_04400); break;
5800 case 4500: return ((char *) HT_04500); break;
5801 case 4700: return ((char *) HT_04700); break;
5802 case 4800: return ((char *) HT_04800); break;
5803 case 4900: return ((char *) HT_04900); break;
5804 case 5000: return ((char *) HT_05000); break;
5805 case 5100: return ((char *) HT_05100); break;
5806 case 5200: return ((char *) HT_05200); break;
5807 case 5300: return ((char *) HT_05300); break;
5808 case 5400: return ((char *) HT_05400); break;
5809 case 5500: return ((char *) HT_05500); break;
5810 case 5600: return ((char *) HT_05600); break;
5811 case 5700: return ((char *) HT_05700); break;
5812 case 5800: return ((char *) HT_05800); break;
5813 case 6000: return ((char *) HT_06000); break;
5814 case 6100: return ((char *) HT_06100); break;
5815 case 6211: return ((char *) HT_06211); break;
5816 case 6212: return ((char *) HT_06212); break;
5817 case 6213: return ((char *) HT_06213); break;
5818 case 6221: return ((char *) HT_06221); break;
5819 case 6222: return ((char *) HT_06222); break;
5820 case 6223: return ((char *) HT_06223); break;
5821 case 6231: return ((char *) HT_06231); break;
5822 case 6232: return ((char *) HT_06232); break;
5823 case 6233: return ((char *) HT_06233); break;
5824 case 6241: return ((char *) HT_06241); break;
5825 case 6242: return ((char *) HT_06242); break;
5826 case 6243: return ((char *) HT_06243); break;
5827 case 6300: return ((char *) HT_06300); break;
5828 case 6400: return ((char *) HT_06400); break;
5829 case 6500: return ((char *) HT_06500); break;
5830 case 6600: return ((char *) HT_06600); break;
5831 case 6700: return ((char *) HT_06700); break;
5832 case 6800: return ((char *) HT_06800); break;
5833 case 6900: return ((char *) HT_06900); break;
5834 case 7100: return ((char *) HT_07100); break;
5835 case 7200: return ((char *) HT_07200); break;
5836 case 7300: return ((char *) HT_07300); break;
5837 case 7400: return ((char *) HT_07400); break;
5838 case 7500: return ((char *) HT_07500); break;
5839 case 7600: return ((char *) HT_07600); break;
5840 case 7700: return ((char *) HT_07700); break;
5841 case 7800: return ((char *) HT_07800); break;
5842 case 7900: return ((char *) HT_07900); break;
5843 case 8000: return ((char *) HT_08000); break;
5844 case 8100: return ((char *) HT_08100); break;
5845 case 8200: return ((char *) HT_08200); break;
5846 case 8300: return ((char *) HT_08300); break;
5847 case 8400: return ((char *) HT_08400); break;
5848 case 8500: return ((char *) HT_08500); break;
5849 case 8600: return ((char *) HT_08600); break;
5850 case 8700: return ((char *) HT_08700); break;
5851 case 8800: return ((char *) HT_08800); break;
5852 case 8900: return ((char *) HT_08900); break;
5853 case 9000: return ((char *) HT_09000); break;
5854 case 9100: return ((char *) HT_09100); break;
5855 case 9200: return ((char *) HT_09200); break;
5856 case 9300: return ((char *) HT_09300); break;
5857 case 9400: return ((char *) HT_09400); break;
5858 case 9500: return ((char *) HT_09500); break;
5859 case 9600: return ((char *) HT_09600); break;
5860 case 9700: return ((char *) HT_09700); break;
5861 case 9710: return ((char *) HT_09710); break;
5862 case 9720: return ((char *) HT_09720); break;
5863 case 9800: return ((char *) HT_09800); break;
5864 case 9810: return ((char *) HT_09810); break;
5865 case 9820: return ((char *) HT_09820); break;
5866 case 9900: return ((char *) HT_09900); break;
5867 case 10000: return ((char *) HT_10000); break;
5868 case 10100: return ((char *) HT_10100); break;
5869 case 10200: return ((char *) HT_10200); break;
5870 case 10300: return ((char *) HT_10300); break;
5871 case 10400: return ((char *) HT_10400); break;
5872 case 10410: return ((char *) HT_10410); break;
5873 case 10420: return ((char *) HT_10420); break;
5874 case 10500: return ((char *) HT_10500); break;
5875 case 10600: return ((char *) HT_10600); break;
5876 case 10700: return ((char *) HT_10700); break;
5877 case 10800: return ((char *) HT_10800); break;
5878 case 10900: return ((char *) HT_10900); break;
5879 case 11000: return ((char *) HT_11000); break;
5880 case 11100: return ((char *) HT_11100); break;
5881 case 11200: return ((char *) HT_11200); break;
5882 case 11300: return ((char *) HT_11300); break;
5883 case 11400: return ((char *) HT_11400); break;
5884 case 11500: return ((char *) HT_11500); break;
5885 case 11600: return ((char *) HT_11600); break;
5886 case 11700: return ((char *) HT_11700); break;
5887 case 11800: return ((char *) HT_11800); break;
5888 case 11900: return ((char *) HT_11900); break;
5889 case 12000: return ((char *) HT_12000); break;
5890 case 12100: return ((char *) HT_12100); break;
5891 case 12200: return ((char *) HT_12200); break;
5892 case 12300: return ((char *) HT_12300); break;
5893 case 12400: return ((char *) HT_12400); break;
5894 case 12500: return ((char *) HT_12500); break;
5895 case 12600: return ((char *) HT_12600); break;
5896 case 12700: return ((char *) HT_12700); break;
5897 case 12800: return ((char *) HT_12800); break;
5898 case 12900: return ((char *) HT_12900); break;
5899 case 13000: return ((char *) HT_13000); break;
5900 case 13100: return ((char *) HT_13100); break;
5901 case 13200: return ((char *) HT_13200); break;
5902 case 13300: return ((char *) HT_13300); break;
5903 case 13400: return ((char *) HT_13400); break;
5904 case 13500: return ((char *) HT_13500); break;
5905 case 13600: return ((char *) HT_13600); break;
5906 case 13711: return ((char *) HT_13711); break;
5907 case 13712: return ((char *) HT_13712); break;
5908 case 13713: return ((char *) HT_13713); break;
5909 case 13721: return ((char *) HT_13721); break;
5910 case 13722: return ((char *) HT_13722); break;
5911 case 13723: return ((char *) HT_13723); break;
5912 case 13731: return ((char *) HT_13731); break;
5913 case 13732: return ((char *) HT_13732); break;
5914 case 13733: return ((char *) HT_13733); break;
5915 case 13741: return ((char *) HT_13741); break;
5916 case 13742: return ((char *) HT_13742); break;
5917 case 13743: return ((char *) HT_13743); break;
5918 case 13751: return ((char *) HT_13751); break;
5919 case 13752: return ((char *) HT_13752); break;
5920 case 13753: return ((char *) HT_13753); break;
5921 case 13761: return ((char *) HT_13761); break;
5922 case 13762: return ((char *) HT_13762); break;
5923 case 13763: return ((char *) HT_13763); break;
5924 }
5925
5926 return ((char *) "Unknown");
5927 }
5928
5929 char *strstatus (const uint devices_status)
5930 {
5931 switch (devices_status)
5932 {
5933 case STATUS_INIT: return ((char *) ST_0000); break;
5934 case STATUS_STARTING: return ((char *) ST_0001); break;
5935 case STATUS_RUNNING: return ((char *) ST_0002); break;
5936 case STATUS_PAUSED: return ((char *) ST_0003); break;
5937 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5938 case STATUS_CRACKED: return ((char *) ST_0005); break;
5939 case STATUS_ABORTED: return ((char *) ST_0006); break;
5940 case STATUS_QUIT: return ((char *) ST_0007); break;
5941 case STATUS_BYPASS: return ((char *) ST_0008); break;
5942 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5943 case STATUS_AUTOTUNE: return ((char *) ST_0010); break;
5944 }
5945
5946 return ((char *) "Unknown");
5947 }
5948
5949 void ascii_digest (char *out_buf, uint salt_pos, uint digest_pos)
5950 {
5951 uint hash_type = data.hash_type;
5952 uint hash_mode = data.hash_mode;
5953 uint salt_type = data.salt_type;
5954 uint opts_type = data.opts_type;
5955 uint opti_type = data.opti_type;
5956 uint dgst_size = data.dgst_size;
5957
5958 char *hashfile = data.hashfile;
5959
5960 uint len = 4096;
5961
5962 uint digest_buf[64] = { 0 };
5963
5964 u64 *digest_buf64 = (u64 *) digest_buf;
5965
5966 char *digests_buf_ptr = (char *) data.digests_buf;
5967
5968 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5969
5970 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5971 {
5972 uint tt;
5973
5974 switch (hash_type)
5975 {
5976 case HASH_TYPE_DESCRYPT:
5977 FP (digest_buf[1], digest_buf[0], tt);
5978 break;
5979
5980 case HASH_TYPE_DESRACF:
5981 digest_buf[0] = rotl32 (digest_buf[0], 29);
5982 digest_buf[1] = rotl32 (digest_buf[1], 29);
5983
5984 FP (digest_buf[1], digest_buf[0], tt);
5985 break;
5986
5987 case HASH_TYPE_LM:
5988 FP (digest_buf[1], digest_buf[0], tt);
5989 break;
5990
5991 case HASH_TYPE_NETNTLM:
5992 digest_buf[0] = rotl32 (digest_buf[0], 29);
5993 digest_buf[1] = rotl32 (digest_buf[1], 29);
5994 digest_buf[2] = rotl32 (digest_buf[2], 29);
5995 digest_buf[3] = rotl32 (digest_buf[3], 29);
5996
5997 FP (digest_buf[1], digest_buf[0], tt);
5998 FP (digest_buf[3], digest_buf[2], tt);
5999 break;
6000
6001 case HASH_TYPE_BSDICRYPT:
6002 digest_buf[0] = rotl32 (digest_buf[0], 31);
6003 digest_buf[1] = rotl32 (digest_buf[1], 31);
6004
6005 FP (digest_buf[1], digest_buf[0], tt);
6006 break;
6007 }
6008 }
6009
6010 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
6011 {
6012 switch (hash_type)
6013 {
6014 case HASH_TYPE_MD4:
6015 digest_buf[0] += MD4M_A;
6016 digest_buf[1] += MD4M_B;
6017 digest_buf[2] += MD4M_C;
6018 digest_buf[3] += MD4M_D;
6019 break;
6020
6021 case HASH_TYPE_MD5:
6022 digest_buf[0] += MD5M_A;
6023 digest_buf[1] += MD5M_B;
6024 digest_buf[2] += MD5M_C;
6025 digest_buf[3] += MD5M_D;
6026 break;
6027
6028 case HASH_TYPE_SHA1:
6029 digest_buf[0] += SHA1M_A;
6030 digest_buf[1] += SHA1M_B;
6031 digest_buf[2] += SHA1M_C;
6032 digest_buf[3] += SHA1M_D;
6033 digest_buf[4] += SHA1M_E;
6034 break;
6035
6036 case HASH_TYPE_SHA256:
6037 digest_buf[0] += SHA256M_A;
6038 digest_buf[1] += SHA256M_B;
6039 digest_buf[2] += SHA256M_C;
6040 digest_buf[3] += SHA256M_D;
6041 digest_buf[4] += SHA256M_E;
6042 digest_buf[5] += SHA256M_F;
6043 digest_buf[6] += SHA256M_G;
6044 digest_buf[7] += SHA256M_H;
6045 break;
6046
6047 case HASH_TYPE_SHA384:
6048 digest_buf64[0] += SHA384M_A;
6049 digest_buf64[1] += SHA384M_B;
6050 digest_buf64[2] += SHA384M_C;
6051 digest_buf64[3] += SHA384M_D;
6052 digest_buf64[4] += SHA384M_E;
6053 digest_buf64[5] += SHA384M_F;
6054 digest_buf64[6] += 0;
6055 digest_buf64[7] += 0;
6056 break;
6057
6058 case HASH_TYPE_SHA512:
6059 digest_buf64[0] += SHA512M_A;
6060 digest_buf64[1] += SHA512M_B;
6061 digest_buf64[2] += SHA512M_C;
6062 digest_buf64[3] += SHA512M_D;
6063 digest_buf64[4] += SHA512M_E;
6064 digest_buf64[5] += SHA512M_F;
6065 digest_buf64[6] += SHA512M_G;
6066 digest_buf64[7] += SHA512M_H;
6067 break;
6068 }
6069 }
6070
6071 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
6072 {
6073 if (dgst_size == DGST_SIZE_4_2)
6074 {
6075 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6076 }
6077 else if (dgst_size == DGST_SIZE_4_4)
6078 {
6079 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6080 }
6081 else if (dgst_size == DGST_SIZE_4_5)
6082 {
6083 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6084 }
6085 else if (dgst_size == DGST_SIZE_4_6)
6086 {
6087 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6088 }
6089 else if (dgst_size == DGST_SIZE_4_8)
6090 {
6091 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6092 }
6093 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
6094 {
6095 if (hash_type == HASH_TYPE_WHIRLPOOL)
6096 {
6097 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6098 }
6099 else if (hash_type == HASH_TYPE_SHA384)
6100 {
6101 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6102 }
6103 else if (hash_type == HASH_TYPE_SHA512)
6104 {
6105 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6106 }
6107 else if (hash_type == HASH_TYPE_GOST)
6108 {
6109 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6110 }
6111 }
6112 else if (dgst_size == DGST_SIZE_4_64)
6113 {
6114 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6115 }
6116 else if (dgst_size == DGST_SIZE_8_25)
6117 {
6118 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6119 }
6120 }
6121
6122 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
6123 | (data.salt_type == SALT_TYPE_EXTERN)
6124 | (data.salt_type == SALT_TYPE_EMBEDDED));
6125
6126 salt_t salt;
6127
6128 if (isSalted)
6129 {
6130 memset (&salt, 0, sizeof (salt_t));
6131
6132 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
6133
6134 char *ptr = (char *) salt.salt_buf;
6135
6136 uint len = salt.salt_len;
6137
6138 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6139 {
6140 uint tt;
6141
6142 switch (hash_type)
6143 {
6144 case HASH_TYPE_NETNTLM:
6145
6146 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6147 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6148
6149 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6150
6151 break;
6152 }
6153 }
6154
6155 if (opts_type & OPTS_TYPE_ST_UNICODE)
6156 {
6157 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6158 {
6159 ptr[i] = ptr[j];
6160 }
6161
6162 len = len / 2;
6163 }
6164
6165 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6166 {
6167 uint max = salt.salt_len / 4;
6168
6169 if (len % 4) max++;
6170
6171 for (uint i = 0; i < max; i++)
6172 {
6173 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6174 }
6175 }
6176
6177 if (opts_type & OPTS_TYPE_ST_HEX)
6178 {
6179 char tmp[64] = { 0 };
6180
6181 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6182 {
6183 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6184 }
6185
6186 len = len * 2;
6187
6188 memcpy (ptr, tmp, len);
6189 }
6190
6191 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6192
6193 memset (ptr + len, 0, memset_size);
6194
6195 salt.salt_len = len;
6196 }
6197
6198 //
6199 // some modes require special encoding
6200 //
6201
6202 uint out_buf_plain[256] = { 0 };
6203 uint out_buf_salt[256] = { 0 };
6204
6205 char tmp_buf[1024] = { 0 };
6206
6207 char *ptr_plain = (char *) out_buf_plain;
6208 char *ptr_salt = (char *) out_buf_salt;
6209
6210 if (hash_mode == 22)
6211 {
6212 char username[30] = { 0 };
6213
6214 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6215
6216 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6217
6218 u16 *ptr = (u16 *) digest_buf;
6219
6220 tmp_buf[ 0] = sig[0];
6221 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6222 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6223 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6224 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6225 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6226 tmp_buf[ 6] = sig[1];
6227 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6228 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6229 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6230 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6231 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6232 tmp_buf[12] = sig[2];
6233 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6234 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6235 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6236 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6237 tmp_buf[17] = sig[3];
6238 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6239 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6240 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6241 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6242 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6243 tmp_buf[23] = sig[4];
6244 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6245 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6246 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6247 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6248 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6249 tmp_buf[29] = sig[5];
6250
6251 snprintf (out_buf, len-1, "%s:%s",
6252 tmp_buf,
6253 username);
6254 }
6255 else if (hash_mode == 23)
6256 {
6257 // do not show the skyper part in output
6258
6259 char *salt_buf_ptr = (char *) salt.salt_buf;
6260
6261 salt_buf_ptr[salt.salt_len - 8] = 0;
6262
6263 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6264 digest_buf[0],
6265 digest_buf[1],
6266 digest_buf[2],
6267 digest_buf[3],
6268 salt_buf_ptr);
6269 }
6270 else if (hash_mode == 101)
6271 {
6272 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6273
6274 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6275 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6276 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6277 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6278 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6279
6280 memcpy (tmp_buf, digest_buf, 20);
6281
6282 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6283
6284 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6285 }
6286 else if (hash_mode == 111)
6287 {
6288 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6289
6290 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6291 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6292 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6293 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6294 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6295
6296 memcpy (tmp_buf, digest_buf, 20);
6297 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6298
6299 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6300
6301 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6302 }
6303 else if ((hash_mode == 122) || (hash_mode == 125))
6304 {
6305 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6306 (char *) salt.salt_buf,
6307 digest_buf[0],
6308 digest_buf[1],
6309 digest_buf[2],
6310 digest_buf[3],
6311 digest_buf[4]);
6312 }
6313 else if (hash_mode == 124)
6314 {
6315 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6316 (char *) salt.salt_buf,
6317 digest_buf[0],
6318 digest_buf[1],
6319 digest_buf[2],
6320 digest_buf[3],
6321 digest_buf[4]);
6322 }
6323 else if (hash_mode == 131)
6324 {
6325 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6326 (char *) salt.salt_buf,
6327 0, 0, 0, 0, 0,
6328 digest_buf[0],
6329 digest_buf[1],
6330 digest_buf[2],
6331 digest_buf[3],
6332 digest_buf[4]);
6333 }
6334 else if (hash_mode == 132)
6335 {
6336 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6337 (char *) salt.salt_buf,
6338 digest_buf[0],
6339 digest_buf[1],
6340 digest_buf[2],
6341 digest_buf[3],
6342 digest_buf[4]);
6343 }
6344 else if (hash_mode == 133)
6345 {
6346 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6347
6348 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6349 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6350 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6351 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6352 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6353
6354 memcpy (tmp_buf, digest_buf, 20);
6355
6356 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6357
6358 snprintf (out_buf, len-1, "%s", ptr_plain);
6359 }
6360 else if (hash_mode == 141)
6361 {
6362 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6363
6364 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6365
6366 memset (tmp_buf, 0, sizeof (tmp_buf));
6367
6368 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6369
6370 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6371 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6372 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6373 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6374 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6375
6376 memcpy (tmp_buf, digest_buf, 20);
6377
6378 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6379
6380 ptr_plain[27] = 0;
6381
6382 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6383 }
6384 else if (hash_mode == 400)
6385 {
6386 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6387
6388 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6389 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6390 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6391 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6392
6393 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6394
6395 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6396 }
6397 else if (hash_mode == 500)
6398 {
6399 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6400
6401 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6402 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6403 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6404 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6405
6406 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6407
6408 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6409 {
6410 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6411 }
6412 else
6413 {
6414 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6415 }
6416 }
6417 else if (hash_mode == 501)
6418 {
6419 uint digest_idx = salt.digests_offset + digest_pos;
6420
6421 hashinfo_t **hashinfo_ptr = data.hash_info;
6422 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6423
6424 snprintf (out_buf, len-1, "%s", hash_buf);
6425 }
6426 else if (hash_mode == 1421)
6427 {
6428 u8 *salt_ptr = (u8 *) salt.salt_buf;
6429
6430 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6431 salt_ptr[0],
6432 salt_ptr[1],
6433 salt_ptr[2],
6434 salt_ptr[3],
6435 salt_ptr[4],
6436 salt_ptr[5],
6437 digest_buf[0],
6438 digest_buf[1],
6439 digest_buf[2],
6440 digest_buf[3],
6441 digest_buf[4],
6442 digest_buf[5],
6443 digest_buf[6],
6444 digest_buf[7]);
6445 }
6446 else if (hash_mode == 1441)
6447 {
6448 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6449
6450 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6451
6452 memset (tmp_buf, 0, sizeof (tmp_buf));
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 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6461 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6462 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6463 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6464
6465 memcpy (tmp_buf, digest_buf, 32);
6466
6467 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6468
6469 ptr_plain[43] = 0;
6470
6471 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6472 }
6473 else if (hash_mode == 1500)
6474 {
6475 out_buf[0] = salt.salt_sign[0] & 0xff;
6476 out_buf[1] = salt.salt_sign[1] & 0xff;
6477 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6478 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6479 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6480
6481 memset (tmp_buf, 0, sizeof (tmp_buf));
6482
6483 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6484
6485 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6486 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6487
6488 memcpy (tmp_buf, digest_buf, 8);
6489
6490 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6491
6492 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6493
6494 out_buf[13] = 0;
6495 }
6496 else if (hash_mode == 1600)
6497 {
6498 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6499
6500 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6501 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6502 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6503 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6504
6505 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6506
6507 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6508 {
6509 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6510 }
6511 else
6512 {
6513 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6514 }
6515 }
6516 else if (hash_mode == 1711)
6517 {
6518 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6519
6520 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6521 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6522 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6523 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6524 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6525 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6526 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6527 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6528
6529 memcpy (tmp_buf, digest_buf, 64);
6530 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6531
6532 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6533
6534 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6535 }
6536 else if (hash_mode == 1722)
6537 {
6538 uint *ptr = digest_buf;
6539
6540 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6541 (unsigned char *) salt.salt_buf,
6542 ptr[ 1], ptr[ 0],
6543 ptr[ 3], ptr[ 2],
6544 ptr[ 5], ptr[ 4],
6545 ptr[ 7], ptr[ 6],
6546 ptr[ 9], ptr[ 8],
6547 ptr[11], ptr[10],
6548 ptr[13], ptr[12],
6549 ptr[15], ptr[14]);
6550 }
6551 else if (hash_mode == 1731)
6552 {
6553 uint *ptr = digest_buf;
6554
6555 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6556 (unsigned char *) salt.salt_buf,
6557 ptr[ 1], ptr[ 0],
6558 ptr[ 3], ptr[ 2],
6559 ptr[ 5], ptr[ 4],
6560 ptr[ 7], ptr[ 6],
6561 ptr[ 9], ptr[ 8],
6562 ptr[11], ptr[10],
6563 ptr[13], ptr[12],
6564 ptr[15], ptr[14]);
6565 }
6566 else if (hash_mode == 1800)
6567 {
6568 // temp workaround
6569
6570 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6571 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6572 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6573 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6574 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6575 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6576 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6577 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6578
6579 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6580
6581 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6582 {
6583 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6584 }
6585 else
6586 {
6587 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6588 }
6589 }
6590 else if (hash_mode == 2100)
6591 {
6592 uint pos = 0;
6593
6594 snprintf (out_buf + pos, len-1, "%s%i#",
6595 SIGNATURE_DCC2,
6596 salt.salt_iter + 1);
6597
6598 uint signature_len = strlen (out_buf);
6599
6600 pos += signature_len;
6601 len -= signature_len;
6602
6603 char *salt_ptr = (char *) salt.salt_buf;
6604
6605 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6606
6607 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6608 byte_swap_32 (digest_buf[0]),
6609 byte_swap_32 (digest_buf[1]),
6610 byte_swap_32 (digest_buf[2]),
6611 byte_swap_32 (digest_buf[3]));
6612 }
6613 else if ((hash_mode == 2400) || (hash_mode == 2410))
6614 {
6615 memcpy (tmp_buf, digest_buf, 16);
6616
6617 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6618
6619 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6620 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6621 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6622 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6623
6624 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6625 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6626 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6627 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6628
6629 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6630 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6631 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6632 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6633
6634 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6635 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6636 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6637 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6638
6639 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6640 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6641 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6642 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6643
6644 out_buf[16] = 0;
6645 }
6646 else if (hash_mode == 2500)
6647 {
6648 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6649
6650 wpa_t *wpa = &wpas[salt_pos];
6651
6652 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6653 (char *) salt.salt_buf,
6654 wpa->orig_mac1[0],
6655 wpa->orig_mac1[1],
6656 wpa->orig_mac1[2],
6657 wpa->orig_mac1[3],
6658 wpa->orig_mac1[4],
6659 wpa->orig_mac1[5],
6660 wpa->orig_mac2[0],
6661 wpa->orig_mac2[1],
6662 wpa->orig_mac2[2],
6663 wpa->orig_mac2[3],
6664 wpa->orig_mac2[4],
6665 wpa->orig_mac2[5]);
6666 }
6667 else if (hash_mode == 4400)
6668 {
6669 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6670 byte_swap_32 (digest_buf[0]),
6671 byte_swap_32 (digest_buf[1]),
6672 byte_swap_32 (digest_buf[2]),
6673 byte_swap_32 (digest_buf[3]));
6674 }
6675 else if (hash_mode == 4700)
6676 {
6677 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6678 byte_swap_32 (digest_buf[0]),
6679 byte_swap_32 (digest_buf[1]),
6680 byte_swap_32 (digest_buf[2]),
6681 byte_swap_32 (digest_buf[3]),
6682 byte_swap_32 (digest_buf[4]));
6683 }
6684 else if (hash_mode == 4800)
6685 {
6686 u8 chap_id_byte = (u8) salt.salt_buf[4];
6687
6688 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6689 digest_buf[0],
6690 digest_buf[1],
6691 digest_buf[2],
6692 digest_buf[3],
6693 byte_swap_32 (salt.salt_buf[0]),
6694 byte_swap_32 (salt.salt_buf[1]),
6695 byte_swap_32 (salt.salt_buf[2]),
6696 byte_swap_32 (salt.salt_buf[3]),
6697 chap_id_byte);
6698 }
6699 else if (hash_mode == 4900)
6700 {
6701 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6702 byte_swap_32 (digest_buf[0]),
6703 byte_swap_32 (digest_buf[1]),
6704 byte_swap_32 (digest_buf[2]),
6705 byte_swap_32 (digest_buf[3]),
6706 byte_swap_32 (digest_buf[4]));
6707 }
6708 else if (hash_mode == 5100)
6709 {
6710 snprintf (out_buf, len-1, "%08x%08x",
6711 digest_buf[0],
6712 digest_buf[1]);
6713 }
6714 else if (hash_mode == 5200)
6715 {
6716 snprintf (out_buf, len-1, "%s", hashfile);
6717 }
6718 else if (hash_mode == 5300)
6719 {
6720 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6721
6722 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6723
6724 int buf_len = len -1;
6725
6726 // msg_buf
6727
6728 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6729
6730 for (uint i = 0; i < ikepsk_msg_len; i++)
6731 {
6732 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6733 {
6734 snprintf (out_buf, buf_len, ":");
6735
6736 buf_len--;
6737 out_buf++;
6738 }
6739
6740 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6741
6742 buf_len -= 8;
6743 out_buf += 8;
6744 }
6745
6746 // nr_buf
6747
6748 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6749
6750 for (uint i = 0; i < ikepsk_nr_len; i++)
6751 {
6752 if ((i == 0) || (i == 5))
6753 {
6754 snprintf (out_buf, buf_len, ":");
6755
6756 buf_len--;
6757 out_buf++;
6758 }
6759
6760 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6761
6762 buf_len -= 8;
6763 out_buf += 8;
6764 }
6765
6766 // digest_buf
6767
6768 for (uint i = 0; i < 4; i++)
6769 {
6770 if (i == 0)
6771 {
6772 snprintf (out_buf, buf_len, ":");
6773
6774 buf_len--;
6775 out_buf++;
6776 }
6777
6778 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6779
6780 buf_len -= 8;
6781 out_buf += 8;
6782 }
6783 }
6784 else if (hash_mode == 5400)
6785 {
6786 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6787
6788 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6789
6790 int buf_len = len -1;
6791
6792 // msg_buf
6793
6794 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6795
6796 for (uint i = 0; i < ikepsk_msg_len; i++)
6797 {
6798 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6799 {
6800 snprintf (out_buf, buf_len, ":");
6801
6802 buf_len--;
6803 out_buf++;
6804 }
6805
6806 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6807
6808 buf_len -= 8;
6809 out_buf += 8;
6810 }
6811
6812 // nr_buf
6813
6814 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6815
6816 for (uint i = 0; i < ikepsk_nr_len; i++)
6817 {
6818 if ((i == 0) || (i == 5))
6819 {
6820 snprintf (out_buf, buf_len, ":");
6821
6822 buf_len--;
6823 out_buf++;
6824 }
6825
6826 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6827
6828 buf_len -= 8;
6829 out_buf += 8;
6830 }
6831
6832 // digest_buf
6833
6834 for (uint i = 0; i < 5; i++)
6835 {
6836 if (i == 0)
6837 {
6838 snprintf (out_buf, buf_len, ":");
6839
6840 buf_len--;
6841 out_buf++;
6842 }
6843
6844 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6845
6846 buf_len -= 8;
6847 out_buf += 8;
6848 }
6849 }
6850 else if (hash_mode == 5500)
6851 {
6852 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6853
6854 netntlm_t *netntlm = &netntlms[salt_pos];
6855
6856 char user_buf[64] = { 0 };
6857 char domain_buf[64] = { 0 };
6858 char srvchall_buf[1024] = { 0 };
6859 char clichall_buf[1024] = { 0 };
6860
6861 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6862 {
6863 char *ptr = (char *) netntlm->userdomain_buf;
6864
6865 user_buf[i] = ptr[j];
6866 }
6867
6868 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6869 {
6870 char *ptr = (char *) netntlm->userdomain_buf;
6871
6872 domain_buf[i] = ptr[netntlm->user_len + j];
6873 }
6874
6875 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6876 {
6877 u8 *ptr = (u8 *) netntlm->chall_buf;
6878
6879 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6880 }
6881
6882 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6883 {
6884 u8 *ptr = (u8 *) netntlm->chall_buf;
6885
6886 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6887 }
6888
6889 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6890 user_buf,
6891 domain_buf,
6892 srvchall_buf,
6893 digest_buf[0],
6894 digest_buf[1],
6895 digest_buf[2],
6896 digest_buf[3],
6897 byte_swap_32 (salt.salt_buf_pc[0]),
6898 byte_swap_32 (salt.salt_buf_pc[1]),
6899 clichall_buf);
6900 }
6901 else if (hash_mode == 5600)
6902 {
6903 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6904
6905 netntlm_t *netntlm = &netntlms[salt_pos];
6906
6907 char user_buf[64] = { 0 };
6908 char domain_buf[64] = { 0 };
6909 char srvchall_buf[1024] = { 0 };
6910 char clichall_buf[1024] = { 0 };
6911
6912 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6913 {
6914 char *ptr = (char *) netntlm->userdomain_buf;
6915
6916 user_buf[i] = ptr[j];
6917 }
6918
6919 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6920 {
6921 char *ptr = (char *) netntlm->userdomain_buf;
6922
6923 domain_buf[i] = ptr[netntlm->user_len + j];
6924 }
6925
6926 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6927 {
6928 u8 *ptr = (u8 *) netntlm->chall_buf;
6929
6930 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6931 }
6932
6933 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6934 {
6935 u8 *ptr = (u8 *) netntlm->chall_buf;
6936
6937 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6938 }
6939
6940 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6941 user_buf,
6942 domain_buf,
6943 srvchall_buf,
6944 digest_buf[0],
6945 digest_buf[1],
6946 digest_buf[2],
6947 digest_buf[3],
6948 clichall_buf);
6949 }
6950 else if (hash_mode == 5700)
6951 {
6952 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6953
6954 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6955 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6956 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6957 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6958 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6959 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6960 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6961 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6962
6963 memcpy (tmp_buf, digest_buf, 32);
6964
6965 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6966
6967 ptr_plain[43] = 0;
6968
6969 snprintf (out_buf, len-1, "%s", ptr_plain);
6970 }
6971 else if (hash_mode == 5800)
6972 {
6973 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6974 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6975 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6976 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6977 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6978
6979 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6980 digest_buf[0],
6981 digest_buf[1],
6982 digest_buf[2],
6983 digest_buf[3],
6984 digest_buf[4]);
6985 }
6986 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6987 {
6988 snprintf (out_buf, len-1, "%s", hashfile);
6989 }
6990 else if (hash_mode == 6300)
6991 {
6992 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6993
6994 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6995 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6996 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6997 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6998
6999 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7000
7001 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7002 }
7003 else if (hash_mode == 6400)
7004 {
7005 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7006
7007 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7008 }
7009 else if (hash_mode == 6500)
7010 {
7011 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7012
7013 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7014 }
7015 else if (hash_mode == 6600)
7016 {
7017 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
7018
7019 agilekey_t *agilekey = &agilekeys[salt_pos];
7020
7021 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7022 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7023
7024 uint buf_len = len - 1;
7025
7026 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
7027 buf_len -= 22;
7028
7029 for (uint i = 0, j = off; i < 1040; i++, j += 2)
7030 {
7031 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
7032
7033 buf_len -= 2;
7034 }
7035 }
7036 else if (hash_mode == 6700)
7037 {
7038 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7039
7040 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
7041 }
7042 else if (hash_mode == 6800)
7043 {
7044 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
7045 }
7046 else if (hash_mode == 7100)
7047 {
7048 uint *ptr = digest_buf;
7049
7050 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7051
7052 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7053
7054 uint esalt[8] = { 0 };
7055
7056 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
7057 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
7058 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
7059 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
7060 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
7061 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
7062 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
7063 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
7064
7065 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",
7066 SIGNATURE_SHA512OSX,
7067 salt.salt_iter + 1,
7068 esalt[ 0], esalt[ 1],
7069 esalt[ 2], esalt[ 3],
7070 esalt[ 4], esalt[ 5],
7071 esalt[ 6], esalt[ 7],
7072 ptr [ 1], ptr [ 0],
7073 ptr [ 3], ptr [ 2],
7074 ptr [ 5], ptr [ 4],
7075 ptr [ 7], ptr [ 6],
7076 ptr [ 9], ptr [ 8],
7077 ptr [11], ptr [10],
7078 ptr [13], ptr [12],
7079 ptr [15], ptr [14]);
7080 }
7081 else if (hash_mode == 7200)
7082 {
7083 uint *ptr = digest_buf;
7084
7085 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7086
7087 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7088
7089 uint len_used = 0;
7090
7091 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
7092
7093 len_used = strlen (out_buf);
7094
7095 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
7096
7097 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
7098 {
7099 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
7100 }
7101
7102 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",
7103 ptr [ 1], ptr [ 0],
7104 ptr [ 3], ptr [ 2],
7105 ptr [ 5], ptr [ 4],
7106 ptr [ 7], ptr [ 6],
7107 ptr [ 9], ptr [ 8],
7108 ptr [11], ptr [10],
7109 ptr [13], ptr [12],
7110 ptr [15], ptr [14]);
7111 }
7112 else if (hash_mode == 7300)
7113 {
7114 rakp_t *rakps = (rakp_t *) data.esalts_buf;
7115
7116 rakp_t *rakp = &rakps[salt_pos];
7117
7118 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
7119 {
7120 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
7121 }
7122
7123 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7124 digest_buf[0],
7125 digest_buf[1],
7126 digest_buf[2],
7127 digest_buf[3],
7128 digest_buf[4]);
7129 }
7130 else if (hash_mode == 7400)
7131 {
7132 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7133
7134 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7135 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7136 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7137 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7138 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7139 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7140 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7141 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7142
7143 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7144
7145 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7146 {
7147 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7148 }
7149 else
7150 {
7151 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7152 }
7153 }
7154 else if (hash_mode == 7500)
7155 {
7156 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7157
7158 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7159
7160 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7161 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7162
7163 char data[128] = { 0 };
7164
7165 char *ptr_data = data;
7166
7167 for (uint i = 0; i < 36; i++, ptr_data += 2)
7168 {
7169 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7170 }
7171
7172 for (uint i = 0; i < 16; i++, ptr_data += 2)
7173 {
7174 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7175 }
7176
7177 *ptr_data = 0;
7178
7179 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7180 SIGNATURE_KRB5PA,
7181 (char *) krb5pa->user,
7182 (char *) krb5pa->realm,
7183 (char *) krb5pa->salt,
7184 data);
7185 }
7186 else if (hash_mode == 7700)
7187 {
7188 snprintf (out_buf, len-1, "%s$%08X%08X",
7189 (char *) salt.salt_buf,
7190 digest_buf[0],
7191 digest_buf[1]);
7192 }
7193 else if (hash_mode == 7800)
7194 {
7195 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7196 (char *) salt.salt_buf,
7197 digest_buf[0],
7198 digest_buf[1],
7199 digest_buf[2],
7200 digest_buf[3],
7201 digest_buf[4]);
7202 }
7203 else if (hash_mode == 7900)
7204 {
7205 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7206
7207 // ugly hack start
7208
7209 char *tmp = (char *) salt.salt_buf_pc;
7210
7211 ptr_plain[42] = tmp[0];
7212
7213 // ugly hack end
7214
7215 ptr_plain[43] = 0;
7216
7217 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7218 }
7219 else if (hash_mode == 8000)
7220 {
7221 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7222 (unsigned char *) salt.salt_buf,
7223 digest_buf[0],
7224 digest_buf[1],
7225 digest_buf[2],
7226 digest_buf[3],
7227 digest_buf[4],
7228 digest_buf[5],
7229 digest_buf[6],
7230 digest_buf[7]);
7231 }
7232 else if (hash_mode == 8100)
7233 {
7234 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7235 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7236
7237 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7238 (unsigned char *) salt.salt_buf,
7239 digest_buf[0],
7240 digest_buf[1],
7241 digest_buf[2],
7242 digest_buf[3],
7243 digest_buf[4]);
7244 }
7245 else if (hash_mode == 8200)
7246 {
7247 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7248
7249 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7250
7251 char data_buf[4096] = { 0 };
7252
7253 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7254 {
7255 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7256 }
7257
7258 data_buf[cloudkey->data_len * 2] = 0;
7259
7260 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7261 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7262 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7263 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7264 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7265 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7266 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7267 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7268
7269 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7270 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7271 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7272 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7273
7274 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7275 digest_buf[0],
7276 digest_buf[1],
7277 digest_buf[2],
7278 digest_buf[3],
7279 digest_buf[4],
7280 digest_buf[5],
7281 digest_buf[6],
7282 digest_buf[7],
7283 salt.salt_buf[0],
7284 salt.salt_buf[1],
7285 salt.salt_buf[2],
7286 salt.salt_buf[3],
7287 salt.salt_iter + 1,
7288 data_buf);
7289 }
7290 else if (hash_mode == 8300)
7291 {
7292 char digest_buf_c[34] = { 0 };
7293
7294 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7295 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7296 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7297 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7298 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7299
7300 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7301
7302 digest_buf_c[32] = 0;
7303
7304 // domain
7305
7306 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7307
7308 char domain_buf_c[33] = { 0 };
7309
7310 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7311
7312 for (uint i = 0; i < salt_pc_len; i++)
7313 {
7314 const char next = domain_buf_c[i];
7315
7316 domain_buf_c[i] = '.';
7317
7318 i += next;
7319 }
7320
7321 domain_buf_c[salt_pc_len] = 0;
7322
7323 // final
7324
7325 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7326 }
7327 else if (hash_mode == 8500)
7328 {
7329 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7330 }
7331 else if (hash_mode == 2612)
7332 {
7333 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7334 SIGNATURE_PHPS,
7335 (char *) salt.salt_buf,
7336 digest_buf[0],
7337 digest_buf[1],
7338 digest_buf[2],
7339 digest_buf[3]);
7340 }
7341 else if (hash_mode == 3711)
7342 {
7343 char *salt_ptr = (char *) salt.salt_buf;
7344
7345 salt_ptr[salt.salt_len - 1] = 0;
7346
7347 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7348 SIGNATURE_MEDIAWIKI_B,
7349 salt_ptr,
7350 digest_buf[0],
7351 digest_buf[1],
7352 digest_buf[2],
7353 digest_buf[3]);
7354 }
7355 else if (hash_mode == 8800)
7356 {
7357 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7358
7359 androidfde_t *androidfde = &androidfdes[salt_pos];
7360
7361 char tmp[3073] = { 0 };
7362
7363 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7364 {
7365 sprintf (tmp + j, "%08x", androidfde->data[i]);
7366 }
7367
7368 tmp[3072] = 0;
7369
7370 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7371 SIGNATURE_ANDROIDFDE,
7372 byte_swap_32 (salt.salt_buf[0]),
7373 byte_swap_32 (salt.salt_buf[1]),
7374 byte_swap_32 (salt.salt_buf[2]),
7375 byte_swap_32 (salt.salt_buf[3]),
7376 byte_swap_32 (digest_buf[0]),
7377 byte_swap_32 (digest_buf[1]),
7378 byte_swap_32 (digest_buf[2]),
7379 byte_swap_32 (digest_buf[3]),
7380 tmp);
7381 }
7382 else if (hash_mode == 8900)
7383 {
7384 uint N = salt.scrypt_N;
7385 uint r = salt.scrypt_r;
7386 uint p = salt.scrypt_p;
7387
7388 char base64_salt[32] = { 0 };
7389
7390 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7391
7392 memset (tmp_buf, 0, 46);
7393
7394 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7395 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7396 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7397 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7398 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7399 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7400 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7401 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7402 digest_buf[8] = 0; // needed for base64_encode ()
7403
7404 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7405
7406 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7407 SIGNATURE_SCRYPT,
7408 N,
7409 r,
7410 p,
7411 base64_salt,
7412 tmp_buf);
7413 }
7414 else if (hash_mode == 9000)
7415 {
7416 snprintf (out_buf, len-1, "%s", hashfile);
7417 }
7418 else if (hash_mode == 9200)
7419 {
7420 // salt
7421
7422 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7423
7424 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7425
7426 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7427
7428 // hash
7429
7430 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7431 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7432 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7433 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7434 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7435 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7436 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7437 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7438 digest_buf[8] = 0; // needed for base64_encode ()
7439
7440 char tmp_buf[64] = { 0 };
7441
7442 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7443 tmp_buf[43] = 0; // cut it here
7444
7445 // output
7446
7447 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7448 }
7449 else if (hash_mode == 9300)
7450 {
7451 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7452 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7453 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7454 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7455 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7456 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7457 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7458 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7459 digest_buf[8] = 0; // needed for base64_encode ()
7460
7461 char tmp_buf[64] = { 0 };
7462
7463 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7464 tmp_buf[43] = 0; // cut it here
7465
7466 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7467
7468 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7469 }
7470 else if (hash_mode == 9400)
7471 {
7472 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7473
7474 office2007_t *office2007 = &office2007s[salt_pos];
7475
7476 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7477 SIGNATURE_OFFICE2007,
7478 2007,
7479 20,
7480 office2007->keySize,
7481 16,
7482 salt.salt_buf[0],
7483 salt.salt_buf[1],
7484 salt.salt_buf[2],
7485 salt.salt_buf[3],
7486 office2007->encryptedVerifier[0],
7487 office2007->encryptedVerifier[1],
7488 office2007->encryptedVerifier[2],
7489 office2007->encryptedVerifier[3],
7490 office2007->encryptedVerifierHash[0],
7491 office2007->encryptedVerifierHash[1],
7492 office2007->encryptedVerifierHash[2],
7493 office2007->encryptedVerifierHash[3],
7494 office2007->encryptedVerifierHash[4]);
7495 }
7496 else if (hash_mode == 9500)
7497 {
7498 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7499
7500 office2010_t *office2010 = &office2010s[salt_pos];
7501
7502 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,
7503
7504 salt.salt_buf[0],
7505 salt.salt_buf[1],
7506 salt.salt_buf[2],
7507 salt.salt_buf[3],
7508 office2010->encryptedVerifier[0],
7509 office2010->encryptedVerifier[1],
7510 office2010->encryptedVerifier[2],
7511 office2010->encryptedVerifier[3],
7512 office2010->encryptedVerifierHash[0],
7513 office2010->encryptedVerifierHash[1],
7514 office2010->encryptedVerifierHash[2],
7515 office2010->encryptedVerifierHash[3],
7516 office2010->encryptedVerifierHash[4],
7517 office2010->encryptedVerifierHash[5],
7518 office2010->encryptedVerifierHash[6],
7519 office2010->encryptedVerifierHash[7]);
7520 }
7521 else if (hash_mode == 9600)
7522 {
7523 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7524
7525 office2013_t *office2013 = &office2013s[salt_pos];
7526
7527 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,
7528
7529 salt.salt_buf[0],
7530 salt.salt_buf[1],
7531 salt.salt_buf[2],
7532 salt.salt_buf[3],
7533 office2013->encryptedVerifier[0],
7534 office2013->encryptedVerifier[1],
7535 office2013->encryptedVerifier[2],
7536 office2013->encryptedVerifier[3],
7537 office2013->encryptedVerifierHash[0],
7538 office2013->encryptedVerifierHash[1],
7539 office2013->encryptedVerifierHash[2],
7540 office2013->encryptedVerifierHash[3],
7541 office2013->encryptedVerifierHash[4],
7542 office2013->encryptedVerifierHash[5],
7543 office2013->encryptedVerifierHash[6],
7544 office2013->encryptedVerifierHash[7]);
7545 }
7546 else if (hash_mode == 9700)
7547 {
7548 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7549
7550 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7551
7552 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7553 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7554 byte_swap_32 (salt.salt_buf[0]),
7555 byte_swap_32 (salt.salt_buf[1]),
7556 byte_swap_32 (salt.salt_buf[2]),
7557 byte_swap_32 (salt.salt_buf[3]),
7558 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7559 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7560 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7561 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7562 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7563 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7564 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7565 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7566 }
7567 else if (hash_mode == 9710)
7568 {
7569 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7570
7571 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7572
7573 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7574 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7575 byte_swap_32 (salt.salt_buf[0]),
7576 byte_swap_32 (salt.salt_buf[1]),
7577 byte_swap_32 (salt.salt_buf[2]),
7578 byte_swap_32 (salt.salt_buf[3]),
7579 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7580 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7581 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7582 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7583 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7584 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7585 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7586 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7587 }
7588 else if (hash_mode == 9720)
7589 {
7590 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7591
7592 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7593
7594 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7595
7596 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7597 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7598 byte_swap_32 (salt.salt_buf[0]),
7599 byte_swap_32 (salt.salt_buf[1]),
7600 byte_swap_32 (salt.salt_buf[2]),
7601 byte_swap_32 (salt.salt_buf[3]),
7602 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7603 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7604 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7605 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7606 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7607 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7608 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7609 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7610 rc4key[0],
7611 rc4key[1],
7612 rc4key[2],
7613 rc4key[3],
7614 rc4key[4]);
7615 }
7616 else if (hash_mode == 9800)
7617 {
7618 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7619
7620 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7621
7622 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7623 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7624 salt.salt_buf[0],
7625 salt.salt_buf[1],
7626 salt.salt_buf[2],
7627 salt.salt_buf[3],
7628 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7629 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7630 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7631 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7632 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7633 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7634 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7635 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7636 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7637 }
7638 else if (hash_mode == 9810)
7639 {
7640 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7641
7642 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7643
7644 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7645 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7646 salt.salt_buf[0],
7647 salt.salt_buf[1],
7648 salt.salt_buf[2],
7649 salt.salt_buf[3],
7650 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7651 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7652 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7653 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7654 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7655 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7656 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7657 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7658 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7659 }
7660 else if (hash_mode == 9820)
7661 {
7662 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7663
7664 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7665
7666 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7667
7668 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7669 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7670 salt.salt_buf[0],
7671 salt.salt_buf[1],
7672 salt.salt_buf[2],
7673 salt.salt_buf[3],
7674 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7675 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7676 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7677 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7678 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7679 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7680 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7681 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7682 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7683 rc4key[0],
7684 rc4key[1],
7685 rc4key[2],
7686 rc4key[3],
7687 rc4key[4]);
7688 }
7689 else if (hash_mode == 10000)
7690 {
7691 // salt
7692
7693 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7694
7695 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7696
7697 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7698
7699 // hash
7700
7701 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7702 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7703 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7704 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7705 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7706 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7707 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7708 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7709 digest_buf[8] = 0; // needed for base64_encode ()
7710
7711 char tmp_buf[64] = { 0 };
7712
7713 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7714
7715 // output
7716
7717 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7718 }
7719 else if (hash_mode == 10100)
7720 {
7721 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7722 digest_buf[0],
7723 digest_buf[1],
7724 2,
7725 4,
7726 byte_swap_32 (salt.salt_buf[0]),
7727 byte_swap_32 (salt.salt_buf[1]),
7728 byte_swap_32 (salt.salt_buf[2]),
7729 byte_swap_32 (salt.salt_buf[3]));
7730 }
7731 else if (hash_mode == 10200)
7732 {
7733 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7734
7735 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7736
7737 // challenge
7738
7739 char challenge[100] = { 0 };
7740
7741 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7742
7743 // response
7744
7745 char tmp_buf[100] = { 0 };
7746
7747 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7748 (char *) cram_md5->user,
7749 digest_buf[0],
7750 digest_buf[1],
7751 digest_buf[2],
7752 digest_buf[3]);
7753
7754 char response[100] = { 0 };
7755
7756 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7757
7758 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7759 }
7760 else if (hash_mode == 10300)
7761 {
7762 char tmp_buf[100] = { 0 };
7763
7764 memcpy (tmp_buf + 0, digest_buf, 20);
7765 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7766
7767 uint tmp_len = 20 + salt.salt_len;
7768
7769 // base64 encode it
7770
7771 char base64_encoded[100] = { 0 };
7772
7773 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7774
7775 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7776 }
7777 else if (hash_mode == 10400)
7778 {
7779 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7780
7781 pdf_t *pdf = &pdfs[salt_pos];
7782
7783 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",
7784
7785 pdf->V,
7786 pdf->R,
7787 40,
7788 pdf->P,
7789 pdf->enc_md,
7790 pdf->id_len,
7791 byte_swap_32 (pdf->id_buf[0]),
7792 byte_swap_32 (pdf->id_buf[1]),
7793 byte_swap_32 (pdf->id_buf[2]),
7794 byte_swap_32 (pdf->id_buf[3]),
7795 pdf->u_len,
7796 byte_swap_32 (pdf->u_buf[0]),
7797 byte_swap_32 (pdf->u_buf[1]),
7798 byte_swap_32 (pdf->u_buf[2]),
7799 byte_swap_32 (pdf->u_buf[3]),
7800 byte_swap_32 (pdf->u_buf[4]),
7801 byte_swap_32 (pdf->u_buf[5]),
7802 byte_swap_32 (pdf->u_buf[6]),
7803 byte_swap_32 (pdf->u_buf[7]),
7804 pdf->o_len,
7805 byte_swap_32 (pdf->o_buf[0]),
7806 byte_swap_32 (pdf->o_buf[1]),
7807 byte_swap_32 (pdf->o_buf[2]),
7808 byte_swap_32 (pdf->o_buf[3]),
7809 byte_swap_32 (pdf->o_buf[4]),
7810 byte_swap_32 (pdf->o_buf[5]),
7811 byte_swap_32 (pdf->o_buf[6]),
7812 byte_swap_32 (pdf->o_buf[7])
7813 );
7814 }
7815 else if (hash_mode == 10410)
7816 {
7817 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7818
7819 pdf_t *pdf = &pdfs[salt_pos];
7820
7821 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",
7822
7823 pdf->V,
7824 pdf->R,
7825 40,
7826 pdf->P,
7827 pdf->enc_md,
7828 pdf->id_len,
7829 byte_swap_32 (pdf->id_buf[0]),
7830 byte_swap_32 (pdf->id_buf[1]),
7831 byte_swap_32 (pdf->id_buf[2]),
7832 byte_swap_32 (pdf->id_buf[3]),
7833 pdf->u_len,
7834 byte_swap_32 (pdf->u_buf[0]),
7835 byte_swap_32 (pdf->u_buf[1]),
7836 byte_swap_32 (pdf->u_buf[2]),
7837 byte_swap_32 (pdf->u_buf[3]),
7838 byte_swap_32 (pdf->u_buf[4]),
7839 byte_swap_32 (pdf->u_buf[5]),
7840 byte_swap_32 (pdf->u_buf[6]),
7841 byte_swap_32 (pdf->u_buf[7]),
7842 pdf->o_len,
7843 byte_swap_32 (pdf->o_buf[0]),
7844 byte_swap_32 (pdf->o_buf[1]),
7845 byte_swap_32 (pdf->o_buf[2]),
7846 byte_swap_32 (pdf->o_buf[3]),
7847 byte_swap_32 (pdf->o_buf[4]),
7848 byte_swap_32 (pdf->o_buf[5]),
7849 byte_swap_32 (pdf->o_buf[6]),
7850 byte_swap_32 (pdf->o_buf[7])
7851 );
7852 }
7853 else if (hash_mode == 10420)
7854 {
7855 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7856
7857 pdf_t *pdf = &pdfs[salt_pos];
7858
7859 u8 *rc4key = (u8 *) pdf->rc4key;
7860
7861 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",
7862
7863 pdf->V,
7864 pdf->R,
7865 40,
7866 pdf->P,
7867 pdf->enc_md,
7868 pdf->id_len,
7869 byte_swap_32 (pdf->id_buf[0]),
7870 byte_swap_32 (pdf->id_buf[1]),
7871 byte_swap_32 (pdf->id_buf[2]),
7872 byte_swap_32 (pdf->id_buf[3]),
7873 pdf->u_len,
7874 byte_swap_32 (pdf->u_buf[0]),
7875 byte_swap_32 (pdf->u_buf[1]),
7876 byte_swap_32 (pdf->u_buf[2]),
7877 byte_swap_32 (pdf->u_buf[3]),
7878 byte_swap_32 (pdf->u_buf[4]),
7879 byte_swap_32 (pdf->u_buf[5]),
7880 byte_swap_32 (pdf->u_buf[6]),
7881 byte_swap_32 (pdf->u_buf[7]),
7882 pdf->o_len,
7883 byte_swap_32 (pdf->o_buf[0]),
7884 byte_swap_32 (pdf->o_buf[1]),
7885 byte_swap_32 (pdf->o_buf[2]),
7886 byte_swap_32 (pdf->o_buf[3]),
7887 byte_swap_32 (pdf->o_buf[4]),
7888 byte_swap_32 (pdf->o_buf[5]),
7889 byte_swap_32 (pdf->o_buf[6]),
7890 byte_swap_32 (pdf->o_buf[7]),
7891 rc4key[0],
7892 rc4key[1],
7893 rc4key[2],
7894 rc4key[3],
7895 rc4key[4]
7896 );
7897 }
7898 else if (hash_mode == 10500)
7899 {
7900 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7901
7902 pdf_t *pdf = &pdfs[salt_pos];
7903
7904 if (pdf->id_len == 32)
7905 {
7906 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",
7907
7908 pdf->V,
7909 pdf->R,
7910 128,
7911 pdf->P,
7912 pdf->enc_md,
7913 pdf->id_len,
7914 byte_swap_32 (pdf->id_buf[0]),
7915 byte_swap_32 (pdf->id_buf[1]),
7916 byte_swap_32 (pdf->id_buf[2]),
7917 byte_swap_32 (pdf->id_buf[3]),
7918 byte_swap_32 (pdf->id_buf[4]),
7919 byte_swap_32 (pdf->id_buf[5]),
7920 byte_swap_32 (pdf->id_buf[6]),
7921 byte_swap_32 (pdf->id_buf[7]),
7922 pdf->u_len,
7923 byte_swap_32 (pdf->u_buf[0]),
7924 byte_swap_32 (pdf->u_buf[1]),
7925 byte_swap_32 (pdf->u_buf[2]),
7926 byte_swap_32 (pdf->u_buf[3]),
7927 byte_swap_32 (pdf->u_buf[4]),
7928 byte_swap_32 (pdf->u_buf[5]),
7929 byte_swap_32 (pdf->u_buf[6]),
7930 byte_swap_32 (pdf->u_buf[7]),
7931 pdf->o_len,
7932 byte_swap_32 (pdf->o_buf[0]),
7933 byte_swap_32 (pdf->o_buf[1]),
7934 byte_swap_32 (pdf->o_buf[2]),
7935 byte_swap_32 (pdf->o_buf[3]),
7936 byte_swap_32 (pdf->o_buf[4]),
7937 byte_swap_32 (pdf->o_buf[5]),
7938 byte_swap_32 (pdf->o_buf[6]),
7939 byte_swap_32 (pdf->o_buf[7])
7940 );
7941 }
7942 else
7943 {
7944 snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x",
7945
7946 pdf->V,
7947 pdf->R,
7948 128,
7949 pdf->P,
7950 pdf->enc_md,
7951 pdf->id_len,
7952 byte_swap_32 (pdf->id_buf[0]),
7953 byte_swap_32 (pdf->id_buf[1]),
7954 byte_swap_32 (pdf->id_buf[2]),
7955 byte_swap_32 (pdf->id_buf[3]),
7956 pdf->u_len,
7957 byte_swap_32 (pdf->u_buf[0]),
7958 byte_swap_32 (pdf->u_buf[1]),
7959 byte_swap_32 (pdf->u_buf[2]),
7960 byte_swap_32 (pdf->u_buf[3]),
7961 byte_swap_32 (pdf->u_buf[4]),
7962 byte_swap_32 (pdf->u_buf[5]),
7963 byte_swap_32 (pdf->u_buf[6]),
7964 byte_swap_32 (pdf->u_buf[7]),
7965 pdf->o_len,
7966 byte_swap_32 (pdf->o_buf[0]),
7967 byte_swap_32 (pdf->o_buf[1]),
7968 byte_swap_32 (pdf->o_buf[2]),
7969 byte_swap_32 (pdf->o_buf[3]),
7970 byte_swap_32 (pdf->o_buf[4]),
7971 byte_swap_32 (pdf->o_buf[5]),
7972 byte_swap_32 (pdf->o_buf[6]),
7973 byte_swap_32 (pdf->o_buf[7])
7974 );
7975 }
7976 }
7977 else if (hash_mode == 10600)
7978 {
7979 uint digest_idx = salt.digests_offset + digest_pos;
7980
7981 hashinfo_t **hashinfo_ptr = data.hash_info;
7982 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7983
7984 snprintf (out_buf, len-1, "%s", hash_buf);
7985 }
7986 else if (hash_mode == 10700)
7987 {
7988 uint digest_idx = salt.digests_offset + digest_pos;
7989
7990 hashinfo_t **hashinfo_ptr = data.hash_info;
7991 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7992
7993 snprintf (out_buf, len-1, "%s", hash_buf);
7994 }
7995 else if (hash_mode == 10900)
7996 {
7997 uint digest_idx = salt.digests_offset + digest_pos;
7998
7999 hashinfo_t **hashinfo_ptr = data.hash_info;
8000 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8001
8002 snprintf (out_buf, len-1, "%s", hash_buf);
8003 }
8004 else if (hash_mode == 11100)
8005 {
8006 u32 salt_challenge = salt.salt_buf[0];
8007
8008 salt_challenge = byte_swap_32 (salt_challenge);
8009
8010 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
8011
8012 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
8013 SIGNATURE_POSTGRESQL_AUTH,
8014 user_name,
8015 salt_challenge,
8016 digest_buf[0],
8017 digest_buf[1],
8018 digest_buf[2],
8019 digest_buf[3]);
8020 }
8021 else if (hash_mode == 11200)
8022 {
8023 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
8024 SIGNATURE_MYSQL_AUTH,
8025 (unsigned char *) salt.salt_buf,
8026 digest_buf[0],
8027 digest_buf[1],
8028 digest_buf[2],
8029 digest_buf[3],
8030 digest_buf[4]);
8031 }
8032 else if (hash_mode == 11300)
8033 {
8034 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
8035
8036 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
8037
8038 const uint cry_master_len = bitcoin_wallet->cry_master_len;
8039 const uint ckey_len = bitcoin_wallet->ckey_len;
8040 const uint public_key_len = bitcoin_wallet->public_key_len;
8041
8042 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
8043 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
8044 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
8045
8046 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
8047 {
8048 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
8049
8050 sprintf (cry_master_buf + j, "%02x", ptr[i]);
8051 }
8052
8053 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
8054 {
8055 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
8056
8057 sprintf (ckey_buf + j, "%02x", ptr[i]);
8058 }
8059
8060 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
8061 {
8062 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
8063
8064 sprintf (public_key_buf + j, "%02x", ptr[i]);
8065 }
8066
8067 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
8068 SIGNATURE_BITCOIN_WALLET,
8069 cry_master_len * 2,
8070 cry_master_buf,
8071 salt.salt_len,
8072 (unsigned char *) salt.salt_buf,
8073 salt.salt_iter + 1,
8074 ckey_len * 2,
8075 ckey_buf,
8076 public_key_len * 2,
8077 public_key_buf
8078 );
8079
8080 free (cry_master_buf);
8081 free (ckey_buf);
8082 free (public_key_buf);
8083 }
8084 else if (hash_mode == 11400)
8085 {
8086 uint digest_idx = salt.digests_offset + digest_pos;
8087
8088 hashinfo_t **hashinfo_ptr = data.hash_info;
8089 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8090
8091 snprintf (out_buf, len-1, "%s", hash_buf);
8092 }
8093 else if (hash_mode == 11600)
8094 {
8095 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
8096
8097 seven_zip_t *seven_zip = &seven_zips[salt_pos];
8098
8099 const uint data_len = seven_zip->data_len;
8100
8101 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
8102
8103 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8104 {
8105 const u8 *ptr = (const u8 *) seven_zip->data_buf;
8106
8107 sprintf (data_buf + j, "%02x", ptr[i]);
8108 }
8109
8110 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
8111 SIGNATURE_SEVEN_ZIP,
8112 0,
8113 salt.salt_sign[0],
8114 0,
8115 (char *) seven_zip->salt_buf,
8116 seven_zip->iv_len,
8117 seven_zip->iv_buf[0],
8118 seven_zip->iv_buf[1],
8119 seven_zip->iv_buf[2],
8120 seven_zip->iv_buf[3],
8121 seven_zip->crc,
8122 seven_zip->data_len,
8123 seven_zip->unpack_size,
8124 data_buf);
8125
8126 free (data_buf);
8127 }
8128 else if (hash_mode == 11700)
8129 {
8130 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8131 digest_buf[0],
8132 digest_buf[1],
8133 digest_buf[2],
8134 digest_buf[3],
8135 digest_buf[4],
8136 digest_buf[5],
8137 digest_buf[6],
8138 digest_buf[7]);
8139 }
8140 else if (hash_mode == 11800)
8141 {
8142 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8143 digest_buf[ 0],
8144 digest_buf[ 1],
8145 digest_buf[ 2],
8146 digest_buf[ 3],
8147 digest_buf[ 4],
8148 digest_buf[ 5],
8149 digest_buf[ 6],
8150 digest_buf[ 7],
8151 digest_buf[ 8],
8152 digest_buf[ 9],
8153 digest_buf[10],
8154 digest_buf[11],
8155 digest_buf[12],
8156 digest_buf[13],
8157 digest_buf[14],
8158 digest_buf[15]);
8159 }
8160 else if (hash_mode == 11900)
8161 {
8162 uint digest_idx = salt.digests_offset + digest_pos;
8163
8164 hashinfo_t **hashinfo_ptr = data.hash_info;
8165 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8166
8167 snprintf (out_buf, len-1, "%s", hash_buf);
8168 }
8169 else if (hash_mode == 12000)
8170 {
8171 uint digest_idx = salt.digests_offset + digest_pos;
8172
8173 hashinfo_t **hashinfo_ptr = data.hash_info;
8174 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8175
8176 snprintf (out_buf, len-1, "%s", hash_buf);
8177 }
8178 else if (hash_mode == 12100)
8179 {
8180 uint digest_idx = salt.digests_offset + digest_pos;
8181
8182 hashinfo_t **hashinfo_ptr = data.hash_info;
8183 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8184
8185 snprintf (out_buf, len-1, "%s", hash_buf);
8186 }
8187 else if (hash_mode == 12200)
8188 {
8189 uint *ptr_digest = digest_buf;
8190 uint *ptr_salt = salt.salt_buf;
8191
8192 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8193 SIGNATURE_ECRYPTFS,
8194 ptr_salt[0],
8195 ptr_salt[1],
8196 ptr_digest[0],
8197 ptr_digest[1]);
8198 }
8199 else if (hash_mode == 12300)
8200 {
8201 uint *ptr_digest = digest_buf;
8202 uint *ptr_salt = salt.salt_buf;
8203
8204 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",
8205 ptr_digest[ 0], ptr_digest[ 1],
8206 ptr_digest[ 2], ptr_digest[ 3],
8207 ptr_digest[ 4], ptr_digest[ 5],
8208 ptr_digest[ 6], ptr_digest[ 7],
8209 ptr_digest[ 8], ptr_digest[ 9],
8210 ptr_digest[10], ptr_digest[11],
8211 ptr_digest[12], ptr_digest[13],
8212 ptr_digest[14], ptr_digest[15],
8213 ptr_salt[0],
8214 ptr_salt[1],
8215 ptr_salt[2],
8216 ptr_salt[3]);
8217 }
8218 else if (hash_mode == 12400)
8219 {
8220 // encode iteration count
8221
8222 char salt_iter[5] = { 0 };
8223
8224 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8225 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8226 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8227 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8228 salt_iter[4] = 0;
8229
8230 // encode salt
8231
8232 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8233 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8234 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8235 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8236 ptr_salt[4] = 0;
8237
8238 // encode digest
8239
8240 memset (tmp_buf, 0, sizeof (tmp_buf));
8241
8242 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8243 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8244
8245 memcpy (tmp_buf, digest_buf, 8);
8246
8247 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8248
8249 ptr_plain[11] = 0;
8250
8251 // fill the resulting buffer
8252
8253 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8254 }
8255 else if (hash_mode == 12500)
8256 {
8257 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8258 SIGNATURE_RAR3,
8259 byte_swap_32 (salt.salt_buf[0]),
8260 byte_swap_32 (salt.salt_buf[1]),
8261 salt.salt_buf[2],
8262 salt.salt_buf[3],
8263 salt.salt_buf[4],
8264 salt.salt_buf[5]);
8265 }
8266 else if (hash_mode == 12600)
8267 {
8268 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8269 digest_buf[0] + salt.salt_buf_pc[0],
8270 digest_buf[1] + salt.salt_buf_pc[1],
8271 digest_buf[2] + salt.salt_buf_pc[2],
8272 digest_buf[3] + salt.salt_buf_pc[3],
8273 digest_buf[4] + salt.salt_buf_pc[4],
8274 digest_buf[5] + salt.salt_buf_pc[5],
8275 digest_buf[6] + salt.salt_buf_pc[6],
8276 digest_buf[7] + salt.salt_buf_pc[7]);
8277 }
8278 else if (hash_mode == 12700)
8279 {
8280 uint digest_idx = salt.digests_offset + digest_pos;
8281
8282 hashinfo_t **hashinfo_ptr = data.hash_info;
8283 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8284
8285 snprintf (out_buf, len-1, "%s", hash_buf);
8286 }
8287 else if (hash_mode == 12800)
8288 {
8289 const u8 *ptr = (const u8 *) salt.salt_buf;
8290
8291 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",
8292 SIGNATURE_MS_DRSR,
8293 ptr[0],
8294 ptr[1],
8295 ptr[2],
8296 ptr[3],
8297 ptr[4],
8298 ptr[5],
8299 ptr[6],
8300 ptr[7],
8301 ptr[8],
8302 ptr[9],
8303 salt.salt_iter + 1,
8304 byte_swap_32 (digest_buf[0]),
8305 byte_swap_32 (digest_buf[1]),
8306 byte_swap_32 (digest_buf[2]),
8307 byte_swap_32 (digest_buf[3]),
8308 byte_swap_32 (digest_buf[4]),
8309 byte_swap_32 (digest_buf[5]),
8310 byte_swap_32 (digest_buf[6]),
8311 byte_swap_32 (digest_buf[7])
8312 );
8313 }
8314 else if (hash_mode == 12900)
8315 {
8316 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",
8317 salt.salt_buf[ 4],
8318 salt.salt_buf[ 5],
8319 salt.salt_buf[ 6],
8320 salt.salt_buf[ 7],
8321 salt.salt_buf[ 8],
8322 salt.salt_buf[ 9],
8323 salt.salt_buf[10],
8324 salt.salt_buf[11],
8325 byte_swap_32 (digest_buf[0]),
8326 byte_swap_32 (digest_buf[1]),
8327 byte_swap_32 (digest_buf[2]),
8328 byte_swap_32 (digest_buf[3]),
8329 byte_swap_32 (digest_buf[4]),
8330 byte_swap_32 (digest_buf[5]),
8331 byte_swap_32 (digest_buf[6]),
8332 byte_swap_32 (digest_buf[7]),
8333 salt.salt_buf[ 0],
8334 salt.salt_buf[ 1],
8335 salt.salt_buf[ 2],
8336 salt.salt_buf[ 3]
8337 );
8338 }
8339 else if (hash_mode == 13000)
8340 {
8341 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8342
8343 rar5_t *rar5 = &rar5s[salt_pos];
8344
8345 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8346 salt.salt_buf[0],
8347 salt.salt_buf[1],
8348 salt.salt_buf[2],
8349 salt.salt_buf[3],
8350 salt.salt_sign[0],
8351 rar5->iv[0],
8352 rar5->iv[1],
8353 rar5->iv[2],
8354 rar5->iv[3],
8355 byte_swap_32 (digest_buf[0]),
8356 byte_swap_32 (digest_buf[1])
8357 );
8358 }
8359 else if (hash_mode == 13100)
8360 {
8361 krb5tgs_t *krb5tgss = (krb5tgs_t *) data.esalts_buf;
8362
8363 krb5tgs_t *krb5tgs = &krb5tgss[salt_pos];
8364
8365 u8 *ptr_checksum = (u8 *) krb5tgs->checksum;
8366 u8 *ptr_edata2 = (u8 *) krb5tgs->edata2;
8367
8368 char data[2560 * 4 * 2] = { 0 };
8369
8370 char *ptr_data = data;
8371
8372 for (uint i = 0; i < 16; i++, ptr_data += 2)
8373 sprintf (ptr_data, "%02x", ptr_checksum[i]);
8374
8375 /* skip '$' */
8376 ptr_data++;
8377
8378 for (uint i = 0; i < krb5tgs->edata2_len; i++, ptr_data += 2)
8379 sprintf (ptr_data, "%02x", ptr_edata2[i]);
8380
8381 snprintf (out_buf, len-1, "%s$%s$%s$%s",
8382 SIGNATURE_KRB5TGS,
8383 (char *) krb5tgs->account_info,
8384 data,
8385 data + 33);
8386 }
8387 else if (hash_mode == 13200)
8388 {
8389 snprintf (out_buf, len-1, "%s*%d*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x",
8390 SIGNATURE_AXCRYPT,
8391 salt.salt_iter,
8392 salt.salt_buf[0],
8393 salt.salt_buf[1],
8394 salt.salt_buf[2],
8395 salt.salt_buf[3],
8396 salt.salt_buf[4],
8397 salt.salt_buf[5],
8398 salt.salt_buf[6],
8399 salt.salt_buf[7],
8400 salt.salt_buf[8],
8401 salt.salt_buf[9]);
8402 }
8403 else if (hash_mode == 13300)
8404 {
8405 snprintf (out_buf, len-1, "%s$%08x%08x%08x%08x",
8406 SIGNATURE_AXCRYPT_SHA1,
8407 digest_buf[0],
8408 digest_buf[1],
8409 digest_buf[2],
8410 digest_buf[3]);
8411 }
8412 else if (hash_mode == 13400)
8413 {
8414 keepass_t *keepasss = (keepass_t *) data.esalts_buf;
8415
8416 keepass_t *keepass = &keepasss[salt_pos];
8417
8418 u32 version = (u32) keepass->version;
8419 u32 rounds = salt.salt_iter;
8420 u32 algorithm = (u32) keepass->algorithm;
8421 u32 keyfile_len = (u32) keepass->keyfile_len;
8422
8423 u32 *ptr_final_random_seed = (u32 *) keepass->final_random_seed ;
8424 u32 *ptr_transf_random_seed = (u32 *) keepass->transf_random_seed ;
8425 u32 *ptr_enc_iv = (u32 *) keepass->enc_iv ;
8426 u32 *ptr_contents_hash = (u32 *) keepass->contents_hash ;
8427 u32 *ptr_keyfile = (u32 *) keepass->keyfile ;
8428
8429 /* specific to version 1 */
8430 u32 contents_len;
8431 u32 *ptr_contents;
8432
8433 /* specific to version 2 */
8434 u32 expected_bytes_len;
8435 u32 *ptr_expected_bytes;
8436
8437 u32 final_random_seed_len;
8438 u32 transf_random_seed_len;
8439 u32 enc_iv_len;
8440 u32 contents_hash_len;
8441
8442 transf_random_seed_len = 8;
8443 enc_iv_len = 4;
8444 contents_hash_len = 8;
8445 final_random_seed_len = 8;
8446
8447 if (version == 1)
8448 final_random_seed_len = 4;
8449
8450 snprintf (out_buf, len-1, "%s*%d*%d*%d",
8451 SIGNATURE_KEEPASS,
8452 version,
8453 rounds,
8454 algorithm);
8455
8456 char *ptr_data = out_buf;
8457
8458 ptr_data += strlen(out_buf);
8459
8460 *ptr_data = '*';
8461 ptr_data++;
8462
8463 for (uint i = 0; i < final_random_seed_len; i++, ptr_data += 8)
8464 sprintf (ptr_data, "%08x", ptr_final_random_seed[i]);
8465
8466 *ptr_data = '*';
8467 ptr_data++;
8468
8469 for (uint i = 0; i < transf_random_seed_len; i++, ptr_data += 8)
8470 sprintf (ptr_data, "%08x", ptr_transf_random_seed[i]);
8471
8472 *ptr_data = '*';
8473 ptr_data++;
8474
8475 for (uint i = 0; i < enc_iv_len; i++, ptr_data += 8)
8476 sprintf (ptr_data, "%08x", ptr_enc_iv[i]);
8477
8478 *ptr_data = '*';
8479 ptr_data++;
8480
8481 if (version == 1)
8482 {
8483 contents_len = (u32) keepass->contents_len;
8484 ptr_contents = (u32 *) keepass->contents;
8485
8486 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8487 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8488
8489 *ptr_data = '*';
8490 ptr_data++;
8491
8492 /* inline flag */
8493 *ptr_data = '1';
8494 ptr_data++;
8495
8496 *ptr_data = '*';
8497 ptr_data++;
8498
8499 char ptr_contents_len[10] = { 0 };
8500
8501 sprintf ((char*) ptr_contents_len, "%d", contents_len);
8502
8503 sprintf (ptr_data, "%d", contents_len);
8504
8505 ptr_data += strlen(ptr_contents_len);
8506
8507 *ptr_data = '*';
8508 ptr_data++;
8509
8510 for (uint i = 0; i < contents_len / 4; i++, ptr_data += 8)
8511 sprintf (ptr_data, "%08x", ptr_contents[i]);
8512 }
8513 else if (version == 2)
8514 {
8515 expected_bytes_len = 8;
8516 ptr_expected_bytes = (u32 *) keepass->expected_bytes ;
8517
8518 for (uint i = 0; i < expected_bytes_len; i++, ptr_data += 8)
8519 sprintf (ptr_data, "%08x", ptr_expected_bytes[i]);
8520
8521 *ptr_data = '*';
8522 ptr_data++;
8523
8524 for (uint i = 0; i < contents_hash_len; i++, ptr_data += 8)
8525 sprintf (ptr_data, "%08x", ptr_contents_hash[i]);
8526 }
8527 if (keyfile_len)
8528 {
8529 *ptr_data = '*';
8530 ptr_data++;
8531
8532 /* inline flag */
8533 *ptr_data = '1';
8534 ptr_data++;
8535
8536 *ptr_data = '*';
8537 ptr_data++;
8538
8539 sprintf (ptr_data, "%d", keyfile_len);
8540
8541 ptr_data += 2;
8542
8543 *ptr_data = '*';
8544 ptr_data++;
8545
8546 for (uint i = 0; i < 8; i++, ptr_data += 8)
8547 sprintf (ptr_data, "%08x", ptr_keyfile[i]);
8548 }
8549 }
8550 else if (hash_mode == 13500)
8551 {
8552 pstoken_t *pstokens = (pstoken_t *) data.esalts_buf;
8553
8554 pstoken_t *pstoken = &pstokens[salt_pos];
8555
8556 const u32 salt_len = (pstoken->salt_len > 512) ? 512 : pstoken->salt_len;
8557
8558 char pstoken_tmp[1024 + 1] = { 0 };
8559
8560 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8561 {
8562 const u8 *ptr = (const u8 *) pstoken->salt_buf;
8563
8564 sprintf (pstoken_tmp + j, "%02x", ptr[i]);
8565 }
8566
8567 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x:%s",
8568 digest_buf[0],
8569 digest_buf[1],
8570 digest_buf[2],
8571 digest_buf[3],
8572 digest_buf[4],
8573 pstoken_tmp);
8574 }
8575 else if (hash_mode == 13600)
8576 {
8577 zip2_t *zip2s = (zip2_t *) data.esalts_buf;
8578
8579 zip2_t *zip2 = &zip2s[salt_pos];
8580
8581 const u32 salt_len = zip2->salt_len;
8582
8583 char salt_tmp[32 + 1] = { 0 };
8584
8585 for (uint i = 0, j = 0; i < salt_len; i += 1, j += 2)
8586 {
8587 const u8 *ptr = (const u8 *) zip2->salt_buf;
8588
8589 sprintf (salt_tmp + j, "%02x", ptr[i]);
8590 }
8591
8592 const u32 data_len = zip2->data_len;
8593
8594 char data_tmp[8192 + 1] = { 0 };
8595
8596 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8597 {
8598 const u8 *ptr = (const u8 *) zip2->data_buf;
8599
8600 sprintf (data_tmp + j, "%02x", ptr[i]);
8601 }
8602
8603 const u32 auth_len = zip2->auth_len;
8604
8605 char auth_tmp[20 + 1] = { 0 };
8606
8607 for (uint i = 0, j = 0; i < auth_len; i += 1, j += 2)
8608 {
8609 const u8 *ptr = (const u8 *) zip2->auth_buf;
8610
8611 sprintf (auth_tmp + j, "%02x", ptr[i]);
8612 }
8613
8614 snprintf (out_buf, 255, "%s*%u*%u*%u*%s*%x*%u*%s*%s*%s",
8615 SIGNATURE_ZIP2_START,
8616 zip2->type,
8617 zip2->mode,
8618 zip2->magic,
8619 salt_tmp,
8620 zip2->verify_bytes,
8621 zip2->compress_length,
8622 data_tmp,
8623 auth_tmp,
8624 SIGNATURE_ZIP2_STOP);
8625 }
8626 else if ((hash_mode >= 13700) && (hash_mode <= 13799))
8627 {
8628 snprintf (out_buf, len-1, "%s", hashfile);
8629 }
8630 else
8631 {
8632 if (hash_type == HASH_TYPE_MD4)
8633 {
8634 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8635 digest_buf[0],
8636 digest_buf[1],
8637 digest_buf[2],
8638 digest_buf[3]);
8639 }
8640 else if (hash_type == HASH_TYPE_MD5)
8641 {
8642 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8643 digest_buf[0],
8644 digest_buf[1],
8645 digest_buf[2],
8646 digest_buf[3]);
8647 }
8648 else if (hash_type == HASH_TYPE_SHA1)
8649 {
8650 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8651 digest_buf[0],
8652 digest_buf[1],
8653 digest_buf[2],
8654 digest_buf[3],
8655 digest_buf[4]);
8656 }
8657 else if (hash_type == HASH_TYPE_SHA256)
8658 {
8659 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8660 digest_buf[0],
8661 digest_buf[1],
8662 digest_buf[2],
8663 digest_buf[3],
8664 digest_buf[4],
8665 digest_buf[5],
8666 digest_buf[6],
8667 digest_buf[7]);
8668 }
8669 else if (hash_type == HASH_TYPE_SHA384)
8670 {
8671 uint *ptr = digest_buf;
8672
8673 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8674 ptr[ 1], ptr[ 0],
8675 ptr[ 3], ptr[ 2],
8676 ptr[ 5], ptr[ 4],
8677 ptr[ 7], ptr[ 6],
8678 ptr[ 9], ptr[ 8],
8679 ptr[11], ptr[10]);
8680 }
8681 else if (hash_type == HASH_TYPE_SHA512)
8682 {
8683 uint *ptr = digest_buf;
8684
8685 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8686 ptr[ 1], ptr[ 0],
8687 ptr[ 3], ptr[ 2],
8688 ptr[ 5], ptr[ 4],
8689 ptr[ 7], ptr[ 6],
8690 ptr[ 9], ptr[ 8],
8691 ptr[11], ptr[10],
8692 ptr[13], ptr[12],
8693 ptr[15], ptr[14]);
8694 }
8695 else if (hash_type == HASH_TYPE_LM)
8696 {
8697 snprintf (out_buf, len-1, "%08x%08x",
8698 digest_buf[0],
8699 digest_buf[1]);
8700 }
8701 else if (hash_type == HASH_TYPE_ORACLEH)
8702 {
8703 snprintf (out_buf, len-1, "%08X%08X",
8704 digest_buf[0],
8705 digest_buf[1]);
8706 }
8707 else if (hash_type == HASH_TYPE_BCRYPT)
8708 {
8709 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8710 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8711
8712 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8713
8714 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8715 }
8716 else if (hash_type == HASH_TYPE_KECCAK)
8717 {
8718 uint *ptr = digest_buf;
8719
8720 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",
8721 ptr[ 1], ptr[ 0],
8722 ptr[ 3], ptr[ 2],
8723 ptr[ 5], ptr[ 4],
8724 ptr[ 7], ptr[ 6],
8725 ptr[ 9], ptr[ 8],
8726 ptr[11], ptr[10],
8727 ptr[13], ptr[12],
8728 ptr[15], ptr[14],
8729 ptr[17], ptr[16],
8730 ptr[19], ptr[18],
8731 ptr[21], ptr[20],
8732 ptr[23], ptr[22],
8733 ptr[25], ptr[24],
8734 ptr[27], ptr[26],
8735 ptr[29], ptr[28],
8736 ptr[31], ptr[30],
8737 ptr[33], ptr[32],
8738 ptr[35], ptr[34],
8739 ptr[37], ptr[36],
8740 ptr[39], ptr[38],
8741 ptr[41], ptr[30],
8742 ptr[43], ptr[42],
8743 ptr[45], ptr[44],
8744 ptr[47], ptr[46],
8745 ptr[49], ptr[48]
8746 );
8747
8748 out_buf[salt.keccak_mdlen * 2] = 0;
8749 }
8750 else if (hash_type == HASH_TYPE_RIPEMD160)
8751 {
8752 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8753 digest_buf[0],
8754 digest_buf[1],
8755 digest_buf[2],
8756 digest_buf[3],
8757 digest_buf[4]);
8758 }
8759 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8760 {
8761 digest_buf[ 0] = digest_buf[ 0];
8762 digest_buf[ 1] = digest_buf[ 1];
8763 digest_buf[ 2] = digest_buf[ 2];
8764 digest_buf[ 3] = digest_buf[ 3];
8765 digest_buf[ 4] = digest_buf[ 4];
8766 digest_buf[ 5] = digest_buf[ 5];
8767 digest_buf[ 6] = digest_buf[ 6];
8768 digest_buf[ 7] = digest_buf[ 7];
8769 digest_buf[ 8] = digest_buf[ 8];
8770 digest_buf[ 9] = digest_buf[ 9];
8771 digest_buf[10] = digest_buf[10];
8772 digest_buf[11] = digest_buf[11];
8773 digest_buf[12] = digest_buf[12];
8774 digest_buf[13] = digest_buf[13];
8775 digest_buf[14] = digest_buf[14];
8776 digest_buf[15] = digest_buf[15];
8777
8778 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8779 digest_buf[ 0],
8780 digest_buf[ 1],
8781 digest_buf[ 2],
8782 digest_buf[ 3],
8783 digest_buf[ 4],
8784 digest_buf[ 5],
8785 digest_buf[ 6],
8786 digest_buf[ 7],
8787 digest_buf[ 8],
8788 digest_buf[ 9],
8789 digest_buf[10],
8790 digest_buf[11],
8791 digest_buf[12],
8792 digest_buf[13],
8793 digest_buf[14],
8794 digest_buf[15]);
8795 }
8796 else if (hash_type == HASH_TYPE_GOST)
8797 {
8798 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8799 digest_buf[0],
8800 digest_buf[1],
8801 digest_buf[2],
8802 digest_buf[3],
8803 digest_buf[4],
8804 digest_buf[5],
8805 digest_buf[6],
8806 digest_buf[7]);
8807 }
8808 else if (hash_type == HASH_TYPE_MYSQL)
8809 {
8810 snprintf (out_buf, len-1, "%08x%08x",
8811 digest_buf[0],
8812 digest_buf[1]);
8813 }
8814 else if (hash_type == HASH_TYPE_LOTUS5)
8815 {
8816 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8817 digest_buf[0],
8818 digest_buf[1],
8819 digest_buf[2],
8820 digest_buf[3]);
8821 }
8822 else if (hash_type == HASH_TYPE_LOTUS6)
8823 {
8824 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8825 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8826 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8827 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8828
8829 char buf[16] = { 0 };
8830
8831 memcpy (buf + 0, salt.salt_buf, 5);
8832 memcpy (buf + 5, digest_buf, 9);
8833
8834 buf[3] -= -4;
8835
8836 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8837
8838 tmp_buf[18] = salt.salt_buf_pc[7];
8839 tmp_buf[19] = 0;
8840
8841 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8842 }
8843 else if (hash_type == HASH_TYPE_LOTUS8)
8844 {
8845 char buf[52] = { 0 };
8846
8847 // salt
8848
8849 memcpy (buf + 0, salt.salt_buf, 16);
8850
8851 buf[3] -= -4;
8852
8853 // iteration
8854
8855 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8856
8857 // chars
8858
8859 buf[26] = salt.salt_buf_pc[0];
8860 buf[27] = salt.salt_buf_pc[1];
8861
8862 // digest
8863
8864 memcpy (buf + 28, digest_buf, 8);
8865
8866 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8867
8868 tmp_buf[49] = 0;
8869
8870 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8871 }
8872 else if (hash_type == HASH_TYPE_CRC32)
8873 {
8874 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8875 }
8876 }
8877
8878 if (salt_type == SALT_TYPE_INTERN)
8879 {
8880 size_t pos = strlen (out_buf);
8881
8882 out_buf[pos] = data.separator;
8883
8884 char *ptr = (char *) salt.salt_buf;
8885
8886 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8887
8888 out_buf[pos + 1 + salt.salt_len] = 0;
8889 }
8890 }
8891
8892 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8893 {
8894 memset (hccap, 0, sizeof (hccap_t));
8895
8896 salt_t *salt = &data.salts_buf[salt_pos];
8897
8898 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8899
8900 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8901 wpa_t *wpa = &wpas[salt_pos];
8902
8903 hccap->keyver = wpa->keyver;
8904
8905 hccap->eapol_size = wpa->eapol_size;
8906
8907 if (wpa->keyver != 1)
8908 {
8909 uint eapol_tmp[64] = { 0 };
8910
8911 for (uint i = 0; i < 64; i++)
8912 {
8913 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8914 }
8915
8916 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8917 }
8918 else
8919 {
8920 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8921 }
8922
8923 memcpy (hccap->mac1, wpa->orig_mac1, 6);
8924 memcpy (hccap->mac2, wpa->orig_mac2, 6);
8925 memcpy (hccap->nonce1, wpa->orig_nonce1, 32);
8926 memcpy (hccap->nonce2, wpa->orig_nonce2, 32);
8927
8928 char *digests_buf_ptr = (char *) data.digests_buf;
8929
8930 uint dgst_size = data.dgst_size;
8931
8932 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8933
8934 if (wpa->keyver != 1)
8935 {
8936 uint digest_tmp[4] = { 0 };
8937
8938 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8939 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8940 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8941 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8942
8943 memcpy (hccap->keymic, digest_tmp, 16);
8944 }
8945 else
8946 {
8947 memcpy (hccap->keymic, digest_ptr, 16);
8948 }
8949 }
8950
8951 void SuspendThreads ()
8952 {
8953 if (data.devices_status == STATUS_RUNNING)
8954 {
8955 hc_timer_set (&data.timer_paused);
8956
8957 data.devices_status = STATUS_PAUSED;
8958
8959 log_info ("Paused");
8960 }
8961 }
8962
8963 void ResumeThreads ()
8964 {
8965 if (data.devices_status == STATUS_PAUSED)
8966 {
8967 double ms_paused;
8968
8969 hc_timer_get (data.timer_paused, ms_paused);
8970
8971 data.ms_paused += ms_paused;
8972
8973 data.devices_status = STATUS_RUNNING;
8974
8975 log_info ("Resumed");
8976 }
8977 }
8978
8979 void bypass ()
8980 {
8981 if (data.devices_status != STATUS_RUNNING) return;
8982
8983 data.devices_status = STATUS_BYPASS;
8984
8985 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8986 }
8987
8988 void stop_at_checkpoint ()
8989 {
8990 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8991 {
8992 if (data.devices_status != STATUS_RUNNING) return;
8993 }
8994
8995 // this feature only makes sense if --restore-disable was not specified
8996
8997 if (data.restore_disable == 1)
8998 {
8999 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
9000
9001 return;
9002 }
9003
9004 // check if monitoring of Restore Point updates should be enabled or disabled
9005
9006 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
9007 {
9008 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
9009
9010 // save the current restore point value
9011
9012 data.checkpoint_cur_words = get_lowest_words_done ();
9013
9014 log_info ("Checkpoint enabled: will quit at next Restore Point update");
9015 }
9016 else
9017 {
9018 data.devices_status = STATUS_RUNNING;
9019
9020 // reset the global value for checkpoint checks
9021
9022 data.checkpoint_cur_words = 0;
9023
9024 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
9025 }
9026 }
9027
9028 void myabort ()
9029 {
9030 if (data.devices_status == STATUS_INIT) return;
9031 if (data.devices_status == STATUS_STARTING) return;
9032
9033 data.devices_status = STATUS_ABORTED;
9034 }
9035
9036 void myquit ()
9037 {
9038 if (data.devices_status == STATUS_INIT) return;
9039 if (data.devices_status == STATUS_STARTING) return;
9040
9041 data.devices_status = STATUS_QUIT;
9042 }
9043
9044 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
9045 {
9046 FILE *fp = fopen (kernel_file, "rb");
9047
9048 if (fp != NULL)
9049 {
9050 struct stat st;
9051
9052 memset (&st, 0, sizeof (st));
9053
9054 stat (kernel_file, &st);
9055
9056 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
9057
9058 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
9059
9060 if (num_read != (size_t) st.st_size)
9061 {
9062 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9063
9064 exit (-1);
9065 }
9066
9067 fclose (fp);
9068
9069 buf[st.st_size] = 0;
9070
9071 for (int i = 0; i < num_devices; i++)
9072 {
9073 kernel_lengths[i] = (size_t) st.st_size;
9074
9075 kernel_sources[i] = buf;
9076 }
9077 }
9078 else
9079 {
9080 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
9081
9082 exit (-1);
9083 }
9084
9085 return;
9086 }
9087
9088 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
9089 {
9090 if (binary_size > 0)
9091 {
9092 FILE *fp = fopen (dst, "wb");
9093
9094 lock_file (fp);
9095 fwrite (binary, sizeof (u8), binary_size, fp);
9096
9097 fflush (fp);
9098 fclose (fp);
9099 }
9100 }
9101
9102 /**
9103 * restore
9104 */
9105
9106 restore_data_t *init_restore (int argc, char **argv)
9107 {
9108 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
9109
9110 if (data.restore_disable == 0)
9111 {
9112 FILE *fp = fopen (data.eff_restore_file, "rb");
9113
9114 if (fp)
9115 {
9116 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
9117
9118 if (nread != 1)
9119 {
9120 log_error ("ERROR: cannot read %s", data.eff_restore_file);
9121
9122 exit (-1);
9123 }
9124
9125 fclose (fp);
9126
9127 if (rd->pid)
9128 {
9129 char *pidbin = (char *) mymalloc (HCBUFSIZ);
9130
9131 int pidbin_len = -1;
9132
9133 #ifdef _POSIX
9134 snprintf (pidbin, HCBUFSIZ - 1, "/proc/%d/cmdline", rd->pid);
9135
9136 FILE *fd = fopen (pidbin, "rb");
9137
9138 if (fd)
9139 {
9140 pidbin_len = fread (pidbin, 1, HCBUFSIZ, fd);
9141
9142 pidbin[pidbin_len] = 0;
9143
9144 fclose (fd);
9145
9146 char *argv0_r = strrchr (argv[0], '/');
9147
9148 char *pidbin_r = strrchr (pidbin, '/');
9149
9150 if (argv0_r == NULL) argv0_r = argv[0];
9151
9152 if (pidbin_r == NULL) pidbin_r = pidbin;
9153
9154 if (strcmp (argv0_r, pidbin_r) == 0)
9155 {
9156 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
9157
9158 exit (-1);
9159 }
9160 }
9161
9162 #elif _WIN
9163 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
9164
9165 char *pidbin2 = (char *) mymalloc (HCBUFSIZ);
9166
9167 int pidbin2_len = -1;
9168
9169 pidbin_len = GetModuleFileName (NULL, pidbin, HCBUFSIZ);
9170 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, HCBUFSIZ);
9171
9172 pidbin[pidbin_len] = 0;
9173 pidbin2[pidbin2_len] = 0;
9174
9175 if (pidbin2_len)
9176 {
9177 if (strcmp (pidbin, pidbin2) == 0)
9178 {
9179 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
9180
9181 exit (-1);
9182 }
9183 }
9184
9185 myfree (pidbin2);
9186
9187 #endif
9188
9189 myfree (pidbin);
9190 }
9191
9192 if (rd->version_bin < RESTORE_MIN)
9193 {
9194 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
9195
9196 exit (-1);
9197 }
9198 }
9199 }
9200
9201 memset (rd, 0, sizeof (restore_data_t));
9202
9203 rd->version_bin = VERSION_BIN;
9204
9205 #ifdef _POSIX
9206 rd->pid = getpid ();
9207 #elif _WIN
9208 rd->pid = GetCurrentProcessId ();
9209 #endif
9210
9211 if (getcwd (rd->cwd, 255) == NULL)
9212 {
9213 myfree (rd);
9214
9215 return (NULL);
9216 }
9217
9218 rd->argc = argc;
9219 rd->argv = argv;
9220
9221 return (rd);
9222 }
9223
9224 void read_restore (const char *eff_restore_file, restore_data_t *rd)
9225 {
9226 FILE *fp = fopen (eff_restore_file, "rb");
9227
9228 if (fp == NULL)
9229 {
9230 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
9231
9232 exit (-1);
9233 }
9234
9235 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
9236 {
9237 log_error ("ERROR: cannot read %s", eff_restore_file);
9238
9239 exit (-1);
9240 }
9241
9242 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
9243
9244 char *buf = (char *) mymalloc (HCBUFSIZ);
9245
9246 for (uint i = 0; i < rd->argc; i++)
9247 {
9248 if (fgets (buf, HCBUFSIZ - 1, fp) == NULL)
9249 {
9250 log_error ("ERROR: cannot read %s", eff_restore_file);
9251
9252 exit (-1);
9253 }
9254
9255 size_t len = strlen (buf);
9256
9257 if (len) buf[len - 1] = 0;
9258
9259 rd->argv[i] = mystrdup (buf);
9260 }
9261
9262 myfree (buf);
9263
9264 fclose (fp);
9265
9266 log_info ("INFO: Changing current working directory to the path found within the .restore file: '%s'", rd->cwd);
9267
9268 if (chdir (rd->cwd))
9269 {
9270 log_error ("ERROR: The directory '%s' does not exist. It is needed to restore (--restore) the session.\n"
9271 " You could either create this directory (or link it) or update the .restore file using e.g. the analyze_hc_restore.pl tool:\n"
9272 " https://github.com/philsmd/analyze_hc_restore\n"
9273 " The directory must be relative to (or contain) all files/folders mentioned within the command line.", rd->cwd);
9274
9275 exit (-1);
9276 }
9277 }
9278
9279 u64 get_lowest_words_done ()
9280 {
9281 u64 words_cur = -1;
9282
9283 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
9284 {
9285 hc_device_param_t *device_param = &data.devices_param[device_id];
9286
9287 if (device_param->skipped) continue;
9288
9289 const u64 words_done = device_param->words_done;
9290
9291 if (words_done < words_cur) words_cur = words_done;
9292 }
9293
9294 // It's possible that a device's workload isn't finished right after a restore-case.
9295 // In that case, this function would return 0 and overwrite the real restore point
9296 // There's also data.words_cur which is set to rd->words_cur but it changes while
9297 // the attack is running therefore we should stick to rd->words_cur.
9298 // Note that -s influences rd->words_cur we should keep a close look on that.
9299
9300 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
9301
9302 return words_cur;
9303 }
9304
9305 void write_restore (const char *new_restore_file, restore_data_t *rd)
9306 {
9307 u64 words_cur = get_lowest_words_done ();
9308
9309 rd->words_cur = words_cur;
9310
9311 FILE *fp = fopen (new_restore_file, "wb");
9312
9313 if (fp == NULL)
9314 {
9315 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
9316
9317 exit (-1);
9318 }
9319
9320 if (setvbuf (fp, NULL, _IONBF, 0))
9321 {
9322 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
9323
9324 exit (-1);
9325 }
9326
9327 fwrite (rd, sizeof (restore_data_t), 1, fp);
9328
9329 for (uint i = 0; i < rd->argc; i++)
9330 {
9331 fprintf (fp, "%s", rd->argv[i]);
9332 fputc ('\n', fp);
9333 }
9334
9335 fflush (fp);
9336
9337 fsync (fileno (fp));
9338
9339 fclose (fp);
9340 }
9341
9342 void cycle_restore ()
9343 {
9344 const char *eff_restore_file = data.eff_restore_file;
9345 const char *new_restore_file = data.new_restore_file;
9346
9347 restore_data_t *rd = data.rd;
9348
9349 write_restore (new_restore_file, rd);
9350
9351 struct stat st;
9352
9353 memset (&st, 0, sizeof(st));
9354
9355 if (stat (eff_restore_file, &st) == 0)
9356 {
9357 if (unlink (eff_restore_file))
9358 {
9359 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
9360 }
9361 }
9362
9363 if (rename (new_restore_file, eff_restore_file))
9364 {
9365 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
9366 }
9367 }
9368
9369 void check_checkpoint ()
9370 {
9371 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9372
9373 u64 words_cur = get_lowest_words_done ();
9374
9375 if (words_cur != data.checkpoint_cur_words)
9376 {
9377 myabort ();
9378 }
9379 }
9380
9381 /**
9382 * tuning db
9383 */
9384
9385 void tuning_db_destroy (tuning_db_t *tuning_db)
9386 {
9387 int i;
9388
9389 for (i = 0; i < tuning_db->alias_cnt; i++)
9390 {
9391 tuning_db_alias_t *alias = &tuning_db->alias_buf[i];
9392
9393 myfree (alias->device_name);
9394 myfree (alias->alias_name);
9395 }
9396
9397 for (i = 0; i < tuning_db->entry_cnt; i++)
9398 {
9399 tuning_db_entry_t *entry = &tuning_db->entry_buf[i];
9400
9401 myfree (entry->device_name);
9402 }
9403
9404 myfree (tuning_db->alias_buf);
9405 myfree (tuning_db->entry_buf);
9406
9407 myfree (tuning_db);
9408 }
9409
9410 tuning_db_t *tuning_db_alloc (FILE *fp)
9411 {
9412 tuning_db_t *tuning_db = (tuning_db_t *) mymalloc (sizeof (tuning_db_t));
9413
9414 int num_lines = count_lines (fp);
9415
9416 // a bit over-allocated
9417
9418 tuning_db->alias_buf = (tuning_db_alias_t *) mycalloc (num_lines + 1, sizeof (tuning_db_alias_t));
9419 tuning_db->alias_cnt = 0;
9420
9421 tuning_db->entry_buf = (tuning_db_entry_t *) mycalloc (num_lines + 1, sizeof (tuning_db_entry_t));
9422 tuning_db->entry_cnt = 0;
9423
9424 return tuning_db;
9425 }
9426
9427 tuning_db_t *tuning_db_init (const char *tuning_db_file)
9428 {
9429 FILE *fp = fopen (tuning_db_file, "rb");
9430
9431 if (fp == NULL)
9432 {
9433 log_error ("%s: %s", tuning_db_file, strerror (errno));
9434
9435 exit (-1);
9436 }
9437
9438 tuning_db_t *tuning_db = tuning_db_alloc (fp);
9439
9440 rewind (fp);
9441
9442 int line_num = 0;
9443
9444 char *buf = (char *) mymalloc (HCBUFSIZ);
9445
9446 while (!feof (fp))
9447 {
9448 char *line_buf = fgets (buf, HCBUFSIZ - 1, fp);
9449
9450 if (line_buf == NULL) break;
9451
9452 line_num++;
9453
9454 const int line_len = in_superchop (line_buf);
9455
9456 if (line_len == 0) continue;
9457
9458 if (line_buf[0] == '#') continue;
9459
9460 // start processing
9461
9462 char *token_ptr[7] = { NULL };
9463
9464 int token_cnt = 0;
9465
9466 char *next = strtok (line_buf, "\t ");
9467
9468 token_ptr[token_cnt] = next;
9469
9470 token_cnt++;
9471
9472 while ((next = strtok (NULL, "\t ")) != NULL)
9473 {
9474 token_ptr[token_cnt] = next;
9475
9476 token_cnt++;
9477 }
9478
9479 if (token_cnt == 2)
9480 {
9481 char *device_name = token_ptr[0];
9482 char *alias_name = token_ptr[1];
9483
9484 tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt];
9485
9486 alias->device_name = mystrdup (device_name);
9487 alias->alias_name = mystrdup (alias_name);
9488
9489 tuning_db->alias_cnt++;
9490 }
9491 else if (token_cnt == 6)
9492 {
9493 if ((token_ptr[1][0] != '0') &&
9494 (token_ptr[1][0] != '1') &&
9495 (token_ptr[1][0] != '3') &&
9496 (token_ptr[1][0] != '*'))
9497 {
9498 log_info ("WARNING: Tuning-db: Invalid attack_mode '%c' in Line '%u'", token_ptr[1][0], line_num);
9499
9500 continue;
9501 }
9502
9503 if ((token_ptr[3][0] != '1') &&
9504 (token_ptr[3][0] != '2') &&
9505 (token_ptr[3][0] != '4') &&
9506 (token_ptr[3][0] != '8') &&
9507 (token_ptr[3][0] != 'N'))
9508 {
9509 log_info ("WARNING: Tuning-db: Invalid vector_width '%c' in Line '%u'", token_ptr[3][0], line_num);
9510
9511 continue;
9512 }
9513
9514 char *device_name = token_ptr[0];
9515
9516 int attack_mode = -1;
9517 int hash_type = -1;
9518 int vector_width = -1;
9519 int kernel_accel = -1;
9520 int kernel_loops = -1;
9521
9522 if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]);
9523 if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]);
9524 if (token_ptr[3][0] != 'N') vector_width = atoi (token_ptr[3]);
9525
9526 if (token_ptr[4][0] != 'A')
9527 {
9528 kernel_accel = atoi (token_ptr[4]);
9529
9530 if ((kernel_accel < 1) || (kernel_accel > 1024))
9531 {
9532 log_info ("WARNING: Tuning-db: Invalid kernel_accel '%d' in Line '%u'", kernel_accel, line_num);
9533
9534 continue;
9535 }
9536 }
9537 else
9538 {
9539 kernel_accel = 0;
9540 }
9541
9542 if (token_ptr[5][0] != 'A')
9543 {
9544 kernel_loops = atoi (token_ptr[5]);
9545
9546 if ((kernel_loops < 1) || (kernel_loops > 1024))
9547 {
9548 log_info ("WARNING: Tuning-db: Invalid kernel_loops '%d' in Line '%u'", kernel_loops, line_num);
9549
9550 continue;
9551 }
9552 }
9553 else
9554 {
9555 kernel_loops = 0;
9556 }
9557
9558 tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt];
9559
9560 entry->device_name = mystrdup (device_name);
9561 entry->attack_mode = attack_mode;
9562 entry->hash_type = hash_type;
9563 entry->vector_width = vector_width;
9564 entry->kernel_accel = kernel_accel;
9565 entry->kernel_loops = kernel_loops;
9566
9567 tuning_db->entry_cnt++;
9568 }
9569 else
9570 {
9571 log_info ("WARNING: Tuning-db: Invalid number of token in Line '%u'", line_num);
9572
9573 continue;
9574 }
9575 }
9576
9577 myfree (buf);
9578
9579 fclose (fp);
9580
9581 // todo: print loaded 'cnt' message
9582
9583 // sort the database
9584
9585 qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9586 qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9587
9588 return tuning_db;
9589 }
9590
9591 tuning_db_entry_t *tuning_db_search (tuning_db_t *tuning_db, hc_device_param_t *device_param, int attack_mode, int hash_type)
9592 {
9593 static tuning_db_entry_t s;
9594
9595 // first we need to convert all spaces in the device_name to underscore
9596
9597 char *device_name_nospace = strdup (device_param->device_name);
9598
9599 int device_name_length = strlen (device_name_nospace);
9600
9601 int i;
9602
9603 for (i = 0; i < device_name_length; i++)
9604 {
9605 if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_';
9606 }
9607
9608 // find out if there's an alias configured
9609
9610 tuning_db_alias_t a;
9611
9612 a.device_name = device_name_nospace;
9613
9614 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);
9615
9616 char *alias_name = (alias == NULL) ? NULL : alias->alias_name;
9617
9618 // attack-mode 6 and 7 are attack-mode 1 basically
9619
9620 if (attack_mode == 6) attack_mode = 1;
9621 if (attack_mode == 7) attack_mode = 1;
9622
9623 // bsearch is not ideal but fast enough
9624
9625 s.device_name = device_name_nospace;
9626 s.attack_mode = attack_mode;
9627 s.hash_type = hash_type;
9628
9629 tuning_db_entry_t *entry = NULL;
9630
9631 // this will produce all 2^3 combinations required
9632
9633 for (i = 0; i < 8; i++)
9634 {
9635 s.device_name = (i & 1) ? "*" : device_name_nospace;
9636 s.attack_mode = (i & 2) ? -1 : attack_mode;
9637 s.hash_type = (i & 4) ? -1 : hash_type;
9638
9639 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9640
9641 if (entry != NULL) break;
9642
9643 // in non-wildcard mode do some additional checks:
9644
9645 if ((i & 1) == 0)
9646 {
9647 // in case we have an alias-name
9648
9649 if (alias_name != NULL)
9650 {
9651 s.device_name = alias_name;
9652
9653 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9654
9655 if (entry != NULL) break;
9656 }
9657
9658 // or by device type
9659
9660 if (device_param->device_type & CL_DEVICE_TYPE_CPU)
9661 {
9662 s.device_name = "DEVICE_TYPE_CPU";
9663 }
9664 else if (device_param->device_type & CL_DEVICE_TYPE_GPU)
9665 {
9666 s.device_name = "DEVICE_TYPE_GPU";
9667 }
9668 else if (device_param->device_type & CL_DEVICE_TYPE_ACCELERATOR)
9669 {
9670 s.device_name = "DEVICE_TYPE_ACCELERATOR";
9671 }
9672
9673 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9674
9675 if (entry != NULL) break;
9676 }
9677 }
9678
9679 // free converted device_name
9680
9681 myfree (device_name_nospace);
9682
9683 return entry;
9684 }
9685
9686 /**
9687 * parser
9688 */
9689
9690 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9691 {
9692 u8 tmp[256] = { 0 };
9693
9694 if (salt_len > sizeof (tmp))
9695 {
9696 return UINT_MAX;
9697 }
9698
9699 memcpy (tmp, in, salt_len);
9700
9701 if (data.opts_type & OPTS_TYPE_ST_HEX)
9702 {
9703 if ((salt_len % 2) == 0)
9704 {
9705 u32 new_salt_len = salt_len / 2;
9706
9707 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9708 {
9709 u8 p0 = tmp[j + 0];
9710 u8 p1 = tmp[j + 1];
9711
9712 tmp[i] = hex_convert (p1) << 0;
9713 tmp[i] |= hex_convert (p0) << 4;
9714 }
9715
9716 salt_len = new_salt_len;
9717 }
9718 else
9719 {
9720 return UINT_MAX;
9721 }
9722 }
9723 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9724 {
9725 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9726 }
9727
9728 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9729
9730 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9731 {
9732 if (salt_len < 20)
9733 {
9734 u32 *tmp_uint = (u32 *) tmp;
9735
9736 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9737 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9738 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9739 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9740 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9741 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9742 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9743 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9744 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9745 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9746
9747 salt_len = salt_len * 2;
9748 }
9749 else
9750 {
9751 return UINT_MAX;
9752 }
9753 }
9754
9755 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9756 {
9757 lowercase (tmp, salt_len);
9758 }
9759
9760 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9761 {
9762 uppercase (tmp, salt_len);
9763 }
9764
9765 u32 len = salt_len;
9766
9767 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9768 {
9769 tmp[len++] = 0x80;
9770 }
9771
9772 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9773 {
9774 tmp[len++] = 0x01;
9775 }
9776
9777 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9778 {
9779 u32 *tmp_uint = (uint *) tmp;
9780
9781 u32 max = len / 4;
9782
9783 if (len % 4) max++;
9784
9785 for (u32 i = 0; i < max; i++)
9786 {
9787 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9788 }
9789
9790 // Important: we may need to increase the length of memcpy since
9791 // we don't want to "loose" some swapped bytes (could happen if
9792 // they do not perfectly fit in the 4-byte blocks)
9793 // Memcpy does always copy the bytes in the BE order, but since
9794 // we swapped them, some important bytes could be in positions
9795 // we normally skip with the original len
9796
9797 if (len % 4) len += 4 - (len % 4);
9798 }
9799
9800 memcpy (out, tmp, len);
9801
9802 return (salt_len);
9803 }
9804
9805 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9806 {
9807 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9808
9809 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9810
9811 u32 *digest = (u32 *) hash_buf->digest;
9812
9813 salt_t *salt = hash_buf->salt;
9814
9815 memcpy ((char *) salt->salt_sign, input_buf, 6);
9816
9817 char *iter_pos = input_buf + 4;
9818
9819 salt->salt_iter = 1 << atoi (iter_pos);
9820
9821 char *salt_pos = strchr (iter_pos, '$');
9822
9823 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9824
9825 salt_pos++;
9826
9827 uint salt_len = 16;
9828
9829 salt->salt_len = salt_len;
9830
9831 u8 tmp_buf[100] = { 0 };
9832
9833 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9834
9835 char *salt_buf_ptr = (char *) salt->salt_buf;
9836
9837 memcpy (salt_buf_ptr, tmp_buf, 16);
9838
9839 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9840 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9841 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9842 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9843
9844 char *hash_pos = salt_pos + 22;
9845
9846 memset (tmp_buf, 0, sizeof (tmp_buf));
9847
9848 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9849
9850 memcpy (digest, tmp_buf, 24);
9851
9852 digest[0] = byte_swap_32 (digest[0]);
9853 digest[1] = byte_swap_32 (digest[1]);
9854 digest[2] = byte_swap_32 (digest[2]);
9855 digest[3] = byte_swap_32 (digest[3]);
9856 digest[4] = byte_swap_32 (digest[4]);
9857 digest[5] = byte_swap_32 (digest[5]);
9858
9859 digest[5] &= ~0xff; // its just 23 not 24 !
9860
9861 return (PARSER_OK);
9862 }
9863
9864 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9865 {
9866 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9867
9868 u32 *digest = (u32 *) hash_buf->digest;
9869
9870 u8 tmp_buf[100] = { 0 };
9871
9872 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9873
9874 memcpy (digest, tmp_buf, 32);
9875
9876 digest[0] = byte_swap_32 (digest[0]);
9877 digest[1] = byte_swap_32 (digest[1]);
9878 digest[2] = byte_swap_32 (digest[2]);
9879 digest[3] = byte_swap_32 (digest[3]);
9880 digest[4] = byte_swap_32 (digest[4]);
9881 digest[5] = byte_swap_32 (digest[5]);
9882 digest[6] = byte_swap_32 (digest[6]);
9883 digest[7] = byte_swap_32 (digest[7]);
9884
9885 digest[0] -= SHA256M_A;
9886 digest[1] -= SHA256M_B;
9887 digest[2] -= SHA256M_C;
9888 digest[3] -= SHA256M_D;
9889 digest[4] -= SHA256M_E;
9890 digest[5] -= SHA256M_F;
9891 digest[6] -= SHA256M_G;
9892 digest[7] -= SHA256M_H;
9893
9894 return (PARSER_OK);
9895 }
9896
9897 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9898 {
9899 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9900
9901 u32 *digest = (u32 *) hash_buf->digest;
9902
9903 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9904 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9905
9906 digest[0] = byte_swap_32 (digest[0]);
9907 digest[1] = byte_swap_32 (digest[1]);
9908
9909 uint tt;
9910
9911 IP (digest[0], digest[1], tt);
9912
9913 digest[0] = digest[0];
9914 digest[1] = digest[1];
9915 digest[2] = 0;
9916 digest[3] = 0;
9917
9918 return (PARSER_OK);
9919 }
9920
9921 int arubaos_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9922 {
9923 if ((input_len < DISPLAY_LEN_MIN_125) || (input_len > DISPLAY_LEN_MAX_125)) return (PARSER_GLOBAL_LENGTH);
9924
9925 if ((input_buf[8] != '0') || (input_buf[9] != '1')) return (PARSER_SIGNATURE_UNMATCHED);
9926
9927 u32 *digest = (u32 *) hash_buf->digest;
9928
9929 salt_t *salt = hash_buf->salt;
9930
9931 char *hash_pos = input_buf + 10;
9932
9933 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9934 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9935 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9936 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9937 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9938
9939 digest[0] -= SHA1M_A;
9940 digest[1] -= SHA1M_B;
9941 digest[2] -= SHA1M_C;
9942 digest[3] -= SHA1M_D;
9943 digest[4] -= SHA1M_E;
9944
9945 uint salt_len = 10;
9946
9947 char *salt_buf_ptr = (char *) salt->salt_buf;
9948
9949 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9950
9951 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9952
9953 salt->salt_len = salt_len;
9954
9955 return (PARSER_OK);
9956 }
9957
9958 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9959 {
9960 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9961
9962 u32 *digest = (u32 *) hash_buf->digest;
9963
9964 salt_t *salt = hash_buf->salt;
9965
9966 char *hash_pos = input_buf + 8;
9967
9968 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9969 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9970 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9971 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9972 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9973
9974 digest[0] -= SHA1M_A;
9975 digest[1] -= SHA1M_B;
9976 digest[2] -= SHA1M_C;
9977 digest[3] -= SHA1M_D;
9978 digest[4] -= SHA1M_E;
9979
9980 uint salt_len = 8;
9981
9982 char *salt_buf_ptr = (char *) salt->salt_buf;
9983
9984 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9985
9986 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9987
9988 salt->salt_len = salt_len;
9989
9990 return (PARSER_OK);
9991 }
9992
9993 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9994 {
9995 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9996
9997 u64 *digest = (u64 *) hash_buf->digest;
9998
9999 salt_t *salt = hash_buf->salt;
10000
10001 char *hash_pos = input_buf + 8;
10002
10003 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
10004 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
10005 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
10006 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
10007 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
10008 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
10009 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
10010 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
10011
10012 digest[0] -= SHA512M_A;
10013 digest[1] -= SHA512M_B;
10014 digest[2] -= SHA512M_C;
10015 digest[3] -= SHA512M_D;
10016 digest[4] -= SHA512M_E;
10017 digest[5] -= SHA512M_F;
10018 digest[6] -= SHA512M_G;
10019 digest[7] -= SHA512M_H;
10020
10021 uint salt_len = 8;
10022
10023 char *salt_buf_ptr = (char *) salt->salt_buf;
10024
10025 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
10026
10027 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10028
10029 salt->salt_len = salt_len;
10030
10031 return (PARSER_OK);
10032 }
10033
10034 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10035 {
10036 if (data.opts_type & OPTS_TYPE_ST_HEX)
10037 {
10038 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
10039 }
10040 else
10041 {
10042 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
10043 }
10044
10045 u32 *digest = (u32 *) hash_buf->digest;
10046
10047 salt_t *salt = hash_buf->salt;
10048
10049 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10050 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10051 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10052 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10053
10054 digest[0] = byte_swap_32 (digest[0]);
10055 digest[1] = byte_swap_32 (digest[1]);
10056 digest[2] = byte_swap_32 (digest[2]);
10057 digest[3] = byte_swap_32 (digest[3]);
10058
10059 digest[0] -= MD5M_A;
10060 digest[1] -= MD5M_B;
10061 digest[2] -= MD5M_C;
10062 digest[3] -= MD5M_D;
10063
10064 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10065
10066 uint salt_len = input_len - 32 - 1;
10067
10068 char *salt_buf = input_buf + 32 + 1;
10069
10070 char *salt_buf_ptr = (char *) salt->salt_buf;
10071
10072 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10073
10074 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10075
10076 salt->salt_len = salt_len;
10077
10078 return (PARSER_OK);
10079 }
10080
10081 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10082 {
10083 if (data.opts_type & OPTS_TYPE_ST_HEX)
10084 {
10085 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
10086 }
10087 else
10088 {
10089 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
10090 }
10091
10092 // unscramble
10093
10094 char clean_input_buf[32] = { 0 };
10095
10096 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
10097 int pos[6] = { 0, 6, 12, 17, 23, 29 };
10098
10099 for (int i = 0, j = 0, k = 0; i < 30; i++)
10100 {
10101 if (i == pos[j])
10102 {
10103 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
10104
10105 j++;
10106 }
10107 else
10108 {
10109 clean_input_buf[k] = input_buf[i];
10110
10111 k++;
10112 }
10113 }
10114
10115 // base64 decode
10116
10117 u32 *digest = (u32 *) hash_buf->digest;
10118
10119 salt_t *salt = hash_buf->salt;
10120
10121 u32 a, b, c, d, e, f;
10122
10123 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
10124 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
10125 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
10126 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
10127 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
10128 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
10129
10130 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
10131 | (((d << 12) | (e << 6) | (f)) << 0);
10132
10133 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
10134 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
10135 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
10136 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
10137 e = base64_to_int (clean_input_buf[10] & 0x7f);
10138 f = base64_to_int (clean_input_buf[11] & 0x7f);
10139
10140 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
10141 | (((d << 12) | (e << 6) | (f)) << 0);
10142
10143 a = base64_to_int (clean_input_buf[12] & 0x7f);
10144 b = base64_to_int (clean_input_buf[13] & 0x7f);
10145 c = base64_to_int (clean_input_buf[14] & 0x7f);
10146 d = base64_to_int (clean_input_buf[15] & 0x7f);
10147 e = base64_to_int (clean_input_buf[16] & 0x7f);
10148 f = base64_to_int (clean_input_buf[17] & 0x7f);
10149
10150 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
10151 | (((d << 12) | (e << 6) | (f)) << 0);
10152
10153 a = base64_to_int (clean_input_buf[18] & 0x7f);
10154 b = base64_to_int (clean_input_buf[19] & 0x7f);
10155 c = base64_to_int (clean_input_buf[20] & 0x7f);
10156 d = base64_to_int (clean_input_buf[21] & 0x7f);
10157 e = base64_to_int (clean_input_buf[22] & 0x7f);
10158 f = base64_to_int (clean_input_buf[23] & 0x7f);
10159
10160 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
10161 | (((d << 12) | (e << 6) | (f)) << 0);
10162
10163 digest[0] = byte_swap_32 (digest[0]);
10164 digest[1] = byte_swap_32 (digest[1]);
10165 digest[2] = byte_swap_32 (digest[2]);
10166 digest[3] = byte_swap_32 (digest[3]);
10167
10168 digest[0] -= MD5M_A;
10169 digest[1] -= MD5M_B;
10170 digest[2] -= MD5M_C;
10171 digest[3] -= MD5M_D;
10172
10173 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
10174
10175 uint salt_len = input_len - 30 - 1;
10176
10177 char *salt_buf = input_buf + 30 + 1;
10178
10179 char *salt_buf_ptr = (char *) salt->salt_buf;
10180
10181 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10182
10183 // max. salt length: 55 (max for MD5) - 22 (":Administration Tools:") - 1 (0x80) = 32
10184 // 32 - 4 bytes (to fit w0lr for all attack modes) = 28
10185
10186 if (salt_len > 28) return (PARSER_SALT_LENGTH);
10187
10188 salt->salt_len = salt_len;
10189
10190 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
10191
10192 salt->salt_len += 22;
10193
10194 return (PARSER_OK);
10195 }
10196
10197 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10198 {
10199 if (data.opts_type & OPTS_TYPE_ST_HEX)
10200 {
10201 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
10202 }
10203 else
10204 {
10205 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
10206 }
10207
10208 u32 *digest = (u32 *) hash_buf->digest;
10209
10210 salt_t *salt = hash_buf->salt;
10211
10212 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10213 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10214 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10215 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10216 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
10217
10218 digest[0] -= SHA1M_A;
10219 digest[1] -= SHA1M_B;
10220 digest[2] -= SHA1M_C;
10221 digest[3] -= SHA1M_D;
10222 digest[4] -= SHA1M_E;
10223
10224 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10225
10226 uint salt_len = input_len - 40 - 1;
10227
10228 char *salt_buf = input_buf + 40 + 1;
10229
10230 char *salt_buf_ptr = (char *) salt->salt_buf;
10231
10232 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10233
10234 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10235
10236 salt->salt_len = salt_len;
10237
10238 return (PARSER_OK);
10239 }
10240
10241 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10242 {
10243 if (data.opts_type & OPTS_TYPE_ST_HEX)
10244 {
10245 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
10246 }
10247 else
10248 {
10249 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
10250 }
10251
10252 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10253
10254 char *iter_pos = input_buf + 6;
10255
10256 salt_t *salt = hash_buf->salt;
10257
10258 uint iter = atoi (iter_pos);
10259
10260 if (iter < 1)
10261 {
10262 iter = ROUNDS_DCC2;
10263 }
10264
10265 salt->salt_iter = iter - 1;
10266
10267 char *salt_pos = strchr (iter_pos, '#');
10268
10269 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10270
10271 salt_pos++;
10272
10273 char *digest_pos = strchr (salt_pos, '#');
10274
10275 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10276
10277 digest_pos++;
10278
10279 uint salt_len = digest_pos - salt_pos - 1;
10280
10281 u32 *digest = (u32 *) hash_buf->digest;
10282
10283 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
10284 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
10285 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
10286 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
10287
10288 char *salt_buf_ptr = (char *) salt->salt_buf;
10289
10290 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10291
10292 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10293
10294 salt->salt_len = salt_len;
10295
10296 return (PARSER_OK);
10297 }
10298
10299 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10300 {
10301 u32 *digest = (u32 *) hash_buf->digest;
10302
10303 salt_t *salt = hash_buf->salt;
10304
10305 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
10306
10307 hccap_t in;
10308
10309 memcpy (&in, input_buf, input_len);
10310
10311 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
10312
10313 memcpy (digest, in.keymic, 16);
10314
10315 /*
10316 http://www.one-net.eu/jsw/j_sec/m_ptype.html
10317 The phrase "Pairwise key expansion"
10318 Access Point Address (referred to as Authenticator Address AA)
10319 Supplicant Address (referred to as Supplicant Address SA)
10320 Access Point Nonce (referred to as Authenticator Anonce)
10321 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
10322 */
10323
10324 uint salt_len = strlen (in.essid);
10325
10326 if (salt_len > 36)
10327 {
10328 log_info ("WARNING: the length of the ESSID is too long. The hccap file may be invalid or corrupted");
10329
10330 return (PARSER_SALT_LENGTH);
10331 }
10332
10333 memcpy (salt->salt_buf, in.essid, salt_len);
10334
10335 salt->salt_len = salt_len;
10336
10337 salt->salt_iter = ROUNDS_WPA2 - 1;
10338
10339 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
10340
10341 memcpy (pke_ptr, "Pairwise key expansion", 23);
10342
10343 if (memcmp (in.mac1, in.mac2, 6) < 0)
10344 {
10345 memcpy (pke_ptr + 23, in.mac1, 6);
10346 memcpy (pke_ptr + 29, in.mac2, 6);
10347 }
10348 else
10349 {
10350 memcpy (pke_ptr + 23, in.mac2, 6);
10351 memcpy (pke_ptr + 29, in.mac1, 6);
10352 }
10353
10354 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10355 {
10356 memcpy (pke_ptr + 35, in.nonce1, 32);
10357 memcpy (pke_ptr + 67, in.nonce2, 32);
10358 }
10359 else
10360 {
10361 memcpy (pke_ptr + 35, in.nonce2, 32);
10362 memcpy (pke_ptr + 67, in.nonce1, 32);
10363 }
10364
10365 for (int i = 0; i < 25; i++)
10366 {
10367 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10368 }
10369
10370 memcpy (wpa->orig_mac1, in.mac1, 6);
10371 memcpy (wpa->orig_mac2, in.mac2, 6);
10372 memcpy (wpa->orig_nonce1, in.nonce1, 32);
10373 memcpy (wpa->orig_nonce2, in.nonce2, 32);
10374
10375 wpa->keyver = in.keyver;
10376
10377 if (wpa->keyver > 255)
10378 {
10379 log_info ("ATTENTION!");
10380 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10381 log_info (" This could be due to a recent aircrack-ng bug.");
10382 log_info (" The key version was automatically reset to a reasonable value.");
10383 log_info ("");
10384
10385 wpa->keyver &= 0xff;
10386 }
10387
10388 wpa->eapol_size = in.eapol_size;
10389
10390 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10391
10392 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10393
10394 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10395
10396 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10397
10398 if (wpa->keyver == 1)
10399 {
10400 // nothing to do
10401 }
10402 else
10403 {
10404 digest[0] = byte_swap_32 (digest[0]);
10405 digest[1] = byte_swap_32 (digest[1]);
10406 digest[2] = byte_swap_32 (digest[2]);
10407 digest[3] = byte_swap_32 (digest[3]);
10408
10409 for (int i = 0; i < 64; i++)
10410 {
10411 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10412 }
10413 }
10414
10415 uint32_t *p0 = (uint32_t *) in.essid;
10416 uint32_t c0 = 0;
10417 uint32_t c1 = 0;
10418
10419 for (uint i = 0; i < sizeof (in.essid) / sizeof (uint32_t); i++) c0 ^= *p0++;
10420 for (uint i = 0; i < sizeof (wpa->pke) / sizeof (wpa->pke[0]); i++) c1 ^= wpa->pke[i];
10421
10422 salt->salt_buf[10] = c0;
10423 salt->salt_buf[11] = c1;
10424
10425 return (PARSER_OK);
10426 }
10427
10428 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10429 {
10430 u32 *digest = (u32 *) hash_buf->digest;
10431
10432 salt_t *salt = hash_buf->salt;
10433
10434 if (input_len == 0)
10435 {
10436 log_error ("Password Safe v2 container not specified");
10437
10438 exit (-1);
10439 }
10440
10441 FILE *fp = fopen (input_buf, "rb");
10442
10443 if (fp == NULL)
10444 {
10445 log_error ("%s: %s", input_buf, strerror (errno));
10446
10447 exit (-1);
10448 }
10449
10450 psafe2_hdr buf;
10451
10452 memset (&buf, 0, sizeof (psafe2_hdr));
10453
10454 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10455
10456 fclose (fp);
10457
10458 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10459
10460 salt->salt_buf[0] = buf.random[0];
10461 salt->salt_buf[1] = buf.random[1];
10462
10463 salt->salt_len = 8;
10464 salt->salt_iter = 1000;
10465
10466 digest[0] = byte_swap_32 (buf.hash[0]);
10467 digest[1] = byte_swap_32 (buf.hash[1]);
10468 digest[2] = byte_swap_32 (buf.hash[2]);
10469 digest[3] = byte_swap_32 (buf.hash[3]);
10470 digest[4] = byte_swap_32 (buf.hash[4]);
10471
10472 return (PARSER_OK);
10473 }
10474
10475 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10476 {
10477 u32 *digest = (u32 *) hash_buf->digest;
10478
10479 salt_t *salt = hash_buf->salt;
10480
10481 if (input_len == 0)
10482 {
10483 log_error (".psafe3 not specified");
10484
10485 exit (-1);
10486 }
10487
10488 FILE *fp = fopen (input_buf, "rb");
10489
10490 if (fp == NULL)
10491 {
10492 log_error ("%s: %s", input_buf, strerror (errno));
10493
10494 exit (-1);
10495 }
10496
10497 psafe3_t in;
10498
10499 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10500
10501 fclose (fp);
10502
10503 data.hashfile = input_buf; // we will need this in case it gets cracked
10504
10505 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10506
10507 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10508
10509 salt->salt_iter = in.iterations + 1;
10510
10511 salt->salt_buf[0] = in.salt_buf[0];
10512 salt->salt_buf[1] = in.salt_buf[1];
10513 salt->salt_buf[2] = in.salt_buf[2];
10514 salt->salt_buf[3] = in.salt_buf[3];
10515 salt->salt_buf[4] = in.salt_buf[4];
10516 salt->salt_buf[5] = in.salt_buf[5];
10517 salt->salt_buf[6] = in.salt_buf[6];
10518 salt->salt_buf[7] = in.salt_buf[7];
10519
10520 salt->salt_len = 32;
10521
10522 digest[0] = in.hash_buf[0];
10523 digest[1] = in.hash_buf[1];
10524 digest[2] = in.hash_buf[2];
10525 digest[3] = in.hash_buf[3];
10526 digest[4] = in.hash_buf[4];
10527 digest[5] = in.hash_buf[5];
10528 digest[6] = in.hash_buf[6];
10529 digest[7] = in.hash_buf[7];
10530
10531 digest[0] = byte_swap_32 (digest[0]);
10532 digest[1] = byte_swap_32 (digest[1]);
10533 digest[2] = byte_swap_32 (digest[2]);
10534 digest[3] = byte_swap_32 (digest[3]);
10535 digest[4] = byte_swap_32 (digest[4]);
10536 digest[5] = byte_swap_32 (digest[5]);
10537 digest[6] = byte_swap_32 (digest[6]);
10538 digest[7] = byte_swap_32 (digest[7]);
10539
10540 return (PARSER_OK);
10541 }
10542
10543 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10544 {
10545 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10546
10547 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10548
10549 u32 *digest = (u32 *) hash_buf->digest;
10550
10551 salt_t *salt = hash_buf->salt;
10552
10553 char *iter_pos = input_buf + 3;
10554
10555 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10556
10557 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10558
10559 memcpy ((char *) salt->salt_sign, input_buf, 4);
10560
10561 salt->salt_iter = salt_iter;
10562
10563 char *salt_pos = iter_pos + 1;
10564
10565 uint salt_len = 8;
10566
10567 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10568
10569 salt->salt_len = salt_len;
10570
10571 char *hash_pos = salt_pos + salt_len;
10572
10573 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10574
10575 return (PARSER_OK);
10576 }
10577
10578 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10579 {
10580 if (input_len < DISPLAY_LEN_MIN_500) return (PARSER_GLOBAL_LENGTH);
10581
10582 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10583
10584 u32 *digest = (u32 *) hash_buf->digest;
10585
10586 salt_t *salt = hash_buf->salt;
10587
10588 char *salt_pos = input_buf + 3;
10589
10590 uint iterations_len = 0;
10591
10592 if (memcmp (salt_pos, "rounds=", 7) == 0)
10593 {
10594 salt_pos += 7;
10595
10596 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10597
10598 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10599 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10600
10601 salt_pos[0] = 0x0;
10602
10603 salt->salt_iter = atoi (salt_pos - iterations_len);
10604
10605 salt_pos += 1;
10606
10607 iterations_len += 8;
10608 }
10609 else
10610 {
10611 salt->salt_iter = ROUNDS_MD5CRYPT;
10612 }
10613
10614 if (input_len > (DISPLAY_LEN_MAX_500 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10615
10616 char *hash_pos = strchr (salt_pos, '$');
10617
10618 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10619
10620 uint salt_len = hash_pos - salt_pos;
10621
10622 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10623
10624 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10625
10626 salt->salt_len = salt_len;
10627
10628 hash_pos++;
10629
10630 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10631
10632 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10633
10634 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10635
10636 return (PARSER_OK);
10637 }
10638
10639 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10640 {
10641 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10642
10643 u32 *digest = (u32 *) hash_buf->digest;
10644
10645 salt_t *salt = hash_buf->salt;
10646
10647 char *salt_pos = input_buf + 6;
10648
10649 uint iterations_len = 0;
10650
10651 if (memcmp (salt_pos, "rounds=", 7) == 0)
10652 {
10653 salt_pos += 7;
10654
10655 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10656
10657 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10658 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10659
10660 salt_pos[0] = 0x0;
10661
10662 salt->salt_iter = atoi (salt_pos - iterations_len);
10663
10664 salt_pos += 1;
10665
10666 iterations_len += 8;
10667 }
10668 else
10669 {
10670 salt->salt_iter = ROUNDS_MD5CRYPT;
10671 }
10672
10673 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10674
10675 char *hash_pos = strchr (salt_pos, '$');
10676
10677 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10678
10679 uint salt_len = hash_pos - salt_pos;
10680
10681 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10682
10683 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10684
10685 salt->salt_len = salt_len;
10686
10687 hash_pos++;
10688
10689 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10690
10691 return (PARSER_OK);
10692 }
10693
10694 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10695 {
10696 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10697
10698 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10699
10700 u32 *digest = (u32 *) hash_buf->digest;
10701
10702 salt_t *salt = hash_buf->salt;
10703
10704 char *salt_pos = input_buf + 14;
10705
10706 char *hash_pos = strchr (salt_pos, '*');
10707
10708 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10709
10710 hash_pos++;
10711
10712 uint salt_len = hash_pos - salt_pos - 1;
10713
10714 char *salt_buf_ptr = (char *) salt->salt_buf;
10715
10716 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10717
10718 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10719
10720 salt->salt_len = salt_len;
10721
10722 u8 tmp_buf[100] = { 0 };
10723
10724 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10725
10726 memcpy (digest, tmp_buf, 20);
10727
10728 digest[0] = byte_swap_32 (digest[0]);
10729 digest[1] = byte_swap_32 (digest[1]);
10730 digest[2] = byte_swap_32 (digest[2]);
10731 digest[3] = byte_swap_32 (digest[3]);
10732 digest[4] = byte_swap_32 (digest[4]);
10733
10734 digest[0] -= SHA1M_A;
10735 digest[1] -= SHA1M_B;
10736 digest[2] -= SHA1M_C;
10737 digest[3] -= SHA1M_D;
10738 digest[4] -= SHA1M_E;
10739
10740 return (PARSER_OK);
10741 }
10742
10743 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10744 {
10745 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10746
10747 unsigned char c12 = itoa64_to_int (input_buf[12]);
10748
10749 if (c12 & 3) return (PARSER_HASH_VALUE);
10750
10751 u32 *digest = (u32 *) hash_buf->digest;
10752
10753 salt_t *salt = hash_buf->salt;
10754
10755 // for ascii_digest
10756 salt->salt_sign[0] = input_buf[0];
10757 salt->salt_sign[1] = input_buf[1];
10758
10759 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10760 | itoa64_to_int (input_buf[1]) << 6;
10761
10762 salt->salt_len = 2;
10763
10764 u8 tmp_buf[100] = { 0 };
10765
10766 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10767
10768 memcpy (digest, tmp_buf, 8);
10769
10770 uint tt;
10771
10772 IP (digest[0], digest[1], tt);
10773
10774 digest[2] = 0;
10775 digest[3] = 0;
10776
10777 return (PARSER_OK);
10778 }
10779
10780 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10781 {
10782 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10783
10784 u32 *digest = (u32 *) hash_buf->digest;
10785
10786 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10787 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10788 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10789 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10790
10791 digest[0] = byte_swap_32 (digest[0]);
10792 digest[1] = byte_swap_32 (digest[1]);
10793 digest[2] = byte_swap_32 (digest[2]);
10794 digest[3] = byte_swap_32 (digest[3]);
10795
10796 digest[0] -= MD4M_A;
10797 digest[1] -= MD4M_B;
10798 digest[2] -= MD4M_C;
10799 digest[3] -= MD4M_D;
10800
10801 return (PARSER_OK);
10802 }
10803
10804 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10805 {
10806 if (data.opts_type & OPTS_TYPE_ST_HEX)
10807 {
10808 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10809 }
10810 else
10811 {
10812 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10813 }
10814
10815 u32 *digest = (u32 *) hash_buf->digest;
10816
10817 salt_t *salt = hash_buf->salt;
10818
10819 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10820 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10821 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10822 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10823
10824 digest[0] = byte_swap_32 (digest[0]);
10825 digest[1] = byte_swap_32 (digest[1]);
10826 digest[2] = byte_swap_32 (digest[2]);
10827 digest[3] = byte_swap_32 (digest[3]);
10828
10829 digest[0] -= MD4M_A;
10830 digest[1] -= MD4M_B;
10831 digest[2] -= MD4M_C;
10832 digest[3] -= MD4M_D;
10833
10834 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10835
10836 uint salt_len = input_len - 32 - 1;
10837
10838 char *salt_buf = input_buf + 32 + 1;
10839
10840 char *salt_buf_ptr = (char *) salt->salt_buf;
10841
10842 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10843
10844 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10845
10846 salt->salt_len = salt_len;
10847
10848 return (PARSER_OK);
10849 }
10850
10851 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10852 {
10853 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10854
10855 u32 *digest = (u32 *) hash_buf->digest;
10856
10857 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10858 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10859 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10860 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10861
10862 digest[0] = byte_swap_32 (digest[0]);
10863 digest[1] = byte_swap_32 (digest[1]);
10864 digest[2] = byte_swap_32 (digest[2]);
10865 digest[3] = byte_swap_32 (digest[3]);
10866
10867 digest[0] -= MD5M_A;
10868 digest[1] -= MD5M_B;
10869 digest[2] -= MD5M_C;
10870 digest[3] -= MD5M_D;
10871
10872 return (PARSER_OK);
10873 }
10874
10875 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10876 {
10877 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10878
10879 u32 *digest = (u32 *) hash_buf->digest;
10880
10881 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10882 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10883 digest[2] = 0;
10884 digest[3] = 0;
10885
10886 digest[0] = byte_swap_32 (digest[0]);
10887 digest[1] = byte_swap_32 (digest[1]);
10888
10889 return (PARSER_OK);
10890 }
10891
10892 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10893 {
10894 if (data.opts_type & OPTS_TYPE_ST_HEX)
10895 {
10896 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10897 }
10898 else
10899 {
10900 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10901 }
10902
10903 u32 *digest = (u32 *) hash_buf->digest;
10904
10905 salt_t *salt = hash_buf->salt;
10906
10907 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10908 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10909 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10910 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10911
10912 digest[0] = byte_swap_32 (digest[0]);
10913 digest[1] = byte_swap_32 (digest[1]);
10914 digest[2] = byte_swap_32 (digest[2]);
10915 digest[3] = byte_swap_32 (digest[3]);
10916
10917 digest[0] -= MD5M_A;
10918 digest[1] -= MD5M_B;
10919 digest[2] -= MD5M_C;
10920 digest[3] -= MD5M_D;
10921
10922 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10923
10924 uint salt_len = input_len - 32 - 1;
10925
10926 char *salt_buf = input_buf + 32 + 1;
10927
10928 char *salt_buf_ptr = (char *) salt->salt_buf;
10929
10930 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10931
10932 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10933
10934 salt->salt_len = salt_len;
10935
10936 return (PARSER_OK);
10937 }
10938
10939 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10940 {
10941 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10942
10943 u32 *digest = (u32 *) hash_buf->digest;
10944
10945 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10946 | itoa64_to_int (input_buf[ 1]) << 6
10947 | itoa64_to_int (input_buf[ 2]) << 12
10948 | itoa64_to_int (input_buf[ 3]) << 18;
10949 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10950 | itoa64_to_int (input_buf[ 5]) << 6
10951 | itoa64_to_int (input_buf[ 6]) << 12
10952 | itoa64_to_int (input_buf[ 7]) << 18;
10953 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10954 | itoa64_to_int (input_buf[ 9]) << 6
10955 | itoa64_to_int (input_buf[10]) << 12
10956 | itoa64_to_int (input_buf[11]) << 18;
10957 digest[3] = itoa64_to_int (input_buf[12]) << 0
10958 | itoa64_to_int (input_buf[13]) << 6
10959 | itoa64_to_int (input_buf[14]) << 12
10960 | itoa64_to_int (input_buf[15]) << 18;
10961
10962 digest[0] -= MD5M_A;
10963 digest[1] -= MD5M_B;
10964 digest[2] -= MD5M_C;
10965 digest[3] -= MD5M_D;
10966
10967 digest[0] &= 0x00ffffff;
10968 digest[1] &= 0x00ffffff;
10969 digest[2] &= 0x00ffffff;
10970 digest[3] &= 0x00ffffff;
10971
10972 return (PARSER_OK);
10973 }
10974
10975 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10976 {
10977 if (data.opts_type & OPTS_TYPE_ST_HEX)
10978 {
10979 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10980 }
10981 else
10982 {
10983 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10984 }
10985
10986 u32 *digest = (u32 *) hash_buf->digest;
10987
10988 salt_t *salt = hash_buf->salt;
10989
10990 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10991 | itoa64_to_int (input_buf[ 1]) << 6
10992 | itoa64_to_int (input_buf[ 2]) << 12
10993 | itoa64_to_int (input_buf[ 3]) << 18;
10994 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10995 | itoa64_to_int (input_buf[ 5]) << 6
10996 | itoa64_to_int (input_buf[ 6]) << 12
10997 | itoa64_to_int (input_buf[ 7]) << 18;
10998 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10999 | itoa64_to_int (input_buf[ 9]) << 6
11000 | itoa64_to_int (input_buf[10]) << 12
11001 | itoa64_to_int (input_buf[11]) << 18;
11002 digest[3] = itoa64_to_int (input_buf[12]) << 0
11003 | itoa64_to_int (input_buf[13]) << 6
11004 | itoa64_to_int (input_buf[14]) << 12
11005 | itoa64_to_int (input_buf[15]) << 18;
11006
11007 digest[0] -= MD5M_A;
11008 digest[1] -= MD5M_B;
11009 digest[2] -= MD5M_C;
11010 digest[3] -= MD5M_D;
11011
11012 digest[0] &= 0x00ffffff;
11013 digest[1] &= 0x00ffffff;
11014 digest[2] &= 0x00ffffff;
11015 digest[3] &= 0x00ffffff;
11016
11017 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11018
11019 uint salt_len = input_len - 16 - 1;
11020
11021 char *salt_buf = input_buf + 16 + 1;
11022
11023 char *salt_buf_ptr = (char *) salt->salt_buf;
11024
11025 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11026
11027 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11028
11029 salt->salt_len = salt_len;
11030
11031 return (PARSER_OK);
11032 }
11033
11034 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
11035 {
11036 key[0] = (nthash[0] >> 0);
11037 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
11038 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
11039 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
11040 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
11041 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
11042 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
11043 key[7] = (nthash[6] << 1);
11044
11045 key[0] |= 0x01;
11046 key[1] |= 0x01;
11047 key[2] |= 0x01;
11048 key[3] |= 0x01;
11049 key[4] |= 0x01;
11050 key[5] |= 0x01;
11051 key[6] |= 0x01;
11052 key[7] |= 0x01;
11053 }
11054
11055 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11056 {
11057 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
11058
11059 u32 *digest = (u32 *) hash_buf->digest;
11060
11061 salt_t *salt = hash_buf->salt;
11062
11063 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11064
11065 /**
11066 * parse line
11067 */
11068
11069 char *user_pos = input_buf;
11070
11071 char *unused_pos = strchr (user_pos, ':');
11072
11073 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11074
11075 uint user_len = unused_pos - user_pos;
11076
11077 if (user_len > 60) return (PARSER_SALT_LENGTH);
11078
11079 unused_pos++;
11080
11081 char *domain_pos = strchr (unused_pos, ':');
11082
11083 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11084
11085 uint unused_len = domain_pos - unused_pos;
11086
11087 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11088
11089 domain_pos++;
11090
11091 char *srvchall_pos = strchr (domain_pos, ':');
11092
11093 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11094
11095 uint domain_len = srvchall_pos - domain_pos;
11096
11097 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11098
11099 srvchall_pos++;
11100
11101 char *hash_pos = strchr (srvchall_pos, ':');
11102
11103 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11104
11105 uint srvchall_len = hash_pos - srvchall_pos;
11106
11107 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
11108
11109 hash_pos++;
11110
11111 char *clichall_pos = strchr (hash_pos, ':');
11112
11113 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11114
11115 uint hash_len = clichall_pos - hash_pos;
11116
11117 if (hash_len != 48) return (PARSER_HASH_LENGTH);
11118
11119 clichall_pos++;
11120
11121 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11122
11123 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
11124
11125 /**
11126 * store some data for later use
11127 */
11128
11129 netntlm->user_len = user_len * 2;
11130 netntlm->domain_len = domain_len * 2;
11131 netntlm->srvchall_len = srvchall_len / 2;
11132 netntlm->clichall_len = clichall_len / 2;
11133
11134 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11135 char *chall_ptr = (char *) netntlm->chall_buf;
11136
11137 /**
11138 * handle username and domainname
11139 */
11140
11141 for (uint i = 0; i < user_len; i++)
11142 {
11143 *userdomain_ptr++ = user_pos[i];
11144 *userdomain_ptr++ = 0;
11145 }
11146
11147 for (uint i = 0; i < domain_len; i++)
11148 {
11149 *userdomain_ptr++ = domain_pos[i];
11150 *userdomain_ptr++ = 0;
11151 }
11152
11153 /**
11154 * handle server challenge encoding
11155 */
11156
11157 for (uint i = 0; i < srvchall_len; i += 2)
11158 {
11159 const char p0 = srvchall_pos[i + 0];
11160 const char p1 = srvchall_pos[i + 1];
11161
11162 *chall_ptr++ = hex_convert (p1) << 0
11163 | hex_convert (p0) << 4;
11164 }
11165
11166 /**
11167 * handle client challenge encoding
11168 */
11169
11170 for (uint i = 0; i < clichall_len; i += 2)
11171 {
11172 const char p0 = clichall_pos[i + 0];
11173 const char p1 = clichall_pos[i + 1];
11174
11175 *chall_ptr++ = hex_convert (p1) << 0
11176 | hex_convert (p0) << 4;
11177 }
11178
11179 /**
11180 * store data
11181 */
11182
11183 char *salt_buf_ptr = (char *) salt->salt_buf;
11184
11185 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
11186
11187 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11188
11189 salt->salt_len = salt_len;
11190
11191 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11192 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11193 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11194 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11195
11196 digest[0] = byte_swap_32 (digest[0]);
11197 digest[1] = byte_swap_32 (digest[1]);
11198 digest[2] = byte_swap_32 (digest[2]);
11199 digest[3] = byte_swap_32 (digest[3]);
11200
11201 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
11202
11203 uint digest_tmp[2] = { 0 };
11204
11205 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11206 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
11207
11208 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
11209 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
11210
11211 /* special case 2: ESS */
11212
11213 if (srvchall_len == 48)
11214 {
11215 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
11216 {
11217 uint w[16] = { 0 };
11218
11219 w[ 0] = netntlm->chall_buf[6];
11220 w[ 1] = netntlm->chall_buf[7];
11221 w[ 2] = netntlm->chall_buf[0];
11222 w[ 3] = netntlm->chall_buf[1];
11223 w[ 4] = 0x80;
11224 w[14] = 16 * 8;
11225
11226 uint dgst[4] = { 0 };
11227
11228 dgst[0] = MAGIC_A;
11229 dgst[1] = MAGIC_B;
11230 dgst[2] = MAGIC_C;
11231 dgst[3] = MAGIC_D;
11232
11233 md5_64 (w, dgst);
11234
11235 salt->salt_buf[0] = dgst[0];
11236 salt->salt_buf[1] = dgst[1];
11237 }
11238 }
11239
11240 /* precompute netntlmv1 exploit start */
11241
11242 for (uint i = 0; i < 0x10000; i++)
11243 {
11244 uint key_md4[2] = { i, 0 };
11245 uint key_des[2] = { 0, 0 };
11246
11247 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
11248
11249 uint Kc[16] = { 0 };
11250 uint Kd[16] = { 0 };
11251
11252 _des_keysetup (key_des, Kc, Kd, c_skb);
11253
11254 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
11255
11256 _des_encrypt (data3, Kc, Kd, c_SPtrans);
11257
11258 if (data3[0] != digest_tmp[0]) continue;
11259 if (data3[1] != digest_tmp[1]) continue;
11260
11261 salt->salt_buf[2] = i;
11262
11263 salt->salt_len = 24;
11264
11265 break;
11266 }
11267
11268 salt->salt_buf_pc[0] = digest_tmp[0];
11269 salt->salt_buf_pc[1] = digest_tmp[1];
11270
11271 /* precompute netntlmv1 exploit stop */
11272
11273 u32 tt;
11274
11275 IP (digest[0], digest[1], tt);
11276 IP (digest[2], digest[3], tt);
11277
11278 digest[0] = rotr32 (digest[0], 29);
11279 digest[1] = rotr32 (digest[1], 29);
11280 digest[2] = rotr32 (digest[2], 29);
11281 digest[3] = rotr32 (digest[3], 29);
11282
11283 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
11284
11285 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
11286 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
11287
11288 return (PARSER_OK);
11289 }
11290
11291 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11292 {
11293 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
11294
11295 u32 *digest = (u32 *) hash_buf->digest;
11296
11297 salt_t *salt = hash_buf->salt;
11298
11299 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
11300
11301 /**
11302 * parse line
11303 */
11304
11305 char *user_pos = input_buf;
11306
11307 char *unused_pos = strchr (user_pos, ':');
11308
11309 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11310
11311 uint user_len = unused_pos - user_pos;
11312
11313 if (user_len > 60) return (PARSER_SALT_LENGTH);
11314
11315 unused_pos++;
11316
11317 char *domain_pos = strchr (unused_pos, ':');
11318
11319 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11320
11321 uint unused_len = domain_pos - unused_pos;
11322
11323 if (unused_len != 0) return (PARSER_SALT_LENGTH);
11324
11325 domain_pos++;
11326
11327 char *srvchall_pos = strchr (domain_pos, ':');
11328
11329 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11330
11331 uint domain_len = srvchall_pos - domain_pos;
11332
11333 if (domain_len > 45) return (PARSER_SALT_LENGTH);
11334
11335 srvchall_pos++;
11336
11337 char *hash_pos = strchr (srvchall_pos, ':');
11338
11339 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11340
11341 uint srvchall_len = hash_pos - srvchall_pos;
11342
11343 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
11344
11345 hash_pos++;
11346
11347 char *clichall_pos = strchr (hash_pos, ':');
11348
11349 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11350
11351 uint hash_len = clichall_pos - hash_pos;
11352
11353 if (hash_len != 32) return (PARSER_HASH_LENGTH);
11354
11355 clichall_pos++;
11356
11357 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
11358
11359 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
11360
11361 if (clichall_len % 2) return (PARSER_SALT_VALUE);
11362
11363 /**
11364 * store some data for later use
11365 */
11366
11367 netntlm->user_len = user_len * 2;
11368 netntlm->domain_len = domain_len * 2;
11369 netntlm->srvchall_len = srvchall_len / 2;
11370 netntlm->clichall_len = clichall_len / 2;
11371
11372 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11373 char *chall_ptr = (char *) netntlm->chall_buf;
11374
11375 /**
11376 * handle username and domainname
11377 */
11378
11379 for (uint i = 0; i < user_len; i++)
11380 {
11381 *userdomain_ptr++ = toupper (user_pos[i]);
11382 *userdomain_ptr++ = 0;
11383 }
11384
11385 for (uint i = 0; i < domain_len; i++)
11386 {
11387 *userdomain_ptr++ = domain_pos[i];
11388 *userdomain_ptr++ = 0;
11389 }
11390
11391 *userdomain_ptr++ = 0x80;
11392
11393 /**
11394 * handle server challenge encoding
11395 */
11396
11397 for (uint i = 0; i < srvchall_len; i += 2)
11398 {
11399 const char p0 = srvchall_pos[i + 0];
11400 const char p1 = srvchall_pos[i + 1];
11401
11402 *chall_ptr++ = hex_convert (p1) << 0
11403 | hex_convert (p0) << 4;
11404 }
11405
11406 /**
11407 * handle client challenge encoding
11408 */
11409
11410 for (uint i = 0; i < clichall_len; i += 2)
11411 {
11412 const char p0 = clichall_pos[i + 0];
11413 const char p1 = clichall_pos[i + 1];
11414
11415 *chall_ptr++ = hex_convert (p1) << 0
11416 | hex_convert (p0) << 4;
11417 }
11418
11419 *chall_ptr++ = 0x80;
11420
11421 /**
11422 * handle hash itself
11423 */
11424
11425 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11426 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11427 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11428 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11429
11430 digest[0] = byte_swap_32 (digest[0]);
11431 digest[1] = byte_swap_32 (digest[1]);
11432 digest[2] = byte_swap_32 (digest[2]);
11433 digest[3] = byte_swap_32 (digest[3]);
11434
11435 /**
11436 * reuse challange data as salt_buf, its the buffer that is most likely unique
11437 */
11438
11439 salt->salt_buf[0] = 0;
11440 salt->salt_buf[1] = 0;
11441 salt->salt_buf[2] = 0;
11442 salt->salt_buf[3] = 0;
11443 salt->salt_buf[4] = 0;
11444 salt->salt_buf[5] = 0;
11445 salt->salt_buf[6] = 0;
11446 salt->salt_buf[7] = 0;
11447
11448 uint *uptr;
11449
11450 uptr = (uint *) netntlm->userdomain_buf;
11451
11452 for (uint i = 0; i < 16; i += 16)
11453 {
11454 md5_64 (uptr, salt->salt_buf);
11455 }
11456
11457 uptr = (uint *) netntlm->chall_buf;
11458
11459 for (uint i = 0; i < 256; i += 16)
11460 {
11461 md5_64 (uptr, salt->salt_buf);
11462 }
11463
11464 salt->salt_len = 16;
11465
11466 return (PARSER_OK);
11467 }
11468
11469 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11470 {
11471 if (data.opts_type & OPTS_TYPE_ST_HEX)
11472 {
11473 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11474 }
11475 else
11476 {
11477 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11478 }
11479
11480 u32 *digest = (u32 *) hash_buf->digest;
11481
11482 salt_t *salt = hash_buf->salt;
11483
11484 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11485 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11486 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11487 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11488
11489 digest[0] = byte_swap_32 (digest[0]);
11490 digest[1] = byte_swap_32 (digest[1]);
11491 digest[2] = byte_swap_32 (digest[2]);
11492 digest[3] = byte_swap_32 (digest[3]);
11493
11494 digest[0] -= MD5M_A;
11495 digest[1] -= MD5M_B;
11496 digest[2] -= MD5M_C;
11497 digest[3] -= MD5M_D;
11498
11499 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11500
11501 uint salt_len = input_len - 32 - 1;
11502
11503 char *salt_buf = input_buf + 32 + 1;
11504
11505 char *salt_buf_ptr = (char *) salt->salt_buf;
11506
11507 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11508
11509 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11510
11511 salt->salt_len = salt_len;
11512
11513 return (PARSER_OK);
11514 }
11515
11516 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11517 {
11518 if (data.opts_type & OPTS_TYPE_ST_HEX)
11519 {
11520 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11521 }
11522 else
11523 {
11524 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11525 }
11526
11527 u32 *digest = (u32 *) hash_buf->digest;
11528
11529 salt_t *salt = hash_buf->salt;
11530
11531 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11532 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11533 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11534 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11535
11536 digest[0] = byte_swap_32 (digest[0]);
11537 digest[1] = byte_swap_32 (digest[1]);
11538 digest[2] = byte_swap_32 (digest[2]);
11539 digest[3] = byte_swap_32 (digest[3]);
11540
11541 digest[0] -= MD5M_A;
11542 digest[1] -= MD5M_B;
11543 digest[2] -= MD5M_C;
11544 digest[3] -= MD5M_D;
11545
11546 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11547
11548 uint salt_len = input_len - 32 - 1;
11549
11550 char *salt_buf = input_buf + 32 + 1;
11551
11552 char *salt_buf_ptr = (char *) salt->salt_buf;
11553
11554 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11555
11556 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11557
11558 salt->salt_len = salt_len;
11559
11560 return (PARSER_OK);
11561 }
11562
11563 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11564 {
11565 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11566
11567 u32 *digest = (u32 *) hash_buf->digest;
11568
11569 salt_t *salt = hash_buf->salt;
11570
11571 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11572 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11573 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11574 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11575
11576 digest[0] = byte_swap_32 (digest[0]);
11577 digest[1] = byte_swap_32 (digest[1]);
11578 digest[2] = byte_swap_32 (digest[2]);
11579 digest[3] = byte_swap_32 (digest[3]);
11580
11581 digest[0] -= MD5M_A;
11582 digest[1] -= MD5M_B;
11583 digest[2] -= MD5M_C;
11584 digest[3] -= MD5M_D;
11585
11586 /**
11587 * This is a virtual salt. While the algorithm is basically not salted
11588 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11589 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11590 */
11591
11592 char *salt_buf_ptr = (char *) salt->salt_buf;
11593
11594 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11595
11596 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11597
11598 salt->salt_len = salt_len;
11599
11600 return (PARSER_OK);
11601 }
11602
11603 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11604 {
11605 if (data.opts_type & OPTS_TYPE_ST_HEX)
11606 {
11607 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11608 }
11609 else
11610 {
11611 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11612 }
11613
11614 u32 *digest = (u32 *) hash_buf->digest;
11615
11616 salt_t *salt = hash_buf->salt;
11617
11618 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11619 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11620 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11621 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11622
11623 digest[0] = byte_swap_32 (digest[0]);
11624 digest[1] = byte_swap_32 (digest[1]);
11625 digest[2] = byte_swap_32 (digest[2]);
11626 digest[3] = byte_swap_32 (digest[3]);
11627
11628 digest[0] -= MD5M_A;
11629 digest[1] -= MD5M_B;
11630 digest[2] -= MD5M_C;
11631 digest[3] -= MD5M_D;
11632
11633 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11634
11635 uint salt_len = input_len - 32 - 1;
11636
11637 char *salt_buf = input_buf + 32 + 1;
11638
11639 char *salt_buf_ptr = (char *) salt->salt_buf;
11640
11641 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11642
11643 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11644
11645 salt->salt_len = salt_len;
11646
11647 return (PARSER_OK);
11648 }
11649
11650 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11651 {
11652 if (data.opts_type & OPTS_TYPE_ST_HEX)
11653 {
11654 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11655 }
11656 else
11657 {
11658 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11659 }
11660
11661 u32 *digest = (u32 *) hash_buf->digest;
11662
11663 salt_t *salt = hash_buf->salt;
11664
11665 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11666 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11667 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11668 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11669
11670 digest[0] = byte_swap_32 (digest[0]);
11671 digest[1] = byte_swap_32 (digest[1]);
11672 digest[2] = byte_swap_32 (digest[2]);
11673 digest[3] = byte_swap_32 (digest[3]);
11674
11675 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11676
11677 uint salt_len = input_len - 32 - 1;
11678
11679 char *salt_buf = input_buf + 32 + 1;
11680
11681 char *salt_buf_ptr = (char *) salt->salt_buf;
11682
11683 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11684
11685 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11686
11687 salt->salt_len = salt_len;
11688
11689 return (PARSER_OK);
11690 }
11691
11692 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11693 {
11694 if (data.opts_type & OPTS_TYPE_ST_HEX)
11695 {
11696 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11697 }
11698 else
11699 {
11700 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11701 }
11702
11703 u32 *digest = (u32 *) hash_buf->digest;
11704
11705 salt_t *salt = hash_buf->salt;
11706
11707 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11708 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11709 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11710 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11711
11712 digest[0] = byte_swap_32 (digest[0]);
11713 digest[1] = byte_swap_32 (digest[1]);
11714 digest[2] = byte_swap_32 (digest[2]);
11715 digest[3] = byte_swap_32 (digest[3]);
11716
11717 digest[0] -= MD4M_A;
11718 digest[1] -= MD4M_B;
11719 digest[2] -= MD4M_C;
11720 digest[3] -= MD4M_D;
11721
11722 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11723
11724 uint salt_len = input_len - 32 - 1;
11725
11726 char *salt_buf = input_buf + 32 + 1;
11727
11728 char *salt_buf_ptr = (char *) salt->salt_buf;
11729
11730 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11731
11732 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11733
11734 salt->salt_len = salt_len;
11735
11736 return (PARSER_OK);
11737 }
11738
11739 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11740 {
11741 if (data.opts_type & OPTS_TYPE_ST_HEX)
11742 {
11743 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11744 }
11745 else
11746 {
11747 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11748 }
11749
11750 u32 *digest = (u32 *) hash_buf->digest;
11751
11752 salt_t *salt = hash_buf->salt;
11753
11754 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11755 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11756 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11757 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11758
11759 digest[0] = byte_swap_32 (digest[0]);
11760 digest[1] = byte_swap_32 (digest[1]);
11761 digest[2] = byte_swap_32 (digest[2]);
11762 digest[3] = byte_swap_32 (digest[3]);
11763
11764 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11765
11766 uint salt_len = input_len - 32 - 1;
11767
11768 char *salt_buf = input_buf + 32 + 1;
11769
11770 uint salt_pc_block[16] = { 0 };
11771
11772 char *salt_pc_block_ptr = (char *) salt_pc_block;
11773
11774 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11775
11776 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11777
11778 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11779
11780 salt_pc_block[14] = salt_len * 8;
11781
11782 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11783
11784 md5_64 (salt_pc_block, salt_pc_digest);
11785
11786 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11787 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11788 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11789 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11790
11791 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11792
11793 memcpy (salt_buf_ptr, salt_buf, salt_len);
11794
11795 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11796
11797 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11798 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11799 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11800 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11801
11802 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11803
11804 return (PARSER_OK);
11805 }
11806
11807 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11808 {
11809 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11810
11811 u32 *digest = (u32 *) hash_buf->digest;
11812
11813 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11814 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11815 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11816 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11817 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11818
11819 digest[0] -= SHA1M_A;
11820 digest[1] -= SHA1M_B;
11821 digest[2] -= SHA1M_C;
11822 digest[3] -= SHA1M_D;
11823 digest[4] -= SHA1M_E;
11824
11825 return (PARSER_OK);
11826 }
11827
11828 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11829 {
11830 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11831
11832 u32 *digest = (u32 *) hash_buf->digest;
11833
11834 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11835 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11836 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11837 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11838 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11839
11840 return (PARSER_OK);
11841 }
11842
11843 int sha1axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11844 {
11845 if ((input_len < DISPLAY_LEN_MIN_13300) || (input_len > DISPLAY_LEN_MAX_13300)) return (PARSER_GLOBAL_LENGTH);
11846
11847 if (memcmp (SIGNATURE_AXCRYPT_SHA1, input_buf, 13)) return (PARSER_SIGNATURE_UNMATCHED);
11848
11849 u32 *digest = (u32 *) hash_buf->digest;
11850
11851 input_buf +=14;
11852
11853 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11854 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11855 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11856 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11857 digest[4] = 0x00000000;
11858
11859 return (PARSER_OK);
11860 }
11861
11862 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11863 {
11864 if (data.opts_type & OPTS_TYPE_ST_HEX)
11865 {
11866 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11867 }
11868 else
11869 {
11870 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11871 }
11872
11873 u32 *digest = (u32 *) hash_buf->digest;
11874
11875 salt_t *salt = hash_buf->salt;
11876
11877 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11878 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11879 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11880 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11881 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11882
11883 digest[0] -= SHA1M_A;
11884 digest[1] -= SHA1M_B;
11885 digest[2] -= SHA1M_C;
11886 digest[3] -= SHA1M_D;
11887 digest[4] -= SHA1M_E;
11888
11889 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11890
11891 uint salt_len = input_len - 40 - 1;
11892
11893 char *salt_buf = input_buf + 40 + 1;
11894
11895 char *salt_buf_ptr = (char *) salt->salt_buf;
11896
11897 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11898
11899 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11900
11901 salt->salt_len = salt_len;
11902
11903 return (PARSER_OK);
11904 }
11905
11906 int pstoken_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11907 {
11908 if ((input_len < DISPLAY_LEN_MIN_13500) || (input_len > DISPLAY_LEN_MAX_13500)) return (PARSER_GLOBAL_LENGTH);
11909
11910 u32 *digest = (u32 *) hash_buf->digest;
11911
11912 salt_t *salt = hash_buf->salt;
11913
11914 pstoken_t *pstoken = (pstoken_t *) hash_buf->esalt;
11915
11916 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11917 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11918 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11919 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11920 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11921
11922 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11923
11924 uint salt_len = input_len - 40 - 1;
11925
11926 char *salt_buf = input_buf + 40 + 1;
11927
11928 if (salt_len == UINT_MAX || salt_len % 2 != 0) return (PARSER_SALT_LENGTH);
11929
11930 u8 *pstoken_ptr = (u8 *) pstoken->salt_buf;
11931
11932 for (uint i = 0, j = 0; i < salt_len; i += 2, j += 1)
11933 {
11934 pstoken_ptr[j] = hex_to_u8 ((const u8 *) &salt_buf[i]);
11935 }
11936
11937 pstoken->salt_len = salt_len / 2;
11938
11939 /* some fake salt for the sorting mechanisms */
11940
11941 salt->salt_buf[0] = pstoken->salt_buf[0];
11942 salt->salt_buf[1] = pstoken->salt_buf[1];
11943 salt->salt_buf[2] = pstoken->salt_buf[2];
11944 salt->salt_buf[3] = pstoken->salt_buf[3];
11945 salt->salt_buf[4] = pstoken->salt_buf[4];
11946 salt->salt_buf[5] = pstoken->salt_buf[5];
11947 salt->salt_buf[6] = pstoken->salt_buf[6];
11948 salt->salt_buf[7] = pstoken->salt_buf[7];
11949
11950 salt->salt_len = 32;
11951
11952 /* we need to check if we can precompute some of the data --
11953 this is possible since the scheme is badly designed */
11954
11955 pstoken->pc_digest[0] = SHA1M_A;
11956 pstoken->pc_digest[1] = SHA1M_B;
11957 pstoken->pc_digest[2] = SHA1M_C;
11958 pstoken->pc_digest[3] = SHA1M_D;
11959 pstoken->pc_digest[4] = SHA1M_E;
11960
11961 pstoken->pc_offset = 0;
11962
11963 for (int i = 0; i < (int) pstoken->salt_len - 64; i += 64)
11964 {
11965 uint w[16];
11966
11967 w[ 0] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 0]);
11968 w[ 1] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 1]);
11969 w[ 2] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 2]);
11970 w[ 3] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 3]);
11971 w[ 4] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 4]);
11972 w[ 5] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 5]);
11973 w[ 6] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 6]);
11974 w[ 7] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 7]);
11975 w[ 8] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 8]);
11976 w[ 9] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 9]);
11977 w[10] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 10]);
11978 w[11] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 11]);
11979 w[12] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 12]);
11980 w[13] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 13]);
11981 w[14] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 14]);
11982 w[15] = byte_swap_32 (pstoken->salt_buf[pstoken->pc_offset + 15]);
11983
11984 sha1_64 (w, pstoken->pc_digest);
11985
11986 pstoken->pc_offset += 16;
11987 }
11988
11989 return (PARSER_OK);
11990 }
11991
11992 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11993 {
11994 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11995
11996 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11997
11998 u32 *digest = (u32 *) hash_buf->digest;
11999
12000 u8 tmp_buf[100] = { 0 };
12001
12002 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
12003
12004 memcpy (digest, tmp_buf, 20);
12005
12006 digest[0] = byte_swap_32 (digest[0]);
12007 digest[1] = byte_swap_32 (digest[1]);
12008 digest[2] = byte_swap_32 (digest[2]);
12009 digest[3] = byte_swap_32 (digest[3]);
12010 digest[4] = byte_swap_32 (digest[4]);
12011
12012 digest[0] -= SHA1M_A;
12013 digest[1] -= SHA1M_B;
12014 digest[2] -= SHA1M_C;
12015 digest[3] -= SHA1M_D;
12016 digest[4] -= SHA1M_E;
12017
12018 return (PARSER_OK);
12019 }
12020
12021 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12022 {
12023 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
12024
12025 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12026
12027 u32 *digest = (u32 *) hash_buf->digest;
12028
12029 salt_t *salt = hash_buf->salt;
12030
12031 u8 tmp_buf[100] = { 0 };
12032
12033 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
12034
12035 if (tmp_len < 20) return (PARSER_HASH_LENGTH);
12036
12037 memcpy (digest, tmp_buf, 20);
12038
12039 int salt_len = tmp_len - 20;
12040
12041 if (salt_len < 0) return (PARSER_SALT_LENGTH);
12042
12043 salt->salt_len = salt_len;
12044
12045 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
12046
12047 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12048 {
12049 char *ptr = (char *) salt->salt_buf;
12050
12051 ptr[salt->salt_len] = 0x80;
12052 }
12053
12054 digest[0] = byte_swap_32 (digest[0]);
12055 digest[1] = byte_swap_32 (digest[1]);
12056 digest[2] = byte_swap_32 (digest[2]);
12057 digest[3] = byte_swap_32 (digest[3]);
12058 digest[4] = byte_swap_32 (digest[4]);
12059
12060 digest[0] -= SHA1M_A;
12061 digest[1] -= SHA1M_B;
12062 digest[2] -= SHA1M_C;
12063 digest[3] -= SHA1M_D;
12064 digest[4] -= SHA1M_E;
12065
12066 return (PARSER_OK);
12067 }
12068
12069 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12070 {
12071 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
12072
12073 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12074
12075 u32 *digest = (u32 *) hash_buf->digest;
12076
12077 salt_t *salt = hash_buf->salt;
12078
12079 char *salt_buf = input_buf + 6;
12080
12081 uint salt_len = 8;
12082
12083 char *salt_buf_ptr = (char *) salt->salt_buf;
12084
12085 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12086
12087 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12088
12089 salt->salt_len = salt_len;
12090
12091 char *hash_pos = input_buf + 6 + 8 + 40;
12092
12093 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12094 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12095 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12096 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12097 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12098
12099 digest[0] -= SHA1M_A;
12100 digest[1] -= SHA1M_B;
12101 digest[2] -= SHA1M_C;
12102 digest[3] -= SHA1M_D;
12103 digest[4] -= SHA1M_E;
12104
12105 return (PARSER_OK);
12106 }
12107
12108 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12109 {
12110 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
12111
12112 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12113
12114 u32 *digest = (u32 *) hash_buf->digest;
12115
12116 salt_t *salt = hash_buf->salt;
12117
12118 char *salt_buf = input_buf + 6;
12119
12120 uint salt_len = 8;
12121
12122 char *salt_buf_ptr = (char *) salt->salt_buf;
12123
12124 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12125
12126 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12127
12128 salt->salt_len = salt_len;
12129
12130 char *hash_pos = input_buf + 6 + 8;
12131
12132 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12133 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12134 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
12135 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
12136 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
12137
12138 digest[0] -= SHA1M_A;
12139 digest[1] -= SHA1M_B;
12140 digest[2] -= SHA1M_C;
12141 digest[3] -= SHA1M_D;
12142 digest[4] -= SHA1M_E;
12143
12144 return (PARSER_OK);
12145 }
12146
12147 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12148 {
12149 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
12150
12151 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12152
12153 u64 *digest = (u64 *) hash_buf->digest;
12154
12155 salt_t *salt = hash_buf->salt;
12156
12157 char *salt_buf = input_buf + 6;
12158
12159 uint salt_len = 8;
12160
12161 char *salt_buf_ptr = (char *) salt->salt_buf;
12162
12163 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12164
12165 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12166
12167 salt->salt_len = salt_len;
12168
12169 char *hash_pos = input_buf + 6 + 8;
12170
12171 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12172 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12173 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12174 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12175 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12176 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12177 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12178 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12179
12180 digest[0] -= SHA512M_A;
12181 digest[1] -= SHA512M_B;
12182 digest[2] -= SHA512M_C;
12183 digest[3] -= SHA512M_D;
12184 digest[4] -= SHA512M_E;
12185 digest[5] -= SHA512M_F;
12186 digest[6] -= SHA512M_G;
12187 digest[7] -= SHA512M_H;
12188
12189 return (PARSER_OK);
12190 }
12191
12192 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12193 {
12194 if (data.opts_type & OPTS_TYPE_ST_HEX)
12195 {
12196 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
12197 }
12198 else
12199 {
12200 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
12201 }
12202
12203 u32 *digest = (u32 *) hash_buf->digest;
12204
12205 salt_t *salt = hash_buf->salt;
12206
12207 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12208 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12209 digest[2] = 0;
12210 digest[3] = 0;
12211
12212 digest[0] = byte_swap_32 (digest[0]);
12213 digest[1] = byte_swap_32 (digest[1]);
12214
12215 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12216
12217 uint salt_len = input_len - 16 - 1;
12218
12219 char *salt_buf = input_buf + 16 + 1;
12220
12221 char *salt_buf_ptr = (char *) salt->salt_buf;
12222
12223 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12224
12225 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12226
12227 salt->salt_len = salt_len;
12228
12229 return (PARSER_OK);
12230 }
12231
12232 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12233 {
12234 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
12235
12236 u32 *digest = (u32 *) hash_buf->digest;
12237
12238 salt_t *salt = hash_buf->salt;
12239
12240 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12241 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12242 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12243 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12244 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12245
12246 digest[0] -= SHA1M_A;
12247 digest[1] -= SHA1M_B;
12248 digest[2] -= SHA1M_C;
12249 digest[3] -= SHA1M_D;
12250 digest[4] -= SHA1M_E;
12251
12252 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12253
12254 uint salt_len = input_len - 40 - 1;
12255
12256 char *salt_buf = input_buf + 40 + 1;
12257
12258 char *salt_buf_ptr = (char *) salt->salt_buf;
12259
12260 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12261
12262 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12263
12264 salt->salt_len = salt_len;
12265
12266 return (PARSER_OK);
12267 }
12268
12269 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12270 {
12271 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
12272
12273 u32 *digest = (u32 *) hash_buf->digest;
12274
12275 salt_t *salt = hash_buf->salt;
12276
12277 char *hash_pos = input_buf;
12278
12279 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
12280 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
12281 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
12282 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
12283 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
12284 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
12285 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
12286 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
12287 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
12288 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
12289 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
12290 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
12291 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
12292 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
12293 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
12294 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
12295
12296 char *salt_pos = input_buf + 128;
12297
12298 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12299 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12300 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12301 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12302
12303 salt->salt_iter = ROUNDS_ORACLET - 1;
12304 salt->salt_len = 16;
12305
12306 return (PARSER_OK);
12307 }
12308
12309 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12310 {
12311 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
12312
12313 u32 *digest = (u32 *) hash_buf->digest;
12314
12315 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12316 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12317 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12318 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12319 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12320 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12321 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12322 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12323
12324 digest[0] -= SHA256M_A;
12325 digest[1] -= SHA256M_B;
12326 digest[2] -= SHA256M_C;
12327 digest[3] -= SHA256M_D;
12328 digest[4] -= SHA256M_E;
12329 digest[5] -= SHA256M_F;
12330 digest[6] -= SHA256M_G;
12331 digest[7] -= SHA256M_H;
12332
12333 return (PARSER_OK);
12334 }
12335
12336 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12337 {
12338 if (data.opts_type & OPTS_TYPE_ST_HEX)
12339 {
12340 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
12341 }
12342 else
12343 {
12344 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
12345 }
12346
12347 u32 *digest = (u32 *) hash_buf->digest;
12348
12349 salt_t *salt = hash_buf->salt;
12350
12351 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12352 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12353 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12354 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12355 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12356 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12357 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12358 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12359
12360 digest[0] -= SHA256M_A;
12361 digest[1] -= SHA256M_B;
12362 digest[2] -= SHA256M_C;
12363 digest[3] -= SHA256M_D;
12364 digest[4] -= SHA256M_E;
12365 digest[5] -= SHA256M_F;
12366 digest[6] -= SHA256M_G;
12367 digest[7] -= SHA256M_H;
12368
12369 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12370
12371 uint salt_len = input_len - 64 - 1;
12372
12373 char *salt_buf = input_buf + 64 + 1;
12374
12375 char *salt_buf_ptr = (char *) salt->salt_buf;
12376
12377 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12378
12379 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12380
12381 salt->salt_len = salt_len;
12382
12383 return (PARSER_OK);
12384 }
12385
12386 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12387 {
12388 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
12389
12390 u64 *digest = (u64 *) hash_buf->digest;
12391
12392 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12393 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12394 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12395 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12396 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12397 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12398 digest[6] = 0;
12399 digest[7] = 0;
12400
12401 digest[0] -= SHA384M_A;
12402 digest[1] -= SHA384M_B;
12403 digest[2] -= SHA384M_C;
12404 digest[3] -= SHA384M_D;
12405 digest[4] -= SHA384M_E;
12406 digest[5] -= SHA384M_F;
12407 digest[6] -= 0;
12408 digest[7] -= 0;
12409
12410 return (PARSER_OK);
12411 }
12412
12413 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12414 {
12415 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
12416
12417 u64 *digest = (u64 *) hash_buf->digest;
12418
12419 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12420 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12421 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12422 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12423 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12424 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12425 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12426 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12427
12428 digest[0] -= SHA512M_A;
12429 digest[1] -= SHA512M_B;
12430 digest[2] -= SHA512M_C;
12431 digest[3] -= SHA512M_D;
12432 digest[4] -= SHA512M_E;
12433 digest[5] -= SHA512M_F;
12434 digest[6] -= SHA512M_G;
12435 digest[7] -= SHA512M_H;
12436
12437 return (PARSER_OK);
12438 }
12439
12440 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12441 {
12442 if (data.opts_type & OPTS_TYPE_ST_HEX)
12443 {
12444 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
12445 }
12446 else
12447 {
12448 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
12449 }
12450
12451 u64 *digest = (u64 *) hash_buf->digest;
12452
12453 salt_t *salt = hash_buf->salt;
12454
12455 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
12456 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
12457 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
12458 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
12459 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
12460 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
12461 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
12462 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
12463
12464 digest[0] -= SHA512M_A;
12465 digest[1] -= SHA512M_B;
12466 digest[2] -= SHA512M_C;
12467 digest[3] -= SHA512M_D;
12468 digest[4] -= SHA512M_E;
12469 digest[5] -= SHA512M_F;
12470 digest[6] -= SHA512M_G;
12471 digest[7] -= SHA512M_H;
12472
12473 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12474
12475 uint salt_len = input_len - 128 - 1;
12476
12477 char *salt_buf = input_buf + 128 + 1;
12478
12479 char *salt_buf_ptr = (char *) salt->salt_buf;
12480
12481 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12482
12483 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12484
12485 salt->salt_len = salt_len;
12486
12487 return (PARSER_OK);
12488 }
12489
12490 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12491 {
12492 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12493
12494 u64 *digest = (u64 *) hash_buf->digest;
12495
12496 salt_t *salt = hash_buf->salt;
12497
12498 char *salt_pos = input_buf + 3;
12499
12500 uint iterations_len = 0;
12501
12502 if (memcmp (salt_pos, "rounds=", 7) == 0)
12503 {
12504 salt_pos += 7;
12505
12506 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12507
12508 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12509 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12510
12511 salt_pos[0] = 0x0;
12512
12513 salt->salt_iter = atoi (salt_pos - iterations_len);
12514
12515 salt_pos += 1;
12516
12517 iterations_len += 8;
12518 }
12519 else
12520 {
12521 salt->salt_iter = ROUNDS_SHA512CRYPT;
12522 }
12523
12524 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12525
12526 char *hash_pos = strchr (salt_pos, '$');
12527
12528 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12529
12530 uint salt_len = hash_pos - salt_pos;
12531
12532 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12533
12534 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12535
12536 salt->salt_len = salt_len;
12537
12538 hash_pos++;
12539
12540 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12541
12542 return (PARSER_OK);
12543 }
12544
12545 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12546 {
12547 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12548
12549 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12550
12551 u64 *digest = (u64 *) hash_buf->digest;
12552
12553 salt_t *salt = hash_buf->salt;
12554
12555 uint keccak_mdlen = input_len / 2;
12556
12557 for (uint i = 0; i < keccak_mdlen / 8; i++)
12558 {
12559 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12560
12561 digest[i] = byte_swap_64 (digest[i]);
12562 }
12563
12564 salt->keccak_mdlen = keccak_mdlen;
12565
12566 return (PARSER_OK);
12567 }
12568
12569 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12570 {
12571 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12572
12573 u32 *digest = (u32 *) hash_buf->digest;
12574
12575 salt_t *salt = hash_buf->salt;
12576
12577 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12578
12579 /**
12580 * Parse that strange long line
12581 */
12582
12583 char *in_off[9];
12584
12585 size_t in_len[9] = { 0 };
12586
12587 in_off[0] = strtok (input_buf, ":");
12588
12589 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12590
12591 in_len[0] = strlen (in_off[0]);
12592
12593 size_t i;
12594
12595 for (i = 1; i < 9; i++)
12596 {
12597 in_off[i] = strtok (NULL, ":");
12598
12599 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12600
12601 in_len[i] = strlen (in_off[i]);
12602 }
12603
12604 char *ptr = (char *) ikepsk->msg_buf;
12605
12606 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12607 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12608 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12609 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12610 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12611 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12612
12613 *ptr = 0x80;
12614
12615 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12616
12617 ptr = (char *) ikepsk->nr_buf;
12618
12619 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12620 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12621
12622 *ptr = 0x80;
12623
12624 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12625
12626 /**
12627 * Store to database
12628 */
12629
12630 ptr = in_off[8];
12631
12632 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12633 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12634 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12635 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12636
12637 digest[0] = byte_swap_32 (digest[0]);
12638 digest[1] = byte_swap_32 (digest[1]);
12639 digest[2] = byte_swap_32 (digest[2]);
12640 digest[3] = byte_swap_32 (digest[3]);
12641
12642 salt->salt_len = 32;
12643
12644 salt->salt_buf[0] = ikepsk->nr_buf[0];
12645 salt->salt_buf[1] = ikepsk->nr_buf[1];
12646 salt->salt_buf[2] = ikepsk->nr_buf[2];
12647 salt->salt_buf[3] = ikepsk->nr_buf[3];
12648 salt->salt_buf[4] = ikepsk->nr_buf[4];
12649 salt->salt_buf[5] = ikepsk->nr_buf[5];
12650 salt->salt_buf[6] = ikepsk->nr_buf[6];
12651 salt->salt_buf[7] = ikepsk->nr_buf[7];
12652
12653 return (PARSER_OK);
12654 }
12655
12656 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12657 {
12658 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12659
12660 u32 *digest = (u32 *) hash_buf->digest;
12661
12662 salt_t *salt = hash_buf->salt;
12663
12664 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12665
12666 /**
12667 * Parse that strange long line
12668 */
12669
12670 char *in_off[9];
12671
12672 size_t in_len[9] = { 0 };
12673
12674 in_off[0] = strtok (input_buf, ":");
12675
12676 if (in_off[0] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12677
12678 in_len[0] = strlen (in_off[0]);
12679
12680 size_t i;
12681
12682 for (i = 1; i < 9; i++)
12683 {
12684 in_off[i] = strtok (NULL, ":");
12685
12686 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12687
12688 in_len[i] = strlen (in_off[i]);
12689 }
12690
12691 char *ptr = (char *) ikepsk->msg_buf;
12692
12693 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12694 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12695 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12696 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12697 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12698 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12699
12700 *ptr = 0x80;
12701
12702 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12703
12704 ptr = (char *) ikepsk->nr_buf;
12705
12706 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12707 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12708
12709 *ptr = 0x80;
12710
12711 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12712
12713 /**
12714 * Store to database
12715 */
12716
12717 ptr = in_off[8];
12718
12719 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12720 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12721 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12722 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12723 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12724
12725 salt->salt_len = 32;
12726
12727 salt->salt_buf[0] = ikepsk->nr_buf[0];
12728 salt->salt_buf[1] = ikepsk->nr_buf[1];
12729 salt->salt_buf[2] = ikepsk->nr_buf[2];
12730 salt->salt_buf[3] = ikepsk->nr_buf[3];
12731 salt->salt_buf[4] = ikepsk->nr_buf[4];
12732 salt->salt_buf[5] = ikepsk->nr_buf[5];
12733 salt->salt_buf[6] = ikepsk->nr_buf[6];
12734 salt->salt_buf[7] = ikepsk->nr_buf[7];
12735
12736 return (PARSER_OK);
12737 }
12738
12739 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12740 {
12741 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12742
12743 u32 *digest = (u32 *) hash_buf->digest;
12744
12745 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12746 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12747 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12748 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12749 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12750
12751 digest[0] = byte_swap_32 (digest[0]);
12752 digest[1] = byte_swap_32 (digest[1]);
12753 digest[2] = byte_swap_32 (digest[2]);
12754 digest[3] = byte_swap_32 (digest[3]);
12755 digest[4] = byte_swap_32 (digest[4]);
12756
12757 return (PARSER_OK);
12758 }
12759
12760 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12761 {
12762 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12763
12764 u32 *digest = (u32 *) hash_buf->digest;
12765
12766 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12767 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12768 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12769 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12770 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12771 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12772 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12773 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12774 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12775 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12776 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12777 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12778 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12779 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12780 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12781 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12782
12783 return (PARSER_OK);
12784 }
12785
12786 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12787 {
12788 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12789
12790 u32 *digest = (u32 *) hash_buf->digest;
12791
12792 salt_t *salt = hash_buf->salt;
12793
12794 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12795 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12796 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12797 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12798 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12799
12800 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12801
12802 uint salt_len = input_len - 40 - 1;
12803
12804 char *salt_buf = input_buf + 40 + 1;
12805
12806 char *salt_buf_ptr = (char *) salt->salt_buf;
12807
12808 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12809
12810 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12811
12812 salt->salt_len = salt_len;
12813
12814 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12815
12816 return (PARSER_OK);
12817 }
12818
12819 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12820 {
12821 u32 *digest = (u32 *) hash_buf->digest;
12822
12823 salt_t *salt = hash_buf->salt;
12824
12825 tc_t *tc = (tc_t *) hash_buf->esalt;
12826
12827 if (input_len == 0)
12828 {
12829 log_error ("TrueCrypt container not specified");
12830
12831 exit (-1);
12832 }
12833
12834 FILE *fp = fopen (input_buf, "rb");
12835
12836 if (fp == NULL)
12837 {
12838 log_error ("%s: %s", input_buf, strerror (errno));
12839
12840 exit (-1);
12841 }
12842
12843 char buf[512] = { 0 };
12844
12845 int n = fread (buf, 1, sizeof (buf), fp);
12846
12847 fclose (fp);
12848
12849 if (n != 512) return (PARSER_TC_FILE_SIZE);
12850
12851 memcpy (tc->salt_buf, buf, 64);
12852
12853 memcpy (tc->data_buf, buf + 64, 512 - 64);
12854
12855 salt->salt_buf[0] = tc->salt_buf[0];
12856
12857 salt->salt_len = 4;
12858
12859 salt->salt_iter = ROUNDS_TRUECRYPT_1K - 1;
12860
12861 tc->signature = 0x45555254; // "TRUE"
12862
12863 digest[0] = tc->data_buf[0];
12864
12865 return (PARSER_OK);
12866 }
12867
12868 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12869 {
12870 u32 *digest = (u32 *) hash_buf->digest;
12871
12872 salt_t *salt = hash_buf->salt;
12873
12874 tc_t *tc = (tc_t *) hash_buf->esalt;
12875
12876 if (input_len == 0)
12877 {
12878 log_error ("TrueCrypt container not specified");
12879
12880 exit (-1);
12881 }
12882
12883 FILE *fp = fopen (input_buf, "rb");
12884
12885 if (fp == NULL)
12886 {
12887 log_error ("%s: %s", input_buf, strerror (errno));
12888
12889 exit (-1);
12890 }
12891
12892 char buf[512] = { 0 };
12893
12894 int n = fread (buf, 1, sizeof (buf), fp);
12895
12896 fclose (fp);
12897
12898 if (n != 512) return (PARSER_TC_FILE_SIZE);
12899
12900 memcpy (tc->salt_buf, buf, 64);
12901
12902 memcpy (tc->data_buf, buf + 64, 512 - 64);
12903
12904 salt->salt_buf[0] = tc->salt_buf[0];
12905
12906 salt->salt_len = 4;
12907
12908 salt->salt_iter = ROUNDS_TRUECRYPT_2K - 1;
12909
12910 tc->signature = 0x45555254; // "TRUE"
12911
12912 digest[0] = tc->data_buf[0];
12913
12914 return (PARSER_OK);
12915 }
12916
12917 int veracrypt_parse_hash_200000 (char *input_buf, uint input_len, hash_t *hash_buf)
12918 {
12919 u32 *digest = (u32 *) hash_buf->digest;
12920
12921 salt_t *salt = hash_buf->salt;
12922
12923 tc_t *tc = (tc_t *) hash_buf->esalt;
12924
12925 if (input_len == 0)
12926 {
12927 log_error ("VeraCrypt container not specified");
12928
12929 exit (-1);
12930 }
12931
12932 FILE *fp = fopen (input_buf, "rb");
12933
12934 if (fp == NULL)
12935 {
12936 log_error ("%s: %s", input_buf, strerror (errno));
12937
12938 exit (-1);
12939 }
12940
12941 char buf[512] = { 0 };
12942
12943 int n = fread (buf, 1, sizeof (buf), fp);
12944
12945 fclose (fp);
12946
12947 if (n != 512) return (PARSER_VC_FILE_SIZE);
12948
12949 memcpy (tc->salt_buf, buf, 64);
12950
12951 memcpy (tc->data_buf, buf + 64, 512 - 64);
12952
12953 salt->salt_buf[0] = tc->salt_buf[0];
12954
12955 salt->salt_len = 4;
12956
12957 salt->salt_iter = ROUNDS_VERACRYPT_200000 - 1;
12958
12959 tc->signature = 0x41524556; // "VERA"
12960
12961 digest[0] = tc->data_buf[0];
12962
12963 return (PARSER_OK);
12964 }
12965
12966 int veracrypt_parse_hash_500000 (char *input_buf, uint input_len, hash_t *hash_buf)
12967 {
12968 u32 *digest = (u32 *) hash_buf->digest;
12969
12970 salt_t *salt = hash_buf->salt;
12971
12972 tc_t *tc = (tc_t *) hash_buf->esalt;
12973
12974 if (input_len == 0)
12975 {
12976 log_error ("VeraCrypt container not specified");
12977
12978 exit (-1);
12979 }
12980
12981 FILE *fp = fopen (input_buf, "rb");
12982
12983 if (fp == NULL)
12984 {
12985 log_error ("%s: %s", input_buf, strerror (errno));
12986
12987 exit (-1);
12988 }
12989
12990 char buf[512] = { 0 };
12991
12992 int n = fread (buf, 1, sizeof (buf), fp);
12993
12994 fclose (fp);
12995
12996 if (n != 512) return (PARSER_VC_FILE_SIZE);
12997
12998 memcpy (tc->salt_buf, buf, 64);
12999
13000 memcpy (tc->data_buf, buf + 64, 512 - 64);
13001
13002 salt->salt_buf[0] = tc->salt_buf[0];
13003
13004 salt->salt_len = 4;
13005
13006 salt->salt_iter = ROUNDS_VERACRYPT_500000 - 1;
13007
13008 tc->signature = 0x41524556; // "VERA"
13009
13010 digest[0] = tc->data_buf[0];
13011
13012 return (PARSER_OK);
13013 }
13014
13015 int veracrypt_parse_hash_327661 (char *input_buf, uint input_len, hash_t *hash_buf)
13016 {
13017 u32 *digest = (u32 *) hash_buf->digest;
13018
13019 salt_t *salt = hash_buf->salt;
13020
13021 tc_t *tc = (tc_t *) hash_buf->esalt;
13022
13023 if (input_len == 0)
13024 {
13025 log_error ("VeraCrypt container not specified");
13026
13027 exit (-1);
13028 }
13029
13030 FILE *fp = fopen (input_buf, "rb");
13031
13032 if (fp == NULL)
13033 {
13034 log_error ("%s: %s", input_buf, strerror (errno));
13035
13036 exit (-1);
13037 }
13038
13039 char buf[512] = { 0 };
13040
13041 int n = fread (buf, 1, sizeof (buf), fp);
13042
13043 fclose (fp);
13044
13045 if (n != 512) return (PARSER_VC_FILE_SIZE);
13046
13047 memcpy (tc->salt_buf, buf, 64);
13048
13049 memcpy (tc->data_buf, buf + 64, 512 - 64);
13050
13051 salt->salt_buf[0] = tc->salt_buf[0];
13052
13053 salt->salt_len = 4;
13054
13055 salt->salt_iter = ROUNDS_VERACRYPT_327661 - 1;
13056
13057 tc->signature = 0x41524556; // "VERA"
13058
13059 digest[0] = tc->data_buf[0];
13060
13061 return (PARSER_OK);
13062 }
13063
13064 int veracrypt_parse_hash_655331 (char *input_buf, uint input_len, hash_t *hash_buf)
13065 {
13066 u32 *digest = (u32 *) hash_buf->digest;
13067
13068 salt_t *salt = hash_buf->salt;
13069
13070 tc_t *tc = (tc_t *) hash_buf->esalt;
13071
13072 if (input_len == 0)
13073 {
13074 log_error ("VeraCrypt container not specified");
13075
13076 exit (-1);
13077 }
13078
13079 FILE *fp = fopen (input_buf, "rb");
13080
13081 if (fp == NULL)
13082 {
13083 log_error ("%s: %s", input_buf, strerror (errno));
13084
13085 exit (-1);
13086 }
13087
13088 char buf[512] = { 0 };
13089
13090 int n = fread (buf, 1, sizeof (buf), fp);
13091
13092 fclose (fp);
13093
13094 if (n != 512) return (PARSER_VC_FILE_SIZE);
13095
13096 memcpy (tc->salt_buf, buf, 64);
13097
13098 memcpy (tc->data_buf, buf + 64, 512 - 64);
13099
13100 salt->salt_buf[0] = tc->salt_buf[0];
13101
13102 salt->salt_len = 4;
13103
13104 salt->salt_iter = ROUNDS_VERACRYPT_655331 - 1;
13105
13106 tc->signature = 0x41524556; // "VERA"
13107
13108 digest[0] = tc->data_buf[0];
13109
13110 return (PARSER_OK);
13111 }
13112
13113 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13114 {
13115 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
13116
13117 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13118
13119 u32 *digest = (u32 *) hash_buf->digest;
13120
13121 salt_t *salt = hash_buf->salt;
13122
13123 char *salt_pos = input_buf + 6;
13124
13125 char *hash_pos = strchr (salt_pos, '$');
13126
13127 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13128
13129 uint salt_len = hash_pos - salt_pos;
13130
13131 if (salt_len < 8) return (PARSER_SALT_LENGTH);
13132
13133 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13134
13135 salt->salt_len = salt_len;
13136
13137 salt->salt_iter = 1000;
13138
13139 hash_pos++;
13140
13141 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13142
13143 return (PARSER_OK);
13144 }
13145
13146 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13147 {
13148 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
13149
13150 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
13151
13152 u32 *digest = (u32 *) hash_buf->digest;
13153
13154 salt_t *salt = hash_buf->salt;
13155
13156 char *iter_pos = input_buf + 7;
13157
13158 char *salt_pos = strchr (iter_pos, '$');
13159
13160 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13161
13162 salt_pos++;
13163
13164 char *hash_pos = strchr (salt_pos, '$');
13165
13166 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13167
13168 uint salt_len = hash_pos - salt_pos;
13169
13170 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13171
13172 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13173
13174 salt->salt_len = salt_len;
13175
13176 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13177
13178 salt->salt_sign[0] = atoi (salt_iter);
13179
13180 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13181
13182 hash_pos++;
13183
13184 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13185
13186 digest[0] = byte_swap_32 (digest[0]);
13187 digest[1] = byte_swap_32 (digest[1]);
13188 digest[2] = byte_swap_32 (digest[2]);
13189 digest[3] = byte_swap_32 (digest[3]);
13190 digest[4] = byte_swap_32 (digest[4]);
13191
13192 return (PARSER_OK);
13193 }
13194
13195 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13196 {
13197 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
13198
13199 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13200
13201 u32 *digest = (u32 *) hash_buf->digest;
13202
13203 salt_t *salt = hash_buf->salt;
13204
13205 char *iter_pos = input_buf + 9;
13206
13207 char *salt_pos = strchr (iter_pos, '$');
13208
13209 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13210
13211 salt_pos++;
13212
13213 char *hash_pos = strchr (salt_pos, '$');
13214
13215 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13216
13217 uint salt_len = hash_pos - salt_pos;
13218
13219 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13220
13221 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13222
13223 salt->salt_len = salt_len;
13224
13225 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13226
13227 salt->salt_sign[0] = atoi (salt_iter);
13228
13229 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13230
13231 hash_pos++;
13232
13233 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13234
13235 digest[0] = byte_swap_32 (digest[0]);
13236 digest[1] = byte_swap_32 (digest[1]);
13237 digest[2] = byte_swap_32 (digest[2]);
13238 digest[3] = byte_swap_32 (digest[3]);
13239 digest[4] = byte_swap_32 (digest[4]);
13240 digest[5] = byte_swap_32 (digest[5]);
13241 digest[6] = byte_swap_32 (digest[6]);
13242 digest[7] = byte_swap_32 (digest[7]);
13243
13244 return (PARSER_OK);
13245 }
13246
13247 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13248 {
13249 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
13250
13251 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13252
13253 u64 *digest = (u64 *) hash_buf->digest;
13254
13255 salt_t *salt = hash_buf->salt;
13256
13257 char *iter_pos = input_buf + 9;
13258
13259 char *salt_pos = strchr (iter_pos, '$');
13260
13261 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13262
13263 salt_pos++;
13264
13265 char *hash_pos = strchr (salt_pos, '$');
13266
13267 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13268
13269 uint salt_len = hash_pos - salt_pos;
13270
13271 if (salt_len < 16) return (PARSER_SALT_LENGTH);
13272
13273 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13274
13275 salt->salt_len = salt_len;
13276
13277 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
13278
13279 salt->salt_sign[0] = atoi (salt_iter);
13280
13281 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
13282
13283 hash_pos++;
13284
13285 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13286
13287 digest[0] = byte_swap_64 (digest[0]);
13288 digest[1] = byte_swap_64 (digest[1]);
13289 digest[2] = byte_swap_64 (digest[2]);
13290 digest[3] = byte_swap_64 (digest[3]);
13291 digest[4] = byte_swap_64 (digest[4]);
13292 digest[5] = byte_swap_64 (digest[5]);
13293 digest[6] = byte_swap_64 (digest[6]);
13294 digest[7] = byte_swap_64 (digest[7]);
13295
13296 return (PARSER_OK);
13297 }
13298
13299 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13300 {
13301 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
13302
13303 u32 *digest = (u32 *) hash_buf->digest;
13304
13305 salt_t *salt = hash_buf->salt;
13306
13307 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
13308
13309 /**
13310 * parse line
13311 */
13312
13313 char *iterations_pos = input_buf;
13314
13315 char *saltbuf_pos = strchr (iterations_pos, ':');
13316
13317 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13318
13319 uint iterations_len = saltbuf_pos - iterations_pos;
13320
13321 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
13322
13323 saltbuf_pos++;
13324
13325 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
13326
13327 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13328
13329 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
13330
13331 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
13332
13333 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
13334
13335 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
13336
13337 cipherbuf_pos++;
13338
13339 /**
13340 * pbkdf2 iterations
13341 */
13342
13343 salt->salt_iter = atoi (iterations_pos) - 1;
13344
13345 /**
13346 * handle salt encoding
13347 */
13348
13349 char *saltbuf_ptr = (char *) salt->salt_buf;
13350
13351 for (uint i = 0; i < saltbuf_len; i += 2)
13352 {
13353 const char p0 = saltbuf_pos[i + 0];
13354 const char p1 = saltbuf_pos[i + 1];
13355
13356 *saltbuf_ptr++ = hex_convert (p1) << 0
13357 | hex_convert (p0) << 4;
13358 }
13359
13360 salt->salt_len = saltbuf_len / 2;
13361
13362 /**
13363 * handle cipher encoding
13364 */
13365
13366 uint *tmp = (uint *) mymalloc (32);
13367
13368 char *cipherbuf_ptr = (char *) tmp;
13369
13370 for (uint i = 2016; i < cipherbuf_len; i += 2)
13371 {
13372 const char p0 = cipherbuf_pos[i + 0];
13373 const char p1 = cipherbuf_pos[i + 1];
13374
13375 *cipherbuf_ptr++ = hex_convert (p1) << 0
13376 | hex_convert (p0) << 4;
13377 }
13378
13379 // iv is stored at salt_buf 4 (length 16)
13380 // data is stored at salt_buf 8 (length 16)
13381
13382 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
13383 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
13384 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
13385 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
13386
13387 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
13388 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
13389 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
13390 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
13391
13392 free (tmp);
13393
13394 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
13395 {
13396 const char p0 = cipherbuf_pos[j + 0];
13397 const char p1 = cipherbuf_pos[j + 1];
13398
13399 agilekey->cipher[i] = hex_convert (p1) << 0
13400 | hex_convert (p0) << 4;
13401 }
13402
13403 /**
13404 * digest buf
13405 */
13406
13407 digest[0] = 0x10101010;
13408 digest[1] = 0x10101010;
13409 digest[2] = 0x10101010;
13410 digest[3] = 0x10101010;
13411
13412 return (PARSER_OK);
13413 }
13414
13415 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13416 {
13417 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
13418
13419 u32 *digest = (u32 *) hash_buf->digest;
13420
13421 salt_t *salt = hash_buf->salt;
13422
13423 char *hashbuf_pos = input_buf;
13424
13425 char *iterations_pos = strchr (hashbuf_pos, ':');
13426
13427 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13428
13429 uint hash_len = iterations_pos - hashbuf_pos;
13430
13431 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
13432
13433 iterations_pos++;
13434
13435 char *saltbuf_pos = strchr (iterations_pos, ':');
13436
13437 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13438
13439 uint iterations_len = saltbuf_pos - iterations_pos;
13440
13441 saltbuf_pos++;
13442
13443 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
13444
13445 if (salt_len > 32) return (PARSER_SALT_LENGTH);
13446
13447 char *salt_buf_ptr = (char *) salt->salt_buf;
13448
13449 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
13450
13451 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13452
13453 salt->salt_len = salt_len;
13454
13455 salt->salt_iter = atoi (iterations_pos) - 1;
13456
13457 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13458 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13459 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13460 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13461
13462 return (PARSER_OK);
13463 }
13464
13465 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13466 {
13467 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
13468
13469 u32 *digest = (u32 *) hash_buf->digest;
13470
13471 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13472 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13473 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13474 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13475 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13476 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13477 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13478 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13479
13480 digest[0] = byte_swap_32 (digest[0]);
13481 digest[1] = byte_swap_32 (digest[1]);
13482 digest[2] = byte_swap_32 (digest[2]);
13483 digest[3] = byte_swap_32 (digest[3]);
13484 digest[4] = byte_swap_32 (digest[4]);
13485 digest[5] = byte_swap_32 (digest[5]);
13486 digest[6] = byte_swap_32 (digest[6]);
13487 digest[7] = byte_swap_32 (digest[7]);
13488
13489 return (PARSER_OK);
13490 }
13491
13492 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13493 {
13494 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13495
13496 u32 *digest = (u32 *) hash_buf->digest;
13497
13498 salt_t *salt = hash_buf->salt;
13499
13500 char *salt_pos = input_buf + 3;
13501
13502 uint iterations_len = 0;
13503
13504 if (memcmp (salt_pos, "rounds=", 7) == 0)
13505 {
13506 salt_pos += 7;
13507
13508 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
13509
13510 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
13511 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
13512
13513 salt_pos[0] = 0x0;
13514
13515 salt->salt_iter = atoi (salt_pos - iterations_len);
13516
13517 salt_pos += 1;
13518
13519 iterations_len += 8;
13520 }
13521 else
13522 {
13523 salt->salt_iter = ROUNDS_SHA256CRYPT;
13524 }
13525
13526 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
13527
13528 char *hash_pos = strchr (salt_pos, '$');
13529
13530 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13531
13532 uint salt_len = hash_pos - salt_pos;
13533
13534 if (salt_len > 16) return (PARSER_SALT_LENGTH);
13535
13536 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13537
13538 salt->salt_len = salt_len;
13539
13540 hash_pos++;
13541
13542 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13543
13544 return (PARSER_OK);
13545 }
13546
13547 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13548 {
13549 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
13550
13551 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13552
13553 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
13554
13555 u64 *digest = (u64 *) hash_buf->digest;
13556
13557 salt_t *salt = hash_buf->salt;
13558
13559 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13560
13561 char *iter_pos = input_buf + 4;
13562
13563 char *salt_pos = strchr (iter_pos, '$');
13564
13565 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13566
13567 salt_pos++;
13568
13569 char *hash_pos = strchr (salt_pos, '$');
13570
13571 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13572
13573 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13574
13575 hash_pos++;
13576
13577 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13578 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13579 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13580 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13581 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13582 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13583 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13584 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13585
13586 uint salt_len = hash_pos - salt_pos - 1;
13587
13588 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
13589
13590 salt->salt_len = salt_len / 2;
13591
13592 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
13593 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
13594 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
13595 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
13596 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
13597 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
13598 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
13599 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
13600
13601 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
13602 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
13603 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
13604 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
13605 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
13606 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
13607 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
13608 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
13609 pbkdf2_sha512->salt_buf[8] = 0x01000000;
13610 pbkdf2_sha512->salt_buf[9] = 0x80;
13611
13612 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13613
13614 salt->salt_iter = atoi (iter_pos) - 1;
13615
13616 return (PARSER_OK);
13617 }
13618
13619 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13620 {
13621 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
13622
13623 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
13624
13625 u32 *digest = (u32 *) hash_buf->digest;
13626
13627 salt_t *salt = hash_buf->salt;
13628
13629 char *salt_pos = input_buf + 14;
13630
13631 char *hash_pos = strchr (salt_pos, '*');
13632
13633 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13634
13635 hash_pos++;
13636
13637 uint salt_len = hash_pos - salt_pos - 1;
13638
13639 char *salt_buf_ptr = (char *) salt->salt_buf;
13640
13641 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13642
13643 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13644
13645 salt->salt_len = salt_len;
13646
13647 u8 tmp_buf[100] = { 0 };
13648
13649 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
13650
13651 memcpy (digest, tmp_buf, 32);
13652
13653 digest[0] = byte_swap_32 (digest[0]);
13654 digest[1] = byte_swap_32 (digest[1]);
13655 digest[2] = byte_swap_32 (digest[2]);
13656 digest[3] = byte_swap_32 (digest[3]);
13657 digest[4] = byte_swap_32 (digest[4]);
13658 digest[5] = byte_swap_32 (digest[5]);
13659 digest[6] = byte_swap_32 (digest[6]);
13660 digest[7] = byte_swap_32 (digest[7]);
13661
13662 digest[0] -= SHA256M_A;
13663 digest[1] -= SHA256M_B;
13664 digest[2] -= SHA256M_C;
13665 digest[3] -= SHA256M_D;
13666 digest[4] -= SHA256M_E;
13667 digest[5] -= SHA256M_F;
13668 digest[6] -= SHA256M_G;
13669 digest[7] -= SHA256M_H;
13670
13671 return (PARSER_OK);
13672 }
13673
13674 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13675 {
13676 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
13677
13678 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
13679
13680 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13681
13682 u64 *digest = (u64 *) hash_buf->digest;
13683
13684 salt_t *salt = hash_buf->salt;
13685
13686 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13687
13688 char *iter_pos = input_buf + 19;
13689
13690 char *salt_pos = strchr (iter_pos, '.');
13691
13692 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13693
13694 salt_pos++;
13695
13696 char *hash_pos = strchr (salt_pos, '.');
13697
13698 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13699
13700 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13701
13702 hash_pos++;
13703
13704 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13705 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13706 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13707 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13708 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13709 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13710 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13711 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13712
13713 uint salt_len = hash_pos - salt_pos - 1;
13714
13715 salt_len /= 2;
13716
13717 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13718
13719 uint i;
13720
13721 for (i = 0; i < salt_len; i++)
13722 {
13723 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13724 }
13725
13726 salt_buf_ptr[salt_len + 3] = 0x01;
13727 salt_buf_ptr[salt_len + 4] = 0x80;
13728
13729 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13730
13731 salt->salt_len = salt_len;
13732
13733 salt->salt_iter = atoi (iter_pos) - 1;
13734
13735 return (PARSER_OK);
13736 }
13737
13738 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13739 {
13740 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13741
13742 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13743
13744 u64 *digest = (u64 *) hash_buf->digest;
13745
13746 salt_t *salt = hash_buf->salt;
13747
13748 u8 tmp_buf[120] = { 0 };
13749
13750 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13751
13752 if (tmp_len < 64) return (PARSER_HASH_LENGTH);
13753
13754 memcpy (digest, tmp_buf, 64);
13755
13756 digest[0] = byte_swap_64 (digest[0]);
13757 digest[1] = byte_swap_64 (digest[1]);
13758 digest[2] = byte_swap_64 (digest[2]);
13759 digest[3] = byte_swap_64 (digest[3]);
13760 digest[4] = byte_swap_64 (digest[4]);
13761 digest[5] = byte_swap_64 (digest[5]);
13762 digest[6] = byte_swap_64 (digest[6]);
13763 digest[7] = byte_swap_64 (digest[7]);
13764
13765 digest[0] -= SHA512M_A;
13766 digest[1] -= SHA512M_B;
13767 digest[2] -= SHA512M_C;
13768 digest[3] -= SHA512M_D;
13769 digest[4] -= SHA512M_E;
13770 digest[5] -= SHA512M_F;
13771 digest[6] -= SHA512M_G;
13772 digest[7] -= SHA512M_H;
13773
13774 int salt_len = tmp_len - 64;
13775
13776 if (salt_len < 0) return (PARSER_SALT_LENGTH);
13777
13778 salt->salt_len = salt_len;
13779
13780 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13781
13782 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13783 {
13784 char *ptr = (char *) salt->salt_buf;
13785
13786 ptr[salt->salt_len] = 0x80;
13787 }
13788
13789 return (PARSER_OK);
13790 }
13791
13792 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13793 {
13794 if (data.opts_type & OPTS_TYPE_ST_HEX)
13795 {
13796 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13797 }
13798 else
13799 {
13800 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13801 }
13802
13803 u32 *digest = (u32 *) hash_buf->digest;
13804
13805 salt_t *salt = hash_buf->salt;
13806
13807 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13808 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13809 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13810 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13811
13812 digest[0] = byte_swap_32 (digest[0]);
13813 digest[1] = byte_swap_32 (digest[1]);
13814 digest[2] = byte_swap_32 (digest[2]);
13815 digest[3] = byte_swap_32 (digest[3]);
13816
13817 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13818
13819 uint salt_len = input_len - 32 - 1;
13820
13821 char *salt_buf = input_buf + 32 + 1;
13822
13823 char *salt_buf_ptr = (char *) salt->salt_buf;
13824
13825 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13826
13827 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13828
13829 salt->salt_len = salt_len;
13830
13831 return (PARSER_OK);
13832 }
13833
13834 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13835 {
13836 if (data.opts_type & OPTS_TYPE_ST_HEX)
13837 {
13838 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13839 }
13840 else
13841 {
13842 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13843 }
13844
13845 u32 *digest = (u32 *) hash_buf->digest;
13846
13847 salt_t *salt = hash_buf->salt;
13848
13849 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13850 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13851 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13852 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13853 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13854
13855 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13856
13857 uint salt_len = input_len - 40 - 1;
13858
13859 char *salt_buf = input_buf + 40 + 1;
13860
13861 char *salt_buf_ptr = (char *) salt->salt_buf;
13862
13863 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13864
13865 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13866
13867 salt->salt_len = salt_len;
13868
13869 return (PARSER_OK);
13870 }
13871
13872 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13873 {
13874 if (data.opts_type & OPTS_TYPE_ST_HEX)
13875 {
13876 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13877 }
13878 else
13879 {
13880 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13881 }
13882
13883 u32 *digest = (u32 *) hash_buf->digest;
13884
13885 salt_t *salt = hash_buf->salt;
13886
13887 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13888 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13889 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13890 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13891 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13892 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13893 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13894 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13895
13896 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13897
13898 uint salt_len = input_len - 64 - 1;
13899
13900 char *salt_buf = input_buf + 64 + 1;
13901
13902 char *salt_buf_ptr = (char *) salt->salt_buf;
13903
13904 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13905
13906 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13907
13908 salt->salt_len = salt_len;
13909
13910 return (PARSER_OK);
13911 }
13912
13913 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13914 {
13915 if (data.opts_type & OPTS_TYPE_ST_HEX)
13916 {
13917 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13918 }
13919 else
13920 {
13921 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13922 }
13923
13924 u64 *digest = (u64 *) hash_buf->digest;
13925
13926 salt_t *salt = hash_buf->salt;
13927
13928 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13929 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13930 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13931 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
13932 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
13933 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
13934 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
13935 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
13936
13937 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13938
13939 uint salt_len = input_len - 128 - 1;
13940
13941 char *salt_buf = input_buf + 128 + 1;
13942
13943 char *salt_buf_ptr = (char *) salt->salt_buf;
13944
13945 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13946
13947 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13948
13949 salt->salt_len = salt_len;
13950
13951 return (PARSER_OK);
13952 }
13953
13954 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13955 {
13956 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13957
13958 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13959
13960 u32 *digest = (u32 *) hash_buf->digest;
13961
13962 salt_t *salt = hash_buf->salt;
13963
13964 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13965
13966 /**
13967 * parse line
13968 */
13969
13970 char *user_pos = input_buf + 10 + 1;
13971
13972 char *realm_pos = strchr (user_pos, '$');
13973
13974 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13975
13976 uint user_len = realm_pos - user_pos;
13977
13978 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13979
13980 realm_pos++;
13981
13982 char *salt_pos = strchr (realm_pos, '$');
13983
13984 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13985
13986 uint realm_len = salt_pos - realm_pos;
13987
13988 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13989
13990 salt_pos++;
13991
13992 char *data_pos = strchr (salt_pos, '$');
13993
13994 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13995
13996 uint salt_len = data_pos - salt_pos;
13997
13998 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13999
14000 data_pos++;
14001
14002 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
14003
14004 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
14005
14006 /**
14007 * copy data
14008 */
14009
14010 memcpy (krb5pa->user, user_pos, user_len);
14011 memcpy (krb5pa->realm, realm_pos, realm_len);
14012 memcpy (krb5pa->salt, salt_pos, salt_len);
14013
14014 char *timestamp_ptr = (char *) krb5pa->timestamp;
14015
14016 for (uint i = 0; i < (36 * 2); i += 2)
14017 {
14018 const char p0 = data_pos[i + 0];
14019 const char p1 = data_pos[i + 1];
14020
14021 *timestamp_ptr++ = hex_convert (p1) << 0
14022 | hex_convert (p0) << 4;
14023 }
14024
14025 char *checksum_ptr = (char *) krb5pa->checksum;
14026
14027 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
14028 {
14029 const char p0 = data_pos[i + 0];
14030 const char p1 = data_pos[i + 1];
14031
14032 *checksum_ptr++ = hex_convert (p1) << 0
14033 | hex_convert (p0) << 4;
14034 }
14035
14036 /**
14037 * copy some data to generic buffers to make sorting happy
14038 */
14039
14040 salt->salt_buf[0] = krb5pa->timestamp[0];
14041 salt->salt_buf[1] = krb5pa->timestamp[1];
14042 salt->salt_buf[2] = krb5pa->timestamp[2];
14043 salt->salt_buf[3] = krb5pa->timestamp[3];
14044 salt->salt_buf[4] = krb5pa->timestamp[4];
14045 salt->salt_buf[5] = krb5pa->timestamp[5];
14046 salt->salt_buf[6] = krb5pa->timestamp[6];
14047 salt->salt_buf[7] = krb5pa->timestamp[7];
14048 salt->salt_buf[8] = krb5pa->timestamp[8];
14049
14050 salt->salt_len = 36;
14051
14052 digest[0] = krb5pa->checksum[0];
14053 digest[1] = krb5pa->checksum[1];
14054 digest[2] = krb5pa->checksum[2];
14055 digest[3] = krb5pa->checksum[3];
14056
14057 return (PARSER_OK);
14058 }
14059
14060 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14061 {
14062 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
14063
14064 u32 *digest = (u32 *) hash_buf->digest;
14065
14066 salt_t *salt = hash_buf->salt;
14067
14068 /**
14069 * parse line
14070 */
14071
14072 char *salt_pos = input_buf;
14073
14074 char *hash_pos = strchr (salt_pos, '$');
14075
14076 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14077
14078 uint salt_len = hash_pos - salt_pos;
14079
14080 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14081
14082 hash_pos++;
14083
14084 uint hash_len = input_len - 1 - salt_len;
14085
14086 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14087
14088 /**
14089 * valid some data
14090 */
14091
14092 uint user_len = 0;
14093
14094 for (uint i = 0; i < salt_len; i++)
14095 {
14096 if (salt_pos[i] == ' ') continue;
14097
14098 user_len++;
14099 }
14100
14101 // SAP user names cannot be longer than 12 characters
14102 if (user_len > 12) return (PARSER_SALT_LENGTH);
14103
14104 // SAP user name cannot start with ! or ?
14105 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14106
14107 /**
14108 * copy data
14109 */
14110
14111 char *salt_buf_ptr = (char *) salt->salt_buf;
14112
14113 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14114
14115 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14116
14117 salt->salt_len = salt_len;
14118
14119 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
14120 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
14121 digest[2] = 0;
14122 digest[3] = 0;
14123
14124 digest[0] = byte_swap_32 (digest[0]);
14125 digest[1] = byte_swap_32 (digest[1]);
14126
14127 return (PARSER_OK);
14128 }
14129
14130 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14131 {
14132 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
14133
14134 u32 *digest = (u32 *) hash_buf->digest;
14135
14136 salt_t *salt = hash_buf->salt;
14137
14138 /**
14139 * parse line
14140 */
14141
14142 char *salt_pos = input_buf;
14143
14144 char *hash_pos = strchr (salt_pos, '$');
14145
14146 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14147
14148 uint salt_len = hash_pos - salt_pos;
14149
14150 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
14151
14152 hash_pos++;
14153
14154 uint hash_len = input_len - 1 - salt_len;
14155
14156 if (hash_len != 40) return (PARSER_HASH_LENGTH);
14157
14158 /**
14159 * valid some data
14160 */
14161
14162 uint user_len = 0;
14163
14164 for (uint i = 0; i < salt_len; i++)
14165 {
14166 if (salt_pos[i] == ' ') continue;
14167
14168 user_len++;
14169 }
14170
14171 // SAP user names cannot be longer than 12 characters
14172 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
14173 // so far nobody complained so we stay with this because it helps in optimization
14174 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
14175
14176 if (user_len > 12) return (PARSER_SALT_LENGTH);
14177
14178 // SAP user name cannot start with ! or ?
14179 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
14180
14181 /**
14182 * copy data
14183 */
14184
14185 char *salt_buf_ptr = (char *) salt->salt_buf;
14186
14187 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14188
14189 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14190
14191 salt->salt_len = salt_len;
14192
14193 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14194 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14195 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14196 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14197 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14198
14199 return (PARSER_OK);
14200 }
14201
14202 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14203 {
14204 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
14205
14206 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14207
14208 u64 *digest = (u64 *) hash_buf->digest;
14209
14210 salt_t *salt = hash_buf->salt;
14211
14212 char *iter_pos = input_buf + 3;
14213
14214 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
14215
14216 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
14217
14218 memcpy ((char *) salt->salt_sign, input_buf, 4);
14219
14220 salt->salt_iter = salt_iter;
14221
14222 char *salt_pos = iter_pos + 1;
14223
14224 uint salt_len = 8;
14225
14226 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
14227
14228 salt->salt_len = salt_len;
14229
14230 char *hash_pos = salt_pos + salt_len;
14231
14232 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14233
14234 // ugly hack start
14235
14236 char *tmp = (char *) salt->salt_buf_pc;
14237
14238 tmp[0] = hash_pos[42];
14239
14240 // ugly hack end
14241
14242 digest[ 0] = byte_swap_64 (digest[ 0]);
14243 digest[ 1] = byte_swap_64 (digest[ 1]);
14244 digest[ 2] = byte_swap_64 (digest[ 2]);
14245 digest[ 3] = byte_swap_64 (digest[ 3]);
14246 digest[ 4] = 0;
14247 digest[ 5] = 0;
14248 digest[ 6] = 0;
14249 digest[ 7] = 0;
14250
14251 return (PARSER_OK);
14252 }
14253
14254 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14255 {
14256 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
14257
14258 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14259
14260 u32 *digest = (u32 *) hash_buf->digest;
14261
14262 salt_t *salt = hash_buf->salt;
14263
14264 char *salt_buf = input_buf + 6;
14265
14266 uint salt_len = 16;
14267
14268 char *salt_buf_ptr = (char *) salt->salt_buf;
14269
14270 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14271
14272 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14273
14274 salt->salt_len = salt_len;
14275
14276 char *hash_pos = input_buf + 6 + 16;
14277
14278 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14279 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14280 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14281 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14282 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14283 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
14284 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
14285 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
14286
14287 return (PARSER_OK);
14288 }
14289
14290 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14291 {
14292 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
14293
14294 u32 *digest = (u32 *) hash_buf->digest;
14295
14296 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14297 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14298 digest[2] = 0;
14299 digest[3] = 0;
14300
14301 return (PARSER_OK);
14302 }
14303
14304 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14305 {
14306 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
14307
14308 u32 *digest = (u32 *) hash_buf->digest;
14309
14310 salt_t *salt = hash_buf->salt;
14311
14312 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
14313
14314 char *saltbuf_pos = input_buf;
14315
14316 char *hashbuf_pos = strchr (saltbuf_pos, ':');
14317
14318 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14319
14320 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
14321
14322 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
14323 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
14324
14325 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
14326
14327 hashbuf_pos++;
14328
14329 uint hashbuf_len = input_len - saltbuf_len - 1;
14330
14331 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
14332
14333 char *salt_ptr = (char *) saltbuf_pos;
14334 char *rakp_ptr = (char *) rakp->salt_buf;
14335
14336 uint i;
14337 uint j;
14338
14339 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
14340 {
14341 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
14342 }
14343
14344 rakp_ptr[j] = 0x80;
14345
14346 rakp->salt_len = j;
14347
14348 for (i = 0; i < 64; i++)
14349 {
14350 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
14351 }
14352
14353 salt->salt_buf[0] = rakp->salt_buf[0];
14354 salt->salt_buf[1] = rakp->salt_buf[1];
14355 salt->salt_buf[2] = rakp->salt_buf[2];
14356 salt->salt_buf[3] = rakp->salt_buf[3];
14357 salt->salt_buf[4] = rakp->salt_buf[4];
14358 salt->salt_buf[5] = rakp->salt_buf[5];
14359 salt->salt_buf[6] = rakp->salt_buf[6];
14360 salt->salt_buf[7] = rakp->salt_buf[7];
14361
14362 salt->salt_len = 32; // muss min. 32 haben
14363
14364 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14365 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14366 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14367 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14368 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14369
14370 return (PARSER_OK);
14371 }
14372
14373 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14374 {
14375 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
14376
14377 u32 *digest = (u32 *) hash_buf->digest;
14378
14379 salt_t *salt = hash_buf->salt;
14380
14381 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
14382
14383 char *salt_pos = input_buf + 1;
14384
14385 memcpy (salt->salt_buf, salt_pos, 8);
14386
14387 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14388 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14389
14390 salt->salt_len = 8;
14391
14392 char *hash_pos = salt_pos + 8;
14393
14394 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
14395 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
14396 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
14397 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
14398 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
14399
14400 digest[0] -= SHA1M_A;
14401 digest[1] -= SHA1M_B;
14402 digest[2] -= SHA1M_C;
14403 digest[3] -= SHA1M_D;
14404 digest[4] -= SHA1M_E;
14405
14406 return (PARSER_OK);
14407 }
14408
14409 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14410 {
14411 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
14412
14413 u32 *digest = (u32 *) hash_buf->digest;
14414
14415 salt_t *salt = hash_buf->salt;
14416
14417 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14418 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14419 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14420 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14421
14422 digest[0] = byte_swap_32 (digest[0]);
14423 digest[1] = byte_swap_32 (digest[1]);
14424 digest[2] = byte_swap_32 (digest[2]);
14425 digest[3] = byte_swap_32 (digest[3]);
14426
14427 digest[0] -= MD5M_A;
14428 digest[1] -= MD5M_B;
14429 digest[2] -= MD5M_C;
14430 digest[3] -= MD5M_D;
14431
14432 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14433
14434 char *salt_buf_ptr = input_buf + 32 + 1;
14435
14436 u32 *salt_buf = salt->salt_buf;
14437
14438 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
14439 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
14440 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
14441 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
14442
14443 salt_buf[0] = byte_swap_32 (salt_buf[0]);
14444 salt_buf[1] = byte_swap_32 (salt_buf[1]);
14445 salt_buf[2] = byte_swap_32 (salt_buf[2]);
14446 salt_buf[3] = byte_swap_32 (salt_buf[3]);
14447
14448 salt->salt_len = 16 + 1;
14449
14450 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14451
14452 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
14453
14454 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
14455
14456 return (PARSER_OK);
14457 }
14458
14459 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14460 {
14461 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
14462
14463 u32 *digest = (u32 *) hash_buf->digest;
14464
14465 salt_t *salt = hash_buf->salt;
14466
14467 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
14468
14469 /**
14470 * parse line
14471 */
14472
14473 char *hashbuf_pos = input_buf;
14474
14475 char *saltbuf_pos = strchr (hashbuf_pos, ':');
14476
14477 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14478
14479 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
14480
14481 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
14482
14483 saltbuf_pos++;
14484
14485 char *iteration_pos = strchr (saltbuf_pos, ':');
14486
14487 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14488
14489 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14490
14491 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14492
14493 iteration_pos++;
14494
14495 char *databuf_pos = strchr (iteration_pos, ':');
14496
14497 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14498
14499 const uint iteration_len = databuf_pos - iteration_pos;
14500
14501 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14502 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
14503
14504 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
14505
14506 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
14507 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
14508
14509 databuf_pos++;
14510
14511 // digest
14512
14513 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
14514 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
14515 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
14516 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
14517 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
14518 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
14519 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
14520 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
14521
14522 // salt
14523
14524 char *saltbuf_ptr = (char *) salt->salt_buf;
14525
14526 for (uint i = 0; i < saltbuf_len; i += 2)
14527 {
14528 const char p0 = saltbuf_pos[i + 0];
14529 const char p1 = saltbuf_pos[i + 1];
14530
14531 *saltbuf_ptr++ = hex_convert (p1) << 0
14532 | hex_convert (p0) << 4;
14533 }
14534
14535 salt->salt_buf[4] = 0x01000000;
14536 salt->salt_buf[5] = 0x80;
14537
14538 salt->salt_len = saltbuf_len / 2;
14539
14540 // iteration
14541
14542 salt->salt_iter = atoi (iteration_pos) - 1;
14543
14544 // data
14545
14546 char *databuf_ptr = (char *) cloudkey->data_buf;
14547
14548 for (uint i = 0; i < databuf_len; i += 2)
14549 {
14550 const char p0 = databuf_pos[i + 0];
14551 const char p1 = databuf_pos[i + 1];
14552
14553 *databuf_ptr++ = hex_convert (p1) << 0
14554 | hex_convert (p0) << 4;
14555 }
14556
14557 *databuf_ptr++ = 0x80;
14558
14559 for (uint i = 0; i < 512; i++)
14560 {
14561 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
14562 }
14563
14564 cloudkey->data_len = databuf_len / 2;
14565
14566 return (PARSER_OK);
14567 }
14568
14569 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14570 {
14571 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
14572
14573 u32 *digest = (u32 *) hash_buf->digest;
14574
14575 salt_t *salt = hash_buf->salt;
14576
14577 /**
14578 * parse line
14579 */
14580
14581 char *hashbuf_pos = input_buf;
14582
14583 char *domainbuf_pos = strchr (hashbuf_pos, ':');
14584
14585 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14586
14587 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
14588
14589 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
14590
14591 domainbuf_pos++;
14592
14593 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
14594
14595 char *saltbuf_pos = strchr (domainbuf_pos, ':');
14596
14597 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14598
14599 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
14600
14601 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
14602
14603 saltbuf_pos++;
14604
14605 char *iteration_pos = strchr (saltbuf_pos, ':');
14606
14607 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14608
14609 const uint saltbuf_len = iteration_pos - saltbuf_pos;
14610
14611 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
14612
14613 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
14614
14615 iteration_pos++;
14616
14617 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
14618
14619 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
14620 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
14621
14622 // ok, the plan for this algorithm is the following:
14623 // we have 2 salts here, the domain-name and a random salt
14624 // while both are used in the initial transformation,
14625 // only the random salt is used in the following iterations
14626 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
14627 // and one that includes only the real salt (stored into salt_buf[]).
14628 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
14629
14630 u8 tmp_buf[100] = { 0 };
14631
14632 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
14633
14634 memcpy (digest, tmp_buf, 20);
14635
14636 digest[0] = byte_swap_32 (digest[0]);
14637 digest[1] = byte_swap_32 (digest[1]);
14638 digest[2] = byte_swap_32 (digest[2]);
14639 digest[3] = byte_swap_32 (digest[3]);
14640 digest[4] = byte_swap_32 (digest[4]);
14641
14642 // domain
14643
14644 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14645
14646 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
14647
14648 char *len_ptr = NULL;
14649
14650 for (uint i = 0; i < domainbuf_len; i++)
14651 {
14652 if (salt_buf_pc_ptr[i] == '.')
14653 {
14654 len_ptr = &salt_buf_pc_ptr[i];
14655
14656 *len_ptr = 0;
14657 }
14658 else
14659 {
14660 *len_ptr += 1;
14661 }
14662 }
14663
14664 salt->salt_buf_pc[7] = domainbuf_len;
14665
14666 // "real" salt
14667
14668 char *salt_buf_ptr = (char *) salt->salt_buf;
14669
14670 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
14671
14672 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14673
14674 salt->salt_len = salt_len;
14675
14676 // iteration
14677
14678 salt->salt_iter = atoi (iteration_pos);
14679
14680 return (PARSER_OK);
14681 }
14682
14683 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14684 {
14685 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14686
14687 u32 *digest = (u32 *) hash_buf->digest;
14688
14689 salt_t *salt = hash_buf->salt;
14690
14691 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14692 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14693 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14694 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14695 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14696
14697 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14698
14699 uint salt_len = input_len - 40 - 1;
14700
14701 char *salt_buf = input_buf + 40 + 1;
14702
14703 char *salt_buf_ptr = (char *) salt->salt_buf;
14704
14705 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14706
14707 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14708
14709 salt->salt_len = salt_len;
14710
14711 return (PARSER_OK);
14712 }
14713
14714 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14715 {
14716 const u8 ascii_to_ebcdic[] =
14717 {
14718 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14719 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14720 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14721 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14722 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14723 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14724 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14725 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14726 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14727 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14728 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14729 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14730 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14731 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14732 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14733 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14734 };
14735
14736 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14737
14738 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14739
14740 u32 *digest = (u32 *) hash_buf->digest;
14741
14742 salt_t *salt = hash_buf->salt;
14743
14744 char *salt_pos = input_buf + 6 + 1;
14745
14746 char *digest_pos = strchr (salt_pos, '*');
14747
14748 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14749
14750 uint salt_len = digest_pos - salt_pos;
14751
14752 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14753
14754 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14755
14756 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14757
14758 digest_pos++;
14759
14760 char *salt_buf_ptr = (char *) salt->salt_buf;
14761 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14762
14763 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14764
14765 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14766
14767 salt->salt_len = salt_len;
14768
14769 for (uint i = 0; i < salt_len; i++)
14770 {
14771 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14772 }
14773 for (uint i = salt_len; i < 8; i++)
14774 {
14775 salt_buf_pc_ptr[i] = 0x40;
14776 }
14777
14778 uint tt;
14779
14780 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14781
14782 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14783 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14784
14785 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14786 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14787
14788 digest[0] = byte_swap_32 (digest[0]);
14789 digest[1] = byte_swap_32 (digest[1]);
14790
14791 IP (digest[0], digest[1], tt);
14792
14793 digest[0] = rotr32 (digest[0], 29);
14794 digest[1] = rotr32 (digest[1], 29);
14795 digest[2] = 0;
14796 digest[3] = 0;
14797
14798 return (PARSER_OK);
14799 }
14800
14801 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14802 {
14803 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14804
14805 u32 *digest = (u32 *) hash_buf->digest;
14806
14807 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14808 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14809 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14810 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14811
14812 digest[0] = byte_swap_32 (digest[0]);
14813 digest[1] = byte_swap_32 (digest[1]);
14814 digest[2] = byte_swap_32 (digest[2]);
14815 digest[3] = byte_swap_32 (digest[3]);
14816
14817 return (PARSER_OK);
14818 }
14819
14820 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14821 {
14822 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14823
14824 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14825
14826 u32 *digest = (u32 *) hash_buf->digest;
14827
14828 salt_t *salt = hash_buf->salt;
14829
14830 u8 tmp_buf[120] = { 0 };
14831
14832 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14833
14834 tmp_buf[3] += -4; // dont ask!
14835
14836 memcpy (salt->salt_buf, tmp_buf, 5);
14837
14838 salt->salt_len = 5;
14839
14840 memcpy (digest, tmp_buf + 5, 9);
14841
14842 // yes, only 9 byte are needed to crack, but 10 to display
14843
14844 salt->salt_buf_pc[7] = input_buf[20];
14845
14846 return (PARSER_OK);
14847 }
14848
14849 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14850 {
14851 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14852
14853 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14854
14855 u32 *digest = (u32 *) hash_buf->digest;
14856
14857 salt_t *salt = hash_buf->salt;
14858
14859 u8 tmp_buf[120] = { 0 };
14860
14861 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14862
14863 tmp_buf[3] += -4; // dont ask!
14864
14865 // salt
14866
14867 memcpy (salt->salt_buf, tmp_buf, 16);
14868
14869 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)
14870
14871 // iteration
14872
14873 char tmp_iter_buf[11] = { 0 };
14874
14875 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14876
14877 tmp_iter_buf[10] = 0;
14878
14879 salt->salt_iter = atoi (tmp_iter_buf);
14880
14881 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14882 {
14883 return (PARSER_SALT_ITERATION);
14884 }
14885
14886 salt->salt_iter--; // first round in init
14887
14888 // 2 additional bytes for display only
14889
14890 salt->salt_buf_pc[0] = tmp_buf[26];
14891 salt->salt_buf_pc[1] = tmp_buf[27];
14892
14893 // digest
14894
14895 memcpy (digest, tmp_buf + 28, 8);
14896
14897 digest[0] = byte_swap_32 (digest[0]);
14898 digest[1] = byte_swap_32 (digest[1]);
14899 digest[2] = 0;
14900 digest[3] = 0;
14901
14902 return (PARSER_OK);
14903 }
14904
14905 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14906 {
14907 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14908
14909 u32 *digest = (u32 *) hash_buf->digest;
14910
14911 salt_t *salt = hash_buf->salt;
14912
14913 char *salt_buf_pos = input_buf;
14914
14915 char *hash_buf_pos = salt_buf_pos + 6;
14916
14917 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14918 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14919 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14920 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14921 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14922 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14923 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14924 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14925
14926 digest[0] -= SHA256M_A;
14927 digest[1] -= SHA256M_B;
14928 digest[2] -= SHA256M_C;
14929 digest[3] -= SHA256M_D;
14930 digest[4] -= SHA256M_E;
14931 digest[5] -= SHA256M_F;
14932 digest[6] -= SHA256M_G;
14933 digest[7] -= SHA256M_H;
14934
14935 char *salt_buf_ptr = (char *) salt->salt_buf;
14936
14937 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14938
14939 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14940
14941 salt->salt_len = salt_len;
14942
14943 return (PARSER_OK);
14944 }
14945
14946 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14947 {
14948 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14949
14950 u32 *digest = (u32 *) hash_buf->digest;
14951
14952 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14953
14954 salt_t *salt = hash_buf->salt;
14955
14956 char *salt_buf = input_buf + 6;
14957
14958 char *digest_buf = strchr (salt_buf, '$');
14959
14960 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14961
14962 uint salt_len = digest_buf - salt_buf;
14963
14964 digest_buf++; // skip the '$' symbol
14965
14966 char *salt_buf_ptr = (char *) salt->salt_buf;
14967
14968 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14969
14970 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14971
14972 salt->salt_len = salt_len;
14973
14974 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14975 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14976 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14977 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14978
14979 digest[0] = byte_swap_32 (digest[0]);
14980 digest[1] = byte_swap_32 (digest[1]);
14981 digest[2] = byte_swap_32 (digest[2]);
14982 digest[3] = byte_swap_32 (digest[3]);
14983
14984 digest[0] -= MD5M_A;
14985 digest[1] -= MD5M_B;
14986 digest[2] -= MD5M_C;
14987 digest[3] -= MD5M_D;
14988
14989 return (PARSER_OK);
14990 }
14991
14992 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14993 {
14994 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14995
14996 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14997
14998 u32 *digest = (u32 *) hash_buf->digest;
14999
15000 salt_t *salt = hash_buf->salt;
15001
15002 char *salt_buf = input_buf + 3;
15003
15004 char *digest_buf = strchr (salt_buf, '$');
15005
15006 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15007
15008 uint salt_len = digest_buf - salt_buf;
15009
15010 digest_buf++; // skip the '$' symbol
15011
15012 char *salt_buf_ptr = (char *) salt->salt_buf;
15013
15014 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15015
15016 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15017
15018 salt_buf_ptr[salt_len] = 0x2d;
15019
15020 salt->salt_len = salt_len + 1;
15021
15022 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
15023 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
15024 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
15025 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
15026
15027 digest[0] = byte_swap_32 (digest[0]);
15028 digest[1] = byte_swap_32 (digest[1]);
15029 digest[2] = byte_swap_32 (digest[2]);
15030 digest[3] = byte_swap_32 (digest[3]);
15031
15032 digest[0] -= MD5M_A;
15033 digest[1] -= MD5M_B;
15034 digest[2] -= MD5M_C;
15035 digest[3] -= MD5M_D;
15036
15037 return (PARSER_OK);
15038 }
15039
15040 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15041 {
15042 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
15043
15044 u32 *digest = (u32 *) hash_buf->digest;
15045
15046 salt_t *salt = hash_buf->salt;
15047
15048 u8 tmp_buf[100] = { 0 };
15049
15050 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
15051
15052 memcpy (digest, tmp_buf, 20);
15053
15054 digest[0] = byte_swap_32 (digest[0]);
15055 digest[1] = byte_swap_32 (digest[1]);
15056 digest[2] = byte_swap_32 (digest[2]);
15057 digest[3] = byte_swap_32 (digest[3]);
15058 digest[4] = byte_swap_32 (digest[4]);
15059
15060 digest[0] -= SHA1M_A;
15061 digest[1] -= SHA1M_B;
15062 digest[2] -= SHA1M_C;
15063 digest[3] -= SHA1M_D;
15064 digest[4] -= SHA1M_E;
15065
15066 salt->salt_buf[0] = 0x80;
15067
15068 salt->salt_len = 0;
15069
15070 return (PARSER_OK);
15071 }
15072
15073 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15074 {
15075 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
15076
15077 u32 *digest = (u32 *) hash_buf->digest;
15078
15079 salt_t *salt = hash_buf->salt;
15080
15081 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15082 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15083 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15084 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15085
15086 digest[0] = byte_swap_32 (digest[0]);
15087 digest[1] = byte_swap_32 (digest[1]);
15088 digest[2] = byte_swap_32 (digest[2]);
15089 digest[3] = byte_swap_32 (digest[3]);
15090
15091 digest[0] -= MD5M_A;
15092 digest[1] -= MD5M_B;
15093 digest[2] -= MD5M_C;
15094 digest[3] -= MD5M_D;
15095
15096 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15097
15098 uint salt_len = input_len - 32 - 1;
15099
15100 char *salt_buf = input_buf + 32 + 1;
15101
15102 char *salt_buf_ptr = (char *) salt->salt_buf;
15103
15104 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15105
15106 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
15107
15108 /*
15109 * add static "salt" part
15110 */
15111
15112 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
15113
15114 salt_len += 8;
15115
15116 salt->salt_len = salt_len;
15117
15118 return (PARSER_OK);
15119 }
15120
15121 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15122 {
15123 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
15124
15125 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
15126
15127 u32 *digest = (u32 *) hash_buf->digest;
15128
15129 salt_t *salt = hash_buf->salt;
15130
15131 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
15132
15133 /**
15134 * parse line
15135 */
15136
15137 char *saltlen_pos = input_buf + 1 + 3 + 1;
15138
15139 char *saltbuf_pos = strchr (saltlen_pos, '$');
15140
15141 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15142
15143 uint saltlen_len = saltbuf_pos - saltlen_pos;
15144
15145 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
15146
15147 saltbuf_pos++;
15148
15149 char *keylen_pos = strchr (saltbuf_pos, '$');
15150
15151 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15152
15153 uint saltbuf_len = keylen_pos - saltbuf_pos;
15154
15155 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
15156
15157 keylen_pos++;
15158
15159 char *keybuf_pos = strchr (keylen_pos, '$');
15160
15161 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15162
15163 uint keylen_len = keybuf_pos - keylen_pos;
15164
15165 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
15166
15167 keybuf_pos++;
15168
15169 char *databuf_pos = strchr (keybuf_pos, '$');
15170
15171 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15172
15173 uint keybuf_len = databuf_pos - keybuf_pos;
15174
15175 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
15176
15177 databuf_pos++;
15178
15179 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
15180
15181 if (data_len != 3072) return (PARSER_SALT_LENGTH);
15182
15183 /**
15184 * copy data
15185 */
15186
15187 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
15188 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
15189 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
15190 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
15191
15192 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
15193 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
15194 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
15195 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
15196
15197 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15198 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15199 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15200 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15201
15202 salt->salt_len = 16;
15203 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
15204
15205 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
15206 {
15207 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
15208 }
15209
15210 return (PARSER_OK);
15211 }
15212
15213 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15214 {
15215 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
15216
15217 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
15218
15219 u32 *digest = (u32 *) hash_buf->digest;
15220
15221 salt_t *salt = hash_buf->salt;
15222
15223 /**
15224 * parse line
15225 */
15226
15227 // first is the N salt parameter
15228
15229 char *N_pos = input_buf + 6;
15230
15231 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
15232
15233 N_pos++;
15234
15235 salt->scrypt_N = atoi (N_pos);
15236
15237 // r
15238
15239 char *r_pos = strchr (N_pos, ':');
15240
15241 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15242
15243 r_pos++;
15244
15245 salt->scrypt_r = atoi (r_pos);
15246
15247 // p
15248
15249 char *p_pos = strchr (r_pos, ':');
15250
15251 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15252
15253 p_pos++;
15254
15255 salt->scrypt_p = atoi (p_pos);
15256
15257 // salt
15258
15259 char *saltbuf_pos = strchr (p_pos, ':');
15260
15261 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15262
15263 saltbuf_pos++;
15264
15265 char *hash_pos = strchr (saltbuf_pos, ':');
15266
15267 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15268
15269 hash_pos++;
15270
15271 // base64 decode
15272
15273 int salt_len_base64 = hash_pos - saltbuf_pos;
15274
15275 if (salt_len_base64 > 45) return (PARSER_SALT_LENGTH);
15276
15277 u8 tmp_buf[33] = { 0 };
15278
15279 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, salt_len_base64, tmp_buf);
15280
15281 char *salt_buf_ptr = (char *) salt->salt_buf;
15282
15283 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
15284
15285 salt->salt_len = tmp_len;
15286 salt->salt_iter = 1;
15287
15288 // digest - base64 decode
15289
15290 memset (tmp_buf, 0, sizeof (tmp_buf));
15291
15292 tmp_len = input_len - (hash_pos - input_buf);
15293
15294 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
15295
15296 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
15297
15298 memcpy (digest, tmp_buf, 32);
15299
15300 return (PARSER_OK);
15301 }
15302
15303 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15304 {
15305 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
15306
15307 u32 *digest = (u32 *) hash_buf->digest;
15308
15309 salt_t *salt = hash_buf->salt;
15310
15311 /**
15312 * parse line
15313 */
15314
15315 char decrypted[76] = { 0 }; // iv + hash
15316
15317 juniper_decrypt_hash (input_buf, decrypted);
15318
15319 char *md5crypt_hash = decrypted + 12;
15320
15321 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
15322
15323 salt->salt_iter = ROUNDS_MD5CRYPT;
15324
15325 char *salt_pos = md5crypt_hash + 3;
15326
15327 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
15328
15329 salt->salt_len = hash_pos - salt_pos; // should be 8
15330
15331 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
15332
15333 hash_pos++;
15334
15335 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
15336
15337 return (PARSER_OK);
15338 }
15339
15340 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15341 {
15342 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
15343
15344 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15345
15346 u32 *digest = (u32 *) hash_buf->digest;
15347
15348 salt_t *salt = hash_buf->salt;
15349
15350 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15351
15352 /**
15353 * parse line
15354 */
15355
15356 // first is *raw* salt
15357
15358 char *salt_pos = input_buf + 3;
15359
15360 char *hash_pos = strchr (salt_pos, '$');
15361
15362 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15363
15364 uint salt_len = hash_pos - salt_pos;
15365
15366 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15367
15368 hash_pos++;
15369
15370 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15371
15372 memcpy (salt_buf_ptr, salt_pos, 14);
15373
15374 salt_buf_ptr[17] = 0x01;
15375 salt_buf_ptr[18] = 0x80;
15376
15377 // add some stuff to normal salt to make sorted happy
15378
15379 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15380 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15381 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15382 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15383
15384 salt->salt_len = salt_len;
15385 salt->salt_iter = ROUNDS_CISCO8 - 1;
15386
15387 // base64 decode hash
15388
15389 u8 tmp_buf[100] = { 0 };
15390
15391 uint hash_len = input_len - 3 - salt_len - 1;
15392
15393 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15394
15395 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15396
15397 memcpy (digest, tmp_buf, 32);
15398
15399 digest[0] = byte_swap_32 (digest[0]);
15400 digest[1] = byte_swap_32 (digest[1]);
15401 digest[2] = byte_swap_32 (digest[2]);
15402 digest[3] = byte_swap_32 (digest[3]);
15403 digest[4] = byte_swap_32 (digest[4]);
15404 digest[5] = byte_swap_32 (digest[5]);
15405 digest[6] = byte_swap_32 (digest[6]);
15406 digest[7] = byte_swap_32 (digest[7]);
15407
15408 return (PARSER_OK);
15409 }
15410
15411 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15412 {
15413 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
15414
15415 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
15416
15417 u32 *digest = (u32 *) hash_buf->digest;
15418
15419 salt_t *salt = hash_buf->salt;
15420
15421 /**
15422 * parse line
15423 */
15424
15425 // first is *raw* salt
15426
15427 char *salt_pos = input_buf + 3;
15428
15429 char *hash_pos = strchr (salt_pos, '$');
15430
15431 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15432
15433 uint salt_len = hash_pos - salt_pos;
15434
15435 if (salt_len != 14) return (PARSER_SALT_LENGTH);
15436
15437 salt->salt_len = salt_len;
15438 hash_pos++;
15439
15440 char *salt_buf_ptr = (char *) salt->salt_buf;
15441
15442 memcpy (salt_buf_ptr, salt_pos, salt_len);
15443 salt_buf_ptr[salt_len] = 0;
15444
15445 // base64 decode hash
15446
15447 u8 tmp_buf[100] = { 0 };
15448
15449 uint hash_len = input_len - 3 - salt_len - 1;
15450
15451 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15452
15453 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
15454
15455 memcpy (digest, tmp_buf, 32);
15456
15457 // fixed:
15458 salt->scrypt_N = 16384;
15459 salt->scrypt_r = 1;
15460 salt->scrypt_p = 1;
15461 salt->salt_iter = 1;
15462
15463 return (PARSER_OK);
15464 }
15465
15466 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15467 {
15468 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
15469
15470 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15471
15472 u32 *digest = (u32 *) hash_buf->digest;
15473
15474 salt_t *salt = hash_buf->salt;
15475
15476 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
15477
15478 /**
15479 * parse line
15480 */
15481
15482 char *version_pos = input_buf + 8 + 1;
15483
15484 char *verifierHashSize_pos = strchr (version_pos, '*');
15485
15486 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15487
15488 u32 version_len = verifierHashSize_pos - version_pos;
15489
15490 if (version_len != 4) return (PARSER_SALT_LENGTH);
15491
15492 verifierHashSize_pos++;
15493
15494 char *keySize_pos = strchr (verifierHashSize_pos, '*');
15495
15496 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15497
15498 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
15499
15500 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
15501
15502 keySize_pos++;
15503
15504 char *saltSize_pos = strchr (keySize_pos, '*');
15505
15506 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15507
15508 u32 keySize_len = saltSize_pos - keySize_pos;
15509
15510 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15511
15512 saltSize_pos++;
15513
15514 char *osalt_pos = strchr (saltSize_pos, '*');
15515
15516 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15517
15518 u32 saltSize_len = osalt_pos - saltSize_pos;
15519
15520 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15521
15522 osalt_pos++;
15523
15524 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15525
15526 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15527
15528 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15529
15530 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15531
15532 encryptedVerifier_pos++;
15533
15534 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15535
15536 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15537
15538 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15539
15540 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15541
15542 encryptedVerifierHash_pos++;
15543
15544 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;
15545
15546 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15547
15548 const uint version = atoi (version_pos);
15549
15550 if (version != 2007) return (PARSER_SALT_VALUE);
15551
15552 const uint verifierHashSize = atoi (verifierHashSize_pos);
15553
15554 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
15555
15556 const uint keySize = atoi (keySize_pos);
15557
15558 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
15559
15560 office2007->keySize = keySize;
15561
15562 const uint saltSize = atoi (saltSize_pos);
15563
15564 if (saltSize != 16) return (PARSER_SALT_VALUE);
15565
15566 /**
15567 * salt
15568 */
15569
15570 salt->salt_len = 16;
15571 salt->salt_iter = ROUNDS_OFFICE2007;
15572
15573 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15574 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15575 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15576 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15577
15578 /**
15579 * esalt
15580 */
15581
15582 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15583 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15584 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15585 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15586
15587 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15588 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15589 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15590 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15591 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15592
15593 /**
15594 * digest
15595 */
15596
15597 digest[0] = office2007->encryptedVerifierHash[0];
15598 digest[1] = office2007->encryptedVerifierHash[1];
15599 digest[2] = office2007->encryptedVerifierHash[2];
15600 digest[3] = office2007->encryptedVerifierHash[3];
15601
15602 return (PARSER_OK);
15603 }
15604
15605 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15606 {
15607 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
15608
15609 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15610
15611 u32 *digest = (u32 *) hash_buf->digest;
15612
15613 salt_t *salt = hash_buf->salt;
15614
15615 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
15616
15617 /**
15618 * parse line
15619 */
15620
15621 char *version_pos = input_buf + 8 + 1;
15622
15623 char *spinCount_pos = strchr (version_pos, '*');
15624
15625 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15626
15627 u32 version_len = spinCount_pos - version_pos;
15628
15629 if (version_len != 4) return (PARSER_SALT_LENGTH);
15630
15631 spinCount_pos++;
15632
15633 char *keySize_pos = strchr (spinCount_pos, '*');
15634
15635 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15636
15637 u32 spinCount_len = keySize_pos - spinCount_pos;
15638
15639 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15640
15641 keySize_pos++;
15642
15643 char *saltSize_pos = strchr (keySize_pos, '*');
15644
15645 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15646
15647 u32 keySize_len = saltSize_pos - keySize_pos;
15648
15649 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15650
15651 saltSize_pos++;
15652
15653 char *osalt_pos = strchr (saltSize_pos, '*');
15654
15655 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15656
15657 u32 saltSize_len = osalt_pos - saltSize_pos;
15658
15659 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15660
15661 osalt_pos++;
15662
15663 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15664
15665 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15666
15667 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15668
15669 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15670
15671 encryptedVerifier_pos++;
15672
15673 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15674
15675 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15676
15677 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15678
15679 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15680
15681 encryptedVerifierHash_pos++;
15682
15683 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;
15684
15685 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15686
15687 const uint version = atoi (version_pos);
15688
15689 if (version != 2010) return (PARSER_SALT_VALUE);
15690
15691 const uint spinCount = atoi (spinCount_pos);
15692
15693 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15694
15695 const uint keySize = atoi (keySize_pos);
15696
15697 if (keySize != 128) return (PARSER_SALT_VALUE);
15698
15699 const uint saltSize = atoi (saltSize_pos);
15700
15701 if (saltSize != 16) return (PARSER_SALT_VALUE);
15702
15703 /**
15704 * salt
15705 */
15706
15707 salt->salt_len = 16;
15708 salt->salt_iter = spinCount;
15709
15710 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15711 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15712 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15713 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15714
15715 /**
15716 * esalt
15717 */
15718
15719 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15720 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15721 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15722 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15723
15724 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15725 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15726 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15727 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15728 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15729 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15730 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15731 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15732
15733 /**
15734 * digest
15735 */
15736
15737 digest[0] = office2010->encryptedVerifierHash[0];
15738 digest[1] = office2010->encryptedVerifierHash[1];
15739 digest[2] = office2010->encryptedVerifierHash[2];
15740 digest[3] = office2010->encryptedVerifierHash[3];
15741
15742 return (PARSER_OK);
15743 }
15744
15745 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15746 {
15747 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15748
15749 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15750
15751 u32 *digest = (u32 *) hash_buf->digest;
15752
15753 salt_t *salt = hash_buf->salt;
15754
15755 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15756
15757 /**
15758 * parse line
15759 */
15760
15761 char *version_pos = input_buf + 8 + 1;
15762
15763 char *spinCount_pos = strchr (version_pos, '*');
15764
15765 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15766
15767 u32 version_len = spinCount_pos - version_pos;
15768
15769 if (version_len != 4) return (PARSER_SALT_LENGTH);
15770
15771 spinCount_pos++;
15772
15773 char *keySize_pos = strchr (spinCount_pos, '*');
15774
15775 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15776
15777 u32 spinCount_len = keySize_pos - spinCount_pos;
15778
15779 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15780
15781 keySize_pos++;
15782
15783 char *saltSize_pos = strchr (keySize_pos, '*');
15784
15785 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15786
15787 u32 keySize_len = saltSize_pos - keySize_pos;
15788
15789 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15790
15791 saltSize_pos++;
15792
15793 char *osalt_pos = strchr (saltSize_pos, '*');
15794
15795 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15796
15797 u32 saltSize_len = osalt_pos - saltSize_pos;
15798
15799 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15800
15801 osalt_pos++;
15802
15803 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15804
15805 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15806
15807 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15808
15809 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15810
15811 encryptedVerifier_pos++;
15812
15813 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15814
15815 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15816
15817 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15818
15819 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15820
15821 encryptedVerifierHash_pos++;
15822
15823 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;
15824
15825 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15826
15827 const uint version = atoi (version_pos);
15828
15829 if (version != 2013) return (PARSER_SALT_VALUE);
15830
15831 const uint spinCount = atoi (spinCount_pos);
15832
15833 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15834
15835 const uint keySize = atoi (keySize_pos);
15836
15837 if (keySize != 256) return (PARSER_SALT_VALUE);
15838
15839 const uint saltSize = atoi (saltSize_pos);
15840
15841 if (saltSize != 16) return (PARSER_SALT_VALUE);
15842
15843 /**
15844 * salt
15845 */
15846
15847 salt->salt_len = 16;
15848 salt->salt_iter = spinCount;
15849
15850 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15851 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15852 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15853 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15854
15855 /**
15856 * esalt
15857 */
15858
15859 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15860 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15861 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15862 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15863
15864 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15865 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15866 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15867 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15868 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15869 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15870 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15871 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15872
15873 /**
15874 * digest
15875 */
15876
15877 digest[0] = office2013->encryptedVerifierHash[0];
15878 digest[1] = office2013->encryptedVerifierHash[1];
15879 digest[2] = office2013->encryptedVerifierHash[2];
15880 digest[3] = office2013->encryptedVerifierHash[3];
15881
15882 return (PARSER_OK);
15883 }
15884
15885 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15886 {
15887 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15888
15889 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15890
15891 u32 *digest = (u32 *) hash_buf->digest;
15892
15893 salt_t *salt = hash_buf->salt;
15894
15895 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15896
15897 /**
15898 * parse line
15899 */
15900
15901 char *version_pos = input_buf + 11;
15902
15903 char *osalt_pos = strchr (version_pos, '*');
15904
15905 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15906
15907 u32 version_len = osalt_pos - version_pos;
15908
15909 if (version_len != 1) return (PARSER_SALT_LENGTH);
15910
15911 osalt_pos++;
15912
15913 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15914
15915 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15916
15917 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15918
15919 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15920
15921 encryptedVerifier_pos++;
15922
15923 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15924
15925 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15926
15927 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15928
15929 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15930
15931 encryptedVerifierHash_pos++;
15932
15933 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15934
15935 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15936
15937 const uint version = *version_pos - 0x30;
15938
15939 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15940
15941 /**
15942 * esalt
15943 */
15944
15945 oldoffice01->version = version;
15946
15947 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15948 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15949 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15950 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15951
15952 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15953 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15954 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15955 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15956
15957 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15958 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15959 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15960 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15961
15962 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15963 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15964 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15965 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15966
15967 /**
15968 * salt
15969 */
15970
15971 salt->salt_len = 16;
15972
15973 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15974 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15975 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15976 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15977
15978 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15979 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15980 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15981 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15982
15983 // this is a workaround as office produces multiple documents with the same salt
15984
15985 salt->salt_len += 32;
15986
15987 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15988 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15989 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15990 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15991 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15992 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15993 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15994 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15995
15996 /**
15997 * digest
15998 */
15999
16000 digest[0] = oldoffice01->encryptedVerifierHash[0];
16001 digest[1] = oldoffice01->encryptedVerifierHash[1];
16002 digest[2] = oldoffice01->encryptedVerifierHash[2];
16003 digest[3] = oldoffice01->encryptedVerifierHash[3];
16004
16005 return (PARSER_OK);
16006 }
16007
16008 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16009 {
16010 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
16011 }
16012
16013 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16014 {
16015 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
16016
16017 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16018
16019 u32 *digest = (u32 *) hash_buf->digest;
16020
16021 salt_t *salt = hash_buf->salt;
16022
16023 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
16024
16025 /**
16026 * parse line
16027 */
16028
16029 char *version_pos = input_buf + 11;
16030
16031 char *osalt_pos = strchr (version_pos, '*');
16032
16033 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16034
16035 u32 version_len = osalt_pos - version_pos;
16036
16037 if (version_len != 1) return (PARSER_SALT_LENGTH);
16038
16039 osalt_pos++;
16040
16041 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16042
16043 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16044
16045 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16046
16047 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16048
16049 encryptedVerifier_pos++;
16050
16051 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16052
16053 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16054
16055 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16056
16057 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16058
16059 encryptedVerifierHash_pos++;
16060
16061 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16062
16063 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16064
16065 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16066
16067 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
16068
16069 rc4key_pos++;
16070
16071 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16072
16073 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16074
16075 const uint version = *version_pos - 0x30;
16076
16077 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
16078
16079 /**
16080 * esalt
16081 */
16082
16083 oldoffice01->version = version;
16084
16085 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16086 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16087 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16088 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16089
16090 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
16091 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
16092 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
16093 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
16094
16095 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16096 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16097 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16098 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16099
16100 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
16101 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
16102 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
16103 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
16104
16105 oldoffice01->rc4key[1] = 0;
16106 oldoffice01->rc4key[0] = 0;
16107
16108 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16109 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16110 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16111 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16112 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16113 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16114 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16115 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16116 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16117 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16118
16119 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
16120 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
16121
16122 /**
16123 * salt
16124 */
16125
16126 salt->salt_len = 16;
16127
16128 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16129 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16130 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16131 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16132
16133 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16134 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16135 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16136 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16137
16138 // this is a workaround as office produces multiple documents with the same salt
16139
16140 salt->salt_len += 32;
16141
16142 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
16143 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
16144 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
16145 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
16146 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
16147 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
16148 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
16149 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
16150
16151 /**
16152 * digest
16153 */
16154
16155 digest[0] = oldoffice01->rc4key[0];
16156 digest[1] = oldoffice01->rc4key[1];
16157 digest[2] = 0;
16158 digest[3] = 0;
16159
16160 return (PARSER_OK);
16161 }
16162
16163 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16164 {
16165 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
16166
16167 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
16168
16169 u32 *digest = (u32 *) hash_buf->digest;
16170
16171 salt_t *salt = hash_buf->salt;
16172
16173 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16174
16175 /**
16176 * parse line
16177 */
16178
16179 char *version_pos = input_buf + 11;
16180
16181 char *osalt_pos = strchr (version_pos, '*');
16182
16183 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16184
16185 u32 version_len = osalt_pos - version_pos;
16186
16187 if (version_len != 1) return (PARSER_SALT_LENGTH);
16188
16189 osalt_pos++;
16190
16191 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16192
16193 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16194
16195 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16196
16197 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16198
16199 encryptedVerifier_pos++;
16200
16201 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16202
16203 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16204
16205 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16206
16207 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16208
16209 encryptedVerifierHash_pos++;
16210
16211 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
16212
16213 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16214
16215 const uint version = *version_pos - 0x30;
16216
16217 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16218
16219 /**
16220 * esalt
16221 */
16222
16223 oldoffice34->version = version;
16224
16225 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16226 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16227 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16228 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16229
16230 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16231 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16232 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16233 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16234
16235 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16236 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16237 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16238 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16239 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16240
16241 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16242 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16243 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16244 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16245 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16246
16247 /**
16248 * salt
16249 */
16250
16251 salt->salt_len = 16;
16252
16253 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16254 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16255 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16256 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16257
16258 // this is a workaround as office produces multiple documents with the same salt
16259
16260 salt->salt_len += 32;
16261
16262 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16263 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16264 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16265 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16266 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16267 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16268 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16269 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16270
16271 /**
16272 * digest
16273 */
16274
16275 digest[0] = oldoffice34->encryptedVerifierHash[0];
16276 digest[1] = oldoffice34->encryptedVerifierHash[1];
16277 digest[2] = oldoffice34->encryptedVerifierHash[2];
16278 digest[3] = oldoffice34->encryptedVerifierHash[3];
16279
16280 return (PARSER_OK);
16281 }
16282
16283 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16284 {
16285 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16286
16287 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
16288 }
16289
16290 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16291 {
16292 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
16293
16294 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
16295
16296 u32 *digest = (u32 *) hash_buf->digest;
16297
16298 salt_t *salt = hash_buf->salt;
16299
16300 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
16301
16302 /**
16303 * parse line
16304 */
16305
16306 char *version_pos = input_buf + 11;
16307
16308 char *osalt_pos = strchr (version_pos, '*');
16309
16310 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16311
16312 u32 version_len = osalt_pos - version_pos;
16313
16314 if (version_len != 1) return (PARSER_SALT_LENGTH);
16315
16316 osalt_pos++;
16317
16318 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
16319
16320 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16321
16322 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
16323
16324 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
16325
16326 encryptedVerifier_pos++;
16327
16328 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
16329
16330 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16331
16332 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
16333
16334 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
16335
16336 encryptedVerifierHash_pos++;
16337
16338 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
16339
16340 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16341
16342 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
16343
16344 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
16345
16346 rc4key_pos++;
16347
16348 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
16349
16350 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16351
16352 const uint version = *version_pos - 0x30;
16353
16354 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
16355
16356 /**
16357 * esalt
16358 */
16359
16360 oldoffice34->version = version;
16361
16362 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
16363 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
16364 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
16365 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
16366
16367 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
16368 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
16369 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
16370 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
16371
16372 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
16373 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
16374 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
16375 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
16376 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
16377
16378 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
16379 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
16380 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
16381 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
16382 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
16383
16384 oldoffice34->rc4key[1] = 0;
16385 oldoffice34->rc4key[0] = 0;
16386
16387 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16388 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16389 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16390 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16391 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16392 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16393 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16394 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16395 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16396 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16397
16398 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
16399 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
16400
16401 /**
16402 * salt
16403 */
16404
16405 salt->salt_len = 16;
16406
16407 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
16408 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
16409 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
16410 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
16411
16412 // this is a workaround as office produces multiple documents with the same salt
16413
16414 salt->salt_len += 32;
16415
16416 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
16417 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
16418 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
16419 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
16420 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
16421 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
16422 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
16423 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
16424
16425 /**
16426 * digest
16427 */
16428
16429 digest[0] = oldoffice34->rc4key[0];
16430 digest[1] = oldoffice34->rc4key[1];
16431 digest[2] = 0;
16432 digest[3] = 0;
16433
16434 return (PARSER_OK);
16435 }
16436
16437 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16438 {
16439 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
16440
16441 u32 *digest = (u32 *) hash_buf->digest;
16442
16443 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16444 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16445 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16446 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16447
16448 digest[0] = byte_swap_32 (digest[0]);
16449 digest[1] = byte_swap_32 (digest[1]);
16450 digest[2] = byte_swap_32 (digest[2]);
16451 digest[3] = byte_swap_32 (digest[3]);
16452
16453 return (PARSER_OK);
16454 }
16455
16456 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16457 {
16458 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
16459
16460 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16461
16462 u32 *digest = (u32 *) hash_buf->digest;
16463
16464 salt_t *salt = hash_buf->salt;
16465
16466 char *signature_pos = input_buf;
16467
16468 char *salt_pos = strchr (signature_pos, '$');
16469
16470 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16471
16472 u32 signature_len = salt_pos - signature_pos;
16473
16474 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
16475
16476 salt_pos++;
16477
16478 char *hash_pos = strchr (salt_pos, '$');
16479
16480 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16481
16482 u32 salt_len = hash_pos - salt_pos;
16483
16484 if (salt_len > 32) return (PARSER_SALT_LENGTH);
16485
16486 hash_pos++;
16487
16488 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
16489
16490 if (hash_len != 40) return (PARSER_SALT_LENGTH);
16491
16492 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
16493 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
16494 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
16495 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
16496 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
16497
16498 digest[0] -= SHA1M_A;
16499 digest[1] -= SHA1M_B;
16500 digest[2] -= SHA1M_C;
16501 digest[3] -= SHA1M_D;
16502 digest[4] -= SHA1M_E;
16503
16504 char *salt_buf_ptr = (char *) salt->salt_buf;
16505
16506 memcpy (salt_buf_ptr, salt_pos, salt_len);
16507
16508 salt->salt_len = salt_len;
16509
16510 return (PARSER_OK);
16511 }
16512
16513 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16514 {
16515 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
16516
16517 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
16518
16519 u32 *digest = (u32 *) hash_buf->digest;
16520
16521 salt_t *salt = hash_buf->salt;
16522
16523 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16524
16525 /**
16526 * parse line
16527 */
16528
16529 char *iter_pos = input_buf + 14;
16530
16531 const int iter = atoi (iter_pos);
16532
16533 if (iter < 1) return (PARSER_SALT_ITERATION);
16534
16535 salt->salt_iter = iter - 1;
16536
16537 char *salt_pos = strchr (iter_pos, '$');
16538
16539 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16540
16541 salt_pos++;
16542
16543 char *hash_pos = strchr (salt_pos, '$');
16544
16545 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16546
16547 const uint salt_len = hash_pos - salt_pos;
16548
16549 hash_pos++;
16550
16551 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16552
16553 memcpy (salt_buf_ptr, salt_pos, salt_len);
16554
16555 salt->salt_len = salt_len;
16556
16557 salt_buf_ptr[salt_len + 3] = 0x01;
16558 salt_buf_ptr[salt_len + 4] = 0x80;
16559
16560 // add some stuff to normal salt to make sorted happy
16561
16562 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16563 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16564 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16565 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16566 salt->salt_buf[4] = salt->salt_iter;
16567
16568 // base64 decode hash
16569
16570 u8 tmp_buf[100] = { 0 };
16571
16572 uint hash_len = input_len - (hash_pos - input_buf);
16573
16574 if (hash_len != 44) return (PARSER_HASH_LENGTH);
16575
16576 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16577
16578 memcpy (digest, tmp_buf, 32);
16579
16580 digest[0] = byte_swap_32 (digest[0]);
16581 digest[1] = byte_swap_32 (digest[1]);
16582 digest[2] = byte_swap_32 (digest[2]);
16583 digest[3] = byte_swap_32 (digest[3]);
16584 digest[4] = byte_swap_32 (digest[4]);
16585 digest[5] = byte_swap_32 (digest[5]);
16586 digest[6] = byte_swap_32 (digest[6]);
16587 digest[7] = byte_swap_32 (digest[7]);
16588
16589 return (PARSER_OK);
16590 }
16591
16592 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16593 {
16594 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
16595
16596 u32 *digest = (u32 *) hash_buf->digest;
16597
16598 salt_t *salt = hash_buf->salt;
16599
16600 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16601 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16602 digest[2] = 0;
16603 digest[3] = 0;
16604
16605 digest[0] = byte_swap_32 (digest[0]);
16606 digest[1] = byte_swap_32 (digest[1]);
16607
16608 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16609 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16610 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16611
16612 char iter_c = input_buf[17];
16613 char iter_d = input_buf[19];
16614
16615 // atm only defaults, let's see if there's more request
16616 if (iter_c != '2') return (PARSER_SALT_ITERATION);
16617 if (iter_d != '4') return (PARSER_SALT_ITERATION);
16618
16619 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
16620
16621 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
16622 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
16623 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
16624 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
16625
16626 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16627 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16628 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
16629 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
16630
16631 salt->salt_len = 16;
16632
16633 return (PARSER_OK);
16634 }
16635
16636 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16637 {
16638 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
16639
16640 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16641
16642 u32 *digest = (u32 *) hash_buf->digest;
16643
16644 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
16645
16646 salt_t *salt = hash_buf->salt;
16647
16648 char *salt_pos = input_buf + 10;
16649
16650 char *hash_pos = strchr (salt_pos, '$');
16651
16652 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16653
16654 uint salt_len = hash_pos - salt_pos;
16655
16656 hash_pos++;
16657
16658 uint hash_len = input_len - 10 - salt_len - 1;
16659
16660 // base64 decode salt
16661
16662 if (salt_len > 133) return (PARSER_SALT_LENGTH);
16663
16664 u8 tmp_buf[100] = { 0 };
16665
16666 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
16667
16668 if (salt_len > 55) return (PARSER_SALT_LENGTH);
16669
16670 tmp_buf[salt_len] = 0x80;
16671
16672 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
16673
16674 salt->salt_len = salt_len;
16675
16676 // base64 decode hash
16677
16678 if (hash_len > 133) return (PARSER_HASH_LENGTH);
16679
16680 memset (tmp_buf, 0, sizeof (tmp_buf));
16681
16682 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16683
16684 if (hash_len < 32 + 1) return (PARSER_SALT_LENGTH);
16685
16686 uint user_len = hash_len - 32;
16687
16688 const u8 *tmp_hash = tmp_buf + user_len;
16689
16690 user_len--; // skip the trailing space
16691
16692 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16693 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16694 digest[2] = hex_to_u32 (&tmp_hash[16]);
16695 digest[3] = hex_to_u32 (&tmp_hash[24]);
16696
16697 digest[0] = byte_swap_32 (digest[0]);
16698 digest[1] = byte_swap_32 (digest[1]);
16699 digest[2] = byte_swap_32 (digest[2]);
16700 digest[3] = byte_swap_32 (digest[3]);
16701
16702 // store username for host only (output hash if cracked)
16703
16704 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16705 memcpy (cram_md5->user, tmp_buf, user_len);
16706
16707 return (PARSER_OK);
16708 }
16709
16710 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16711 {
16712 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16713
16714 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16715
16716 u32 *digest = (u32 *) hash_buf->digest;
16717
16718 salt_t *salt = hash_buf->salt;
16719
16720 char *iter_pos = input_buf + 10;
16721
16722 u32 iter = atoi (iter_pos);
16723
16724 if (iter < 1)
16725 {
16726 return (PARSER_SALT_ITERATION);
16727 }
16728
16729 iter--; // first iteration is special
16730
16731 salt->salt_iter = iter;
16732
16733 char *base64_pos = strchr (iter_pos, '}');
16734
16735 if (base64_pos == NULL)
16736 {
16737 return (PARSER_SIGNATURE_UNMATCHED);
16738 }
16739
16740 base64_pos++;
16741
16742 // base64 decode salt
16743
16744 u32 base64_len = input_len - (base64_pos - input_buf);
16745
16746 u8 tmp_buf[100] = { 0 };
16747
16748 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16749
16750 if (decoded_len < 24)
16751 {
16752 return (PARSER_SALT_LENGTH);
16753 }
16754
16755 // copy the salt
16756
16757 uint salt_len = decoded_len - 20;
16758
16759 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16760 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16761
16762 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16763
16764 salt->salt_len = salt_len;
16765
16766 // set digest
16767
16768 u32 *digest_ptr = (u32*) tmp_buf;
16769
16770 digest[0] = byte_swap_32 (digest_ptr[0]);
16771 digest[1] = byte_swap_32 (digest_ptr[1]);
16772 digest[2] = byte_swap_32 (digest_ptr[2]);
16773 digest[3] = byte_swap_32 (digest_ptr[3]);
16774 digest[4] = byte_swap_32 (digest_ptr[4]);
16775
16776 return (PARSER_OK);
16777 }
16778
16779 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16780 {
16781 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16782
16783 u32 *digest = (u32 *) hash_buf->digest;
16784
16785 salt_t *salt = hash_buf->salt;
16786
16787 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16788 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16789 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16790 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16791 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16792
16793 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16794
16795 uint salt_len = input_len - 40 - 1;
16796
16797 char *salt_buf = input_buf + 40 + 1;
16798
16799 char *salt_buf_ptr = (char *) salt->salt_buf;
16800
16801 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16802
16803 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16804
16805 salt->salt_len = salt_len;
16806
16807 return (PARSER_OK);
16808 }
16809
16810 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16811 {
16812 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16813
16814 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16815
16816 u32 *digest = (u32 *) hash_buf->digest;
16817
16818 salt_t *salt = hash_buf->salt;
16819
16820 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16821
16822 /**
16823 * parse line
16824 */
16825
16826 char *V_pos = input_buf + 5;
16827
16828 char *R_pos = strchr (V_pos, '*');
16829
16830 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16831
16832 u32 V_len = R_pos - V_pos;
16833
16834 R_pos++;
16835
16836 char *bits_pos = strchr (R_pos, '*');
16837
16838 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16839
16840 u32 R_len = bits_pos - R_pos;
16841
16842 bits_pos++;
16843
16844 char *P_pos = strchr (bits_pos, '*');
16845
16846 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16847
16848 u32 bits_len = P_pos - bits_pos;
16849
16850 P_pos++;
16851
16852 char *enc_md_pos = strchr (P_pos, '*');
16853
16854 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16855
16856 u32 P_len = enc_md_pos - P_pos;
16857
16858 enc_md_pos++;
16859
16860 char *id_len_pos = strchr (enc_md_pos, '*');
16861
16862 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16863
16864 u32 enc_md_len = id_len_pos - enc_md_pos;
16865
16866 id_len_pos++;
16867
16868 char *id_buf_pos = strchr (id_len_pos, '*');
16869
16870 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16871
16872 u32 id_len_len = id_buf_pos - id_len_pos;
16873
16874 id_buf_pos++;
16875
16876 char *u_len_pos = strchr (id_buf_pos, '*');
16877
16878 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16879
16880 u32 id_buf_len = u_len_pos - id_buf_pos;
16881
16882 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16883
16884 u_len_pos++;
16885
16886 char *u_buf_pos = strchr (u_len_pos, '*');
16887
16888 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16889
16890 u32 u_len_len = u_buf_pos - u_len_pos;
16891
16892 u_buf_pos++;
16893
16894 char *o_len_pos = strchr (u_buf_pos, '*');
16895
16896 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16897
16898 u32 u_buf_len = o_len_pos - u_buf_pos;
16899
16900 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16901
16902 o_len_pos++;
16903
16904 char *o_buf_pos = strchr (o_len_pos, '*');
16905
16906 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16907
16908 u32 o_len_len = o_buf_pos - o_len_pos;
16909
16910 o_buf_pos++;
16911
16912 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;
16913
16914 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16915
16916 // validate data
16917
16918 const int V = atoi (V_pos);
16919 const int R = atoi (R_pos);
16920 const int P = atoi (P_pos);
16921
16922 if (V != 1) return (PARSER_SALT_VALUE);
16923 if (R != 2) return (PARSER_SALT_VALUE);
16924
16925 const int enc_md = atoi (enc_md_pos);
16926
16927 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16928
16929 const int id_len = atoi (id_len_pos);
16930 const int u_len = atoi (u_len_pos);
16931 const int o_len = atoi (o_len_pos);
16932
16933 if (id_len != 16) return (PARSER_SALT_VALUE);
16934 if (u_len != 32) return (PARSER_SALT_VALUE);
16935 if (o_len != 32) return (PARSER_SALT_VALUE);
16936
16937 const int bits = atoi (bits_pos);
16938
16939 if (bits != 40) return (PARSER_SALT_VALUE);
16940
16941 // copy data to esalt
16942
16943 pdf->V = V;
16944 pdf->R = R;
16945 pdf->P = P;
16946
16947 pdf->enc_md = enc_md;
16948
16949 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16950 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16951 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16952 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16953 pdf->id_len = id_len;
16954
16955 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16956 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16957 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16958 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16959 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16960 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16961 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16962 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16963 pdf->u_len = u_len;
16964
16965 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16966 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16967 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16968 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16969 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16970 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16971 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16972 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16973 pdf->o_len = o_len;
16974
16975 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16976 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16977 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16978 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16979
16980 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16981 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16982 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16983 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16984 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16985 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16986 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16987 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16988
16989 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16990 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16991 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16992 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16993 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16994 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16995 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16996 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16997
16998 // we use ID for salt, maybe needs to change, we will see...
16999
17000 salt->salt_buf[0] = pdf->id_buf[0];
17001 salt->salt_buf[1] = pdf->id_buf[1];
17002 salt->salt_buf[2] = pdf->id_buf[2];
17003 salt->salt_buf[3] = pdf->id_buf[3];
17004 salt->salt_len = pdf->id_len;
17005
17006 digest[0] = pdf->u_buf[0];
17007 digest[1] = pdf->u_buf[1];
17008 digest[2] = pdf->u_buf[2];
17009 digest[3] = pdf->u_buf[3];
17010
17011 return (PARSER_OK);
17012 }
17013
17014 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17015 {
17016 return pdf11_parse_hash (input_buf, input_len, hash_buf);
17017 }
17018
17019 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17020 {
17021 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
17022
17023 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17024
17025 u32 *digest = (u32 *) hash_buf->digest;
17026
17027 salt_t *salt = hash_buf->salt;
17028
17029 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17030
17031 /**
17032 * parse line
17033 */
17034
17035 char *V_pos = input_buf + 5;
17036
17037 char *R_pos = strchr (V_pos, '*');
17038
17039 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17040
17041 u32 V_len = R_pos - V_pos;
17042
17043 R_pos++;
17044
17045 char *bits_pos = strchr (R_pos, '*');
17046
17047 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17048
17049 u32 R_len = bits_pos - R_pos;
17050
17051 bits_pos++;
17052
17053 char *P_pos = strchr (bits_pos, '*');
17054
17055 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17056
17057 u32 bits_len = P_pos - bits_pos;
17058
17059 P_pos++;
17060
17061 char *enc_md_pos = strchr (P_pos, '*');
17062
17063 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17064
17065 u32 P_len = enc_md_pos - P_pos;
17066
17067 enc_md_pos++;
17068
17069 char *id_len_pos = strchr (enc_md_pos, '*');
17070
17071 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17072
17073 u32 enc_md_len = id_len_pos - enc_md_pos;
17074
17075 id_len_pos++;
17076
17077 char *id_buf_pos = strchr (id_len_pos, '*');
17078
17079 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17080
17081 u32 id_len_len = id_buf_pos - id_len_pos;
17082
17083 id_buf_pos++;
17084
17085 char *u_len_pos = strchr (id_buf_pos, '*');
17086
17087 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17088
17089 u32 id_buf_len = u_len_pos - id_buf_pos;
17090
17091 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
17092
17093 u_len_pos++;
17094
17095 char *u_buf_pos = strchr (u_len_pos, '*');
17096
17097 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17098
17099 u32 u_len_len = u_buf_pos - u_len_pos;
17100
17101 u_buf_pos++;
17102
17103 char *o_len_pos = strchr (u_buf_pos, '*');
17104
17105 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17106
17107 u32 u_buf_len = o_len_pos - u_buf_pos;
17108
17109 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17110
17111 o_len_pos++;
17112
17113 char *o_buf_pos = strchr (o_len_pos, '*');
17114
17115 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17116
17117 u32 o_len_len = o_buf_pos - o_len_pos;
17118
17119 o_buf_pos++;
17120
17121 char *rc4key_pos = strchr (o_buf_pos, ':');
17122
17123 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17124
17125 u32 o_buf_len = rc4key_pos - o_buf_pos;
17126
17127 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17128
17129 rc4key_pos++;
17130
17131 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;
17132
17133 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
17134
17135 // validate data
17136
17137 const int V = atoi (V_pos);
17138 const int R = atoi (R_pos);
17139 const int P = atoi (P_pos);
17140
17141 if (V != 1) return (PARSER_SALT_VALUE);
17142 if (R != 2) return (PARSER_SALT_VALUE);
17143
17144 const int enc_md = atoi (enc_md_pos);
17145
17146 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
17147
17148 const int id_len = atoi (id_len_pos);
17149 const int u_len = atoi (u_len_pos);
17150 const int o_len = atoi (o_len_pos);
17151
17152 if (id_len != 16) return (PARSER_SALT_VALUE);
17153 if (u_len != 32) return (PARSER_SALT_VALUE);
17154 if (o_len != 32) return (PARSER_SALT_VALUE);
17155
17156 const int bits = atoi (bits_pos);
17157
17158 if (bits != 40) return (PARSER_SALT_VALUE);
17159
17160 // copy data to esalt
17161
17162 pdf->V = V;
17163 pdf->R = R;
17164 pdf->P = P;
17165
17166 pdf->enc_md = enc_md;
17167
17168 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17169 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17170 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17171 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17172 pdf->id_len = id_len;
17173
17174 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17175 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17176 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17177 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17178 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17179 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17180 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17181 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17182 pdf->u_len = u_len;
17183
17184 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17185 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17186 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17187 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17188 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17189 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17190 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17191 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17192 pdf->o_len = o_len;
17193
17194 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17195 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17196 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17197 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17198
17199 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17200 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17201 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17202 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17203 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17204 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17205 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17206 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17207
17208 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17209 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17210 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17211 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17212 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17213 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17214 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17215 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17216
17217 pdf->rc4key[1] = 0;
17218 pdf->rc4key[0] = 0;
17219
17220 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
17221 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
17222 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
17223 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
17224 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
17225 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
17226 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
17227 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
17228 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
17229 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
17230
17231 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
17232 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
17233
17234 // we use ID for salt, maybe needs to change, we will see...
17235
17236 salt->salt_buf[0] = pdf->id_buf[0];
17237 salt->salt_buf[1] = pdf->id_buf[1];
17238 salt->salt_buf[2] = pdf->id_buf[2];
17239 salt->salt_buf[3] = pdf->id_buf[3];
17240 salt->salt_buf[4] = pdf->u_buf[0];
17241 salt->salt_buf[5] = pdf->u_buf[1];
17242 salt->salt_buf[6] = pdf->o_buf[0];
17243 salt->salt_buf[7] = pdf->o_buf[1];
17244 salt->salt_len = pdf->id_len + 16;
17245
17246 digest[0] = pdf->rc4key[0];
17247 digest[1] = pdf->rc4key[1];
17248 digest[2] = 0;
17249 digest[3] = 0;
17250
17251 return (PARSER_OK);
17252 }
17253
17254 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17255 {
17256 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
17257
17258 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17259
17260 u32 *digest = (u32 *) hash_buf->digest;
17261
17262 salt_t *salt = hash_buf->salt;
17263
17264 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17265
17266 /**
17267 * parse line
17268 */
17269
17270 char *V_pos = input_buf + 5;
17271
17272 char *R_pos = strchr (V_pos, '*');
17273
17274 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17275
17276 u32 V_len = R_pos - V_pos;
17277
17278 R_pos++;
17279
17280 char *bits_pos = strchr (R_pos, '*');
17281
17282 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17283
17284 u32 R_len = bits_pos - R_pos;
17285
17286 bits_pos++;
17287
17288 char *P_pos = strchr (bits_pos, '*');
17289
17290 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17291
17292 u32 bits_len = P_pos - bits_pos;
17293
17294 P_pos++;
17295
17296 char *enc_md_pos = strchr (P_pos, '*');
17297
17298 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17299
17300 u32 P_len = enc_md_pos - P_pos;
17301
17302 enc_md_pos++;
17303
17304 char *id_len_pos = strchr (enc_md_pos, '*');
17305
17306 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17307
17308 u32 enc_md_len = id_len_pos - enc_md_pos;
17309
17310 id_len_pos++;
17311
17312 char *id_buf_pos = strchr (id_len_pos, '*');
17313
17314 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17315
17316 u32 id_len_len = id_buf_pos - id_len_pos;
17317
17318 id_buf_pos++;
17319
17320 char *u_len_pos = strchr (id_buf_pos, '*');
17321
17322 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17323
17324 u32 id_buf_len = u_len_pos - id_buf_pos;
17325
17326 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
17327
17328 u_len_pos++;
17329
17330 char *u_buf_pos = strchr (u_len_pos, '*');
17331
17332 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17333
17334 u32 u_len_len = u_buf_pos - u_len_pos;
17335
17336 u_buf_pos++;
17337
17338 char *o_len_pos = strchr (u_buf_pos, '*');
17339
17340 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17341
17342 u32 u_buf_len = o_len_pos - u_buf_pos;
17343
17344 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
17345
17346 o_len_pos++;
17347
17348 char *o_buf_pos = strchr (o_len_pos, '*');
17349
17350 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17351
17352 u32 o_len_len = o_buf_pos - o_len_pos;
17353
17354 o_buf_pos++;
17355
17356 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;
17357
17358 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
17359
17360 // validate data
17361
17362 const int V = atoi (V_pos);
17363 const int R = atoi (R_pos);
17364 const int P = atoi (P_pos);
17365
17366 int vr_ok = 0;
17367
17368 if ((V == 2) && (R == 3)) vr_ok = 1;
17369 if ((V == 4) && (R == 4)) vr_ok = 1;
17370
17371 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17372
17373 const int id_len = atoi (id_len_pos);
17374 const int u_len = atoi (u_len_pos);
17375 const int o_len = atoi (o_len_pos);
17376
17377 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
17378
17379 if (u_len != 32) return (PARSER_SALT_VALUE);
17380 if (o_len != 32) return (PARSER_SALT_VALUE);
17381
17382 const int bits = atoi (bits_pos);
17383
17384 if (bits != 128) return (PARSER_SALT_VALUE);
17385
17386 int enc_md = 1;
17387
17388 if (R >= 4)
17389 {
17390 enc_md = atoi (enc_md_pos);
17391 }
17392
17393 // copy data to esalt
17394
17395 pdf->V = V;
17396 pdf->R = R;
17397 pdf->P = P;
17398
17399 pdf->enc_md = enc_md;
17400
17401 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
17402 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
17403 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
17404 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
17405
17406 if (id_len == 32)
17407 {
17408 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
17409 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
17410 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
17411 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
17412 }
17413
17414 pdf->id_len = id_len;
17415
17416 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
17417 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
17418 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
17419 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
17420 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
17421 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
17422 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
17423 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
17424 pdf->u_len = u_len;
17425
17426 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
17427 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
17428 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
17429 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
17430 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
17431 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
17432 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
17433 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
17434 pdf->o_len = o_len;
17435
17436 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
17437 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
17438 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
17439 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
17440
17441 if (id_len == 32)
17442 {
17443 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
17444 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
17445 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
17446 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
17447 }
17448
17449 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
17450 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
17451 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
17452 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
17453 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
17454 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
17455 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
17456 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
17457
17458 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
17459 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
17460 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
17461 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
17462 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
17463 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
17464 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
17465 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
17466
17467 // precompute rc4 data for later use
17468
17469 uint padding[8] =
17470 {
17471 0x5e4ebf28,
17472 0x418a754e,
17473 0x564e0064,
17474 0x0801faff,
17475 0xb6002e2e,
17476 0x803e68d0,
17477 0xfea90c2f,
17478 0x7a695364
17479 };
17480
17481 // md5
17482
17483 uint salt_pc_block[32] = { 0 };
17484
17485 char *salt_pc_ptr = (char *) salt_pc_block;
17486
17487 memcpy (salt_pc_ptr, padding, 32);
17488 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
17489
17490 uint salt_pc_digest[4] = { 0 };
17491
17492 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
17493
17494 pdf->rc4data[0] = salt_pc_digest[0];
17495 pdf->rc4data[1] = salt_pc_digest[1];
17496
17497 // we use ID for salt, maybe needs to change, we will see...
17498
17499 salt->salt_buf[0] = pdf->id_buf[0];
17500 salt->salt_buf[1] = pdf->id_buf[1];
17501 salt->salt_buf[2] = pdf->id_buf[2];
17502 salt->salt_buf[3] = pdf->id_buf[3];
17503 salt->salt_buf[4] = pdf->u_buf[0];
17504 salt->salt_buf[5] = pdf->u_buf[1];
17505 salt->salt_buf[6] = pdf->o_buf[0];
17506 salt->salt_buf[7] = pdf->o_buf[1];
17507 salt->salt_len = pdf->id_len + 16;
17508
17509 salt->salt_iter = ROUNDS_PDF14;
17510
17511 digest[0] = pdf->u_buf[0];
17512 digest[1] = pdf->u_buf[1];
17513 digest[2] = 0;
17514 digest[3] = 0;
17515
17516 return (PARSER_OK);
17517 }
17518
17519 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17520 {
17521 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
17522
17523 if (ret != PARSER_OK)
17524 {
17525 return ret;
17526 }
17527
17528 u32 *digest = (u32 *) hash_buf->digest;
17529
17530 salt_t *salt = hash_buf->salt;
17531
17532 digest[0] -= SHA256M_A;
17533 digest[1] -= SHA256M_B;
17534 digest[2] -= SHA256M_C;
17535 digest[3] -= SHA256M_D;
17536 digest[4] -= SHA256M_E;
17537 digest[5] -= SHA256M_F;
17538 digest[6] -= SHA256M_G;
17539 digest[7] -= SHA256M_H;
17540
17541 salt->salt_buf[2] = 0x80;
17542
17543 return (PARSER_OK);
17544 }
17545
17546 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17547 {
17548 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
17549
17550 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
17551
17552 u32 *digest = (u32 *) hash_buf->digest;
17553
17554 salt_t *salt = hash_buf->salt;
17555
17556 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
17557
17558 /**
17559 * parse line
17560 */
17561
17562 char *V_pos = input_buf + 5;
17563
17564 char *R_pos = strchr (V_pos, '*');
17565
17566 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17567
17568 u32 V_len = R_pos - V_pos;
17569
17570 R_pos++;
17571
17572 char *bits_pos = strchr (R_pos, '*');
17573
17574 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17575
17576 u32 R_len = bits_pos - R_pos;
17577
17578 bits_pos++;
17579
17580 char *P_pos = strchr (bits_pos, '*');
17581
17582 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17583
17584 u32 bits_len = P_pos - bits_pos;
17585
17586 P_pos++;
17587
17588 char *enc_md_pos = strchr (P_pos, '*');
17589
17590 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17591
17592 u32 P_len = enc_md_pos - P_pos;
17593
17594 enc_md_pos++;
17595
17596 char *id_len_pos = strchr (enc_md_pos, '*');
17597
17598 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17599
17600 u32 enc_md_len = id_len_pos - enc_md_pos;
17601
17602 id_len_pos++;
17603
17604 char *id_buf_pos = strchr (id_len_pos, '*');
17605
17606 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17607
17608 u32 id_len_len = id_buf_pos - id_len_pos;
17609
17610 id_buf_pos++;
17611
17612 char *u_len_pos = strchr (id_buf_pos, '*');
17613
17614 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17615
17616 u32 id_buf_len = u_len_pos - id_buf_pos;
17617
17618 u_len_pos++;
17619
17620 char *u_buf_pos = strchr (u_len_pos, '*');
17621
17622 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17623
17624 u32 u_len_len = u_buf_pos - u_len_pos;
17625
17626 u_buf_pos++;
17627
17628 char *o_len_pos = strchr (u_buf_pos, '*');
17629
17630 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17631
17632 u32 u_buf_len = o_len_pos - u_buf_pos;
17633
17634 o_len_pos++;
17635
17636 char *o_buf_pos = strchr (o_len_pos, '*');
17637
17638 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17639
17640 u32 o_len_len = o_buf_pos - o_len_pos;
17641
17642 o_buf_pos++;
17643
17644 char *last = strchr (o_buf_pos, '*');
17645
17646 if (last == NULL) last = input_buf + input_len;
17647
17648 u32 o_buf_len = last - o_buf_pos;
17649
17650 // validate data
17651
17652 const int V = atoi (V_pos);
17653 const int R = atoi (R_pos);
17654
17655 int vr_ok = 0;
17656
17657 if ((V == 5) && (R == 5)) vr_ok = 1;
17658 if ((V == 5) && (R == 6)) vr_ok = 1;
17659
17660 if (vr_ok == 0) return (PARSER_SALT_VALUE);
17661
17662 const int bits = atoi (bits_pos);
17663
17664 if (bits != 256) return (PARSER_SALT_VALUE);
17665
17666 int enc_md = atoi (enc_md_pos);
17667
17668 if (enc_md != 1) return (PARSER_SALT_VALUE);
17669
17670 const uint id_len = atoi (id_len_pos);
17671 const uint u_len = atoi (u_len_pos);
17672 const uint o_len = atoi (o_len_pos);
17673
17674 if (V_len > 6) return (PARSER_SALT_LENGTH);
17675 if (R_len > 6) return (PARSER_SALT_LENGTH);
17676 if (P_len > 6) return (PARSER_SALT_LENGTH);
17677 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
17678 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
17679 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
17680 if (bits_len > 6) return (PARSER_SALT_LENGTH);
17681 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17682
17683 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17684 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17685 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17686
17687 // copy data to esalt
17688
17689 if (u_len < 40) return (PARSER_SALT_VALUE);
17690
17691 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17692 {
17693 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17694 }
17695
17696 salt->salt_buf[0] = pdf->u_buf[8];
17697 salt->salt_buf[1] = pdf->u_buf[9];
17698
17699 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17700 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17701
17702 salt->salt_len = 8;
17703 salt->salt_iter = ROUNDS_PDF17L8;
17704
17705 digest[0] = pdf->u_buf[0];
17706 digest[1] = pdf->u_buf[1];
17707 digest[2] = pdf->u_buf[2];
17708 digest[3] = pdf->u_buf[3];
17709 digest[4] = pdf->u_buf[4];
17710 digest[5] = pdf->u_buf[5];
17711 digest[6] = pdf->u_buf[6];
17712 digest[7] = pdf->u_buf[7];
17713
17714 return (PARSER_OK);
17715 }
17716
17717 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17718 {
17719 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17720
17721 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17722
17723 u32 *digest = (u32 *) hash_buf->digest;
17724
17725 salt_t *salt = hash_buf->salt;
17726
17727 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17728
17729 /**
17730 * parse line
17731 */
17732
17733 // iterations
17734
17735 char *iter_pos = input_buf + 7;
17736
17737 u32 iter = atoi (iter_pos);
17738
17739 if (iter < 1) return (PARSER_SALT_ITERATION);
17740 if (iter > 999999) return (PARSER_SALT_ITERATION);
17741
17742 // first is *raw* salt
17743
17744 char *salt_pos = strchr (iter_pos, ':');
17745
17746 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17747
17748 salt_pos++;
17749
17750 char *hash_pos = strchr (salt_pos, ':');
17751
17752 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17753
17754 u32 salt_len = hash_pos - salt_pos;
17755
17756 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17757
17758 hash_pos++;
17759
17760 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17761
17762 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17763
17764 // decode salt
17765
17766 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17767
17768 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17769
17770 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17771
17772 salt_buf_ptr[salt_len + 3] = 0x01;
17773 salt_buf_ptr[salt_len + 4] = 0x80;
17774
17775 salt->salt_len = salt_len;
17776 salt->salt_iter = iter - 1;
17777
17778 // decode hash
17779
17780 u8 tmp_buf[100] = { 0 };
17781
17782 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17783
17784 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17785
17786 memcpy (digest, tmp_buf, 16);
17787
17788 digest[0] = byte_swap_32 (digest[0]);
17789 digest[1] = byte_swap_32 (digest[1]);
17790 digest[2] = byte_swap_32 (digest[2]);
17791 digest[3] = byte_swap_32 (digest[3]);
17792
17793 // add some stuff to normal salt to make sorted happy
17794
17795 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17796 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17797 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17798 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17799 salt->salt_buf[4] = salt->salt_iter;
17800
17801 return (PARSER_OK);
17802 }
17803
17804 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17805 {
17806 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17807
17808 u32 *digest = (u32 *) hash_buf->digest;
17809
17810 salt_t *salt = hash_buf->salt;
17811
17812 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17813 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17814 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17815 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17816
17817 digest[0] = byte_swap_32 (digest[0]);
17818 digest[1] = byte_swap_32 (digest[1]);
17819 digest[2] = byte_swap_32 (digest[2]);
17820 digest[3] = byte_swap_32 (digest[3]);
17821
17822 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17823
17824 uint salt_len = input_len - 32 - 1;
17825
17826 char *salt_buf = input_buf + 32 + 1;
17827
17828 char *salt_buf_ptr = (char *) salt->salt_buf;
17829
17830 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17831
17832 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17833
17834 salt->salt_len = salt_len;
17835
17836 return (PARSER_OK);
17837 }
17838
17839 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17840 {
17841 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17842
17843 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17844
17845 u32 *digest = (u32 *) hash_buf->digest;
17846
17847 salt_t *salt = hash_buf->salt;
17848
17849 char *user_pos = input_buf + 10;
17850
17851 char *salt_pos = strchr (user_pos, '*');
17852
17853 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17854
17855 salt_pos++;
17856
17857 char *hash_pos = strchr (salt_pos, '*');
17858
17859 hash_pos++;
17860
17861 uint hash_len = input_len - (hash_pos - input_buf);
17862
17863 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17864
17865 uint user_len = salt_pos - user_pos - 1;
17866
17867 uint salt_len = hash_pos - salt_pos - 1;
17868
17869 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17870
17871 /*
17872 * store digest
17873 */
17874
17875 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17876 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17877 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17878 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17879
17880 digest[0] = byte_swap_32 (digest[0]);
17881 digest[1] = byte_swap_32 (digest[1]);
17882 digest[2] = byte_swap_32 (digest[2]);
17883 digest[3] = byte_swap_32 (digest[3]);
17884
17885 digest[0] -= MD5M_A;
17886 digest[1] -= MD5M_B;
17887 digest[2] -= MD5M_C;
17888 digest[3] -= MD5M_D;
17889
17890 /*
17891 * store salt
17892 */
17893
17894 char *salt_buf_ptr = (char *) salt->salt_buf;
17895
17896 // first 4 bytes are the "challenge"
17897
17898 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17899 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17900 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17901 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17902
17903 // append the user name
17904
17905 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17906
17907 salt->salt_len = 4 + user_len;
17908
17909 return (PARSER_OK);
17910 }
17911
17912 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17913 {
17914 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17915
17916 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17917
17918 u32 *digest = (u32 *) hash_buf->digest;
17919
17920 salt_t *salt = hash_buf->salt;
17921
17922 char *salt_pos = input_buf + 9;
17923
17924 char *hash_pos = strchr (salt_pos, '*');
17925
17926 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17927
17928 hash_pos++;
17929
17930 uint hash_len = input_len - (hash_pos - input_buf);
17931
17932 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17933
17934 uint salt_len = hash_pos - salt_pos - 1;
17935
17936 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17937
17938 /*
17939 * store digest
17940 */
17941
17942 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17943 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17944 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17945 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17946 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
17947
17948 /*
17949 * store salt
17950 */
17951
17952 char *salt_buf_ptr = (char *) salt->salt_buf;
17953
17954 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17955
17956 salt->salt_len = salt_len;
17957
17958 return (PARSER_OK);
17959 }
17960
17961 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17962 {
17963 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17964
17965 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17966
17967 u32 *digest = (u32 *) hash_buf->digest;
17968
17969 salt_t *salt = hash_buf->salt;
17970
17971 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17972
17973 /**
17974 * parse line
17975 */
17976
17977 char *cry_master_len_pos = input_buf + 9;
17978
17979 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17980
17981 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17982
17983 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17984
17985 cry_master_buf_pos++;
17986
17987 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17988
17989 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17990
17991 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17992
17993 cry_salt_len_pos++;
17994
17995 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17996
17997 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17998
17999 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
18000
18001 cry_salt_buf_pos++;
18002
18003 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
18004
18005 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18006
18007 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
18008
18009 cry_rounds_pos++;
18010
18011 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
18012
18013 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18014
18015 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
18016
18017 ckey_len_pos++;
18018
18019 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
18020
18021 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18022
18023 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
18024
18025 ckey_buf_pos++;
18026
18027 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
18028
18029 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18030
18031 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
18032
18033 public_key_len_pos++;
18034
18035 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
18036
18037 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18038
18039 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
18040
18041 public_key_buf_pos++;
18042
18043 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;
18044
18045 const uint cry_master_len = atoi (cry_master_len_pos);
18046 const uint cry_salt_len = atoi (cry_salt_len_pos);
18047 const uint ckey_len = atoi (ckey_len_pos);
18048 const uint public_key_len = atoi (public_key_len_pos);
18049
18050 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
18051 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
18052 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
18053 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
18054
18055 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
18056 {
18057 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
18058
18059 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
18060 }
18061
18062 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
18063 {
18064 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
18065
18066 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
18067 }
18068
18069 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
18070 {
18071 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
18072
18073 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
18074 }
18075
18076 bitcoin_wallet->cry_master_len = cry_master_len / 2;
18077 bitcoin_wallet->ckey_len = ckey_len / 2;
18078 bitcoin_wallet->public_key_len = public_key_len / 2;
18079
18080 /*
18081 * store digest (should be unique enought, hopefully)
18082 */
18083
18084 digest[0] = bitcoin_wallet->cry_master_buf[0];
18085 digest[1] = bitcoin_wallet->cry_master_buf[1];
18086 digest[2] = bitcoin_wallet->cry_master_buf[2];
18087 digest[3] = bitcoin_wallet->cry_master_buf[3];
18088
18089 /*
18090 * store salt
18091 */
18092
18093 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
18094
18095 const uint cry_rounds = atoi (cry_rounds_pos);
18096
18097 salt->salt_iter = cry_rounds - 1;
18098
18099 char *salt_buf_ptr = (char *) salt->salt_buf;
18100
18101 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
18102
18103 salt->salt_len = salt_len;
18104
18105 return (PARSER_OK);
18106 }
18107
18108 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18109 {
18110 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
18111
18112 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18113
18114 u32 *digest = (u32 *) hash_buf->digest;
18115
18116 salt_t *salt = hash_buf->salt;
18117
18118 sip_t *sip = (sip_t *) hash_buf->esalt;
18119
18120 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
18121
18122 char *temp_input_buf = (char *) mymalloc (input_len + 1);
18123
18124 memcpy (temp_input_buf, input_buf, input_len);
18125
18126 // URI_server:
18127
18128 char *URI_server_pos = temp_input_buf + 6;
18129
18130 char *URI_client_pos = strchr (URI_server_pos, '*');
18131
18132 if (URI_client_pos == NULL)
18133 {
18134 myfree (temp_input_buf);
18135
18136 return (PARSER_SEPARATOR_UNMATCHED);
18137 }
18138
18139 URI_client_pos[0] = 0;
18140 URI_client_pos++;
18141
18142 uint URI_server_len = strlen (URI_server_pos);
18143
18144 if (URI_server_len > 512)
18145 {
18146 myfree (temp_input_buf);
18147
18148 return (PARSER_SALT_LENGTH);
18149 }
18150
18151 // URI_client:
18152
18153 char *user_pos = strchr (URI_client_pos, '*');
18154
18155 if (user_pos == NULL)
18156 {
18157 myfree (temp_input_buf);
18158
18159 return (PARSER_SEPARATOR_UNMATCHED);
18160 }
18161
18162 user_pos[0] = 0;
18163 user_pos++;
18164
18165 uint URI_client_len = strlen (URI_client_pos);
18166
18167 if (URI_client_len > 512)
18168 {
18169 myfree (temp_input_buf);
18170
18171 return (PARSER_SALT_LENGTH);
18172 }
18173
18174 // user:
18175
18176 char *realm_pos = strchr (user_pos, '*');
18177
18178 if (realm_pos == NULL)
18179 {
18180 myfree (temp_input_buf);
18181
18182 return (PARSER_SEPARATOR_UNMATCHED);
18183 }
18184
18185 realm_pos[0] = 0;
18186 realm_pos++;
18187
18188 uint user_len = strlen (user_pos);
18189
18190 if (user_len > 116)
18191 {
18192 myfree (temp_input_buf);
18193
18194 return (PARSER_SALT_LENGTH);
18195 }
18196
18197 // realm:
18198
18199 char *method_pos = strchr (realm_pos, '*');
18200
18201 if (method_pos == NULL)
18202 {
18203 myfree (temp_input_buf);
18204
18205 return (PARSER_SEPARATOR_UNMATCHED);
18206 }
18207
18208 method_pos[0] = 0;
18209 method_pos++;
18210
18211 uint realm_len = strlen (realm_pos);
18212
18213 if (realm_len > 116)
18214 {
18215 myfree (temp_input_buf);
18216
18217 return (PARSER_SALT_LENGTH);
18218 }
18219
18220 // method:
18221
18222 char *URI_prefix_pos = strchr (method_pos, '*');
18223
18224 if (URI_prefix_pos == NULL)
18225 {
18226 myfree (temp_input_buf);
18227
18228 return (PARSER_SEPARATOR_UNMATCHED);
18229 }
18230
18231 URI_prefix_pos[0] = 0;
18232 URI_prefix_pos++;
18233
18234 uint method_len = strlen (method_pos);
18235
18236 if (method_len > 246)
18237 {
18238 myfree (temp_input_buf);
18239
18240 return (PARSER_SALT_LENGTH);
18241 }
18242
18243 // URI_prefix:
18244
18245 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
18246
18247 if (URI_resource_pos == NULL)
18248 {
18249 myfree (temp_input_buf);
18250
18251 return (PARSER_SEPARATOR_UNMATCHED);
18252 }
18253
18254 URI_resource_pos[0] = 0;
18255 URI_resource_pos++;
18256
18257 uint URI_prefix_len = strlen (URI_prefix_pos);
18258
18259 if (URI_prefix_len > 245)
18260 {
18261 myfree (temp_input_buf);
18262
18263 return (PARSER_SALT_LENGTH);
18264 }
18265
18266 // URI_resource:
18267
18268 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
18269
18270 if (URI_suffix_pos == NULL)
18271 {
18272 myfree (temp_input_buf);
18273
18274 return (PARSER_SEPARATOR_UNMATCHED);
18275 }
18276
18277 URI_suffix_pos[0] = 0;
18278 URI_suffix_pos++;
18279
18280 uint URI_resource_len = strlen (URI_resource_pos);
18281
18282 if (URI_resource_len < 1 || URI_resource_len > 246)
18283 {
18284 myfree (temp_input_buf);
18285
18286 return (PARSER_SALT_LENGTH);
18287 }
18288
18289 // URI_suffix:
18290
18291 char *nonce_pos = strchr (URI_suffix_pos, '*');
18292
18293 if (nonce_pos == NULL)
18294 {
18295 myfree (temp_input_buf);
18296
18297 return (PARSER_SEPARATOR_UNMATCHED);
18298 }
18299
18300 nonce_pos[0] = 0;
18301 nonce_pos++;
18302
18303 uint URI_suffix_len = strlen (URI_suffix_pos);
18304
18305 if (URI_suffix_len > 245)
18306 {
18307 myfree (temp_input_buf);
18308
18309 return (PARSER_SALT_LENGTH);
18310 }
18311
18312 // nonce:
18313
18314 char *nonce_client_pos = strchr (nonce_pos, '*');
18315
18316 if (nonce_client_pos == NULL)
18317 {
18318 myfree (temp_input_buf);
18319
18320 return (PARSER_SEPARATOR_UNMATCHED);
18321 }
18322
18323 nonce_client_pos[0] = 0;
18324 nonce_client_pos++;
18325
18326 uint nonce_len = strlen (nonce_pos);
18327
18328 if (nonce_len < 1 || nonce_len > 50)
18329 {
18330 myfree (temp_input_buf);
18331
18332 return (PARSER_SALT_LENGTH);
18333 }
18334
18335 // nonce_client:
18336
18337 char *nonce_count_pos = strchr (nonce_client_pos, '*');
18338
18339 if (nonce_count_pos == NULL)
18340 {
18341 myfree (temp_input_buf);
18342
18343 return (PARSER_SEPARATOR_UNMATCHED);
18344 }
18345
18346 nonce_count_pos[0] = 0;
18347 nonce_count_pos++;
18348
18349 uint nonce_client_len = strlen (nonce_client_pos);
18350
18351 if (nonce_client_len > 50)
18352 {
18353 myfree (temp_input_buf);
18354
18355 return (PARSER_SALT_LENGTH);
18356 }
18357
18358 // nonce_count:
18359
18360 char *qop_pos = strchr (nonce_count_pos, '*');
18361
18362 if (qop_pos == NULL)
18363 {
18364 myfree (temp_input_buf);
18365
18366 return (PARSER_SEPARATOR_UNMATCHED);
18367 }
18368
18369 qop_pos[0] = 0;
18370 qop_pos++;
18371
18372 uint nonce_count_len = strlen (nonce_count_pos);
18373
18374 if (nonce_count_len > 50)
18375 {
18376 myfree (temp_input_buf);
18377
18378 return (PARSER_SALT_LENGTH);
18379 }
18380
18381 // qop:
18382
18383 char *directive_pos = strchr (qop_pos, '*');
18384
18385 if (directive_pos == NULL)
18386 {
18387 myfree (temp_input_buf);
18388
18389 return (PARSER_SEPARATOR_UNMATCHED);
18390 }
18391
18392 directive_pos[0] = 0;
18393 directive_pos++;
18394
18395 uint qop_len = strlen (qop_pos);
18396
18397 if (qop_len > 50)
18398 {
18399 myfree (temp_input_buf);
18400
18401 return (PARSER_SALT_LENGTH);
18402 }
18403
18404 // directive
18405
18406 char *digest_pos = strchr (directive_pos, '*');
18407
18408 if (digest_pos == NULL)
18409 {
18410 myfree (temp_input_buf);
18411
18412 return (PARSER_SEPARATOR_UNMATCHED);
18413 }
18414
18415 digest_pos[0] = 0;
18416 digest_pos++;
18417
18418 uint directive_len = strlen (directive_pos);
18419
18420 if (directive_len != 3)
18421 {
18422 myfree (temp_input_buf);
18423
18424 return (PARSER_SALT_LENGTH);
18425 }
18426
18427 if (memcmp (directive_pos, "MD5", 3))
18428 {
18429 log_info ("ERROR: only the MD5 directive is currently supported\n");
18430
18431 myfree (temp_input_buf);
18432
18433 return (PARSER_SIP_AUTH_DIRECTIVE);
18434 }
18435
18436 /*
18437 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
18438 */
18439
18440 uint md5_len = 0;
18441
18442 uint md5_max_len = 4 * 64;
18443
18444 uint md5_remaining_len = md5_max_len;
18445
18446 uint tmp_md5_buf[64] = { 0 };
18447
18448 char *tmp_md5_ptr = (char *) tmp_md5_buf;
18449
18450 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
18451
18452 md5_len += method_len + 1;
18453 tmp_md5_ptr += method_len + 1;
18454
18455 if (URI_prefix_len > 0)
18456 {
18457 md5_remaining_len = md5_max_len - md5_len;
18458
18459 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
18460
18461 md5_len += URI_prefix_len + 1;
18462 tmp_md5_ptr += URI_prefix_len + 1;
18463 }
18464
18465 md5_remaining_len = md5_max_len - md5_len;
18466
18467 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
18468
18469 md5_len += URI_resource_len;
18470 tmp_md5_ptr += URI_resource_len;
18471
18472 if (URI_suffix_len > 0)
18473 {
18474 md5_remaining_len = md5_max_len - md5_len;
18475
18476 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
18477
18478 md5_len += 1 + URI_suffix_len;
18479 }
18480
18481 uint tmp_digest[4] = { 0 };
18482
18483 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
18484
18485 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
18486 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
18487 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
18488 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
18489
18490 /*
18491 * esalt
18492 */
18493
18494 char *esalt_buf_ptr = (char *) sip->esalt_buf;
18495
18496 uint esalt_len = 0;
18497
18498 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
18499
18500 // there are 2 possibilities for the esalt:
18501
18502 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
18503 {
18504 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
18505
18506 if (esalt_len > max_esalt_len)
18507 {
18508 myfree (temp_input_buf);
18509
18510 return (PARSER_SALT_LENGTH);
18511 }
18512
18513 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
18514 nonce_pos,
18515 nonce_count_pos,
18516 nonce_client_pos,
18517 qop_pos,
18518 tmp_digest[0],
18519 tmp_digest[1],
18520 tmp_digest[2],
18521 tmp_digest[3]);
18522 }
18523 else
18524 {
18525 esalt_len = 1 + nonce_len + 1 + 32;
18526
18527 if (esalt_len > max_esalt_len)
18528 {
18529 myfree (temp_input_buf);
18530
18531 return (PARSER_SALT_LENGTH);
18532 }
18533
18534 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
18535 nonce_pos,
18536 tmp_digest[0],
18537 tmp_digest[1],
18538 tmp_digest[2],
18539 tmp_digest[3]);
18540 }
18541
18542 // add 0x80 to esalt
18543
18544 esalt_buf_ptr[esalt_len] = 0x80;
18545
18546 sip->esalt_len = esalt_len;
18547
18548 /*
18549 * actual salt
18550 */
18551
18552 char *sip_salt_ptr = (char *) sip->salt_buf;
18553
18554 uint salt_len = user_len + 1 + realm_len + 1;
18555
18556 uint max_salt_len = 119;
18557
18558 if (salt_len > max_salt_len)
18559 {
18560 myfree (temp_input_buf);
18561
18562 return (PARSER_SALT_LENGTH);
18563 }
18564
18565 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18566
18567 sip->salt_len = salt_len;
18568
18569 /*
18570 * fake salt (for sorting)
18571 */
18572
18573 char *salt_buf_ptr = (char *) salt->salt_buf;
18574
18575 max_salt_len = 55;
18576
18577 uint fake_salt_len = salt_len;
18578
18579 if (fake_salt_len > max_salt_len)
18580 {
18581 fake_salt_len = max_salt_len;
18582 }
18583
18584 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
18585
18586 salt->salt_len = fake_salt_len;
18587
18588 /*
18589 * digest
18590 */
18591
18592 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
18593 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
18594 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
18595 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
18596
18597 digest[0] = byte_swap_32 (digest[0]);
18598 digest[1] = byte_swap_32 (digest[1]);
18599 digest[2] = byte_swap_32 (digest[2]);
18600 digest[3] = byte_swap_32 (digest[3]);
18601
18602 myfree (temp_input_buf);
18603
18604 return (PARSER_OK);
18605 }
18606
18607 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18608 {
18609 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
18610
18611 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18612
18613 u32 *digest = (u32 *) hash_buf->digest;
18614
18615 salt_t *salt = hash_buf->salt;
18616
18617 // digest
18618
18619 char *digest_pos = input_buf;
18620
18621 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
18622 digest[1] = 0;
18623 digest[2] = 0;
18624 digest[3] = 0;
18625
18626 // salt
18627
18628 char *salt_buf = input_buf + 8 + 1;
18629
18630 uint salt_len = 8;
18631
18632 char *salt_buf_ptr = (char *) salt->salt_buf;
18633
18634 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18635
18636 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18637
18638 salt->salt_len = salt_len;
18639
18640 return (PARSER_OK);
18641 }
18642
18643 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18644 {
18645 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
18646
18647 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18648
18649 u32 *digest = (u32 *) hash_buf->digest;
18650
18651 salt_t *salt = hash_buf->salt;
18652
18653 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
18654
18655 /**
18656 * parse line
18657 */
18658
18659 char *p_buf_pos = input_buf + 4;
18660
18661 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
18662
18663 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18664
18665 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
18666
18667 NumCyclesPower_pos++;
18668
18669 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
18670
18671 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18672
18673 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
18674
18675 salt_len_pos++;
18676
18677 char *salt_buf_pos = strchr (salt_len_pos, '$');
18678
18679 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18680
18681 u32 salt_len_len = salt_buf_pos - salt_len_pos;
18682
18683 salt_buf_pos++;
18684
18685 char *iv_len_pos = strchr (salt_buf_pos, '$');
18686
18687 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18688
18689 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
18690
18691 iv_len_pos++;
18692
18693 char *iv_buf_pos = strchr (iv_len_pos, '$');
18694
18695 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18696
18697 u32 iv_len_len = iv_buf_pos - iv_len_pos;
18698
18699 iv_buf_pos++;
18700
18701 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18702
18703 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18704
18705 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18706
18707 crc_buf_pos++;
18708
18709 char *data_len_pos = strchr (crc_buf_pos, '$');
18710
18711 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18712
18713 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18714
18715 data_len_pos++;
18716
18717 char *unpack_size_pos = strchr (data_len_pos, '$');
18718
18719 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18720
18721 u32 data_len_len = unpack_size_pos - data_len_pos;
18722
18723 unpack_size_pos++;
18724
18725 char *data_buf_pos = strchr (unpack_size_pos, '$');
18726
18727 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18728
18729 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18730
18731 data_buf_pos++;
18732
18733 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;
18734
18735 const uint iter = atoi (NumCyclesPower_pos);
18736 const uint crc = atoi (crc_buf_pos);
18737 const uint p_buf = atoi (p_buf_pos);
18738 const uint salt_len = atoi (salt_len_pos);
18739 const uint iv_len = atoi (iv_len_pos);
18740 const uint unpack_size = atoi (unpack_size_pos);
18741 const uint data_len = atoi (data_len_pos);
18742
18743 /**
18744 * verify some data
18745 */
18746
18747 if (p_buf != 0) return (PARSER_SALT_VALUE);
18748 if (salt_len != 0) return (PARSER_SALT_VALUE);
18749
18750 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18751
18752 if (data_len > 384) return (PARSER_SALT_VALUE);
18753
18754 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18755
18756 /**
18757 * store data
18758 */
18759
18760 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18761 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18762 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18763 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18764
18765 seven_zip->iv_len = iv_len;
18766
18767 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18768
18769 seven_zip->salt_len = 0;
18770
18771 seven_zip->crc = crc;
18772
18773 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18774 {
18775 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18776
18777 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18778 }
18779
18780 seven_zip->data_len = data_len;
18781
18782 seven_zip->unpack_size = unpack_size;
18783
18784 // real salt
18785
18786 salt->salt_buf[0] = seven_zip->data_buf[0];
18787 salt->salt_buf[1] = seven_zip->data_buf[1];
18788 salt->salt_buf[2] = seven_zip->data_buf[2];
18789 salt->salt_buf[3] = seven_zip->data_buf[3];
18790
18791 salt->salt_len = 16;
18792
18793 salt->salt_sign[0] = iter;
18794
18795 salt->salt_iter = 1 << iter;
18796
18797 /**
18798 * digest
18799 */
18800
18801 digest[0] = crc;
18802 digest[1] = 0;
18803 digest[2] = 0;
18804 digest[3] = 0;
18805
18806 return (PARSER_OK);
18807 }
18808
18809 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18810 {
18811 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18812
18813 u32 *digest = (u32 *) hash_buf->digest;
18814
18815 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18816 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18817 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18818 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18819 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18820 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18821 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18822 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18823
18824 digest[0] = byte_swap_32 (digest[0]);
18825 digest[1] = byte_swap_32 (digest[1]);
18826 digest[2] = byte_swap_32 (digest[2]);
18827 digest[3] = byte_swap_32 (digest[3]);
18828 digest[4] = byte_swap_32 (digest[4]);
18829 digest[5] = byte_swap_32 (digest[5]);
18830 digest[6] = byte_swap_32 (digest[6]);
18831 digest[7] = byte_swap_32 (digest[7]);
18832
18833 return (PARSER_OK);
18834 }
18835
18836 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18837 {
18838 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18839
18840 u32 *digest = (u32 *) hash_buf->digest;
18841
18842 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18843 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18844 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18845 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18846 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18847 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18848 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18849 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18850 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18851 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18852 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18853 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18854 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18855 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18856 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18857 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18858
18859 digest[ 0] = byte_swap_32 (digest[ 0]);
18860 digest[ 1] = byte_swap_32 (digest[ 1]);
18861 digest[ 2] = byte_swap_32 (digest[ 2]);
18862 digest[ 3] = byte_swap_32 (digest[ 3]);
18863 digest[ 4] = byte_swap_32 (digest[ 4]);
18864 digest[ 5] = byte_swap_32 (digest[ 5]);
18865 digest[ 6] = byte_swap_32 (digest[ 6]);
18866 digest[ 7] = byte_swap_32 (digest[ 7]);
18867 digest[ 8] = byte_swap_32 (digest[ 8]);
18868 digest[ 9] = byte_swap_32 (digest[ 9]);
18869 digest[10] = byte_swap_32 (digest[10]);
18870 digest[11] = byte_swap_32 (digest[11]);
18871 digest[12] = byte_swap_32 (digest[12]);
18872 digest[13] = byte_swap_32 (digest[13]);
18873 digest[14] = byte_swap_32 (digest[14]);
18874 digest[15] = byte_swap_32 (digest[15]);
18875
18876 return (PARSER_OK);
18877 }
18878
18879 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18880 {
18881 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18882
18883 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18884
18885 u32 *digest = (u32 *) hash_buf->digest;
18886
18887 salt_t *salt = hash_buf->salt;
18888
18889 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18890
18891 /**
18892 * parse line
18893 */
18894
18895 // iterations
18896
18897 char *iter_pos = input_buf + 4;
18898
18899 u32 iter = atoi (iter_pos);
18900
18901 if (iter < 1) return (PARSER_SALT_ITERATION);
18902 if (iter > 999999) return (PARSER_SALT_ITERATION);
18903
18904 // first is *raw* salt
18905
18906 char *salt_pos = strchr (iter_pos, ':');
18907
18908 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18909
18910 salt_pos++;
18911
18912 char *hash_pos = strchr (salt_pos, ':');
18913
18914 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18915
18916 u32 salt_len = hash_pos - salt_pos;
18917
18918 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18919
18920 hash_pos++;
18921
18922 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18923
18924 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18925
18926 // decode salt
18927
18928 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18929
18930 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18931
18932 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18933
18934 salt_buf_ptr[salt_len + 3] = 0x01;
18935 salt_buf_ptr[salt_len + 4] = 0x80;
18936
18937 salt->salt_len = salt_len;
18938 salt->salt_iter = iter - 1;
18939
18940 // decode hash
18941
18942 u8 tmp_buf[100] = { 0 };
18943
18944 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18945
18946 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18947
18948 memcpy (digest, tmp_buf, 16);
18949
18950 // add some stuff to normal salt to make sorted happy
18951
18952 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18953 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18954 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18955 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18956 salt->salt_buf[4] = salt->salt_iter;
18957
18958 return (PARSER_OK);
18959 }
18960
18961 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18962 {
18963 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18964
18965 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18966
18967 u32 *digest = (u32 *) hash_buf->digest;
18968
18969 salt_t *salt = hash_buf->salt;
18970
18971 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18972
18973 /**
18974 * parse line
18975 */
18976
18977 // iterations
18978
18979 char *iter_pos = input_buf + 5;
18980
18981 u32 iter = atoi (iter_pos);
18982
18983 if (iter < 1) return (PARSER_SALT_ITERATION);
18984 if (iter > 999999) return (PARSER_SALT_ITERATION);
18985
18986 // first is *raw* salt
18987
18988 char *salt_pos = strchr (iter_pos, ':');
18989
18990 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18991
18992 salt_pos++;
18993
18994 char *hash_pos = strchr (salt_pos, ':');
18995
18996 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18997
18998 u32 salt_len = hash_pos - salt_pos;
18999
19000 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19001
19002 hash_pos++;
19003
19004 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19005
19006 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19007
19008 // decode salt
19009
19010 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
19011
19012 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19013
19014 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19015
19016 salt_buf_ptr[salt_len + 3] = 0x01;
19017 salt_buf_ptr[salt_len + 4] = 0x80;
19018
19019 salt->salt_len = salt_len;
19020 salt->salt_iter = iter - 1;
19021
19022 // decode hash
19023
19024 u8 tmp_buf[100] = { 0 };
19025
19026 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19027
19028 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19029
19030 memcpy (digest, tmp_buf, 16);
19031
19032 digest[0] = byte_swap_32 (digest[0]);
19033 digest[1] = byte_swap_32 (digest[1]);
19034 digest[2] = byte_swap_32 (digest[2]);
19035 digest[3] = byte_swap_32 (digest[3]);
19036
19037 // add some stuff to normal salt to make sorted happy
19038
19039 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
19040 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
19041 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
19042 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
19043 salt->salt_buf[4] = salt->salt_iter;
19044
19045 return (PARSER_OK);
19046 }
19047
19048 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19049 {
19050 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
19051
19052 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
19053
19054 u64 *digest = (u64 *) hash_buf->digest;
19055
19056 salt_t *salt = hash_buf->salt;
19057
19058 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
19059
19060 /**
19061 * parse line
19062 */
19063
19064 // iterations
19065
19066 char *iter_pos = input_buf + 7;
19067
19068 u32 iter = atoi (iter_pos);
19069
19070 if (iter < 1) return (PARSER_SALT_ITERATION);
19071 if (iter > 999999) return (PARSER_SALT_ITERATION);
19072
19073 // first is *raw* salt
19074
19075 char *salt_pos = strchr (iter_pos, ':');
19076
19077 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19078
19079 salt_pos++;
19080
19081 char *hash_pos = strchr (salt_pos, ':');
19082
19083 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19084
19085 u32 salt_len = hash_pos - salt_pos;
19086
19087 if (salt_len > 64) return (PARSER_SALT_LENGTH);
19088
19089 hash_pos++;
19090
19091 u32 hash_b64_len = input_len - (hash_pos - input_buf);
19092
19093 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
19094
19095 // decode salt
19096
19097 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
19098
19099 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
19100
19101 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19102
19103 salt_buf_ptr[salt_len + 3] = 0x01;
19104 salt_buf_ptr[salt_len + 4] = 0x80;
19105
19106 salt->salt_len = salt_len;
19107 salt->salt_iter = iter - 1;
19108
19109 // decode hash
19110
19111 u8 tmp_buf[100] = { 0 };
19112
19113 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
19114
19115 if (hash_len < 16) return (PARSER_HASH_LENGTH);
19116
19117 memcpy (digest, tmp_buf, 64);
19118
19119 digest[0] = byte_swap_64 (digest[0]);
19120 digest[1] = byte_swap_64 (digest[1]);
19121 digest[2] = byte_swap_64 (digest[2]);
19122 digest[3] = byte_swap_64 (digest[3]);
19123 digest[4] = byte_swap_64 (digest[4]);
19124 digest[5] = byte_swap_64 (digest[5]);
19125 digest[6] = byte_swap_64 (digest[6]);
19126 digest[7] = byte_swap_64 (digest[7]);
19127
19128 // add some stuff to normal salt to make sorted happy
19129
19130 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
19131 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
19132 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
19133 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
19134 salt->salt_buf[4] = salt->salt_iter;
19135
19136 return (PARSER_OK);
19137 }
19138
19139 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19140 {
19141 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
19142
19143 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
19144
19145 uint *digest = (uint *) hash_buf->digest;
19146
19147 salt_t *salt = hash_buf->salt;
19148
19149 /**
19150 * parse line
19151 */
19152
19153 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
19154
19155 char *hash_pos = strchr (salt_pos, '$');
19156
19157 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19158
19159 u32 salt_len = hash_pos - salt_pos;
19160
19161 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19162
19163 hash_pos++;
19164
19165 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
19166
19167 if (hash_len != 16) return (PARSER_HASH_LENGTH);
19168
19169 // decode hash
19170
19171 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
19172 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
19173 digest[ 2] = 0;
19174 digest[ 3] = 0;
19175 digest[ 4] = 0;
19176 digest[ 5] = 0;
19177 digest[ 6] = 0;
19178 digest[ 7] = 0;
19179 digest[ 8] = 0;
19180 digest[ 9] = 0;
19181 digest[10] = 0;
19182 digest[11] = 0;
19183 digest[12] = 0;
19184 digest[13] = 0;
19185 digest[14] = 0;
19186 digest[15] = 0;
19187
19188 // decode salt
19189
19190 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19191 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19192
19193 salt->salt_iter = ROUNDS_ECRYPTFS;
19194 salt->salt_len = 8;
19195
19196 return (PARSER_OK);
19197 }
19198
19199 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19200 {
19201 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
19202
19203 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
19204
19205 unsigned char c19 = itoa64_to_int (input_buf[19]);
19206
19207 if (c19 & 3) return (PARSER_HASH_VALUE);
19208
19209 salt_t *salt = hash_buf->salt;
19210
19211 u32 *digest = (u32 *) hash_buf->digest;
19212
19213 // iteration count
19214
19215 salt->salt_iter = itoa64_to_int (input_buf[1])
19216 | itoa64_to_int (input_buf[2]) << 6
19217 | itoa64_to_int (input_buf[3]) << 12
19218 | itoa64_to_int (input_buf[4]) << 18;
19219
19220 // set salt
19221
19222 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
19223 | itoa64_to_int (input_buf[6]) << 6
19224 | itoa64_to_int (input_buf[7]) << 12
19225 | itoa64_to_int (input_buf[8]) << 18;
19226
19227 salt->salt_len = 4;
19228
19229 u8 tmp_buf[100] = { 0 };
19230
19231 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
19232
19233 memcpy (digest, tmp_buf, 8);
19234
19235 uint tt;
19236
19237 IP (digest[0], digest[1], tt);
19238
19239 digest[0] = rotr32 (digest[0], 31);
19240 digest[1] = rotr32 (digest[1], 31);
19241 digest[2] = 0;
19242 digest[3] = 0;
19243
19244 return (PARSER_OK);
19245 }
19246
19247 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19248 {
19249 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
19250
19251 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
19252
19253 u32 *digest = (u32 *) hash_buf->digest;
19254
19255 salt_t *salt = hash_buf->salt;
19256
19257 /**
19258 * parse line
19259 */
19260
19261 char *type_pos = input_buf + 6 + 1;
19262
19263 char *salt_pos = strchr (type_pos, '*');
19264
19265 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19266
19267 u32 type_len = salt_pos - type_pos;
19268
19269 if (type_len != 1) return (PARSER_SALT_LENGTH);
19270
19271 salt_pos++;
19272
19273 char *crypted_pos = strchr (salt_pos, '*');
19274
19275 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19276
19277 u32 salt_len = crypted_pos - salt_pos;
19278
19279 if (salt_len != 16) return (PARSER_SALT_LENGTH);
19280
19281 crypted_pos++;
19282
19283 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
19284
19285 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
19286
19287 /**
19288 * copy data
19289 */
19290
19291 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
19292 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
19293
19294 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19295 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19296
19297 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
19298 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
19299 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
19300 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
19301
19302 salt->salt_len = 24;
19303 salt->salt_iter = ROUNDS_RAR3;
19304
19305 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
19306 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
19307
19308 digest[0] = 0xc43d7b00;
19309 digest[1] = 0x40070000;
19310 digest[2] = 0;
19311 digest[3] = 0;
19312
19313 return (PARSER_OK);
19314 }
19315
19316 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19317 {
19318 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
19319
19320 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
19321
19322 u32 *digest = (u32 *) hash_buf->digest;
19323
19324 salt_t *salt = hash_buf->salt;
19325
19326 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
19327
19328 /**
19329 * parse line
19330 */
19331
19332 char *param0_pos = input_buf + 1 + 4 + 1;
19333
19334 char *param1_pos = strchr (param0_pos, '$');
19335
19336 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19337
19338 u32 param0_len = param1_pos - param0_pos;
19339
19340 param1_pos++;
19341
19342 char *param2_pos = strchr (param1_pos, '$');
19343
19344 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19345
19346 u32 param1_len = param2_pos - param1_pos;
19347
19348 param2_pos++;
19349
19350 char *param3_pos = strchr (param2_pos, '$');
19351
19352 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19353
19354 u32 param2_len = param3_pos - param2_pos;
19355
19356 param3_pos++;
19357
19358 char *param4_pos = strchr (param3_pos, '$');
19359
19360 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19361
19362 u32 param3_len = param4_pos - param3_pos;
19363
19364 param4_pos++;
19365
19366 char *param5_pos = strchr (param4_pos, '$');
19367
19368 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19369
19370 u32 param4_len = param5_pos - param4_pos;
19371
19372 param5_pos++;
19373
19374 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
19375
19376 char *salt_buf = param1_pos;
19377 char *iv = param3_pos;
19378 char *pswcheck = param5_pos;
19379
19380 const uint salt_len = atoi (param0_pos);
19381 const uint iterations = atoi (param2_pos);
19382 const uint pswcheck_len = atoi (param4_pos);
19383
19384 /**
19385 * verify some data
19386 */
19387
19388 if (param1_len != 32) return (PARSER_SALT_VALUE);
19389 if (param3_len != 32) return (PARSER_SALT_VALUE);
19390 if (param5_len != 16) return (PARSER_SALT_VALUE);
19391
19392 if (salt_len != 16) return (PARSER_SALT_VALUE);
19393 if (iterations == 0) return (PARSER_SALT_VALUE);
19394 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
19395
19396 /**
19397 * store data
19398 */
19399
19400 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
19401 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
19402 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
19403 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
19404
19405 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
19406 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
19407 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
19408 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
19409
19410 salt->salt_len = 16;
19411
19412 salt->salt_sign[0] = iterations;
19413
19414 salt->salt_iter = ((1 << iterations) + 32) - 1;
19415
19416 /**
19417 * digest buf
19418 */
19419
19420 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
19421 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
19422 digest[2] = 0;
19423 digest[3] = 0;
19424
19425 return (PARSER_OK);
19426 }
19427
19428 int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19429 {
19430 if ((input_len < DISPLAY_LEN_MIN_13100) || (input_len > DISPLAY_LEN_MAX_13100)) return (PARSER_GLOBAL_LENGTH);
19431
19432 if (memcmp (SIGNATURE_KRB5TGS, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19433
19434 u32 *digest = (u32 *) hash_buf->digest;
19435
19436 salt_t *salt = hash_buf->salt;
19437
19438 krb5tgs_t *krb5tgs = (krb5tgs_t *) hash_buf->esalt;
19439
19440 /**
19441 * parse line
19442 */
19443
19444 /* Skip '$' */
19445 char *account_pos = input_buf + 11 + 1;
19446
19447 char *data_pos;
19448
19449 uint data_len;
19450
19451 if (account_pos[0] == '*')
19452 {
19453 account_pos++;
19454
19455 data_pos = strchr (account_pos, '*');
19456
19457 /* Skip '*' */
19458 data_pos++;
19459
19460 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19461
19462 uint account_len = data_pos - account_pos + 1;
19463
19464 if (account_len >= 512) return (PARSER_SALT_LENGTH);
19465
19466 /* Skip '$' */
19467 data_pos++;
19468
19469 data_len = input_len - 11 - 1 - account_len - 2;
19470
19471 memcpy (krb5tgs->account_info, account_pos - 1, account_len);
19472 }
19473 else
19474 {
19475 /* assume $krb5tgs$23$checksum$edata2 */
19476 data_pos = account_pos;
19477
19478 memcpy (krb5tgs->account_info, "**", 3);
19479
19480 data_len = input_len - 11 - 1 - 1;
19481 }
19482
19483 if (data_len < ((16 + 32) * 2)) return (PARSER_SALT_LENGTH);
19484
19485 char *checksum_ptr = (char *) krb5tgs->checksum;
19486
19487 for (uint i = 0; i < 16 * 2; i += 2)
19488 {
19489 const char p0 = data_pos[i + 0];
19490 const char p1 = data_pos[i + 1];
19491
19492 *checksum_ptr++ = hex_convert (p1) << 0
19493 | hex_convert (p0) << 4;
19494 }
19495
19496 char *edata_ptr = (char *) krb5tgs->edata2;
19497
19498 krb5tgs->edata2_len = (data_len - 32) / 2 ;
19499
19500 /* skip '$' */
19501 for (uint i = 16 * 2 + 1; i < (krb5tgs->edata2_len * 2) + (16 * 2 + 1); i += 2)
19502 {
19503 const char p0 = data_pos[i + 0];
19504 const char p1 = data_pos[i + 1];
19505 *edata_ptr++ = hex_convert (p1) << 0
19506 | hex_convert (p0) << 4;
19507 }
19508
19509 /* this is needed for hmac_md5 */
19510 *edata_ptr++ = 0x80;
19511
19512 salt->salt_buf[0] = krb5tgs->checksum[0];
19513 salt->salt_buf[1] = krb5tgs->checksum[1];
19514 salt->salt_buf[2] = krb5tgs->checksum[2];
19515 salt->salt_buf[3] = krb5tgs->checksum[3];
19516
19517 salt->salt_len = 32;
19518
19519 digest[0] = krb5tgs->checksum[0];
19520 digest[1] = krb5tgs->checksum[1];
19521 digest[2] = krb5tgs->checksum[2];
19522 digest[3] = krb5tgs->checksum[3];
19523
19524 return (PARSER_OK);
19525 }
19526
19527 int axcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19528 {
19529 if ((input_len < DISPLAY_LEN_MIN_13200) || (input_len > DISPLAY_LEN_MAX_13200)) return (PARSER_GLOBAL_LENGTH);
19530
19531 if (memcmp (SIGNATURE_AXCRYPT, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
19532
19533 u32 *digest = (u32 *) hash_buf->digest;
19534
19535 salt_t *salt = hash_buf->salt;
19536
19537 /**
19538 * parse line
19539 */
19540
19541 /* Skip '*' */
19542 char *wrapping_rounds_pos = input_buf + 11 + 1;
19543
19544 char *salt_pos;
19545
19546 char *wrapped_key_pos;
19547
19548 char *data_pos;
19549
19550 salt->salt_iter = atoi (wrapping_rounds_pos);
19551
19552 salt_pos = strchr (wrapping_rounds_pos, '*');
19553
19554 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19555
19556 uint wrapping_rounds_len = salt_pos - wrapping_rounds_pos;
19557
19558 /* Skip '*' */
19559 salt_pos++;
19560
19561 data_pos = salt_pos;
19562
19563 wrapped_key_pos = strchr (salt_pos, '*');
19564
19565 if (wrapped_key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19566
19567 uint salt_len = wrapped_key_pos - salt_pos;
19568
19569 if (salt_len != 32) return (PARSER_SALT_LENGTH);
19570
19571 /* Skip '*' */
19572 wrapped_key_pos++;
19573
19574 uint wrapped_key_len = input_len - 11 - 1 - wrapping_rounds_len - 1 - salt_len - 1;
19575
19576 if (wrapped_key_len != 48) return (PARSER_SALT_LENGTH);
19577
19578 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19579 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19580 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &data_pos[16]);
19581 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &data_pos[24]);
19582
19583 data_pos += 33;
19584
19585 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &data_pos[ 0]);
19586 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &data_pos[ 8]);
19587 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &data_pos[16]);
19588 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &data_pos[24]);
19589 salt->salt_buf[8] = hex_to_u32 ((const u8 *) &data_pos[32]);
19590 salt->salt_buf[9] = hex_to_u32 ((const u8 *) &data_pos[40]);
19591
19592 salt->salt_len = 40;
19593
19594 digest[0] = salt->salt_buf[0];
19595 digest[1] = salt->salt_buf[1];
19596 digest[2] = salt->salt_buf[2];
19597 digest[3] = salt->salt_buf[3];
19598
19599 return (PARSER_OK);
19600 }
19601
19602 int keepass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19603 {
19604 if ((input_len < DISPLAY_LEN_MIN_13400) || (input_len > DISPLAY_LEN_MAX_13400)) return (PARSER_GLOBAL_LENGTH);
19605
19606 if (memcmp (SIGNATURE_KEEPASS, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
19607
19608 u32 *digest = (u32 *) hash_buf->digest;
19609
19610 salt_t *salt = hash_buf->salt;
19611
19612 keepass_t *keepass = (keepass_t *) hash_buf->esalt;
19613
19614 /**
19615 * parse line
19616 */
19617
19618 char *version_pos;
19619
19620 char *rounds_pos;
19621
19622 char *algorithm_pos;
19623
19624 char *final_random_seed_pos;
19625 u32 final_random_seed_len;
19626
19627 char *transf_random_seed_pos;
19628 u32 transf_random_seed_len;
19629
19630 char *enc_iv_pos;
19631 u32 enc_iv_len;
19632
19633 /* default is no keyfile provided */
19634 char *keyfile_len_pos;
19635 u32 keyfile_len = 0;
19636 u32 is_keyfile_present = 0;
19637 char *keyfile_inline_pos;
19638 char *keyfile_pos;
19639
19640 /* specific to version 1 */
19641 char *contents_len_pos;
19642 u32 contents_len;
19643 char *contents_pos;
19644
19645 /* specific to version 2 */
19646 char *expected_bytes_pos;
19647 u32 expected_bytes_len;
19648
19649 char *contents_hash_pos;
19650 u32 contents_hash_len;
19651
19652 version_pos = input_buf + 8 + 1 + 1;
19653
19654 keepass->version = atoi (version_pos);
19655
19656 rounds_pos = strchr (version_pos, '*');
19657
19658 if (rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19659
19660 rounds_pos++;
19661
19662 salt->salt_iter = (atoi (rounds_pos));
19663
19664 algorithm_pos = strchr (rounds_pos, '*');
19665
19666 if (algorithm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19667
19668 algorithm_pos++;
19669
19670 keepass->algorithm = atoi (algorithm_pos);
19671
19672 final_random_seed_pos = strchr (algorithm_pos, '*');
19673
19674 if (final_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19675
19676 final_random_seed_pos++;
19677
19678 keepass->final_random_seed[0] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 0]);
19679 keepass->final_random_seed[1] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 8]);
19680 keepass->final_random_seed[2] = hex_to_u32 ((const u8 *) &final_random_seed_pos[16]);
19681 keepass->final_random_seed[3] = hex_to_u32 ((const u8 *) &final_random_seed_pos[24]);
19682
19683 if (keepass->version == 2)
19684 {
19685 keepass->final_random_seed[4] = hex_to_u32 ((const u8 *) &final_random_seed_pos[32]);
19686 keepass->final_random_seed[5] = hex_to_u32 ((const u8 *) &final_random_seed_pos[40]);
19687 keepass->final_random_seed[6] = hex_to_u32 ((const u8 *) &final_random_seed_pos[48]);
19688 keepass->final_random_seed[7] = hex_to_u32 ((const u8 *) &final_random_seed_pos[56]);
19689 }
19690
19691 transf_random_seed_pos = strchr (final_random_seed_pos, '*');
19692
19693 if (transf_random_seed_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19694
19695 final_random_seed_len = transf_random_seed_pos - final_random_seed_pos;
19696
19697 if (keepass->version == 1 && final_random_seed_len != 32) return (PARSER_SALT_LENGTH);
19698 if (keepass->version == 2 && final_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19699
19700 transf_random_seed_pos++;
19701
19702 keepass->transf_random_seed[0] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 0]);
19703 keepass->transf_random_seed[1] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 8]);
19704 keepass->transf_random_seed[2] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[16]);
19705 keepass->transf_random_seed[3] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[24]);
19706 keepass->transf_random_seed[4] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[32]);
19707 keepass->transf_random_seed[5] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[40]);
19708 keepass->transf_random_seed[6] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[48]);
19709 keepass->transf_random_seed[7] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[56]);
19710
19711 enc_iv_pos = strchr (transf_random_seed_pos, '*');
19712
19713 if (enc_iv_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19714
19715 transf_random_seed_len = enc_iv_pos - transf_random_seed_pos;
19716
19717 if (transf_random_seed_len != 64) return (PARSER_SALT_LENGTH);
19718
19719 enc_iv_pos++;
19720
19721 keepass->enc_iv[0] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 0]);
19722 keepass->enc_iv[1] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 8]);
19723 keepass->enc_iv[2] = hex_to_u32 ((const u8 *) &enc_iv_pos[16]);
19724 keepass->enc_iv[3] = hex_to_u32 ((const u8 *) &enc_iv_pos[24]);
19725
19726 if (keepass->version == 1)
19727 {
19728 contents_hash_pos = strchr (enc_iv_pos, '*');
19729
19730 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19731
19732 enc_iv_len = contents_hash_pos - enc_iv_pos;
19733
19734 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19735
19736 contents_hash_pos++;
19737
19738 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19739 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19740 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19741 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19742 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
19743 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
19744 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
19745 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
19746
19747 /* get length of contents following */
19748 char *inline_flag_pos = strchr (contents_hash_pos, '*');
19749
19750 if (inline_flag_pos == NULL) return (PARSER_SALT_LENGTH);
19751
19752 contents_hash_len = inline_flag_pos - contents_hash_pos;
19753
19754 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
19755
19756 inline_flag_pos++;
19757
19758 u32 inline_flag = atoi (inline_flag_pos);
19759
19760 if (inline_flag != 1) return (PARSER_SALT_LENGTH);
19761
19762 contents_len_pos = strchr (inline_flag_pos, '*');
19763
19764 if (contents_len_pos == NULL) return (PARSER_SALT_LENGTH);
19765
19766 contents_len_pos++;
19767
19768 contents_len = atoi (contents_len_pos);
19769
19770 if (contents_len > 50000) return (PARSER_SALT_LENGTH);
19771
19772 contents_pos = strchr (contents_len_pos, '*');
19773
19774 if (contents_pos == NULL) return (PARSER_SALT_LENGTH);
19775
19776 contents_pos++;
19777
19778 u32 i;
19779
19780 keepass->contents_len = contents_len;
19781
19782 contents_len = contents_len / 4;
19783
19784 keyfile_inline_pos = strchr (contents_pos, '*');
19785
19786 u32 real_contents_len;
19787
19788 if (keyfile_inline_pos == NULL)
19789 real_contents_len = input_len - (contents_pos - input_buf);
19790 else
19791 {
19792 real_contents_len = keyfile_inline_pos - contents_pos;
19793 keyfile_inline_pos++;
19794 is_keyfile_present = 1;
19795 }
19796
19797 if (real_contents_len != keepass->contents_len * 2) return (PARSER_SALT_LENGTH);
19798
19799 for (i = 0; i < contents_len; i++)
19800 keepass->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]);
19801 }
19802 else if (keepass->version == 2)
19803 {
19804 expected_bytes_pos = strchr (enc_iv_pos, '*');
19805
19806 if (expected_bytes_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19807
19808 enc_iv_len = expected_bytes_pos - enc_iv_pos;
19809
19810 if (enc_iv_len != 32) return (PARSER_SALT_LENGTH);
19811
19812 expected_bytes_pos++;
19813
19814 keepass->expected_bytes[0] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 0]);
19815 keepass->expected_bytes[1] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 8]);
19816 keepass->expected_bytes[2] = hex_to_u32 ((const u8 *) &expected_bytes_pos[16]);
19817 keepass->expected_bytes[3] = hex_to_u32 ((const u8 *) &expected_bytes_pos[24]);
19818 keepass->expected_bytes[4] = hex_to_u32 ((const u8 *) &expected_bytes_pos[32]);
19819 keepass->expected_bytes[5] = hex_to_u32 ((const u8 *) &expected_bytes_pos[40]);
19820 keepass->expected_bytes[6] = hex_to_u32 ((const u8 *) &expected_bytes_pos[48]);
19821 keepass->expected_bytes[7] = hex_to_u32 ((const u8 *) &expected_bytes_pos[56]);
19822
19823 contents_hash_pos = strchr (expected_bytes_pos, '*');
19824
19825 if (contents_hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
19826
19827 expected_bytes_len = contents_hash_pos - expected_bytes_pos;
19828
19829 if (expected_bytes_len != 64) return (PARSER_SALT_LENGTH);
19830
19831 contents_hash_pos++;
19832
19833 keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]);
19834 keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]);
19835 keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]);
19836 keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]);
19837 keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]);
19838 keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]);
19839 keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]);
19840 keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]);
19841
19842 keyfile_inline_pos = strchr (contents_hash_pos, '*');
19843
19844 if (keyfile_inline_pos == NULL)
19845 contents_hash_len = input_len - (int) (contents_hash_pos - input_buf);
19846 else
19847 {
19848 contents_hash_len = keyfile_inline_pos - contents_hash_pos;
19849 keyfile_inline_pos++;
19850 is_keyfile_present = 1;
19851 }
19852 if (contents_hash_len != 64) return (PARSER_SALT_LENGTH);
19853 }
19854
19855 if (is_keyfile_present != 0)
19856 {
19857 keyfile_len_pos = strchr (keyfile_inline_pos, '*');
19858
19859 keyfile_len_pos++;
19860
19861 keyfile_len = atoi (keyfile_len_pos);
19862
19863 keepass->keyfile_len = keyfile_len;
19864
19865 if (keyfile_len != 64) return (PARSER_SALT_LENGTH);
19866
19867 keyfile_pos = strchr (keyfile_len_pos, '*');
19868
19869 if (keyfile_pos == NULL) return (PARSER_SALT_LENGTH);
19870
19871 keyfile_pos++;
19872
19873 u32 real_keyfile_len = input_len - (keyfile_pos - input_buf);
19874
19875 if (real_keyfile_len != 64) return (PARSER_SALT_LENGTH);
19876
19877 keepass->keyfile[0] = hex_to_u32 ((const u8 *) &keyfile_pos[ 0]);
19878 keepass->keyfile[1] = hex_to_u32 ((const u8 *) &keyfile_pos[ 8]);
19879 keepass->keyfile[2] = hex_to_u32 ((const u8 *) &keyfile_pos[16]);
19880 keepass->keyfile[3] = hex_to_u32 ((const u8 *) &keyfile_pos[24]);
19881 keepass->keyfile[4] = hex_to_u32 ((const u8 *) &keyfile_pos[32]);
19882 keepass->keyfile[5] = hex_to_u32 ((const u8 *) &keyfile_pos[40]);
19883 keepass->keyfile[6] = hex_to_u32 ((const u8 *) &keyfile_pos[48]);
19884 keepass->keyfile[7] = hex_to_u32 ((const u8 *) &keyfile_pos[56]);
19885 }
19886
19887 digest[0] = keepass->enc_iv[0];
19888 digest[1] = keepass->enc_iv[1];
19889 digest[2] = keepass->enc_iv[2];
19890 digest[3] = keepass->enc_iv[3];
19891
19892 salt->salt_buf[0] = keepass->transf_random_seed[0];
19893 salt->salt_buf[1] = keepass->transf_random_seed[1];
19894 salt->salt_buf[2] = keepass->transf_random_seed[2];
19895 salt->salt_buf[3] = keepass->transf_random_seed[3];
19896 salt->salt_buf[4] = keepass->transf_random_seed[4];
19897 salt->salt_buf[5] = keepass->transf_random_seed[5];
19898 salt->salt_buf[6] = keepass->transf_random_seed[6];
19899 salt->salt_buf[7] = keepass->transf_random_seed[7];
19900
19901 return (PARSER_OK);
19902 }
19903
19904 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19905 {
19906 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
19907
19908 u32 *digest = (u32 *) hash_buf->digest;
19909
19910 salt_t *salt = hash_buf->salt;
19911
19912 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
19913 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
19914 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
19915 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
19916 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
19917 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
19918 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
19919 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
19920
19921 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
19922
19923 uint salt_len = input_len - 64 - 1;
19924
19925 char *salt_buf = input_buf + 64 + 1;
19926
19927 char *salt_buf_ptr = (char *) salt->salt_buf;
19928
19929 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
19930
19931 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
19932
19933 salt->salt_len = salt_len;
19934
19935 /**
19936 * we can precompute the first sha256 transform
19937 */
19938
19939 uint w[16] = { 0 };
19940
19941 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
19942 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
19943 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
19944 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
19945 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
19946 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
19947 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
19948 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
19949 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
19950 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
19951 w[10] = byte_swap_32 (salt->salt_buf[10]);
19952 w[11] = byte_swap_32 (salt->salt_buf[11]);
19953 w[12] = byte_swap_32 (salt->salt_buf[12]);
19954 w[13] = byte_swap_32 (salt->salt_buf[13]);
19955 w[14] = byte_swap_32 (salt->salt_buf[14]);
19956 w[15] = byte_swap_32 (salt->salt_buf[15]);
19957
19958 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
19959
19960 sha256_64 (w, pc256);
19961
19962 salt->salt_buf_pc[0] = pc256[0];
19963 salt->salt_buf_pc[1] = pc256[1];
19964 salt->salt_buf_pc[2] = pc256[2];
19965 salt->salt_buf_pc[3] = pc256[3];
19966 salt->salt_buf_pc[4] = pc256[4];
19967 salt->salt_buf_pc[5] = pc256[5];
19968 salt->salt_buf_pc[6] = pc256[6];
19969 salt->salt_buf_pc[7] = pc256[7];
19970
19971 digest[0] -= pc256[0];
19972 digest[1] -= pc256[1];
19973 digest[2] -= pc256[2];
19974 digest[3] -= pc256[3];
19975 digest[4] -= pc256[4];
19976 digest[5] -= pc256[5];
19977 digest[6] -= pc256[6];
19978 digest[7] -= pc256[7];
19979
19980 return (PARSER_OK);
19981 }
19982
19983 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19984 {
19985 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
19986
19987 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
19988
19989 u32 *digest = (u32 *) hash_buf->digest;
19990
19991 salt_t *salt = hash_buf->salt;
19992
19993 /**
19994 * parse line
19995 */
19996
19997 char *data_len_pos = input_buf + 1 + 10 + 1;
19998
19999 char *data_buf_pos = strchr (data_len_pos, '$');
20000
20001 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20002
20003 u32 data_len_len = data_buf_pos - data_len_pos;
20004
20005 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
20006 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
20007
20008 data_buf_pos++;
20009
20010 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
20011
20012 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
20013
20014 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
20015
20016 u32 data_len = atoi (data_len_pos);
20017
20018 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
20019
20020 /**
20021 * salt
20022 */
20023
20024 char *salt_pos = data_buf_pos;
20025
20026 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20027 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20028 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
20029 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
20030
20031 // this is actually the CT, which is also the hash later (if matched)
20032
20033 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
20034 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
20035 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
20036 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
20037
20038 salt->salt_len = 32; // note we need to fix this to 16 in kernel
20039
20040 salt->salt_iter = 10 - 1;
20041
20042 /**
20043 * digest buf
20044 */
20045
20046 digest[0] = salt->salt_buf[4];
20047 digest[1] = salt->salt_buf[5];
20048 digest[2] = salt->salt_buf[6];
20049 digest[3] = salt->salt_buf[7];
20050
20051 return (PARSER_OK);
20052 }
20053
20054 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20055 {
20056 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
20057
20058 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
20059
20060 u32 *digest = (u32 *) hash_buf->digest;
20061
20062 salt_t *salt = hash_buf->salt;
20063
20064 /**
20065 * parse line
20066 */
20067
20068 char *salt_pos = input_buf + 11 + 1;
20069
20070 char *iter_pos = strchr (salt_pos, ',');
20071
20072 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20073
20074 u32 salt_len = iter_pos - salt_pos;
20075
20076 if (salt_len != 20) return (PARSER_SALT_LENGTH);
20077
20078 iter_pos++;
20079
20080 char *hash_pos = strchr (iter_pos, ',');
20081
20082 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20083
20084 u32 iter_len = hash_pos - iter_pos;
20085
20086 if (iter_len > 5) return (PARSER_SALT_LENGTH);
20087
20088 hash_pos++;
20089
20090 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
20091
20092 if (hash_len != 64) return (PARSER_HASH_LENGTH);
20093
20094 /**
20095 * salt
20096 */
20097
20098 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
20099 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
20100 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
20101 salt->salt_buf[3] = 0x00018000;
20102
20103 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
20104 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
20105 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
20106 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
20107
20108 salt->salt_len = salt_len / 2;
20109
20110 salt->salt_iter = atoi (iter_pos) - 1;
20111
20112 /**
20113 * digest buf
20114 */
20115
20116 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20117 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20118 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20119 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20120 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20121 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20122 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20123 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20124
20125 return (PARSER_OK);
20126 }
20127
20128 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20129 {
20130 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
20131
20132 u32 *digest = (u32 *) hash_buf->digest;
20133
20134 salt_t *salt = hash_buf->salt;
20135
20136 /**
20137 * parse line
20138 */
20139
20140 char *hash_pos = input_buf + 64;
20141 char *salt1_pos = input_buf + 128;
20142 char *salt2_pos = input_buf;
20143
20144 /**
20145 * salt
20146 */
20147
20148 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
20149 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
20150 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
20151 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
20152
20153 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
20154 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
20155 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
20156 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
20157
20158 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
20159 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
20160 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
20161 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
20162
20163 salt->salt_len = 48;
20164
20165 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
20166
20167 /**
20168 * digest buf
20169 */
20170
20171 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
20172 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
20173 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
20174 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
20175 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
20176 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
20177 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
20178 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
20179
20180 return (PARSER_OK);
20181 }
20182
20183 int zip2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
20184 {
20185 if ((input_len < DISPLAY_LEN_MIN_13600) || (input_len > DISPLAY_LEN_MAX_13600)) return (PARSER_GLOBAL_LENGTH);
20186
20187 if (memcmp (SIGNATURE_ZIP2_START, input_buf , 6)) return (PARSER_SIGNATURE_UNMATCHED);
20188 if (memcmp (SIGNATURE_ZIP2_STOP , input_buf + input_len - 7, 7)) return (PARSER_SIGNATURE_UNMATCHED);
20189
20190 u32 *digest = (u32 *) hash_buf->digest;
20191
20192 salt_t *salt = hash_buf->salt;
20193
20194 zip2_t *zip2 = (zip2_t *) hash_buf->esalt;
20195
20196 /**
20197 * parse line
20198 */
20199
20200 char *param0_pos = input_buf + 6 + 1;
20201
20202 char *param1_pos = strchr (param0_pos, '*');
20203
20204 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20205
20206 u32 param0_len = param1_pos - param0_pos;
20207
20208 param1_pos++;
20209
20210 char *param2_pos = strchr (param1_pos, '*');
20211
20212 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20213
20214 u32 param1_len = param2_pos - param1_pos;
20215
20216 param2_pos++;
20217
20218 char *param3_pos = strchr (param2_pos, '*');
20219
20220 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20221
20222 u32 param2_len = param3_pos - param2_pos;
20223
20224 param3_pos++;
20225
20226 char *param4_pos = strchr (param3_pos, '*');
20227
20228 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20229
20230 u32 param3_len = param4_pos - param3_pos;
20231
20232 param4_pos++;
20233
20234 char *param5_pos = strchr (param4_pos, '*');
20235
20236 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20237
20238 u32 param4_len = param5_pos - param4_pos;
20239
20240 param5_pos++;
20241
20242 char *param6_pos = strchr (param5_pos, '*');
20243
20244 if (param6_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20245
20246 u32 param5_len = param6_pos - param5_pos;
20247
20248 param6_pos++;
20249
20250 char *param7_pos = strchr (param6_pos, '*');
20251
20252 if (param7_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20253
20254 u32 param6_len = param7_pos - param6_pos;
20255
20256 param7_pos++;
20257
20258 char *param8_pos = strchr (param7_pos, '*');
20259
20260 if (param8_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
20261
20262 u32 param7_len = param8_pos - param7_pos;
20263
20264 param8_pos++;
20265
20266 const uint type = atoi (param0_pos);
20267 const uint mode = atoi (param1_pos);
20268 const uint magic = atoi (param2_pos);
20269
20270 char *salt_buf = param3_pos;
20271
20272 uint verify_bytes; sscanf (param4_pos, "%4x*", &verify_bytes);
20273
20274 const uint compress_length = atoi (param5_pos);
20275
20276 char *data_buf = param6_pos;
20277 char *auth = param7_pos;
20278
20279 /**
20280 * verify some data
20281 */
20282
20283 if (param0_len != 1) return (PARSER_SALT_VALUE);
20284
20285 if (param1_len != 1) return (PARSER_SALT_VALUE);
20286
20287 if (param2_len != 1) return (PARSER_SALT_VALUE);
20288
20289 if ((param3_len != 16) && (param3_len != 24) && (param3_len != 32)) return (PARSER_SALT_VALUE);
20290
20291 if (param4_len >= 5) return (PARSER_SALT_VALUE);
20292
20293 if (param5_len >= 5) return (PARSER_SALT_VALUE);
20294
20295 if (param6_len >= 8192) return (PARSER_SALT_VALUE);
20296
20297 if (param6_len & 1) return (PARSER_SALT_VALUE);
20298
20299 if (param7_len != 20) return (PARSER_SALT_VALUE);
20300
20301 if (type != 0) return (PARSER_SALT_VALUE);
20302
20303 if ((mode != 1) && (mode != 2) && (mode != 3)) return (PARSER_SALT_VALUE);
20304
20305 if (magic != 0) return (PARSER_SALT_VALUE);
20306
20307 if (verify_bytes >= 0x10000) return (PARSER_SALT_VALUE);
20308
20309 /**
20310 * store data
20311 */
20312
20313 zip2->type = type;
20314 zip2->mode = mode;
20315 zip2->magic = magic;
20316
20317 if (mode == 1)
20318 {
20319 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20320 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20321 zip2->salt_buf[2] = 0;
20322 zip2->salt_buf[3] = 0;
20323
20324 zip2->salt_len = 8;
20325 }
20326 else if (mode == 2)
20327 {
20328 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20329 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20330 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20331 zip2->salt_buf[3] = 0;
20332
20333 zip2->salt_len = 12;
20334 }
20335 else if (mode == 3)
20336 {
20337 zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
20338 zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
20339 zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
20340 zip2->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
20341
20342 zip2->salt_len = 16;
20343 }
20344
20345 zip2->salt_buf[0] = byte_swap_32 (zip2->salt_buf[0]);
20346 zip2->salt_buf[1] = byte_swap_32 (zip2->salt_buf[1]);
20347 zip2->salt_buf[2] = byte_swap_32 (zip2->salt_buf[2]);
20348 zip2->salt_buf[3] = byte_swap_32 (zip2->salt_buf[3]);
20349
20350 zip2->verify_bytes = verify_bytes;
20351
20352 zip2->compress_length = compress_length;
20353
20354 char *data_buf_ptr = (char *) zip2->data_buf;
20355
20356 for (uint i = 0; i < param6_len; i += 2)
20357 {
20358 const char p0 = data_buf[i + 0];
20359 const char p1 = data_buf[i + 1];
20360
20361 *data_buf_ptr++ = hex_convert (p1) << 0
20362 | hex_convert (p0) << 4;
20363
20364 zip2->data_len++;
20365 }
20366
20367 *data_buf_ptr = 0x80;
20368
20369 char *auth_ptr = (char *) zip2->auth_buf;
20370
20371 for (uint i = 0; i < param7_len; i += 2)
20372 {
20373 const char p0 = auth[i + 0];
20374 const char p1 = auth[i + 1];
20375
20376 *auth_ptr++ = hex_convert (p1) << 0
20377 | hex_convert (p0) << 4;
20378
20379 zip2->auth_len++;
20380 }
20381
20382 /**
20383 * salt buf (fake)
20384 */
20385
20386 salt->salt_buf[0] = zip2->salt_buf[0];
20387 salt->salt_buf[1] = zip2->salt_buf[1];
20388 salt->salt_buf[2] = zip2->salt_buf[2];
20389 salt->salt_buf[3] = zip2->salt_buf[3];
20390 salt->salt_buf[4] = zip2->data_buf[0];
20391 salt->salt_buf[5] = zip2->data_buf[1];
20392 salt->salt_buf[6] = zip2->data_buf[2];
20393 salt->salt_buf[7] = zip2->data_buf[3];
20394
20395 salt->salt_len = 32;
20396
20397 salt->salt_iter = ROUNDS_ZIP2 - 1;
20398
20399 /**
20400 * digest buf (fake)
20401 */
20402
20403 digest[0] = zip2->auth_buf[0];
20404 digest[1] = zip2->auth_buf[1];
20405 digest[2] = zip2->auth_buf[2];
20406 digest[3] = zip2->auth_buf[3];
20407
20408 return (PARSER_OK);
20409 }
20410
20411 /**
20412 * parallel running threads
20413 */
20414
20415 #ifdef WIN
20416
20417 BOOL WINAPI sigHandler_default (DWORD sig)
20418 {
20419 switch (sig)
20420 {
20421 case CTRL_CLOSE_EVENT:
20422
20423 /*
20424 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
20425 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
20426 * function otherwise it is too late (e.g. after returning from this function)
20427 */
20428
20429 myabort ();
20430
20431 SetConsoleCtrlHandler (NULL, TRUE);
20432
20433 hc_sleep (10);
20434
20435 return TRUE;
20436
20437 case CTRL_C_EVENT:
20438 case CTRL_LOGOFF_EVENT:
20439 case CTRL_SHUTDOWN_EVENT:
20440
20441 myabort ();
20442
20443 SetConsoleCtrlHandler (NULL, TRUE);
20444
20445 return TRUE;
20446 }
20447
20448 return FALSE;
20449 }
20450
20451 BOOL WINAPI sigHandler_benchmark (DWORD sig)
20452 {
20453 switch (sig)
20454 {
20455 case CTRL_CLOSE_EVENT:
20456
20457 myabort ();
20458
20459 SetConsoleCtrlHandler (NULL, TRUE);
20460
20461 hc_sleep (10);
20462
20463 return TRUE;
20464
20465 case CTRL_C_EVENT:
20466 case CTRL_LOGOFF_EVENT:
20467 case CTRL_SHUTDOWN_EVENT:
20468
20469 myquit ();
20470
20471 SetConsoleCtrlHandler (NULL, TRUE);
20472
20473 return TRUE;
20474 }
20475
20476 return FALSE;
20477 }
20478
20479 void hc_signal (BOOL WINAPI (callback) (DWORD))
20480 {
20481 if (callback == NULL)
20482 {
20483 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
20484 }
20485 else
20486 {
20487 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
20488 }
20489 }
20490
20491 #else
20492
20493 void sigHandler_default (int sig)
20494 {
20495 myabort ();
20496
20497 signal (sig, NULL);
20498 }
20499
20500 void sigHandler_benchmark (int sig)
20501 {
20502 myquit ();
20503
20504 signal (sig, NULL);
20505 }
20506
20507 void hc_signal (void (callback) (int))
20508 {
20509 if (callback == NULL) callback = SIG_DFL;
20510
20511 signal (SIGINT, callback);
20512 signal (SIGTERM, callback);
20513 signal (SIGABRT, callback);
20514 }
20515
20516 #endif
20517
20518 void status_display ();
20519
20520 void *thread_keypress (void *p)
20521 {
20522 int benchmark = *((int *) p);
20523
20524 uint quiet = data.quiet;
20525
20526 tty_break();
20527
20528 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
20529 {
20530 int ch = tty_getchar();
20531
20532 if (ch == -1) break;
20533
20534 if (ch == 0) continue;
20535
20536 //https://github.com/hashcat/hashcat/issues/302
20537 //#ifdef _POSIX
20538 //if (ch != '\n')
20539 //#endif
20540
20541 hc_thread_mutex_lock (mux_display);
20542
20543 log_info ("");
20544
20545 switch (ch)
20546 {
20547 case 's':
20548 case '\r':
20549 case '\n':
20550
20551 log_info ("");
20552
20553 status_display ();
20554
20555 log_info ("");
20556
20557 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20558 if (quiet == 0) fflush (stdout);
20559
20560 break;
20561
20562 case 'b':
20563
20564 log_info ("");
20565
20566 bypass ();
20567
20568 log_info ("");
20569
20570 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20571 if (quiet == 0) fflush (stdout);
20572
20573 break;
20574
20575 case 'p':
20576
20577 log_info ("");
20578
20579 SuspendThreads ();
20580
20581 log_info ("");
20582
20583 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20584 if (quiet == 0) fflush (stdout);
20585
20586 break;
20587
20588 case 'r':
20589
20590 log_info ("");
20591
20592 ResumeThreads ();
20593
20594 log_info ("");
20595
20596 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20597 if (quiet == 0) fflush (stdout);
20598
20599 break;
20600
20601 case 'c':
20602
20603 log_info ("");
20604
20605 if (benchmark == 1) break;
20606
20607 stop_at_checkpoint ();
20608
20609 log_info ("");
20610
20611 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
20612 if (quiet == 0) fflush (stdout);
20613
20614 break;
20615
20616 case 'q':
20617
20618 log_info ("");
20619
20620 if (benchmark == 1)
20621 {
20622 myquit ();
20623 }
20624 else
20625 {
20626 myabort ();
20627 }
20628
20629 break;
20630 }
20631
20632 //https://github.com/hashcat/hashcat/issues/302
20633 //#ifdef _POSIX
20634 //if (ch != '\n')
20635 //#endif
20636
20637 hc_thread_mutex_unlock (mux_display);
20638 }
20639
20640 tty_fix();
20641
20642 return (p);
20643 }
20644
20645 /**
20646 * rules common
20647 */
20648
20649 bool class_num (const u8 c)
20650 {
20651 return ((c >= '0') && (c <= '9'));
20652 }
20653
20654 bool class_lower (const u8 c)
20655 {
20656 return ((c >= 'a') && (c <= 'z'));
20657 }
20658
20659 bool class_upper (const u8 c)
20660 {
20661 return ((c >= 'A') && (c <= 'Z'));
20662 }
20663
20664 bool class_alpha (const u8 c)
20665 {
20666 return (class_lower (c) || class_upper (c));
20667 }
20668
20669 int conv_ctoi (const u8 c)
20670 {
20671 if (class_num (c))
20672 {
20673 return c - '0';
20674 }
20675 else if (class_upper (c))
20676 {
20677 return c - 'A' + 10;
20678 }
20679
20680 return -1;
20681 }
20682
20683 int conv_itoc (const u8 c)
20684 {
20685 if (c < 10)
20686 {
20687 return c + '0';
20688 }
20689 else if (c < 37)
20690 {
20691 return c + 'A' - 10;
20692 }
20693
20694 return -1;
20695 }
20696
20697 /**
20698 * device rules
20699 */
20700
20701 #define INCR_POS if (++rule_pos == rule_len) return (-1)
20702 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
20703 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
20704 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
20705 #define MAX_KERNEL_RULES 255
20706 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
20707 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20708 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20709
20710 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
20711 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
20712 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
20713 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
20714
20715 int cpu_rule_to_kernel_rule (char *rule_buf, uint rule_len, kernel_rule_t *rule)
20716 {
20717 uint rule_pos;
20718 uint rule_cnt;
20719
20720 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
20721 {
20722 switch (rule_buf[rule_pos])
20723 {
20724 case ' ':
20725 rule_cnt--;
20726 break;
20727
20728 case RULE_OP_MANGLE_NOOP:
20729 SET_NAME (rule, rule_buf[rule_pos]);
20730 break;
20731
20732 case RULE_OP_MANGLE_LREST:
20733 SET_NAME (rule, rule_buf[rule_pos]);
20734 break;
20735
20736 case RULE_OP_MANGLE_UREST:
20737 SET_NAME (rule, rule_buf[rule_pos]);
20738 break;
20739
20740 case RULE_OP_MANGLE_LREST_UFIRST:
20741 SET_NAME (rule, rule_buf[rule_pos]);
20742 break;
20743
20744 case RULE_OP_MANGLE_UREST_LFIRST:
20745 SET_NAME (rule, rule_buf[rule_pos]);
20746 break;
20747
20748 case RULE_OP_MANGLE_TREST:
20749 SET_NAME (rule, rule_buf[rule_pos]);
20750 break;
20751
20752 case RULE_OP_MANGLE_TOGGLE_AT:
20753 SET_NAME (rule, rule_buf[rule_pos]);
20754 SET_P0_CONV (rule, rule_buf[rule_pos]);
20755 break;
20756
20757 case RULE_OP_MANGLE_REVERSE:
20758 SET_NAME (rule, rule_buf[rule_pos]);
20759 break;
20760
20761 case RULE_OP_MANGLE_DUPEWORD:
20762 SET_NAME (rule, rule_buf[rule_pos]);
20763 break;
20764
20765 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20766 SET_NAME (rule, rule_buf[rule_pos]);
20767 SET_P0_CONV (rule, rule_buf[rule_pos]);
20768 break;
20769
20770 case RULE_OP_MANGLE_REFLECT:
20771 SET_NAME (rule, rule_buf[rule_pos]);
20772 break;
20773
20774 case RULE_OP_MANGLE_ROTATE_LEFT:
20775 SET_NAME (rule, rule_buf[rule_pos]);
20776 break;
20777
20778 case RULE_OP_MANGLE_ROTATE_RIGHT:
20779 SET_NAME (rule, rule_buf[rule_pos]);
20780 break;
20781
20782 case RULE_OP_MANGLE_APPEND:
20783 SET_NAME (rule, rule_buf[rule_pos]);
20784 SET_P0 (rule, rule_buf[rule_pos]);
20785 break;
20786
20787 case RULE_OP_MANGLE_PREPEND:
20788 SET_NAME (rule, rule_buf[rule_pos]);
20789 SET_P0 (rule, rule_buf[rule_pos]);
20790 break;
20791
20792 case RULE_OP_MANGLE_DELETE_FIRST:
20793 SET_NAME (rule, rule_buf[rule_pos]);
20794 break;
20795
20796 case RULE_OP_MANGLE_DELETE_LAST:
20797 SET_NAME (rule, rule_buf[rule_pos]);
20798 break;
20799
20800 case RULE_OP_MANGLE_DELETE_AT:
20801 SET_NAME (rule, rule_buf[rule_pos]);
20802 SET_P0_CONV (rule, rule_buf[rule_pos]);
20803 break;
20804
20805 case RULE_OP_MANGLE_EXTRACT:
20806 SET_NAME (rule, rule_buf[rule_pos]);
20807 SET_P0_CONV (rule, rule_buf[rule_pos]);
20808 SET_P1_CONV (rule, rule_buf[rule_pos]);
20809 break;
20810
20811 case RULE_OP_MANGLE_OMIT:
20812 SET_NAME (rule, rule_buf[rule_pos]);
20813 SET_P0_CONV (rule, rule_buf[rule_pos]);
20814 SET_P1_CONV (rule, rule_buf[rule_pos]);
20815 break;
20816
20817 case RULE_OP_MANGLE_INSERT:
20818 SET_NAME (rule, rule_buf[rule_pos]);
20819 SET_P0_CONV (rule, rule_buf[rule_pos]);
20820 SET_P1 (rule, rule_buf[rule_pos]);
20821 break;
20822
20823 case RULE_OP_MANGLE_OVERSTRIKE:
20824 SET_NAME (rule, rule_buf[rule_pos]);
20825 SET_P0_CONV (rule, rule_buf[rule_pos]);
20826 SET_P1 (rule, rule_buf[rule_pos]);
20827 break;
20828
20829 case RULE_OP_MANGLE_TRUNCATE_AT:
20830 SET_NAME (rule, rule_buf[rule_pos]);
20831 SET_P0_CONV (rule, rule_buf[rule_pos]);
20832 break;
20833
20834 case RULE_OP_MANGLE_REPLACE:
20835 SET_NAME (rule, rule_buf[rule_pos]);
20836 SET_P0 (rule, rule_buf[rule_pos]);
20837 SET_P1 (rule, rule_buf[rule_pos]);
20838 break;
20839
20840 case RULE_OP_MANGLE_PURGECHAR:
20841 return (-1);
20842 break;
20843
20844 case RULE_OP_MANGLE_TOGGLECASE_REC:
20845 return (-1);
20846 break;
20847
20848 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20849 SET_NAME (rule, rule_buf[rule_pos]);
20850 SET_P0_CONV (rule, rule_buf[rule_pos]);
20851 break;
20852
20853 case RULE_OP_MANGLE_DUPECHAR_LAST:
20854 SET_NAME (rule, rule_buf[rule_pos]);
20855 SET_P0_CONV (rule, rule_buf[rule_pos]);
20856 break;
20857
20858 case RULE_OP_MANGLE_DUPECHAR_ALL:
20859 SET_NAME (rule, rule_buf[rule_pos]);
20860 break;
20861
20862 case RULE_OP_MANGLE_SWITCH_FIRST:
20863 SET_NAME (rule, rule_buf[rule_pos]);
20864 break;
20865
20866 case RULE_OP_MANGLE_SWITCH_LAST:
20867 SET_NAME (rule, rule_buf[rule_pos]);
20868 break;
20869
20870 case RULE_OP_MANGLE_SWITCH_AT:
20871 SET_NAME (rule, rule_buf[rule_pos]);
20872 SET_P0_CONV (rule, rule_buf[rule_pos]);
20873 SET_P1_CONV (rule, rule_buf[rule_pos]);
20874 break;
20875
20876 case RULE_OP_MANGLE_CHR_SHIFTL:
20877 SET_NAME (rule, rule_buf[rule_pos]);
20878 SET_P0_CONV (rule, rule_buf[rule_pos]);
20879 break;
20880
20881 case RULE_OP_MANGLE_CHR_SHIFTR:
20882 SET_NAME (rule, rule_buf[rule_pos]);
20883 SET_P0_CONV (rule, rule_buf[rule_pos]);
20884 break;
20885
20886 case RULE_OP_MANGLE_CHR_INCR:
20887 SET_NAME (rule, rule_buf[rule_pos]);
20888 SET_P0_CONV (rule, rule_buf[rule_pos]);
20889 break;
20890
20891 case RULE_OP_MANGLE_CHR_DECR:
20892 SET_NAME (rule, rule_buf[rule_pos]);
20893 SET_P0_CONV (rule, rule_buf[rule_pos]);
20894 break;
20895
20896 case RULE_OP_MANGLE_REPLACE_NP1:
20897 SET_NAME (rule, rule_buf[rule_pos]);
20898 SET_P0_CONV (rule, rule_buf[rule_pos]);
20899 break;
20900
20901 case RULE_OP_MANGLE_REPLACE_NM1:
20902 SET_NAME (rule, rule_buf[rule_pos]);
20903 SET_P0_CONV (rule, rule_buf[rule_pos]);
20904 break;
20905
20906 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20907 SET_NAME (rule, rule_buf[rule_pos]);
20908 SET_P0_CONV (rule, rule_buf[rule_pos]);
20909 break;
20910
20911 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20912 SET_NAME (rule, rule_buf[rule_pos]);
20913 SET_P0_CONV (rule, rule_buf[rule_pos]);
20914 break;
20915
20916 case RULE_OP_MANGLE_TITLE:
20917 SET_NAME (rule, rule_buf[rule_pos]);
20918 break;
20919
20920 default:
20921 return (-1);
20922 break;
20923 }
20924 }
20925
20926 if (rule_pos < rule_len) return (-1);
20927
20928 return (0);
20929 }
20930
20931 int kernel_rule_to_cpu_rule (char *rule_buf, kernel_rule_t *rule)
20932 {
20933 uint rule_cnt;
20934 uint rule_pos;
20935 uint rule_len = HCBUFSIZ - 1; // maximum possible len
20936
20937 char rule_cmd;
20938
20939 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
20940 {
20941 GET_NAME (rule);
20942
20943 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
20944
20945 switch (rule_cmd)
20946 {
20947 case RULE_OP_MANGLE_NOOP:
20948 rule_buf[rule_pos] = rule_cmd;
20949 break;
20950
20951 case RULE_OP_MANGLE_LREST:
20952 rule_buf[rule_pos] = rule_cmd;
20953 break;
20954
20955 case RULE_OP_MANGLE_UREST:
20956 rule_buf[rule_pos] = rule_cmd;
20957 break;
20958
20959 case RULE_OP_MANGLE_LREST_UFIRST:
20960 rule_buf[rule_pos] = rule_cmd;
20961 break;
20962
20963 case RULE_OP_MANGLE_UREST_LFIRST:
20964 rule_buf[rule_pos] = rule_cmd;
20965 break;
20966
20967 case RULE_OP_MANGLE_TREST:
20968 rule_buf[rule_pos] = rule_cmd;
20969 break;
20970
20971 case RULE_OP_MANGLE_TOGGLE_AT:
20972 rule_buf[rule_pos] = rule_cmd;
20973 GET_P0_CONV (rule);
20974 break;
20975
20976 case RULE_OP_MANGLE_REVERSE:
20977 rule_buf[rule_pos] = rule_cmd;
20978 break;
20979
20980 case RULE_OP_MANGLE_DUPEWORD:
20981 rule_buf[rule_pos] = rule_cmd;
20982 break;
20983
20984 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20985 rule_buf[rule_pos] = rule_cmd;
20986 GET_P0_CONV (rule);
20987 break;
20988
20989 case RULE_OP_MANGLE_REFLECT:
20990 rule_buf[rule_pos] = rule_cmd;
20991 break;
20992
20993 case RULE_OP_MANGLE_ROTATE_LEFT:
20994 rule_buf[rule_pos] = rule_cmd;
20995 break;
20996
20997 case RULE_OP_MANGLE_ROTATE_RIGHT:
20998 rule_buf[rule_pos] = rule_cmd;
20999 break;
21000
21001 case RULE_OP_MANGLE_APPEND:
21002 rule_buf[rule_pos] = rule_cmd;
21003 GET_P0 (rule);
21004 break;
21005
21006 case RULE_OP_MANGLE_PREPEND:
21007 rule_buf[rule_pos] = rule_cmd;
21008 GET_P0 (rule);
21009 break;
21010
21011 case RULE_OP_MANGLE_DELETE_FIRST:
21012 rule_buf[rule_pos] = rule_cmd;
21013 break;
21014
21015 case RULE_OP_MANGLE_DELETE_LAST:
21016 rule_buf[rule_pos] = rule_cmd;
21017 break;
21018
21019 case RULE_OP_MANGLE_DELETE_AT:
21020 rule_buf[rule_pos] = rule_cmd;
21021 GET_P0_CONV (rule);
21022 break;
21023
21024 case RULE_OP_MANGLE_EXTRACT:
21025 rule_buf[rule_pos] = rule_cmd;
21026 GET_P0_CONV (rule);
21027 GET_P1_CONV (rule);
21028 break;
21029
21030 case RULE_OP_MANGLE_OMIT:
21031 rule_buf[rule_pos] = rule_cmd;
21032 GET_P0_CONV (rule);
21033 GET_P1_CONV (rule);
21034 break;
21035
21036 case RULE_OP_MANGLE_INSERT:
21037 rule_buf[rule_pos] = rule_cmd;
21038 GET_P0_CONV (rule);
21039 GET_P1 (rule);
21040 break;
21041
21042 case RULE_OP_MANGLE_OVERSTRIKE:
21043 rule_buf[rule_pos] = rule_cmd;
21044 GET_P0_CONV (rule);
21045 GET_P1 (rule);
21046 break;
21047
21048 case RULE_OP_MANGLE_TRUNCATE_AT:
21049 rule_buf[rule_pos] = rule_cmd;
21050 GET_P0_CONV (rule);
21051 break;
21052
21053 case RULE_OP_MANGLE_REPLACE:
21054 rule_buf[rule_pos] = rule_cmd;
21055 GET_P0 (rule);
21056 GET_P1 (rule);
21057 break;
21058
21059 case RULE_OP_MANGLE_PURGECHAR:
21060 return (-1);
21061 break;
21062
21063 case RULE_OP_MANGLE_TOGGLECASE_REC:
21064 return (-1);
21065 break;
21066
21067 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21068 rule_buf[rule_pos] = rule_cmd;
21069 GET_P0_CONV (rule);
21070 break;
21071
21072 case RULE_OP_MANGLE_DUPECHAR_LAST:
21073 rule_buf[rule_pos] = rule_cmd;
21074 GET_P0_CONV (rule);
21075 break;
21076
21077 case RULE_OP_MANGLE_DUPECHAR_ALL:
21078 rule_buf[rule_pos] = rule_cmd;
21079 break;
21080
21081 case RULE_OP_MANGLE_SWITCH_FIRST:
21082 rule_buf[rule_pos] = rule_cmd;
21083 break;
21084
21085 case RULE_OP_MANGLE_SWITCH_LAST:
21086 rule_buf[rule_pos] = rule_cmd;
21087 break;
21088
21089 case RULE_OP_MANGLE_SWITCH_AT:
21090 rule_buf[rule_pos] = rule_cmd;
21091 GET_P0_CONV (rule);
21092 GET_P1_CONV (rule);
21093 break;
21094
21095 case RULE_OP_MANGLE_CHR_SHIFTL:
21096 rule_buf[rule_pos] = rule_cmd;
21097 GET_P0_CONV (rule);
21098 break;
21099
21100 case RULE_OP_MANGLE_CHR_SHIFTR:
21101 rule_buf[rule_pos] = rule_cmd;
21102 GET_P0_CONV (rule);
21103 break;
21104
21105 case RULE_OP_MANGLE_CHR_INCR:
21106 rule_buf[rule_pos] = rule_cmd;
21107 GET_P0_CONV (rule);
21108 break;
21109
21110 case RULE_OP_MANGLE_CHR_DECR:
21111 rule_buf[rule_pos] = rule_cmd;
21112 GET_P0_CONV (rule);
21113 break;
21114
21115 case RULE_OP_MANGLE_REPLACE_NP1:
21116 rule_buf[rule_pos] = rule_cmd;
21117 GET_P0_CONV (rule);
21118 break;
21119
21120 case RULE_OP_MANGLE_REPLACE_NM1:
21121 rule_buf[rule_pos] = rule_cmd;
21122 GET_P0_CONV (rule);
21123 break;
21124
21125 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21126 rule_buf[rule_pos] = rule_cmd;
21127 GET_P0_CONV (rule);
21128 break;
21129
21130 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21131 rule_buf[rule_pos] = rule_cmd;
21132 GET_P0_CONV (rule);
21133 break;
21134
21135 case RULE_OP_MANGLE_TITLE:
21136 rule_buf[rule_pos] = rule_cmd;
21137 break;
21138
21139 case 0:
21140 return rule_pos - 1;
21141 break;
21142
21143 default:
21144 return (-1);
21145 break;
21146 }
21147 }
21148
21149 if (rule_cnt > 0)
21150 {
21151 return rule_pos;
21152 }
21153
21154 return (-1);
21155 }
21156
21157 /**
21158 * CPU rules : this is from hashcat sources, cpu based rules
21159 */
21160
21161 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
21162 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
21163
21164 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
21165 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
21166 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
21167
21168 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
21169 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
21170 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
21171
21172 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
21173 {
21174 int pos;
21175
21176 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
21177
21178 return (arr_len);
21179 }
21180
21181 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
21182 {
21183 int pos;
21184
21185 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
21186
21187 return (arr_len);
21188 }
21189
21190 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
21191 {
21192 int pos;
21193
21194 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
21195
21196 return (arr_len);
21197 }
21198
21199 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
21200 {
21201 int l;
21202 int r;
21203
21204 for (l = 0; l < arr_len; l++)
21205 {
21206 r = arr_len - 1 - l;
21207
21208 if (l >= r) break;
21209
21210 MANGLE_SWITCH (arr, l, r);
21211 }
21212
21213 return (arr_len);
21214 }
21215
21216 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
21217 {
21218 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21219
21220 memcpy (&arr[arr_len], arr, (size_t) arr_len);
21221
21222 return (arr_len * 2);
21223 }
21224
21225 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
21226 {
21227 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
21228
21229 int orig_len = arr_len;
21230
21231 int i;
21232
21233 for (i = 0; i < times; i++)
21234 {
21235 memcpy (&arr[arr_len], arr, orig_len);
21236
21237 arr_len += orig_len;
21238 }
21239
21240 return (arr_len);
21241 }
21242
21243 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
21244 {
21245 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
21246
21247 mangle_double (arr, arr_len);
21248
21249 mangle_reverse (arr + arr_len, arr_len);
21250
21251 return (arr_len * 2);
21252 }
21253
21254 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
21255 {
21256 int l;
21257 int r;
21258
21259 for (l = 0, r = arr_len - 1; r > 0; r--)
21260 {
21261 MANGLE_SWITCH (arr, l, r);
21262 }
21263
21264 return (arr_len);
21265 }
21266
21267 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
21268 {
21269 int l;
21270 int r;
21271
21272 for (l = 0, r = arr_len - 1; l < r; l++)
21273 {
21274 MANGLE_SWITCH (arr, l, r);
21275 }
21276
21277 return (arr_len);
21278 }
21279
21280 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
21281 {
21282 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21283
21284 arr[arr_len] = c;
21285
21286 return (arr_len + 1);
21287 }
21288
21289 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
21290 {
21291 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21292
21293 int arr_pos;
21294
21295 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21296 {
21297 arr[arr_pos + 1] = arr[arr_pos];
21298 }
21299
21300 arr[0] = c;
21301
21302 return (arr_len + 1);
21303 }
21304
21305 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21306 {
21307 if (upos >= arr_len) return (arr_len);
21308
21309 int arr_pos;
21310
21311 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
21312 {
21313 arr[arr_pos] = arr[arr_pos + 1];
21314 }
21315
21316 return (arr_len - 1);
21317 }
21318
21319 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21320 {
21321 if (upos >= arr_len) return (arr_len);
21322
21323 if ((upos + ulen) > arr_len) return (arr_len);
21324
21325 int arr_pos;
21326
21327 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
21328 {
21329 arr[arr_pos] = arr[upos + arr_pos];
21330 }
21331
21332 return (ulen);
21333 }
21334
21335 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21336 {
21337 if (upos >= arr_len) return (arr_len);
21338
21339 if ((upos + ulen) >= arr_len) return (arr_len);
21340
21341 int arr_pos;
21342
21343 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
21344 {
21345 arr[arr_pos] = arr[arr_pos + ulen];
21346 }
21347
21348 return (arr_len - ulen);
21349 }
21350
21351 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21352 {
21353 if (upos >= arr_len) return (arr_len);
21354
21355 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
21356
21357 int arr_pos;
21358
21359 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
21360 {
21361 arr[arr_pos + 1] = arr[arr_pos];
21362 }
21363
21364 arr[upos] = c;
21365
21366 return (arr_len + 1);
21367 }
21368
21369 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)
21370 {
21371 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21372
21373 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
21374
21375 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
21376
21377 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
21378
21379 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
21380
21381 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
21382
21383 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
21384
21385 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
21386
21387 return (arr_len + arr2_cpy);
21388 }
21389
21390 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
21391 {
21392 if (upos >= arr_len) return (arr_len);
21393
21394 arr[upos] = c;
21395
21396 return (arr_len);
21397 }
21398
21399 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
21400 {
21401 if (upos >= arr_len) return (arr_len);
21402
21403 memset (arr + upos, 0, arr_len - upos);
21404
21405 return (upos);
21406 }
21407
21408 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
21409 {
21410 int arr_pos;
21411
21412 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
21413 {
21414 if (arr[arr_pos] != oldc) continue;
21415
21416 arr[arr_pos] = newc;
21417 }
21418
21419 return (arr_len);
21420 }
21421
21422 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
21423 {
21424 int arr_pos;
21425
21426 int ret_len;
21427
21428 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
21429 {
21430 if (arr[arr_pos] == c) continue;
21431
21432 arr[ret_len] = arr[arr_pos];
21433
21434 ret_len++;
21435 }
21436
21437 return (ret_len);
21438 }
21439
21440 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
21441 {
21442 if (ulen > arr_len) return (arr_len);
21443
21444 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21445
21446 char cs[100] = { 0 };
21447
21448 memcpy (cs, arr, ulen);
21449
21450 int i;
21451
21452 for (i = 0; i < ulen; i++)
21453 {
21454 char c = cs[i];
21455
21456 arr_len = mangle_insert (arr, arr_len, i, c);
21457 }
21458
21459 return (arr_len);
21460 }
21461
21462 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
21463 {
21464 if (ulen > arr_len) return (arr_len);
21465
21466 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21467
21468 int upos = arr_len - ulen;
21469
21470 int i;
21471
21472 for (i = 0; i < ulen; i++)
21473 {
21474 char c = arr[upos + i];
21475
21476 arr_len = mangle_append (arr, arr_len, c);
21477 }
21478
21479 return (arr_len);
21480 }
21481
21482 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
21483 {
21484 if ( arr_len == 0) return (arr_len);
21485 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
21486
21487 char c = arr[upos];
21488
21489 int i;
21490
21491 for (i = 0; i < ulen; i++)
21492 {
21493 arr_len = mangle_insert (arr, arr_len, upos, c);
21494 }
21495
21496 return (arr_len);
21497 }
21498
21499 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
21500 {
21501 if ( arr_len == 0) return (arr_len);
21502 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
21503
21504 int arr_pos;
21505
21506 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
21507 {
21508 int new_pos = arr_pos * 2;
21509
21510 arr[new_pos] = arr[arr_pos];
21511
21512 arr[new_pos + 1] = arr[arr_pos];
21513 }
21514
21515 return (arr_len * 2);
21516 }
21517
21518 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21519 {
21520 if (upos >= arr_len) return (arr_len);
21521 if (upos2 >= arr_len) return (arr_len);
21522
21523 MANGLE_SWITCH (arr, upos, upos2);
21524
21525 return (arr_len);
21526 }
21527
21528 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
21529 {
21530 MANGLE_SWITCH (arr, upos, upos2);
21531
21532 return (arr_len);
21533 }
21534
21535 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
21536 {
21537 if (upos >= arr_len) return (arr_len);
21538
21539 arr[upos] <<= 1;
21540
21541 return (arr_len);
21542 }
21543
21544 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
21545 {
21546 if (upos >= arr_len) return (arr_len);
21547
21548 arr[upos] >>= 1;
21549
21550 return (arr_len);
21551 }
21552
21553 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
21554 {
21555 if (upos >= arr_len) return (arr_len);
21556
21557 arr[upos] += 1;
21558
21559 return (arr_len);
21560 }
21561
21562 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
21563 {
21564 if (upos >= arr_len) return (arr_len);
21565
21566 arr[upos] -= 1;
21567
21568 return (arr_len);
21569 }
21570
21571 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
21572 {
21573 int upper_next = 1;
21574
21575 int pos;
21576
21577 for (pos = 0; pos < arr_len; pos++)
21578 {
21579 if (arr[pos] == ' ')
21580 {
21581 upper_next = 1;
21582
21583 continue;
21584 }
21585
21586 if (upper_next)
21587 {
21588 upper_next = 0;
21589
21590 MANGLE_UPPER_AT (arr, pos);
21591 }
21592 else
21593 {
21594 MANGLE_LOWER_AT (arr, pos);
21595 }
21596 }
21597
21598 return (arr_len);
21599 }
21600
21601 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
21602 {
21603 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
21604
21605 u32 j;
21606
21607 u32 rule_pos = 0;
21608
21609 for (j = 0; j < rp_gen_num; j++)
21610 {
21611 u32 r = 0;
21612 u32 p1 = 0;
21613 u32 p2 = 0;
21614 u32 p3 = 0;
21615
21616 switch ((char) get_random_num (0, 9))
21617 {
21618 case 0:
21619 r = get_random_num (0, sizeof (grp_op_nop));
21620 rule_buf[rule_pos++] = grp_op_nop[r];
21621 break;
21622
21623 case 1:
21624 r = get_random_num (0, sizeof (grp_op_pos_p0));
21625 rule_buf[rule_pos++] = grp_op_pos_p0[r];
21626 p1 = get_random_num (0, sizeof (grp_pos));
21627 rule_buf[rule_pos++] = grp_pos[p1];
21628 break;
21629
21630 case 2:
21631 r = get_random_num (0, sizeof (grp_op_pos_p1));
21632 rule_buf[rule_pos++] = grp_op_pos_p1[r];
21633 p1 = get_random_num (1, 6);
21634 rule_buf[rule_pos++] = grp_pos[p1];
21635 break;
21636
21637 case 3:
21638 r = get_random_num (0, sizeof (grp_op_chr));
21639 rule_buf[rule_pos++] = grp_op_chr[r];
21640 p1 = get_random_num (0x20, 0x7e);
21641 rule_buf[rule_pos++] = (char) p1;
21642 break;
21643
21644 case 4:
21645 r = get_random_num (0, sizeof (grp_op_chr_chr));
21646 rule_buf[rule_pos++] = grp_op_chr_chr[r];
21647 p1 = get_random_num (0x20, 0x7e);
21648 rule_buf[rule_pos++] = (char) p1;
21649 p2 = get_random_num (0x20, 0x7e);
21650 while (p1 == p2)
21651 p2 = get_random_num (0x20, 0x7e);
21652 rule_buf[rule_pos++] = (char) p2;
21653 break;
21654
21655 case 5:
21656 r = get_random_num (0, sizeof (grp_op_pos_chr));
21657 rule_buf[rule_pos++] = grp_op_pos_chr[r];
21658 p1 = get_random_num (0, sizeof (grp_pos));
21659 rule_buf[rule_pos++] = grp_pos[p1];
21660 p2 = get_random_num (0x20, 0x7e);
21661 rule_buf[rule_pos++] = (char) p2;
21662 break;
21663
21664 case 6:
21665 r = get_random_num (0, sizeof (grp_op_pos_pos0));
21666 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
21667 p1 = get_random_num (0, sizeof (grp_pos));
21668 rule_buf[rule_pos++] = grp_pos[p1];
21669 p2 = get_random_num (0, sizeof (grp_pos));
21670 while (p1 == p2)
21671 p2 = get_random_num (0, sizeof (grp_pos));
21672 rule_buf[rule_pos++] = grp_pos[p2];
21673 break;
21674
21675 case 7:
21676 r = get_random_num (0, sizeof (grp_op_pos_pos1));
21677 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
21678 p1 = get_random_num (0, sizeof (grp_pos));
21679 rule_buf[rule_pos++] = grp_pos[p1];
21680 p2 = get_random_num (1, sizeof (grp_pos));
21681 while (p1 == p2)
21682 p2 = get_random_num (1, sizeof (grp_pos));
21683 rule_buf[rule_pos++] = grp_pos[p2];
21684 break;
21685
21686 case 8:
21687 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
21688 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
21689 p1 = get_random_num (0, sizeof (grp_pos));
21690 rule_buf[rule_pos++] = grp_pos[p1];
21691 p2 = get_random_num (1, sizeof (grp_pos));
21692 rule_buf[rule_pos++] = grp_pos[p1];
21693 p3 = get_random_num (0, sizeof (grp_pos));
21694 rule_buf[rule_pos++] = grp_pos[p3];
21695 break;
21696 }
21697 }
21698
21699 return (rule_pos);
21700 }
21701
21702 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
21703 {
21704 char mem[BLOCK_SIZE] = { 0 };
21705
21706 if (in == NULL) return (RULE_RC_REJECT_ERROR);
21707
21708 if (out == NULL) return (RULE_RC_REJECT_ERROR);
21709
21710 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21711
21712 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
21713
21714 int out_len = in_len;
21715 int mem_len = in_len;
21716
21717 memcpy (out, in, out_len);
21718
21719 int rule_pos;
21720
21721 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
21722 {
21723 int upos, upos2;
21724 int ulen;
21725
21726 switch (rule[rule_pos])
21727 {
21728 case ' ':
21729 break;
21730
21731 case RULE_OP_MANGLE_NOOP:
21732 break;
21733
21734 case RULE_OP_MANGLE_LREST:
21735 out_len = mangle_lrest (out, out_len);
21736 break;
21737
21738 case RULE_OP_MANGLE_UREST:
21739 out_len = mangle_urest (out, out_len);
21740 break;
21741
21742 case RULE_OP_MANGLE_LREST_UFIRST:
21743 out_len = mangle_lrest (out, out_len);
21744 if (out_len) MANGLE_UPPER_AT (out, 0);
21745 break;
21746
21747 case RULE_OP_MANGLE_UREST_LFIRST:
21748 out_len = mangle_urest (out, out_len);
21749 if (out_len) MANGLE_LOWER_AT (out, 0);
21750 break;
21751
21752 case RULE_OP_MANGLE_TREST:
21753 out_len = mangle_trest (out, out_len);
21754 break;
21755
21756 case RULE_OP_MANGLE_TOGGLE_AT:
21757 NEXT_RULEPOS (rule_pos);
21758 NEXT_RPTOI (rule, rule_pos, upos);
21759 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
21760 break;
21761
21762 case RULE_OP_MANGLE_REVERSE:
21763 out_len = mangle_reverse (out, out_len);
21764 break;
21765
21766 case RULE_OP_MANGLE_DUPEWORD:
21767 out_len = mangle_double (out, out_len);
21768 break;
21769
21770 case RULE_OP_MANGLE_DUPEWORD_TIMES:
21771 NEXT_RULEPOS (rule_pos);
21772 NEXT_RPTOI (rule, rule_pos, ulen);
21773 out_len = mangle_double_times (out, out_len, ulen);
21774 break;
21775
21776 case RULE_OP_MANGLE_REFLECT:
21777 out_len = mangle_reflect (out, out_len);
21778 break;
21779
21780 case RULE_OP_MANGLE_ROTATE_LEFT:
21781 mangle_rotate_left (out, out_len);
21782 break;
21783
21784 case RULE_OP_MANGLE_ROTATE_RIGHT:
21785 mangle_rotate_right (out, out_len);
21786 break;
21787
21788 case RULE_OP_MANGLE_APPEND:
21789 NEXT_RULEPOS (rule_pos);
21790 out_len = mangle_append (out, out_len, rule[rule_pos]);
21791 break;
21792
21793 case RULE_OP_MANGLE_PREPEND:
21794 NEXT_RULEPOS (rule_pos);
21795 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
21796 break;
21797
21798 case RULE_OP_MANGLE_DELETE_FIRST:
21799 out_len = mangle_delete_at (out, out_len, 0);
21800 break;
21801
21802 case RULE_OP_MANGLE_DELETE_LAST:
21803 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
21804 break;
21805
21806 case RULE_OP_MANGLE_DELETE_AT:
21807 NEXT_RULEPOS (rule_pos);
21808 NEXT_RPTOI (rule, rule_pos, upos);
21809 out_len = mangle_delete_at (out, out_len, upos);
21810 break;
21811
21812 case RULE_OP_MANGLE_EXTRACT:
21813 NEXT_RULEPOS (rule_pos);
21814 NEXT_RPTOI (rule, rule_pos, upos);
21815 NEXT_RULEPOS (rule_pos);
21816 NEXT_RPTOI (rule, rule_pos, ulen);
21817 out_len = mangle_extract (out, out_len, upos, ulen);
21818 break;
21819
21820 case RULE_OP_MANGLE_OMIT:
21821 NEXT_RULEPOS (rule_pos);
21822 NEXT_RPTOI (rule, rule_pos, upos);
21823 NEXT_RULEPOS (rule_pos);
21824 NEXT_RPTOI (rule, rule_pos, ulen);
21825 out_len = mangle_omit (out, out_len, upos, ulen);
21826 break;
21827
21828 case RULE_OP_MANGLE_INSERT:
21829 NEXT_RULEPOS (rule_pos);
21830 NEXT_RPTOI (rule, rule_pos, upos);
21831 NEXT_RULEPOS (rule_pos);
21832 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
21833 break;
21834
21835 case RULE_OP_MANGLE_OVERSTRIKE:
21836 NEXT_RULEPOS (rule_pos);
21837 NEXT_RPTOI (rule, rule_pos, upos);
21838 NEXT_RULEPOS (rule_pos);
21839 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
21840 break;
21841
21842 case RULE_OP_MANGLE_TRUNCATE_AT:
21843 NEXT_RULEPOS (rule_pos);
21844 NEXT_RPTOI (rule, rule_pos, upos);
21845 out_len = mangle_truncate_at (out, out_len, upos);
21846 break;
21847
21848 case RULE_OP_MANGLE_REPLACE:
21849 NEXT_RULEPOS (rule_pos);
21850 NEXT_RULEPOS (rule_pos);
21851 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
21852 break;
21853
21854 case RULE_OP_MANGLE_PURGECHAR:
21855 NEXT_RULEPOS (rule_pos);
21856 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
21857 break;
21858
21859 case RULE_OP_MANGLE_TOGGLECASE_REC:
21860 /* todo */
21861 break;
21862
21863 case RULE_OP_MANGLE_DUPECHAR_FIRST:
21864 NEXT_RULEPOS (rule_pos);
21865 NEXT_RPTOI (rule, rule_pos, ulen);
21866 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
21867 break;
21868
21869 case RULE_OP_MANGLE_DUPECHAR_LAST:
21870 NEXT_RULEPOS (rule_pos);
21871 NEXT_RPTOI (rule, rule_pos, ulen);
21872 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
21873 break;
21874
21875 case RULE_OP_MANGLE_DUPECHAR_ALL:
21876 out_len = mangle_dupechar (out, out_len);
21877 break;
21878
21879 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
21880 NEXT_RULEPOS (rule_pos);
21881 NEXT_RPTOI (rule, rule_pos, ulen);
21882 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
21883 break;
21884
21885 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
21886 NEXT_RULEPOS (rule_pos);
21887 NEXT_RPTOI (rule, rule_pos, ulen);
21888 out_len = mangle_dupeblock_append (out, out_len, ulen);
21889 break;
21890
21891 case RULE_OP_MANGLE_SWITCH_FIRST:
21892 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
21893 break;
21894
21895 case RULE_OP_MANGLE_SWITCH_LAST:
21896 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
21897 break;
21898
21899 case RULE_OP_MANGLE_SWITCH_AT:
21900 NEXT_RULEPOS (rule_pos);
21901 NEXT_RPTOI (rule, rule_pos, upos);
21902 NEXT_RULEPOS (rule_pos);
21903 NEXT_RPTOI (rule, rule_pos, upos2);
21904 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
21905 break;
21906
21907 case RULE_OP_MANGLE_CHR_SHIFTL:
21908 NEXT_RULEPOS (rule_pos);
21909 NEXT_RPTOI (rule, rule_pos, upos);
21910 mangle_chr_shiftl (out, out_len, upos);
21911 break;
21912
21913 case RULE_OP_MANGLE_CHR_SHIFTR:
21914 NEXT_RULEPOS (rule_pos);
21915 NEXT_RPTOI (rule, rule_pos, upos);
21916 mangle_chr_shiftr (out, out_len, upos);
21917 break;
21918
21919 case RULE_OP_MANGLE_CHR_INCR:
21920 NEXT_RULEPOS (rule_pos);
21921 NEXT_RPTOI (rule, rule_pos, upos);
21922 mangle_chr_incr (out, out_len, upos);
21923 break;
21924
21925 case RULE_OP_MANGLE_CHR_DECR:
21926 NEXT_RULEPOS (rule_pos);
21927 NEXT_RPTOI (rule, rule_pos, upos);
21928 mangle_chr_decr (out, out_len, upos);
21929 break;
21930
21931 case RULE_OP_MANGLE_REPLACE_NP1:
21932 NEXT_RULEPOS (rule_pos);
21933 NEXT_RPTOI (rule, rule_pos, upos);
21934 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
21935 break;
21936
21937 case RULE_OP_MANGLE_REPLACE_NM1:
21938 NEXT_RULEPOS (rule_pos);
21939 NEXT_RPTOI (rule, rule_pos, upos);
21940 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
21941 break;
21942
21943 case RULE_OP_MANGLE_TITLE:
21944 out_len = mangle_title (out, out_len);
21945 break;
21946
21947 case RULE_OP_MANGLE_EXTRACT_MEMORY:
21948 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
21949 NEXT_RULEPOS (rule_pos);
21950 NEXT_RPTOI (rule, rule_pos, upos);
21951 NEXT_RULEPOS (rule_pos);
21952 NEXT_RPTOI (rule, rule_pos, ulen);
21953 NEXT_RULEPOS (rule_pos);
21954 NEXT_RPTOI (rule, rule_pos, upos2);
21955 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
21956 break;
21957
21958 case RULE_OP_MANGLE_APPEND_MEMORY:
21959 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
21960 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21961 memcpy (out + out_len, mem, mem_len);
21962 out_len += mem_len;
21963 break;
21964
21965 case RULE_OP_MANGLE_PREPEND_MEMORY:
21966 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
21967 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
21968 memcpy (mem + mem_len, out, out_len);
21969 out_len += mem_len;
21970 memcpy (out, mem, out_len);
21971 break;
21972
21973 case RULE_OP_MEMORIZE_WORD:
21974 memcpy (mem, out, out_len);
21975 mem_len = out_len;
21976 break;
21977
21978 case RULE_OP_REJECT_LESS:
21979 NEXT_RULEPOS (rule_pos);
21980 NEXT_RPTOI (rule, rule_pos, upos);
21981 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
21982 break;
21983
21984 case RULE_OP_REJECT_GREATER:
21985 NEXT_RULEPOS (rule_pos);
21986 NEXT_RPTOI (rule, rule_pos, upos);
21987 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
21988 break;
21989
21990 case RULE_OP_REJECT_CONTAIN:
21991 NEXT_RULEPOS (rule_pos);
21992 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
21993 break;
21994
21995 case RULE_OP_REJECT_NOT_CONTAIN:
21996 NEXT_RULEPOS (rule_pos);
21997 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
21998 break;
21999
22000 case RULE_OP_REJECT_EQUAL_FIRST:
22001 NEXT_RULEPOS (rule_pos);
22002 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22003 break;
22004
22005 case RULE_OP_REJECT_EQUAL_LAST:
22006 NEXT_RULEPOS (rule_pos);
22007 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22008 break;
22009
22010 case RULE_OP_REJECT_EQUAL_AT:
22011 NEXT_RULEPOS (rule_pos);
22012 NEXT_RPTOI (rule, rule_pos, upos);
22013 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22014 NEXT_RULEPOS (rule_pos);
22015 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
22016 break;
22017
22018 case RULE_OP_REJECT_CONTAINS:
22019 NEXT_RULEPOS (rule_pos);
22020 NEXT_RPTOI (rule, rule_pos, upos);
22021 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
22022 NEXT_RULEPOS (rule_pos);
22023 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
22024 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
22025 break;
22026
22027 case RULE_OP_REJECT_MEMORY:
22028 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
22029 break;
22030
22031 default:
22032 return (RULE_RC_SYNTAX_ERROR);
22033 break;
22034 }
22035 }
22036
22037 memset (out + out_len, 0, BLOCK_SIZE - out_len);
22038
22039 return (out_len);
22040 }